From 9e12bd795fd21c55b4b0752dc547a1497c5f95b2 Mon Sep 17 00:00:00 2001 From: Gareth Brown Date: Wed, 25 Mar 2026 20:34:14 +0000 Subject: [PATCH 1/5] Inline editing implementation progress --- CHANGELOG.md | 4 + README.md | 30 + TECHNICAL.md | 50 + docs-src/docs/Settings.md | 32 + docs-src/docs/Test Doc.md | 11 + vs-code-extension/media/inline-editor-eye.svg | 6 + .../media/mermaid/Tableau10-31042135.js | 10 + .../media/mermaid/Tableau10-558cc280.js | 9 + .../media/mermaid/arc-911b4007.js | 148 + .../media/mermaid/arc-a15e19dc.js | 86 + .../media/mermaid/array-2ff2c7a6.js | 6 + .../media/mermaid/array-b7dcf730.js | 6 + .../media/mermaid/blockDiagram-3894b6f4.js | 1230 + .../media/mermaid/blockDiagram-6538aad3.js | 1818 + .../media/mermaid/blockDiagram-c4efeb88.js | 1822 + .../media/mermaid/c4Diagram-11725ab3.js | 1579 + .../media/mermaid/c4Diagram-5c061bbf.js | 2463 + .../media/mermaid/c4Diagram-c83219d4.js | 2473 + .../media/mermaid/channel-d3ce1aa3.js | 5 + .../media/mermaid/channel-f19f13a4.js | 8 + .../architectureDiagram-VXUJARFQ.mjs | 1168 + .../architectureDiagram-VXUJARFQ.mjs.map | 7 + .../mermaid.core/blockDiagram-VD42YOAC.mjs | 3789 + .../blockDiagram-VD42YOAC.mjs.map | 7 + .../mermaid.core/c4Diagram-YG6GDRKO.mjs | 2604 + .../mermaid.core/c4Diagram-YG6GDRKO.mjs.map | 7 + .../chunks/mermaid.core/chunk-4BX2VUAB.mjs | 21 + .../mermaid.core/chunk-4BX2VUAB.mjs.map | 7 + .../chunks/mermaid.core/chunk-55IACEB6.mjs | 19 + .../mermaid.core/chunk-55IACEB6.mjs.map | 7 + .../chunks/mermaid.core/chunk-ABZYJK2D.mjs | 3086 + .../mermaid.core/chunk-ABZYJK2D.mjs.map | 7 + .../chunks/mermaid.core/chunk-AGHRB4JF.mjs | 82 + .../mermaid.core/chunk-AGHRB4JF.mjs.map | 7 + .../chunks/mermaid.core/chunk-ATLVNIR6.mjs | 111 + .../mermaid.core/chunk-ATLVNIR6.mjs.map | 7 + .../chunks/mermaid.core/chunk-B4BG7PRW.mjs | 1962 + .../mermaid.core/chunk-B4BG7PRW.mjs.map | 7 + .../chunks/mermaid.core/chunk-CVBHYZKI.mjs | 21 + .../mermaid.core/chunk-CVBHYZKI.mjs.map | 7 + .../chunks/mermaid.core/chunk-DI55MBZ5.mjs | 2032 + .../mermaid.core/chunk-DI55MBZ5.mjs.map | 7 + .../chunks/mermaid.core/chunk-EXTU4WIE.mjs | 24 + .../mermaid.core/chunk-EXTU4WIE.mjs.map | 7 + .../chunks/mermaid.core/chunk-FMBD7UC4.mjs | 24 + .../mermaid.core/chunk-FMBD7UC4.mjs.map | 7 + .../chunks/mermaid.core/chunk-HN2XXSSU.mjs | 159 + .../mermaid.core/chunk-HN2XXSSU.mjs.map | 7 + .../chunks/mermaid.core/chunk-JA3XYJ7Z.mjs | 443 + .../mermaid.core/chunk-JA3XYJ7Z.mjs.map | 7 + .../chunks/mermaid.core/chunk-JZLCHNYA.mjs | 5494 + .../mermaid.core/chunk-JZLCHNYA.mjs.map | 7 + .../chunks/mermaid.core/chunk-MI3HLSF2.mjs | 2712 + .../mermaid.core/chunk-MI3HLSF2.mjs.map | 7 + .../chunks/mermaid.core/chunk-N4CR4FBY.mjs | 86 + .../mermaid.core/chunk-N4CR4FBY.mjs.map | 7 + .../chunks/mermaid.core/chunk-QN33PNHL.mjs | 33 + .../mermaid.core/chunk-QN33PNHL.mjs.map | 7 + .../chunks/mermaid.core/chunk-QXUST7PY.mjs | 854 + .../mermaid.core/chunk-QXUST7PY.mjs.map | 7 + .../chunks/mermaid.core/chunk-QZHKN3VN.mjs | 24 + .../mermaid.core/chunk-QZHKN3VN.mjs.map | 7 + .../chunks/mermaid.core/chunk-S3R3BYOJ.mjs | 585 + .../mermaid.core/chunk-S3R3BYOJ.mjs.map | 7 + .../chunks/mermaid.core/chunk-TZMSLE5B.mjs | 117 + .../mermaid.core/chunk-TZMSLE5B.mjs.map | 7 + .../chunks/mermaid.core/chunk-XAJISQIX.mjs | 146 + .../mermaid.core/chunk-XAJISQIX.mjs.map | 7 + .../mermaid.core/classDiagram-2ON5EDUG.mjs | 40 + .../classDiagram-2ON5EDUG.mjs.map | 7 + .../mermaid.core/classDiagram-v2-WZHVMYZB.mjs | 40 + .../classDiagram-v2-WZHVMYZB.mjs.map | 7 + .../mermaid.core/cose-bilkent-S5V4N54A.mjs | 303 + .../cose-bilkent-S5V4N54A.mjs.map | 7 + .../chunks/mermaid.core/dagre-6UL2VRFP.mjs | 687 + .../mermaid.core/dagre-6UL2VRFP.mjs.map | 7 + .../chunks/mermaid.core/diagram-PSM6KHXK.mjs | 564 + .../mermaid.core/diagram-PSM6KHXK.mjs.map | 7 + .../chunks/mermaid.core/diagram-QEK2KX5R.mjs | 333 + .../mermaid.core/diagram-QEK2KX5R.mjs.map | 7 + .../chunks/mermaid.core/diagram-S2PKOQOG.mjs | 245 + .../mermaid.core/diagram-S2PKOQOG.mjs.map | 7 + .../mermaid.core/erDiagram-Q2GNP2WA.mjs | 1280 + .../mermaid.core/erDiagram-Q2GNP2WA.mjs.map | 7 + .../mermaid.core/flowDiagram-NV44I4VS.mjs | 2505 + .../mermaid.core/flowDiagram-NV44I4VS.mjs.map | 7 + .../mermaid.core/ganttDiagram-JELNMOA3.mjs | 2276 + .../ganttDiagram-JELNMOA3.mjs.map | 7 + .../mermaid.core/gitGraphDiagram-NY62KEGX.mjs | 1766 + .../gitGraphDiagram-NY62KEGX.mjs.map | 7 + .../mermaid.core/infoDiagram-WHAUD3N6.mjs | 51 + .../mermaid.core/infoDiagram-WHAUD3N6.mjs.map | 7 + .../mermaid.core/journeyDiagram-XKPGCS4Q.mjs | 1311 + .../journeyDiagram-XKPGCS4Q.mjs.map | 7 + .../kanban-definition-3W4ZIXB7.mjs | 1127 + .../kanban-definition-3W4ZIXB7.mjs.map | 7 + .../mindmap-definition-VGOIOE7T.mjs | 1168 + .../mindmap-definition-VGOIOE7T.mjs.map | 7 + .../mermaid.core/pieDiagram-ADFJNKIX.mjs | 220 + .../mermaid.core/pieDiagram-ADFJNKIX.mjs.map | 7 + .../mermaid.core/quadrantDiagram-AYHSOK5B.mjs | 1417 + .../quadrantDiagram-AYHSOK5B.mjs.map | 7 + .../requirementDiagram-UZGBJVZJ.mjs | 1272 + .../requirementDiagram-UZGBJVZJ.mjs.map | 7 + .../mermaid.core/sankeyDiagram-TZEHDZUN.mjs | 736 + .../sankeyDiagram-TZEHDZUN.mjs.map | 7 + .../mermaid.core/sequenceDiagram-WL72ISMW.mjs | 4012 + .../sequenceDiagram-WL72ISMW.mjs.map | 7 + .../mermaid.core/stateDiagram-FKZM4ZOC.mjs | 488 + .../stateDiagram-FKZM4ZOC.mjs.map | 7 + .../mermaid.core/stateDiagram-v2-4FDKWEC3.mjs | 39 + .../stateDiagram-v2-4FDKWEC3.mjs.map | 7 + .../timeline-definition-IT6M3QCI.mjs | 1269 + .../timeline-definition-IT6M3QCI.mjs.map | 7 + .../mermaid.core/xychartDiagram-PRI3JC2R.mjs | 1964 + .../xychartDiagram-PRI3JC2R.mjs.map | 7 + .../architecture-U656AL7Q-3ZQKGQJL.mjs | 1 + .../architecture-U656AL7Q-3ZQKGQJL.mjs.map | 7 + .../architectureDiagram-4X3Z3J56.mjs | 36 + .../architectureDiagram-4X3Z3J56.mjs.map | 7 + .../mermaid.esm.min/blockDiagram-MFEFEJY7.mjs | 122 + .../blockDiagram-MFEFEJY7.mjs.map | 7 + .../mermaid.esm.min/c4Diagram-Q5SP5FFD.mjs | 10 + .../c4Diagram-Q5SP5FFD.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-2XYWPRAO.mjs | 127 + .../mermaid.esm.min/chunk-2XYWPRAO.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-353K7GK5.mjs | 3 + .../mermaid.esm.min/chunk-353K7GK5.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-4KE642ED.mjs | 1 + .../mermaid.esm.min/chunk-4KE642ED.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-5V7UUW6L.mjs | 1 + .../mermaid.esm.min/chunk-5V7UUW6L.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-63GW7ZVL.mjs | 1 + .../mermaid.esm.min/chunk-63GW7ZVL.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-6DHVG6KC.mjs | 1 + .../mermaid.esm.min/chunk-6DHVG6KC.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-6EQESGSB.mjs | 1 + .../mermaid.esm.min/chunk-6EQESGSB.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-6XQQT3RD.mjs | 1 + .../mermaid.esm.min/chunk-6XQQT3RD.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-7SRKK4IT.mjs | 339 + .../mermaid.esm.min/chunk-7SRKK4IT.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-A4ITRWGT.mjs | 1 + .../mermaid.esm.min/chunk-A4ITRWGT.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-A6NU47M6.mjs | 1 + .../mermaid.esm.min/chunk-A6NU47M6.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-ASAHGCDZ.mjs | 1 + .../mermaid.esm.min/chunk-ASAHGCDZ.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-BHQAJ5QI.mjs | 165 + .../mermaid.esm.min/chunk-BHQAJ5QI.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-DY3L2I7V.mjs | 1 + .../mermaid.esm.min/chunk-DY3L2I7V.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-EFRVIJHI.mjs | 2 + .../mermaid.esm.min/chunk-EFRVIJHI.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-EOITJJC2.mjs | 1 + .../mermaid.esm.min/chunk-EOITJJC2.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-EQI6KKA3.mjs | 54 + .../mermaid.esm.min/chunk-EQI6KKA3.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-F3RBCZRS.mjs | 37 + .../mermaid.esm.min/chunk-F3RBCZRS.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-GOL2OBWC.mjs | 70 + .../mermaid.esm.min/chunk-GOL2OBWC.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-GTKDMUJJ.mjs | 1 + .../mermaid.esm.min/chunk-GTKDMUJJ.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-IQQE2MEC.mjs | 1 + .../mermaid.esm.min/chunk-IQQE2MEC.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-JXEFGRG2.mjs | 1 + .../mermaid.esm.min/chunk-JXEFGRG2.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-KXVH62NG.mjs | 85 + .../mermaid.esm.min/chunk-KXVH62NG.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-LM6QDVU5.mjs | 1 + .../mermaid.esm.min/chunk-LM6QDVU5.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-OMTJKCYW.mjs | 14 + .../mermaid.esm.min/chunk-OMTJKCYW.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-QK4BHB5Z.mjs | 1 + .../mermaid.esm.min/chunk-QK4BHB5Z.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-RV6DXAHM.mjs | 1 + .../mermaid.esm.min/chunk-RV6DXAHM.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-S4Z6OVSW.mjs | 1 + .../mermaid.esm.min/chunk-S4Z6OVSW.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-T244DUNM.mjs | 1 + .../mermaid.esm.min/chunk-T244DUNM.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-THXVA4DE.mjs | 1 + .../mermaid.esm.min/chunk-THXVA4DE.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-TLYDTAVK.mjs | 1 + .../mermaid.esm.min/chunk-TLYDTAVK.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-TVVDRG3C.mjs | 7 + .../mermaid.esm.min/chunk-TVVDRG3C.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-VSLJSFIP.mjs | 1 + .../mermaid.esm.min/chunk-VSLJSFIP.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-VWN64ITH.mjs | 1 + .../mermaid.esm.min/chunk-VWN64ITH.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-WONJCSFZ.mjs | 1 + .../mermaid.esm.min/chunk-WONJCSFZ.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-XTOMJ4XH.mjs | 220 + .../mermaid.esm.min/chunk-XTOMJ4XH.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-XW6ABFJP.mjs | 1 + .../mermaid.esm.min/chunk-XW6ABFJP.mjs.map | 7 + .../chunks/mermaid.esm.min/chunk-ZZTKAOFA.mjs | 15 + .../mermaid.esm.min/chunk-ZZTKAOFA.mjs.map | 7 + .../mermaid.esm.min/classDiagram-HVPNVESH.mjs | 1 + .../classDiagram-HVPNVESH.mjs.map | 7 + .../classDiagram-v2-KGF5QE6Q.mjs | 1 + .../classDiagram-v2-KGF5QE6Q.mjs.map | 7 + .../mermaid.esm.min/cose-bilkent-AZ5BDB2T.mjs | 1 + .../cose-bilkent-AZ5BDB2T.mjs.map | 7 + .../chunks/mermaid.esm.min/dagre-5ZHZFEXP.mjs | 4 + .../mermaid.esm.min/dagre-5ZHZFEXP.mjs.map | 7 + .../mermaid.esm.min/diagram-BZV4OSZQ.mjs | 24 + .../mermaid.esm.min/diagram-BZV4OSZQ.mjs.map | 7 + .../mermaid.esm.min/diagram-DKYQLJNW.mjs | 43 + .../mermaid.esm.min/diagram-DKYQLJNW.mjs.map | 7 + .../mermaid.esm.min/diagram-LL6QPXA2.mjs | 24 + .../mermaid.esm.min/diagram-LL6QPXA2.mjs.map | 7 + .../mermaid.esm.min/erDiagram-4KHZDIAV.mjs | 60 + .../erDiagram-4KHZDIAV.mjs.map | 7 + .../mermaid.esm.min/flowDiagram-COCTKB5R.mjs | 162 + .../flowDiagram-COCTKB5R.mjs.map | 7 + .../mermaid.esm.min/ganttDiagram-CHC5DFEG.mjs | 267 + .../ganttDiagram-CHC5DFEG.mjs.map | 7 + .../gitGraph-F6HP7TQM-F73VLA63.mjs | 1 + .../gitGraph-F6HP7TQM-F73VLA63.mjs.map | 7 + .../gitGraphDiagram-JCGM6PWI.mjs | 65 + .../gitGraphDiagram-JCGM6PWI.mjs.map | 7 + .../info-NVLQJR56-7B66GPTN.mjs | 1 + .../info-NVLQJR56-7B66GPTN.mjs.map | 7 + .../mermaid.esm.min/infoDiagram-JRAZ3BEV.mjs | 2 + .../infoDiagram-JRAZ3BEV.mjs.map | 7 + .../journeyDiagram-E42M6OD5.mjs | 139 + .../journeyDiagram-E42M6OD5.mjs.map | 7 + .../kanban-definition-D5DEDDHO.mjs | 89 + .../kanban-definition-D5DEDDHO.mjs.map | 7 + .../chunks/mermaid.esm.min/katex-RV2QPRKB.mjs | 261 + .../mermaid.esm.min/katex-RV2QPRKB.mjs.map | 7 + .../mindmap-definition-YDONIZRL.mjs | 68 + .../mindmap-definition-YDONIZRL.mjs.map | 7 + .../packet-BFZMPI3H-GN4PBP3H.mjs | 1 + .../packet-BFZMPI3H-GN4PBP3H.mjs.map | 7 + .../mermaid.esm.min/pie-7BOR55EZ-EOOIGJLO.mjs | 1 + .../pie-7BOR55EZ-EOOIGJLO.mjs.map | 7 + .../mermaid.esm.min/pieDiagram-QB62DFGK.mjs | 30 + .../pieDiagram-QB62DFGK.mjs.map | 7 + .../quadrantDiagram-AGVETKZM.mjs | 7 + .../quadrantDiagram-AGVETKZM.mjs.map | 7 + .../radar-NHE76QYJ-6YWZBFZN.mjs | 1 + .../radar-NHE76QYJ-6YWZBFZN.mjs.map | 7 + .../requirementDiagram-PT7ZJY3I.mjs | 64 + .../requirementDiagram-PT7ZJY3I.mjs.map | 7 + .../sankeyDiagram-XSL23WO4.mjs | 10 + .../sankeyDiagram-XSL23WO4.mjs.map | 7 + .../sequenceDiagram-W4XLKSBU.mjs | 145 + .../sequenceDiagram-W4XLKSBU.mjs.map | 7 + .../mermaid.esm.min/stateDiagram-T6B4JHBO.mjs | 1 + .../stateDiagram-T6B4JHBO.mjs.map | 7 + .../stateDiagram-v2-B7NEODPZ.mjs | 1 + .../stateDiagram-v2-B7NEODPZ.mjs.map | 7 + .../timeline-definition-DZOEFOHF.mjs | 61 + .../timeline-definition-DZOEFOHF.mjs.map | 7 + .../treemap-KMMF4GRG-7ORZ52ND.mjs | 1 + .../treemap-KMMF4GRG-7ORZ52ND.mjs.map | 7 + .../xychartDiagram-6J6QOAP6.mjs | 7 + .../xychartDiagram-6J6QOAP6.mjs.map | 7 + .../architecture-U656AL7Q-CGAUNQSQ.mjs | 13 + .../architecture-U656AL7Q-CGAUNQSQ.mjs.map | 7 + .../architectureDiagram-X5VOOHYO.mjs | 8920 ++ .../architectureDiagram-X5VOOHYO.mjs.map | 7 + .../mermaid.esm/blockDiagram-GFQLM6WX.mjs | 3789 + .../mermaid.esm/blockDiagram-GFQLM6WX.mjs.map | 7 + .../chunks/mermaid.esm/c4Diagram-3CMHLY2Z.mjs | 2609 + .../mermaid.esm/c4Diagram-3CMHLY2Z.mjs.map | 7 + .../chunks/mermaid.esm/chunk-2336245P.mjs | 72 + .../chunks/mermaid.esm/chunk-2336245P.mjs.map | 7 + .../chunks/mermaid.esm/chunk-2LXNVE6Q.mjs | 6948 ++ .../chunks/mermaid.esm/chunk-2LXNVE6Q.mjs.map | 7 + .../chunks/mermaid.esm/chunk-2N6VOINK.mjs | 30592 +++++ .../chunks/mermaid.esm/chunk-2N6VOINK.mjs.map | 7 + .../chunks/mermaid.esm/chunk-4QEEASX4.mjs | 450 + .../chunks/mermaid.esm/chunk-4QEEASX4.mjs.map | 7 + .../chunks/mermaid.esm/chunk-4RZPZ3GF.mjs | 1972 + .../chunks/mermaid.esm/chunk-4RZPZ3GF.mjs.map | 7 + .../chunks/mermaid.esm/chunk-5YB23HTZ.mjs | 88 + .../chunks/mermaid.esm/chunk-5YB23HTZ.mjs.map | 7 + .../chunks/mermaid.esm/chunk-6PHMZWEM.mjs | 4813 + .../chunks/mermaid.esm/chunk-6PHMZWEM.mjs.map | 7 + .../chunks/mermaid.esm/chunk-DLQEHMXD.mjs | 39 + .../chunks/mermaid.esm/chunk-DLQEHMXD.mjs.map | 7 + .../chunks/mermaid.esm/chunk-EDVOX2VZ.mjs | 2712 + .../chunks/mermaid.esm/chunk-EDVOX2VZ.mjs.map | 7 + .../chunks/mermaid.esm/chunk-FYFMZRDX.mjs | 54 + .../chunks/mermaid.esm/chunk-FYFMZRDX.mjs.map | 7 + .../chunks/mermaid.esm/chunk-GG5MOTN4.mjs | 121 + .../chunks/mermaid.esm/chunk-GG5MOTN4.mjs.map | 7 + .../chunks/mermaid.esm/chunk-JFBLLWPX.mjs | 18870 ++++ .../chunks/mermaid.esm/chunk-JFBLLWPX.mjs.map | 7 + .../chunks/mermaid.esm/chunk-JGNW3ECZ.mjs | 102 + .../chunks/mermaid.esm/chunk-JGNW3ECZ.mjs.map | 7 + .../chunks/mermaid.esm/chunk-K2ZEYYM2.mjs | 21 + .../chunks/mermaid.esm/chunk-K2ZEYYM2.mjs.map | 7 + .../chunks/mermaid.esm/chunk-KFNMVS7B.mjs | 68 + .../chunks/mermaid.esm/chunk-KFNMVS7B.mjs.map | 7 + .../chunks/mermaid.esm/chunk-KOBZ2EY6.mjs | 138 + .../chunks/mermaid.esm/chunk-KOBZ2EY6.mjs.map | 7 + .../chunks/mermaid.esm/chunk-KYR5PYZH.mjs | 54 + .../chunks/mermaid.esm/chunk-KYR5PYZH.mjs.map | 7 + .../chunks/mermaid.esm/chunk-LXPT3ST6.mjs | 2193 + .../chunks/mermaid.esm/chunk-LXPT3ST6.mjs.map | 7 + .../chunks/mermaid.esm/chunk-OFP4IZRJ.mjs | 2034 + .../chunks/mermaid.esm/chunk-OFP4IZRJ.mjs.map | 7 + .../chunks/mermaid.esm/chunk-PEQZQI46.mjs | 1191 + .../chunks/mermaid.esm/chunk-PEQZQI46.mjs.map | 7 + .../chunks/mermaid.esm/chunk-PSZZOCOG.mjs | 126 + .../chunks/mermaid.esm/chunk-PSZZOCOG.mjs.map | 7 + .../chunks/mermaid.esm/chunk-S2YGRMRU.mjs | 146 + .../chunks/mermaid.esm/chunk-S2YGRMRU.mjs.map | 7 + .../chunks/mermaid.esm/chunk-SCLVSU6P.mjs | 24 + .../chunks/mermaid.esm/chunk-SCLVSU6P.mjs.map | 7 + .../chunks/mermaid.esm/chunk-SKKRN3KO.mjs | 852 + .../chunks/mermaid.esm/chunk-SKKRN3KO.mjs.map | 7 + .../chunks/mermaid.esm/chunk-SNU2EDPW.mjs | 54 + .../chunks/mermaid.esm/chunk-SNU2EDPW.mjs.map | 7 + .../chunks/mermaid.esm/chunk-STRMIP24.mjs | 111 + .../chunks/mermaid.esm/chunk-STRMIP24.mjs.map | 7 + .../chunks/mermaid.esm/chunk-SVWLYT5M.mjs | 21 + .../chunks/mermaid.esm/chunk-SVWLYT5M.mjs.map | 7 + .../chunks/mermaid.esm/chunk-U2UBZNRQ.mjs | 26 + .../chunks/mermaid.esm/chunk-U2UBZNRQ.mjs.map | 7 + .../chunks/mermaid.esm/chunk-UAX3YSUW.mjs | 81 + .../chunks/mermaid.esm/chunk-UAX3YSUW.mjs.map | 7 + .../chunks/mermaid.esm/chunk-UNWZSS3R.mjs | 1962 + .../chunks/mermaid.esm/chunk-UNWZSS3R.mjs.map | 7 + .../chunks/mermaid.esm/chunk-VH2OSJNQ.mjs | 21 + .../chunks/mermaid.esm/chunk-VH2OSJNQ.mjs.map | 7 + .../chunks/mermaid.esm/chunk-WDWNAAEG.mjs | 35 + .../chunks/mermaid.esm/chunk-WDWNAAEG.mjs.map | 7 + .../chunks/mermaid.esm/chunk-XHLUJ3B6.mjs | 54 + .../chunks/mermaid.esm/chunk-XHLUJ3B6.mjs.map | 7 + .../chunks/mermaid.esm/chunk-YJGJQOYZ.mjs | 24 + .../chunks/mermaid.esm/chunk-YJGJQOYZ.mjs.map | 7 + .../chunks/mermaid.esm/chunk-ZH73STAE.mjs | 159 + .../chunks/mermaid.esm/chunk-ZH73STAE.mjs.map | 7 + .../chunks/mermaid.esm/chunk-ZNH7G2NJ.mjs | 591 + .../chunks/mermaid.esm/chunk-ZNH7G2NJ.mjs.map | 7 + .../chunks/mermaid.esm/chunk-ZRZ2AMKI.mjs | 6502 ++ .../chunks/mermaid.esm/chunk-ZRZ2AMKI.mjs.map | 7 + .../chunks/mermaid.esm/chunk-ZZTYOBSU.mjs | 2264 + .../chunks/mermaid.esm/chunk-ZZTYOBSU.mjs.map | 7 + .../mermaid.esm/classDiagram-GS4TXN57.mjs | 43 + .../mermaid.esm/classDiagram-GS4TXN57.mjs.map | 7 + .../mermaid.esm/classDiagram-v2-T223ZLDE.mjs | 43 + .../classDiagram-v2-T223ZLDE.mjs.map | 7 + .../mermaid.esm/cose-bilkent-WGPWBIFM.mjs | 5063 + .../mermaid.esm/cose-bilkent-WGPWBIFM.mjs.map | 7 + .../chunks/mermaid.esm/dagre-ESHLYXRB.mjs | 743 + .../chunks/mermaid.esm/dagre-ESHLYXRB.mjs.map | 7 + .../chunks/mermaid.esm/diagram-35RNQRIT.mjs | 582 + .../mermaid.esm/diagram-35RNQRIT.mjs.map | 7 + .../chunks/mermaid.esm/diagram-MACBZWK3.mjs | 349 + .../mermaid.esm/diagram-MACBZWK3.mjs.map | 7 + .../chunks/mermaid.esm/diagram-TKFVDK6Q.mjs | 261 + .../mermaid.esm/diagram-TKFVDK6Q.mjs.map | 7 + .../chunks/mermaid.esm/erDiagram-NUSZGL2K.mjs | 1285 + .../mermaid.esm/erDiagram-NUSZGL2K.mjs.map | 7 + .../mermaid.esm/flowDiagram-TD5NMDKU.mjs | 2509 + .../mermaid.esm/flowDiagram-TD5NMDKU.mjs.map | 7 + .../mermaid.esm/ganttDiagram-LDDRKPNN.mjs | 2633 + .../mermaid.esm/ganttDiagram-LDDRKPNN.mjs.map | 7 + .../gitGraph-F6HP7TQM-KCFFVSNH.mjs | 13 + .../gitGraph-F6HP7TQM-KCFFVSNH.mjs.map | 7 + .../mermaid.esm/gitGraphDiagram-HMYFBHNQ.mjs | 1780 + .../gitGraphDiagram-HMYFBHNQ.mjs.map | 7 + .../mermaid.esm/info-NVLQJR56-M2CC4IYF.mjs | 13 + .../info-NVLQJR56-M2CC4IYF.mjs.map | 7 + .../mermaid.esm/infoDiagram-YPZU3HRN.mjs | 66 + .../mermaid.esm/infoDiagram-YPZU3HRN.mjs.map | 7 + .../mermaid.esm/journeyDiagram-EMBJJZIB.mjs | 1312 + .../journeyDiagram-EMBJJZIB.mjs.map | 7 + .../kanban-definition-XZ6RF72J.mjs | 1133 + .../kanban-definition-XZ6RF72J.mjs.map | 7 + .../chunks/mermaid.esm/katex-A6QSACVP.mjs | 14641 +++ .../chunks/mermaid.esm/katex-A6QSACVP.mjs.map | 7 + .../mindmap-definition-Z26EYU56.mjs | 1228 + .../mindmap-definition-Z26EYU56.mjs.map | 7 + .../mermaid.esm/packet-BFZMPI3H-ABC5HYTE.mjs | 13 + .../packet-BFZMPI3H-ABC5HYTE.mjs.map | 7 + .../mermaid.esm/pie-7BOR55EZ-544PBEMT.mjs | 13 + .../mermaid.esm/pie-7BOR55EZ-544PBEMT.mjs.map | 7 + .../mermaid.esm/pieDiagram-DMORWRXK.mjs | 236 + .../mermaid.esm/pieDiagram-DMORWRXK.mjs.map | 7 + .../mermaid.esm/quadrantDiagram-Q67ROWKZ.mjs | 1419 + .../quadrantDiagram-Q67ROWKZ.mjs.map | 7 + .../mermaid.esm/radar-NHE76QYJ-PXJX6GVO.mjs | 13 + .../radar-NHE76QYJ-PXJX6GVO.mjs.map | 7 + .../requirementDiagram-3NS7YNCK.mjs | 1276 + .../requirementDiagram-3NS7YNCK.mjs.map | 7 + .../mermaid.esm/sankeyDiagram-OLRELTUB.mjs | 1325 + .../sankeyDiagram-OLRELTUB.mjs.map | 7 + .../mermaid.esm/sequenceDiagram-MB3FELIF.mjs | 4017 + .../sequenceDiagram-MB3FELIF.mjs.map | 7 + .../mermaid.esm/stateDiagram-AF2IOYDR.mjs | 497 + .../mermaid.esm/stateDiagram-AF2IOYDR.mjs.map | 7 + .../mermaid.esm/stateDiagram-v2-RQA4U5HQ.mjs | 42 + .../stateDiagram-v2-RQA4U5HQ.mjs.map | 7 + .../timeline-definition-IBICBATI.mjs | 1271 + .../timeline-definition-IBICBATI.mjs.map | 7 + .../mermaid.esm/treemap-KMMF4GRG-YVX6V4UE.mjs | 13 + .../treemap-KMMF4GRG-YVX6V4UE.mjs.map | 7 + .../mermaid.esm/xychartDiagram-SWH7VB4X.mjs | 1966 + .../xychartDiagram-SWH7VB4X.mjs.map | 7 + .../media/mermaid/classDiagram-3d51384c.js | 356 + .../media/mermaid/classDiagram-5e12d5cf.js | 220 + .../media/mermaid/classDiagram-beda092f.js | 363 + .../media/mermaid/classDiagram-v2-2358418a.js | 298 + .../media/mermaid/classDiagram-v2-79130fb8.js | 290 + .../media/mermaid/classDiagram-v2-bbc92249.js | 206 + .../media/mermaid/clone-2c3335c5.js | 8 + .../media/mermaid/clone-efe1c6aa.js | 8 + .../media/mermaid/createText-1719965b.js | 254 + .../media/mermaid/createText-2822bf05.js | 4932 + .../media/mermaid/createText-9372f704.js | 2969 + .../media/mermaid/edges-20fff4f5.js | 1088 + .../media/mermaid/edges-568b5f94.js | 1844 + .../media/mermaid/edges-96097737.js | 1844 + .../media/mermaid/erDiagram-0228fc6a.js | 1176 + .../media/mermaid/erDiagram-08af4c5d.js | 1321 + .../media/mermaid/erDiagram-b0a85d60.js | 931 + .../media/mermaid/flowDb-5aa2917a.js | 1126 + .../media/mermaid/flowDb-c6c81e3f.js | 1714 + .../media/mermaid/flowDb-f37475bf.js | 1713 + .../media/mermaid/flowDiagram-50d868cf.js | 614 + .../media/mermaid/flowDiagram-d9de4fee.js | 797 + .../media/mermaid/flowDiagram-eee84b83.js | 1278 + .../media/mermaid/flowDiagram-v2-4f6560a1.js | 40 + .../media/mermaid/flowDiagram-v2-8a954bf0.js | 25 + .../media/mermaid/flowDiagram-v2-a7830259.js | 32 + .../flowchart-elk-definition-54b6c9ab.js | 48407 ++++++++ .../flowchart-elk-definition-6af322e1.js | 814 + .../flowchart-elk-definition-fb58cb64.js | 93397 ++++++++++++++++ .../media/mermaid/ganttDiagram-68513147.js | 2501 + .../media/mermaid/ganttDiagram-a2739b55.js | 2061 + .../media/mermaid/ganttDiagram-de594a00.js | 3445 + .../media/mermaid/gitGraphDiagram-4b126544.js | 1790 + .../media/mermaid/gitGraphDiagram-82fe8481.js | 1800 + .../media/mermaid/gitGraphDiagram-e9a2600b.js | 1264 + .../media/mermaid/graph-00ca1ddf.js | 1274 + .../media/mermaid/graph-80608c14.js | 871 + .../media/mermaid/index-0cdc3891.js | 373 + .../media/mermaid/index-5325376f.js | 622 + .../media/mermaid/index-f8e20f6b.js | 663 + .../media/mermaid/infoDiagram-12be3fa1.js | 510 + .../media/mermaid/infoDiagram-3de034a5.js | 319 + .../media/mermaid/infoDiagram-8eee0895.js | 520 + .../media/mermaid/init-cc95ec8e.js | 16 + .../media/mermaid/init-f9637058.js | 16 + .../media/mermaid/journeyDiagram-682f54fe.js | 804 + .../media/mermaid/journeyDiagram-aedbf9a9.js | 1183 + .../media/mermaid/journeyDiagram-c64418c1.js | 1191 + .../media/mermaid/katex-79a689fb.js | 14456 +++ .../media/mermaid/katex-fa3848e8.js | 11646 ++ .../media/mermaid/layout-0254eb32.js | 1494 + .../media/mermaid/layout-09aca9f2.js | 2273 + .../media/mermaid/line-0c78f995.js | 34 + .../media/mermaid/line-8a001a24.js | 50 + .../media/mermaid/linear-73d6a963.js | 595 + .../media/mermaid/linear-b808bd80.js | 447 + .../media/mermaid/mermaid-7ea9cbd6.js | 6464 ++ .../media/mermaid/mermaid-b92f6f74.js | 8142 ++ .../media/mermaid/mermaid-d73f18bb.js | 12833 +++ .../media/mermaid/mermaid.esm.min.mjs | 4 + .../mermaid/mindmap-definition-4da9e6a5.js | 32342 ++++++ .../mermaid/mindmap-definition-8da855dc.js | 1177 + .../mermaid/mindmap-definition-aebd360e.js | 18760 ++++ .../media/mermaid/ordinal-475e0c0c.js | 82 + .../media/mermaid/ordinal-5695958c.js | 65 + .../media/mermaid/path-39bad7e2.js | 118 + .../media/mermaid/path-428ebac9.js | 91 + .../media/mermaid/pieDiagram-16513e3f.js | 772 + .../media/mermaid/pieDiagram-2b639856.js | 502 + .../media/mermaid/pieDiagram-a8764435.js | 722 + .../media/mermaid/quadrantDiagram-1e28029f.js | 1207 + .../media/mermaid/quadrantDiagram-39965fa8.js | 904 + .../media/mermaid/quadrantDiagram-f58eb955.js | 1199 + .../mermaid/requirementDiagram-0513a134.js | 1091 + .../mermaid/requirementDiagram-08caed73.js | 1098 + .../mermaid/requirementDiagram-a9a1ab5b.js | 769 + .../media/mermaid/sankeyDiagram-a04cb91d.js | 660 + .../media/mermaid/sankeyDiagram-a91c88a3.js | 1198 + .../media/mermaid/sankeyDiagram-bcf67920.js | 818 + .../media/mermaid/sequenceDiagram-75649615.js | 3336 + .../media/mermaid/sequenceDiagram-a77d5917.js | 2234 + .../media/mermaid/sequenceDiagram-c5b8d532.js | 3346 + .../media/mermaid/stateDiagram-1ecb1508.js | 474 + .../media/mermaid/stateDiagram-8198abf2.js | 467 + .../media/mermaid/stateDiagram-e4aff18a.js | 275 + .../media/mermaid/stateDiagram-v2-b2978744.js | 325 + .../media/mermaid/stateDiagram-v2-c2b004d7.js | 333 + .../media/mermaid/stateDiagram-v2-f5ecddeb.js | 190 + .../media/mermaid/styles-13ae24cf.js | 1089 + .../media/mermaid/styles-6d98f5a4.js | 1363 + .../media/mermaid/styles-b4e223ce.js | 1484 + .../media/mermaid/styles-bfb5f58b.js | 1483 + .../media/mermaid/styles-ca3715f6.js | 1363 + .../media/mermaid/styles-d45a18b0.js | 512 + .../media/mermaid/styles-d81a254a.js | 960 + .../media/mermaid/styles-f321baca.js | 436 + .../media/mermaid/styles-f7f4f728.js | 574 + .../media/mermaid/svgDrawCommon-093cedf0.js | 100 + .../media/mermaid/svgDrawCommon-b86b1483.js | 101 + .../media/mermaid/svgDrawCommon-bcac189f.js | 64 + .../mermaid/timeline-definition-36903ae4.js | 1211 + .../mermaid/timeline-definition-d25df101.js | 795 + .../mermaid/timeline-definition-faaaa080.js | 1219 + .../media/mermaid/xychartDiagram-66f36244.js | 1284 + .../media/mermaid/xychartDiagram-a4065021.js | 1800 + .../media/mermaid/xychartDiagram-f5964ef8.js | 1745 + vs-code-extension/package-lock.json | 6739 +- vs-code-extension/package.json | 146 + vs-code-extension/src/extension.ts | 7 + .../src/inline-editor/InlineEditorManager.ts | 214 + .../src/inline-editor/LICENCE-THIRD-PARTY.md | 44 + .../code-block-hover-provider.ts | 525 + vs-code-extension/src/inline-editor/config.ts | 129 + .../src/inline-editor/decorations.ts | 645 + .../src/inline-editor/decorator.ts | 958 + .../decorator/checkbox-toggle.ts | 53 + .../decorator/decoration-categories.ts | 27 + .../decorator/decoration-type-registry.ts | 268 + .../decorator/mermaid-diagram-decorations.ts | 107 + .../decorator/visibility-model.ts | 348 + .../src/inline-editor/diff-context.ts | 39 + .../src/inline-editor/emoji-map-loader.ts | 27 + .../src/inline-editor/emoji-map.ts | 1917 + .../src/inline-editor/forge-context.ts | 188 + .../src/inline-editor/github-context.ts | 7 + .../src/inline-editor/image-hover-provider.ts | 92 + .../src/inline-editor/link-click-handler.ts | 189 + .../src/inline-editor/link-hover-provider.ts | 108 + .../src/inline-editor/link-provider.ts | 164 + .../src/inline-editor/link-targets.ts | 131 + .../src/inline-editor/markdown-parse-cache.ts | 78 + .../inline-editor/math/math-decorations.ts | 170 + .../src/inline-editor/math/math-renderer.ts | 105 + .../src/inline-editor/math/math-scanner.ts | 287 + .../src/inline-editor/mermaid/constants.ts | 11 + .../inline-editor/mermaid/error-handler.ts | 96 + .../src/inline-editor/mermaid/index.ts | 23 + .../inline-editor/mermaid/mermaid-renderer.ts | 198 + .../inline-editor/mermaid/svg-processor.ts | 315 + .../src/inline-editor/mermaid/types.ts | 38 + .../inline-editor/mermaid/webview-manager.ts | 466 + .../src/inline-editor/parser-remark.ts | 54 + vs-code-extension/src/inline-editor/parser.ts | 2856 + .../src/inline-editor/position-mapping.ts | 99 + .../src/inline-editor/utils/lru-cache.ts | 60 + 553 files changed, 570797 insertions(+), 447 deletions(-) create mode 100644 docs-src/docs/Test Doc.md create mode 100644 vs-code-extension/media/inline-editor-eye.svg create mode 100644 vs-code-extension/media/mermaid/Tableau10-31042135.js create mode 100644 vs-code-extension/media/mermaid/Tableau10-558cc280.js create mode 100644 vs-code-extension/media/mermaid/arc-911b4007.js create mode 100644 vs-code-extension/media/mermaid/arc-a15e19dc.js create mode 100644 vs-code-extension/media/mermaid/array-2ff2c7a6.js create mode 100644 vs-code-extension/media/mermaid/array-b7dcf730.js create mode 100644 vs-code-extension/media/mermaid/blockDiagram-3894b6f4.js create mode 100644 vs-code-extension/media/mermaid/blockDiagram-6538aad3.js create mode 100644 vs-code-extension/media/mermaid/blockDiagram-c4efeb88.js create mode 100644 vs-code-extension/media/mermaid/c4Diagram-11725ab3.js create mode 100644 vs-code-extension/media/mermaid/c4Diagram-5c061bbf.js create mode 100644 vs-code-extension/media/mermaid/c4Diagram-c83219d4.js create mode 100644 vs-code-extension/media/mermaid/channel-d3ce1aa3.js create mode 100644 vs-code-extension/media/mermaid/channel-f19f13a4.js create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/architectureDiagram-VXUJARFQ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/architectureDiagram-VXUJARFQ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/blockDiagram-VD42YOAC.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/blockDiagram-VD42YOAC.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/c4Diagram-YG6GDRKO.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/c4Diagram-YG6GDRKO.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-4BX2VUAB.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-4BX2VUAB.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-55IACEB6.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-55IACEB6.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ABZYJK2D.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ABZYJK2D.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-AGHRB4JF.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-AGHRB4JF.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ATLVNIR6.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ATLVNIR6.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-B4BG7PRW.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-B4BG7PRW.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-CVBHYZKI.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-CVBHYZKI.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-DI55MBZ5.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-DI55MBZ5.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-EXTU4WIE.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-EXTU4WIE.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-FMBD7UC4.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-FMBD7UC4.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-HN2XXSSU.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-HN2XXSSU.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JA3XYJ7Z.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JA3XYJ7Z.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JZLCHNYA.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JZLCHNYA.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-MI3HLSF2.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-MI3HLSF2.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-N4CR4FBY.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-N4CR4FBY.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QN33PNHL.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QN33PNHL.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QXUST7PY.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QXUST7PY.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QZHKN3VN.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QZHKN3VN.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-S3R3BYOJ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-S3R3BYOJ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-TZMSLE5B.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-TZMSLE5B.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-XAJISQIX.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-XAJISQIX.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-2ON5EDUG.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-2ON5EDUG.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-v2-WZHVMYZB.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-v2-WZHVMYZB.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/cose-bilkent-S5V4N54A.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/cose-bilkent-S5V4N54A.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/dagre-6UL2VRFP.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/dagre-6UL2VRFP.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-PSM6KHXK.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-PSM6KHXK.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-QEK2KX5R.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-QEK2KX5R.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-S2PKOQOG.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-S2PKOQOG.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/erDiagram-Q2GNP2WA.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/erDiagram-Q2GNP2WA.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/flowDiagram-NV44I4VS.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/flowDiagram-NV44I4VS.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/ganttDiagram-JELNMOA3.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/ganttDiagram-JELNMOA3.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/gitGraphDiagram-NY62KEGX.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/gitGraphDiagram-NY62KEGX.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/infoDiagram-WHAUD3N6.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/infoDiagram-WHAUD3N6.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/journeyDiagram-XKPGCS4Q.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/journeyDiagram-XKPGCS4Q.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/kanban-definition-3W4ZIXB7.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/kanban-definition-3W4ZIXB7.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/mindmap-definition-VGOIOE7T.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/mindmap-definition-VGOIOE7T.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/pieDiagram-ADFJNKIX.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/pieDiagram-ADFJNKIX.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/quadrantDiagram-AYHSOK5B.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/quadrantDiagram-AYHSOK5B.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/requirementDiagram-UZGBJVZJ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/requirementDiagram-UZGBJVZJ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/sankeyDiagram-TZEHDZUN.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/sankeyDiagram-TZEHDZUN.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/sequenceDiagram-WL72ISMW.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/sequenceDiagram-WL72ISMW.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-FKZM4ZOC.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-FKZM4ZOC.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-v2-4FDKWEC3.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-v2-4FDKWEC3.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/timeline-definition-IT6M3QCI.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/timeline-definition-IT6M3QCI.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/xychartDiagram-PRI3JC2R.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.core/xychartDiagram-PRI3JC2R.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architecture-U656AL7Q-3ZQKGQJL.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architecture-U656AL7Q-3ZQKGQJL.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architectureDiagram-4X3Z3J56.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architectureDiagram-4X3Z3J56.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/blockDiagram-MFEFEJY7.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/blockDiagram-MFEFEJY7.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/c4Diagram-Q5SP5FFD.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/c4Diagram-Q5SP5FFD.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-2XYWPRAO.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-2XYWPRAO.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-353K7GK5.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-353K7GK5.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-4KE642ED.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-4KE642ED.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-5V7UUW6L.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-5V7UUW6L.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-63GW7ZVL.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-63GW7ZVL.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6DHVG6KC.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6DHVG6KC.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6EQESGSB.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6EQESGSB.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6XQQT3RD.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6XQQT3RD.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-7SRKK4IT.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-7SRKK4IT.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-A4ITRWGT.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-A4ITRWGT.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-A6NU47M6.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-A6NU47M6.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-ASAHGCDZ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-ASAHGCDZ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-BHQAJ5QI.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-BHQAJ5QI.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-DY3L2I7V.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-DY3L2I7V.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-EFRVIJHI.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-EFRVIJHI.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-EOITJJC2.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-EOITJJC2.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-EQI6KKA3.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-EQI6KKA3.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-F3RBCZRS.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-F3RBCZRS.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-GOL2OBWC.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-GOL2OBWC.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-GTKDMUJJ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-GTKDMUJJ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-IQQE2MEC.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-IQQE2MEC.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-JXEFGRG2.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-JXEFGRG2.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-KXVH62NG.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-KXVH62NG.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-LM6QDVU5.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-LM6QDVU5.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-OMTJKCYW.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-OMTJKCYW.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-QK4BHB5Z.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-QK4BHB5Z.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-RV6DXAHM.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-RV6DXAHM.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-S4Z6OVSW.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-S4Z6OVSW.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-T244DUNM.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-T244DUNM.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-THXVA4DE.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-THXVA4DE.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-TLYDTAVK.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-TLYDTAVK.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-TVVDRG3C.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-TVVDRG3C.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-VSLJSFIP.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-VSLJSFIP.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-VWN64ITH.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-VWN64ITH.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-WONJCSFZ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-WONJCSFZ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-XTOMJ4XH.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-XTOMJ4XH.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-XW6ABFJP.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-XW6ABFJP.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-ZZTKAOFA.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-ZZTKAOFA.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/classDiagram-HVPNVESH.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/classDiagram-HVPNVESH.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/classDiagram-v2-KGF5QE6Q.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/classDiagram-v2-KGF5QE6Q.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/cose-bilkent-AZ5BDB2T.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/cose-bilkent-AZ5BDB2T.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/dagre-5ZHZFEXP.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/dagre-5ZHZFEXP.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/diagram-BZV4OSZQ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/diagram-BZV4OSZQ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/diagram-DKYQLJNW.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/diagram-DKYQLJNW.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/diagram-LL6QPXA2.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/diagram-LL6QPXA2.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/erDiagram-4KHZDIAV.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/erDiagram-4KHZDIAV.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/flowDiagram-COCTKB5R.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/flowDiagram-COCTKB5R.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/ganttDiagram-CHC5DFEG.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/ganttDiagram-CHC5DFEG.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/gitGraph-F6HP7TQM-F73VLA63.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/gitGraph-F6HP7TQM-F73VLA63.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-JCGM6PWI.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-JCGM6PWI.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/info-NVLQJR56-7B66GPTN.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/info-NVLQJR56-7B66GPTN.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/infoDiagram-JRAZ3BEV.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/infoDiagram-JRAZ3BEV.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/journeyDiagram-E42M6OD5.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/journeyDiagram-E42M6OD5.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/kanban-definition-D5DEDDHO.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/kanban-definition-D5DEDDHO.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/katex-RV2QPRKB.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/katex-RV2QPRKB.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/mindmap-definition-YDONIZRL.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/mindmap-definition-YDONIZRL.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/packet-BFZMPI3H-GN4PBP3H.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/packet-BFZMPI3H-GN4PBP3H.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/pie-7BOR55EZ-EOOIGJLO.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/pie-7BOR55EZ-EOOIGJLO.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/pieDiagram-QB62DFGK.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/pieDiagram-QB62DFGK.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/quadrantDiagram-AGVETKZM.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/quadrantDiagram-AGVETKZM.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/radar-NHE76QYJ-6YWZBFZN.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/radar-NHE76QYJ-6YWZBFZN.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/requirementDiagram-PT7ZJY3I.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/requirementDiagram-PT7ZJY3I.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/sankeyDiagram-XSL23WO4.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/sankeyDiagram-XSL23WO4.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/sequenceDiagram-W4XLKSBU.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/sequenceDiagram-W4XLKSBU.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/stateDiagram-T6B4JHBO.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/stateDiagram-T6B4JHBO.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-B7NEODPZ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-B7NEODPZ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/timeline-definition-DZOEFOHF.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/timeline-definition-DZOEFOHF.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/treemap-KMMF4GRG-7ORZ52ND.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/treemap-KMMF4GRG-7ORZ52ND.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/xychartDiagram-6J6QOAP6.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm.min/xychartDiagram-6J6QOAP6.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/architecture-U656AL7Q-CGAUNQSQ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/architecture-U656AL7Q-CGAUNQSQ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/architectureDiagram-X5VOOHYO.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/architectureDiagram-X5VOOHYO.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/blockDiagram-GFQLM6WX.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/blockDiagram-GFQLM6WX.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/c4Diagram-3CMHLY2Z.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/c4Diagram-3CMHLY2Z.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-2336245P.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-2336245P.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-2LXNVE6Q.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-2LXNVE6Q.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-2N6VOINK.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-2N6VOINK.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-4QEEASX4.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-4QEEASX4.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-4RZPZ3GF.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-4RZPZ3GF.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-5YB23HTZ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-5YB23HTZ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-6PHMZWEM.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-6PHMZWEM.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-DLQEHMXD.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-DLQEHMXD.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-EDVOX2VZ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-EDVOX2VZ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-FYFMZRDX.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-FYFMZRDX.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-GG5MOTN4.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-GG5MOTN4.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-JFBLLWPX.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-JFBLLWPX.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-JGNW3ECZ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-JGNW3ECZ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-K2ZEYYM2.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-K2ZEYYM2.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-KFNMVS7B.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-KFNMVS7B.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-KOBZ2EY6.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-KOBZ2EY6.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-KYR5PYZH.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-KYR5PYZH.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-LXPT3ST6.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-LXPT3ST6.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-OFP4IZRJ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-OFP4IZRJ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-PEQZQI46.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-PEQZQI46.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-PSZZOCOG.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-PSZZOCOG.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-S2YGRMRU.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-S2YGRMRU.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-SCLVSU6P.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-SCLVSU6P.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-SKKRN3KO.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-SKKRN3KO.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-SNU2EDPW.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-SNU2EDPW.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-STRMIP24.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-STRMIP24.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-SVWLYT5M.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-SVWLYT5M.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-U2UBZNRQ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-U2UBZNRQ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-UAX3YSUW.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-UAX3YSUW.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-UNWZSS3R.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-UNWZSS3R.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-VH2OSJNQ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-VH2OSJNQ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-WDWNAAEG.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-WDWNAAEG.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-XHLUJ3B6.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-XHLUJ3B6.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-YJGJQOYZ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-YJGJQOYZ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-ZH73STAE.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-ZH73STAE.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-ZNH7G2NJ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-ZNH7G2NJ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-ZRZ2AMKI.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-ZRZ2AMKI.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-ZZTYOBSU.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/chunk-ZZTYOBSU.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/classDiagram-GS4TXN57.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/classDiagram-GS4TXN57.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/classDiagram-v2-T223ZLDE.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/classDiagram-v2-T223ZLDE.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/cose-bilkent-WGPWBIFM.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/cose-bilkent-WGPWBIFM.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/dagre-ESHLYXRB.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/dagre-ESHLYXRB.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/diagram-35RNQRIT.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/diagram-35RNQRIT.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/diagram-MACBZWK3.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/diagram-MACBZWK3.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/diagram-TKFVDK6Q.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/diagram-TKFVDK6Q.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/erDiagram-NUSZGL2K.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/erDiagram-NUSZGL2K.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/flowDiagram-TD5NMDKU.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/flowDiagram-TD5NMDKU.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/ganttDiagram-LDDRKPNN.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/ganttDiagram-LDDRKPNN.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/gitGraph-F6HP7TQM-KCFFVSNH.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/gitGraph-F6HP7TQM-KCFFVSNH.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/gitGraphDiagram-HMYFBHNQ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/gitGraphDiagram-HMYFBHNQ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/info-NVLQJR56-M2CC4IYF.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/info-NVLQJR56-M2CC4IYF.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/infoDiagram-YPZU3HRN.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/infoDiagram-YPZU3HRN.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/journeyDiagram-EMBJJZIB.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/journeyDiagram-EMBJJZIB.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/kanban-definition-XZ6RF72J.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/kanban-definition-XZ6RF72J.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/katex-A6QSACVP.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/katex-A6QSACVP.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/mindmap-definition-Z26EYU56.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/mindmap-definition-Z26EYU56.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/packet-BFZMPI3H-ABC5HYTE.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/packet-BFZMPI3H-ABC5HYTE.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/pie-7BOR55EZ-544PBEMT.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/pie-7BOR55EZ-544PBEMT.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/pieDiagram-DMORWRXK.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/pieDiagram-DMORWRXK.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/quadrantDiagram-Q67ROWKZ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/quadrantDiagram-Q67ROWKZ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/radar-NHE76QYJ-PXJX6GVO.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/radar-NHE76QYJ-PXJX6GVO.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/requirementDiagram-3NS7YNCK.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/requirementDiagram-3NS7YNCK.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/sankeyDiagram-OLRELTUB.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/sankeyDiagram-OLRELTUB.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/sequenceDiagram-MB3FELIF.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/sequenceDiagram-MB3FELIF.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/stateDiagram-AF2IOYDR.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/stateDiagram-AF2IOYDR.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/stateDiagram-v2-RQA4U5HQ.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/stateDiagram-v2-RQA4U5HQ.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/timeline-definition-IBICBATI.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/timeline-definition-IBICBATI.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/treemap-KMMF4GRG-YVX6V4UE.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/treemap-KMMF4GRG-YVX6V4UE.mjs.map create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/xychartDiagram-SWH7VB4X.mjs create mode 100644 vs-code-extension/media/mermaid/chunks/mermaid.esm/xychartDiagram-SWH7VB4X.mjs.map create mode 100644 vs-code-extension/media/mermaid/classDiagram-3d51384c.js create mode 100644 vs-code-extension/media/mermaid/classDiagram-5e12d5cf.js create mode 100644 vs-code-extension/media/mermaid/classDiagram-beda092f.js create mode 100644 vs-code-extension/media/mermaid/classDiagram-v2-2358418a.js create mode 100644 vs-code-extension/media/mermaid/classDiagram-v2-79130fb8.js create mode 100644 vs-code-extension/media/mermaid/classDiagram-v2-bbc92249.js create mode 100644 vs-code-extension/media/mermaid/clone-2c3335c5.js create mode 100644 vs-code-extension/media/mermaid/clone-efe1c6aa.js create mode 100644 vs-code-extension/media/mermaid/createText-1719965b.js create mode 100644 vs-code-extension/media/mermaid/createText-2822bf05.js create mode 100644 vs-code-extension/media/mermaid/createText-9372f704.js create mode 100644 vs-code-extension/media/mermaid/edges-20fff4f5.js create mode 100644 vs-code-extension/media/mermaid/edges-568b5f94.js create mode 100644 vs-code-extension/media/mermaid/edges-96097737.js create mode 100644 vs-code-extension/media/mermaid/erDiagram-0228fc6a.js create mode 100644 vs-code-extension/media/mermaid/erDiagram-08af4c5d.js create mode 100644 vs-code-extension/media/mermaid/erDiagram-b0a85d60.js create mode 100644 vs-code-extension/media/mermaid/flowDb-5aa2917a.js create mode 100644 vs-code-extension/media/mermaid/flowDb-c6c81e3f.js create mode 100644 vs-code-extension/media/mermaid/flowDb-f37475bf.js create mode 100644 vs-code-extension/media/mermaid/flowDiagram-50d868cf.js create mode 100644 vs-code-extension/media/mermaid/flowDiagram-d9de4fee.js create mode 100644 vs-code-extension/media/mermaid/flowDiagram-eee84b83.js create mode 100644 vs-code-extension/media/mermaid/flowDiagram-v2-4f6560a1.js create mode 100644 vs-code-extension/media/mermaid/flowDiagram-v2-8a954bf0.js create mode 100644 vs-code-extension/media/mermaid/flowDiagram-v2-a7830259.js create mode 100644 vs-code-extension/media/mermaid/flowchart-elk-definition-54b6c9ab.js create mode 100644 vs-code-extension/media/mermaid/flowchart-elk-definition-6af322e1.js create mode 100644 vs-code-extension/media/mermaid/flowchart-elk-definition-fb58cb64.js create mode 100644 vs-code-extension/media/mermaid/ganttDiagram-68513147.js create mode 100644 vs-code-extension/media/mermaid/ganttDiagram-a2739b55.js create mode 100644 vs-code-extension/media/mermaid/ganttDiagram-de594a00.js create mode 100644 vs-code-extension/media/mermaid/gitGraphDiagram-4b126544.js create mode 100644 vs-code-extension/media/mermaid/gitGraphDiagram-82fe8481.js create mode 100644 vs-code-extension/media/mermaid/gitGraphDiagram-e9a2600b.js create mode 100644 vs-code-extension/media/mermaid/graph-00ca1ddf.js create mode 100644 vs-code-extension/media/mermaid/graph-80608c14.js create mode 100644 vs-code-extension/media/mermaid/index-0cdc3891.js create mode 100644 vs-code-extension/media/mermaid/index-5325376f.js create mode 100644 vs-code-extension/media/mermaid/index-f8e20f6b.js create mode 100644 vs-code-extension/media/mermaid/infoDiagram-12be3fa1.js create mode 100644 vs-code-extension/media/mermaid/infoDiagram-3de034a5.js create mode 100644 vs-code-extension/media/mermaid/infoDiagram-8eee0895.js create mode 100644 vs-code-extension/media/mermaid/init-cc95ec8e.js create mode 100644 vs-code-extension/media/mermaid/init-f9637058.js create mode 100644 vs-code-extension/media/mermaid/journeyDiagram-682f54fe.js create mode 100644 vs-code-extension/media/mermaid/journeyDiagram-aedbf9a9.js create mode 100644 vs-code-extension/media/mermaid/journeyDiagram-c64418c1.js create mode 100644 vs-code-extension/media/mermaid/katex-79a689fb.js create mode 100644 vs-code-extension/media/mermaid/katex-fa3848e8.js create mode 100644 vs-code-extension/media/mermaid/layout-0254eb32.js create mode 100644 vs-code-extension/media/mermaid/layout-09aca9f2.js create mode 100644 vs-code-extension/media/mermaid/line-0c78f995.js create mode 100644 vs-code-extension/media/mermaid/line-8a001a24.js create mode 100644 vs-code-extension/media/mermaid/linear-73d6a963.js create mode 100644 vs-code-extension/media/mermaid/linear-b808bd80.js create mode 100644 vs-code-extension/media/mermaid/mermaid-7ea9cbd6.js create mode 100644 vs-code-extension/media/mermaid/mermaid-b92f6f74.js create mode 100644 vs-code-extension/media/mermaid/mermaid-d73f18bb.js create mode 100644 vs-code-extension/media/mermaid/mermaid.esm.min.mjs create mode 100644 vs-code-extension/media/mermaid/mindmap-definition-4da9e6a5.js create mode 100644 vs-code-extension/media/mermaid/mindmap-definition-8da855dc.js create mode 100644 vs-code-extension/media/mermaid/mindmap-definition-aebd360e.js create mode 100644 vs-code-extension/media/mermaid/ordinal-475e0c0c.js create mode 100644 vs-code-extension/media/mermaid/ordinal-5695958c.js create mode 100644 vs-code-extension/media/mermaid/path-39bad7e2.js create mode 100644 vs-code-extension/media/mermaid/path-428ebac9.js create mode 100644 vs-code-extension/media/mermaid/pieDiagram-16513e3f.js create mode 100644 vs-code-extension/media/mermaid/pieDiagram-2b639856.js create mode 100644 vs-code-extension/media/mermaid/pieDiagram-a8764435.js create mode 100644 vs-code-extension/media/mermaid/quadrantDiagram-1e28029f.js create mode 100644 vs-code-extension/media/mermaid/quadrantDiagram-39965fa8.js create mode 100644 vs-code-extension/media/mermaid/quadrantDiagram-f58eb955.js create mode 100644 vs-code-extension/media/mermaid/requirementDiagram-0513a134.js create mode 100644 vs-code-extension/media/mermaid/requirementDiagram-08caed73.js create mode 100644 vs-code-extension/media/mermaid/requirementDiagram-a9a1ab5b.js create mode 100644 vs-code-extension/media/mermaid/sankeyDiagram-a04cb91d.js create mode 100644 vs-code-extension/media/mermaid/sankeyDiagram-a91c88a3.js create mode 100644 vs-code-extension/media/mermaid/sankeyDiagram-bcf67920.js create mode 100644 vs-code-extension/media/mermaid/sequenceDiagram-75649615.js create mode 100644 vs-code-extension/media/mermaid/sequenceDiagram-a77d5917.js create mode 100644 vs-code-extension/media/mermaid/sequenceDiagram-c5b8d532.js create mode 100644 vs-code-extension/media/mermaid/stateDiagram-1ecb1508.js create mode 100644 vs-code-extension/media/mermaid/stateDiagram-8198abf2.js create mode 100644 vs-code-extension/media/mermaid/stateDiagram-e4aff18a.js create mode 100644 vs-code-extension/media/mermaid/stateDiagram-v2-b2978744.js create mode 100644 vs-code-extension/media/mermaid/stateDiagram-v2-c2b004d7.js create mode 100644 vs-code-extension/media/mermaid/stateDiagram-v2-f5ecddeb.js create mode 100644 vs-code-extension/media/mermaid/styles-13ae24cf.js create mode 100644 vs-code-extension/media/mermaid/styles-6d98f5a4.js create mode 100644 vs-code-extension/media/mermaid/styles-b4e223ce.js create mode 100644 vs-code-extension/media/mermaid/styles-bfb5f58b.js create mode 100644 vs-code-extension/media/mermaid/styles-ca3715f6.js create mode 100644 vs-code-extension/media/mermaid/styles-d45a18b0.js create mode 100644 vs-code-extension/media/mermaid/styles-d81a254a.js create mode 100644 vs-code-extension/media/mermaid/styles-f321baca.js create mode 100644 vs-code-extension/media/mermaid/styles-f7f4f728.js create mode 100644 vs-code-extension/media/mermaid/svgDrawCommon-093cedf0.js create mode 100644 vs-code-extension/media/mermaid/svgDrawCommon-b86b1483.js create mode 100644 vs-code-extension/media/mermaid/svgDrawCommon-bcac189f.js create mode 100644 vs-code-extension/media/mermaid/timeline-definition-36903ae4.js create mode 100644 vs-code-extension/media/mermaid/timeline-definition-d25df101.js create mode 100644 vs-code-extension/media/mermaid/timeline-definition-faaaa080.js create mode 100644 vs-code-extension/media/mermaid/xychartDiagram-66f36244.js create mode 100644 vs-code-extension/media/mermaid/xychartDiagram-a4065021.js create mode 100644 vs-code-extension/media/mermaid/xychartDiagram-f5964ef8.js create mode 100644 vs-code-extension/src/inline-editor/InlineEditorManager.ts create mode 100644 vs-code-extension/src/inline-editor/LICENCE-THIRD-PARTY.md create mode 100644 vs-code-extension/src/inline-editor/code-block-hover-provider.ts create mode 100644 vs-code-extension/src/inline-editor/config.ts create mode 100644 vs-code-extension/src/inline-editor/decorations.ts create mode 100644 vs-code-extension/src/inline-editor/decorator.ts create mode 100644 vs-code-extension/src/inline-editor/decorator/checkbox-toggle.ts create mode 100644 vs-code-extension/src/inline-editor/decorator/decoration-categories.ts create mode 100644 vs-code-extension/src/inline-editor/decorator/decoration-type-registry.ts create mode 100644 vs-code-extension/src/inline-editor/decorator/mermaid-diagram-decorations.ts create mode 100644 vs-code-extension/src/inline-editor/decorator/visibility-model.ts create mode 100644 vs-code-extension/src/inline-editor/diff-context.ts create mode 100644 vs-code-extension/src/inline-editor/emoji-map-loader.ts create mode 100644 vs-code-extension/src/inline-editor/emoji-map.ts create mode 100644 vs-code-extension/src/inline-editor/forge-context.ts create mode 100644 vs-code-extension/src/inline-editor/github-context.ts create mode 100644 vs-code-extension/src/inline-editor/image-hover-provider.ts create mode 100644 vs-code-extension/src/inline-editor/link-click-handler.ts create mode 100644 vs-code-extension/src/inline-editor/link-hover-provider.ts create mode 100644 vs-code-extension/src/inline-editor/link-provider.ts create mode 100644 vs-code-extension/src/inline-editor/link-targets.ts create mode 100644 vs-code-extension/src/inline-editor/markdown-parse-cache.ts create mode 100644 vs-code-extension/src/inline-editor/math/math-decorations.ts create mode 100644 vs-code-extension/src/inline-editor/math/math-renderer.ts create mode 100644 vs-code-extension/src/inline-editor/math/math-scanner.ts create mode 100644 vs-code-extension/src/inline-editor/mermaid/constants.ts create mode 100644 vs-code-extension/src/inline-editor/mermaid/error-handler.ts create mode 100644 vs-code-extension/src/inline-editor/mermaid/index.ts create mode 100644 vs-code-extension/src/inline-editor/mermaid/mermaid-renderer.ts create mode 100644 vs-code-extension/src/inline-editor/mermaid/svg-processor.ts create mode 100644 vs-code-extension/src/inline-editor/mermaid/types.ts create mode 100644 vs-code-extension/src/inline-editor/mermaid/webview-manager.ts create mode 100644 vs-code-extension/src/inline-editor/parser-remark.ts create mode 100644 vs-code-extension/src/inline-editor/parser.ts create mode 100644 vs-code-extension/src/inline-editor/position-mapping.ts create mode 100644 vs-code-extension/src/inline-editor/utils/lru-cache.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a74484..b1e9769 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to AS Notes will be documented here. ## Pending Release +- Feature: Inline Markdown editor (Typora-like syntax shadowing). Bold, italic, headings, links, images, code blocks, tables, emoji, Mermaid diagrams, and LaTeX math are rendered inline with a three-state visibility model (rendered/ghost/raw). Toggle via command palette or editor title bar eye icon. Based on markdown-inline-editor-vscode by SeardnaSchmid (MIT). +- Feature: Detects conflicting Markdown Inline Editor extensions and offers to disable them. +- Feature: Outliner mode awareness -- bullet markers and checkbox syntax always remain visible when outliner mode is active. + ## [2.2.9] - 2026-03-24 - Feature: Improved default themes for static HTML publishing. diff --git a/README.md b/README.md index 84ccadd..79b72ca 100644 --- a/README.md +++ b/README.md @@ -227,6 +227,36 @@ The extension is aware of existing fence pairs: if the backticks are already bal In outliner mode, pressing Enter on a closing `` ``` `` line that belongs to a bullet code block inserts a new bullet at the parent's indentation. +### Inline Editor (Syntax Shadowing) + +AS Notes includes a built-in inline Markdown editor that renders formatting directly in the text editor, similar to Typora. Standard Markdown syntax characters (`**`, `##`, `[]()`, etc.) are replaced with their visual equivalents as you write. + +**Three-state visibility:** + +| State | When | What you see | +|---|---|---| +| **Rendered** | Cursor is elsewhere | Clean formatted text (syntax hidden) | +| **Ghost** | Cursor is on the line | Syntax characters at reduced opacity | +| **Raw** | Cursor is inside the construct | Full Markdown source | + +**Supported constructs:** + +Bold, italic, strikethrough, headings (H1-H6), inline code, links, images, blockquotes, horizontal rules, unordered/task lists, code blocks (with language labels), YAML frontmatter, GFM tables, emoji shortcodes (`:smile:` etc.), Mermaid diagrams (inline SVG), LaTeX/math (KaTeX/MathJax), GitHub mentions and issue references. + +**Toggle:** Use the **AS Notes: Toggle Inline Editor** command or click the eye icon in the editor title bar. The toggle state is persisted per workspace. + +**Outliner mode awareness:** When outliner mode is active, bullet markers and checkbox syntax are never hidden, ensuring the outliner structure is always visible. + +| Setting | Default | Description | +|---|---|---| +| `as-notes.inlineEditor.enabled` | `true` | Enable/disable inline rendering | +| `as-notes.inlineEditor.decorations.ghostFaintOpacity` | `0.3` | Opacity for ghost-state syntax characters | +| `as-notes.inlineEditor.links.singleClickOpen` | `false` | Open links with a single click (instead of Ctrl+Click) | + +See [Settings](#settings) for the full list of inline editor settings. + +> Based on [markdown-inline-editor-vscode](https://github.com/SeardnaSchmid/markdown-inline-editor-vscode) by SeardnaSchmid (MIT licence). + ## AS Notes Pro Features A **Pro licence** unlocks premium features. When a valid key is active the status bar shows **AS Notes (Pro)**. diff --git a/TECHNICAL.md b/TECHNICAL.md index 73ba643..bd054cf 100644 --- a/TECHNICAL.md +++ b/TECHNICAL.md @@ -48,6 +48,12 @@ This document explains the internal architecture, algorithms, and design decisio - [Default vs active](#default-vs-active) - [Why segments prevent decoration conflicts](#why-segments-prevent-decoration-conflicts) - [Debug logging](#debug-logging) +- [Inline editor (syntax shadowing)](#inline-editor-syntax-shadowing) + - [Three-state visibility model](#three-state-visibility-model) + - [Architecture](#architecture) + - [Outliner mode awareness](#outliner-mode-awareness) + - [Conflict detection](#conflict-detection) + - [Settings](#settings) - [Click navigation](#click-navigation) - [DocumentLinkProvider and command URIs](#documentlinkprovider-and-command-uris) - [File resolution](#file-resolution) @@ -1315,6 +1321,50 @@ Diagnostic logging is provided by `LogService` (`src/LogService.ts`), a pure Nod --- +## Inline editor (syntax shadowing) + +The inline editor provides Typora-like WYSIWYG rendering of standard Markdown syntax directly in the VS Code editor. It is based on [markdown-inline-editor-vscode](https://github.com/SeardnaSchmid/markdown-inline-editor-vscode) by SeardnaSchmid (MIT licence), integrated as a full code copy in `src/inline-editor/`. + +### Three-state visibility model + +Each Markdown construct uses a three-state visibility model: + +| State | When | Effect | +|---|---|---| +| **Rendered** | Cursor is not on the line | Syntax characters are hidden; styled output is shown (e.g. **bold** without `**`) | +| **Ghost** | Cursor is on the line but outside the construct | Syntax characters are shown at reduced opacity (configurable via `as-notes.inlineEditor.decorations.ghostFaintOpacity`) | +| **Raw** | Cursor is inside the construct (or text is selected) | Full Markdown source is shown | + +The filtering logic lives in `decorator/visibility-model.ts` (`filterDecorationsForEditor`). It processes each `DecorationRange` from the parser against the current cursor/selection positions to decide which state applies. + +### Architecture + +| Component | File | Responsibility | +|---|---|---| +| `InlineEditorManager` | `InlineEditorManager.ts` | Lifecycle orchestration, wiring providers/commands/listeners | +| `MarkdownParser` | `parser.ts` | Remark-based AST parsing to extract `DecorationRange[]` and `ScopeRange[]` | +| `MarkdownParseCache` | `markdown-parse-cache.ts` | LRU cache (10 documents) of parse results | +| `Decorator` | `decorator.ts` | Orchestrates decoration lifecycle, applies filtered results to editor | +| `DecorationTypeRegistry` | `decorator/decoration-type-registry.ts` | Caches VS Code `TextEditorDecorationType` instances | +| Visibility model | `decorator/visibility-model.ts` | Three-state filtering logic | +| Hover providers | `image-hover-provider.ts`, `link-hover-provider.ts`, `code-block-hover-provider.ts` | Rich hover popups for images, links, code blocks | +| Link provider | `link-provider.ts` | Clickable links in rendered mode | +| Checkbox toggle | `decorator/checkbox-toggle.ts` | Click-to-toggle `[ ]`/`[x]` (two-state, complements AS Notes' three-state keyboard toggle) | + +### Outliner mode awareness + +When the `as-notes.outlinerMode` setting is active, bullet markers (`-`, `*`, `+`) and checkbox syntax (`- [ ]`, `- [x]`) are never hidden or ghosted by the inline editor. This is enforced in `filterDecorationsForEditor` via the `outlinerAlwaysRawTypes` set, which skips `listItem`, `checkboxUnchecked`, and `checkboxChecked` decoration types when `outlinerMode` is true. + +### Conflict detection + +On activation, `InlineEditorManager` checks whether the standalone Markdown Inline Editor extension (original or fork) is installed. If detected, it shows a warning with an option to disable the conflicting extension, preventing issues such as duplicate hover popups and double checkbox toggles. + +### Settings + +All settings are under the `as-notes.inlineEditor.*` namespace. The toggle is also available as the `AS Notes: Toggle Inline Editor` command and as an eye icon in the editor title bar (visible for Markdown files). + +--- + ## Click navigation ### DocumentLinkProvider and command URIs diff --git a/docs-src/docs/Settings.md b/docs-src/docs/Settings.md index 1a37c2c..4292db3 100644 --- a/docs-src/docs/Settings.md +++ b/docs-src/docs/Settings.md @@ -29,6 +29,38 @@ All AS Notes settings are available in VS Code Settings (`Ctrl+,`). Search for ` |---|---|---| | `as-notes.licenceKey` | *(empty)* | AS Notes Pro licence key (format: `ASNO-XXXX-XXXX-XXXX-XXXX`). Unlocks table commands and encrypted notes. Enter via **AS Notes: Enter Licence Key** in the Command Palette, or paste directly here. Stored at machine scope (not synced across devices). See [[Encrypted Notes]]. | +## Inline Editor Settings + +The inline editor renders Markdown formatting directly in the text editor (Typora-like syntax shadowing). All settings are under the `as-notes.inlineEditor` namespace. + +| Setting | Default | Description | +|---|---|---| +| `as-notes.inlineEditor.enabled` | `true` | Enable/disable inline Markdown rendering. Also togglable via the **AS Notes: Toggle Inline Editor** command or the eye icon in the editor title bar. | +| `as-notes.inlineEditor.decorations.ghostFaintOpacity` | `0.3` | Opacity (0-1) for syntax characters in ghost state (cursor on the same line but outside the construct). | +| `as-notes.inlineEditor.decorations.frontmatterDelimiterOpacity` | `0.6` | Opacity for YAML frontmatter `---` delimiters. | +| `as-notes.inlineEditor.decorations.codeBlockLanguageOpacity` | `0.5` | Opacity for the language identifier on fenced code blocks (e.g. `javascript`). | +| `as-notes.inlineEditor.defaultBehaviors.diffView.applyDecorations` | `false` | Apply inline decorations in diff views. | +| `as-notes.inlineEditor.links.singleClickOpen` | `false` | Open links with a single click instead of Ctrl+Click. | +| `as-notes.inlineEditor.defaultBehaviors.emoji` | `true` | Render `:emoji:` shortcodes as emoji characters. | +| `as-notes.inlineEditor.defaultBehaviors.math` | `true` | Render `$...$` and `$$...$$` math expressions inline. | +| `as-notes.inlineEditor.defaultBehaviors.mentionLinks` | `true` | Render `@user` mentions as clickable links. | + +Colour overrides (leave empty to use theme defaults): + +| Setting | Default | Description | +|---|---|---| +| `as-notes.inlineEditor.colors.heading1` | *(empty)* | Colour for H1 headings | +| `as-notes.inlineEditor.colors.heading2` | *(empty)* | Colour for H2 headings | +| `as-notes.inlineEditor.colors.heading3` | *(empty)* | Colour for H3 headings | +| `as-notes.inlineEditor.colors.heading4` | *(empty)* | Colour for H4 headings | +| `as-notes.inlineEditor.colors.heading5` | *(empty)* | Colour for H5 headings | +| `as-notes.inlineEditor.colors.heading6` | *(empty)* | Colour for H6 headings | +| `as-notes.inlineEditor.colors.bold` | *(empty)* | Colour for bold text | +| `as-notes.inlineEditor.colors.italic` | *(empty)* | Colour for italic text | +| `as-notes.inlineEditor.colors.strikethrough` | *(empty)* | Colour for strikethrough text | +| `as-notes.inlineEditor.colors.link` | *(empty)* | Colour for links | +| `as-notes.inlineEditor.colors.inlineCode` | *(empty)* | Colour for inline code | + ## Keyboard Shortcuts AS Notes registers the following default keyboard shortcuts. All can be rebound in **Keyboard Shortcuts** (`Ctrl+K Ctrl+S`). diff --git a/docs-src/docs/Test Doc.md b/docs-src/docs/Test Doc.md new file mode 100644 index 0000000..8465663 --- /dev/null +++ b/docs-src/docs/Test Doc.md @@ -0,0 +1,11 @@ + +Test + +| Col 1 | Col 2 | Col 3 | Col 4 | Col 5 | Col 6 | +|----------------|---------|---------|---------|---------|---------| +| Test Tets test | | | | | | +| | | | | | | +| | | | | | | +| | | | | | | +| | | | | | | +| | | | | | | diff --git a/vs-code-extension/media/inline-editor-eye.svg b/vs-code-extension/media/inline-editor-eye.svg new file mode 100644 index 0000000..bffaa93 --- /dev/null +++ b/vs-code-extension/media/inline-editor-eye.svg @@ -0,0 +1,6 @@ + + Markdown Inline Editor + + diff --git a/vs-code-extension/media/mermaid/Tableau10-31042135.js b/vs-code-extension/media/mermaid/Tableau10-31042135.js new file mode 100644 index 0000000..b9a4999 --- /dev/null +++ b/vs-code-extension/media/mermaid/Tableau10-31042135.js @@ -0,0 +1,10 @@ +function colors(specifier) { + var n = specifier.length / 6 | 0, colors2 = new Array(n), i = 0; + while (i < n) + colors2[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors2; +} +const d3schemeTableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); +export { + d3schemeTableau10 as d +}; diff --git a/vs-code-extension/media/mermaid/Tableau10-558cc280.js b/vs-code-extension/media/mermaid/Tableau10-558cc280.js new file mode 100644 index 0000000..c45cc48 --- /dev/null +++ b/vs-code-extension/media/mermaid/Tableau10-558cc280.js @@ -0,0 +1,9 @@ +function o(e) { + for (var c = e.length / 6 | 0, n = new Array(c), a = 0; a < c; ) + n[a] = "#" + e.slice(a * 6, ++a * 6); + return n; +} +const r = o("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); +export { + r as d +}; diff --git a/vs-code-extension/media/mermaid/arc-911b4007.js b/vs-code-extension/media/mermaid/arc-911b4007.js new file mode 100644 index 0000000..2ba0fd8 --- /dev/null +++ b/vs-code-extension/media/mermaid/arc-911b4007.js @@ -0,0 +1,148 @@ +import { w as withPath, c as constant } from "./path-39bad7e2.js"; +import { aw as pi, ax as cos, ay as sin, az as halfPi, aA as epsilon, V as tau, aB as sqrt, aC as min, aD as abs, aE as atan2, aF as asin, aG as acos, aH as max } from "./mermaid-d73f18bb.js"; +function arcInnerRadius(d) { + return d.innerRadius; +} +function arcOuterRadius(d) { + return d.outerRadius; +} +function arcStartAngle(d) { + return d.startAngle; +} +function arcEndAngle(d) { + return d.endAngle; +} +function arcPadAngle(d) { + return d && d.padAngle; +} +function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, x32 = x3 - x2, y32 = y3 - y2, t = y32 * x10 - x32 * y10; + if (t * t < epsilon) + return; + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + return [x0 + t * x10, y0 + t * y10]; +} +function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, y01 = y0 - y1, lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x0 + ox, y11 = y0 + oy, x10 = x1 + ox, y10 = y1 + oy, x00 = (x11 + x10) / 2, y00 = (y11 + y10) / 2, dx = x10 - x11, dy = y10 - y11, d2 = dx * dx + dy * dy, r = r1 - rc, D = x11 * y10 - x10 * y11, d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x00, dy0 = cy0 - y00, dx1 = cx1 - x00, dy1 = cy1 - y00; + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) + cx0 = cx1, cy0 = cy1; + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; +} +function d3arc() { + var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, cornerRadius = constant(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, padAngle = arcPadAngle, context = null, path = withPath(arc); + function arc() { + var buffer, r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) - halfPi, a1 = endAngle.apply(this, arguments) - halfPi, da = abs(a1 - a0), cw = a1 > a0; + if (!context) + context = buffer = path(); + if (r1 < r0) + r = r1, r1 = r0, r0 = r; + if (!(r1 > epsilon)) + context.moveTo(0, 0); + else if (da > tau - epsilon) { + context.moveTo(r1 * cos(a0), r1 * sin(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon) { + context.moveTo(r0 * cos(a1), r0 * sin(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } else { + var a01 = a0, a11 = a1, a00 = a0, a10 = a1, da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, rp = ap > epsilon && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc, t0, t1; + if (rp > epsilon) { + var p0 = asin(rp / r0 * sin(ap)), p1 = asin(rp / r1 * sin(ap)); + if ((da0 -= p0 * 2) > epsilon) + p0 *= cw ? 1 : -1, a00 += p0, a10 -= p0; + else + da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon) + p1 *= cw ? 1 : -1, a01 += p1, a11 -= p1; + else + da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + var x01 = r1 * cos(a01), y01 = r1 * sin(a01), x10 = r0 * cos(a10), y10 = r0 * sin(a10); + if (rc > epsilon) { + var x11 = r1 * cos(a11), y11 = r1 * sin(a11), x00 = r0 * cos(a00), y00 = r0 * sin(a00), oc; + if (da < pi) { + if (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10)) { + var ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min(rc, (r0 - lc) / (kc - 1)); + rc1 = min(rc, (r1 - lc) / (kc + 1)); + } else { + rc0 = rc1 = 0; + } + } + } + if (!(da1 > epsilon)) + context.moveTo(x01, y01); + else if (rc1 > epsilon) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + if (rc1 < rc) + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + else { + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } else + context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + if (!(r0 > epsilon) || !(da0 > epsilon)) + context.lineTo(x10, y10); + else if (rc0 > epsilon) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + if (rc0 < rc) + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + else { + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } else + context.arc(0, 0, r0, a10, a00, cw); + } + context.closePath(); + if (buffer) + return context = null, buffer + "" || null; + } + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2; + return [cos(a) * r, sin(a) * r]; + }; + arc.innerRadius = function(_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant(+_), arc) : innerRadius; + }; + arc.outerRadius = function(_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant(+_), arc) : outerRadius; + }; + arc.cornerRadius = function(_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant(+_), arc) : cornerRadius; + }; + arc.padRadius = function(_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant(+_), arc) : padRadius; + }; + arc.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), arc) : startAngle; + }; + arc.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), arc) : endAngle; + }; + arc.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), arc) : padAngle; + }; + arc.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, arc) : context; + }; + return arc; +} +export { + d3arc as d +}; diff --git a/vs-code-extension/media/mermaid/arc-a15e19dc.js b/vs-code-extension/media/mermaid/arc-a15e19dc.js new file mode 100644 index 0000000..7b0b66b --- /dev/null +++ b/vs-code-extension/media/mermaid/arc-a15e19dc.js @@ -0,0 +1,86 @@ +import { w as ln, c as H } from "./path-428ebac9.js"; +import { aw as an, ax as V, ay as D, az as rn, aA as y, V as on, aB as K, aC as _, aD as un, aE as t, aF as sn, aG as tn, aH as fn } from "./mermaid-b92f6f74.js"; +function cn(l) { + return l.innerRadius; +} +function yn(l) { + return l.outerRadius; +} +function gn(l) { + return l.startAngle; +} +function mn(l) { + return l.endAngle; +} +function pn(l) { + return l && l.padAngle; +} +function dn(l, h, z, E, v, A, I, a) { + var B = z - l, i = E - h, n = I - v, m = a - A, r = m * B - n * i; + if (!(r * r < y)) + return r = (n * (h - A) - m * (l - v)) / r, [l + r * B, h + r * i]; +} +function W(l, h, z, E, v, A, I) { + var a = l - z, B = h - E, i = (I ? A : -A) / K(a * a + B * B), n = i * B, m = -i * a, r = l + n, s = h + m, f = z + n, c = E + m, O = (r + f) / 2, o = (s + c) / 2, p = f - r, g = c - s, R = p * p + g * g, T = v - A, w = r * c - f * s, C = (g < 0 ? -1 : 1) * K(fn(0, T * T * R - w * w)), F = (w * g - p * C) / R, G = (-w * p - g * C) / R, P = (w * g + p * C) / R, d = (-w * p + g * C) / R, x = F - O, e = G - o, u = P - O, S = d - o; + return x * x + e * e > u * u + S * S && (F = P, G = d), { + cx: F, + cy: G, + x01: -n, + y01: -m, + x11: F * (v / T - 1), + y11: G * (v / T - 1) + }; +} +function vn() { + var l = cn, h = yn, z = H(0), E = null, v = gn, A = mn, I = pn, a = null, B = ln(i); + function i() { + var n, m, r = +l.apply(this, arguments), s = +h.apply(this, arguments), f = v.apply(this, arguments) - rn, c = A.apply(this, arguments) - rn, O = un(c - f), o = c > f; + if (a || (a = n = B()), s < r && (m = s, s = r, r = m), !(s > y)) + a.moveTo(0, 0); + else if (O > on - y) + a.moveTo(s * V(f), s * D(f)), a.arc(0, 0, s, f, c, !o), r > y && (a.moveTo(r * V(c), r * D(c)), a.arc(0, 0, r, c, f, o)); + else { + var p = f, g = c, R = f, T = c, w = O, C = O, F = I.apply(this, arguments) / 2, G = F > y && (E ? +E.apply(this, arguments) : K(r * r + s * s)), P = _(un(s - r) / 2, +z.apply(this, arguments)), d = P, x = P, e, u; + if (G > y) { + var S = sn(G / r * D(F)), L = sn(G / s * D(F)); + (w -= S * 2) > y ? (S *= o ? 1 : -1, R += S, T -= S) : (w = 0, R = T = (f + c) / 2), (C -= L * 2) > y ? (L *= o ? 1 : -1, p += L, g -= L) : (C = 0, p = g = (f + c) / 2); + } + var j = s * V(p), J = s * D(p), M = r * V(T), N = r * D(T); + if (P > y) { + var Q = s * V(g), U = s * D(g), X = r * V(R), Y = r * D(R), q; + if (O < an) + if (q = dn(j, J, X, Y, Q, U, M, N)) { + var Z = j - q[0], $ = J - q[1], k = Q - q[0], b = U - q[1], nn = 1 / D(tn((Z * k + $ * b) / (K(Z * Z + $ * $) * K(k * k + b * b))) / 2), en = K(q[0] * q[0] + q[1] * q[1]); + d = _(P, (r - en) / (nn - 1)), x = _(P, (s - en) / (nn + 1)); + } else + d = x = 0; + } + C > y ? x > y ? (e = W(X, Y, j, J, s, x, o), u = W(Q, U, M, N, s, x, o), a.moveTo(e.cx + e.x01, e.cy + e.y01), x < P ? a.arc(e.cx, e.cy, x, t(e.y01, e.x01), t(u.y01, u.x01), !o) : (a.arc(e.cx, e.cy, x, t(e.y01, e.x01), t(e.y11, e.x11), !o), a.arc(0, 0, s, t(e.cy + e.y11, e.cx + e.x11), t(u.cy + u.y11, u.cx + u.x11), !o), a.arc(u.cx, u.cy, x, t(u.y11, u.x11), t(u.y01, u.x01), !o))) : (a.moveTo(j, J), a.arc(0, 0, s, p, g, !o)) : a.moveTo(j, J), !(r > y) || !(w > y) ? a.lineTo(M, N) : d > y ? (e = W(M, N, Q, U, r, -d, o), u = W(j, J, X, Y, r, -d, o), a.lineTo(e.cx + e.x01, e.cy + e.y01), d < P ? a.arc(e.cx, e.cy, d, t(e.y01, e.x01), t(u.y01, u.x01), !o) : (a.arc(e.cx, e.cy, d, t(e.y01, e.x01), t(e.y11, e.x11), !o), a.arc(0, 0, r, t(e.cy + e.y11, e.cx + e.x11), t(u.cy + u.y11, u.cx + u.x11), o), a.arc(u.cx, u.cy, d, t(u.y11, u.x11), t(u.y01, u.x01), !o))) : a.arc(0, 0, r, T, R, o); + } + if (a.closePath(), n) + return a = null, n + "" || null; + } + return i.centroid = function() { + var n = (+l.apply(this, arguments) + +h.apply(this, arguments)) / 2, m = (+v.apply(this, arguments) + +A.apply(this, arguments)) / 2 - an / 2; + return [V(m) * n, D(m) * n]; + }, i.innerRadius = function(n) { + return arguments.length ? (l = typeof n == "function" ? n : H(+n), i) : l; + }, i.outerRadius = function(n) { + return arguments.length ? (h = typeof n == "function" ? n : H(+n), i) : h; + }, i.cornerRadius = function(n) { + return arguments.length ? (z = typeof n == "function" ? n : H(+n), i) : z; + }, i.padRadius = function(n) { + return arguments.length ? (E = n == null ? null : typeof n == "function" ? n : H(+n), i) : E; + }, i.startAngle = function(n) { + return arguments.length ? (v = typeof n == "function" ? n : H(+n), i) : v; + }, i.endAngle = function(n) { + return arguments.length ? (A = typeof n == "function" ? n : H(+n), i) : A; + }, i.padAngle = function(n) { + return arguments.length ? (I = typeof n == "function" ? n : H(+n), i) : I; + }, i.context = function(n) { + return arguments.length ? (a = n ?? null, i) : a; + }, i; +} +export { + vn as d +}; diff --git a/vs-code-extension/media/mermaid/array-2ff2c7a6.js b/vs-code-extension/media/mermaid/array-2ff2c7a6.js new file mode 100644 index 0000000..66ab952 --- /dev/null +++ b/vs-code-extension/media/mermaid/array-2ff2c7a6.js @@ -0,0 +1,6 @@ +function t(r) { + return typeof r == "object" && "length" in r ? r : Array.from(r); +} +export { + t as a +}; diff --git a/vs-code-extension/media/mermaid/array-b7dcf730.js b/vs-code-extension/media/mermaid/array-b7dcf730.js new file mode 100644 index 0000000..0a4e26a --- /dev/null +++ b/vs-code-extension/media/mermaid/array-b7dcf730.js @@ -0,0 +1,6 @@ +function array(x) { + return typeof x === "object" && "length" in x ? x : Array.from(x); +} +export { + array as a +}; diff --git a/vs-code-extension/media/mermaid/blockDiagram-3894b6f4.js b/vs-code-extension/media/mermaid/blockDiagram-3894b6f4.js new file mode 100644 index 0000000..94fdfa4 --- /dev/null +++ b/vs-code-extension/media/mermaid/blockDiagram-3894b6f4.js @@ -0,0 +1,1230 @@ +import { c as ge, _ as se, l as L, E as ye, f as _e, B as we, o as De, j as H, k as Ne } from "./mermaid-b92f6f74.js"; +import { c as Ie } from "./clone-2c3335c5.js"; +import { c as Oe } from "./channel-d3ce1aa3.js"; +import { h as Te, f as ze, j as Ce, e as de, p as Ae, a as Re } from "./edges-20fff4f5.js"; +import { G as ve } from "./graph-80608c14.js"; +import { o as Be } from "./ordinal-5695958c.js"; +import { d as ke } from "./Tableau10-558cc280.js"; +import "./createText-9372f704.js"; +import "./line-0c78f995.js"; +import "./array-2ff2c7a6.js"; +import "./path-428ebac9.js"; +import "./init-f9637058.js"; +var ee = function() { + var e = function(D, l, s, r) { + for (s = s || {}, r = D.length; r--; s[D[r]] = l) + ; + return s; + }, c = [1, 7], u = [1, 13], a = [1, 14], i = [1, 15], g = [1, 19], o = [1, 16], p = [1, 17], f = [1, 18], m = [8, 30], S = [8, 21, 28, 29, 30, 31, 32, 40, 44, 47], y = [1, 23], z = [1, 24], I = [8, 15, 16, 21, 28, 29, 30, 31, 32, 40, 44, 47], w = [8, 15, 16, 21, 27, 28, 29, 30, 31, 32, 40, 44, 47], C = [1, 49], E = { + trace: function() { + }, + yy: {}, + symbols_: { error: 2, spaceLines: 3, SPACELINE: 4, NL: 5, separator: 6, SPACE: 7, EOF: 8, start: 9, BLOCK_DIAGRAM_KEY: 10, document: 11, stop: 12, statement: 13, link: 14, LINK: 15, START_LINK: 16, LINK_LABEL: 17, STR: 18, nodeStatement: 19, columnsStatement: 20, SPACE_BLOCK: 21, blockStatement: 22, classDefStatement: 23, cssClassStatement: 24, styleStatement: 25, node: 26, SIZE: 27, COLUMNS: 28, "id-block": 29, end: 30, block: 31, NODE_ID: 32, nodeShapeNLabel: 33, dirList: 34, DIR: 35, NODE_DSTART: 36, NODE_DEND: 37, BLOCK_ARROW_START: 38, BLOCK_ARROW_END: 39, classDef: 40, CLASSDEF_ID: 41, CLASSDEF_STYLEOPTS: 42, DEFAULT: 43, class: 44, CLASSENTITY_IDS: 45, STYLECLASS: 46, style: 47, STYLE_ENTITY_IDS: 48, STYLE_DEFINITION_DATA: 49, $accept: 0, $end: 1 }, + terminals_: { 2: "error", 4: "SPACELINE", 5: "NL", 7: "SPACE", 8: "EOF", 10: "BLOCK_DIAGRAM_KEY", 15: "LINK", 16: "START_LINK", 17: "LINK_LABEL", 18: "STR", 21: "SPACE_BLOCK", 27: "SIZE", 28: "COLUMNS", 29: "id-block", 30: "end", 31: "block", 32: "NODE_ID", 35: "DIR", 36: "NODE_DSTART", 37: "NODE_DEND", 38: "BLOCK_ARROW_START", 39: "BLOCK_ARROW_END", 40: "classDef", 41: "CLASSDEF_ID", 42: "CLASSDEF_STYLEOPTS", 43: "DEFAULT", 44: "class", 45: "CLASSENTITY_IDS", 46: "STYLECLASS", 47: "style", 48: "STYLE_ENTITY_IDS", 49: "STYLE_DEFINITION_DATA" }, + productions_: [0, [3, 1], [3, 2], [3, 2], [6, 1], [6, 1], [6, 1], [9, 3], [12, 1], [12, 1], [12, 2], [12, 2], [11, 1], [11, 2], [14, 1], [14, 4], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [19, 3], [19, 2], [19, 1], [20, 1], [22, 4], [22, 3], [26, 1], [26, 2], [34, 1], [34, 2], [33, 3], [33, 4], [23, 3], [23, 3], [24, 3], [25, 3]], + performAction: function(l, s, r, h, d, t, x) { + var n = t.length - 1; + switch (d) { + case 4: + h.getLogger().debug("Rule: separator (NL) "); + break; + case 5: + h.getLogger().debug("Rule: separator (Space) "); + break; + case 6: + h.getLogger().debug("Rule: separator (EOF) "); + break; + case 7: + h.getLogger().debug("Rule: hierarchy: ", t[n - 1]), h.setHierarchy(t[n - 1]); + break; + case 8: + h.getLogger().debug("Stop NL "); + break; + case 9: + h.getLogger().debug("Stop EOF "); + break; + case 10: + h.getLogger().debug("Stop NL2 "); + break; + case 11: + h.getLogger().debug("Stop EOF2 "); + break; + case 12: + h.getLogger().debug("Rule: statement: ", t[n]), typeof t[n].length == "number" ? this.$ = t[n] : this.$ = [t[n]]; + break; + case 13: + h.getLogger().debug("Rule: statement #2: ", t[n - 1]), this.$ = [t[n - 1]].concat(t[n]); + break; + case 14: + h.getLogger().debug("Rule: link: ", t[n], l), this.$ = { edgeTypeStr: t[n], label: "" }; + break; + case 15: + h.getLogger().debug("Rule: LABEL link: ", t[n - 3], t[n - 1], t[n]), this.$ = { edgeTypeStr: t[n], label: t[n - 1] }; + break; + case 18: + const B = parseInt(t[n]), Y = h.generateId(); + this.$ = { id: Y, type: "space", label: "", width: B, children: [] }; + break; + case 23: + h.getLogger().debug("Rule: (nodeStatement link node) ", t[n - 2], t[n - 1], t[n], " typestr: ", t[n - 1].edgeTypeStr); + const F = h.edgeStrToEdgeData(t[n - 1].edgeTypeStr); + this.$ = [ + { id: t[n - 2].id, label: t[n - 2].label, type: t[n - 2].type, directions: t[n - 2].directions }, + { id: t[n - 2].id + "-" + t[n].id, start: t[n - 2].id, end: t[n].id, label: t[n - 1].label, type: "edge", directions: t[n].directions, arrowTypeEnd: F, arrowTypeStart: "arrow_open" }, + { id: t[n].id, label: t[n].label, type: h.typeStr2Type(t[n].typeStr), directions: t[n].directions } + ]; + break; + case 24: + h.getLogger().debug("Rule: nodeStatement (abc88 node size) ", t[n - 1], t[n]), this.$ = { id: t[n - 1].id, label: t[n - 1].label, type: h.typeStr2Type(t[n - 1].typeStr), directions: t[n - 1].directions, widthInColumns: parseInt(t[n], 10) }; + break; + case 25: + h.getLogger().debug("Rule: nodeStatement (node) ", t[n]), this.$ = { id: t[n].id, label: t[n].label, type: h.typeStr2Type(t[n].typeStr), directions: t[n].directions, widthInColumns: 1 }; + break; + case 26: + h.getLogger().debug("APA123", this ? this : "na"), h.getLogger().debug("COLUMNS: ", t[n]), this.$ = { type: "column-setting", columns: t[n] === "auto" ? -1 : parseInt(t[n]) }; + break; + case 27: + h.getLogger().debug("Rule: id-block statement : ", t[n - 2], t[n - 1]), h.generateId(), this.$ = { ...t[n - 2], type: "composite", children: t[n - 1] }; + break; + case 28: + h.getLogger().debug("Rule: blockStatement : ", t[n - 2], t[n - 1], t[n]); + const R = h.generateId(); + this.$ = { id: R, type: "composite", label: "", children: t[n - 1] }; + break; + case 29: + h.getLogger().debug("Rule: node (NODE_ID separator): ", t[n]), this.$ = { id: t[n] }; + break; + case 30: + h.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ", t[n - 1], t[n]), this.$ = { id: t[n - 1], label: t[n].label, typeStr: t[n].typeStr, directions: t[n].directions }; + break; + case 31: + h.getLogger().debug("Rule: dirList: ", t[n]), this.$ = [t[n]]; + break; + case 32: + h.getLogger().debug("Rule: dirList: ", t[n - 1], t[n]), this.$ = [t[n - 1]].concat(t[n]); + break; + case 33: + h.getLogger().debug("Rule: nodeShapeNLabel: ", t[n - 2], t[n - 1], t[n]), this.$ = { typeStr: t[n - 2] + t[n], label: t[n - 1] }; + break; + case 34: + h.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ", t[n - 3], t[n - 2], " #3:", t[n - 1], t[n]), this.$ = { typeStr: t[n - 3] + t[n], label: t[n - 2], directions: t[n - 1] }; + break; + case 35: + case 36: + this.$ = { type: "classDef", id: t[n - 1].trim(), css: t[n].trim() }; + break; + case 37: + this.$ = { type: "applyClass", id: t[n - 1].trim(), styleClass: t[n].trim() }; + break; + case 38: + this.$ = { type: "applyStyles", id: t[n - 1].trim(), stylesStr: t[n].trim() }; + break; + } + }, + table: [{ 9: 1, 10: [1, 2] }, { 1: [3] }, { 11: 3, 13: 4, 19: 5, 20: 6, 21: c, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: u, 29: a, 31: i, 32: g, 40: o, 44: p, 47: f }, { 8: [1, 20] }, e(m, [2, 12], { 13: 4, 19: 5, 20: 6, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 11: 21, 21: c, 28: u, 29: a, 31: i, 32: g, 40: o, 44: p, 47: f }), e(S, [2, 16], { 14: 22, 15: y, 16: z }), e(S, [2, 17]), e(S, [2, 18]), e(S, [2, 19]), e(S, [2, 20]), e(S, [2, 21]), e(S, [2, 22]), e(I, [2, 25], { 27: [1, 25] }), e(S, [2, 26]), { 19: 26, 26: 12, 32: g }, { 11: 27, 13: 4, 19: 5, 20: 6, 21: c, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: u, 29: a, 31: i, 32: g, 40: o, 44: p, 47: f }, { 41: [1, 28], 43: [1, 29] }, { 45: [1, 30] }, { 48: [1, 31] }, e(w, [2, 29], { 33: 32, 36: [1, 33], 38: [1, 34] }), { 1: [2, 7] }, e(m, [2, 13]), { 26: 35, 32: g }, { 32: [2, 14] }, { 17: [1, 36] }, e(I, [2, 24]), { 11: 37, 13: 4, 14: 22, 15: y, 16: z, 19: 5, 20: 6, 21: c, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: u, 29: a, 31: i, 32: g, 40: o, 44: p, 47: f }, { 30: [1, 38] }, { 42: [1, 39] }, { 42: [1, 40] }, { 46: [1, 41] }, { 49: [1, 42] }, e(w, [2, 30]), { 18: [1, 43] }, { 18: [1, 44] }, e(I, [2, 23]), { 18: [1, 45] }, { 30: [1, 46] }, e(S, [2, 28]), e(S, [2, 35]), e(S, [2, 36]), e(S, [2, 37]), e(S, [2, 38]), { 37: [1, 47] }, { 34: 48, 35: C }, { 15: [1, 50] }, e(S, [2, 27]), e(w, [2, 33]), { 39: [1, 51] }, { 34: 52, 35: C, 39: [2, 31] }, { 32: [2, 15] }, e(w, [2, 34]), { 39: [2, 32] }], + defaultActions: { 20: [2, 7], 23: [2, 14], 50: [2, 15], 52: [2, 32] }, + parseError: function(l, s) { + if (s.recoverable) + this.trace(l); + else { + var r = new Error(l); + throw r.hash = s, r; + } + }, + parse: function(l) { + var s = this, r = [0], h = [], d = [null], t = [], x = this.table, n = "", B = 0, Y = 0, F = 2, R = 1, me = t.slice.call(arguments, 1), _ = Object.create(this.lexer), K = { yy: {} }; + for (var Z in this.yy) + Object.prototype.hasOwnProperty.call(this.yy, Z) && (K.yy[Z] = this.yy[Z]); + _.setInput(l, K.yy), K.yy.lexer = _, K.yy.parser = this, typeof _.yylloc > "u" && (_.yylloc = {}); + var J = _.yylloc; + t.push(J); + var be = _.options && _.options.ranges; + typeof K.yy.parseError == "function" ? this.parseError = K.yy.parseError : this.parseError = Object.getPrototypeOf(this).parseError; + function Ee() { + var P; + return P = h.pop() || _.lex() || R, typeof P != "number" && (P instanceof Array && (h = P, P = h.pop()), P = s.symbols_[P] || P), P; + } + for (var O, M, A, Q, W = {}, X, k, ae, G; ; ) { + if (M = r[r.length - 1], this.defaultActions[M] ? A = this.defaultActions[M] : ((O === null || typeof O > "u") && (O = Ee()), A = x[M] && x[M][O]), typeof A > "u" || !A.length || !A[0]) { + var $ = ""; + G = []; + for (X in x[M]) + this.terminals_[X] && X > F && G.push("'" + this.terminals_[X] + "'"); + _.showPosition ? $ = "Parse error on line " + (B + 1) + `: +` + _.showPosition() + ` +Expecting ` + G.join(", ") + ", got '" + (this.terminals_[O] || O) + "'" : $ = "Parse error on line " + (B + 1) + ": Unexpected " + (O == R ? "end of input" : "'" + (this.terminals_[O] || O) + "'"), this.parseError($, { + text: _.match, + token: this.terminals_[O] || O, + line: _.yylineno, + loc: J, + expected: G + }); + } + if (A[0] instanceof Array && A.length > 1) + throw new Error("Parse Error: multiple actions possible at state: " + M + ", token: " + O); + switch (A[0]) { + case 1: + r.push(O), d.push(_.yytext), t.push(_.yylloc), r.push(A[1]), O = null, Y = _.yyleng, n = _.yytext, B = _.yylineno, J = _.yylloc; + break; + case 2: + if (k = this.productions_[A[1]][1], W.$ = d[d.length - k], W._$ = { + first_line: t[t.length - (k || 1)].first_line, + last_line: t[t.length - 1].last_line, + first_column: t[t.length - (k || 1)].first_column, + last_column: t[t.length - 1].last_column + }, be && (W._$.range = [ + t[t.length - (k || 1)].range[0], + t[t.length - 1].range[1] + ]), Q = this.performAction.apply(W, [ + n, + Y, + B, + K.yy, + A[1], + d, + t + ].concat(me)), typeof Q < "u") + return Q; + k && (r = r.slice(0, -1 * k * 2), d = d.slice(0, -1 * k), t = t.slice(0, -1 * k)), r.push(this.productions_[A[1]][0]), d.push(W.$), t.push(W._$), ae = x[r[r.length - 2]][r[r.length - 1]], r.push(ae); + break; + case 3: + return !0; + } + } + return !0; + } + }, v = function() { + var D = { + EOF: 1, + parseError: function(s, r) { + if (this.yy.parser) + this.yy.parser.parseError(s, r); + else + throw new Error(s); + }, + // resets the lexer, sets new input + setInput: function(l, s) { + return this.yy = s || this.yy || {}, this._input = l, this._more = this._backtrack = this.done = !1, this.yylineno = this.yyleng = 0, this.yytext = this.matched = this.match = "", this.conditionStack = ["INITIAL"], this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }, this.options.ranges && (this.yylloc.range = [0, 0]), this.offset = 0, this; + }, + // consumes and returns one char from the input + input: function() { + var l = this._input[0]; + this.yytext += l, this.yyleng++, this.offset++, this.match += l, this.matched += l; + var s = l.match(/(?:\r\n?|\n).*/g); + return s ? (this.yylineno++, this.yylloc.last_line++) : this.yylloc.last_column++, this.options.ranges && this.yylloc.range[1]++, this._input = this._input.slice(1), l; + }, + // unshifts one char (or a string) into the input + unput: function(l) { + var s = l.length, r = l.split(/(?:\r\n?|\n)/g); + this._input = l + this._input, this.yytext = this.yytext.substr(0, this.yytext.length - s), this.offset -= s; + var h = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1), this.matched = this.matched.substr(0, this.matched.length - 1), r.length - 1 && (this.yylineno -= r.length - 1); + var d = this.yylloc.range; + return this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: r ? (r.length === h.length ? this.yylloc.first_column : 0) + h[h.length - r.length].length - r[0].length : this.yylloc.first_column - s + }, this.options.ranges && (this.yylloc.range = [d[0], d[0] + this.yyleng - s]), this.yyleng = this.yytext.length, this; + }, + // When called from action, caches matched text and appends it on next action + more: function() { + return this._more = !0, this; + }, + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: function() { + if (this.options.backtrack_lexer) + this._backtrack = !0; + else + return this.parseError("Lexical error on line " + (this.yylineno + 1) + `. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +` + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + return this; + }, + // retain first n characters of the match + less: function(l) { + this.unput(this.match.slice(l)); + }, + // displays already matched input, i.e. for error messages + pastInput: function() { + var l = this.matched.substr(0, this.matched.length - this.match.length); + return (l.length > 20 ? "..." : "") + l.substr(-20).replace(/\n/g, ""); + }, + // displays upcoming input, i.e. for error messages + upcomingInput: function() { + var l = this.match; + return l.length < 20 && (l += this._input.substr(0, 20 - l.length)), (l.substr(0, 20) + (l.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: function() { + var l = this.pastInput(), s = new Array(l.length + 1).join("-"); + return l + this.upcomingInput() + ` +` + s + "^"; + }, + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: function(l, s) { + var r, h, d; + if (this.options.backtrack_lexer && (d = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }, this.options.ranges && (d.yylloc.range = this.yylloc.range.slice(0))), h = l[0].match(/(?:\r\n?|\n).*/g), h && (this.yylineno += h.length), this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: h ? h[h.length - 1].length - h[h.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + l[0].length + }, this.yytext += l[0], this.match += l[0], this.matches = l, this.yyleng = this.yytext.length, this.options.ranges && (this.yylloc.range = [this.offset, this.offset += this.yyleng]), this._more = !1, this._backtrack = !1, this._input = this._input.slice(l[0].length), this.matched += l[0], r = this.performAction.call(this, this.yy, this, s, this.conditionStack[this.conditionStack.length - 1]), this.done && this._input && (this.done = !1), r) + return r; + if (this._backtrack) { + for (var t in d) + this[t] = d[t]; + return !1; + } + return !1; + }, + // return next match in input + next: function() { + if (this.done) + return this.EOF; + this._input || (this.done = !0); + var l, s, r, h; + this._more || (this.yytext = "", this.match = ""); + for (var d = this._currentRules(), t = 0; t < d.length; t++) + if (r = this._input.match(this.rules[d[t]]), r && (!s || r[0].length > s[0].length)) { + if (s = r, h = t, this.options.backtrack_lexer) { + if (l = this.test_match(r, d[t]), l !== !1) + return l; + if (this._backtrack) { + s = !1; + continue; + } else + return !1; + } else if (!this.options.flex) + break; + } + return s ? (l = this.test_match(s, d[h]), l !== !1 ? l : !1) : this._input === "" ? this.EOF : this.parseError("Lexical error on line " + (this.yylineno + 1) + `. Unrecognized text. +` + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + }, + // return next match that has a token + lex: function() { + var s = this.next(); + return s || this.lex(); + }, + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: function(s) { + this.conditionStack.push(s); + }, + // pop the previously active lexer condition state off the condition stack + popState: function() { + var s = this.conditionStack.length - 1; + return s > 0 ? this.conditionStack.pop() : this.conditionStack[0]; + }, + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: function() { + return this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1] ? this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules : this.conditions.INITIAL.rules; + }, + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: function(s) { + return s = this.conditionStack.length - 1 - Math.abs(s || 0), s >= 0 ? this.conditionStack[s] : "INITIAL"; + }, + // alias for begin(condition) + pushState: function(s) { + this.begin(s); + }, + // return the number of states currently on the stack + stateStackSize: function() { + return this.conditionStack.length; + }, + options: {}, + performAction: function(s, r, h, d) { + switch (h) { + case 0: + return 10; + case 1: + return s.getLogger().debug("Found space-block"), 31; + case 2: + return s.getLogger().debug("Found nl-block"), 31; + case 3: + return s.getLogger().debug("Found space-block"), 29; + case 4: + s.getLogger().debug(".", r.yytext); + break; + case 5: + s.getLogger().debug("_", r.yytext); + break; + case 6: + return 5; + case 7: + return r.yytext = -1, 28; + case 8: + return r.yytext = r.yytext.replace(/columns\s+/, ""), s.getLogger().debug("COLUMNS (LEX)", r.yytext), 28; + case 9: + this.pushState("md_string"); + break; + case 10: + return "MD_STR"; + case 11: + this.popState(); + break; + case 12: + this.pushState("string"); + break; + case 13: + s.getLogger().debug("LEX: POPPING STR:", r.yytext), this.popState(); + break; + case 14: + return s.getLogger().debug("LEX: STR end:", r.yytext), "STR"; + case 15: + return r.yytext = r.yytext.replace(/space\:/, ""), s.getLogger().debug("SPACE NUM (LEX)", r.yytext), 21; + case 16: + return r.yytext = "1", s.getLogger().debug("COLUMNS (LEX)", r.yytext), 21; + case 17: + return 43; + case 18: + return "LINKSTYLE"; + case 19: + return "INTERPOLATE"; + case 20: + return this.pushState("CLASSDEF"), 40; + case 21: + return this.popState(), this.pushState("CLASSDEFID"), "DEFAULT_CLASSDEF_ID"; + case 22: + return this.popState(), this.pushState("CLASSDEFID"), 41; + case 23: + return this.popState(), 42; + case 24: + return this.pushState("CLASS"), 44; + case 25: + return this.popState(), this.pushState("CLASS_STYLE"), 45; + case 26: + return this.popState(), 46; + case 27: + return this.pushState("STYLE_STMNT"), 47; + case 28: + return this.popState(), this.pushState("STYLE_DEFINITION"), 48; + case 29: + return this.popState(), 49; + case 30: + return this.pushState("acc_title"), "acc_title"; + case 31: + return this.popState(), "acc_title_value"; + case 32: + return this.pushState("acc_descr"), "acc_descr"; + case 33: + return this.popState(), "acc_descr_value"; + case 34: + this.pushState("acc_descr_multiline"); + break; + case 35: + this.popState(); + break; + case 36: + return "acc_descr_multiline_value"; + case 37: + return 30; + case 38: + return this.popState(), s.getLogger().debug("Lex: (("), "NODE_DEND"; + case 39: + return this.popState(), s.getLogger().debug("Lex: (("), "NODE_DEND"; + case 40: + return this.popState(), s.getLogger().debug("Lex: ))"), "NODE_DEND"; + case 41: + return this.popState(), s.getLogger().debug("Lex: (("), "NODE_DEND"; + case 42: + return this.popState(), s.getLogger().debug("Lex: (("), "NODE_DEND"; + case 43: + return this.popState(), s.getLogger().debug("Lex: (-"), "NODE_DEND"; + case 44: + return this.popState(), s.getLogger().debug("Lex: -)"), "NODE_DEND"; + case 45: + return this.popState(), s.getLogger().debug("Lex: (("), "NODE_DEND"; + case 46: + return this.popState(), s.getLogger().debug("Lex: ]]"), "NODE_DEND"; + case 47: + return this.popState(), s.getLogger().debug("Lex: ("), "NODE_DEND"; + case 48: + return this.popState(), s.getLogger().debug("Lex: ])"), "NODE_DEND"; + case 49: + return this.popState(), s.getLogger().debug("Lex: /]"), "NODE_DEND"; + case 50: + return this.popState(), s.getLogger().debug("Lex: /]"), "NODE_DEND"; + case 51: + return this.popState(), s.getLogger().debug("Lex: )]"), "NODE_DEND"; + case 52: + return this.popState(), s.getLogger().debug("Lex: )"), "NODE_DEND"; + case 53: + return this.popState(), s.getLogger().debug("Lex: ]>"), "NODE_DEND"; + case 54: + return this.popState(), s.getLogger().debug("Lex: ]"), "NODE_DEND"; + case 55: + return s.getLogger().debug("Lexa: -)"), this.pushState("NODE"), 36; + case 56: + return s.getLogger().debug("Lexa: (-"), this.pushState("NODE"), 36; + case 57: + return s.getLogger().debug("Lexa: ))"), this.pushState("NODE"), 36; + case 58: + return s.getLogger().debug("Lexa: )"), this.pushState("NODE"), 36; + case 59: + return s.getLogger().debug("Lex: ((("), this.pushState("NODE"), 36; + case 60: + return s.getLogger().debug("Lexa: )"), this.pushState("NODE"), 36; + case 61: + return s.getLogger().debug("Lexa: )"), this.pushState("NODE"), 36; + case 62: + return s.getLogger().debug("Lexa: )"), this.pushState("NODE"), 36; + case 63: + return s.getLogger().debug("Lexc: >"), this.pushState("NODE"), 36; + case 64: + return s.getLogger().debug("Lexa: (["), this.pushState("NODE"), 36; + case 65: + return s.getLogger().debug("Lexa: )"), this.pushState("NODE"), 36; + case 66: + return this.pushState("NODE"), 36; + case 67: + return this.pushState("NODE"), 36; + case 68: + return this.pushState("NODE"), 36; + case 69: + return this.pushState("NODE"), 36; + case 70: + return this.pushState("NODE"), 36; + case 71: + return this.pushState("NODE"), 36; + case 72: + return this.pushState("NODE"), 36; + case 73: + return s.getLogger().debug("Lexa: ["), this.pushState("NODE"), 36; + case 74: + return this.pushState("BLOCK_ARROW"), s.getLogger().debug("LEX ARR START"), 38; + case 75: + return s.getLogger().debug("Lex: NODE_ID", r.yytext), 32; + case 76: + return s.getLogger().debug("Lex: EOF", r.yytext), 8; + case 77: + this.pushState("md_string"); + break; + case 78: + this.pushState("md_string"); + break; + case 79: + return "NODE_DESCR"; + case 80: + this.popState(); + break; + case 81: + s.getLogger().debug("Lex: Starting string"), this.pushState("string"); + break; + case 82: + s.getLogger().debug("LEX ARR: Starting string"), this.pushState("string"); + break; + case 83: + return s.getLogger().debug("LEX: NODE_DESCR:", r.yytext), "NODE_DESCR"; + case 84: + s.getLogger().debug("LEX POPPING"), this.popState(); + break; + case 85: + s.getLogger().debug("Lex: =>BAE"), this.pushState("ARROW_DIR"); + break; + case 86: + return r.yytext = r.yytext.replace(/^,\s*/, ""), s.getLogger().debug("Lex (right): dir:", r.yytext), "DIR"; + case 87: + return r.yytext = r.yytext.replace(/^,\s*/, ""), s.getLogger().debug("Lex (left):", r.yytext), "DIR"; + case 88: + return r.yytext = r.yytext.replace(/^,\s*/, ""), s.getLogger().debug("Lex (x):", r.yytext), "DIR"; + case 89: + return r.yytext = r.yytext.replace(/^,\s*/, ""), s.getLogger().debug("Lex (y):", r.yytext), "DIR"; + case 90: + return r.yytext = r.yytext.replace(/^,\s*/, ""), s.getLogger().debug("Lex (up):", r.yytext), "DIR"; + case 91: + return r.yytext = r.yytext.replace(/^,\s*/, ""), s.getLogger().debug("Lex (down):", r.yytext), "DIR"; + case 92: + return r.yytext = "]>", s.getLogger().debug("Lex (ARROW_DIR end):", r.yytext), this.popState(), this.popState(), "BLOCK_ARROW_END"; + case 93: + return s.getLogger().debug("Lex: LINK", "#" + r.yytext + "#"), 15; + case 94: + return s.getLogger().debug("Lex: LINK", r.yytext), 15; + case 95: + return s.getLogger().debug("Lex: LINK", r.yytext), 15; + case 96: + return s.getLogger().debug("Lex: LINK", r.yytext), 15; + case 97: + return s.getLogger().debug("Lex: START_LINK", r.yytext), this.pushState("LLABEL"), 16; + case 98: + return s.getLogger().debug("Lex: START_LINK", r.yytext), this.pushState("LLABEL"), 16; + case 99: + return s.getLogger().debug("Lex: START_LINK", r.yytext), this.pushState("LLABEL"), 16; + case 100: + this.pushState("md_string"); + break; + case 101: + return s.getLogger().debug("Lex: Starting string"), this.pushState("string"), "LINK_LABEL"; + case 102: + return this.popState(), s.getLogger().debug("Lex: LINK", "#" + r.yytext + "#"), 15; + case 103: + return this.popState(), s.getLogger().debug("Lex: LINK", r.yytext), 15; + case 104: + return this.popState(), s.getLogger().debug("Lex: LINK", r.yytext), 15; + case 105: + return s.getLogger().debug("Lex: COLON", r.yytext), r.yytext = r.yytext.slice(1), 27; + } + }, + rules: [/^(?:block-beta\b)/, /^(?:block\s+)/, /^(?:block\n+)/, /^(?:block:)/, /^(?:[\s]+)/, /^(?:[\n]+)/, /^(?:((\u000D\u000A)|(\u000A)))/, /^(?:columns\s+auto\b)/, /^(?:columns\s+[\d]+)/, /^(?:["][`])/, /^(?:[^`"]+)/, /^(?:[`]["])/, /^(?:["])/, /^(?:["])/, /^(?:[^"]*)/, /^(?:space[:]\d+)/, /^(?:space\b)/, /^(?:default\b)/, /^(?:linkStyle\b)/, /^(?:interpolate\b)/, /^(?:classDef\s+)/, /^(?:DEFAULT\s+)/, /^(?:\w+\s+)/, /^(?:[^\n]*)/, /^(?:class\s+)/, /^(?:(\w+)+((,\s*\w+)*))/, /^(?:[^\n]*)/, /^(?:style\s+)/, /^(?:(\w+)+((,\s*\w+)*))/, /^(?:[^\n]*)/, /^(?:accTitle\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*\{\s*)/, /^(?:[\}])/, /^(?:[^\}]*)/, /^(?:end\b\s*)/, /^(?:\(\(\()/, /^(?:\)\)\))/, /^(?:[\)]\))/, /^(?:\}\})/, /^(?:\})/, /^(?:\(-)/, /^(?:-\))/, /^(?:\(\()/, /^(?:\]\])/, /^(?:\()/, /^(?:\]\))/, /^(?:\\\])/, /^(?:\/\])/, /^(?:\)\])/, /^(?:[\)])/, /^(?:\]>)/, /^(?:[\]])/, /^(?:-\))/, /^(?:\(-)/, /^(?:\)\))/, /^(?:\))/, /^(?:\(\(\()/, /^(?:\(\()/, /^(?:\{\{)/, /^(?:\{)/, /^(?:>)/, /^(?:\(\[)/, /^(?:\()/, /^(?:\[\[)/, /^(?:\[\|)/, /^(?:\[\()/, /^(?:\)\)\))/, /^(?:\[\\)/, /^(?:\[\/)/, /^(?:\[\\)/, /^(?:\[)/, /^(?:<\[)/, /^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/, /^(?:$)/, /^(?:["][`])/, /^(?:["][`])/, /^(?:[^`"]+)/, /^(?:[`]["])/, /^(?:["])/, /^(?:["])/, /^(?:[^"]+)/, /^(?:["])/, /^(?:\]>\s*\()/, /^(?:,?\s*right\s*)/, /^(?:,?\s*left\s*)/, /^(?:,?\s*x\s*)/, /^(?:,?\s*y\s*)/, /^(?:,?\s*up\s*)/, /^(?:,?\s*down\s*)/, /^(?:\)\s*)/, /^(?:\s*[xo<]?--+[-xo>]\s*)/, /^(?:\s*[xo<]?==+[=xo>]\s*)/, /^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/, /^(?:\s*~~[\~]+\s*)/, /^(?:\s*[xo<]?--\s*)/, /^(?:\s*[xo<]?==\s*)/, /^(?:\s*[xo<]?-\.\s*)/, /^(?:["][`])/, /^(?:["])/, /^(?:\s*[xo<]?--+[-xo>]\s*)/, /^(?:\s*[xo<]?==+[=xo>]\s*)/, /^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/, /^(?::\d+)/], + conditions: { STYLE_DEFINITION: { rules: [29], inclusive: !1 }, STYLE_STMNT: { rules: [28], inclusive: !1 }, CLASSDEFID: { rules: [23], inclusive: !1 }, CLASSDEF: { rules: [21, 22], inclusive: !1 }, CLASS_STYLE: { rules: [26], inclusive: !1 }, CLASS: { rules: [25], inclusive: !1 }, LLABEL: { rules: [100, 101, 102, 103, 104], inclusive: !1 }, ARROW_DIR: { rules: [86, 87, 88, 89, 90, 91, 92], inclusive: !1 }, BLOCK_ARROW: { rules: [77, 82, 85], inclusive: !1 }, NODE: { rules: [38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 78, 81], inclusive: !1 }, md_string: { rules: [10, 11, 79, 80], inclusive: !1 }, space: { rules: [], inclusive: !1 }, string: { rules: [13, 14, 83, 84], inclusive: !1 }, acc_descr_multiline: { rules: [35, 36], inclusive: !1 }, acc_descr: { rules: [33], inclusive: !1 }, acc_title: { rules: [31], inclusive: !1 }, INITIAL: { rules: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 15, 16, 17, 18, 19, 20, 24, 27, 30, 32, 34, 37, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 93, 94, 95, 96, 97, 98, 99, 105], inclusive: !0 } } + }; + return D; + }(); + E.lexer = v; + function N() { + this.yy = {}; + } + return N.prototype = E, E.Parser = N, new N(); +}(); +ee.parser = ee; +const Pe = ee; +let T = {}, ie = [], V = {}; +const oe = "color", ce = "fill", Fe = "bgFill", pe = ",", Ke = ge(); +let j = {}; +const Me = (e) => _e.sanitizeText(e, Ke), Ye = function(e, c = "") { + j[e] === void 0 && (j[e] = { id: e, styles: [], textStyles: [] }); + const u = j[e]; + c != null && c.split(pe).forEach((a) => { + const i = a.replace(/([^;]*);/, "$1").trim(); + if (a.match(oe)) { + const o = i.replace(ce, Fe).replace(oe, ce); + u.textStyles.push(o); + } + u.styles.push(i); + }); +}, We = function(e, c = "") { + const u = T[e]; + c != null && (u.styles = c.split(pe)); +}, Ve = function(e, c) { + e.split(",").forEach(function(u) { + let a = T[u]; + if (a === void 0) { + const i = u.trim(); + T[i] = { id: i, type: "na", children: [] }, a = T[i]; + } + a.classes || (a.classes = []), a.classes.push(c); + }); +}, fe = (e, c) => { + const u = e.flat(), a = []; + for (const i of u) { + if (i.label && (i.label = Me(i.label)), i.type === "classDef") { + Ye(i.id, i.css); + continue; + } + if (i.type === "applyClass") { + Ve(i.id, (i == null ? void 0 : i.styleClass) || ""); + continue; + } + if (i.type === "applyStyles") { + i != null && i.stylesStr && We(i.id, i == null ? void 0 : i.stylesStr); + continue; + } + if (i.type === "column-setting") + c.columns = i.columns || -1; + else if (i.type === "edge") + V[i.id] ? V[i.id]++ : V[i.id] = 1, i.id = V[i.id] + "-" + i.id, ie.push(i); + else { + i.label || (i.type === "composite" ? i.label = "" : i.label = i.id); + const g = !T[i.id]; + if (g ? T[i.id] = i : (i.type !== "na" && (T[i.id].type = i.type), i.label !== i.id && (T[i.id].label = i.label)), i.children && fe(i.children, i), i.type === "space") { + const o = i.width || 1; + for (let p = 0; p < o; p++) { + const f = Ie(i); + f.id = f.id + "-" + p, T[f.id] = f, a.push(f); + } + } else + g && a.push(i); + } + } + c.children = a; +}; +let re = [], U = { id: "root", type: "composite", children: [], columns: -1 }; +const je = () => { + L.debug("Clear called"), ye(), U = { id: "root", type: "composite", children: [], columns: -1 }, T = { root: U }, re = [], j = {}, ie = [], V = {}; +}; +function Ue(e) { + switch (L.debug("typeStr2Type", e), e) { + case "[]": + return "square"; + case "()": + return L.debug("we have a round"), "round"; + case "(())": + return "circle"; + case ">]": + return "rect_left_inv_arrow"; + case "{}": + return "diamond"; + case "{{}}": + return "hexagon"; + case "([])": + return "stadium"; + case "[[]]": + return "subroutine"; + case "[()]": + return "cylinder"; + case "((()))": + return "doublecircle"; + case "[//]": + return "lean_right"; + case "[\\\\]": + return "lean_left"; + case "[/\\]": + return "trapezoid"; + case "[\\/]": + return "inv_trapezoid"; + case "<[]>": + return "block_arrow"; + default: + return "na"; + } +} +function Xe(e) { + switch (L.debug("typeStr2Type", e), e) { + case "==": + return "thick"; + default: + return "normal"; + } +} +function Ge(e) { + switch (e.trim()) { + case "--x": + return "arrow_cross"; + case "--o": + return "arrow_circle"; + default: + return "arrow_point"; + } +} +let le = 0; +const He = () => (le++, "id-" + Math.random().toString(36).substr(2, 12) + "-" + le), qe = (e) => { + U.children = e, fe(e, U), re = U.children; +}, Ze = (e) => { + const c = T[e]; + return c ? c.columns ? c.columns : c.children ? c.children.length : -1 : -1; +}, Je = () => [...Object.values(T)], Qe = () => re || [], $e = () => ie, et = (e) => T[e], tt = (e) => { + T[e.id] = e; +}, st = () => console, it = function() { + return j; +}, rt = { + getConfig: () => se().block, + typeStr2Type: Ue, + edgeTypeStr2Type: Xe, + edgeStrToEdgeData: Ge, + getLogger: st, + getBlocksFlat: Je, + getBlocks: Qe, + getEdges: $e, + setHierarchy: qe, + getBlock: et, + setBlock: tt, + getColumns: Ze, + getClasses: it, + clear: je, + generateId: He +}, nt = rt, q = (e, c) => { + const u = Oe, a = u(e, "r"), i = u(e, "g"), g = u(e, "b"); + return we(a, i, g, c); +}, at = (e) => `.label { + font-family: ${e.fontFamily}; + color: ${e.nodeTextColor || e.textColor}; + } + .cluster-label text { + fill: ${e.titleColor}; + } + .cluster-label span,p { + color: ${e.titleColor}; + } + + + + .label text,span,p { + fill: ${e.nodeTextColor || e.textColor}; + color: ${e.nodeTextColor || e.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${e.mainBkg}; + stroke: ${e.nodeBorder}; + stroke-width: 1px; + } + .flowchart-label text { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${e.arrowheadColor}; + } + + .edgePath .path { + stroke: ${e.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${e.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${e.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${e.edgeLabelBackground}; + fill: ${e.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${q(e.edgeLabelBackground, 0.5)}; + // background-color: + } + + .node .cluster { + // fill: ${q(e.mainBkg, 0.5)}; + fill: ${q(e.clusterBkg, 0.5)}; + stroke: ${q(e.clusterBorder, 0.2)}; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + stroke-width: 1px; + } + + .cluster text { + fill: ${e.titleColor}; + } + + .cluster span,p { + color: ${e.titleColor}; + } + /* .cluster div { + color: ${e.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${e.fontFamily}; + font-size: 12px; + background: ${e.tertiaryColor}; + border: 1px solid ${e.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${e.textColor}; + } +`, ot = at; +function Se(e, c, u = !1) { + var z, I, w; + const a = e; + let i = "default"; + (((z = a == null ? void 0 : a.classes) == null ? void 0 : z.length) || 0) > 0 && (i = ((a == null ? void 0 : a.classes) || []).join(" ")), i = i + " flowchart-label"; + let g = 0, o = "", p; + switch (a.type) { + case "round": + g = 5, o = "rect"; + break; + case "composite": + g = 0, o = "composite", p = 0; + break; + case "square": + o = "rect"; + break; + case "diamond": + o = "question"; + break; + case "hexagon": + o = "hexagon"; + break; + case "block_arrow": + o = "block_arrow"; + break; + case "odd": + o = "rect_left_inv_arrow"; + break; + case "lean_right": + o = "lean_right"; + break; + case "lean_left": + o = "lean_left"; + break; + case "trapezoid": + o = "trapezoid"; + break; + case "inv_trapezoid": + o = "inv_trapezoid"; + break; + case "rect_left_inv_arrow": + o = "rect_left_inv_arrow"; + break; + case "circle": + o = "circle"; + break; + case "ellipse": + o = "ellipse"; + break; + case "stadium": + o = "stadium"; + break; + case "subroutine": + o = "subroutine"; + break; + case "cylinder": + o = "cylinder"; + break; + case "group": + o = "rect"; + break; + case "doublecircle": + o = "doublecircle"; + break; + default: + o = "rect"; + } + const f = De((a == null ? void 0 : a.styles) || []), m = a.label, S = a.size || { width: 0, height: 0, x: 0, y: 0 }; + return { + labelStyle: f.labelStyle, + shape: o, + labelText: m, + rx: g, + ry: g, + class: i, + style: f.style, + id: a.id, + directions: a.directions, + width: S.width, + height: S.height, + x: S.x, + y: S.y, + positioned: u, + intersect: void 0, + type: a.type, + padding: p ?? (((w = (I = se()) == null ? void 0 : I.block) == null ? void 0 : w.padding) || 0) + }; +} +async function ct(e, c, u) { + const a = Se(c, u, !1); + if (a.type === "group") + return; + const i = await de(e, a), g = i.node().getBBox(), o = u.getBlock(a.id); + o.size = { width: g.width, height: g.height, x: 0, y: 0, node: i }, u.setBlock(o), i.remove(); +} +async function lt(e, c, u) { + const a = Se(c, u, !0); + u.getBlock(a.id).type !== "space" && (await de(e, a), c.intersect = a == null ? void 0 : a.intersect, Ae(a)); +} +async function ne(e, c, u, a) { + for (const i of c) + await a(e, i, u), i.children && await ne(e, i.children, u, a); +} +async function ht(e, c, u) { + await ne(e, c, u, ct); +} +async function ut(e, c, u) { + await ne(e, c, u, lt); +} +async function gt(e, c, u, a, i) { + const g = new ve({ + multigraph: !0, + compound: !0 + }); + g.setGraph({ + rankdir: "TB", + nodesep: 10, + ranksep: 10, + marginx: 8, + marginy: 8 + }); + for (const o of u) + o.size && g.setNode(o.id, { + width: o.size.width, + height: o.size.height, + intersect: o.intersect + }); + for (const o of c) + if (o.start && o.end) { + const p = a.getBlock(o.start), f = a.getBlock(o.end); + if (p != null && p.size && (f != null && f.size)) { + const m = p.size, S = f.size, y = [ + { x: m.x, y: m.y }, + { x: m.x + (S.x - m.x) / 2, y: m.y + (S.y - m.y) / 2 }, + { x: S.x, y: S.y } + ]; + await Te( + e, + { v: o.start, w: o.end, name: o.id }, + { + ...o, + arrowTypeEnd: o.arrowTypeEnd, + arrowTypeStart: o.arrowTypeStart, + points: y, + classes: "edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1" + }, + void 0, + "block", + g, + i + ), o.label && (await ze(e, { + ...o, + label: o.label, + labelStyle: "stroke: #333; stroke-width: 1.5px;fill:none;", + arrowTypeEnd: o.arrowTypeEnd, + arrowTypeStart: o.arrowTypeStart, + points: y, + classes: "edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1" + }), await Ce( + { ...o, x: y[1].x, y: y[1].y }, + { + originalPath: y + } + )); + } + } +} +var he, ue; +const b = ((ue = (he = ge()) == null ? void 0 : he.block) == null ? void 0 : ue.padding) || 8; +function dt(e, c) { + if (e === 0 || !Number.isInteger(e)) + throw new Error("Columns must be an integer !== 0."); + if (c < 0 || !Number.isInteger(c)) + throw new Error("Position must be a non-negative integer." + c); + if (e < 0) + return { px: c, py: 0 }; + if (e === 1) + return { px: 0, py: c }; + const u = c % e, a = Math.floor(c / e); + return { px: u, py: a }; +} +const pt = (e) => { + let c = 0, u = 0; + for (const a of e.children) { + const { width: i, height: g, x: o, y: p } = a.size || { width: 0, height: 0, x: 0, y: 0 }; + L.debug( + "getMaxChildSize abc95 child:", + a.id, + "width:", + i, + "height:", + g, + "x:", + o, + "y:", + p, + a.type + ), a.type !== "space" && (i > c && (c = i / (e.widthInColumns || 1)), g > u && (u = g)); + } + return { width: c, height: u }; +}; +function te(e, c, u = 0, a = 0) { + var o, p, f, m, S, y, z, I, w, C, E; + L.debug( + "setBlockSizes abc95 (start)", + e.id, + (o = e == null ? void 0 : e.size) == null ? void 0 : o.x, + "block width =", + e == null ? void 0 : e.size, + "sieblingWidth", + u + ), (p = e == null ? void 0 : e.size) != null && p.width || (e.size = { + width: u, + height: a, + x: 0, + y: 0 + }); + let i = 0, g = 0; + if (((f = e.children) == null ? void 0 : f.length) > 0) { + for (const d of e.children) + te(d, c); + const v = pt(e); + i = v.width, g = v.height, L.debug("setBlockSizes abc95 maxWidth of", e.id, ":s children is ", i, g); + for (const d of e.children) + d.size && (L.debug( + `abc95 Setting size of children of ${e.id} id=${d.id} ${i} ${g} ${d.size}` + ), d.size.width = i * (d.widthInColumns || 1) + b * ((d.widthInColumns || 1) - 1), d.size.height = g, d.size.x = 0, d.size.y = 0, L.debug( + `abc95 updating size of ${e.id} children child:${d.id} maxWidth:${i} maxHeight:${g}` + )); + for (const d of e.children) + te(d, c, i, g); + const N = e.columns || -1; + let D = 0; + for (const d of e.children) + D += d.widthInColumns || 1; + let l = e.children.length; + N > 0 && N < D && (l = N), e.widthInColumns; + const s = Math.ceil(D / l); + let r = l * (i + b) + b, h = s * (g + b) + b; + if (r < u) { + L.debug( + `Detected to small siebling: abc95 ${e.id} sieblingWidth ${u} sieblingHeight ${a} width ${r}` + ), r = u, h = a; + const d = (u - l * b - b) / l, t = (a - s * b - b) / s; + L.debug("Size indata abc88", e.id, "childWidth", d, "maxWidth", i), L.debug("Size indata abc88", e.id, "childHeight", t, "maxHeight", g), L.debug("Size indata abc88 xSize", l, "padding", b); + for (const x of e.children) + x.size && (x.size.width = d, x.size.height = t, x.size.x = 0, x.size.y = 0); + } + if (L.debug( + `abc95 (finale calc) ${e.id} xSize ${l} ySize ${s} columns ${N}${e.children.length} width=${Math.max(r, ((m = e.size) == null ? void 0 : m.width) || 0)}` + ), r < (((S = e == null ? void 0 : e.size) == null ? void 0 : S.width) || 0)) { + r = ((y = e == null ? void 0 : e.size) == null ? void 0 : y.width) || 0; + const d = N > 0 ? Math.min(e.children.length, N) : e.children.length; + if (d > 0) { + const t = (r - d * b - b) / d; + L.debug("abc95 (growing to fit) width", e.id, r, (z = e.size) == null ? void 0 : z.width, t); + for (const x of e.children) + x.size && (x.size.width = t); + } + } + e.size = { + width: r, + height: h, + x: 0, + y: 0 + }; + } + L.debug( + "setBlockSizes abc94 (done)", + e.id, + (I = e == null ? void 0 : e.size) == null ? void 0 : I.x, + (w = e == null ? void 0 : e.size) == null ? void 0 : w.width, + (C = e == null ? void 0 : e.size) == null ? void 0 : C.y, + (E = e == null ? void 0 : e.size) == null ? void 0 : E.height + ); +} +function Le(e, c) { + var a, i, g, o, p, f, m, S, y, z, I, w, C, E, v, N, D; + L.debug( + `abc85 layout blocks (=>layoutBlocks) ${e.id} x: ${(a = e == null ? void 0 : e.size) == null ? void 0 : a.x} y: ${(i = e == null ? void 0 : e.size) == null ? void 0 : i.y} width: ${(g = e == null ? void 0 : e.size) == null ? void 0 : g.width}` + ); + const u = e.columns || -1; + if (L.debug("layoutBlocks columns abc95", e.id, "=>", u, e), e.children && // find max width of children + e.children.length > 0) { + const l = ((p = (o = e == null ? void 0 : e.children[0]) == null ? void 0 : o.size) == null ? void 0 : p.width) || 0, s = e.children.length * l + (e.children.length - 1) * b; + L.debug("widthOfChildren 88", s, "posX"); + let r = 0; + L.debug("abc91 block?.size?.x", e.id, (f = e == null ? void 0 : e.size) == null ? void 0 : f.x); + let h = (m = e == null ? void 0 : e.size) != null && m.x ? ((S = e == null ? void 0 : e.size) == null ? void 0 : S.x) + (-((y = e == null ? void 0 : e.size) == null ? void 0 : y.width) / 2 || 0) : -b, d = 0; + for (const t of e.children) { + const x = e; + if (!t.size) + continue; + const { width: n, height: B } = t.size, { px: Y, py: F } = dt(u, r); + if (F != d && (d = F, h = (z = e == null ? void 0 : e.size) != null && z.x ? ((I = e == null ? void 0 : e.size) == null ? void 0 : I.x) + (-((w = e == null ? void 0 : e.size) == null ? void 0 : w.width) / 2 || 0) : -b, L.debug("New row in layout for block", e.id, " and child ", t.id, d)), L.debug( + `abc89 layout blocks (child) id: ${t.id} Pos: ${r} (px, py) ${Y},${F} (${(C = x == null ? void 0 : x.size) == null ? void 0 : C.x},${(E = x == null ? void 0 : x.size) == null ? void 0 : E.y}) parent: ${x.id} width: ${n}${b}` + ), x.size) { + const R = n / 2; + t.size.x = h + b + R, L.debug( + `abc91 layout blocks (calc) px, pyid:${t.id} startingPos=X${h} new startingPosX${t.size.x} ${R} padding=${b} width=${n} halfWidth=${R} => x:${t.size.x} y:${t.size.y} ${t.widthInColumns} (width * (child?.w || 1)) / 2 ${n * ((t == null ? void 0 : t.widthInColumns) || 1) / 2}` + ), h = t.size.x + R, t.size.y = x.size.y - x.size.height / 2 + F * (B + b) + B / 2 + b, L.debug( + `abc88 layout blocks (calc) px, pyid:${t.id}startingPosX${h}${b}${R}=>x:${t.size.x}y:${t.size.y}${t.widthInColumns}(width * (child?.w || 1)) / 2${n * ((t == null ? void 0 : t.widthInColumns) || 1) / 2}` + ); + } + t.children && Le(t), r += (t == null ? void 0 : t.widthInColumns) || 1, L.debug("abc88 columnsPos", t, r); + } + } + L.debug( + `layout blocks (<==layoutBlocks) ${e.id} x: ${(v = e == null ? void 0 : e.size) == null ? void 0 : v.x} y: ${(N = e == null ? void 0 : e.size) == null ? void 0 : N.y} width: ${(D = e == null ? void 0 : e.size) == null ? void 0 : D.width}` + ); +} +function xe(e, { minX: c, minY: u, maxX: a, maxY: i } = { minX: 0, minY: 0, maxX: 0, maxY: 0 }) { + if (e.size && e.id !== "root") { + const { x: g, y: o, width: p, height: f } = e.size; + g - p / 2 < c && (c = g - p / 2), o - f / 2 < u && (u = o - f / 2), g + p / 2 > a && (a = g + p / 2), o + f / 2 > i && (i = o + f / 2); + } + if (e.children) + for (const g of e.children) + ({ minX: c, minY: u, maxX: a, maxY: i } = xe(g, { minX: c, minY: u, maxX: a, maxY: i })); + return { minX: c, minY: u, maxX: a, maxY: i }; +} +function ft(e) { + const c = e.getBlock("root"); + if (!c) + return; + te(c, e, 0, 0), Le(c), L.debug("getBlocks", JSON.stringify(c, null, 2)); + const { minX: u, minY: a, maxX: i, maxY: g } = xe(c), o = g - a, p = i - u; + return { x: u, y: a, width: p, height: o }; +} +const St = function(e, c) { + return c.db.getClasses(); +}, Lt = async function(e, c, u, a) { + const { securityLevel: i, block: g } = se(), o = a.db; + let p; + i === "sandbox" && (p = H("#i" + c)); + const f = i === "sandbox" ? H(p.nodes()[0].contentDocument.body) : H("body"), m = i === "sandbox" ? f.select(`[id="${c}"]`) : H(`[id="${c}"]`); + Re(m, ["point", "circle", "cross"], a.type, c); + const y = o.getBlocks(), z = o.getBlocksFlat(), I = o.getEdges(), w = m.insert("g").attr("class", "block"); + await ht(w, y, o); + const C = ft(o); + if (await ut(w, y, o), await gt(w, I, z, o, c), C) { + const E = C, v = Math.max(1, Math.round(0.125 * (E.width / E.height))), N = E.height + v + 10, D = E.width + 10, { useMaxWidth: l } = g; + Ne(m, N, D, !!l), L.debug("Here Bounds", C, E), m.attr( + "viewBox", + `${E.x - 5} ${E.y - 5} ${E.width + 10} ${E.height + 10}` + ); + } + Be(ke); +}, xt = { + draw: Lt, + getClasses: St +}, Ct = { + parser: Pe, + db: nt, + renderer: xt, + styles: ot +}; +export { + Ct as diagram +}; diff --git a/vs-code-extension/media/mermaid/blockDiagram-6538aad3.js b/vs-code-extension/media/mermaid/blockDiagram-6538aad3.js new file mode 100644 index 0000000..0abf47d --- /dev/null +++ b/vs-code-extension/media/mermaid/blockDiagram-6538aad3.js @@ -0,0 +1,1818 @@ +var _a, _b; +import { c as getConfig, _ as getConfig$1, l as log, E as clear$1, f as common, B as rgba, o as getStylesFromArray, j as d3select, k as configureSvgSize } from "./mermaid-d73f18bb.js"; +import { c as clone } from "./clone-efe1c6aa.js"; +import { c as channel } from "./channel-f19f13a4.js"; +import { h as insertEdge, f as insertEdgeLabel, j as positionEdgeLabel, e as insertNode, p as positionNode, a as insertMarkers } from "./edges-568b5f94.js"; +import { G as Graph } from "./graph-00ca1ddf.js"; +import { o as ordinal } from "./ordinal-475e0c0c.js"; +import { d as d3schemeTableau10 } from "./Tableau10-31042135.js"; +import "./createText-2822bf05.js"; +import "./line-8a001a24.js"; +import "./array-b7dcf730.js"; +import "./path-39bad7e2.js"; +import "./init-cc95ec8e.js"; +var parser = function() { + var o = function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) + ; + return o2; + }, $V0 = [1, 7], $V1 = [1, 13], $V2 = [1, 14], $V3 = [1, 15], $V4 = [1, 19], $V5 = [1, 16], $V6 = [1, 17], $V7 = [1, 18], $V8 = [8, 30], $V9 = [8, 21, 28, 29, 30, 31, 32, 40, 44, 47], $Va = [1, 23], $Vb = [1, 24], $Vc = [8, 15, 16, 21, 28, 29, 30, 31, 32, 40, 44, 47], $Vd = [8, 15, 16, 21, 27, 28, 29, 30, 31, 32, 40, 44, 47], $Ve = [1, 49]; + var parser2 = { + trace: function trace() { + }, + yy: {}, + symbols_: { "error": 2, "spaceLines": 3, "SPACELINE": 4, "NL": 5, "separator": 6, "SPACE": 7, "EOF": 8, "start": 9, "BLOCK_DIAGRAM_KEY": 10, "document": 11, "stop": 12, "statement": 13, "link": 14, "LINK": 15, "START_LINK": 16, "LINK_LABEL": 17, "STR": 18, "nodeStatement": 19, "columnsStatement": 20, "SPACE_BLOCK": 21, "blockStatement": 22, "classDefStatement": 23, "cssClassStatement": 24, "styleStatement": 25, "node": 26, "SIZE": 27, "COLUMNS": 28, "id-block": 29, "end": 30, "block": 31, "NODE_ID": 32, "nodeShapeNLabel": 33, "dirList": 34, "DIR": 35, "NODE_DSTART": 36, "NODE_DEND": 37, "BLOCK_ARROW_START": 38, "BLOCK_ARROW_END": 39, "classDef": 40, "CLASSDEF_ID": 41, "CLASSDEF_STYLEOPTS": 42, "DEFAULT": 43, "class": 44, "CLASSENTITY_IDS": 45, "STYLECLASS": 46, "style": 47, "STYLE_ENTITY_IDS": 48, "STYLE_DEFINITION_DATA": 49, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "SPACELINE", 5: "NL", 7: "SPACE", 8: "EOF", 10: "BLOCK_DIAGRAM_KEY", 15: "LINK", 16: "START_LINK", 17: "LINK_LABEL", 18: "STR", 21: "SPACE_BLOCK", 27: "SIZE", 28: "COLUMNS", 29: "id-block", 30: "end", 31: "block", 32: "NODE_ID", 35: "DIR", 36: "NODE_DSTART", 37: "NODE_DEND", 38: "BLOCK_ARROW_START", 39: "BLOCK_ARROW_END", 40: "classDef", 41: "CLASSDEF_ID", 42: "CLASSDEF_STYLEOPTS", 43: "DEFAULT", 44: "class", 45: "CLASSENTITY_IDS", 46: "STYLECLASS", 47: "style", 48: "STYLE_ENTITY_IDS", 49: "STYLE_DEFINITION_DATA" }, + productions_: [0, [3, 1], [3, 2], [3, 2], [6, 1], [6, 1], [6, 1], [9, 3], [12, 1], [12, 1], [12, 2], [12, 2], [11, 1], [11, 2], [14, 1], [14, 4], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [19, 3], [19, 2], [19, 1], [20, 1], [22, 4], [22, 3], [26, 1], [26, 2], [34, 1], [34, 2], [33, 3], [33, 4], [23, 3], [23, 3], [24, 3], [25, 3]], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 4: + yy.getLogger().debug("Rule: separator (NL) "); + break; + case 5: + yy.getLogger().debug("Rule: separator (Space) "); + break; + case 6: + yy.getLogger().debug("Rule: separator (EOF) "); + break; + case 7: + yy.getLogger().debug("Rule: hierarchy: ", $$[$0 - 1]); + yy.setHierarchy($$[$0 - 1]); + break; + case 8: + yy.getLogger().debug("Stop NL "); + break; + case 9: + yy.getLogger().debug("Stop EOF "); + break; + case 10: + yy.getLogger().debug("Stop NL2 "); + break; + case 11: + yy.getLogger().debug("Stop EOF2 "); + break; + case 12: + yy.getLogger().debug("Rule: statement: ", $$[$0]); + typeof $$[$0].length === "number" ? this.$ = $$[$0] : this.$ = [$$[$0]]; + break; + case 13: + yy.getLogger().debug("Rule: statement #2: ", $$[$0 - 1]); + this.$ = [$$[$0 - 1]].concat($$[$0]); + break; + case 14: + yy.getLogger().debug("Rule: link: ", $$[$0], yytext); + this.$ = { edgeTypeStr: $$[$0], label: "" }; + break; + case 15: + yy.getLogger().debug("Rule: LABEL link: ", $$[$0 - 3], $$[$0 - 1], $$[$0]); + this.$ = { edgeTypeStr: $$[$0], label: $$[$0 - 1] }; + break; + case 18: + const num = parseInt($$[$0]); + const spaceId = yy.generateId(); + this.$ = { id: spaceId, type: "space", label: "", width: num, children: [] }; + break; + case 23: + yy.getLogger().debug("Rule: (nodeStatement link node) ", $$[$0 - 2], $$[$0 - 1], $$[$0], " typestr: ", $$[$0 - 1].edgeTypeStr); + const edgeData = yy.edgeStrToEdgeData($$[$0 - 1].edgeTypeStr); + this.$ = [ + { id: $$[$0 - 2].id, label: $$[$0 - 2].label, type: $$[$0 - 2].type, directions: $$[$0 - 2].directions }, + { id: $$[$0 - 2].id + "-" + $$[$0].id, start: $$[$0 - 2].id, end: $$[$0].id, label: $$[$0 - 1].label, type: "edge", directions: $$[$0].directions, arrowTypeEnd: edgeData, arrowTypeStart: "arrow_open" }, + { id: $$[$0].id, label: $$[$0].label, type: yy.typeStr2Type($$[$0].typeStr), directions: $$[$0].directions } + ]; + break; + case 24: + yy.getLogger().debug("Rule: nodeStatement (abc88 node size) ", $$[$0 - 1], $$[$0]); + this.$ = { id: $$[$0 - 1].id, label: $$[$0 - 1].label, type: yy.typeStr2Type($$[$0 - 1].typeStr), directions: $$[$0 - 1].directions, widthInColumns: parseInt($$[$0], 10) }; + break; + case 25: + yy.getLogger().debug("Rule: nodeStatement (node) ", $$[$0]); + this.$ = { id: $$[$0].id, label: $$[$0].label, type: yy.typeStr2Type($$[$0].typeStr), directions: $$[$0].directions, widthInColumns: 1 }; + break; + case 26: + yy.getLogger().debug("APA123", this ? this : "na"); + yy.getLogger().debug("COLUMNS: ", $$[$0]); + this.$ = { type: "column-setting", columns: $$[$0] === "auto" ? -1 : parseInt($$[$0]) }; + break; + case 27: + yy.getLogger().debug("Rule: id-block statement : ", $$[$0 - 2], $$[$0 - 1]); + yy.generateId(); + this.$ = { ...$$[$0 - 2], type: "composite", children: $$[$0 - 1] }; + break; + case 28: + yy.getLogger().debug("Rule: blockStatement : ", $$[$0 - 2], $$[$0 - 1], $$[$0]); + const id = yy.generateId(); + this.$ = { id, type: "composite", label: "", children: $$[$0 - 1] }; + break; + case 29: + yy.getLogger().debug("Rule: node (NODE_ID separator): ", $$[$0]); + this.$ = { id: $$[$0] }; + break; + case 30: + yy.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ", $$[$0 - 1], $$[$0]); + this.$ = { id: $$[$0 - 1], label: $$[$0].label, typeStr: $$[$0].typeStr, directions: $$[$0].directions }; + break; + case 31: + yy.getLogger().debug("Rule: dirList: ", $$[$0]); + this.$ = [$$[$0]]; + break; + case 32: + yy.getLogger().debug("Rule: dirList: ", $$[$0 - 1], $$[$0]); + this.$ = [$$[$0 - 1]].concat($$[$0]); + break; + case 33: + yy.getLogger().debug("Rule: nodeShapeNLabel: ", $$[$0 - 2], $$[$0 - 1], $$[$0]); + this.$ = { typeStr: $$[$0 - 2] + $$[$0], label: $$[$0 - 1] }; + break; + case 34: + yy.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ", $$[$0 - 3], $$[$0 - 2], " #3:", $$[$0 - 1], $$[$0]); + this.$ = { typeStr: $$[$0 - 3] + $$[$0], label: $$[$0 - 2], directions: $$[$0 - 1] }; + break; + case 35: + case 36: + this.$ = { type: "classDef", id: $$[$0 - 1].trim(), css: $$[$0].trim() }; + break; + case 37: + this.$ = { type: "applyClass", id: $$[$0 - 1].trim(), styleClass: $$[$0].trim() }; + break; + case 38: + this.$ = { type: "applyStyles", id: $$[$0 - 1].trim(), stylesStr: $$[$0].trim() }; + break; + } + }, + table: [{ 9: 1, 10: [1, 2] }, { 1: [3] }, { 11: 3, 13: 4, 19: 5, 20: 6, 21: $V0, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: $V1, 29: $V2, 31: $V3, 32: $V4, 40: $V5, 44: $V6, 47: $V7 }, { 8: [1, 20] }, o($V8, [2, 12], { 13: 4, 19: 5, 20: 6, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 11: 21, 21: $V0, 28: $V1, 29: $V2, 31: $V3, 32: $V4, 40: $V5, 44: $V6, 47: $V7 }), o($V9, [2, 16], { 14: 22, 15: $Va, 16: $Vb }), o($V9, [2, 17]), o($V9, [2, 18]), o($V9, [2, 19]), o($V9, [2, 20]), o($V9, [2, 21]), o($V9, [2, 22]), o($Vc, [2, 25], { 27: [1, 25] }), o($V9, [2, 26]), { 19: 26, 26: 12, 32: $V4 }, { 11: 27, 13: 4, 19: 5, 20: 6, 21: $V0, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: $V1, 29: $V2, 31: $V3, 32: $V4, 40: $V5, 44: $V6, 47: $V7 }, { 41: [1, 28], 43: [1, 29] }, { 45: [1, 30] }, { 48: [1, 31] }, o($Vd, [2, 29], { 33: 32, 36: [1, 33], 38: [1, 34] }), { 1: [2, 7] }, o($V8, [2, 13]), { 26: 35, 32: $V4 }, { 32: [2, 14] }, { 17: [1, 36] }, o($Vc, [2, 24]), { 11: 37, 13: 4, 14: 22, 15: $Va, 16: $Vb, 19: 5, 20: 6, 21: $V0, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: $V1, 29: $V2, 31: $V3, 32: $V4, 40: $V5, 44: $V6, 47: $V7 }, { 30: [1, 38] }, { 42: [1, 39] }, { 42: [1, 40] }, { 46: [1, 41] }, { 49: [1, 42] }, o($Vd, [2, 30]), { 18: [1, 43] }, { 18: [1, 44] }, o($Vc, [2, 23]), { 18: [1, 45] }, { 30: [1, 46] }, o($V9, [2, 28]), o($V9, [2, 35]), o($V9, [2, 36]), o($V9, [2, 37]), o($V9, [2, 38]), { 37: [1, 47] }, { 34: 48, 35: $Ve }, { 15: [1, 50] }, o($V9, [2, 27]), o($Vd, [2, 33]), { 39: [1, 51] }, { 34: 52, 35: $Ve, 39: [2, 31] }, { 32: [2, 15] }, o($Vd, [2, 34]), { 39: [2, 32] }], + defaultActions: { 20: [2, 7], 23: [2, 14], 50: [2, 15], 52: [2, 32] }, + parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, + parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + var symbol, state, action, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + var lexer = function() { + var lexer2 = { + EOF: 1, + parseError: function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + // resets the lexer, sets new input + setInput: function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, + // consumes and returns one char from the input + input: function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, + // unshifts one char (or a string) into the input + unput: function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + // When called from action, caches matched text and appends it on next action + more: function() { + this._more = true; + return this; + }, + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, + // retain first n characters of the match + less: function(n) { + this.unput(this.match.slice(n)); + }, + // displays already matched input, i.e. for error messages + pastInput: function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, + // displays upcoming input, i.e. for error messages + upcomingInput: function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, + // return next match in input + next: function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + // return next match that has a token + lex: function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: function begin(condition) { + this.conditionStack.push(condition); + }, + // pop the previously active lexer condition state off the condition stack + popState: function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + // alias for begin(condition) + pushState: function pushState(condition) { + this.begin(condition); + }, + // return the number of states currently on the stack + stateStackSize: function stateStackSize() { + return this.conditionStack.length; + }, + options: {}, + performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + switch ($avoiding_name_collisions) { + case 0: + return 10; + case 1: + yy.getLogger().debug("Found space-block"); + return 31; + case 2: + yy.getLogger().debug("Found nl-block"); + return 31; + case 3: + yy.getLogger().debug("Found space-block"); + return 29; + case 4: + yy.getLogger().debug(".", yy_.yytext); + break; + case 5: + yy.getLogger().debug("_", yy_.yytext); + break; + case 6: + return 5; + case 7: + yy_.yytext = -1; + return 28; + case 8: + yy_.yytext = yy_.yytext.replace(/columns\s+/, ""); + yy.getLogger().debug("COLUMNS (LEX)", yy_.yytext); + return 28; + case 9: + this.pushState("md_string"); + break; + case 10: + return "MD_STR"; + case 11: + this.popState(); + break; + case 12: + this.pushState("string"); + break; + case 13: + yy.getLogger().debug("LEX: POPPING STR:", yy_.yytext); + this.popState(); + break; + case 14: + yy.getLogger().debug("LEX: STR end:", yy_.yytext); + return "STR"; + case 15: + yy_.yytext = yy_.yytext.replace(/space\:/, ""); + yy.getLogger().debug("SPACE NUM (LEX)", yy_.yytext); + return 21; + case 16: + yy_.yytext = "1"; + yy.getLogger().debug("COLUMNS (LEX)", yy_.yytext); + return 21; + case 17: + return 43; + case 18: + return "LINKSTYLE"; + case 19: + return "INTERPOLATE"; + case 20: + this.pushState("CLASSDEF"); + return 40; + case 21: + this.popState(); + this.pushState("CLASSDEFID"); + return "DEFAULT_CLASSDEF_ID"; + case 22: + this.popState(); + this.pushState("CLASSDEFID"); + return 41; + case 23: + this.popState(); + return 42; + case 24: + this.pushState("CLASS"); + return 44; + case 25: + this.popState(); + this.pushState("CLASS_STYLE"); + return 45; + case 26: + this.popState(); + return 46; + case 27: + this.pushState("STYLE_STMNT"); + return 47; + case 28: + this.popState(); + this.pushState("STYLE_DEFINITION"); + return 48; + case 29: + this.popState(); + return 49; + case 30: + this.pushState("acc_title"); + return "acc_title"; + case 31: + this.popState(); + return "acc_title_value"; + case 32: + this.pushState("acc_descr"); + return "acc_descr"; + case 33: + this.popState(); + return "acc_descr_value"; + case 34: + this.pushState("acc_descr_multiline"); + break; + case 35: + this.popState(); + break; + case 36: + return "acc_descr_multiline_value"; + case 37: + return 30; + case 38: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + case 39: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + case 40: + this.popState(); + yy.getLogger().debug("Lex: ))"); + return "NODE_DEND"; + case 41: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + case 42: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + case 43: + this.popState(); + yy.getLogger().debug("Lex: (-"); + return "NODE_DEND"; + case 44: + this.popState(); + yy.getLogger().debug("Lex: -)"); + return "NODE_DEND"; + case 45: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + case 46: + this.popState(); + yy.getLogger().debug("Lex: ]]"); + return "NODE_DEND"; + case 47: + this.popState(); + yy.getLogger().debug("Lex: ("); + return "NODE_DEND"; + case 48: + this.popState(); + yy.getLogger().debug("Lex: ])"); + return "NODE_DEND"; + case 49: + this.popState(); + yy.getLogger().debug("Lex: /]"); + return "NODE_DEND"; + case 50: + this.popState(); + yy.getLogger().debug("Lex: /]"); + return "NODE_DEND"; + case 51: + this.popState(); + yy.getLogger().debug("Lex: )]"); + return "NODE_DEND"; + case 52: + this.popState(); + yy.getLogger().debug("Lex: )"); + return "NODE_DEND"; + case 53: + this.popState(); + yy.getLogger().debug("Lex: ]>"); + return "NODE_DEND"; + case 54: + this.popState(); + yy.getLogger().debug("Lex: ]"); + return "NODE_DEND"; + case 55: + yy.getLogger().debug("Lexa: -)"); + this.pushState("NODE"); + return 36; + case 56: + yy.getLogger().debug("Lexa: (-"); + this.pushState("NODE"); + return 36; + case 57: + yy.getLogger().debug("Lexa: ))"); + this.pushState("NODE"); + return 36; + case 58: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 36; + case 59: + yy.getLogger().debug("Lex: ((("); + this.pushState("NODE"); + return 36; + case 60: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 36; + case 61: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 36; + case 62: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 36; + case 63: + yy.getLogger().debug("Lexc: >"); + this.pushState("NODE"); + return 36; + case 64: + yy.getLogger().debug("Lexa: (["); + this.pushState("NODE"); + return 36; + case 65: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 36; + case 66: + this.pushState("NODE"); + return 36; + case 67: + this.pushState("NODE"); + return 36; + case 68: + this.pushState("NODE"); + return 36; + case 69: + this.pushState("NODE"); + return 36; + case 70: + this.pushState("NODE"); + return 36; + case 71: + this.pushState("NODE"); + return 36; + case 72: + this.pushState("NODE"); + return 36; + case 73: + yy.getLogger().debug("Lexa: ["); + this.pushState("NODE"); + return 36; + case 74: + this.pushState("BLOCK_ARROW"); + yy.getLogger().debug("LEX ARR START"); + return 38; + case 75: + yy.getLogger().debug("Lex: NODE_ID", yy_.yytext); + return 32; + case 76: + yy.getLogger().debug("Lex: EOF", yy_.yytext); + return 8; + case 77: + this.pushState("md_string"); + break; + case 78: + this.pushState("md_string"); + break; + case 79: + return "NODE_DESCR"; + case 80: + this.popState(); + break; + case 81: + yy.getLogger().debug("Lex: Starting string"); + this.pushState("string"); + break; + case 82: + yy.getLogger().debug("LEX ARR: Starting string"); + this.pushState("string"); + break; + case 83: + yy.getLogger().debug("LEX: NODE_DESCR:", yy_.yytext); + return "NODE_DESCR"; + case 84: + yy.getLogger().debug("LEX POPPING"); + this.popState(); + break; + case 85: + yy.getLogger().debug("Lex: =>BAE"); + this.pushState("ARROW_DIR"); + break; + case 86: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (right): dir:", yy_.yytext); + return "DIR"; + case 87: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (left):", yy_.yytext); + return "DIR"; + case 88: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (x):", yy_.yytext); + return "DIR"; + case 89: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (y):", yy_.yytext); + return "DIR"; + case 90: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (up):", yy_.yytext); + return "DIR"; + case 91: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (down):", yy_.yytext); + return "DIR"; + case 92: + yy_.yytext = "]>"; + yy.getLogger().debug("Lex (ARROW_DIR end):", yy_.yytext); + this.popState(); + this.popState(); + return "BLOCK_ARROW_END"; + case 93: + yy.getLogger().debug("Lex: LINK", "#" + yy_.yytext + "#"); + return 15; + case 94: + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + case 95: + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + case 96: + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + case 97: + yy.getLogger().debug("Lex: START_LINK", yy_.yytext); + this.pushState("LLABEL"); + return 16; + case 98: + yy.getLogger().debug("Lex: START_LINK", yy_.yytext); + this.pushState("LLABEL"); + return 16; + case 99: + yy.getLogger().debug("Lex: START_LINK", yy_.yytext); + this.pushState("LLABEL"); + return 16; + case 100: + this.pushState("md_string"); + break; + case 101: + yy.getLogger().debug("Lex: Starting string"); + this.pushState("string"); + return "LINK_LABEL"; + case 102: + this.popState(); + yy.getLogger().debug("Lex: LINK", "#" + yy_.yytext + "#"); + return 15; + case 103: + this.popState(); + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + case 104: + this.popState(); + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + case 105: + yy.getLogger().debug("Lex: COLON", yy_.yytext); + yy_.yytext = yy_.yytext.slice(1); + return 27; + } + }, + rules: [/^(?:block-beta\b)/, /^(?:block\s+)/, /^(?:block\n+)/, /^(?:block:)/, /^(?:[\s]+)/, /^(?:[\n]+)/, /^(?:((\u000D\u000A)|(\u000A)))/, /^(?:columns\s+auto\b)/, /^(?:columns\s+[\d]+)/, /^(?:["][`])/, /^(?:[^`"]+)/, /^(?:[`]["])/, /^(?:["])/, /^(?:["])/, /^(?:[^"]*)/, /^(?:space[:]\d+)/, /^(?:space\b)/, /^(?:default\b)/, /^(?:linkStyle\b)/, /^(?:interpolate\b)/, /^(?:classDef\s+)/, /^(?:DEFAULT\s+)/, /^(?:\w+\s+)/, /^(?:[^\n]*)/, /^(?:class\s+)/, /^(?:(\w+)+((,\s*\w+)*))/, /^(?:[^\n]*)/, /^(?:style\s+)/, /^(?:(\w+)+((,\s*\w+)*))/, /^(?:[^\n]*)/, /^(?:accTitle\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*\{\s*)/, /^(?:[\}])/, /^(?:[^\}]*)/, /^(?:end\b\s*)/, /^(?:\(\(\()/, /^(?:\)\)\))/, /^(?:[\)]\))/, /^(?:\}\})/, /^(?:\})/, /^(?:\(-)/, /^(?:-\))/, /^(?:\(\()/, /^(?:\]\])/, /^(?:\()/, /^(?:\]\))/, /^(?:\\\])/, /^(?:\/\])/, /^(?:\)\])/, /^(?:[\)])/, /^(?:\]>)/, /^(?:[\]])/, /^(?:-\))/, /^(?:\(-)/, /^(?:\)\))/, /^(?:\))/, /^(?:\(\(\()/, /^(?:\(\()/, /^(?:\{\{)/, /^(?:\{)/, /^(?:>)/, /^(?:\(\[)/, /^(?:\()/, /^(?:\[\[)/, /^(?:\[\|)/, /^(?:\[\()/, /^(?:\)\)\))/, /^(?:\[\\)/, /^(?:\[\/)/, /^(?:\[\\)/, /^(?:\[)/, /^(?:<\[)/, /^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/, /^(?:$)/, /^(?:["][`])/, /^(?:["][`])/, /^(?:[^`"]+)/, /^(?:[`]["])/, /^(?:["])/, /^(?:["])/, /^(?:[^"]+)/, /^(?:["])/, /^(?:\]>\s*\()/, /^(?:,?\s*right\s*)/, /^(?:,?\s*left\s*)/, /^(?:,?\s*x\s*)/, /^(?:,?\s*y\s*)/, /^(?:,?\s*up\s*)/, /^(?:,?\s*down\s*)/, /^(?:\)\s*)/, /^(?:\s*[xo<]?--+[-xo>]\s*)/, /^(?:\s*[xo<]?==+[=xo>]\s*)/, /^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/, /^(?:\s*~~[\~]+\s*)/, /^(?:\s*[xo<]?--\s*)/, /^(?:\s*[xo<]?==\s*)/, /^(?:\s*[xo<]?-\.\s*)/, /^(?:["][`])/, /^(?:["])/, /^(?:\s*[xo<]?--+[-xo>]\s*)/, /^(?:\s*[xo<]?==+[=xo>]\s*)/, /^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/, /^(?::\d+)/], + conditions: { "STYLE_DEFINITION": { "rules": [29], "inclusive": false }, "STYLE_STMNT": { "rules": [28], "inclusive": false }, "CLASSDEFID": { "rules": [23], "inclusive": false }, "CLASSDEF": { "rules": [21, 22], "inclusive": false }, "CLASS_STYLE": { "rules": [26], "inclusive": false }, "CLASS": { "rules": [25], "inclusive": false }, "LLABEL": { "rules": [100, 101, 102, 103, 104], "inclusive": false }, "ARROW_DIR": { "rules": [86, 87, 88, 89, 90, 91, 92], "inclusive": false }, "BLOCK_ARROW": { "rules": [77, 82, 85], "inclusive": false }, "NODE": { "rules": [38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 78, 81], "inclusive": false }, "md_string": { "rules": [10, 11, 79, 80], "inclusive": false }, "space": { "rules": [], "inclusive": false }, "string": { "rules": [13, 14, 83, 84], "inclusive": false }, "acc_descr_multiline": { "rules": [35, 36], "inclusive": false }, "acc_descr": { "rules": [33], "inclusive": false }, "acc_title": { "rules": [31], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 15, 16, 17, 18, 19, 20, 24, 27, 30, 32, 34, 37, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 93, 94, 95, 96, 97, 98, 99, 105], "inclusive": true } } + }; + return lexer2; + }(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +}(); +parser.parser = parser; +const parser$1 = parser; +let blockDatabase = {}; +let edgeList = []; +let edgeCount = {}; +const COLOR_KEYWORD = "color"; +const FILL_KEYWORD = "fill"; +const BG_FILL = "bgFill"; +const STYLECLASS_SEP = ","; +const config = getConfig(); +let classes = {}; +const sanitizeText = (txt) => common.sanitizeText(txt, config); +const addStyleClass = function(id, styleAttributes = "") { + if (classes[id] === void 0) { + classes[id] = { id, styles: [], textStyles: [] }; + } + const foundClass = classes[id]; + if (styleAttributes !== void 0 && styleAttributes !== null) { + styleAttributes.split(STYLECLASS_SEP).forEach((attrib) => { + const fixedAttrib = attrib.replace(/([^;]*);/, "$1").trim(); + if (attrib.match(COLOR_KEYWORD)) { + const newStyle1 = fixedAttrib.replace(FILL_KEYWORD, BG_FILL); + const newStyle2 = newStyle1.replace(COLOR_KEYWORD, FILL_KEYWORD); + foundClass.textStyles.push(newStyle2); + } + foundClass.styles.push(fixedAttrib); + }); + } +}; +const addStyle2Node = function(id, styles = "") { + const foundBlock = blockDatabase[id]; + if (styles !== void 0 && styles !== null) { + foundBlock.styles = styles.split(STYLECLASS_SEP); + } +}; +const setCssClass = function(itemIds, cssClassName) { + itemIds.split(",").forEach(function(id) { + let foundBlock = blockDatabase[id]; + if (foundBlock === void 0) { + const trimmedId = id.trim(); + blockDatabase[trimmedId] = { id: trimmedId, type: "na", children: [] }; + foundBlock = blockDatabase[trimmedId]; + } + if (!foundBlock.classes) { + foundBlock.classes = []; + } + foundBlock.classes.push(cssClassName); + }); +}; +const populateBlockDatabase = (_blockList, parent) => { + const blockList = _blockList.flat(); + const children = []; + for (const block of blockList) { + if (block.label) { + block.label = sanitizeText(block.label); + } + if (block.type === "classDef") { + addStyleClass(block.id, block.css); + continue; + } + if (block.type === "applyClass") { + setCssClass(block.id, (block == null ? void 0 : block.styleClass) || ""); + continue; + } + if (block.type === "applyStyles") { + if (block == null ? void 0 : block.stylesStr) { + addStyle2Node(block.id, block == null ? void 0 : block.stylesStr); + } + continue; + } + if (block.type === "column-setting") { + parent.columns = block.columns || -1; + } else if (block.type === "edge") { + if (edgeCount[block.id]) { + edgeCount[block.id]++; + } else { + edgeCount[block.id] = 1; + } + block.id = edgeCount[block.id] + "-" + block.id; + edgeList.push(block); + } else { + if (!block.label) { + if (block.type === "composite") { + block.label = ""; + } else { + block.label = block.id; + } + } + const newBlock = !blockDatabase[block.id]; + if (newBlock) { + blockDatabase[block.id] = block; + } else { + if (block.type !== "na") { + blockDatabase[block.id].type = block.type; + } + if (block.label !== block.id) { + blockDatabase[block.id].label = block.label; + } + } + if (block.children) { + populateBlockDatabase(block.children, block); + } + if (block.type === "space") { + const w = block.width || 1; + for (let j = 0; j < w; j++) { + const newBlock2 = clone(block); + newBlock2.id = newBlock2.id + "-" + j; + blockDatabase[newBlock2.id] = newBlock2; + children.push(newBlock2); + } + } else if (newBlock) { + children.push(block); + } + } + } + parent.children = children; +}; +let blocks = []; +let rootBlock = { id: "root", type: "composite", children: [], columns: -1 }; +const clear = () => { + log.debug("Clear called"); + clear$1(); + rootBlock = { id: "root", type: "composite", children: [], columns: -1 }; + blockDatabase = { root: rootBlock }; + blocks = []; + classes = {}; + edgeList = []; + edgeCount = {}; +}; +function typeStr2Type(typeStr) { + log.debug("typeStr2Type", typeStr); + switch (typeStr) { + case "[]": + return "square"; + case "()": + log.debug("we have a round"); + return "round"; + case "(())": + return "circle"; + case ">]": + return "rect_left_inv_arrow"; + case "{}": + return "diamond"; + case "{{}}": + return "hexagon"; + case "([])": + return "stadium"; + case "[[]]": + return "subroutine"; + case "[()]": + return "cylinder"; + case "((()))": + return "doublecircle"; + case "[//]": + return "lean_right"; + case "[\\\\]": + return "lean_left"; + case "[/\\]": + return "trapezoid"; + case "[\\/]": + return "inv_trapezoid"; + case "<[]>": + return "block_arrow"; + default: + return "na"; + } +} +function edgeTypeStr2Type(typeStr) { + log.debug("typeStr2Type", typeStr); + switch (typeStr) { + case "==": + return "thick"; + default: + return "normal"; + } +} +function edgeStrToEdgeData(typeStr) { + switch (typeStr.trim()) { + case "--x": + return "arrow_cross"; + case "--o": + return "arrow_circle"; + default: + return "arrow_point"; + } +} +let cnt = 0; +const generateId = () => { + cnt++; + return "id-" + Math.random().toString(36).substr(2, 12) + "-" + cnt; +}; +const setHierarchy = (block) => { + rootBlock.children = block; + populateBlockDatabase(block, rootBlock); + blocks = rootBlock.children; +}; +const getColumns = (blockId) => { + const block = blockDatabase[blockId]; + if (!block) { + return -1; + } + if (block.columns) { + return block.columns; + } + if (!block.children) { + return -1; + } + return block.children.length; +}; +const getBlocksFlat = () => { + return [...Object.values(blockDatabase)]; +}; +const getBlocks = () => { + return blocks || []; +}; +const getEdges = () => { + return edgeList; +}; +const getBlock = (id) => { + return blockDatabase[id]; +}; +const setBlock = (block) => { + blockDatabase[block.id] = block; +}; +const getLogger = () => console; +const getClasses$1 = function() { + return classes; +}; +const db = { + getConfig: () => getConfig$1().block, + typeStr2Type, + edgeTypeStr2Type, + edgeStrToEdgeData, + getLogger, + getBlocksFlat, + getBlocks, + getEdges, + setHierarchy, + getBlock, + setBlock, + getColumns, + getClasses: getClasses$1, + clear, + generateId +}; +const db$1 = db; +const fade = (color, opacity) => { + const channel$1 = channel; + const r = channel$1(color, "r"); + const g = channel$1(color, "g"); + const b = channel$1(color, "b"); + return rgba(r, g, b, opacity); +}; +const getStyles = (options) => `.label { + font-family: ${options.fontFamily}; + color: ${options.nodeTextColor || options.textColor}; + } + .cluster-label text { + fill: ${options.titleColor}; + } + .cluster-label span,p { + color: ${options.titleColor}; + } + + + + .label text,span,p { + fill: ${options.nodeTextColor || options.textColor}; + color: ${options.nodeTextColor || options.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; + stroke-width: 1px; + } + .flowchart-label text { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${options.arrowheadColor}; + } + + .edgePath .path { + stroke: ${options.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${options.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${options.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${options.edgeLabelBackground}; + fill: ${options.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${fade(options.edgeLabelBackground, 0.5)}; + // background-color: + } + + .node .cluster { + // fill: ${fade(options.mainBkg, 0.5)}; + fill: ${fade(options.clusterBkg, 0.5)}; + stroke: ${fade(options.clusterBorder, 0.2)}; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + stroke-width: 1px; + } + + .cluster text { + fill: ${options.titleColor}; + } + + .cluster span,p { + color: ${options.titleColor}; + } + /* .cluster div { + color: ${options.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${options.fontFamily}; + font-size: 12px; + background: ${options.tertiaryColor}; + border: 1px solid ${options.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${options.textColor}; + } +`; +const flowStyles = getStyles; +function getNodeFromBlock(block, db2, positioned = false) { + var _a2, _b2, _c; + const vertex = block; + let classStr = "default"; + if ((((_a2 = vertex == null ? void 0 : vertex.classes) == null ? void 0 : _a2.length) || 0) > 0) { + classStr = ((vertex == null ? void 0 : vertex.classes) || []).join(" "); + } + classStr = classStr + " flowchart-label"; + let radius = 0; + let shape = ""; + let padding2; + switch (vertex.type) { + case "round": + radius = 5; + shape = "rect"; + break; + case "composite": + radius = 0; + shape = "composite"; + padding2 = 0; + break; + case "square": + shape = "rect"; + break; + case "diamond": + shape = "question"; + break; + case "hexagon": + shape = "hexagon"; + break; + case "block_arrow": + shape = "block_arrow"; + break; + case "odd": + shape = "rect_left_inv_arrow"; + break; + case "lean_right": + shape = "lean_right"; + break; + case "lean_left": + shape = "lean_left"; + break; + case "trapezoid": + shape = "trapezoid"; + break; + case "inv_trapezoid": + shape = "inv_trapezoid"; + break; + case "rect_left_inv_arrow": + shape = "rect_left_inv_arrow"; + break; + case "circle": + shape = "circle"; + break; + case "ellipse": + shape = "ellipse"; + break; + case "stadium": + shape = "stadium"; + break; + case "subroutine": + shape = "subroutine"; + break; + case "cylinder": + shape = "cylinder"; + break; + case "group": + shape = "rect"; + break; + case "doublecircle": + shape = "doublecircle"; + break; + default: + shape = "rect"; + } + const styles = getStylesFromArray((vertex == null ? void 0 : vertex.styles) || []); + const vertexText = vertex.label; + const bounds = vertex.size || { width: 0, height: 0, x: 0, y: 0 }; + const node = { + labelStyle: styles.labelStyle, + shape, + labelText: vertexText, + rx: radius, + ry: radius, + class: classStr, + style: styles.style, + id: vertex.id, + directions: vertex.directions, + width: bounds.width, + height: bounds.height, + x: bounds.x, + y: bounds.y, + positioned, + intersect: void 0, + type: vertex.type, + padding: padding2 ?? (((_c = (_b2 = getConfig$1()) == null ? void 0 : _b2.block) == null ? void 0 : _c.padding) || 0) + }; + return node; +} +async function calculateBlockSize(elem, block, db2) { + const node = getNodeFromBlock(block, db2, false); + if (node.type === "group") { + return; + } + const nodeEl = await insertNode(elem, node); + const boundingBox = nodeEl.node().getBBox(); + const obj = db2.getBlock(node.id); + obj.size = { width: boundingBox.width, height: boundingBox.height, x: 0, y: 0, node: nodeEl }; + db2.setBlock(obj); + nodeEl.remove(); +} +async function insertBlockPositioned(elem, block, db2) { + const node = getNodeFromBlock(block, db2, true); + const obj = db2.getBlock(node.id); + if (obj.type !== "space") { + await insertNode(elem, node); + block.intersect = node == null ? void 0 : node.intersect; + positionNode(node); + } +} +async function performOperations(elem, blocks2, db2, operation) { + for (const block of blocks2) { + await operation(elem, block, db2); + if (block.children) { + await performOperations(elem, block.children, db2, operation); + } + } +} +async function calculateBlockSizes(elem, blocks2, db2) { + await performOperations(elem, blocks2, db2, calculateBlockSize); +} +async function insertBlocks(elem, blocks2, db2) { + await performOperations(elem, blocks2, db2, insertBlockPositioned); +} +async function insertEdges(elem, edges, blocks2, db2, id) { + const g = new Graph({ + multigraph: true, + compound: true + }); + g.setGraph({ + rankdir: "TB", + nodesep: 10, + ranksep: 10, + marginx: 8, + marginy: 8 + }); + for (const block of blocks2) { + if (block.size) { + g.setNode(block.id, { + width: block.size.width, + height: block.size.height, + intersect: block.intersect + }); + } + } + for (const edge of edges) { + if (edge.start && edge.end) { + const startBlock = db2.getBlock(edge.start); + const endBlock = db2.getBlock(edge.end); + if ((startBlock == null ? void 0 : startBlock.size) && (endBlock == null ? void 0 : endBlock.size)) { + const start = startBlock.size; + const end = endBlock.size; + const points = [ + { x: start.x, y: start.y }, + { x: start.x + (end.x - start.x) / 2, y: start.y + (end.y - start.y) / 2 }, + { x: end.x, y: end.y } + ]; + await insertEdge( + elem, + { v: edge.start, w: edge.end, name: edge.id }, + { + ...edge, + arrowTypeEnd: edge.arrowTypeEnd, + arrowTypeStart: edge.arrowTypeStart, + points, + classes: "edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1" + }, + void 0, + "block", + g, + id + ); + if (edge.label) { + await insertEdgeLabel(elem, { + ...edge, + label: edge.label, + labelStyle: "stroke: #333; stroke-width: 1.5px;fill:none;", + arrowTypeEnd: edge.arrowTypeEnd, + arrowTypeStart: edge.arrowTypeStart, + points, + classes: "edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1" + }); + await positionEdgeLabel( + { ...edge, x: points[1].x, y: points[1].y }, + { + originalPath: points + } + ); + } + } + } + } +} +const padding = ((_b = (_a = getConfig()) == null ? void 0 : _a.block) == null ? void 0 : _b.padding) || 8; +function calculateBlockPosition(columns, position) { + if (columns === 0 || !Number.isInteger(columns)) { + throw new Error("Columns must be an integer !== 0."); + } + if (position < 0 || !Number.isInteger(position)) { + throw new Error("Position must be a non-negative integer." + position); + } + if (columns < 0) { + return { px: position, py: 0 }; + } + if (columns === 1) { + return { px: 0, py: position }; + } + const px = position % columns; + const py = Math.floor(position / columns); + return { px, py }; +} +const getMaxChildSize = (block) => { + let maxWidth = 0; + let maxHeight = 0; + for (const child of block.children) { + const { width, height, x, y } = child.size || { width: 0, height: 0, x: 0, y: 0 }; + log.debug( + "getMaxChildSize abc95 child:", + child.id, + "width:", + width, + "height:", + height, + "x:", + x, + "y:", + y, + child.type + ); + if (child.type === "space") { + continue; + } + if (width > maxWidth) { + maxWidth = width / (block.widthInColumns || 1); + } + if (height > maxHeight) { + maxHeight = height; + } + } + return { width: maxWidth, height: maxHeight }; +}; +function setBlockSizes(block, db2, siblingWidth = 0, siblingHeight = 0) { + var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j, _k; + log.debug( + "setBlockSizes abc95 (start)", + block.id, + (_a2 = block == null ? void 0 : block.size) == null ? void 0 : _a2.x, + "block width =", + block == null ? void 0 : block.size, + "sieblingWidth", + siblingWidth + ); + if (!((_b2 = block == null ? void 0 : block.size) == null ? void 0 : _b2.width)) { + block.size = { + width: siblingWidth, + height: siblingHeight, + x: 0, + y: 0 + }; + } + let maxWidth = 0; + let maxHeight = 0; + if (((_c = block.children) == null ? void 0 : _c.length) > 0) { + for (const child of block.children) { + setBlockSizes(child, db2); + } + const childSize = getMaxChildSize(block); + maxWidth = childSize.width; + maxHeight = childSize.height; + log.debug("setBlockSizes abc95 maxWidth of", block.id, ":s children is ", maxWidth, maxHeight); + for (const child of block.children) { + if (child.size) { + log.debug( + `abc95 Setting size of children of ${block.id} id=${child.id} ${maxWidth} ${maxHeight} ${child.size}` + ); + child.size.width = maxWidth * (child.widthInColumns || 1) + padding * ((child.widthInColumns || 1) - 1); + child.size.height = maxHeight; + child.size.x = 0; + child.size.y = 0; + log.debug( + `abc95 updating size of ${block.id} children child:${child.id} maxWidth:${maxWidth} maxHeight:${maxHeight}` + ); + } + } + for (const child of block.children) { + setBlockSizes(child, db2, maxWidth, maxHeight); + } + const columns = block.columns || -1; + let numItems = 0; + for (const child of block.children) { + numItems += child.widthInColumns || 1; + } + let xSize = block.children.length; + if (columns > 0 && columns < numItems) { + xSize = columns; + } + block.widthInColumns || 1; + const ySize = Math.ceil(numItems / xSize); + let width = xSize * (maxWidth + padding) + padding; + let height = ySize * (maxHeight + padding) + padding; + if (width < siblingWidth) { + log.debug( + `Detected to small siebling: abc95 ${block.id} sieblingWidth ${siblingWidth} sieblingHeight ${siblingHeight} width ${width}` + ); + width = siblingWidth; + height = siblingHeight; + const childWidth = (siblingWidth - xSize * padding - padding) / xSize; + const childHeight = (siblingHeight - ySize * padding - padding) / ySize; + log.debug("Size indata abc88", block.id, "childWidth", childWidth, "maxWidth", maxWidth); + log.debug("Size indata abc88", block.id, "childHeight", childHeight, "maxHeight", maxHeight); + log.debug("Size indata abc88 xSize", xSize, "padding", padding); + for (const child of block.children) { + if (child.size) { + child.size.width = childWidth; + child.size.height = childHeight; + child.size.x = 0; + child.size.y = 0; + } + } + } + log.debug( + `abc95 (finale calc) ${block.id} xSize ${xSize} ySize ${ySize} columns ${columns}${block.children.length} width=${Math.max(width, ((_d = block.size) == null ? void 0 : _d.width) || 0)}` + ); + if (width < (((_e = block == null ? void 0 : block.size) == null ? void 0 : _e.width) || 0)) { + width = ((_f = block == null ? void 0 : block.size) == null ? void 0 : _f.width) || 0; + const num = columns > 0 ? Math.min(block.children.length, columns) : block.children.length; + if (num > 0) { + const childWidth = (width - num * padding - padding) / num; + log.debug("abc95 (growing to fit) width", block.id, width, (_g = block.size) == null ? void 0 : _g.width, childWidth); + for (const child of block.children) { + if (child.size) { + child.size.width = childWidth; + } + } + } + } + block.size = { + width, + height, + x: 0, + y: 0 + }; + } + log.debug( + "setBlockSizes abc94 (done)", + block.id, + (_h = block == null ? void 0 : block.size) == null ? void 0 : _h.x, + (_i = block == null ? void 0 : block.size) == null ? void 0 : _i.width, + (_j = block == null ? void 0 : block.size) == null ? void 0 : _j.y, + (_k = block == null ? void 0 : block.size) == null ? void 0 : _k.height + ); +} +function layoutBlocks(block, db2) { + var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q; + log.debug( + `abc85 layout blocks (=>layoutBlocks) ${block.id} x: ${(_a2 = block == null ? void 0 : block.size) == null ? void 0 : _a2.x} y: ${(_b2 = block == null ? void 0 : block.size) == null ? void 0 : _b2.y} width: ${(_c = block == null ? void 0 : block.size) == null ? void 0 : _c.width}` + ); + const columns = block.columns || -1; + log.debug("layoutBlocks columns abc95", block.id, "=>", columns, block); + if (block.children && // find max width of children + block.children.length > 0) { + const width = ((_e = (_d = block == null ? void 0 : block.children[0]) == null ? void 0 : _d.size) == null ? void 0 : _e.width) || 0; + const widthOfChildren = block.children.length * width + (block.children.length - 1) * padding; + log.debug("widthOfChildren 88", widthOfChildren, "posX"); + let columnPos = 0; + log.debug("abc91 block?.size?.x", block.id, (_f = block == null ? void 0 : block.size) == null ? void 0 : _f.x); + let startingPosX = ((_g = block == null ? void 0 : block.size) == null ? void 0 : _g.x) ? ((_h = block == null ? void 0 : block.size) == null ? void 0 : _h.x) + (-((_i = block == null ? void 0 : block.size) == null ? void 0 : _i.width) / 2 || 0) : -padding; + let rowPos = 0; + for (const child of block.children) { + const parent = block; + if (!child.size) { + continue; + } + const { width: width2, height } = child.size; + const { px, py } = calculateBlockPosition(columns, columnPos); + if (py != rowPos) { + rowPos = py; + startingPosX = ((_j = block == null ? void 0 : block.size) == null ? void 0 : _j.x) ? ((_k = block == null ? void 0 : block.size) == null ? void 0 : _k.x) + (-((_l = block == null ? void 0 : block.size) == null ? void 0 : _l.width) / 2 || 0) : -padding; + log.debug("New row in layout for block", block.id, " and child ", child.id, rowPos); + } + log.debug( + `abc89 layout blocks (child) id: ${child.id} Pos: ${columnPos} (px, py) ${px},${py} (${(_m = parent == null ? void 0 : parent.size) == null ? void 0 : _m.x},${(_n = parent == null ? void 0 : parent.size) == null ? void 0 : _n.y}) parent: ${parent.id} width: ${width2}${padding}` + ); + if (parent.size) { + const halfWidth = width2 / 2; + child.size.x = startingPosX + padding + halfWidth; + log.debug( + `abc91 layout blocks (calc) px, pyid:${child.id} startingPos=X${startingPosX} new startingPosX${child.size.x} ${halfWidth} padding=${padding} width=${width2} halfWidth=${halfWidth} => x:${child.size.x} y:${child.size.y} ${child.widthInColumns} (width * (child?.w || 1)) / 2 ${width2 * ((child == null ? void 0 : child.widthInColumns) || 1) / 2}` + ); + startingPosX = child.size.x + halfWidth; + child.size.y = parent.size.y - parent.size.height / 2 + py * (height + padding) + height / 2 + padding; + log.debug( + `abc88 layout blocks (calc) px, pyid:${child.id}startingPosX${startingPosX}${padding}${halfWidth}=>x:${child.size.x}y:${child.size.y}${child.widthInColumns}(width * (child?.w || 1)) / 2${width2 * ((child == null ? void 0 : child.widthInColumns) || 1) / 2}` + ); + } + if (child.children) { + layoutBlocks(child); + } + columnPos += (child == null ? void 0 : child.widthInColumns) || 1; + log.debug("abc88 columnsPos", child, columnPos); + } + } + log.debug( + `layout blocks (<==layoutBlocks) ${block.id} x: ${(_o = block == null ? void 0 : block.size) == null ? void 0 : _o.x} y: ${(_p = block == null ? void 0 : block.size) == null ? void 0 : _p.y} width: ${(_q = block == null ? void 0 : block.size) == null ? void 0 : _q.width}` + ); +} +function findBounds(block, { minX, minY, maxX, maxY } = { minX: 0, minY: 0, maxX: 0, maxY: 0 }) { + if (block.size && block.id !== "root") { + const { x, y, width, height } = block.size; + if (x - width / 2 < minX) { + minX = x - width / 2; + } + if (y - height / 2 < minY) { + minY = y - height / 2; + } + if (x + width / 2 > maxX) { + maxX = x + width / 2; + } + if (y + height / 2 > maxY) { + maxY = y + height / 2; + } + } + if (block.children) { + for (const child of block.children) { + ({ minX, minY, maxX, maxY } = findBounds(child, { minX, minY, maxX, maxY })); + } + } + return { minX, minY, maxX, maxY }; +} +function layout(db2) { + const root = db2.getBlock("root"); + if (!root) { + return; + } + setBlockSizes(root, db2, 0, 0); + layoutBlocks(root); + log.debug("getBlocks", JSON.stringify(root, null, 2)); + const { minX, minY, maxX, maxY } = findBounds(root); + const height = maxY - minY; + const width = maxX - minX; + return { x: minX, y: minY, width, height }; +} +const getClasses = function(text, diagObj) { + return diagObj.db.getClasses(); +}; +const draw = async function(text, id, _version, diagObj) { + const { securityLevel, block: conf } = getConfig$1(); + const db2 = diagObj.db; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = d3select("#i" + id); + } + const root = securityLevel === "sandbox" ? d3select(sandboxElement.nodes()[0].contentDocument.body) : d3select("body"); + const svg = securityLevel === "sandbox" ? root.select(`[id="${id}"]`) : d3select(`[id="${id}"]`); + const markers = ["point", "circle", "cross"]; + insertMarkers(svg, markers, diagObj.type, id); + const bl = db2.getBlocks(); + const blArr = db2.getBlocksFlat(); + const edges = db2.getEdges(); + const nodes = svg.insert("g").attr("class", "block"); + await calculateBlockSizes(nodes, bl, db2); + const bounds = layout(db2); + await insertBlocks(nodes, bl, db2); + await insertEdges(nodes, edges, blArr, db2, id); + if (bounds) { + const bounds2 = bounds; + const magicFactor = Math.max(1, Math.round(0.125 * (bounds2.width / bounds2.height))); + const height = bounds2.height + magicFactor + 10; + const width = bounds2.width + 10; + const { useMaxWidth } = conf; + configureSvgSize(svg, height, width, !!useMaxWidth); + log.debug("Here Bounds", bounds, bounds2); + svg.attr( + "viewBox", + `${bounds2.x - 5} ${bounds2.y - 5} ${bounds2.width + 10} ${bounds2.height + 10}` + ); + } + ordinal(d3schemeTableau10); +}; +const renderer = { + draw, + getClasses +}; +const diagram = { + parser: parser$1, + db: db$1, + renderer, + styles: flowStyles +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/blockDiagram-c4efeb88.js b/vs-code-extension/media/mermaid/blockDiagram-c4efeb88.js new file mode 100644 index 0000000..78eb4f6 --- /dev/null +++ b/vs-code-extension/media/mermaid/blockDiagram-c4efeb88.js @@ -0,0 +1,1822 @@ +var _a, _b; +import { c as getConfig, F as getConfig$1, l as log, v as clear$1, e as common, k as getStylesFromArray, i as configureSvgSize } from "./mermaid-7ea9cbd6.js"; +import clone from "lodash-es/clone.js"; +import * as khroma from "khroma"; +import { h as insertEdge, f as insertEdgeLabel, j as positionEdgeLabel, e as insertNode, p as positionNode, a as insertMarkers } from "./edges-96097737.js"; +import * as graphlib from "dagre-d3-es/src/graphlib/index.js"; +import { select, scaleOrdinal, schemeTableau10 } from "d3"; +import "ts-dedent"; +import "dayjs"; +import "@braintree/sanitize-url"; +import "dompurify"; +import "lodash-es/memoize.js"; +import "lodash-es/merge.js"; +import "stylis"; +import "lodash-es/isEmpty.js"; +import "./createText-1719965b.js"; +import "mdast-util-from-markdown"; +var parser = function() { + var o = function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) + ; + return o2; + }, $V0 = [1, 7], $V1 = [1, 13], $V2 = [1, 14], $V3 = [1, 15], $V4 = [1, 19], $V5 = [1, 16], $V6 = [1, 17], $V7 = [1, 18], $V8 = [8, 30], $V9 = [8, 21, 28, 29, 30, 31, 32, 40, 44, 47], $Va = [1, 23], $Vb = [1, 24], $Vc = [8, 15, 16, 21, 28, 29, 30, 31, 32, 40, 44, 47], $Vd = [8, 15, 16, 21, 27, 28, 29, 30, 31, 32, 40, 44, 47], $Ve = [1, 49]; + var parser2 = { + trace: function trace() { + }, + yy: {}, + symbols_: { "error": 2, "spaceLines": 3, "SPACELINE": 4, "NL": 5, "separator": 6, "SPACE": 7, "EOF": 8, "start": 9, "BLOCK_DIAGRAM_KEY": 10, "document": 11, "stop": 12, "statement": 13, "link": 14, "LINK": 15, "START_LINK": 16, "LINK_LABEL": 17, "STR": 18, "nodeStatement": 19, "columnsStatement": 20, "SPACE_BLOCK": 21, "blockStatement": 22, "classDefStatement": 23, "cssClassStatement": 24, "styleStatement": 25, "node": 26, "SIZE": 27, "COLUMNS": 28, "id-block": 29, "end": 30, "block": 31, "NODE_ID": 32, "nodeShapeNLabel": 33, "dirList": 34, "DIR": 35, "NODE_DSTART": 36, "NODE_DEND": 37, "BLOCK_ARROW_START": 38, "BLOCK_ARROW_END": 39, "classDef": 40, "CLASSDEF_ID": 41, "CLASSDEF_STYLEOPTS": 42, "DEFAULT": 43, "class": 44, "CLASSENTITY_IDS": 45, "STYLECLASS": 46, "style": 47, "STYLE_ENTITY_IDS": 48, "STYLE_DEFINITION_DATA": 49, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "SPACELINE", 5: "NL", 7: "SPACE", 8: "EOF", 10: "BLOCK_DIAGRAM_KEY", 15: "LINK", 16: "START_LINK", 17: "LINK_LABEL", 18: "STR", 21: "SPACE_BLOCK", 27: "SIZE", 28: "COLUMNS", 29: "id-block", 30: "end", 31: "block", 32: "NODE_ID", 35: "DIR", 36: "NODE_DSTART", 37: "NODE_DEND", 38: "BLOCK_ARROW_START", 39: "BLOCK_ARROW_END", 40: "classDef", 41: "CLASSDEF_ID", 42: "CLASSDEF_STYLEOPTS", 43: "DEFAULT", 44: "class", 45: "CLASSENTITY_IDS", 46: "STYLECLASS", 47: "style", 48: "STYLE_ENTITY_IDS", 49: "STYLE_DEFINITION_DATA" }, + productions_: [0, [3, 1], [3, 2], [3, 2], [6, 1], [6, 1], [6, 1], [9, 3], [12, 1], [12, 1], [12, 2], [12, 2], [11, 1], [11, 2], [14, 1], [14, 4], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [19, 3], [19, 2], [19, 1], [20, 1], [22, 4], [22, 3], [26, 1], [26, 2], [34, 1], [34, 2], [33, 3], [33, 4], [23, 3], [23, 3], [24, 3], [25, 3]], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 4: + yy.getLogger().debug("Rule: separator (NL) "); + break; + case 5: + yy.getLogger().debug("Rule: separator (Space) "); + break; + case 6: + yy.getLogger().debug("Rule: separator (EOF) "); + break; + case 7: + yy.getLogger().debug("Rule: hierarchy: ", $$[$0 - 1]); + yy.setHierarchy($$[$0 - 1]); + break; + case 8: + yy.getLogger().debug("Stop NL "); + break; + case 9: + yy.getLogger().debug("Stop EOF "); + break; + case 10: + yy.getLogger().debug("Stop NL2 "); + break; + case 11: + yy.getLogger().debug("Stop EOF2 "); + break; + case 12: + yy.getLogger().debug("Rule: statement: ", $$[$0]); + typeof $$[$0].length === "number" ? this.$ = $$[$0] : this.$ = [$$[$0]]; + break; + case 13: + yy.getLogger().debug("Rule: statement #2: ", $$[$0 - 1]); + this.$ = [$$[$0 - 1]].concat($$[$0]); + break; + case 14: + yy.getLogger().debug("Rule: link: ", $$[$0], yytext); + this.$ = { edgeTypeStr: $$[$0], label: "" }; + break; + case 15: + yy.getLogger().debug("Rule: LABEL link: ", $$[$0 - 3], $$[$0 - 1], $$[$0]); + this.$ = { edgeTypeStr: $$[$0], label: $$[$0 - 1] }; + break; + case 18: + const num = parseInt($$[$0]); + const spaceId = yy.generateId(); + this.$ = { id: spaceId, type: "space", label: "", width: num, children: [] }; + break; + case 23: + yy.getLogger().debug("Rule: (nodeStatement link node) ", $$[$0 - 2], $$[$0 - 1], $$[$0], " typestr: ", $$[$0 - 1].edgeTypeStr); + const edgeData = yy.edgeStrToEdgeData($$[$0 - 1].edgeTypeStr); + this.$ = [ + { id: $$[$0 - 2].id, label: $$[$0 - 2].label, type: $$[$0 - 2].type, directions: $$[$0 - 2].directions }, + { id: $$[$0 - 2].id + "-" + $$[$0].id, start: $$[$0 - 2].id, end: $$[$0].id, label: $$[$0 - 1].label, type: "edge", directions: $$[$0].directions, arrowTypeEnd: edgeData, arrowTypeStart: "arrow_open" }, + { id: $$[$0].id, label: $$[$0].label, type: yy.typeStr2Type($$[$0].typeStr), directions: $$[$0].directions } + ]; + break; + case 24: + yy.getLogger().debug("Rule: nodeStatement (abc88 node size) ", $$[$0 - 1], $$[$0]); + this.$ = { id: $$[$0 - 1].id, label: $$[$0 - 1].label, type: yy.typeStr2Type($$[$0 - 1].typeStr), directions: $$[$0 - 1].directions, widthInColumns: parseInt($$[$0], 10) }; + break; + case 25: + yy.getLogger().debug("Rule: nodeStatement (node) ", $$[$0]); + this.$ = { id: $$[$0].id, label: $$[$0].label, type: yy.typeStr2Type($$[$0].typeStr), directions: $$[$0].directions, widthInColumns: 1 }; + break; + case 26: + yy.getLogger().debug("APA123", this ? this : "na"); + yy.getLogger().debug("COLUMNS: ", $$[$0]); + this.$ = { type: "column-setting", columns: $$[$0] === "auto" ? -1 : parseInt($$[$0]) }; + break; + case 27: + yy.getLogger().debug("Rule: id-block statement : ", $$[$0 - 2], $$[$0 - 1]); + yy.generateId(); + this.$ = { ...$$[$0 - 2], type: "composite", children: $$[$0 - 1] }; + break; + case 28: + yy.getLogger().debug("Rule: blockStatement : ", $$[$0 - 2], $$[$0 - 1], $$[$0]); + const id = yy.generateId(); + this.$ = { id, type: "composite", label: "", children: $$[$0 - 1] }; + break; + case 29: + yy.getLogger().debug("Rule: node (NODE_ID separator): ", $$[$0]); + this.$ = { id: $$[$0] }; + break; + case 30: + yy.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ", $$[$0 - 1], $$[$0]); + this.$ = { id: $$[$0 - 1], label: $$[$0].label, typeStr: $$[$0].typeStr, directions: $$[$0].directions }; + break; + case 31: + yy.getLogger().debug("Rule: dirList: ", $$[$0]); + this.$ = [$$[$0]]; + break; + case 32: + yy.getLogger().debug("Rule: dirList: ", $$[$0 - 1], $$[$0]); + this.$ = [$$[$0 - 1]].concat($$[$0]); + break; + case 33: + yy.getLogger().debug("Rule: nodeShapeNLabel: ", $$[$0 - 2], $$[$0 - 1], $$[$0]); + this.$ = { typeStr: $$[$0 - 2] + $$[$0], label: $$[$0 - 1] }; + break; + case 34: + yy.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ", $$[$0 - 3], $$[$0 - 2], " #3:", $$[$0 - 1], $$[$0]); + this.$ = { typeStr: $$[$0 - 3] + $$[$0], label: $$[$0 - 2], directions: $$[$0 - 1] }; + break; + case 35: + case 36: + this.$ = { type: "classDef", id: $$[$0 - 1].trim(), css: $$[$0].trim() }; + break; + case 37: + this.$ = { type: "applyClass", id: $$[$0 - 1].trim(), styleClass: $$[$0].trim() }; + break; + case 38: + this.$ = { type: "applyStyles", id: $$[$0 - 1].trim(), stylesStr: $$[$0].trim() }; + break; + } + }, + table: [{ 9: 1, 10: [1, 2] }, { 1: [3] }, { 11: 3, 13: 4, 19: 5, 20: 6, 21: $V0, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: $V1, 29: $V2, 31: $V3, 32: $V4, 40: $V5, 44: $V6, 47: $V7 }, { 8: [1, 20] }, o($V8, [2, 12], { 13: 4, 19: 5, 20: 6, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 11: 21, 21: $V0, 28: $V1, 29: $V2, 31: $V3, 32: $V4, 40: $V5, 44: $V6, 47: $V7 }), o($V9, [2, 16], { 14: 22, 15: $Va, 16: $Vb }), o($V9, [2, 17]), o($V9, [2, 18]), o($V9, [2, 19]), o($V9, [2, 20]), o($V9, [2, 21]), o($V9, [2, 22]), o($Vc, [2, 25], { 27: [1, 25] }), o($V9, [2, 26]), { 19: 26, 26: 12, 32: $V4 }, { 11: 27, 13: 4, 19: 5, 20: 6, 21: $V0, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: $V1, 29: $V2, 31: $V3, 32: $V4, 40: $V5, 44: $V6, 47: $V7 }, { 41: [1, 28], 43: [1, 29] }, { 45: [1, 30] }, { 48: [1, 31] }, o($Vd, [2, 29], { 33: 32, 36: [1, 33], 38: [1, 34] }), { 1: [2, 7] }, o($V8, [2, 13]), { 26: 35, 32: $V4 }, { 32: [2, 14] }, { 17: [1, 36] }, o($Vc, [2, 24]), { 11: 37, 13: 4, 14: 22, 15: $Va, 16: $Vb, 19: 5, 20: 6, 21: $V0, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: $V1, 29: $V2, 31: $V3, 32: $V4, 40: $V5, 44: $V6, 47: $V7 }, { 30: [1, 38] }, { 42: [1, 39] }, { 42: [1, 40] }, { 46: [1, 41] }, { 49: [1, 42] }, o($Vd, [2, 30]), { 18: [1, 43] }, { 18: [1, 44] }, o($Vc, [2, 23]), { 18: [1, 45] }, { 30: [1, 46] }, o($V9, [2, 28]), o($V9, [2, 35]), o($V9, [2, 36]), o($V9, [2, 37]), o($V9, [2, 38]), { 37: [1, 47] }, { 34: 48, 35: $Ve }, { 15: [1, 50] }, o($V9, [2, 27]), o($Vd, [2, 33]), { 39: [1, 51] }, { 34: 52, 35: $Ve, 39: [2, 31] }, { 32: [2, 15] }, o($Vd, [2, 34]), { 39: [2, 32] }], + defaultActions: { 20: [2, 7], 23: [2, 14], 50: [2, 15], 52: [2, 32] }, + parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, + parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + var symbol, state, action, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + var lexer = function() { + var lexer2 = { + EOF: 1, + parseError: function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + // resets the lexer, sets new input + setInput: function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, + // consumes and returns one char from the input + input: function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, + // unshifts one char (or a string) into the input + unput: function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + // When called from action, caches matched text and appends it on next action + more: function() { + this._more = true; + return this; + }, + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, + // retain first n characters of the match + less: function(n) { + this.unput(this.match.slice(n)); + }, + // displays already matched input, i.e. for error messages + pastInput: function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, + // displays upcoming input, i.e. for error messages + upcomingInput: function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, + // return next match in input + next: function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + // return next match that has a token + lex: function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: function begin(condition) { + this.conditionStack.push(condition); + }, + // pop the previously active lexer condition state off the condition stack + popState: function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + // alias for begin(condition) + pushState: function pushState(condition) { + this.begin(condition); + }, + // return the number of states currently on the stack + stateStackSize: function stateStackSize() { + return this.conditionStack.length; + }, + options: {}, + performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + switch ($avoiding_name_collisions) { + case 0: + return 10; + case 1: + yy.getLogger().debug("Found space-block"); + return 31; + case 2: + yy.getLogger().debug("Found nl-block"); + return 31; + case 3: + yy.getLogger().debug("Found space-block"); + return 29; + case 4: + yy.getLogger().debug(".", yy_.yytext); + break; + case 5: + yy.getLogger().debug("_", yy_.yytext); + break; + case 6: + return 5; + case 7: + yy_.yytext = -1; + return 28; + case 8: + yy_.yytext = yy_.yytext.replace(/columns\s+/, ""); + yy.getLogger().debug("COLUMNS (LEX)", yy_.yytext); + return 28; + case 9: + this.pushState("md_string"); + break; + case 10: + return "MD_STR"; + case 11: + this.popState(); + break; + case 12: + this.pushState("string"); + break; + case 13: + yy.getLogger().debug("LEX: POPPING STR:", yy_.yytext); + this.popState(); + break; + case 14: + yy.getLogger().debug("LEX: STR end:", yy_.yytext); + return "STR"; + case 15: + yy_.yytext = yy_.yytext.replace(/space\:/, ""); + yy.getLogger().debug("SPACE NUM (LEX)", yy_.yytext); + return 21; + case 16: + yy_.yytext = "1"; + yy.getLogger().debug("COLUMNS (LEX)", yy_.yytext); + return 21; + case 17: + return 43; + case 18: + return "LINKSTYLE"; + case 19: + return "INTERPOLATE"; + case 20: + this.pushState("CLASSDEF"); + return 40; + case 21: + this.popState(); + this.pushState("CLASSDEFID"); + return "DEFAULT_CLASSDEF_ID"; + case 22: + this.popState(); + this.pushState("CLASSDEFID"); + return 41; + case 23: + this.popState(); + return 42; + case 24: + this.pushState("CLASS"); + return 44; + case 25: + this.popState(); + this.pushState("CLASS_STYLE"); + return 45; + case 26: + this.popState(); + return 46; + case 27: + this.pushState("STYLE_STMNT"); + return 47; + case 28: + this.popState(); + this.pushState("STYLE_DEFINITION"); + return 48; + case 29: + this.popState(); + return 49; + case 30: + this.pushState("acc_title"); + return "acc_title"; + case 31: + this.popState(); + return "acc_title_value"; + case 32: + this.pushState("acc_descr"); + return "acc_descr"; + case 33: + this.popState(); + return "acc_descr_value"; + case 34: + this.pushState("acc_descr_multiline"); + break; + case 35: + this.popState(); + break; + case 36: + return "acc_descr_multiline_value"; + case 37: + return 30; + case 38: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + case 39: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + case 40: + this.popState(); + yy.getLogger().debug("Lex: ))"); + return "NODE_DEND"; + case 41: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + case 42: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + case 43: + this.popState(); + yy.getLogger().debug("Lex: (-"); + return "NODE_DEND"; + case 44: + this.popState(); + yy.getLogger().debug("Lex: -)"); + return "NODE_DEND"; + case 45: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + case 46: + this.popState(); + yy.getLogger().debug("Lex: ]]"); + return "NODE_DEND"; + case 47: + this.popState(); + yy.getLogger().debug("Lex: ("); + return "NODE_DEND"; + case 48: + this.popState(); + yy.getLogger().debug("Lex: ])"); + return "NODE_DEND"; + case 49: + this.popState(); + yy.getLogger().debug("Lex: /]"); + return "NODE_DEND"; + case 50: + this.popState(); + yy.getLogger().debug("Lex: /]"); + return "NODE_DEND"; + case 51: + this.popState(); + yy.getLogger().debug("Lex: )]"); + return "NODE_DEND"; + case 52: + this.popState(); + yy.getLogger().debug("Lex: )"); + return "NODE_DEND"; + case 53: + this.popState(); + yy.getLogger().debug("Lex: ]>"); + return "NODE_DEND"; + case 54: + this.popState(); + yy.getLogger().debug("Lex: ]"); + return "NODE_DEND"; + case 55: + yy.getLogger().debug("Lexa: -)"); + this.pushState("NODE"); + return 36; + case 56: + yy.getLogger().debug("Lexa: (-"); + this.pushState("NODE"); + return 36; + case 57: + yy.getLogger().debug("Lexa: ))"); + this.pushState("NODE"); + return 36; + case 58: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 36; + case 59: + yy.getLogger().debug("Lex: ((("); + this.pushState("NODE"); + return 36; + case 60: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 36; + case 61: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 36; + case 62: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 36; + case 63: + yy.getLogger().debug("Lexc: >"); + this.pushState("NODE"); + return 36; + case 64: + yy.getLogger().debug("Lexa: (["); + this.pushState("NODE"); + return 36; + case 65: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 36; + case 66: + this.pushState("NODE"); + return 36; + case 67: + this.pushState("NODE"); + return 36; + case 68: + this.pushState("NODE"); + return 36; + case 69: + this.pushState("NODE"); + return 36; + case 70: + this.pushState("NODE"); + return 36; + case 71: + this.pushState("NODE"); + return 36; + case 72: + this.pushState("NODE"); + return 36; + case 73: + yy.getLogger().debug("Lexa: ["); + this.pushState("NODE"); + return 36; + case 74: + this.pushState("BLOCK_ARROW"); + yy.getLogger().debug("LEX ARR START"); + return 38; + case 75: + yy.getLogger().debug("Lex: NODE_ID", yy_.yytext); + return 32; + case 76: + yy.getLogger().debug("Lex: EOF", yy_.yytext); + return 8; + case 77: + this.pushState("md_string"); + break; + case 78: + this.pushState("md_string"); + break; + case 79: + return "NODE_DESCR"; + case 80: + this.popState(); + break; + case 81: + yy.getLogger().debug("Lex: Starting string"); + this.pushState("string"); + break; + case 82: + yy.getLogger().debug("LEX ARR: Starting string"); + this.pushState("string"); + break; + case 83: + yy.getLogger().debug("LEX: NODE_DESCR:", yy_.yytext); + return "NODE_DESCR"; + case 84: + yy.getLogger().debug("LEX POPPING"); + this.popState(); + break; + case 85: + yy.getLogger().debug("Lex: =>BAE"); + this.pushState("ARROW_DIR"); + break; + case 86: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (right): dir:", yy_.yytext); + return "DIR"; + case 87: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (left):", yy_.yytext); + return "DIR"; + case 88: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (x):", yy_.yytext); + return "DIR"; + case 89: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (y):", yy_.yytext); + return "DIR"; + case 90: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (up):", yy_.yytext); + return "DIR"; + case 91: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (down):", yy_.yytext); + return "DIR"; + case 92: + yy_.yytext = "]>"; + yy.getLogger().debug("Lex (ARROW_DIR end):", yy_.yytext); + this.popState(); + this.popState(); + return "BLOCK_ARROW_END"; + case 93: + yy.getLogger().debug("Lex: LINK", "#" + yy_.yytext + "#"); + return 15; + case 94: + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + case 95: + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + case 96: + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + case 97: + yy.getLogger().debug("Lex: START_LINK", yy_.yytext); + this.pushState("LLABEL"); + return 16; + case 98: + yy.getLogger().debug("Lex: START_LINK", yy_.yytext); + this.pushState("LLABEL"); + return 16; + case 99: + yy.getLogger().debug("Lex: START_LINK", yy_.yytext); + this.pushState("LLABEL"); + return 16; + case 100: + this.pushState("md_string"); + break; + case 101: + yy.getLogger().debug("Lex: Starting string"); + this.pushState("string"); + return "LINK_LABEL"; + case 102: + this.popState(); + yy.getLogger().debug("Lex: LINK", "#" + yy_.yytext + "#"); + return 15; + case 103: + this.popState(); + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + case 104: + this.popState(); + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + case 105: + yy.getLogger().debug("Lex: COLON", yy_.yytext); + yy_.yytext = yy_.yytext.slice(1); + return 27; + } + }, + rules: [/^(?:block-beta\b)/, /^(?:block\s+)/, /^(?:block\n+)/, /^(?:block:)/, /^(?:[\s]+)/, /^(?:[\n]+)/, /^(?:((\u000D\u000A)|(\u000A)))/, /^(?:columns\s+auto\b)/, /^(?:columns\s+[\d]+)/, /^(?:["][`])/, /^(?:[^`"]+)/, /^(?:[`]["])/, /^(?:["])/, /^(?:["])/, /^(?:[^"]*)/, /^(?:space[:]\d+)/, /^(?:space\b)/, /^(?:default\b)/, /^(?:linkStyle\b)/, /^(?:interpolate\b)/, /^(?:classDef\s+)/, /^(?:DEFAULT\s+)/, /^(?:\w+\s+)/, /^(?:[^\n]*)/, /^(?:class\s+)/, /^(?:(\w+)+((,\s*\w+)*))/, /^(?:[^\n]*)/, /^(?:style\s+)/, /^(?:(\w+)+((,\s*\w+)*))/, /^(?:[^\n]*)/, /^(?:accTitle\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*\{\s*)/, /^(?:[\}])/, /^(?:[^\}]*)/, /^(?:end\b\s*)/, /^(?:\(\(\()/, /^(?:\)\)\))/, /^(?:[\)]\))/, /^(?:\}\})/, /^(?:\})/, /^(?:\(-)/, /^(?:-\))/, /^(?:\(\()/, /^(?:\]\])/, /^(?:\()/, /^(?:\]\))/, /^(?:\\\])/, /^(?:\/\])/, /^(?:\)\])/, /^(?:[\)])/, /^(?:\]>)/, /^(?:[\]])/, /^(?:-\))/, /^(?:\(-)/, /^(?:\)\))/, /^(?:\))/, /^(?:\(\(\()/, /^(?:\(\()/, /^(?:\{\{)/, /^(?:\{)/, /^(?:>)/, /^(?:\(\[)/, /^(?:\()/, /^(?:\[\[)/, /^(?:\[\|)/, /^(?:\[\()/, /^(?:\)\)\))/, /^(?:\[\\)/, /^(?:\[\/)/, /^(?:\[\\)/, /^(?:\[)/, /^(?:<\[)/, /^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/, /^(?:$)/, /^(?:["][`])/, /^(?:["][`])/, /^(?:[^`"]+)/, /^(?:[`]["])/, /^(?:["])/, /^(?:["])/, /^(?:[^"]+)/, /^(?:["])/, /^(?:\]>\s*\()/, /^(?:,?\s*right\s*)/, /^(?:,?\s*left\s*)/, /^(?:,?\s*x\s*)/, /^(?:,?\s*y\s*)/, /^(?:,?\s*up\s*)/, /^(?:,?\s*down\s*)/, /^(?:\)\s*)/, /^(?:\s*[xo<]?--+[-xo>]\s*)/, /^(?:\s*[xo<]?==+[=xo>]\s*)/, /^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/, /^(?:\s*~~[\~]+\s*)/, /^(?:\s*[xo<]?--\s*)/, /^(?:\s*[xo<]?==\s*)/, /^(?:\s*[xo<]?-\.\s*)/, /^(?:["][`])/, /^(?:["])/, /^(?:\s*[xo<]?--+[-xo>]\s*)/, /^(?:\s*[xo<]?==+[=xo>]\s*)/, /^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/, /^(?::\d+)/], + conditions: { "STYLE_DEFINITION": { "rules": [29], "inclusive": false }, "STYLE_STMNT": { "rules": [28], "inclusive": false }, "CLASSDEFID": { "rules": [23], "inclusive": false }, "CLASSDEF": { "rules": [21, 22], "inclusive": false }, "CLASS_STYLE": { "rules": [26], "inclusive": false }, "CLASS": { "rules": [25], "inclusive": false }, "LLABEL": { "rules": [100, 101, 102, 103, 104], "inclusive": false }, "ARROW_DIR": { "rules": [86, 87, 88, 89, 90, 91, 92], "inclusive": false }, "BLOCK_ARROW": { "rules": [77, 82, 85], "inclusive": false }, "NODE": { "rules": [38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 78, 81], "inclusive": false }, "md_string": { "rules": [10, 11, 79, 80], "inclusive": false }, "space": { "rules": [], "inclusive": false }, "string": { "rules": [13, 14, 83, 84], "inclusive": false }, "acc_descr_multiline": { "rules": [35, 36], "inclusive": false }, "acc_descr": { "rules": [33], "inclusive": false }, "acc_title": { "rules": [31], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 15, 16, 17, 18, 19, 20, 24, 27, 30, 32, 34, 37, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 93, 94, 95, 96, 97, 98, 99, 105], "inclusive": true } } + }; + return lexer2; + }(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +}(); +parser.parser = parser; +const parser$1 = parser; +let blockDatabase = {}; +let edgeList = []; +let edgeCount = {}; +const COLOR_KEYWORD = "color"; +const FILL_KEYWORD = "fill"; +const BG_FILL = "bgFill"; +const STYLECLASS_SEP = ","; +const config = getConfig(); +let classes = {}; +const sanitizeText = (txt) => common.sanitizeText(txt, config); +const addStyleClass = function(id, styleAttributes = "") { + if (classes[id] === void 0) { + classes[id] = { id, styles: [], textStyles: [] }; + } + const foundClass = classes[id]; + if (styleAttributes !== void 0 && styleAttributes !== null) { + styleAttributes.split(STYLECLASS_SEP).forEach((attrib) => { + const fixedAttrib = attrib.replace(/([^;]*);/, "$1").trim(); + if (attrib.match(COLOR_KEYWORD)) { + const newStyle1 = fixedAttrib.replace(FILL_KEYWORD, BG_FILL); + const newStyle2 = newStyle1.replace(COLOR_KEYWORD, FILL_KEYWORD); + foundClass.textStyles.push(newStyle2); + } + foundClass.styles.push(fixedAttrib); + }); + } +}; +const addStyle2Node = function(id, styles = "") { + const foundBlock = blockDatabase[id]; + if (styles !== void 0 && styles !== null) { + foundBlock.styles = styles.split(STYLECLASS_SEP); + } +}; +const setCssClass = function(itemIds, cssClassName) { + itemIds.split(",").forEach(function(id) { + let foundBlock = blockDatabase[id]; + if (foundBlock === void 0) { + const trimmedId = id.trim(); + blockDatabase[trimmedId] = { id: trimmedId, type: "na", children: [] }; + foundBlock = blockDatabase[trimmedId]; + } + if (!foundBlock.classes) { + foundBlock.classes = []; + } + foundBlock.classes.push(cssClassName); + }); +}; +const populateBlockDatabase = (_blockList, parent) => { + const blockList = _blockList.flat(); + const children = []; + for (const block of blockList) { + if (block.label) { + block.label = sanitizeText(block.label); + } + if (block.type === "classDef") { + addStyleClass(block.id, block.css); + continue; + } + if (block.type === "applyClass") { + setCssClass(block.id, (block == null ? void 0 : block.styleClass) || ""); + continue; + } + if (block.type === "applyStyles") { + if (block == null ? void 0 : block.stylesStr) { + addStyle2Node(block.id, block == null ? void 0 : block.stylesStr); + } + continue; + } + if (block.type === "column-setting") { + parent.columns = block.columns || -1; + } else if (block.type === "edge") { + if (edgeCount[block.id]) { + edgeCount[block.id]++; + } else { + edgeCount[block.id] = 1; + } + block.id = edgeCount[block.id] + "-" + block.id; + edgeList.push(block); + } else { + if (!block.label) { + if (block.type === "composite") { + block.label = ""; + } else { + block.label = block.id; + } + } + const newBlock = !blockDatabase[block.id]; + if (newBlock) { + blockDatabase[block.id] = block; + } else { + if (block.type !== "na") { + blockDatabase[block.id].type = block.type; + } + if (block.label !== block.id) { + blockDatabase[block.id].label = block.label; + } + } + if (block.children) { + populateBlockDatabase(block.children, block); + } + if (block.type === "space") { + const w = block.width || 1; + for (let j = 0; j < w; j++) { + const newBlock2 = clone(block); + newBlock2.id = newBlock2.id + "-" + j; + blockDatabase[newBlock2.id] = newBlock2; + children.push(newBlock2); + } + } else if (newBlock) { + children.push(block); + } + } + } + parent.children = children; +}; +let blocks = []; +let rootBlock = { id: "root", type: "composite", children: [], columns: -1 }; +const clear = () => { + log.debug("Clear called"); + clear$1(); + rootBlock = { id: "root", type: "composite", children: [], columns: -1 }; + blockDatabase = { root: rootBlock }; + blocks = []; + classes = {}; + edgeList = []; + edgeCount = {}; +}; +function typeStr2Type(typeStr) { + log.debug("typeStr2Type", typeStr); + switch (typeStr) { + case "[]": + return "square"; + case "()": + log.debug("we have a round"); + return "round"; + case "(())": + return "circle"; + case ">]": + return "rect_left_inv_arrow"; + case "{}": + return "diamond"; + case "{{}}": + return "hexagon"; + case "([])": + return "stadium"; + case "[[]]": + return "subroutine"; + case "[()]": + return "cylinder"; + case "((()))": + return "doublecircle"; + case "[//]": + return "lean_right"; + case "[\\\\]": + return "lean_left"; + case "[/\\]": + return "trapezoid"; + case "[\\/]": + return "inv_trapezoid"; + case "<[]>": + return "block_arrow"; + default: + return "na"; + } +} +function edgeTypeStr2Type(typeStr) { + log.debug("typeStr2Type", typeStr); + switch (typeStr) { + case "==": + return "thick"; + default: + return "normal"; + } +} +function edgeStrToEdgeData(typeStr) { + switch (typeStr.trim()) { + case "--x": + return "arrow_cross"; + case "--o": + return "arrow_circle"; + default: + return "arrow_point"; + } +} +let cnt = 0; +const generateId = () => { + cnt++; + return "id-" + Math.random().toString(36).substr(2, 12) + "-" + cnt; +}; +const setHierarchy = (block) => { + rootBlock.children = block; + populateBlockDatabase(block, rootBlock); + blocks = rootBlock.children; +}; +const getColumns = (blockId) => { + const block = blockDatabase[blockId]; + if (!block) { + return -1; + } + if (block.columns) { + return block.columns; + } + if (!block.children) { + return -1; + } + return block.children.length; +}; +const getBlocksFlat = () => { + return [...Object.values(blockDatabase)]; +}; +const getBlocks = () => { + return blocks || []; +}; +const getEdges = () => { + return edgeList; +}; +const getBlock = (id) => { + return blockDatabase[id]; +}; +const setBlock = (block) => { + blockDatabase[block.id] = block; +}; +const getLogger = () => console; +const getClasses$1 = function() { + return classes; +}; +const db = { + getConfig: () => getConfig$1().block, + typeStr2Type, + edgeTypeStr2Type, + edgeStrToEdgeData, + getLogger, + getBlocksFlat, + getBlocks, + getEdges, + setHierarchy, + getBlock, + setBlock, + getColumns, + getClasses: getClasses$1, + clear, + generateId +}; +const db$1 = db; +const fade = (color, opacity) => { + const channel = khroma.channel; + const r = channel(color, "r"); + const g = channel(color, "g"); + const b = channel(color, "b"); + return khroma.rgba(r, g, b, opacity); +}; +const getStyles = (options) => `.label { + font-family: ${options.fontFamily}; + color: ${options.nodeTextColor || options.textColor}; + } + .cluster-label text { + fill: ${options.titleColor}; + } + .cluster-label span,p { + color: ${options.titleColor}; + } + + + + .label text,span,p { + fill: ${options.nodeTextColor || options.textColor}; + color: ${options.nodeTextColor || options.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; + stroke-width: 1px; + } + .flowchart-label text { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${options.arrowheadColor}; + } + + .edgePath .path { + stroke: ${options.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${options.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${options.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${options.edgeLabelBackground}; + fill: ${options.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${fade(options.edgeLabelBackground, 0.5)}; + // background-color: + } + + .node .cluster { + // fill: ${fade(options.mainBkg, 0.5)}; + fill: ${fade(options.clusterBkg, 0.5)}; + stroke: ${fade(options.clusterBorder, 0.2)}; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + stroke-width: 1px; + } + + .cluster text { + fill: ${options.titleColor}; + } + + .cluster span,p { + color: ${options.titleColor}; + } + /* .cluster div { + color: ${options.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${options.fontFamily}; + font-size: 12px; + background: ${options.tertiaryColor}; + border: 1px solid ${options.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${options.textColor}; + } +`; +const flowStyles = getStyles; +function getNodeFromBlock(block, db2, positioned = false) { + var _a2, _b2, _c; + const vertex = block; + let classStr = "default"; + if ((((_a2 = vertex == null ? void 0 : vertex.classes) == null ? void 0 : _a2.length) || 0) > 0) { + classStr = ((vertex == null ? void 0 : vertex.classes) || []).join(" "); + } + classStr = classStr + " flowchart-label"; + let radius = 0; + let shape = ""; + let padding2; + switch (vertex.type) { + case "round": + radius = 5; + shape = "rect"; + break; + case "composite": + radius = 0; + shape = "composite"; + padding2 = 0; + break; + case "square": + shape = "rect"; + break; + case "diamond": + shape = "question"; + break; + case "hexagon": + shape = "hexagon"; + break; + case "block_arrow": + shape = "block_arrow"; + break; + case "odd": + shape = "rect_left_inv_arrow"; + break; + case "lean_right": + shape = "lean_right"; + break; + case "lean_left": + shape = "lean_left"; + break; + case "trapezoid": + shape = "trapezoid"; + break; + case "inv_trapezoid": + shape = "inv_trapezoid"; + break; + case "rect_left_inv_arrow": + shape = "rect_left_inv_arrow"; + break; + case "circle": + shape = "circle"; + break; + case "ellipse": + shape = "ellipse"; + break; + case "stadium": + shape = "stadium"; + break; + case "subroutine": + shape = "subroutine"; + break; + case "cylinder": + shape = "cylinder"; + break; + case "group": + shape = "rect"; + break; + case "doublecircle": + shape = "doublecircle"; + break; + default: + shape = "rect"; + } + const styles = getStylesFromArray((vertex == null ? void 0 : vertex.styles) || []); + const vertexText = vertex.label; + const bounds = vertex.size || { width: 0, height: 0, x: 0, y: 0 }; + const node = { + labelStyle: styles.labelStyle, + shape, + labelText: vertexText, + rx: radius, + ry: radius, + class: classStr, + style: styles.style, + id: vertex.id, + directions: vertex.directions, + width: bounds.width, + height: bounds.height, + x: bounds.x, + y: bounds.y, + positioned, + intersect: void 0, + type: vertex.type, + padding: padding2 ?? (((_c = (_b2 = getConfig$1()) == null ? void 0 : _b2.block) == null ? void 0 : _c.padding) || 0) + }; + return node; +} +async function calculateBlockSize(elem, block, db2) { + const node = getNodeFromBlock(block, db2, false); + if (node.type === "group") { + return; + } + const nodeEl = await insertNode(elem, node); + const boundingBox = nodeEl.node().getBBox(); + const obj = db2.getBlock(node.id); + obj.size = { width: boundingBox.width, height: boundingBox.height, x: 0, y: 0, node: nodeEl }; + db2.setBlock(obj); + nodeEl.remove(); +} +async function insertBlockPositioned(elem, block, db2) { + const node = getNodeFromBlock(block, db2, true); + const obj = db2.getBlock(node.id); + if (obj.type !== "space") { + await insertNode(elem, node); + block.intersect = node == null ? void 0 : node.intersect; + positionNode(node); + } +} +async function performOperations(elem, blocks2, db2, operation) { + for (const block of blocks2) { + await operation(elem, block, db2); + if (block.children) { + await performOperations(elem, block.children, db2, operation); + } + } +} +async function calculateBlockSizes(elem, blocks2, db2) { + await performOperations(elem, blocks2, db2, calculateBlockSize); +} +async function insertBlocks(elem, blocks2, db2) { + await performOperations(elem, blocks2, db2, insertBlockPositioned); +} +async function insertEdges(elem, edges, blocks2, db2, id) { + const g = new graphlib.Graph({ + multigraph: true, + compound: true + }); + g.setGraph({ + rankdir: "TB", + nodesep: 10, + ranksep: 10, + marginx: 8, + marginy: 8 + }); + for (const block of blocks2) { + if (block.size) { + g.setNode(block.id, { + width: block.size.width, + height: block.size.height, + intersect: block.intersect + }); + } + } + for (const edge of edges) { + if (edge.start && edge.end) { + const startBlock = db2.getBlock(edge.start); + const endBlock = db2.getBlock(edge.end); + if ((startBlock == null ? void 0 : startBlock.size) && (endBlock == null ? void 0 : endBlock.size)) { + const start = startBlock.size; + const end = endBlock.size; + const points = [ + { x: start.x, y: start.y }, + { x: start.x + (end.x - start.x) / 2, y: start.y + (end.y - start.y) / 2 }, + { x: end.x, y: end.y } + ]; + await insertEdge( + elem, + { v: edge.start, w: edge.end, name: edge.id }, + { + ...edge, + arrowTypeEnd: edge.arrowTypeEnd, + arrowTypeStart: edge.arrowTypeStart, + points, + classes: "edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1" + }, + void 0, + "block", + g, + id + ); + if (edge.label) { + await insertEdgeLabel(elem, { + ...edge, + label: edge.label, + labelStyle: "stroke: #333; stroke-width: 1.5px;fill:none;", + arrowTypeEnd: edge.arrowTypeEnd, + arrowTypeStart: edge.arrowTypeStart, + points, + classes: "edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1" + }); + await positionEdgeLabel( + { ...edge, x: points[1].x, y: points[1].y }, + { + originalPath: points + } + ); + } + } + } + } +} +const padding = ((_b = (_a = getConfig()) == null ? void 0 : _a.block) == null ? void 0 : _b.padding) || 8; +function calculateBlockPosition(columns, position) { + if (columns === 0 || !Number.isInteger(columns)) { + throw new Error("Columns must be an integer !== 0."); + } + if (position < 0 || !Number.isInteger(position)) { + throw new Error("Position must be a non-negative integer." + position); + } + if (columns < 0) { + return { px: position, py: 0 }; + } + if (columns === 1) { + return { px: 0, py: position }; + } + const px = position % columns; + const py = Math.floor(position / columns); + return { px, py }; +} +const getMaxChildSize = (block) => { + let maxWidth = 0; + let maxHeight = 0; + for (const child of block.children) { + const { width, height, x, y } = child.size || { width: 0, height: 0, x: 0, y: 0 }; + log.debug( + "getMaxChildSize abc95 child:", + child.id, + "width:", + width, + "height:", + height, + "x:", + x, + "y:", + y, + child.type + ); + if (child.type === "space") { + continue; + } + if (width > maxWidth) { + maxWidth = width / (block.widthInColumns || 1); + } + if (height > maxHeight) { + maxHeight = height; + } + } + return { width: maxWidth, height: maxHeight }; +}; +function setBlockSizes(block, db2, siblingWidth = 0, siblingHeight = 0) { + var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j, _k; + log.debug( + "setBlockSizes abc95 (start)", + block.id, + (_a2 = block == null ? void 0 : block.size) == null ? void 0 : _a2.x, + "block width =", + block == null ? void 0 : block.size, + "sieblingWidth", + siblingWidth + ); + if (!((_b2 = block == null ? void 0 : block.size) == null ? void 0 : _b2.width)) { + block.size = { + width: siblingWidth, + height: siblingHeight, + x: 0, + y: 0 + }; + } + let maxWidth = 0; + let maxHeight = 0; + if (((_c = block.children) == null ? void 0 : _c.length) > 0) { + for (const child of block.children) { + setBlockSizes(child, db2); + } + const childSize = getMaxChildSize(block); + maxWidth = childSize.width; + maxHeight = childSize.height; + log.debug("setBlockSizes abc95 maxWidth of", block.id, ":s children is ", maxWidth, maxHeight); + for (const child of block.children) { + if (child.size) { + log.debug( + `abc95 Setting size of children of ${block.id} id=${child.id} ${maxWidth} ${maxHeight} ${child.size}` + ); + child.size.width = maxWidth * (child.widthInColumns || 1) + padding * ((child.widthInColumns || 1) - 1); + child.size.height = maxHeight; + child.size.x = 0; + child.size.y = 0; + log.debug( + `abc95 updating size of ${block.id} children child:${child.id} maxWidth:${maxWidth} maxHeight:${maxHeight}` + ); + } + } + for (const child of block.children) { + setBlockSizes(child, db2, maxWidth, maxHeight); + } + const columns = block.columns || -1; + let numItems = 0; + for (const child of block.children) { + numItems += child.widthInColumns || 1; + } + let xSize = block.children.length; + if (columns > 0 && columns < numItems) { + xSize = columns; + } + block.widthInColumns || 1; + const ySize = Math.ceil(numItems / xSize); + let width = xSize * (maxWidth + padding) + padding; + let height = ySize * (maxHeight + padding) + padding; + if (width < siblingWidth) { + log.debug( + `Detected to small siebling: abc95 ${block.id} sieblingWidth ${siblingWidth} sieblingHeight ${siblingHeight} width ${width}` + ); + width = siblingWidth; + height = siblingHeight; + const childWidth = (siblingWidth - xSize * padding - padding) / xSize; + const childHeight = (siblingHeight - ySize * padding - padding) / ySize; + log.debug("Size indata abc88", block.id, "childWidth", childWidth, "maxWidth", maxWidth); + log.debug("Size indata abc88", block.id, "childHeight", childHeight, "maxHeight", maxHeight); + log.debug("Size indata abc88 xSize", xSize, "padding", padding); + for (const child of block.children) { + if (child.size) { + child.size.width = childWidth; + child.size.height = childHeight; + child.size.x = 0; + child.size.y = 0; + } + } + } + log.debug( + `abc95 (finale calc) ${block.id} xSize ${xSize} ySize ${ySize} columns ${columns}${block.children.length} width=${Math.max(width, ((_d = block.size) == null ? void 0 : _d.width) || 0)}` + ); + if (width < (((_e = block == null ? void 0 : block.size) == null ? void 0 : _e.width) || 0)) { + width = ((_f = block == null ? void 0 : block.size) == null ? void 0 : _f.width) || 0; + const num = columns > 0 ? Math.min(block.children.length, columns) : block.children.length; + if (num > 0) { + const childWidth = (width - num * padding - padding) / num; + log.debug("abc95 (growing to fit) width", block.id, width, (_g = block.size) == null ? void 0 : _g.width, childWidth); + for (const child of block.children) { + if (child.size) { + child.size.width = childWidth; + } + } + } + } + block.size = { + width, + height, + x: 0, + y: 0 + }; + } + log.debug( + "setBlockSizes abc94 (done)", + block.id, + (_h = block == null ? void 0 : block.size) == null ? void 0 : _h.x, + (_i = block == null ? void 0 : block.size) == null ? void 0 : _i.width, + (_j = block == null ? void 0 : block.size) == null ? void 0 : _j.y, + (_k = block == null ? void 0 : block.size) == null ? void 0 : _k.height + ); +} +function layoutBlocks(block, db2) { + var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q; + log.debug( + `abc85 layout blocks (=>layoutBlocks) ${block.id} x: ${(_a2 = block == null ? void 0 : block.size) == null ? void 0 : _a2.x} y: ${(_b2 = block == null ? void 0 : block.size) == null ? void 0 : _b2.y} width: ${(_c = block == null ? void 0 : block.size) == null ? void 0 : _c.width}` + ); + const columns = block.columns || -1; + log.debug("layoutBlocks columns abc95", block.id, "=>", columns, block); + if (block.children && // find max width of children + block.children.length > 0) { + const width = ((_e = (_d = block == null ? void 0 : block.children[0]) == null ? void 0 : _d.size) == null ? void 0 : _e.width) || 0; + const widthOfChildren = block.children.length * width + (block.children.length - 1) * padding; + log.debug("widthOfChildren 88", widthOfChildren, "posX"); + let columnPos = 0; + log.debug("abc91 block?.size?.x", block.id, (_f = block == null ? void 0 : block.size) == null ? void 0 : _f.x); + let startingPosX = ((_g = block == null ? void 0 : block.size) == null ? void 0 : _g.x) ? ((_h = block == null ? void 0 : block.size) == null ? void 0 : _h.x) + (-((_i = block == null ? void 0 : block.size) == null ? void 0 : _i.width) / 2 || 0) : -padding; + let rowPos = 0; + for (const child of block.children) { + const parent = block; + if (!child.size) { + continue; + } + const { width: width2, height } = child.size; + const { px, py } = calculateBlockPosition(columns, columnPos); + if (py != rowPos) { + rowPos = py; + startingPosX = ((_j = block == null ? void 0 : block.size) == null ? void 0 : _j.x) ? ((_k = block == null ? void 0 : block.size) == null ? void 0 : _k.x) + (-((_l = block == null ? void 0 : block.size) == null ? void 0 : _l.width) / 2 || 0) : -padding; + log.debug("New row in layout for block", block.id, " and child ", child.id, rowPos); + } + log.debug( + `abc89 layout blocks (child) id: ${child.id} Pos: ${columnPos} (px, py) ${px},${py} (${(_m = parent == null ? void 0 : parent.size) == null ? void 0 : _m.x},${(_n = parent == null ? void 0 : parent.size) == null ? void 0 : _n.y}) parent: ${parent.id} width: ${width2}${padding}` + ); + if (parent.size) { + const halfWidth = width2 / 2; + child.size.x = startingPosX + padding + halfWidth; + log.debug( + `abc91 layout blocks (calc) px, pyid:${child.id} startingPos=X${startingPosX} new startingPosX${child.size.x} ${halfWidth} padding=${padding} width=${width2} halfWidth=${halfWidth} => x:${child.size.x} y:${child.size.y} ${child.widthInColumns} (width * (child?.w || 1)) / 2 ${width2 * ((child == null ? void 0 : child.widthInColumns) || 1) / 2}` + ); + startingPosX = child.size.x + halfWidth; + child.size.y = parent.size.y - parent.size.height / 2 + py * (height + padding) + height / 2 + padding; + log.debug( + `abc88 layout blocks (calc) px, pyid:${child.id}startingPosX${startingPosX}${padding}${halfWidth}=>x:${child.size.x}y:${child.size.y}${child.widthInColumns}(width * (child?.w || 1)) / 2${width2 * ((child == null ? void 0 : child.widthInColumns) || 1) / 2}` + ); + } + if (child.children) { + layoutBlocks(child); + } + columnPos += (child == null ? void 0 : child.widthInColumns) || 1; + log.debug("abc88 columnsPos", child, columnPos); + } + } + log.debug( + `layout blocks (<==layoutBlocks) ${block.id} x: ${(_o = block == null ? void 0 : block.size) == null ? void 0 : _o.x} y: ${(_p = block == null ? void 0 : block.size) == null ? void 0 : _p.y} width: ${(_q = block == null ? void 0 : block.size) == null ? void 0 : _q.width}` + ); +} +function findBounds(block, { minX, minY, maxX, maxY } = { minX: 0, minY: 0, maxX: 0, maxY: 0 }) { + if (block.size && block.id !== "root") { + const { x, y, width, height } = block.size; + if (x - width / 2 < minX) { + minX = x - width / 2; + } + if (y - height / 2 < minY) { + minY = y - height / 2; + } + if (x + width / 2 > maxX) { + maxX = x + width / 2; + } + if (y + height / 2 > maxY) { + maxY = y + height / 2; + } + } + if (block.children) { + for (const child of block.children) { + ({ minX, minY, maxX, maxY } = findBounds(child, { minX, minY, maxX, maxY })); + } + } + return { minX, minY, maxX, maxY }; +} +function layout(db2) { + const root = db2.getBlock("root"); + if (!root) { + return; + } + setBlockSizes(root, db2, 0, 0); + layoutBlocks(root); + log.debug("getBlocks", JSON.stringify(root, null, 2)); + const { minX, minY, maxX, maxY } = findBounds(root); + const height = maxY - minY; + const width = maxX - minX; + return { x: minX, y: minY, width, height }; +} +const getClasses = function(text, diagObj) { + return diagObj.db.getClasses(); +}; +const draw = async function(text, id, _version, diagObj) { + const { securityLevel, block: conf } = getConfig$1(); + const db2 = diagObj.db; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = select("#i" + id); + } + const root = securityLevel === "sandbox" ? select(sandboxElement.nodes()[0].contentDocument.body) : select("body"); + const svg = securityLevel === "sandbox" ? root.select(`[id="${id}"]`) : select(`[id="${id}"]`); + const markers = ["point", "circle", "cross"]; + insertMarkers(svg, markers, diagObj.type, id); + const bl = db2.getBlocks(); + const blArr = db2.getBlocksFlat(); + const edges = db2.getEdges(); + const nodes = svg.insert("g").attr("class", "block"); + await calculateBlockSizes(nodes, bl, db2); + const bounds = layout(db2); + await insertBlocks(nodes, bl, db2); + await insertEdges(nodes, edges, blArr, db2, id); + if (bounds) { + const bounds2 = bounds; + const magicFactor = Math.max(1, Math.round(0.125 * (bounds2.width / bounds2.height))); + const height = bounds2.height + magicFactor + 10; + const width = bounds2.width + 10; + const { useMaxWidth } = conf; + configureSvgSize(svg, height, width, !!useMaxWidth); + log.debug("Here Bounds", bounds, bounds2); + svg.attr( + "viewBox", + `${bounds2.x - 5} ${bounds2.y - 5} ${bounds2.width + 10} ${bounds2.height + 10}` + ); + } + scaleOrdinal(schemeTableau10); +}; +const renderer = { + draw, + getClasses +}; +const diagram = { + parser: parser$1, + db: db$1, + renderer, + styles: flowStyles +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/c4Diagram-11725ab3.js b/vs-code-extension/media/mermaid/c4Diagram-11725ab3.js new file mode 100644 index 0000000..8a63044 --- /dev/null +++ b/vs-code-extension/media/mermaid/c4Diagram-11725ab3.js @@ -0,0 +1,1579 @@ +import { s as we, g as Oe, a as Te, b as Re, c as Dt, d as ue, e as De, f as Kt, h as Se, i as wt, j as Nt, l as le, k as Pe, w as Me, m as oe } from "./mermaid-b92f6f74.js"; +import { d as Le, g as Ne } from "./svgDrawCommon-bcac189f.js"; +var Yt = function() { + var e = function(bt, _, x, m) { + for (x = x || {}, m = bt.length; m--; x[bt[m]] = _) + ; + return x; + }, t = [1, 24], r = [1, 25], o = [1, 26], l = [1, 27], n = [1, 28], a = [1, 63], s = [1, 64], i = [1, 65], u = [1, 66], d = [1, 67], f = [1, 68], p = [1, 69], E = [1, 29], O = [1, 30], R = [1, 31], S = [1, 32], L = [1, 33], Y = [1, 34], Q = [1, 35], H = [1, 36], q = [1, 37], G = [1, 38], K = [1, 39], J = [1, 40], Z = [1, 41], $ = [1, 42], tt = [1, 43], et = [1, 44], nt = [1, 45], it = [1, 46], st = [1, 47], at = [1, 48], rt = [1, 50], lt = [1, 51], ot = [1, 52], ct = [1, 53], ht = [1, 54], ut = [1, 55], dt = [1, 56], ft = [1, 57], pt = [1, 58], yt = [1, 59], gt = [1, 60], Ct = [14, 42], Vt = [14, 34, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74], Ot = [12, 14, 34, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74], k = [1, 82], A = [1, 83], C = [1, 84], v = [1, 85], w = [12, 14, 42], ie = [12, 14, 33, 42], Pt = [12, 14, 33, 42, 76, 77, 79, 80], mt = [12, 33], zt = [34, 36, 37, 38, 39, 40, 41, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74], Xt = { + trace: function() { + }, + yy: {}, + symbols_: { error: 2, start: 3, mermaidDoc: 4, direction: 5, direction_tb: 6, direction_bt: 7, direction_rl: 8, direction_lr: 9, graphConfig: 10, C4_CONTEXT: 11, NEWLINE: 12, statements: 13, EOF: 14, C4_CONTAINER: 15, C4_COMPONENT: 16, C4_DYNAMIC: 17, C4_DEPLOYMENT: 18, otherStatements: 19, diagramStatements: 20, otherStatement: 21, title: 22, accDescription: 23, acc_title: 24, acc_title_value: 25, acc_descr: 26, acc_descr_value: 27, acc_descr_multiline_value: 28, boundaryStatement: 29, boundaryStartStatement: 30, boundaryStopStatement: 31, boundaryStart: 32, LBRACE: 33, ENTERPRISE_BOUNDARY: 34, attributes: 35, SYSTEM_BOUNDARY: 36, BOUNDARY: 37, CONTAINER_BOUNDARY: 38, NODE: 39, NODE_L: 40, NODE_R: 41, RBRACE: 42, diagramStatement: 43, PERSON: 44, PERSON_EXT: 45, SYSTEM: 46, SYSTEM_DB: 47, SYSTEM_QUEUE: 48, SYSTEM_EXT: 49, SYSTEM_EXT_DB: 50, SYSTEM_EXT_QUEUE: 51, CONTAINER: 52, CONTAINER_DB: 53, CONTAINER_QUEUE: 54, CONTAINER_EXT: 55, CONTAINER_EXT_DB: 56, CONTAINER_EXT_QUEUE: 57, COMPONENT: 58, COMPONENT_DB: 59, COMPONENT_QUEUE: 60, COMPONENT_EXT: 61, COMPONENT_EXT_DB: 62, COMPONENT_EXT_QUEUE: 63, REL: 64, BIREL: 65, REL_U: 66, REL_D: 67, REL_L: 68, REL_R: 69, REL_B: 70, REL_INDEX: 71, UPDATE_EL_STYLE: 72, UPDATE_REL_STYLE: 73, UPDATE_LAYOUT_CONFIG: 74, attribute: 75, STR: 76, STR_KEY: 77, STR_VALUE: 78, ATTRIBUTE: 79, ATTRIBUTE_EMPTY: 80, $accept: 0, $end: 1 }, + terminals_: { 2: "error", 6: "direction_tb", 7: "direction_bt", 8: "direction_rl", 9: "direction_lr", 11: "C4_CONTEXT", 12: "NEWLINE", 14: "EOF", 15: "C4_CONTAINER", 16: "C4_COMPONENT", 17: "C4_DYNAMIC", 18: "C4_DEPLOYMENT", 22: "title", 23: "accDescription", 24: "acc_title", 25: "acc_title_value", 26: "acc_descr", 27: "acc_descr_value", 28: "acc_descr_multiline_value", 33: "LBRACE", 34: "ENTERPRISE_BOUNDARY", 36: "SYSTEM_BOUNDARY", 37: "BOUNDARY", 38: "CONTAINER_BOUNDARY", 39: "NODE", 40: "NODE_L", 41: "NODE_R", 42: "RBRACE", 44: "PERSON", 45: "PERSON_EXT", 46: "SYSTEM", 47: "SYSTEM_DB", 48: "SYSTEM_QUEUE", 49: "SYSTEM_EXT", 50: "SYSTEM_EXT_DB", 51: "SYSTEM_EXT_QUEUE", 52: "CONTAINER", 53: "CONTAINER_DB", 54: "CONTAINER_QUEUE", 55: "CONTAINER_EXT", 56: "CONTAINER_EXT_DB", 57: "CONTAINER_EXT_QUEUE", 58: "COMPONENT", 59: "COMPONENT_DB", 60: "COMPONENT_QUEUE", 61: "COMPONENT_EXT", 62: "COMPONENT_EXT_DB", 63: "COMPONENT_EXT_QUEUE", 64: "REL", 65: "BIREL", 66: "REL_U", 67: "REL_D", 68: "REL_L", 69: "REL_R", 70: "REL_B", 71: "REL_INDEX", 72: "UPDATE_EL_STYLE", 73: "UPDATE_REL_STYLE", 74: "UPDATE_LAYOUT_CONFIG", 76: "STR", 77: "STR_KEY", 78: "STR_VALUE", 79: "ATTRIBUTE", 80: "ATTRIBUTE_EMPTY" }, + productions_: [0, [3, 1], [3, 1], [5, 1], [5, 1], [5, 1], [5, 1], [4, 1], [10, 4], [10, 4], [10, 4], [10, 4], [10, 4], [13, 1], [13, 1], [13, 2], [19, 1], [19, 2], [19, 3], [21, 1], [21, 1], [21, 2], [21, 2], [21, 1], [29, 3], [30, 3], [30, 3], [30, 4], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [31, 1], [20, 1], [20, 2], [20, 3], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 1], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [35, 1], [35, 2], [75, 1], [75, 2], [75, 1], [75, 1]], + performAction: function(_, x, m, g, T, h, Tt) { + var y = h.length - 1; + switch (T) { + case 3: + g.setDirection("TB"); + break; + case 4: + g.setDirection("BT"); + break; + case 5: + g.setDirection("RL"); + break; + case 6: + g.setDirection("LR"); + break; + case 8: + case 9: + case 10: + case 11: + case 12: + g.setC4Type(h[y - 3]); + break; + case 19: + g.setTitle(h[y].substring(6)), this.$ = h[y].substring(6); + break; + case 20: + g.setAccDescription(h[y].substring(15)), this.$ = h[y].substring(15); + break; + case 21: + this.$ = h[y].trim(), g.setTitle(this.$); + break; + case 22: + case 23: + this.$ = h[y].trim(), g.setAccDescription(this.$); + break; + case 28: + case 29: + h[y].splice(2, 0, "ENTERPRISE"), g.addPersonOrSystemBoundary(...h[y]), this.$ = h[y]; + break; + case 30: + g.addPersonOrSystemBoundary(...h[y]), this.$ = h[y]; + break; + case 31: + h[y].splice(2, 0, "CONTAINER"), g.addContainerBoundary(...h[y]), this.$ = h[y]; + break; + case 32: + g.addDeploymentNode("node", ...h[y]), this.$ = h[y]; + break; + case 33: + g.addDeploymentNode("nodeL", ...h[y]), this.$ = h[y]; + break; + case 34: + g.addDeploymentNode("nodeR", ...h[y]), this.$ = h[y]; + break; + case 35: + g.popBoundaryParseStack(); + break; + case 39: + g.addPersonOrSystem("person", ...h[y]), this.$ = h[y]; + break; + case 40: + g.addPersonOrSystem("external_person", ...h[y]), this.$ = h[y]; + break; + case 41: + g.addPersonOrSystem("system", ...h[y]), this.$ = h[y]; + break; + case 42: + g.addPersonOrSystem("system_db", ...h[y]), this.$ = h[y]; + break; + case 43: + g.addPersonOrSystem("system_queue", ...h[y]), this.$ = h[y]; + break; + case 44: + g.addPersonOrSystem("external_system", ...h[y]), this.$ = h[y]; + break; + case 45: + g.addPersonOrSystem("external_system_db", ...h[y]), this.$ = h[y]; + break; + case 46: + g.addPersonOrSystem("external_system_queue", ...h[y]), this.$ = h[y]; + break; + case 47: + g.addContainer("container", ...h[y]), this.$ = h[y]; + break; + case 48: + g.addContainer("container_db", ...h[y]), this.$ = h[y]; + break; + case 49: + g.addContainer("container_queue", ...h[y]), this.$ = h[y]; + break; + case 50: + g.addContainer("external_container", ...h[y]), this.$ = h[y]; + break; + case 51: + g.addContainer("external_container_db", ...h[y]), this.$ = h[y]; + break; + case 52: + g.addContainer("external_container_queue", ...h[y]), this.$ = h[y]; + break; + case 53: + g.addComponent("component", ...h[y]), this.$ = h[y]; + break; + case 54: + g.addComponent("component_db", ...h[y]), this.$ = h[y]; + break; + case 55: + g.addComponent("component_queue", ...h[y]), this.$ = h[y]; + break; + case 56: + g.addComponent("external_component", ...h[y]), this.$ = h[y]; + break; + case 57: + g.addComponent("external_component_db", ...h[y]), this.$ = h[y]; + break; + case 58: + g.addComponent("external_component_queue", ...h[y]), this.$ = h[y]; + break; + case 60: + g.addRel("rel", ...h[y]), this.$ = h[y]; + break; + case 61: + g.addRel("birel", ...h[y]), this.$ = h[y]; + break; + case 62: + g.addRel("rel_u", ...h[y]), this.$ = h[y]; + break; + case 63: + g.addRel("rel_d", ...h[y]), this.$ = h[y]; + break; + case 64: + g.addRel("rel_l", ...h[y]), this.$ = h[y]; + break; + case 65: + g.addRel("rel_r", ...h[y]), this.$ = h[y]; + break; + case 66: + g.addRel("rel_b", ...h[y]), this.$ = h[y]; + break; + case 67: + h[y].splice(0, 1), g.addRel("rel", ...h[y]), this.$ = h[y]; + break; + case 68: + g.updateElStyle("update_el_style", ...h[y]), this.$ = h[y]; + break; + case 69: + g.updateRelStyle("update_rel_style", ...h[y]), this.$ = h[y]; + break; + case 70: + g.updateLayoutConfig("update_layout_config", ...h[y]), this.$ = h[y]; + break; + case 71: + this.$ = [h[y]]; + break; + case 72: + h[y].unshift(h[y - 1]), this.$ = h[y]; + break; + case 73: + case 75: + this.$ = h[y].trim(); + break; + case 74: + let Et = {}; + Et[h[y - 1].trim()] = h[y].trim(), this.$ = Et; + break; + case 76: + this.$ = ""; + break; + } + }, + table: [{ 3: 1, 4: 2, 5: 3, 6: [1, 5], 7: [1, 6], 8: [1, 7], 9: [1, 8], 10: 4, 11: [1, 9], 15: [1, 10], 16: [1, 11], 17: [1, 12], 18: [1, 13] }, { 1: [3] }, { 1: [2, 1] }, { 1: [2, 2] }, { 1: [2, 7] }, { 1: [2, 3] }, { 1: [2, 4] }, { 1: [2, 5] }, { 1: [2, 6] }, { 12: [1, 14] }, { 12: [1, 15] }, { 12: [1, 16] }, { 12: [1, 17] }, { 12: [1, 18] }, { 13: 19, 19: 20, 20: 21, 21: 22, 22: t, 23: r, 24: o, 26: l, 28: n, 29: 49, 30: 61, 32: 62, 34: a, 36: s, 37: i, 38: u, 39: d, 40: f, 41: p, 43: 23, 44: E, 45: O, 46: R, 47: S, 48: L, 49: Y, 50: Q, 51: H, 52: q, 53: G, 54: K, 55: J, 56: Z, 57: $, 58: tt, 59: et, 60: nt, 61: it, 62: st, 63: at, 64: rt, 65: lt, 66: ot, 67: ct, 68: ht, 69: ut, 70: dt, 71: ft, 72: pt, 73: yt, 74: gt }, { 13: 70, 19: 20, 20: 21, 21: 22, 22: t, 23: r, 24: o, 26: l, 28: n, 29: 49, 30: 61, 32: 62, 34: a, 36: s, 37: i, 38: u, 39: d, 40: f, 41: p, 43: 23, 44: E, 45: O, 46: R, 47: S, 48: L, 49: Y, 50: Q, 51: H, 52: q, 53: G, 54: K, 55: J, 56: Z, 57: $, 58: tt, 59: et, 60: nt, 61: it, 62: st, 63: at, 64: rt, 65: lt, 66: ot, 67: ct, 68: ht, 69: ut, 70: dt, 71: ft, 72: pt, 73: yt, 74: gt }, { 13: 71, 19: 20, 20: 21, 21: 22, 22: t, 23: r, 24: o, 26: l, 28: n, 29: 49, 30: 61, 32: 62, 34: a, 36: s, 37: i, 38: u, 39: d, 40: f, 41: p, 43: 23, 44: E, 45: O, 46: R, 47: S, 48: L, 49: Y, 50: Q, 51: H, 52: q, 53: G, 54: K, 55: J, 56: Z, 57: $, 58: tt, 59: et, 60: nt, 61: it, 62: st, 63: at, 64: rt, 65: lt, 66: ot, 67: ct, 68: ht, 69: ut, 70: dt, 71: ft, 72: pt, 73: yt, 74: gt }, { 13: 72, 19: 20, 20: 21, 21: 22, 22: t, 23: r, 24: o, 26: l, 28: n, 29: 49, 30: 61, 32: 62, 34: a, 36: s, 37: i, 38: u, 39: d, 40: f, 41: p, 43: 23, 44: E, 45: O, 46: R, 47: S, 48: L, 49: Y, 50: Q, 51: H, 52: q, 53: G, 54: K, 55: J, 56: Z, 57: $, 58: tt, 59: et, 60: nt, 61: it, 62: st, 63: at, 64: rt, 65: lt, 66: ot, 67: ct, 68: ht, 69: ut, 70: dt, 71: ft, 72: pt, 73: yt, 74: gt }, { 13: 73, 19: 20, 20: 21, 21: 22, 22: t, 23: r, 24: o, 26: l, 28: n, 29: 49, 30: 61, 32: 62, 34: a, 36: s, 37: i, 38: u, 39: d, 40: f, 41: p, 43: 23, 44: E, 45: O, 46: R, 47: S, 48: L, 49: Y, 50: Q, 51: H, 52: q, 53: G, 54: K, 55: J, 56: Z, 57: $, 58: tt, 59: et, 60: nt, 61: it, 62: st, 63: at, 64: rt, 65: lt, 66: ot, 67: ct, 68: ht, 69: ut, 70: dt, 71: ft, 72: pt, 73: yt, 74: gt }, { 14: [1, 74] }, e(Ct, [2, 13], { 43: 23, 29: 49, 30: 61, 32: 62, 20: 75, 34: a, 36: s, 37: i, 38: u, 39: d, 40: f, 41: p, 44: E, 45: O, 46: R, 47: S, 48: L, 49: Y, 50: Q, 51: H, 52: q, 53: G, 54: K, 55: J, 56: Z, 57: $, 58: tt, 59: et, 60: nt, 61: it, 62: st, 63: at, 64: rt, 65: lt, 66: ot, 67: ct, 68: ht, 69: ut, 70: dt, 71: ft, 72: pt, 73: yt, 74: gt }), e(Ct, [2, 14]), e(Vt, [2, 16], { 12: [1, 76] }), e(Ct, [2, 36], { 12: [1, 77] }), e(Ot, [2, 19]), e(Ot, [2, 20]), { 25: [1, 78] }, { 27: [1, 79] }, e(Ot, [2, 23]), { 35: 80, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 86, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 87, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 88, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 89, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 90, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 91, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 92, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 93, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 94, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 95, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 96, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 97, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 98, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 99, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 100, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 101, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 102, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 103, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 104, 75: 81, 76: k, 77: A, 79: C, 80: v }, e(w, [2, 59]), { 35: 105, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 106, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 107, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 108, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 109, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 110, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 111, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 112, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 113, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 114, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 115, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 20: 116, 29: 49, 30: 61, 32: 62, 34: a, 36: s, 37: i, 38: u, 39: d, 40: f, 41: p, 43: 23, 44: E, 45: O, 46: R, 47: S, 48: L, 49: Y, 50: Q, 51: H, 52: q, 53: G, 54: K, 55: J, 56: Z, 57: $, 58: tt, 59: et, 60: nt, 61: it, 62: st, 63: at, 64: rt, 65: lt, 66: ot, 67: ct, 68: ht, 69: ut, 70: dt, 71: ft, 72: pt, 73: yt, 74: gt }, { 12: [1, 118], 33: [1, 117] }, { 35: 119, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 120, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 121, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 122, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 123, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 124, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 35: 125, 75: 81, 76: k, 77: A, 79: C, 80: v }, { 14: [1, 126] }, { 14: [1, 127] }, { 14: [1, 128] }, { 14: [1, 129] }, { 1: [2, 8] }, e(Ct, [2, 15]), e(Vt, [2, 17], { 21: 22, 19: 130, 22: t, 23: r, 24: o, 26: l, 28: n }), e(Ct, [2, 37], { 19: 20, 20: 21, 21: 22, 43: 23, 29: 49, 30: 61, 32: 62, 13: 131, 22: t, 23: r, 24: o, 26: l, 28: n, 34: a, 36: s, 37: i, 38: u, 39: d, 40: f, 41: p, 44: E, 45: O, 46: R, 47: S, 48: L, 49: Y, 50: Q, 51: H, 52: q, 53: G, 54: K, 55: J, 56: Z, 57: $, 58: tt, 59: et, 60: nt, 61: it, 62: st, 63: at, 64: rt, 65: lt, 66: ot, 67: ct, 68: ht, 69: ut, 70: dt, 71: ft, 72: pt, 73: yt, 74: gt }), e(Ot, [2, 21]), e(Ot, [2, 22]), e(w, [2, 39]), e(ie, [2, 71], { 75: 81, 35: 132, 76: k, 77: A, 79: C, 80: v }), e(Pt, [2, 73]), { 78: [1, 133] }, e(Pt, [2, 75]), e(Pt, [2, 76]), e(w, [2, 40]), e(w, [2, 41]), e(w, [2, 42]), e(w, [2, 43]), e(w, [2, 44]), e(w, [2, 45]), e(w, [2, 46]), e(w, [2, 47]), e(w, [2, 48]), e(w, [2, 49]), e(w, [2, 50]), e(w, [2, 51]), e(w, [2, 52]), e(w, [2, 53]), e(w, [2, 54]), e(w, [2, 55]), e(w, [2, 56]), e(w, [2, 57]), e(w, [2, 58]), e(w, [2, 60]), e(w, [2, 61]), e(w, [2, 62]), e(w, [2, 63]), e(w, [2, 64]), e(w, [2, 65]), e(w, [2, 66]), e(w, [2, 67]), e(w, [2, 68]), e(w, [2, 69]), e(w, [2, 70]), { 31: 134, 42: [1, 135] }, { 12: [1, 136] }, { 33: [1, 137] }, e(mt, [2, 28]), e(mt, [2, 29]), e(mt, [2, 30]), e(mt, [2, 31]), e(mt, [2, 32]), e(mt, [2, 33]), e(mt, [2, 34]), { 1: [2, 9] }, { 1: [2, 10] }, { 1: [2, 11] }, { 1: [2, 12] }, e(Vt, [2, 18]), e(Ct, [2, 38]), e(ie, [2, 72]), e(Pt, [2, 74]), e(w, [2, 24]), e(w, [2, 35]), e(zt, [2, 25]), e(zt, [2, 26], { 12: [1, 138] }), e(zt, [2, 27])], + defaultActions: { 2: [2, 1], 3: [2, 2], 4: [2, 7], 5: [2, 3], 6: [2, 4], 7: [2, 5], 8: [2, 6], 74: [2, 8], 126: [2, 9], 127: [2, 10], 128: [2, 11], 129: [2, 12] }, + parseError: function(_, x) { + if (x.recoverable) + this.trace(_); + else { + var m = new Error(_); + throw m.hash = x, m; + } + }, + parse: function(_) { + var x = this, m = [0], g = [], T = [null], h = [], Tt = this.table, y = "", Et = 0, se = 0, ke = 2, ae = 1, Ae = h.slice.call(arguments, 1), D = Object.create(this.lexer), kt = { yy: {} }; + for (var Qt in this.yy) + Object.prototype.hasOwnProperty.call(this.yy, Qt) && (kt.yy[Qt] = this.yy[Qt]); + D.setInput(_, kt.yy), kt.yy.lexer = D, kt.yy.parser = this, typeof D.yylloc > "u" && (D.yylloc = {}); + var Ht = D.yylloc; + h.push(Ht); + var Ce = D.options && D.options.ranges; + typeof kt.yy.parseError == "function" ? this.parseError = kt.yy.parseError : this.parseError = Object.getPrototypeOf(this).parseError; + function ve() { + var X; + return X = g.pop() || D.lex() || ae, typeof X != "number" && (X instanceof Array && (g = X, X = g.pop()), X = x.symbols_[X] || X), X; + } + for (var M, At, N, qt, vt = {}, Mt, z, re, Lt; ; ) { + if (At = m[m.length - 1], this.defaultActions[At] ? N = this.defaultActions[At] : ((M === null || typeof M > "u") && (M = ve()), N = Tt[At] && Tt[At][M]), typeof N > "u" || !N.length || !N[0]) { + var Gt = ""; + Lt = []; + for (Mt in Tt[At]) + this.terminals_[Mt] && Mt > ke && Lt.push("'" + this.terminals_[Mt] + "'"); + D.showPosition ? Gt = "Parse error on line " + (Et + 1) + `: +` + D.showPosition() + ` +Expecting ` + Lt.join(", ") + ", got '" + (this.terminals_[M] || M) + "'" : Gt = "Parse error on line " + (Et + 1) + ": Unexpected " + (M == ae ? "end of input" : "'" + (this.terminals_[M] || M) + "'"), this.parseError(Gt, { + text: D.match, + token: this.terminals_[M] || M, + line: D.yylineno, + loc: Ht, + expected: Lt + }); + } + if (N[0] instanceof Array && N.length > 1) + throw new Error("Parse Error: multiple actions possible at state: " + At + ", token: " + M); + switch (N[0]) { + case 1: + m.push(M), T.push(D.yytext), h.push(D.yylloc), m.push(N[1]), M = null, se = D.yyleng, y = D.yytext, Et = D.yylineno, Ht = D.yylloc; + break; + case 2: + if (z = this.productions_[N[1]][1], vt.$ = T[T.length - z], vt._$ = { + first_line: h[h.length - (z || 1)].first_line, + last_line: h[h.length - 1].last_line, + first_column: h[h.length - (z || 1)].first_column, + last_column: h[h.length - 1].last_column + }, Ce && (vt._$.range = [ + h[h.length - (z || 1)].range[0], + h[h.length - 1].range[1] + ]), qt = this.performAction.apply(vt, [ + y, + se, + Et, + kt.yy, + N[1], + T, + h + ].concat(Ae)), typeof qt < "u") + return qt; + z && (m = m.slice(0, -1 * z * 2), T = T.slice(0, -1 * z), h = h.slice(0, -1 * z)), m.push(this.productions_[N[1]][0]), T.push(vt.$), h.push(vt._$), re = Tt[m[m.length - 2]][m[m.length - 1]], m.push(re); + break; + case 3: + return !0; + } + } + return !0; + } + }, Ee = function() { + var bt = { + EOF: 1, + parseError: function(x, m) { + if (this.yy.parser) + this.yy.parser.parseError(x, m); + else + throw new Error(x); + }, + // resets the lexer, sets new input + setInput: function(_, x) { + return this.yy = x || this.yy || {}, this._input = _, this._more = this._backtrack = this.done = !1, this.yylineno = this.yyleng = 0, this.yytext = this.matched = this.match = "", this.conditionStack = ["INITIAL"], this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }, this.options.ranges && (this.yylloc.range = [0, 0]), this.offset = 0, this; + }, + // consumes and returns one char from the input + input: function() { + var _ = this._input[0]; + this.yytext += _, this.yyleng++, this.offset++, this.match += _, this.matched += _; + var x = _.match(/(?:\r\n?|\n).*/g); + return x ? (this.yylineno++, this.yylloc.last_line++) : this.yylloc.last_column++, this.options.ranges && this.yylloc.range[1]++, this._input = this._input.slice(1), _; + }, + // unshifts one char (or a string) into the input + unput: function(_) { + var x = _.length, m = _.split(/(?:\r\n?|\n)/g); + this._input = _ + this._input, this.yytext = this.yytext.substr(0, this.yytext.length - x), this.offset -= x; + var g = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1), this.matched = this.matched.substr(0, this.matched.length - 1), m.length - 1 && (this.yylineno -= m.length - 1); + var T = this.yylloc.range; + return this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: m ? (m.length === g.length ? this.yylloc.first_column : 0) + g[g.length - m.length].length - m[0].length : this.yylloc.first_column - x + }, this.options.ranges && (this.yylloc.range = [T[0], T[0] + this.yyleng - x]), this.yyleng = this.yytext.length, this; + }, + // When called from action, caches matched text and appends it on next action + more: function() { + return this._more = !0, this; + }, + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: function() { + if (this.options.backtrack_lexer) + this._backtrack = !0; + else + return this.parseError("Lexical error on line " + (this.yylineno + 1) + `. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +` + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + return this; + }, + // retain first n characters of the match + less: function(_) { + this.unput(this.match.slice(_)); + }, + // displays already matched input, i.e. for error messages + pastInput: function() { + var _ = this.matched.substr(0, this.matched.length - this.match.length); + return (_.length > 20 ? "..." : "") + _.substr(-20).replace(/\n/g, ""); + }, + // displays upcoming input, i.e. for error messages + upcomingInput: function() { + var _ = this.match; + return _.length < 20 && (_ += this._input.substr(0, 20 - _.length)), (_.substr(0, 20) + (_.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: function() { + var _ = this.pastInput(), x = new Array(_.length + 1).join("-"); + return _ + this.upcomingInput() + ` +` + x + "^"; + }, + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: function(_, x) { + var m, g, T; + if (this.options.backtrack_lexer && (T = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }, this.options.ranges && (T.yylloc.range = this.yylloc.range.slice(0))), g = _[0].match(/(?:\r\n?|\n).*/g), g && (this.yylineno += g.length), this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: g ? g[g.length - 1].length - g[g.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + _[0].length + }, this.yytext += _[0], this.match += _[0], this.matches = _, this.yyleng = this.yytext.length, this.options.ranges && (this.yylloc.range = [this.offset, this.offset += this.yyleng]), this._more = !1, this._backtrack = !1, this._input = this._input.slice(_[0].length), this.matched += _[0], m = this.performAction.call(this, this.yy, this, x, this.conditionStack[this.conditionStack.length - 1]), this.done && this._input && (this.done = !1), m) + return m; + if (this._backtrack) { + for (var h in T) + this[h] = T[h]; + return !1; + } + return !1; + }, + // return next match in input + next: function() { + if (this.done) + return this.EOF; + this._input || (this.done = !0); + var _, x, m, g; + this._more || (this.yytext = "", this.match = ""); + for (var T = this._currentRules(), h = 0; h < T.length; h++) + if (m = this._input.match(this.rules[T[h]]), m && (!x || m[0].length > x[0].length)) { + if (x = m, g = h, this.options.backtrack_lexer) { + if (_ = this.test_match(m, T[h]), _ !== !1) + return _; + if (this._backtrack) { + x = !1; + continue; + } else + return !1; + } else if (!this.options.flex) + break; + } + return x ? (_ = this.test_match(x, T[g]), _ !== !1 ? _ : !1) : this._input === "" ? this.EOF : this.parseError("Lexical error on line " + (this.yylineno + 1) + `. Unrecognized text. +` + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + }, + // return next match that has a token + lex: function() { + var x = this.next(); + return x || this.lex(); + }, + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: function(x) { + this.conditionStack.push(x); + }, + // pop the previously active lexer condition state off the condition stack + popState: function() { + var x = this.conditionStack.length - 1; + return x > 0 ? this.conditionStack.pop() : this.conditionStack[0]; + }, + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: function() { + return this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1] ? this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules : this.conditions.INITIAL.rules; + }, + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: function(x) { + return x = this.conditionStack.length - 1 - Math.abs(x || 0), x >= 0 ? this.conditionStack[x] : "INITIAL"; + }, + // alias for begin(condition) + pushState: function(x) { + this.begin(x); + }, + // return the number of states currently on the stack + stateStackSize: function() { + return this.conditionStack.length; + }, + options: {}, + performAction: function(x, m, g, T) { + switch (g) { + case 0: + return 6; + case 1: + return 7; + case 2: + return 8; + case 3: + return 9; + case 4: + return 22; + case 5: + return 23; + case 6: + return this.begin("acc_title"), 24; + case 7: + return this.popState(), "acc_title_value"; + case 8: + return this.begin("acc_descr"), 26; + case 9: + return this.popState(), "acc_descr_value"; + case 10: + this.begin("acc_descr_multiline"); + break; + case 11: + this.popState(); + break; + case 12: + return "acc_descr_multiline_value"; + case 13: + break; + case 14: + c; + break; + case 15: + return 12; + case 16: + break; + case 17: + return 11; + case 18: + return 15; + case 19: + return 16; + case 20: + return 17; + case 21: + return 18; + case 22: + return this.begin("person_ext"), 45; + case 23: + return this.begin("person"), 44; + case 24: + return this.begin("system_ext_queue"), 51; + case 25: + return this.begin("system_ext_db"), 50; + case 26: + return this.begin("system_ext"), 49; + case 27: + return this.begin("system_queue"), 48; + case 28: + return this.begin("system_db"), 47; + case 29: + return this.begin("system"), 46; + case 30: + return this.begin("boundary"), 37; + case 31: + return this.begin("enterprise_boundary"), 34; + case 32: + return this.begin("system_boundary"), 36; + case 33: + return this.begin("container_ext_queue"), 57; + case 34: + return this.begin("container_ext_db"), 56; + case 35: + return this.begin("container_ext"), 55; + case 36: + return this.begin("container_queue"), 54; + case 37: + return this.begin("container_db"), 53; + case 38: + return this.begin("container"), 52; + case 39: + return this.begin("container_boundary"), 38; + case 40: + return this.begin("component_ext_queue"), 63; + case 41: + return this.begin("component_ext_db"), 62; + case 42: + return this.begin("component_ext"), 61; + case 43: + return this.begin("component_queue"), 60; + case 44: + return this.begin("component_db"), 59; + case 45: + return this.begin("component"), 58; + case 46: + return this.begin("node"), 39; + case 47: + return this.begin("node"), 39; + case 48: + return this.begin("node_l"), 40; + case 49: + return this.begin("node_r"), 41; + case 50: + return this.begin("rel"), 64; + case 51: + return this.begin("birel"), 65; + case 52: + return this.begin("rel_u"), 66; + case 53: + return this.begin("rel_u"), 66; + case 54: + return this.begin("rel_d"), 67; + case 55: + return this.begin("rel_d"), 67; + case 56: + return this.begin("rel_l"), 68; + case 57: + return this.begin("rel_l"), 68; + case 58: + return this.begin("rel_r"), 69; + case 59: + return this.begin("rel_r"), 69; + case 60: + return this.begin("rel_b"), 70; + case 61: + return this.begin("rel_index"), 71; + case 62: + return this.begin("update_el_style"), 72; + case 63: + return this.begin("update_rel_style"), 73; + case 64: + return this.begin("update_layout_config"), 74; + case 65: + return "EOF_IN_STRUCT"; + case 66: + return this.begin("attribute"), "ATTRIBUTE_EMPTY"; + case 67: + this.begin("attribute"); + break; + case 68: + this.popState(), this.popState(); + break; + case 69: + return 80; + case 70: + break; + case 71: + return 80; + case 72: + this.begin("string"); + break; + case 73: + this.popState(); + break; + case 74: + return "STR"; + case 75: + this.begin("string_kv"); + break; + case 76: + return this.begin("string_kv_key"), "STR_KEY"; + case 77: + this.popState(), this.begin("string_kv_value"); + break; + case 78: + return "STR_VALUE"; + case 79: + this.popState(), this.popState(); + break; + case 80: + return "STR"; + case 81: + return "LBRACE"; + case 82: + return "RBRACE"; + case 83: + return "SPACE"; + case 84: + return "EOL"; + case 85: + return 14; + } + }, + rules: [/^(?:.*direction\s+TB[^\n]*)/, /^(?:.*direction\s+BT[^\n]*)/, /^(?:.*direction\s+RL[^\n]*)/, /^(?:.*direction\s+LR[^\n]*)/, /^(?:title\s[^#\n;]+)/, /^(?:accDescription\s[^#\n;]+)/, /^(?:accTitle\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*\{\s*)/, /^(?:[\}])/, /^(?:[^\}]*)/, /^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/, /^(?:%%[^\n]*(\r?\n)*)/, /^(?:\s*(\r?\n)+)/, /^(?:\s+)/, /^(?:C4Context\b)/, /^(?:C4Container\b)/, /^(?:C4Component\b)/, /^(?:C4Dynamic\b)/, /^(?:C4Deployment\b)/, /^(?:Person_Ext\b)/, /^(?:Person\b)/, /^(?:SystemQueue_Ext\b)/, /^(?:SystemDb_Ext\b)/, /^(?:System_Ext\b)/, /^(?:SystemQueue\b)/, /^(?:SystemDb\b)/, /^(?:System\b)/, /^(?:Boundary\b)/, /^(?:Enterprise_Boundary\b)/, /^(?:System_Boundary\b)/, /^(?:ContainerQueue_Ext\b)/, /^(?:ContainerDb_Ext\b)/, /^(?:Container_Ext\b)/, /^(?:ContainerQueue\b)/, /^(?:ContainerDb\b)/, /^(?:Container\b)/, /^(?:Container_Boundary\b)/, /^(?:ComponentQueue_Ext\b)/, /^(?:ComponentDb_Ext\b)/, /^(?:Component_Ext\b)/, /^(?:ComponentQueue\b)/, /^(?:ComponentDb\b)/, /^(?:Component\b)/, /^(?:Deployment_Node\b)/, /^(?:Node\b)/, /^(?:Node_L\b)/, /^(?:Node_R\b)/, /^(?:Rel\b)/, /^(?:BiRel\b)/, /^(?:Rel_Up\b)/, /^(?:Rel_U\b)/, /^(?:Rel_Down\b)/, /^(?:Rel_D\b)/, /^(?:Rel_Left\b)/, /^(?:Rel_L\b)/, /^(?:Rel_Right\b)/, /^(?:Rel_R\b)/, /^(?:Rel_Back\b)/, /^(?:RelIndex\b)/, /^(?:UpdateElementStyle\b)/, /^(?:UpdateRelStyle\b)/, /^(?:UpdateLayoutConfig\b)/, /^(?:$)/, /^(?:[(][ ]*[,])/, /^(?:[(])/, /^(?:[)])/, /^(?:,,)/, /^(?:,)/, /^(?:[ ]*["]["])/, /^(?:[ ]*["])/, /^(?:["])/, /^(?:[^"]*)/, /^(?:[ ]*[\$])/, /^(?:[^=]*)/, /^(?:[=][ ]*["])/, /^(?:[^"]+)/, /^(?:["])/, /^(?:[^,]+)/, /^(?:\{)/, /^(?:\})/, /^(?:[\s]+)/, /^(?:[\n\r]+)/, /^(?:$)/], + conditions: { acc_descr_multiline: { rules: [11, 12], inclusive: !1 }, acc_descr: { rules: [9], inclusive: !1 }, acc_title: { rules: [7], inclusive: !1 }, string_kv_value: { rules: [78, 79], inclusive: !1 }, string_kv_key: { rules: [77], inclusive: !1 }, string_kv: { rules: [76], inclusive: !1 }, string: { rules: [73, 74], inclusive: !1 }, attribute: { rules: [68, 69, 70, 71, 72, 75, 80], inclusive: !1 }, update_layout_config: { rules: [65, 66, 67, 68], inclusive: !1 }, update_rel_style: { rules: [65, 66, 67, 68], inclusive: !1 }, update_el_style: { rules: [65, 66, 67, 68], inclusive: !1 }, rel_b: { rules: [65, 66, 67, 68], inclusive: !1 }, rel_r: { rules: [65, 66, 67, 68], inclusive: !1 }, rel_l: { rules: [65, 66, 67, 68], inclusive: !1 }, rel_d: { rules: [65, 66, 67, 68], inclusive: !1 }, rel_u: { rules: [65, 66, 67, 68], inclusive: !1 }, rel_bi: { rules: [], inclusive: !1 }, rel: { rules: [65, 66, 67, 68], inclusive: !1 }, node_r: { rules: [65, 66, 67, 68], inclusive: !1 }, node_l: { rules: [65, 66, 67, 68], inclusive: !1 }, node: { rules: [65, 66, 67, 68], inclusive: !1 }, index: { rules: [], inclusive: !1 }, rel_index: { rules: [65, 66, 67, 68], inclusive: !1 }, component_ext_queue: { rules: [], inclusive: !1 }, component_ext_db: { rules: [65, 66, 67, 68], inclusive: !1 }, component_ext: { rules: [65, 66, 67, 68], inclusive: !1 }, component_queue: { rules: [65, 66, 67, 68], inclusive: !1 }, component_db: { rules: [65, 66, 67, 68], inclusive: !1 }, component: { rules: [65, 66, 67, 68], inclusive: !1 }, container_boundary: { rules: [65, 66, 67, 68], inclusive: !1 }, container_ext_queue: { rules: [65, 66, 67, 68], inclusive: !1 }, container_ext_db: { rules: [65, 66, 67, 68], inclusive: !1 }, container_ext: { rules: [65, 66, 67, 68], inclusive: !1 }, container_queue: { rules: [65, 66, 67, 68], inclusive: !1 }, container_db: { rules: [65, 66, 67, 68], inclusive: !1 }, container: { rules: [65, 66, 67, 68], inclusive: !1 }, birel: { rules: [65, 66, 67, 68], inclusive: !1 }, system_boundary: { rules: [65, 66, 67, 68], inclusive: !1 }, enterprise_boundary: { rules: [65, 66, 67, 68], inclusive: !1 }, boundary: { rules: [65, 66, 67, 68], inclusive: !1 }, system_ext_queue: { rules: [65, 66, 67, 68], inclusive: !1 }, system_ext_db: { rules: [65, 66, 67, 68], inclusive: !1 }, system_ext: { rules: [65, 66, 67, 68], inclusive: !1 }, system_queue: { rules: [65, 66, 67, 68], inclusive: !1 }, system_db: { rules: [65, 66, 67, 68], inclusive: !1 }, system: { rules: [65, 66, 67, 68], inclusive: !1 }, person_ext: { rules: [65, 66, 67, 68], inclusive: !1 }, person: { rules: [65, 66, 67, 68], inclusive: !1 }, INITIAL: { rules: [0, 1, 2, 3, 4, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 81, 82, 83, 84, 85], inclusive: !0 } } + }; + return bt; + }(); + Xt.lexer = Ee; + function Wt() { + this.yy = {}; + } + return Wt.prototype = Xt, Xt.Parser = Wt, new Wt(); +}(); +Yt.parser = Yt; +const Be = Yt; +let U = [], _t = [""], P = "global", j = "", V = [ + { + alias: "global", + label: { text: "global" }, + type: { text: "global" }, + tags: null, + link: null, + parentBoundary: "" + } +], St = [], te = "", ee = !1, It = 4, jt = 2; +var de; +const Ye = function() { + return de; +}, Ie = function(e) { + de = ue(e, Dt()); +}, je = function(e, t, r, o, l, n, a, s, i) { + if (e == null || t === void 0 || t === null || r === void 0 || r === null || o === void 0 || o === null) + return; + let u = {}; + const d = St.find((f) => f.from === t && f.to === r); + if (d ? u = d : St.push(u), u.type = e, u.from = t, u.to = r, u.label = { text: o }, l == null) + u.techn = { text: "" }; + else if (typeof l == "object") { + let [f, p] = Object.entries(l)[0]; + u[f] = { text: p }; + } else + u.techn = { text: l }; + if (n == null) + u.descr = { text: "" }; + else if (typeof n == "object") { + let [f, p] = Object.entries(n)[0]; + u[f] = { text: p }; + } else + u.descr = { text: n }; + if (typeof a == "object") { + let [f, p] = Object.entries(a)[0]; + u[f] = p; + } else + u.sprite = a; + if (typeof s == "object") { + let [f, p] = Object.entries(s)[0]; + u[f] = p; + } else + u.tags = s; + if (typeof i == "object") { + let [f, p] = Object.entries(i)[0]; + u[f] = p; + } else + u.link = i; + u.wrap = xt(); +}, Ue = function(e, t, r, o, l, n, a) { + if (t === null || r === null) + return; + let s = {}; + const i = U.find((u) => u.alias === t); + if (i && t === i.alias ? s = i : (s.alias = t, U.push(s)), r == null ? s.label = { text: "" } : s.label = { text: r }, o == null) + s.descr = { text: "" }; + else if (typeof o == "object") { + let [u, d] = Object.entries(o)[0]; + s[u] = { text: d }; + } else + s.descr = { text: o }; + if (typeof l == "object") { + let [u, d] = Object.entries(l)[0]; + s[u] = d; + } else + s.sprite = l; + if (typeof n == "object") { + let [u, d] = Object.entries(n)[0]; + s[u] = d; + } else + s.tags = n; + if (typeof a == "object") { + let [u, d] = Object.entries(a)[0]; + s[u] = d; + } else + s.link = a; + s.typeC4Shape = { text: e }, s.parentBoundary = P, s.wrap = xt(); +}, Fe = function(e, t, r, o, l, n, a, s) { + if (t === null || r === null) + return; + let i = {}; + const u = U.find((d) => d.alias === t); + if (u && t === u.alias ? i = u : (i.alias = t, U.push(i)), r == null ? i.label = { text: "" } : i.label = { text: r }, o == null) + i.techn = { text: "" }; + else if (typeof o == "object") { + let [d, f] = Object.entries(o)[0]; + i[d] = { text: f }; + } else + i.techn = { text: o }; + if (l == null) + i.descr = { text: "" }; + else if (typeof l == "object") { + let [d, f] = Object.entries(l)[0]; + i[d] = { text: f }; + } else + i.descr = { text: l }; + if (typeof n == "object") { + let [d, f] = Object.entries(n)[0]; + i[d] = f; + } else + i.sprite = n; + if (typeof a == "object") { + let [d, f] = Object.entries(a)[0]; + i[d] = f; + } else + i.tags = a; + if (typeof s == "object") { + let [d, f] = Object.entries(s)[0]; + i[d] = f; + } else + i.link = s; + i.wrap = xt(), i.typeC4Shape = { text: e }, i.parentBoundary = P; +}, Ve = function(e, t, r, o, l, n, a, s) { + if (t === null || r === null) + return; + let i = {}; + const u = U.find((d) => d.alias === t); + if (u && t === u.alias ? i = u : (i.alias = t, U.push(i)), r == null ? i.label = { text: "" } : i.label = { text: r }, o == null) + i.techn = { text: "" }; + else if (typeof o == "object") { + let [d, f] = Object.entries(o)[0]; + i[d] = { text: f }; + } else + i.techn = { text: o }; + if (l == null) + i.descr = { text: "" }; + else if (typeof l == "object") { + let [d, f] = Object.entries(l)[0]; + i[d] = { text: f }; + } else + i.descr = { text: l }; + if (typeof n == "object") { + let [d, f] = Object.entries(n)[0]; + i[d] = f; + } else + i.sprite = n; + if (typeof a == "object") { + let [d, f] = Object.entries(a)[0]; + i[d] = f; + } else + i.tags = a; + if (typeof s == "object") { + let [d, f] = Object.entries(s)[0]; + i[d] = f; + } else + i.link = s; + i.wrap = xt(), i.typeC4Shape = { text: e }, i.parentBoundary = P; +}, ze = function(e, t, r, o, l) { + if (e === null || t === null) + return; + let n = {}; + const a = V.find((s) => s.alias === e); + if (a && e === a.alias ? n = a : (n.alias = e, V.push(n)), t == null ? n.label = { text: "" } : n.label = { text: t }, r == null) + n.type = { text: "system" }; + else if (typeof r == "object") { + let [s, i] = Object.entries(r)[0]; + n[s] = { text: i }; + } else + n.type = { text: r }; + if (typeof o == "object") { + let [s, i] = Object.entries(o)[0]; + n[s] = i; + } else + n.tags = o; + if (typeof l == "object") { + let [s, i] = Object.entries(l)[0]; + n[s] = i; + } else + n.link = l; + n.parentBoundary = P, n.wrap = xt(), j = P, P = e, _t.push(j); +}, Xe = function(e, t, r, o, l) { + if (e === null || t === null) + return; + let n = {}; + const a = V.find((s) => s.alias === e); + if (a && e === a.alias ? n = a : (n.alias = e, V.push(n)), t == null ? n.label = { text: "" } : n.label = { text: t }, r == null) + n.type = { text: "container" }; + else if (typeof r == "object") { + let [s, i] = Object.entries(r)[0]; + n[s] = { text: i }; + } else + n.type = { text: r }; + if (typeof o == "object") { + let [s, i] = Object.entries(o)[0]; + n[s] = i; + } else + n.tags = o; + if (typeof l == "object") { + let [s, i] = Object.entries(l)[0]; + n[s] = i; + } else + n.link = l; + n.parentBoundary = P, n.wrap = xt(), j = P, P = e, _t.push(j); +}, We = function(e, t, r, o, l, n, a, s) { + if (t === null || r === null) + return; + let i = {}; + const u = V.find((d) => d.alias === t); + if (u && t === u.alias ? i = u : (i.alias = t, V.push(i)), r == null ? i.label = { text: "" } : i.label = { text: r }, o == null) + i.type = { text: "node" }; + else if (typeof o == "object") { + let [d, f] = Object.entries(o)[0]; + i[d] = { text: f }; + } else + i.type = { text: o }; + if (l == null) + i.descr = { text: "" }; + else if (typeof l == "object") { + let [d, f] = Object.entries(l)[0]; + i[d] = { text: f }; + } else + i.descr = { text: l }; + if (typeof a == "object") { + let [d, f] = Object.entries(a)[0]; + i[d] = f; + } else + i.tags = a; + if (typeof s == "object") { + let [d, f] = Object.entries(s)[0]; + i[d] = f; + } else + i.link = s; + i.nodeType = e, i.parentBoundary = P, i.wrap = xt(), j = P, P = t, _t.push(j); +}, Qe = function() { + P = j, _t.pop(), j = _t.pop(), _t.push(j); +}, He = function(e, t, r, o, l, n, a, s, i, u, d) { + let f = U.find((p) => p.alias === t); + if (!(f === void 0 && (f = V.find((p) => p.alias === t), f === void 0))) { + if (r != null) + if (typeof r == "object") { + let [p, E] = Object.entries(r)[0]; + f[p] = E; + } else + f.bgColor = r; + if (o != null) + if (typeof o == "object") { + let [p, E] = Object.entries(o)[0]; + f[p] = E; + } else + f.fontColor = o; + if (l != null) + if (typeof l == "object") { + let [p, E] = Object.entries(l)[0]; + f[p] = E; + } else + f.borderColor = l; + if (n != null) + if (typeof n == "object") { + let [p, E] = Object.entries(n)[0]; + f[p] = E; + } else + f.shadowing = n; + if (a != null) + if (typeof a == "object") { + let [p, E] = Object.entries(a)[0]; + f[p] = E; + } else + f.shape = a; + if (s != null) + if (typeof s == "object") { + let [p, E] = Object.entries(s)[0]; + f[p] = E; + } else + f.sprite = s; + if (i != null) + if (typeof i == "object") { + let [p, E] = Object.entries(i)[0]; + f[p] = E; + } else + f.techn = i; + if (u != null) + if (typeof u == "object") { + let [p, E] = Object.entries(u)[0]; + f[p] = E; + } else + f.legendText = u; + if (d != null) + if (typeof d == "object") { + let [p, E] = Object.entries(d)[0]; + f[p] = E; + } else + f.legendSprite = d; + } +}, qe = function(e, t, r, o, l, n, a) { + const s = St.find((i) => i.from === t && i.to === r); + if (s !== void 0) { + if (o != null) + if (typeof o == "object") { + let [i, u] = Object.entries(o)[0]; + s[i] = u; + } else + s.textColor = o; + if (l != null) + if (typeof l == "object") { + let [i, u] = Object.entries(l)[0]; + s[i] = u; + } else + s.lineColor = l; + if (n != null) + if (typeof n == "object") { + let [i, u] = Object.entries(n)[0]; + s[i] = parseInt(u); + } else + s.offsetX = parseInt(n); + if (a != null) + if (typeof a == "object") { + let [i, u] = Object.entries(a)[0]; + s[i] = parseInt(u); + } else + s.offsetY = parseInt(a); + } +}, Ge = function(e, t, r) { + let o = It, l = jt; + if (typeof t == "object") { + const n = Object.values(t)[0]; + o = parseInt(n); + } else + o = parseInt(t); + if (typeof r == "object") { + const n = Object.values(r)[0]; + l = parseInt(n); + } else + l = parseInt(r); + o >= 1 && (It = o), l >= 1 && (jt = l); +}, Ke = function() { + return It; +}, Je = function() { + return jt; +}, Ze = function() { + return P; +}, $e = function() { + return j; +}, fe = function(e) { + return e == null ? U : U.filter((t) => t.parentBoundary === e); +}, t0 = function(e) { + return U.find((t) => t.alias === e); +}, e0 = function(e) { + return Object.keys(fe(e)); +}, pe = function(e) { + return e == null ? V : V.filter((t) => t.parentBoundary === e); +}, n0 = pe, i0 = function() { + return St; +}, s0 = function() { + return te; +}, a0 = function(e) { + ee = e; +}, xt = function() { + return ee; +}, r0 = function() { + U = [], V = [ + { + alias: "global", + label: { text: "global" }, + type: { text: "global" }, + tags: null, + link: null, + parentBoundary: "" + } + ], j = "", P = "global", _t = [""], St = [], _t = [""], te = "", ee = !1, It = 4, jt = 2; +}, l0 = { + SOLID: 0, + DOTTED: 1, + NOTE: 2, + SOLID_CROSS: 3, + DOTTED_CROSS: 4, + SOLID_OPEN: 5, + DOTTED_OPEN: 6, + LOOP_START: 10, + LOOP_END: 11, + ALT_START: 12, + ALT_ELSE: 13, + ALT_END: 14, + OPT_START: 15, + OPT_END: 16, + ACTIVE_START: 17, + ACTIVE_END: 18, + PAR_START: 19, + PAR_AND: 20, + PAR_END: 21, + RECT_START: 22, + RECT_END: 23, + SOLID_POINT: 24, + DOTTED_POINT: 25 +}, o0 = { + FILLED: 0, + OPEN: 1 +}, c0 = { + LEFTOF: 0, + RIGHTOF: 1, + OVER: 2 +}, h0 = function(e) { + te = ue(e, Dt()); +}, Jt = { + addPersonOrSystem: Ue, + addPersonOrSystemBoundary: ze, + addContainer: Fe, + addContainerBoundary: Xe, + addComponent: Ve, + addDeploymentNode: We, + popBoundaryParseStack: Qe, + addRel: je, + updateElStyle: He, + updateRelStyle: qe, + updateLayoutConfig: Ge, + autoWrap: xt, + setWrap: a0, + getC4ShapeArray: fe, + getC4Shape: t0, + getC4ShapeKeys: e0, + getBoundaries: pe, + getBoundarys: n0, + getCurrentBoundaryParse: Ze, + getParentBoundaryParse: $e, + getRels: i0, + getTitle: s0, + getC4Type: Ye, + getC4ShapeInRow: Ke, + getC4BoundaryInRow: Je, + setAccTitle: we, + getAccTitle: Oe, + getAccDescription: Te, + setAccDescription: Re, + getConfig: () => Dt().c4, + clear: r0, + LINETYPE: l0, + ARROWTYPE: o0, + PLACEMENT: c0, + setTitle: h0, + setC4Type: Ie + // apply, +}, ne = function(e, t) { + return Le(e, t); +}, ye = function(e, t, r, o, l, n) { + const a = e.append("image"); + a.attr("width", t), a.attr("height", r), a.attr("x", o), a.attr("y", l); + let s = n.startsWith("data:image/png;base64") ? n : De.sanitizeUrl(n); + a.attr("xlink:href", s); +}, u0 = (e, t, r) => { + const o = e.append("g"); + let l = 0; + for (let n of t) { + let a = n.textColor ? n.textColor : "#444444", s = n.lineColor ? n.lineColor : "#444444", i = n.offsetX ? parseInt(n.offsetX) : 0, u = n.offsetY ? parseInt(n.offsetY) : 0, d = ""; + if (l === 0) { + let p = o.append("line"); + p.attr("x1", n.startPoint.x), p.attr("y1", n.startPoint.y), p.attr("x2", n.endPoint.x), p.attr("y2", n.endPoint.y), p.attr("stroke-width", "1"), p.attr("stroke", s), p.style("fill", "none"), n.type !== "rel_b" && p.attr("marker-end", "url(" + d + "#arrowhead)"), (n.type === "birel" || n.type === "rel_b") && p.attr("marker-start", "url(" + d + "#arrowend)"), l = -1; + } else { + let p = o.append("path"); + p.attr("fill", "none").attr("stroke-width", "1").attr("stroke", s).attr( + "d", + "Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx", n.startPoint.x).replaceAll("starty", n.startPoint.y).replaceAll( + "controlx", + n.startPoint.x + (n.endPoint.x - n.startPoint.x) / 2 - (n.endPoint.x - n.startPoint.x) / 4 + ).replaceAll("controly", n.startPoint.y + (n.endPoint.y - n.startPoint.y) / 2).replaceAll("stopx", n.endPoint.x).replaceAll("stopy", n.endPoint.y) + ), n.type !== "rel_b" && p.attr("marker-end", "url(" + d + "#arrowhead)"), (n.type === "birel" || n.type === "rel_b") && p.attr("marker-start", "url(" + d + "#arrowend)"); + } + let f = r.messageFont(); + W(r)( + n.label.text, + o, + Math.min(n.startPoint.x, n.endPoint.x) + Math.abs(n.endPoint.x - n.startPoint.x) / 2 + i, + Math.min(n.startPoint.y, n.endPoint.y) + Math.abs(n.endPoint.y - n.startPoint.y) / 2 + u, + n.label.width, + n.label.height, + { fill: a }, + f + ), n.techn && n.techn.text !== "" && (f = r.messageFont(), W(r)( + "[" + n.techn.text + "]", + o, + Math.min(n.startPoint.x, n.endPoint.x) + Math.abs(n.endPoint.x - n.startPoint.x) / 2 + i, + Math.min(n.startPoint.y, n.endPoint.y) + Math.abs(n.endPoint.y - n.startPoint.y) / 2 + r.messageFontSize + 5 + u, + Math.max(n.label.width, n.techn.width), + n.techn.height, + { fill: a, "font-style": "italic" }, + f + )); + } +}, d0 = function(e, t, r) { + const o = e.append("g"); + let l = t.bgColor ? t.bgColor : "none", n = t.borderColor ? t.borderColor : "#444444", a = t.fontColor ? t.fontColor : "black", s = { "stroke-width": 1, "stroke-dasharray": "7.0,7.0" }; + t.nodeType && (s = { "stroke-width": 1 }); + let i = { + x: t.x, + y: t.y, + fill: l, + stroke: n, + width: t.width, + height: t.height, + rx: 2.5, + ry: 2.5, + attrs: s + }; + ne(o, i); + let u = r.boundaryFont(); + u.fontWeight = "bold", u.fontSize = u.fontSize + 2, u.fontColor = a, W(r)( + t.label.text, + o, + t.x, + t.y + t.label.Y, + t.width, + t.height, + { fill: "#444444" }, + u + ), t.type && t.type.text !== "" && (u = r.boundaryFont(), u.fontColor = a, W(r)( + t.type.text, + o, + t.x, + t.y + t.type.Y, + t.width, + t.height, + { fill: "#444444" }, + u + )), t.descr && t.descr.text !== "" && (u = r.boundaryFont(), u.fontSize = u.fontSize - 2, u.fontColor = a, W(r)( + t.descr.text, + o, + t.x, + t.y + t.descr.Y, + t.width, + t.height, + { fill: "#444444" }, + u + )); +}, f0 = function(e, t, r) { + var f; + let o = t.bgColor ? t.bgColor : r[t.typeC4Shape.text + "_bg_color"], l = t.borderColor ? t.borderColor : r[t.typeC4Shape.text + "_border_color"], n = t.fontColor ? t.fontColor : "#FFFFFF", a = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII="; + switch (t.typeC4Shape.text) { + case "person": + a = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII="; + break; + case "external_person": + a = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII="; + break; + } + const s = e.append("g"); + s.attr("class", "person-man"); + const i = Ne(); + switch (t.typeC4Shape.text) { + case "person": + case "external_person": + case "system": + case "external_system": + case "container": + case "external_container": + case "component": + case "external_component": + i.x = t.x, i.y = t.y, i.fill = o, i.width = t.width, i.height = t.height, i.stroke = l, i.rx = 2.5, i.ry = 2.5, i.attrs = { "stroke-width": 0.5 }, ne(s, i); + break; + case "system_db": + case "external_system_db": + case "container_db": + case "external_container_db": + case "component_db": + case "external_component_db": + s.append("path").attr("fill", o).attr("stroke-width", "0.5").attr("stroke", l).attr( + "d", + "Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx", t.x).replaceAll("starty", t.y).replaceAll("half", t.width / 2).replaceAll("height", t.height) + ), s.append("path").attr("fill", "none").attr("stroke-width", "0.5").attr("stroke", l).attr( + "d", + "Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx", t.x).replaceAll("starty", t.y).replaceAll("half", t.width / 2) + ); + break; + case "system_queue": + case "external_system_queue": + case "container_queue": + case "external_container_queue": + case "component_queue": + case "external_component_queue": + s.append("path").attr("fill", o).attr("stroke-width", "0.5").attr("stroke", l).attr( + "d", + "Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx", t.x).replaceAll("starty", t.y).replaceAll("width", t.width).replaceAll("half", t.height / 2) + ), s.append("path").attr("fill", "none").attr("stroke-width", "0.5").attr("stroke", l).attr( + "d", + "Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx", t.x + t.width).replaceAll("starty", t.y).replaceAll("half", t.height / 2) + ); + break; + } + let u = k0(r, t.typeC4Shape.text); + switch (s.append("text").attr("fill", n).attr("font-family", u.fontFamily).attr("font-size", u.fontSize - 2).attr("font-style", "italic").attr("lengthAdjust", "spacing").attr("textLength", t.typeC4Shape.width).attr("x", t.x + t.width / 2 - t.typeC4Shape.width / 2).attr("y", t.y + t.typeC4Shape.Y).text("<<" + t.typeC4Shape.text + ">>"), t.typeC4Shape.text) { + case "person": + case "external_person": + ye( + s, + 48, + 48, + t.x + t.width / 2 - 24, + t.y + t.image.Y, + a + ); + break; + } + let d = r[t.typeC4Shape.text + "Font"](); + return d.fontWeight = "bold", d.fontSize = d.fontSize + 2, d.fontColor = n, W(r)( + t.label.text, + s, + t.x, + t.y + t.label.Y, + t.width, + t.height, + { fill: n }, + d + ), d = r[t.typeC4Shape.text + "Font"](), d.fontColor = n, t.techn && ((f = t.techn) == null ? void 0 : f.text) !== "" ? W(r)( + t.techn.text, + s, + t.x, + t.y + t.techn.Y, + t.width, + t.height, + { fill: n, "font-style": "italic" }, + d + ) : t.type && t.type.text !== "" && W(r)( + t.type.text, + s, + t.x, + t.y + t.type.Y, + t.width, + t.height, + { fill: n, "font-style": "italic" }, + d + ), t.descr && t.descr.text !== "" && (d = r.personFont(), d.fontColor = n, W(r)( + t.descr.text, + s, + t.x, + t.y + t.descr.Y, + t.width, + t.height, + { fill: n }, + d + )), t.height; +}, p0 = function(e) { + e.append("defs").append("symbol").attr("id", "database").attr("fill-rule", "evenodd").attr("clip-rule", "evenodd").append("path").attr("transform", "scale(.5)").attr( + "d", + "M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z" + ); +}, y0 = function(e) { + e.append("defs").append("symbol").attr("id", "computer").attr("width", "24").attr("height", "24").append("path").attr("transform", "scale(.5)").attr( + "d", + "M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z" + ); +}, g0 = function(e) { + e.append("defs").append("symbol").attr("id", "clock").attr("width", "24").attr("height", "24").append("path").attr("transform", "scale(.5)").attr( + "d", + "M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z" + ); +}, b0 = function(e) { + e.append("defs").append("marker").attr("id", "arrowhead").attr("refX", 9).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 12).attr("markerHeight", 12).attr("orient", "auto").append("path").attr("d", "M 0 0 L 10 5 L 0 10 z"); +}, _0 = function(e) { + e.append("defs").append("marker").attr("id", "arrowend").attr("refX", 1).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 12).attr("markerHeight", 12).attr("orient", "auto").append("path").attr("d", "M 10 0 L 0 5 L 10 10 z"); +}, x0 = function(e) { + e.append("defs").append("marker").attr("id", "filled-head").attr("refX", 18).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L14,7 L9,1 Z"); +}, m0 = function(e) { + e.append("defs").append("marker").attr("id", "sequencenumber").attr("refX", 15).attr("refY", 15).attr("markerWidth", 60).attr("markerHeight", 40).attr("orient", "auto").append("circle").attr("cx", 15).attr("cy", 15).attr("r", 6); +}, E0 = function(e) { + const r = e.append("defs").append("marker").attr("id", "crosshead").attr("markerWidth", 15).attr("markerHeight", 8).attr("orient", "auto").attr("refX", 16).attr("refY", 4); + r.append("path").attr("fill", "black").attr("stroke", "#000000").style("stroke-dasharray", "0, 0").attr("stroke-width", "1px").attr("d", "M 9,2 V 6 L16,4 Z"), r.append("path").attr("fill", "none").attr("stroke", "#000000").style("stroke-dasharray", "0, 0").attr("stroke-width", "1px").attr("d", "M 0,1 L 6,7 M 6,1 L 0,7"); +}, k0 = (e, t) => ({ + fontFamily: e[t + "FontFamily"], + fontSize: e[t + "FontSize"], + fontWeight: e[t + "FontWeight"] +}), W = function() { + function e(l, n, a, s, i, u, d) { + const f = n.append("text").attr("x", a + i / 2).attr("y", s + u / 2 + 5).style("text-anchor", "middle").text(l); + o(f, d); + } + function t(l, n, a, s, i, u, d, f) { + const { fontSize: p, fontFamily: E, fontWeight: O } = f, R = l.split(Kt.lineBreakRegex); + for (let S = 0; S < R.length; S++) { + const L = S * p - p * (R.length - 1) / 2, Y = n.append("text").attr("x", a + i / 2).attr("y", s).style("text-anchor", "middle").attr("dominant-baseline", "middle").style("font-size", p).style("font-weight", O).style("font-family", E); + Y.append("tspan").attr("dy", L).text(R[S]).attr("alignment-baseline", "mathematical"), o(Y, d); + } + } + function r(l, n, a, s, i, u, d, f) { + const p = n.append("switch"), O = p.append("foreignObject").attr("x", a).attr("y", s).attr("width", i).attr("height", u).append("xhtml:div").style("display", "table").style("height", "100%").style("width", "100%"); + O.append("div").style("display", "table-cell").style("text-align", "center").style("vertical-align", "middle").text(l), t(l, p, a, s, i, u, d, f), o(O, d); + } + function o(l, n) { + for (const a in n) + n.hasOwnProperty(a) && l.attr(a, n[a]); + } + return function(l) { + return l.textPlacement === "fo" ? r : l.textPlacement === "old" ? e : t; + }; +}(), F = { + drawRect: ne, + drawBoundary: d0, + drawC4Shape: f0, + drawRels: u0, + drawImage: ye, + insertArrowHead: b0, + insertArrowEnd: _0, + insertArrowFilledHead: x0, + insertDynamicNumber: m0, + insertArrowCrossHead: E0, + insertDatabaseIcon: p0, + insertComputerIcon: y0, + insertClockIcon: g0 +}; +let Ut = 0, Ft = 0, ge = 4, Zt = 2; +Yt.yy = Jt; +let b = {}; +class be { + constructor(t) { + this.name = "", this.data = {}, this.data.startx = void 0, this.data.stopx = void 0, this.data.starty = void 0, this.data.stopy = void 0, this.data.widthLimit = void 0, this.nextData = {}, this.nextData.startx = void 0, this.nextData.stopx = void 0, this.nextData.starty = void 0, this.nextData.stopy = void 0, this.nextData.cnt = 0, $t(t.db.getConfig()); + } + setData(t, r, o, l) { + this.nextData.startx = this.data.startx = t, this.nextData.stopx = this.data.stopx = r, this.nextData.starty = this.data.starty = o, this.nextData.stopy = this.data.stopy = l; + } + updateVal(t, r, o, l) { + t[r] === void 0 ? t[r] = o : t[r] = l(o, t[r]); + } + insert(t) { + this.nextData.cnt = this.nextData.cnt + 1; + let r = this.nextData.startx === this.nextData.stopx ? this.nextData.stopx + t.margin : this.nextData.stopx + t.margin * 2, o = r + t.width, l = this.nextData.starty + t.margin * 2, n = l + t.height; + (r >= this.data.widthLimit || o >= this.data.widthLimit || this.nextData.cnt > ge) && (r = this.nextData.startx + t.margin + b.nextLinePaddingX, l = this.nextData.stopy + t.margin * 2, this.nextData.stopx = o = r + t.width, this.nextData.starty = this.nextData.stopy, this.nextData.stopy = n = l + t.height, this.nextData.cnt = 1), t.x = r, t.y = l, this.updateVal(this.data, "startx", r, Math.min), this.updateVal(this.data, "starty", l, Math.min), this.updateVal(this.data, "stopx", o, Math.max), this.updateVal(this.data, "stopy", n, Math.max), this.updateVal(this.nextData, "startx", r, Math.min), this.updateVal(this.nextData, "starty", l, Math.min), this.updateVal(this.nextData, "stopx", o, Math.max), this.updateVal(this.nextData, "stopy", n, Math.max); + } + init(t) { + this.name = "", this.data = { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0, + widthLimit: void 0 + }, this.nextData = { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0, + cnt: 0 + }, $t(t.db.getConfig()); + } + bumpLastMargin(t) { + this.data.stopx += t, this.data.stopy += t; + } +} +const $t = function(e) { + Se(b, e), e.fontFamily && (b.personFontFamily = b.systemFontFamily = b.messageFontFamily = e.fontFamily), e.fontSize && (b.personFontSize = b.systemFontSize = b.messageFontSize = e.fontSize), e.fontWeight && (b.personFontWeight = b.systemFontWeight = b.messageFontWeight = e.fontWeight); +}, Rt = (e, t) => ({ + fontFamily: e[t + "FontFamily"], + fontSize: e[t + "FontSize"], + fontWeight: e[t + "FontWeight"] +}), Bt = (e) => ({ + fontFamily: e.boundaryFontFamily, + fontSize: e.boundaryFontSize, + fontWeight: e.boundaryFontWeight +}), A0 = (e) => ({ + fontFamily: e.messageFontFamily, + fontSize: e.messageFontSize, + fontWeight: e.messageFontWeight +}); +function I(e, t, r, o, l) { + if (!t[e].width) + if (r) + t[e].text = Me(t[e].text, l, o), t[e].textLines = t[e].text.split(Kt.lineBreakRegex).length, t[e].width = l, t[e].height = oe(t[e].text, o); + else { + let n = t[e].text.split(Kt.lineBreakRegex); + t[e].textLines = n.length; + let a = 0; + t[e].height = 0, t[e].width = 0; + for (const s of n) + t[e].width = Math.max( + wt(s, o), + t[e].width + ), a = oe(s, o), t[e].height = t[e].height + a; + } +} +const _e = function(e, t, r) { + t.x = r.data.startx, t.y = r.data.starty, t.width = r.data.stopx - r.data.startx, t.height = r.data.stopy - r.data.starty, t.label.y = b.c4ShapeMargin - 35; + let o = t.wrap && b.wrap, l = Bt(b); + l.fontSize = l.fontSize + 2, l.fontWeight = "bold"; + let n = wt(t.label.text, l); + I("label", t, o, l, n), F.drawBoundary(e, t, b); +}, xe = function(e, t, r, o) { + let l = 0; + for (const n of o) { + l = 0; + const a = r[n]; + let s = Rt(b, a.typeC4Shape.text); + switch (s.fontSize = s.fontSize - 2, a.typeC4Shape.width = wt( + "«" + a.typeC4Shape.text + "»", + s + ), a.typeC4Shape.height = s.fontSize + 2, a.typeC4Shape.Y = b.c4ShapePadding, l = a.typeC4Shape.Y + a.typeC4Shape.height - 4, a.image = { width: 0, height: 0, Y: 0 }, a.typeC4Shape.text) { + case "person": + case "external_person": + a.image.width = 48, a.image.height = 48, a.image.Y = l, l = a.image.Y + a.image.height; + break; + } + a.sprite && (a.image.width = 48, a.image.height = 48, a.image.Y = l, l = a.image.Y + a.image.height); + let i = a.wrap && b.wrap, u = b.width - b.c4ShapePadding * 2, d = Rt(b, a.typeC4Shape.text); + if (d.fontSize = d.fontSize + 2, d.fontWeight = "bold", I("label", a, i, d, u), a.label.Y = l + 8, l = a.label.Y + a.label.height, a.type && a.type.text !== "") { + a.type.text = "[" + a.type.text + "]"; + let E = Rt(b, a.typeC4Shape.text); + I("type", a, i, E, u), a.type.Y = l + 5, l = a.type.Y + a.type.height; + } else if (a.techn && a.techn.text !== "") { + a.techn.text = "[" + a.techn.text + "]"; + let E = Rt(b, a.techn.text); + I("techn", a, i, E, u), a.techn.Y = l + 5, l = a.techn.Y + a.techn.height; + } + let f = l, p = a.label.width; + if (a.descr && a.descr.text !== "") { + let E = Rt(b, a.typeC4Shape.text); + I("descr", a, i, E, u), a.descr.Y = l + 20, l = a.descr.Y + a.descr.height, p = Math.max(a.label.width, a.descr.width), f = l - a.descr.textLines * 5; + } + p = p + b.c4ShapePadding, a.width = Math.max(a.width || b.width, p, b.width), a.height = Math.max(a.height || b.height, f, b.height), a.margin = a.margin || b.c4ShapeMargin, e.insert(a), F.drawC4Shape(t, a, b); + } + e.bumpLastMargin(b.c4ShapeMargin); +}; +class B { + constructor(t, r) { + this.x = t, this.y = r; + } +} +let ce = function(e, t) { + let r = e.x, o = e.y, l = t.x, n = t.y, a = r + e.width / 2, s = o + e.height / 2, i = Math.abs(r - l), u = Math.abs(o - n), d = u / i, f = e.height / e.width, p = null; + return o == n && r < l ? p = new B(r + e.width, s) : o == n && r > l ? p = new B(r, s) : r == l && o < n ? p = new B(a, o + e.height) : r == l && o > n && (p = new B(a, o)), r > l && o < n ? f >= d ? p = new B(r, s + d * e.width / 2) : p = new B( + a - i / u * e.height / 2, + o + e.height + ) : r < l && o < n ? f >= d ? p = new B(r + e.width, s + d * e.width / 2) : p = new B( + a + i / u * e.height / 2, + o + e.height + ) : r < l && o > n ? f >= d ? p = new B(r + e.width, s - d * e.width / 2) : p = new B(a + e.height / 2 * i / u, o) : r > l && o > n && (f >= d ? p = new B(r, s - e.width / 2 * d) : p = new B(a - e.height / 2 * i / u, o)), p; +}, C0 = function(e, t) { + let r = { x: 0, y: 0 }; + r.x = t.x + t.width / 2, r.y = t.y + t.height / 2; + let o = ce(e, r); + r.x = e.x + e.width / 2, r.y = e.y + e.height / 2; + let l = ce(t, r); + return { startPoint: o, endPoint: l }; +}; +const v0 = function(e, t, r, o) { + let l = 0; + for (let n of t) { + l = l + 1; + let a = n.wrap && b.wrap, s = A0(b); + o.db.getC4Type() === "C4Dynamic" && (n.label.text = l + ": " + n.label.text); + let u = wt(n.label.text, s); + I("label", n, a, s, u), n.techn && n.techn.text !== "" && (u = wt(n.techn.text, s), I("techn", n, a, s, u)), n.descr && n.descr.text !== "" && (u = wt(n.descr.text, s), I("descr", n, a, s, u)); + let d = r(n.from), f = r(n.to), p = C0(d, f); + n.startPoint = p.startPoint, n.endPoint = p.endPoint; + } + F.drawRels(e, t, b); +}; +function me(e, t, r, o, l) { + let n = new be(l); + n.data.widthLimit = r.data.widthLimit / Math.min(Zt, o.length); + for (let [a, s] of o.entries()) { + let i = 0; + s.image = { width: 0, height: 0, Y: 0 }, s.sprite && (s.image.width = 48, s.image.height = 48, s.image.Y = i, i = s.image.Y + s.image.height); + let u = s.wrap && b.wrap, d = Bt(b); + if (d.fontSize = d.fontSize + 2, d.fontWeight = "bold", I( + "label", + s, + u, + d, + n.data.widthLimit + ), s.label.Y = i + 8, i = s.label.Y + s.label.height, s.type && s.type.text !== "") { + s.type.text = "[" + s.type.text + "]"; + let O = Bt(b); + I( + "type", + s, + u, + O, + n.data.widthLimit + ), s.type.Y = i + 5, i = s.type.Y + s.type.height; + } + if (s.descr && s.descr.text !== "") { + let O = Bt(b); + O.fontSize = O.fontSize - 2, I( + "descr", + s, + u, + O, + n.data.widthLimit + ), s.descr.Y = i + 20, i = s.descr.Y + s.descr.height; + } + if (a == 0 || a % Zt === 0) { + let O = r.data.startx + b.diagramMarginX, R = r.data.stopy + b.diagramMarginY + i; + n.setData(O, O, R, R); + } else { + let O = n.data.stopx !== n.data.startx ? n.data.stopx + b.diagramMarginX : n.data.startx, R = n.data.starty; + n.setData(O, O, R, R); + } + n.name = s.alias; + let f = l.db.getC4ShapeArray(s.alias), p = l.db.getC4ShapeKeys(s.alias); + p.length > 0 && xe( + n, + e, + f, + p + ), t = s.alias; + let E = l.db.getBoundarys(t); + E.length > 0 && me( + e, + t, + n, + E, + l + ), s.alias !== "global" && _e(e, s, n), r.data.stopy = Math.max( + n.data.stopy + b.c4ShapeMargin, + r.data.stopy + ), r.data.stopx = Math.max( + n.data.stopx + b.c4ShapeMargin, + r.data.stopx + ), Ut = Math.max(Ut, r.data.stopx), Ft = Math.max(Ft, r.data.stopy); + } +} +const w0 = function(e, t, r, o) { + b = Dt().c4; + const l = Dt().securityLevel; + let n; + l === "sandbox" && (n = Nt("#i" + t)); + const a = l === "sandbox" ? Nt(n.nodes()[0].contentDocument.body) : Nt("body"); + let s = o.db; + o.db.setWrap(b.wrap), ge = s.getC4ShapeInRow(), Zt = s.getC4BoundaryInRow(), le.debug(`C:${JSON.stringify(b, null, 2)}`); + const i = l === "sandbox" ? a.select(`[id="${t}"]`) : Nt(`[id="${t}"]`); + F.insertComputerIcon(i), F.insertDatabaseIcon(i), F.insertClockIcon(i); + let u = new be(o); + u.setData( + b.diagramMarginX, + b.diagramMarginX, + b.diagramMarginY, + b.diagramMarginY + ), u.data.widthLimit = screen.availWidth, Ut = b.diagramMarginX, Ft = b.diagramMarginY; + const d = o.db.getTitle(); + let f = o.db.getBoundarys(""); + me(i, "", u, f, o), F.insertArrowHead(i), F.insertArrowEnd(i), F.insertArrowCrossHead(i), F.insertArrowFilledHead(i), v0(i, o.db.getRels(), o.db.getC4Shape, o), u.data.stopx = Ut, u.data.stopy = Ft; + const p = u.data; + let O = p.stopy - p.starty + 2 * b.diagramMarginY; + const S = p.stopx - p.startx + 2 * b.diagramMarginX; + d && i.append("text").text(d).attr("x", (p.stopx - p.startx) / 2 - 4 * b.diagramMarginX).attr("y", p.starty + b.diagramMarginY), Pe(i, O, S, b.useMaxWidth); + const L = d ? 60 : 0; + i.attr( + "viewBox", + p.startx - b.diagramMarginX + " -" + (b.diagramMarginY + L) + " " + S + " " + (O + L) + ), le.debug("models:", p); +}, he = { + drawPersonOrSystemArray: xe, + drawBoundary: _e, + setConf: $t, + draw: w0 +}, O0 = (e) => `.person { + stroke: ${e.personBorder}; + fill: ${e.personBkg}; + } +`, T0 = O0, S0 = { + parser: Be, + db: Jt, + renderer: he, + styles: T0, + init: ({ c4: e, wrap: t }) => { + he.setConf(e), Jt.setWrap(t); + } +}; +export { + S0 as diagram +}; diff --git a/vs-code-extension/media/mermaid/c4Diagram-5c061bbf.js b/vs-code-extension/media/mermaid/c4Diagram-5c061bbf.js new file mode 100644 index 0000000..74bcaef --- /dev/null +++ b/vs-code-extension/media/mermaid/c4Diagram-5c061bbf.js @@ -0,0 +1,2463 @@ +import { s as setAccTitle, g as getAccTitle, a as getAccDescription, b as setAccDescription, c as getConfig, d as sanitizeText, e as dist, f as common, h as assignWithDepth, i as calculateTextWidth, j as d3select, l as log, k as configureSvgSize, w as wrapLabel, m as calculateTextHeight } from "./mermaid-d73f18bb.js"; +import { d as drawRect$1, g as getNoteRect } from "./svgDrawCommon-093cedf0.js"; +var parser = function() { + var o = function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) + ; + return o2; + }, $V0 = [1, 24], $V1 = [1, 25], $V2 = [1, 26], $V3 = [1, 27], $V4 = [1, 28], $V5 = [1, 63], $V6 = [1, 64], $V7 = [1, 65], $V8 = [1, 66], $V9 = [1, 67], $Va = [1, 68], $Vb = [1, 69], $Vc = [1, 29], $Vd = [1, 30], $Ve = [1, 31], $Vf = [1, 32], $Vg = [1, 33], $Vh = [1, 34], $Vi = [1, 35], $Vj = [1, 36], $Vk = [1, 37], $Vl = [1, 38], $Vm = [1, 39], $Vn = [1, 40], $Vo = [1, 41], $Vp = [1, 42], $Vq = [1, 43], $Vr = [1, 44], $Vs = [1, 45], $Vt = [1, 46], $Vu = [1, 47], $Vv = [1, 48], $Vw = [1, 50], $Vx = [1, 51], $Vy = [1, 52], $Vz = [1, 53], $VA = [1, 54], $VB = [1, 55], $VC = [1, 56], $VD = [1, 57], $VE = [1, 58], $VF = [1, 59], $VG = [1, 60], $VH = [14, 42], $VI = [14, 34, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74], $VJ = [12, 14, 34, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74], $VK = [1, 82], $VL = [1, 83], $VM = [1, 84], $VN = [1, 85], $VO = [12, 14, 42], $VP = [12, 14, 33, 42], $VQ = [12, 14, 33, 42, 76, 77, 79, 80], $VR = [12, 33], $VS = [34, 36, 37, 38, 39, 40, 41, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74]; + var parser2 = { + trace: function trace() { + }, + yy: {}, + symbols_: { "error": 2, "start": 3, "mermaidDoc": 4, "direction": 5, "direction_tb": 6, "direction_bt": 7, "direction_rl": 8, "direction_lr": 9, "graphConfig": 10, "C4_CONTEXT": 11, "NEWLINE": 12, "statements": 13, "EOF": 14, "C4_CONTAINER": 15, "C4_COMPONENT": 16, "C4_DYNAMIC": 17, "C4_DEPLOYMENT": 18, "otherStatements": 19, "diagramStatements": 20, "otherStatement": 21, "title": 22, "accDescription": 23, "acc_title": 24, "acc_title_value": 25, "acc_descr": 26, "acc_descr_value": 27, "acc_descr_multiline_value": 28, "boundaryStatement": 29, "boundaryStartStatement": 30, "boundaryStopStatement": 31, "boundaryStart": 32, "LBRACE": 33, "ENTERPRISE_BOUNDARY": 34, "attributes": 35, "SYSTEM_BOUNDARY": 36, "BOUNDARY": 37, "CONTAINER_BOUNDARY": 38, "NODE": 39, "NODE_L": 40, "NODE_R": 41, "RBRACE": 42, "diagramStatement": 43, "PERSON": 44, "PERSON_EXT": 45, "SYSTEM": 46, "SYSTEM_DB": 47, "SYSTEM_QUEUE": 48, "SYSTEM_EXT": 49, "SYSTEM_EXT_DB": 50, "SYSTEM_EXT_QUEUE": 51, "CONTAINER": 52, "CONTAINER_DB": 53, "CONTAINER_QUEUE": 54, "CONTAINER_EXT": 55, "CONTAINER_EXT_DB": 56, "CONTAINER_EXT_QUEUE": 57, "COMPONENT": 58, "COMPONENT_DB": 59, "COMPONENT_QUEUE": 60, "COMPONENT_EXT": 61, "COMPONENT_EXT_DB": 62, "COMPONENT_EXT_QUEUE": 63, "REL": 64, "BIREL": 65, "REL_U": 66, "REL_D": 67, "REL_L": 68, "REL_R": 69, "REL_B": 70, "REL_INDEX": 71, "UPDATE_EL_STYLE": 72, "UPDATE_REL_STYLE": 73, "UPDATE_LAYOUT_CONFIG": 74, "attribute": 75, "STR": 76, "STR_KEY": 77, "STR_VALUE": 78, "ATTRIBUTE": 79, "ATTRIBUTE_EMPTY": 80, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 6: "direction_tb", 7: "direction_bt", 8: "direction_rl", 9: "direction_lr", 11: "C4_CONTEXT", 12: "NEWLINE", 14: "EOF", 15: "C4_CONTAINER", 16: "C4_COMPONENT", 17: "C4_DYNAMIC", 18: "C4_DEPLOYMENT", 22: "title", 23: "accDescription", 24: "acc_title", 25: "acc_title_value", 26: "acc_descr", 27: "acc_descr_value", 28: "acc_descr_multiline_value", 33: "LBRACE", 34: "ENTERPRISE_BOUNDARY", 36: "SYSTEM_BOUNDARY", 37: "BOUNDARY", 38: "CONTAINER_BOUNDARY", 39: "NODE", 40: "NODE_L", 41: "NODE_R", 42: "RBRACE", 44: "PERSON", 45: "PERSON_EXT", 46: "SYSTEM", 47: "SYSTEM_DB", 48: "SYSTEM_QUEUE", 49: "SYSTEM_EXT", 50: "SYSTEM_EXT_DB", 51: "SYSTEM_EXT_QUEUE", 52: "CONTAINER", 53: "CONTAINER_DB", 54: "CONTAINER_QUEUE", 55: "CONTAINER_EXT", 56: "CONTAINER_EXT_DB", 57: "CONTAINER_EXT_QUEUE", 58: "COMPONENT", 59: "COMPONENT_DB", 60: "COMPONENT_QUEUE", 61: "COMPONENT_EXT", 62: "COMPONENT_EXT_DB", 63: "COMPONENT_EXT_QUEUE", 64: "REL", 65: "BIREL", 66: "REL_U", 67: "REL_D", 68: "REL_L", 69: "REL_R", 70: "REL_B", 71: "REL_INDEX", 72: "UPDATE_EL_STYLE", 73: "UPDATE_REL_STYLE", 74: "UPDATE_LAYOUT_CONFIG", 76: "STR", 77: "STR_KEY", 78: "STR_VALUE", 79: "ATTRIBUTE", 80: "ATTRIBUTE_EMPTY" }, + productions_: [0, [3, 1], [3, 1], [5, 1], [5, 1], [5, 1], [5, 1], [4, 1], [10, 4], [10, 4], [10, 4], [10, 4], [10, 4], [13, 1], [13, 1], [13, 2], [19, 1], [19, 2], [19, 3], [21, 1], [21, 1], [21, 2], [21, 2], [21, 1], [29, 3], [30, 3], [30, 3], [30, 4], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [31, 1], [20, 1], [20, 2], [20, 3], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 1], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [35, 1], [35, 2], [75, 1], [75, 2], [75, 1], [75, 1]], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 3: + yy.setDirection("TB"); + break; + case 4: + yy.setDirection("BT"); + break; + case 5: + yy.setDirection("RL"); + break; + case 6: + yy.setDirection("LR"); + break; + case 8: + case 9: + case 10: + case 11: + case 12: + yy.setC4Type($$[$0 - 3]); + break; + case 19: + yy.setTitle($$[$0].substring(6)); + this.$ = $$[$0].substring(6); + break; + case 20: + yy.setAccDescription($$[$0].substring(15)); + this.$ = $$[$0].substring(15); + break; + case 21: + this.$ = $$[$0].trim(); + yy.setTitle(this.$); + break; + case 22: + case 23: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 28: + case 29: + $$[$0].splice(2, 0, "ENTERPRISE"); + yy.addPersonOrSystemBoundary(...$$[$0]); + this.$ = $$[$0]; + break; + case 30: + yy.addPersonOrSystemBoundary(...$$[$0]); + this.$ = $$[$0]; + break; + case 31: + $$[$0].splice(2, 0, "CONTAINER"); + yy.addContainerBoundary(...$$[$0]); + this.$ = $$[$0]; + break; + case 32: + yy.addDeploymentNode("node", ...$$[$0]); + this.$ = $$[$0]; + break; + case 33: + yy.addDeploymentNode("nodeL", ...$$[$0]); + this.$ = $$[$0]; + break; + case 34: + yy.addDeploymentNode("nodeR", ...$$[$0]); + this.$ = $$[$0]; + break; + case 35: + yy.popBoundaryParseStack(); + break; + case 39: + yy.addPersonOrSystem("person", ...$$[$0]); + this.$ = $$[$0]; + break; + case 40: + yy.addPersonOrSystem("external_person", ...$$[$0]); + this.$ = $$[$0]; + break; + case 41: + yy.addPersonOrSystem("system", ...$$[$0]); + this.$ = $$[$0]; + break; + case 42: + yy.addPersonOrSystem("system_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 43: + yy.addPersonOrSystem("system_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 44: + yy.addPersonOrSystem("external_system", ...$$[$0]); + this.$ = $$[$0]; + break; + case 45: + yy.addPersonOrSystem("external_system_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 46: + yy.addPersonOrSystem("external_system_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 47: + yy.addContainer("container", ...$$[$0]); + this.$ = $$[$0]; + break; + case 48: + yy.addContainer("container_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 49: + yy.addContainer("container_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 50: + yy.addContainer("external_container", ...$$[$0]); + this.$ = $$[$0]; + break; + case 51: + yy.addContainer("external_container_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 52: + yy.addContainer("external_container_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 53: + yy.addComponent("component", ...$$[$0]); + this.$ = $$[$0]; + break; + case 54: + yy.addComponent("component_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 55: + yy.addComponent("component_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 56: + yy.addComponent("external_component", ...$$[$0]); + this.$ = $$[$0]; + break; + case 57: + yy.addComponent("external_component_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 58: + yy.addComponent("external_component_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 60: + yy.addRel("rel", ...$$[$0]); + this.$ = $$[$0]; + break; + case 61: + yy.addRel("birel", ...$$[$0]); + this.$ = $$[$0]; + break; + case 62: + yy.addRel("rel_u", ...$$[$0]); + this.$ = $$[$0]; + break; + case 63: + yy.addRel("rel_d", ...$$[$0]); + this.$ = $$[$0]; + break; + case 64: + yy.addRel("rel_l", ...$$[$0]); + this.$ = $$[$0]; + break; + case 65: + yy.addRel("rel_r", ...$$[$0]); + this.$ = $$[$0]; + break; + case 66: + yy.addRel("rel_b", ...$$[$0]); + this.$ = $$[$0]; + break; + case 67: + $$[$0].splice(0, 1); + yy.addRel("rel", ...$$[$0]); + this.$ = $$[$0]; + break; + case 68: + yy.updateElStyle("update_el_style", ...$$[$0]); + this.$ = $$[$0]; + break; + case 69: + yy.updateRelStyle("update_rel_style", ...$$[$0]); + this.$ = $$[$0]; + break; + case 70: + yy.updateLayoutConfig("update_layout_config", ...$$[$0]); + this.$ = $$[$0]; + break; + case 71: + this.$ = [$$[$0]]; + break; + case 72: + $$[$0].unshift($$[$0 - 1]); + this.$ = $$[$0]; + break; + case 73: + case 75: + this.$ = $$[$0].trim(); + break; + case 74: + let kv = {}; + kv[$$[$0 - 1].trim()] = $$[$0].trim(); + this.$ = kv; + break; + case 76: + this.$ = ""; + break; + } + }, + table: [{ 3: 1, 4: 2, 5: 3, 6: [1, 5], 7: [1, 6], 8: [1, 7], 9: [1, 8], 10: 4, 11: [1, 9], 15: [1, 10], 16: [1, 11], 17: [1, 12], 18: [1, 13] }, { 1: [3] }, { 1: [2, 1] }, { 1: [2, 2] }, { 1: [2, 7] }, { 1: [2, 3] }, { 1: [2, 4] }, { 1: [2, 5] }, { 1: [2, 6] }, { 12: [1, 14] }, { 12: [1, 15] }, { 12: [1, 16] }, { 12: [1, 17] }, { 12: [1, 18] }, { 13: 19, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 70, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 71, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 72, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 73, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 14: [1, 74] }, o($VH, [2, 13], { 43: 23, 29: 49, 30: 61, 32: 62, 20: 75, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }), o($VH, [2, 14]), o($VI, [2, 16], { 12: [1, 76] }), o($VH, [2, 36], { 12: [1, 77] }), o($VJ, [2, 19]), o($VJ, [2, 20]), { 25: [1, 78] }, { 27: [1, 79] }, o($VJ, [2, 23]), { 35: 80, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 86, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 87, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 88, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 89, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 90, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 91, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 92, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 93, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 94, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 95, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 96, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 97, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 98, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 99, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 100, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 101, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 102, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 103, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 104, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, o($VO, [2, 59]), { 35: 105, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 106, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 107, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 108, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 109, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 110, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 111, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 112, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 113, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 114, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 115, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 20: 116, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 12: [1, 118], 33: [1, 117] }, { 35: 119, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 120, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 121, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 122, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 123, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 124, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 125, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 14: [1, 126] }, { 14: [1, 127] }, { 14: [1, 128] }, { 14: [1, 129] }, { 1: [2, 8] }, o($VH, [2, 15]), o($VI, [2, 17], { 21: 22, 19: 130, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4 }), o($VH, [2, 37], { 19: 20, 20: 21, 21: 22, 43: 23, 29: 49, 30: 61, 32: 62, 13: 131, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }), o($VJ, [2, 21]), o($VJ, [2, 22]), o($VO, [2, 39]), o($VP, [2, 71], { 75: 81, 35: 132, 76: $VK, 77: $VL, 79: $VM, 80: $VN }), o($VQ, [2, 73]), { 78: [1, 133] }, o($VQ, [2, 75]), o($VQ, [2, 76]), o($VO, [2, 40]), o($VO, [2, 41]), o($VO, [2, 42]), o($VO, [2, 43]), o($VO, [2, 44]), o($VO, [2, 45]), o($VO, [2, 46]), o($VO, [2, 47]), o($VO, [2, 48]), o($VO, [2, 49]), o($VO, [2, 50]), o($VO, [2, 51]), o($VO, [2, 52]), o($VO, [2, 53]), o($VO, [2, 54]), o($VO, [2, 55]), o($VO, [2, 56]), o($VO, [2, 57]), o($VO, [2, 58]), o($VO, [2, 60]), o($VO, [2, 61]), o($VO, [2, 62]), o($VO, [2, 63]), o($VO, [2, 64]), o($VO, [2, 65]), o($VO, [2, 66]), o($VO, [2, 67]), o($VO, [2, 68]), o($VO, [2, 69]), o($VO, [2, 70]), { 31: 134, 42: [1, 135] }, { 12: [1, 136] }, { 33: [1, 137] }, o($VR, [2, 28]), o($VR, [2, 29]), o($VR, [2, 30]), o($VR, [2, 31]), o($VR, [2, 32]), o($VR, [2, 33]), o($VR, [2, 34]), { 1: [2, 9] }, { 1: [2, 10] }, { 1: [2, 11] }, { 1: [2, 12] }, o($VI, [2, 18]), o($VH, [2, 38]), o($VP, [2, 72]), o($VQ, [2, 74]), o($VO, [2, 24]), o($VO, [2, 35]), o($VS, [2, 25]), o($VS, [2, 26], { 12: [1, 138] }), o($VS, [2, 27])], + defaultActions: { 2: [2, 1], 3: [2, 2], 4: [2, 7], 5: [2, 3], 6: [2, 4], 7: [2, 5], 8: [2, 6], 74: [2, 8], 126: [2, 9], 127: [2, 10], 128: [2, 11], 129: [2, 12] }, + parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, + parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + var symbol, state, action, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + var lexer = function() { + var lexer2 = { + EOF: 1, + parseError: function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + // resets the lexer, sets new input + setInput: function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, + // consumes and returns one char from the input + input: function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, + // unshifts one char (or a string) into the input + unput: function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + // When called from action, caches matched text and appends it on next action + more: function() { + this._more = true; + return this; + }, + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, + // retain first n characters of the match + less: function(n) { + this.unput(this.match.slice(n)); + }, + // displays already matched input, i.e. for error messages + pastInput: function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, + // displays upcoming input, i.e. for error messages + upcomingInput: function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: function() { + var pre = this.pastInput(); + var c2 = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c2 + "^"; + }, + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, + // return next match in input + next: function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + // return next match that has a token + lex: function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: function begin(condition) { + this.conditionStack.push(condition); + }, + // pop the previously active lexer condition state off the condition stack + popState: function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + // alias for begin(condition) + pushState: function pushState(condition) { + this.begin(condition); + }, + // return the number of states currently on the stack + stateStackSize: function stateStackSize() { + return this.conditionStack.length; + }, + options: {}, + performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + switch ($avoiding_name_collisions) { + case 0: + return 6; + case 1: + return 7; + case 2: + return 8; + case 3: + return 9; + case 4: + return 22; + case 5: + return 23; + case 6: + this.begin("acc_title"); + return 24; + case 7: + this.popState(); + return "acc_title_value"; + case 8: + this.begin("acc_descr"); + return 26; + case 9: + this.popState(); + return "acc_descr_value"; + case 10: + this.begin("acc_descr_multiline"); + break; + case 11: + this.popState(); + break; + case 12: + return "acc_descr_multiline_value"; + case 13: + break; + case 14: + c; + break; + case 15: + return 12; + case 16: + break; + case 17: + return 11; + case 18: + return 15; + case 19: + return 16; + case 20: + return 17; + case 21: + return 18; + case 22: + this.begin("person_ext"); + return 45; + case 23: + this.begin("person"); + return 44; + case 24: + this.begin("system_ext_queue"); + return 51; + case 25: + this.begin("system_ext_db"); + return 50; + case 26: + this.begin("system_ext"); + return 49; + case 27: + this.begin("system_queue"); + return 48; + case 28: + this.begin("system_db"); + return 47; + case 29: + this.begin("system"); + return 46; + case 30: + this.begin("boundary"); + return 37; + case 31: + this.begin("enterprise_boundary"); + return 34; + case 32: + this.begin("system_boundary"); + return 36; + case 33: + this.begin("container_ext_queue"); + return 57; + case 34: + this.begin("container_ext_db"); + return 56; + case 35: + this.begin("container_ext"); + return 55; + case 36: + this.begin("container_queue"); + return 54; + case 37: + this.begin("container_db"); + return 53; + case 38: + this.begin("container"); + return 52; + case 39: + this.begin("container_boundary"); + return 38; + case 40: + this.begin("component_ext_queue"); + return 63; + case 41: + this.begin("component_ext_db"); + return 62; + case 42: + this.begin("component_ext"); + return 61; + case 43: + this.begin("component_queue"); + return 60; + case 44: + this.begin("component_db"); + return 59; + case 45: + this.begin("component"); + return 58; + case 46: + this.begin("node"); + return 39; + case 47: + this.begin("node"); + return 39; + case 48: + this.begin("node_l"); + return 40; + case 49: + this.begin("node_r"); + return 41; + case 50: + this.begin("rel"); + return 64; + case 51: + this.begin("birel"); + return 65; + case 52: + this.begin("rel_u"); + return 66; + case 53: + this.begin("rel_u"); + return 66; + case 54: + this.begin("rel_d"); + return 67; + case 55: + this.begin("rel_d"); + return 67; + case 56: + this.begin("rel_l"); + return 68; + case 57: + this.begin("rel_l"); + return 68; + case 58: + this.begin("rel_r"); + return 69; + case 59: + this.begin("rel_r"); + return 69; + case 60: + this.begin("rel_b"); + return 70; + case 61: + this.begin("rel_index"); + return 71; + case 62: + this.begin("update_el_style"); + return 72; + case 63: + this.begin("update_rel_style"); + return 73; + case 64: + this.begin("update_layout_config"); + return 74; + case 65: + return "EOF_IN_STRUCT"; + case 66: + this.begin("attribute"); + return "ATTRIBUTE_EMPTY"; + case 67: + this.begin("attribute"); + break; + case 68: + this.popState(); + this.popState(); + break; + case 69: + return 80; + case 70: + break; + case 71: + return 80; + case 72: + this.begin("string"); + break; + case 73: + this.popState(); + break; + case 74: + return "STR"; + case 75: + this.begin("string_kv"); + break; + case 76: + this.begin("string_kv_key"); + return "STR_KEY"; + case 77: + this.popState(); + this.begin("string_kv_value"); + break; + case 78: + return "STR_VALUE"; + case 79: + this.popState(); + this.popState(); + break; + case 80: + return "STR"; + case 81: + return "LBRACE"; + case 82: + return "RBRACE"; + case 83: + return "SPACE"; + case 84: + return "EOL"; + case 85: + return 14; + } + }, + rules: [/^(?:.*direction\s+TB[^\n]*)/, /^(?:.*direction\s+BT[^\n]*)/, /^(?:.*direction\s+RL[^\n]*)/, /^(?:.*direction\s+LR[^\n]*)/, /^(?:title\s[^#\n;]+)/, /^(?:accDescription\s[^#\n;]+)/, /^(?:accTitle\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*\{\s*)/, /^(?:[\}])/, /^(?:[^\}]*)/, /^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/, /^(?:%%[^\n]*(\r?\n)*)/, /^(?:\s*(\r?\n)+)/, /^(?:\s+)/, /^(?:C4Context\b)/, /^(?:C4Container\b)/, /^(?:C4Component\b)/, /^(?:C4Dynamic\b)/, /^(?:C4Deployment\b)/, /^(?:Person_Ext\b)/, /^(?:Person\b)/, /^(?:SystemQueue_Ext\b)/, /^(?:SystemDb_Ext\b)/, /^(?:System_Ext\b)/, /^(?:SystemQueue\b)/, /^(?:SystemDb\b)/, /^(?:System\b)/, /^(?:Boundary\b)/, /^(?:Enterprise_Boundary\b)/, /^(?:System_Boundary\b)/, /^(?:ContainerQueue_Ext\b)/, /^(?:ContainerDb_Ext\b)/, /^(?:Container_Ext\b)/, /^(?:ContainerQueue\b)/, /^(?:ContainerDb\b)/, /^(?:Container\b)/, /^(?:Container_Boundary\b)/, /^(?:ComponentQueue_Ext\b)/, /^(?:ComponentDb_Ext\b)/, /^(?:Component_Ext\b)/, /^(?:ComponentQueue\b)/, /^(?:ComponentDb\b)/, /^(?:Component\b)/, /^(?:Deployment_Node\b)/, /^(?:Node\b)/, /^(?:Node_L\b)/, /^(?:Node_R\b)/, /^(?:Rel\b)/, /^(?:BiRel\b)/, /^(?:Rel_Up\b)/, /^(?:Rel_U\b)/, /^(?:Rel_Down\b)/, /^(?:Rel_D\b)/, /^(?:Rel_Left\b)/, /^(?:Rel_L\b)/, /^(?:Rel_Right\b)/, /^(?:Rel_R\b)/, /^(?:Rel_Back\b)/, /^(?:RelIndex\b)/, /^(?:UpdateElementStyle\b)/, /^(?:UpdateRelStyle\b)/, /^(?:UpdateLayoutConfig\b)/, /^(?:$)/, /^(?:[(][ ]*[,])/, /^(?:[(])/, /^(?:[)])/, /^(?:,,)/, /^(?:,)/, /^(?:[ ]*["]["])/, /^(?:[ ]*["])/, /^(?:["])/, /^(?:[^"]*)/, /^(?:[ ]*[\$])/, /^(?:[^=]*)/, /^(?:[=][ ]*["])/, /^(?:[^"]+)/, /^(?:["])/, /^(?:[^,]+)/, /^(?:\{)/, /^(?:\})/, /^(?:[\s]+)/, /^(?:[\n\r]+)/, /^(?:$)/], + conditions: { "acc_descr_multiline": { "rules": [11, 12], "inclusive": false }, "acc_descr": { "rules": [9], "inclusive": false }, "acc_title": { "rules": [7], "inclusive": false }, "string_kv_value": { "rules": [78, 79], "inclusive": false }, "string_kv_key": { "rules": [77], "inclusive": false }, "string_kv": { "rules": [76], "inclusive": false }, "string": { "rules": [73, 74], "inclusive": false }, "attribute": { "rules": [68, 69, 70, 71, 72, 75, 80], "inclusive": false }, "update_layout_config": { "rules": [65, 66, 67, 68], "inclusive": false }, "update_rel_style": { "rules": [65, 66, 67, 68], "inclusive": false }, "update_el_style": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_b": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_r": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_l": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_d": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_u": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_bi": { "rules": [], "inclusive": false }, "rel": { "rules": [65, 66, 67, 68], "inclusive": false }, "node_r": { "rules": [65, 66, 67, 68], "inclusive": false }, "node_l": { "rules": [65, 66, 67, 68], "inclusive": false }, "node": { "rules": [65, 66, 67, 68], "inclusive": false }, "index": { "rules": [], "inclusive": false }, "rel_index": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_ext_queue": { "rules": [], "inclusive": false }, "component_ext_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "component": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_ext_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_ext_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "container": { "rules": [65, 66, 67, 68], "inclusive": false }, "birel": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "enterprise_boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_ext_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_ext_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "system": { "rules": [65, 66, 67, 68], "inclusive": false }, "person_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "person": { "rules": [65, 66, 67, 68], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 81, 82, 83, 84, 85], "inclusive": true } } + }; + return lexer2; + }(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +}(); +parser.parser = parser; +const parser$1 = parser; +let c4ShapeArray = []; +let boundaryParseStack = [""]; +let currentBoundaryParse = "global"; +let parentBoundaryParse = ""; +let boundaries = [ + { + alias: "global", + label: { text: "global" }, + type: { text: "global" }, + tags: null, + link: null, + parentBoundary: "" + } +]; +let rels = []; +let title = ""; +let wrapEnabled = false; +let c4ShapeInRow$1 = 4; +let c4BoundaryInRow$1 = 2; +var c4Type; +const getC4Type = function() { + return c4Type; +}; +const setC4Type = function(c4TypeParam) { + let sanitizedText = sanitizeText(c4TypeParam, getConfig()); + c4Type = sanitizedText; +}; +const addRel = function(type, from, to, label, techn, descr, sprite, tags, link) { + if (type === void 0 || type === null || from === void 0 || from === null || to === void 0 || to === null || label === void 0 || label === null) { + return; + } + let rel = {}; + const old = rels.find((rel2) => rel2.from === from && rel2.to === to); + if (old) { + rel = old; + } else { + rels.push(rel); + } + rel.type = type; + rel.from = from; + rel.to = to; + rel.label = { text: label }; + if (techn === void 0 || techn === null) { + rel.techn = { text: "" }; + } else { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + rel[key] = { text: value }; + } else { + rel.techn = { text: techn }; + } + } + if (descr === void 0 || descr === null) { + rel.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + rel[key] = { text: value }; + } else { + rel.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + rel[key] = value; + } else { + rel.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + rel[key] = value; + } else { + rel.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + rel[key] = value; + } else { + rel.link = link; + } + rel.wrap = autoWrap(); +}; +const addPersonOrSystem = function(typeC4Shape, alias, label, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let personOrSystem = {}; + const old = c4ShapeArray.find((personOrSystem2) => personOrSystem2.alias === alias); + if (old && alias === old.alias) { + personOrSystem = old; + } else { + personOrSystem.alias = alias; + c4ShapeArray.push(personOrSystem); + } + if (label === void 0 || label === null) { + personOrSystem.label = { text: "" }; + } else { + personOrSystem.label = { text: label }; + } + if (descr === void 0 || descr === null) { + personOrSystem.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + personOrSystem[key] = { text: value }; + } else { + personOrSystem.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + personOrSystem[key] = value; + } else { + personOrSystem.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + personOrSystem[key] = value; + } else { + personOrSystem.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + personOrSystem[key] = value; + } else { + personOrSystem.link = link; + } + personOrSystem.typeC4Shape = { text: typeC4Shape }; + personOrSystem.parentBoundary = currentBoundaryParse; + personOrSystem.wrap = autoWrap(); +}; +const addContainer = function(typeC4Shape, alias, label, techn, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let container = {}; + const old = c4ShapeArray.find((container2) => container2.alias === alias); + if (old && alias === old.alias) { + container = old; + } else { + container.alias = alias; + c4ShapeArray.push(container); + } + if (label === void 0 || label === null) { + container.label = { text: "" }; + } else { + container.label = { text: label }; + } + if (techn === void 0 || techn === null) { + container.techn = { text: "" }; + } else { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + container[key] = { text: value }; + } else { + container.techn = { text: techn }; + } + } + if (descr === void 0 || descr === null) { + container.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + container[key] = { text: value }; + } else { + container.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + container[key] = value; + } else { + container.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + container[key] = value; + } else { + container.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + container[key] = value; + } else { + container.link = link; + } + container.wrap = autoWrap(); + container.typeC4Shape = { text: typeC4Shape }; + container.parentBoundary = currentBoundaryParse; +}; +const addComponent = function(typeC4Shape, alias, label, techn, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let component = {}; + const old = c4ShapeArray.find((component2) => component2.alias === alias); + if (old && alias === old.alias) { + component = old; + } else { + component.alias = alias; + c4ShapeArray.push(component); + } + if (label === void 0 || label === null) { + component.label = { text: "" }; + } else { + component.label = { text: label }; + } + if (techn === void 0 || techn === null) { + component.techn = { text: "" }; + } else { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + component[key] = { text: value }; + } else { + component.techn = { text: techn }; + } + } + if (descr === void 0 || descr === null) { + component.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + component[key] = { text: value }; + } else { + component.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + component[key] = value; + } else { + component.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + component[key] = value; + } else { + component.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + component[key] = value; + } else { + component.link = link; + } + component.wrap = autoWrap(); + component.typeC4Shape = { text: typeC4Shape }; + component.parentBoundary = currentBoundaryParse; +}; +const addPersonOrSystemBoundary = function(alias, label, type, tags, link) { + if (alias === null || label === null) { + return; + } + let boundary = {}; + const old = boundaries.find((boundary2) => boundary2.alias === alias); + if (old && alias === old.alias) { + boundary = old; + } else { + boundary.alias = alias; + boundaries.push(boundary); + } + if (label === void 0 || label === null) { + boundary.label = { text: "" }; + } else { + boundary.label = { text: label }; + } + if (type === void 0 || type === null) { + boundary.type = { text: "system" }; + } else { + if (typeof type === "object") { + let [key, value] = Object.entries(type)[0]; + boundary[key] = { text: value }; + } else { + boundary.type = { text: type }; + } + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + boundary[key] = value; + } else { + boundary.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + boundary[key] = value; + } else { + boundary.link = link; + } + boundary.parentBoundary = currentBoundaryParse; + boundary.wrap = autoWrap(); + parentBoundaryParse = currentBoundaryParse; + currentBoundaryParse = alias; + boundaryParseStack.push(parentBoundaryParse); +}; +const addContainerBoundary = function(alias, label, type, tags, link) { + if (alias === null || label === null) { + return; + } + let boundary = {}; + const old = boundaries.find((boundary2) => boundary2.alias === alias); + if (old && alias === old.alias) { + boundary = old; + } else { + boundary.alias = alias; + boundaries.push(boundary); + } + if (label === void 0 || label === null) { + boundary.label = { text: "" }; + } else { + boundary.label = { text: label }; + } + if (type === void 0 || type === null) { + boundary.type = { text: "container" }; + } else { + if (typeof type === "object") { + let [key, value] = Object.entries(type)[0]; + boundary[key] = { text: value }; + } else { + boundary.type = { text: type }; + } + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + boundary[key] = value; + } else { + boundary.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + boundary[key] = value; + } else { + boundary.link = link; + } + boundary.parentBoundary = currentBoundaryParse; + boundary.wrap = autoWrap(); + parentBoundaryParse = currentBoundaryParse; + currentBoundaryParse = alias; + boundaryParseStack.push(parentBoundaryParse); +}; +const addDeploymentNode = function(nodeType, alias, label, type, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let boundary = {}; + const old = boundaries.find((boundary2) => boundary2.alias === alias); + if (old && alias === old.alias) { + boundary = old; + } else { + boundary.alias = alias; + boundaries.push(boundary); + } + if (label === void 0 || label === null) { + boundary.label = { text: "" }; + } else { + boundary.label = { text: label }; + } + if (type === void 0 || type === null) { + boundary.type = { text: "node" }; + } else { + if (typeof type === "object") { + let [key, value] = Object.entries(type)[0]; + boundary[key] = { text: value }; + } else { + boundary.type = { text: type }; + } + } + if (descr === void 0 || descr === null) { + boundary.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + boundary[key] = { text: value }; + } else { + boundary.descr = { text: descr }; + } + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + boundary[key] = value; + } else { + boundary.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + boundary[key] = value; + } else { + boundary.link = link; + } + boundary.nodeType = nodeType; + boundary.parentBoundary = currentBoundaryParse; + boundary.wrap = autoWrap(); + parentBoundaryParse = currentBoundaryParse; + currentBoundaryParse = alias; + boundaryParseStack.push(parentBoundaryParse); +}; +const popBoundaryParseStack = function() { + currentBoundaryParse = parentBoundaryParse; + boundaryParseStack.pop(); + parentBoundaryParse = boundaryParseStack.pop(); + boundaryParseStack.push(parentBoundaryParse); +}; +const updateElStyle = function(typeC4Shape, elementName, bgColor, fontColor, borderColor, shadowing, shape, sprite, techn, legendText, legendSprite) { + let old = c4ShapeArray.find((element) => element.alias === elementName); + if (old === void 0) { + old = boundaries.find((element) => element.alias === elementName); + if (old === void 0) { + return; + } + } + if (bgColor !== void 0 && bgColor !== null) { + if (typeof bgColor === "object") { + let [key, value] = Object.entries(bgColor)[0]; + old[key] = value; + } else { + old.bgColor = bgColor; + } + } + if (fontColor !== void 0 && fontColor !== null) { + if (typeof fontColor === "object") { + let [key, value] = Object.entries(fontColor)[0]; + old[key] = value; + } else { + old.fontColor = fontColor; + } + } + if (borderColor !== void 0 && borderColor !== null) { + if (typeof borderColor === "object") { + let [key, value] = Object.entries(borderColor)[0]; + old[key] = value; + } else { + old.borderColor = borderColor; + } + } + if (shadowing !== void 0 && shadowing !== null) { + if (typeof shadowing === "object") { + let [key, value] = Object.entries(shadowing)[0]; + old[key] = value; + } else { + old.shadowing = shadowing; + } + } + if (shape !== void 0 && shape !== null) { + if (typeof shape === "object") { + let [key, value] = Object.entries(shape)[0]; + old[key] = value; + } else { + old.shape = shape; + } + } + if (sprite !== void 0 && sprite !== null) { + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + old[key] = value; + } else { + old.sprite = sprite; + } + } + if (techn !== void 0 && techn !== null) { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + old[key] = value; + } else { + old.techn = techn; + } + } + if (legendText !== void 0 && legendText !== null) { + if (typeof legendText === "object") { + let [key, value] = Object.entries(legendText)[0]; + old[key] = value; + } else { + old.legendText = legendText; + } + } + if (legendSprite !== void 0 && legendSprite !== null) { + if (typeof legendSprite === "object") { + let [key, value] = Object.entries(legendSprite)[0]; + old[key] = value; + } else { + old.legendSprite = legendSprite; + } + } +}; +const updateRelStyle = function(typeC4Shape, from, to, textColor, lineColor, offsetX, offsetY) { + const old = rels.find((rel) => rel.from === from && rel.to === to); + if (old === void 0) { + return; + } + if (textColor !== void 0 && textColor !== null) { + if (typeof textColor === "object") { + let [key, value] = Object.entries(textColor)[0]; + old[key] = value; + } else { + old.textColor = textColor; + } + } + if (lineColor !== void 0 && lineColor !== null) { + if (typeof lineColor === "object") { + let [key, value] = Object.entries(lineColor)[0]; + old[key] = value; + } else { + old.lineColor = lineColor; + } + } + if (offsetX !== void 0 && offsetX !== null) { + if (typeof offsetX === "object") { + let [key, value] = Object.entries(offsetX)[0]; + old[key] = parseInt(value); + } else { + old.offsetX = parseInt(offsetX); + } + } + if (offsetY !== void 0 && offsetY !== null) { + if (typeof offsetY === "object") { + let [key, value] = Object.entries(offsetY)[0]; + old[key] = parseInt(value); + } else { + old.offsetY = parseInt(offsetY); + } + } +}; +const updateLayoutConfig = function(typeC4Shape, c4ShapeInRowParam, c4BoundaryInRowParam) { + let c4ShapeInRowValue = c4ShapeInRow$1; + let c4BoundaryInRowValue = c4BoundaryInRow$1; + if (typeof c4ShapeInRowParam === "object") { + const value = Object.values(c4ShapeInRowParam)[0]; + c4ShapeInRowValue = parseInt(value); + } else { + c4ShapeInRowValue = parseInt(c4ShapeInRowParam); + } + if (typeof c4BoundaryInRowParam === "object") { + const value = Object.values(c4BoundaryInRowParam)[0]; + c4BoundaryInRowValue = parseInt(value); + } else { + c4BoundaryInRowValue = parseInt(c4BoundaryInRowParam); + } + if (c4ShapeInRowValue >= 1) { + c4ShapeInRow$1 = c4ShapeInRowValue; + } + if (c4BoundaryInRowValue >= 1) { + c4BoundaryInRow$1 = c4BoundaryInRowValue; + } +}; +const getC4ShapeInRow = function() { + return c4ShapeInRow$1; +}; +const getC4BoundaryInRow = function() { + return c4BoundaryInRow$1; +}; +const getCurrentBoundaryParse = function() { + return currentBoundaryParse; +}; +const getParentBoundaryParse = function() { + return parentBoundaryParse; +}; +const getC4ShapeArray = function(parentBoundary) { + if (parentBoundary === void 0 || parentBoundary === null) { + return c4ShapeArray; + } else { + return c4ShapeArray.filter((personOrSystem) => { + return personOrSystem.parentBoundary === parentBoundary; + }); + } +}; +const getC4Shape = function(alias) { + return c4ShapeArray.find((personOrSystem) => personOrSystem.alias === alias); +}; +const getC4ShapeKeys = function(parentBoundary) { + return Object.keys(getC4ShapeArray(parentBoundary)); +}; +const getBoundaries = function(parentBoundary) { + if (parentBoundary === void 0 || parentBoundary === null) { + return boundaries; + } else { + return boundaries.filter((boundary) => boundary.parentBoundary === parentBoundary); + } +}; +const getBoundarys = getBoundaries; +const getRels = function() { + return rels; +}; +const getTitle = function() { + return title; +}; +const setWrap = function(wrapSetting) { + wrapEnabled = wrapSetting; +}; +const autoWrap = function() { + return wrapEnabled; +}; +const clear = function() { + c4ShapeArray = []; + boundaries = [ + { + alias: "global", + label: { text: "global" }, + type: { text: "global" }, + tags: null, + link: null, + parentBoundary: "" + } + ]; + parentBoundaryParse = ""; + currentBoundaryParse = "global"; + boundaryParseStack = [""]; + rels = []; + boundaryParseStack = [""]; + title = ""; + wrapEnabled = false; + c4ShapeInRow$1 = 4; + c4BoundaryInRow$1 = 2; +}; +const LINETYPE = { + SOLID: 0, + DOTTED: 1, + NOTE: 2, + SOLID_CROSS: 3, + DOTTED_CROSS: 4, + SOLID_OPEN: 5, + DOTTED_OPEN: 6, + LOOP_START: 10, + LOOP_END: 11, + ALT_START: 12, + ALT_ELSE: 13, + ALT_END: 14, + OPT_START: 15, + OPT_END: 16, + ACTIVE_START: 17, + ACTIVE_END: 18, + PAR_START: 19, + PAR_AND: 20, + PAR_END: 21, + RECT_START: 22, + RECT_END: 23, + SOLID_POINT: 24, + DOTTED_POINT: 25 +}; +const ARROWTYPE = { + FILLED: 0, + OPEN: 1 +}; +const PLACEMENT = { + LEFTOF: 0, + RIGHTOF: 1, + OVER: 2 +}; +const setTitle = function(txt) { + let sanitizedText = sanitizeText(txt, getConfig()); + title = sanitizedText; +}; +const db = { + addPersonOrSystem, + addPersonOrSystemBoundary, + addContainer, + addContainerBoundary, + addComponent, + addDeploymentNode, + popBoundaryParseStack, + addRel, + updateElStyle, + updateRelStyle, + updateLayoutConfig, + autoWrap, + setWrap, + getC4ShapeArray, + getC4Shape, + getC4ShapeKeys, + getBoundaries, + getBoundarys, + getCurrentBoundaryParse, + getParentBoundaryParse, + getRels, + getTitle, + getC4Type, + getC4ShapeInRow, + getC4BoundaryInRow, + setAccTitle, + getAccTitle, + getAccDescription, + setAccDescription, + getConfig: () => getConfig().c4, + clear, + LINETYPE, + ARROWTYPE, + PLACEMENT, + setTitle, + setC4Type + // apply, +}; +const drawRect = function(elem, rectData) { + return drawRect$1(elem, rectData); +}; +const drawImage = function(elem, width, height, x, y, link) { + const imageElem = elem.append("image"); + imageElem.attr("width", width); + imageElem.attr("height", height); + imageElem.attr("x", x); + imageElem.attr("y", y); + let sanitizedLink = link.startsWith("data:image/png;base64") ? link : dist.sanitizeUrl(link); + imageElem.attr("xlink:href", sanitizedLink); +}; +const drawRels$1 = (elem, rels2, conf2) => { + const relsElem = elem.append("g"); + let i = 0; + for (let rel of rels2) { + let textColor = rel.textColor ? rel.textColor : "#444444"; + let strokeColor = rel.lineColor ? rel.lineColor : "#444444"; + let offsetX = rel.offsetX ? parseInt(rel.offsetX) : 0; + let offsetY = rel.offsetY ? parseInt(rel.offsetY) : 0; + let url = ""; + if (i === 0) { + let line = relsElem.append("line"); + line.attr("x1", rel.startPoint.x); + line.attr("y1", rel.startPoint.y); + line.attr("x2", rel.endPoint.x); + line.attr("y2", rel.endPoint.y); + line.attr("stroke-width", "1"); + line.attr("stroke", strokeColor); + line.style("fill", "none"); + if (rel.type !== "rel_b") { + line.attr("marker-end", "url(" + url + "#arrowhead)"); + } + if (rel.type === "birel" || rel.type === "rel_b") { + line.attr("marker-start", "url(" + url + "#arrowend)"); + } + i = -1; + } else { + let line = relsElem.append("path"); + line.attr("fill", "none").attr("stroke-width", "1").attr("stroke", strokeColor).attr( + "d", + "Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx", rel.startPoint.x).replaceAll("starty", rel.startPoint.y).replaceAll( + "controlx", + rel.startPoint.x + (rel.endPoint.x - rel.startPoint.x) / 2 - (rel.endPoint.x - rel.startPoint.x) / 4 + ).replaceAll("controly", rel.startPoint.y + (rel.endPoint.y - rel.startPoint.y) / 2).replaceAll("stopx", rel.endPoint.x).replaceAll("stopy", rel.endPoint.y) + ); + if (rel.type !== "rel_b") { + line.attr("marker-end", "url(" + url + "#arrowhead)"); + } + if (rel.type === "birel" || rel.type === "rel_b") { + line.attr("marker-start", "url(" + url + "#arrowend)"); + } + } + let messageConf = conf2.messageFont(); + _drawTextCandidateFunc(conf2)( + rel.label.text, + relsElem, + Math.min(rel.startPoint.x, rel.endPoint.x) + Math.abs(rel.endPoint.x - rel.startPoint.x) / 2 + offsetX, + Math.min(rel.startPoint.y, rel.endPoint.y) + Math.abs(rel.endPoint.y - rel.startPoint.y) / 2 + offsetY, + rel.label.width, + rel.label.height, + { fill: textColor }, + messageConf + ); + if (rel.techn && rel.techn.text !== "") { + messageConf = conf2.messageFont(); + _drawTextCandidateFunc(conf2)( + "[" + rel.techn.text + "]", + relsElem, + Math.min(rel.startPoint.x, rel.endPoint.x) + Math.abs(rel.endPoint.x - rel.startPoint.x) / 2 + offsetX, + Math.min(rel.startPoint.y, rel.endPoint.y) + Math.abs(rel.endPoint.y - rel.startPoint.y) / 2 + conf2.messageFontSize + 5 + offsetY, + Math.max(rel.label.width, rel.techn.width), + rel.techn.height, + { fill: textColor, "font-style": "italic" }, + messageConf + ); + } + } +}; +const drawBoundary$1 = function(elem, boundary, conf2) { + const boundaryElem = elem.append("g"); + let fillColor = boundary.bgColor ? boundary.bgColor : "none"; + let strokeColor = boundary.borderColor ? boundary.borderColor : "#444444"; + let fontColor = boundary.fontColor ? boundary.fontColor : "black"; + let attrsValue = { "stroke-width": 1, "stroke-dasharray": "7.0,7.0" }; + if (boundary.nodeType) { + attrsValue = { "stroke-width": 1 }; + } + let rectData = { + x: boundary.x, + y: boundary.y, + fill: fillColor, + stroke: strokeColor, + width: boundary.width, + height: boundary.height, + rx: 2.5, + ry: 2.5, + attrs: attrsValue + }; + drawRect(boundaryElem, rectData); + let boundaryConf = conf2.boundaryFont(); + boundaryConf.fontWeight = "bold"; + boundaryConf.fontSize = boundaryConf.fontSize + 2; + boundaryConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + boundary.label.text, + boundaryElem, + boundary.x, + boundary.y + boundary.label.Y, + boundary.width, + boundary.height, + { fill: "#444444" }, + boundaryConf + ); + if (boundary.type && boundary.type.text !== "") { + boundaryConf = conf2.boundaryFont(); + boundaryConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + boundary.type.text, + boundaryElem, + boundary.x, + boundary.y + boundary.type.Y, + boundary.width, + boundary.height, + { fill: "#444444" }, + boundaryConf + ); + } + if (boundary.descr && boundary.descr.text !== "") { + boundaryConf = conf2.boundaryFont(); + boundaryConf.fontSize = boundaryConf.fontSize - 2; + boundaryConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + boundary.descr.text, + boundaryElem, + boundary.x, + boundary.y + boundary.descr.Y, + boundary.width, + boundary.height, + { fill: "#444444" }, + boundaryConf + ); + } +}; +const drawC4Shape = function(elem, c4Shape, conf2) { + var _a; + let fillColor = c4Shape.bgColor ? c4Shape.bgColor : conf2[c4Shape.typeC4Shape.text + "_bg_color"]; + let strokeColor = c4Shape.borderColor ? c4Shape.borderColor : conf2[c4Shape.typeC4Shape.text + "_border_color"]; + let fontColor = c4Shape.fontColor ? c4Shape.fontColor : "#FFFFFF"; + let personImg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII="; + switch (c4Shape.typeC4Shape.text) { + case "person": + personImg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII="; + break; + case "external_person": + personImg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII="; + break; + } + const c4ShapeElem = elem.append("g"); + c4ShapeElem.attr("class", "person-man"); + const rect = getNoteRect(); + switch (c4Shape.typeC4Shape.text) { + case "person": + case "external_person": + case "system": + case "external_system": + case "container": + case "external_container": + case "component": + case "external_component": + rect.x = c4Shape.x; + rect.y = c4Shape.y; + rect.fill = fillColor; + rect.width = c4Shape.width; + rect.height = c4Shape.height; + rect.stroke = strokeColor; + rect.rx = 2.5; + rect.ry = 2.5; + rect.attrs = { "stroke-width": 0.5 }; + drawRect(c4ShapeElem, rect); + break; + case "system_db": + case "external_system_db": + case "container_db": + case "external_container_db": + case "component_db": + case "external_component_db": + c4ShapeElem.append("path").attr("fill", fillColor).attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx", c4Shape.x).replaceAll("starty", c4Shape.y).replaceAll("half", c4Shape.width / 2).replaceAll("height", c4Shape.height) + ); + c4ShapeElem.append("path").attr("fill", "none").attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx", c4Shape.x).replaceAll("starty", c4Shape.y).replaceAll("half", c4Shape.width / 2) + ); + break; + case "system_queue": + case "external_system_queue": + case "container_queue": + case "external_container_queue": + case "component_queue": + case "external_component_queue": + c4ShapeElem.append("path").attr("fill", fillColor).attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx", c4Shape.x).replaceAll("starty", c4Shape.y).replaceAll("width", c4Shape.width).replaceAll("half", c4Shape.height / 2) + ); + c4ShapeElem.append("path").attr("fill", "none").attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx", c4Shape.x + c4Shape.width).replaceAll("starty", c4Shape.y).replaceAll("half", c4Shape.height / 2) + ); + break; + } + let c4ShapeFontConf = getC4ShapeFont(conf2, c4Shape.typeC4Shape.text); + c4ShapeElem.append("text").attr("fill", fontColor).attr("font-family", c4ShapeFontConf.fontFamily).attr("font-size", c4ShapeFontConf.fontSize - 2).attr("font-style", "italic").attr("lengthAdjust", "spacing").attr("textLength", c4Shape.typeC4Shape.width).attr("x", c4Shape.x + c4Shape.width / 2 - c4Shape.typeC4Shape.width / 2).attr("y", c4Shape.y + c4Shape.typeC4Shape.Y).text("<<" + c4Shape.typeC4Shape.text + ">>"); + switch (c4Shape.typeC4Shape.text) { + case "person": + case "external_person": + drawImage( + c4ShapeElem, + 48, + 48, + c4Shape.x + c4Shape.width / 2 - 24, + c4Shape.y + c4Shape.image.Y, + personImg + ); + break; + } + let textFontConf = conf2[c4Shape.typeC4Shape.text + "Font"](); + textFontConf.fontWeight = "bold"; + textFontConf.fontSize = textFontConf.fontSize + 2; + textFontConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + c4Shape.label.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.label.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor }, + textFontConf + ); + textFontConf = conf2[c4Shape.typeC4Shape.text + "Font"](); + textFontConf.fontColor = fontColor; + if (c4Shape.techn && ((_a = c4Shape.techn) == null ? void 0 : _a.text) !== "") { + _drawTextCandidateFunc(conf2)( + c4Shape.techn.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.techn.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor, "font-style": "italic" }, + textFontConf + ); + } else if (c4Shape.type && c4Shape.type.text !== "") { + _drawTextCandidateFunc(conf2)( + c4Shape.type.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.type.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor, "font-style": "italic" }, + textFontConf + ); + } + if (c4Shape.descr && c4Shape.descr.text !== "") { + textFontConf = conf2.personFont(); + textFontConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + c4Shape.descr.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.descr.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor }, + textFontConf + ); + } + return c4Shape.height; +}; +const insertDatabaseIcon = function(elem) { + elem.append("defs").append("symbol").attr("id", "database").attr("fill-rule", "evenodd").attr("clip-rule", "evenodd").append("path").attr("transform", "scale(.5)").attr( + "d", + "M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z" + ); +}; +const insertComputerIcon = function(elem) { + elem.append("defs").append("symbol").attr("id", "computer").attr("width", "24").attr("height", "24").append("path").attr("transform", "scale(.5)").attr( + "d", + "M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z" + ); +}; +const insertClockIcon = function(elem) { + elem.append("defs").append("symbol").attr("id", "clock").attr("width", "24").attr("height", "24").append("path").attr("transform", "scale(.5)").attr( + "d", + "M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z" + ); +}; +const insertArrowHead = function(elem) { + elem.append("defs").append("marker").attr("id", "arrowhead").attr("refX", 9).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 12).attr("markerHeight", 12).attr("orient", "auto").append("path").attr("d", "M 0 0 L 10 5 L 0 10 z"); +}; +const insertArrowEnd = function(elem) { + elem.append("defs").append("marker").attr("id", "arrowend").attr("refX", 1).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 12).attr("markerHeight", 12).attr("orient", "auto").append("path").attr("d", "M 10 0 L 0 5 L 10 10 z"); +}; +const insertArrowFilledHead = function(elem) { + elem.append("defs").append("marker").attr("id", "filled-head").attr("refX", 18).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L14,7 L9,1 Z"); +}; +const insertDynamicNumber = function(elem) { + elem.append("defs").append("marker").attr("id", "sequencenumber").attr("refX", 15).attr("refY", 15).attr("markerWidth", 60).attr("markerHeight", 40).attr("orient", "auto").append("circle").attr("cx", 15).attr("cy", 15).attr("r", 6); +}; +const insertArrowCrossHead = function(elem) { + const defs = elem.append("defs"); + const marker = defs.append("marker").attr("id", "crosshead").attr("markerWidth", 15).attr("markerHeight", 8).attr("orient", "auto").attr("refX", 16).attr("refY", 4); + marker.append("path").attr("fill", "black").attr("stroke", "#000000").style("stroke-dasharray", "0, 0").attr("stroke-width", "1px").attr("d", "M 9,2 V 6 L16,4 Z"); + marker.append("path").attr("fill", "none").attr("stroke", "#000000").style("stroke-dasharray", "0, 0").attr("stroke-width", "1px").attr("d", "M 0,1 L 6,7 M 6,1 L 0,7"); +}; +const getC4ShapeFont = (cnf, typeC4Shape) => { + return { + fontFamily: cnf[typeC4Shape + "FontFamily"], + fontSize: cnf[typeC4Shape + "FontSize"], + fontWeight: cnf[typeC4Shape + "FontWeight"] + }; +}; +const _drawTextCandidateFunc = function() { + function byText(content, g, x, y, width, height, textAttrs) { + const text = g.append("text").attr("x", x + width / 2).attr("y", y + height / 2 + 5).style("text-anchor", "middle").text(content); + _setTextAttrs(text, textAttrs); + } + function byTspan(content, g, x, y, width, height, textAttrs, conf2) { + const { fontSize, fontFamily, fontWeight } = conf2; + const lines = content.split(common.lineBreakRegex); + for (let i = 0; i < lines.length; i++) { + const dy = i * fontSize - fontSize * (lines.length - 1) / 2; + const text = g.append("text").attr("x", x + width / 2).attr("y", y).style("text-anchor", "middle").attr("dominant-baseline", "middle").style("font-size", fontSize).style("font-weight", fontWeight).style("font-family", fontFamily); + text.append("tspan").attr("dy", dy).text(lines[i]).attr("alignment-baseline", "mathematical"); + _setTextAttrs(text, textAttrs); + } + } + function byFo(content, g, x, y, width, height, textAttrs, conf2) { + const s = g.append("switch"); + const f = s.append("foreignObject").attr("x", x).attr("y", y).attr("width", width).attr("height", height); + const text = f.append("xhtml:div").style("display", "table").style("height", "100%").style("width", "100%"); + text.append("div").style("display", "table-cell").style("text-align", "center").style("vertical-align", "middle").text(content); + byTspan(content, s, x, y, width, height, textAttrs, conf2); + _setTextAttrs(text, textAttrs); + } + function _setTextAttrs(toText, fromTextAttrsDict) { + for (const key in fromTextAttrsDict) { + if (fromTextAttrsDict.hasOwnProperty(key)) { + toText.attr(key, fromTextAttrsDict[key]); + } + } + } + return function(conf2) { + return conf2.textPlacement === "fo" ? byFo : conf2.textPlacement === "old" ? byText : byTspan; + }; +}(); +const svgDraw = { + drawRect, + drawBoundary: drawBoundary$1, + drawC4Shape, + drawRels: drawRels$1, + drawImage, + insertArrowHead, + insertArrowEnd, + insertArrowFilledHead, + insertDynamicNumber, + insertArrowCrossHead, + insertDatabaseIcon, + insertComputerIcon, + insertClockIcon +}; +let globalBoundaryMaxX = 0, globalBoundaryMaxY = 0; +let c4ShapeInRow = 4; +let c4BoundaryInRow = 2; +parser.yy = db; +let conf = {}; +class Bounds { + constructor(diagObj) { + this.name = ""; + this.data = {}; + this.data.startx = void 0; + this.data.stopx = void 0; + this.data.starty = void 0; + this.data.stopy = void 0; + this.data.widthLimit = void 0; + this.nextData = {}; + this.nextData.startx = void 0; + this.nextData.stopx = void 0; + this.nextData.starty = void 0; + this.nextData.stopy = void 0; + this.nextData.cnt = 0; + setConf(diagObj.db.getConfig()); + } + setData(startx, stopx, starty, stopy) { + this.nextData.startx = this.data.startx = startx; + this.nextData.stopx = this.data.stopx = stopx; + this.nextData.starty = this.data.starty = starty; + this.nextData.stopy = this.data.stopy = stopy; + } + updateVal(obj, key, val, fun) { + if (obj[key] === void 0) { + obj[key] = val; + } else { + obj[key] = fun(val, obj[key]); + } + } + insert(c4Shape) { + this.nextData.cnt = this.nextData.cnt + 1; + let _startx = this.nextData.startx === this.nextData.stopx ? this.nextData.stopx + c4Shape.margin : this.nextData.stopx + c4Shape.margin * 2; + let _stopx = _startx + c4Shape.width; + let _starty = this.nextData.starty + c4Shape.margin * 2; + let _stopy = _starty + c4Shape.height; + if (_startx >= this.data.widthLimit || _stopx >= this.data.widthLimit || this.nextData.cnt > c4ShapeInRow) { + _startx = this.nextData.startx + c4Shape.margin + conf.nextLinePaddingX; + _starty = this.nextData.stopy + c4Shape.margin * 2; + this.nextData.stopx = _stopx = _startx + c4Shape.width; + this.nextData.starty = this.nextData.stopy; + this.nextData.stopy = _stopy = _starty + c4Shape.height; + this.nextData.cnt = 1; + } + c4Shape.x = _startx; + c4Shape.y = _starty; + this.updateVal(this.data, "startx", _startx, Math.min); + this.updateVal(this.data, "starty", _starty, Math.min); + this.updateVal(this.data, "stopx", _stopx, Math.max); + this.updateVal(this.data, "stopy", _stopy, Math.max); + this.updateVal(this.nextData, "startx", _startx, Math.min); + this.updateVal(this.nextData, "starty", _starty, Math.min); + this.updateVal(this.nextData, "stopx", _stopx, Math.max); + this.updateVal(this.nextData, "stopy", _stopy, Math.max); + } + init(diagObj) { + this.name = ""; + this.data = { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0, + widthLimit: void 0 + }; + this.nextData = { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0, + cnt: 0 + }; + setConf(diagObj.db.getConfig()); + } + bumpLastMargin(margin) { + this.data.stopx += margin; + this.data.stopy += margin; + } +} +const setConf = function(cnf) { + assignWithDepth(conf, cnf); + if (cnf.fontFamily) { + conf.personFontFamily = conf.systemFontFamily = conf.messageFontFamily = cnf.fontFamily; + } + if (cnf.fontSize) { + conf.personFontSize = conf.systemFontSize = conf.messageFontSize = cnf.fontSize; + } + if (cnf.fontWeight) { + conf.personFontWeight = conf.systemFontWeight = conf.messageFontWeight = cnf.fontWeight; + } +}; +const c4ShapeFont = (cnf, typeC4Shape) => { + return { + fontFamily: cnf[typeC4Shape + "FontFamily"], + fontSize: cnf[typeC4Shape + "FontSize"], + fontWeight: cnf[typeC4Shape + "FontWeight"] + }; +}; +const boundaryFont = (cnf) => { + return { + fontFamily: cnf.boundaryFontFamily, + fontSize: cnf.boundaryFontSize, + fontWeight: cnf.boundaryFontWeight + }; +}; +const messageFont = (cnf) => { + return { + fontFamily: cnf.messageFontFamily, + fontSize: cnf.messageFontSize, + fontWeight: cnf.messageFontWeight + }; +}; +function calcC4ShapeTextWH(textType, c4Shape, c4ShapeTextWrap, textConf, textLimitWidth) { + if (!c4Shape[textType].width) { + if (c4ShapeTextWrap) { + c4Shape[textType].text = wrapLabel(c4Shape[textType].text, textLimitWidth, textConf); + c4Shape[textType].textLines = c4Shape[textType].text.split(common.lineBreakRegex).length; + c4Shape[textType].width = textLimitWidth; + c4Shape[textType].height = calculateTextHeight(c4Shape[textType].text, textConf); + } else { + let lines = c4Shape[textType].text.split(common.lineBreakRegex); + c4Shape[textType].textLines = lines.length; + let lineHeight = 0; + c4Shape[textType].height = 0; + c4Shape[textType].width = 0; + for (const line of lines) { + c4Shape[textType].width = Math.max( + calculateTextWidth(line, textConf), + c4Shape[textType].width + ); + lineHeight = calculateTextHeight(line, textConf); + c4Shape[textType].height = c4Shape[textType].height + lineHeight; + } + } + } +} +const drawBoundary = function(diagram2, boundary, bounds) { + boundary.x = bounds.data.startx; + boundary.y = bounds.data.starty; + boundary.width = bounds.data.stopx - bounds.data.startx; + boundary.height = bounds.data.stopy - bounds.data.starty; + boundary.label.y = conf.c4ShapeMargin - 35; + let boundaryTextWrap = boundary.wrap && conf.wrap; + let boundaryLabelConf = boundaryFont(conf); + boundaryLabelConf.fontSize = boundaryLabelConf.fontSize + 2; + boundaryLabelConf.fontWeight = "bold"; + let textLimitWidth = calculateTextWidth(boundary.label.text, boundaryLabelConf); + calcC4ShapeTextWH("label", boundary, boundaryTextWrap, boundaryLabelConf, textLimitWidth); + svgDraw.drawBoundary(diagram2, boundary, conf); +}; +const drawC4ShapeArray = function(currentBounds, diagram2, c4ShapeArray2, c4ShapeKeys) { + let Y = 0; + for (const c4ShapeKey of c4ShapeKeys) { + Y = 0; + const c4Shape = c4ShapeArray2[c4ShapeKey]; + let c4ShapeTypeConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + c4ShapeTypeConf.fontSize = c4ShapeTypeConf.fontSize - 2; + c4Shape.typeC4Shape.width = calculateTextWidth( + "«" + c4Shape.typeC4Shape.text + "»", + c4ShapeTypeConf + ); + c4Shape.typeC4Shape.height = c4ShapeTypeConf.fontSize + 2; + c4Shape.typeC4Shape.Y = conf.c4ShapePadding; + Y = c4Shape.typeC4Shape.Y + c4Shape.typeC4Shape.height - 4; + c4Shape.image = { width: 0, height: 0, Y: 0 }; + switch (c4Shape.typeC4Shape.text) { + case "person": + case "external_person": + c4Shape.image.width = 48; + c4Shape.image.height = 48; + c4Shape.image.Y = Y; + Y = c4Shape.image.Y + c4Shape.image.height; + break; + } + if (c4Shape.sprite) { + c4Shape.image.width = 48; + c4Shape.image.height = 48; + c4Shape.image.Y = Y; + Y = c4Shape.image.Y + c4Shape.image.height; + } + let c4ShapeTextWrap = c4Shape.wrap && conf.wrap; + let textLimitWidth = conf.width - conf.c4ShapePadding * 2; + let c4ShapeLabelConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + c4ShapeLabelConf.fontSize = c4ShapeLabelConf.fontSize + 2; + c4ShapeLabelConf.fontWeight = "bold"; + calcC4ShapeTextWH("label", c4Shape, c4ShapeTextWrap, c4ShapeLabelConf, textLimitWidth); + c4Shape["label"].Y = Y + 8; + Y = c4Shape["label"].Y + c4Shape["label"].height; + if (c4Shape.type && c4Shape.type.text !== "") { + c4Shape.type.text = "[" + c4Shape.type.text + "]"; + let c4ShapeTypeConf2 = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + calcC4ShapeTextWH("type", c4Shape, c4ShapeTextWrap, c4ShapeTypeConf2, textLimitWidth); + c4Shape["type"].Y = Y + 5; + Y = c4Shape["type"].Y + c4Shape["type"].height; + } else if (c4Shape.techn && c4Shape.techn.text !== "") { + c4Shape.techn.text = "[" + c4Shape.techn.text + "]"; + let c4ShapeTechnConf = c4ShapeFont(conf, c4Shape.techn.text); + calcC4ShapeTextWH("techn", c4Shape, c4ShapeTextWrap, c4ShapeTechnConf, textLimitWidth); + c4Shape["techn"].Y = Y + 5; + Y = c4Shape["techn"].Y + c4Shape["techn"].height; + } + let rectHeight = Y; + let rectWidth = c4Shape.label.width; + if (c4Shape.descr && c4Shape.descr.text !== "") { + let c4ShapeDescrConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + calcC4ShapeTextWH("descr", c4Shape, c4ShapeTextWrap, c4ShapeDescrConf, textLimitWidth); + c4Shape["descr"].Y = Y + 20; + Y = c4Shape["descr"].Y + c4Shape["descr"].height; + rectWidth = Math.max(c4Shape.label.width, c4Shape.descr.width); + rectHeight = Y - c4Shape["descr"].textLines * 5; + } + rectWidth = rectWidth + conf.c4ShapePadding; + c4Shape.width = Math.max(c4Shape.width || conf.width, rectWidth, conf.width); + c4Shape.height = Math.max(c4Shape.height || conf.height, rectHeight, conf.height); + c4Shape.margin = c4Shape.margin || conf.c4ShapeMargin; + currentBounds.insert(c4Shape); + svgDraw.drawC4Shape(diagram2, c4Shape, conf); + } + currentBounds.bumpLastMargin(conf.c4ShapeMargin); +}; +class Point { + constructor(x, y) { + this.x = x; + this.y = y; + } +} +let getIntersectPoint = function(fromNode, endPoint) { + let x1 = fromNode.x; + let y1 = fromNode.y; + let x2 = endPoint.x; + let y2 = endPoint.y; + let fromCenterX = x1 + fromNode.width / 2; + let fromCenterY = y1 + fromNode.height / 2; + let dx = Math.abs(x1 - x2); + let dy = Math.abs(y1 - y2); + let tanDYX = dy / dx; + let fromDYX = fromNode.height / fromNode.width; + let returnPoint = null; + if (y1 == y2 && x1 < x2) { + returnPoint = new Point(x1 + fromNode.width, fromCenterY); + } else if (y1 == y2 && x1 > x2) { + returnPoint = new Point(x1, fromCenterY); + } else if (x1 == x2 && y1 < y2) { + returnPoint = new Point(fromCenterX, y1 + fromNode.height); + } else if (x1 == x2 && y1 > y2) { + returnPoint = new Point(fromCenterX, y1); + } + if (x1 > x2 && y1 < y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1, fromCenterY + tanDYX * fromNode.width / 2); + } else { + returnPoint = new Point( + fromCenterX - dx / dy * fromNode.height / 2, + y1 + fromNode.height + ); + } + } else if (x1 < x2 && y1 < y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1 + fromNode.width, fromCenterY + tanDYX * fromNode.width / 2); + } else { + returnPoint = new Point( + fromCenterX + dx / dy * fromNode.height / 2, + y1 + fromNode.height + ); + } + } else if (x1 < x2 && y1 > y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1 + fromNode.width, fromCenterY - tanDYX * fromNode.width / 2); + } else { + returnPoint = new Point(fromCenterX + fromNode.height / 2 * dx / dy, y1); + } + } else if (x1 > x2 && y1 > y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1, fromCenterY - fromNode.width / 2 * tanDYX); + } else { + returnPoint = new Point(fromCenterX - fromNode.height / 2 * dx / dy, y1); + } + } + return returnPoint; +}; +let getIntersectPoints = function(fromNode, endNode) { + let endIntersectPoint = { x: 0, y: 0 }; + endIntersectPoint.x = endNode.x + endNode.width / 2; + endIntersectPoint.y = endNode.y + endNode.height / 2; + let startPoint = getIntersectPoint(fromNode, endIntersectPoint); + endIntersectPoint.x = fromNode.x + fromNode.width / 2; + endIntersectPoint.y = fromNode.y + fromNode.height / 2; + let endPoint = getIntersectPoint(endNode, endIntersectPoint); + return { startPoint, endPoint }; +}; +const drawRels = function(diagram2, rels2, getC4ShapeObj, diagObj) { + let i = 0; + for (let rel of rels2) { + i = i + 1; + let relTextWrap = rel.wrap && conf.wrap; + let relConf = messageFont(conf); + let diagramType = diagObj.db.getC4Type(); + if (diagramType === "C4Dynamic") { + rel.label.text = i + ": " + rel.label.text; + } + let textLimitWidth = calculateTextWidth(rel.label.text, relConf); + calcC4ShapeTextWH("label", rel, relTextWrap, relConf, textLimitWidth); + if (rel.techn && rel.techn.text !== "") { + textLimitWidth = calculateTextWidth(rel.techn.text, relConf); + calcC4ShapeTextWH("techn", rel, relTextWrap, relConf, textLimitWidth); + } + if (rel.descr && rel.descr.text !== "") { + textLimitWidth = calculateTextWidth(rel.descr.text, relConf); + calcC4ShapeTextWH("descr", rel, relTextWrap, relConf, textLimitWidth); + } + let fromNode = getC4ShapeObj(rel.from); + let endNode = getC4ShapeObj(rel.to); + let points = getIntersectPoints(fromNode, endNode); + rel.startPoint = points.startPoint; + rel.endPoint = points.endPoint; + } + svgDraw.drawRels(diagram2, rels2, conf); +}; +function drawInsideBoundary(diagram2, parentBoundaryAlias, parentBounds, currentBoundaries, diagObj) { + let currentBounds = new Bounds(diagObj); + currentBounds.data.widthLimit = parentBounds.data.widthLimit / Math.min(c4BoundaryInRow, currentBoundaries.length); + for (let [i, currentBoundary] of currentBoundaries.entries()) { + let Y = 0; + currentBoundary.image = { width: 0, height: 0, Y: 0 }; + if (currentBoundary.sprite) { + currentBoundary.image.width = 48; + currentBoundary.image.height = 48; + currentBoundary.image.Y = Y; + Y = currentBoundary.image.Y + currentBoundary.image.height; + } + let currentBoundaryTextWrap = currentBoundary.wrap && conf.wrap; + let currentBoundaryLabelConf = boundaryFont(conf); + currentBoundaryLabelConf.fontSize = currentBoundaryLabelConf.fontSize + 2; + currentBoundaryLabelConf.fontWeight = "bold"; + calcC4ShapeTextWH( + "label", + currentBoundary, + currentBoundaryTextWrap, + currentBoundaryLabelConf, + currentBounds.data.widthLimit + ); + currentBoundary["label"].Y = Y + 8; + Y = currentBoundary["label"].Y + currentBoundary["label"].height; + if (currentBoundary.type && currentBoundary.type.text !== "") { + currentBoundary.type.text = "[" + currentBoundary.type.text + "]"; + let currentBoundaryTypeConf = boundaryFont(conf); + calcC4ShapeTextWH( + "type", + currentBoundary, + currentBoundaryTextWrap, + currentBoundaryTypeConf, + currentBounds.data.widthLimit + ); + currentBoundary["type"].Y = Y + 5; + Y = currentBoundary["type"].Y + currentBoundary["type"].height; + } + if (currentBoundary.descr && currentBoundary.descr.text !== "") { + let currentBoundaryDescrConf = boundaryFont(conf); + currentBoundaryDescrConf.fontSize = currentBoundaryDescrConf.fontSize - 2; + calcC4ShapeTextWH( + "descr", + currentBoundary, + currentBoundaryTextWrap, + currentBoundaryDescrConf, + currentBounds.data.widthLimit + ); + currentBoundary["descr"].Y = Y + 20; + Y = currentBoundary["descr"].Y + currentBoundary["descr"].height; + } + if (i == 0 || i % c4BoundaryInRow === 0) { + let _x = parentBounds.data.startx + conf.diagramMarginX; + let _y = parentBounds.data.stopy + conf.diagramMarginY + Y; + currentBounds.setData(_x, _x, _y, _y); + } else { + let _x = currentBounds.data.stopx !== currentBounds.data.startx ? currentBounds.data.stopx + conf.diagramMarginX : currentBounds.data.startx; + let _y = currentBounds.data.starty; + currentBounds.setData(_x, _x, _y, _y); + } + currentBounds.name = currentBoundary.alias; + let currentPersonOrSystemArray = diagObj.db.getC4ShapeArray(currentBoundary.alias); + let currentPersonOrSystemKeys = diagObj.db.getC4ShapeKeys(currentBoundary.alias); + if (currentPersonOrSystemKeys.length > 0) { + drawC4ShapeArray( + currentBounds, + diagram2, + currentPersonOrSystemArray, + currentPersonOrSystemKeys + ); + } + parentBoundaryAlias = currentBoundary.alias; + let nextCurrentBoundaries = diagObj.db.getBoundarys(parentBoundaryAlias); + if (nextCurrentBoundaries.length > 0) { + drawInsideBoundary( + diagram2, + parentBoundaryAlias, + currentBounds, + nextCurrentBoundaries, + diagObj + ); + } + if (currentBoundary.alias !== "global") { + drawBoundary(diagram2, currentBoundary, currentBounds); + } + parentBounds.data.stopy = Math.max( + currentBounds.data.stopy + conf.c4ShapeMargin, + parentBounds.data.stopy + ); + parentBounds.data.stopx = Math.max( + currentBounds.data.stopx + conf.c4ShapeMargin, + parentBounds.data.stopx + ); + globalBoundaryMaxX = Math.max(globalBoundaryMaxX, parentBounds.data.stopx); + globalBoundaryMaxY = Math.max(globalBoundaryMaxY, parentBounds.data.stopy); + } +} +const draw = function(_text, id, _version, diagObj) { + conf = getConfig().c4; + const securityLevel = getConfig().securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = d3select("#i" + id); + } + const root = securityLevel === "sandbox" ? d3select(sandboxElement.nodes()[0].contentDocument.body) : d3select("body"); + let db2 = diagObj.db; + diagObj.db.setWrap(conf.wrap); + c4ShapeInRow = db2.getC4ShapeInRow(); + c4BoundaryInRow = db2.getC4BoundaryInRow(); + log.debug(`C:${JSON.stringify(conf, null, 2)}`); + const diagram2 = securityLevel === "sandbox" ? root.select(`[id="${id}"]`) : d3select(`[id="${id}"]`); + svgDraw.insertComputerIcon(diagram2); + svgDraw.insertDatabaseIcon(diagram2); + svgDraw.insertClockIcon(diagram2); + let screenBounds = new Bounds(diagObj); + screenBounds.setData( + conf.diagramMarginX, + conf.diagramMarginX, + conf.diagramMarginY, + conf.diagramMarginY + ); + screenBounds.data.widthLimit = screen.availWidth; + globalBoundaryMaxX = conf.diagramMarginX; + globalBoundaryMaxY = conf.diagramMarginY; + const title2 = diagObj.db.getTitle(); + let currentBoundaries = diagObj.db.getBoundarys(""); + drawInsideBoundary(diagram2, "", screenBounds, currentBoundaries, diagObj); + svgDraw.insertArrowHead(diagram2); + svgDraw.insertArrowEnd(diagram2); + svgDraw.insertArrowCrossHead(diagram2); + svgDraw.insertArrowFilledHead(diagram2); + drawRels(diagram2, diagObj.db.getRels(), diagObj.db.getC4Shape, diagObj); + screenBounds.data.stopx = globalBoundaryMaxX; + screenBounds.data.stopy = globalBoundaryMaxY; + const box = screenBounds.data; + let boxHeight = box.stopy - box.starty; + let height = boxHeight + 2 * conf.diagramMarginY; + let boxWidth = box.stopx - box.startx; + const width = boxWidth + 2 * conf.diagramMarginX; + if (title2) { + diagram2.append("text").text(title2).attr("x", (box.stopx - box.startx) / 2 - 4 * conf.diagramMarginX).attr("y", box.starty + conf.diagramMarginY); + } + configureSvgSize(diagram2, height, width, conf.useMaxWidth); + const extraVertForTitle = title2 ? 60 : 0; + diagram2.attr( + "viewBox", + box.startx - conf.diagramMarginX + " -" + (conf.diagramMarginY + extraVertForTitle) + " " + width + " " + (height + extraVertForTitle) + ); + log.debug(`models:`, box); +}; +const renderer = { + drawPersonOrSystemArray: drawC4ShapeArray, + drawBoundary, + setConf, + draw +}; +const getStyles = (options) => `.person { + stroke: ${options.personBorder}; + fill: ${options.personBkg}; + } +`; +const styles = getStyles; +const diagram = { + parser: parser$1, + db, + renderer, + styles, + init: ({ c4, wrap }) => { + renderer.setConf(c4); + db.setWrap(wrap); + } +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/c4Diagram-c83219d4.js b/vs-code-extension/media/mermaid/c4Diagram-c83219d4.js new file mode 100644 index 0000000..7900aa7 --- /dev/null +++ b/vs-code-extension/media/mermaid/c4Diagram-c83219d4.js @@ -0,0 +1,2473 @@ +import { s as setAccTitle, g as getAccTitle, a as getAccDescription, b as setAccDescription, c as getConfig, d as sanitizeText, e as common, f as assignWithDepth, h as calculateTextWidth, l as log, i as configureSvgSize, w as wrapLabel, j as calculateTextHeight } from "./mermaid-7ea9cbd6.js"; +import { select } from "d3"; +import { d as drawRect$1, g as getNoteRect } from "./svgDrawCommon-b86b1483.js"; +import { sanitizeUrl } from "@braintree/sanitize-url"; +import "ts-dedent"; +import "dayjs"; +import "dompurify"; +import "khroma"; +import "lodash-es/memoize.js"; +import "lodash-es/merge.js"; +import "stylis"; +import "lodash-es/isEmpty.js"; +var parser = function() { + var o = function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) + ; + return o2; + }, $V0 = [1, 24], $V1 = [1, 25], $V2 = [1, 26], $V3 = [1, 27], $V4 = [1, 28], $V5 = [1, 63], $V6 = [1, 64], $V7 = [1, 65], $V8 = [1, 66], $V9 = [1, 67], $Va = [1, 68], $Vb = [1, 69], $Vc = [1, 29], $Vd = [1, 30], $Ve = [1, 31], $Vf = [1, 32], $Vg = [1, 33], $Vh = [1, 34], $Vi = [1, 35], $Vj = [1, 36], $Vk = [1, 37], $Vl = [1, 38], $Vm = [1, 39], $Vn = [1, 40], $Vo = [1, 41], $Vp = [1, 42], $Vq = [1, 43], $Vr = [1, 44], $Vs = [1, 45], $Vt = [1, 46], $Vu = [1, 47], $Vv = [1, 48], $Vw = [1, 50], $Vx = [1, 51], $Vy = [1, 52], $Vz = [1, 53], $VA = [1, 54], $VB = [1, 55], $VC = [1, 56], $VD = [1, 57], $VE = [1, 58], $VF = [1, 59], $VG = [1, 60], $VH = [14, 42], $VI = [14, 34, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74], $VJ = [12, 14, 34, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74], $VK = [1, 82], $VL = [1, 83], $VM = [1, 84], $VN = [1, 85], $VO = [12, 14, 42], $VP = [12, 14, 33, 42], $VQ = [12, 14, 33, 42, 76, 77, 79, 80], $VR = [12, 33], $VS = [34, 36, 37, 38, 39, 40, 41, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74]; + var parser2 = { + trace: function trace() { + }, + yy: {}, + symbols_: { "error": 2, "start": 3, "mermaidDoc": 4, "direction": 5, "direction_tb": 6, "direction_bt": 7, "direction_rl": 8, "direction_lr": 9, "graphConfig": 10, "C4_CONTEXT": 11, "NEWLINE": 12, "statements": 13, "EOF": 14, "C4_CONTAINER": 15, "C4_COMPONENT": 16, "C4_DYNAMIC": 17, "C4_DEPLOYMENT": 18, "otherStatements": 19, "diagramStatements": 20, "otherStatement": 21, "title": 22, "accDescription": 23, "acc_title": 24, "acc_title_value": 25, "acc_descr": 26, "acc_descr_value": 27, "acc_descr_multiline_value": 28, "boundaryStatement": 29, "boundaryStartStatement": 30, "boundaryStopStatement": 31, "boundaryStart": 32, "LBRACE": 33, "ENTERPRISE_BOUNDARY": 34, "attributes": 35, "SYSTEM_BOUNDARY": 36, "BOUNDARY": 37, "CONTAINER_BOUNDARY": 38, "NODE": 39, "NODE_L": 40, "NODE_R": 41, "RBRACE": 42, "diagramStatement": 43, "PERSON": 44, "PERSON_EXT": 45, "SYSTEM": 46, "SYSTEM_DB": 47, "SYSTEM_QUEUE": 48, "SYSTEM_EXT": 49, "SYSTEM_EXT_DB": 50, "SYSTEM_EXT_QUEUE": 51, "CONTAINER": 52, "CONTAINER_DB": 53, "CONTAINER_QUEUE": 54, "CONTAINER_EXT": 55, "CONTAINER_EXT_DB": 56, "CONTAINER_EXT_QUEUE": 57, "COMPONENT": 58, "COMPONENT_DB": 59, "COMPONENT_QUEUE": 60, "COMPONENT_EXT": 61, "COMPONENT_EXT_DB": 62, "COMPONENT_EXT_QUEUE": 63, "REL": 64, "BIREL": 65, "REL_U": 66, "REL_D": 67, "REL_L": 68, "REL_R": 69, "REL_B": 70, "REL_INDEX": 71, "UPDATE_EL_STYLE": 72, "UPDATE_REL_STYLE": 73, "UPDATE_LAYOUT_CONFIG": 74, "attribute": 75, "STR": 76, "STR_KEY": 77, "STR_VALUE": 78, "ATTRIBUTE": 79, "ATTRIBUTE_EMPTY": 80, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 6: "direction_tb", 7: "direction_bt", 8: "direction_rl", 9: "direction_lr", 11: "C4_CONTEXT", 12: "NEWLINE", 14: "EOF", 15: "C4_CONTAINER", 16: "C4_COMPONENT", 17: "C4_DYNAMIC", 18: "C4_DEPLOYMENT", 22: "title", 23: "accDescription", 24: "acc_title", 25: "acc_title_value", 26: "acc_descr", 27: "acc_descr_value", 28: "acc_descr_multiline_value", 33: "LBRACE", 34: "ENTERPRISE_BOUNDARY", 36: "SYSTEM_BOUNDARY", 37: "BOUNDARY", 38: "CONTAINER_BOUNDARY", 39: "NODE", 40: "NODE_L", 41: "NODE_R", 42: "RBRACE", 44: "PERSON", 45: "PERSON_EXT", 46: "SYSTEM", 47: "SYSTEM_DB", 48: "SYSTEM_QUEUE", 49: "SYSTEM_EXT", 50: "SYSTEM_EXT_DB", 51: "SYSTEM_EXT_QUEUE", 52: "CONTAINER", 53: "CONTAINER_DB", 54: "CONTAINER_QUEUE", 55: "CONTAINER_EXT", 56: "CONTAINER_EXT_DB", 57: "CONTAINER_EXT_QUEUE", 58: "COMPONENT", 59: "COMPONENT_DB", 60: "COMPONENT_QUEUE", 61: "COMPONENT_EXT", 62: "COMPONENT_EXT_DB", 63: "COMPONENT_EXT_QUEUE", 64: "REL", 65: "BIREL", 66: "REL_U", 67: "REL_D", 68: "REL_L", 69: "REL_R", 70: "REL_B", 71: "REL_INDEX", 72: "UPDATE_EL_STYLE", 73: "UPDATE_REL_STYLE", 74: "UPDATE_LAYOUT_CONFIG", 76: "STR", 77: "STR_KEY", 78: "STR_VALUE", 79: "ATTRIBUTE", 80: "ATTRIBUTE_EMPTY" }, + productions_: [0, [3, 1], [3, 1], [5, 1], [5, 1], [5, 1], [5, 1], [4, 1], [10, 4], [10, 4], [10, 4], [10, 4], [10, 4], [13, 1], [13, 1], [13, 2], [19, 1], [19, 2], [19, 3], [21, 1], [21, 1], [21, 2], [21, 2], [21, 1], [29, 3], [30, 3], [30, 3], [30, 4], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [31, 1], [20, 1], [20, 2], [20, 3], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 1], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [35, 1], [35, 2], [75, 1], [75, 2], [75, 1], [75, 1]], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 3: + yy.setDirection("TB"); + break; + case 4: + yy.setDirection("BT"); + break; + case 5: + yy.setDirection("RL"); + break; + case 6: + yy.setDirection("LR"); + break; + case 8: + case 9: + case 10: + case 11: + case 12: + yy.setC4Type($$[$0 - 3]); + break; + case 19: + yy.setTitle($$[$0].substring(6)); + this.$ = $$[$0].substring(6); + break; + case 20: + yy.setAccDescription($$[$0].substring(15)); + this.$ = $$[$0].substring(15); + break; + case 21: + this.$ = $$[$0].trim(); + yy.setTitle(this.$); + break; + case 22: + case 23: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 28: + case 29: + $$[$0].splice(2, 0, "ENTERPRISE"); + yy.addPersonOrSystemBoundary(...$$[$0]); + this.$ = $$[$0]; + break; + case 30: + yy.addPersonOrSystemBoundary(...$$[$0]); + this.$ = $$[$0]; + break; + case 31: + $$[$0].splice(2, 0, "CONTAINER"); + yy.addContainerBoundary(...$$[$0]); + this.$ = $$[$0]; + break; + case 32: + yy.addDeploymentNode("node", ...$$[$0]); + this.$ = $$[$0]; + break; + case 33: + yy.addDeploymentNode("nodeL", ...$$[$0]); + this.$ = $$[$0]; + break; + case 34: + yy.addDeploymentNode("nodeR", ...$$[$0]); + this.$ = $$[$0]; + break; + case 35: + yy.popBoundaryParseStack(); + break; + case 39: + yy.addPersonOrSystem("person", ...$$[$0]); + this.$ = $$[$0]; + break; + case 40: + yy.addPersonOrSystem("external_person", ...$$[$0]); + this.$ = $$[$0]; + break; + case 41: + yy.addPersonOrSystem("system", ...$$[$0]); + this.$ = $$[$0]; + break; + case 42: + yy.addPersonOrSystem("system_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 43: + yy.addPersonOrSystem("system_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 44: + yy.addPersonOrSystem("external_system", ...$$[$0]); + this.$ = $$[$0]; + break; + case 45: + yy.addPersonOrSystem("external_system_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 46: + yy.addPersonOrSystem("external_system_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 47: + yy.addContainer("container", ...$$[$0]); + this.$ = $$[$0]; + break; + case 48: + yy.addContainer("container_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 49: + yy.addContainer("container_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 50: + yy.addContainer("external_container", ...$$[$0]); + this.$ = $$[$0]; + break; + case 51: + yy.addContainer("external_container_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 52: + yy.addContainer("external_container_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 53: + yy.addComponent("component", ...$$[$0]); + this.$ = $$[$0]; + break; + case 54: + yy.addComponent("component_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 55: + yy.addComponent("component_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 56: + yy.addComponent("external_component", ...$$[$0]); + this.$ = $$[$0]; + break; + case 57: + yy.addComponent("external_component_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 58: + yy.addComponent("external_component_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 60: + yy.addRel("rel", ...$$[$0]); + this.$ = $$[$0]; + break; + case 61: + yy.addRel("birel", ...$$[$0]); + this.$ = $$[$0]; + break; + case 62: + yy.addRel("rel_u", ...$$[$0]); + this.$ = $$[$0]; + break; + case 63: + yy.addRel("rel_d", ...$$[$0]); + this.$ = $$[$0]; + break; + case 64: + yy.addRel("rel_l", ...$$[$0]); + this.$ = $$[$0]; + break; + case 65: + yy.addRel("rel_r", ...$$[$0]); + this.$ = $$[$0]; + break; + case 66: + yy.addRel("rel_b", ...$$[$0]); + this.$ = $$[$0]; + break; + case 67: + $$[$0].splice(0, 1); + yy.addRel("rel", ...$$[$0]); + this.$ = $$[$0]; + break; + case 68: + yy.updateElStyle("update_el_style", ...$$[$0]); + this.$ = $$[$0]; + break; + case 69: + yy.updateRelStyle("update_rel_style", ...$$[$0]); + this.$ = $$[$0]; + break; + case 70: + yy.updateLayoutConfig("update_layout_config", ...$$[$0]); + this.$ = $$[$0]; + break; + case 71: + this.$ = [$$[$0]]; + break; + case 72: + $$[$0].unshift($$[$0 - 1]); + this.$ = $$[$0]; + break; + case 73: + case 75: + this.$ = $$[$0].trim(); + break; + case 74: + let kv = {}; + kv[$$[$0 - 1].trim()] = $$[$0].trim(); + this.$ = kv; + break; + case 76: + this.$ = ""; + break; + } + }, + table: [{ 3: 1, 4: 2, 5: 3, 6: [1, 5], 7: [1, 6], 8: [1, 7], 9: [1, 8], 10: 4, 11: [1, 9], 15: [1, 10], 16: [1, 11], 17: [1, 12], 18: [1, 13] }, { 1: [3] }, { 1: [2, 1] }, { 1: [2, 2] }, { 1: [2, 7] }, { 1: [2, 3] }, { 1: [2, 4] }, { 1: [2, 5] }, { 1: [2, 6] }, { 12: [1, 14] }, { 12: [1, 15] }, { 12: [1, 16] }, { 12: [1, 17] }, { 12: [1, 18] }, { 13: 19, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 70, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 71, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 72, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 73, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 14: [1, 74] }, o($VH, [2, 13], { 43: 23, 29: 49, 30: 61, 32: 62, 20: 75, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }), o($VH, [2, 14]), o($VI, [2, 16], { 12: [1, 76] }), o($VH, [2, 36], { 12: [1, 77] }), o($VJ, [2, 19]), o($VJ, [2, 20]), { 25: [1, 78] }, { 27: [1, 79] }, o($VJ, [2, 23]), { 35: 80, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 86, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 87, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 88, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 89, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 90, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 91, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 92, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 93, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 94, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 95, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 96, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 97, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 98, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 99, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 100, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 101, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 102, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 103, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 104, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, o($VO, [2, 59]), { 35: 105, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 106, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 107, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 108, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 109, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 110, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 111, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 112, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 113, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 114, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 115, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 20: 116, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 12: [1, 118], 33: [1, 117] }, { 35: 119, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 120, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 121, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 122, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 123, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 124, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 125, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 14: [1, 126] }, { 14: [1, 127] }, { 14: [1, 128] }, { 14: [1, 129] }, { 1: [2, 8] }, o($VH, [2, 15]), o($VI, [2, 17], { 21: 22, 19: 130, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4 }), o($VH, [2, 37], { 19: 20, 20: 21, 21: 22, 43: 23, 29: 49, 30: 61, 32: 62, 13: 131, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }), o($VJ, [2, 21]), o($VJ, [2, 22]), o($VO, [2, 39]), o($VP, [2, 71], { 75: 81, 35: 132, 76: $VK, 77: $VL, 79: $VM, 80: $VN }), o($VQ, [2, 73]), { 78: [1, 133] }, o($VQ, [2, 75]), o($VQ, [2, 76]), o($VO, [2, 40]), o($VO, [2, 41]), o($VO, [2, 42]), o($VO, [2, 43]), o($VO, [2, 44]), o($VO, [2, 45]), o($VO, [2, 46]), o($VO, [2, 47]), o($VO, [2, 48]), o($VO, [2, 49]), o($VO, [2, 50]), o($VO, [2, 51]), o($VO, [2, 52]), o($VO, [2, 53]), o($VO, [2, 54]), o($VO, [2, 55]), o($VO, [2, 56]), o($VO, [2, 57]), o($VO, [2, 58]), o($VO, [2, 60]), o($VO, [2, 61]), o($VO, [2, 62]), o($VO, [2, 63]), o($VO, [2, 64]), o($VO, [2, 65]), o($VO, [2, 66]), o($VO, [2, 67]), o($VO, [2, 68]), o($VO, [2, 69]), o($VO, [2, 70]), { 31: 134, 42: [1, 135] }, { 12: [1, 136] }, { 33: [1, 137] }, o($VR, [2, 28]), o($VR, [2, 29]), o($VR, [2, 30]), o($VR, [2, 31]), o($VR, [2, 32]), o($VR, [2, 33]), o($VR, [2, 34]), { 1: [2, 9] }, { 1: [2, 10] }, { 1: [2, 11] }, { 1: [2, 12] }, o($VI, [2, 18]), o($VH, [2, 38]), o($VP, [2, 72]), o($VQ, [2, 74]), o($VO, [2, 24]), o($VO, [2, 35]), o($VS, [2, 25]), o($VS, [2, 26], { 12: [1, 138] }), o($VS, [2, 27])], + defaultActions: { 2: [2, 1], 3: [2, 2], 4: [2, 7], 5: [2, 3], 6: [2, 4], 7: [2, 5], 8: [2, 6], 74: [2, 8], 126: [2, 9], 127: [2, 10], 128: [2, 11], 129: [2, 12] }, + parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, + parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + var symbol, state, action, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + var lexer = function() { + var lexer2 = { + EOF: 1, + parseError: function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + // resets the lexer, sets new input + setInput: function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, + // consumes and returns one char from the input + input: function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, + // unshifts one char (or a string) into the input + unput: function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + // When called from action, caches matched text and appends it on next action + more: function() { + this._more = true; + return this; + }, + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, + // retain first n characters of the match + less: function(n) { + this.unput(this.match.slice(n)); + }, + // displays already matched input, i.e. for error messages + pastInput: function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, + // displays upcoming input, i.e. for error messages + upcomingInput: function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: function() { + var pre = this.pastInput(); + var c2 = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c2 + "^"; + }, + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, + // return next match in input + next: function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + // return next match that has a token + lex: function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: function begin(condition) { + this.conditionStack.push(condition); + }, + // pop the previously active lexer condition state off the condition stack + popState: function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + // alias for begin(condition) + pushState: function pushState(condition) { + this.begin(condition); + }, + // return the number of states currently on the stack + stateStackSize: function stateStackSize() { + return this.conditionStack.length; + }, + options: {}, + performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + switch ($avoiding_name_collisions) { + case 0: + return 6; + case 1: + return 7; + case 2: + return 8; + case 3: + return 9; + case 4: + return 22; + case 5: + return 23; + case 6: + this.begin("acc_title"); + return 24; + case 7: + this.popState(); + return "acc_title_value"; + case 8: + this.begin("acc_descr"); + return 26; + case 9: + this.popState(); + return "acc_descr_value"; + case 10: + this.begin("acc_descr_multiline"); + break; + case 11: + this.popState(); + break; + case 12: + return "acc_descr_multiline_value"; + case 13: + break; + case 14: + c; + break; + case 15: + return 12; + case 16: + break; + case 17: + return 11; + case 18: + return 15; + case 19: + return 16; + case 20: + return 17; + case 21: + return 18; + case 22: + this.begin("person_ext"); + return 45; + case 23: + this.begin("person"); + return 44; + case 24: + this.begin("system_ext_queue"); + return 51; + case 25: + this.begin("system_ext_db"); + return 50; + case 26: + this.begin("system_ext"); + return 49; + case 27: + this.begin("system_queue"); + return 48; + case 28: + this.begin("system_db"); + return 47; + case 29: + this.begin("system"); + return 46; + case 30: + this.begin("boundary"); + return 37; + case 31: + this.begin("enterprise_boundary"); + return 34; + case 32: + this.begin("system_boundary"); + return 36; + case 33: + this.begin("container_ext_queue"); + return 57; + case 34: + this.begin("container_ext_db"); + return 56; + case 35: + this.begin("container_ext"); + return 55; + case 36: + this.begin("container_queue"); + return 54; + case 37: + this.begin("container_db"); + return 53; + case 38: + this.begin("container"); + return 52; + case 39: + this.begin("container_boundary"); + return 38; + case 40: + this.begin("component_ext_queue"); + return 63; + case 41: + this.begin("component_ext_db"); + return 62; + case 42: + this.begin("component_ext"); + return 61; + case 43: + this.begin("component_queue"); + return 60; + case 44: + this.begin("component_db"); + return 59; + case 45: + this.begin("component"); + return 58; + case 46: + this.begin("node"); + return 39; + case 47: + this.begin("node"); + return 39; + case 48: + this.begin("node_l"); + return 40; + case 49: + this.begin("node_r"); + return 41; + case 50: + this.begin("rel"); + return 64; + case 51: + this.begin("birel"); + return 65; + case 52: + this.begin("rel_u"); + return 66; + case 53: + this.begin("rel_u"); + return 66; + case 54: + this.begin("rel_d"); + return 67; + case 55: + this.begin("rel_d"); + return 67; + case 56: + this.begin("rel_l"); + return 68; + case 57: + this.begin("rel_l"); + return 68; + case 58: + this.begin("rel_r"); + return 69; + case 59: + this.begin("rel_r"); + return 69; + case 60: + this.begin("rel_b"); + return 70; + case 61: + this.begin("rel_index"); + return 71; + case 62: + this.begin("update_el_style"); + return 72; + case 63: + this.begin("update_rel_style"); + return 73; + case 64: + this.begin("update_layout_config"); + return 74; + case 65: + return "EOF_IN_STRUCT"; + case 66: + this.begin("attribute"); + return "ATTRIBUTE_EMPTY"; + case 67: + this.begin("attribute"); + break; + case 68: + this.popState(); + this.popState(); + break; + case 69: + return 80; + case 70: + break; + case 71: + return 80; + case 72: + this.begin("string"); + break; + case 73: + this.popState(); + break; + case 74: + return "STR"; + case 75: + this.begin("string_kv"); + break; + case 76: + this.begin("string_kv_key"); + return "STR_KEY"; + case 77: + this.popState(); + this.begin("string_kv_value"); + break; + case 78: + return "STR_VALUE"; + case 79: + this.popState(); + this.popState(); + break; + case 80: + return "STR"; + case 81: + return "LBRACE"; + case 82: + return "RBRACE"; + case 83: + return "SPACE"; + case 84: + return "EOL"; + case 85: + return 14; + } + }, + rules: [/^(?:.*direction\s+TB[^\n]*)/, /^(?:.*direction\s+BT[^\n]*)/, /^(?:.*direction\s+RL[^\n]*)/, /^(?:.*direction\s+LR[^\n]*)/, /^(?:title\s[^#\n;]+)/, /^(?:accDescription\s[^#\n;]+)/, /^(?:accTitle\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*\{\s*)/, /^(?:[\}])/, /^(?:[^\}]*)/, /^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/, /^(?:%%[^\n]*(\r?\n)*)/, /^(?:\s*(\r?\n)+)/, /^(?:\s+)/, /^(?:C4Context\b)/, /^(?:C4Container\b)/, /^(?:C4Component\b)/, /^(?:C4Dynamic\b)/, /^(?:C4Deployment\b)/, /^(?:Person_Ext\b)/, /^(?:Person\b)/, /^(?:SystemQueue_Ext\b)/, /^(?:SystemDb_Ext\b)/, /^(?:System_Ext\b)/, /^(?:SystemQueue\b)/, /^(?:SystemDb\b)/, /^(?:System\b)/, /^(?:Boundary\b)/, /^(?:Enterprise_Boundary\b)/, /^(?:System_Boundary\b)/, /^(?:ContainerQueue_Ext\b)/, /^(?:ContainerDb_Ext\b)/, /^(?:Container_Ext\b)/, /^(?:ContainerQueue\b)/, /^(?:ContainerDb\b)/, /^(?:Container\b)/, /^(?:Container_Boundary\b)/, /^(?:ComponentQueue_Ext\b)/, /^(?:ComponentDb_Ext\b)/, /^(?:Component_Ext\b)/, /^(?:ComponentQueue\b)/, /^(?:ComponentDb\b)/, /^(?:Component\b)/, /^(?:Deployment_Node\b)/, /^(?:Node\b)/, /^(?:Node_L\b)/, /^(?:Node_R\b)/, /^(?:Rel\b)/, /^(?:BiRel\b)/, /^(?:Rel_Up\b)/, /^(?:Rel_U\b)/, /^(?:Rel_Down\b)/, /^(?:Rel_D\b)/, /^(?:Rel_Left\b)/, /^(?:Rel_L\b)/, /^(?:Rel_Right\b)/, /^(?:Rel_R\b)/, /^(?:Rel_Back\b)/, /^(?:RelIndex\b)/, /^(?:UpdateElementStyle\b)/, /^(?:UpdateRelStyle\b)/, /^(?:UpdateLayoutConfig\b)/, /^(?:$)/, /^(?:[(][ ]*[,])/, /^(?:[(])/, /^(?:[)])/, /^(?:,,)/, /^(?:,)/, /^(?:[ ]*["]["])/, /^(?:[ ]*["])/, /^(?:["])/, /^(?:[^"]*)/, /^(?:[ ]*[\$])/, /^(?:[^=]*)/, /^(?:[=][ ]*["])/, /^(?:[^"]+)/, /^(?:["])/, /^(?:[^,]+)/, /^(?:\{)/, /^(?:\})/, /^(?:[\s]+)/, /^(?:[\n\r]+)/, /^(?:$)/], + conditions: { "acc_descr_multiline": { "rules": [11, 12], "inclusive": false }, "acc_descr": { "rules": [9], "inclusive": false }, "acc_title": { "rules": [7], "inclusive": false }, "string_kv_value": { "rules": [78, 79], "inclusive": false }, "string_kv_key": { "rules": [77], "inclusive": false }, "string_kv": { "rules": [76], "inclusive": false }, "string": { "rules": [73, 74], "inclusive": false }, "attribute": { "rules": [68, 69, 70, 71, 72, 75, 80], "inclusive": false }, "update_layout_config": { "rules": [65, 66, 67, 68], "inclusive": false }, "update_rel_style": { "rules": [65, 66, 67, 68], "inclusive": false }, "update_el_style": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_b": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_r": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_l": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_d": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_u": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_bi": { "rules": [], "inclusive": false }, "rel": { "rules": [65, 66, 67, 68], "inclusive": false }, "node_r": { "rules": [65, 66, 67, 68], "inclusive": false }, "node_l": { "rules": [65, 66, 67, 68], "inclusive": false }, "node": { "rules": [65, 66, 67, 68], "inclusive": false }, "index": { "rules": [], "inclusive": false }, "rel_index": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_ext_queue": { "rules": [], "inclusive": false }, "component_ext_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "component": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_ext_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_ext_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "container": { "rules": [65, 66, 67, 68], "inclusive": false }, "birel": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "enterprise_boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_ext_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_ext_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "system": { "rules": [65, 66, 67, 68], "inclusive": false }, "person_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "person": { "rules": [65, 66, 67, 68], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 81, 82, 83, 84, 85], "inclusive": true } } + }; + return lexer2; + }(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +}(); +parser.parser = parser; +const parser$1 = parser; +let c4ShapeArray = []; +let boundaryParseStack = [""]; +let currentBoundaryParse = "global"; +let parentBoundaryParse = ""; +let boundaries = [ + { + alias: "global", + label: { text: "global" }, + type: { text: "global" }, + tags: null, + link: null, + parentBoundary: "" + } +]; +let rels = []; +let title = ""; +let wrapEnabled = false; +let c4ShapeInRow$1 = 4; +let c4BoundaryInRow$1 = 2; +var c4Type; +const getC4Type = function() { + return c4Type; +}; +const setC4Type = function(c4TypeParam) { + let sanitizedText = sanitizeText(c4TypeParam, getConfig()); + c4Type = sanitizedText; +}; +const addRel = function(type, from, to, label, techn, descr, sprite, tags, link) { + if (type === void 0 || type === null || from === void 0 || from === null || to === void 0 || to === null || label === void 0 || label === null) { + return; + } + let rel = {}; + const old = rels.find((rel2) => rel2.from === from && rel2.to === to); + if (old) { + rel = old; + } else { + rels.push(rel); + } + rel.type = type; + rel.from = from; + rel.to = to; + rel.label = { text: label }; + if (techn === void 0 || techn === null) { + rel.techn = { text: "" }; + } else { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + rel[key] = { text: value }; + } else { + rel.techn = { text: techn }; + } + } + if (descr === void 0 || descr === null) { + rel.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + rel[key] = { text: value }; + } else { + rel.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + rel[key] = value; + } else { + rel.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + rel[key] = value; + } else { + rel.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + rel[key] = value; + } else { + rel.link = link; + } + rel.wrap = autoWrap(); +}; +const addPersonOrSystem = function(typeC4Shape, alias, label, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let personOrSystem = {}; + const old = c4ShapeArray.find((personOrSystem2) => personOrSystem2.alias === alias); + if (old && alias === old.alias) { + personOrSystem = old; + } else { + personOrSystem.alias = alias; + c4ShapeArray.push(personOrSystem); + } + if (label === void 0 || label === null) { + personOrSystem.label = { text: "" }; + } else { + personOrSystem.label = { text: label }; + } + if (descr === void 0 || descr === null) { + personOrSystem.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + personOrSystem[key] = { text: value }; + } else { + personOrSystem.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + personOrSystem[key] = value; + } else { + personOrSystem.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + personOrSystem[key] = value; + } else { + personOrSystem.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + personOrSystem[key] = value; + } else { + personOrSystem.link = link; + } + personOrSystem.typeC4Shape = { text: typeC4Shape }; + personOrSystem.parentBoundary = currentBoundaryParse; + personOrSystem.wrap = autoWrap(); +}; +const addContainer = function(typeC4Shape, alias, label, techn, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let container = {}; + const old = c4ShapeArray.find((container2) => container2.alias === alias); + if (old && alias === old.alias) { + container = old; + } else { + container.alias = alias; + c4ShapeArray.push(container); + } + if (label === void 0 || label === null) { + container.label = { text: "" }; + } else { + container.label = { text: label }; + } + if (techn === void 0 || techn === null) { + container.techn = { text: "" }; + } else { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + container[key] = { text: value }; + } else { + container.techn = { text: techn }; + } + } + if (descr === void 0 || descr === null) { + container.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + container[key] = { text: value }; + } else { + container.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + container[key] = value; + } else { + container.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + container[key] = value; + } else { + container.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + container[key] = value; + } else { + container.link = link; + } + container.wrap = autoWrap(); + container.typeC4Shape = { text: typeC4Shape }; + container.parentBoundary = currentBoundaryParse; +}; +const addComponent = function(typeC4Shape, alias, label, techn, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let component = {}; + const old = c4ShapeArray.find((component2) => component2.alias === alias); + if (old && alias === old.alias) { + component = old; + } else { + component.alias = alias; + c4ShapeArray.push(component); + } + if (label === void 0 || label === null) { + component.label = { text: "" }; + } else { + component.label = { text: label }; + } + if (techn === void 0 || techn === null) { + component.techn = { text: "" }; + } else { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + component[key] = { text: value }; + } else { + component.techn = { text: techn }; + } + } + if (descr === void 0 || descr === null) { + component.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + component[key] = { text: value }; + } else { + component.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + component[key] = value; + } else { + component.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + component[key] = value; + } else { + component.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + component[key] = value; + } else { + component.link = link; + } + component.wrap = autoWrap(); + component.typeC4Shape = { text: typeC4Shape }; + component.parentBoundary = currentBoundaryParse; +}; +const addPersonOrSystemBoundary = function(alias, label, type, tags, link) { + if (alias === null || label === null) { + return; + } + let boundary = {}; + const old = boundaries.find((boundary2) => boundary2.alias === alias); + if (old && alias === old.alias) { + boundary = old; + } else { + boundary.alias = alias; + boundaries.push(boundary); + } + if (label === void 0 || label === null) { + boundary.label = { text: "" }; + } else { + boundary.label = { text: label }; + } + if (type === void 0 || type === null) { + boundary.type = { text: "system" }; + } else { + if (typeof type === "object") { + let [key, value] = Object.entries(type)[0]; + boundary[key] = { text: value }; + } else { + boundary.type = { text: type }; + } + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + boundary[key] = value; + } else { + boundary.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + boundary[key] = value; + } else { + boundary.link = link; + } + boundary.parentBoundary = currentBoundaryParse; + boundary.wrap = autoWrap(); + parentBoundaryParse = currentBoundaryParse; + currentBoundaryParse = alias; + boundaryParseStack.push(parentBoundaryParse); +}; +const addContainerBoundary = function(alias, label, type, tags, link) { + if (alias === null || label === null) { + return; + } + let boundary = {}; + const old = boundaries.find((boundary2) => boundary2.alias === alias); + if (old && alias === old.alias) { + boundary = old; + } else { + boundary.alias = alias; + boundaries.push(boundary); + } + if (label === void 0 || label === null) { + boundary.label = { text: "" }; + } else { + boundary.label = { text: label }; + } + if (type === void 0 || type === null) { + boundary.type = { text: "container" }; + } else { + if (typeof type === "object") { + let [key, value] = Object.entries(type)[0]; + boundary[key] = { text: value }; + } else { + boundary.type = { text: type }; + } + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + boundary[key] = value; + } else { + boundary.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + boundary[key] = value; + } else { + boundary.link = link; + } + boundary.parentBoundary = currentBoundaryParse; + boundary.wrap = autoWrap(); + parentBoundaryParse = currentBoundaryParse; + currentBoundaryParse = alias; + boundaryParseStack.push(parentBoundaryParse); +}; +const addDeploymentNode = function(nodeType, alias, label, type, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let boundary = {}; + const old = boundaries.find((boundary2) => boundary2.alias === alias); + if (old && alias === old.alias) { + boundary = old; + } else { + boundary.alias = alias; + boundaries.push(boundary); + } + if (label === void 0 || label === null) { + boundary.label = { text: "" }; + } else { + boundary.label = { text: label }; + } + if (type === void 0 || type === null) { + boundary.type = { text: "node" }; + } else { + if (typeof type === "object") { + let [key, value] = Object.entries(type)[0]; + boundary[key] = { text: value }; + } else { + boundary.type = { text: type }; + } + } + if (descr === void 0 || descr === null) { + boundary.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + boundary[key] = { text: value }; + } else { + boundary.descr = { text: descr }; + } + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + boundary[key] = value; + } else { + boundary.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + boundary[key] = value; + } else { + boundary.link = link; + } + boundary.nodeType = nodeType; + boundary.parentBoundary = currentBoundaryParse; + boundary.wrap = autoWrap(); + parentBoundaryParse = currentBoundaryParse; + currentBoundaryParse = alias; + boundaryParseStack.push(parentBoundaryParse); +}; +const popBoundaryParseStack = function() { + currentBoundaryParse = parentBoundaryParse; + boundaryParseStack.pop(); + parentBoundaryParse = boundaryParseStack.pop(); + boundaryParseStack.push(parentBoundaryParse); +}; +const updateElStyle = function(typeC4Shape, elementName, bgColor, fontColor, borderColor, shadowing, shape, sprite, techn, legendText, legendSprite) { + let old = c4ShapeArray.find((element) => element.alias === elementName); + if (old === void 0) { + old = boundaries.find((element) => element.alias === elementName); + if (old === void 0) { + return; + } + } + if (bgColor !== void 0 && bgColor !== null) { + if (typeof bgColor === "object") { + let [key, value] = Object.entries(bgColor)[0]; + old[key] = value; + } else { + old.bgColor = bgColor; + } + } + if (fontColor !== void 0 && fontColor !== null) { + if (typeof fontColor === "object") { + let [key, value] = Object.entries(fontColor)[0]; + old[key] = value; + } else { + old.fontColor = fontColor; + } + } + if (borderColor !== void 0 && borderColor !== null) { + if (typeof borderColor === "object") { + let [key, value] = Object.entries(borderColor)[0]; + old[key] = value; + } else { + old.borderColor = borderColor; + } + } + if (shadowing !== void 0 && shadowing !== null) { + if (typeof shadowing === "object") { + let [key, value] = Object.entries(shadowing)[0]; + old[key] = value; + } else { + old.shadowing = shadowing; + } + } + if (shape !== void 0 && shape !== null) { + if (typeof shape === "object") { + let [key, value] = Object.entries(shape)[0]; + old[key] = value; + } else { + old.shape = shape; + } + } + if (sprite !== void 0 && sprite !== null) { + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + old[key] = value; + } else { + old.sprite = sprite; + } + } + if (techn !== void 0 && techn !== null) { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + old[key] = value; + } else { + old.techn = techn; + } + } + if (legendText !== void 0 && legendText !== null) { + if (typeof legendText === "object") { + let [key, value] = Object.entries(legendText)[0]; + old[key] = value; + } else { + old.legendText = legendText; + } + } + if (legendSprite !== void 0 && legendSprite !== null) { + if (typeof legendSprite === "object") { + let [key, value] = Object.entries(legendSprite)[0]; + old[key] = value; + } else { + old.legendSprite = legendSprite; + } + } +}; +const updateRelStyle = function(typeC4Shape, from, to, textColor, lineColor, offsetX, offsetY) { + const old = rels.find((rel) => rel.from === from && rel.to === to); + if (old === void 0) { + return; + } + if (textColor !== void 0 && textColor !== null) { + if (typeof textColor === "object") { + let [key, value] = Object.entries(textColor)[0]; + old[key] = value; + } else { + old.textColor = textColor; + } + } + if (lineColor !== void 0 && lineColor !== null) { + if (typeof lineColor === "object") { + let [key, value] = Object.entries(lineColor)[0]; + old[key] = value; + } else { + old.lineColor = lineColor; + } + } + if (offsetX !== void 0 && offsetX !== null) { + if (typeof offsetX === "object") { + let [key, value] = Object.entries(offsetX)[0]; + old[key] = parseInt(value); + } else { + old.offsetX = parseInt(offsetX); + } + } + if (offsetY !== void 0 && offsetY !== null) { + if (typeof offsetY === "object") { + let [key, value] = Object.entries(offsetY)[0]; + old[key] = parseInt(value); + } else { + old.offsetY = parseInt(offsetY); + } + } +}; +const updateLayoutConfig = function(typeC4Shape, c4ShapeInRowParam, c4BoundaryInRowParam) { + let c4ShapeInRowValue = c4ShapeInRow$1; + let c4BoundaryInRowValue = c4BoundaryInRow$1; + if (typeof c4ShapeInRowParam === "object") { + const value = Object.values(c4ShapeInRowParam)[0]; + c4ShapeInRowValue = parseInt(value); + } else { + c4ShapeInRowValue = parseInt(c4ShapeInRowParam); + } + if (typeof c4BoundaryInRowParam === "object") { + const value = Object.values(c4BoundaryInRowParam)[0]; + c4BoundaryInRowValue = parseInt(value); + } else { + c4BoundaryInRowValue = parseInt(c4BoundaryInRowParam); + } + if (c4ShapeInRowValue >= 1) { + c4ShapeInRow$1 = c4ShapeInRowValue; + } + if (c4BoundaryInRowValue >= 1) { + c4BoundaryInRow$1 = c4BoundaryInRowValue; + } +}; +const getC4ShapeInRow = function() { + return c4ShapeInRow$1; +}; +const getC4BoundaryInRow = function() { + return c4BoundaryInRow$1; +}; +const getCurrentBoundaryParse = function() { + return currentBoundaryParse; +}; +const getParentBoundaryParse = function() { + return parentBoundaryParse; +}; +const getC4ShapeArray = function(parentBoundary) { + if (parentBoundary === void 0 || parentBoundary === null) { + return c4ShapeArray; + } else { + return c4ShapeArray.filter((personOrSystem) => { + return personOrSystem.parentBoundary === parentBoundary; + }); + } +}; +const getC4Shape = function(alias) { + return c4ShapeArray.find((personOrSystem) => personOrSystem.alias === alias); +}; +const getC4ShapeKeys = function(parentBoundary) { + return Object.keys(getC4ShapeArray(parentBoundary)); +}; +const getBoundaries = function(parentBoundary) { + if (parentBoundary === void 0 || parentBoundary === null) { + return boundaries; + } else { + return boundaries.filter((boundary) => boundary.parentBoundary === parentBoundary); + } +}; +const getBoundarys = getBoundaries; +const getRels = function() { + return rels; +}; +const getTitle = function() { + return title; +}; +const setWrap = function(wrapSetting) { + wrapEnabled = wrapSetting; +}; +const autoWrap = function() { + return wrapEnabled; +}; +const clear = function() { + c4ShapeArray = []; + boundaries = [ + { + alias: "global", + label: { text: "global" }, + type: { text: "global" }, + tags: null, + link: null, + parentBoundary: "" + } + ]; + parentBoundaryParse = ""; + currentBoundaryParse = "global"; + boundaryParseStack = [""]; + rels = []; + boundaryParseStack = [""]; + title = ""; + wrapEnabled = false; + c4ShapeInRow$1 = 4; + c4BoundaryInRow$1 = 2; +}; +const LINETYPE = { + SOLID: 0, + DOTTED: 1, + NOTE: 2, + SOLID_CROSS: 3, + DOTTED_CROSS: 4, + SOLID_OPEN: 5, + DOTTED_OPEN: 6, + LOOP_START: 10, + LOOP_END: 11, + ALT_START: 12, + ALT_ELSE: 13, + ALT_END: 14, + OPT_START: 15, + OPT_END: 16, + ACTIVE_START: 17, + ACTIVE_END: 18, + PAR_START: 19, + PAR_AND: 20, + PAR_END: 21, + RECT_START: 22, + RECT_END: 23, + SOLID_POINT: 24, + DOTTED_POINT: 25 +}; +const ARROWTYPE = { + FILLED: 0, + OPEN: 1 +}; +const PLACEMENT = { + LEFTOF: 0, + RIGHTOF: 1, + OVER: 2 +}; +const setTitle = function(txt) { + let sanitizedText = sanitizeText(txt, getConfig()); + title = sanitizedText; +}; +const db = { + addPersonOrSystem, + addPersonOrSystemBoundary, + addContainer, + addContainerBoundary, + addComponent, + addDeploymentNode, + popBoundaryParseStack, + addRel, + updateElStyle, + updateRelStyle, + updateLayoutConfig, + autoWrap, + setWrap, + getC4ShapeArray, + getC4Shape, + getC4ShapeKeys, + getBoundaries, + getBoundarys, + getCurrentBoundaryParse, + getParentBoundaryParse, + getRels, + getTitle, + getC4Type, + getC4ShapeInRow, + getC4BoundaryInRow, + setAccTitle, + getAccTitle, + getAccDescription, + setAccDescription, + getConfig: () => getConfig().c4, + clear, + LINETYPE, + ARROWTYPE, + PLACEMENT, + setTitle, + setC4Type + // apply, +}; +const drawRect = function(elem, rectData) { + return drawRect$1(elem, rectData); +}; +const drawImage = function(elem, width, height, x, y, link) { + const imageElem = elem.append("image"); + imageElem.attr("width", width); + imageElem.attr("height", height); + imageElem.attr("x", x); + imageElem.attr("y", y); + let sanitizedLink = link.startsWith("data:image/png;base64") ? link : sanitizeUrl(link); + imageElem.attr("xlink:href", sanitizedLink); +}; +const drawRels$1 = (elem, rels2, conf2) => { + const relsElem = elem.append("g"); + let i = 0; + for (let rel of rels2) { + let textColor = rel.textColor ? rel.textColor : "#444444"; + let strokeColor = rel.lineColor ? rel.lineColor : "#444444"; + let offsetX = rel.offsetX ? parseInt(rel.offsetX) : 0; + let offsetY = rel.offsetY ? parseInt(rel.offsetY) : 0; + let url = ""; + if (i === 0) { + let line = relsElem.append("line"); + line.attr("x1", rel.startPoint.x); + line.attr("y1", rel.startPoint.y); + line.attr("x2", rel.endPoint.x); + line.attr("y2", rel.endPoint.y); + line.attr("stroke-width", "1"); + line.attr("stroke", strokeColor); + line.style("fill", "none"); + if (rel.type !== "rel_b") { + line.attr("marker-end", "url(" + url + "#arrowhead)"); + } + if (rel.type === "birel" || rel.type === "rel_b") { + line.attr("marker-start", "url(" + url + "#arrowend)"); + } + i = -1; + } else { + let line = relsElem.append("path"); + line.attr("fill", "none").attr("stroke-width", "1").attr("stroke", strokeColor).attr( + "d", + "Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx", rel.startPoint.x).replaceAll("starty", rel.startPoint.y).replaceAll( + "controlx", + rel.startPoint.x + (rel.endPoint.x - rel.startPoint.x) / 2 - (rel.endPoint.x - rel.startPoint.x) / 4 + ).replaceAll("controly", rel.startPoint.y + (rel.endPoint.y - rel.startPoint.y) / 2).replaceAll("stopx", rel.endPoint.x).replaceAll("stopy", rel.endPoint.y) + ); + if (rel.type !== "rel_b") { + line.attr("marker-end", "url(" + url + "#arrowhead)"); + } + if (rel.type === "birel" || rel.type === "rel_b") { + line.attr("marker-start", "url(" + url + "#arrowend)"); + } + } + let messageConf = conf2.messageFont(); + _drawTextCandidateFunc(conf2)( + rel.label.text, + relsElem, + Math.min(rel.startPoint.x, rel.endPoint.x) + Math.abs(rel.endPoint.x - rel.startPoint.x) / 2 + offsetX, + Math.min(rel.startPoint.y, rel.endPoint.y) + Math.abs(rel.endPoint.y - rel.startPoint.y) / 2 + offsetY, + rel.label.width, + rel.label.height, + { fill: textColor }, + messageConf + ); + if (rel.techn && rel.techn.text !== "") { + messageConf = conf2.messageFont(); + _drawTextCandidateFunc(conf2)( + "[" + rel.techn.text + "]", + relsElem, + Math.min(rel.startPoint.x, rel.endPoint.x) + Math.abs(rel.endPoint.x - rel.startPoint.x) / 2 + offsetX, + Math.min(rel.startPoint.y, rel.endPoint.y) + Math.abs(rel.endPoint.y - rel.startPoint.y) / 2 + conf2.messageFontSize + 5 + offsetY, + Math.max(rel.label.width, rel.techn.width), + rel.techn.height, + { fill: textColor, "font-style": "italic" }, + messageConf + ); + } + } +}; +const drawBoundary$1 = function(elem, boundary, conf2) { + const boundaryElem = elem.append("g"); + let fillColor = boundary.bgColor ? boundary.bgColor : "none"; + let strokeColor = boundary.borderColor ? boundary.borderColor : "#444444"; + let fontColor = boundary.fontColor ? boundary.fontColor : "black"; + let attrsValue = { "stroke-width": 1, "stroke-dasharray": "7.0,7.0" }; + if (boundary.nodeType) { + attrsValue = { "stroke-width": 1 }; + } + let rectData = { + x: boundary.x, + y: boundary.y, + fill: fillColor, + stroke: strokeColor, + width: boundary.width, + height: boundary.height, + rx: 2.5, + ry: 2.5, + attrs: attrsValue + }; + drawRect(boundaryElem, rectData); + let boundaryConf = conf2.boundaryFont(); + boundaryConf.fontWeight = "bold"; + boundaryConf.fontSize = boundaryConf.fontSize + 2; + boundaryConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + boundary.label.text, + boundaryElem, + boundary.x, + boundary.y + boundary.label.Y, + boundary.width, + boundary.height, + { fill: "#444444" }, + boundaryConf + ); + if (boundary.type && boundary.type.text !== "") { + boundaryConf = conf2.boundaryFont(); + boundaryConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + boundary.type.text, + boundaryElem, + boundary.x, + boundary.y + boundary.type.Y, + boundary.width, + boundary.height, + { fill: "#444444" }, + boundaryConf + ); + } + if (boundary.descr && boundary.descr.text !== "") { + boundaryConf = conf2.boundaryFont(); + boundaryConf.fontSize = boundaryConf.fontSize - 2; + boundaryConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + boundary.descr.text, + boundaryElem, + boundary.x, + boundary.y + boundary.descr.Y, + boundary.width, + boundary.height, + { fill: "#444444" }, + boundaryConf + ); + } +}; +const drawC4Shape = function(elem, c4Shape, conf2) { + var _a; + let fillColor = c4Shape.bgColor ? c4Shape.bgColor : conf2[c4Shape.typeC4Shape.text + "_bg_color"]; + let strokeColor = c4Shape.borderColor ? c4Shape.borderColor : conf2[c4Shape.typeC4Shape.text + "_border_color"]; + let fontColor = c4Shape.fontColor ? c4Shape.fontColor : "#FFFFFF"; + let personImg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII="; + switch (c4Shape.typeC4Shape.text) { + case "person": + personImg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII="; + break; + case "external_person": + personImg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII="; + break; + } + const c4ShapeElem = elem.append("g"); + c4ShapeElem.attr("class", "person-man"); + const rect = getNoteRect(); + switch (c4Shape.typeC4Shape.text) { + case "person": + case "external_person": + case "system": + case "external_system": + case "container": + case "external_container": + case "component": + case "external_component": + rect.x = c4Shape.x; + rect.y = c4Shape.y; + rect.fill = fillColor; + rect.width = c4Shape.width; + rect.height = c4Shape.height; + rect.stroke = strokeColor; + rect.rx = 2.5; + rect.ry = 2.5; + rect.attrs = { "stroke-width": 0.5 }; + drawRect(c4ShapeElem, rect); + break; + case "system_db": + case "external_system_db": + case "container_db": + case "external_container_db": + case "component_db": + case "external_component_db": + c4ShapeElem.append("path").attr("fill", fillColor).attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx", c4Shape.x).replaceAll("starty", c4Shape.y).replaceAll("half", c4Shape.width / 2).replaceAll("height", c4Shape.height) + ); + c4ShapeElem.append("path").attr("fill", "none").attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx", c4Shape.x).replaceAll("starty", c4Shape.y).replaceAll("half", c4Shape.width / 2) + ); + break; + case "system_queue": + case "external_system_queue": + case "container_queue": + case "external_container_queue": + case "component_queue": + case "external_component_queue": + c4ShapeElem.append("path").attr("fill", fillColor).attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx", c4Shape.x).replaceAll("starty", c4Shape.y).replaceAll("width", c4Shape.width).replaceAll("half", c4Shape.height / 2) + ); + c4ShapeElem.append("path").attr("fill", "none").attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx", c4Shape.x + c4Shape.width).replaceAll("starty", c4Shape.y).replaceAll("half", c4Shape.height / 2) + ); + break; + } + let c4ShapeFontConf = getC4ShapeFont(conf2, c4Shape.typeC4Shape.text); + c4ShapeElem.append("text").attr("fill", fontColor).attr("font-family", c4ShapeFontConf.fontFamily).attr("font-size", c4ShapeFontConf.fontSize - 2).attr("font-style", "italic").attr("lengthAdjust", "spacing").attr("textLength", c4Shape.typeC4Shape.width).attr("x", c4Shape.x + c4Shape.width / 2 - c4Shape.typeC4Shape.width / 2).attr("y", c4Shape.y + c4Shape.typeC4Shape.Y).text("<<" + c4Shape.typeC4Shape.text + ">>"); + switch (c4Shape.typeC4Shape.text) { + case "person": + case "external_person": + drawImage( + c4ShapeElem, + 48, + 48, + c4Shape.x + c4Shape.width / 2 - 24, + c4Shape.y + c4Shape.image.Y, + personImg + ); + break; + } + let textFontConf = conf2[c4Shape.typeC4Shape.text + "Font"](); + textFontConf.fontWeight = "bold"; + textFontConf.fontSize = textFontConf.fontSize + 2; + textFontConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + c4Shape.label.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.label.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor }, + textFontConf + ); + textFontConf = conf2[c4Shape.typeC4Shape.text + "Font"](); + textFontConf.fontColor = fontColor; + if (c4Shape.techn && ((_a = c4Shape.techn) == null ? void 0 : _a.text) !== "") { + _drawTextCandidateFunc(conf2)( + c4Shape.techn.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.techn.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor, "font-style": "italic" }, + textFontConf + ); + } else if (c4Shape.type && c4Shape.type.text !== "") { + _drawTextCandidateFunc(conf2)( + c4Shape.type.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.type.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor, "font-style": "italic" }, + textFontConf + ); + } + if (c4Shape.descr && c4Shape.descr.text !== "") { + textFontConf = conf2.personFont(); + textFontConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + c4Shape.descr.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.descr.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor }, + textFontConf + ); + } + return c4Shape.height; +}; +const insertDatabaseIcon = function(elem) { + elem.append("defs").append("symbol").attr("id", "database").attr("fill-rule", "evenodd").attr("clip-rule", "evenodd").append("path").attr("transform", "scale(.5)").attr( + "d", + "M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z" + ); +}; +const insertComputerIcon = function(elem) { + elem.append("defs").append("symbol").attr("id", "computer").attr("width", "24").attr("height", "24").append("path").attr("transform", "scale(.5)").attr( + "d", + "M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z" + ); +}; +const insertClockIcon = function(elem) { + elem.append("defs").append("symbol").attr("id", "clock").attr("width", "24").attr("height", "24").append("path").attr("transform", "scale(.5)").attr( + "d", + "M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z" + ); +}; +const insertArrowHead = function(elem) { + elem.append("defs").append("marker").attr("id", "arrowhead").attr("refX", 9).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 12).attr("markerHeight", 12).attr("orient", "auto").append("path").attr("d", "M 0 0 L 10 5 L 0 10 z"); +}; +const insertArrowEnd = function(elem) { + elem.append("defs").append("marker").attr("id", "arrowend").attr("refX", 1).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 12).attr("markerHeight", 12).attr("orient", "auto").append("path").attr("d", "M 10 0 L 0 5 L 10 10 z"); +}; +const insertArrowFilledHead = function(elem) { + elem.append("defs").append("marker").attr("id", "filled-head").attr("refX", 18).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L14,7 L9,1 Z"); +}; +const insertDynamicNumber = function(elem) { + elem.append("defs").append("marker").attr("id", "sequencenumber").attr("refX", 15).attr("refY", 15).attr("markerWidth", 60).attr("markerHeight", 40).attr("orient", "auto").append("circle").attr("cx", 15).attr("cy", 15).attr("r", 6); +}; +const insertArrowCrossHead = function(elem) { + const defs = elem.append("defs"); + const marker = defs.append("marker").attr("id", "crosshead").attr("markerWidth", 15).attr("markerHeight", 8).attr("orient", "auto").attr("refX", 16).attr("refY", 4); + marker.append("path").attr("fill", "black").attr("stroke", "#000000").style("stroke-dasharray", "0, 0").attr("stroke-width", "1px").attr("d", "M 9,2 V 6 L16,4 Z"); + marker.append("path").attr("fill", "none").attr("stroke", "#000000").style("stroke-dasharray", "0, 0").attr("stroke-width", "1px").attr("d", "M 0,1 L 6,7 M 6,1 L 0,7"); +}; +const getC4ShapeFont = (cnf, typeC4Shape) => { + return { + fontFamily: cnf[typeC4Shape + "FontFamily"], + fontSize: cnf[typeC4Shape + "FontSize"], + fontWeight: cnf[typeC4Shape + "FontWeight"] + }; +}; +const _drawTextCandidateFunc = function() { + function byText(content, g, x, y, width, height, textAttrs) { + const text = g.append("text").attr("x", x + width / 2).attr("y", y + height / 2 + 5).style("text-anchor", "middle").text(content); + _setTextAttrs(text, textAttrs); + } + function byTspan(content, g, x, y, width, height, textAttrs, conf2) { + const { fontSize, fontFamily, fontWeight } = conf2; + const lines = content.split(common.lineBreakRegex); + for (let i = 0; i < lines.length; i++) { + const dy = i * fontSize - fontSize * (lines.length - 1) / 2; + const text = g.append("text").attr("x", x + width / 2).attr("y", y).style("text-anchor", "middle").attr("dominant-baseline", "middle").style("font-size", fontSize).style("font-weight", fontWeight).style("font-family", fontFamily); + text.append("tspan").attr("dy", dy).text(lines[i]).attr("alignment-baseline", "mathematical"); + _setTextAttrs(text, textAttrs); + } + } + function byFo(content, g, x, y, width, height, textAttrs, conf2) { + const s = g.append("switch"); + const f = s.append("foreignObject").attr("x", x).attr("y", y).attr("width", width).attr("height", height); + const text = f.append("xhtml:div").style("display", "table").style("height", "100%").style("width", "100%"); + text.append("div").style("display", "table-cell").style("text-align", "center").style("vertical-align", "middle").text(content); + byTspan(content, s, x, y, width, height, textAttrs, conf2); + _setTextAttrs(text, textAttrs); + } + function _setTextAttrs(toText, fromTextAttrsDict) { + for (const key in fromTextAttrsDict) { + if (fromTextAttrsDict.hasOwnProperty(key)) { + toText.attr(key, fromTextAttrsDict[key]); + } + } + } + return function(conf2) { + return conf2.textPlacement === "fo" ? byFo : conf2.textPlacement === "old" ? byText : byTspan; + }; +}(); +const svgDraw = { + drawRect, + drawBoundary: drawBoundary$1, + drawC4Shape, + drawRels: drawRels$1, + drawImage, + insertArrowHead, + insertArrowEnd, + insertArrowFilledHead, + insertDynamicNumber, + insertArrowCrossHead, + insertDatabaseIcon, + insertComputerIcon, + insertClockIcon +}; +let globalBoundaryMaxX = 0, globalBoundaryMaxY = 0; +let c4ShapeInRow = 4; +let c4BoundaryInRow = 2; +parser.yy = db; +let conf = {}; +class Bounds { + constructor(diagObj) { + this.name = ""; + this.data = {}; + this.data.startx = void 0; + this.data.stopx = void 0; + this.data.starty = void 0; + this.data.stopy = void 0; + this.data.widthLimit = void 0; + this.nextData = {}; + this.nextData.startx = void 0; + this.nextData.stopx = void 0; + this.nextData.starty = void 0; + this.nextData.stopy = void 0; + this.nextData.cnt = 0; + setConf(diagObj.db.getConfig()); + } + setData(startx, stopx, starty, stopy) { + this.nextData.startx = this.data.startx = startx; + this.nextData.stopx = this.data.stopx = stopx; + this.nextData.starty = this.data.starty = starty; + this.nextData.stopy = this.data.stopy = stopy; + } + updateVal(obj, key, val, fun) { + if (obj[key] === void 0) { + obj[key] = val; + } else { + obj[key] = fun(val, obj[key]); + } + } + insert(c4Shape) { + this.nextData.cnt = this.nextData.cnt + 1; + let _startx = this.nextData.startx === this.nextData.stopx ? this.nextData.stopx + c4Shape.margin : this.nextData.stopx + c4Shape.margin * 2; + let _stopx = _startx + c4Shape.width; + let _starty = this.nextData.starty + c4Shape.margin * 2; + let _stopy = _starty + c4Shape.height; + if (_startx >= this.data.widthLimit || _stopx >= this.data.widthLimit || this.nextData.cnt > c4ShapeInRow) { + _startx = this.nextData.startx + c4Shape.margin + conf.nextLinePaddingX; + _starty = this.nextData.stopy + c4Shape.margin * 2; + this.nextData.stopx = _stopx = _startx + c4Shape.width; + this.nextData.starty = this.nextData.stopy; + this.nextData.stopy = _stopy = _starty + c4Shape.height; + this.nextData.cnt = 1; + } + c4Shape.x = _startx; + c4Shape.y = _starty; + this.updateVal(this.data, "startx", _startx, Math.min); + this.updateVal(this.data, "starty", _starty, Math.min); + this.updateVal(this.data, "stopx", _stopx, Math.max); + this.updateVal(this.data, "stopy", _stopy, Math.max); + this.updateVal(this.nextData, "startx", _startx, Math.min); + this.updateVal(this.nextData, "starty", _starty, Math.min); + this.updateVal(this.nextData, "stopx", _stopx, Math.max); + this.updateVal(this.nextData, "stopy", _stopy, Math.max); + } + init(diagObj) { + this.name = ""; + this.data = { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0, + widthLimit: void 0 + }; + this.nextData = { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0, + cnt: 0 + }; + setConf(diagObj.db.getConfig()); + } + bumpLastMargin(margin) { + this.data.stopx += margin; + this.data.stopy += margin; + } +} +const setConf = function(cnf) { + assignWithDepth(conf, cnf); + if (cnf.fontFamily) { + conf.personFontFamily = conf.systemFontFamily = conf.messageFontFamily = cnf.fontFamily; + } + if (cnf.fontSize) { + conf.personFontSize = conf.systemFontSize = conf.messageFontSize = cnf.fontSize; + } + if (cnf.fontWeight) { + conf.personFontWeight = conf.systemFontWeight = conf.messageFontWeight = cnf.fontWeight; + } +}; +const c4ShapeFont = (cnf, typeC4Shape) => { + return { + fontFamily: cnf[typeC4Shape + "FontFamily"], + fontSize: cnf[typeC4Shape + "FontSize"], + fontWeight: cnf[typeC4Shape + "FontWeight"] + }; +}; +const boundaryFont = (cnf) => { + return { + fontFamily: cnf.boundaryFontFamily, + fontSize: cnf.boundaryFontSize, + fontWeight: cnf.boundaryFontWeight + }; +}; +const messageFont = (cnf) => { + return { + fontFamily: cnf.messageFontFamily, + fontSize: cnf.messageFontSize, + fontWeight: cnf.messageFontWeight + }; +}; +function calcC4ShapeTextWH(textType, c4Shape, c4ShapeTextWrap, textConf, textLimitWidth) { + if (!c4Shape[textType].width) { + if (c4ShapeTextWrap) { + c4Shape[textType].text = wrapLabel(c4Shape[textType].text, textLimitWidth, textConf); + c4Shape[textType].textLines = c4Shape[textType].text.split(common.lineBreakRegex).length; + c4Shape[textType].width = textLimitWidth; + c4Shape[textType].height = calculateTextHeight(c4Shape[textType].text, textConf); + } else { + let lines = c4Shape[textType].text.split(common.lineBreakRegex); + c4Shape[textType].textLines = lines.length; + let lineHeight = 0; + c4Shape[textType].height = 0; + c4Shape[textType].width = 0; + for (const line of lines) { + c4Shape[textType].width = Math.max( + calculateTextWidth(line, textConf), + c4Shape[textType].width + ); + lineHeight = calculateTextHeight(line, textConf); + c4Shape[textType].height = c4Shape[textType].height + lineHeight; + } + } + } +} +const drawBoundary = function(diagram2, boundary, bounds) { + boundary.x = bounds.data.startx; + boundary.y = bounds.data.starty; + boundary.width = bounds.data.stopx - bounds.data.startx; + boundary.height = bounds.data.stopy - bounds.data.starty; + boundary.label.y = conf.c4ShapeMargin - 35; + let boundaryTextWrap = boundary.wrap && conf.wrap; + let boundaryLabelConf = boundaryFont(conf); + boundaryLabelConf.fontSize = boundaryLabelConf.fontSize + 2; + boundaryLabelConf.fontWeight = "bold"; + let textLimitWidth = calculateTextWidth(boundary.label.text, boundaryLabelConf); + calcC4ShapeTextWH("label", boundary, boundaryTextWrap, boundaryLabelConf, textLimitWidth); + svgDraw.drawBoundary(diagram2, boundary, conf); +}; +const drawC4ShapeArray = function(currentBounds, diagram2, c4ShapeArray2, c4ShapeKeys) { + let Y = 0; + for (const c4ShapeKey of c4ShapeKeys) { + Y = 0; + const c4Shape = c4ShapeArray2[c4ShapeKey]; + let c4ShapeTypeConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + c4ShapeTypeConf.fontSize = c4ShapeTypeConf.fontSize - 2; + c4Shape.typeC4Shape.width = calculateTextWidth( + "«" + c4Shape.typeC4Shape.text + "»", + c4ShapeTypeConf + ); + c4Shape.typeC4Shape.height = c4ShapeTypeConf.fontSize + 2; + c4Shape.typeC4Shape.Y = conf.c4ShapePadding; + Y = c4Shape.typeC4Shape.Y + c4Shape.typeC4Shape.height - 4; + c4Shape.image = { width: 0, height: 0, Y: 0 }; + switch (c4Shape.typeC4Shape.text) { + case "person": + case "external_person": + c4Shape.image.width = 48; + c4Shape.image.height = 48; + c4Shape.image.Y = Y; + Y = c4Shape.image.Y + c4Shape.image.height; + break; + } + if (c4Shape.sprite) { + c4Shape.image.width = 48; + c4Shape.image.height = 48; + c4Shape.image.Y = Y; + Y = c4Shape.image.Y + c4Shape.image.height; + } + let c4ShapeTextWrap = c4Shape.wrap && conf.wrap; + let textLimitWidth = conf.width - conf.c4ShapePadding * 2; + let c4ShapeLabelConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + c4ShapeLabelConf.fontSize = c4ShapeLabelConf.fontSize + 2; + c4ShapeLabelConf.fontWeight = "bold"; + calcC4ShapeTextWH("label", c4Shape, c4ShapeTextWrap, c4ShapeLabelConf, textLimitWidth); + c4Shape["label"].Y = Y + 8; + Y = c4Shape["label"].Y + c4Shape["label"].height; + if (c4Shape.type && c4Shape.type.text !== "") { + c4Shape.type.text = "[" + c4Shape.type.text + "]"; + let c4ShapeTypeConf2 = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + calcC4ShapeTextWH("type", c4Shape, c4ShapeTextWrap, c4ShapeTypeConf2, textLimitWidth); + c4Shape["type"].Y = Y + 5; + Y = c4Shape["type"].Y + c4Shape["type"].height; + } else if (c4Shape.techn && c4Shape.techn.text !== "") { + c4Shape.techn.text = "[" + c4Shape.techn.text + "]"; + let c4ShapeTechnConf = c4ShapeFont(conf, c4Shape.techn.text); + calcC4ShapeTextWH("techn", c4Shape, c4ShapeTextWrap, c4ShapeTechnConf, textLimitWidth); + c4Shape["techn"].Y = Y + 5; + Y = c4Shape["techn"].Y + c4Shape["techn"].height; + } + let rectHeight = Y; + let rectWidth = c4Shape.label.width; + if (c4Shape.descr && c4Shape.descr.text !== "") { + let c4ShapeDescrConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + calcC4ShapeTextWH("descr", c4Shape, c4ShapeTextWrap, c4ShapeDescrConf, textLimitWidth); + c4Shape["descr"].Y = Y + 20; + Y = c4Shape["descr"].Y + c4Shape["descr"].height; + rectWidth = Math.max(c4Shape.label.width, c4Shape.descr.width); + rectHeight = Y - c4Shape["descr"].textLines * 5; + } + rectWidth = rectWidth + conf.c4ShapePadding; + c4Shape.width = Math.max(c4Shape.width || conf.width, rectWidth, conf.width); + c4Shape.height = Math.max(c4Shape.height || conf.height, rectHeight, conf.height); + c4Shape.margin = c4Shape.margin || conf.c4ShapeMargin; + currentBounds.insert(c4Shape); + svgDraw.drawC4Shape(diagram2, c4Shape, conf); + } + currentBounds.bumpLastMargin(conf.c4ShapeMargin); +}; +class Point { + constructor(x, y) { + this.x = x; + this.y = y; + } +} +let getIntersectPoint = function(fromNode, endPoint) { + let x1 = fromNode.x; + let y1 = fromNode.y; + let x2 = endPoint.x; + let y2 = endPoint.y; + let fromCenterX = x1 + fromNode.width / 2; + let fromCenterY = y1 + fromNode.height / 2; + let dx = Math.abs(x1 - x2); + let dy = Math.abs(y1 - y2); + let tanDYX = dy / dx; + let fromDYX = fromNode.height / fromNode.width; + let returnPoint = null; + if (y1 == y2 && x1 < x2) { + returnPoint = new Point(x1 + fromNode.width, fromCenterY); + } else if (y1 == y2 && x1 > x2) { + returnPoint = new Point(x1, fromCenterY); + } else if (x1 == x2 && y1 < y2) { + returnPoint = new Point(fromCenterX, y1 + fromNode.height); + } else if (x1 == x2 && y1 > y2) { + returnPoint = new Point(fromCenterX, y1); + } + if (x1 > x2 && y1 < y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1, fromCenterY + tanDYX * fromNode.width / 2); + } else { + returnPoint = new Point( + fromCenterX - dx / dy * fromNode.height / 2, + y1 + fromNode.height + ); + } + } else if (x1 < x2 && y1 < y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1 + fromNode.width, fromCenterY + tanDYX * fromNode.width / 2); + } else { + returnPoint = new Point( + fromCenterX + dx / dy * fromNode.height / 2, + y1 + fromNode.height + ); + } + } else if (x1 < x2 && y1 > y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1 + fromNode.width, fromCenterY - tanDYX * fromNode.width / 2); + } else { + returnPoint = new Point(fromCenterX + fromNode.height / 2 * dx / dy, y1); + } + } else if (x1 > x2 && y1 > y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1, fromCenterY - fromNode.width / 2 * tanDYX); + } else { + returnPoint = new Point(fromCenterX - fromNode.height / 2 * dx / dy, y1); + } + } + return returnPoint; +}; +let getIntersectPoints = function(fromNode, endNode) { + let endIntersectPoint = { x: 0, y: 0 }; + endIntersectPoint.x = endNode.x + endNode.width / 2; + endIntersectPoint.y = endNode.y + endNode.height / 2; + let startPoint = getIntersectPoint(fromNode, endIntersectPoint); + endIntersectPoint.x = fromNode.x + fromNode.width / 2; + endIntersectPoint.y = fromNode.y + fromNode.height / 2; + let endPoint = getIntersectPoint(endNode, endIntersectPoint); + return { startPoint, endPoint }; +}; +const drawRels = function(diagram2, rels2, getC4ShapeObj, diagObj) { + let i = 0; + for (let rel of rels2) { + i = i + 1; + let relTextWrap = rel.wrap && conf.wrap; + let relConf = messageFont(conf); + let diagramType = diagObj.db.getC4Type(); + if (diagramType === "C4Dynamic") { + rel.label.text = i + ": " + rel.label.text; + } + let textLimitWidth = calculateTextWidth(rel.label.text, relConf); + calcC4ShapeTextWH("label", rel, relTextWrap, relConf, textLimitWidth); + if (rel.techn && rel.techn.text !== "") { + textLimitWidth = calculateTextWidth(rel.techn.text, relConf); + calcC4ShapeTextWH("techn", rel, relTextWrap, relConf, textLimitWidth); + } + if (rel.descr && rel.descr.text !== "") { + textLimitWidth = calculateTextWidth(rel.descr.text, relConf); + calcC4ShapeTextWH("descr", rel, relTextWrap, relConf, textLimitWidth); + } + let fromNode = getC4ShapeObj(rel.from); + let endNode = getC4ShapeObj(rel.to); + let points = getIntersectPoints(fromNode, endNode); + rel.startPoint = points.startPoint; + rel.endPoint = points.endPoint; + } + svgDraw.drawRels(diagram2, rels2, conf); +}; +function drawInsideBoundary(diagram2, parentBoundaryAlias, parentBounds, currentBoundaries, diagObj) { + let currentBounds = new Bounds(diagObj); + currentBounds.data.widthLimit = parentBounds.data.widthLimit / Math.min(c4BoundaryInRow, currentBoundaries.length); + for (let [i, currentBoundary] of currentBoundaries.entries()) { + let Y = 0; + currentBoundary.image = { width: 0, height: 0, Y: 0 }; + if (currentBoundary.sprite) { + currentBoundary.image.width = 48; + currentBoundary.image.height = 48; + currentBoundary.image.Y = Y; + Y = currentBoundary.image.Y + currentBoundary.image.height; + } + let currentBoundaryTextWrap = currentBoundary.wrap && conf.wrap; + let currentBoundaryLabelConf = boundaryFont(conf); + currentBoundaryLabelConf.fontSize = currentBoundaryLabelConf.fontSize + 2; + currentBoundaryLabelConf.fontWeight = "bold"; + calcC4ShapeTextWH( + "label", + currentBoundary, + currentBoundaryTextWrap, + currentBoundaryLabelConf, + currentBounds.data.widthLimit + ); + currentBoundary["label"].Y = Y + 8; + Y = currentBoundary["label"].Y + currentBoundary["label"].height; + if (currentBoundary.type && currentBoundary.type.text !== "") { + currentBoundary.type.text = "[" + currentBoundary.type.text + "]"; + let currentBoundaryTypeConf = boundaryFont(conf); + calcC4ShapeTextWH( + "type", + currentBoundary, + currentBoundaryTextWrap, + currentBoundaryTypeConf, + currentBounds.data.widthLimit + ); + currentBoundary["type"].Y = Y + 5; + Y = currentBoundary["type"].Y + currentBoundary["type"].height; + } + if (currentBoundary.descr && currentBoundary.descr.text !== "") { + let currentBoundaryDescrConf = boundaryFont(conf); + currentBoundaryDescrConf.fontSize = currentBoundaryDescrConf.fontSize - 2; + calcC4ShapeTextWH( + "descr", + currentBoundary, + currentBoundaryTextWrap, + currentBoundaryDescrConf, + currentBounds.data.widthLimit + ); + currentBoundary["descr"].Y = Y + 20; + Y = currentBoundary["descr"].Y + currentBoundary["descr"].height; + } + if (i == 0 || i % c4BoundaryInRow === 0) { + let _x = parentBounds.data.startx + conf.diagramMarginX; + let _y = parentBounds.data.stopy + conf.diagramMarginY + Y; + currentBounds.setData(_x, _x, _y, _y); + } else { + let _x = currentBounds.data.stopx !== currentBounds.data.startx ? currentBounds.data.stopx + conf.diagramMarginX : currentBounds.data.startx; + let _y = currentBounds.data.starty; + currentBounds.setData(_x, _x, _y, _y); + } + currentBounds.name = currentBoundary.alias; + let currentPersonOrSystemArray = diagObj.db.getC4ShapeArray(currentBoundary.alias); + let currentPersonOrSystemKeys = diagObj.db.getC4ShapeKeys(currentBoundary.alias); + if (currentPersonOrSystemKeys.length > 0) { + drawC4ShapeArray( + currentBounds, + diagram2, + currentPersonOrSystemArray, + currentPersonOrSystemKeys + ); + } + parentBoundaryAlias = currentBoundary.alias; + let nextCurrentBoundaries = diagObj.db.getBoundarys(parentBoundaryAlias); + if (nextCurrentBoundaries.length > 0) { + drawInsideBoundary( + diagram2, + parentBoundaryAlias, + currentBounds, + nextCurrentBoundaries, + diagObj + ); + } + if (currentBoundary.alias !== "global") { + drawBoundary(diagram2, currentBoundary, currentBounds); + } + parentBounds.data.stopy = Math.max( + currentBounds.data.stopy + conf.c4ShapeMargin, + parentBounds.data.stopy + ); + parentBounds.data.stopx = Math.max( + currentBounds.data.stopx + conf.c4ShapeMargin, + parentBounds.data.stopx + ); + globalBoundaryMaxX = Math.max(globalBoundaryMaxX, parentBounds.data.stopx); + globalBoundaryMaxY = Math.max(globalBoundaryMaxY, parentBounds.data.stopy); + } +} +const draw = function(_text, id, _version, diagObj) { + conf = getConfig().c4; + const securityLevel = getConfig().securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = select("#i" + id); + } + const root = securityLevel === "sandbox" ? select(sandboxElement.nodes()[0].contentDocument.body) : select("body"); + let db2 = diagObj.db; + diagObj.db.setWrap(conf.wrap); + c4ShapeInRow = db2.getC4ShapeInRow(); + c4BoundaryInRow = db2.getC4BoundaryInRow(); + log.debug(`C:${JSON.stringify(conf, null, 2)}`); + const diagram2 = securityLevel === "sandbox" ? root.select(`[id="${id}"]`) : select(`[id="${id}"]`); + svgDraw.insertComputerIcon(diagram2); + svgDraw.insertDatabaseIcon(diagram2); + svgDraw.insertClockIcon(diagram2); + let screenBounds = new Bounds(diagObj); + screenBounds.setData( + conf.diagramMarginX, + conf.diagramMarginX, + conf.diagramMarginY, + conf.diagramMarginY + ); + screenBounds.data.widthLimit = screen.availWidth; + globalBoundaryMaxX = conf.diagramMarginX; + globalBoundaryMaxY = conf.diagramMarginY; + const title2 = diagObj.db.getTitle(); + let currentBoundaries = diagObj.db.getBoundarys(""); + drawInsideBoundary(diagram2, "", screenBounds, currentBoundaries, diagObj); + svgDraw.insertArrowHead(diagram2); + svgDraw.insertArrowEnd(diagram2); + svgDraw.insertArrowCrossHead(diagram2); + svgDraw.insertArrowFilledHead(diagram2); + drawRels(diagram2, diagObj.db.getRels(), diagObj.db.getC4Shape, diagObj); + screenBounds.data.stopx = globalBoundaryMaxX; + screenBounds.data.stopy = globalBoundaryMaxY; + const box = screenBounds.data; + let boxHeight = box.stopy - box.starty; + let height = boxHeight + 2 * conf.diagramMarginY; + let boxWidth = box.stopx - box.startx; + const width = boxWidth + 2 * conf.diagramMarginX; + if (title2) { + diagram2.append("text").text(title2).attr("x", (box.stopx - box.startx) / 2 - 4 * conf.diagramMarginX).attr("y", box.starty + conf.diagramMarginY); + } + configureSvgSize(diagram2, height, width, conf.useMaxWidth); + const extraVertForTitle = title2 ? 60 : 0; + diagram2.attr( + "viewBox", + box.startx - conf.diagramMarginX + " -" + (conf.diagramMarginY + extraVertForTitle) + " " + width + " " + (height + extraVertForTitle) + ); + log.debug(`models:`, box); +}; +const renderer = { + drawPersonOrSystemArray: drawC4ShapeArray, + drawBoundary, + setConf, + draw +}; +const getStyles = (options) => `.person { + stroke: ${options.personBorder}; + fill: ${options.personBkg}; + } +`; +const styles = getStyles; +const diagram = { + parser: parser$1, + db, + renderer, + styles, + init: ({ c4, wrap }) => { + renderer.setConf(c4); + db.setWrap(wrap); + } +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/channel-d3ce1aa3.js b/vs-code-extension/media/mermaid/channel-d3ce1aa3.js new file mode 100644 index 0000000..ac84e06 --- /dev/null +++ b/vs-code-extension/media/mermaid/channel-d3ce1aa3.js @@ -0,0 +1,5 @@ +import { aI as o, aJ as r } from "./mermaid-b92f6f74.js"; +const s = (a, n) => o.lang.round(r.parse(a)[n]), e = s; +export { + e as c +}; diff --git a/vs-code-extension/media/mermaid/channel-f19f13a4.js b/vs-code-extension/media/mermaid/channel-f19f13a4.js new file mode 100644 index 0000000..78e307b --- /dev/null +++ b/vs-code-extension/media/mermaid/channel-f19f13a4.js @@ -0,0 +1,8 @@ +import { aI as _, aJ as Color } from "./mermaid-d73f18bb.js"; +const channel = (color, channel2) => { + return _.lang.round(Color.parse(color)[channel2]); +}; +const channel$1 = channel; +export { + channel$1 as c +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/architectureDiagram-VXUJARFQ.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/architectureDiagram-VXUJARFQ.mjs new file mode 100644 index 0000000..2a5605b --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/architectureDiagram-VXUJARFQ.mjs @@ -0,0 +1,1168 @@ +import { + selectSvgElement +} from "./chunk-EXTU4WIE.mjs"; +import { + createText, + getIconSVG, + registerIconPacks, + unknownIcon +} from "./chunk-JA3XYJ7Z.mjs"; +import { + populateCommonDb +} from "./chunk-4BX2VUAB.mjs"; +import { + cleanAndMerge, + getEdgeId +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + defaultConfig_default, + getAccDescription, + getAccTitle, + getConfig, + getConfig2, + getDiagramTitle, + sanitizeText, + setAccDescription, + setAccTitle, + setDiagramTitle, + setupGraphViewbox +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/architecture/architectureParser.ts +import { parse } from "@mermaid-js/parser"; + +// src/diagrams/architecture/architectureTypes.ts +var ArchitectureDirectionName = { + L: "left", + R: "right", + T: "top", + B: "bottom" +}; +var ArchitectureDirectionArrow = { + L: /* @__PURE__ */ __name((scale) => `${scale},${scale / 2} 0,${scale} 0,0`, "L"), + R: /* @__PURE__ */ __name((scale) => `0,${scale / 2} ${scale},0 ${scale},${scale}`, "R"), + T: /* @__PURE__ */ __name((scale) => `0,0 ${scale},0 ${scale / 2},${scale}`, "T"), + B: /* @__PURE__ */ __name((scale) => `${scale / 2},0 ${scale},${scale} 0,${scale}`, "B") +}; +var ArchitectureDirectionArrowShift = { + L: /* @__PURE__ */ __name((orig, arrowSize) => orig - arrowSize + 2, "L"), + R: /* @__PURE__ */ __name((orig, _arrowSize) => orig - 2, "R"), + T: /* @__PURE__ */ __name((orig, arrowSize) => orig - arrowSize + 2, "T"), + B: /* @__PURE__ */ __name((orig, _arrowSize) => orig - 2, "B") +}; +var getOppositeArchitectureDirection = /* @__PURE__ */ __name(function(x) { + if (isArchitectureDirectionX(x)) { + return x === "L" ? "R" : "L"; + } else { + return x === "T" ? "B" : "T"; + } +}, "getOppositeArchitectureDirection"); +var isArchitectureDirection = /* @__PURE__ */ __name(function(x) { + const temp = x; + return temp === "L" || temp === "R" || temp === "T" || temp === "B"; +}, "isArchitectureDirection"); +var isArchitectureDirectionX = /* @__PURE__ */ __name(function(x) { + const temp = x; + return temp === "L" || temp === "R"; +}, "isArchitectureDirectionX"); +var isArchitectureDirectionY = /* @__PURE__ */ __name(function(x) { + const temp = x; + return temp === "T" || temp === "B"; +}, "isArchitectureDirectionY"); +var isArchitectureDirectionXY = /* @__PURE__ */ __name(function(a, b) { + const aX_bY = isArchitectureDirectionX(a) && isArchitectureDirectionY(b); + const aY_bX = isArchitectureDirectionY(a) && isArchitectureDirectionX(b); + return aX_bY || aY_bX; +}, "isArchitectureDirectionXY"); +var isArchitecturePairXY = /* @__PURE__ */ __name(function(pair) { + const lhs = pair[0]; + const rhs = pair[1]; + const aX_bY = isArchitectureDirectionX(lhs) && isArchitectureDirectionY(rhs); + const aY_bX = isArchitectureDirectionY(lhs) && isArchitectureDirectionX(rhs); + return aX_bY || aY_bX; +}, "isArchitecturePairXY"); +var isValidArchitectureDirectionPair = /* @__PURE__ */ __name(function(x) { + return x !== "LL" && x !== "RR" && x !== "TT" && x !== "BB"; +}, "isValidArchitectureDirectionPair"); +var getArchitectureDirectionPair = /* @__PURE__ */ __name(function(sourceDir, targetDir) { + const pair = `${sourceDir}${targetDir}`; + return isValidArchitectureDirectionPair(pair) ? pair : void 0; +}, "getArchitectureDirectionPair"); +var shiftPositionByArchitectureDirectionPair = /* @__PURE__ */ __name(function([x, y], pair) { + const lhs = pair[0]; + const rhs = pair[1]; + if (isArchitectureDirectionX(lhs)) { + if (isArchitectureDirectionY(rhs)) { + return [x + (lhs === "L" ? -1 : 1), y + (rhs === "T" ? 1 : -1)]; + } else { + return [x + (lhs === "L" ? -1 : 1), y]; + } + } else { + if (isArchitectureDirectionX(rhs)) { + return [x + (rhs === "L" ? 1 : -1), y + (lhs === "T" ? 1 : -1)]; + } else { + return [x, y + (lhs === "T" ? 1 : -1)]; + } + } +}, "shiftPositionByArchitectureDirectionPair"); +var getArchitectureDirectionXYFactors = /* @__PURE__ */ __name(function(pair) { + if (pair === "LT" || pair === "TL") { + return [1, 1]; + } else if (pair === "BL" || pair === "LB") { + return [1, -1]; + } else if (pair === "BR" || pair === "RB") { + return [-1, -1]; + } else { + return [-1, 1]; + } +}, "getArchitectureDirectionXYFactors"); +var getArchitectureDirectionAlignment = /* @__PURE__ */ __name(function(a, b) { + if (isArchitectureDirectionXY(a, b)) { + return "bend"; + } else if (isArchitectureDirectionX(a)) { + return "horizontal"; + } + return "vertical"; +}, "getArchitectureDirectionAlignment"); +var isArchitectureService = /* @__PURE__ */ __name(function(x) { + const temp = x; + return temp.type === "service"; +}, "isArchitectureService"); +var isArchitectureJunction = /* @__PURE__ */ __name(function(x) { + const temp = x; + return temp.type === "junction"; +}, "isArchitectureJunction"); +var edgeData = /* @__PURE__ */ __name((edge) => { + return edge.data(); +}, "edgeData"); +var nodeData = /* @__PURE__ */ __name((node) => { + return node.data(); +}, "nodeData"); + +// src/diagrams/architecture/architectureDb.ts +var DEFAULT_ARCHITECTURE_CONFIG = defaultConfig_default.architecture; +var ArchitectureDB = class { + constructor() { + this.nodes = {}; + this.groups = {}; + this.edges = []; + this.registeredIds = {}; + this.elements = {}; + this.setAccTitle = setAccTitle; + this.getAccTitle = getAccTitle; + this.setDiagramTitle = setDiagramTitle; + this.getDiagramTitle = getDiagramTitle; + this.getAccDescription = getAccDescription; + this.setAccDescription = setAccDescription; + this.clear(); + } + static { + __name(this, "ArchitectureDB"); + } + clear() { + this.nodes = {}; + this.groups = {}; + this.edges = []; + this.registeredIds = {}; + this.dataStructures = void 0; + this.elements = {}; + clear(); + } + addService({ + id, + icon, + in: parent, + title, + iconText + }) { + if (this.registeredIds[id] !== void 0) { + throw new Error( + `The service id [${id}] is already in use by another ${this.registeredIds[id]}` + ); + } + if (parent !== void 0) { + if (id === parent) { + throw new Error(`The service [${id}] cannot be placed within itself`); + } + if (this.registeredIds[parent] === void 0) { + throw new Error( + `The service [${id}]'s parent does not exist. Please make sure the parent is created before this service` + ); + } + if (this.registeredIds[parent] === "node") { + throw new Error(`The service [${id}]'s parent is not a group`); + } + } + this.registeredIds[id] = "node"; + this.nodes[id] = { + id, + type: "service", + icon, + iconText, + title, + edges: [], + in: parent + }; + } + getServices() { + return Object.values(this.nodes).filter(isArchitectureService); + } + addJunction({ id, in: parent }) { + this.registeredIds[id] = "node"; + this.nodes[id] = { + id, + type: "junction", + edges: [], + in: parent + }; + } + getJunctions() { + return Object.values(this.nodes).filter(isArchitectureJunction); + } + getNodes() { + return Object.values(this.nodes); + } + getNode(id) { + return this.nodes[id] ?? null; + } + addGroup({ id, icon, in: parent, title }) { + if (this.registeredIds?.[id] !== void 0) { + throw new Error( + `The group id [${id}] is already in use by another ${this.registeredIds[id]}` + ); + } + if (parent !== void 0) { + if (id === parent) { + throw new Error(`The group [${id}] cannot be placed within itself`); + } + if (this.registeredIds?.[parent] === void 0) { + throw new Error( + `The group [${id}]'s parent does not exist. Please make sure the parent is created before this group` + ); + } + if (this.registeredIds?.[parent] === "node") { + throw new Error(`The group [${id}]'s parent is not a group`); + } + } + this.registeredIds[id] = "group"; + this.groups[id] = { + id, + icon, + title, + in: parent + }; + } + getGroups() { + return Object.values(this.groups); + } + addEdge({ + lhsId, + rhsId, + lhsDir, + rhsDir, + lhsInto, + rhsInto, + lhsGroup, + rhsGroup, + title + }) { + if (!isArchitectureDirection(lhsDir)) { + throw new Error( + `Invalid direction given for left hand side of edge ${lhsId}--${rhsId}. Expected (L,R,T,B) got ${String(lhsDir)}` + ); + } + if (!isArchitectureDirection(rhsDir)) { + throw new Error( + `Invalid direction given for right hand side of edge ${lhsId}--${rhsId}. Expected (L,R,T,B) got ${String(rhsDir)}` + ); + } + if (this.nodes[lhsId] === void 0 && this.groups[lhsId] === void 0) { + throw new Error( + `The left-hand id [${lhsId}] does not yet exist. Please create the service/group before declaring an edge to it.` + ); + } + if (this.nodes[rhsId] === void 0 && this.groups[rhsId] === void 0) { + throw new Error( + `The right-hand id [${rhsId}] does not yet exist. Please create the service/group before declaring an edge to it.` + ); + } + const lhsGroupId = this.nodes[lhsId].in; + const rhsGroupId = this.nodes[rhsId].in; + if (lhsGroup && lhsGroupId && rhsGroupId && lhsGroupId == rhsGroupId) { + throw new Error( + `The left-hand id [${lhsId}] is modified to traverse the group boundary, but the edge does not pass through two groups.` + ); + } + if (rhsGroup && lhsGroupId && rhsGroupId && lhsGroupId == rhsGroupId) { + throw new Error( + `The right-hand id [${rhsId}] is modified to traverse the group boundary, but the edge does not pass through two groups.` + ); + } + const edge = { + lhsId, + lhsDir, + lhsInto, + lhsGroup, + rhsId, + rhsDir, + rhsInto, + rhsGroup, + title + }; + this.edges.push(edge); + if (this.nodes[lhsId] && this.nodes[rhsId]) { + this.nodes[lhsId].edges.push(this.edges[this.edges.length - 1]); + this.nodes[rhsId].edges.push(this.edges[this.edges.length - 1]); + } + } + getEdges() { + return this.edges; + } + /** + * Returns the current diagram's adjacency list, spatial map, & group alignments. + * If they have not been created, run the algorithms to generate them. + * @returns + */ + getDataStructures() { + if (this.dataStructures === void 0) { + const groupAlignments = {}; + const adjList = Object.entries(this.nodes).reduce((prevOuter, [id, service]) => { + prevOuter[id] = service.edges.reduce((prevInner, edge) => { + const lhsGroupId = this.getNode(edge.lhsId)?.in; + const rhsGroupId = this.getNode(edge.rhsId)?.in; + if (lhsGroupId && rhsGroupId && lhsGroupId !== rhsGroupId) { + const alignment = getArchitectureDirectionAlignment(edge.lhsDir, edge.rhsDir); + if (alignment !== "bend") { + groupAlignments[lhsGroupId] ??= {}; + groupAlignments[lhsGroupId][rhsGroupId] = alignment; + groupAlignments[rhsGroupId] ??= {}; + groupAlignments[rhsGroupId][lhsGroupId] = alignment; + } + } + if (edge.lhsId === id) { + const pair = getArchitectureDirectionPair(edge.lhsDir, edge.rhsDir); + if (pair) { + prevInner[pair] = edge.rhsId; + } + } else { + const pair = getArchitectureDirectionPair(edge.rhsDir, edge.lhsDir); + if (pair) { + prevInner[pair] = edge.lhsId; + } + } + return prevInner; + }, {}); + return prevOuter; + }, {}); + const firstId = Object.keys(adjList)[0]; + const visited = { [firstId]: 1 }; + const notVisited = Object.keys(adjList).reduce( + (prev, id) => id === firstId ? prev : { ...prev, [id]: 1 }, + {} + ); + const BFS = /* @__PURE__ */ __name((startingId) => { + const spatialMap = { [startingId]: [0, 0] }; + const queue = [startingId]; + while (queue.length > 0) { + const id = queue.shift(); + if (id) { + visited[id] = 1; + delete notVisited[id]; + const adj = adjList[id]; + const [posX, posY] = spatialMap[id]; + Object.entries(adj).forEach(([dir, rhsId]) => { + if (!visited[rhsId]) { + spatialMap[rhsId] = shiftPositionByArchitectureDirectionPair( + [posX, posY], + dir + ); + queue.push(rhsId); + } + }); + } + } + return spatialMap; + }, "BFS"); + const spatialMaps = [BFS(firstId)]; + while (Object.keys(notVisited).length > 0) { + spatialMaps.push(BFS(Object.keys(notVisited)[0])); + } + this.dataStructures = { + adjList, + spatialMaps, + groupAlignments + }; + } + return this.dataStructures; + } + setElementForId(id, element) { + this.elements[id] = element; + } + getElementById(id) { + return this.elements[id]; + } + getConfig() { + return cleanAndMerge({ + ...DEFAULT_ARCHITECTURE_CONFIG, + ...getConfig().architecture + }); + } + getConfigField(field) { + return this.getConfig()[field]; + } +}; + +// src/diagrams/architecture/architectureParser.ts +var populateDb = /* @__PURE__ */ __name((ast, db) => { + populateCommonDb(ast, db); + ast.groups.map((group) => db.addGroup(group)); + ast.services.map((service) => db.addService({ ...service, type: "service" })); + ast.junctions.map((service) => db.addJunction({ ...service, type: "junction" })); + ast.edges.map((edge) => db.addEdge(edge)); +}, "populateDb"); +var parser = { + parser: { + // @ts-expect-error - ArchitectureDB is not assignable to DiagramDB + yy: void 0 + }, + parse: /* @__PURE__ */ __name(async (input) => { + const ast = await parse("architecture", input); + log.debug(ast); + const db = parser.parser?.yy; + if (!(db instanceof ArchitectureDB)) { + throw new Error( + "parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues." + ); + } + populateDb(ast, db); + }, "parse") +}; + +// src/diagrams/architecture/architectureStyles.ts +var getStyles = /* @__PURE__ */ __name((options) => ` + .edge { + stroke-width: ${options.archEdgeWidth}; + stroke: ${options.archEdgeColor}; + fill: none; + } + + .arrow { + fill: ${options.archEdgeArrowColor}; + } + + .node-bkg { + fill: none; + stroke: ${options.archGroupBorderColor}; + stroke-width: ${options.archGroupBorderWidth}; + stroke-dasharray: 8; + } + .node-icon-text { + display: flex; + align-items: center; + } + + .node-icon-text > div { + color: #fff; + margin: 1px; + height: fit-content; + text-align: center; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + } +`, "getStyles"); +var architectureStyles_default = getStyles; + +// src/diagrams/architecture/architectureRenderer.ts +import cytoscape from "cytoscape"; +import fcose from "cytoscape-fcose"; +import { select } from "d3"; + +// src/diagrams/architecture/architectureIcons.ts +var wrapIcon = /* @__PURE__ */ __name((icon) => { + return `${icon}`; +}, "wrapIcon"); +var architectureIcons = { + prefix: "mermaid-architecture", + height: 80, + width: 80, + icons: { + database: { + body: wrapIcon( + '' + ) + }, + server: { + body: wrapIcon( + '' + ) + }, + disk: { + body: wrapIcon( + '' + ) + }, + internet: { + body: wrapIcon( + '' + ) + }, + cloud: { + body: wrapIcon( + '' + ) + }, + unknown: unknownIcon, + blank: { + body: wrapIcon("") + } + } +}; + +// src/diagrams/architecture/svgDraw.ts +var drawEdges = /* @__PURE__ */ __name(async function(edgesEl, cy, db) { + const padding = db.getConfigField("padding"); + const iconSize = db.getConfigField("iconSize"); + const halfIconSize = iconSize / 2; + const arrowSize = iconSize / 6; + const halfArrowSize = arrowSize / 2; + await Promise.all( + cy.edges().map(async (edge) => { + const { + source, + sourceDir, + sourceArrow, + sourceGroup, + target, + targetDir, + targetArrow, + targetGroup, + label + } = edgeData(edge); + let { x: startX, y: startY } = edge[0].sourceEndpoint(); + const { x: midX, y: midY } = edge[0].midpoint(); + let { x: endX, y: endY } = edge[0].targetEndpoint(); + const groupEdgeShift = padding + 4; + if (sourceGroup) { + if (isArchitectureDirectionX(sourceDir)) { + startX += sourceDir === "L" ? -groupEdgeShift : groupEdgeShift; + } else { + startY += sourceDir === "T" ? -groupEdgeShift : groupEdgeShift + 18; + } + } + if (targetGroup) { + if (isArchitectureDirectionX(targetDir)) { + endX += targetDir === "L" ? -groupEdgeShift : groupEdgeShift; + } else { + endY += targetDir === "T" ? -groupEdgeShift : groupEdgeShift + 18; + } + } + if (!sourceGroup && db.getNode(source)?.type === "junction") { + if (isArchitectureDirectionX(sourceDir)) { + startX += sourceDir === "L" ? halfIconSize : -halfIconSize; + } else { + startY += sourceDir === "T" ? halfIconSize : -halfIconSize; + } + } + if (!targetGroup && db.getNode(target)?.type === "junction") { + if (isArchitectureDirectionX(targetDir)) { + endX += targetDir === "L" ? halfIconSize : -halfIconSize; + } else { + endY += targetDir === "T" ? halfIconSize : -halfIconSize; + } + } + if (edge[0]._private.rscratch) { + const g = edgesEl.insert("g"); + g.insert("path").attr("d", `M ${startX},${startY} L ${midX},${midY} L${endX},${endY} `).attr("class", "edge").attr("id", getEdgeId(source, target, { prefix: "L" })); + if (sourceArrow) { + const xShift = isArchitectureDirectionX(sourceDir) ? ArchitectureDirectionArrowShift[sourceDir](startX, arrowSize) : startX - halfArrowSize; + const yShift = isArchitectureDirectionY(sourceDir) ? ArchitectureDirectionArrowShift[sourceDir](startY, arrowSize) : startY - halfArrowSize; + g.insert("polygon").attr("points", ArchitectureDirectionArrow[sourceDir](arrowSize)).attr("transform", `translate(${xShift},${yShift})`).attr("class", "arrow"); + } + if (targetArrow) { + const xShift = isArchitectureDirectionX(targetDir) ? ArchitectureDirectionArrowShift[targetDir](endX, arrowSize) : endX - halfArrowSize; + const yShift = isArchitectureDirectionY(targetDir) ? ArchitectureDirectionArrowShift[targetDir](endY, arrowSize) : endY - halfArrowSize; + g.insert("polygon").attr("points", ArchitectureDirectionArrow[targetDir](arrowSize)).attr("transform", `translate(${xShift},${yShift})`).attr("class", "arrow"); + } + if (label) { + const axis = !isArchitectureDirectionXY(sourceDir, targetDir) ? isArchitectureDirectionX(sourceDir) ? "X" : "Y" : "XY"; + let width = 0; + if (axis === "X") { + width = Math.abs(startX - endX); + } else if (axis === "Y") { + width = Math.abs(startY - endY) / 1.5; + } else { + width = Math.abs(startX - endX) / 2; + } + const textElem = g.append("g"); + await createText( + textElem, + label, + { + useHtmlLabels: false, + width, + classes: "architecture-service-label" + }, + getConfig2() + ); + textElem.attr("dy", "1em").attr("alignment-baseline", "middle").attr("dominant-baseline", "middle").attr("text-anchor", "middle"); + if (axis === "X") { + textElem.attr("transform", "translate(" + midX + ", " + midY + ")"); + } else if (axis === "Y") { + textElem.attr("transform", "translate(" + midX + ", " + midY + ") rotate(-90)"); + } else if (axis === "XY") { + const pair = getArchitectureDirectionPair(sourceDir, targetDir); + if (pair && isArchitecturePairXY(pair)) { + const bboxOrig = textElem.node().getBoundingClientRect(); + const [x, y] = getArchitectureDirectionXYFactors(pair); + textElem.attr("dominant-baseline", "auto").attr("transform", `rotate(${-1 * x * y * 45})`); + const bboxNew = textElem.node().getBoundingClientRect(); + textElem.attr( + "transform", + ` + translate(${midX}, ${midY - bboxOrig.height / 2}) + translate(${x * bboxNew.width / 2}, ${y * bboxNew.height / 2}) + rotate(${-1 * x * y * 45}, 0, ${bboxOrig.height / 2}) + ` + ); + } + } + } + } + }) + ); +}, "drawEdges"); +var drawGroups = /* @__PURE__ */ __name(async function(groupsEl, cy, db) { + const padding = db.getConfigField("padding"); + const groupIconSize = padding * 0.75; + const fontSize = db.getConfigField("fontSize"); + const iconSize = db.getConfigField("iconSize"); + const halfIconSize = iconSize / 2; + await Promise.all( + cy.nodes().map(async (node) => { + const data = nodeData(node); + if (data.type === "group") { + const { h, w, x1, y1 } = node.boundingBox(); + const groupsNode = groupsEl.append("rect"); + groupsNode.attr("id", `group-${data.id}`).attr("x", x1 + halfIconSize).attr("y", y1 + halfIconSize).attr("width", w).attr("height", h).attr("class", "node-bkg"); + const groupLabelContainer = groupsEl.append("g"); + let shiftedX1 = x1; + let shiftedY1 = y1; + if (data.icon) { + const bkgElem = groupLabelContainer.append("g"); + bkgElem.html( + `${await getIconSVG(data.icon, { height: groupIconSize, width: groupIconSize, fallbackPrefix: architectureIcons.prefix })}` + ); + bkgElem.attr( + "transform", + "translate(" + (shiftedX1 + halfIconSize + 1) + ", " + (shiftedY1 + halfIconSize + 1) + ")" + ); + shiftedX1 += groupIconSize; + shiftedY1 += fontSize / 2 - 1 - 2; + } + if (data.label) { + const textElem = groupLabelContainer.append("g"); + await createText( + textElem, + data.label, + { + useHtmlLabels: false, + width: w, + classes: "architecture-service-label" + }, + getConfig2() + ); + textElem.attr("dy", "1em").attr("alignment-baseline", "middle").attr("dominant-baseline", "start").attr("text-anchor", "start"); + textElem.attr( + "transform", + "translate(" + (shiftedX1 + halfIconSize + 4) + ", " + (shiftedY1 + halfIconSize + 2) + ")" + ); + } + db.setElementForId(data.id, groupsNode); + } + }) + ); +}, "drawGroups"); +var drawServices = /* @__PURE__ */ __name(async function(db, elem, services) { + const config = getConfig2(); + for (const service of services) { + const serviceElem = elem.append("g"); + const iconSize = db.getConfigField("iconSize"); + if (service.title) { + const textElem = serviceElem.append("g"); + await createText( + textElem, + service.title, + { + useHtmlLabels: false, + width: iconSize * 1.5, + classes: "architecture-service-label" + }, + config + ); + textElem.attr("dy", "1em").attr("alignment-baseline", "middle").attr("dominant-baseline", "middle").attr("text-anchor", "middle"); + textElem.attr("transform", "translate(" + iconSize / 2 + ", " + iconSize + ")"); + } + const bkgElem = serviceElem.append("g"); + if (service.icon) { + bkgElem.html( + `${await getIconSVG(service.icon, { height: iconSize, width: iconSize, fallbackPrefix: architectureIcons.prefix })}` + ); + } else if (service.iconText) { + bkgElem.html( + `${await getIconSVG("blank", { height: iconSize, width: iconSize, fallbackPrefix: architectureIcons.prefix })}` + ); + const textElemContainer = bkgElem.append("g"); + const fo = textElemContainer.append("foreignObject").attr("width", iconSize).attr("height", iconSize); + const divElem = fo.append("div").attr("class", "node-icon-text").attr("style", `height: ${iconSize}px;`).append("div").html(sanitizeText(service.iconText, config)); + const fontSize = parseInt( + window.getComputedStyle(divElem.node(), null).getPropertyValue("font-size").replace(/\D/g, "") + ) ?? 16; + divElem.attr("style", `-webkit-line-clamp: ${Math.floor((iconSize - 2) / fontSize)};`); + } else { + bkgElem.append("path").attr("class", "node-bkg").attr("id", "node-" + service.id).attr( + "d", + `M0 ${iconSize} v${-iconSize} q0,-5 5,-5 h${iconSize} q5,0 5,5 v${iconSize} H0 Z` + ); + } + serviceElem.attr("id", `service-${service.id}`).attr("class", "architecture-service"); + const { width, height } = serviceElem.node().getBBox(); + service.width = width; + service.height = height; + db.setElementForId(service.id, serviceElem); + } + return 0; +}, "drawServices"); +var drawJunctions = /* @__PURE__ */ __name(function(db, elem, junctions) { + junctions.forEach((junction) => { + const junctionElem = elem.append("g"); + const iconSize = db.getConfigField("iconSize"); + const bkgElem = junctionElem.append("g"); + bkgElem.append("rect").attr("id", "node-" + junction.id).attr("fill-opacity", "0").attr("width", iconSize).attr("height", iconSize); + junctionElem.attr("class", "architecture-junction"); + const { width, height } = junctionElem._groups[0][0].getBBox(); + junctionElem.width = width; + junctionElem.height = height; + db.setElementForId(junction.id, junctionElem); + }); +}, "drawJunctions"); + +// src/diagrams/architecture/architectureRenderer.ts +registerIconPacks([ + { + name: architectureIcons.prefix, + icons: architectureIcons + } +]); +cytoscape.use(fcose); +function addServices(services, cy, db) { + services.forEach((service) => { + cy.add({ + group: "nodes", + data: { + type: "service", + id: service.id, + icon: service.icon, + label: service.title, + parent: service.in, + width: db.getConfigField("iconSize"), + height: db.getConfigField("iconSize") + }, + classes: "node-service" + }); + }); +} +__name(addServices, "addServices"); +function addJunctions(junctions, cy, db) { + junctions.forEach((junction) => { + cy.add({ + group: "nodes", + data: { + type: "junction", + id: junction.id, + parent: junction.in, + width: db.getConfigField("iconSize"), + height: db.getConfigField("iconSize") + }, + classes: "node-junction" + }); + }); +} +__name(addJunctions, "addJunctions"); +function positionNodes(db, cy) { + cy.nodes().map((node) => { + const data = nodeData(node); + if (data.type === "group") { + return; + } + data.x = node.position().x; + data.y = node.position().y; + const nodeElem = db.getElementById(data.id); + nodeElem.attr("transform", "translate(" + (data.x || 0) + "," + (data.y || 0) + ")"); + }); +} +__name(positionNodes, "positionNodes"); +function addGroups(groups, cy) { + groups.forEach((group) => { + cy.add({ + group: "nodes", + data: { + type: "group", + id: group.id, + icon: group.icon, + label: group.title, + parent: group.in + }, + classes: "node-group" + }); + }); +} +__name(addGroups, "addGroups"); +function addEdges(edges, cy) { + edges.forEach((parsedEdge) => { + const { lhsId, rhsId, lhsInto, lhsGroup, rhsInto, lhsDir, rhsDir, rhsGroup, title } = parsedEdge; + const edgeType = isArchitectureDirectionXY(parsedEdge.lhsDir, parsedEdge.rhsDir) ? "segments" : "straight"; + const edge = { + id: `${lhsId}-${rhsId}`, + label: title, + source: lhsId, + sourceDir: lhsDir, + sourceArrow: lhsInto, + sourceGroup: lhsGroup, + sourceEndpoint: lhsDir === "L" ? "0 50%" : lhsDir === "R" ? "100% 50%" : lhsDir === "T" ? "50% 0" : "50% 100%", + target: rhsId, + targetDir: rhsDir, + targetArrow: rhsInto, + targetGroup: rhsGroup, + targetEndpoint: rhsDir === "L" ? "0 50%" : rhsDir === "R" ? "100% 50%" : rhsDir === "T" ? "50% 0" : "50% 100%" + }; + cy.add({ + group: "edges", + data: edge, + classes: edgeType + }); + }); +} +__name(addEdges, "addEdges"); +function getAlignments(db, spatialMaps, groupAlignments) { + const flattenAlignments = /* @__PURE__ */ __name((alignmentObj, alignmentDir) => { + return Object.entries(alignmentObj).reduce( + (prev, [dir, alignments2]) => { + let cnt = 0; + const arr = Object.entries(alignments2); + if (arr.length === 1) { + prev[dir] = arr[0][1]; + return prev; + } + for (let i = 0; i < arr.length - 1; i++) { + for (let j = i + 1; j < arr.length; j++) { + const [aGroupId, aNodeIds] = arr[i]; + const [bGroupId, bNodeIds] = arr[j]; + const alignment = groupAlignments[aGroupId]?.[bGroupId]; + if (alignment === alignmentDir) { + prev[dir] ??= []; + prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds]; + } else if (aGroupId === "default" || bGroupId === "default") { + prev[dir] ??= []; + prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds]; + } else { + const keyA = `${dir}-${cnt++}`; + prev[keyA] = aNodeIds; + const keyB = `${dir}-${cnt++}`; + prev[keyB] = bNodeIds; + } + } + } + return prev; + }, + {} + ); + }, "flattenAlignments"); + const alignments = spatialMaps.map((spatialMap) => { + const horizontalAlignments = {}; + const verticalAlignments = {}; + Object.entries(spatialMap).forEach(([id, [x, y]]) => { + const nodeGroup = db.getNode(id)?.in ?? "default"; + horizontalAlignments[y] ??= {}; + horizontalAlignments[y][nodeGroup] ??= []; + horizontalAlignments[y][nodeGroup].push(id); + verticalAlignments[x] ??= {}; + verticalAlignments[x][nodeGroup] ??= []; + verticalAlignments[x][nodeGroup].push(id); + }); + return { + horiz: Object.values(flattenAlignments(horizontalAlignments, "horizontal")).filter( + (arr) => arr.length > 1 + ), + vert: Object.values(flattenAlignments(verticalAlignments, "vertical")).filter( + (arr) => arr.length > 1 + ) + }; + }); + const [horizontal, vertical] = alignments.reduce( + ([prevHoriz, prevVert], { horiz, vert }) => { + return [ + [...prevHoriz, ...horiz], + [...prevVert, ...vert] + ]; + }, + [[], []] + ); + return { + horizontal, + vertical + }; +} +__name(getAlignments, "getAlignments"); +function getRelativeConstraints(spatialMaps, db) { + const relativeConstraints = []; + const posToStr = /* @__PURE__ */ __name((pos) => `${pos[0]},${pos[1]}`, "posToStr"); + const strToPos = /* @__PURE__ */ __name((pos) => pos.split(",").map((p) => parseInt(p)), "strToPos"); + spatialMaps.forEach((spatialMap) => { + const invSpatialMap = Object.fromEntries( + Object.entries(spatialMap).map(([id, pos]) => [posToStr(pos), id]) + ); + const queue = [posToStr([0, 0])]; + const visited = {}; + const directions = { + L: [-1, 0], + R: [1, 0], + T: [0, 1], + B: [0, -1] + }; + while (queue.length > 0) { + const curr = queue.shift(); + if (curr) { + visited[curr] = 1; + const currId = invSpatialMap[curr]; + if (currId) { + const currPos = strToPos(curr); + Object.entries(directions).forEach(([dir, shift]) => { + const newPos = posToStr([currPos[0] + shift[0], currPos[1] + shift[1]]); + const newId = invSpatialMap[newPos]; + if (newId && !visited[newPos]) { + queue.push(newPos); + relativeConstraints.push({ + [ArchitectureDirectionName[dir]]: newId, + [ArchitectureDirectionName[getOppositeArchitectureDirection(dir)]]: currId, + gap: 1.5 * db.getConfigField("iconSize") + }); + } + }); + } + } + } + }); + return relativeConstraints; +} +__name(getRelativeConstraints, "getRelativeConstraints"); +function layoutArchitecture(services, junctions, groups, edges, db, { spatialMaps, groupAlignments }) { + return new Promise((resolve) => { + const renderEl = select("body").append("div").attr("id", "cy").attr("style", "display:none"); + const cy = cytoscape({ + container: document.getElementById("cy"), + style: [ + { + selector: "edge", + style: { + "curve-style": "straight", + label: "data(label)", + "source-endpoint": "data(sourceEndpoint)", + "target-endpoint": "data(targetEndpoint)" + } + }, + { + selector: "edge.segments", + style: { + "curve-style": "segments", + "segment-weights": "0", + "segment-distances": [0.5], + // @ts-ignore Incorrect library types + "edge-distances": "endpoints", + "source-endpoint": "data(sourceEndpoint)", + "target-endpoint": "data(targetEndpoint)" + } + }, + { + selector: "node", + style: { + // @ts-ignore Incorrect library types + "compound-sizing-wrt-labels": "include" + } + }, + { + selector: "node[label]", + style: { + "text-valign": "bottom", + "text-halign": "center", + "font-size": `${db.getConfigField("fontSize")}px` + } + }, + { + selector: ".node-service", + style: { + label: "data(label)", + width: "data(width)", + height: "data(height)" + } + }, + { + selector: ".node-junction", + style: { + width: "data(width)", + height: "data(height)" + } + }, + { + selector: ".node-group", + style: { + // @ts-ignore Incorrect library types + padding: `${db.getConfigField("padding")}px` + } + } + ], + layout: { + name: "grid", + boundingBox: { + x1: 0, + x2: 100, + y1: 0, + y2: 100 + } + } + }); + renderEl.remove(); + addGroups(groups, cy); + addServices(services, cy, db); + addJunctions(junctions, cy, db); + addEdges(edges, cy); + const alignmentConstraint = getAlignments(db, spatialMaps, groupAlignments); + const relativePlacementConstraint = getRelativeConstraints(spatialMaps, db); + const layout = cy.layout({ + name: "fcose", + quality: "proof", + styleEnabled: false, + animate: false, + nodeDimensionsIncludeLabels: false, + // Adjust the edge parameters if it passes through the border of a group + // Hacky fix for: https://github.com/iVis-at-Bilkent/cytoscape.js-fcose/issues/67 + idealEdgeLength(edge) { + const [nodeA, nodeB] = edge.connectedNodes(); + const { parent: parentA } = nodeData(nodeA); + const { parent: parentB } = nodeData(nodeB); + const elasticity = parentA === parentB ? 1.5 * db.getConfigField("iconSize") : 0.5 * db.getConfigField("iconSize"); + return elasticity; + }, + edgeElasticity(edge) { + const [nodeA, nodeB] = edge.connectedNodes(); + const { parent: parentA } = nodeData(nodeA); + const { parent: parentB } = nodeData(nodeB); + const elasticity = parentA === parentB ? 0.45 : 1e-3; + return elasticity; + }, + alignmentConstraint, + relativePlacementConstraint + }); + layout.one("layoutstop", () => { + function getSegmentWeights(source, target, pointX, pointY) { + let W, D; + const { x: sX, y: sY } = source; + const { x: tX, y: tY } = target; + D = (pointY - sY + (sX - pointX) * (sY - tY) / (sX - tX)) / Math.sqrt(1 + Math.pow((sY - tY) / (sX - tX), 2)); + W = Math.sqrt(Math.pow(pointY - sY, 2) + Math.pow(pointX - sX, 2) - Math.pow(D, 2)); + const distAB = Math.sqrt(Math.pow(tX - sX, 2) + Math.pow(tY - sY, 2)); + W = W / distAB; + let delta1 = (tX - sX) * (pointY - sY) - (tY - sY) * (pointX - sX); + switch (true) { + case delta1 >= 0: + delta1 = 1; + break; + case delta1 < 0: + delta1 = -1; + break; + } + let delta2 = (tX - sX) * (pointX - sX) + (tY - sY) * (pointY - sY); + switch (true) { + case delta2 >= 0: + delta2 = 1; + break; + case delta2 < 0: + delta2 = -1; + break; + } + D = Math.abs(D) * delta1; + W = W * delta2; + return { + distances: D, + weights: W + }; + } + __name(getSegmentWeights, "getSegmentWeights"); + cy.startBatch(); + for (const edge of Object.values(cy.edges())) { + if (edge.data?.()) { + const { x: sX, y: sY } = edge.source().position(); + const { x: tX, y: tY } = edge.target().position(); + if (sX !== tX && sY !== tY) { + const sEP = edge.sourceEndpoint(); + const tEP = edge.targetEndpoint(); + const { sourceDir } = edgeData(edge); + const [pointX, pointY] = isArchitectureDirectionY(sourceDir) ? [sEP.x, tEP.y] : [tEP.x, sEP.y]; + const { weights, distances } = getSegmentWeights(sEP, tEP, pointX, pointY); + edge.style("segment-distances", distances); + edge.style("segment-weights", weights); + } + } + } + cy.endBatch(); + layout.run(); + }); + layout.run(); + cy.ready((e) => { + log.info("Ready", e); + resolve(cy); + }); + }); +} +__name(layoutArchitecture, "layoutArchitecture"); +var draw = /* @__PURE__ */ __name(async (text, id, _version, diagObj) => { + const db = diagObj.db; + const services = db.getServices(); + const junctions = db.getJunctions(); + const groups = db.getGroups(); + const edges = db.getEdges(); + const ds = db.getDataStructures(); + const svg = selectSvgElement(id); + const edgesElem = svg.append("g"); + edgesElem.attr("class", "architecture-edges"); + const servicesElem = svg.append("g"); + servicesElem.attr("class", "architecture-services"); + const groupElem = svg.append("g"); + groupElem.attr("class", "architecture-groups"); + await drawServices(db, servicesElem, services); + drawJunctions(db, servicesElem, junctions); + const cy = await layoutArchitecture(services, junctions, groups, edges, db, ds); + await drawEdges(edgesElem, cy, db); + await drawGroups(groupElem, cy, db); + positionNodes(db, cy); + setupGraphViewbox(void 0, svg, db.getConfigField("padding"), db.getConfigField("useMaxWidth")); +}, "draw"); +var renderer = { draw }; + +// src/diagrams/architecture/architectureDiagram.ts +var diagram = { + parser, + get db() { + return new ArchitectureDB(); + }, + renderer, + styles: architectureStyles_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/architectureDiagram-VXUJARFQ.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/architectureDiagram-VXUJARFQ.mjs.map new file mode 100644 index 0000000..8af204f --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/architectureDiagram-VXUJARFQ.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/architecture/architectureParser.ts", "../../../src/diagrams/architecture/architectureTypes.ts", "../../../src/diagrams/architecture/architectureDb.ts", "../../../src/diagrams/architecture/architectureStyles.ts", "../../../src/diagrams/architecture/architectureRenderer.ts", "../../../src/diagrams/architecture/architectureIcons.ts", "../../../src/diagrams/architecture/svgDraw.ts", "../../../src/diagrams/architecture/architectureDiagram.ts"], + "sourcesContent": ["import type { Architecture } from '@mermaid-js/parser';\nimport { parse } from '@mermaid-js/parser';\nimport type { ParserDefinition } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { populateCommonDb } from '../common/populateCommonDb.js';\nimport { ArchitectureDB } from './architectureDb.js';\n\nconst populateDb = (ast: Architecture, db: ArchitectureDB) => {\n populateCommonDb(ast, db);\n ast.groups.map((group) => db.addGroup(group));\n ast.services.map((service) => db.addService({ ...service, type: 'service' }));\n ast.junctions.map((service) => db.addJunction({ ...service, type: 'junction' }));\n // @ts-ignore TODO our parser guarantees the type is L/R/T/B and not string. How to change to union type?\n ast.edges.map((edge) => db.addEdge(edge));\n};\n\nexport const parser: ParserDefinition = {\n parser: {\n // @ts-expect-error - ArchitectureDB is not assignable to DiagramDB\n yy: undefined,\n },\n parse: async (input: string): Promise => {\n const ast: Architecture = await parse('architecture', input);\n log.debug(ast);\n const db = parser.parser?.yy;\n if (!(db instanceof ArchitectureDB)) {\n throw new Error(\n 'parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.'\n );\n }\n populateDb(ast, db);\n },\n};\n", "import type { DiagramDBBase } from '../../diagram-api/types.js';\nimport type { ArchitectureDiagramConfig } from '../../config.type.js';\nimport type { D3Element } from '../../types.js';\nimport type cytoscape from 'cytoscape';\n\n/*=======================================*\\\n| Architecture Diagram Types |\n\\*=======================================*/\n\nexport type ArchitectureAlignment = 'vertical' | 'horizontal' | 'bend';\n\nexport type ArchitectureDirection = 'L' | 'R' | 'T' | 'B';\nexport type ArchitectureDirectionX = Extract;\nexport type ArchitectureDirectionY = Extract;\n\n/**\n * Contains LL, RR, TT, BB which are impossible connections\n */\nexport type InvalidArchitectureDirectionPair = `${ArchitectureDirection}${ArchitectureDirection}`;\nexport type ArchitectureDirectionPair = Exclude<\n InvalidArchitectureDirectionPair,\n 'LL' | 'RR' | 'TT' | 'BB'\n>;\nexport type ArchitectureDirectionPairXY = Exclude<\n InvalidArchitectureDirectionPair,\n 'LL' | 'RR' | 'TT' | 'BB' | 'LR' | 'RL' | 'TB' | 'BT'\n>;\n\nexport const ArchitectureDirectionName = {\n L: 'left',\n R: 'right',\n T: 'top',\n B: 'bottom',\n} as const;\n\nexport const ArchitectureDirectionArrow = {\n L: (scale: number) => `${scale},${scale / 2} 0,${scale} 0,0`,\n R: (scale: number) => `0,${scale / 2} ${scale},0 ${scale},${scale}`,\n T: (scale: number) => `0,0 ${scale},0 ${scale / 2},${scale}`,\n B: (scale: number) => `${scale / 2},0 ${scale},${scale} 0,${scale}`,\n} as const;\n\nexport const ArchitectureDirectionArrowShift = {\n L: (orig: number, arrowSize: number) => orig - arrowSize + 2,\n R: (orig: number, _arrowSize: number) => orig - 2,\n T: (orig: number, arrowSize: number) => orig - arrowSize + 2,\n B: (orig: number, _arrowSize: number) => orig - 2,\n} as const;\n\nexport const getOppositeArchitectureDirection = function (\n x: ArchitectureDirection\n): ArchitectureDirection {\n if (isArchitectureDirectionX(x)) {\n return x === 'L' ? 'R' : 'L';\n } else {\n return x === 'T' ? 'B' : 'T';\n }\n};\n\nexport const isArchitectureDirection = function (x: unknown): x is ArchitectureDirection {\n const temp = x as ArchitectureDirection;\n return temp === 'L' || temp === 'R' || temp === 'T' || temp === 'B';\n};\n\nexport const isArchitectureDirectionX = function (\n x: ArchitectureDirection\n): x is ArchitectureDirectionX {\n const temp = x as ArchitectureDirectionX;\n return temp === 'L' || temp === 'R';\n};\n\nexport const isArchitectureDirectionY = function (\n x: ArchitectureDirection\n): x is ArchitectureDirectionY {\n const temp = x as ArchitectureDirectionY;\n return temp === 'T' || temp === 'B';\n};\n\nexport const isArchitectureDirectionXY = function (\n a: ArchitectureDirection,\n b: ArchitectureDirection\n) {\n const aX_bY = isArchitectureDirectionX(a) && isArchitectureDirectionY(b);\n const aY_bX = isArchitectureDirectionY(a) && isArchitectureDirectionX(b);\n return aX_bY || aY_bX;\n};\n\nexport const isArchitecturePairXY = function (\n pair: ArchitectureDirectionPair\n): pair is ArchitectureDirectionPairXY {\n const lhs = pair[0] as ArchitectureDirection;\n const rhs = pair[1] as ArchitectureDirection;\n const aX_bY = isArchitectureDirectionX(lhs) && isArchitectureDirectionY(rhs);\n const aY_bX = isArchitectureDirectionY(lhs) && isArchitectureDirectionX(rhs);\n return aX_bY || aY_bX;\n};\n\n/**\n * Verifies that the architecture direction pair does not contain an invalid match (LL, RR, TT, BB)\n * @param x - architecture direction pair which could potentially be invalid\n * @returns true if the pair is not LL, RR, TT, or BB\n */\nexport const isValidArchitectureDirectionPair = function (\n x: InvalidArchitectureDirectionPair\n): x is ArchitectureDirectionPair {\n return x !== 'LL' && x !== 'RR' && x !== 'TT' && x !== 'BB';\n};\n\nexport type ArchitectureDirectionPairMap = Partial>;\n\n/**\n * Creates a pair of the directions of each side of an edge. This function should be used instead of manually creating it to ensure that the source is always the first character.\n *\n * Note: Undefined is returned when sourceDir and targetDir are the same. In theory this should never happen since the diagram parser throws an error if a user defines it as such.\n * @param sourceDir - source direction\n * @param targetDir - target direction\n * @returns\n */\nexport const getArchitectureDirectionPair = function (\n sourceDir: ArchitectureDirection,\n targetDir: ArchitectureDirection\n): ArchitectureDirectionPair | undefined {\n const pair: `${ArchitectureDirection}${ArchitectureDirection}` = `${sourceDir}${targetDir}`;\n return isValidArchitectureDirectionPair(pair) ? pair : undefined;\n};\n\n/**\n * Given an x,y position for an arrow and the direction of the edge it belongs to, return a factor for slightly shifting the edge\n * @param param0 - [x, y] coordinate pair\n * @param pair - architecture direction pair\n * @returns a new [x, y] coordinate pair\n */\nexport const shiftPositionByArchitectureDirectionPair = function (\n [x, y]: number[],\n pair: ArchitectureDirectionPair\n): number[] {\n const lhs = pair[0] as ArchitectureDirection;\n const rhs = pair[1] as ArchitectureDirection;\n if (isArchitectureDirectionX(lhs)) {\n if (isArchitectureDirectionY(rhs)) {\n return [x + (lhs === 'L' ? -1 : 1), y + (rhs === 'T' ? 1 : -1)];\n } else {\n return [x + (lhs === 'L' ? -1 : 1), y];\n }\n } else {\n if (isArchitectureDirectionX(rhs)) {\n return [x + (rhs === 'L' ? 1 : -1), y + (lhs === 'T' ? 1 : -1)];\n } else {\n return [x, y + (lhs === 'T' ? 1 : -1)];\n }\n }\n};\n\n/**\n * Given the directional pair of an XY edge, get the scale factors necessary to shift the coordinates inwards towards the edge\n * @param pair - XY pair of an edge\n * @returns - number[] containing [+/- 1, +/- 1]\n */\nexport const getArchitectureDirectionXYFactors = function (\n pair: ArchitectureDirectionPairXY\n): number[] {\n if (pair === 'LT' || pair === 'TL') {\n return [1, 1];\n } else if (pair === 'BL' || pair === 'LB') {\n return [1, -1];\n } else if (pair === 'BR' || pair === 'RB') {\n return [-1, -1];\n } else {\n return [-1, 1];\n }\n};\n\nexport const getArchitectureDirectionAlignment = function (\n a: ArchitectureDirection,\n b: ArchitectureDirection\n): ArchitectureAlignment {\n if (isArchitectureDirectionXY(a, b)) {\n return 'bend';\n } else if (isArchitectureDirectionX(a)) {\n return 'horizontal';\n }\n return 'vertical';\n};\n\nexport interface ArchitectureStyleOptions {\n archEdgeColor: string;\n archEdgeArrowColor: string;\n archEdgeWidth: string;\n archGroupBorderColor: string;\n archGroupBorderWidth: string;\n}\n\nexport interface ArchitectureService {\n id: string;\n type: 'service';\n edges: ArchitectureEdge[];\n icon?: string;\n iconText?: string;\n title?: string;\n in?: string;\n width?: number;\n height?: number;\n}\n\nexport interface ArchitectureJunction {\n id: string;\n type: 'junction';\n edges: ArchitectureEdge[];\n in?: string;\n width?: number;\n height?: number;\n}\n\nexport type ArchitectureNode = ArchitectureService | ArchitectureJunction;\n\nexport const isArchitectureService = function (x: ArchitectureNode): x is ArchitectureService {\n const temp = x as ArchitectureService;\n return temp.type === 'service';\n};\n\nexport const isArchitectureJunction = function (x: ArchitectureNode): x is ArchitectureJunction {\n const temp = x as ArchitectureJunction;\n return temp.type === 'junction';\n};\n\nexport interface ArchitectureGroup {\n id: string;\n icon?: string;\n title?: string;\n in?: string;\n}\n\nexport interface ArchitectureEdge
{\n lhsId: string;\n lhsDir: DT;\n lhsInto?: boolean;\n lhsGroup?: boolean;\n rhsId: string;\n rhsDir: DT;\n rhsInto?: boolean;\n rhsGroup?: boolean;\n title?: string;\n}\n\nexport interface ArchitectureDB extends DiagramDBBase {\n clear: () => void;\n addService: (service: Omit) => void;\n getServices: () => ArchitectureService[];\n addJunction: (service: Omit) => void;\n getJunctions: () => ArchitectureJunction[];\n getNodes: () => ArchitectureNode[];\n getNode: (id: string) => ArchitectureNode | null;\n addGroup: (group: ArchitectureGroup) => void;\n getGroups: () => ArchitectureGroup[];\n addEdge: (edge: ArchitectureEdge) => void;\n getEdges: () => ArchitectureEdge[];\n setElementForId: (id: string, element: D3Element) => void;\n getElementById: (id: string) => D3Element;\n getDataStructures: () => ArchitectureDataStructures;\n}\n\nexport type ArchitectureAdjacencyList = Record;\nexport type ArchitectureSpatialMap = Record;\n\n/**\n * Maps the direction that groups connect from.\n *\n * **Outer key**: ID of group A\n *\n * **Inner key**: ID of group B\n *\n * **Value**: 'vertical' or 'horizontal'\n *\n * Note: tmp[groupA][groupB] == tmp[groupB][groupA]\n */\nexport type ArchitectureGroupAlignments = Record<\n string,\n Record>\n>;\n\nexport interface ArchitectureDataStructures {\n adjList: ArchitectureAdjacencyList;\n spatialMaps: ArchitectureSpatialMap[];\n groupAlignments: ArchitectureGroupAlignments;\n}\n\nexport interface ArchitectureState extends Record {\n nodes: Record;\n groups: Record;\n edges: ArchitectureEdge[];\n registeredIds: Record;\n dataStructures?: ArchitectureDataStructures;\n elements: Record;\n config: ArchitectureDiagramConfig;\n}\n\n/*=======================================*\\\n| Cytoscape Override Types |\n\\*=======================================*/\n\nexport interface EdgeSingularData {\n id: string;\n label?: string;\n source: string;\n sourceDir: ArchitectureDirection;\n sourceArrow?: boolean;\n sourceGroup?: boolean;\n target: string;\n targetDir: ArchitectureDirection;\n targetArrow?: boolean;\n targetGroup?: boolean;\n [key: string]: any;\n}\n\nexport const edgeData = (edge: cytoscape.EdgeSingular) => {\n return edge.data() as EdgeSingularData;\n};\n\nexport interface EdgeSingular extends cytoscape.EdgeSingular {\n _private: {\n bodyBounds: unknown;\n rscratch: {\n startX: number;\n startY: number;\n midX: number;\n midY: number;\n endX: number;\n endY: number;\n };\n };\n data(): EdgeSingularData;\n data(key: T): EdgeSingularData[T];\n}\n\nexport type NodeSingularData =\n | {\n type: 'service';\n id: string;\n icon?: string;\n label?: string;\n parent?: string;\n width: number;\n height: number;\n [key: string]: any;\n }\n | {\n type: 'junction';\n id: string;\n parent?: string;\n width: number;\n height: number;\n [key: string]: any;\n }\n | {\n type: 'group';\n id: string;\n icon?: string;\n label?: string;\n parent?: string;\n [key: string]: any;\n };\n\nexport const nodeData = (node: cytoscape.NodeSingular) => {\n return node.data() as NodeSingularData;\n};\n\nexport interface NodeSingular extends cytoscape.NodeSingular {\n _private: {\n bodyBounds: {\n h: number;\n w: number;\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n };\n children: cytoscape.NodeSingular[];\n };\n data(): NodeSingularData;\n data(key: T): NodeSingularData[T];\n}\n", "import { getConfig as commonGetConfig } from '../../config.js';\nimport type { ArchitectureDiagramConfig } from '../../config.type.js';\nimport DEFAULT_CONFIG from '../../defaultConfig.js';\nimport type { DiagramDB } from '../../diagram-api/types.js';\nimport type { D3Element } from '../../types.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport {\n clear as commonClear,\n getAccDescription,\n getAccTitle,\n getDiagramTitle,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n} from '../common/commonDb.js';\nimport type {\n ArchitectureAlignment,\n ArchitectureDirectionPair,\n ArchitectureDirectionPairMap,\n ArchitectureEdge,\n ArchitectureGroup,\n ArchitectureJunction,\n ArchitectureNode,\n ArchitectureService,\n ArchitectureSpatialMap,\n ArchitectureState,\n} from './architectureTypes.js';\nimport {\n getArchitectureDirectionAlignment,\n getArchitectureDirectionPair,\n isArchitectureDirection,\n isArchitectureJunction,\n isArchitectureService,\n shiftPositionByArchitectureDirectionPair,\n} from './architectureTypes.js';\n\nconst DEFAULT_ARCHITECTURE_CONFIG: Required =\n DEFAULT_CONFIG.architecture;\nexport class ArchitectureDB implements DiagramDB {\n private nodes: Record = {};\n private groups: Record = {};\n private edges: ArchitectureEdge[] = [];\n private registeredIds: Record = {};\n private dataStructures?: ArchitectureState['dataStructures'];\n private elements: Record = {};\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.nodes = {};\n this.groups = {};\n this.edges = [];\n this.registeredIds = {};\n this.dataStructures = undefined;\n this.elements = {};\n commonClear();\n }\n\n public addService({\n id,\n icon,\n in: parent,\n title,\n iconText,\n }: Omit): void {\n if (this.registeredIds[id] !== undefined) {\n throw new Error(\n `The service id [${id}] is already in use by another ${this.registeredIds[id]}`\n );\n }\n if (parent !== undefined) {\n if (id === parent) {\n throw new Error(`The service [${id}] cannot be placed within itself`);\n }\n if (this.registeredIds[parent] === undefined) {\n throw new Error(\n `The service [${id}]'s parent does not exist. Please make sure the parent is created before this service`\n );\n }\n if (this.registeredIds[parent] === 'node') {\n throw new Error(`The service [${id}]'s parent is not a group`);\n }\n }\n\n this.registeredIds[id] = 'node';\n\n this.nodes[id] = {\n id,\n type: 'service',\n icon,\n iconText,\n title,\n edges: [],\n in: parent,\n };\n }\n\n public getServices(): ArchitectureService[] {\n return Object.values(this.nodes).filter(isArchitectureService);\n }\n\n public addJunction({ id, in: parent }: Omit): void {\n this.registeredIds[id] = 'node';\n\n this.nodes[id] = {\n id,\n type: 'junction',\n edges: [],\n in: parent,\n };\n }\n\n public getJunctions(): ArchitectureJunction[] {\n return Object.values(this.nodes).filter(isArchitectureJunction);\n }\n\n public getNodes(): ArchitectureNode[] {\n return Object.values(this.nodes);\n }\n\n public getNode(id: string): ArchitectureNode | null {\n return this.nodes[id] ?? null;\n }\n\n public addGroup({ id, icon, in: parent, title }: ArchitectureGroup): void {\n if (this.registeredIds?.[id] !== undefined) {\n throw new Error(\n `The group id [${id}] is already in use by another ${this.registeredIds[id]}`\n );\n }\n if (parent !== undefined) {\n if (id === parent) {\n throw new Error(`The group [${id}] cannot be placed within itself`);\n }\n if (this.registeredIds?.[parent] === undefined) {\n throw new Error(\n `The group [${id}]'s parent does not exist. Please make sure the parent is created before this group`\n );\n }\n if (this.registeredIds?.[parent] === 'node') {\n throw new Error(`The group [${id}]'s parent is not a group`);\n }\n }\n\n this.registeredIds[id] = 'group';\n\n this.groups[id] = {\n id,\n icon,\n title,\n in: parent,\n };\n }\n public getGroups(): ArchitectureGroup[] {\n return Object.values(this.groups);\n }\n public addEdge({\n lhsId,\n rhsId,\n lhsDir,\n rhsDir,\n lhsInto,\n rhsInto,\n lhsGroup,\n rhsGroup,\n title,\n }: ArchitectureEdge): void {\n if (!isArchitectureDirection(lhsDir)) {\n throw new Error(\n `Invalid direction given for left hand side of edge ${lhsId}--${rhsId}. Expected (L,R,T,B) got ${String(lhsDir)}`\n );\n }\n if (!isArchitectureDirection(rhsDir)) {\n throw new Error(\n `Invalid direction given for right hand side of edge ${lhsId}--${rhsId}. Expected (L,R,T,B) got ${String(rhsDir)}`\n );\n }\n\n if (this.nodes[lhsId] === undefined && this.groups[lhsId] === undefined) {\n throw new Error(\n `The left-hand id [${lhsId}] does not yet exist. Please create the service/group before declaring an edge to it.`\n );\n }\n if (this.nodes[rhsId] === undefined && this.groups[rhsId] === undefined) {\n throw new Error(\n `The right-hand id [${rhsId}] does not yet exist. Please create the service/group before declaring an edge to it.`\n );\n }\n\n const lhsGroupId = this.nodes[lhsId].in;\n const rhsGroupId = this.nodes[rhsId].in;\n if (lhsGroup && lhsGroupId && rhsGroupId && lhsGroupId == rhsGroupId) {\n throw new Error(\n `The left-hand id [${lhsId}] is modified to traverse the group boundary, but the edge does not pass through two groups.`\n );\n }\n if (rhsGroup && lhsGroupId && rhsGroupId && lhsGroupId == rhsGroupId) {\n throw new Error(\n `The right-hand id [${rhsId}] is modified to traverse the group boundary, but the edge does not pass through two groups.`\n );\n }\n\n const edge = {\n lhsId,\n lhsDir,\n lhsInto,\n lhsGroup,\n rhsId,\n rhsDir,\n rhsInto,\n rhsGroup,\n title,\n };\n\n this.edges.push(edge);\n if (this.nodes[lhsId] && this.nodes[rhsId]) {\n this.nodes[lhsId].edges.push(this.edges[this.edges.length - 1]);\n this.nodes[rhsId].edges.push(this.edges[this.edges.length - 1]);\n }\n }\n\n public getEdges(): ArchitectureEdge[] {\n return this.edges;\n }\n\n /**\n * Returns the current diagram's adjacency list, spatial map, & group alignments.\n * If they have not been created, run the algorithms to generate them.\n * @returns\n */\n public getDataStructures() {\n if (this.dataStructures === undefined) {\n // Tracks how groups are aligned with one another. Generated while creating the adj list\n const groupAlignments: Record<\n string,\n Record>\n > = {};\n\n // Create an adjacency list of the diagram to perform BFS on\n // Outer reduce applied on all services\n // Inner reduce applied on the edges for a service\n const adjList = Object.entries(this.nodes).reduce<\n Record\n >((prevOuter, [id, service]) => {\n prevOuter[id] = service.edges.reduce((prevInner, edge) => {\n // track the direction groups connect to one another\n const lhsGroupId = this.getNode(edge.lhsId)?.in;\n const rhsGroupId = this.getNode(edge.rhsId)?.in;\n if (lhsGroupId && rhsGroupId && lhsGroupId !== rhsGroupId) {\n const alignment = getArchitectureDirectionAlignment(edge.lhsDir, edge.rhsDir);\n if (alignment !== 'bend') {\n groupAlignments[lhsGroupId] ??= {};\n groupAlignments[lhsGroupId][rhsGroupId] = alignment;\n groupAlignments[rhsGroupId] ??= {};\n groupAlignments[rhsGroupId][lhsGroupId] = alignment;\n }\n }\n\n if (edge.lhsId === id) {\n // source is LHS\n const pair = getArchitectureDirectionPair(edge.lhsDir, edge.rhsDir);\n if (pair) {\n prevInner[pair] = edge.rhsId;\n }\n } else {\n // source is RHS\n const pair = getArchitectureDirectionPair(edge.rhsDir, edge.lhsDir);\n if (pair) {\n prevInner[pair] = edge.lhsId;\n }\n }\n return prevInner;\n }, {});\n return prevOuter;\n }, {});\n\n // Configuration for the initial pass of BFS\n const firstId = Object.keys(adjList)[0];\n const visited = { [firstId]: 1 };\n // If a key is present in this object, it has not been visited\n const notVisited = Object.keys(adjList).reduce(\n (prev, id) => (id === firstId ? prev : { ...prev, [id]: 1 }),\n {} as Record\n );\n\n // Perform BFS on the adjacency list\n const BFS = (startingId: string): ArchitectureSpatialMap => {\n const spatialMap = { [startingId]: [0, 0] };\n const queue = [startingId];\n while (queue.length > 0) {\n const id = queue.shift();\n if (id) {\n visited[id] = 1;\n delete notVisited[id];\n const adj = adjList[id];\n const [posX, posY] = spatialMap[id];\n Object.entries(adj).forEach(([dir, rhsId]) => {\n if (!visited[rhsId]) {\n spatialMap[rhsId] = shiftPositionByArchitectureDirectionPair(\n [posX, posY],\n dir as ArchitectureDirectionPair\n );\n queue.push(rhsId);\n }\n });\n }\n }\n return spatialMap;\n };\n const spatialMaps = [BFS(firstId)];\n\n // If our diagram is disconnected, keep adding additional spatial maps until all disconnected graphs have been found\n while (Object.keys(notVisited).length > 0) {\n spatialMaps.push(BFS(Object.keys(notVisited)[0]));\n }\n this.dataStructures = {\n adjList,\n spatialMaps,\n groupAlignments,\n };\n }\n return this.dataStructures;\n }\n\n public setElementForId(id: string, element: D3Element): void {\n this.elements[id] = element;\n }\n\n public getElementById(id: string): D3Element {\n return this.elements[id];\n }\n\n public getConfig(): Required {\n return cleanAndMerge({\n ...DEFAULT_ARCHITECTURE_CONFIG,\n ...commonGetConfig().architecture,\n });\n }\n\n public getConfigField(\n field: T\n ): Required[T] {\n return this.getConfig()[field];\n }\n\n public setAccTitle = setAccTitle;\n public getAccTitle = getAccTitle;\n public setDiagramTitle = setDiagramTitle;\n public getDiagramTitle = getDiagramTitle;\n public getAccDescription = getAccDescription;\n public setAccDescription = setAccDescription;\n}\n\n/**\n * Typed wrapper for resolving an architecture diagram's config fields. Returns the default value if undefined\n * @param field - the config field to access\n * @returns\n */\n// export function getConfigField(\n// field: T\n// ): Required[T] {\n// return db.getConfig()[field];\n// }\n", "import type { DiagramStylesProvider } from '../../diagram-api/types.js';\nimport type { ArchitectureStyleOptions } from './architectureTypes.js';\n\nconst getStyles: DiagramStylesProvider = (options: ArchitectureStyleOptions) =>\n `\n .edge {\n stroke-width: ${options.archEdgeWidth};\n stroke: ${options.archEdgeColor};\n fill: none;\n }\n\n .arrow {\n fill: ${options.archEdgeArrowColor};\n }\n\n .node-bkg {\n fill: none;\n stroke: ${options.archGroupBorderColor};\n stroke-width: ${options.archGroupBorderWidth};\n stroke-dasharray: 8;\n }\n .node-icon-text {\n display: flex; \n align-items: center;\n }\n \n .node-icon-text > div {\n color: #fff;\n margin: 1px;\n height: fit-content;\n text-align: center;\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n }\n`;\n\nexport default getStyles;\n", "import type { LayoutOptions, Position } from 'cytoscape';\nimport cytoscape from 'cytoscape';\nimport fcose from 'cytoscape-fcose';\nimport { select } from 'd3';\nimport type { DrawDefinition, SVG } from '../../diagram-api/types.js';\nimport type { Diagram } from '../../Diagram.js';\nimport { log } from '../../logger.js';\nimport { registerIconPacks } from '../../rendering-util/icons.js';\nimport { selectSvgElement } from '../../rendering-util/selectSvgElement.js';\nimport { setupGraphViewbox } from '../../setupGraphViewbox.js';\nimport type { ArchitectureDB } from './architectureDb.js';\nimport { architectureIcons } from './architectureIcons.js';\nimport type {\n ArchitectureAlignment,\n ArchitectureDataStructures,\n ArchitectureGroupAlignments,\n ArchitectureJunction,\n ArchitectureSpatialMap,\n EdgeSingular,\n EdgeSingularData,\n NodeSingularData,\n} from './architectureTypes.js';\nimport {\n type ArchitectureDirection,\n type ArchitectureEdge,\n type ArchitectureGroup,\n type ArchitectureService,\n ArchitectureDirectionName,\n edgeData,\n getOppositeArchitectureDirection,\n isArchitectureDirectionXY,\n isArchitectureDirectionY,\n nodeData,\n} from './architectureTypes.js';\nimport { drawEdges, drawGroups, drawJunctions, drawServices } from './svgDraw.js';\n\nregisterIconPacks([\n {\n name: architectureIcons.prefix,\n icons: architectureIcons,\n },\n]);\ncytoscape.use(fcose as any);\n\nfunction addServices(services: ArchitectureService[], cy: cytoscape.Core, db: ArchitectureDB) {\n services.forEach((service) => {\n cy.add({\n group: 'nodes',\n data: {\n type: 'service',\n id: service.id,\n icon: service.icon,\n label: service.title,\n parent: service.in,\n width: db.getConfigField('iconSize'),\n height: db.getConfigField('iconSize'),\n } as NodeSingularData,\n classes: 'node-service',\n });\n });\n}\n\nfunction addJunctions(junctions: ArchitectureJunction[], cy: cytoscape.Core, db: ArchitectureDB) {\n junctions.forEach((junction) => {\n cy.add({\n group: 'nodes',\n data: {\n type: 'junction',\n id: junction.id,\n parent: junction.in,\n width: db.getConfigField('iconSize'),\n height: db.getConfigField('iconSize'),\n } as NodeSingularData,\n classes: 'node-junction',\n });\n });\n}\n\nfunction positionNodes(db: ArchitectureDB, cy: cytoscape.Core) {\n cy.nodes().map((node) => {\n const data = nodeData(node);\n if (data.type === 'group') {\n return;\n }\n data.x = node.position().x;\n data.y = node.position().y;\n\n const nodeElem = db.getElementById(data.id);\n nodeElem.attr('transform', 'translate(' + (data.x || 0) + ',' + (data.y || 0) + ')');\n });\n}\n\nfunction addGroups(groups: ArchitectureGroup[], cy: cytoscape.Core) {\n groups.forEach((group) => {\n cy.add({\n group: 'nodes',\n data: {\n type: 'group',\n id: group.id,\n icon: group.icon,\n label: group.title,\n parent: group.in,\n } as NodeSingularData,\n classes: 'node-group',\n });\n });\n}\n\nfunction addEdges(edges: ArchitectureEdge[], cy: cytoscape.Core) {\n edges.forEach((parsedEdge) => {\n const { lhsId, rhsId, lhsInto, lhsGroup, rhsInto, lhsDir, rhsDir, rhsGroup, title } =\n parsedEdge;\n const edgeType = isArchitectureDirectionXY(parsedEdge.lhsDir, parsedEdge.rhsDir)\n ? 'segments'\n : 'straight';\n const edge: EdgeSingularData = {\n id: `${lhsId}-${rhsId}`,\n label: title,\n source: lhsId,\n sourceDir: lhsDir,\n sourceArrow: lhsInto,\n sourceGroup: lhsGroup,\n sourceEndpoint:\n lhsDir === 'L'\n ? '0 50%'\n : lhsDir === 'R'\n ? '100% 50%'\n : lhsDir === 'T'\n ? '50% 0'\n : '50% 100%',\n target: rhsId,\n targetDir: rhsDir,\n targetArrow: rhsInto,\n targetGroup: rhsGroup,\n targetEndpoint:\n rhsDir === 'L'\n ? '0 50%'\n : rhsDir === 'R'\n ? '100% 50%'\n : rhsDir === 'T'\n ? '50% 0'\n : '50% 100%',\n };\n cy.add({\n group: 'edges',\n data: edge,\n classes: edgeType,\n });\n });\n}\n\nfunction getAlignments(\n db: ArchitectureDB,\n spatialMaps: ArchitectureSpatialMap[],\n groupAlignments: ArchitectureGroupAlignments\n): fcose.FcoseAlignmentConstraint {\n /**\n * Flattens the alignment object so nodes in different groups will be in the same alignment array IFF their groups don't connect in a conflicting alignment\n *\n * i.e., two groups which connect horizontally should not have nodes with vertical alignments to one another\n *\n * See: #5952\n *\n * @param alignmentObj - alignment object with the outer key being the row/col # and the inner key being the group name mapped to the nodes on that axis in the group\n * @param alignmentDir - alignment direction\n * @returns flattened alignment object with an arbitrary key mapping to nodes in the same row/col\n */\n const flattenAlignments = (\n alignmentObj: Record>,\n alignmentDir: ArchitectureAlignment\n ): Record => {\n return Object.entries(alignmentObj).reduce(\n (prev, [dir, alignments]) => {\n // prev is the mapping of x/y coordinate to an array of the nodes in that row/column\n let cnt = 0;\n const arr = Object.entries(alignments); // [group name, array of nodes within the group on axis dir]\n if (arr.length === 1) {\n // If only one group exists in the row/column, we don't need to do anything else\n prev[dir] = arr[0][1];\n return prev;\n }\n for (let i = 0; i < arr.length - 1; i++) {\n for (let j = i + 1; j < arr.length; j++) {\n const [aGroupId, aNodeIds] = arr[i];\n const [bGroupId, bNodeIds] = arr[j];\n const alignment = groupAlignments[aGroupId]?.[bGroupId]; // Get how the two groups are intended to align (undefined if they aren't)\n\n if (alignment === alignmentDir) {\n // If the intended alignment between the two groups is the same as the alignment we are parsing\n prev[dir] ??= [];\n prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds]; // add the node ids of both groups to the axis array in prev\n } else if (aGroupId === 'default' || bGroupId === 'default') {\n // If either of the groups are in the default space (not in a group), use the same behavior as above\n prev[dir] ??= [];\n prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds];\n } else {\n // Otherwise, the nodes in the two groups are not intended to align\n const keyA = `${dir}-${cnt++}`;\n prev[keyA] = aNodeIds;\n const keyB = `${dir}-${cnt++}`;\n prev[keyB] = bNodeIds;\n }\n }\n }\n\n return prev;\n },\n {} as Record\n );\n };\n\n const alignments = spatialMaps.map((spatialMap) => {\n const horizontalAlignments: Record> = {};\n const verticalAlignments: Record> = {};\n\n // Group service ids in an object with their x and y coordinate as the key\n Object.entries(spatialMap).forEach(([id, [x, y]]) => {\n const nodeGroup = db.getNode(id)?.in ?? 'default';\n\n horizontalAlignments[y] ??= {};\n horizontalAlignments[y][nodeGroup] ??= [];\n horizontalAlignments[y][nodeGroup].push(id);\n\n verticalAlignments[x] ??= {};\n verticalAlignments[x][nodeGroup] ??= [];\n verticalAlignments[x][nodeGroup].push(id);\n });\n\n // Merge the values of each object into a list if the inner list has at least 2 elements\n return {\n horiz: Object.values(flattenAlignments(horizontalAlignments, 'horizontal')).filter(\n (arr) => arr.length > 1\n ),\n vert: Object.values(flattenAlignments(verticalAlignments, 'vertical')).filter(\n (arr) => arr.length > 1\n ),\n };\n });\n\n // Merge the alignment lists for each spatial map into one 2d array per axis\n const [horizontal, vertical] = alignments.reduce(\n ([prevHoriz, prevVert], { horiz, vert }) => {\n return [\n [...prevHoriz, ...horiz],\n [...prevVert, ...vert],\n ];\n },\n [[] as string[][], [] as string[][]]\n );\n\n return {\n horizontal,\n vertical,\n };\n}\n\nfunction getRelativeConstraints(\n spatialMaps: ArchitectureSpatialMap[],\n db: ArchitectureDB\n): fcose.FcoseRelativePlacementConstraint[] {\n const relativeConstraints: fcose.FcoseRelativePlacementConstraint[] = [];\n const posToStr = (pos: number[]) => `${pos[0]},${pos[1]}`;\n const strToPos = (pos: string) => pos.split(',').map((p) => parseInt(p));\n\n spatialMaps.forEach((spatialMap) => {\n const invSpatialMap = Object.fromEntries(\n Object.entries(spatialMap).map(([id, pos]) => [posToStr(pos), id])\n );\n\n // perform BFS\n const queue = [posToStr([0, 0])];\n const visited: Record = {};\n const directions: Record = {\n L: [-1, 0],\n R: [1, 0],\n T: [0, 1],\n B: [0, -1],\n };\n while (queue.length > 0) {\n const curr = queue.shift();\n if (curr) {\n visited[curr] = 1;\n const currId = invSpatialMap[curr];\n if (currId) {\n const currPos = strToPos(curr);\n Object.entries(directions).forEach(([dir, shift]) => {\n const newPos = posToStr([currPos[0] + shift[0], currPos[1] + shift[1]]);\n const newId = invSpatialMap[newPos];\n // If there is an adjacent service to the current one and it has not yet been visited\n if (newId && !visited[newPos]) {\n queue.push(newPos);\n // @ts-ignore cannot determine if left/right or top/bottom are paired together\n relativeConstraints.push({\n [ArchitectureDirectionName[dir as ArchitectureDirection]]: newId,\n [ArchitectureDirectionName[\n getOppositeArchitectureDirection(dir as ArchitectureDirection)\n ]]: currId,\n gap: 1.5 * db.getConfigField('iconSize'),\n });\n }\n });\n }\n }\n }\n });\n return relativeConstraints;\n}\n\nfunction layoutArchitecture(\n services: ArchitectureService[],\n junctions: ArchitectureJunction[],\n groups: ArchitectureGroup[],\n edges: ArchitectureEdge[],\n db: ArchitectureDB,\n { spatialMaps, groupAlignments }: ArchitectureDataStructures\n): Promise {\n return new Promise((resolve) => {\n const renderEl = select('body').append('div').attr('id', 'cy').attr('style', 'display:none');\n const cy = cytoscape({\n container: document.getElementById('cy'),\n style: [\n {\n selector: 'edge',\n style: {\n 'curve-style': 'straight',\n label: 'data(label)',\n 'source-endpoint': 'data(sourceEndpoint)',\n 'target-endpoint': 'data(targetEndpoint)',\n },\n },\n {\n selector: 'edge.segments',\n style: {\n 'curve-style': 'segments',\n 'segment-weights': '0',\n 'segment-distances': [0.5],\n // @ts-ignore Incorrect library types\n 'edge-distances': 'endpoints',\n 'source-endpoint': 'data(sourceEndpoint)',\n 'target-endpoint': 'data(targetEndpoint)',\n },\n },\n {\n selector: 'node',\n style: {\n // @ts-ignore Incorrect library types\n 'compound-sizing-wrt-labels': 'include',\n },\n },\n {\n selector: 'node[label]',\n style: {\n 'text-valign': 'bottom',\n 'text-halign': 'center',\n 'font-size': `${db.getConfigField('fontSize')}px`,\n },\n },\n {\n selector: '.node-service',\n style: {\n label: 'data(label)',\n width: 'data(width)',\n height: 'data(height)',\n },\n },\n {\n selector: '.node-junction',\n style: {\n width: 'data(width)',\n height: 'data(height)',\n },\n },\n {\n selector: '.node-group',\n style: {\n // @ts-ignore Incorrect library types\n padding: `${db.getConfigField('padding')}px`,\n },\n },\n ],\n layout: {\n name: 'grid',\n boundingBox: {\n x1: 0,\n x2: 100,\n y1: 0,\n y2: 100,\n },\n },\n });\n // Remove element after layout\n renderEl.remove();\n\n addGroups(groups, cy);\n addServices(services, cy, db);\n addJunctions(junctions, cy, db);\n addEdges(edges, cy);\n // Use the spatial map to create alignment arrays for fcose\n const alignmentConstraint = getAlignments(db, spatialMaps, groupAlignments);\n\n // Create the relative constraints for fcose by using an inverse of the spatial map and performing BFS on it\n const relativePlacementConstraint = getRelativeConstraints(spatialMaps, db);\n\n const layout = cy.layout({\n name: 'fcose',\n quality: 'proof',\n styleEnabled: false,\n animate: false,\n nodeDimensionsIncludeLabels: false,\n // Adjust the edge parameters if it passes through the border of a group\n // Hacky fix for: https://github.com/iVis-at-Bilkent/cytoscape.js-fcose/issues/67\n idealEdgeLength(edge: EdgeSingular) {\n const [nodeA, nodeB] = edge.connectedNodes();\n const { parent: parentA } = nodeData(nodeA);\n const { parent: parentB } = nodeData(nodeB);\n const elasticity =\n parentA === parentB\n ? 1.5 * db.getConfigField('iconSize')\n : 0.5 * db.getConfigField('iconSize');\n return elasticity;\n },\n edgeElasticity(edge: EdgeSingular) {\n const [nodeA, nodeB] = edge.connectedNodes();\n const { parent: parentA } = nodeData(nodeA);\n const { parent: parentB } = nodeData(nodeB);\n const elasticity = parentA === parentB ? 0.45 : 0.001;\n return elasticity;\n },\n alignmentConstraint,\n relativePlacementConstraint,\n } as LayoutOptions);\n\n // Once the diagram has been generated and the service's position cords are set, adjust the XY edges to have a 90deg bend\n layout.one('layoutstop', () => {\n function getSegmentWeights(\n source: Position,\n target: Position,\n pointX: number,\n pointY: number\n ) {\n let W, D;\n const { x: sX, y: sY } = source;\n const { x: tX, y: tY } = target;\n\n D =\n (pointY - sY + ((sX - pointX) * (sY - tY)) / (sX - tX)) /\n Math.sqrt(1 + Math.pow((sY - tY) / (sX - tX), 2));\n W = Math.sqrt(Math.pow(pointY - sY, 2) + Math.pow(pointX - sX, 2) - Math.pow(D, 2));\n\n const distAB = Math.sqrt(Math.pow(tX - sX, 2) + Math.pow(tY - sY, 2));\n W = W / distAB;\n\n //check whether the point (pointX, pointY) is on right or left of the line src to tgt. for instance : a point C(X, Y) and line (AB). d=(xB-xA)(yC-yA)-(yB-yA)(xC-xA). if d>0, then C is on left of the line. if d<0, it is on right. if d=0, it is on the line.\n let delta1 = (tX - sX) * (pointY - sY) - (tY - sY) * (pointX - sX);\n switch (true) {\n case delta1 >= 0:\n delta1 = 1;\n break;\n case delta1 < 0:\n delta1 = -1;\n break;\n }\n //check whether the point (pointX, pointY) is \"behind\" the line src to tgt\n let delta2 = (tX - sX) * (pointX - sX) + (tY - sY) * (pointY - sY);\n switch (true) {\n case delta2 >= 0:\n delta2 = 1;\n break;\n case delta2 < 0:\n delta2 = -1;\n break;\n }\n\n D = Math.abs(D) * delta1; //ensure that sign of D is same as sign of delta1. Hence we need to take absolute value of D and multiply by delta1\n W = W * delta2;\n\n return {\n distances: D,\n weights: W,\n };\n }\n cy.startBatch();\n for (const edge of Object.values(cy.edges())) {\n if (edge.data?.()) {\n const { x: sX, y: sY } = edge.source().position();\n const { x: tX, y: tY } = edge.target().position();\n if (sX !== tX && sY !== tY) {\n const sEP = edge.sourceEndpoint();\n const tEP = edge.targetEndpoint();\n const { sourceDir } = edgeData(edge);\n const [pointX, pointY] = isArchitectureDirectionY(sourceDir)\n ? [sEP.x, tEP.y]\n : [tEP.x, sEP.y];\n const { weights, distances } = getSegmentWeights(sEP, tEP, pointX, pointY);\n edge.style('segment-distances', distances);\n edge.style('segment-weights', weights);\n }\n }\n }\n cy.endBatch();\n layout.run();\n });\n layout.run();\n\n cy.ready((e) => {\n log.info('Ready', e);\n resolve(cy);\n });\n });\n}\n\nexport const draw: DrawDefinition = async (text, id, _version, diagObj: Diagram) => {\n // TODO: Add title support for architecture diagrams\n\n const db = diagObj.db as ArchitectureDB;\n\n const services = db.getServices();\n const junctions = db.getJunctions();\n const groups = db.getGroups();\n const edges = db.getEdges();\n const ds = db.getDataStructures();\n\n const svg: SVG = selectSvgElement(id);\n\n const edgesElem = svg.append('g');\n edgesElem.attr('class', 'architecture-edges');\n\n const servicesElem = svg.append('g');\n servicesElem.attr('class', 'architecture-services');\n\n const groupElem = svg.append('g');\n groupElem.attr('class', 'architecture-groups');\n\n await drawServices(db, servicesElem, services);\n drawJunctions(db, servicesElem, junctions);\n\n const cy = await layoutArchitecture(services, junctions, groups, edges, db, ds);\n\n await drawEdges(edgesElem, cy, db);\n await drawGroups(groupElem, cy, db);\n positionNodes(db, cy);\n\n setupGraphViewbox(undefined, svg, db.getConfigField('padding'), db.getConfigField('useMaxWidth'));\n};\n\nexport const renderer = { draw };\n", "import { unknownIcon } from '../../rendering-util/icons.js';\nimport type { IconifyJSON } from '@iconify/types';\n\nconst wrapIcon = (icon: string) => {\n return `${icon}`;\n};\n\nexport const architectureIcons: IconifyJSON = {\n prefix: 'mermaid-architecture',\n height: 80,\n width: 80,\n icons: {\n database: {\n body: wrapIcon(\n ''\n ),\n },\n server: {\n body: wrapIcon(\n ''\n ),\n },\n disk: {\n body: wrapIcon(\n ''\n ),\n },\n internet: {\n body: wrapIcon(\n ''\n ),\n },\n cloud: {\n body: wrapIcon(\n ''\n ),\n },\n unknown: unknownIcon,\n blank: {\n body: wrapIcon(''),\n },\n },\n};\n", "import type cytoscape from 'cytoscape';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { createText } from '../../rendering-util/createText.js';\nimport { getIconSVG } from '../../rendering-util/icons.js';\nimport type { D3Element } from '../../types.js';\nimport { sanitizeText } from '../common/common.js';\nimport type { ArchitectureDB } from './architectureDb.js';\nimport { architectureIcons } from './architectureIcons.js';\nimport {\n ArchitectureDirectionArrow,\n ArchitectureDirectionArrowShift,\n edgeData,\n getArchitectureDirectionPair,\n getArchitectureDirectionXYFactors,\n isArchitectureDirectionX,\n isArchitectureDirectionXY,\n isArchitectureDirectionY,\n isArchitecturePairXY,\n nodeData,\n type ArchitectureJunction,\n type ArchitectureService,\n} from './architectureTypes.js';\nimport { getEdgeId } from '../../utils.js';\n\nexport const drawEdges = async function (\n edgesEl: D3Element,\n cy: cytoscape.Core,\n db: ArchitectureDB\n) {\n const padding = db.getConfigField('padding');\n const iconSize = db.getConfigField('iconSize');\n const halfIconSize = iconSize / 2;\n const arrowSize = iconSize / 6;\n const halfArrowSize = arrowSize / 2;\n\n await Promise.all(\n cy.edges().map(async (edge) => {\n const {\n source,\n sourceDir,\n sourceArrow,\n sourceGroup,\n target,\n targetDir,\n targetArrow,\n targetGroup,\n label,\n } = edgeData(edge);\n let { x: startX, y: startY } = edge[0].sourceEndpoint();\n const { x: midX, y: midY } = edge[0].midpoint();\n let { x: endX, y: endY } = edge[0].targetEndpoint();\n\n // Adjust the edge distance if it has the {group} modifier\n const groupEdgeShift = padding + 4;\n // +18 comes from the service label height that extends the padding on the bottom side of each group\n if (sourceGroup) {\n if (isArchitectureDirectionX(sourceDir)) {\n startX += sourceDir === 'L' ? -groupEdgeShift : groupEdgeShift;\n } else {\n startY += sourceDir === 'T' ? -groupEdgeShift : groupEdgeShift + 18;\n }\n }\n\n if (targetGroup) {\n if (isArchitectureDirectionX(targetDir)) {\n endX += targetDir === 'L' ? -groupEdgeShift : groupEdgeShift;\n } else {\n endY += targetDir === 'T' ? -groupEdgeShift : groupEdgeShift + 18;\n }\n }\n\n // Adjust the edge distance if it doesn't have the {group} modifier and the endpoint is a junction node\n if (!sourceGroup && db.getNode(source)?.type === 'junction') {\n if (isArchitectureDirectionX(sourceDir)) {\n startX += sourceDir === 'L' ? halfIconSize : -halfIconSize;\n } else {\n startY += sourceDir === 'T' ? halfIconSize : -halfIconSize;\n }\n }\n if (!targetGroup && db.getNode(target)?.type === 'junction') {\n if (isArchitectureDirectionX(targetDir)) {\n endX += targetDir === 'L' ? halfIconSize : -halfIconSize;\n } else {\n endY += targetDir === 'T' ? halfIconSize : -halfIconSize;\n }\n }\n\n if (edge[0]._private.rscratch) {\n // const bounds = edge[0]._private.rscratch;\n\n const g = edgesEl.insert('g');\n\n g.insert('path')\n .attr('d', `M ${startX},${startY} L ${midX},${midY} L${endX},${endY} `)\n .attr('class', 'edge')\n .attr('id', getEdgeId(source, target, { prefix: 'L' }));\n\n if (sourceArrow) {\n const xShift = isArchitectureDirectionX(sourceDir)\n ? ArchitectureDirectionArrowShift[sourceDir](startX, arrowSize)\n : startX - halfArrowSize;\n const yShift = isArchitectureDirectionY(sourceDir)\n ? ArchitectureDirectionArrowShift[sourceDir](startY, arrowSize)\n : startY - halfArrowSize;\n\n g.insert('polygon')\n .attr('points', ArchitectureDirectionArrow[sourceDir](arrowSize))\n .attr('transform', `translate(${xShift},${yShift})`)\n .attr('class', 'arrow');\n }\n if (targetArrow) {\n const xShift = isArchitectureDirectionX(targetDir)\n ? ArchitectureDirectionArrowShift[targetDir](endX, arrowSize)\n : endX - halfArrowSize;\n const yShift = isArchitectureDirectionY(targetDir)\n ? ArchitectureDirectionArrowShift[targetDir](endY, arrowSize)\n : endY - halfArrowSize;\n\n g.insert('polygon')\n .attr('points', ArchitectureDirectionArrow[targetDir](arrowSize))\n .attr('transform', `translate(${xShift},${yShift})`)\n .attr('class', 'arrow');\n }\n\n if (label) {\n const axis = !isArchitectureDirectionXY(sourceDir, targetDir)\n ? isArchitectureDirectionX(sourceDir)\n ? 'X'\n : 'Y'\n : 'XY';\n\n let width = 0;\n if (axis === 'X') {\n width = Math.abs(startX - endX);\n } else if (axis === 'Y') {\n // Reduce width by a factor of 1.5 to avoid overlapping service labels\n width = Math.abs(startY - endY) / 1.5;\n } else {\n width = Math.abs(startX - endX) / 2;\n }\n\n const textElem = g.append('g');\n await createText(\n textElem,\n label,\n {\n useHtmlLabels: false,\n width,\n classes: 'architecture-service-label',\n },\n getConfig()\n );\n\n textElem\n .attr('dy', '1em')\n .attr('alignment-baseline', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'middle');\n\n if (axis === 'X') {\n textElem.attr('transform', 'translate(' + midX + ', ' + midY + ')');\n } else if (axis === 'Y') {\n textElem.attr('transform', 'translate(' + midX + ', ' + midY + ') rotate(-90)');\n } else if (axis === 'XY') {\n const pair = getArchitectureDirectionPair(sourceDir, targetDir);\n if (pair && isArchitecturePairXY(pair)) {\n const bboxOrig = textElem.node().getBoundingClientRect();\n const [x, y] = getArchitectureDirectionXYFactors(pair);\n\n textElem\n .attr('dominant-baseline', 'auto')\n .attr('transform', `rotate(${-1 * x * y * 45})`);\n\n // Calculate the new width/height with the rotation applied, and transform to the proper position\n const bboxNew = textElem.node().getBoundingClientRect();\n textElem.attr(\n 'transform',\n `\n translate(${midX}, ${midY - bboxOrig.height / 2})\n translate(${(x * bboxNew.width) / 2}, ${(y * bboxNew.height) / 2})\n rotate(${-1 * x * y * 45}, 0, ${bboxOrig.height / 2})\n `\n );\n }\n }\n }\n }\n })\n );\n};\n\nexport const drawGroups = async function (\n groupsEl: D3Element,\n cy: cytoscape.Core,\n db: ArchitectureDB\n) {\n const padding = db.getConfigField('padding');\n const groupIconSize = padding * 0.75;\n\n const fontSize = db.getConfigField('fontSize');\n\n const iconSize = db.getConfigField('iconSize');\n const halfIconSize = iconSize / 2;\n\n await Promise.all(\n cy.nodes().map(async (node) => {\n const data = nodeData(node);\n if (data.type === 'group') {\n const { h, w, x1, y1 } = node.boundingBox();\n\n const groupsNode = groupsEl.append('rect');\n groupsNode\n .attr('id', `group-${data.id}`)\n .attr('x', x1 + halfIconSize)\n .attr('y', y1 + halfIconSize)\n .attr('width', w)\n .attr('height', h)\n .attr('class', 'node-bkg');\n\n const groupLabelContainer = groupsEl.append('g');\n let shiftedX1 = x1;\n let shiftedY1 = y1;\n if (data.icon) {\n const bkgElem = groupLabelContainer.append('g');\n bkgElem.html(\n `${await getIconSVG(data.icon, { height: groupIconSize, width: groupIconSize, fallbackPrefix: architectureIcons.prefix })}`\n );\n bkgElem.attr(\n 'transform',\n 'translate(' +\n (shiftedX1 + halfIconSize + 1) +\n ', ' +\n (shiftedY1 + halfIconSize + 1) +\n ')'\n );\n shiftedX1 += groupIconSize;\n // TODO: test with more values\n // - 1 - 2 comes from the Y axis transform of the icon and label\n shiftedY1 += fontSize / 2 - 1 - 2;\n }\n if (data.label) {\n const textElem = groupLabelContainer.append('g');\n await createText(\n textElem,\n data.label,\n {\n useHtmlLabels: false,\n width: w,\n classes: 'architecture-service-label',\n },\n getConfig()\n );\n textElem\n .attr('dy', '1em')\n .attr('alignment-baseline', 'middle')\n .attr('dominant-baseline', 'start')\n .attr('text-anchor', 'start');\n\n textElem.attr(\n 'transform',\n 'translate(' +\n (shiftedX1 + halfIconSize + 4) +\n ', ' +\n (shiftedY1 + halfIconSize + 2) +\n ')'\n );\n }\n db.setElementForId(data.id, groupsNode);\n }\n })\n );\n};\n\nexport const drawServices = async function (\n db: ArchitectureDB,\n elem: D3Element,\n services: ArchitectureService[]\n): Promise {\n const config = getConfig();\n for (const service of services) {\n const serviceElem = elem.append('g');\n const iconSize = db.getConfigField('iconSize');\n\n if (service.title) {\n const textElem = serviceElem.append('g');\n await createText(\n textElem,\n service.title,\n {\n useHtmlLabels: false,\n width: iconSize * 1.5,\n classes: 'architecture-service-label',\n },\n config\n );\n\n textElem\n .attr('dy', '1em')\n .attr('alignment-baseline', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'middle');\n\n textElem.attr('transform', 'translate(' + iconSize / 2 + ', ' + iconSize + ')');\n }\n\n const bkgElem = serviceElem.append('g');\n if (service.icon) {\n // TODO: should a warning be given to end-users saying which icon names are available?\n // if (!isIconNameInUse(service.icon)) {\n // throw new Error(`Invalid SVG Icon name: \"${service.icon}\"`);\n // }\n bkgElem.html(\n `${await getIconSVG(service.icon, { height: iconSize, width: iconSize, fallbackPrefix: architectureIcons.prefix })}`\n );\n } else if (service.iconText) {\n bkgElem.html(\n `${await getIconSVG('blank', { height: iconSize, width: iconSize, fallbackPrefix: architectureIcons.prefix })}`\n );\n const textElemContainer = bkgElem.append('g');\n const fo = textElemContainer\n .append('foreignObject')\n .attr('width', iconSize)\n .attr('height', iconSize);\n const divElem = fo\n .append('div')\n .attr('class', 'node-icon-text')\n .attr('style', `height: ${iconSize}px;`)\n .append('div')\n .html(sanitizeText(service.iconText, config));\n const fontSize =\n parseInt(\n window\n .getComputedStyle(divElem.node(), null)\n .getPropertyValue('font-size')\n .replace(/\\D/g, '')\n ) ?? 16;\n divElem.attr('style', `-webkit-line-clamp: ${Math.floor((iconSize - 2) / fontSize)};`);\n } else {\n bkgElem\n .append('path')\n .attr('class', 'node-bkg')\n .attr('id', 'node-' + service.id)\n .attr(\n 'd',\n `M0 ${iconSize} v${-iconSize} q0,-5 5,-5 h${iconSize} q5,0 5,5 v${iconSize} H0 Z`\n );\n }\n\n serviceElem.attr('id', `service-${service.id}`).attr('class', 'architecture-service');\n\n const { width, height } = serviceElem.node().getBBox();\n service.width = width;\n service.height = height;\n db.setElementForId(service.id, serviceElem);\n }\n return 0;\n};\n\nexport const drawJunctions = function (\n db: ArchitectureDB,\n elem: D3Element,\n junctions: ArchitectureJunction[]\n) {\n junctions.forEach((junction) => {\n const junctionElem = elem.append('g');\n const iconSize = db.getConfigField('iconSize');\n\n const bkgElem = junctionElem.append('g');\n bkgElem\n .append('rect')\n .attr('id', 'node-' + junction.id)\n .attr('fill-opacity', '0')\n .attr('width', iconSize)\n .attr('height', iconSize);\n\n junctionElem.attr('class', 'architecture-junction');\n\n const { width, height } = junctionElem._groups[0][0].getBBox();\n junctionElem.width = width;\n junctionElem.height = height;\n db.setElementForId(junction.id, junctionElem);\n });\n};\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { parser } from './architectureParser.js';\nimport { ArchitectureDB } from './architectureDb.js';\nimport styles from './architectureStyles.js';\nimport { renderer } from './architectureRenderer.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n get db() {\n return new ArchitectureDB();\n },\n renderer,\n styles,\n};\n"], + "mappings": "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", + "names": ["getConfig", "alignments"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/blockDiagram-VD42YOAC.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/blockDiagram-VD42YOAC.mjs new file mode 100644 index 0000000..e2b68fc --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/blockDiagram-VD42YOAC.mjs @@ -0,0 +1,3789 @@ +import { + getIconStyles +} from "./chunk-FMBD7UC4.mjs"; +import { + getLineFunctionsWithOffset +} from "./chunk-HN2XXSSU.mjs"; +import { + getSubGraphTitleMargins +} from "./chunk-CVBHYZKI.mjs"; +import { + createText, + replaceIconSubstring +} from "./chunk-JA3XYJ7Z.mjs"; +import { + decodeEntities, + getStylesFromArray, + utils_default +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + common_default, + configureSvgSize, + evaluate, + getConfig, + getConfig2, + getUrl, + sanitizeText +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/block/parser/block.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 15], $V1 = [1, 7], $V2 = [1, 13], $V3 = [1, 14], $V4 = [1, 19], $V5 = [1, 16], $V6 = [1, 17], $V7 = [1, 18], $V8 = [8, 30], $V9 = [8, 10, 21, 28, 29, 30, 31, 39, 43, 46], $Va = [1, 23], $Vb = [1, 24], $Vc = [8, 10, 15, 16, 21, 28, 29, 30, 31, 39, 43, 46], $Vd = [8, 10, 15, 16, 21, 27, 28, 29, 30, 31, 39, 43, 46], $Ve = [1, 49]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "spaceLines": 3, "SPACELINE": 4, "NL": 5, "separator": 6, "SPACE": 7, "EOF": 8, "start": 9, "BLOCK_DIAGRAM_KEY": 10, "document": 11, "stop": 12, "statement": 13, "link": 14, "LINK": 15, "START_LINK": 16, "LINK_LABEL": 17, "STR": 18, "nodeStatement": 19, "columnsStatement": 20, "SPACE_BLOCK": 21, "blockStatement": 22, "classDefStatement": 23, "cssClassStatement": 24, "styleStatement": 25, "node": 26, "SIZE": 27, "COLUMNS": 28, "id-block": 29, "end": 30, "NODE_ID": 31, "nodeShapeNLabel": 32, "dirList": 33, "DIR": 34, "NODE_DSTART": 35, "NODE_DEND": 36, "BLOCK_ARROW_START": 37, "BLOCK_ARROW_END": 38, "classDef": 39, "CLASSDEF_ID": 40, "CLASSDEF_STYLEOPTS": 41, "DEFAULT": 42, "class": 43, "CLASSENTITY_IDS": 44, "STYLECLASS": 45, "style": 46, "STYLE_ENTITY_IDS": 47, "STYLE_DEFINITION_DATA": 48, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "SPACELINE", 5: "NL", 7: "SPACE", 8: "EOF", 10: "BLOCK_DIAGRAM_KEY", 15: "LINK", 16: "START_LINK", 17: "LINK_LABEL", 18: "STR", 21: "SPACE_BLOCK", 27: "SIZE", 28: "COLUMNS", 29: "id-block", 30: "end", 31: "NODE_ID", 34: "DIR", 35: "NODE_DSTART", 36: "NODE_DEND", 37: "BLOCK_ARROW_START", 38: "BLOCK_ARROW_END", 39: "classDef", 40: "CLASSDEF_ID", 41: "CLASSDEF_STYLEOPTS", 42: "DEFAULT", 43: "class", 44: "CLASSENTITY_IDS", 45: "STYLECLASS", 46: "style", 47: "STYLE_ENTITY_IDS", 48: "STYLE_DEFINITION_DATA" }, + productions_: [0, [3, 1], [3, 2], [3, 2], [6, 1], [6, 1], [6, 1], [9, 3], [12, 1], [12, 1], [12, 2], [12, 2], [11, 1], [11, 2], [14, 1], [14, 4], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [19, 3], [19, 2], [19, 1], [20, 1], [22, 4], [22, 3], [26, 1], [26, 2], [33, 1], [33, 2], [32, 3], [32, 4], [23, 3], [23, 3], [24, 3], [25, 3]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 4: + yy.getLogger().debug("Rule: separator (NL) "); + break; + case 5: + yy.getLogger().debug("Rule: separator (Space) "); + break; + case 6: + yy.getLogger().debug("Rule: separator (EOF) "); + break; + case 7: + yy.getLogger().debug("Rule: hierarchy: ", $$[$0 - 1]); + yy.setHierarchy($$[$0 - 1]); + break; + case 8: + yy.getLogger().debug("Stop NL "); + break; + case 9: + yy.getLogger().debug("Stop EOF "); + break; + case 10: + yy.getLogger().debug("Stop NL2 "); + break; + case 11: + yy.getLogger().debug("Stop EOF2 "); + break; + case 12: + yy.getLogger().debug("Rule: statement: ", $$[$0]); + typeof $$[$0].length === "number" ? this.$ = $$[$0] : this.$ = [$$[$0]]; + break; + case 13: + yy.getLogger().debug("Rule: statement #2: ", $$[$0 - 1]); + this.$ = [$$[$0 - 1]].concat($$[$0]); + break; + case 14: + yy.getLogger().debug("Rule: link: ", $$[$0], yytext); + this.$ = { edgeTypeStr: $$[$0], label: "" }; + break; + case 15: + yy.getLogger().debug("Rule: LABEL link: ", $$[$0 - 3], $$[$0 - 1], $$[$0]); + this.$ = { edgeTypeStr: $$[$0], label: $$[$0 - 1] }; + break; + case 18: + const num = parseInt($$[$0]); + const spaceId = yy.generateId(); + this.$ = { id: spaceId, type: "space", label: "", width: num, children: [] }; + break; + case 23: + yy.getLogger().debug("Rule: (nodeStatement link node) ", $$[$0 - 2], $$[$0 - 1], $$[$0], " typestr: ", $$[$0 - 1].edgeTypeStr); + const edgeData = yy.edgeStrToEdgeData($$[$0 - 1].edgeTypeStr); + this.$ = [ + { id: $$[$0 - 2].id, label: $$[$0 - 2].label, type: $$[$0 - 2].type, directions: $$[$0 - 2].directions }, + { id: $$[$0 - 2].id + "-" + $$[$0].id, start: $$[$0 - 2].id, end: $$[$0].id, label: $$[$0 - 1].label, type: "edge", directions: $$[$0].directions, arrowTypeEnd: edgeData, arrowTypeStart: "arrow_open" }, + { id: $$[$0].id, label: $$[$0].label, type: yy.typeStr2Type($$[$0].typeStr), directions: $$[$0].directions } + ]; + break; + case 24: + yy.getLogger().debug("Rule: nodeStatement (abc88 node size) ", $$[$0 - 1], $$[$0]); + this.$ = { id: $$[$0 - 1].id, label: $$[$0 - 1].label, type: yy.typeStr2Type($$[$0 - 1].typeStr), directions: $$[$0 - 1].directions, widthInColumns: parseInt($$[$0], 10) }; + break; + case 25: + yy.getLogger().debug("Rule: nodeStatement (node) ", $$[$0]); + this.$ = { id: $$[$0].id, label: $$[$0].label, type: yy.typeStr2Type($$[$0].typeStr), directions: $$[$0].directions, widthInColumns: 1 }; + break; + case 26: + yy.getLogger().debug("APA123", this ? this : "na"); + yy.getLogger().debug("COLUMNS: ", $$[$0]); + this.$ = { type: "column-setting", columns: $$[$0] === "auto" ? -1 : parseInt($$[$0]) }; + break; + case 27: + yy.getLogger().debug("Rule: id-block statement : ", $$[$0 - 2], $$[$0 - 1]); + const id2 = yy.generateId(); + this.$ = { ...$$[$0 - 2], type: "composite", children: $$[$0 - 1] }; + break; + case 28: + yy.getLogger().debug("Rule: blockStatement : ", $$[$0 - 2], $$[$0 - 1], $$[$0]); + const id = yy.generateId(); + this.$ = { id, type: "composite", label: "", children: $$[$0 - 1] }; + break; + case 29: + yy.getLogger().debug("Rule: node (NODE_ID separator): ", $$[$0]); + this.$ = { id: $$[$0] }; + break; + case 30: + yy.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ", $$[$0 - 1], $$[$0]); + this.$ = { id: $$[$0 - 1], label: $$[$0].label, typeStr: $$[$0].typeStr, directions: $$[$0].directions }; + break; + case 31: + yy.getLogger().debug("Rule: dirList: ", $$[$0]); + this.$ = [$$[$0]]; + break; + case 32: + yy.getLogger().debug("Rule: dirList: ", $$[$0 - 1], $$[$0]); + this.$ = [$$[$0 - 1]].concat($$[$0]); + break; + case 33: + yy.getLogger().debug("Rule: nodeShapeNLabel: ", $$[$0 - 2], $$[$0 - 1], $$[$0]); + this.$ = { typeStr: $$[$0 - 2] + $$[$0], label: $$[$0 - 1] }; + break; + case 34: + yy.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ", $$[$0 - 3], $$[$0 - 2], " #3:", $$[$0 - 1], $$[$0]); + this.$ = { typeStr: $$[$0 - 3] + $$[$0], label: $$[$0 - 2], directions: $$[$0 - 1] }; + break; + case 35: + case 36: + this.$ = { type: "classDef", id: $$[$0 - 1].trim(), css: $$[$0].trim() }; + break; + case 37: + this.$ = { type: "applyClass", id: $$[$0 - 1].trim(), styleClass: $$[$0].trim() }; + break; + case 38: + this.$ = { type: "applyStyles", id: $$[$0 - 1].trim(), stylesStr: $$[$0].trim() }; + break; + } + }, "anonymous"), + table: [{ 9: 1, 10: [1, 2] }, { 1: [3] }, { 10: $V0, 11: 3, 13: 4, 19: 5, 20: 6, 21: $V1, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: $V2, 29: $V3, 31: $V4, 39: $V5, 43: $V6, 46: $V7 }, { 8: [1, 20] }, o($V8, [2, 12], { 13: 4, 19: 5, 20: 6, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 11: 21, 10: $V0, 21: $V1, 28: $V2, 29: $V3, 31: $V4, 39: $V5, 43: $V6, 46: $V7 }), o($V9, [2, 16], { 14: 22, 15: $Va, 16: $Vb }), o($V9, [2, 17]), o($V9, [2, 18]), o($V9, [2, 19]), o($V9, [2, 20]), o($V9, [2, 21]), o($V9, [2, 22]), o($Vc, [2, 25], { 27: [1, 25] }), o($V9, [2, 26]), { 19: 26, 26: 12, 31: $V4 }, { 10: $V0, 11: 27, 13: 4, 19: 5, 20: 6, 21: $V1, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: $V2, 29: $V3, 31: $V4, 39: $V5, 43: $V6, 46: $V7 }, { 40: [1, 28], 42: [1, 29] }, { 44: [1, 30] }, { 47: [1, 31] }, o($Vd, [2, 29], { 32: 32, 35: [1, 33], 37: [1, 34] }), { 1: [2, 7] }, o($V8, [2, 13]), { 26: 35, 31: $V4 }, { 31: [2, 14] }, { 17: [1, 36] }, o($Vc, [2, 24]), { 10: $V0, 11: 37, 13: 4, 14: 22, 15: $Va, 16: $Vb, 19: 5, 20: 6, 21: $V1, 22: 8, 23: 9, 24: 10, 25: 11, 26: 12, 28: $V2, 29: $V3, 31: $V4, 39: $V5, 43: $V6, 46: $V7 }, { 30: [1, 38] }, { 41: [1, 39] }, { 41: [1, 40] }, { 45: [1, 41] }, { 48: [1, 42] }, o($Vd, [2, 30]), { 18: [1, 43] }, { 18: [1, 44] }, o($Vc, [2, 23]), { 18: [1, 45] }, { 30: [1, 46] }, o($V9, [2, 28]), o($V9, [2, 35]), o($V9, [2, 36]), o($V9, [2, 37]), o($V9, [2, 38]), { 36: [1, 47] }, { 33: 48, 34: $Ve }, { 15: [1, 50] }, o($V9, [2, 27]), o($Vd, [2, 33]), { 38: [1, 51] }, { 33: 52, 34: $Ve, 38: [2, 31] }, { 31: [2, 15] }, o($Vd, [2, 34]), { 38: [2, 32] }], + defaultActions: { 20: [2, 7], 23: [2, 14], 50: [2, 15], 52: [2, 32] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: {}, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + yy.getLogger().debug("Found block-beta"); + return 10; + break; + case 1: + yy.getLogger().debug("Found id-block"); + return 29; + break; + case 2: + yy.getLogger().debug("Found block"); + return 10; + break; + case 3: + yy.getLogger().debug(".", yy_.yytext); + break; + case 4: + yy.getLogger().debug("_", yy_.yytext); + break; + case 5: + return 5; + break; + case 6: + yy_.yytext = -1; + return 28; + break; + case 7: + yy_.yytext = yy_.yytext.replace(/columns\s+/, ""); + yy.getLogger().debug("COLUMNS (LEX)", yy_.yytext); + return 28; + break; + case 8: + this.pushState("md_string"); + break; + case 9: + return "MD_STR"; + break; + case 10: + this.popState(); + break; + case 11: + this.pushState("string"); + break; + case 12: + yy.getLogger().debug("LEX: POPPING STR:", yy_.yytext); + this.popState(); + break; + case 13: + yy.getLogger().debug("LEX: STR end:", yy_.yytext); + return "STR"; + break; + case 14: + yy_.yytext = yy_.yytext.replace(/space\:/, ""); + yy.getLogger().debug("SPACE NUM (LEX)", yy_.yytext); + return 21; + break; + case 15: + yy_.yytext = "1"; + yy.getLogger().debug("COLUMNS (LEX)", yy_.yytext); + return 21; + break; + case 16: + return 42; + break; + case 17: + return "LINKSTYLE"; + break; + case 18: + return "INTERPOLATE"; + break; + case 19: + this.pushState("CLASSDEF"); + return 39; + break; + case 20: + this.popState(); + this.pushState("CLASSDEFID"); + return "DEFAULT_CLASSDEF_ID"; + break; + case 21: + this.popState(); + this.pushState("CLASSDEFID"); + return 40; + break; + case 22: + this.popState(); + return 41; + break; + case 23: + this.pushState("CLASS"); + return 43; + break; + case 24: + this.popState(); + this.pushState("CLASS_STYLE"); + return 44; + break; + case 25: + this.popState(); + return 45; + break; + case 26: + this.pushState("STYLE_STMNT"); + return 46; + break; + case 27: + this.popState(); + this.pushState("STYLE_DEFINITION"); + return 47; + break; + case 28: + this.popState(); + return 48; + break; + case 29: + this.pushState("acc_title"); + return "acc_title"; + break; + case 30: + this.popState(); + return "acc_title_value"; + break; + case 31: + this.pushState("acc_descr"); + return "acc_descr"; + break; + case 32: + this.popState(); + return "acc_descr_value"; + break; + case 33: + this.pushState("acc_descr_multiline"); + break; + case 34: + this.popState(); + break; + case 35: + return "acc_descr_multiline_value"; + break; + case 36: + return 30; + break; + case 37: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + break; + case 38: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + break; + case 39: + this.popState(); + yy.getLogger().debug("Lex: ))"); + return "NODE_DEND"; + break; + case 40: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + break; + case 41: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + break; + case 42: + this.popState(); + yy.getLogger().debug("Lex: (-"); + return "NODE_DEND"; + break; + case 43: + this.popState(); + yy.getLogger().debug("Lex: -)"); + return "NODE_DEND"; + break; + case 44: + this.popState(); + yy.getLogger().debug("Lex: (("); + return "NODE_DEND"; + break; + case 45: + this.popState(); + yy.getLogger().debug("Lex: ]]"); + return "NODE_DEND"; + break; + case 46: + this.popState(); + yy.getLogger().debug("Lex: ("); + return "NODE_DEND"; + break; + case 47: + this.popState(); + yy.getLogger().debug("Lex: ])"); + return "NODE_DEND"; + break; + case 48: + this.popState(); + yy.getLogger().debug("Lex: /]"); + return "NODE_DEND"; + break; + case 49: + this.popState(); + yy.getLogger().debug("Lex: /]"); + return "NODE_DEND"; + break; + case 50: + this.popState(); + yy.getLogger().debug("Lex: )]"); + return "NODE_DEND"; + break; + case 51: + this.popState(); + yy.getLogger().debug("Lex: )"); + return "NODE_DEND"; + break; + case 52: + this.popState(); + yy.getLogger().debug("Lex: ]>"); + return "NODE_DEND"; + break; + case 53: + this.popState(); + yy.getLogger().debug("Lex: ]"); + return "NODE_DEND"; + break; + case 54: + yy.getLogger().debug("Lexa: -)"); + this.pushState("NODE"); + return 35; + break; + case 55: + yy.getLogger().debug("Lexa: (-"); + this.pushState("NODE"); + return 35; + break; + case 56: + yy.getLogger().debug("Lexa: ))"); + this.pushState("NODE"); + return 35; + break; + case 57: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 35; + break; + case 58: + yy.getLogger().debug("Lex: ((("); + this.pushState("NODE"); + return 35; + break; + case 59: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 35; + break; + case 60: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 35; + break; + case 61: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 35; + break; + case 62: + yy.getLogger().debug("Lexc: >"); + this.pushState("NODE"); + return 35; + break; + case 63: + yy.getLogger().debug("Lexa: (["); + this.pushState("NODE"); + return 35; + break; + case 64: + yy.getLogger().debug("Lexa: )"); + this.pushState("NODE"); + return 35; + break; + case 65: + this.pushState("NODE"); + return 35; + break; + case 66: + this.pushState("NODE"); + return 35; + break; + case 67: + this.pushState("NODE"); + return 35; + break; + case 68: + this.pushState("NODE"); + return 35; + break; + case 69: + this.pushState("NODE"); + return 35; + break; + case 70: + this.pushState("NODE"); + return 35; + break; + case 71: + this.pushState("NODE"); + return 35; + break; + case 72: + yy.getLogger().debug("Lexa: ["); + this.pushState("NODE"); + return 35; + break; + case 73: + this.pushState("BLOCK_ARROW"); + yy.getLogger().debug("LEX ARR START"); + return 37; + break; + case 74: + yy.getLogger().debug("Lex: NODE_ID", yy_.yytext); + return 31; + break; + case 75: + yy.getLogger().debug("Lex: EOF", yy_.yytext); + return 8; + break; + case 76: + this.pushState("md_string"); + break; + case 77: + this.pushState("md_string"); + break; + case 78: + return "NODE_DESCR"; + break; + case 79: + this.popState(); + break; + case 80: + yy.getLogger().debug("Lex: Starting string"); + this.pushState("string"); + break; + case 81: + yy.getLogger().debug("LEX ARR: Starting string"); + this.pushState("string"); + break; + case 82: + yy.getLogger().debug("LEX: NODE_DESCR:", yy_.yytext); + return "NODE_DESCR"; + break; + case 83: + yy.getLogger().debug("LEX POPPING"); + this.popState(); + break; + case 84: + yy.getLogger().debug("Lex: =>BAE"); + this.pushState("ARROW_DIR"); + break; + case 85: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (right): dir:", yy_.yytext); + return "DIR"; + break; + case 86: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (left):", yy_.yytext); + return "DIR"; + break; + case 87: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (x):", yy_.yytext); + return "DIR"; + break; + case 88: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (y):", yy_.yytext); + return "DIR"; + break; + case 89: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (up):", yy_.yytext); + return "DIR"; + break; + case 90: + yy_.yytext = yy_.yytext.replace(/^,\s*/, ""); + yy.getLogger().debug("Lex (down):", yy_.yytext); + return "DIR"; + break; + case 91: + yy_.yytext = "]>"; + yy.getLogger().debug("Lex (ARROW_DIR end):", yy_.yytext); + this.popState(); + this.popState(); + return "BLOCK_ARROW_END"; + break; + case 92: + yy.getLogger().debug("Lex: LINK", "#" + yy_.yytext + "#"); + return 15; + break; + case 93: + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + break; + case 94: + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + break; + case 95: + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + break; + case 96: + yy.getLogger().debug("Lex: START_LINK", yy_.yytext); + this.pushState("LLABEL"); + return 16; + break; + case 97: + yy.getLogger().debug("Lex: START_LINK", yy_.yytext); + this.pushState("LLABEL"); + return 16; + break; + case 98: + yy.getLogger().debug("Lex: START_LINK", yy_.yytext); + this.pushState("LLABEL"); + return 16; + break; + case 99: + this.pushState("md_string"); + break; + case 100: + yy.getLogger().debug("Lex: Starting string"); + this.pushState("string"); + return "LINK_LABEL"; + break; + case 101: + this.popState(); + yy.getLogger().debug("Lex: LINK", "#" + yy_.yytext + "#"); + return 15; + break; + case 102: + this.popState(); + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + break; + case 103: + this.popState(); + yy.getLogger().debug("Lex: LINK", yy_.yytext); + return 15; + break; + case 104: + yy.getLogger().debug("Lex: COLON", yy_.yytext); + yy_.yytext = yy_.yytext.slice(1); + return 27; + break; + } + }, "anonymous"), + rules: [/^(?:block-beta\b)/, /^(?:block:)/, /^(?:block\b)/, /^(?:[\s]+)/, /^(?:[\n]+)/, /^(?:((\u000D\u000A)|(\u000A)))/, /^(?:columns\s+auto\b)/, /^(?:columns\s+[\d]+)/, /^(?:["][`])/, /^(?:[^`"]+)/, /^(?:[`]["])/, /^(?:["])/, /^(?:["])/, /^(?:[^"]*)/, /^(?:space[:]\d+)/, /^(?:space\b)/, /^(?:default\b)/, /^(?:linkStyle\b)/, /^(?:interpolate\b)/, /^(?:classDef\s+)/, /^(?:DEFAULT\s+)/, /^(?:\w+\s+)/, /^(?:[^\n]*)/, /^(?:class\s+)/, /^(?:(\w+)+((,\s*\w+)*))/, /^(?:[^\n]*)/, /^(?:style\s+)/, /^(?:(\w+)+((,\s*\w+)*))/, /^(?:[^\n]*)/, /^(?:accTitle\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*\{\s*)/, /^(?:[\}])/, /^(?:[^\}]*)/, /^(?:end\b\s*)/, /^(?:\(\(\()/, /^(?:\)\)\))/, /^(?:[\)]\))/, /^(?:\}\})/, /^(?:\})/, /^(?:\(-)/, /^(?:-\))/, /^(?:\(\()/, /^(?:\]\])/, /^(?:\()/, /^(?:\]\))/, /^(?:\\\])/, /^(?:\/\])/, /^(?:\)\])/, /^(?:[\)])/, /^(?:\]>)/, /^(?:[\]])/, /^(?:-\))/, /^(?:\(-)/, /^(?:\)\))/, /^(?:\))/, /^(?:\(\(\()/, /^(?:\(\()/, /^(?:\{\{)/, /^(?:\{)/, /^(?:>)/, /^(?:\(\[)/, /^(?:\()/, /^(?:\[\[)/, /^(?:\[\|)/, /^(?:\[\()/, /^(?:\)\)\))/, /^(?:\[\\)/, /^(?:\[\/)/, /^(?:\[\\)/, /^(?:\[)/, /^(?:<\[)/, /^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/, /^(?:$)/, /^(?:["][`])/, /^(?:["][`])/, /^(?:[^`"]+)/, /^(?:[`]["])/, /^(?:["])/, /^(?:["])/, /^(?:[^"]+)/, /^(?:["])/, /^(?:\]>\s*\()/, /^(?:,?\s*right\s*)/, /^(?:,?\s*left\s*)/, /^(?:,?\s*x\s*)/, /^(?:,?\s*y\s*)/, /^(?:,?\s*up\s*)/, /^(?:,?\s*down\s*)/, /^(?:\)\s*)/, /^(?:\s*[xo<]?--+[-xo>]\s*)/, /^(?:\s*[xo<]?==+[=xo>]\s*)/, /^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/, /^(?:\s*~~[\~]+\s*)/, /^(?:\s*[xo<]?--\s*)/, /^(?:\s*[xo<]?==\s*)/, /^(?:\s*[xo<]?-\.\s*)/, /^(?:["][`])/, /^(?:["])/, /^(?:\s*[xo<]?--+[-xo>]\s*)/, /^(?:\s*[xo<]?==+[=xo>]\s*)/, /^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/, /^(?::\d+)/], + conditions: { "STYLE_DEFINITION": { "rules": [28], "inclusive": false }, "STYLE_STMNT": { "rules": [27], "inclusive": false }, "CLASSDEFID": { "rules": [22], "inclusive": false }, "CLASSDEF": { "rules": [20, 21], "inclusive": false }, "CLASS_STYLE": { "rules": [25], "inclusive": false }, "CLASS": { "rules": [24], "inclusive": false }, "LLABEL": { "rules": [99, 100, 101, 102, 103], "inclusive": false }, "ARROW_DIR": { "rules": [85, 86, 87, 88, 89, 90, 91], "inclusive": false }, "BLOCK_ARROW": { "rules": [76, 81, 84], "inclusive": false }, "NODE": { "rules": [37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 77, 80], "inclusive": false }, "md_string": { "rules": [9, 10, 78, 79], "inclusive": false }, "space": { "rules": [], "inclusive": false }, "string": { "rules": [12, 13, 82, 83], "inclusive": false }, "acc_descr_multiline": { "rules": [34, 35], "inclusive": false }, "acc_descr": { "rules": [32], "inclusive": false }, "acc_title": { "rules": [30], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 14, 15, 16, 17, 18, 19, 23, 26, 29, 31, 33, 36, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 92, 93, 94, 95, 96, 97, 98, 104], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var block_default = parser; + +// src/diagrams/block/blockDB.ts +import clone from "lodash-es/clone.js"; +var blockDatabase = /* @__PURE__ */ new Map(); +var edgeList = []; +var edgeCount = /* @__PURE__ */ new Map(); +var COLOR_KEYWORD = "color"; +var FILL_KEYWORD = "fill"; +var BG_FILL = "bgFill"; +var STYLECLASS_SEP = ","; +var config = getConfig2(); +var classes = /* @__PURE__ */ new Map(); +var sanitizeText2 = /* @__PURE__ */ __name((txt) => common_default.sanitizeText(txt, config), "sanitizeText"); +var addStyleClass = /* @__PURE__ */ __name(function(id, styleAttributes = "") { + let foundClass = classes.get(id); + if (!foundClass) { + foundClass = { id, styles: [], textStyles: [] }; + classes.set(id, foundClass); + } + if (styleAttributes !== void 0 && styleAttributes !== null) { + styleAttributes.split(STYLECLASS_SEP).forEach((attrib) => { + const fixedAttrib = attrib.replace(/([^;]*);/, "$1").trim(); + if (RegExp(COLOR_KEYWORD).exec(attrib)) { + const newStyle1 = fixedAttrib.replace(FILL_KEYWORD, BG_FILL); + const newStyle2 = newStyle1.replace(COLOR_KEYWORD, FILL_KEYWORD); + foundClass.textStyles.push(newStyle2); + } + foundClass.styles.push(fixedAttrib); + }); + } +}, "addStyleClass"); +var addStyle2Node = /* @__PURE__ */ __name(function(id, styles = "") { + const foundBlock = blockDatabase.get(id); + if (styles !== void 0 && styles !== null) { + foundBlock.styles = styles.split(STYLECLASS_SEP); + } +}, "addStyle2Node"); +var setCssClass = /* @__PURE__ */ __name(function(itemIds, cssClassName) { + itemIds.split(",").forEach(function(id) { + let foundBlock = blockDatabase.get(id); + if (foundBlock === void 0) { + const trimmedId = id.trim(); + foundBlock = { id: trimmedId, type: "na", children: [] }; + blockDatabase.set(trimmedId, foundBlock); + } + if (!foundBlock.classes) { + foundBlock.classes = []; + } + foundBlock.classes.push(cssClassName); + }); +}, "setCssClass"); +var populateBlockDatabase = /* @__PURE__ */ __name((_blockList, parent) => { + const blockList = _blockList.flat(); + const children = []; + const columnSettingBlock = blockList.find((b) => b?.type === "column-setting"); + const column = columnSettingBlock?.columns ?? -1; + for (const block of blockList) { + if (typeof column === "number" && column > 0 && block.type !== "column-setting" && typeof block.widthInColumns === "number" && block.widthInColumns > column) { + log.warn( + `Block ${block.id} width ${block.widthInColumns} exceeds configured column width ${column}` + ); + } + if (block.label) { + block.label = sanitizeText2(block.label); + } + if (block.type === "classDef") { + addStyleClass(block.id, block.css); + continue; + } + if (block.type === "applyClass") { + setCssClass(block.id, block?.styleClass ?? ""); + continue; + } + if (block.type === "applyStyles") { + if (block?.stylesStr) { + addStyle2Node(block.id, block?.stylesStr); + } + continue; + } + if (block.type === "column-setting") { + parent.columns = block.columns ?? -1; + } else if (block.type === "edge") { + const count = (edgeCount.get(block.id) ?? 0) + 1; + edgeCount.set(block.id, count); + block.id = count + "-" + block.id; + edgeList.push(block); + } else { + if (!block.label) { + if (block.type === "composite") { + block.label = ""; + } else { + block.label = block.id; + } + } + const existingBlock = blockDatabase.get(block.id); + if (existingBlock === void 0) { + blockDatabase.set(block.id, block); + } else { + if (block.type !== "na") { + existingBlock.type = block.type; + } + if (block.label !== block.id) { + existingBlock.label = block.label; + } + } + if (block.children) { + populateBlockDatabase(block.children, block); + } + if (block.type === "space") { + const w = block.width ?? 1; + for (let j = 0; j < w; j++) { + const newBlock = clone(block); + newBlock.id = newBlock.id + "-" + j; + blockDatabase.set(newBlock.id, newBlock); + children.push(newBlock); + } + } else if (existingBlock === void 0) { + children.push(block); + } + } + } + parent.children = children; +}, "populateBlockDatabase"); +var blocks = []; +var rootBlock = { id: "root", type: "composite", children: [], columns: -1 }; +var clear2 = /* @__PURE__ */ __name(() => { + log.debug("Clear called"); + clear(); + rootBlock = { id: "root", type: "composite", children: [], columns: -1 }; + blockDatabase = /* @__PURE__ */ new Map([["root", rootBlock]]); + blocks = []; + classes = /* @__PURE__ */ new Map(); + edgeList = []; + edgeCount = /* @__PURE__ */ new Map(); +}, "clear"); +function typeStr2Type(typeStr) { + log.debug("typeStr2Type", typeStr); + switch (typeStr) { + case "[]": + return "square"; + case "()": + log.debug("we have a round"); + return "round"; + case "(())": + return "circle"; + case ">]": + return "rect_left_inv_arrow"; + case "{}": + return "diamond"; + case "{{}}": + return "hexagon"; + case "([])": + return "stadium"; + case "[[]]": + return "subroutine"; + case "[()]": + return "cylinder"; + case "((()))": + return "doublecircle"; + case "[//]": + return "lean_right"; + case "[\\\\]": + return "lean_left"; + case "[/\\]": + return "trapezoid"; + case "[\\/]": + return "inv_trapezoid"; + case "<[]>": + return "block_arrow"; + default: + return "na"; + } +} +__name(typeStr2Type, "typeStr2Type"); +function edgeTypeStr2Type(typeStr) { + log.debug("typeStr2Type", typeStr); + switch (typeStr) { + case "==": + return "thick"; + default: + return "normal"; + } +} +__name(edgeTypeStr2Type, "edgeTypeStr2Type"); +function edgeStrToEdgeData(typeStr) { + switch (typeStr.replace(/^[\s-]+|[\s-]+$/g, "")) { + case "x": + return "arrow_cross"; + case "o": + return "arrow_circle"; + case ">": + return "arrow_point"; + default: + return ""; + } +} +__name(edgeStrToEdgeData, "edgeStrToEdgeData"); +var cnt = 0; +var generateId = /* @__PURE__ */ __name(() => { + cnt++; + return "id-" + Math.random().toString(36).substr(2, 12) + "-" + cnt; +}, "generateId"); +var setHierarchy = /* @__PURE__ */ __name((block) => { + rootBlock.children = block; + populateBlockDatabase(block, rootBlock); + blocks = rootBlock.children; +}, "setHierarchy"); +var getColumns = /* @__PURE__ */ __name((blockId) => { + const block = blockDatabase.get(blockId); + if (!block) { + return -1; + } + if (block.columns) { + return block.columns; + } + if (!block.children) { + return -1; + } + return block.children.length; +}, "getColumns"); +var getBlocksFlat = /* @__PURE__ */ __name(() => { + return [...blockDatabase.values()]; +}, "getBlocksFlat"); +var getBlocks = /* @__PURE__ */ __name(() => { + return blocks || []; +}, "getBlocks"); +var getEdges = /* @__PURE__ */ __name(() => { + return edgeList; +}, "getEdges"); +var getBlock = /* @__PURE__ */ __name((id) => { + return blockDatabase.get(id); +}, "getBlock"); +var setBlock = /* @__PURE__ */ __name((block) => { + blockDatabase.set(block.id, block); +}, "setBlock"); +var getLogger = /* @__PURE__ */ __name(() => log, "getLogger"); +var getClasses = /* @__PURE__ */ __name(function() { + return classes; +}, "getClasses"); +var db = { + getConfig: /* @__PURE__ */ __name(() => getConfig().block, "getConfig"), + typeStr2Type, + edgeTypeStr2Type, + edgeStrToEdgeData, + getLogger, + getBlocksFlat, + getBlocks, + getEdges, + setHierarchy, + getBlock, + setBlock, + getColumns, + getClasses, + clear: clear2, + generateId +}; +var blockDB_default = db; + +// src/diagrams/block/styles.ts +import * as khroma from "khroma"; +var fade = /* @__PURE__ */ __name((color, opacity) => { + const channel2 = khroma.channel; + const r = channel2(color, "r"); + const g = channel2(color, "g"); + const b = channel2(color, "b"); + return khroma.rgba(r, g, b, opacity); +}, "fade"); +var getStyles = /* @__PURE__ */ __name((options) => `.label { + font-family: ${options.fontFamily}; + color: ${options.nodeTextColor || options.textColor}; + } + .cluster-label text { + fill: ${options.titleColor}; + } + .cluster-label span,p { + color: ${options.titleColor}; + } + + + + .label text,span,p { + fill: ${options.nodeTextColor || options.textColor}; + color: ${options.nodeTextColor || options.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; + stroke-width: 1px; + } + .flowchart-label text { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${options.arrowheadColor}; + } + + .edgePath .path { + stroke: ${options.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${options.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${options.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${options.edgeLabelBackground}; + fill: ${options.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${fade(options.edgeLabelBackground, 0.5)}; + // background-color: + } + + .node .cluster { + // fill: ${fade(options.mainBkg, 0.5)}; + fill: ${fade(options.clusterBkg, 0.5)}; + stroke: ${fade(options.clusterBorder, 0.2)}; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + stroke-width: 1px; + } + + .cluster text { + fill: ${options.titleColor}; + } + + .cluster span,p { + color: ${options.titleColor}; + } + /* .cluster div { + color: ${options.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${options.fontFamily}; + font-size: 12px; + background: ${options.tertiaryColor}; + border: 1px solid ${options.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${options.textColor}; + } + ${getIconStyles()} +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/block/blockRenderer.ts +import { select as d3select } from "d3"; + +// src/dagre-wrapper/markers.js +var insertMarkers = /* @__PURE__ */ __name((elem, markerArray, type, id) => { + markerArray.forEach((markerName) => { + markers[markerName](elem, type, id); + }); +}, "insertMarkers"); +var extension = /* @__PURE__ */ __name((elem, type, id) => { + log.trace("Making markers for ", id); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-extensionStart").attr("class", "marker extension " + type).attr("refX", 18).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("path").attr("d", "M 1,7 L18,13 V 1 Z"); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-extensionEnd").attr("class", "marker extension " + type).attr("refX", 1).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 1,1 V 13 L18,7 Z"); +}, "extension"); +var composition = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-compositionStart").attr("class", "marker composition " + type).attr("refX", 18).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L1,7 L9,1 Z"); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-compositionEnd").attr("class", "marker composition " + type).attr("refX", 1).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L1,7 L9,1 Z"); +}, "composition"); +var aggregation = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-aggregationStart").attr("class", "marker aggregation " + type).attr("refX", 18).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L1,7 L9,1 Z"); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-aggregationEnd").attr("class", "marker aggregation " + type).attr("refX", 1).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L1,7 L9,1 Z"); +}, "aggregation"); +var dependency = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-dependencyStart").attr("class", "marker dependency " + type).attr("refX", 6).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("path").attr("d", "M 5,7 L9,13 L1,7 L9,1 Z"); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-dependencyEnd").attr("class", "marker dependency " + type).attr("refX", 13).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L14,7 L9,1 Z"); +}, "dependency"); +var lollipop = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-lollipopStart").attr("class", "marker lollipop " + type).attr("refX", 13).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("circle").attr("stroke", "black").attr("fill", "transparent").attr("cx", 7).attr("cy", 7).attr("r", 6); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-lollipopEnd").attr("class", "marker lollipop " + type).attr("refX", 1).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("circle").attr("stroke", "black").attr("fill", "transparent").attr("cx", 7).attr("cy", 7).attr("r", 6); +}, "lollipop"); +var point = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("marker").attr("id", id + "_" + type + "-pointEnd").attr("class", "marker " + type).attr("viewBox", "0 0 10 10").attr("refX", 6).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 12).attr("markerHeight", 12).attr("orient", "auto").append("path").attr("d", "M 0 0 L 10 5 L 0 10 z").attr("class", "arrowMarkerPath").style("stroke-width", 1).style("stroke-dasharray", "1,0"); + elem.append("marker").attr("id", id + "_" + type + "-pointStart").attr("class", "marker " + type).attr("viewBox", "0 0 10 10").attr("refX", 4.5).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 12).attr("markerHeight", 12).attr("orient", "auto").append("path").attr("d", "M 0 5 L 10 10 L 10 0 z").attr("class", "arrowMarkerPath").style("stroke-width", 1).style("stroke-dasharray", "1,0"); +}, "point"); +var circle = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("marker").attr("id", id + "_" + type + "-circleEnd").attr("class", "marker " + type).attr("viewBox", "0 0 10 10").attr("refX", 11).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 11).attr("markerHeight", 11).attr("orient", "auto").append("circle").attr("cx", "5").attr("cy", "5").attr("r", "5").attr("class", "arrowMarkerPath").style("stroke-width", 1).style("stroke-dasharray", "1,0"); + elem.append("marker").attr("id", id + "_" + type + "-circleStart").attr("class", "marker " + type).attr("viewBox", "0 0 10 10").attr("refX", -1).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 11).attr("markerHeight", 11).attr("orient", "auto").append("circle").attr("cx", "5").attr("cy", "5").attr("r", "5").attr("class", "arrowMarkerPath").style("stroke-width", 1).style("stroke-dasharray", "1,0"); +}, "circle"); +var cross = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("marker").attr("id", id + "_" + type + "-crossEnd").attr("class", "marker cross " + type).attr("viewBox", "0 0 11 11").attr("refX", 12).attr("refY", 5.2).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 11).attr("markerHeight", 11).attr("orient", "auto").append("path").attr("d", "M 1,1 l 9,9 M 10,1 l -9,9").attr("class", "arrowMarkerPath").style("stroke-width", 2).style("stroke-dasharray", "1,0"); + elem.append("marker").attr("id", id + "_" + type + "-crossStart").attr("class", "marker cross " + type).attr("viewBox", "0 0 11 11").attr("refX", -1).attr("refY", 5.2).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 11).attr("markerHeight", 11).attr("orient", "auto").append("path").attr("d", "M 1,1 l 9,9 M 10,1 l -9,9").attr("class", "arrowMarkerPath").style("stroke-width", 2).style("stroke-dasharray", "1,0"); +}, "cross"); +var barb = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-barbEnd").attr("refX", 19).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 14).attr("markerUnits", "strokeWidth").attr("orient", "auto").append("path").attr("d", "M 19,7 L9,13 L14,7 L9,1 Z"); +}, "barb"); +var markers = { + extension, + composition, + aggregation, + dependency, + lollipop, + point, + circle, + cross, + barb +}; +var markers_default = insertMarkers; + +// src/diagrams/block/layout.ts +var padding = getConfig2()?.block?.padding ?? 8; +function calculateBlockPosition(columns, position) { + if (columns === 0 || !Number.isInteger(columns)) { + throw new Error("Columns must be an integer !== 0."); + } + if (position < 0 || !Number.isInteger(position)) { + throw new Error("Position must be a non-negative integer." + position); + } + if (columns < 0) { + return { px: position, py: 0 }; + } + if (columns === 1) { + return { px: 0, py: position }; + } + const px = position % columns; + const py = Math.floor(position / columns); + return { px, py }; +} +__name(calculateBlockPosition, "calculateBlockPosition"); +var getMaxChildSize = /* @__PURE__ */ __name((block) => { + let maxWidth = 0; + let maxHeight = 0; + for (const child of block.children) { + const { width, height, x, y } = child.size ?? { width: 0, height: 0, x: 0, y: 0 }; + log.debug( + "getMaxChildSize abc95 child:", + child.id, + "width:", + width, + "height:", + height, + "x:", + x, + "y:", + y, + child.type + ); + if (child.type === "space") { + continue; + } + if (width > maxWidth) { + maxWidth = width / (block.widthInColumns ?? 1); + } + if (height > maxHeight) { + maxHeight = height; + } + } + return { width: maxWidth, height: maxHeight }; +}, "getMaxChildSize"); +function setBlockSizes(block, db2, siblingWidth = 0, siblingHeight = 0) { + log.debug( + "setBlockSizes abc95 (start)", + block.id, + block?.size?.x, + "block width =", + block?.size, + "siblingWidth", + siblingWidth + ); + if (!block?.size?.width) { + block.size = { + width: siblingWidth, + height: siblingHeight, + x: 0, + y: 0 + }; + } + let maxWidth = 0; + let maxHeight = 0; + if (block.children?.length > 0) { + for (const child of block.children) { + setBlockSizes(child, db2); + } + const childSize = getMaxChildSize(block); + maxWidth = childSize.width; + maxHeight = childSize.height; + log.debug("setBlockSizes abc95 maxWidth of", block.id, ":s children is ", maxWidth, maxHeight); + for (const child of block.children) { + if (child.size) { + log.debug( + `abc95 Setting size of children of ${block.id} id=${child.id} ${maxWidth} ${maxHeight} ${JSON.stringify(child.size)}` + ); + child.size.width = maxWidth * (child.widthInColumns ?? 1) + padding * ((child.widthInColumns ?? 1) - 1); + child.size.height = maxHeight; + child.size.x = 0; + child.size.y = 0; + log.debug( + `abc95 updating size of ${block.id} children child:${child.id} maxWidth:${maxWidth} maxHeight:${maxHeight}` + ); + } + } + for (const child of block.children) { + setBlockSizes(child, db2, maxWidth, maxHeight); + } + const columns = block.columns ?? -1; + let numItems = 0; + for (const child of block.children) { + numItems += child.widthInColumns ?? 1; + } + let xSize = block.children.length; + if (columns > 0 && columns < numItems) { + xSize = columns; + } + const ySize = Math.ceil(numItems / xSize); + let width = xSize * (maxWidth + padding) + padding; + let height = ySize * (maxHeight + padding) + padding; + if (width < siblingWidth) { + log.debug( + `Detected to small sibling: abc95 ${block.id} siblingWidth ${siblingWidth} siblingHeight ${siblingHeight} width ${width}` + ); + width = siblingWidth; + height = siblingHeight; + const childWidth = (siblingWidth - xSize * padding - padding) / xSize; + const childHeight = (siblingHeight - ySize * padding - padding) / ySize; + log.debug("Size indata abc88", block.id, "childWidth", childWidth, "maxWidth", maxWidth); + log.debug("Size indata abc88", block.id, "childHeight", childHeight, "maxHeight", maxHeight); + log.debug("Size indata abc88 xSize", xSize, "padding", padding); + for (const child of block.children) { + if (child.size) { + child.size.width = childWidth; + child.size.height = childHeight; + child.size.x = 0; + child.size.y = 0; + } + } + } + log.debug( + `abc95 (finale calc) ${block.id} xSize ${xSize} ySize ${ySize} columns ${columns}${block.children.length} width=${Math.max(width, block.size?.width || 0)}` + ); + if (width < (block?.size?.width || 0)) { + width = block?.size?.width || 0; + const num = columns > 0 ? Math.min(block.children.length, columns) : block.children.length; + if (num > 0) { + const childWidth = (width - num * padding - padding) / num; + log.debug("abc95 (growing to fit) width", block.id, width, block.size?.width, childWidth); + for (const child of block.children) { + if (child.size) { + child.size.width = childWidth; + } + } + } + } + block.size = { + width, + height, + x: 0, + y: 0 + }; + } + log.debug( + "setBlockSizes abc94 (done)", + block.id, + block?.size?.x, + block?.size?.width, + block?.size?.y, + block?.size?.height + ); +} +__name(setBlockSizes, "setBlockSizes"); +function layoutBlocks(block, db2) { + log.debug( + `abc85 layout blocks (=>layoutBlocks) ${block.id} x: ${block?.size?.x} y: ${block?.size?.y} width: ${block?.size?.width}` + ); + const columns = block.columns ?? -1; + log.debug("layoutBlocks columns abc95", block.id, "=>", columns, block); + if (block.children && // find max width of children + block.children.length > 0) { + const width = block?.children[0]?.size?.width ?? 0; + const widthOfChildren = block.children.length * width + (block.children.length - 1) * padding; + log.debug("widthOfChildren 88", widthOfChildren, "posX"); + let columnPos = 0; + log.debug("abc91 block?.size?.x", block.id, block?.size?.x); + let startingPosX = block?.size?.x ? block?.size?.x + (-block?.size?.width / 2 || 0) : -padding; + let rowPos = 0; + for (const child of block.children) { + const parent = block; + if (!child.size) { + continue; + } + const { width: width2, height } = child.size; + const { px, py } = calculateBlockPosition(columns, columnPos); + if (py != rowPos) { + rowPos = py; + startingPosX = block?.size?.x ? block?.size?.x + (-block?.size?.width / 2 || 0) : -padding; + log.debug("New row in layout for block", block.id, " and child ", child.id, rowPos); + } + log.debug( + `abc89 layout blocks (child) id: ${child.id} Pos: ${columnPos} (px, py) ${px},${py} (${parent?.size?.x},${parent?.size?.y}) parent: ${parent.id} width: ${width2}${padding}` + ); + if (parent.size) { + const halfWidth = width2 / 2; + child.size.x = startingPosX + padding + halfWidth; + log.debug( + `abc91 layout blocks (calc) px, pyid:${child.id} startingPos=X${startingPosX} new startingPosX${child.size.x} ${halfWidth} padding=${padding} width=${width2} halfWidth=${halfWidth} => x:${child.size.x} y:${child.size.y} ${child.widthInColumns} (width * (child?.w || 1)) / 2 ${width2 * (child?.widthInColumns ?? 1) / 2}` + ); + startingPosX = child.size.x + halfWidth; + child.size.y = parent.size.y - parent.size.height / 2 + py * (height + padding) + height / 2 + padding; + log.debug( + `abc88 layout blocks (calc) px, pyid:${child.id}startingPosX${startingPosX}${padding}${halfWidth}=>x:${child.size.x}y:${child.size.y}${child.widthInColumns}(width * (child?.w || 1)) / 2${width2 * (child?.widthInColumns ?? 1) / 2}` + ); + } + if (child.children) { + layoutBlocks(child, db2); + } + let columnsFilled = child?.widthInColumns ?? 1; + if (columns > 0) { + columnsFilled = Math.min(columnsFilled, columns - columnPos % columns); + } + columnPos += columnsFilled; + log.debug("abc88 columnsPos", child, columnPos); + } + } + log.debug( + `layout blocks (<==layoutBlocks) ${block.id} x: ${block?.size?.x} y: ${block?.size?.y} width: ${block?.size?.width}` + ); +} +__name(layoutBlocks, "layoutBlocks"); +function findBounds(block, { minX, minY, maxX, maxY } = { minX: 0, minY: 0, maxX: 0, maxY: 0 }) { + if (block.size && block.id !== "root") { + const { x, y, width, height } = block.size; + if (x - width / 2 < minX) { + minX = x - width / 2; + } + if (y - height / 2 < minY) { + minY = y - height / 2; + } + if (x + width / 2 > maxX) { + maxX = x + width / 2; + } + if (y + height / 2 > maxY) { + maxY = y + height / 2; + } + } + if (block.children) { + for (const child of block.children) { + ({ minX, minY, maxX, maxY } = findBounds(child, { minX, minY, maxX, maxY })); + } + } + return { minX, minY, maxX, maxY }; +} +__name(findBounds, "findBounds"); +function layout(db2) { + const root = db2.getBlock("root"); + if (!root) { + return; + } + setBlockSizes(root, db2, 0, 0); + layoutBlocks(root, db2); + log.debug("getBlocks", JSON.stringify(root, null, 2)); + const { minX, minY, maxX, maxY } = findBounds(root); + const height = maxY - minY; + const width = maxX - minX; + return { x: minX, y: minY, width, height }; +} +__name(layout, "layout"); + +// src/diagrams/block/renderHelpers.ts +import * as graphlib from "dagre-d3-es/src/graphlib/index.js"; + +// src/dagre-wrapper/createLabel.js +import { select } from "d3"; +function applyStyle(dom, styleFn) { + if (styleFn) { + dom.attr("style", styleFn); + } +} +__name(applyStyle, "applyStyle"); +function addHtmlLabel(node, config2) { + const fo = select(document.createElementNS("http://www.w3.org/2000/svg", "foreignObject")); + const div = fo.append("xhtml:div"); + const label = node.label; + const labelClass = node.isNode ? "nodeLabel" : "edgeLabel"; + const span = div.append("span"); + span.html(sanitizeText(label, config2)); + applyStyle(span, node.labelStyle); + span.attr("class", labelClass); + applyStyle(div, node.labelStyle); + div.style("display", "inline-block"); + div.style("white-space", "nowrap"); + div.attr("xmlns", "http://www.w3.org/1999/xhtml"); + return fo.node(); +} +__name(addHtmlLabel, "addHtmlLabel"); +var createLabel = /* @__PURE__ */ __name(async (_vertexText, style, isTitle, isNode) => { + let vertexText = _vertexText || ""; + if (typeof vertexText === "object") { + vertexText = vertexText[0]; + } + const config2 = getConfig2(); + if (evaluate(config2.flowchart.htmlLabels)) { + vertexText = vertexText.replace(/\\n|\n/g, "
"); + log.debug("vertexText" + vertexText); + const label = await replaceIconSubstring(decodeEntities(vertexText)); + const node = { + isNode, + label, + labelStyle: style.replace("fill:", "color:") + }; + let vertexNode = addHtmlLabel(node, config2); + return vertexNode; + } else { + const svgLabel = document.createElementNS("http://www.w3.org/2000/svg", "text"); + svgLabel.setAttribute("style", style.replace("color:", "fill:")); + let rows = []; + if (typeof vertexText === "string") { + rows = vertexText.split(/\\n|\n|/gi); + } else if (Array.isArray(vertexText)) { + rows = vertexText; + } else { + rows = []; + } + for (const row of rows) { + const tspan = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + tspan.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve"); + tspan.setAttribute("dy", "1em"); + tspan.setAttribute("x", "0"); + if (isTitle) { + tspan.setAttribute("class", "title-row"); + } else { + tspan.setAttribute("class", "row"); + } + tspan.textContent = row.trim(); + svgLabel.appendChild(tspan); + } + return svgLabel; + } +}, "createLabel"); +var createLabel_default = createLabel; + +// src/dagre-wrapper/edges.js +import { line, curveBasis, select as select2 } from "d3"; + +// src/dagre-wrapper/edgeMarker.ts +var addEdgeMarkers = /* @__PURE__ */ __name((svgPath, edge, url, id, diagramType) => { + if (edge.arrowTypeStart) { + addEdgeMarker(svgPath, "start", edge.arrowTypeStart, url, id, diagramType); + } + if (edge.arrowTypeEnd) { + addEdgeMarker(svgPath, "end", edge.arrowTypeEnd, url, id, diagramType); + } +}, "addEdgeMarkers"); +var arrowTypesMap = { + arrow_cross: "cross", + arrow_point: "point", + arrow_barb: "barb", + arrow_circle: "circle", + aggregation: "aggregation", + extension: "extension", + composition: "composition", + dependency: "dependency", + lollipop: "lollipop" +}; +var addEdgeMarker = /* @__PURE__ */ __name((svgPath, position, arrowType, url, id, diagramType) => { + const endMarkerType = arrowTypesMap[arrowType]; + if (!endMarkerType) { + log.warn(`Unknown arrow type: ${arrowType}`); + return; + } + const suffix = position === "start" ? "Start" : "End"; + svgPath.attr(`marker-${position}`, `url(${url}#${id}_${diagramType}-${endMarkerType}${suffix})`); +}, "addEdgeMarker"); + +// src/dagre-wrapper/edges.js +var edgeLabels = {}; +var terminalLabels = {}; +var insertEdgeLabel = /* @__PURE__ */ __name(async (elem, edge) => { + const config2 = getConfig2(); + const useHtmlLabels = evaluate(config2.flowchart.htmlLabels); + const labelElement = edge.labelType === "markdown" ? createText( + elem, + edge.label, + { + style: edge.labelStyle, + useHtmlLabels, + addSvgBackground: true + }, + config2 + ) : await createLabel_default(edge.label, edge.labelStyle); + const edgeLabel = elem.insert("g").attr("class", "edgeLabel"); + const label = edgeLabel.insert("g").attr("class", "label"); + label.node().appendChild(labelElement); + let bbox = labelElement.getBBox(); + if (useHtmlLabels) { + const div = labelElement.children[0]; + const dv = select2(labelElement); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + label.attr("transform", "translate(" + -bbox.width / 2 + ", " + -bbox.height / 2 + ")"); + edgeLabels[edge.id] = edgeLabel; + edge.width = bbox.width; + edge.height = bbox.height; + let fo; + if (edge.startLabelLeft) { + const startLabelElement = await createLabel_default(edge.startLabelLeft, edge.labelStyle); + const startEdgeLabelLeft = elem.insert("g").attr("class", "edgeTerminals"); + const inner = startEdgeLabelLeft.insert("g").attr("class", "inner"); + fo = inner.node().appendChild(startLabelElement); + const slBox = startLabelElement.getBBox(); + inner.attr("transform", "translate(" + -slBox.width / 2 + ", " + -slBox.height / 2 + ")"); + if (!terminalLabels[edge.id]) { + terminalLabels[edge.id] = {}; + } + terminalLabels[edge.id].startLeft = startEdgeLabelLeft; + setTerminalWidth(fo, edge.startLabelLeft); + } + if (edge.startLabelRight) { + const startLabelElement = await createLabel_default(edge.startLabelRight, edge.labelStyle); + const startEdgeLabelRight = elem.insert("g").attr("class", "edgeTerminals"); + const inner = startEdgeLabelRight.insert("g").attr("class", "inner"); + fo = startEdgeLabelRight.node().appendChild(startLabelElement); + inner.node().appendChild(startLabelElement); + const slBox = startLabelElement.getBBox(); + inner.attr("transform", "translate(" + -slBox.width / 2 + ", " + -slBox.height / 2 + ")"); + if (!terminalLabels[edge.id]) { + terminalLabels[edge.id] = {}; + } + terminalLabels[edge.id].startRight = startEdgeLabelRight; + setTerminalWidth(fo, edge.startLabelRight); + } + if (edge.endLabelLeft) { + const endLabelElement = await createLabel_default(edge.endLabelLeft, edge.labelStyle); + const endEdgeLabelLeft = elem.insert("g").attr("class", "edgeTerminals"); + const inner = endEdgeLabelLeft.insert("g").attr("class", "inner"); + fo = inner.node().appendChild(endLabelElement); + const slBox = endLabelElement.getBBox(); + inner.attr("transform", "translate(" + -slBox.width / 2 + ", " + -slBox.height / 2 + ")"); + endEdgeLabelLeft.node().appendChild(endLabelElement); + if (!terminalLabels[edge.id]) { + terminalLabels[edge.id] = {}; + } + terminalLabels[edge.id].endLeft = endEdgeLabelLeft; + setTerminalWidth(fo, edge.endLabelLeft); + } + if (edge.endLabelRight) { + const endLabelElement = await createLabel_default(edge.endLabelRight, edge.labelStyle); + const endEdgeLabelRight = elem.insert("g").attr("class", "edgeTerminals"); + const inner = endEdgeLabelRight.insert("g").attr("class", "inner"); + fo = inner.node().appendChild(endLabelElement); + const slBox = endLabelElement.getBBox(); + inner.attr("transform", "translate(" + -slBox.width / 2 + ", " + -slBox.height / 2 + ")"); + endEdgeLabelRight.node().appendChild(endLabelElement); + if (!terminalLabels[edge.id]) { + terminalLabels[edge.id] = {}; + } + terminalLabels[edge.id].endRight = endEdgeLabelRight; + setTerminalWidth(fo, edge.endLabelRight); + } + return labelElement; +}, "insertEdgeLabel"); +function setTerminalWidth(fo, value) { + if (getConfig2().flowchart.htmlLabels && fo) { + fo.style.width = value.length * 9 + "px"; + fo.style.height = "12px"; + } +} +__name(setTerminalWidth, "setTerminalWidth"); +var positionEdgeLabel = /* @__PURE__ */ __name((edge, paths) => { + log.debug("Moving label abc88 ", edge.id, edge.label, edgeLabels[edge.id], paths); + let path = paths.updatedPath ? paths.updatedPath : paths.originalPath; + const siteConfig = getConfig2(); + const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig); + if (edge.label) { + const el = edgeLabels[edge.id]; + let x = edge.x; + let y = edge.y; + if (path) { + const pos = utils_default.calcLabelPosition(path); + log.debug( + "Moving label " + edge.label + " from (", + x, + ",", + y, + ") to (", + pos.x, + ",", + pos.y, + ") abc88" + ); + if (paths.updatedPath) { + x = pos.x; + y = pos.y; + } + } + el.attr("transform", `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`); + } + if (edge.startLabelLeft) { + const el = terminalLabels[edge.id].startLeft; + let x = edge.x; + let y = edge.y; + if (path) { + const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeStart ? 10 : 0, "start_left", path); + x = pos.x; + y = pos.y; + } + el.attr("transform", `translate(${x}, ${y})`); + } + if (edge.startLabelRight) { + const el = terminalLabels[edge.id].startRight; + let x = edge.x; + let y = edge.y; + if (path) { + const pos = utils_default.calcTerminalLabelPosition( + edge.arrowTypeStart ? 10 : 0, + "start_right", + path + ); + x = pos.x; + y = pos.y; + } + el.attr("transform", `translate(${x}, ${y})`); + } + if (edge.endLabelLeft) { + const el = terminalLabels[edge.id].endLeft; + let x = edge.x; + let y = edge.y; + if (path) { + const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, "end_left", path); + x = pos.x; + y = pos.y; + } + el.attr("transform", `translate(${x}, ${y})`); + } + if (edge.endLabelRight) { + const el = terminalLabels[edge.id].endRight; + let x = edge.x; + let y = edge.y; + if (path) { + const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, "end_right", path); + x = pos.x; + y = pos.y; + } + el.attr("transform", `translate(${x}, ${y})`); + } +}, "positionEdgeLabel"); +var outsideNode = /* @__PURE__ */ __name((node, point2) => { + const x = node.x; + const y = node.y; + const dx = Math.abs(point2.x - x); + const dy = Math.abs(point2.y - y); + const w = node.width / 2; + const h = node.height / 2; + if (dx >= w || dy >= h) { + return true; + } + return false; +}, "outsideNode"); +var intersection = /* @__PURE__ */ __name((node, outsidePoint, insidePoint) => { + log.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(outsidePoint)} + insidePoint : ${JSON.stringify(insidePoint)} + node : x:${node.x} y:${node.y} w:${node.width} h:${node.height}`); + const x = node.x; + const y = node.y; + const dx = Math.abs(x - insidePoint.x); + const w = node.width / 2; + let r = insidePoint.x < outsidePoint.x ? w - dx : w + dx; + const h = node.height / 2; + const Q = Math.abs(outsidePoint.y - insidePoint.y); + const R = Math.abs(outsidePoint.x - insidePoint.x); + if (Math.abs(y - outsidePoint.y) * w > Math.abs(x - outsidePoint.x) * h) { + let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y; + r = R * q / Q; + const res = { + x: insidePoint.x < outsidePoint.x ? insidePoint.x + r : insidePoint.x - R + r, + y: insidePoint.y < outsidePoint.y ? insidePoint.y + Q - q : insidePoint.y - Q + q + }; + if (r === 0) { + res.x = outsidePoint.x; + res.y = outsidePoint.y; + } + if (R === 0) { + res.x = outsidePoint.x; + } + if (Q === 0) { + res.y = outsidePoint.y; + } + log.debug(`abc89 topp/bott calc, Q ${Q}, q ${q}, R ${R}, r ${r}`, res); + return res; + } else { + if (insidePoint.x < outsidePoint.x) { + r = outsidePoint.x - w - x; + } else { + r = x - w - outsidePoint.x; + } + let q = Q * r / R; + let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x - R + r; + let _y = insidePoint.y < outsidePoint.y ? insidePoint.y + q : insidePoint.y - q; + log.debug(`sides calc abc89, Q ${Q}, q ${q}, R ${R}, r ${r}`, { _x, _y }); + if (r === 0) { + _x = outsidePoint.x; + _y = outsidePoint.y; + } + if (R === 0) { + _x = outsidePoint.x; + } + if (Q === 0) { + _y = outsidePoint.y; + } + return { x: _x, y: _y }; + } +}, "intersection"); +var cutPathAtIntersect = /* @__PURE__ */ __name((_points, boundaryNode) => { + log.debug("abc88 cutPathAtIntersect", _points, boundaryNode); + let points = []; + let lastPointOutside = _points[0]; + let isInside = false; + _points.forEach((point2) => { + if (!outsideNode(boundaryNode, point2) && !isInside) { + const inter = intersection(boundaryNode, lastPointOutside, point2); + let pointPresent = false; + points.forEach((p) => { + pointPresent = pointPresent || p.x === inter.x && p.y === inter.y; + }); + if (!points.some((e) => e.x === inter.x && e.y === inter.y)) { + points.push(inter); + } + isInside = true; + } else { + lastPointOutside = point2; + if (!isInside) { + points.push(point2); + } + } + }); + return points; +}, "cutPathAtIntersect"); +var insertEdge = /* @__PURE__ */ __name(function(elem, e, edge, clusterDb, diagramType, graph, id) { + let points = edge.points; + log.debug("abc88 InsertEdge: edge=", edge, "e=", e); + let pointsHasChanged = false; + const tail = graph.node(e.v); + var head = graph.node(e.w); + if (head?.intersect && tail?.intersect) { + points = points.slice(1, edge.points.length - 1); + points.unshift(tail.intersect(points[0])); + points.push(head.intersect(points[points.length - 1])); + } + if (edge.toCluster) { + log.debug("to cluster abc88", clusterDb[edge.toCluster]); + points = cutPathAtIntersect(edge.points, clusterDb[edge.toCluster].node); + pointsHasChanged = true; + } + if (edge.fromCluster) { + log.debug("from cluster abc88", clusterDb[edge.fromCluster]); + points = cutPathAtIntersect(points.reverse(), clusterDb[edge.fromCluster].node).reverse(); + pointsHasChanged = true; + } + const lineData = points.filter((p) => !Number.isNaN(p.y)); + let curve = curveBasis; + if (edge.curve && (diagramType === "graph" || diagramType === "flowchart")) { + curve = edge.curve; + } + const { x, y } = getLineFunctionsWithOffset(edge); + const lineFunction = line().x(x).y(y).curve(curve); + let strokeClasses; + switch (edge.thickness) { + case "normal": + strokeClasses = "edge-thickness-normal"; + break; + case "thick": + strokeClasses = "edge-thickness-thick"; + break; + case "invisible": + strokeClasses = "edge-thickness-thick"; + break; + default: + strokeClasses = ""; + } + switch (edge.pattern) { + case "solid": + strokeClasses += " edge-pattern-solid"; + break; + case "dotted": + strokeClasses += " edge-pattern-dotted"; + break; + case "dashed": + strokeClasses += " edge-pattern-dashed"; + break; + } + const svgPath = elem.append("path").attr("d", lineFunction(lineData)).attr("id", edge.id).attr("class", " " + strokeClasses + (edge.classes ? " " + edge.classes : "")).attr("style", edge.style); + let url = ""; + if (getConfig2().flowchart.arrowMarkerAbsolute || getConfig2().state.arrowMarkerAbsolute) { + url = getUrl(true); + } + addEdgeMarkers(svgPath, edge, url, id, diagramType); + let paths = {}; + if (pointsHasChanged) { + paths.updatedPath = points; + } + paths.originalPath = edge.points; + return paths; +}, "insertEdge"); + +// src/dagre-wrapper/nodes.js +import { select as select4 } from "d3"; + +// src/dagre-wrapper/blockArrowHelper.ts +var expandAndDeduplicateDirections = /* @__PURE__ */ __name((directions) => { + const uniqueDirections = /* @__PURE__ */ new Set(); + for (const direction of directions) { + switch (direction) { + case "x": + uniqueDirections.add("right"); + uniqueDirections.add("left"); + break; + case "y": + uniqueDirections.add("up"); + uniqueDirections.add("down"); + break; + default: + uniqueDirections.add(direction); + break; + } + } + return uniqueDirections; +}, "expandAndDeduplicateDirections"); +var getArrowPoints = /* @__PURE__ */ __name((duplicatedDirections, bbox, node) => { + const directions = expandAndDeduplicateDirections(duplicatedDirections); + const f = 2; + const height = bbox.height + 2 * node.padding; + const midpoint = height / f; + const width = bbox.width + 2 * midpoint + node.padding; + const padding2 = node.padding / 2; + if (directions.has("right") && directions.has("left") && directions.has("up") && directions.has("down")) { + return [ + // Bottom + { x: 0, y: 0 }, + { x: midpoint, y: 0 }, + { x: width / 2, y: 2 * padding2 }, + { x: width - midpoint, y: 0 }, + { x: width, y: 0 }, + // Right + { x: width, y: -height / 3 }, + { x: width + 2 * padding2, y: -height / 2 }, + { x: width, y: -2 * height / 3 }, + { x: width, y: -height }, + // Top + { x: width - midpoint, y: -height }, + { x: width / 2, y: -height - 2 * padding2 }, + { x: midpoint, y: -height }, + // Left + { x: 0, y: -height }, + { x: 0, y: -2 * height / 3 }, + { x: -2 * padding2, y: -height / 2 }, + { x: 0, y: -height / 3 } + ]; + } + if (directions.has("right") && directions.has("left") && directions.has("up")) { + return [ + { x: midpoint, y: 0 }, + { x: width - midpoint, y: 0 }, + { x: width, y: -height / 2 }, + { x: width - midpoint, y: -height }, + { x: midpoint, y: -height }, + { x: 0, y: -height / 2 } + ]; + } + if (directions.has("right") && directions.has("left") && directions.has("down")) { + return [ + { x: 0, y: 0 }, + { x: midpoint, y: -height }, + { x: width - midpoint, y: -height }, + { x: width, y: 0 } + ]; + } + if (directions.has("right") && directions.has("up") && directions.has("down")) { + return [ + { x: 0, y: 0 }, + { x: width, y: -midpoint }, + { x: width, y: -height + midpoint }, + { x: 0, y: -height } + ]; + } + if (directions.has("left") && directions.has("up") && directions.has("down")) { + return [ + { x: width, y: 0 }, + { x: 0, y: -midpoint }, + { x: 0, y: -height + midpoint }, + { x: width, y: -height } + ]; + } + if (directions.has("right") && directions.has("left")) { + return [ + { x: midpoint, y: 0 }, + { x: midpoint, y: -padding2 }, + { x: width - midpoint, y: -padding2 }, + { x: width - midpoint, y: 0 }, + { x: width, y: -height / 2 }, + { x: width - midpoint, y: -height }, + { x: width - midpoint, y: -height + padding2 }, + { x: midpoint, y: -height + padding2 }, + { x: midpoint, y: -height }, + { x: 0, y: -height / 2 } + ]; + } + if (directions.has("up") && directions.has("down")) { + return [ + // Bottom center + { x: width / 2, y: 0 }, + // Left pont of bottom arrow + { x: 0, y: -padding2 }, + { x: midpoint, y: -padding2 }, + // Left top over vertical section + { x: midpoint, y: -height + padding2 }, + { x: 0, y: -height + padding2 }, + // Top of arrow + { x: width / 2, y: -height }, + { x: width, y: -height + padding2 }, + // Top of right vertical bar + { x: width - midpoint, y: -height + padding2 }, + { x: width - midpoint, y: -padding2 }, + { x: width, y: -padding2 } + ]; + } + if (directions.has("right") && directions.has("up")) { + return [ + { x: 0, y: 0 }, + { x: width, y: -midpoint }, + { x: 0, y: -height } + ]; + } + if (directions.has("right") && directions.has("down")) { + return [ + { x: 0, y: 0 }, + { x: width, y: 0 }, + { x: 0, y: -height } + ]; + } + if (directions.has("left") && directions.has("up")) { + return [ + { x: width, y: 0 }, + { x: 0, y: -midpoint }, + { x: width, y: -height } + ]; + } + if (directions.has("left") && directions.has("down")) { + return [ + { x: width, y: 0 }, + { x: 0, y: 0 }, + { x: width, y: -height } + ]; + } + if (directions.has("right")) { + return [ + { x: midpoint, y: -padding2 }, + { x: midpoint, y: -padding2 }, + { x: width - midpoint, y: -padding2 }, + { x: width - midpoint, y: 0 }, + { x: width, y: -height / 2 }, + { x: width - midpoint, y: -height }, + { x: width - midpoint, y: -height + padding2 }, + // top left corner of arrow + { x: midpoint, y: -height + padding2 }, + { x: midpoint, y: -height + padding2 } + ]; + } + if (directions.has("left")) { + return [ + { x: midpoint, y: 0 }, + { x: midpoint, y: -padding2 }, + // Two points, the right corners + { x: width - midpoint, y: -padding2 }, + { x: width - midpoint, y: -height + padding2 }, + { x: midpoint, y: -height + padding2 }, + { x: midpoint, y: -height }, + { x: 0, y: -height / 2 } + ]; + } + if (directions.has("up")) { + return [ + // Bottom center + { x: midpoint, y: -padding2 }, + // Left top over vertical section + { x: midpoint, y: -height + padding2 }, + { x: 0, y: -height + padding2 }, + // Top of arrow + { x: width / 2, y: -height }, + { x: width, y: -height + padding2 }, + // Top of right vertical bar + { x: width - midpoint, y: -height + padding2 }, + { x: width - midpoint, y: -padding2 } + ]; + } + if (directions.has("down")) { + return [ + // Bottom center + { x: width / 2, y: 0 }, + // Left pont of bottom arrow + { x: 0, y: -padding2 }, + { x: midpoint, y: -padding2 }, + // Left top over vertical section + { x: midpoint, y: -height + padding2 }, + { x: width - midpoint, y: -height + padding2 }, + { x: width - midpoint, y: -padding2 }, + { x: width, y: -padding2 } + ]; + } + return [{ x: 0, y: 0 }]; +}, "getArrowPoints"); + +// src/dagre-wrapper/intersect/intersect-node.js +function intersectNode(node, point2) { + return node.intersect(point2); +} +__name(intersectNode, "intersectNode"); +var intersect_node_default = intersectNode; + +// src/dagre-wrapper/intersect/intersect-ellipse.js +function intersectEllipse(node, rx, ry, point2) { + var cx = node.x; + var cy = node.y; + var px = cx - point2.x; + var py = cy - point2.y; + var det = Math.sqrt(rx * rx * py * py + ry * ry * px * px); + var dx = Math.abs(rx * ry * px / det); + if (point2.x < cx) { + dx = -dx; + } + var dy = Math.abs(rx * ry * py / det); + if (point2.y < cy) { + dy = -dy; + } + return { x: cx + dx, y: cy + dy }; +} +__name(intersectEllipse, "intersectEllipse"); +var intersect_ellipse_default = intersectEllipse; + +// src/dagre-wrapper/intersect/intersect-circle.js +function intersectCircle(node, rx, point2) { + return intersect_ellipse_default(node, rx, rx, point2); +} +__name(intersectCircle, "intersectCircle"); +var intersect_circle_default = intersectCircle; + +// src/dagre-wrapper/intersect/intersect-line.js +function intersectLine(p1, p2, q1, q2) { + var a1, a2, b1, b2, c1, c2; + var r1, r2, r3, r4; + var denom, offset, num; + var x, y; + a1 = p2.y - p1.y; + b1 = p1.x - p2.x; + c1 = p2.x * p1.y - p1.x * p2.y; + r3 = a1 * q1.x + b1 * q1.y + c1; + r4 = a1 * q2.x + b1 * q2.y + c1; + if (r3 !== 0 && r4 !== 0 && sameSign(r3, r4)) { + return; + } + a2 = q2.y - q1.y; + b2 = q1.x - q2.x; + c2 = q2.x * q1.y - q1.x * q2.y; + r1 = a2 * p1.x + b2 * p1.y + c2; + r2 = a2 * p2.x + b2 * p2.y + c2; + if (r1 !== 0 && r2 !== 0 && sameSign(r1, r2)) { + return; + } + denom = a1 * b2 - a2 * b1; + if (denom === 0) { + return; + } + offset = Math.abs(denom / 2); + num = b1 * c2 - b2 * c1; + x = num < 0 ? (num - offset) / denom : (num + offset) / denom; + num = a2 * c1 - a1 * c2; + y = num < 0 ? (num - offset) / denom : (num + offset) / denom; + return { x, y }; +} +__name(intersectLine, "intersectLine"); +function sameSign(r1, r2) { + return r1 * r2 > 0; +} +__name(sameSign, "sameSign"); +var intersect_line_default = intersectLine; + +// src/dagre-wrapper/intersect/intersect-polygon.js +var intersect_polygon_default = intersectPolygon; +function intersectPolygon(node, polyPoints, point2) { + var x1 = node.x; + var y1 = node.y; + var intersections = []; + var minX = Number.POSITIVE_INFINITY; + var minY = Number.POSITIVE_INFINITY; + if (typeof polyPoints.forEach === "function") { + polyPoints.forEach(function(entry) { + minX = Math.min(minX, entry.x); + minY = Math.min(minY, entry.y); + }); + } else { + minX = Math.min(minX, polyPoints.x); + minY = Math.min(minY, polyPoints.y); + } + var left = x1 - node.width / 2 - minX; + var top = y1 - node.height / 2 - minY; + for (var i = 0; i < polyPoints.length; i++) { + var p1 = polyPoints[i]; + var p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0]; + var intersect = intersect_line_default( + node, + point2, + { x: left + p1.x, y: top + p1.y }, + { x: left + p2.x, y: top + p2.y } + ); + if (intersect) { + intersections.push(intersect); + } + } + if (!intersections.length) { + return node; + } + if (intersections.length > 1) { + intersections.sort(function(p, q) { + var pdx = p.x - point2.x; + var pdy = p.y - point2.y; + var distp = Math.sqrt(pdx * pdx + pdy * pdy); + var qdx = q.x - point2.x; + var qdy = q.y - point2.y; + var distq = Math.sqrt(qdx * qdx + qdy * qdy); + return distp < distq ? -1 : distp === distq ? 0 : 1; + }); + } + return intersections[0]; +} +__name(intersectPolygon, "intersectPolygon"); + +// src/dagre-wrapper/intersect/intersect-rect.js +var intersectRect = /* @__PURE__ */ __name((node, point2) => { + var x = node.x; + var y = node.y; + var dx = point2.x - x; + var dy = point2.y - y; + var w = node.width / 2; + var h = node.height / 2; + var sx, sy; + if (Math.abs(dy) * w > Math.abs(dx) * h) { + if (dy < 0) { + h = -h; + } + sx = dy === 0 ? 0 : h * dx / dy; + sy = h; + } else { + if (dx < 0) { + w = -w; + } + sx = w; + sy = dx === 0 ? 0 : w * dy / dx; + } + return { x: x + sx, y: y + sy }; +}, "intersectRect"); +var intersect_rect_default = intersectRect; + +// src/dagre-wrapper/intersect/index.js +var intersect_default = { + node: intersect_node_default, + circle: intersect_circle_default, + ellipse: intersect_ellipse_default, + polygon: intersect_polygon_default, + rect: intersect_rect_default +}; + +// src/dagre-wrapper/shapes/util.js +import { select as select3 } from "d3"; +var labelHelper = /* @__PURE__ */ __name(async (parent, node, _classes, isNode) => { + const config2 = getConfig2(); + let classes2; + const useHtmlLabels = node.useHtmlLabels || evaluate(config2.flowchart.htmlLabels); + if (!_classes) { + classes2 = "node default"; + } else { + classes2 = _classes; + } + const shapeSvg = parent.insert("g").attr("class", classes2).attr("id", node.domId || node.id); + const label = shapeSvg.insert("g").attr("class", "label").attr("style", node.labelStyle); + let labelText; + if (node.labelText === void 0) { + labelText = ""; + } else { + labelText = typeof node.labelText === "string" ? node.labelText : node.labelText[0]; + } + const textNode = label.node(); + let text; + if (node.labelType === "markdown") { + text = createText( + label, + sanitizeText(decodeEntities(labelText), config2), + { + useHtmlLabels, + width: node.width || config2.flowchart.wrappingWidth, + classes: "markdown-node-label" + }, + config2 + ); + } else { + text = textNode.appendChild( + await createLabel_default( + sanitizeText(decodeEntities(labelText), config2), + node.labelStyle, + false, + isNode + ) + ); + } + let bbox = text.getBBox(); + const halfPadding = node.padding / 2; + if (evaluate(config2.flowchart.htmlLabels)) { + const div = text.children[0]; + const dv = select3(text); + const images = div.getElementsByTagName("img"); + if (images) { + const noImgText = labelText.replace(/]*>/g, "").trim() === ""; + await Promise.all( + [...images].map( + (img) => new Promise((res) => { + function setupImage() { + img.style.display = "flex"; + img.style.flexDirection = "column"; + if (noImgText) { + const bodyFontSize = config2.fontSize ? config2.fontSize : window.getComputedStyle(document.body).fontSize; + const enlargingFactor = 5; + const width = parseInt(bodyFontSize, 10) * enlargingFactor + "px"; + img.style.minWidth = width; + img.style.maxWidth = width; + } else { + img.style.width = "100%"; + } + res(img); + } + __name(setupImage, "setupImage"); + setTimeout(() => { + if (img.complete) { + setupImage(); + } + }); + img.addEventListener("error", setupImage); + img.addEventListener("load", setupImage); + }) + ) + ); + } + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + if (useHtmlLabels) { + label.attr("transform", "translate(" + -bbox.width / 2 + ", " + -bbox.height / 2 + ")"); + } else { + label.attr("transform", "translate(0, " + -bbox.height / 2 + ")"); + } + if (node.centerLabel) { + label.attr("transform", "translate(" + -bbox.width / 2 + ", " + -bbox.height / 2 + ")"); + } + label.insert("rect", ":first-child"); + return { shapeSvg, bbox, halfPadding, label }; +}, "labelHelper"); +var updateNodeBounds = /* @__PURE__ */ __name((node, element) => { + const bbox = element.node().getBBox(); + node.width = bbox.width; + node.height = bbox.height; +}, "updateNodeBounds"); +function insertPolygonShape(parent, w, h, points) { + return parent.insert("polygon", ":first-child").attr( + "points", + points.map(function(d) { + return d.x + "," + d.y; + }).join(" ") + ).attr("class", "label-container").attr("transform", "translate(" + -w / 2 + "," + h / 2 + ")"); +} +__name(insertPolygonShape, "insertPolygonShape"); + +// src/dagre-wrapper/shapes/note.js +var note = /* @__PURE__ */ __name(async (parent, node) => { + const useHtmlLabels = node.useHtmlLabels || getConfig2().flowchart.htmlLabels; + if (!useHtmlLabels) { + node.centerLabel = true; + } + const { shapeSvg, bbox, halfPadding } = await labelHelper( + parent, + node, + "node " + node.classes, + true + ); + log.info("Classes = ", node.classes); + const rect2 = shapeSvg.insert("rect", ":first-child"); + rect2.attr("rx", node.rx).attr("ry", node.ry).attr("x", -bbox.width / 2 - halfPadding).attr("y", -bbox.height / 2 - halfPadding).attr("width", bbox.width + node.padding).attr("height", bbox.height + node.padding); + updateNodeBounds(node, rect2); + node.intersect = function(point2) { + return intersect_default.rect(node, point2); + }; + return shapeSvg; +}, "note"); +var note_default = note; + +// src/dagre-wrapper/nodes.js +var formatClass = /* @__PURE__ */ __name((str) => { + if (str) { + return " " + str; + } + return ""; +}, "formatClass"); +var getClassesFromNode = /* @__PURE__ */ __name((node, otherClasses) => { + return `${otherClasses ? otherClasses : "node default"}${formatClass(node.classes)} ${formatClass( + node.class + )}`; +}, "getClassesFromNode"); +var question = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const s = w + h; + const points = [ + { x: s / 2, y: 0 }, + { x: s, y: -s / 2 }, + { x: s / 2, y: -s }, + { x: 0, y: -s / 2 } + ]; + log.info("Question main (Circle)"); + const questionElem = insertPolygonShape(shapeSvg, s, s, points); + questionElem.attr("style", node.style); + updateNodeBounds(node, questionElem); + node.intersect = function(point2) { + log.warn("Intersect called"); + return intersect_default.polygon(node, points, point2); + }; + return shapeSvg; +}, "question"); +var choice = /* @__PURE__ */ __name((parent, node) => { + const shapeSvg = parent.insert("g").attr("class", "node default").attr("id", node.domId || node.id); + const s = 28; + const points = [ + { x: 0, y: s / 2 }, + { x: s / 2, y: 0 }, + { x: 0, y: -s / 2 }, + { x: -s / 2, y: 0 } + ]; + const choice2 = shapeSvg.insert("polygon", ":first-child").attr( + "points", + points.map(function(d) { + return d.x + "," + d.y; + }).join(" ") + ); + choice2.attr("class", "state-start").attr("r", 7).attr("width", 28).attr("height", 28); + node.width = 28; + node.height = 28; + node.intersect = function(point2) { + return intersect_default.circle(node, 14, point2); + }; + return shapeSvg; +}, "choice"); +var hexagon = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const f = 4; + const h = bbox.height + node.padding; + const m = h / f; + const w = bbox.width + 2 * m + node.padding; + const points = [ + { x: m, y: 0 }, + { x: w - m, y: 0 }, + { x: w, y: -h / 2 }, + { x: w - m, y: -h }, + { x: m, y: -h }, + { x: 0, y: -h / 2 } + ]; + const hex = insertPolygonShape(shapeSvg, w, h, points); + hex.attr("style", node.style); + updateNodeBounds(node, hex); + node.intersect = function(point2) { + return intersect_default.polygon(node, points, point2); + }; + return shapeSvg; +}, "hexagon"); +var block_arrow = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper(parent, node, void 0, true); + const f = 2; + const h = bbox.height + 2 * node.padding; + const m = h / f; + const w = bbox.width + 2 * m + node.padding; + const points = getArrowPoints(node.directions, bbox, node); + const blockArrow = insertPolygonShape(shapeSvg, w, h, points); + blockArrow.attr("style", node.style); + updateNodeBounds(node, blockArrow); + node.intersect = function(point2) { + return intersect_default.polygon(node, points, point2); + }; + return shapeSvg; +}, "block_arrow"); +var rect_left_inv_arrow = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const points = [ + { x: -h / 2, y: 0 }, + { x: w, y: 0 }, + { x: w, y: -h }, + { x: -h / 2, y: -h }, + { x: 0, y: -h / 2 } + ]; + const el = insertPolygonShape(shapeSvg, w, h, points); + el.attr("style", node.style); + node.width = w + h; + node.height = h; + node.intersect = function(point2) { + return intersect_default.polygon(node, points, point2); + }; + return shapeSvg; +}, "rect_left_inv_arrow"); +var lean_right = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper(parent, node, getClassesFromNode(node), true); + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const points = [ + { x: -2 * h / 6, y: 0 }, + { x: w - h / 6, y: 0 }, + { x: w + 2 * h / 6, y: -h }, + { x: h / 6, y: -h } + ]; + const el = insertPolygonShape(shapeSvg, w, h, points); + el.attr("style", node.style); + updateNodeBounds(node, el); + node.intersect = function(point2) { + return intersect_default.polygon(node, points, point2); + }; + return shapeSvg; +}, "lean_right"); +var lean_left = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const points = [ + { x: 2 * h / 6, y: 0 }, + { x: w + h / 6, y: 0 }, + { x: w - 2 * h / 6, y: -h }, + { x: -h / 6, y: -h } + ]; + const el = insertPolygonShape(shapeSvg, w, h, points); + el.attr("style", node.style); + updateNodeBounds(node, el); + node.intersect = function(point2) { + return intersect_default.polygon(node, points, point2); + }; + return shapeSvg; +}, "lean_left"); +var trapezoid = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const points = [ + { x: -2 * h / 6, y: 0 }, + { x: w + 2 * h / 6, y: 0 }, + { x: w - h / 6, y: -h }, + { x: h / 6, y: -h } + ]; + const el = insertPolygonShape(shapeSvg, w, h, points); + el.attr("style", node.style); + updateNodeBounds(node, el); + node.intersect = function(point2) { + return intersect_default.polygon(node, points, point2); + }; + return shapeSvg; +}, "trapezoid"); +var inv_trapezoid = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const points = [ + { x: h / 6, y: 0 }, + { x: w - h / 6, y: 0 }, + { x: w + 2 * h / 6, y: -h }, + { x: -2 * h / 6, y: -h } + ]; + const el = insertPolygonShape(shapeSvg, w, h, points); + el.attr("style", node.style); + updateNodeBounds(node, el); + node.intersect = function(point2) { + return intersect_default.polygon(node, points, point2); + }; + return shapeSvg; +}, "inv_trapezoid"); +var rect_right_inv_arrow = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const points = [ + { x: 0, y: 0 }, + { x: w + h / 2, y: 0 }, + { x: w, y: -h / 2 }, + { x: w + h / 2, y: -h }, + { x: 0, y: -h } + ]; + const el = insertPolygonShape(shapeSvg, w, h, points); + el.attr("style", node.style); + updateNodeBounds(node, el); + node.intersect = function(point2) { + return intersect_default.polygon(node, points, point2); + }; + return shapeSvg; +}, "rect_right_inv_arrow"); +var cylinder = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const w = bbox.width + node.padding; + const rx = w / 2; + const ry = rx / (2.5 + w / 50); + const h = bbox.height + ry + node.padding; + const shape = "M 0," + ry + " a " + rx + "," + ry + " 0,0,0 " + w + " 0 a " + rx + "," + ry + " 0,0,0 " + -w + " 0 l 0," + h + " a " + rx + "," + ry + " 0,0,0 " + w + " 0 l 0," + -h; + const el = shapeSvg.attr("label-offset-y", ry).insert("path", ":first-child").attr("style", node.style).attr("d", shape).attr("transform", "translate(" + -w / 2 + "," + -(h / 2 + ry) + ")"); + updateNodeBounds(node, el); + node.intersect = function(point2) { + const pos = intersect_default.rect(node, point2); + const x = pos.x - node.x; + if (rx != 0 && (Math.abs(x) < node.width / 2 || Math.abs(x) == node.width / 2 && Math.abs(pos.y - node.y) > node.height / 2 - ry)) { + let y = ry * ry * (1 - x * x / (rx * rx)); + if (y != 0) { + y = Math.sqrt(y); + } + y = ry - y; + if (point2.y - node.y > 0) { + y = -y; + } + pos.y += y; + } + return pos; + }; + return shapeSvg; +}, "cylinder"); +var rect = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox, halfPadding } = await labelHelper( + parent, + node, + "node " + node.classes + " " + node.class, + true + ); + const rect2 = shapeSvg.insert("rect", ":first-child"); + const totalWidth = node.positioned ? node.width : bbox.width + node.padding; + const totalHeight = node.positioned ? node.height : bbox.height + node.padding; + const x = node.positioned ? -totalWidth / 2 : -bbox.width / 2 - halfPadding; + const y = node.positioned ? -totalHeight / 2 : -bbox.height / 2 - halfPadding; + rect2.attr("class", "basic label-container").attr("style", node.style).attr("rx", node.rx).attr("ry", node.ry).attr("x", x).attr("y", y).attr("width", totalWidth).attr("height", totalHeight); + if (node.props) { + const propKeys = new Set(Object.keys(node.props)); + if (node.props.borders) { + applyNodePropertyBorders(rect2, node.props.borders, totalWidth, totalHeight); + propKeys.delete("borders"); + } + propKeys.forEach((propKey) => { + log.warn(`Unknown node property ${propKey}`); + }); + } + updateNodeBounds(node, rect2); + node.intersect = function(point2) { + return intersect_default.rect(node, point2); + }; + return shapeSvg; +}, "rect"); +var composite = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox, halfPadding } = await labelHelper( + parent, + node, + "node " + node.classes, + true + ); + const rect2 = shapeSvg.insert("rect", ":first-child"); + const totalWidth = node.positioned ? node.width : bbox.width + node.padding; + const totalHeight = node.positioned ? node.height : bbox.height + node.padding; + const x = node.positioned ? -totalWidth / 2 : -bbox.width / 2 - halfPadding; + const y = node.positioned ? -totalHeight / 2 : -bbox.height / 2 - halfPadding; + rect2.attr("class", "basic cluster composite label-container").attr("style", node.style).attr("rx", node.rx).attr("ry", node.ry).attr("x", x).attr("y", y).attr("width", totalWidth).attr("height", totalHeight); + if (node.props) { + const propKeys = new Set(Object.keys(node.props)); + if (node.props.borders) { + applyNodePropertyBorders(rect2, node.props.borders, totalWidth, totalHeight); + propKeys.delete("borders"); + } + propKeys.forEach((propKey) => { + log.warn(`Unknown node property ${propKey}`); + }); + } + updateNodeBounds(node, rect2); + node.intersect = function(point2) { + return intersect_default.rect(node, point2); + }; + return shapeSvg; +}, "composite"); +var labelRect = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg } = await labelHelper(parent, node, "label", true); + log.trace("Classes = ", node.class); + const rect2 = shapeSvg.insert("rect", ":first-child"); + const totalWidth = 0; + const totalHeight = 0; + rect2.attr("width", totalWidth).attr("height", totalHeight); + shapeSvg.attr("class", "label edgeLabel"); + if (node.props) { + const propKeys = new Set(Object.keys(node.props)); + if (node.props.borders) { + applyNodePropertyBorders(rect2, node.props.borders, totalWidth, totalHeight); + propKeys.delete("borders"); + } + propKeys.forEach((propKey) => { + log.warn(`Unknown node property ${propKey}`); + }); + } + updateNodeBounds(node, rect2); + node.intersect = function(point2) { + return intersect_default.rect(node, point2); + }; + return shapeSvg; +}, "labelRect"); +function applyNodePropertyBorders(rect2, borders, totalWidth, totalHeight) { + const strokeDashArray = []; + const addBorder = /* @__PURE__ */ __name((length) => { + strokeDashArray.push(length, 0); + }, "addBorder"); + const skipBorder = /* @__PURE__ */ __name((length) => { + strokeDashArray.push(0, length); + }, "skipBorder"); + if (borders.includes("t")) { + log.debug("add top border"); + addBorder(totalWidth); + } else { + skipBorder(totalWidth); + } + if (borders.includes("r")) { + log.debug("add right border"); + addBorder(totalHeight); + } else { + skipBorder(totalHeight); + } + if (borders.includes("b")) { + log.debug("add bottom border"); + addBorder(totalWidth); + } else { + skipBorder(totalWidth); + } + if (borders.includes("l")) { + log.debug("add left border"); + addBorder(totalHeight); + } else { + skipBorder(totalHeight); + } + rect2.attr("stroke-dasharray", strokeDashArray.join(" ")); +} +__name(applyNodePropertyBorders, "applyNodePropertyBorders"); +var rectWithTitle = /* @__PURE__ */ __name(async (parent, node) => { + let classes2; + if (!node.classes) { + classes2 = "node default"; + } else { + classes2 = "node " + node.classes; + } + const shapeSvg = parent.insert("g").attr("class", classes2).attr("id", node.domId || node.id); + const rect2 = shapeSvg.insert("rect", ":first-child"); + const innerLine = shapeSvg.insert("line"); + const label = shapeSvg.insert("g").attr("class", "label"); + const text2 = node.labelText.flat ? node.labelText.flat() : node.labelText; + let title = ""; + if (typeof text2 === "object") { + title = text2[0]; + } else { + title = text2; + } + log.info("Label text abc79", title, text2, typeof text2 === "object"); + const text = label.node().appendChild(await createLabel_default(title, node.labelStyle, true, true)); + let bbox = { width: 0, height: 0 }; + if (evaluate(getConfig2().flowchart.htmlLabels)) { + const div = text.children[0]; + const dv = select4(text); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + log.info("Text 2", text2); + const textRows = text2.slice(1, text2.length); + let titleBox = text.getBBox(); + const descr = label.node().appendChild( + await createLabel_default( + textRows.join ? textRows.join("
") : textRows, + node.labelStyle, + true, + true + ) + ); + if (evaluate(getConfig2().flowchart.htmlLabels)) { + const div = descr.children[0]; + const dv = select4(descr); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + const halfPadding = node.padding / 2; + select4(descr).attr( + "transform", + "translate( " + // (titleBox.width - bbox.width) / 2 + + (bbox.width > titleBox.width ? 0 : (titleBox.width - bbox.width) / 2) + ", " + (titleBox.height + halfPadding + 5) + ")" + ); + select4(text).attr( + "transform", + "translate( " + // (titleBox.width - bbox.width) / 2 + + (bbox.width < titleBox.width ? 0 : -(titleBox.width - bbox.width) / 2) + ", 0)" + ); + bbox = label.node().getBBox(); + label.attr( + "transform", + "translate(" + -bbox.width / 2 + ", " + (-bbox.height / 2 - halfPadding + 3) + ")" + ); + rect2.attr("class", "outer title-state").attr("x", -bbox.width / 2 - halfPadding).attr("y", -bbox.height / 2 - halfPadding).attr("width", bbox.width + node.padding).attr("height", bbox.height + node.padding); + innerLine.attr("class", "divider").attr("x1", -bbox.width / 2 - halfPadding).attr("x2", bbox.width / 2 + halfPadding).attr("y1", -bbox.height / 2 - halfPadding + titleBox.height + halfPadding).attr("y2", -bbox.height / 2 - halfPadding + titleBox.height + halfPadding); + updateNodeBounds(node, rect2); + node.intersect = function(point2) { + return intersect_default.rect(node, point2); + }; + return shapeSvg; +}, "rectWithTitle"); +var stadium = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const h = bbox.height + node.padding; + const w = bbox.width + h / 4 + node.padding; + const rect2 = shapeSvg.insert("rect", ":first-child").attr("style", node.style).attr("rx", h / 2).attr("ry", h / 2).attr("x", -w / 2).attr("y", -h / 2).attr("width", w).attr("height", h); + updateNodeBounds(node, rect2); + node.intersect = function(point2) { + return intersect_default.rect(node, point2); + }; + return shapeSvg; +}, "stadium"); +var circle2 = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox, halfPadding } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const circle3 = shapeSvg.insert("circle", ":first-child"); + circle3.attr("style", node.style).attr("rx", node.rx).attr("ry", node.ry).attr("r", bbox.width / 2 + halfPadding).attr("width", bbox.width + node.padding).attr("height", bbox.height + node.padding); + log.info("Circle main"); + updateNodeBounds(node, circle3); + node.intersect = function(point2) { + log.info("Circle intersect", node, bbox.width / 2 + halfPadding, point2); + return intersect_default.circle(node, bbox.width / 2 + halfPadding, point2); + }; + return shapeSvg; +}, "circle"); +var doublecircle = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox, halfPadding } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const gap = 5; + const circleGroup = shapeSvg.insert("g", ":first-child"); + const outerCircle = circleGroup.insert("circle"); + const innerCircle = circleGroup.insert("circle"); + circleGroup.attr("class", node.class); + outerCircle.attr("style", node.style).attr("rx", node.rx).attr("ry", node.ry).attr("r", bbox.width / 2 + halfPadding + gap).attr("width", bbox.width + node.padding + gap * 2).attr("height", bbox.height + node.padding + gap * 2); + innerCircle.attr("style", node.style).attr("rx", node.rx).attr("ry", node.ry).attr("r", bbox.width / 2 + halfPadding).attr("width", bbox.width + node.padding).attr("height", bbox.height + node.padding); + log.info("DoubleCircle main"); + updateNodeBounds(node, outerCircle); + node.intersect = function(point2) { + log.info("DoubleCircle intersect", node, bbox.width / 2 + halfPadding + gap, point2); + return intersect_default.circle(node, bbox.width / 2 + halfPadding + gap, point2); + }; + return shapeSvg; +}, "doublecircle"); +var subroutine = /* @__PURE__ */ __name(async (parent, node) => { + const { shapeSvg, bbox } = await labelHelper( + parent, + node, + getClassesFromNode(node, void 0), + true + ); + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const points = [ + { x: 0, y: 0 }, + { x: w, y: 0 }, + { x: w, y: -h }, + { x: 0, y: -h }, + { x: 0, y: 0 }, + { x: -8, y: 0 }, + { x: w + 8, y: 0 }, + { x: w + 8, y: -h }, + { x: -8, y: -h }, + { x: -8, y: 0 } + ]; + const el = insertPolygonShape(shapeSvg, w, h, points); + el.attr("style", node.style); + updateNodeBounds(node, el); + node.intersect = function(point2) { + return intersect_default.polygon(node, points, point2); + }; + return shapeSvg; +}, "subroutine"); +var start = /* @__PURE__ */ __name((parent, node) => { + const shapeSvg = parent.insert("g").attr("class", "node default").attr("id", node.domId || node.id); + const circle3 = shapeSvg.insert("circle", ":first-child"); + circle3.attr("class", "state-start").attr("r", 7).attr("width", 14).attr("height", 14); + updateNodeBounds(node, circle3); + node.intersect = function(point2) { + return intersect_default.circle(node, 7, point2); + }; + return shapeSvg; +}, "start"); +var forkJoin = /* @__PURE__ */ __name((parent, node, dir) => { + const shapeSvg = parent.insert("g").attr("class", "node default").attr("id", node.domId || node.id); + let width = 70; + let height = 10; + if (dir === "LR") { + width = 10; + height = 70; + } + const shape = shapeSvg.append("rect").attr("x", -1 * width / 2).attr("y", -1 * height / 2).attr("width", width).attr("height", height).attr("class", "fork-join"); + updateNodeBounds(node, shape); + node.height = node.height + node.padding / 2; + node.width = node.width + node.padding / 2; + node.intersect = function(point2) { + return intersect_default.rect(node, point2); + }; + return shapeSvg; +}, "forkJoin"); +var end = /* @__PURE__ */ __name((parent, node) => { + const shapeSvg = parent.insert("g").attr("class", "node default").attr("id", node.domId || node.id); + const innerCircle = shapeSvg.insert("circle", ":first-child"); + const circle3 = shapeSvg.insert("circle", ":first-child"); + circle3.attr("class", "state-start").attr("r", 7).attr("width", 14).attr("height", 14); + innerCircle.attr("class", "state-end").attr("r", 5).attr("width", 10).attr("height", 10); + updateNodeBounds(node, circle3); + node.intersect = function(point2) { + return intersect_default.circle(node, 7, point2); + }; + return shapeSvg; +}, "end"); +var class_box = /* @__PURE__ */ __name(async (parent, node) => { + const halfPadding = node.padding / 2; + const rowPadding = 4; + const lineHeight = 8; + let classes2; + if (!node.classes) { + classes2 = "node default"; + } else { + classes2 = "node " + node.classes; + } + const shapeSvg = parent.insert("g").attr("class", classes2).attr("id", node.domId || node.id); + const rect2 = shapeSvg.insert("rect", ":first-child"); + const topLine = shapeSvg.insert("line"); + const bottomLine = shapeSvg.insert("line"); + let maxWidth = 0; + let maxHeight = rowPadding; + const labelContainer = shapeSvg.insert("g").attr("class", "label"); + let verticalPos = 0; + const hasInterface = node.classData.annotations?.[0]; + const interfaceLabelText = node.classData.annotations[0] ? "\xAB" + node.classData.annotations[0] + "\xBB" : ""; + const interfaceLabel = labelContainer.node().appendChild(await createLabel_default(interfaceLabelText, node.labelStyle, true, true)); + let interfaceBBox = interfaceLabel.getBBox(); + if (evaluate(getConfig2().flowchart.htmlLabels)) { + const div = interfaceLabel.children[0]; + const dv = select4(interfaceLabel); + interfaceBBox = div.getBoundingClientRect(); + dv.attr("width", interfaceBBox.width); + dv.attr("height", interfaceBBox.height); + } + if (node.classData.annotations[0]) { + maxHeight += interfaceBBox.height + rowPadding; + maxWidth += interfaceBBox.width; + } + let classTitleString = node.classData.label; + if (node.classData.type !== void 0 && node.classData.type !== "") { + if (getConfig2().flowchart.htmlLabels) { + classTitleString += "<" + node.classData.type + ">"; + } else { + classTitleString += "<" + node.classData.type + ">"; + } + } + const classTitleLabel = labelContainer.node().appendChild(await createLabel_default(classTitleString, node.labelStyle, true, true)); + select4(classTitleLabel).attr("class", "classTitle"); + let classTitleBBox = classTitleLabel.getBBox(); + if (evaluate(getConfig2().flowchart.htmlLabels)) { + const div = classTitleLabel.children[0]; + const dv = select4(classTitleLabel); + classTitleBBox = div.getBoundingClientRect(); + dv.attr("width", classTitleBBox.width); + dv.attr("height", classTitleBBox.height); + } + maxHeight += classTitleBBox.height + rowPadding; + if (classTitleBBox.width > maxWidth) { + maxWidth = classTitleBBox.width; + } + const classAttributes = []; + node.classData.members.forEach(async (member) => { + const parsedInfo = member.getDisplayDetails(); + let parsedText = parsedInfo.displayText; + if (getConfig2().flowchart.htmlLabels) { + parsedText = parsedText.replace(//g, ">"); + } + const lbl = labelContainer.node().appendChild( + await createLabel_default( + parsedText, + parsedInfo.cssStyle ? parsedInfo.cssStyle : node.labelStyle, + true, + true + ) + ); + let bbox = lbl.getBBox(); + if (evaluate(getConfig2().flowchart.htmlLabels)) { + const div = lbl.children[0]; + const dv = select4(lbl); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + if (bbox.width > maxWidth) { + maxWidth = bbox.width; + } + maxHeight += bbox.height + rowPadding; + classAttributes.push(lbl); + }); + maxHeight += lineHeight; + const classMethods = []; + node.classData.methods.forEach(async (member) => { + const parsedInfo = member.getDisplayDetails(); + let displayText = parsedInfo.displayText; + if (getConfig2().flowchart.htmlLabels) { + displayText = displayText.replace(//g, ">"); + } + const lbl = labelContainer.node().appendChild( + await createLabel_default( + displayText, + parsedInfo.cssStyle ? parsedInfo.cssStyle : node.labelStyle, + true, + true + ) + ); + let bbox = lbl.getBBox(); + if (evaluate(getConfig2().flowchart.htmlLabels)) { + const div = lbl.children[0]; + const dv = select4(lbl); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + if (bbox.width > maxWidth) { + maxWidth = bbox.width; + } + maxHeight += bbox.height + rowPadding; + classMethods.push(lbl); + }); + maxHeight += lineHeight; + if (hasInterface) { + let diffX2 = (maxWidth - interfaceBBox.width) / 2; + select4(interfaceLabel).attr( + "transform", + "translate( " + (-1 * maxWidth / 2 + diffX2) + ", " + -1 * maxHeight / 2 + ")" + ); + verticalPos = interfaceBBox.height + rowPadding; + } + let diffX = (maxWidth - classTitleBBox.width) / 2; + select4(classTitleLabel).attr( + "transform", + "translate( " + (-1 * maxWidth / 2 + diffX) + ", " + (-1 * maxHeight / 2 + verticalPos) + ")" + ); + verticalPos += classTitleBBox.height + rowPadding; + topLine.attr("class", "divider").attr("x1", -maxWidth / 2 - halfPadding).attr("x2", maxWidth / 2 + halfPadding).attr("y1", -maxHeight / 2 - halfPadding + lineHeight + verticalPos).attr("y2", -maxHeight / 2 - halfPadding + lineHeight + verticalPos); + verticalPos += lineHeight; + classAttributes.forEach((lbl) => { + select4(lbl).attr( + "transform", + "translate( " + -maxWidth / 2 + ", " + (-1 * maxHeight / 2 + verticalPos + lineHeight / 2) + ")" + ); + const memberBBox = lbl?.getBBox(); + verticalPos += (memberBBox?.height ?? 0) + rowPadding; + }); + verticalPos += lineHeight; + bottomLine.attr("class", "divider").attr("x1", -maxWidth / 2 - halfPadding).attr("x2", maxWidth / 2 + halfPadding).attr("y1", -maxHeight / 2 - halfPadding + lineHeight + verticalPos).attr("y2", -maxHeight / 2 - halfPadding + lineHeight + verticalPos); + verticalPos += lineHeight; + classMethods.forEach((lbl) => { + select4(lbl).attr( + "transform", + "translate( " + -maxWidth / 2 + ", " + (-1 * maxHeight / 2 + verticalPos) + ")" + ); + const memberBBox = lbl?.getBBox(); + verticalPos += (memberBBox?.height ?? 0) + rowPadding; + }); + rect2.attr("style", node.style).attr("class", "outer title-state").attr("x", -maxWidth / 2 - halfPadding).attr("y", -(maxHeight / 2) - halfPadding).attr("width", maxWidth + node.padding).attr("height", maxHeight + node.padding); + updateNodeBounds(node, rect2); + node.intersect = function(point2) { + return intersect_default.rect(node, point2); + }; + return shapeSvg; +}, "class_box"); +var shapes = { + rhombus: question, + composite, + question, + rect, + labelRect, + rectWithTitle, + choice, + circle: circle2, + doublecircle, + stadium, + hexagon, + block_arrow, + rect_left_inv_arrow, + lean_right, + lean_left, + trapezoid, + inv_trapezoid, + rect_right_inv_arrow, + cylinder, + start, + end, + note: note_default, + subroutine, + fork: forkJoin, + join: forkJoin, + class_box +}; +var nodeElems = {}; +var insertNode = /* @__PURE__ */ __name(async (elem, node, renderOptions) => { + let newEl; + let el; + if (node.link) { + let target; + if (getConfig2().securityLevel === "sandbox") { + target = "_top"; + } else if (node.linkTarget) { + target = node.linkTarget || "_blank"; + } + newEl = elem.insert("svg:a").attr("xlink:href", node.link).attr("target", target); + el = await shapes[node.shape](newEl, node, renderOptions); + } else { + el = await shapes[node.shape](elem, node, renderOptions); + newEl = el; + } + if (node.tooltip) { + el.attr("title", node.tooltip); + } + if (node.class) { + el.attr("class", "node default " + node.class); + } + nodeElems[node.id] = newEl; + if (node.haveCallback) { + nodeElems[node.id].attr("class", nodeElems[node.id].attr("class") + " clickable"); + } + return newEl; +}, "insertNode"); +var positionNode = /* @__PURE__ */ __name((node) => { + const el = nodeElems[node.id]; + log.trace( + "Transforming node", + node.diff, + node, + "translate(" + (node.x - node.width / 2 - 5) + ", " + node.width / 2 + ")" + ); + const padding2 = 8; + const diff = node.diff || 0; + if (node.clusterNode) { + el.attr( + "transform", + "translate(" + (node.x + diff - node.width / 2) + ", " + (node.y - node.height / 2 - padding2) + ")" + ); + } else { + el.attr("transform", "translate(" + node.x + ", " + node.y + ")"); + } + return diff; +}, "positionNode"); + +// src/diagrams/block/renderHelpers.ts +function getNodeFromBlock(block, db2, positioned = false) { + const vertex = block; + let classStr = "default"; + if ((vertex?.classes?.length || 0) > 0) { + classStr = (vertex?.classes ?? []).join(" "); + } + classStr = classStr + " flowchart-label"; + let radius = 0; + let shape = ""; + let padding2; + switch (vertex.type) { + case "round": + radius = 5; + shape = "rect"; + break; + case "composite": + radius = 0; + shape = "composite"; + padding2 = 0; + break; + case "square": + shape = "rect"; + break; + case "diamond": + shape = "question"; + break; + case "hexagon": + shape = "hexagon"; + break; + case "block_arrow": + shape = "block_arrow"; + break; + case "odd": + shape = "rect_left_inv_arrow"; + break; + case "lean_right": + shape = "lean_right"; + break; + case "lean_left": + shape = "lean_left"; + break; + case "trapezoid": + shape = "trapezoid"; + break; + case "inv_trapezoid": + shape = "inv_trapezoid"; + break; + case "rect_left_inv_arrow": + shape = "rect_left_inv_arrow"; + break; + case "circle": + shape = "circle"; + break; + case "ellipse": + shape = "ellipse"; + break; + case "stadium": + shape = "stadium"; + break; + case "subroutine": + shape = "subroutine"; + break; + case "cylinder": + shape = "cylinder"; + break; + case "group": + shape = "rect"; + break; + case "doublecircle": + shape = "doublecircle"; + break; + default: + shape = "rect"; + } + const styles = getStylesFromArray(vertex?.styles ?? []); + const vertexText = vertex.label; + const bounds = vertex.size ?? { width: 0, height: 0, x: 0, y: 0 }; + const node = { + labelStyle: styles.labelStyle, + shape, + labelText: vertexText, + rx: radius, + ry: radius, + class: classStr, + style: styles.style, + id: vertex.id, + directions: vertex.directions, + width: bounds.width, + height: bounds.height, + x: bounds.x, + y: bounds.y, + positioned, + intersect: void 0, + type: vertex.type, + padding: padding2 ?? getConfig()?.block?.padding ?? 0 + }; + return node; +} +__name(getNodeFromBlock, "getNodeFromBlock"); +async function calculateBlockSize(elem, block, db2) { + const node = getNodeFromBlock(block, db2, false); + if (node.type === "group") { + return; + } + const config2 = getConfig(); + const nodeEl = await insertNode(elem, node, { config: config2 }); + const boundingBox = nodeEl.node().getBBox(); + const obj = db2.getBlock(node.id); + obj.size = { width: boundingBox.width, height: boundingBox.height, x: 0, y: 0, node: nodeEl }; + db2.setBlock(obj); + nodeEl.remove(); +} +__name(calculateBlockSize, "calculateBlockSize"); +async function insertBlockPositioned(elem, block, db2) { + const node = getNodeFromBlock(block, db2, true); + const obj = db2.getBlock(node.id); + if (obj.type !== "space") { + const config2 = getConfig(); + await insertNode(elem, node, { config: config2 }); + block.intersect = node?.intersect; + positionNode(node); + } +} +__name(insertBlockPositioned, "insertBlockPositioned"); +async function performOperations(elem, blocks2, db2, operation) { + for (const block of blocks2) { + await operation(elem, block, db2); + if (block.children) { + await performOperations(elem, block.children, db2, operation); + } + } +} +__name(performOperations, "performOperations"); +async function calculateBlockSizes(elem, blocks2, db2) { + await performOperations(elem, blocks2, db2, calculateBlockSize); +} +__name(calculateBlockSizes, "calculateBlockSizes"); +async function insertBlocks(elem, blocks2, db2) { + await performOperations(elem, blocks2, db2, insertBlockPositioned); +} +__name(insertBlocks, "insertBlocks"); +async function insertEdges(elem, edges, blocks2, db2, id) { + const g = new graphlib.Graph({ + multigraph: true, + compound: true + }); + g.setGraph({ + rankdir: "TB", + nodesep: 10, + ranksep: 10, + marginx: 8, + marginy: 8 + }); + for (const block of blocks2) { + if (block.size) { + g.setNode(block.id, { + width: block.size.width, + height: block.size.height, + intersect: block.intersect + }); + } + } + for (const edge of edges) { + if (edge.start && edge.end) { + const startBlock = db2.getBlock(edge.start); + const endBlock = db2.getBlock(edge.end); + if (startBlock?.size && endBlock?.size) { + const start2 = startBlock.size; + const end2 = endBlock.size; + const points = [ + { x: start2.x, y: start2.y }, + { x: start2.x + (end2.x - start2.x) / 2, y: start2.y + (end2.y - start2.y) / 2 }, + { x: end2.x, y: end2.y } + ]; + insertEdge( + elem, + { v: edge.start, w: edge.end, name: edge.id }, + { + ...edge, + arrowTypeEnd: edge.arrowTypeEnd, + arrowTypeStart: edge.arrowTypeStart, + points, + classes: "edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1" + }, + void 0, + "block", + g, + id + ); + if (edge.label) { + await insertEdgeLabel(elem, { + ...edge, + label: edge.label, + labelStyle: "stroke: #333; stroke-width: 1.5px;fill:none;", + arrowTypeEnd: edge.arrowTypeEnd, + arrowTypeStart: edge.arrowTypeStart, + points, + classes: "edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1" + }); + positionEdgeLabel( + { ...edge, x: points[1].x, y: points[1].y }, + { + originalPath: points + } + ); + } + } + } + } +} +__name(insertEdges, "insertEdges"); + +// src/diagrams/block/blockRenderer.ts +var getClasses2 = /* @__PURE__ */ __name(function(text, diagObj) { + return diagObj.db.getClasses(); +}, "getClasses"); +var draw = /* @__PURE__ */ __name(async function(text, id, _version, diagObj) { + const { securityLevel, block: conf } = getConfig(); + const db2 = diagObj.db; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = d3select("#i" + id); + } + const root = securityLevel === "sandbox" ? d3select(sandboxElement.nodes()[0].contentDocument.body) : d3select("body"); + const svg = securityLevel === "sandbox" ? root.select(`[id="${id}"]`) : d3select(`[id="${id}"]`); + const markers2 = ["point", "circle", "cross"]; + markers_default(svg, markers2, diagObj.type, id); + const bl = db2.getBlocks(); + const blArr = db2.getBlocksFlat(); + const edges = db2.getEdges(); + const nodes = svg.insert("g").attr("class", "block"); + await calculateBlockSizes(nodes, bl, db2); + const bounds = layout(db2); + await insertBlocks(nodes, bl, db2); + await insertEdges(nodes, edges, blArr, db2, id); + if (bounds) { + const bounds2 = bounds; + const magicFactor = Math.max(1, Math.round(0.125 * (bounds2.width / bounds2.height))); + const height = bounds2.height + magicFactor + 10; + const width = bounds2.width + 10; + const { useMaxWidth } = conf; + configureSvgSize(svg, height, width, !!useMaxWidth); + log.debug("Here Bounds", bounds, bounds2); + svg.attr( + "viewBox", + `${bounds2.x - 5} ${bounds2.y - 5} ${bounds2.width + 10} ${bounds2.height + 10}` + ); + } +}, "draw"); +var blockRenderer_default = { + draw, + getClasses: getClasses2 +}; + +// src/diagrams/block/blockDiagram.ts +var diagram = { + parser: block_default, + db: blockDB_default, + renderer: blockRenderer_default, + styles: styles_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/blockDiagram-VD42YOAC.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/blockDiagram-VD42YOAC.mjs.map new file mode 100644 index 0000000..3571d75 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/blockDiagram-VD42YOAC.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/block/parser/block.jison", "../../../src/diagrams/block/blockDB.ts", "../../../src/diagrams/block/styles.ts", "../../../src/diagrams/block/blockRenderer.ts", "../../../src/dagre-wrapper/markers.js", "../../../src/diagrams/block/layout.ts", "../../../src/diagrams/block/renderHelpers.ts", "../../../src/dagre-wrapper/createLabel.js", "../../../src/dagre-wrapper/edges.js", "../../../src/dagre-wrapper/edgeMarker.ts", "../../../src/dagre-wrapper/nodes.js", "../../../src/dagre-wrapper/blockArrowHelper.ts", "../../../src/dagre-wrapper/intersect/intersect-node.js", "../../../src/dagre-wrapper/intersect/intersect-ellipse.js", "../../../src/dagre-wrapper/intersect/intersect-circle.js", "../../../src/dagre-wrapper/intersect/intersect-line.js", "../../../src/dagre-wrapper/intersect/intersect-polygon.js", "../../../src/dagre-wrapper/intersect/intersect-rect.js", "../../../src/dagre-wrapper/intersect/index.js", "../../../src/dagre-wrapper/shapes/util.js", "../../../src/dagre-wrapper/shapes/note.js", "../../../src/diagrams/block/blockDiagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,15],$V1=[1,7],$V2=[1,13],$V3=[1,14],$V4=[1,19],$V5=[1,16],$V6=[1,17],$V7=[1,18],$V8=[8,30],$V9=[8,10,21,28,29,30,31,39,43,46],$Va=[1,23],$Vb=[1,24],$Vc=[8,10,15,16,21,28,29,30,31,39,43,46],$Vd=[8,10,15,16,21,27,28,29,30,31,39,43,46],$Ve=[1,49];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"spaceLines\":3,\"SPACELINE\":4,\"NL\":5,\"separator\":6,\"SPACE\":7,\"EOF\":8,\"start\":9,\"BLOCK_DIAGRAM_KEY\":10,\"document\":11,\"stop\":12,\"statement\":13,\"link\":14,\"LINK\":15,\"START_LINK\":16,\"LINK_LABEL\":17,\"STR\":18,\"nodeStatement\":19,\"columnsStatement\":20,\"SPACE_BLOCK\":21,\"blockStatement\":22,\"classDefStatement\":23,\"cssClassStatement\":24,\"styleStatement\":25,\"node\":26,\"SIZE\":27,\"COLUMNS\":28,\"id-block\":29,\"end\":30,\"NODE_ID\":31,\"nodeShapeNLabel\":32,\"dirList\":33,\"DIR\":34,\"NODE_DSTART\":35,\"NODE_DEND\":36,\"BLOCK_ARROW_START\":37,\"BLOCK_ARROW_END\":38,\"classDef\":39,\"CLASSDEF_ID\":40,\"CLASSDEF_STYLEOPTS\":41,\"DEFAULT\":42,\"class\":43,\"CLASSENTITY_IDS\":44,\"STYLECLASS\":45,\"style\":46,\"STYLE_ENTITY_IDS\":47,\"STYLE_DEFINITION_DATA\":48,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"SPACELINE\",5:\"NL\",7:\"SPACE\",8:\"EOF\",10:\"BLOCK_DIAGRAM_KEY\",15:\"LINK\",16:\"START_LINK\",17:\"LINK_LABEL\",18:\"STR\",21:\"SPACE_BLOCK\",27:\"SIZE\",28:\"COLUMNS\",29:\"id-block\",30:\"end\",31:\"NODE_ID\",34:\"DIR\",35:\"NODE_DSTART\",36:\"NODE_DEND\",37:\"BLOCK_ARROW_START\",38:\"BLOCK_ARROW_END\",39:\"classDef\",40:\"CLASSDEF_ID\",41:\"CLASSDEF_STYLEOPTS\",42:\"DEFAULT\",43:\"class\",44:\"CLASSENTITY_IDS\",45:\"STYLECLASS\",46:\"style\",47:\"STYLE_ENTITY_IDS\",48:\"STYLE_DEFINITION_DATA\"},\nproductions_: [0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[33,1],[33,2],[32,3],[32,4],[23,3],[23,3],[24,3],[25,3]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 4:\nyy.getLogger().debug('Rule: separator (NL) ');\nbreak;\ncase 5:\nyy.getLogger().debug('Rule: separator (Space) ');\nbreak;\ncase 6:\nyy.getLogger().debug('Rule: separator (EOF) ');\nbreak;\ncase 7:\n yy.getLogger().debug(\"Rule: hierarchy: \", $$[$0-1]); yy.setHierarchy($$[$0-1]); \nbreak;\ncase 8:\nyy.getLogger().debug('Stop NL ');\nbreak;\ncase 9:\nyy.getLogger().debug('Stop EOF ');\nbreak;\ncase 10:\nyy.getLogger().debug('Stop NL2 ');\nbreak;\ncase 11:\nyy.getLogger().debug('Stop EOF2 ');\nbreak;\ncase 12:\n yy.getLogger().debug(\"Rule: statement: \", $$[$0]); typeof $$[$0].length === 'number'?this.$ = $$[$0]:this.$ = [$$[$0]]; \nbreak;\ncase 13:\n yy.getLogger().debug(\"Rule: statement #2: \", $$[$0-1]); this.$ = [$$[$0-1]].concat($$[$0]); \nbreak;\ncase 14:\n yy.getLogger().debug(\"Rule: link: \", $$[$0], yytext); this.$={edgeTypeStr: $$[$0], label:''}; \nbreak;\ncase 15:\n yy.getLogger().debug(\"Rule: LABEL link: \", $$[$0-3], $$[$0-1], $$[$0]); this.$={edgeTypeStr: $$[$0], label:$$[$0-1]}; \nbreak;\ncase 18:\n const num=parseInt($$[$0]); const spaceId = yy.generateId(); this.$ = { id: spaceId, type:'space', label:'', width: num, children: [] }\nbreak;\ncase 23:\n\n yy.getLogger().debug('Rule: (nodeStatement link node) ', $$[$0-2], $$[$0-1], $$[$0], ' typestr: ',$$[$0-1].edgeTypeStr);\n const edgeData = yy.edgeStrToEdgeData($$[$0-1].edgeTypeStr)\n this.$ = [\n {id: $$[$0-2].id, label: $$[$0-2].label, type:$$[$0-2].type, directions: $$[$0-2].directions},\n {id: $$[$0-2].id + '-' + $$[$0].id, start: $$[$0-2].id, end: $$[$0].id, label: $$[$0-1].label, type: 'edge', directions: $$[$0].directions, arrowTypeEnd: edgeData, arrowTypeStart: 'arrow_open' },\n {id: $$[$0].id, label: $$[$0].label, type: yy.typeStr2Type($$[$0].typeStr), directions: $$[$0].directions}\n ];\n \nbreak;\ncase 24:\n yy.getLogger().debug('Rule: nodeStatement (abc88 node size) ', $$[$0-1], $$[$0]); this.$ = {id: $$[$0-1].id, label: $$[$0-1].label, type: yy.typeStr2Type($$[$0-1].typeStr), directions: $$[$0-1].directions, widthInColumns: parseInt($$[$0],10)}; \nbreak;\ncase 25:\n yy.getLogger().debug('Rule: nodeStatement (node) ', $$[$0]); this.$ = {id: $$[$0].id, label: $$[$0].label, type: yy.typeStr2Type($$[$0].typeStr), directions: $$[$0].directions, widthInColumns:1}; \nbreak;\ncase 26:\n yy.getLogger().debug('APA123', this? this:'na'); yy.getLogger().debug(\"COLUMNS: \", $$[$0]); this.$ = {type: 'column-setting', columns: $$[$0] === 'auto'?-1:parseInt($$[$0]) } \nbreak;\ncase 27:\n yy.getLogger().debug('Rule: id-block statement : ', $$[$0-2], $$[$0-1]); const id2 = yy.generateId(); this.$ = { ...$$[$0-2], type:'composite', children: $$[$0-1] }; \nbreak;\ncase 28:\n yy.getLogger().debug('Rule: blockStatement : ', $$[$0-2], $$[$0-1], $$[$0]); const id = yy.generateId(); this.$ = { id, type:'composite', label:'', children: $$[$0-1] }; \nbreak;\ncase 29:\n yy.getLogger().debug(\"Rule: node (NODE_ID separator): \", $$[$0]); this.$ = { id: $$[$0] }; \nbreak;\ncase 30:\n\n yy.getLogger().debug(\"Rule: node (NODE_ID nodeShapeNLabel separator): \", $$[$0-1], $$[$0]);\n this.$ = { id: $$[$0-1], label: $$[$0].label, typeStr: $$[$0].typeStr, directions: $$[$0].directions };\n \nbreak;\ncase 31:\n yy.getLogger().debug(\"Rule: dirList: \", $$[$0]); this.$ = [$$[$0]]; \nbreak;\ncase 32:\n yy.getLogger().debug(\"Rule: dirList: \", $$[$0-1], $$[$0]); this.$ = [$$[$0-1]].concat($$[$0]); \nbreak;\ncase 33:\n yy.getLogger().debug(\"Rule: nodeShapeNLabel: \", $$[$0-2], $$[$0-1], $$[$0]); this.$ = { typeStr: $$[$0-2] + $$[$0], label: $$[$0-1] }; \nbreak;\ncase 34:\n yy.getLogger().debug(\"Rule: BLOCK_ARROW nodeShapeNLabel: \", $$[$0-3], $$[$0-2], \" #3:\",$$[$0-1], $$[$0]); this.$ = { typeStr: $$[$0-3] + $$[$0], label: $$[$0-2], directions: $$[$0-1]}; \nbreak;\ncase 35: case 36:\n\n this.$ = { type: 'classDef', id: $$[$0-1].trim(), css: $$[$0].trim() };\n \nbreak;\ncase 37:\n\n //log.debug('apply class: id(s): ',$$[$0-1], ' style class: ', $$[$0]);\n this.$={ type: 'applyClass', id: $$[$0-1].trim(), styleClass: $$[$0].trim() };\n \nbreak;\ncase 38:\n\n this.$={ type: 'applyStyles', id: $$[$0-1].trim(), stylesStr: $$[$0].trim() };\n \nbreak;\n}\n},\ntable: [{9:1,10:[1,2]},{1:[3]},{10:$V0,11:3,13:4,19:5,20:6,21:$V1,22:8,23:9,24:10,25:11,26:12,28:$V2,29:$V3,31:$V4,39:$V5,43:$V6,46:$V7},{8:[1,20]},o($V8,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,10:$V0,21:$V1,28:$V2,29:$V3,31:$V4,39:$V5,43:$V6,46:$V7}),o($V9,[2,16],{14:22,15:$Va,16:$Vb}),o($V9,[2,17]),o($V9,[2,18]),o($V9,[2,19]),o($V9,[2,20]),o($V9,[2,21]),o($V9,[2,22]),o($Vc,[2,25],{27:[1,25]}),o($V9,[2,26]),{19:26,26:12,31:$V4},{10:$V0,11:27,13:4,19:5,20:6,21:$V1,22:8,23:9,24:10,25:11,26:12,28:$V2,29:$V3,31:$V4,39:$V5,43:$V6,46:$V7},{40:[1,28],42:[1,29]},{44:[1,30]},{47:[1,31]},o($Vd,[2,29],{32:32,35:[1,33],37:[1,34]}),{1:[2,7]},o($V8,[2,13]),{26:35,31:$V4},{31:[2,14]},{17:[1,36]},o($Vc,[2,24]),{10:$V0,11:37,13:4,14:22,15:$Va,16:$Vb,19:5,20:6,21:$V1,22:8,23:9,24:10,25:11,26:12,28:$V2,29:$V3,31:$V4,39:$V5,43:$V6,46:$V7},{30:[1,38]},{41:[1,39]},{41:[1,40]},{45:[1,41]},{48:[1,42]},o($Vd,[2,30]),{18:[1,43]},{18:[1,44]},o($Vc,[2,23]),{18:[1,45]},{30:[1,46]},o($V9,[2,28]),o($V9,[2,35]),o($V9,[2,36]),o($V9,[2,37]),o($V9,[2,38]),{36:[1,47]},{33:48,34:$Ve},{15:[1,50]},o($V9,[2,27]),o($Vd,[2,33]),{38:[1,51]},{33:52,34:$Ve,38:[2,31]},{31:[2,15]},o($Vd,[2,34]),{38:[2,32]}],\ndefaultActions: {20:[2,7],23:[2,14],50:[2,15],52:[2,32]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: yy.getLogger().debug('Found block-beta'); return 10; \nbreak;\ncase 1: yy.getLogger().debug('Found id-block'); return 29; \nbreak;\ncase 2: yy.getLogger().debug('Found block'); return 10; \nbreak;\ncase 3: yy.getLogger().debug('.', yy_.yytext); /* skip all whitespace */ \nbreak;\ncase 4:yy.getLogger().debug('_', yy_.yytext); /* skip all whitespace */ \nbreak;\ncase 5: return 5 \nbreak;\ncase 6: yy_.yytext=-1; return 28; \nbreak;\ncase 7: yy_.yytext = yy_.yytext.replace(/columns\\s+/,''); yy.getLogger().debug('COLUMNS (LEX)', yy_.yytext); return 28; \nbreak;\ncase 8: this.pushState(\"md_string\");\nbreak;\ncase 9: return \"MD_STR\";\nbreak;\ncase 10: this.popState();\nbreak;\ncase 11:this.pushState(\"string\");\nbreak;\ncase 12: yy.getLogger().debug('LEX: POPPING STR:', yy_.yytext);this.popState();\nbreak;\ncase 13: yy.getLogger().debug('LEX: STR end:', yy_.yytext); return \"STR\";\nbreak;\ncase 14: yy_.yytext = yy_.yytext.replace(/space\\:/,'');yy.getLogger().debug('SPACE NUM (LEX)', yy_.yytext); return 21; \nbreak;\ncase 15: yy_.yytext = '1'; yy.getLogger().debug('COLUMNS (LEX)', yy_.yytext); return 21; \nbreak;\ncase 16:return 42;\nbreak;\ncase 17:return 'LINKSTYLE';\nbreak;\ncase 18:return 'INTERPOLATE';\nbreak;\ncase 19: this.pushState('CLASSDEF'); return 39; \nbreak;\ncase 20: this.popState(); this.pushState('CLASSDEFID'); return 'DEFAULT_CLASSDEF_ID' \nbreak;\ncase 21: this.popState(); this.pushState('CLASSDEFID'); return 40 \nbreak;\ncase 22: this.popState(); return 41 \nbreak;\ncase 23: this.pushState('CLASS'); return 43; \nbreak;\ncase 24: this.popState(); this.pushState('CLASS_STYLE'); return 44 \nbreak;\ncase 25: this.popState(); return 45 \nbreak;\ncase 26: this.pushState('STYLE_STMNT'); return 46; \nbreak;\ncase 27: this.popState(); this.pushState('STYLE_DEFINITION'); return 47 \nbreak;\ncase 28: this.popState(); return 48 \nbreak;\ncase 29: this.pushState(\"acc_title\");return 'acc_title'; \nbreak;\ncase 30: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 31: this.pushState(\"acc_descr\");return 'acc_descr'; \nbreak;\ncase 32: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 33: this.pushState(\"acc_descr_multiline\");\nbreak;\ncase 34: this.popState(); \nbreak;\ncase 35:return \"acc_descr_multiline_value\";\nbreak;\ncase 36:return 30;\nbreak;\ncase 37: this.popState();yy.getLogger().debug('Lex: (('); return \"NODE_DEND\"; \nbreak;\ncase 38: this.popState();yy.getLogger().debug('Lex: (('); return \"NODE_DEND\"; \nbreak;\ncase 39: this.popState();yy.getLogger().debug('Lex: ))'); return \"NODE_DEND\"; \nbreak;\ncase 40: this.popState();yy.getLogger().debug('Lex: (('); return \"NODE_DEND\"; \nbreak;\ncase 41: this.popState();yy.getLogger().debug('Lex: (('); return \"NODE_DEND\"; \nbreak;\ncase 42: this.popState();yy.getLogger().debug('Lex: (-'); return \"NODE_DEND\"; \nbreak;\ncase 43: this.popState();yy.getLogger().debug('Lex: -)'); return \"NODE_DEND\"; \nbreak;\ncase 44: this.popState();yy.getLogger().debug('Lex: (('); return \"NODE_DEND\"; \nbreak;\ncase 45: this.popState();yy.getLogger().debug('Lex: ]]'); return \"NODE_DEND\"; \nbreak;\ncase 46: this.popState();yy.getLogger().debug('Lex: ('); return \"NODE_DEND\"; \nbreak;\ncase 47: this.popState();yy.getLogger().debug('Lex: ])'); return \"NODE_DEND\"; \nbreak;\ncase 48: this.popState();yy.getLogger().debug('Lex: /]'); return \"NODE_DEND\"; \nbreak;\ncase 49: this.popState();yy.getLogger().debug('Lex: /]'); return \"NODE_DEND\"; \nbreak;\ncase 50: this.popState();yy.getLogger().debug('Lex: )]'); return \"NODE_DEND\"; \nbreak;\ncase 51: this.popState();yy.getLogger().debug('Lex: )'); return \"NODE_DEND\"; \nbreak;\ncase 52: this.popState();yy.getLogger().debug('Lex: ]>'); return \"NODE_DEND\"; \nbreak;\ncase 53: this.popState();yy.getLogger().debug('Lex: ]'); return \"NODE_DEND\"; \nbreak;\ncase 54: yy.getLogger().debug('Lexa: -)'); this.pushState('NODE');return 35; \nbreak;\ncase 55: yy.getLogger().debug('Lexa: (-'); this.pushState('NODE');return 35; \nbreak;\ncase 56: yy.getLogger().debug('Lexa: ))'); this.pushState('NODE');return 35; \nbreak;\ncase 57: yy.getLogger().debug('Lexa: )'); this.pushState('NODE');return 35; \nbreak;\ncase 58: yy.getLogger().debug('Lex: ((('); this.pushState('NODE');return 35; \nbreak;\ncase 59: yy.getLogger().debug('Lexa: )'); this.pushState('NODE');return 35; \nbreak;\ncase 60: yy.getLogger().debug('Lexa: )'); this.pushState('NODE');return 35; \nbreak;\ncase 61: yy.getLogger().debug('Lexa: )'); this.pushState('NODE');return 35; \nbreak;\ncase 62: yy.getLogger().debug('Lexc: >'); this.pushState('NODE');return 35; \nbreak;\ncase 63: yy.getLogger().debug('Lexa: (['); this.pushState('NODE');return 35; \nbreak;\ncase 64: yy.getLogger().debug('Lexa: )'); this.pushState('NODE');return 35; \nbreak;\ncase 65: this.pushState('NODE');return 35; \nbreak;\ncase 66: this.pushState('NODE');return 35; \nbreak;\ncase 67: this.pushState('NODE');return 35; \nbreak;\ncase 68: this.pushState('NODE');return 35; \nbreak;\ncase 69: this.pushState('NODE');return 35; \nbreak;\ncase 70: this.pushState('NODE');return 35; \nbreak;\ncase 71: this.pushState('NODE');return 35; \nbreak;\ncase 72: yy.getLogger().debug('Lexa: ['); this.pushState('NODE');return 35; \nbreak;\ncase 73: this.pushState('BLOCK_ARROW');yy.getLogger().debug('LEX ARR START');return 37; \nbreak;\ncase 74: yy.getLogger().debug('Lex: NODE_ID', yy_.yytext);return 31; \nbreak;\ncase 75: yy.getLogger().debug('Lex: EOF', yy_.yytext);return 8; \nbreak;\ncase 76: this.pushState(\"md_string\");\nbreak;\ncase 77: this.pushState(\"md_string\");\nbreak;\ncase 78: return \"NODE_DESCR\";\nbreak;\ncase 79: this.popState();\nbreak;\ncase 80: yy.getLogger().debug('Lex: Starting string');this.pushState(\"string\");\nbreak;\ncase 81: yy.getLogger().debug('LEX ARR: Starting string');this.pushState(\"string\");\nbreak;\ncase 82: yy.getLogger().debug('LEX: NODE_DESCR:', yy_.yytext); return \"NODE_DESCR\";\nbreak;\ncase 83:yy.getLogger().debug('LEX POPPING');this.popState();\nbreak;\ncase 84: yy.getLogger().debug('Lex: =>BAE'); this.pushState('ARROW_DIR'); \nbreak;\ncase 85: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (right): dir:',yy_.yytext);return \"DIR\"; \nbreak;\ncase 86: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (left):',yy_.yytext);return \"DIR\"; \nbreak;\ncase 87: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (x):',yy_.yytext); return \"DIR\"; \nbreak;\ncase 88: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (y):',yy_.yytext); return \"DIR\"; \nbreak;\ncase 89: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (up):',yy_.yytext); return \"DIR\"; \nbreak;\ncase 90: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (down):',yy_.yytext); return \"DIR\"; \nbreak;\ncase 91: yy_.yytext=']>';yy.getLogger().debug('Lex (ARROW_DIR end):',yy_.yytext);this.popState();this.popState();return \"BLOCK_ARROW_END\"; \nbreak;\ncase 92: yy.getLogger().debug('Lex: LINK', '#'+yy_.yytext+'#'); return 15; \nbreak;\ncase 93: yy.getLogger().debug('Lex: LINK', yy_.yytext); return 15; \nbreak;\ncase 94: yy.getLogger().debug('Lex: LINK', yy_.yytext); return 15; \nbreak;\ncase 95: yy.getLogger().debug('Lex: LINK', yy_.yytext); return 15; \nbreak;\ncase 96: yy.getLogger().debug('Lex: START_LINK', yy_.yytext);this.pushState(\"LLABEL\");return 16; \nbreak;\ncase 97: yy.getLogger().debug('Lex: START_LINK', yy_.yytext);this.pushState(\"LLABEL\");return 16; \nbreak;\ncase 98: yy.getLogger().debug('Lex: START_LINK', yy_.yytext);this.pushState(\"LLABEL\");return 16; \nbreak;\ncase 99: this.pushState(\"md_string\");\nbreak;\ncase 100: yy.getLogger().debug('Lex: Starting string');this.pushState(\"string\"); return \"LINK_LABEL\";\nbreak;\ncase 101: this.popState(); yy.getLogger().debug('Lex: LINK', '#'+yy_.yytext+'#'); return 15; \nbreak;\ncase 102: this.popState(); yy.getLogger().debug('Lex: LINK', yy_.yytext); return 15; \nbreak;\ncase 103: this.popState(); yy.getLogger().debug('Lex: LINK', yy_.yytext); return 15; \nbreak;\ncase 104: yy.getLogger().debug('Lex: COLON', yy_.yytext); yy_.yytext=yy_.yytext.slice(1);return 27; \nbreak;\n}\n},\nrules: [/^(?:block-beta\\b)/,/^(?:block:)/,/^(?:block\\b)/,/^(?:[\\s]+)/,/^(?:[\\n]+)/,/^(?:((\\u000D\\u000A)|(\\u000A)))/,/^(?:columns\\s+auto\\b)/,/^(?:columns\\s+[\\d]+)/,/^(?:[\"][`])/,/^(?:[^`\"]+)/,/^(?:[`][\"])/,/^(?:[\"])/,/^(?:[\"])/,/^(?:[^\"]*)/,/^(?:space[:]\\d+)/,/^(?:space\\b)/,/^(?:default\\b)/,/^(?:linkStyle\\b)/,/^(?:interpolate\\b)/,/^(?:classDef\\s+)/,/^(?:DEFAULT\\s+)/,/^(?:\\w+\\s+)/,/^(?:[^\\n]*)/,/^(?:class\\s+)/,/^(?:(\\w+)+((,\\s*\\w+)*))/,/^(?:[^\\n]*)/,/^(?:style\\s+)/,/^(?:(\\w+)+((,\\s*\\w+)*))/,/^(?:[^\\n]*)/,/^(?:accTitle\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*\\{\\s*)/,/^(?:[\\}])/,/^(?:[^\\}]*)/,/^(?:end\\b\\s*)/,/^(?:\\(\\(\\()/,/^(?:\\)\\)\\))/,/^(?:[\\)]\\))/,/^(?:\\}\\})/,/^(?:\\})/,/^(?:\\(-)/,/^(?:-\\))/,/^(?:\\(\\()/,/^(?:\\]\\])/,/^(?:\\()/,/^(?:\\]\\))/,/^(?:\\\\\\])/,/^(?:\\/\\])/,/^(?:\\)\\])/,/^(?:[\\)])/,/^(?:\\]>)/,/^(?:[\\]])/,/^(?:-\\))/,/^(?:\\(-)/,/^(?:\\)\\))/,/^(?:\\))/,/^(?:\\(\\(\\()/,/^(?:\\(\\()/,/^(?:\\{\\{)/,/^(?:\\{)/,/^(?:>)/,/^(?:\\(\\[)/,/^(?:\\()/,/^(?:\\[\\[)/,/^(?:\\[\\|)/,/^(?:\\[\\()/,/^(?:\\)\\)\\))/,/^(?:\\[\\\\)/,/^(?:\\[\\/)/,/^(?:\\[\\\\)/,/^(?:\\[)/,/^(?:<\\[)/,/^(?:[^\\(\\[\\n\\-\\)\\{\\}\\s\\<\\>:]+)/,/^(?:$)/,/^(?:[\"][`])/,/^(?:[\"][`])/,/^(?:[^`\"]+)/,/^(?:[`][\"])/,/^(?:[\"])/,/^(?:[\"])/,/^(?:[^\"]+)/,/^(?:[\"])/,/^(?:\\]>\\s*\\()/,/^(?:,?\\s*right\\s*)/,/^(?:,?\\s*left\\s*)/,/^(?:,?\\s*x\\s*)/,/^(?:,?\\s*y\\s*)/,/^(?:,?\\s*up\\s*)/,/^(?:,?\\s*down\\s*)/,/^(?:\\)\\s*)/,/^(?:\\s*[xo<]?--+[-xo>]\\s*)/,/^(?:\\s*[xo<]?==+[=xo>]\\s*)/,/^(?:\\s*[xo<]?-?\\.+-[xo>]?\\s*)/,/^(?:\\s*~~[\\~]+\\s*)/,/^(?:\\s*[xo<]?--\\s*)/,/^(?:\\s*[xo<]?==\\s*)/,/^(?:\\s*[xo<]?-\\.\\s*)/,/^(?:[\"][`])/,/^(?:[\"])/,/^(?:\\s*[xo<]?--+[-xo>]\\s*)/,/^(?:\\s*[xo<]?==+[=xo>]\\s*)/,/^(?:\\s*[xo<]?-?\\.+-[xo>]?\\s*)/,/^(?::\\d+)/],\nconditions: {\"STYLE_DEFINITION\":{\"rules\":[28],\"inclusive\":false},\"STYLE_STMNT\":{\"rules\":[27],\"inclusive\":false},\"CLASSDEFID\":{\"rules\":[22],\"inclusive\":false},\"CLASSDEF\":{\"rules\":[20,21],\"inclusive\":false},\"CLASS_STYLE\":{\"rules\":[25],\"inclusive\":false},\"CLASS\":{\"rules\":[24],\"inclusive\":false},\"LLABEL\":{\"rules\":[99,100,101,102,103],\"inclusive\":false},\"ARROW_DIR\":{\"rules\":[85,86,87,88,89,90,91],\"inclusive\":false},\"BLOCK_ARROW\":{\"rules\":[76,81,84],\"inclusive\":false},\"NODE\":{\"rules\":[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,77,80],\"inclusive\":false},\"md_string\":{\"rules\":[9,10,78,79],\"inclusive\":false},\"space\":{\"rules\":[],\"inclusive\":false},\"string\":{\"rules\":[12,13,82,83],\"inclusive\":false},\"acc_descr_multiline\":{\"rules\":[34,35],\"inclusive\":false},\"acc_descr\":{\"rules\":[32],\"inclusive\":false},\"acc_title\":{\"rules\":[30],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,11,14,15,16,17,18,19,23,26,29,31,33,36,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,92,93,94,95,96,97,98,104],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import clone from 'lodash-es/clone.js';\nimport * as configApi from '../../config.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport type { DiagramDB } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport common from '../common/common.js';\nimport { clear as commonClear } from '../common/commonDb.js';\nimport type { Block, ClassDef } from './blockTypes.js';\n\n// Initialize the node database for simple lookups\nlet blockDatabase = new Map();\nlet edgeList: Block[] = [];\nlet edgeCount = new Map();\n\nconst COLOR_KEYWORD = 'color';\nconst FILL_KEYWORD = 'fill';\nconst BG_FILL = 'bgFill';\nconst STYLECLASS_SEP = ',';\nconst config = getConfig();\n\nlet classes = new Map();\n\nconst sanitizeText = (txt: string) => common.sanitizeText(txt, config);\n\n/**\n * Called when the parser comes across a (style) class definition\n * @example classDef my-style fill:#f96;\n *\n * @param id - the id of this (style) class\n * @param styleAttributes - the string with 1 or more style attributes (each separated by a comma)\n */\nexport const addStyleClass = function (id: string, styleAttributes = '') {\n // create a new style class object with this id\n let foundClass = classes.get(id);\n if (!foundClass) {\n foundClass = { id: id, styles: [], textStyles: [] };\n classes.set(id, foundClass); // This is a classDef\n }\n if (styleAttributes !== undefined && styleAttributes !== null) {\n styleAttributes.split(STYLECLASS_SEP).forEach((attrib) => {\n // remove any trailing ;\n const fixedAttrib = attrib.replace(/([^;]*);/, '$1').trim();\n\n // replace some style keywords\n if (RegExp(COLOR_KEYWORD).exec(attrib)) {\n const newStyle1 = fixedAttrib.replace(FILL_KEYWORD, BG_FILL);\n const newStyle2 = newStyle1.replace(COLOR_KEYWORD, FILL_KEYWORD);\n foundClass.textStyles.push(newStyle2);\n }\n foundClass.styles.push(fixedAttrib);\n });\n }\n};\n\n/**\n * Called when the parser comes across a style definition\n * @example style my-block-id fill:#f96;\n *\n * @param id - the id of the block to style\n * @param styles - the string with 1 or more style attributes (each separated by a comma)\n */\nexport const addStyle2Node = function (id: string, styles = '') {\n const foundBlock = blockDatabase.get(id)!;\n if (styles !== undefined && styles !== null) {\n foundBlock.styles = styles.split(STYLECLASS_SEP);\n }\n};\n\n/**\n * Add a CSS/style class to the block with the given id.\n * If the block isn't already in the list of known blocks, add it.\n * Might be called by parser when a CSS/style class should be applied to a block\n *\n * @param itemIds - The id or a list of ids of the item(s) to apply the css class to\n * @param cssClassName - CSS class name\n */\nexport const setCssClass = function (itemIds: string, cssClassName: string) {\n itemIds.split(',').forEach(function (id: string) {\n let foundBlock = blockDatabase.get(id);\n if (foundBlock === undefined) {\n const trimmedId = id.trim();\n foundBlock = { id: trimmedId, type: 'na', children: [] } as Block;\n blockDatabase.set(trimmedId, foundBlock);\n }\n if (!foundBlock.classes) {\n foundBlock.classes = [];\n }\n foundBlock.classes.push(cssClassName);\n });\n};\n\nconst populateBlockDatabase = (_blockList: Block[], parent: Block): void => {\n const blockList = _blockList.flat();\n const children = [];\n const columnSettingBlock = blockList.find((b) => b?.type === 'column-setting');\n const column = columnSettingBlock?.columns ?? -1;\n for (const block of blockList) {\n if (\n typeof column === 'number' &&\n column > 0 &&\n block.type !== 'column-setting' &&\n typeof block.widthInColumns === 'number' &&\n block.widthInColumns > column\n ) {\n log.warn(\n `Block ${block.id} width ${block.widthInColumns} exceeds configured column width ${column}`\n );\n }\n if (block.label) {\n block.label = sanitizeText(block.label);\n }\n if (block.type === 'classDef') {\n addStyleClass(block.id, block.css);\n continue;\n }\n if (block.type === 'applyClass') {\n setCssClass(block.id, block?.styleClass ?? '');\n continue;\n }\n if (block.type === 'applyStyles') {\n if (block?.stylesStr) {\n addStyle2Node(block.id, block?.stylesStr);\n }\n continue;\n }\n if (block.type === 'column-setting') {\n parent.columns = block.columns ?? -1;\n } else if (block.type === 'edge') {\n const count = (edgeCount.get(block.id) ?? 0) + 1;\n edgeCount.set(block.id, count);\n block.id = count + '-' + block.id;\n edgeList.push(block);\n } else {\n if (!block.label) {\n if (block.type === 'composite') {\n block.label = '';\n // log.debug('abc89 composite', block);\n } else {\n block.label = block.id;\n }\n }\n const existingBlock = blockDatabase.get(block.id);\n\n if (existingBlock === undefined) {\n blockDatabase.set(block.id, block);\n } else {\n // Add newer relevant data to aggregated node\n if (block.type !== 'na') {\n existingBlock.type = block.type;\n }\n if (block.label !== block.id) {\n existingBlock.label = block.label;\n }\n }\n\n if (block.children) {\n populateBlockDatabase(block.children, block);\n }\n if (block.type === 'space') {\n // log.debug('abc95 space', block);\n const w = block.width ?? 1;\n for (let j = 0; j < w; j++) {\n const newBlock = clone(block);\n newBlock.id = newBlock.id + '-' + j;\n blockDatabase.set(newBlock.id, newBlock);\n children.push(newBlock);\n }\n } else if (existingBlock === undefined) {\n children.push(block);\n }\n }\n }\n parent.children = children;\n};\n\nlet blocks: Block[] = [];\nlet rootBlock = { id: 'root', type: 'composite', children: [], columns: -1 } as Block;\n\nconst clear = (): void => {\n log.debug('Clear called');\n commonClear();\n rootBlock = { id: 'root', type: 'composite', children: [], columns: -1 } as Block;\n blockDatabase = new Map([['root', rootBlock]]);\n blocks = [];\n classes = new Map();\n\n edgeList = [];\n edgeCount = new Map();\n};\n\nexport function typeStr2Type(typeStr: string) {\n log.debug('typeStr2Type', typeStr);\n switch (typeStr) {\n case '[]':\n return 'square';\n case '()':\n log.debug('we have a round');\n return 'round';\n case '(())':\n return 'circle';\n case '>]':\n return 'rect_left_inv_arrow';\n case '{}':\n return 'diamond';\n case '{{}}':\n return 'hexagon';\n case '([])':\n return 'stadium';\n case '[[]]':\n return 'subroutine';\n case '[()]':\n return 'cylinder';\n case '((()))':\n return 'doublecircle';\n case '[//]':\n return 'lean_right';\n case '[\\\\\\\\]':\n return 'lean_left';\n case '[/\\\\]':\n return 'trapezoid';\n case '[\\\\/]':\n return 'inv_trapezoid';\n case '<[]>':\n return 'block_arrow';\n default:\n return 'na';\n }\n}\n\nexport function edgeTypeStr2Type(typeStr: string): string {\n log.debug('typeStr2Type', typeStr);\n switch (typeStr) {\n case '==':\n return 'thick';\n default:\n return 'normal';\n }\n}\n\nexport function edgeStrToEdgeData(typeStr: string): string {\n switch (typeStr.replace(/^[\\s-]+|[\\s-]+$/g, '')) {\n case 'x':\n return 'arrow_cross';\n case 'o':\n return 'arrow_circle';\n case '>':\n return 'arrow_point';\n default:\n return '';\n }\n}\n\nlet cnt = 0;\nexport const generateId = () => {\n cnt++;\n return 'id-' + Math.random().toString(36).substr(2, 12) + '-' + cnt;\n};\n\nconst setHierarchy = (block: Block[]): void => {\n rootBlock.children = block;\n populateBlockDatabase(block, rootBlock);\n blocks = rootBlock.children;\n};\n\nconst getColumns = (blockId: string): number => {\n const block = blockDatabase.get(blockId);\n if (!block) {\n return -1;\n }\n if (block.columns) {\n return block.columns;\n }\n if (!block.children) {\n return -1;\n }\n return block.children.length;\n};\n\n/**\n * Returns all the blocks as a flat array\n * @returns\n */\nconst getBlocksFlat = () => {\n return [...blockDatabase.values()];\n};\n/**\n * Returns the hierarchy of blocks\n * @returns\n */\nconst getBlocks = () => {\n return blocks || [];\n};\n\nconst getEdges = () => {\n return edgeList;\n};\nconst getBlock = (id: string) => {\n return blockDatabase.get(id);\n};\n\nconst setBlock = (block: Block) => {\n blockDatabase.set(block.id, block);\n};\n\nconst getLogger = () => log;\n\n/**\n * Return all of the style classes\n */\nexport const getClasses = function () {\n return classes;\n};\n\nconst db = {\n getConfig: () => configApi.getConfig().block,\n typeStr2Type: typeStr2Type,\n edgeTypeStr2Type: edgeTypeStr2Type,\n edgeStrToEdgeData,\n getLogger,\n getBlocksFlat,\n getBlocks,\n getEdges,\n setHierarchy,\n getBlock,\n setBlock,\n getColumns,\n getClasses,\n clear,\n generateId,\n} as const;\n\nexport type BlockDB = typeof db & DiagramDB;\nexport default db;\n", "import * as khroma from 'khroma';\nimport { getIconStyles } from '../globalStyles.js';\n\n/** Returns the styles given options */\nexport interface BlockChartStyleOptions {\n arrowheadColor: string;\n border2: string;\n clusterBkg: string;\n clusterBorder: string;\n edgeLabelBackground: string;\n fontFamily: string;\n lineColor: string;\n mainBkg: string;\n nodeBorder: string;\n nodeTextColor: string;\n tertiaryColor: string;\n textColor: string;\n titleColor: string;\n}\n\nconst fade = (color: string, opacity: number) => {\n // @ts-ignore TODO: incorrect types from khroma\n const channel = khroma.channel;\n\n const r = channel(color, 'r');\n const g = channel(color, 'g');\n const b = channel(color, 'b');\n\n // @ts-ignore incorrect types from khroma\n return khroma.rgba(r, g, b, opacity);\n};\n\nconst getStyles = (options: BlockChartStyleOptions) =>\n `.label {\n font-family: ${options.fontFamily};\n color: ${options.nodeTextColor || options.textColor};\n }\n .cluster-label text {\n fill: ${options.titleColor};\n }\n .cluster-label span,p {\n color: ${options.titleColor};\n }\n\n\n\n .label text,span,p {\n fill: ${options.nodeTextColor || options.textColor};\n color: ${options.nodeTextColor || options.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n }\n .flowchart-label text {\n text-anchor: middle;\n }\n // .flowchart-label .text-outer-tspan {\n // text-anchor: middle;\n // }\n // .flowchart-label .text-inner-tspan {\n // text-anchor: start;\n // }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${options.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${options.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${options.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${options.edgeLabelBackground};\n rect {\n opacity: 0.5;\n background-color: ${options.edgeLabelBackground};\n fill: ${options.edgeLabelBackground};\n }\n text-align: center;\n }\n\n /* For html labels only */\n .labelBkg {\n background-color: ${fade(options.edgeLabelBackground, 0.5)};\n // background-color:\n }\n\n .node .cluster {\n // fill: ${fade(options.mainBkg, 0.5)};\n fill: ${fade(options.clusterBkg, 0.5)};\n stroke: ${fade(options.clusterBorder, 0.2)};\n box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px;\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${options.titleColor};\n }\n\n .cluster span,p {\n color: ${options.titleColor};\n }\n /* .cluster div {\n color: ${options.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${options.fontFamily};\n font-size: 12px;\n background: ${options.tertiaryColor};\n border: 1px solid ${options.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .flowchartTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${options.textColor};\n }\n ${getIconStyles()}\n`;\n\nexport default getStyles;\n", "import { select as d3select } from 'd3';\nimport type { Diagram } from '../../Diagram.js';\nimport * as configApi from '../../config.js';\nimport insertMarkers from '../../dagre-wrapper/markers.js';\nimport { log } from '../../logger.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\nimport type { BlockDB } from './blockDB.js';\nimport { layout } from './layout.js';\nimport { calculateBlockSizes, insertBlocks, insertEdges } from './renderHelpers.js';\n\nexport const getClasses = function (text: any, diagObj: any) {\n return diagObj.db.getClasses();\n};\n\nexport const draw = async function (\n text: string,\n id: string,\n _version: string,\n diagObj: Diagram\n): Promise {\n const { securityLevel, block: conf } = configApi.getConfig();\n const db = diagObj.db as BlockDB;\n let sandboxElement: any;\n if (securityLevel === 'sandbox') {\n sandboxElement = d3select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? d3select(sandboxElement.nodes()[0].contentDocument.body)\n : d3select('body');\n\n const svg =\n securityLevel === 'sandbox'\n ? root.select(`[id=\"${id}\"]`)\n : d3select(`[id=\"${id}\"]`);\n\n // Define the supported markers for the diagram\n const markers = ['point', 'circle', 'cross'];\n\n // Add the marker definitions to the svg as marker tags\n insertMarkers(svg, markers, diagObj.type, id);\n\n const bl = db.getBlocks();\n const blArr = db.getBlocksFlat();\n const edges = db.getEdges();\n\n const nodes = svg.insert('g').attr('class', 'block');\n await calculateBlockSizes(nodes, bl, db);\n const bounds = layout(db);\n await insertBlocks(nodes, bl, db);\n await insertEdges(nodes, edges, blArr, db, id);\n\n // Establish svg dimensions and get width and height\n // Why, oh why ????\n if (bounds) {\n const bounds2 = bounds;\n const magicFactor = Math.max(1, Math.round(0.125 * (bounds2.width / bounds2.height)));\n const height = bounds2.height + magicFactor + 10;\n const width = bounds2.width + 10;\n const { useMaxWidth } = conf!;\n configureSvgSize(svg, height, width, !!useMaxWidth);\n log.debug('Here Bounds', bounds, bounds2);\n svg.attr(\n 'viewBox',\n `${bounds2.x - 5} ${bounds2.y - 5} ${bounds2.width + 10} ${bounds2.height + 10}`\n );\n }\n};\n\nexport default {\n draw,\n getClasses,\n};\n", "/** Setup arrow head and define the marker. The result is appended to the svg. */\n\nimport { log } from '../logger.js';\n\n// Only add the number of markers that the diagram needs\nconst insertMarkers = (elem, markerArray, type, id) => {\n markerArray.forEach((markerName) => {\n markers[markerName](elem, type, id);\n });\n};\n\nconst extension = (elem, type, id) => {\n log.trace('Making markers for ', id);\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-extensionStart')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,7 L18,13 V 1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-extensionEnd')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead\n};\n\nconst composition = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-compositionStart')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-compositionEnd')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst aggregation = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-aggregationStart')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-aggregationEnd')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst dependency = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-dependencyStart')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 6)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-dependencyEnd')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 13)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\nconst lollipop = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-lollipopStart')\n .attr('class', 'marker lollipop ' + type)\n .attr('refX', 13)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('circle')\n .attr('stroke', 'black')\n .attr('fill', 'transparent')\n .attr('cx', 7)\n .attr('cy', 7)\n .attr('r', 6);\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-lollipopEnd')\n .attr('class', 'marker lollipop ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('circle')\n .attr('stroke', 'black')\n .attr('fill', 'transparent')\n .attr('cx', 7)\n .attr('cy', 7)\n .attr('r', 6);\n};\nconst point = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-pointEnd')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 6)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 0 L 10 5 L 0 10 z')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-pointStart')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 4.5)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 5 L 10 10 L 10 0 z')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n};\nconst circle = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-circleEnd')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 11)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-circleStart')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', -1)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n};\nconst cross = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-crossEnd')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 11 11')\n .attr('refX', 12)\n .attr('refY', 5.2)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('path')\n // .attr('stroke', 'black')\n .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '1,0');\n\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-crossStart')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 11 11')\n .attr('refX', -1)\n .attr('refY', 5.2)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('path')\n // .attr('stroke', 'black')\n .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '1,0');\n};\nconst barb = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-barbEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 14)\n .attr('markerUnits', 'strokeWidth')\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');\n};\n\n// TODO rename the class diagram markers to something shape descriptive and semantic free\nconst markers = {\n extension,\n composition,\n aggregation,\n dependency,\n lollipop,\n point,\n circle,\n cross,\n barb,\n};\nexport default insertMarkers;\n", "import type { BlockDB } from './blockDB.js';\nimport type { Block } from './blockTypes.js';\nimport { log } from '../../logger.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\n// TODO: This means the number we provide in diagram's config will never be used. Should fix.\nconst padding = getConfig()?.block?.padding ?? 8;\n\ninterface BlockPosition {\n px: number;\n py: number;\n}\n\nexport function calculateBlockPosition(columns: number, position: number): BlockPosition {\n // log.debug('calculateBlockPosition abc89', columns, position);\n // Ensure that columns is a positive integer\n if (columns === 0 || !Number.isInteger(columns)) {\n throw new Error('Columns must be an integer !== 0.');\n }\n\n // Ensure that position is a non-negative integer\n if (position < 0 || !Number.isInteger(position)) {\n throw new Error('Position must be a non-negative integer.' + position);\n }\n\n if (columns < 0) {\n // Auto columns is set\n return { px: position, py: 0 };\n }\n if (columns === 1) {\n // Auto columns is set\n return { px: 0, py: position };\n }\n // Calculate posX and posY\n const px = position % columns;\n const py = Math.floor(position / columns);\n // log.debug('calculateBlockPosition abc89', columns, position, '=> (', px, py, ')');\n return { px, py };\n}\n\nconst getMaxChildSize = (block: Block) => {\n let maxWidth = 0;\n let maxHeight = 0;\n // find max width of children\n // log.debug('getMaxChildSize abc95 (start) parent:', block.id);\n for (const child of block.children) {\n const { width, height, x, y } = child.size ?? { width: 0, height: 0, x: 0, y: 0 };\n log.debug(\n 'getMaxChildSize abc95 child:',\n child.id,\n 'width:',\n width,\n 'height:',\n height,\n 'x:',\n x,\n 'y:',\n y,\n child.type\n );\n if (child.type === 'space') {\n continue;\n }\n if (width > maxWidth) {\n maxWidth = width / (block.widthInColumns ?? 1);\n }\n if (height > maxHeight) {\n maxHeight = height;\n }\n }\n return { width: maxWidth, height: maxHeight };\n};\n\nfunction setBlockSizes(block: Block, db: BlockDB, siblingWidth = 0, siblingHeight = 0) {\n log.debug(\n 'setBlockSizes abc95 (start)',\n block.id,\n block?.size?.x,\n 'block width =',\n block?.size,\n 'siblingWidth',\n siblingWidth\n );\n if (!block?.size?.width) {\n block.size = {\n width: siblingWidth,\n height: siblingHeight,\n x: 0,\n y: 0,\n };\n }\n let maxWidth = 0;\n let maxHeight = 0;\n\n if (block.children?.length > 0) {\n for (const child of block.children) {\n setBlockSizes(child, db);\n }\n // find max width of children\n const childSize = getMaxChildSize(block);\n maxWidth = childSize.width;\n maxHeight = childSize.height;\n log.debug('setBlockSizes abc95 maxWidth of', block.id, ':s children is ', maxWidth, maxHeight);\n\n // set width of block to max width of children\n for (const child of block.children) {\n if (child.size) {\n log.debug(\n `abc95 Setting size of children of ${block.id} id=${child.id} ${maxWidth} ${maxHeight} ${JSON.stringify(child.size)}`\n );\n child.size.width =\n maxWidth * (child.widthInColumns ?? 1) + padding * ((child.widthInColumns ?? 1) - 1);\n child.size.height = maxHeight;\n child.size.x = 0;\n child.size.y = 0;\n\n log.debug(\n `abc95 updating size of ${block.id} children child:${child.id} maxWidth:${maxWidth} maxHeight:${maxHeight}`\n );\n }\n }\n for (const child of block.children) {\n setBlockSizes(child, db, maxWidth, maxHeight);\n }\n\n const columns = block.columns ?? -1;\n let numItems = 0;\n for (const child of block.children) {\n numItems += child.widthInColumns ?? 1;\n }\n\n // The width and height in number blocks\n let xSize = block.children.length;\n if (columns > 0 && columns < numItems) {\n xSize = columns;\n }\n\n const ySize = Math.ceil(numItems / xSize);\n\n let width = xSize * (maxWidth + padding) + padding;\n let height = ySize * (maxHeight + padding) + padding;\n // If maxWidth\n if (width < siblingWidth) {\n log.debug(\n `Detected to small sibling: abc95 ${block.id} siblingWidth ${siblingWidth} siblingHeight ${siblingHeight} width ${width}`\n );\n width = siblingWidth;\n height = siblingHeight;\n const childWidth = (siblingWidth - xSize * padding - padding) / xSize;\n const childHeight = (siblingHeight - ySize * padding - padding) / ySize;\n // cspell:ignore indata\n log.debug('Size indata abc88', block.id, 'childWidth', childWidth, 'maxWidth', maxWidth);\n log.debug('Size indata abc88', block.id, 'childHeight', childHeight, 'maxHeight', maxHeight);\n log.debug('Size indata abc88 xSize', xSize, 'padding', padding);\n\n // set width of block to max width of children\n for (const child of block.children) {\n if (child.size) {\n child.size.width = childWidth;\n child.size.height = childHeight;\n child.size.x = 0;\n child.size.y = 0;\n }\n }\n }\n\n log.debug(\n `abc95 (finale calc) ${block.id} xSize ${xSize} ySize ${ySize} columns ${columns}${\n block.children.length\n } width=${Math.max(width, block.size?.width || 0)}`\n );\n if (width < (block?.size?.width || 0)) {\n width = block?.size?.width || 0;\n\n // Grow children to fit\n const num = columns > 0 ? Math.min(block.children.length, columns) : block.children.length;\n if (num > 0) {\n const childWidth = (width - num * padding - padding) / num;\n log.debug('abc95 (growing to fit) width', block.id, width, block.size?.width, childWidth);\n for (const child of block.children) {\n if (child.size) {\n child.size.width = childWidth;\n }\n }\n }\n }\n block.size = {\n width,\n height,\n x: 0,\n y: 0,\n };\n }\n\n log.debug(\n 'setBlockSizes abc94 (done)',\n block.id,\n block?.size?.x,\n block?.size?.width,\n block?.size?.y,\n block?.size?.height\n );\n}\n\nfunction layoutBlocks(block: Block, db: BlockDB) {\n log.debug(\n `abc85 layout blocks (=>layoutBlocks) ${block.id} x: ${block?.size?.x} y: ${block?.size?.y} width: ${block?.size?.width}`\n );\n const columns = block.columns ?? -1;\n log.debug('layoutBlocks columns abc95', block.id, '=>', columns, block);\n if (\n block.children && // find max width of children\n block.children.length > 0\n ) {\n const width = block?.children[0]?.size?.width ?? 0;\n const widthOfChildren = block.children.length * width + (block.children.length - 1) * padding;\n\n log.debug('widthOfChildren 88', widthOfChildren, 'posX');\n\n // let first = true;\n let columnPos = 0;\n log.debug('abc91 block?.size?.x', block.id, block?.size?.x);\n let startingPosX = block?.size?.x ? block?.size?.x + (-block?.size?.width / 2 || 0) : -padding;\n let rowPos = 0;\n for (const child of block.children) {\n const parent = block;\n\n if (!child.size) {\n continue;\n }\n const { width, height } = child.size;\n const { px, py } = calculateBlockPosition(columns, columnPos);\n if (py != rowPos) {\n rowPos = py;\n startingPosX = block?.size?.x ? block?.size?.x + (-block?.size?.width / 2 || 0) : -padding;\n log.debug('New row in layout for block', block.id, ' and child ', child.id, rowPos);\n }\n log.debug(\n `abc89 layout blocks (child) id: ${child.id} Pos: ${columnPos} (px, py) ${px},${py} (${parent?.size?.x},${parent?.size?.y}) parent: ${parent.id} width: ${width}${padding}`\n );\n if (parent.size) {\n const halfWidth = width / 2;\n child.size.x = startingPosX + padding + halfWidth;\n\n // cspell:ignore pyid\n log.debug(\n `abc91 layout blocks (calc) px, pyid:${\n child.id\n } startingPos=X${startingPosX} new startingPosX${\n child.size.x\n } ${halfWidth} padding=${padding} width=${width} halfWidth=${halfWidth} => x:${\n child.size.x\n } y:${child.size.y} ${child.widthInColumns} (width * (child?.w || 1)) / 2 ${\n (width * (child?.widthInColumns ?? 1)) / 2\n }`\n );\n\n startingPosX = child.size.x + halfWidth;\n\n child.size.y =\n parent.size.y - parent.size.height / 2 + py * (height + padding) + height / 2 + padding;\n\n log.debug(\n `abc88 layout blocks (calc) px, pyid:${\n child.id\n }startingPosX${startingPosX}${padding}${halfWidth}=>x:${child.size.x}y:${child.size.y}${\n child.widthInColumns\n }(width * (child?.w || 1)) / 2${(width * (child?.widthInColumns ?? 1)) / 2}`\n );\n }\n if (child.children) {\n layoutBlocks(child, db);\n }\n let columnsFilled = child?.widthInColumns ?? 1;\n if (columns > 0) {\n // Make sure overflowing lines do not affect later lines\n columnsFilled = Math.min(columnsFilled, columns - (columnPos % columns));\n }\n columnPos += columnsFilled;\n log.debug('abc88 columnsPos', child, columnPos);\n }\n }\n log.debug(\n `layout blocks (<==layoutBlocks) ${block.id} x: ${block?.size?.x} y: ${block?.size?.y} width: ${block?.size?.width}`\n );\n}\n\nfunction findBounds(\n block: Block,\n { minX, minY, maxX, maxY } = { minX: 0, minY: 0, maxX: 0, maxY: 0 }\n) {\n if (block.size && block.id !== 'root') {\n const { x, y, width, height } = block.size;\n if (x - width / 2 < minX) {\n minX = x - width / 2;\n }\n if (y - height / 2 < minY) {\n minY = y - height / 2;\n }\n if (x + width / 2 > maxX) {\n maxX = x + width / 2;\n }\n if (y + height / 2 > maxY) {\n maxY = y + height / 2;\n }\n }\n if (block.children) {\n for (const child of block.children) {\n ({ minX, minY, maxX, maxY } = findBounds(child, { minX, minY, maxX, maxY }));\n }\n }\n return { minX, minY, maxX, maxY };\n}\n\nexport function layout(db: BlockDB) {\n const root = db.getBlock('root');\n if (!root) {\n return;\n }\n\n setBlockSizes(root, db, 0, 0);\n layoutBlocks(root, db);\n // Position blocks relative to parents\n // positionBlock(root, root, db);\n log.debug('getBlocks', JSON.stringify(root, null, 2));\n\n const { minX, minY, maxX, maxY } = findBounds(root);\n\n const height = maxY - minY;\n const width = maxX - minX;\n return { x: minX, y: minY, width, height };\n}\n", "import * as graphlib from 'dagre-d3-es/src/graphlib/index.js';\nimport { getConfig } from '../../config.js';\nimport { insertEdge, insertEdgeLabel, positionEdgeLabel } from '../../dagre-wrapper/edges.js';\nimport { insertNode, positionNode } from '../../dagre-wrapper/nodes.js';\nimport { getStylesFromArray } from '../../utils.js';\nimport type { BlockDB } from './blockDB.js';\nimport type { Block } from './blockTypes.js';\n\nfunction getNodeFromBlock(block: Block, db: BlockDB, positioned = false) {\n const vertex = block;\n\n let classStr = 'default';\n if ((vertex?.classes?.length || 0) > 0) {\n classStr = (vertex?.classes ?? []).join(' ');\n }\n classStr = classStr + ' flowchart-label';\n\n // We create a SVG label, either by delegating to addHtmlLabel or manually\n let radius = 0;\n let shape = '';\n let padding;\n // Set the shape based parameters\n switch (vertex.type) {\n case 'round':\n radius = 5;\n shape = 'rect';\n break;\n case 'composite':\n radius = 0;\n shape = 'composite';\n padding = 0;\n break;\n case 'square':\n shape = 'rect';\n break;\n case 'diamond':\n shape = 'question';\n break;\n case 'hexagon':\n shape = 'hexagon';\n break;\n case 'block_arrow':\n shape = 'block_arrow';\n break;\n case 'odd':\n shape = 'rect_left_inv_arrow';\n break;\n case 'lean_right':\n shape = 'lean_right';\n break;\n case 'lean_left':\n shape = 'lean_left';\n break;\n case 'trapezoid':\n shape = 'trapezoid';\n break;\n case 'inv_trapezoid':\n shape = 'inv_trapezoid';\n break;\n case 'rect_left_inv_arrow':\n shape = 'rect_left_inv_arrow';\n break;\n case 'circle':\n shape = 'circle';\n break;\n case 'ellipse':\n shape = 'ellipse';\n break;\n case 'stadium':\n shape = 'stadium';\n break;\n case 'subroutine':\n shape = 'subroutine';\n break;\n case 'cylinder':\n shape = 'cylinder';\n break;\n case 'group':\n shape = 'rect';\n break;\n case 'doublecircle':\n shape = 'doublecircle';\n break;\n default:\n shape = 'rect';\n }\n\n const styles = getStylesFromArray(vertex?.styles ?? []);\n\n // Use vertex id as text in the box if no text is provided by the graph definition\n const vertexText = vertex.label;\n\n const bounds = vertex.size ?? { width: 0, height: 0, x: 0, y: 0 };\n // Add the node\n const node = {\n labelStyle: styles.labelStyle,\n shape: shape,\n labelText: vertexText,\n rx: radius,\n ry: radius,\n class: classStr,\n style: styles.style,\n id: vertex.id,\n directions: vertex.directions,\n width: bounds.width,\n height: bounds.height,\n x: bounds.x,\n y: bounds.y,\n positioned,\n intersect: undefined,\n type: vertex.type,\n padding: padding ?? getConfig()?.block?.padding ?? 0,\n };\n return node;\n}\nasync function calculateBlockSize(\n elem: d3.Selection,\n block: any,\n db: any\n) {\n const node = getNodeFromBlock(block, db, false);\n if (node.type === 'group') {\n return;\n }\n\n // Add the element to the DOM to size it\n const config = getConfig();\n const nodeEl = await insertNode(elem, node, { config });\n const boundingBox = nodeEl.node().getBBox();\n const obj = db.getBlock(node.id);\n obj.size = { width: boundingBox.width, height: boundingBox.height, x: 0, y: 0, node: nodeEl };\n db.setBlock(obj);\n nodeEl.remove();\n}\ntype ActionFun = typeof calculateBlockSize;\n\nexport async function insertBlockPositioned(elem: any, block: Block, db: any) {\n const node = getNodeFromBlock(block, db, true);\n // Add the element to the DOM to size it\n const obj = db.getBlock(node.id);\n if (obj.type !== 'space') {\n const config = getConfig();\n await insertNode(elem, node, { config });\n block.intersect = node?.intersect;\n positionNode(node);\n }\n}\n\nexport async function performOperations(\n elem: d3.Selection,\n blocks: Block[],\n db: BlockDB,\n operation: ActionFun\n) {\n for (const block of blocks) {\n await operation(elem, block, db);\n if (block.children) {\n await performOperations(elem, block.children, db, operation);\n }\n }\n}\n\nexport async function calculateBlockSizes(elem: any, blocks: Block[], db: BlockDB) {\n await performOperations(elem, blocks, db, calculateBlockSize);\n}\n\nexport async function insertBlocks(\n elem: d3.Selection,\n blocks: Block[],\n db: BlockDB\n) {\n await performOperations(elem, blocks, db, insertBlockPositioned);\n}\n\nexport async function insertEdges(\n elem: any,\n edges: Block[],\n blocks: Block[],\n db: BlockDB,\n id: string\n) {\n const g = new graphlib.Graph({\n multigraph: true,\n compound: true,\n });\n g.setGraph({\n rankdir: 'TB',\n nodesep: 10,\n ranksep: 10,\n marginx: 8,\n marginy: 8,\n });\n\n for (const block of blocks) {\n if (block.size) {\n g.setNode(block.id, {\n width: block.size.width,\n height: block.size.height,\n intersect: block.intersect,\n });\n }\n }\n\n for (const edge of edges) {\n // elem, e, edge, clusterDb, diagramType, graph;\n if (edge.start && edge.end) {\n const startBlock = db.getBlock(edge.start);\n const endBlock = db.getBlock(edge.end);\n\n if (startBlock?.size && endBlock?.size) {\n const start = startBlock.size;\n const end = endBlock.size;\n const points = [\n { x: start.x, y: start.y },\n { x: start.x + (end.x - start.x) / 2, y: start.y + (end.y - start.y) / 2 },\n { x: end.x, y: end.y },\n ];\n // edge.points = points;\n insertEdge(\n elem,\n { v: edge.start, w: edge.end, name: edge.id },\n {\n ...edge,\n arrowTypeEnd: edge.arrowTypeEnd,\n arrowTypeStart: edge.arrowTypeStart,\n points,\n classes: 'edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1',\n },\n undefined,\n 'block',\n g,\n id\n );\n if (edge.label) {\n await insertEdgeLabel(elem, {\n ...edge,\n label: edge.label,\n labelStyle: 'stroke: #333; stroke-width: 1.5px;fill:none;',\n arrowTypeEnd: edge.arrowTypeEnd,\n arrowTypeStart: edge.arrowTypeStart,\n points,\n classes: 'edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1',\n });\n positionEdgeLabel(\n { ...edge, x: points[1].x, y: points[1].y },\n {\n originalPath: points,\n }\n );\n }\n }\n }\n }\n}\n", "import { select } from 'd3';\nimport { getConfig } from '../diagram-api/diagramAPI.js';\nimport { evaluate, sanitizeText } from '../diagrams/common/common.js';\nimport { log } from '../logger.js';\nimport { replaceIconSubstring } from '../rendering-util/createText.js';\nimport { decodeEntities } from '../utils.js';\n\n/**\n * @param dom\n * @param styleFn\n */\nfunction applyStyle(dom, styleFn) {\n if (styleFn) {\n dom.attr('style', styleFn);\n }\n}\n\n/**\n * @param {any} node\n * @returns {SVGForeignObjectElement} Node\n */\nfunction addHtmlLabel(node, config) {\n const fo = select(document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject'));\n const div = fo.append('xhtml:div');\n\n const label = node.label;\n const labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel';\n const span = div.append('span');\n span.html(sanitizeText(label, config));\n applyStyle(span, node.labelStyle);\n span.attr('class', labelClass);\n\n applyStyle(div, node.labelStyle);\n div.style('display', 'inline-block');\n // Fix for firefox\n div.style('white-space', 'nowrap');\n div.attr('xmlns', 'http://www.w3.org/1999/xhtml');\n return fo.node();\n}\n/**\n * @param _vertexText\n * @param style\n * @param isTitle\n * @param isNode\n * @deprecated svg-util/createText instead\n */\nconst createLabel = async (_vertexText, style, isTitle, isNode) => {\n let vertexText = _vertexText || '';\n if (typeof vertexText === 'object') {\n vertexText = vertexText[0];\n }\n const config = getConfig();\n if (evaluate(config.flowchart.htmlLabels)) {\n // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?\n vertexText = vertexText.replace(/\\\\n|\\n/g, '
');\n log.debug('vertexText' + vertexText);\n const label = await replaceIconSubstring(decodeEntities(vertexText));\n const node = {\n isNode,\n label,\n labelStyle: style.replace('fill:', 'color:'),\n };\n let vertexNode = addHtmlLabel(node, config);\n // vertexNode.parentNode.removeChild(vertexNode);\n return vertexNode;\n } else {\n const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n svgLabel.setAttribute('style', style.replace('color:', 'fill:'));\n let rows = [];\n if (typeof vertexText === 'string') {\n rows = vertexText.split(/\\\\n|\\n|/gi);\n } else if (Array.isArray(vertexText)) {\n rows = vertexText;\n } else {\n rows = [];\n }\n\n for (const row of rows) {\n const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n tspan.setAttribute('dy', '1em');\n tspan.setAttribute('x', '0');\n if (isTitle) {\n tspan.setAttribute('class', 'title-row');\n } else {\n tspan.setAttribute('class', 'row');\n }\n tspan.textContent = row.trim();\n svgLabel.appendChild(tspan);\n }\n return svgLabel;\n }\n};\n\nexport default createLabel;\n", "import { log } from '../logger.js';\nimport createLabel from './createLabel.js';\nimport { createText } from '../rendering-util/createText.js';\nimport { line, curveBasis, select } from 'd3';\nimport { getConfig } from '../diagram-api/diagramAPI.js';\nimport utils from '../utils.js';\nimport { evaluate, getUrl } from '../diagrams/common/common.js';\nimport { getLineFunctionsWithOffset } from '../utils/lineWithOffset.js';\nimport { getSubGraphTitleMargins } from '../utils/subGraphTitleMargins.js';\nimport { addEdgeMarkers } from './edgeMarker.js';\n\nlet edgeLabels = {};\nlet terminalLabels = {};\n\nexport const clear = () => {\n edgeLabels = {};\n terminalLabels = {};\n};\n\nexport const insertEdgeLabel = async (elem, edge) => {\n const config = getConfig();\n const useHtmlLabels = evaluate(config.flowchart.htmlLabels);\n // Create the actual text element\n const labelElement =\n edge.labelType === 'markdown'\n ? createText(\n elem,\n edge.label,\n {\n style: edge.labelStyle,\n useHtmlLabels,\n addSvgBackground: true,\n },\n config\n )\n : await createLabel(edge.label, edge.labelStyle);\n\n // Create outer g, edgeLabel, this will be positioned after graph layout\n const edgeLabel = elem.insert('g').attr('class', 'edgeLabel');\n\n // Create inner g, label, this will be positioned now for centering the text\n const label = edgeLabel.insert('g').attr('class', 'label');\n label.node().appendChild(labelElement);\n\n // Center the label\n let bbox = labelElement.getBBox();\n if (useHtmlLabels) {\n const div = labelElement.children[0];\n const dv = select(labelElement);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n\n // Make element accessible by id for positioning\n edgeLabels[edge.id] = edgeLabel;\n\n // Update the abstract data of the edge with the new information about its width and height\n edge.width = bbox.width;\n edge.height = bbox.height;\n\n let fo;\n if (edge.startLabelLeft) {\n // Create the actual text element\n const startLabelElement = await createLabel(edge.startLabelLeft, edge.labelStyle);\n const startEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = startEdgeLabelLeft.insert('g').attr('class', 'inner');\n fo = inner.node().appendChild(startLabelElement);\n const slBox = startLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].startLeft = startEdgeLabelLeft;\n setTerminalWidth(fo, edge.startLabelLeft);\n }\n if (edge.startLabelRight) {\n // Create the actual text element\n const startLabelElement = await createLabel(edge.startLabelRight, edge.labelStyle);\n const startEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = startEdgeLabelRight.insert('g').attr('class', 'inner');\n fo = startEdgeLabelRight.node().appendChild(startLabelElement);\n inner.node().appendChild(startLabelElement);\n const slBox = startLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].startRight = startEdgeLabelRight;\n setTerminalWidth(fo, edge.startLabelRight);\n }\n if (edge.endLabelLeft) {\n // Create the actual text element\n const endLabelElement = await createLabel(edge.endLabelLeft, edge.labelStyle);\n const endEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = endEdgeLabelLeft.insert('g').attr('class', 'inner');\n fo = inner.node().appendChild(endLabelElement);\n const slBox = endLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n endEdgeLabelLeft.node().appendChild(endLabelElement);\n\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].endLeft = endEdgeLabelLeft;\n setTerminalWidth(fo, edge.endLabelLeft);\n }\n if (edge.endLabelRight) {\n // Create the actual text element\n const endLabelElement = await createLabel(edge.endLabelRight, edge.labelStyle);\n const endEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = endEdgeLabelRight.insert('g').attr('class', 'inner');\n\n fo = inner.node().appendChild(endLabelElement);\n const slBox = endLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n endEdgeLabelRight.node().appendChild(endLabelElement);\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].endRight = endEdgeLabelRight;\n setTerminalWidth(fo, edge.endLabelRight);\n }\n return labelElement;\n};\n\n/**\n * @param {any} fo\n * @param {any} value\n */\nfunction setTerminalWidth(fo, value) {\n if (getConfig().flowchart.htmlLabels && fo) {\n fo.style.width = value.length * 9 + 'px';\n fo.style.height = '12px';\n }\n}\n\nexport const positionEdgeLabel = (edge, paths) => {\n log.debug('Moving label abc88 ', edge.id, edge.label, edgeLabels[edge.id], paths);\n let path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\n const siteConfig = getConfig();\n const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig);\n if (edge.label) {\n const el = edgeLabels[edge.id];\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // // debugger;\n const pos = utils.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.updatedPath) {\n x = pos.x;\n y = pos.y;\n }\n }\n el.attr('transform', `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`);\n }\n\n //let path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\n if (edge.startLabelLeft) {\n const el = terminalLabels[edge.id].startLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.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[edge.id].startRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.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[edge.id].endLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.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[edge.id].endRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.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\nconst outsideNode = (node, point) => {\n const x = node.x;\n const y = node.y;\n const dx = Math.abs(point.x - x);\n const dy = Math.abs(point.y - y);\n const w = node.width / 2;\n const h = node.height / 2;\n if (dx >= w || dy >= h) {\n return true;\n }\n return false;\n};\n\nexport const intersection = (node, outsidePoint, insidePoint) => {\n log.debug(`intersection calc abc89:\n outsidePoint: ${JSON.stringify(outsidePoint)}\n insidePoint : ${JSON.stringify(insidePoint)}\n node : x:${node.x} y:${node.y} w:${node.width} h:${node.height}`);\n const x = node.x;\n const y = node.y;\n\n const dx = Math.abs(x - insidePoint.x);\n // const dy = Math.abs(y - insidePoint.y);\n const w = node.width / 2;\n let r = insidePoint.x < outsidePoint.x ? w - dx : w + dx;\n const h = node.height / 2;\n\n const Q = Math.abs(outsidePoint.y - insidePoint.y);\n const R = Math.abs(outsidePoint.x - insidePoint.x);\n\n if (Math.abs(y - outsidePoint.y) * w > Math.abs(x - outsidePoint.x) * h) {\n // Intersection is top or bottom of rect.\n let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y;\n r = (R * q) / Q;\n const res = {\n x: insidePoint.x < outsidePoint.x ? insidePoint.x + r : insidePoint.x - R + r,\n y: insidePoint.y < outsidePoint.y ? insidePoint.y + Q - q : insidePoint.y - Q + q,\n };\n\n if (r === 0) {\n res.x = outsidePoint.x;\n res.y = outsidePoint.y;\n }\n if (R === 0) {\n res.x = outsidePoint.x;\n }\n if (Q === 0) {\n res.y = outsidePoint.y;\n }\n\n log.debug(`abc89 topp/bott calc, Q ${Q}, q ${q}, R ${R}, r ${r}`, res); // cspell: disable-line\n\n return res;\n } else {\n // Intersection on sides of rect\n if (insidePoint.x < outsidePoint.x) {\n r = outsidePoint.x - w - x;\n } else {\n // r = outsidePoint.x - w - x;\n r = x - w - outsidePoint.x;\n }\n let q = (Q * r) / R;\n // OK let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x + dx - w;\n // OK let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : outsidePoint.x + r;\n let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x - R + r;\n // let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : outsidePoint.x + r;\n let _y = insidePoint.y < outsidePoint.y ? insidePoint.y + q : insidePoint.y - q;\n log.debug(`sides calc abc89, Q ${Q}, q ${q}, R ${R}, r ${r}`, { _x, _y });\n if (r === 0) {\n _x = outsidePoint.x;\n _y = outsidePoint.y;\n }\n if (R === 0) {\n _x = outsidePoint.x;\n }\n if (Q === 0) {\n _y = outsidePoint.y;\n }\n\n return { x: _x, y: _y };\n }\n};\n/**\n * This function will page a path and node where the last point(s) in the path is inside the node\n * and return an update path ending by the border of the node.\n *\n * @param {Array} _points\n * @param {any} boundaryNode\n * @returns {Array} Points\n */\nconst cutPathAtIntersect = (_points, boundaryNode) => {\n log.debug('abc88 cutPathAtIntersect', _points, boundaryNode);\n let points = [];\n let lastPointOutside = _points[0];\n let isInside = false;\n _points.forEach((point) => {\n // check if point is inside the boundary rect\n if (!outsideNode(boundaryNode, point) && !isInside) {\n // First point inside the rect found\n // Calc the intersection coord between the point and the last point outside the rect\n const inter = intersection(boundaryNode, lastPointOutside, point);\n\n // // Check case where the intersection is the same as the last point\n let pointPresent = false;\n points.forEach((p) => {\n pointPresent = pointPresent || (p.x === inter.x && p.y === inter.y);\n });\n // // if (!pointPresent) {\n if (!points.some((e) => e.x === inter.x && e.y === inter.y)) {\n points.push(inter);\n }\n\n isInside = true;\n } else {\n // Outside\n lastPointOutside = point;\n // points.push(point);\n if (!isInside) {\n points.push(point);\n }\n }\n });\n return points;\n};\n\nexport const insertEdge = function (elem, e, edge, clusterDb, diagramType, graph, id) {\n let points = edge.points;\n log.debug('abc88 InsertEdge: edge=', edge, 'e=', e);\n let pointsHasChanged = false;\n const tail = graph.node(e.v);\n var head = graph.node(e.w);\n\n if (head?.intersect && tail?.intersect) {\n points = points.slice(1, edge.points.length - 1);\n points.unshift(tail.intersect(points[0]));\n points.push(head.intersect(points[points.length - 1]));\n }\n\n if (edge.toCluster) {\n log.debug('to cluster abc88', clusterDb[edge.toCluster]);\n points = cutPathAtIntersect(edge.points, clusterDb[edge.toCluster].node);\n\n pointsHasChanged = true;\n }\n\n if (edge.fromCluster) {\n log.debug('from cluster abc88', clusterDb[edge.fromCluster]);\n points = cutPathAtIntersect(points.reverse(), clusterDb[edge.fromCluster].node).reverse();\n\n pointsHasChanged = true;\n }\n\n // The data for our line\n const lineData = points.filter((p) => !Number.isNaN(p.y));\n\n // This is the accessor function we talked about above\n let curve = curveBasis;\n // Currently only flowcharts get the curve from the settings, perhaps this should\n // be expanded to a common setting? Restricting it for now in order not to cause side-effects that\n // have not been thought through\n if (edge.curve && (diagramType === 'graph' || diagramType === 'flowchart')) {\n curve = edge.curve;\n }\n\n const { x, y } = getLineFunctionsWithOffset(edge);\n const lineFunction = line().x(x).y(y).curve(curve);\n\n // Construct stroke classes based on properties\n let strokeClasses;\n switch (edge.thickness) {\n case 'normal':\n strokeClasses = 'edge-thickness-normal';\n break;\n case 'thick':\n strokeClasses = 'edge-thickness-thick';\n break;\n case 'invisible':\n strokeClasses = 'edge-thickness-thick';\n break;\n default:\n strokeClasses = '';\n }\n switch (edge.pattern) {\n case 'solid':\n strokeClasses += ' edge-pattern-solid';\n break;\n case 'dotted':\n strokeClasses += ' edge-pattern-dotted';\n break;\n case 'dashed':\n strokeClasses += ' edge-pattern-dashed';\n break;\n }\n\n const svgPath = elem\n .append('path')\n .attr('d', lineFunction(lineData))\n .attr('id', edge.id)\n .attr('class', ' ' + strokeClasses + (edge.classes ? ' ' + edge.classes : ''))\n .attr('style', edge.style);\n\n // DEBUG code, adds a red circle at each edge coordinate\n // edge.points.forEach((point) => {\n // elem\n // .append('circle')\n // .style('stroke', 'red')\n // .style('fill', 'red')\n // .attr('r', 1)\n // .attr('cx', point.x)\n // .attr('cy', point.y);\n // });\n\n let url = '';\n // // TODO: Can we load this config only from the rendered graph type?\n if (getConfig().flowchart.arrowMarkerAbsolute || getConfig().state.arrowMarkerAbsolute) {\n url = getUrl(true);\n }\n\n addEdgeMarkers(svgPath, edge, url, id, diagramType);\n\n let paths = {};\n if (pointsHasChanged) {\n paths.updatedPath = points;\n }\n paths.originalPath = edge.points;\n return paths;\n};\n", "import type { SVG } from '../diagram-api/types.js';\nimport { log } from '../logger.js';\nimport type { EdgeData } from '../types.js';\n/**\n * Adds SVG markers to a path element based on the arrow types specified in the edge.\n *\n * @param svgPath - The SVG path element to add markers to.\n * @param edge - The edge data object containing the arrow types.\n * @param url - The URL of the SVG marker definitions.\n * @param id - The ID prefix for the SVG marker definitions.\n * @param diagramType - The type of diagram being rendered.\n */\nexport const addEdgeMarkers = (\n svgPath: SVG,\n edge: Pick,\n url: string,\n id: string,\n diagramType: string\n) => {\n if (edge.arrowTypeStart) {\n addEdgeMarker(svgPath, 'start', edge.arrowTypeStart, url, id, diagramType);\n }\n if (edge.arrowTypeEnd) {\n addEdgeMarker(svgPath, 'end', edge.arrowTypeEnd, url, id, diagramType);\n }\n};\n\nconst arrowTypesMap = {\n arrow_cross: 'cross',\n arrow_point: 'point',\n arrow_barb: 'barb',\n arrow_circle: 'circle',\n aggregation: 'aggregation',\n extension: 'extension',\n composition: 'composition',\n dependency: 'dependency',\n lollipop: 'lollipop',\n} as const;\n\nconst addEdgeMarker = (\n svgPath: SVG,\n position: 'start' | 'end',\n arrowType: string,\n url: string,\n id: string,\n diagramType: string\n) => {\n const endMarkerType = arrowTypesMap[arrowType as keyof typeof arrowTypesMap];\n\n if (!endMarkerType) {\n log.warn(`Unknown arrow type: ${arrowType}`);\n return; // unknown arrow type, ignore\n }\n\n const suffix = position === 'start' ? 'Start' : 'End';\n svgPath.attr(`marker-${position}`, `url(${url}#${id}_${diagramType}-${endMarkerType}${suffix})`);\n};\n", "import { select } from 'd3';\nimport { getConfig } from '../diagram-api/diagramAPI.js';\nimport { evaluate } from '../diagrams/common/common.js';\nimport { log } from '../logger.js';\nimport { getArrowPoints } from './blockArrowHelper.js';\nimport createLabel from './createLabel.js';\nimport intersect from './intersect/index.js';\nimport note from './shapes/note.js';\nimport { insertPolygonShape, labelHelper, updateNodeBounds } from './shapes/util.js';\n\nconst formatClass = (str) => {\n if (str) {\n return ' ' + str;\n }\n return '';\n};\nconst getClassesFromNode = (node, otherClasses) => {\n return `${otherClasses ? otherClasses : 'node default'}${formatClass(node.classes)} ${formatClass(\n node.class\n )}`;\n};\n\nconst question = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const s = w + h;\n\n const points = [\n { x: s / 2, y: 0 },\n { x: s, y: -s / 2 },\n { x: s / 2, y: -s },\n { x: 0, y: -s / 2 },\n ];\n\n log.info('Question main (Circle)');\n\n const questionElem = insertPolygonShape(shapeSvg, s, s, points);\n questionElem.attr('style', node.style);\n updateNodeBounds(node, questionElem);\n\n node.intersect = function (point) {\n log.warn('Intersect called');\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst choice = (parent, node) => {\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n\n const s = 28;\n const points = [\n { x: 0, y: s / 2 },\n { x: s / 2, y: 0 },\n { x: 0, y: -s / 2 },\n { x: -s / 2, y: 0 },\n ];\n\n const choice = shapeSvg.insert('polygon', ':first-child').attr(\n 'points',\n points\n .map(function (d) {\n return d.x + ',' + d.y;\n })\n .join(' ')\n );\n // center the circle around its coordinate\n choice.attr('class', 'state-start').attr('r', 7).attr('width', 28).attr('height', 28);\n node.width = 28;\n node.height = 28;\n\n node.intersect = function (point) {\n return intersect.circle(node, 14, point);\n };\n\n return shapeSvg;\n};\n\nconst hexagon = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const f = 4;\n const h = bbox.height + node.padding;\n const m = h / f;\n const w = bbox.width + 2 * m + node.padding;\n const points = [\n { x: m, y: 0 },\n { x: w - m, y: 0 },\n { x: w, y: -h / 2 },\n { x: w - m, y: -h },\n { x: m, y: -h },\n { x: 0, y: -h / 2 },\n ];\n\n const hex = insertPolygonShape(shapeSvg, w, h, points);\n hex.attr('style', node.style);\n updateNodeBounds(node, hex);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst block_arrow = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(parent, node, undefined, true);\n\n const f = 2;\n const h = bbox.height + 2 * node.padding;\n const m = h / f;\n const w = bbox.width + 2 * m + node.padding;\n\n const points = getArrowPoints(node.directions, bbox, node);\n\n const blockArrow = insertPolygonShape(shapeSvg, w, h, points);\n blockArrow.attr('style', node.style);\n updateNodeBounds(node, blockArrow);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst rect_left_inv_arrow = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: -h / 2, y: 0 },\n { x: w, y: 0 },\n { x: w, y: -h },\n { x: -h / 2, y: -h },\n { x: 0, y: -h / 2 },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n\n node.width = w + h;\n node.height = h;\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst lean_right = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(parent, node, getClassesFromNode(node), true);\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: (-2 * h) / 6, y: 0 },\n { x: w - h / 6, y: 0 },\n { x: w + (2 * h) / 6, y: -h },\n { x: h / 6, y: -h },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst lean_left = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: (2 * h) / 6, y: 0 },\n { x: w + h / 6, y: 0 },\n { x: w - (2 * h) / 6, y: -h },\n { x: -h / 6, y: -h },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst trapezoid = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: (-2 * h) / 6, y: 0 },\n { x: w + (2 * h) / 6, y: 0 },\n { x: w - h / 6, y: -h },\n { x: h / 6, y: -h },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst inv_trapezoid = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: h / 6, y: 0 },\n { x: w - h / 6, y: 0 },\n { x: w + (2 * h) / 6, y: -h },\n { x: (-2 * h) / 6, y: -h },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst rect_right_inv_arrow = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: 0, y: 0 },\n { x: w + h / 2, y: 0 },\n { x: w, y: -h / 2 },\n { x: w + h / 2, y: -h },\n { x: 0, y: -h },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst cylinder = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const rx = w / 2;\n const ry = rx / (2.5 + w / 50);\n const h = bbox.height + ry + node.padding;\n\n const shape =\n 'M 0,' +\n ry +\n ' a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n w +\n ' 0 a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n -w +\n ' 0 l 0,' +\n h +\n ' a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n w +\n ' 0 l 0,' +\n -h;\n\n const el = shapeSvg\n .attr('label-offset-y', ry)\n .insert('path', ':first-child')\n .attr('style', node.style)\n .attr('d', shape)\n .attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2 + ry) + ')');\n\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n const pos = intersect.rect(node, point);\n const x = pos.x - node.x;\n\n if (\n rx != 0 &&\n (Math.abs(x) < node.width / 2 ||\n (Math.abs(x) == node.width / 2 && Math.abs(pos.y - node.y) > node.height / 2 - ry))\n ) {\n // ellipsis equation: x*x / a*a + y*y / b*b = 1\n // solve for y to get adjusted value for pos.y\n let y = ry * ry * (1 - (x * x) / (rx * rx));\n if (y != 0) {\n y = Math.sqrt(y);\n }\n y = ry - y;\n if (point.y - node.y > 0) {\n y = -y;\n }\n\n pos.y += y;\n }\n\n return pos;\n };\n\n return shapeSvg;\n};\n\nconst rect = async (parent, node) => {\n const { shapeSvg, bbox, halfPadding } = await labelHelper(\n parent,\n node,\n 'node ' + node.classes + ' ' + node.class,\n true\n );\n\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n // console.log('Rect node:', node, 'bbox:', bbox, 'halfPadding:', halfPadding, 'node.padding:', node.padding);\n // const totalWidth = bbox.width + node.padding * 2;\n // const totalHeight = bbox.height + node.padding * 2;\n const totalWidth = node.positioned ? node.width : bbox.width + node.padding;\n const totalHeight = node.positioned ? node.height : bbox.height + node.padding;\n const x = node.positioned ? -totalWidth / 2 : -bbox.width / 2 - halfPadding;\n const y = node.positioned ? -totalHeight / 2 : -bbox.height / 2 - halfPadding;\n rect\n .attr('class', 'basic label-container')\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', x)\n .attr('y', y)\n .attr('width', totalWidth)\n .attr('height', totalHeight);\n\n if (node.props) {\n const propKeys = new Set(Object.keys(node.props));\n if (node.props.borders) {\n applyNodePropertyBorders(rect, node.props.borders, totalWidth, totalHeight);\n propKeys.delete('borders');\n }\n propKeys.forEach((propKey) => {\n log.warn(`Unknown node property ${propKey}`);\n });\n }\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst composite = async (parent, node) => {\n const { shapeSvg, bbox, halfPadding } = await labelHelper(\n parent,\n node,\n 'node ' + node.classes,\n true\n );\n\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n // const totalWidth = bbox.width + node.padding * 2;\n // const totalHeight = bbox.height + node.padding * 2;\n const totalWidth = node.positioned ? node.width : bbox.width + node.padding;\n const totalHeight = node.positioned ? node.height : bbox.height + node.padding;\n const x = node.positioned ? -totalWidth / 2 : -bbox.width / 2 - halfPadding;\n const y = node.positioned ? -totalHeight / 2 : -bbox.height / 2 - halfPadding;\n rect\n .attr('class', 'basic cluster composite label-container')\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', x)\n .attr('y', y)\n .attr('width', totalWidth)\n .attr('height', totalHeight);\n\n if (node.props) {\n const propKeys = new Set(Object.keys(node.props));\n if (node.props.borders) {\n applyNodePropertyBorders(rect, node.props.borders, totalWidth, totalHeight);\n propKeys.delete('borders');\n }\n propKeys.forEach((propKey) => {\n log.warn(`Unknown node property ${propKey}`);\n });\n }\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst labelRect = async (parent, node) => {\n const { shapeSvg } = await labelHelper(parent, node, 'label', true);\n\n log.trace('Classes = ', node.class);\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n // Hide the rect we are only after the label\n const totalWidth = 0;\n const totalHeight = 0;\n rect.attr('width', totalWidth).attr('height', totalHeight);\n shapeSvg.attr('class', 'label edgeLabel');\n\n if (node.props) {\n const propKeys = new Set(Object.keys(node.props));\n if (node.props.borders) {\n applyNodePropertyBorders(rect, node.props.borders, totalWidth, totalHeight);\n propKeys.delete('borders');\n }\n propKeys.forEach((propKey) => {\n log.warn(`Unknown node property ${propKey}`);\n });\n }\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\n/**\n * @param rect\n * @param borders\n * @param totalWidth\n * @param totalHeight\n */\nfunction applyNodePropertyBorders(rect, borders, totalWidth, totalHeight) {\n const strokeDashArray = [];\n const addBorder = (length) => {\n strokeDashArray.push(length, 0);\n };\n const skipBorder = (length) => {\n strokeDashArray.push(0, length);\n };\n if (borders.includes('t')) {\n log.debug('add top border');\n addBorder(totalWidth);\n } else {\n skipBorder(totalWidth);\n }\n if (borders.includes('r')) {\n log.debug('add right border');\n addBorder(totalHeight);\n } else {\n skipBorder(totalHeight);\n }\n if (borders.includes('b')) {\n log.debug('add bottom border');\n addBorder(totalWidth);\n } else {\n skipBorder(totalWidth);\n }\n if (borders.includes('l')) {\n log.debug('add left border');\n addBorder(totalHeight);\n } else {\n skipBorder(totalHeight);\n }\n rect.attr('stroke-dasharray', strokeDashArray.join(' '));\n}\n\nconst rectWithTitle = async (parent, node) => {\n // const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, 'node ' + node.classes);\n\n let classes;\n if (!node.classes) {\n classes = 'node default';\n } else {\n classes = 'node ' + node.classes;\n }\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', classes)\n .attr('id', node.domId || node.id);\n\n // Create the title label and insert it after the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n // const innerRect = shapeSvg.insert('rect');\n const innerLine = shapeSvg.insert('line');\n\n const label = shapeSvg.insert('g').attr('class', 'label');\n\n const text2 = node.labelText.flat ? node.labelText.flat() : node.labelText;\n // const text2 = typeof text2prim === 'object' ? text2prim[0] : text2prim;\n\n let title = '';\n if (typeof text2 === 'object') {\n title = text2[0];\n } else {\n title = text2;\n }\n log.info('Label text abc79', title, text2, typeof text2 === 'object');\n\n const text = label.node().appendChild(await createLabel(title, node.labelStyle, true, true));\n let bbox = { width: 0, height: 0 };\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = text.children[0];\n const dv = select(text);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n log.info('Text 2', text2);\n const textRows = text2.slice(1, text2.length);\n let titleBox = text.getBBox();\n const descr = label\n .node()\n .appendChild(\n await createLabel(\n textRows.join ? textRows.join('
') : textRows,\n node.labelStyle,\n true,\n true\n )\n );\n\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = descr.children[0];\n const dv = select(descr);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n // bbox = label.getBBox();\n // log.info(descr);\n const halfPadding = node.padding / 2;\n select(descr).attr(\n 'transform',\n 'translate( ' +\n // (titleBox.width - bbox.width) / 2 +\n (bbox.width > titleBox.width ? 0 : (titleBox.width - bbox.width) / 2) +\n ', ' +\n (titleBox.height + halfPadding + 5) +\n ')'\n );\n select(text).attr(\n 'transform',\n 'translate( ' +\n // (titleBox.width - bbox.width) / 2 +\n (bbox.width < titleBox.width ? 0 : -(titleBox.width - bbox.width) / 2) +\n ', ' +\n 0 +\n ')'\n );\n // Get the size of the label\n\n // Bounding box for title and text\n bbox = label.node().getBBox();\n\n // Center the label\n label.attr(\n 'transform',\n 'translate(' + -bbox.width / 2 + ', ' + (-bbox.height / 2 - halfPadding + 3) + ')'\n );\n\n rect\n .attr('class', 'outer title-state')\n .attr('x', -bbox.width / 2 - halfPadding)\n .attr('y', -bbox.height / 2 - halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n innerLine\n .attr('class', 'divider')\n .attr('x1', -bbox.width / 2 - halfPadding)\n .attr('x2', bbox.width / 2 + halfPadding)\n .attr('y1', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding)\n .attr('y2', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst stadium = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const h = bbox.height + node.padding;\n const w = bbox.width + h / 4 + node.padding;\n\n // add the rect\n const rect = shapeSvg\n .insert('rect', ':first-child')\n .attr('style', node.style)\n .attr('rx', h / 2)\n .attr('ry', h / 2)\n .attr('x', -w / 2)\n .attr('y', -h / 2)\n .attr('width', w)\n .attr('height', h);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst circle = async (parent, node) => {\n const { shapeSvg, bbox, halfPadding } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n const circle = shapeSvg.insert('circle', ':first-child');\n\n // center the circle around its coordinate\n circle\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('r', bbox.width / 2 + halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n log.info('Circle main');\n\n updateNodeBounds(node, circle);\n\n node.intersect = function (point) {\n log.info('Circle intersect', node, bbox.width / 2 + halfPadding, point);\n return intersect.circle(node, bbox.width / 2 + halfPadding, point);\n };\n\n return shapeSvg;\n};\n\nconst doublecircle = async (parent, node) => {\n const { shapeSvg, bbox, halfPadding } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n const gap = 5;\n const circleGroup = shapeSvg.insert('g', ':first-child');\n const outerCircle = circleGroup.insert('circle');\n const innerCircle = circleGroup.insert('circle');\n\n circleGroup.attr('class', node.class);\n\n // center the circle around its coordinate\n outerCircle\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('r', bbox.width / 2 + halfPadding + gap)\n .attr('width', bbox.width + node.padding + gap * 2)\n .attr('height', bbox.height + node.padding + gap * 2);\n\n innerCircle\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('r', bbox.width / 2 + halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n log.info('DoubleCircle main');\n\n updateNodeBounds(node, outerCircle);\n\n node.intersect = function (point) {\n log.info('DoubleCircle intersect', node, bbox.width / 2 + halfPadding + gap, point);\n return intersect.circle(node, bbox.width / 2 + halfPadding + gap, point);\n };\n\n return shapeSvg;\n};\n\nconst subroutine = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: 0, y: 0 },\n { x: w, y: 0 },\n { x: w, y: -h },\n { x: 0, y: -h },\n { x: 0, y: 0 },\n { x: -8, y: 0 },\n { x: w + 8, y: 0 },\n { x: w + 8, y: -h },\n { x: -8, y: -h },\n { x: -8, y: 0 },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst start = (parent, node) => {\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n const circle = shapeSvg.insert('circle', ':first-child');\n\n // center the circle around its coordinate\n circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);\n\n updateNodeBounds(node, circle);\n\n node.intersect = function (point) {\n return intersect.circle(node, 7, point);\n };\n\n return shapeSvg;\n};\n\nconst forkJoin = (parent, node, dir) => {\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n\n let width = 70;\n let height = 10;\n\n if (dir === 'LR') {\n width = 10;\n height = 70;\n }\n\n const shape = shapeSvg\n .append('rect')\n .attr('x', (-1 * width) / 2)\n .attr('y', (-1 * height) / 2)\n .attr('width', width)\n .attr('height', height)\n .attr('class', 'fork-join');\n\n updateNodeBounds(node, shape);\n node.height = node.height + node.padding / 2;\n node.width = node.width + node.padding / 2;\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst end = (parent, node) => {\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n const innerCircle = shapeSvg.insert('circle', ':first-child');\n const circle = shapeSvg.insert('circle', ':first-child');\n\n circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);\n\n innerCircle.attr('class', 'state-end').attr('r', 5).attr('width', 10).attr('height', 10);\n\n updateNodeBounds(node, circle);\n\n node.intersect = function (point) {\n return intersect.circle(node, 7, point);\n };\n\n return shapeSvg;\n};\n\nconst class_box = async (parent, node) => {\n const halfPadding = node.padding / 2;\n const rowPadding = 4;\n const lineHeight = 8;\n\n let classes;\n if (!node.classes) {\n classes = 'node default';\n } else {\n classes = 'node ' + node.classes;\n }\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', classes)\n .attr('id', node.domId || node.id);\n\n // Create the title label and insert it after the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n const topLine = shapeSvg.insert('line');\n const bottomLine = shapeSvg.insert('line');\n let maxWidth = 0;\n let maxHeight = rowPadding;\n\n const labelContainer = shapeSvg.insert('g').attr('class', 'label');\n let verticalPos = 0;\n const hasInterface = node.classData.annotations?.[0];\n\n // 1. Create the labels\n const interfaceLabelText = node.classData.annotations[0]\n ? '\u00AB' + node.classData.annotations[0] + '\u00BB'\n : '';\n const interfaceLabel = labelContainer\n .node()\n .appendChild(await createLabel(interfaceLabelText, node.labelStyle, true, true));\n let interfaceBBox = interfaceLabel.getBBox();\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = interfaceLabel.children[0];\n const dv = select(interfaceLabel);\n interfaceBBox = div.getBoundingClientRect();\n dv.attr('width', interfaceBBox.width);\n dv.attr('height', interfaceBBox.height);\n }\n if (node.classData.annotations[0]) {\n maxHeight += interfaceBBox.height + rowPadding;\n maxWidth += interfaceBBox.width;\n }\n\n let classTitleString = node.classData.label;\n\n if (node.classData.type !== undefined && node.classData.type !== '') {\n if (getConfig().flowchart.htmlLabels) {\n classTitleString += '<' + node.classData.type + '>';\n } else {\n classTitleString += '<' + node.classData.type + '>';\n }\n }\n const classTitleLabel = labelContainer\n .node()\n .appendChild(await createLabel(classTitleString, node.labelStyle, true, true));\n select(classTitleLabel).attr('class', 'classTitle');\n let classTitleBBox = classTitleLabel.getBBox();\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = classTitleLabel.children[0];\n const dv = select(classTitleLabel);\n classTitleBBox = div.getBoundingClientRect();\n dv.attr('width', classTitleBBox.width);\n dv.attr('height', classTitleBBox.height);\n }\n maxHeight += classTitleBBox.height + rowPadding;\n if (classTitleBBox.width > maxWidth) {\n maxWidth = classTitleBBox.width;\n }\n const classAttributes = [];\n node.classData.members.forEach(async (member) => {\n const parsedInfo = member.getDisplayDetails();\n let parsedText = parsedInfo.displayText;\n if (getConfig().flowchart.htmlLabels) {\n parsedText = parsedText.replace(//g, '>');\n }\n const lbl = labelContainer\n .node()\n .appendChild(\n await createLabel(\n parsedText,\n parsedInfo.cssStyle ? parsedInfo.cssStyle : node.labelStyle,\n true,\n true\n )\n );\n let bbox = lbl.getBBox();\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = lbl.children[0];\n const dv = select(lbl);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n if (bbox.width > maxWidth) {\n maxWidth = bbox.width;\n }\n maxHeight += bbox.height + rowPadding;\n classAttributes.push(lbl);\n });\n\n maxHeight += lineHeight;\n\n const classMethods = [];\n node.classData.methods.forEach(async (member) => {\n const parsedInfo = member.getDisplayDetails();\n let displayText = parsedInfo.displayText;\n if (getConfig().flowchart.htmlLabels) {\n displayText = displayText.replace(//g, '>');\n }\n const lbl = labelContainer\n .node()\n .appendChild(\n await createLabel(\n displayText,\n parsedInfo.cssStyle ? parsedInfo.cssStyle : node.labelStyle,\n true,\n true\n )\n );\n let bbox = lbl.getBBox();\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = lbl.children[0];\n const dv = select(lbl);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n if (bbox.width > maxWidth) {\n maxWidth = bbox.width;\n }\n maxHeight += bbox.height + rowPadding;\n\n classMethods.push(lbl);\n });\n\n maxHeight += lineHeight;\n\n // 2. Position the labels\n\n // position the interface label\n if (hasInterface) {\n let diffX = (maxWidth - interfaceBBox.width) / 2;\n select(interfaceLabel).attr(\n 'transform',\n 'translate( ' + ((-1 * maxWidth) / 2 + diffX) + ', ' + (-1 * maxHeight) / 2 + ')'\n );\n verticalPos = interfaceBBox.height + rowPadding;\n }\n // Position the class title label\n let diffX = (maxWidth - classTitleBBox.width) / 2;\n select(classTitleLabel).attr(\n 'transform',\n 'translate( ' +\n ((-1 * maxWidth) / 2 + diffX) +\n ', ' +\n ((-1 * maxHeight) / 2 + verticalPos) +\n ')'\n );\n verticalPos += classTitleBBox.height + rowPadding;\n\n topLine\n .attr('class', 'divider')\n .attr('x1', -maxWidth / 2 - halfPadding)\n .attr('x2', maxWidth / 2 + halfPadding)\n .attr('y1', -maxHeight / 2 - halfPadding + lineHeight + verticalPos)\n .attr('y2', -maxHeight / 2 - halfPadding + lineHeight + verticalPos);\n\n verticalPos += lineHeight;\n\n classAttributes.forEach((lbl) => {\n select(lbl).attr(\n 'transform',\n 'translate( ' +\n -maxWidth / 2 +\n ', ' +\n ((-1 * maxHeight) / 2 + verticalPos + lineHeight / 2) +\n ')'\n );\n //get the height of the bounding box of each member if exists\n const memberBBox = lbl?.getBBox();\n verticalPos += (memberBBox?.height ?? 0) + rowPadding;\n });\n\n verticalPos += lineHeight;\n bottomLine\n .attr('class', 'divider')\n .attr('x1', -maxWidth / 2 - halfPadding)\n .attr('x2', maxWidth / 2 + halfPadding)\n .attr('y1', -maxHeight / 2 - halfPadding + lineHeight + verticalPos)\n .attr('y2', -maxHeight / 2 - halfPadding + lineHeight + verticalPos);\n\n verticalPos += lineHeight;\n\n classMethods.forEach((lbl) => {\n select(lbl).attr(\n 'transform',\n 'translate( ' + -maxWidth / 2 + ', ' + ((-1 * maxHeight) / 2 + verticalPos) + ')'\n );\n const memberBBox = lbl?.getBBox();\n verticalPos += (memberBBox?.height ?? 0) + rowPadding;\n });\n\n rect\n .attr('style', node.style)\n .attr('class', 'outer title-state')\n .attr('x', -maxWidth / 2 - halfPadding)\n .attr('y', -(maxHeight / 2) - halfPadding)\n .attr('width', maxWidth + node.padding)\n .attr('height', maxHeight + node.padding);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst shapes = {\n rhombus: question,\n composite,\n question,\n rect,\n labelRect,\n rectWithTitle,\n choice,\n circle,\n doublecircle,\n stadium,\n hexagon,\n block_arrow,\n rect_left_inv_arrow,\n lean_right,\n lean_left,\n trapezoid,\n inv_trapezoid,\n rect_right_inv_arrow,\n cylinder,\n start,\n end,\n note,\n subroutine,\n fork: forkJoin,\n join: forkJoin,\n class_box,\n};\n\nlet nodeElems = {};\n\nexport const insertNode = async (elem, node, renderOptions) => {\n let newEl;\n let el;\n\n // Add link when appropriate\n if (node.link) {\n let target;\n if (getConfig().securityLevel === 'sandbox') {\n target = '_top';\n } else if (node.linkTarget) {\n target = node.linkTarget || '_blank';\n }\n newEl = elem.insert('svg:a').attr('xlink:href', node.link).attr('target', target);\n el = await shapes[node.shape](newEl, node, renderOptions);\n } else {\n el = await shapes[node.shape](elem, node, renderOptions);\n newEl = el;\n }\n if (node.tooltip) {\n el.attr('title', node.tooltip);\n }\n if (node.class) {\n el.attr('class', 'node default ' + node.class);\n }\n\n nodeElems[node.id] = newEl;\n\n if (node.haveCallback) {\n nodeElems[node.id].attr('class', nodeElems[node.id].attr('class') + ' clickable');\n }\n return newEl;\n};\nexport const setNodeElem = (elem, node) => {\n nodeElems[node.id] = elem;\n};\nexport const clear = () => {\n nodeElems = {};\n};\n\nexport const positionNode = (node) => {\n const el = nodeElems[node.id];\n log.trace(\n 'Transforming node',\n node.diff,\n node,\n 'translate(' + (node.x - node.width / 2 - 5) + ', ' + node.width / 2 + ')'\n );\n const padding = 8;\n const diff = node.diff || 0;\n if (node.clusterNode) {\n el.attr(\n 'transform',\n 'translate(' +\n (node.x + diff - node.width / 2) +\n ', ' +\n (node.y - node.height / 2 - padding) +\n ')'\n );\n } else {\n el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');\n }\n return diff;\n};\n", "import type { Direction } from '../../src/diagrams/block/blockTypes.js';\n\nconst expandAndDeduplicateDirections = (directions: Direction[]) => {\n const uniqueDirections = new Set();\n\n for (const direction of directions) {\n switch (direction) {\n case 'x':\n uniqueDirections.add('right');\n uniqueDirections.add('left');\n break;\n case 'y':\n uniqueDirections.add('up');\n uniqueDirections.add('down');\n break;\n default:\n uniqueDirections.add(direction);\n break;\n }\n }\n\n return uniqueDirections;\n};\nexport const getArrowPoints = (\n duplicatedDirections: Direction[],\n bbox: { width: number; height: number },\n node: any\n) => {\n // Expand and deduplicate the provided directions.\n // for instance: x, right => right, left\n const directions = expandAndDeduplicateDirections(duplicatedDirections);\n\n // Factor to divide height for some calculations.\n const f = 2;\n\n // Calculated height of the bounding box, accounting for node padding.\n const height = bbox.height + 2 * node.padding;\n // Midpoint calculation based on height.\n const midpoint = height / f;\n // Calculated width of the bounding box, accounting for additional width and node padding.\n const width = bbox.width + 2 * midpoint + node.padding;\n // Padding to use, half of the node padding.\n const padding = node.padding / 2;\n\n if (\n directions.has('right') &&\n directions.has('left') &&\n directions.has('up') &&\n directions.has('down')\n ) {\n // SQUARE\n return [\n // Bottom\n { x: 0, y: 0 },\n { x: midpoint, y: 0 },\n { x: width / 2, y: 2 * padding },\n { x: width - midpoint, y: 0 },\n { x: width, y: 0 },\n\n // Right\n { x: width, y: -height / 3 },\n { x: width + 2 * padding, y: -height / 2 },\n { x: width, y: (-2 * height) / 3 },\n { x: width, y: -height },\n\n // Top\n { x: width - midpoint, y: -height },\n { x: width / 2, y: -height - 2 * padding },\n { x: midpoint, y: -height },\n\n // Left\n { x: 0, y: -height },\n { x: 0, y: (-2 * height) / 3 },\n { x: -2 * padding, y: -height / 2 },\n { x: 0, y: -height / 3 },\n ];\n }\n if (directions.has('right') && directions.has('left') && directions.has('up')) {\n // RECTANGLE_VERTICAL (Top Open)\n return [\n { x: midpoint, y: 0 },\n { x: width - midpoint, y: 0 },\n { x: width, y: -height / 2 },\n { x: width - midpoint, y: -height },\n { x: midpoint, y: -height },\n { x: 0, y: -height / 2 },\n ];\n }\n if (directions.has('right') && directions.has('left') && directions.has('down')) {\n // RECTANGLE_VERTICAL (Bottom Open)\n return [\n { x: 0, y: 0 },\n { x: midpoint, y: -height },\n { x: width - midpoint, y: -height },\n { x: width, y: 0 },\n ];\n }\n if (directions.has('right') && directions.has('up') && directions.has('down')) {\n // RECTANGLE_HORIZONTAL (Right Open)\n return [\n { x: 0, y: 0 },\n { x: width, y: -midpoint },\n { x: width, y: -height + midpoint },\n { x: 0, y: -height },\n ];\n }\n if (directions.has('left') && directions.has('up') && directions.has('down')) {\n // RECTANGLE_HORIZONTAL (Left Open)\n return [\n { x: width, y: 0 },\n { x: 0, y: -midpoint },\n { x: 0, y: -height + midpoint },\n { x: width, y: -height },\n ];\n }\n if (directions.has('right') && directions.has('left')) {\n // HORIZONTAL_LINE\n return [\n { x: midpoint, y: 0 },\n { x: midpoint, y: -padding },\n { x: width - midpoint, y: -padding },\n { x: width - midpoint, y: 0 },\n { x: width, y: -height / 2 },\n { x: width - midpoint, y: -height },\n { x: width - midpoint, y: -height + padding },\n { x: midpoint, y: -height + padding },\n { x: midpoint, y: -height },\n { x: 0, y: -height / 2 },\n ];\n }\n if (directions.has('up') && directions.has('down')) {\n // VERTICAL_LINE\n return [\n // Bottom center\n { x: width / 2, y: 0 },\n // Left pont of bottom arrow\n { x: 0, y: -padding },\n { x: midpoint, y: -padding },\n // Left top over vertical section\n { x: midpoint, y: -height + padding },\n { x: 0, y: -height + padding },\n // Top of arrow\n { x: width / 2, y: -height },\n { x: width, y: -height + padding },\n // Top of right vertical bar\n { x: width - midpoint, y: -height + padding },\n { x: width - midpoint, y: -padding },\n { x: width, y: -padding },\n ];\n }\n if (directions.has('right') && directions.has('up')) {\n // ANGLE_RT\n return [\n { x: 0, y: 0 },\n { x: width, y: -midpoint },\n { x: 0, y: -height },\n ];\n }\n if (directions.has('right') && directions.has('down')) {\n // ANGLE_RB\n return [\n { x: 0, y: 0 },\n { x: width, y: 0 },\n { x: 0, y: -height },\n ];\n }\n if (directions.has('left') && directions.has('up')) {\n // ANGLE_LT\n return [\n { x: width, y: 0 },\n { x: 0, y: -midpoint },\n { x: width, y: -height },\n ];\n }\n if (directions.has('left') && directions.has('down')) {\n // ANGLE_LB\n return [\n { x: width, y: 0 },\n { x: 0, y: 0 },\n { x: width, y: -height },\n ];\n }\n if (directions.has('right')) {\n // ARROW_RIGHT\n return [\n { x: midpoint, y: -padding },\n { x: midpoint, y: -padding },\n { x: width - midpoint, y: -padding },\n { x: width - midpoint, y: 0 },\n { x: width, y: -height / 2 },\n { x: width - midpoint, y: -height },\n { x: width - midpoint, y: -height + padding },\n // top left corner of arrow\n { x: midpoint, y: -height + padding },\n { x: midpoint, y: -height + padding },\n ];\n }\n if (directions.has('left')) {\n // ARROW_LEFT\n return [\n { x: midpoint, y: 0 },\n { x: midpoint, y: -padding },\n // Two points, the right corners\n { x: width - midpoint, y: -padding },\n { x: width - midpoint, y: -height + padding },\n { x: midpoint, y: -height + padding },\n { x: midpoint, y: -height },\n { x: 0, y: -height / 2 },\n ];\n }\n if (directions.has('up')) {\n // ARROW_TOP\n return [\n // Bottom center\n { x: midpoint, y: -padding },\n // Left top over vertical section\n { x: midpoint, y: -height + padding },\n { x: 0, y: -height + padding },\n // Top of arrow\n { x: width / 2, y: -height },\n { x: width, y: -height + padding },\n // Top of right vertical bar\n { x: width - midpoint, y: -height + padding },\n { x: width - midpoint, y: -padding },\n ];\n }\n if (directions.has('down')) {\n // ARROW_BOTTOM\n return [\n // Bottom center\n { x: width / 2, y: 0 },\n // Left pont of bottom arrow\n { x: 0, y: -padding },\n { x: midpoint, y: -padding },\n // Left top over vertical section\n { x: midpoint, y: -height + padding },\n { x: width - midpoint, y: -height + padding },\n { x: width - midpoint, y: -padding },\n { x: width, y: -padding },\n ];\n }\n\n // POINT\n return [{ x: 0, y: 0 }];\n};\n", "/**\n * @param node\n * @param point\n */\nfunction intersectNode(node, point) {\n // console.info('Intersect Node');\n return node.intersect(point);\n}\n\nexport default intersectNode;\n", "/**\n * @param node\n * @param rx\n * @param ry\n * @param point\n */\nfunction intersectEllipse(node, rx, ry, point) {\n // Formulae from: https://mathworld.wolfram.com/Ellipse-LineIntersection.html\n\n var cx = node.x;\n var cy = node.y;\n\n var px = cx - point.x;\n var py = cy - point.y;\n\n var det = Math.sqrt(rx * rx * py * py + ry * ry * px * px);\n\n var dx = Math.abs((rx * ry * px) / det);\n if (point.x < cx) {\n dx = -dx;\n }\n var dy = Math.abs((rx * ry * py) / det);\n if (point.y < cy) {\n dy = -dy;\n }\n\n return { x: cx + dx, y: cy + dy };\n}\n\nexport default intersectEllipse;\n", "import intersectEllipse from './intersect-ellipse.js';\n\n/**\n * @param node\n * @param rx\n * @param point\n */\nfunction intersectCircle(node, rx, point) {\n return intersectEllipse(node, rx, rx, point);\n}\n\nexport default intersectCircle;\n", "/**\n * Returns the point at which two lines, p and q, intersect or returns undefined if they do not intersect.\n *\n * @param p1\n * @param p2\n * @param q1\n * @param q2\n */\nfunction intersectLine(p1, p2, q1, q2) {\n // Algorithm from J. Avro, (ed.) Graphics Gems, No 2, Morgan Kaufmann, 1994,\n // p7 and p473.\n\n var a1, a2, b1, b2, c1, c2;\n var r1, r2, r3, r4;\n var denom, offset, num;\n var x, y;\n\n // Compute a1, b1, c1, where line joining points 1 and 2 is F(x,y) = a1 x +\n // b1 y + c1 = 0.\n a1 = p2.y - p1.y;\n b1 = p1.x - p2.x;\n c1 = p2.x * p1.y - p1.x * p2.y;\n\n // Compute r3 and r4.\n r3 = a1 * q1.x + b1 * q1.y + c1;\n r4 = a1 * q2.x + b1 * q2.y + c1;\n\n // Check signs of r3 and r4. If both point 3 and point 4 lie on\n // same side of line 1, the line segments do not intersect.\n if (r3 !== 0 && r4 !== 0 && sameSign(r3, r4)) {\n return /*DON'T_INTERSECT*/;\n }\n\n // Compute a2, b2, c2 where line joining points 3 and 4 is G(x,y) = a2 x + b2 y + c2 = 0\n a2 = q2.y - q1.y;\n b2 = q1.x - q2.x;\n c2 = q2.x * q1.y - q1.x * q2.y;\n\n // Compute r1 and r2\n r1 = a2 * p1.x + b2 * p1.y + c2;\n r2 = a2 * p2.x + b2 * p2.y + c2;\n\n // Check signs of r1 and r2. If both point 1 and point 2 lie\n // on same side of second line segment, the line segments do\n // not intersect.\n if (r1 !== 0 && r2 !== 0 && sameSign(r1, r2)) {\n return /*DON'T_INTERSECT*/;\n }\n\n // Line segments intersect: compute intersection point.\n denom = a1 * b2 - a2 * b1;\n if (denom === 0) {\n return /*COLLINEAR*/;\n }\n\n offset = Math.abs(denom / 2);\n\n // The denom/2 is to get rounding instead of truncating. It\n // is added or subtracted to the numerator, depending upon the\n // sign of the numerator.\n num = b1 * c2 - b2 * c1;\n x = num < 0 ? (num - offset) / denom : (num + offset) / denom;\n\n num = a2 * c1 - a1 * c2;\n y = num < 0 ? (num - offset) / denom : (num + offset) / denom;\n\n return { x: x, y: y };\n}\n\n/**\n * @param r1\n * @param r2\n */\nfunction sameSign(r1, r2) {\n return r1 * r2 > 0;\n}\n\nexport default intersectLine;\n", "/* eslint \"no-console\": off */\n\nimport intersectLine from './intersect-line.js';\n\nexport default intersectPolygon;\n\n/**\n * Returns the point ({x, y}) at which the point argument intersects with the node argument assuming\n * that it has the shape specified by polygon.\n *\n * @param node\n * @param polyPoints\n * @param point\n */\nfunction intersectPolygon(node, polyPoints, point) {\n var x1 = node.x;\n var y1 = node.y;\n\n var intersections = [];\n\n var minX = Number.POSITIVE_INFINITY;\n var minY = Number.POSITIVE_INFINITY;\n if (typeof polyPoints.forEach === 'function') {\n polyPoints.forEach(function (entry) {\n minX = Math.min(minX, entry.x);\n minY = Math.min(minY, entry.y);\n });\n } else {\n minX = Math.min(minX, polyPoints.x);\n minY = Math.min(minY, polyPoints.y);\n }\n\n var left = x1 - node.width / 2 - minX;\n var top = y1 - node.height / 2 - minY;\n\n for (var i = 0; i < polyPoints.length; i++) {\n var p1 = polyPoints[i];\n var p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0];\n var intersect = intersectLine(\n node,\n point,\n { x: left + p1.x, y: top + p1.y },\n { x: left + p2.x, y: top + p2.y }\n );\n if (intersect) {\n intersections.push(intersect);\n }\n }\n\n if (!intersections.length) {\n // console.log('NO INTERSECTION FOUND, RETURN NODE CENTER', node);\n return node;\n }\n\n if (intersections.length > 1) {\n // More intersections, find the one nearest to edge end point\n intersections.sort(function (p, q) {\n var pdx = p.x - point.x;\n var pdy = p.y - point.y;\n var distp = Math.sqrt(pdx * pdx + pdy * pdy);\n\n var qdx = q.x - point.x;\n var qdy = q.y - point.y;\n var distq = Math.sqrt(qdx * qdx + qdy * qdy);\n\n return distp < distq ? -1 : distp === distq ? 0 : 1;\n });\n }\n return intersections[0];\n}\n", "const intersectRect = (node, point) => {\n var x = node.x;\n var y = node.y;\n\n // Rectangle intersection algorithm from:\n // https://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\n var dx = point.x - x;\n var dy = point.y - y;\n var w = node.width / 2;\n var h = node.height / 2;\n\n var sx, sy;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n // Intersection is top or bottom of rect.\n if (dy < 0) {\n h = -h;\n }\n sx = dy === 0 ? 0 : (h * dx) / dy;\n sy = h;\n } else {\n // Intersection is left or right of rect.\n if (dx < 0) {\n w = -w;\n }\n sx = w;\n sy = dx === 0 ? 0 : (w * dy) / dx;\n }\n\n return { x: x + sx, y: y + sy };\n};\n\nexport default intersectRect;\n", "/*\n * Borrowed with love from dagre-d3. Many thanks to cpettitt!\n */\n\nimport node from './intersect-node.js';\nimport circle from './intersect-circle.js';\nimport ellipse from './intersect-ellipse.js';\nimport polygon from './intersect-polygon.js';\nimport rect from './intersect-rect.js';\n\nexport default {\n node,\n circle,\n ellipse,\n polygon,\n rect,\n};\n", "import createLabel from '../createLabel.js';\nimport { createText } from '../../rendering-util/createText.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { select } from 'd3';\nimport { evaluate, sanitizeText } from '../../diagrams/common/common.js';\nimport { decodeEntities } from '../../utils.js';\n\nexport const labelHelper = async (parent, node, _classes, isNode) => {\n const config = getConfig();\n let classes;\n const useHtmlLabels = node.useHtmlLabels || evaluate(config.flowchart.htmlLabels);\n if (!_classes) {\n classes = 'node default';\n } else {\n classes = _classes;\n }\n\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', classes)\n .attr('id', node.domId || node.id);\n\n // Create the label and insert it after the rect\n const label = shapeSvg.insert('g').attr('class', 'label').attr('style', node.labelStyle);\n\n // Replace labelText with default value if undefined\n let labelText;\n if (node.labelText === undefined) {\n labelText = '';\n } else {\n labelText = typeof node.labelText === 'string' ? node.labelText : node.labelText[0];\n }\n\n const textNode = label.node();\n let text;\n if (node.labelType === 'markdown') {\n // text = textNode;\n text = createText(\n label,\n sanitizeText(decodeEntities(labelText), config),\n {\n useHtmlLabels,\n width: node.width || config.flowchart.wrappingWidth,\n classes: 'markdown-node-label',\n },\n config\n );\n } else {\n text = textNode.appendChild(\n await createLabel(\n sanitizeText(decodeEntities(labelText), config),\n node.labelStyle,\n false,\n isNode\n )\n );\n }\n // Get the size of the label\n let bbox = text.getBBox();\n const halfPadding = node.padding / 2;\n\n if (evaluate(config.flowchart.htmlLabels)) {\n const div = text.children[0];\n const dv = select(text);\n\n // if there are images, need to wait for them to load before getting the bounding box\n const images = div.getElementsByTagName('img');\n if (images) {\n const noImgText = labelText.replace(/]*>/g, '').trim() === '';\n\n await Promise.all(\n [...images].map(\n (img) =>\n new Promise((res) => {\n /**\n *\n */\n function setupImage() {\n img.style.display = 'flex';\n img.style.flexDirection = 'column';\n\n if (noImgText) {\n // default size if no text\n const bodyFontSize = config.fontSize\n ? config.fontSize\n : window.getComputedStyle(document.body).fontSize;\n const enlargingFactor = 5;\n const width = parseInt(bodyFontSize, 10) * enlargingFactor + 'px';\n img.style.minWidth = width;\n img.style.maxWidth = width;\n } else {\n img.style.width = '100%';\n }\n res(img);\n }\n setTimeout(() => {\n if (img.complete) {\n setupImage();\n }\n });\n img.addEventListener('error', setupImage);\n img.addEventListener('load', setupImage);\n })\n )\n );\n }\n\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n // Center the label\n if (useHtmlLabels) {\n label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n } else {\n label.attr('transform', 'translate(' + 0 + ', ' + -bbox.height / 2 + ')');\n }\n if (node.centerLabel) {\n label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n }\n label.insert('rect', ':first-child');\n\n return { shapeSvg, bbox, halfPadding, label };\n};\n\nexport const updateNodeBounds = (node, element) => {\n const bbox = element.node().getBBox();\n node.width = bbox.width;\n node.height = bbox.height;\n};\n\n/**\n * @param parent\n * @param w\n * @param h\n * @param points\n */\nexport function insertPolygonShape(parent, w, h, points) {\n return parent\n .insert('polygon', ':first-child')\n .attr(\n 'points',\n points\n .map(function (d) {\n return d.x + ',' + d.y;\n })\n .join(' ')\n )\n .attr('class', 'label-container')\n .attr('transform', 'translate(' + -w / 2 + ',' + h / 2 + ')');\n}\n", "import { updateNodeBounds, labelHelper } from './util.js';\nimport { log } from '../../logger.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport intersect from '../intersect/index.js';\n\nconst note = async (parent, node) => {\n const useHtmlLabels = node.useHtmlLabels || getConfig().flowchart.htmlLabels;\n if (!useHtmlLabels) {\n node.centerLabel = true;\n }\n const { shapeSvg, bbox, halfPadding } = await labelHelper(\n parent,\n node,\n 'node ' + node.classes,\n true\n );\n\n log.info('Classes = ', node.classes);\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n rect\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', -bbox.width / 2 - halfPadding)\n .attr('y', -bbox.height / 2 - halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nexport default note;\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: jison doesn't export types\nimport parser from './parser/block.jison';\nimport db from './blockDB.js';\nimport flowStyles from './styles.js';\nimport renderer from './blockRenderer.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles: flowStyles,\n};\n"], + "mappings": "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IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,KAAI,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,GAAE,IAAG,GAAE,IAAG,KAAI,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,EAAC,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", + "names": ["o", "parser", "lexer", "getConfig", "sanitizeText", "clear", "channel", "getConfig", "db", "width", "config", "getConfig", "select", "config", "getConfig", "select", "point", "select", "padding", "point", "point", "point", "point", "point", "select", "config", "getConfig", "classes", "select", "getConfig", "rect", "point", "point", "choice", "rect", "classes", "getConfig", "select", "circle", "diffX", "padding", "db", "padding", "config", "blocks", "start", "end", "getClasses", "db", "markers"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/c4Diagram-YG6GDRKO.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/c4Diagram-YG6GDRKO.mjs new file mode 100644 index 0000000..67bb828 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/c4Diagram-YG6GDRKO.mjs @@ -0,0 +1,2604 @@ +import { + drawRect, + getNoteRect +} from "./chunk-TZMSLE5B.mjs"; +import { + calculateTextHeight, + calculateTextWidth, + wrapLabel +} from "./chunk-S3R3BYOJ.mjs"; +import { + assignWithDepth_default, + common_default, + configureSvgSize, + getAccDescription, + getAccTitle, + getConfig2 as getConfig, + sanitizeText, + setAccDescription, + setAccTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/c4/parser/c4Diagram.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 24], $V1 = [1, 25], $V2 = [1, 26], $V3 = [1, 27], $V4 = [1, 28], $V5 = [1, 63], $V6 = [1, 64], $V7 = [1, 65], $V8 = [1, 66], $V9 = [1, 67], $Va = [1, 68], $Vb = [1, 69], $Vc = [1, 29], $Vd = [1, 30], $Ve = [1, 31], $Vf = [1, 32], $Vg = [1, 33], $Vh = [1, 34], $Vi = [1, 35], $Vj = [1, 36], $Vk = [1, 37], $Vl = [1, 38], $Vm = [1, 39], $Vn = [1, 40], $Vo = [1, 41], $Vp = [1, 42], $Vq = [1, 43], $Vr = [1, 44], $Vs = [1, 45], $Vt = [1, 46], $Vu = [1, 47], $Vv = [1, 48], $Vw = [1, 50], $Vx = [1, 51], $Vy = [1, 52], $Vz = [1, 53], $VA = [1, 54], $VB = [1, 55], $VC = [1, 56], $VD = [1, 57], $VE = [1, 58], $VF = [1, 59], $VG = [1, 60], $VH = [14, 42], $VI = [14, 34, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74], $VJ = [12, 14, 34, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74], $VK = [1, 82], $VL = [1, 83], $VM = [1, 84], $VN = [1, 85], $VO = [12, 14, 42], $VP = [12, 14, 33, 42], $VQ = [12, 14, 33, 42, 76, 77, 79, 80], $VR = [12, 33], $VS = [34, 36, 37, 38, 39, 40, 41, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "mermaidDoc": 4, "direction": 5, "direction_tb": 6, "direction_bt": 7, "direction_rl": 8, "direction_lr": 9, "graphConfig": 10, "C4_CONTEXT": 11, "NEWLINE": 12, "statements": 13, "EOF": 14, "C4_CONTAINER": 15, "C4_COMPONENT": 16, "C4_DYNAMIC": 17, "C4_DEPLOYMENT": 18, "otherStatements": 19, "diagramStatements": 20, "otherStatement": 21, "title": 22, "accDescription": 23, "acc_title": 24, "acc_title_value": 25, "acc_descr": 26, "acc_descr_value": 27, "acc_descr_multiline_value": 28, "boundaryStatement": 29, "boundaryStartStatement": 30, "boundaryStopStatement": 31, "boundaryStart": 32, "LBRACE": 33, "ENTERPRISE_BOUNDARY": 34, "attributes": 35, "SYSTEM_BOUNDARY": 36, "BOUNDARY": 37, "CONTAINER_BOUNDARY": 38, "NODE": 39, "NODE_L": 40, "NODE_R": 41, "RBRACE": 42, "diagramStatement": 43, "PERSON": 44, "PERSON_EXT": 45, "SYSTEM": 46, "SYSTEM_DB": 47, "SYSTEM_QUEUE": 48, "SYSTEM_EXT": 49, "SYSTEM_EXT_DB": 50, "SYSTEM_EXT_QUEUE": 51, "CONTAINER": 52, "CONTAINER_DB": 53, "CONTAINER_QUEUE": 54, "CONTAINER_EXT": 55, "CONTAINER_EXT_DB": 56, "CONTAINER_EXT_QUEUE": 57, "COMPONENT": 58, "COMPONENT_DB": 59, "COMPONENT_QUEUE": 60, "COMPONENT_EXT": 61, "COMPONENT_EXT_DB": 62, "COMPONENT_EXT_QUEUE": 63, "REL": 64, "BIREL": 65, "REL_U": 66, "REL_D": 67, "REL_L": 68, "REL_R": 69, "REL_B": 70, "REL_INDEX": 71, "UPDATE_EL_STYLE": 72, "UPDATE_REL_STYLE": 73, "UPDATE_LAYOUT_CONFIG": 74, "attribute": 75, "STR": 76, "STR_KEY": 77, "STR_VALUE": 78, "ATTRIBUTE": 79, "ATTRIBUTE_EMPTY": 80, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 6: "direction_tb", 7: "direction_bt", 8: "direction_rl", 9: "direction_lr", 11: "C4_CONTEXT", 12: "NEWLINE", 14: "EOF", 15: "C4_CONTAINER", 16: "C4_COMPONENT", 17: "C4_DYNAMIC", 18: "C4_DEPLOYMENT", 22: "title", 23: "accDescription", 24: "acc_title", 25: "acc_title_value", 26: "acc_descr", 27: "acc_descr_value", 28: "acc_descr_multiline_value", 33: "LBRACE", 34: "ENTERPRISE_BOUNDARY", 36: "SYSTEM_BOUNDARY", 37: "BOUNDARY", 38: "CONTAINER_BOUNDARY", 39: "NODE", 40: "NODE_L", 41: "NODE_R", 42: "RBRACE", 44: "PERSON", 45: "PERSON_EXT", 46: "SYSTEM", 47: "SYSTEM_DB", 48: "SYSTEM_QUEUE", 49: "SYSTEM_EXT", 50: "SYSTEM_EXT_DB", 51: "SYSTEM_EXT_QUEUE", 52: "CONTAINER", 53: "CONTAINER_DB", 54: "CONTAINER_QUEUE", 55: "CONTAINER_EXT", 56: "CONTAINER_EXT_DB", 57: "CONTAINER_EXT_QUEUE", 58: "COMPONENT", 59: "COMPONENT_DB", 60: "COMPONENT_QUEUE", 61: "COMPONENT_EXT", 62: "COMPONENT_EXT_DB", 63: "COMPONENT_EXT_QUEUE", 64: "REL", 65: "BIREL", 66: "REL_U", 67: "REL_D", 68: "REL_L", 69: "REL_R", 70: "REL_B", 71: "REL_INDEX", 72: "UPDATE_EL_STYLE", 73: "UPDATE_REL_STYLE", 74: "UPDATE_LAYOUT_CONFIG", 76: "STR", 77: "STR_KEY", 78: "STR_VALUE", 79: "ATTRIBUTE", 80: "ATTRIBUTE_EMPTY" }, + productions_: [0, [3, 1], [3, 1], [5, 1], [5, 1], [5, 1], [5, 1], [4, 1], [10, 4], [10, 4], [10, 4], [10, 4], [10, 4], [13, 1], [13, 1], [13, 2], [19, 1], [19, 2], [19, 3], [21, 1], [21, 1], [21, 2], [21, 2], [21, 1], [29, 3], [30, 3], [30, 3], [30, 4], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [32, 2], [31, 1], [20, 1], [20, 2], [20, 3], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 1], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [43, 2], [35, 1], [35, 2], [75, 1], [75, 2], [75, 1], [75, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 3: + yy.setDirection("TB"); + break; + case 4: + yy.setDirection("BT"); + break; + case 5: + yy.setDirection("RL"); + break; + case 6: + yy.setDirection("LR"); + break; + case 8: + case 9: + case 10: + case 11: + case 12: + yy.setC4Type($$[$0 - 3]); + break; + case 19: + yy.setTitle($$[$0].substring(6)); + this.$ = $$[$0].substring(6); + break; + case 20: + yy.setAccDescription($$[$0].substring(15)); + this.$ = $$[$0].substring(15); + break; + case 21: + this.$ = $$[$0].trim(); + yy.setTitle(this.$); + break; + case 22: + case 23: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 28: + $$[$0].splice(2, 0, "ENTERPRISE"); + yy.addPersonOrSystemBoundary(...$$[$0]); + this.$ = $$[$0]; + break; + case 29: + $$[$0].splice(2, 0, "SYSTEM"); + yy.addPersonOrSystemBoundary(...$$[$0]); + this.$ = $$[$0]; + break; + case 30: + yy.addPersonOrSystemBoundary(...$$[$0]); + this.$ = $$[$0]; + break; + case 31: + $$[$0].splice(2, 0, "CONTAINER"); + yy.addContainerBoundary(...$$[$0]); + this.$ = $$[$0]; + break; + case 32: + yy.addDeploymentNode("node", ...$$[$0]); + this.$ = $$[$0]; + break; + case 33: + yy.addDeploymentNode("nodeL", ...$$[$0]); + this.$ = $$[$0]; + break; + case 34: + yy.addDeploymentNode("nodeR", ...$$[$0]); + this.$ = $$[$0]; + break; + case 35: + yy.popBoundaryParseStack(); + break; + case 39: + yy.addPersonOrSystem("person", ...$$[$0]); + this.$ = $$[$0]; + break; + case 40: + yy.addPersonOrSystem("external_person", ...$$[$0]); + this.$ = $$[$0]; + break; + case 41: + yy.addPersonOrSystem("system", ...$$[$0]); + this.$ = $$[$0]; + break; + case 42: + yy.addPersonOrSystem("system_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 43: + yy.addPersonOrSystem("system_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 44: + yy.addPersonOrSystem("external_system", ...$$[$0]); + this.$ = $$[$0]; + break; + case 45: + yy.addPersonOrSystem("external_system_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 46: + yy.addPersonOrSystem("external_system_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 47: + yy.addContainer("container", ...$$[$0]); + this.$ = $$[$0]; + break; + case 48: + yy.addContainer("container_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 49: + yy.addContainer("container_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 50: + yy.addContainer("external_container", ...$$[$0]); + this.$ = $$[$0]; + break; + case 51: + yy.addContainer("external_container_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 52: + yy.addContainer("external_container_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 53: + yy.addComponent("component", ...$$[$0]); + this.$ = $$[$0]; + break; + case 54: + yy.addComponent("component_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 55: + yy.addComponent("component_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 56: + yy.addComponent("external_component", ...$$[$0]); + this.$ = $$[$0]; + break; + case 57: + yy.addComponent("external_component_db", ...$$[$0]); + this.$ = $$[$0]; + break; + case 58: + yy.addComponent("external_component_queue", ...$$[$0]); + this.$ = $$[$0]; + break; + case 60: + yy.addRel("rel", ...$$[$0]); + this.$ = $$[$0]; + break; + case 61: + yy.addRel("birel", ...$$[$0]); + this.$ = $$[$0]; + break; + case 62: + yy.addRel("rel_u", ...$$[$0]); + this.$ = $$[$0]; + break; + case 63: + yy.addRel("rel_d", ...$$[$0]); + this.$ = $$[$0]; + break; + case 64: + yy.addRel("rel_l", ...$$[$0]); + this.$ = $$[$0]; + break; + case 65: + yy.addRel("rel_r", ...$$[$0]); + this.$ = $$[$0]; + break; + case 66: + yy.addRel("rel_b", ...$$[$0]); + this.$ = $$[$0]; + break; + case 67: + $$[$0].splice(0, 1); + yy.addRel("rel", ...$$[$0]); + this.$ = $$[$0]; + break; + case 68: + yy.updateElStyle("update_el_style", ...$$[$0]); + this.$ = $$[$0]; + break; + case 69: + yy.updateRelStyle("update_rel_style", ...$$[$0]); + this.$ = $$[$0]; + break; + case 70: + yy.updateLayoutConfig("update_layout_config", ...$$[$0]); + this.$ = $$[$0]; + break; + case 71: + this.$ = [$$[$0]]; + break; + case 72: + $$[$0].unshift($$[$0 - 1]); + this.$ = $$[$0]; + break; + case 73: + case 75: + this.$ = $$[$0].trim(); + break; + case 74: + let kv = {}; + kv[$$[$0 - 1].trim()] = $$[$0].trim(); + this.$ = kv; + break; + case 76: + this.$ = ""; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: 2, 5: 3, 6: [1, 5], 7: [1, 6], 8: [1, 7], 9: [1, 8], 10: 4, 11: [1, 9], 15: [1, 10], 16: [1, 11], 17: [1, 12], 18: [1, 13] }, { 1: [3] }, { 1: [2, 1] }, { 1: [2, 2] }, { 1: [2, 7] }, { 1: [2, 3] }, { 1: [2, 4] }, { 1: [2, 5] }, { 1: [2, 6] }, { 12: [1, 14] }, { 12: [1, 15] }, { 12: [1, 16] }, { 12: [1, 17] }, { 12: [1, 18] }, { 13: 19, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 70, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 71, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 72, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 13: 73, 19: 20, 20: 21, 21: 22, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 14: [1, 74] }, o($VH, [2, 13], { 43: 23, 29: 49, 30: 61, 32: 62, 20: 75, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }), o($VH, [2, 14]), o($VI, [2, 16], { 12: [1, 76] }), o($VH, [2, 36], { 12: [1, 77] }), o($VJ, [2, 19]), o($VJ, [2, 20]), { 25: [1, 78] }, { 27: [1, 79] }, o($VJ, [2, 23]), { 35: 80, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 86, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 87, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 88, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 89, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 90, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 91, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 92, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 93, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 94, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 95, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 96, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 97, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 98, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 99, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 100, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 101, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 102, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 103, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 104, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, o($VO, [2, 59]), { 35: 105, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 106, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 107, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 108, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 109, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 110, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 111, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 112, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 113, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 114, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 115, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 20: 116, 29: 49, 30: 61, 32: 62, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 43: 23, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }, { 12: [1, 118], 33: [1, 117] }, { 35: 119, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 120, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 121, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 122, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 123, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 124, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 35: 125, 75: 81, 76: $VK, 77: $VL, 79: $VM, 80: $VN }, { 14: [1, 126] }, { 14: [1, 127] }, { 14: [1, 128] }, { 14: [1, 129] }, { 1: [2, 8] }, o($VH, [2, 15]), o($VI, [2, 17], { 21: 22, 19: 130, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4 }), o($VH, [2, 37], { 19: 20, 20: 21, 21: 22, 43: 23, 29: 49, 30: 61, 32: 62, 13: 131, 22: $V0, 23: $V1, 24: $V2, 26: $V3, 28: $V4, 34: $V5, 36: $V6, 37: $V7, 38: $V8, 39: $V9, 40: $Va, 41: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi, 51: $Vj, 52: $Vk, 53: $Vl, 54: $Vm, 55: $Vn, 56: $Vo, 57: $Vp, 58: $Vq, 59: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 64: $Vw, 65: $Vx, 66: $Vy, 67: $Vz, 68: $VA, 69: $VB, 70: $VC, 71: $VD, 72: $VE, 73: $VF, 74: $VG }), o($VJ, [2, 21]), o($VJ, [2, 22]), o($VO, [2, 39]), o($VP, [2, 71], { 75: 81, 35: 132, 76: $VK, 77: $VL, 79: $VM, 80: $VN }), o($VQ, [2, 73]), { 78: [1, 133] }, o($VQ, [2, 75]), o($VQ, [2, 76]), o($VO, [2, 40]), o($VO, [2, 41]), o($VO, [2, 42]), o($VO, [2, 43]), o($VO, [2, 44]), o($VO, [2, 45]), o($VO, [2, 46]), o($VO, [2, 47]), o($VO, [2, 48]), o($VO, [2, 49]), o($VO, [2, 50]), o($VO, [2, 51]), o($VO, [2, 52]), o($VO, [2, 53]), o($VO, [2, 54]), o($VO, [2, 55]), o($VO, [2, 56]), o($VO, [2, 57]), o($VO, [2, 58]), o($VO, [2, 60]), o($VO, [2, 61]), o($VO, [2, 62]), o($VO, [2, 63]), o($VO, [2, 64]), o($VO, [2, 65]), o($VO, [2, 66]), o($VO, [2, 67]), o($VO, [2, 68]), o($VO, [2, 69]), o($VO, [2, 70]), { 31: 134, 42: [1, 135] }, { 12: [1, 136] }, { 33: [1, 137] }, o($VR, [2, 28]), o($VR, [2, 29]), o($VR, [2, 30]), o($VR, [2, 31]), o($VR, [2, 32]), o($VR, [2, 33]), o($VR, [2, 34]), { 1: [2, 9] }, { 1: [2, 10] }, { 1: [2, 11] }, { 1: [2, 12] }, o($VI, [2, 18]), o($VH, [2, 38]), o($VP, [2, 72]), o($VQ, [2, 74]), o($VO, [2, 24]), o($VO, [2, 35]), o($VS, [2, 25]), o($VS, [2, 26], { 12: [1, 138] }), o($VS, [2, 27])], + defaultActions: { 2: [2, 1], 3: [2, 2], 4: [2, 7], 5: [2, 3], 6: [2, 4], 7: [2, 5], 8: [2, 6], 74: [2, 8], 126: [2, 9], 127: [2, 10], 128: [2, 11], 129: [2, 12] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c2 = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c2 + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: {}, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + return 6; + break; + case 1: + return 7; + break; + case 2: + return 8; + break; + case 3: + return 9; + break; + case 4: + return 22; + break; + case 5: + return 23; + break; + case 6: + this.begin("acc_title"); + return 24; + break; + case 7: + this.popState(); + return "acc_title_value"; + break; + case 8: + this.begin("acc_descr"); + return 26; + break; + case 9: + this.popState(); + return "acc_descr_value"; + break; + case 10: + this.begin("acc_descr_multiline"); + break; + case 11: + this.popState(); + break; + case 12: + return "acc_descr_multiline_value"; + break; + case 13: + break; + case 14: + c; + break; + case 15: + return 12; + break; + case 16: + break; + case 17: + return 11; + break; + case 18: + return 15; + break; + case 19: + return 16; + break; + case 20: + return 17; + break; + case 21: + return 18; + break; + case 22: + this.begin("person_ext"); + return 45; + break; + case 23: + this.begin("person"); + return 44; + break; + case 24: + this.begin("system_ext_queue"); + return 51; + break; + case 25: + this.begin("system_ext_db"); + return 50; + break; + case 26: + this.begin("system_ext"); + return 49; + break; + case 27: + this.begin("system_queue"); + return 48; + break; + case 28: + this.begin("system_db"); + return 47; + break; + case 29: + this.begin("system"); + return 46; + break; + case 30: + this.begin("boundary"); + return 37; + break; + case 31: + this.begin("enterprise_boundary"); + return 34; + break; + case 32: + this.begin("system_boundary"); + return 36; + break; + case 33: + this.begin("container_ext_queue"); + return 57; + break; + case 34: + this.begin("container_ext_db"); + return 56; + break; + case 35: + this.begin("container_ext"); + return 55; + break; + case 36: + this.begin("container_queue"); + return 54; + break; + case 37: + this.begin("container_db"); + return 53; + break; + case 38: + this.begin("container"); + return 52; + break; + case 39: + this.begin("container_boundary"); + return 38; + break; + case 40: + this.begin("component_ext_queue"); + return 63; + break; + case 41: + this.begin("component_ext_db"); + return 62; + break; + case 42: + this.begin("component_ext"); + return 61; + break; + case 43: + this.begin("component_queue"); + return 60; + break; + case 44: + this.begin("component_db"); + return 59; + break; + case 45: + this.begin("component"); + return 58; + break; + case 46: + this.begin("node"); + return 39; + break; + case 47: + this.begin("node"); + return 39; + break; + case 48: + this.begin("node_l"); + return 40; + break; + case 49: + this.begin("node_r"); + return 41; + break; + case 50: + this.begin("rel"); + return 64; + break; + case 51: + this.begin("birel"); + return 65; + break; + case 52: + this.begin("rel_u"); + return 66; + break; + case 53: + this.begin("rel_u"); + return 66; + break; + case 54: + this.begin("rel_d"); + return 67; + break; + case 55: + this.begin("rel_d"); + return 67; + break; + case 56: + this.begin("rel_l"); + return 68; + break; + case 57: + this.begin("rel_l"); + return 68; + break; + case 58: + this.begin("rel_r"); + return 69; + break; + case 59: + this.begin("rel_r"); + return 69; + break; + case 60: + this.begin("rel_b"); + return 70; + break; + case 61: + this.begin("rel_index"); + return 71; + break; + case 62: + this.begin("update_el_style"); + return 72; + break; + case 63: + this.begin("update_rel_style"); + return 73; + break; + case 64: + this.begin("update_layout_config"); + return 74; + break; + case 65: + return "EOF_IN_STRUCT"; + break; + case 66: + this.begin("attribute"); + return "ATTRIBUTE_EMPTY"; + break; + case 67: + this.begin("attribute"); + break; + case 68: + this.popState(); + this.popState(); + break; + case 69: + return 80; + break; + case 70: + break; + case 71: + return 80; + break; + case 72: + this.begin("string"); + break; + case 73: + this.popState(); + break; + case 74: + return "STR"; + break; + case 75: + this.begin("string_kv"); + break; + case 76: + this.begin("string_kv_key"); + return "STR_KEY"; + break; + case 77: + this.popState(); + this.begin("string_kv_value"); + break; + case 78: + return "STR_VALUE"; + break; + case 79: + this.popState(); + this.popState(); + break; + case 80: + return "STR"; + break; + case 81: + return "LBRACE"; + break; + case 82: + return "RBRACE"; + break; + case 83: + return "SPACE"; + break; + case 84: + return "EOL"; + break; + case 85: + return 14; + break; + } + }, "anonymous"), + rules: [/^(?:.*direction\s+TB[^\n]*)/, /^(?:.*direction\s+BT[^\n]*)/, /^(?:.*direction\s+RL[^\n]*)/, /^(?:.*direction\s+LR[^\n]*)/, /^(?:title\s[^#\n;]+)/, /^(?:accDescription\s[^#\n;]+)/, /^(?:accTitle\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*\{\s*)/, /^(?:[\}])/, /^(?:[^\}]*)/, /^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/, /^(?:%%[^\n]*(\r?\n)*)/, /^(?:\s*(\r?\n)+)/, /^(?:\s+)/, /^(?:C4Context\b)/, /^(?:C4Container\b)/, /^(?:C4Component\b)/, /^(?:C4Dynamic\b)/, /^(?:C4Deployment\b)/, /^(?:Person_Ext\b)/, /^(?:Person\b)/, /^(?:SystemQueue_Ext\b)/, /^(?:SystemDb_Ext\b)/, /^(?:System_Ext\b)/, /^(?:SystemQueue\b)/, /^(?:SystemDb\b)/, /^(?:System\b)/, /^(?:Boundary\b)/, /^(?:Enterprise_Boundary\b)/, /^(?:System_Boundary\b)/, /^(?:ContainerQueue_Ext\b)/, /^(?:ContainerDb_Ext\b)/, /^(?:Container_Ext\b)/, /^(?:ContainerQueue\b)/, /^(?:ContainerDb\b)/, /^(?:Container\b)/, /^(?:Container_Boundary\b)/, /^(?:ComponentQueue_Ext\b)/, /^(?:ComponentDb_Ext\b)/, /^(?:Component_Ext\b)/, /^(?:ComponentQueue\b)/, /^(?:ComponentDb\b)/, /^(?:Component\b)/, /^(?:Deployment_Node\b)/, /^(?:Node\b)/, /^(?:Node_L\b)/, /^(?:Node_R\b)/, /^(?:Rel\b)/, /^(?:BiRel\b)/, /^(?:Rel_Up\b)/, /^(?:Rel_U\b)/, /^(?:Rel_Down\b)/, /^(?:Rel_D\b)/, /^(?:Rel_Left\b)/, /^(?:Rel_L\b)/, /^(?:Rel_Right\b)/, /^(?:Rel_R\b)/, /^(?:Rel_Back\b)/, /^(?:RelIndex\b)/, /^(?:UpdateElementStyle\b)/, /^(?:UpdateRelStyle\b)/, /^(?:UpdateLayoutConfig\b)/, /^(?:$)/, /^(?:[(][ ]*[,])/, /^(?:[(])/, /^(?:[)])/, /^(?:,,)/, /^(?:,)/, /^(?:[ ]*["]["])/, /^(?:[ ]*["])/, /^(?:["])/, /^(?:[^"]*)/, /^(?:[ ]*[\$])/, /^(?:[^=]*)/, /^(?:[=][ ]*["])/, /^(?:[^"]+)/, /^(?:["])/, /^(?:[^,]+)/, /^(?:\{)/, /^(?:\})/, /^(?:[\s]+)/, /^(?:[\n\r]+)/, /^(?:$)/], + conditions: { "acc_descr_multiline": { "rules": [11, 12], "inclusive": false }, "acc_descr": { "rules": [9], "inclusive": false }, "acc_title": { "rules": [7], "inclusive": false }, "string_kv_value": { "rules": [78, 79], "inclusive": false }, "string_kv_key": { "rules": [77], "inclusive": false }, "string_kv": { "rules": [76], "inclusive": false }, "string": { "rules": [73, 74], "inclusive": false }, "attribute": { "rules": [68, 69, 70, 71, 72, 75, 80], "inclusive": false }, "update_layout_config": { "rules": [65, 66, 67, 68], "inclusive": false }, "update_rel_style": { "rules": [65, 66, 67, 68], "inclusive": false }, "update_el_style": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_b": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_r": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_l": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_d": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_u": { "rules": [65, 66, 67, 68], "inclusive": false }, "rel_bi": { "rules": [], "inclusive": false }, "rel": { "rules": [65, 66, 67, 68], "inclusive": false }, "node_r": { "rules": [65, 66, 67, 68], "inclusive": false }, "node_l": { "rules": [65, 66, 67, 68], "inclusive": false }, "node": { "rules": [65, 66, 67, 68], "inclusive": false }, "index": { "rules": [], "inclusive": false }, "rel_index": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_ext_queue": { "rules": [], "inclusive": false }, "component_ext_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "component_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "component": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_ext_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_ext_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "container_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "container": { "rules": [65, 66, 67, 68], "inclusive": false }, "birel": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "enterprise_boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "boundary": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_ext_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_ext_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_queue": { "rules": [65, 66, 67, 68], "inclusive": false }, "system_db": { "rules": [65, 66, 67, 68], "inclusive": false }, "system": { "rules": [65, 66, 67, 68], "inclusive": false }, "person_ext": { "rules": [65, 66, 67, 68], "inclusive": false }, "person": { "rules": [65, 66, 67, 68], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 81, 82, 83, 84, 85], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var c4Diagram_default = parser; + +// src/diagrams/c4/c4Db.js +var c4ShapeArray = []; +var boundaryParseStack = [""]; +var currentBoundaryParse = "global"; +var parentBoundaryParse = ""; +var boundaries = [ + { + alias: "global", + label: { text: "global" }, + type: { text: "global" }, + tags: null, + link: null, + parentBoundary: "" + } +]; +var rels = []; +var title = ""; +var wrapEnabled = false; +var c4ShapeInRow = 4; +var c4BoundaryInRow = 2; +var c4Type; +var getC4Type = /* @__PURE__ */ __name(function() { + return c4Type; +}, "getC4Type"); +var setC4Type = /* @__PURE__ */ __name(function(c4TypeParam) { + let sanitizedText = sanitizeText(c4TypeParam, getConfig()); + c4Type = sanitizedText; +}, "setC4Type"); +var addRel = /* @__PURE__ */ __name(function(type, from, to, label, techn, descr, sprite, tags, link) { + if (type === void 0 || type === null || from === void 0 || from === null || to === void 0 || to === null || label === void 0 || label === null) { + return; + } + let rel = {}; + const old = rels.find((rel2) => rel2.from === from && rel2.to === to); + if (old) { + rel = old; + } else { + rels.push(rel); + } + rel.type = type; + rel.from = from; + rel.to = to; + rel.label = { text: label }; + if (techn === void 0 || techn === null) { + rel.techn = { text: "" }; + } else { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + rel[key] = { text: value }; + } else { + rel.techn = { text: techn }; + } + } + if (descr === void 0 || descr === null) { + rel.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + rel[key] = { text: value }; + } else { + rel.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + rel[key] = value; + } else { + rel.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + rel[key] = value; + } else { + rel.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + rel[key] = value; + } else { + rel.link = link; + } + rel.wrap = autoWrap(); +}, "addRel"); +var addPersonOrSystem = /* @__PURE__ */ __name(function(typeC4Shape, alias, label, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let personOrSystem = {}; + const old = c4ShapeArray.find((personOrSystem2) => personOrSystem2.alias === alias); + if (old && alias === old.alias) { + personOrSystem = old; + } else { + personOrSystem.alias = alias; + c4ShapeArray.push(personOrSystem); + } + if (label === void 0 || label === null) { + personOrSystem.label = { text: "" }; + } else { + personOrSystem.label = { text: label }; + } + if (descr === void 0 || descr === null) { + personOrSystem.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + personOrSystem[key] = { text: value }; + } else { + personOrSystem.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + personOrSystem[key] = value; + } else { + personOrSystem.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + personOrSystem[key] = value; + } else { + personOrSystem.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + personOrSystem[key] = value; + } else { + personOrSystem.link = link; + } + personOrSystem.typeC4Shape = { text: typeC4Shape }; + personOrSystem.parentBoundary = currentBoundaryParse; + personOrSystem.wrap = autoWrap(); +}, "addPersonOrSystem"); +var addContainer = /* @__PURE__ */ __name(function(typeC4Shape, alias, label, techn, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let container = {}; + const old = c4ShapeArray.find((container2) => container2.alias === alias); + if (old && alias === old.alias) { + container = old; + } else { + container.alias = alias; + c4ShapeArray.push(container); + } + if (label === void 0 || label === null) { + container.label = { text: "" }; + } else { + container.label = { text: label }; + } + if (techn === void 0 || techn === null) { + container.techn = { text: "" }; + } else { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + container[key] = { text: value }; + } else { + container.techn = { text: techn }; + } + } + if (descr === void 0 || descr === null) { + container.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + container[key] = { text: value }; + } else { + container.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + container[key] = value; + } else { + container.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + container[key] = value; + } else { + container.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + container[key] = value; + } else { + container.link = link; + } + container.wrap = autoWrap(); + container.typeC4Shape = { text: typeC4Shape }; + container.parentBoundary = currentBoundaryParse; +}, "addContainer"); +var addComponent = /* @__PURE__ */ __name(function(typeC4Shape, alias, label, techn, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let component = {}; + const old = c4ShapeArray.find((component2) => component2.alias === alias); + if (old && alias === old.alias) { + component = old; + } else { + component.alias = alias; + c4ShapeArray.push(component); + } + if (label === void 0 || label === null) { + component.label = { text: "" }; + } else { + component.label = { text: label }; + } + if (techn === void 0 || techn === null) { + component.techn = { text: "" }; + } else { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + component[key] = { text: value }; + } else { + component.techn = { text: techn }; + } + } + if (descr === void 0 || descr === null) { + component.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + component[key] = { text: value }; + } else { + component.descr = { text: descr }; + } + } + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + component[key] = value; + } else { + component.sprite = sprite; + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + component[key] = value; + } else { + component.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + component[key] = value; + } else { + component.link = link; + } + component.wrap = autoWrap(); + component.typeC4Shape = { text: typeC4Shape }; + component.parentBoundary = currentBoundaryParse; +}, "addComponent"); +var addPersonOrSystemBoundary = /* @__PURE__ */ __name(function(alias, label, type, tags, link) { + if (alias === null || label === null) { + return; + } + let boundary = {}; + const old = boundaries.find((boundary2) => boundary2.alias === alias); + if (old && alias === old.alias) { + boundary = old; + } else { + boundary.alias = alias; + boundaries.push(boundary); + } + if (label === void 0 || label === null) { + boundary.label = { text: "" }; + } else { + boundary.label = { text: label }; + } + if (type === void 0 || type === null) { + boundary.type = { text: "system" }; + } else { + if (typeof type === "object") { + let [key, value] = Object.entries(type)[0]; + boundary[key] = { text: value }; + } else { + boundary.type = { text: type }; + } + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + boundary[key] = value; + } else { + boundary.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + boundary[key] = value; + } else { + boundary.link = link; + } + boundary.parentBoundary = currentBoundaryParse; + boundary.wrap = autoWrap(); + parentBoundaryParse = currentBoundaryParse; + currentBoundaryParse = alias; + boundaryParseStack.push(parentBoundaryParse); +}, "addPersonOrSystemBoundary"); +var addContainerBoundary = /* @__PURE__ */ __name(function(alias, label, type, tags, link) { + if (alias === null || label === null) { + return; + } + let boundary = {}; + const old = boundaries.find((boundary2) => boundary2.alias === alias); + if (old && alias === old.alias) { + boundary = old; + } else { + boundary.alias = alias; + boundaries.push(boundary); + } + if (label === void 0 || label === null) { + boundary.label = { text: "" }; + } else { + boundary.label = { text: label }; + } + if (type === void 0 || type === null) { + boundary.type = { text: "container" }; + } else { + if (typeof type === "object") { + let [key, value] = Object.entries(type)[0]; + boundary[key] = { text: value }; + } else { + boundary.type = { text: type }; + } + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + boundary[key] = value; + } else { + boundary.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + boundary[key] = value; + } else { + boundary.link = link; + } + boundary.parentBoundary = currentBoundaryParse; + boundary.wrap = autoWrap(); + parentBoundaryParse = currentBoundaryParse; + currentBoundaryParse = alias; + boundaryParseStack.push(parentBoundaryParse); +}, "addContainerBoundary"); +var addDeploymentNode = /* @__PURE__ */ __name(function(nodeType, alias, label, type, descr, sprite, tags, link) { + if (alias === null || label === null) { + return; + } + let boundary = {}; + const old = boundaries.find((boundary2) => boundary2.alias === alias); + if (old && alias === old.alias) { + boundary = old; + } else { + boundary.alias = alias; + boundaries.push(boundary); + } + if (label === void 0 || label === null) { + boundary.label = { text: "" }; + } else { + boundary.label = { text: label }; + } + if (type === void 0 || type === null) { + boundary.type = { text: "node" }; + } else { + if (typeof type === "object") { + let [key, value] = Object.entries(type)[0]; + boundary[key] = { text: value }; + } else { + boundary.type = { text: type }; + } + } + if (descr === void 0 || descr === null) { + boundary.descr = { text: "" }; + } else { + if (typeof descr === "object") { + let [key, value] = Object.entries(descr)[0]; + boundary[key] = { text: value }; + } else { + boundary.descr = { text: descr }; + } + } + if (typeof tags === "object") { + let [key, value] = Object.entries(tags)[0]; + boundary[key] = value; + } else { + boundary.tags = tags; + } + if (typeof link === "object") { + let [key, value] = Object.entries(link)[0]; + boundary[key] = value; + } else { + boundary.link = link; + } + boundary.nodeType = nodeType; + boundary.parentBoundary = currentBoundaryParse; + boundary.wrap = autoWrap(); + parentBoundaryParse = currentBoundaryParse; + currentBoundaryParse = alias; + boundaryParseStack.push(parentBoundaryParse); +}, "addDeploymentNode"); +var popBoundaryParseStack = /* @__PURE__ */ __name(function() { + currentBoundaryParse = parentBoundaryParse; + boundaryParseStack.pop(); + parentBoundaryParse = boundaryParseStack.pop(); + boundaryParseStack.push(parentBoundaryParse); +}, "popBoundaryParseStack"); +var updateElStyle = /* @__PURE__ */ __name(function(typeC4Shape, elementName, bgColor, fontColor, borderColor, shadowing, shape, sprite, techn, legendText, legendSprite) { + let old = c4ShapeArray.find((element) => element.alias === elementName); + if (old === void 0) { + old = boundaries.find((element) => element.alias === elementName); + if (old === void 0) { + return; + } + } + if (bgColor !== void 0 && bgColor !== null) { + if (typeof bgColor === "object") { + let [key, value] = Object.entries(bgColor)[0]; + old[key] = value; + } else { + old.bgColor = bgColor; + } + } + if (fontColor !== void 0 && fontColor !== null) { + if (typeof fontColor === "object") { + let [key, value] = Object.entries(fontColor)[0]; + old[key] = value; + } else { + old.fontColor = fontColor; + } + } + if (borderColor !== void 0 && borderColor !== null) { + if (typeof borderColor === "object") { + let [key, value] = Object.entries(borderColor)[0]; + old[key] = value; + } else { + old.borderColor = borderColor; + } + } + if (shadowing !== void 0 && shadowing !== null) { + if (typeof shadowing === "object") { + let [key, value] = Object.entries(shadowing)[0]; + old[key] = value; + } else { + old.shadowing = shadowing; + } + } + if (shape !== void 0 && shape !== null) { + if (typeof shape === "object") { + let [key, value] = Object.entries(shape)[0]; + old[key] = value; + } else { + old.shape = shape; + } + } + if (sprite !== void 0 && sprite !== null) { + if (typeof sprite === "object") { + let [key, value] = Object.entries(sprite)[0]; + old[key] = value; + } else { + old.sprite = sprite; + } + } + if (techn !== void 0 && techn !== null) { + if (typeof techn === "object") { + let [key, value] = Object.entries(techn)[0]; + old[key] = value; + } else { + old.techn = techn; + } + } + if (legendText !== void 0 && legendText !== null) { + if (typeof legendText === "object") { + let [key, value] = Object.entries(legendText)[0]; + old[key] = value; + } else { + old.legendText = legendText; + } + } + if (legendSprite !== void 0 && legendSprite !== null) { + if (typeof legendSprite === "object") { + let [key, value] = Object.entries(legendSprite)[0]; + old[key] = value; + } else { + old.legendSprite = legendSprite; + } + } +}, "updateElStyle"); +var updateRelStyle = /* @__PURE__ */ __name(function(typeC4Shape, from, to, textColor, lineColor, offsetX, offsetY) { + const old = rels.find((rel) => rel.from === from && rel.to === to); + if (old === void 0) { + return; + } + if (textColor !== void 0 && textColor !== null) { + if (typeof textColor === "object") { + let [key, value] = Object.entries(textColor)[0]; + old[key] = value; + } else { + old.textColor = textColor; + } + } + if (lineColor !== void 0 && lineColor !== null) { + if (typeof lineColor === "object") { + let [key, value] = Object.entries(lineColor)[0]; + old[key] = value; + } else { + old.lineColor = lineColor; + } + } + if (offsetX !== void 0 && offsetX !== null) { + if (typeof offsetX === "object") { + let [key, value] = Object.entries(offsetX)[0]; + old[key] = parseInt(value); + } else { + old.offsetX = parseInt(offsetX); + } + } + if (offsetY !== void 0 && offsetY !== null) { + if (typeof offsetY === "object") { + let [key, value] = Object.entries(offsetY)[0]; + old[key] = parseInt(value); + } else { + old.offsetY = parseInt(offsetY); + } + } +}, "updateRelStyle"); +var updateLayoutConfig = /* @__PURE__ */ __name(function(typeC4Shape, c4ShapeInRowParam, c4BoundaryInRowParam) { + let c4ShapeInRowValue = c4ShapeInRow; + let c4BoundaryInRowValue = c4BoundaryInRow; + if (typeof c4ShapeInRowParam === "object") { + const value = Object.values(c4ShapeInRowParam)[0]; + c4ShapeInRowValue = parseInt(value); + } else { + c4ShapeInRowValue = parseInt(c4ShapeInRowParam); + } + if (typeof c4BoundaryInRowParam === "object") { + const value = Object.values(c4BoundaryInRowParam)[0]; + c4BoundaryInRowValue = parseInt(value); + } else { + c4BoundaryInRowValue = parseInt(c4BoundaryInRowParam); + } + if (c4ShapeInRowValue >= 1) { + c4ShapeInRow = c4ShapeInRowValue; + } + if (c4BoundaryInRowValue >= 1) { + c4BoundaryInRow = c4BoundaryInRowValue; + } +}, "updateLayoutConfig"); +var getC4ShapeInRow = /* @__PURE__ */ __name(function() { + return c4ShapeInRow; +}, "getC4ShapeInRow"); +var getC4BoundaryInRow = /* @__PURE__ */ __name(function() { + return c4BoundaryInRow; +}, "getC4BoundaryInRow"); +var getCurrentBoundaryParse = /* @__PURE__ */ __name(function() { + return currentBoundaryParse; +}, "getCurrentBoundaryParse"); +var getParentBoundaryParse = /* @__PURE__ */ __name(function() { + return parentBoundaryParse; +}, "getParentBoundaryParse"); +var getC4ShapeArray = /* @__PURE__ */ __name(function(parentBoundary) { + if (parentBoundary === void 0 || parentBoundary === null) { + return c4ShapeArray; + } else { + return c4ShapeArray.filter((personOrSystem) => { + return personOrSystem.parentBoundary === parentBoundary; + }); + } +}, "getC4ShapeArray"); +var getC4Shape = /* @__PURE__ */ __name(function(alias) { + return c4ShapeArray.find((personOrSystem) => personOrSystem.alias === alias); +}, "getC4Shape"); +var getC4ShapeKeys = /* @__PURE__ */ __name(function(parentBoundary) { + return Object.keys(getC4ShapeArray(parentBoundary)); +}, "getC4ShapeKeys"); +var getBoundaries = /* @__PURE__ */ __name(function(parentBoundary) { + if (parentBoundary === void 0 || parentBoundary === null) { + return boundaries; + } else { + return boundaries.filter((boundary) => boundary.parentBoundary === parentBoundary); + } +}, "getBoundaries"); +var getBoundarys = getBoundaries; +var getRels = /* @__PURE__ */ __name(function() { + return rels; +}, "getRels"); +var getTitle = /* @__PURE__ */ __name(function() { + return title; +}, "getTitle"); +var setWrap = /* @__PURE__ */ __name(function(wrapSetting) { + wrapEnabled = wrapSetting; +}, "setWrap"); +var autoWrap = /* @__PURE__ */ __name(function() { + return wrapEnabled; +}, "autoWrap"); +var clear = /* @__PURE__ */ __name(function() { + c4ShapeArray = []; + boundaries = [ + { + alias: "global", + label: { text: "global" }, + type: { text: "global" }, + tags: null, + link: null, + parentBoundary: "" + } + ]; + parentBoundaryParse = ""; + currentBoundaryParse = "global"; + boundaryParseStack = [""]; + rels = []; + boundaryParseStack = [""]; + title = ""; + wrapEnabled = false; + c4ShapeInRow = 4; + c4BoundaryInRow = 2; +}, "clear"); +var LINETYPE = { + SOLID: 0, + DOTTED: 1, + NOTE: 2, + SOLID_CROSS: 3, + DOTTED_CROSS: 4, + SOLID_OPEN: 5, + DOTTED_OPEN: 6, + LOOP_START: 10, + LOOP_END: 11, + ALT_START: 12, + ALT_ELSE: 13, + ALT_END: 14, + OPT_START: 15, + OPT_END: 16, + ACTIVE_START: 17, + ACTIVE_END: 18, + PAR_START: 19, + PAR_AND: 20, + PAR_END: 21, + RECT_START: 22, + RECT_END: 23, + SOLID_POINT: 24, + DOTTED_POINT: 25 +}; +var ARROWTYPE = { + FILLED: 0, + OPEN: 1 +}; +var PLACEMENT = { + LEFTOF: 0, + RIGHTOF: 1, + OVER: 2 +}; +var setTitle = /* @__PURE__ */ __name(function(txt) { + let sanitizedText = sanitizeText(txt, getConfig()); + title = sanitizedText; +}, "setTitle"); +var c4Db_default = { + addPersonOrSystem, + addPersonOrSystemBoundary, + addContainer, + addContainerBoundary, + addComponent, + addDeploymentNode, + popBoundaryParseStack, + addRel, + updateElStyle, + updateRelStyle, + updateLayoutConfig, + autoWrap, + setWrap, + getC4ShapeArray, + getC4Shape, + getC4ShapeKeys, + getBoundaries, + getBoundarys, + getCurrentBoundaryParse, + getParentBoundaryParse, + getRels, + getTitle, + getC4Type, + getC4ShapeInRow, + getC4BoundaryInRow, + setAccTitle, + getAccTitle, + getAccDescription, + setAccDescription, + getConfig: /* @__PURE__ */ __name(() => getConfig().c4, "getConfig"), + clear, + LINETYPE, + ARROWTYPE, + PLACEMENT, + setTitle, + setC4Type + // apply, +}; + +// src/diagrams/c4/c4Renderer.js +import { select } from "d3"; + +// src/diagrams/c4/svgDraw.js +import { sanitizeUrl } from "@braintree/sanitize-url"; +var drawRect2 = /* @__PURE__ */ __name(function(elem, rectData) { + return drawRect(elem, rectData); +}, "drawRect"); +var drawImage = /* @__PURE__ */ __name(function(elem, width, height, x, y, link) { + const imageElem = elem.append("image"); + imageElem.attr("width", width); + imageElem.attr("height", height); + imageElem.attr("x", x); + imageElem.attr("y", y); + let sanitizedLink = link.startsWith("data:image/png;base64") ? link : sanitizeUrl(link); + imageElem.attr("xlink:href", sanitizedLink); +}, "drawImage"); +var drawRels = /* @__PURE__ */ __name((elem, rels2, conf2) => { + const relsElem = elem.append("g"); + let i = 0; + for (let rel of rels2) { + let textColor = rel.textColor ? rel.textColor : "#444444"; + let strokeColor = rel.lineColor ? rel.lineColor : "#444444"; + let offsetX = rel.offsetX ? parseInt(rel.offsetX) : 0; + let offsetY = rel.offsetY ? parseInt(rel.offsetY) : 0; + let url = ""; + if (i === 0) { + let line = relsElem.append("line"); + line.attr("x1", rel.startPoint.x); + line.attr("y1", rel.startPoint.y); + line.attr("x2", rel.endPoint.x); + line.attr("y2", rel.endPoint.y); + line.attr("stroke-width", "1"); + line.attr("stroke", strokeColor); + line.style("fill", "none"); + if (rel.type !== "rel_b") { + line.attr("marker-end", "url(" + url + "#arrowhead)"); + } + if (rel.type === "birel" || rel.type === "rel_b") { + line.attr("marker-start", "url(" + url + "#arrowend)"); + } + i = -1; + } else { + let line = relsElem.append("path"); + line.attr("fill", "none").attr("stroke-width", "1").attr("stroke", strokeColor).attr( + "d", + "Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx", rel.startPoint.x).replaceAll("starty", rel.startPoint.y).replaceAll( + "controlx", + rel.startPoint.x + (rel.endPoint.x - rel.startPoint.x) / 2 - (rel.endPoint.x - rel.startPoint.x) / 4 + ).replaceAll("controly", rel.startPoint.y + (rel.endPoint.y - rel.startPoint.y) / 2).replaceAll("stopx", rel.endPoint.x).replaceAll("stopy", rel.endPoint.y) + ); + if (rel.type !== "rel_b") { + line.attr("marker-end", "url(" + url + "#arrowhead)"); + } + if (rel.type === "birel" || rel.type === "rel_b") { + line.attr("marker-start", "url(" + url + "#arrowend)"); + } + } + let messageConf = conf2.messageFont(); + _drawTextCandidateFunc(conf2)( + rel.label.text, + relsElem, + Math.min(rel.startPoint.x, rel.endPoint.x) + Math.abs(rel.endPoint.x - rel.startPoint.x) / 2 + offsetX, + Math.min(rel.startPoint.y, rel.endPoint.y) + Math.abs(rel.endPoint.y - rel.startPoint.y) / 2 + offsetY, + rel.label.width, + rel.label.height, + { fill: textColor }, + messageConf + ); + if (rel.techn && rel.techn.text !== "") { + messageConf = conf2.messageFont(); + _drawTextCandidateFunc(conf2)( + "[" + rel.techn.text + "]", + relsElem, + Math.min(rel.startPoint.x, rel.endPoint.x) + Math.abs(rel.endPoint.x - rel.startPoint.x) / 2 + offsetX, + Math.min(rel.startPoint.y, rel.endPoint.y) + Math.abs(rel.endPoint.y - rel.startPoint.y) / 2 + conf2.messageFontSize + 5 + offsetY, + Math.max(rel.label.width, rel.techn.width), + rel.techn.height, + { fill: textColor, "font-style": "italic" }, + messageConf + ); + } + } +}, "drawRels"); +var drawBoundary = /* @__PURE__ */ __name(function(elem, boundary, conf2) { + const boundaryElem = elem.append("g"); + let fillColor = boundary.bgColor ? boundary.bgColor : "none"; + let strokeColor = boundary.borderColor ? boundary.borderColor : "#444444"; + let fontColor = boundary.fontColor ? boundary.fontColor : "black"; + let attrsValue = { "stroke-width": 1, "stroke-dasharray": "7.0,7.0" }; + if (boundary.nodeType) { + attrsValue = { "stroke-width": 1 }; + } + let rectData = { + x: boundary.x, + y: boundary.y, + fill: fillColor, + stroke: strokeColor, + width: boundary.width, + height: boundary.height, + rx: 2.5, + ry: 2.5, + attrs: attrsValue + }; + drawRect2(boundaryElem, rectData); + let boundaryConf = conf2.boundaryFont(); + boundaryConf.fontWeight = "bold"; + boundaryConf.fontSize = boundaryConf.fontSize + 2; + boundaryConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + boundary.label.text, + boundaryElem, + boundary.x, + boundary.y + boundary.label.Y, + boundary.width, + boundary.height, + { fill: "#444444" }, + boundaryConf + ); + if (boundary.type && boundary.type.text !== "") { + boundaryConf = conf2.boundaryFont(); + boundaryConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + boundary.type.text, + boundaryElem, + boundary.x, + boundary.y + boundary.type.Y, + boundary.width, + boundary.height, + { fill: "#444444" }, + boundaryConf + ); + } + if (boundary.descr && boundary.descr.text !== "") { + boundaryConf = conf2.boundaryFont(); + boundaryConf.fontSize = boundaryConf.fontSize - 2; + boundaryConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + boundary.descr.text, + boundaryElem, + boundary.x, + boundary.y + boundary.descr.Y, + boundary.width, + boundary.height, + { fill: "#444444" }, + boundaryConf + ); + } +}, "drawBoundary"); +var drawC4Shape = /* @__PURE__ */ __name(function(elem, c4Shape, conf2) { + let fillColor = c4Shape.bgColor ? c4Shape.bgColor : conf2[c4Shape.typeC4Shape.text + "_bg_color"]; + let strokeColor = c4Shape.borderColor ? c4Shape.borderColor : conf2[c4Shape.typeC4Shape.text + "_border_color"]; + let fontColor = c4Shape.fontColor ? c4Shape.fontColor : "#FFFFFF"; + let personImg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII="; + switch (c4Shape.typeC4Shape.text) { + case "person": + personImg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII="; + break; + case "external_person": + personImg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII="; + break; + } + const c4ShapeElem = elem.append("g"); + c4ShapeElem.attr("class", "person-man"); + const rect = getNoteRect(); + switch (c4Shape.typeC4Shape.text) { + case "person": + case "external_person": + case "system": + case "external_system": + case "container": + case "external_container": + case "component": + case "external_component": + rect.x = c4Shape.x; + rect.y = c4Shape.y; + rect.fill = fillColor; + rect.width = c4Shape.width; + rect.height = c4Shape.height; + rect.stroke = strokeColor; + rect.rx = 2.5; + rect.ry = 2.5; + rect.attrs = { "stroke-width": 0.5 }; + drawRect2(c4ShapeElem, rect); + break; + case "system_db": + case "external_system_db": + case "container_db": + case "external_container_db": + case "component_db": + case "external_component_db": + c4ShapeElem.append("path").attr("fill", fillColor).attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx", c4Shape.x).replaceAll("starty", c4Shape.y).replaceAll("half", c4Shape.width / 2).replaceAll("height", c4Shape.height) + ); + c4ShapeElem.append("path").attr("fill", "none").attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx", c4Shape.x).replaceAll("starty", c4Shape.y).replaceAll("half", c4Shape.width / 2) + ); + break; + case "system_queue": + case "external_system_queue": + case "container_queue": + case "external_container_queue": + case "component_queue": + case "external_component_queue": + c4ShapeElem.append("path").attr("fill", fillColor).attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx", c4Shape.x).replaceAll("starty", c4Shape.y).replaceAll("width", c4Shape.width).replaceAll("half", c4Shape.height / 2) + ); + c4ShapeElem.append("path").attr("fill", "none").attr("stroke-width", "0.5").attr("stroke", strokeColor).attr( + "d", + "Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx", c4Shape.x + c4Shape.width).replaceAll("starty", c4Shape.y).replaceAll("half", c4Shape.height / 2) + ); + break; + } + let c4ShapeFontConf = getC4ShapeFont(conf2, c4Shape.typeC4Shape.text); + c4ShapeElem.append("text").attr("fill", fontColor).attr("font-family", c4ShapeFontConf.fontFamily).attr("font-size", c4ShapeFontConf.fontSize - 2).attr("font-style", "italic").attr("lengthAdjust", "spacing").attr("textLength", c4Shape.typeC4Shape.width).attr("x", c4Shape.x + c4Shape.width / 2 - c4Shape.typeC4Shape.width / 2).attr("y", c4Shape.y + c4Shape.typeC4Shape.Y).text("<<" + c4Shape.typeC4Shape.text + ">>"); + switch (c4Shape.typeC4Shape.text) { + case "person": + case "external_person": + drawImage( + c4ShapeElem, + 48, + 48, + c4Shape.x + c4Shape.width / 2 - 24, + c4Shape.y + c4Shape.image.Y, + personImg + ); + break; + } + let textFontConf = conf2[c4Shape.typeC4Shape.text + "Font"](); + textFontConf.fontWeight = "bold"; + textFontConf.fontSize = textFontConf.fontSize + 2; + textFontConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + c4Shape.label.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.label.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor }, + textFontConf + ); + textFontConf = conf2[c4Shape.typeC4Shape.text + "Font"](); + textFontConf.fontColor = fontColor; + if (c4Shape.techn && c4Shape.techn?.text !== "") { + _drawTextCandidateFunc(conf2)( + c4Shape.techn.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.techn.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor, "font-style": "italic" }, + textFontConf + ); + } else if (c4Shape.type && c4Shape.type.text !== "") { + _drawTextCandidateFunc(conf2)( + c4Shape.type.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.type.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor, "font-style": "italic" }, + textFontConf + ); + } + if (c4Shape.descr && c4Shape.descr.text !== "") { + textFontConf = conf2.personFont(); + textFontConf.fontColor = fontColor; + _drawTextCandidateFunc(conf2)( + c4Shape.descr.text, + c4ShapeElem, + c4Shape.x, + c4Shape.y + c4Shape.descr.Y, + c4Shape.width, + c4Shape.height, + { fill: fontColor }, + textFontConf + ); + } + return c4Shape.height; +}, "drawC4Shape"); +var insertDatabaseIcon = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("symbol").attr("id", "database").attr("fill-rule", "evenodd").attr("clip-rule", "evenodd").append("path").attr("transform", "scale(.5)").attr( + "d", + "M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z" + ); +}, "insertDatabaseIcon"); +var insertComputerIcon = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("symbol").attr("id", "computer").attr("width", "24").attr("height", "24").append("path").attr("transform", "scale(.5)").attr( + "d", + "M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z" + ); +}, "insertComputerIcon"); +var insertClockIcon = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("symbol").attr("id", "clock").attr("width", "24").attr("height", "24").append("path").attr("transform", "scale(.5)").attr( + "d", + "M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z" + ); +}, "insertClockIcon"); +var insertArrowHead = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("marker").attr("id", "arrowhead").attr("refX", 9).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 12).attr("markerHeight", 12).attr("orient", "auto").append("path").attr("d", "M 0 0 L 10 5 L 0 10 z"); +}, "insertArrowHead"); +var insertArrowEnd = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("marker").attr("id", "arrowend").attr("refX", 1).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 12).attr("markerHeight", 12).attr("orient", "auto").append("path").attr("d", "M 10 0 L 0 5 L 10 10 z"); +}, "insertArrowEnd"); +var insertArrowFilledHead = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("marker").attr("id", "filled-head").attr("refX", 18).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L14,7 L9,1 Z"); +}, "insertArrowFilledHead"); +var insertDynamicNumber = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("marker").attr("id", "sequencenumber").attr("refX", 15).attr("refY", 15).attr("markerWidth", 60).attr("markerHeight", 40).attr("orient", "auto").append("circle").attr("cx", 15).attr("cy", 15).attr("r", 6); +}, "insertDynamicNumber"); +var insertArrowCrossHead = /* @__PURE__ */ __name(function(elem) { + const defs = elem.append("defs"); + const marker = defs.append("marker").attr("id", "crosshead").attr("markerWidth", 15).attr("markerHeight", 8).attr("orient", "auto").attr("refX", 16).attr("refY", 4); + marker.append("path").attr("fill", "black").attr("stroke", "#000000").style("stroke-dasharray", "0, 0").attr("stroke-width", "1px").attr("d", "M 9,2 V 6 L16,4 Z"); + marker.append("path").attr("fill", "none").attr("stroke", "#000000").style("stroke-dasharray", "0, 0").attr("stroke-width", "1px").attr("d", "M 0,1 L 6,7 M 6,1 L 0,7"); +}, "insertArrowCrossHead"); +var getC4ShapeFont = /* @__PURE__ */ __name((cnf, typeC4Shape) => { + return { + fontFamily: cnf[typeC4Shape + "FontFamily"], + fontSize: cnf[typeC4Shape + "FontSize"], + fontWeight: cnf[typeC4Shape + "FontWeight"] + }; +}, "getC4ShapeFont"); +var _drawTextCandidateFunc = /* @__PURE__ */ (function() { + function byText(content, g, x, y, width, height, textAttrs) { + const text = g.append("text").attr("x", x + width / 2).attr("y", y + height / 2 + 5).style("text-anchor", "middle").text(content); + _setTextAttrs(text, textAttrs); + } + __name(byText, "byText"); + function byTspan(content, g, x, y, width, height, textAttrs, conf2) { + const { fontSize, fontFamily, fontWeight } = conf2; + const lines = content.split(common_default.lineBreakRegex); + for (let i = 0; i < lines.length; i++) { + const dy = i * fontSize - fontSize * (lines.length - 1) / 2; + const text = g.append("text").attr("x", x + width / 2).attr("y", y).style("text-anchor", "middle").attr("dominant-baseline", "middle").style("font-size", fontSize).style("font-weight", fontWeight).style("font-family", fontFamily); + text.append("tspan").attr("dy", dy).text(lines[i]).attr("alignment-baseline", "mathematical"); + _setTextAttrs(text, textAttrs); + } + } + __name(byTspan, "byTspan"); + function byFo(content, g, x, y, width, height, textAttrs, conf2) { + const s = g.append("switch"); + const f = s.append("foreignObject").attr("x", x).attr("y", y).attr("width", width).attr("height", height); + const text = f.append("xhtml:div").style("display", "table").style("height", "100%").style("width", "100%"); + text.append("div").style("display", "table-cell").style("text-align", "center").style("vertical-align", "middle").text(content); + byTspan(content, s, x, y, width, height, textAttrs, conf2); + _setTextAttrs(text, textAttrs); + } + __name(byFo, "byFo"); + function _setTextAttrs(toText, fromTextAttrsDict) { + for (const key in fromTextAttrsDict) { + if (fromTextAttrsDict.hasOwnProperty(key)) { + toText.attr(key, fromTextAttrsDict[key]); + } + } + } + __name(_setTextAttrs, "_setTextAttrs"); + return function(conf2) { + return conf2.textPlacement === "fo" ? byFo : conf2.textPlacement === "old" ? byText : byTspan; + }; +})(); +var svgDraw_default = { + drawRect: drawRect2, + drawBoundary, + drawC4Shape, + drawRels, + drawImage, + insertArrowHead, + insertArrowEnd, + insertArrowFilledHead, + insertDynamicNumber, + insertArrowCrossHead, + insertDatabaseIcon, + insertComputerIcon, + insertClockIcon +}; + +// src/diagrams/c4/c4Renderer.js +var globalBoundaryMaxX = 0; +var globalBoundaryMaxY = 0; +var c4ShapeInRow2 = 4; +var c4BoundaryInRow2 = 2; +parser.yy = c4Db_default; +var conf = {}; +var Bounds = class { + static { + __name(this, "Bounds"); + } + constructor(diagObj) { + this.name = ""; + this.data = {}; + this.data.startx = void 0; + this.data.stopx = void 0; + this.data.starty = void 0; + this.data.stopy = void 0; + this.data.widthLimit = void 0; + this.nextData = {}; + this.nextData.startx = void 0; + this.nextData.stopx = void 0; + this.nextData.starty = void 0; + this.nextData.stopy = void 0; + this.nextData.cnt = 0; + setConf(diagObj.db.getConfig()); + } + setData(startx, stopx, starty, stopy) { + this.nextData.startx = this.data.startx = startx; + this.nextData.stopx = this.data.stopx = stopx; + this.nextData.starty = this.data.starty = starty; + this.nextData.stopy = this.data.stopy = stopy; + } + updateVal(obj, key, val, fun) { + if (obj[key] === void 0) { + obj[key] = val; + } else { + obj[key] = fun(val, obj[key]); + } + } + insert(c4Shape) { + this.nextData.cnt = this.nextData.cnt + 1; + let _startx = this.nextData.startx === this.nextData.stopx ? this.nextData.stopx + c4Shape.margin : this.nextData.stopx + c4Shape.margin * 2; + let _stopx = _startx + c4Shape.width; + let _starty = this.nextData.starty + c4Shape.margin * 2; + let _stopy = _starty + c4Shape.height; + if (_startx >= this.data.widthLimit || _stopx >= this.data.widthLimit || this.nextData.cnt > c4ShapeInRow2) { + _startx = this.nextData.startx + c4Shape.margin + conf.nextLinePaddingX; + _starty = this.nextData.stopy + c4Shape.margin * 2; + this.nextData.stopx = _stopx = _startx + c4Shape.width; + this.nextData.starty = this.nextData.stopy; + this.nextData.stopy = _stopy = _starty + c4Shape.height; + this.nextData.cnt = 1; + } + c4Shape.x = _startx; + c4Shape.y = _starty; + this.updateVal(this.data, "startx", _startx, Math.min); + this.updateVal(this.data, "starty", _starty, Math.min); + this.updateVal(this.data, "stopx", _stopx, Math.max); + this.updateVal(this.data, "stopy", _stopy, Math.max); + this.updateVal(this.nextData, "startx", _startx, Math.min); + this.updateVal(this.nextData, "starty", _starty, Math.min); + this.updateVal(this.nextData, "stopx", _stopx, Math.max); + this.updateVal(this.nextData, "stopy", _stopy, Math.max); + } + init(diagObj) { + this.name = ""; + this.data = { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0, + widthLimit: void 0 + }; + this.nextData = { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0, + cnt: 0 + }; + setConf(diagObj.db.getConfig()); + } + bumpLastMargin(margin) { + this.data.stopx += margin; + this.data.stopy += margin; + } +}; +var setConf = /* @__PURE__ */ __name(function(cnf) { + assignWithDepth_default(conf, cnf); + if (cnf.fontFamily) { + conf.personFontFamily = conf.systemFontFamily = conf.messageFontFamily = cnf.fontFamily; + } + if (cnf.fontSize) { + conf.personFontSize = conf.systemFontSize = conf.messageFontSize = cnf.fontSize; + } + if (cnf.fontWeight) { + conf.personFontWeight = conf.systemFontWeight = conf.messageFontWeight = cnf.fontWeight; + } +}, "setConf"); +var c4ShapeFont = /* @__PURE__ */ __name((cnf, typeC4Shape) => { + return { + fontFamily: cnf[typeC4Shape + "FontFamily"], + fontSize: cnf[typeC4Shape + "FontSize"], + fontWeight: cnf[typeC4Shape + "FontWeight"] + }; +}, "c4ShapeFont"); +var boundaryFont = /* @__PURE__ */ __name((cnf) => { + return { + fontFamily: cnf.boundaryFontFamily, + fontSize: cnf.boundaryFontSize, + fontWeight: cnf.boundaryFontWeight + }; +}, "boundaryFont"); +var messageFont = /* @__PURE__ */ __name((cnf) => { + return { + fontFamily: cnf.messageFontFamily, + fontSize: cnf.messageFontSize, + fontWeight: cnf.messageFontWeight + }; +}, "messageFont"); +function calcC4ShapeTextWH(textType, c4Shape, c4ShapeTextWrap, textConf, textLimitWidth) { + if (!c4Shape[textType].width) { + if (c4ShapeTextWrap) { + c4Shape[textType].text = wrapLabel(c4Shape[textType].text, textLimitWidth, textConf); + c4Shape[textType].textLines = c4Shape[textType].text.split(common_default.lineBreakRegex).length; + c4Shape[textType].width = textLimitWidth; + c4Shape[textType].height = calculateTextHeight(c4Shape[textType].text, textConf); + } else { + let lines = c4Shape[textType].text.split(common_default.lineBreakRegex); + c4Shape[textType].textLines = lines.length; + let lineHeight = 0; + c4Shape[textType].height = 0; + c4Shape[textType].width = 0; + for (const line of lines) { + c4Shape[textType].width = Math.max( + calculateTextWidth(line, textConf), + c4Shape[textType].width + ); + lineHeight = calculateTextHeight(line, textConf); + c4Shape[textType].height = c4Shape[textType].height + lineHeight; + } + } + } +} +__name(calcC4ShapeTextWH, "calcC4ShapeTextWH"); +var drawBoundary2 = /* @__PURE__ */ __name(function(diagram2, boundary, bounds) { + boundary.x = bounds.data.startx; + boundary.y = bounds.data.starty; + boundary.width = bounds.data.stopx - bounds.data.startx; + boundary.height = bounds.data.stopy - bounds.data.starty; + boundary.label.y = conf.c4ShapeMargin - 35; + let boundaryTextWrap = boundary.wrap && conf.wrap; + let boundaryLabelConf = boundaryFont(conf); + boundaryLabelConf.fontSize = boundaryLabelConf.fontSize + 2; + boundaryLabelConf.fontWeight = "bold"; + let textLimitWidth = calculateTextWidth(boundary.label.text, boundaryLabelConf); + calcC4ShapeTextWH("label", boundary, boundaryTextWrap, boundaryLabelConf, textLimitWidth); + svgDraw_default.drawBoundary(diagram2, boundary, conf); +}, "drawBoundary"); +var drawC4ShapeArray = /* @__PURE__ */ __name(function(currentBounds, diagram2, c4ShapeArray2, c4ShapeKeys) { + let Y = 0; + for (const c4ShapeKey of c4ShapeKeys) { + Y = 0; + const c4Shape = c4ShapeArray2[c4ShapeKey]; + let c4ShapeTypeConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + c4ShapeTypeConf.fontSize = c4ShapeTypeConf.fontSize - 2; + c4Shape.typeC4Shape.width = calculateTextWidth( + "\xAB" + c4Shape.typeC4Shape.text + "\xBB", + c4ShapeTypeConf + ); + c4Shape.typeC4Shape.height = c4ShapeTypeConf.fontSize + 2; + c4Shape.typeC4Shape.Y = conf.c4ShapePadding; + Y = c4Shape.typeC4Shape.Y + c4Shape.typeC4Shape.height - 4; + c4Shape.image = { width: 0, height: 0, Y: 0 }; + switch (c4Shape.typeC4Shape.text) { + case "person": + case "external_person": + c4Shape.image.width = 48; + c4Shape.image.height = 48; + c4Shape.image.Y = Y; + Y = c4Shape.image.Y + c4Shape.image.height; + break; + } + if (c4Shape.sprite) { + c4Shape.image.width = 48; + c4Shape.image.height = 48; + c4Shape.image.Y = Y; + Y = c4Shape.image.Y + c4Shape.image.height; + } + let c4ShapeTextWrap = c4Shape.wrap && conf.wrap; + let textLimitWidth = conf.width - conf.c4ShapePadding * 2; + let c4ShapeLabelConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + c4ShapeLabelConf.fontSize = c4ShapeLabelConf.fontSize + 2; + c4ShapeLabelConf.fontWeight = "bold"; + calcC4ShapeTextWH("label", c4Shape, c4ShapeTextWrap, c4ShapeLabelConf, textLimitWidth); + c4Shape.label.Y = Y + 8; + Y = c4Shape.label.Y + c4Shape.label.height; + if (c4Shape.type && c4Shape.type.text !== "") { + c4Shape.type.text = "[" + c4Shape.type.text + "]"; + let c4ShapeTypeConf2 = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + calcC4ShapeTextWH("type", c4Shape, c4ShapeTextWrap, c4ShapeTypeConf2, textLimitWidth); + c4Shape.type.Y = Y + 5; + Y = c4Shape.type.Y + c4Shape.type.height; + } else if (c4Shape.techn && c4Shape.techn.text !== "") { + c4Shape.techn.text = "[" + c4Shape.techn.text + "]"; + let c4ShapeTechnConf = c4ShapeFont(conf, c4Shape.techn.text); + calcC4ShapeTextWH("techn", c4Shape, c4ShapeTextWrap, c4ShapeTechnConf, textLimitWidth); + c4Shape.techn.Y = Y + 5; + Y = c4Shape.techn.Y + c4Shape.techn.height; + } + let rectHeight = Y; + let rectWidth = c4Shape.label.width; + if (c4Shape.descr && c4Shape.descr.text !== "") { + let c4ShapeDescrConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text); + calcC4ShapeTextWH("descr", c4Shape, c4ShapeTextWrap, c4ShapeDescrConf, textLimitWidth); + c4Shape.descr.Y = Y + 20; + Y = c4Shape.descr.Y + c4Shape.descr.height; + rectWidth = Math.max(c4Shape.label.width, c4Shape.descr.width); + rectHeight = Y - c4Shape.descr.textLines * 5; + } + rectWidth = rectWidth + conf.c4ShapePadding; + c4Shape.width = Math.max(c4Shape.width || conf.width, rectWidth, conf.width); + c4Shape.height = Math.max(c4Shape.height || conf.height, rectHeight, conf.height); + c4Shape.margin = c4Shape.margin || conf.c4ShapeMargin; + currentBounds.insert(c4Shape); + svgDraw_default.drawC4Shape(diagram2, c4Shape, conf); + } + currentBounds.bumpLastMargin(conf.c4ShapeMargin); +}, "drawC4ShapeArray"); +var Point = class { + static { + __name(this, "Point"); + } + constructor(x, y) { + this.x = x; + this.y = y; + } +}; +var getIntersectPoint = /* @__PURE__ */ __name(function(fromNode, endPoint) { + let x1 = fromNode.x; + let y1 = fromNode.y; + let x2 = endPoint.x; + let y2 = endPoint.y; + let fromCenterX = x1 + fromNode.width / 2; + let fromCenterY = y1 + fromNode.height / 2; + let dx = Math.abs(x1 - x2); + let dy = Math.abs(y1 - y2); + let tanDYX = dy / dx; + let fromDYX = fromNode.height / fromNode.width; + let returnPoint = null; + if (y1 == y2 && x1 < x2) { + returnPoint = new Point(x1 + fromNode.width, fromCenterY); + } else if (y1 == y2 && x1 > x2) { + returnPoint = new Point(x1, fromCenterY); + } else if (x1 == x2 && y1 < y2) { + returnPoint = new Point(fromCenterX, y1 + fromNode.height); + } else if (x1 == x2 && y1 > y2) { + returnPoint = new Point(fromCenterX, y1); + } + if (x1 > x2 && y1 < y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1, fromCenterY + tanDYX * fromNode.width / 2); + } else { + returnPoint = new Point( + fromCenterX - dx / dy * fromNode.height / 2, + y1 + fromNode.height + ); + } + } else if (x1 < x2 && y1 < y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1 + fromNode.width, fromCenterY + tanDYX * fromNode.width / 2); + } else { + returnPoint = new Point( + fromCenterX + dx / dy * fromNode.height / 2, + y1 + fromNode.height + ); + } + } else if (x1 < x2 && y1 > y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1 + fromNode.width, fromCenterY - tanDYX * fromNode.width / 2); + } else { + returnPoint = new Point(fromCenterX + fromNode.height / 2 * dx / dy, y1); + } + } else if (x1 > x2 && y1 > y2) { + if (fromDYX >= tanDYX) { + returnPoint = new Point(x1, fromCenterY - fromNode.width / 2 * tanDYX); + } else { + returnPoint = new Point(fromCenterX - fromNode.height / 2 * dx / dy, y1); + } + } + return returnPoint; +}, "getIntersectPoint"); +var getIntersectPoints = /* @__PURE__ */ __name(function(fromNode, endNode) { + let endIntersectPoint = { x: 0, y: 0 }; + endIntersectPoint.x = endNode.x + endNode.width / 2; + endIntersectPoint.y = endNode.y + endNode.height / 2; + let startPoint = getIntersectPoint(fromNode, endIntersectPoint); + endIntersectPoint.x = fromNode.x + fromNode.width / 2; + endIntersectPoint.y = fromNode.y + fromNode.height / 2; + let endPoint = getIntersectPoint(endNode, endIntersectPoint); + return { startPoint, endPoint }; +}, "getIntersectPoints"); +var drawRels2 = /* @__PURE__ */ __name(function(diagram2, rels2, getC4ShapeObj, diagObj) { + let i = 0; + for (let rel of rels2) { + i = i + 1; + let relTextWrap = rel.wrap && conf.wrap; + let relConf = messageFont(conf); + let diagramType = diagObj.db.getC4Type(); + if (diagramType === "C4Dynamic") { + rel.label.text = i + ": " + rel.label.text; + } + let textLimitWidth = calculateTextWidth(rel.label.text, relConf); + calcC4ShapeTextWH("label", rel, relTextWrap, relConf, textLimitWidth); + if (rel.techn && rel.techn.text !== "") { + textLimitWidth = calculateTextWidth(rel.techn.text, relConf); + calcC4ShapeTextWH("techn", rel, relTextWrap, relConf, textLimitWidth); + } + if (rel.descr && rel.descr.text !== "") { + textLimitWidth = calculateTextWidth(rel.descr.text, relConf); + calcC4ShapeTextWH("descr", rel, relTextWrap, relConf, textLimitWidth); + } + let fromNode = getC4ShapeObj(rel.from); + let endNode = getC4ShapeObj(rel.to); + let points = getIntersectPoints(fromNode, endNode); + rel.startPoint = points.startPoint; + rel.endPoint = points.endPoint; + } + svgDraw_default.drawRels(diagram2, rels2, conf); +}, "drawRels"); +function drawInsideBoundary(diagram2, parentBoundaryAlias, parentBounds, currentBoundaries, diagObj) { + let currentBounds = new Bounds(diagObj); + currentBounds.data.widthLimit = parentBounds.data.widthLimit / Math.min(c4BoundaryInRow2, currentBoundaries.length); + for (let [i, currentBoundary] of currentBoundaries.entries()) { + let Y = 0; + currentBoundary.image = { width: 0, height: 0, Y: 0 }; + if (currentBoundary.sprite) { + currentBoundary.image.width = 48; + currentBoundary.image.height = 48; + currentBoundary.image.Y = Y; + Y = currentBoundary.image.Y + currentBoundary.image.height; + } + let currentBoundaryTextWrap = currentBoundary.wrap && conf.wrap; + let currentBoundaryLabelConf = boundaryFont(conf); + currentBoundaryLabelConf.fontSize = currentBoundaryLabelConf.fontSize + 2; + currentBoundaryLabelConf.fontWeight = "bold"; + calcC4ShapeTextWH( + "label", + currentBoundary, + currentBoundaryTextWrap, + currentBoundaryLabelConf, + currentBounds.data.widthLimit + ); + currentBoundary.label.Y = Y + 8; + Y = currentBoundary.label.Y + currentBoundary.label.height; + if (currentBoundary.type && currentBoundary.type.text !== "") { + currentBoundary.type.text = "[" + currentBoundary.type.text + "]"; + let currentBoundaryTypeConf = boundaryFont(conf); + calcC4ShapeTextWH( + "type", + currentBoundary, + currentBoundaryTextWrap, + currentBoundaryTypeConf, + currentBounds.data.widthLimit + ); + currentBoundary.type.Y = Y + 5; + Y = currentBoundary.type.Y + currentBoundary.type.height; + } + if (currentBoundary.descr && currentBoundary.descr.text !== "") { + let currentBoundaryDescrConf = boundaryFont(conf); + currentBoundaryDescrConf.fontSize = currentBoundaryDescrConf.fontSize - 2; + calcC4ShapeTextWH( + "descr", + currentBoundary, + currentBoundaryTextWrap, + currentBoundaryDescrConf, + currentBounds.data.widthLimit + ); + currentBoundary.descr.Y = Y + 20; + Y = currentBoundary.descr.Y + currentBoundary.descr.height; + } + if (i == 0 || i % c4BoundaryInRow2 === 0) { + let _x = parentBounds.data.startx + conf.diagramMarginX; + let _y = parentBounds.data.stopy + conf.diagramMarginY + Y; + currentBounds.setData(_x, _x, _y, _y); + } else { + let _x = currentBounds.data.stopx !== currentBounds.data.startx ? currentBounds.data.stopx + conf.diagramMarginX : currentBounds.data.startx; + let _y = currentBounds.data.starty; + currentBounds.setData(_x, _x, _y, _y); + } + currentBounds.name = currentBoundary.alias; + let currentPersonOrSystemArray = diagObj.db.getC4ShapeArray(currentBoundary.alias); + let currentPersonOrSystemKeys = diagObj.db.getC4ShapeKeys(currentBoundary.alias); + if (currentPersonOrSystemKeys.length > 0) { + drawC4ShapeArray( + currentBounds, + diagram2, + currentPersonOrSystemArray, + currentPersonOrSystemKeys + ); + } + parentBoundaryAlias = currentBoundary.alias; + let nextCurrentBoundaries = diagObj.db.getBoundaries(parentBoundaryAlias); + if (nextCurrentBoundaries.length > 0) { + drawInsideBoundary( + diagram2, + parentBoundaryAlias, + currentBounds, + nextCurrentBoundaries, + diagObj + ); + } + if (currentBoundary.alias !== "global") { + drawBoundary2(diagram2, currentBoundary, currentBounds); + } + parentBounds.data.stopy = Math.max( + currentBounds.data.stopy + conf.c4ShapeMargin, + parentBounds.data.stopy + ); + parentBounds.data.stopx = Math.max( + currentBounds.data.stopx + conf.c4ShapeMargin, + parentBounds.data.stopx + ); + globalBoundaryMaxX = Math.max(globalBoundaryMaxX, parentBounds.data.stopx); + globalBoundaryMaxY = Math.max(globalBoundaryMaxY, parentBounds.data.stopy); + } +} +__name(drawInsideBoundary, "drawInsideBoundary"); +var draw = /* @__PURE__ */ __name(function(_text, id, _version, diagObj) { + conf = getConfig().c4; + const securityLevel = getConfig().securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = select("#i" + id); + } + const root = securityLevel === "sandbox" ? select(sandboxElement.nodes()[0].contentDocument.body) : select("body"); + let db = diagObj.db; + diagObj.db.setWrap(conf.wrap); + c4ShapeInRow2 = db.getC4ShapeInRow(); + c4BoundaryInRow2 = db.getC4BoundaryInRow(); + log.debug(`C:${JSON.stringify(conf, null, 2)}`); + const diagram2 = securityLevel === "sandbox" ? root.select(`[id="${id}"]`) : select(`[id="${id}"]`); + svgDraw_default.insertComputerIcon(diagram2); + svgDraw_default.insertDatabaseIcon(diagram2); + svgDraw_default.insertClockIcon(diagram2); + let screenBounds = new Bounds(diagObj); + screenBounds.setData( + conf.diagramMarginX, + conf.diagramMarginX, + conf.diagramMarginY, + conf.diagramMarginY + ); + screenBounds.data.widthLimit = screen.availWidth; + globalBoundaryMaxX = conf.diagramMarginX; + globalBoundaryMaxY = conf.diagramMarginY; + const title2 = diagObj.db.getTitle(); + let currentBoundaries = diagObj.db.getBoundaries(""); + drawInsideBoundary(diagram2, "", screenBounds, currentBoundaries, diagObj); + svgDraw_default.insertArrowHead(diagram2); + svgDraw_default.insertArrowEnd(diagram2); + svgDraw_default.insertArrowCrossHead(diagram2); + svgDraw_default.insertArrowFilledHead(diagram2); + drawRels2(diagram2, diagObj.db.getRels(), diagObj.db.getC4Shape, diagObj); + screenBounds.data.stopx = globalBoundaryMaxX; + screenBounds.data.stopy = globalBoundaryMaxY; + const box = screenBounds.data; + let boxHeight = box.stopy - box.starty; + let height = boxHeight + 2 * conf.diagramMarginY; + let boxWidth = box.stopx - box.startx; + const width = boxWidth + 2 * conf.diagramMarginX; + if (title2) { + diagram2.append("text").text(title2).attr("x", (box.stopx - box.startx) / 2 - 4 * conf.diagramMarginX).attr("y", box.starty + conf.diagramMarginY); + } + configureSvgSize(diagram2, height, width, conf.useMaxWidth); + const extraVertForTitle = title2 ? 60 : 0; + diagram2.attr( + "viewBox", + box.startx - conf.diagramMarginX + " -" + (conf.diagramMarginY + extraVertForTitle) + " " + width + " " + (height + extraVertForTitle) + ); + log.debug(`models:`, box); +}, "draw"); +var c4Renderer_default = { + drawPersonOrSystemArray: drawC4ShapeArray, + drawBoundary: drawBoundary2, + setConf, + draw +}; + +// src/diagrams/c4/styles.js +var getStyles = /* @__PURE__ */ __name((options) => `.person { + stroke: ${options.personBorder}; + fill: ${options.personBkg}; + } +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/c4/c4Diagram.ts +var diagram = { + parser: c4Diagram_default, + db: c4Db_default, + renderer: c4Renderer_default, + styles: styles_default, + init: /* @__PURE__ */ __name(({ c4, wrap }) => { + c4Renderer_default.setConf(c4); + c4Db_default.setWrap(wrap); + }, "init") +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/c4Diagram-YG6GDRKO.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/c4Diagram-YG6GDRKO.mjs.map new file mode 100644 index 0000000..ec2b873 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/c4Diagram-YG6GDRKO.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/c4/parser/c4Diagram.jison", "../../../src/diagrams/c4/c4Db.js", "../../../src/diagrams/c4/c4Renderer.js", "../../../src/diagrams/c4/svgDraw.js", "../../../src/diagrams/c4/styles.js", "../../../src/diagrams/c4/c4Diagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,24],$V1=[1,25],$V2=[1,26],$V3=[1,27],$V4=[1,28],$V5=[1,63],$V6=[1,64],$V7=[1,65],$V8=[1,66],$V9=[1,67],$Va=[1,68],$Vb=[1,69],$Vc=[1,29],$Vd=[1,30],$Ve=[1,31],$Vf=[1,32],$Vg=[1,33],$Vh=[1,34],$Vi=[1,35],$Vj=[1,36],$Vk=[1,37],$Vl=[1,38],$Vm=[1,39],$Vn=[1,40],$Vo=[1,41],$Vp=[1,42],$Vq=[1,43],$Vr=[1,44],$Vs=[1,45],$Vt=[1,46],$Vu=[1,47],$Vv=[1,48],$Vw=[1,50],$Vx=[1,51],$Vy=[1,52],$Vz=[1,53],$VA=[1,54],$VB=[1,55],$VC=[1,56],$VD=[1,57],$VE=[1,58],$VF=[1,59],$VG=[1,60],$VH=[14,42],$VI=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],$VJ=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],$VK=[1,82],$VL=[1,83],$VM=[1,84],$VN=[1,85],$VO=[12,14,42],$VP=[12,14,33,42],$VQ=[12,14,33,42,76,77,79,80],$VR=[12,33],$VS=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"mermaidDoc\":4,\"direction\":5,\"direction_tb\":6,\"direction_bt\":7,\"direction_rl\":8,\"direction_lr\":9,\"graphConfig\":10,\"C4_CONTEXT\":11,\"NEWLINE\":12,\"statements\":13,\"EOF\":14,\"C4_CONTAINER\":15,\"C4_COMPONENT\":16,\"C4_DYNAMIC\":17,\"C4_DEPLOYMENT\":18,\"otherStatements\":19,\"diagramStatements\":20,\"otherStatement\":21,\"title\":22,\"accDescription\":23,\"acc_title\":24,\"acc_title_value\":25,\"acc_descr\":26,\"acc_descr_value\":27,\"acc_descr_multiline_value\":28,\"boundaryStatement\":29,\"boundaryStartStatement\":30,\"boundaryStopStatement\":31,\"boundaryStart\":32,\"LBRACE\":33,\"ENTERPRISE_BOUNDARY\":34,\"attributes\":35,\"SYSTEM_BOUNDARY\":36,\"BOUNDARY\":37,\"CONTAINER_BOUNDARY\":38,\"NODE\":39,\"NODE_L\":40,\"NODE_R\":41,\"RBRACE\":42,\"diagramStatement\":43,\"PERSON\":44,\"PERSON_EXT\":45,\"SYSTEM\":46,\"SYSTEM_DB\":47,\"SYSTEM_QUEUE\":48,\"SYSTEM_EXT\":49,\"SYSTEM_EXT_DB\":50,\"SYSTEM_EXT_QUEUE\":51,\"CONTAINER\":52,\"CONTAINER_DB\":53,\"CONTAINER_QUEUE\":54,\"CONTAINER_EXT\":55,\"CONTAINER_EXT_DB\":56,\"CONTAINER_EXT_QUEUE\":57,\"COMPONENT\":58,\"COMPONENT_DB\":59,\"COMPONENT_QUEUE\":60,\"COMPONENT_EXT\":61,\"COMPONENT_EXT_DB\":62,\"COMPONENT_EXT_QUEUE\":63,\"REL\":64,\"BIREL\":65,\"REL_U\":66,\"REL_D\":67,\"REL_L\":68,\"REL_R\":69,\"REL_B\":70,\"REL_INDEX\":71,\"UPDATE_EL_STYLE\":72,\"UPDATE_REL_STYLE\":73,\"UPDATE_LAYOUT_CONFIG\":74,\"attribute\":75,\"STR\":76,\"STR_KEY\":77,\"STR_VALUE\":78,\"ATTRIBUTE\":79,\"ATTRIBUTE_EMPTY\":80,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",6:\"direction_tb\",7:\"direction_bt\",8:\"direction_rl\",9:\"direction_lr\",11:\"C4_CONTEXT\",12:\"NEWLINE\",14:\"EOF\",15:\"C4_CONTAINER\",16:\"C4_COMPONENT\",17:\"C4_DYNAMIC\",18:\"C4_DEPLOYMENT\",22:\"title\",23:\"accDescription\",24:\"acc_title\",25:\"acc_title_value\",26:\"acc_descr\",27:\"acc_descr_value\",28:\"acc_descr_multiline_value\",33:\"LBRACE\",34:\"ENTERPRISE_BOUNDARY\",36:\"SYSTEM_BOUNDARY\",37:\"BOUNDARY\",38:\"CONTAINER_BOUNDARY\",39:\"NODE\",40:\"NODE_L\",41:\"NODE_R\",42:\"RBRACE\",44:\"PERSON\",45:\"PERSON_EXT\",46:\"SYSTEM\",47:\"SYSTEM_DB\",48:\"SYSTEM_QUEUE\",49:\"SYSTEM_EXT\",50:\"SYSTEM_EXT_DB\",51:\"SYSTEM_EXT_QUEUE\",52:\"CONTAINER\",53:\"CONTAINER_DB\",54:\"CONTAINER_QUEUE\",55:\"CONTAINER_EXT\",56:\"CONTAINER_EXT_DB\",57:\"CONTAINER_EXT_QUEUE\",58:\"COMPONENT\",59:\"COMPONENT_DB\",60:\"COMPONENT_QUEUE\",61:\"COMPONENT_EXT\",62:\"COMPONENT_EXT_DB\",63:\"COMPONENT_EXT_QUEUE\",64:\"REL\",65:\"BIREL\",66:\"REL_U\",67:\"REL_D\",68:\"REL_L\",69:\"REL_R\",70:\"REL_B\",71:\"REL_INDEX\",72:\"UPDATE_EL_STYLE\",73:\"UPDATE_REL_STYLE\",74:\"UPDATE_LAYOUT_CONFIG\",76:\"STR\",77:\"STR_KEY\",78:\"STR_VALUE\",79:\"ATTRIBUTE\",80:\"ATTRIBUTE_EMPTY\"},\nproductions_: [0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 3:\n yy.setDirection('TB');\nbreak;\ncase 4:\n yy.setDirection('BT');\nbreak;\ncase 5:\n yy.setDirection('RL');\nbreak;\ncase 6:\n yy.setDirection('LR');\nbreak;\ncase 8: case 9: case 10: case 11: case 12:\nyy.setC4Type($$[$0-3])\nbreak;\ncase 19:\nyy.setTitle($$[$0].substring(6));this.$=$$[$0].substring(6);\nbreak;\ncase 20:\nyy.setAccDescription($$[$0].substring(15));this.$=$$[$0].substring(15);\nbreak;\ncase 21:\n this.$=$$[$0].trim();yy.setTitle(this.$); \nbreak;\ncase 22: case 23:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 28:\n$$[$0].splice(2, 0, 'ENTERPRISE'); yy.addPersonOrSystemBoundary(...$$[$0]); this.$=$$[$0];\nbreak;\ncase 29:\n$$[$0].splice(2, 0, 'SYSTEM'); yy.addPersonOrSystemBoundary(...$$[$0]); this.$=$$[$0];\nbreak;\ncase 30:\nyy.addPersonOrSystemBoundary(...$$[$0]); this.$=$$[$0];\nbreak;\ncase 31:\n$$[$0].splice(2, 0, 'CONTAINER'); yy.addContainerBoundary(...$$[$0]); this.$=$$[$0];\nbreak;\ncase 32:\nyy.addDeploymentNode('node', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 33:\nyy.addDeploymentNode('nodeL', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 34:\nyy.addDeploymentNode('nodeR', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 35:\n yy.popBoundaryParseStack() \nbreak;\ncase 39:\nyy.addPersonOrSystem('person', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 40:\nyy.addPersonOrSystem('external_person', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 41:\nyy.addPersonOrSystem('system', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 42:\nyy.addPersonOrSystem('system_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 43:\nyy.addPersonOrSystem('system_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 44:\nyy.addPersonOrSystem('external_system', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 45:\nyy.addPersonOrSystem('external_system_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 46:\nyy.addPersonOrSystem('external_system_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 47:\nyy.addContainer('container', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 48:\nyy.addContainer('container_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 49:\nyy.addContainer('container_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 50:\nyy.addContainer('external_container', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 51:\nyy.addContainer('external_container_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 52:\nyy.addContainer('external_container_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 53:\nyy.addComponent('component', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 54:\nyy.addComponent('component_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 55:\nyy.addComponent('component_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 56:\nyy.addComponent('external_component', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 57:\nyy.addComponent('external_component_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 58:\nyy.addComponent('external_component_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 60:\nyy.addRel('rel', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 61:\nyy.addRel('birel', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 62:\nyy.addRel('rel_u', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 63:\nyy.addRel('rel_d', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 64:\nyy.addRel('rel_l', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 65:\nyy.addRel('rel_r', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 66:\nyy.addRel('rel_b', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 67:\n$$[$0].splice(0, 1); yy.addRel('rel', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 68:\nyy.updateElStyle('update_el_style', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 69:\nyy.updateRelStyle('update_rel_style', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 70:\nyy.updateLayoutConfig('update_layout_config', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 71:\n this.$ = [$$[$0]]; \nbreak;\ncase 72:\n $$[$0].unshift($$[$0-1]); this.$=$$[$0];\nbreak;\ncase 73: case 75:\n this.$ = $$[$0].trim(); \nbreak;\ncase 74:\n let kv={}; kv[$$[$0-1].trim()]=$$[$0].trim(); this.$=kv; \nbreak;\ncase 76:\n this.$ = \"\"; \nbreak;\n}\n},\ntable: [{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{13:70,19:20,20:21,21:22,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{13:71,19:20,20:21,21:22,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{13:72,19:20,20:21,21:22,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{13:73,19:20,20:21,21:22,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{14:[1,74]},o($VH,[2,13],{43:23,29:49,30:61,32:62,20:75,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG}),o($VH,[2,14]),o($VI,[2,16],{12:[1,76]}),o($VH,[2,36],{12:[1,77]}),o($VJ,[2,19]),o($VJ,[2,20]),{25:[1,78]},{27:[1,79]},o($VJ,[2,23]),{35:80,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:86,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:87,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:88,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:89,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:90,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:91,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:92,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:93,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:94,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:95,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:96,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:97,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:98,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:99,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:100,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:101,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:102,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:103,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:104,75:81,76:$VK,77:$VL,79:$VM,80:$VN},o($VO,[2,59]),{35:105,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:106,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:107,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:108,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:109,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:110,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:111,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:112,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:113,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:114,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:115,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{20:116,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{12:[1,118],33:[1,117]},{35:119,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:120,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:121,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:122,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:123,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:124,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:125,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},o($VH,[2,15]),o($VI,[2,17],{21:22,19:130,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4}),o($VH,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG}),o($VJ,[2,21]),o($VJ,[2,22]),o($VO,[2,39]),o($VP,[2,71],{75:81,35:132,76:$VK,77:$VL,79:$VM,80:$VN}),o($VQ,[2,73]),{78:[1,133]},o($VQ,[2,75]),o($VQ,[2,76]),o($VO,[2,40]),o($VO,[2,41]),o($VO,[2,42]),o($VO,[2,43]),o($VO,[2,44]),o($VO,[2,45]),o($VO,[2,46]),o($VO,[2,47]),o($VO,[2,48]),o($VO,[2,49]),o($VO,[2,50]),o($VO,[2,51]),o($VO,[2,52]),o($VO,[2,53]),o($VO,[2,54]),o($VO,[2,55]),o($VO,[2,56]),o($VO,[2,57]),o($VO,[2,58]),o($VO,[2,60]),o($VO,[2,61]),o($VO,[2,62]),o($VO,[2,63]),o($VO,[2,64]),o($VO,[2,65]),o($VO,[2,66]),o($VO,[2,67]),o($VO,[2,68]),o($VO,[2,69]),o($VO,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},o($VR,[2,28]),o($VR,[2,29]),o($VR,[2,30]),o($VR,[2,31]),o($VR,[2,32]),o($VR,[2,33]),o($VR,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},o($VI,[2,18]),o($VH,[2,38]),o($VP,[2,72]),o($VQ,[2,74]),o($VO,[2,24]),o($VO,[2,35]),o($VS,[2,25]),o($VS,[2,26],{12:[1,138]}),o($VS,[2,27])],\ndefaultActions: {2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 6;\nbreak;\ncase 1:return 7;\nbreak;\ncase 2:return 8;\nbreak;\ncase 3:return 9;\nbreak;\ncase 4:return 22;\nbreak;\ncase 5:return 23;\nbreak;\ncase 6: this.begin(\"acc_title\");return 24; \nbreak;\ncase 7: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 8: this.begin(\"acc_descr\");return 26; \nbreak;\ncase 9: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 10: this.begin(\"acc_descr_multiline\");\nbreak;\ncase 11: this.popState(); \nbreak;\ncase 12:return \"acc_descr_multiline_value\";\nbreak;\ncase 13:/* skip comments */\nbreak;\ncase 14:c /* skip comments */\nbreak;\ncase 15:return 12;\nbreak;\ncase 16:/* skip whitespace */\nbreak;\ncase 17:return 11;\nbreak;\ncase 18:return 15;\nbreak;\ncase 19:return 16;\nbreak;\ncase 20:return 17;\nbreak;\ncase 21:return 18;\nbreak;\ncase 22: this.begin(\"person_ext\"); return 45;\nbreak;\ncase 23: this.begin(\"person\"); return 44;\nbreak;\ncase 24: this.begin(\"system_ext_queue\"); return 51;\nbreak;\ncase 25: this.begin(\"system_ext_db\"); return 50;\nbreak;\ncase 26: this.begin(\"system_ext\"); return 49;\nbreak;\ncase 27: this.begin(\"system_queue\"); return 48;\nbreak;\ncase 28: this.begin(\"system_db\"); return 47;\nbreak;\ncase 29: this.begin(\"system\"); return 46;\nbreak;\ncase 30: this.begin(\"boundary\"); return 37;\nbreak;\ncase 31: this.begin(\"enterprise_boundary\"); return 34;\nbreak;\ncase 32: this.begin(\"system_boundary\"); return 36;\nbreak;\ncase 33: this.begin(\"container_ext_queue\"); return 57;\nbreak;\ncase 34: this.begin(\"container_ext_db\"); return 56;\nbreak;\ncase 35: this.begin(\"container_ext\"); return 55;\nbreak;\ncase 36: this.begin(\"container_queue\"); return 54;\nbreak;\ncase 37: this.begin(\"container_db\"); return 53;\nbreak;\ncase 38: this.begin(\"container\"); return 52;\nbreak;\ncase 39: this.begin(\"container_boundary\"); return 38;\nbreak;\ncase 40: this.begin(\"component_ext_queue\"); return 63;\nbreak;\ncase 41: this.begin(\"component_ext_db\"); return 62;\nbreak;\ncase 42: this.begin(\"component_ext\"); return 61;\nbreak;\ncase 43: this.begin(\"component_queue\"); return 60;\nbreak;\ncase 44: this.begin(\"component_db\"); return 59;\nbreak;\ncase 45: this.begin(\"component\"); return 58;\nbreak;\ncase 46: this.begin(\"node\"); return 39;\nbreak;\ncase 47: this.begin(\"node\"); return 39;\nbreak;\ncase 48: this.begin(\"node_l\"); return 40;\nbreak;\ncase 49: this.begin(\"node_r\"); return 41;\nbreak;\ncase 50: this.begin(\"rel\"); return 64;\nbreak;\ncase 51: this.begin(\"birel\"); return 65;\nbreak;\ncase 52: this.begin(\"rel_u\"); return 66;\nbreak;\ncase 53: this.begin(\"rel_u\"); return 66;\nbreak;\ncase 54: this.begin(\"rel_d\"); return 67;\nbreak;\ncase 55: this.begin(\"rel_d\"); return 67;\nbreak;\ncase 56: this.begin(\"rel_l\"); return 68;\nbreak;\ncase 57: this.begin(\"rel_l\"); return 68;\nbreak;\ncase 58: this.begin(\"rel_r\"); return 69;\nbreak;\ncase 59: this.begin(\"rel_r\"); return 69;\nbreak;\ncase 60: this.begin(\"rel_b\"); return 70;\nbreak;\ncase 61: this.begin(\"rel_index\"); return 71;\nbreak;\ncase 62: this.begin(\"update_el_style\"); return 72;\nbreak;\ncase 63: this.begin(\"update_rel_style\"); return 73;\nbreak;\ncase 64: this.begin(\"update_layout_config\"); return 74;\nbreak;\ncase 65:return \"EOF_IN_STRUCT\";\nbreak;\ncase 66: this.begin(\"attribute\"); return \"ATTRIBUTE_EMPTY\";\nbreak;\ncase 67: this.begin(\"attribute\"); \nbreak;\ncase 68: this.popState();this.popState();\nbreak;\ncase 69: return 80;\nbreak;\ncase 70: \nbreak;\ncase 71: return 80;\nbreak;\ncase 72: this.begin(\"string\");\nbreak;\ncase 73: this.popState(); \nbreak;\ncase 74: return \"STR\";\nbreak;\ncase 75: this.begin(\"string_kv\");\nbreak;\ncase 76: this.begin(\"string_kv_key\"); return \"STR_KEY\";\nbreak;\ncase 77: this.popState(); this.begin(\"string_kv_value\"); \nbreak;\ncase 78: return \"STR_VALUE\";\nbreak;\ncase 79: this.popState(); this.popState(); \nbreak;\ncase 80: return \"STR\";\nbreak;\ncase 81: /* this.begin(\"lbrace\"); */ return \"LBRACE\";\nbreak;\ncase 82: /* this.popState(); */ return \"RBRACE\";\nbreak;\ncase 83:return 'SPACE';\nbreak;\ncase 84:return 'EOL';\nbreak;\ncase 85:return 14;\nbreak;\n}\n},\nrules: [/^(?:.*direction\\s+TB[^\\n]*)/,/^(?:.*direction\\s+BT[^\\n]*)/,/^(?:.*direction\\s+RL[^\\n]*)/,/^(?:.*direction\\s+LR[^\\n]*)/,/^(?:title\\s[^#\\n;]+)/,/^(?:accDescription\\s[^#\\n;]+)/,/^(?:accTitle\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*\\{\\s*)/,/^(?:[\\}])/,/^(?:[^\\}]*)/,/^(?:%%(?!\\{)*[^\\n]*(\\r?\\n?)+)/,/^(?:%%[^\\n]*(\\r?\\n)*)/,/^(?:\\s*(\\r?\\n)+)/,/^(?:\\s+)/,/^(?:C4Context\\b)/,/^(?:C4Container\\b)/,/^(?:C4Component\\b)/,/^(?:C4Dynamic\\b)/,/^(?:C4Deployment\\b)/,/^(?:Person_Ext\\b)/,/^(?:Person\\b)/,/^(?:SystemQueue_Ext\\b)/,/^(?:SystemDb_Ext\\b)/,/^(?:System_Ext\\b)/,/^(?:SystemQueue\\b)/,/^(?:SystemDb\\b)/,/^(?:System\\b)/,/^(?:Boundary\\b)/,/^(?:Enterprise_Boundary\\b)/,/^(?:System_Boundary\\b)/,/^(?:ContainerQueue_Ext\\b)/,/^(?:ContainerDb_Ext\\b)/,/^(?:Container_Ext\\b)/,/^(?:ContainerQueue\\b)/,/^(?:ContainerDb\\b)/,/^(?:Container\\b)/,/^(?:Container_Boundary\\b)/,/^(?:ComponentQueue_Ext\\b)/,/^(?:ComponentDb_Ext\\b)/,/^(?:Component_Ext\\b)/,/^(?:ComponentQueue\\b)/,/^(?:ComponentDb\\b)/,/^(?:Component\\b)/,/^(?:Deployment_Node\\b)/,/^(?:Node\\b)/,/^(?:Node_L\\b)/,/^(?:Node_R\\b)/,/^(?:Rel\\b)/,/^(?:BiRel\\b)/,/^(?:Rel_Up\\b)/,/^(?:Rel_U\\b)/,/^(?:Rel_Down\\b)/,/^(?:Rel_D\\b)/,/^(?:Rel_Left\\b)/,/^(?:Rel_L\\b)/,/^(?:Rel_Right\\b)/,/^(?:Rel_R\\b)/,/^(?:Rel_Back\\b)/,/^(?:RelIndex\\b)/,/^(?:UpdateElementStyle\\b)/,/^(?:UpdateRelStyle\\b)/,/^(?:UpdateLayoutConfig\\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*[\"][\"])/,/^(?:[ ]*[\"])/,/^(?:[\"])/,/^(?:[^\"]*)/,/^(?:[ ]*[\\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*[\"])/,/^(?:[^\"]+)/,/^(?:[\"])/,/^(?:[^,]+)/,/^(?:\\{)/,/^(?:\\})/,/^(?:[\\s]+)/,/^(?:[\\n\\r]+)/,/^(?:$)/],\nconditions: {\"acc_descr_multiline\":{\"rules\":[11,12],\"inclusive\":false},\"acc_descr\":{\"rules\":[9],\"inclusive\":false},\"acc_title\":{\"rules\":[7],\"inclusive\":false},\"string_kv_value\":{\"rules\":[78,79],\"inclusive\":false},\"string_kv_key\":{\"rules\":[77],\"inclusive\":false},\"string_kv\":{\"rules\":[76],\"inclusive\":false},\"string\":{\"rules\":[73,74],\"inclusive\":false},\"attribute\":{\"rules\":[68,69,70,71,72,75,80],\"inclusive\":false},\"update_layout_config\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"update_rel_style\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"update_el_style\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_b\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_r\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_l\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_d\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_u\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_bi\":{\"rules\":[],\"inclusive\":false},\"rel\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"node_r\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"node_l\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"node\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"index\":{\"rules\":[],\"inclusive\":false},\"rel_index\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"component_ext_queue\":{\"rules\":[],\"inclusive\":false},\"component_ext_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"component_ext\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"component_queue\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"component_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"component\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_boundary\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_ext_queue\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_ext_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_ext\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_queue\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"birel\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_boundary\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"enterprise_boundary\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"boundary\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_ext_queue\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_ext_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_ext\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_queue\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"person_ext\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"person\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { sanitizeText } from '../common/common.js';\nimport {\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n} from '../common/commonDb.js';\n\nlet c4ShapeArray = [];\nlet boundaryParseStack = [''];\nlet currentBoundaryParse = 'global';\nlet parentBoundaryParse = '';\nlet boundaries = [\n {\n alias: 'global',\n label: { text: 'global' },\n type: { text: 'global' },\n tags: null,\n link: null,\n parentBoundary: '',\n },\n];\nlet rels = [];\nlet title = '';\nlet wrapEnabled = false;\nlet c4ShapeInRow = 4;\nlet c4BoundaryInRow = 2;\nvar c4Type;\n\nexport const getC4Type = function () {\n return c4Type;\n};\n\nexport const setC4Type = function (c4TypeParam) {\n let sanitizedText = sanitizeText(c4TypeParam, getConfig());\n c4Type = sanitizedText;\n};\n\n//type, from, to, label, ?techn, ?descr, ?sprite, ?tags, $link\nexport const addRel = function (type, from, to, label, techn, descr, sprite, tags, link) {\n // Don't allow label nulling\n if (\n type === undefined ||\n type === null ||\n from === undefined ||\n from === null ||\n to === undefined ||\n to === null ||\n label === undefined ||\n label === null\n ) {\n return;\n }\n\n let rel = {};\n const old = rels.find((rel) => rel.from === from && rel.to === to);\n if (old) {\n rel = old;\n } else {\n rels.push(rel);\n }\n\n rel.type = type;\n rel.from = from;\n rel.to = to;\n rel.label = { text: label };\n\n if (techn === undefined || techn === null) {\n rel.techn = { text: '' };\n } else {\n if (typeof techn === 'object') {\n let [key, value] = Object.entries(techn)[0];\n rel[key] = { text: value };\n } else {\n rel.techn = { text: techn };\n }\n }\n\n if (descr === undefined || descr === null) {\n rel.descr = { text: '' };\n } else {\n if (typeof descr === 'object') {\n let [key, value] = Object.entries(descr)[0];\n rel[key] = { text: value };\n } else {\n rel.descr = { text: descr };\n }\n }\n\n if (typeof sprite === 'object') {\n let [key, value] = Object.entries(sprite)[0];\n rel[key] = value;\n } else {\n rel.sprite = sprite;\n }\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n rel[key] = value;\n } else {\n rel.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n rel[key] = value;\n } else {\n rel.link = link;\n }\n rel.wrap = autoWrap();\n};\n\n//type, alias, label, ?descr, ?sprite, ?tags, $link\nexport const addPersonOrSystem = function (typeC4Shape, alias, label, descr, sprite, tags, link) {\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let personOrSystem = {};\n const old = c4ShapeArray.find((personOrSystem) => personOrSystem.alias === alias);\n if (old && alias === old.alias) {\n personOrSystem = old;\n } else {\n personOrSystem.alias = alias;\n c4ShapeArray.push(personOrSystem);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n personOrSystem.label = { text: '' };\n } else {\n personOrSystem.label = { text: label };\n }\n\n if (descr === undefined || descr === null) {\n personOrSystem.descr = { text: '' };\n } else {\n if (typeof descr === 'object') {\n let [key, value] = Object.entries(descr)[0];\n personOrSystem[key] = { text: value };\n } else {\n personOrSystem.descr = { text: descr };\n }\n }\n\n if (typeof sprite === 'object') {\n let [key, value] = Object.entries(sprite)[0];\n personOrSystem[key] = value;\n } else {\n personOrSystem.sprite = sprite;\n }\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n personOrSystem[key] = value;\n } else {\n personOrSystem.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n personOrSystem[key] = value;\n } else {\n personOrSystem.link = link;\n }\n personOrSystem.typeC4Shape = { text: typeC4Shape };\n personOrSystem.parentBoundary = currentBoundaryParse;\n personOrSystem.wrap = autoWrap();\n};\n\n//type, alias, label, ?techn, ?descr ?sprite, ?tags, $link\nexport const addContainer = function (typeC4Shape, alias, label, techn, descr, sprite, tags, link) {\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let container = {};\n const old = c4ShapeArray.find((container) => container.alias === alias);\n if (old && alias === old.alias) {\n container = old;\n } else {\n container.alias = alias;\n c4ShapeArray.push(container);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n container.label = { text: '' };\n } else {\n container.label = { text: label };\n }\n\n if (techn === undefined || techn === null) {\n container.techn = { text: '' };\n } else {\n if (typeof techn === 'object') {\n let [key, value] = Object.entries(techn)[0];\n container[key] = { text: value };\n } else {\n container.techn = { text: techn };\n }\n }\n\n if (descr === undefined || descr === null) {\n container.descr = { text: '' };\n } else {\n if (typeof descr === 'object') {\n let [key, value] = Object.entries(descr)[0];\n container[key] = { text: value };\n } else {\n container.descr = { text: descr };\n }\n }\n\n if (typeof sprite === 'object') {\n let [key, value] = Object.entries(sprite)[0];\n container[key] = value;\n } else {\n container.sprite = sprite;\n }\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n container[key] = value;\n } else {\n container.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n container[key] = value;\n } else {\n container.link = link;\n }\n container.wrap = autoWrap();\n container.typeC4Shape = { text: typeC4Shape };\n container.parentBoundary = currentBoundaryParse;\n};\n\n//type, alias, label, ?techn, ?descr ?sprite, ?tags, $link\nexport const addComponent = function (typeC4Shape, alias, label, techn, descr, sprite, tags, link) {\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let component = {};\n const old = c4ShapeArray.find((component) => component.alias === alias);\n if (old && alias === old.alias) {\n component = old;\n } else {\n component.alias = alias;\n c4ShapeArray.push(component);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n component.label = { text: '' };\n } else {\n component.label = { text: label };\n }\n\n if (techn === undefined || techn === null) {\n component.techn = { text: '' };\n } else {\n if (typeof techn === 'object') {\n let [key, value] = Object.entries(techn)[0];\n component[key] = { text: value };\n } else {\n component.techn = { text: techn };\n }\n }\n\n if (descr === undefined || descr === null) {\n component.descr = { text: '' };\n } else {\n if (typeof descr === 'object') {\n let [key, value] = Object.entries(descr)[0];\n component[key] = { text: value };\n } else {\n component.descr = { text: descr };\n }\n }\n\n if (typeof sprite === 'object') {\n let [key, value] = Object.entries(sprite)[0];\n component[key] = value;\n } else {\n component.sprite = sprite;\n }\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n component[key] = value;\n } else {\n component.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n component[key] = value;\n } else {\n component.link = link;\n }\n component.wrap = autoWrap();\n component.typeC4Shape = { text: typeC4Shape };\n component.parentBoundary = currentBoundaryParse;\n};\n\n//alias, label, ?type, ?tags, $link\nexport const addPersonOrSystemBoundary = function (alias, label, type, tags, link) {\n // if (parentBoundary === null) return;\n\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let boundary = {};\n const old = boundaries.find((boundary) => boundary.alias === alias);\n if (old && alias === old.alias) {\n boundary = old;\n } else {\n boundary.alias = alias;\n boundaries.push(boundary);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n boundary.label = { text: '' };\n } else {\n boundary.label = { text: label };\n }\n\n if (type === undefined || type === null) {\n boundary.type = { text: 'system' };\n } else {\n if (typeof type === 'object') {\n let [key, value] = Object.entries(type)[0];\n boundary[key] = { text: value };\n } else {\n boundary.type = { text: type };\n }\n }\n\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n boundary[key] = value;\n } else {\n boundary.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n boundary[key] = value;\n } else {\n boundary.link = link;\n }\n boundary.parentBoundary = currentBoundaryParse;\n boundary.wrap = autoWrap();\n\n parentBoundaryParse = currentBoundaryParse;\n currentBoundaryParse = alias;\n boundaryParseStack.push(parentBoundaryParse);\n};\n\n//alias, label, ?type, ?tags, $link\nexport const addContainerBoundary = function (alias, label, type, tags, link) {\n // if (parentBoundary === null) return;\n\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let boundary = {};\n const old = boundaries.find((boundary) => boundary.alias === alias);\n if (old && alias === old.alias) {\n boundary = old;\n } else {\n boundary.alias = alias;\n boundaries.push(boundary);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n boundary.label = { text: '' };\n } else {\n boundary.label = { text: label };\n }\n\n if (type === undefined || type === null) {\n boundary.type = { text: 'container' };\n } else {\n if (typeof type === 'object') {\n let [key, value] = Object.entries(type)[0];\n boundary[key] = { text: value };\n } else {\n boundary.type = { text: type };\n }\n }\n\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n boundary[key] = value;\n } else {\n boundary.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n boundary[key] = value;\n } else {\n boundary.link = link;\n }\n boundary.parentBoundary = currentBoundaryParse;\n boundary.wrap = autoWrap();\n\n parentBoundaryParse = currentBoundaryParse;\n currentBoundaryParse = alias;\n boundaryParseStack.push(parentBoundaryParse);\n};\n\n//alias, label, ?type, ?descr, ?sprite, ?tags, $link\nexport const addDeploymentNode = function (\n nodeType,\n alias,\n label,\n type,\n descr,\n sprite,\n tags,\n link\n) {\n // if (parentBoundary === null) return;\n\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let boundary = {};\n const old = boundaries.find((boundary) => boundary.alias === alias);\n if (old && alias === old.alias) {\n boundary = old;\n } else {\n boundary.alias = alias;\n boundaries.push(boundary);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n boundary.label = { text: '' };\n } else {\n boundary.label = { text: label };\n }\n\n if (type === undefined || type === null) {\n boundary.type = { text: 'node' };\n } else {\n if (typeof type === 'object') {\n let [key, value] = Object.entries(type)[0];\n boundary[key] = { text: value };\n } else {\n boundary.type = { text: type };\n }\n }\n\n if (descr === undefined || descr === null) {\n boundary.descr = { text: '' };\n } else {\n if (typeof descr === 'object') {\n let [key, value] = Object.entries(descr)[0];\n boundary[key] = { text: value };\n } else {\n boundary.descr = { text: descr };\n }\n }\n\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n boundary[key] = value;\n } else {\n boundary.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n boundary[key] = value;\n } else {\n boundary.link = link;\n }\n boundary.nodeType = nodeType;\n boundary.parentBoundary = currentBoundaryParse;\n boundary.wrap = autoWrap();\n\n parentBoundaryParse = currentBoundaryParse;\n currentBoundaryParse = alias;\n boundaryParseStack.push(parentBoundaryParse);\n};\n\nexport const popBoundaryParseStack = function () {\n currentBoundaryParse = parentBoundaryParse;\n boundaryParseStack.pop();\n parentBoundaryParse = boundaryParseStack.pop();\n boundaryParseStack.push(parentBoundaryParse);\n};\n\n//elementName, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?techn, ?legendText, ?legendSprite\nexport const updateElStyle = function (\n typeC4Shape,\n elementName,\n bgColor,\n fontColor,\n borderColor,\n shadowing,\n shape,\n sprite,\n techn,\n legendText,\n legendSprite\n) {\n let old = c4ShapeArray.find((element) => element.alias === elementName);\n if (old === undefined) {\n old = boundaries.find((element) => element.alias === elementName);\n if (old === undefined) {\n return;\n }\n }\n if (bgColor !== undefined && bgColor !== null) {\n if (typeof bgColor === 'object') {\n let [key, value] = Object.entries(bgColor)[0];\n old[key] = value;\n } else {\n old.bgColor = bgColor;\n }\n }\n if (fontColor !== undefined && fontColor !== null) {\n if (typeof fontColor === 'object') {\n let [key, value] = Object.entries(fontColor)[0];\n old[key] = value;\n } else {\n old.fontColor = fontColor;\n }\n }\n if (borderColor !== undefined && borderColor !== null) {\n if (typeof borderColor === 'object') {\n let [key, value] = Object.entries(borderColor)[0];\n old[key] = value;\n } else {\n old.borderColor = borderColor;\n }\n }\n if (shadowing !== undefined && shadowing !== null) {\n if (typeof shadowing === 'object') {\n let [key, value] = Object.entries(shadowing)[0];\n old[key] = value;\n } else {\n old.shadowing = shadowing;\n }\n }\n if (shape !== undefined && shape !== null) {\n if (typeof shape === 'object') {\n let [key, value] = Object.entries(shape)[0];\n old[key] = value;\n } else {\n old.shape = shape;\n }\n }\n if (sprite !== undefined && sprite !== null) {\n if (typeof sprite === 'object') {\n let [key, value] = Object.entries(sprite)[0];\n old[key] = value;\n } else {\n old.sprite = sprite;\n }\n }\n if (techn !== undefined && techn !== null) {\n if (typeof techn === 'object') {\n let [key, value] = Object.entries(techn)[0];\n old[key] = value;\n } else {\n old.techn = techn;\n }\n }\n if (legendText !== undefined && legendText !== null) {\n if (typeof legendText === 'object') {\n let [key, value] = Object.entries(legendText)[0];\n old[key] = value;\n } else {\n old.legendText = legendText;\n }\n }\n if (legendSprite !== undefined && legendSprite !== null) {\n if (typeof legendSprite === 'object') {\n let [key, value] = Object.entries(legendSprite)[0];\n old[key] = value;\n } else {\n old.legendSprite = legendSprite;\n }\n }\n};\n\n//textColor, lineColor, ?offsetX, ?offsetY\nexport const updateRelStyle = function (\n typeC4Shape,\n from,\n to,\n textColor,\n lineColor,\n offsetX,\n offsetY\n) {\n const old = rels.find((rel) => rel.from === from && rel.to === to);\n if (old === undefined) {\n return;\n }\n if (textColor !== undefined && textColor !== null) {\n if (typeof textColor === 'object') {\n let [key, value] = Object.entries(textColor)[0];\n old[key] = value;\n } else {\n old.textColor = textColor;\n }\n }\n if (lineColor !== undefined && lineColor !== null) {\n if (typeof lineColor === 'object') {\n let [key, value] = Object.entries(lineColor)[0];\n old[key] = value;\n } else {\n old.lineColor = lineColor;\n }\n }\n if (offsetX !== undefined && offsetX !== null) {\n if (typeof offsetX === 'object') {\n let [key, value] = Object.entries(offsetX)[0];\n old[key] = parseInt(value);\n } else {\n old.offsetX = parseInt(offsetX);\n }\n }\n if (offsetY !== undefined && offsetY !== null) {\n if (typeof offsetY === 'object') {\n let [key, value] = Object.entries(offsetY)[0];\n old[key] = parseInt(value);\n } else {\n old.offsetY = parseInt(offsetY);\n }\n }\n};\n\n//?c4ShapeInRow, ?c4BoundaryInRow\nexport const updateLayoutConfig = function (typeC4Shape, c4ShapeInRowParam, c4BoundaryInRowParam) {\n let c4ShapeInRowValue = c4ShapeInRow;\n let c4BoundaryInRowValue = c4BoundaryInRow;\n\n if (typeof c4ShapeInRowParam === 'object') {\n const value = Object.values(c4ShapeInRowParam)[0];\n c4ShapeInRowValue = parseInt(value);\n } else {\n c4ShapeInRowValue = parseInt(c4ShapeInRowParam);\n }\n if (typeof c4BoundaryInRowParam === 'object') {\n const value = Object.values(c4BoundaryInRowParam)[0];\n c4BoundaryInRowValue = parseInt(value);\n } else {\n c4BoundaryInRowValue = parseInt(c4BoundaryInRowParam);\n }\n\n if (c4ShapeInRowValue >= 1) {\n c4ShapeInRow = c4ShapeInRowValue;\n }\n if (c4BoundaryInRowValue >= 1) {\n c4BoundaryInRow = c4BoundaryInRowValue;\n }\n};\n\nexport const getC4ShapeInRow = function () {\n return c4ShapeInRow;\n};\nexport const getC4BoundaryInRow = function () {\n return c4BoundaryInRow;\n};\nexport const getCurrentBoundaryParse = function () {\n return currentBoundaryParse;\n};\n\nexport const getParentBoundaryParse = function () {\n return parentBoundaryParse;\n};\n\nexport const getC4ShapeArray = function (parentBoundary) {\n if (parentBoundary === undefined || parentBoundary === null) {\n return c4ShapeArray;\n } else {\n return c4ShapeArray.filter((personOrSystem) => {\n return personOrSystem.parentBoundary === parentBoundary;\n });\n }\n};\nexport const getC4Shape = function (alias) {\n return c4ShapeArray.find((personOrSystem) => personOrSystem.alias === alias);\n};\nexport const getC4ShapeKeys = function (parentBoundary) {\n return Object.keys(getC4ShapeArray(parentBoundary));\n};\n\nexport const getBoundaries = function (parentBoundary) {\n if (parentBoundary === undefined || parentBoundary === null) {\n return boundaries;\n } else {\n return boundaries.filter((boundary) => boundary.parentBoundary === parentBoundary);\n }\n};\n\n// cspell:ignore getBoundarys\n/**\n * @deprecated Use {@link getBoundaries} instead\n */\nexport const getBoundarys = getBoundaries;\n\nexport const getRels = function () {\n return rels;\n};\n\nexport const getTitle = function () {\n return title;\n};\n\nexport const setWrap = function (wrapSetting) {\n wrapEnabled = wrapSetting;\n};\n\nexport const autoWrap = function () {\n return wrapEnabled;\n};\n\nexport const clear = function () {\n c4ShapeArray = [];\n boundaries = [\n {\n alias: 'global',\n label: { text: 'global' },\n type: { text: 'global' },\n tags: null,\n link: null,\n parentBoundary: '',\n },\n ];\n parentBoundaryParse = '';\n currentBoundaryParse = 'global';\n boundaryParseStack = [''];\n rels = [];\n\n boundaryParseStack = [''];\n title = '';\n wrapEnabled = false;\n c4ShapeInRow = 4;\n c4BoundaryInRow = 2;\n};\n\nexport const LINETYPE = {\n SOLID: 0,\n DOTTED: 1,\n NOTE: 2,\n SOLID_CROSS: 3,\n DOTTED_CROSS: 4,\n SOLID_OPEN: 5,\n DOTTED_OPEN: 6,\n LOOP_START: 10,\n LOOP_END: 11,\n ALT_START: 12,\n ALT_ELSE: 13,\n ALT_END: 14,\n OPT_START: 15,\n OPT_END: 16,\n ACTIVE_START: 17,\n ACTIVE_END: 18,\n PAR_START: 19,\n PAR_AND: 20,\n PAR_END: 21,\n RECT_START: 22,\n RECT_END: 23,\n SOLID_POINT: 24,\n DOTTED_POINT: 25,\n};\n\nexport const ARROWTYPE = {\n FILLED: 0,\n OPEN: 1,\n};\n\nexport const PLACEMENT = {\n LEFTOF: 0,\n RIGHTOF: 1,\n OVER: 2,\n};\n\nexport const setTitle = function (txt) {\n let sanitizedText = sanitizeText(txt, getConfig());\n title = sanitizedText;\n};\n\nexport default {\n addPersonOrSystem,\n addPersonOrSystemBoundary,\n addContainer,\n addContainerBoundary,\n addComponent,\n addDeploymentNode,\n popBoundaryParseStack,\n addRel,\n updateElStyle,\n updateRelStyle,\n updateLayoutConfig,\n autoWrap,\n setWrap,\n getC4ShapeArray,\n getC4Shape,\n getC4ShapeKeys,\n getBoundaries,\n getBoundarys,\n getCurrentBoundaryParse,\n getParentBoundaryParse,\n getRels,\n getTitle,\n getC4Type,\n getC4ShapeInRow,\n getC4BoundaryInRow,\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n getConfig: () => getConfig().c4,\n clear,\n LINETYPE,\n ARROWTYPE,\n PLACEMENT,\n setTitle,\n setC4Type,\n // apply,\n};\n", "import { select } from 'd3';\nimport svgDraw from './svgDraw.js';\nimport { log } from '../../logger.js';\nimport { parser } from './parser/c4Diagram.jison';\nimport common from '../common/common.js';\nimport c4Db from './c4Db.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport assignWithDepth from '../../assignWithDepth.js';\nimport { wrapLabel, calculateTextWidth, calculateTextHeight } from '../../utils.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\n\nlet globalBoundaryMaxX = 0,\n globalBoundaryMaxY = 0;\n\nlet c4ShapeInRow = 4;\nlet c4BoundaryInRow = 2;\n\nparser.yy = c4Db;\n\nlet conf = {};\n\nclass Bounds {\n constructor(diagObj) {\n this.name = '';\n this.data = {};\n this.data.startx = undefined;\n this.data.stopx = undefined;\n this.data.starty = undefined;\n this.data.stopy = undefined;\n this.data.widthLimit = undefined;\n\n this.nextData = {};\n this.nextData.startx = undefined;\n this.nextData.stopx = undefined;\n this.nextData.starty = undefined;\n this.nextData.stopy = undefined;\n this.nextData.cnt = 0;\n\n setConf(diagObj.db.getConfig());\n }\n\n setData(startx, stopx, starty, stopy) {\n this.nextData.startx = this.data.startx = startx;\n this.nextData.stopx = this.data.stopx = stopx;\n this.nextData.starty = this.data.starty = starty;\n this.nextData.stopy = this.data.stopy = stopy;\n }\n\n updateVal(obj, key, val, fun) {\n if (obj[key] === undefined) {\n obj[key] = val;\n } else {\n obj[key] = fun(val, obj[key]);\n }\n }\n\n insert(c4Shape) {\n this.nextData.cnt = this.nextData.cnt + 1;\n let _startx =\n this.nextData.startx === this.nextData.stopx\n ? this.nextData.stopx + c4Shape.margin\n : this.nextData.stopx + c4Shape.margin * 2;\n let _stopx = _startx + c4Shape.width;\n let _starty = this.nextData.starty + c4Shape.margin * 2;\n let _stopy = _starty + c4Shape.height;\n if (\n _startx >= this.data.widthLimit ||\n _stopx >= this.data.widthLimit ||\n this.nextData.cnt > c4ShapeInRow\n ) {\n _startx = this.nextData.startx + c4Shape.margin + conf.nextLinePaddingX;\n _starty = this.nextData.stopy + c4Shape.margin * 2;\n\n this.nextData.stopx = _stopx = _startx + c4Shape.width;\n this.nextData.starty = this.nextData.stopy;\n this.nextData.stopy = _stopy = _starty + c4Shape.height;\n this.nextData.cnt = 1;\n }\n\n c4Shape.x = _startx;\n c4Shape.y = _starty;\n\n this.updateVal(this.data, 'startx', _startx, Math.min);\n this.updateVal(this.data, 'starty', _starty, Math.min);\n this.updateVal(this.data, 'stopx', _stopx, Math.max);\n this.updateVal(this.data, 'stopy', _stopy, Math.max);\n\n this.updateVal(this.nextData, 'startx', _startx, Math.min);\n this.updateVal(this.nextData, 'starty', _starty, Math.min);\n this.updateVal(this.nextData, 'stopx', _stopx, Math.max);\n this.updateVal(this.nextData, 'stopy', _stopy, Math.max);\n }\n\n init(diagObj) {\n this.name = '';\n this.data = {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined,\n widthLimit: undefined,\n };\n this.nextData = {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined,\n cnt: 0,\n };\n setConf(diagObj.db.getConfig());\n }\n\n bumpLastMargin(margin) {\n this.data.stopx += margin;\n this.data.stopy += margin;\n }\n}\n\nexport const setConf = function (cnf) {\n assignWithDepth(conf, cnf);\n\n if (cnf.fontFamily) {\n conf.personFontFamily = conf.systemFontFamily = conf.messageFontFamily = cnf.fontFamily;\n }\n if (cnf.fontSize) {\n conf.personFontSize = conf.systemFontSize = conf.messageFontSize = cnf.fontSize;\n }\n if (cnf.fontWeight) {\n conf.personFontWeight = conf.systemFontWeight = conf.messageFontWeight = cnf.fontWeight;\n }\n};\n\nconst c4ShapeFont = (cnf, typeC4Shape) => {\n return {\n fontFamily: cnf[typeC4Shape + 'FontFamily'],\n fontSize: cnf[typeC4Shape + 'FontSize'],\n fontWeight: cnf[typeC4Shape + 'FontWeight'],\n };\n};\n\nconst boundaryFont = (cnf) => {\n return {\n fontFamily: cnf.boundaryFontFamily,\n fontSize: cnf.boundaryFontSize,\n fontWeight: cnf.boundaryFontWeight,\n };\n};\n\nconst messageFont = (cnf) => {\n return {\n fontFamily: cnf.messageFontFamily,\n fontSize: cnf.messageFontSize,\n fontWeight: cnf.messageFontWeight,\n };\n};\n\n/**\n * @param textType\n * @param c4Shape\n * @param c4ShapeTextWrap\n * @param textConf\n * @param textLimitWidth\n */\nfunction calcC4ShapeTextWH(textType, c4Shape, c4ShapeTextWrap, textConf, textLimitWidth) {\n if (!c4Shape[textType].width) {\n if (c4ShapeTextWrap) {\n c4Shape[textType].text = wrapLabel(c4Shape[textType].text, textLimitWidth, textConf);\n c4Shape[textType].textLines = c4Shape[textType].text.split(common.lineBreakRegex).length;\n // c4Shape[textType].width = calculateTextWidth(c4Shape[textType].text, textConf);\n c4Shape[textType].width = textLimitWidth;\n // c4Shape[textType].height = c4Shape[textType].textLines * textConf.fontSize;\n c4Shape[textType].height = calculateTextHeight(c4Shape[textType].text, textConf);\n } else {\n let lines = c4Shape[textType].text.split(common.lineBreakRegex);\n c4Shape[textType].textLines = lines.length;\n let lineHeight = 0;\n c4Shape[textType].height = 0;\n c4Shape[textType].width = 0;\n for (const line of lines) {\n c4Shape[textType].width = Math.max(\n calculateTextWidth(line, textConf),\n c4Shape[textType].width\n );\n lineHeight = calculateTextHeight(line, textConf);\n c4Shape[textType].height = c4Shape[textType].height + lineHeight;\n }\n // c4Shapes[textType].height = c4Shapes[textType].textLines * textConf.fontSize;\n }\n }\n}\n\nexport const drawBoundary = function (diagram, boundary, bounds) {\n boundary.x = bounds.data.startx;\n boundary.y = bounds.data.starty;\n boundary.width = bounds.data.stopx - bounds.data.startx;\n boundary.height = bounds.data.stopy - bounds.data.starty;\n\n boundary.label.y = conf.c4ShapeMargin - 35;\n\n let boundaryTextWrap = boundary.wrap && conf.wrap;\n let boundaryLabelConf = boundaryFont(conf);\n boundaryLabelConf.fontSize = boundaryLabelConf.fontSize + 2;\n boundaryLabelConf.fontWeight = 'bold';\n let textLimitWidth = calculateTextWidth(boundary.label.text, boundaryLabelConf);\n calcC4ShapeTextWH('label', boundary, boundaryTextWrap, boundaryLabelConf, textLimitWidth);\n\n svgDraw.drawBoundary(diagram, boundary, conf);\n};\n\nexport const drawC4ShapeArray = function (currentBounds, diagram, c4ShapeArray, c4ShapeKeys) {\n // Upper Y is relative point\n let Y = 0;\n // Draw the c4ShapeArray\n for (const c4ShapeKey of c4ShapeKeys) {\n Y = 0;\n const c4Shape = c4ShapeArray[c4ShapeKey];\n\n // calc c4 shape type width and height\n\n let c4ShapeTypeConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text);\n c4ShapeTypeConf.fontSize = c4ShapeTypeConf.fontSize - 2;\n c4Shape.typeC4Shape.width = calculateTextWidth(\n '\u00AB' + c4Shape.typeC4Shape.text + '\u00BB',\n c4ShapeTypeConf\n );\n c4Shape.typeC4Shape.height = c4ShapeTypeConf.fontSize + 2;\n c4Shape.typeC4Shape.Y = conf.c4ShapePadding;\n Y = c4Shape.typeC4Shape.Y + c4Shape.typeC4Shape.height - 4;\n\n // set image width and height c4Shape.x + c4Shape.width / 2 - 24, c4Shape.y + 28\n // let imageWidth = 0,\n // imageHeight = 0,\n // imageY = 0;\n //\n c4Shape.image = { width: 0, height: 0, Y: 0 };\n switch (c4Shape.typeC4Shape.text) {\n case 'person':\n case 'external_person':\n c4Shape.image.width = 48;\n c4Shape.image.height = 48;\n c4Shape.image.Y = Y;\n Y = c4Shape.image.Y + c4Shape.image.height;\n break;\n }\n if (c4Shape.sprite) {\n c4Shape.image.width = 48;\n c4Shape.image.height = 48;\n c4Shape.image.Y = Y;\n Y = c4Shape.image.Y + c4Shape.image.height;\n }\n\n // Y = conf.c4ShapePadding + c4Shape.image.height;\n\n let c4ShapeTextWrap = c4Shape.wrap && conf.wrap;\n let textLimitWidth = conf.width - conf.c4ShapePadding * 2;\n\n let c4ShapeLabelConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text);\n c4ShapeLabelConf.fontSize = c4ShapeLabelConf.fontSize + 2;\n c4ShapeLabelConf.fontWeight = 'bold';\n calcC4ShapeTextWH('label', c4Shape, c4ShapeTextWrap, c4ShapeLabelConf, textLimitWidth);\n c4Shape.label.Y = Y + 8;\n Y = c4Shape.label.Y + c4Shape.label.height;\n\n if (c4Shape.type && c4Shape.type.text !== '') {\n c4Shape.type.text = '[' + c4Shape.type.text + ']';\n let c4ShapeTypeConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text);\n calcC4ShapeTextWH('type', c4Shape, c4ShapeTextWrap, c4ShapeTypeConf, textLimitWidth);\n c4Shape.type.Y = Y + 5;\n Y = c4Shape.type.Y + c4Shape.type.height;\n } else if (c4Shape.techn && c4Shape.techn.text !== '') {\n c4Shape.techn.text = '[' + c4Shape.techn.text + ']';\n let c4ShapeTechnConf = c4ShapeFont(conf, c4Shape.techn.text);\n calcC4ShapeTextWH('techn', c4Shape, c4ShapeTextWrap, c4ShapeTechnConf, textLimitWidth);\n c4Shape.techn.Y = Y + 5;\n Y = c4Shape.techn.Y + c4Shape.techn.height;\n }\n\n let rectHeight = Y;\n let rectWidth = c4Shape.label.width;\n\n if (c4Shape.descr && c4Shape.descr.text !== '') {\n let c4ShapeDescrConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text);\n calcC4ShapeTextWH('descr', c4Shape, c4ShapeTextWrap, c4ShapeDescrConf, textLimitWidth);\n c4Shape.descr.Y = Y + 20;\n Y = c4Shape.descr.Y + c4Shape.descr.height;\n\n rectWidth = Math.max(c4Shape.label.width, c4Shape.descr.width);\n rectHeight = Y - c4Shape.descr.textLines * 5;\n }\n\n rectWidth = rectWidth + conf.c4ShapePadding;\n // let rectHeight =\n\n c4Shape.width = Math.max(c4Shape.width || conf.width, rectWidth, conf.width);\n c4Shape.height = Math.max(c4Shape.height || conf.height, rectHeight, conf.height);\n c4Shape.margin = c4Shape.margin || conf.c4ShapeMargin;\n\n currentBounds.insert(c4Shape);\n\n svgDraw.drawC4Shape(diagram, c4Shape, conf);\n }\n\n currentBounds.bumpLastMargin(conf.c4ShapeMargin);\n};\n\nclass Point {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n}\n\n/* * *\n * Get the intersection of the line between the center point of a rectangle and a point outside the rectangle.\n * Algorithm idea.\n * Using a point outside the rectangle as the coordinate origin, the graph is divided into four quadrants, and each quadrant is divided into two cases, with separate treatment on the coordinate axes\n * 1. The case of coordinate axes.\n * 1. The case of the negative x-axis\n * 2. The case of the positive x-axis\n * 3. The case of the positive y-axis\n * 4. The negative y-axis case\n * 2. Quadrant cases.\n * 2.1. first quadrant: the case where the line intersects the left side of the rectangle; the case where it intersects the lower side of the rectangle\n * 2.2. second quadrant: the case where the line intersects the right side of the rectangle; the case where it intersects the lower edge of the rectangle\n * 2.3. third quadrant: the case where the line intersects the right side of the rectangle; the case where it intersects the upper edge of the rectangle\n * 2.4. fourth quadrant: the case where the line intersects the left side of the rectangle; the case where it intersects the upper side of the rectangle\n *\n */\nlet getIntersectPoint = function (fromNode, endPoint) {\n let x1 = fromNode.x;\n\n let y1 = fromNode.y;\n\n let x2 = endPoint.x;\n\n let y2 = endPoint.y;\n\n let fromCenterX = x1 + fromNode.width / 2;\n\n let fromCenterY = y1 + fromNode.height / 2;\n\n let dx = Math.abs(x1 - x2);\n\n let dy = Math.abs(y1 - y2);\n\n let tanDYX = dy / dx;\n\n let fromDYX = fromNode.height / fromNode.width;\n\n let returnPoint = null;\n\n if (y1 == y2 && x1 < x2) {\n returnPoint = new Point(x1 + fromNode.width, fromCenterY);\n } else if (y1 == y2 && x1 > x2) {\n returnPoint = new Point(x1, fromCenterY);\n } else if (x1 == x2 && y1 < y2) {\n returnPoint = new Point(fromCenterX, y1 + fromNode.height);\n } else if (x1 == x2 && y1 > y2) {\n returnPoint = new Point(fromCenterX, y1);\n }\n\n if (x1 > x2 && y1 < y2) {\n if (fromDYX >= tanDYX) {\n returnPoint = new Point(x1, fromCenterY + (tanDYX * fromNode.width) / 2);\n } else {\n returnPoint = new Point(\n fromCenterX - ((dx / dy) * fromNode.height) / 2,\n y1 + fromNode.height\n );\n }\n } else if (x1 < x2 && y1 < y2) {\n //\n if (fromDYX >= tanDYX) {\n returnPoint = new Point(x1 + fromNode.width, fromCenterY + (tanDYX * fromNode.width) / 2);\n } else {\n returnPoint = new Point(\n fromCenterX + ((dx / dy) * fromNode.height) / 2,\n y1 + fromNode.height\n );\n }\n } else if (x1 < x2 && y1 > y2) {\n if (fromDYX >= tanDYX) {\n returnPoint = new Point(x1 + fromNode.width, fromCenterY - (tanDYX * fromNode.width) / 2);\n } else {\n returnPoint = new Point(fromCenterX + ((fromNode.height / 2) * dx) / dy, y1);\n }\n } else if (x1 > x2 && y1 > y2) {\n if (fromDYX >= tanDYX) {\n returnPoint = new Point(x1, fromCenterY - (fromNode.width / 2) * tanDYX);\n } else {\n returnPoint = new Point(fromCenterX - ((fromNode.height / 2) * dx) / dy, y1);\n }\n }\n return returnPoint;\n};\n\nlet getIntersectPoints = function (fromNode, endNode) {\n let endIntersectPoint = { x: 0, y: 0 };\n endIntersectPoint.x = endNode.x + endNode.width / 2;\n endIntersectPoint.y = endNode.y + endNode.height / 2;\n let startPoint = getIntersectPoint(fromNode, endIntersectPoint);\n\n endIntersectPoint.x = fromNode.x + fromNode.width / 2;\n endIntersectPoint.y = fromNode.y + fromNode.height / 2;\n let endPoint = getIntersectPoint(endNode, endIntersectPoint);\n return { startPoint: startPoint, endPoint: endPoint };\n};\n\nexport const drawRels = function (diagram, rels, getC4ShapeObj, diagObj) {\n let i = 0;\n for (let rel of rels) {\n i = i + 1;\n let relTextWrap = rel.wrap && conf.wrap;\n let relConf = messageFont(conf);\n let diagramType = diagObj.db.getC4Type();\n if (diagramType === 'C4Dynamic') {\n rel.label.text = i + ': ' + rel.label.text;\n }\n let textLimitWidth = calculateTextWidth(rel.label.text, relConf);\n calcC4ShapeTextWH('label', rel, relTextWrap, relConf, textLimitWidth);\n\n if (rel.techn && rel.techn.text !== '') {\n textLimitWidth = calculateTextWidth(rel.techn.text, relConf);\n calcC4ShapeTextWH('techn', rel, relTextWrap, relConf, textLimitWidth);\n }\n\n if (rel.descr && rel.descr.text !== '') {\n textLimitWidth = calculateTextWidth(rel.descr.text, relConf);\n calcC4ShapeTextWH('descr', rel, relTextWrap, relConf, textLimitWidth);\n }\n\n let fromNode = getC4ShapeObj(rel.from);\n let endNode = getC4ShapeObj(rel.to);\n let points = getIntersectPoints(fromNode, endNode);\n rel.startPoint = points.startPoint;\n rel.endPoint = points.endPoint;\n }\n svgDraw.drawRels(diagram, rels, conf);\n};\n\n/**\n * @param diagram\n * @param parentBoundaryAlias\n * @param parentBounds\n * @param currentBoundaries\n * @param diagObj\n */\nfunction drawInsideBoundary(\n diagram,\n parentBoundaryAlias,\n parentBounds,\n currentBoundaries,\n diagObj\n) {\n let currentBounds = new Bounds(diagObj);\n // Calculate the width limit of the boundary. label/type \u7684\u957F\u5EA6\uFF0C\n currentBounds.data.widthLimit =\n parentBounds.data.widthLimit / Math.min(c4BoundaryInRow, currentBoundaries.length);\n // Math.min(\n // conf.width * conf.c4ShapeInRow + conf.c4ShapeMargin * conf.c4ShapeInRow * 2,\n // parentBounds.data.widthLimit / Math.min(conf.c4BoundaryInRow, currentBoundaries.length)\n // );\n for (let [i, currentBoundary] of currentBoundaries.entries()) {\n let Y = 0;\n currentBoundary.image = { width: 0, height: 0, Y: 0 };\n if (currentBoundary.sprite) {\n currentBoundary.image.width = 48;\n currentBoundary.image.height = 48;\n currentBoundary.image.Y = Y;\n Y = currentBoundary.image.Y + currentBoundary.image.height;\n }\n\n let currentBoundaryTextWrap = currentBoundary.wrap && conf.wrap;\n\n let currentBoundaryLabelConf = boundaryFont(conf);\n currentBoundaryLabelConf.fontSize = currentBoundaryLabelConf.fontSize + 2;\n currentBoundaryLabelConf.fontWeight = 'bold';\n calcC4ShapeTextWH(\n 'label',\n currentBoundary,\n currentBoundaryTextWrap,\n currentBoundaryLabelConf,\n currentBounds.data.widthLimit\n );\n currentBoundary.label.Y = Y + 8;\n Y = currentBoundary.label.Y + currentBoundary.label.height;\n\n if (currentBoundary.type && currentBoundary.type.text !== '') {\n currentBoundary.type.text = '[' + currentBoundary.type.text + ']';\n let currentBoundaryTypeConf = boundaryFont(conf);\n calcC4ShapeTextWH(\n 'type',\n currentBoundary,\n currentBoundaryTextWrap,\n currentBoundaryTypeConf,\n currentBounds.data.widthLimit\n );\n currentBoundary.type.Y = Y + 5;\n Y = currentBoundary.type.Y + currentBoundary.type.height;\n }\n\n if (currentBoundary.descr && currentBoundary.descr.text !== '') {\n let currentBoundaryDescrConf = boundaryFont(conf);\n currentBoundaryDescrConf.fontSize = currentBoundaryDescrConf.fontSize - 2;\n calcC4ShapeTextWH(\n 'descr',\n currentBoundary,\n currentBoundaryTextWrap,\n currentBoundaryDescrConf,\n currentBounds.data.widthLimit\n );\n currentBoundary.descr.Y = Y + 20;\n Y = currentBoundary.descr.Y + currentBoundary.descr.height;\n }\n\n if (i == 0 || i % c4BoundaryInRow === 0) {\n // Calculate the drawing start point of the currentBoundaries.\n let _x = parentBounds.data.startx + conf.diagramMarginX;\n let _y = parentBounds.data.stopy + conf.diagramMarginY + Y;\n\n currentBounds.setData(_x, _x, _y, _y);\n } else {\n // Calculate the drawing start point of the currentBoundaries.\n let _x =\n currentBounds.data.stopx !== currentBounds.data.startx\n ? currentBounds.data.stopx + conf.diagramMarginX\n : currentBounds.data.startx;\n let _y = currentBounds.data.starty;\n\n currentBounds.setData(_x, _x, _y, _y);\n }\n currentBounds.name = currentBoundary.alias;\n let currentPersonOrSystemArray = diagObj.db.getC4ShapeArray(currentBoundary.alias);\n let currentPersonOrSystemKeys = diagObj.db.getC4ShapeKeys(currentBoundary.alias);\n\n if (currentPersonOrSystemKeys.length > 0) {\n drawC4ShapeArray(\n currentBounds,\n diagram,\n currentPersonOrSystemArray,\n currentPersonOrSystemKeys\n );\n }\n parentBoundaryAlias = currentBoundary.alias;\n let nextCurrentBoundaries = diagObj.db.getBoundaries(parentBoundaryAlias);\n\n if (nextCurrentBoundaries.length > 0) {\n // draw boundary inside currentBoundary\n drawInsideBoundary(\n diagram,\n parentBoundaryAlias,\n currentBounds,\n nextCurrentBoundaries,\n diagObj\n );\n }\n // draw boundary\n if (currentBoundary.alias !== 'global') {\n drawBoundary(diagram, currentBoundary, currentBounds);\n }\n parentBounds.data.stopy = Math.max(\n currentBounds.data.stopy + conf.c4ShapeMargin,\n parentBounds.data.stopy\n );\n parentBounds.data.stopx = Math.max(\n currentBounds.data.stopx + conf.c4ShapeMargin,\n parentBounds.data.stopx\n );\n globalBoundaryMaxX = Math.max(globalBoundaryMaxX, parentBounds.data.stopx);\n globalBoundaryMaxY = Math.max(globalBoundaryMaxY, parentBounds.data.stopy);\n }\n}\n\n/**\n * Draws a sequenceDiagram in the tag with id: id based on the graph definition in text.\n *\n * @param {any} _text\n * @param {any} id\n * @param {any} _version\n * @param diagObj\n */\nexport const draw = function (_text, id, _version, diagObj) {\n conf = getConfig().c4;\n const securityLevel = getConfig().securityLevel;\n // Handle root and Document for when rendering in sandbox mode\n let sandboxElement;\n if (securityLevel === 'sandbox') {\n sandboxElement = select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? select(sandboxElement.nodes()[0].contentDocument.body)\n : select('body');\n\n let db = diagObj.db;\n\n diagObj.db.setWrap(conf.wrap);\n\n c4ShapeInRow = db.getC4ShapeInRow();\n c4BoundaryInRow = db.getC4BoundaryInRow();\n\n log.debug(`C:${JSON.stringify(conf, null, 2)}`);\n\n const diagram =\n securityLevel === 'sandbox' ? root.select(`[id=\"${id}\"]`) : select(`[id=\"${id}\"]`);\n\n svgDraw.insertComputerIcon(diagram);\n svgDraw.insertDatabaseIcon(diagram);\n svgDraw.insertClockIcon(diagram);\n\n let screenBounds = new Bounds(diagObj);\n\n screenBounds.setData(\n conf.diagramMarginX,\n conf.diagramMarginX,\n conf.diagramMarginY,\n conf.diagramMarginY\n );\n\n screenBounds.data.widthLimit = screen.availWidth;\n globalBoundaryMaxX = conf.diagramMarginX;\n globalBoundaryMaxY = conf.diagramMarginY;\n\n const title = diagObj.db.getTitle();\n let currentBoundaries = diagObj.db.getBoundaries('');\n // switch (c4type) {\n // case 'C4Context':\n drawInsideBoundary(diagram, '', screenBounds, currentBoundaries, diagObj);\n // break;\n // }\n\n // The arrow head definition is attached to the svg once\n svgDraw.insertArrowHead(diagram);\n svgDraw.insertArrowEnd(diagram);\n svgDraw.insertArrowCrossHead(diagram);\n svgDraw.insertArrowFilledHead(diagram);\n\n drawRels(diagram, diagObj.db.getRels(), diagObj.db.getC4Shape, diagObj);\n\n screenBounds.data.stopx = globalBoundaryMaxX;\n screenBounds.data.stopy = globalBoundaryMaxY;\n\n const box = screenBounds.data;\n\n // Make sure the height of the diagram supports long menus.\n let boxHeight = box.stopy - box.starty;\n\n let height = boxHeight + 2 * conf.diagramMarginY;\n\n // Make sure the width of the diagram supports wide menus.\n let boxWidth = box.stopx - box.startx;\n const width = boxWidth + 2 * conf.diagramMarginX;\n\n if (title) {\n diagram\n .append('text')\n .text(title)\n .attr('x', (box.stopx - box.startx) / 2 - 4 * conf.diagramMarginX)\n .attr('y', box.starty + conf.diagramMarginY);\n }\n\n configureSvgSize(diagram, height, width, conf.useMaxWidth);\n\n const extraVertForTitle = title ? 60 : 0;\n diagram.attr(\n 'viewBox',\n box.startx -\n conf.diagramMarginX +\n ' -' +\n (conf.diagramMarginY + extraVertForTitle) +\n ' ' +\n width +\n ' ' +\n (height + extraVertForTitle)\n );\n\n log.debug(`models:`, box);\n};\n\nexport default {\n drawPersonOrSystemArray: drawC4ShapeArray,\n drawBoundary,\n setConf,\n draw,\n};\n", "import common from '../common/common.js';\nimport * as svgDrawCommon from '../common/svgDrawCommon.js';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\n\nexport const drawRect = function (elem, rectData) {\n return svgDrawCommon.drawRect(elem, rectData);\n};\n\nexport const drawImage = function (elem, width, height, x, y, link) {\n const imageElem = elem.append('image');\n imageElem.attr('width', width);\n imageElem.attr('height', height);\n imageElem.attr('x', x);\n imageElem.attr('y', y);\n let sanitizedLink = link.startsWith('data:image/png;base64') ? link : sanitizeUrl(link);\n imageElem.attr('xlink:href', sanitizedLink);\n};\n\nexport const drawRels = (elem, rels, conf) => {\n const relsElem = elem.append('g');\n let i = 0;\n for (let rel of rels) {\n let textColor = rel.textColor ? rel.textColor : '#444444';\n let strokeColor = rel.lineColor ? rel.lineColor : '#444444';\n let offsetX = rel.offsetX ? parseInt(rel.offsetX) : 0;\n let offsetY = rel.offsetY ? parseInt(rel.offsetY) : 0;\n\n let url = '';\n if (i === 0) {\n let line = relsElem.append('line');\n line.attr('x1', rel.startPoint.x);\n line.attr('y1', rel.startPoint.y);\n line.attr('x2', rel.endPoint.x);\n line.attr('y2', rel.endPoint.y);\n\n line.attr('stroke-width', '1');\n line.attr('stroke', strokeColor);\n line.style('fill', 'none');\n if (rel.type !== 'rel_b') {\n line.attr('marker-end', 'url(' + url + '#arrowhead)');\n }\n if (rel.type === 'birel' || rel.type === 'rel_b') {\n line.attr('marker-start', 'url(' + url + '#arrowend)');\n }\n i = -1;\n } else {\n let line = relsElem.append('path');\n line\n .attr('fill', 'none')\n .attr('stroke-width', '1')\n .attr('stroke', strokeColor)\n .attr(\n 'd',\n 'Mstartx,starty Qcontrolx,controly stopx,stopy '\n .replaceAll('startx', rel.startPoint.x)\n .replaceAll('starty', rel.startPoint.y)\n .replaceAll(\n 'controlx',\n rel.startPoint.x +\n (rel.endPoint.x - rel.startPoint.x) / 2 -\n (rel.endPoint.x - rel.startPoint.x) / 4\n )\n .replaceAll('controly', rel.startPoint.y + (rel.endPoint.y - rel.startPoint.y) / 2)\n .replaceAll('stopx', rel.endPoint.x)\n .replaceAll('stopy', rel.endPoint.y)\n );\n if (rel.type !== 'rel_b') {\n line.attr('marker-end', 'url(' + url + '#arrowhead)');\n }\n if (rel.type === 'birel' || rel.type === 'rel_b') {\n line.attr('marker-start', 'url(' + url + '#arrowend)');\n }\n }\n\n let messageConf = conf.messageFont();\n _drawTextCandidateFunc(conf)(\n rel.label.text,\n relsElem,\n Math.min(rel.startPoint.x, rel.endPoint.x) +\n Math.abs(rel.endPoint.x - rel.startPoint.x) / 2 +\n offsetX,\n Math.min(rel.startPoint.y, rel.endPoint.y) +\n Math.abs(rel.endPoint.y - rel.startPoint.y) / 2 +\n offsetY,\n rel.label.width,\n rel.label.height,\n { fill: textColor },\n messageConf\n );\n\n if (rel.techn && rel.techn.text !== '') {\n messageConf = conf.messageFont();\n _drawTextCandidateFunc(conf)(\n '[' + rel.techn.text + ']',\n relsElem,\n Math.min(rel.startPoint.x, rel.endPoint.x) +\n Math.abs(rel.endPoint.x - rel.startPoint.x) / 2 +\n offsetX,\n Math.min(rel.startPoint.y, rel.endPoint.y) +\n Math.abs(rel.endPoint.y - rel.startPoint.y) / 2 +\n conf.messageFontSize +\n 5 +\n offsetY,\n Math.max(rel.label.width, rel.techn.width),\n rel.techn.height,\n { fill: textColor, 'font-style': 'italic' },\n messageConf\n );\n }\n }\n};\n\n/**\n * Draws a boundary in the diagram\n *\n * @param {any} elem - The diagram we'll draw to.\n * @param {any} boundary - The boundary to draw.\n * @param {any} conf - DrawText implementation discriminator object\n */\nconst drawBoundary = function (elem, boundary, conf) {\n const boundaryElem = elem.append('g');\n\n let fillColor = boundary.bgColor ? boundary.bgColor : 'none';\n let strokeColor = boundary.borderColor ? boundary.borderColor : '#444444';\n let fontColor = boundary.fontColor ? boundary.fontColor : 'black';\n\n let attrsValue = { 'stroke-width': 1.0, 'stroke-dasharray': '7.0,7.0' };\n if (boundary.nodeType) {\n attrsValue = { 'stroke-width': 1.0 };\n }\n let rectData = {\n x: boundary.x,\n y: boundary.y,\n fill: fillColor,\n stroke: strokeColor,\n width: boundary.width,\n height: boundary.height,\n rx: 2.5,\n ry: 2.5,\n attrs: attrsValue,\n };\n\n drawRect(boundaryElem, rectData);\n\n // draw label\n let boundaryConf = conf.boundaryFont();\n boundaryConf.fontWeight = 'bold';\n boundaryConf.fontSize = boundaryConf.fontSize + 2;\n boundaryConf.fontColor = fontColor;\n _drawTextCandidateFunc(conf)(\n boundary.label.text,\n boundaryElem,\n boundary.x,\n boundary.y + boundary.label.Y,\n boundary.width,\n boundary.height,\n { fill: '#444444' },\n boundaryConf\n );\n\n // draw type\n if (boundary.type && boundary.type.text !== '') {\n boundaryConf = conf.boundaryFont();\n boundaryConf.fontColor = fontColor;\n _drawTextCandidateFunc(conf)(\n boundary.type.text,\n boundaryElem,\n boundary.x,\n boundary.y + boundary.type.Y,\n boundary.width,\n boundary.height,\n { fill: '#444444' },\n boundaryConf\n );\n }\n\n // draw descr\n if (boundary.descr && boundary.descr.text !== '') {\n boundaryConf = conf.boundaryFont();\n boundaryConf.fontSize = boundaryConf.fontSize - 2;\n boundaryConf.fontColor = fontColor;\n _drawTextCandidateFunc(conf)(\n boundary.descr.text,\n boundaryElem,\n boundary.x,\n boundary.y + boundary.descr.Y,\n boundary.width,\n boundary.height,\n { fill: '#444444' },\n boundaryConf\n );\n }\n};\n\nexport const drawC4Shape = function (elem, c4Shape, conf) {\n let fillColor = c4Shape.bgColor ? c4Shape.bgColor : conf[c4Shape.typeC4Shape.text + '_bg_color'];\n let strokeColor = c4Shape.borderColor\n ? c4Shape.borderColor\n : conf[c4Shape.typeC4Shape.text + '_border_color'];\n let fontColor = c4Shape.fontColor ? c4Shape.fontColor : '#FFFFFF';\n\n let personImg =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=';\n switch (c4Shape.typeC4Shape.text) {\n case 'person':\n personImg =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=';\n break;\n case 'external_person':\n personImg =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=';\n break;\n }\n\n const c4ShapeElem = elem.append('g');\n c4ShapeElem.attr('class', 'person-man');\n\n // \n // draw rect of c4Shape\n const rect = svgDrawCommon.getNoteRect();\n\n switch (c4Shape.typeC4Shape.text) {\n case 'person':\n case 'external_person':\n case 'system':\n case 'external_system':\n case 'container':\n case 'external_container':\n case 'component':\n case 'external_component':\n rect.x = c4Shape.x;\n rect.y = c4Shape.y;\n rect.fill = fillColor;\n rect.width = c4Shape.width;\n rect.height = c4Shape.height;\n rect.stroke = strokeColor;\n rect.rx = 2.5;\n rect.ry = 2.5;\n rect.attrs = { 'stroke-width': 0.5 };\n drawRect(c4ShapeElem, rect);\n break;\n case 'system_db':\n case 'external_system_db':\n case 'container_db':\n case 'external_container_db':\n case 'component_db':\n case 'external_component_db':\n c4ShapeElem\n .append('path')\n .attr('fill', fillColor)\n .attr('stroke-width', '0.5')\n .attr('stroke', strokeColor)\n .attr(\n 'd',\n 'Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height'\n .replaceAll('startx', c4Shape.x)\n .replaceAll('starty', c4Shape.y)\n .replaceAll('half', c4Shape.width / 2)\n .replaceAll('height', c4Shape.height)\n );\n c4ShapeElem\n .append('path')\n .attr('fill', 'none')\n .attr('stroke-width', '0.5')\n .attr('stroke', strokeColor)\n .attr(\n 'd',\n 'Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10'\n .replaceAll('startx', c4Shape.x)\n .replaceAll('starty', c4Shape.y)\n .replaceAll('half', c4Shape.width / 2)\n );\n break;\n case 'system_queue':\n case 'external_system_queue':\n case 'container_queue':\n case 'external_container_queue':\n case 'component_queue':\n case 'external_component_queue':\n c4ShapeElem\n .append('path')\n .attr('fill', fillColor)\n .attr('stroke-width', '0.5')\n .attr('stroke', strokeColor)\n .attr(\n 'd',\n 'Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half'\n .replaceAll('startx', c4Shape.x)\n .replaceAll('starty', c4Shape.y)\n .replaceAll('width', c4Shape.width)\n .replaceAll('half', c4Shape.height / 2)\n );\n c4ShapeElem\n .append('path')\n .attr('fill', 'none')\n .attr('stroke-width', '0.5')\n .attr('stroke', strokeColor)\n .attr(\n 'd',\n 'Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half'\n .replaceAll('startx', c4Shape.x + c4Shape.width)\n .replaceAll('starty', c4Shape.y)\n .replaceAll('half', c4Shape.height / 2)\n );\n break;\n }\n\n // draw type of c4Shape\n let c4ShapeFontConf = getC4ShapeFont(conf, c4Shape.typeC4Shape.text);\n c4ShapeElem\n .append('text')\n .attr('fill', fontColor)\n .attr('font-family', c4ShapeFontConf.fontFamily)\n .attr('font-size', c4ShapeFontConf.fontSize - 2)\n .attr('font-style', 'italic')\n .attr('lengthAdjust', 'spacing')\n .attr('textLength', c4Shape.typeC4Shape.width)\n .attr('x', c4Shape.x + c4Shape.width / 2 - c4Shape.typeC4Shape.width / 2)\n .attr('y', c4Shape.y + c4Shape.typeC4Shape.Y)\n .text('<<' + c4Shape.typeC4Shape.text + '>>');\n\n // draw image/sprite\n switch (c4Shape.typeC4Shape.text) {\n case 'person':\n case 'external_person':\n drawImage(\n c4ShapeElem,\n 48,\n 48,\n c4Shape.x + c4Shape.width / 2 - 24,\n c4Shape.y + c4Shape.image.Y,\n personImg\n );\n break;\n }\n\n // draw label\n let textFontConf = conf[c4Shape.typeC4Shape.text + 'Font']();\n textFontConf.fontWeight = 'bold';\n textFontConf.fontSize = textFontConf.fontSize + 2;\n textFontConf.fontColor = fontColor;\n _drawTextCandidateFunc(conf)(\n c4Shape.label.text,\n c4ShapeElem,\n c4Shape.x,\n c4Shape.y + c4Shape.label.Y,\n c4Shape.width,\n c4Shape.height,\n { fill: fontColor },\n textFontConf\n );\n\n // draw techn/type\n textFontConf = conf[c4Shape.typeC4Shape.text + 'Font']();\n textFontConf.fontColor = fontColor;\n\n if (c4Shape.techn && c4Shape.techn?.text !== '') {\n _drawTextCandidateFunc(conf)(\n c4Shape.techn.text,\n c4ShapeElem,\n c4Shape.x,\n c4Shape.y + c4Shape.techn.Y,\n c4Shape.width,\n c4Shape.height,\n { fill: fontColor, 'font-style': 'italic' },\n textFontConf\n );\n } else if (c4Shape.type && c4Shape.type.text !== '') {\n _drawTextCandidateFunc(conf)(\n c4Shape.type.text,\n c4ShapeElem,\n c4Shape.x,\n c4Shape.y + c4Shape.type.Y,\n c4Shape.width,\n c4Shape.height,\n { fill: fontColor, 'font-style': 'italic' },\n textFontConf\n );\n }\n\n // draw descr\n if (c4Shape.descr && c4Shape.descr.text !== '') {\n textFontConf = conf.personFont();\n textFontConf.fontColor = fontColor;\n _drawTextCandidateFunc(conf)(\n c4Shape.descr.text,\n c4ShapeElem,\n c4Shape.x,\n c4Shape.y + c4Shape.descr.Y,\n c4Shape.width,\n c4Shape.height,\n { fill: fontColor },\n textFontConf\n );\n }\n\n return c4Shape.height;\n};\n\nexport const insertDatabaseIcon = function (elem) {\n elem\n .append('defs')\n .append('symbol')\n .attr('id', 'database')\n .attr('fill-rule', 'evenodd')\n .attr('clip-rule', 'evenodd')\n .append('path')\n .attr('transform', 'scale(.5)')\n .attr(\n 'd',\n 'M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z'\n );\n};\n\nexport const insertComputerIcon = function (elem) {\n elem\n .append('defs')\n .append('symbol')\n .attr('id', 'computer')\n .attr('width', '24')\n .attr('height', '24')\n .append('path')\n .attr('transform', 'scale(.5)')\n .attr(\n 'd',\n 'M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z'\n );\n};\n\nexport const insertClockIcon = function (elem) {\n elem\n .append('defs')\n .append('symbol')\n .attr('id', 'clock')\n .attr('width', '24')\n .attr('height', '24')\n .append('path')\n .attr('transform', 'scale(.5)')\n .attr(\n 'd',\n 'M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z'\n );\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n *\n * @param elem\n */\nexport const insertArrowHead = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'arrowhead')\n .attr('refX', 9)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 0 L 10 5 L 0 10 z'); // this is actual shape for arrowhead\n};\n\nexport const insertArrowEnd = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'arrowend')\n .attr('refX', 1)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 10 0 L 0 5 L 10 10 z'); // this is actual shape for arrowhead\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n *\n * @param {any} elem\n */\nexport const insertArrowFilledHead = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'filled-head')\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\n\n/**\n * Setup node number. The result is appended to the svg.\n *\n * @param {any} elem\n */\nexport const insertDynamicNumber = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'sequencenumber')\n .attr('refX', 15)\n .attr('refY', 15)\n .attr('markerWidth', 60)\n .attr('markerHeight', 40)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', 15)\n .attr('cy', 15)\n .attr('r', 6);\n // .style(\"fill\", '#f00');\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n *\n * @param {any} elem\n */\nexport const insertArrowCrossHead = function (elem) {\n const defs = elem.append('defs');\n const marker = defs\n .append('marker')\n .attr('id', 'crosshead')\n .attr('markerWidth', 15)\n .attr('markerHeight', 8)\n .attr('orient', 'auto')\n .attr('refX', 16)\n .attr('refY', 4);\n\n // The arrow\n marker\n .append('path')\n .attr('fill', 'black')\n .attr('stroke', '#000000')\n .style('stroke-dasharray', '0, 0')\n .attr('stroke-width', '1px')\n .attr('d', 'M 9,2 V 6 L16,4 Z');\n\n // The cross\n marker\n .append('path')\n .attr('fill', 'none')\n .attr('stroke', '#000000')\n .style('stroke-dasharray', '0, 0')\n .attr('stroke-width', '1px')\n .attr('d', 'M 0,1 L 6,7 M 6,1 L 0,7');\n // this is actual shape for arrowhead\n};\n\nconst getC4ShapeFont = (cnf, typeC4Shape) => {\n return {\n fontFamily: cnf[typeC4Shape + 'FontFamily'],\n fontSize: cnf[typeC4Shape + 'FontSize'],\n fontWeight: cnf[typeC4Shape + 'FontWeight'],\n };\n};\n\nconst _drawTextCandidateFunc = (function () {\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n */\n function byText(content, g, x, y, width, height, textAttrs) {\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y + height / 2 + 5)\n .style('text-anchor', 'middle')\n .text(content);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n */\n function byTspan(content, g, x, y, width, height, textAttrs, conf) {\n const { fontSize, fontFamily, fontWeight } = conf;\n\n const lines = content.split(common.lineBreakRegex);\n for (let i = 0; i < lines.length; i++) {\n const dy = i * fontSize - (fontSize * (lines.length - 1)) / 2;\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y)\n .style('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', fontSize)\n .style('font-weight', fontWeight)\n .style('font-family', fontFamily);\n text\n .append('tspan')\n // .attr('x', x + width / 2)\n .attr('dy', dy)\n .text(lines[i])\n // .attr('y', y + height / 2)\n .attr('alignment-baseline', 'mathematical');\n\n _setTextAttrs(text, textAttrs);\n }\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n */\n function byFo(content, g, x, y, width, height, textAttrs, conf) {\n const s = g.append('switch');\n const f = s\n .append('foreignObject')\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height);\n\n const text = f\n .append('xhtml:div')\n .style('display', 'table')\n .style('height', '100%')\n .style('width', '100%');\n\n text\n .append('div')\n .style('display', 'table-cell')\n .style('text-align', 'center')\n .style('vertical-align', 'middle')\n .text(content);\n\n byTspan(content, s, x, y, width, height, textAttrs, conf);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} toText\n * @param {any} fromTextAttrsDict\n */\n function _setTextAttrs(toText, fromTextAttrsDict) {\n for (const key in fromTextAttrsDict) {\n if (fromTextAttrsDict.hasOwnProperty(key)) {\n toText.attr(key, fromTextAttrsDict[key]);\n }\n }\n }\n\n return function (conf) {\n return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;\n };\n})();\n\nexport default {\n drawRect,\n drawBoundary,\n drawC4Shape,\n drawRels,\n drawImage,\n insertArrowHead,\n insertArrowEnd,\n insertArrowFilledHead,\n insertDynamicNumber,\n insertArrowCrossHead,\n insertDatabaseIcon,\n insertComputerIcon,\n insertClockIcon,\n};\n\n// cspell:ignoreRegExp /'Mstartx.*/g\n", "const getStyles = (options) =>\n `.person {\n stroke: ${options.personBorder};\n fill: ${options.personBkg};\n }\n`;\n\nexport default getStyles;\n", "// @ts-ignore: JISON doesn't support types\nimport parser from './parser/c4Diagram.jison';\nimport db from './c4Db.js';\nimport renderer from './c4Renderer.js';\nimport styles from './styles.js';\nimport type { MermaidConfig } from '../../config.type.js';\nimport type { DiagramDefinition } from '../../diagram-api/types.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles,\n init: ({ c4, wrap }: MermaidConfig) => {\n renderer.setConf(c4);\n db.setWrap(wrap);\n },\n};\n"], + "mappings": "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,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC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", + "names": ["o", "parser", "lexer", "c", "rel", "personOrSystem", "container", "component", "boundary", "drawRect", "rels", "conf", "c4ShapeInRow", "c4BoundaryInRow", "drawBoundary", "diagram", "c4ShapeArray", "c4ShapeTypeConf", "drawRels", "rels", "title"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-4BX2VUAB.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-4BX2VUAB.mjs new file mode 100644 index 0000000..278406d --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-4BX2VUAB.mjs @@ -0,0 +1,21 @@ +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/common/populateCommonDb.ts +function populateCommonDb(ast, db) { + if (ast.accDescr) { + db.setAccDescription?.(ast.accDescr); + } + if (ast.accTitle) { + db.setAccTitle?.(ast.accTitle); + } + if (ast.title) { + db.setDiagramTitle?.(ast.title); + } +} +__name(populateCommonDb, "populateCommonDb"); + +export { + populateCommonDb +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-4BX2VUAB.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-4BX2VUAB.mjs.map new file mode 100644 index 0000000..e4c1924 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-4BX2VUAB.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/common/populateCommonDb.ts"], + "sourcesContent": ["import type { DiagramAST } from '@mermaid-js/parser';\nimport type { DiagramDB } from '../../diagram-api/types.js';\n\nexport function populateCommonDb(ast: DiagramAST, db: DiagramDB) {\n if (ast.accDescr) {\n db.setAccDescription?.(ast.accDescr);\n }\n if (ast.accTitle) {\n db.setAccTitle?.(ast.accTitle);\n }\n if (ast.title) {\n db.setDiagramTitle?.(ast.title);\n }\n}\n"], + "mappings": ";;;;;AAGO,SAAS,iBAAiB,KAAiB,IAAe;AAC/D,MAAI,IAAI,UAAU;AAChB,OAAG,oBAAoB,IAAI,QAAQ;AAAA,EACrC;AACA,MAAI,IAAI,UAAU;AAChB,OAAG,cAAc,IAAI,QAAQ;AAAA,EAC/B;AACA,MAAI,IAAI,OAAO;AACb,OAAG,kBAAkB,IAAI,KAAK;AAAA,EAChC;AACF;AAVgB;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-55IACEB6.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-55IACEB6.mjs new file mode 100644 index 0000000..7b2a58a --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-55IACEB6.mjs @@ -0,0 +1,19 @@ +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/rendering-util/insertElementsForSize.js +import { select } from "d3"; +var getDiagramElement = /* @__PURE__ */ __name((id, securityLevel) => { + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = select("#i" + id); + } + const root = securityLevel === "sandbox" ? select(sandboxElement.nodes()[0].contentDocument.body) : select("body"); + const svg = root.select(`[id="${id}"]`); + return svg; +}, "getDiagramElement"); + +export { + getDiagramElement +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-55IACEB6.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-55IACEB6.mjs.map new file mode 100644 index 0000000..8955a2a --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-55IACEB6.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/rendering-util/insertElementsForSize.js"], + "sourcesContent": ["import { select } from 'd3';\n\nexport const getDiagramElement = (id, securityLevel) => {\n let sandboxElement;\n if (securityLevel === 'sandbox') {\n sandboxElement = select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? select(sandboxElement.nodes()[0].contentDocument.body)\n : select('body');\n\n const svg = root.select(`[id=\"${id}\"]`);\n\n // Run the renderer. This is what draws the final graph.\n\n return svg;\n};\n"], + "mappings": ";;;;;AAAA,SAAS,cAAc;AAEhB,IAAM,oBAAoB,wBAAC,IAAI,kBAAkB;AACtD,MAAI;AACJ,MAAI,kBAAkB,WAAW;AAC/B,qBAAiB,OAAO,OAAO,EAAE;AAAA,EACnC;AACA,QAAM,OACJ,kBAAkB,YACd,OAAO,eAAe,MAAM,EAAE,CAAC,EAAE,gBAAgB,IAAI,IACrD,OAAO,MAAM;AAEnB,QAAM,MAAM,KAAK,OAAO,QAAQ,EAAE,IAAI;AAItC,SAAO;AACT,GAfiC;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ABZYJK2D.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ABZYJK2D.mjs new file mode 100644 index 0000000..65c6c62 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ABZYJK2D.mjs @@ -0,0 +1,3086 @@ +import { + __export, + __name, + log, + setLogLevel +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagram-api/regexes.ts +var frontMatterRegex = /^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s; +var directiveRegex = /%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi; +var anyCommentRegex = /\s*%%.*\n/gm; + +// src/errors.ts +var UnknownDiagramError = class extends Error { + static { + __name(this, "UnknownDiagramError"); + } + constructor(message) { + super(message); + this.name = "UnknownDiagramError"; + } +}; + +// src/diagram-api/detectType.ts +var detectors = {}; +var detectType = /* @__PURE__ */ __name(function(text, config2) { + text = text.replace(frontMatterRegex, "").replace(directiveRegex, "").replace(anyCommentRegex, "\n"); + for (const [key, { detector }] of Object.entries(detectors)) { + const diagram = detector(text, config2); + if (diagram) { + return key; + } + } + throw new UnknownDiagramError( + `No diagram type detected matching given configuration for text: ${text}` + ); +}, "detectType"); +var registerLazyLoadedDiagrams = /* @__PURE__ */ __name((...diagrams2) => { + for (const { id, detector, loader } of diagrams2) { + addDetector(id, detector, loader); + } +}, "registerLazyLoadedDiagrams"); +var addDetector = /* @__PURE__ */ __name((key, detector, loader) => { + if (detectors[key]) { + log.warn(`Detector with key ${key} already exists. Overwriting.`); + } + detectors[key] = { detector, loader }; + log.debug(`Detector with key ${key} added${loader ? " with loader" : ""}`); +}, "addDetector"); +var getDiagramLoader = /* @__PURE__ */ __name((key) => { + return detectors[key].loader; +}, "getDiagramLoader"); + +// src/assignWithDepth.ts +var assignWithDepth = /* @__PURE__ */ __name((dst, src, { depth = 2, clobber = false } = {}) => { + const config2 = { depth, clobber }; + if (Array.isArray(src) && !Array.isArray(dst)) { + src.forEach((s) => assignWithDepth(dst, s, config2)); + return dst; + } else if (Array.isArray(src) && Array.isArray(dst)) { + src.forEach((s) => { + if (!dst.includes(s)) { + dst.push(s); + } + }); + return dst; + } + if (dst === void 0 || depth <= 0) { + if (dst !== void 0 && dst !== null && typeof dst === "object" && typeof src === "object") { + return Object.assign(dst, src); + } else { + return src; + } + } + if (src !== void 0 && typeof dst === "object" && typeof src === "object") { + Object.keys(src).forEach((key) => { + if (typeof src[key] === "object" && (dst[key] === void 0 || typeof dst[key] === "object")) { + if (dst[key] === void 0) { + dst[key] = Array.isArray(src[key]) ? [] : {}; + } + dst[key] = assignWithDepth(dst[key], src[key], { depth: depth - 1, clobber }); + } else if (clobber || typeof dst[key] !== "object" && typeof src[key] !== "object") { + dst[key] = src[key]; + } + }); + } + return dst; +}, "assignWithDepth"); +var assignWithDepth_default = assignWithDepth; + +// src/themes/theme-base.js +import { adjust as adjust2, darken, invert, isDark, lighten } from "khroma"; + +// src/themes/erDiagram-oldHardcodedValues.ts +var oldAttributeBackgroundColorOdd = "#ffffff"; +var oldAttributeBackgroundColorEven = "#f2f2f2"; + +// src/themes/theme-helpers.js +import { adjust } from "khroma"; +var mkBorder = /* @__PURE__ */ __name((col, darkMode) => darkMode ? adjust(col, { s: -40, l: 10 }) : adjust(col, { s: -40, l: -10 }), "mkBorder"); + +// src/themes/theme-base.js +var Theme = class { + static { + __name(this, "Theme"); + } + constructor() { + this.background = "#f4f4f4"; + this.primaryColor = "#fff4dd"; + this.noteBkgColor = "#fff5ad"; + this.noteTextColor = "#333"; + this.THEME_COLOR_LIMIT = 12; + this.fontFamily = '"trebuchet ms", verdana, arial, sans-serif'; + this.fontSize = "16px"; + } + updateColors() { + this.primaryTextColor = this.primaryTextColor || (this.darkMode ? "#eee" : "#333"); + this.secondaryColor = this.secondaryColor || adjust2(this.primaryColor, { h: -120 }); + this.tertiaryColor = this.tertiaryColor || adjust2(this.primaryColor, { h: 180, l: 5 }); + this.primaryBorderColor = this.primaryBorderColor || mkBorder(this.primaryColor, this.darkMode); + this.secondaryBorderColor = this.secondaryBorderColor || mkBorder(this.secondaryColor, this.darkMode); + this.tertiaryBorderColor = this.tertiaryBorderColor || mkBorder(this.tertiaryColor, this.darkMode); + this.noteBorderColor = this.noteBorderColor || mkBorder(this.noteBkgColor, this.darkMode); + this.noteBkgColor = this.noteBkgColor || "#fff5ad"; + this.noteTextColor = this.noteTextColor || "#333"; + this.secondaryTextColor = this.secondaryTextColor || invert(this.secondaryColor); + this.tertiaryTextColor = this.tertiaryTextColor || invert(this.tertiaryColor); + this.lineColor = this.lineColor || invert(this.background); + this.arrowheadColor = this.arrowheadColor || invert(this.background); + this.textColor = this.textColor || this.primaryTextColor; + this.border2 = this.border2 || this.tertiaryBorderColor; + this.nodeBkg = this.nodeBkg || this.primaryColor; + this.mainBkg = this.mainBkg || this.primaryColor; + this.nodeBorder = this.nodeBorder || this.primaryBorderColor; + this.clusterBkg = this.clusterBkg || this.tertiaryColor; + this.clusterBorder = this.clusterBorder || this.tertiaryBorderColor; + this.defaultLinkColor = this.defaultLinkColor || this.lineColor; + this.titleColor = this.titleColor || this.tertiaryTextColor; + this.edgeLabelBackground = this.edgeLabelBackground || (this.darkMode ? darken(this.secondaryColor, 30) : this.secondaryColor); + this.nodeTextColor = this.nodeTextColor || this.primaryTextColor; + this.actorBorder = this.actorBorder || this.primaryBorderColor; + this.actorBkg = this.actorBkg || this.mainBkg; + this.actorTextColor = this.actorTextColor || this.primaryTextColor; + this.actorLineColor = this.actorLineColor || this.actorBorder; + this.labelBoxBkgColor = this.labelBoxBkgColor || this.actorBkg; + this.signalColor = this.signalColor || this.textColor; + this.signalTextColor = this.signalTextColor || this.textColor; + this.labelBoxBorderColor = this.labelBoxBorderColor || this.actorBorder; + this.labelTextColor = this.labelTextColor || this.actorTextColor; + this.loopTextColor = this.loopTextColor || this.actorTextColor; + this.activationBorderColor = this.activationBorderColor || darken(this.secondaryColor, 10); + this.activationBkgColor = this.activationBkgColor || this.secondaryColor; + this.sequenceNumberColor = this.sequenceNumberColor || invert(this.lineColor); + this.sectionBkgColor = this.sectionBkgColor || this.tertiaryColor; + this.altSectionBkgColor = this.altSectionBkgColor || "white"; + this.sectionBkgColor = this.sectionBkgColor || this.secondaryColor; + this.sectionBkgColor2 = this.sectionBkgColor2 || this.primaryColor; + this.excludeBkgColor = this.excludeBkgColor || "#eeeeee"; + this.taskBorderColor = this.taskBorderColor || this.primaryBorderColor; + this.taskBkgColor = this.taskBkgColor || this.primaryColor; + this.activeTaskBorderColor = this.activeTaskBorderColor || this.primaryColor; + this.activeTaskBkgColor = this.activeTaskBkgColor || lighten(this.primaryColor, 23); + this.gridColor = this.gridColor || "lightgrey"; + this.doneTaskBkgColor = this.doneTaskBkgColor || "lightgrey"; + this.doneTaskBorderColor = this.doneTaskBorderColor || "grey"; + this.critBorderColor = this.critBorderColor || "#ff8888"; + this.critBkgColor = this.critBkgColor || "red"; + this.todayLineColor = this.todayLineColor || "red"; + this.vertLineColor = this.vertLineColor || "navy"; + this.taskTextColor = this.taskTextColor || this.textColor; + this.taskTextOutsideColor = this.taskTextOutsideColor || this.textColor; + this.taskTextLightColor = this.taskTextLightColor || this.textColor; + this.taskTextColor = this.taskTextColor || this.primaryTextColor; + this.taskTextDarkColor = this.taskTextDarkColor || this.textColor; + this.taskTextClickableColor = this.taskTextClickableColor || "#003163"; + this.personBorder = this.personBorder || this.primaryBorderColor; + this.personBkg = this.personBkg || this.mainBkg; + if (this.darkMode) { + this.rowOdd = this.rowOdd || darken(this.mainBkg, 5) || "#ffffff"; + this.rowEven = this.rowEven || darken(this.mainBkg, 10); + } else { + this.rowOdd = this.rowOdd || lighten(this.mainBkg, 75) || "#ffffff"; + this.rowEven = this.rowEven || lighten(this.mainBkg, 5); + } + this.transitionColor = this.transitionColor || this.lineColor; + this.transitionLabelColor = this.transitionLabelColor || this.textColor; + this.stateLabelColor = this.stateLabelColor || this.stateBkg || this.primaryTextColor; + this.stateBkg = this.stateBkg || this.mainBkg; + this.labelBackgroundColor = this.labelBackgroundColor || this.stateBkg; + this.compositeBackground = this.compositeBackground || this.background || this.tertiaryColor; + this.altBackground = this.altBackground || this.tertiaryColor; + this.compositeTitleBackground = this.compositeTitleBackground || this.mainBkg; + this.compositeBorder = this.compositeBorder || this.nodeBorder; + this.innerEndBackground = this.nodeBorder; + this.errorBkgColor = this.errorBkgColor || this.tertiaryColor; + this.errorTextColor = this.errorTextColor || this.tertiaryTextColor; + this.transitionColor = this.transitionColor || this.lineColor; + this.specialStateColor = this.lineColor; + this.cScale0 = this.cScale0 || this.primaryColor; + this.cScale1 = this.cScale1 || this.secondaryColor; + this.cScale2 = this.cScale2 || this.tertiaryColor; + this.cScale3 = this.cScale3 || adjust2(this.primaryColor, { h: 30 }); + this.cScale4 = this.cScale4 || adjust2(this.primaryColor, { h: 60 }); + this.cScale5 = this.cScale5 || adjust2(this.primaryColor, { h: 90 }); + this.cScale6 = this.cScale6 || adjust2(this.primaryColor, { h: 120 }); + this.cScale7 = this.cScale7 || adjust2(this.primaryColor, { h: 150 }); + this.cScale8 = this.cScale8 || adjust2(this.primaryColor, { h: 210, l: 150 }); + this.cScale9 = this.cScale9 || adjust2(this.primaryColor, { h: 270 }); + this.cScale10 = this.cScale10 || adjust2(this.primaryColor, { h: 300 }); + this.cScale11 = this.cScale11 || adjust2(this.primaryColor, { h: 330 }); + if (this.darkMode) { + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScale" + i] = darken(this["cScale" + i], 75); + } + } else { + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScale" + i] = darken(this["cScale" + i], 25); + } + } + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScaleInv" + i] = this["cScaleInv" + i] || invert(this["cScale" + i]); + } + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + if (this.darkMode) { + this["cScalePeer" + i] = this["cScalePeer" + i] || lighten(this["cScale" + i], 10); + } else { + this["cScalePeer" + i] = this["cScalePeer" + i] || darken(this["cScale" + i], 10); + } + } + this.scaleLabelColor = this.scaleLabelColor || this.labelTextColor; + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScaleLabel" + i] = this["cScaleLabel" + i] || this.scaleLabelColor; + } + const multiplier = this.darkMode ? -4 : -1; + for (let i = 0; i < 5; i++) { + this["surface" + i] = this["surface" + i] || adjust2(this.mainBkg, { h: 180, s: -15, l: multiplier * (5 + i * 3) }); + this["surfacePeer" + i] = this["surfacePeer" + i] || adjust2(this.mainBkg, { h: 180, s: -15, l: multiplier * (8 + i * 3) }); + } + this.classText = this.classText || this.textColor; + this.fillType0 = this.fillType0 || this.primaryColor; + this.fillType1 = this.fillType1 || this.secondaryColor; + this.fillType2 = this.fillType2 || adjust2(this.primaryColor, { h: 64 }); + this.fillType3 = this.fillType3 || adjust2(this.secondaryColor, { h: 64 }); + this.fillType4 = this.fillType4 || adjust2(this.primaryColor, { h: -64 }); + this.fillType5 = this.fillType5 || adjust2(this.secondaryColor, { h: -64 }); + this.fillType6 = this.fillType6 || adjust2(this.primaryColor, { h: 128 }); + this.fillType7 = this.fillType7 || adjust2(this.secondaryColor, { h: 128 }); + this.pie1 = this.pie1 || this.primaryColor; + this.pie2 = this.pie2 || this.secondaryColor; + this.pie3 = this.pie3 || this.tertiaryColor; + this.pie4 = this.pie4 || adjust2(this.primaryColor, { l: -10 }); + this.pie5 = this.pie5 || adjust2(this.secondaryColor, { l: -10 }); + this.pie6 = this.pie6 || adjust2(this.tertiaryColor, { l: -10 }); + this.pie7 = this.pie7 || adjust2(this.primaryColor, { h: 60, l: -10 }); + this.pie8 = this.pie8 || adjust2(this.primaryColor, { h: -60, l: -10 }); + this.pie9 = this.pie9 || adjust2(this.primaryColor, { h: 120, l: 0 }); + this.pie10 = this.pie10 || adjust2(this.primaryColor, { h: 60, l: -20 }); + this.pie11 = this.pie11 || adjust2(this.primaryColor, { h: -60, l: -20 }); + this.pie12 = this.pie12 || adjust2(this.primaryColor, { h: 120, l: -10 }); + this.pieTitleTextSize = this.pieTitleTextSize || "25px"; + this.pieTitleTextColor = this.pieTitleTextColor || this.taskTextDarkColor; + this.pieSectionTextSize = this.pieSectionTextSize || "17px"; + this.pieSectionTextColor = this.pieSectionTextColor || this.textColor; + this.pieLegendTextSize = this.pieLegendTextSize || "17px"; + this.pieLegendTextColor = this.pieLegendTextColor || this.taskTextDarkColor; + this.pieStrokeColor = this.pieStrokeColor || "black"; + this.pieStrokeWidth = this.pieStrokeWidth || "2px"; + this.pieOuterStrokeWidth = this.pieOuterStrokeWidth || "2px"; + this.pieOuterStrokeColor = this.pieOuterStrokeColor || "black"; + this.pieOpacity = this.pieOpacity || "0.7"; + this.radar = { + axisColor: this.radar?.axisColor || this.lineColor, + axisStrokeWidth: this.radar?.axisStrokeWidth || 2, + axisLabelFontSize: this.radar?.axisLabelFontSize || 12, + curveOpacity: this.radar?.curveOpacity || 0.5, + curveStrokeWidth: this.radar?.curveStrokeWidth || 2, + graticuleColor: this.radar?.graticuleColor || "#DEDEDE", + graticuleStrokeWidth: this.radar?.graticuleStrokeWidth || 1, + graticuleOpacity: this.radar?.graticuleOpacity || 0.3, + legendBoxSize: this.radar?.legendBoxSize || 12, + legendFontSize: this.radar?.legendFontSize || 12 + }; + this.archEdgeColor = this.archEdgeColor || "#777"; + this.archEdgeArrowColor = this.archEdgeArrowColor || "#777"; + this.archEdgeWidth = this.archEdgeWidth || "3"; + this.archGroupBorderColor = this.archGroupBorderColor || "#000"; + this.archGroupBorderWidth = this.archGroupBorderWidth || "2px"; + this.quadrant1Fill = this.quadrant1Fill || this.primaryColor; + this.quadrant2Fill = this.quadrant2Fill || adjust2(this.primaryColor, { r: 5, g: 5, b: 5 }); + this.quadrant3Fill = this.quadrant3Fill || adjust2(this.primaryColor, { r: 10, g: 10, b: 10 }); + this.quadrant4Fill = this.quadrant4Fill || adjust2(this.primaryColor, { r: 15, g: 15, b: 15 }); + this.quadrant1TextFill = this.quadrant1TextFill || this.primaryTextColor; + this.quadrant2TextFill = this.quadrant2TextFill || adjust2(this.primaryTextColor, { r: -5, g: -5, b: -5 }); + this.quadrant3TextFill = this.quadrant3TextFill || adjust2(this.primaryTextColor, { r: -10, g: -10, b: -10 }); + this.quadrant4TextFill = this.quadrant4TextFill || adjust2(this.primaryTextColor, { r: -15, g: -15, b: -15 }); + this.quadrantPointFill = this.quadrantPointFill || isDark(this.quadrant1Fill) ? lighten(this.quadrant1Fill) : darken(this.quadrant1Fill); + this.quadrantPointTextFill = this.quadrantPointTextFill || this.primaryTextColor; + this.quadrantXAxisTextFill = this.quadrantXAxisTextFill || this.primaryTextColor; + this.quadrantYAxisTextFill = this.quadrantYAxisTextFill || this.primaryTextColor; + this.quadrantInternalBorderStrokeFill = this.quadrantInternalBorderStrokeFill || this.primaryBorderColor; + this.quadrantExternalBorderStrokeFill = this.quadrantExternalBorderStrokeFill || this.primaryBorderColor; + this.quadrantTitleFill = this.quadrantTitleFill || this.primaryTextColor; + this.xyChart = { + backgroundColor: this.xyChart?.backgroundColor || this.background, + titleColor: this.xyChart?.titleColor || this.primaryTextColor, + xAxisTitleColor: this.xyChart?.xAxisTitleColor || this.primaryTextColor, + xAxisLabelColor: this.xyChart?.xAxisLabelColor || this.primaryTextColor, + xAxisTickColor: this.xyChart?.xAxisTickColor || this.primaryTextColor, + xAxisLineColor: this.xyChart?.xAxisLineColor || this.primaryTextColor, + yAxisTitleColor: this.xyChart?.yAxisTitleColor || this.primaryTextColor, + yAxisLabelColor: this.xyChart?.yAxisLabelColor || this.primaryTextColor, + yAxisTickColor: this.xyChart?.yAxisTickColor || this.primaryTextColor, + yAxisLineColor: this.xyChart?.yAxisLineColor || this.primaryTextColor, + plotColorPalette: this.xyChart?.plotColorPalette || "#FFF4DD,#FFD8B1,#FFA07A,#ECEFF1,#D6DBDF,#C3E0A8,#FFB6A4,#FFD74D,#738FA7,#FFFFF0" + }; + this.requirementBackground = this.requirementBackground || this.primaryColor; + this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor; + this.requirementBorderSize = this.requirementBorderSize || "1"; + this.requirementTextColor = this.requirementTextColor || this.primaryTextColor; + this.relationColor = this.relationColor || this.lineColor; + this.relationLabelBackground = this.relationLabelBackground || (this.darkMode ? darken(this.secondaryColor, 30) : this.secondaryColor); + this.relationLabelColor = this.relationLabelColor || this.actorTextColor; + this.git0 = this.git0 || this.primaryColor; + this.git1 = this.git1 || this.secondaryColor; + this.git2 = this.git2 || this.tertiaryColor; + this.git3 = this.git3 || adjust2(this.primaryColor, { h: -30 }); + this.git4 = this.git4 || adjust2(this.primaryColor, { h: -60 }); + this.git5 = this.git5 || adjust2(this.primaryColor, { h: -90 }); + this.git6 = this.git6 || adjust2(this.primaryColor, { h: 60 }); + this.git7 = this.git7 || adjust2(this.primaryColor, { h: 120 }); + if (this.darkMode) { + this.git0 = lighten(this.git0, 25); + this.git1 = lighten(this.git1, 25); + this.git2 = lighten(this.git2, 25); + this.git3 = lighten(this.git3, 25); + this.git4 = lighten(this.git4, 25); + this.git5 = lighten(this.git5, 25); + this.git6 = lighten(this.git6, 25); + this.git7 = lighten(this.git7, 25); + } else { + this.git0 = darken(this.git0, 25); + this.git1 = darken(this.git1, 25); + this.git2 = darken(this.git2, 25); + this.git3 = darken(this.git3, 25); + this.git4 = darken(this.git4, 25); + this.git5 = darken(this.git5, 25); + this.git6 = darken(this.git6, 25); + this.git7 = darken(this.git7, 25); + } + this.gitInv0 = this.gitInv0 || invert(this.git0); + this.gitInv1 = this.gitInv1 || invert(this.git1); + this.gitInv2 = this.gitInv2 || invert(this.git2); + this.gitInv3 = this.gitInv3 || invert(this.git3); + this.gitInv4 = this.gitInv4 || invert(this.git4); + this.gitInv5 = this.gitInv5 || invert(this.git5); + this.gitInv6 = this.gitInv6 || invert(this.git6); + this.gitInv7 = this.gitInv7 || invert(this.git7); + this.branchLabelColor = this.branchLabelColor || (this.darkMode ? "black" : this.labelTextColor); + this.gitBranchLabel0 = this.gitBranchLabel0 || this.branchLabelColor; + this.gitBranchLabel1 = this.gitBranchLabel1 || this.branchLabelColor; + this.gitBranchLabel2 = this.gitBranchLabel2 || this.branchLabelColor; + this.gitBranchLabel3 = this.gitBranchLabel3 || this.branchLabelColor; + this.gitBranchLabel4 = this.gitBranchLabel4 || this.branchLabelColor; + this.gitBranchLabel5 = this.gitBranchLabel5 || this.branchLabelColor; + this.gitBranchLabel6 = this.gitBranchLabel6 || this.branchLabelColor; + this.gitBranchLabel7 = this.gitBranchLabel7 || this.branchLabelColor; + this.tagLabelColor = this.tagLabelColor || this.primaryTextColor; + this.tagLabelBackground = this.tagLabelBackground || this.primaryColor; + this.tagLabelBorder = this.tagBorder || this.primaryBorderColor; + this.tagLabelFontSize = this.tagLabelFontSize || "10px"; + this.commitLabelColor = this.commitLabelColor || this.secondaryTextColor; + this.commitLabelBackground = this.commitLabelBackground || this.secondaryColor; + this.commitLabelFontSize = this.commitLabelFontSize || "10px"; + this.attributeBackgroundColorOdd = this.attributeBackgroundColorOdd || oldAttributeBackgroundColorOdd; + this.attributeBackgroundColorEven = this.attributeBackgroundColorEven || oldAttributeBackgroundColorEven; + } + calculate(overrides) { + if (typeof overrides !== "object") { + this.updateColors(); + return; + } + const keys = Object.keys(overrides); + keys.forEach((k) => { + this[k] = overrides[k]; + }); + this.updateColors(); + keys.forEach((k) => { + this[k] = overrides[k]; + }); + } +}; +var getThemeVariables = /* @__PURE__ */ __name((userOverrides) => { + const theme = new Theme(); + theme.calculate(userOverrides); + return theme; +}, "getThemeVariables"); + +// src/themes/theme-dark.js +import { adjust as adjust3, darken as darken2, invert as invert2, isDark as isDark2, lighten as lighten2, rgba } from "khroma"; +var Theme2 = class { + static { + __name(this, "Theme"); + } + constructor() { + this.background = "#333"; + this.primaryColor = "#1f2020"; + this.secondaryColor = lighten2(this.primaryColor, 16); + this.tertiaryColor = adjust3(this.primaryColor, { h: -160 }); + this.primaryBorderColor = invert2(this.background); + this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode); + this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode); + this.primaryTextColor = invert2(this.primaryColor); + this.secondaryTextColor = invert2(this.secondaryColor); + this.tertiaryTextColor = invert2(this.tertiaryColor); + this.lineColor = invert2(this.background); + this.textColor = invert2(this.background); + this.mainBkg = "#1f2020"; + this.secondBkg = "calculated"; + this.mainContrastColor = "lightgrey"; + this.darkTextColor = lighten2(invert2("#323D47"), 10); + this.lineColor = "calculated"; + this.border1 = "#ccc"; + this.border2 = rgba(255, 255, 255, 0.25); + this.arrowheadColor = "calculated"; + this.fontFamily = '"trebuchet ms", verdana, arial, sans-serif'; + this.fontSize = "16px"; + this.labelBackground = "#181818"; + this.textColor = "#ccc"; + this.THEME_COLOR_LIMIT = 12; + this.nodeBkg = "calculated"; + this.nodeBorder = "calculated"; + this.clusterBkg = "calculated"; + this.clusterBorder = "calculated"; + this.defaultLinkColor = "calculated"; + this.titleColor = "#F9FFFE"; + this.edgeLabelBackground = "calculated"; + this.actorBorder = "calculated"; + this.actorBkg = "calculated"; + this.actorTextColor = "calculated"; + this.actorLineColor = "calculated"; + this.signalColor = "calculated"; + this.signalTextColor = "calculated"; + this.labelBoxBkgColor = "calculated"; + this.labelBoxBorderColor = "calculated"; + this.labelTextColor = "calculated"; + this.loopTextColor = "calculated"; + this.noteBorderColor = "calculated"; + this.noteBkgColor = "#fff5ad"; + this.noteTextColor = "calculated"; + this.activationBorderColor = "calculated"; + this.activationBkgColor = "calculated"; + this.sequenceNumberColor = "black"; + this.sectionBkgColor = darken2("#EAE8D9", 30); + this.altSectionBkgColor = "calculated"; + this.sectionBkgColor2 = "#EAE8D9"; + this.excludeBkgColor = darken2(this.sectionBkgColor, 10); + this.taskBorderColor = rgba(255, 255, 255, 70); + this.taskBkgColor = "calculated"; + this.taskTextColor = "calculated"; + this.taskTextLightColor = "calculated"; + this.taskTextOutsideColor = "calculated"; + this.taskTextClickableColor = "#003163"; + this.activeTaskBorderColor = rgba(255, 255, 255, 50); + this.activeTaskBkgColor = "#81B1DB"; + this.gridColor = "calculated"; + this.doneTaskBkgColor = "calculated"; + this.doneTaskBorderColor = "grey"; + this.critBorderColor = "#E83737"; + this.critBkgColor = "#E83737"; + this.taskTextDarkColor = "calculated"; + this.todayLineColor = "#DB5757"; + this.vertLineColor = "#00BFFF"; + this.personBorder = this.primaryBorderColor; + this.personBkg = this.mainBkg; + this.archEdgeColor = "calculated"; + this.archEdgeArrowColor = "calculated"; + this.archEdgeWidth = "3"; + this.archGroupBorderColor = this.primaryBorderColor; + this.archGroupBorderWidth = "2px"; + this.rowOdd = this.rowOdd || lighten2(this.mainBkg, 5) || "#ffffff"; + this.rowEven = this.rowEven || darken2(this.mainBkg, 10); + this.labelColor = "calculated"; + this.errorBkgColor = "#a44141"; + this.errorTextColor = "#ddd"; + } + updateColors() { + this.secondBkg = lighten2(this.mainBkg, 16); + this.lineColor = this.mainContrastColor; + this.arrowheadColor = this.mainContrastColor; + this.nodeBkg = this.mainBkg; + this.nodeBorder = this.border1; + this.clusterBkg = this.secondBkg; + this.clusterBorder = this.border2; + this.defaultLinkColor = this.lineColor; + this.edgeLabelBackground = lighten2(this.labelBackground, 25); + this.actorBorder = this.border1; + this.actorBkg = this.mainBkg; + this.actorTextColor = this.mainContrastColor; + this.actorLineColor = this.actorBorder; + this.signalColor = this.mainContrastColor; + this.signalTextColor = this.mainContrastColor; + this.labelBoxBkgColor = this.actorBkg; + this.labelBoxBorderColor = this.actorBorder; + this.labelTextColor = this.mainContrastColor; + this.loopTextColor = this.mainContrastColor; + this.noteBorderColor = this.secondaryBorderColor; + this.noteBkgColor = this.secondBkg; + this.noteTextColor = this.secondaryTextColor; + this.activationBorderColor = this.border1; + this.activationBkgColor = this.secondBkg; + this.altSectionBkgColor = this.background; + this.taskBkgColor = lighten2(this.mainBkg, 23); + this.taskTextColor = this.darkTextColor; + this.taskTextLightColor = this.mainContrastColor; + this.taskTextOutsideColor = this.taskTextLightColor; + this.gridColor = this.mainContrastColor; + this.doneTaskBkgColor = this.mainContrastColor; + this.taskTextDarkColor = this.darkTextColor; + this.archEdgeColor = this.lineColor; + this.archEdgeArrowColor = this.lineColor; + this.transitionColor = this.transitionColor || this.lineColor; + this.transitionLabelColor = this.transitionLabelColor || this.textColor; + this.stateLabelColor = this.stateLabelColor || this.stateBkg || this.primaryTextColor; + this.stateBkg = this.stateBkg || this.mainBkg; + this.labelBackgroundColor = this.labelBackgroundColor || this.stateBkg; + this.compositeBackground = this.compositeBackground || this.background || this.tertiaryColor; + this.altBackground = this.altBackground || "#555"; + this.compositeTitleBackground = this.compositeTitleBackground || this.mainBkg; + this.compositeBorder = this.compositeBorder || this.nodeBorder; + this.innerEndBackground = this.primaryBorderColor; + this.specialStateColor = "#f4f4f4"; + this.errorBkgColor = this.errorBkgColor || this.tertiaryColor; + this.errorTextColor = this.errorTextColor || this.tertiaryTextColor; + this.fillType0 = this.primaryColor; + this.fillType1 = this.secondaryColor; + this.fillType2 = adjust3(this.primaryColor, { h: 64 }); + this.fillType3 = adjust3(this.secondaryColor, { h: 64 }); + this.fillType4 = adjust3(this.primaryColor, { h: -64 }); + this.fillType5 = adjust3(this.secondaryColor, { h: -64 }); + this.fillType6 = adjust3(this.primaryColor, { h: 128 }); + this.fillType7 = adjust3(this.secondaryColor, { h: 128 }); + this.cScale1 = this.cScale1 || "#0b0000"; + this.cScale2 = this.cScale2 || "#4d1037"; + this.cScale3 = this.cScale3 || "#3f5258"; + this.cScale4 = this.cScale4 || "#4f2f1b"; + this.cScale5 = this.cScale5 || "#6e0a0a"; + this.cScale6 = this.cScale6 || "#3b0048"; + this.cScale7 = this.cScale7 || "#995a01"; + this.cScale8 = this.cScale8 || "#154706"; + this.cScale9 = this.cScale9 || "#161722"; + this.cScale10 = this.cScale10 || "#00296f"; + this.cScale11 = this.cScale11 || "#01629c"; + this.cScale12 = this.cScale12 || "#010029"; + this.cScale0 = this.cScale0 || this.primaryColor; + this.cScale1 = this.cScale1 || this.secondaryColor; + this.cScale2 = this.cScale2 || this.tertiaryColor; + this.cScale3 = this.cScale3 || adjust3(this.primaryColor, { h: 30 }); + this.cScale4 = this.cScale4 || adjust3(this.primaryColor, { h: 60 }); + this.cScale5 = this.cScale5 || adjust3(this.primaryColor, { h: 90 }); + this.cScale6 = this.cScale6 || adjust3(this.primaryColor, { h: 120 }); + this.cScale7 = this.cScale7 || adjust3(this.primaryColor, { h: 150 }); + this.cScale8 = this.cScale8 || adjust3(this.primaryColor, { h: 210 }); + this.cScale9 = this.cScale9 || adjust3(this.primaryColor, { h: 270 }); + this.cScale10 = this.cScale10 || adjust3(this.primaryColor, { h: 300 }); + this.cScale11 = this.cScale11 || adjust3(this.primaryColor, { h: 330 }); + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScaleInv" + i] = this["cScaleInv" + i] || invert2(this["cScale" + i]); + } + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScalePeer" + i] = this["cScalePeer" + i] || lighten2(this["cScale" + i], 10); + } + for (let i = 0; i < 5; i++) { + this["surface" + i] = this["surface" + i] || adjust3(this.mainBkg, { h: 30, s: -30, l: -(-10 + i * 4) }); + this["surfacePeer" + i] = this["surfacePeer" + i] || adjust3(this.mainBkg, { h: 30, s: -30, l: -(-7 + i * 4) }); + } + this.scaleLabelColor = this.scaleLabelColor || (this.darkMode ? "black" : this.labelTextColor); + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScaleLabel" + i] = this["cScaleLabel" + i] || this.scaleLabelColor; + } + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["pie" + i] = this["cScale" + i]; + } + this.pieTitleTextSize = this.pieTitleTextSize || "25px"; + this.pieTitleTextColor = this.pieTitleTextColor || this.taskTextDarkColor; + this.pieSectionTextSize = this.pieSectionTextSize || "17px"; + this.pieSectionTextColor = this.pieSectionTextColor || this.textColor; + this.pieLegendTextSize = this.pieLegendTextSize || "17px"; + this.pieLegendTextColor = this.pieLegendTextColor || this.taskTextDarkColor; + this.pieStrokeColor = this.pieStrokeColor || "black"; + this.pieStrokeWidth = this.pieStrokeWidth || "2px"; + this.pieOuterStrokeWidth = this.pieOuterStrokeWidth || "2px"; + this.pieOuterStrokeColor = this.pieOuterStrokeColor || "black"; + this.pieOpacity = this.pieOpacity || "0.7"; + this.quadrant1Fill = this.quadrant1Fill || this.primaryColor; + this.quadrant2Fill = this.quadrant2Fill || adjust3(this.primaryColor, { r: 5, g: 5, b: 5 }); + this.quadrant3Fill = this.quadrant3Fill || adjust3(this.primaryColor, { r: 10, g: 10, b: 10 }); + this.quadrant4Fill = this.quadrant4Fill || adjust3(this.primaryColor, { r: 15, g: 15, b: 15 }); + this.quadrant1TextFill = this.quadrant1TextFill || this.primaryTextColor; + this.quadrant2TextFill = this.quadrant2TextFill || adjust3(this.primaryTextColor, { r: -5, g: -5, b: -5 }); + this.quadrant3TextFill = this.quadrant3TextFill || adjust3(this.primaryTextColor, { r: -10, g: -10, b: -10 }); + this.quadrant4TextFill = this.quadrant4TextFill || adjust3(this.primaryTextColor, { r: -15, g: -15, b: -15 }); + this.quadrantPointFill = this.quadrantPointFill || isDark2(this.quadrant1Fill) ? lighten2(this.quadrant1Fill) : darken2(this.quadrant1Fill); + this.quadrantPointTextFill = this.quadrantPointTextFill || this.primaryTextColor; + this.quadrantXAxisTextFill = this.quadrantXAxisTextFill || this.primaryTextColor; + this.quadrantYAxisTextFill = this.quadrantYAxisTextFill || this.primaryTextColor; + this.quadrantInternalBorderStrokeFill = this.quadrantInternalBorderStrokeFill || this.primaryBorderColor; + this.quadrantExternalBorderStrokeFill = this.quadrantExternalBorderStrokeFill || this.primaryBorderColor; + this.quadrantTitleFill = this.quadrantTitleFill || this.primaryTextColor; + this.xyChart = { + backgroundColor: this.xyChart?.backgroundColor || this.background, + titleColor: this.xyChart?.titleColor || this.primaryTextColor, + xAxisTitleColor: this.xyChart?.xAxisTitleColor || this.primaryTextColor, + xAxisLabelColor: this.xyChart?.xAxisLabelColor || this.primaryTextColor, + xAxisTickColor: this.xyChart?.xAxisTickColor || this.primaryTextColor, + xAxisLineColor: this.xyChart?.xAxisLineColor || this.primaryTextColor, + yAxisTitleColor: this.xyChart?.yAxisTitleColor || this.primaryTextColor, + yAxisLabelColor: this.xyChart?.yAxisLabelColor || this.primaryTextColor, + yAxisTickColor: this.xyChart?.yAxisTickColor || this.primaryTextColor, + yAxisLineColor: this.xyChart?.yAxisLineColor || this.primaryTextColor, + plotColorPalette: this.xyChart?.plotColorPalette || "#3498db,#2ecc71,#e74c3c,#f1c40f,#bdc3c7,#ffffff,#34495e,#9b59b6,#1abc9c,#e67e22" + }; + this.packet = { + startByteColor: this.primaryTextColor, + endByteColor: this.primaryTextColor, + labelColor: this.primaryTextColor, + titleColor: this.primaryTextColor, + blockStrokeColor: this.primaryTextColor, + blockFillColor: this.background + }; + this.radar = { + axisColor: this.radar?.axisColor || this.lineColor, + axisStrokeWidth: this.radar?.axisStrokeWidth || 2, + axisLabelFontSize: this.radar?.axisLabelFontSize || 12, + curveOpacity: this.radar?.curveOpacity || 0.5, + curveStrokeWidth: this.radar?.curveStrokeWidth || 2, + graticuleColor: this.radar?.graticuleColor || "#DEDEDE", + graticuleStrokeWidth: this.radar?.graticuleStrokeWidth || 1, + graticuleOpacity: this.radar?.graticuleOpacity || 0.3, + legendBoxSize: this.radar?.legendBoxSize || 12, + legendFontSize: this.radar?.legendFontSize || 12 + }; + this.classText = this.primaryTextColor; + this.requirementBackground = this.requirementBackground || this.primaryColor; + this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor; + this.requirementBorderSize = this.requirementBorderSize || "1"; + this.requirementTextColor = this.requirementTextColor || this.primaryTextColor; + this.relationColor = this.relationColor || this.lineColor; + this.relationLabelBackground = this.relationLabelBackground || (this.darkMode ? darken2(this.secondaryColor, 30) : this.secondaryColor); + this.relationLabelColor = this.relationLabelColor || this.actorTextColor; + this.git0 = lighten2(this.secondaryColor, 20); + this.git1 = lighten2(this.pie2 || this.secondaryColor, 20); + this.git2 = lighten2(this.pie3 || this.tertiaryColor, 20); + this.git3 = lighten2(this.pie4 || adjust3(this.primaryColor, { h: -30 }), 20); + this.git4 = lighten2(this.pie5 || adjust3(this.primaryColor, { h: -60 }), 20); + this.git5 = lighten2(this.pie6 || adjust3(this.primaryColor, { h: -90 }), 10); + this.git6 = lighten2(this.pie7 || adjust3(this.primaryColor, { h: 60 }), 10); + this.git7 = lighten2(this.pie8 || adjust3(this.primaryColor, { h: 120 }), 20); + this.gitInv0 = this.gitInv0 || invert2(this.git0); + this.gitInv1 = this.gitInv1 || invert2(this.git1); + this.gitInv2 = this.gitInv2 || invert2(this.git2); + this.gitInv3 = this.gitInv3 || invert2(this.git3); + this.gitInv4 = this.gitInv4 || invert2(this.git4); + this.gitInv5 = this.gitInv5 || invert2(this.git5); + this.gitInv6 = this.gitInv6 || invert2(this.git6); + this.gitInv7 = this.gitInv7 || invert2(this.git7); + this.gitBranchLabel0 = this.gitBranchLabel0 || invert2(this.labelTextColor); + this.gitBranchLabel1 = this.gitBranchLabel1 || this.labelTextColor; + this.gitBranchLabel2 = this.gitBranchLabel2 || this.labelTextColor; + this.gitBranchLabel3 = this.gitBranchLabel3 || invert2(this.labelTextColor); + this.gitBranchLabel4 = this.gitBranchLabel4 || this.labelTextColor; + this.gitBranchLabel5 = this.gitBranchLabel5 || this.labelTextColor; + this.gitBranchLabel6 = this.gitBranchLabel6 || this.labelTextColor; + this.gitBranchLabel7 = this.gitBranchLabel7 || this.labelTextColor; + this.tagLabelColor = this.tagLabelColor || this.primaryTextColor; + this.tagLabelBackground = this.tagLabelBackground || this.primaryColor; + this.tagLabelBorder = this.tagBorder || this.primaryBorderColor; + this.tagLabelFontSize = this.tagLabelFontSize || "10px"; + this.commitLabelColor = this.commitLabelColor || this.secondaryTextColor; + this.commitLabelBackground = this.commitLabelBackground || this.secondaryColor; + this.commitLabelFontSize = this.commitLabelFontSize || "10px"; + this.attributeBackgroundColorOdd = this.attributeBackgroundColorOdd || lighten2(this.background, 12); + this.attributeBackgroundColorEven = this.attributeBackgroundColorEven || lighten2(this.background, 2); + this.nodeBorder = this.nodeBorder || "#999"; + } + calculate(overrides) { + if (typeof overrides !== "object") { + this.updateColors(); + return; + } + const keys = Object.keys(overrides); + keys.forEach((k) => { + this[k] = overrides[k]; + }); + this.updateColors(); + keys.forEach((k) => { + this[k] = overrides[k]; + }); + } +}; +var getThemeVariables2 = /* @__PURE__ */ __name((userOverrides) => { + const theme = new Theme2(); + theme.calculate(userOverrides); + return theme; +}, "getThemeVariables"); + +// src/themes/theme-default.js +import { invert as invert3, lighten as lighten3, rgba as rgba2, adjust as adjust4, darken as darken3, isDark as isDark3 } from "khroma"; +var Theme3 = class { + static { + __name(this, "Theme"); + } + constructor() { + this.background = "#f4f4f4"; + this.primaryColor = "#ECECFF"; + this.secondaryColor = adjust4(this.primaryColor, { h: 120 }); + this.secondaryColor = "#ffffde"; + this.tertiaryColor = adjust4(this.primaryColor, { h: -160 }); + this.primaryBorderColor = mkBorder(this.primaryColor, this.darkMode); + this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode); + this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode); + this.primaryTextColor = invert3(this.primaryColor); + this.secondaryTextColor = invert3(this.secondaryColor); + this.tertiaryTextColor = invert3(this.tertiaryColor); + this.lineColor = invert3(this.background); + this.textColor = invert3(this.background); + this.background = "white"; + this.mainBkg = "#ECECFF"; + this.secondBkg = "#ffffde"; + this.lineColor = "#333333"; + this.border1 = "#9370DB"; + this.border2 = "#aaaa33"; + this.arrowheadColor = "#333333"; + this.fontFamily = '"trebuchet ms", verdana, arial, sans-serif'; + this.fontSize = "16px"; + this.labelBackground = "rgba(232,232,232, 0.8)"; + this.textColor = "#333"; + this.THEME_COLOR_LIMIT = 12; + this.nodeBkg = "calculated"; + this.nodeBorder = "calculated"; + this.clusterBkg = "calculated"; + this.clusterBorder = "calculated"; + this.defaultLinkColor = "calculated"; + this.titleColor = "calculated"; + this.edgeLabelBackground = "calculated"; + this.actorBorder = "calculated"; + this.actorBkg = "calculated"; + this.actorTextColor = "black"; + this.actorLineColor = "calculated"; + this.signalColor = "calculated"; + this.signalTextColor = "calculated"; + this.labelBoxBkgColor = "calculated"; + this.labelBoxBorderColor = "calculated"; + this.labelTextColor = "calculated"; + this.loopTextColor = "calculated"; + this.noteBorderColor = "calculated"; + this.noteBkgColor = "#fff5ad"; + this.noteTextColor = "calculated"; + this.activationBorderColor = "#666"; + this.activationBkgColor = "#f4f4f4"; + this.sequenceNumberColor = "white"; + this.sectionBkgColor = "calculated"; + this.altSectionBkgColor = "calculated"; + this.sectionBkgColor2 = "calculated"; + this.excludeBkgColor = "#eeeeee"; + this.taskBorderColor = "calculated"; + this.taskBkgColor = "calculated"; + this.taskTextLightColor = "calculated"; + this.taskTextColor = this.taskTextLightColor; + this.taskTextDarkColor = "calculated"; + this.taskTextOutsideColor = this.taskTextDarkColor; + this.taskTextClickableColor = "calculated"; + this.activeTaskBorderColor = "calculated"; + this.activeTaskBkgColor = "calculated"; + this.gridColor = "calculated"; + this.doneTaskBkgColor = "calculated"; + this.doneTaskBorderColor = "calculated"; + this.critBorderColor = "calculated"; + this.critBkgColor = "calculated"; + this.todayLineColor = "calculated"; + this.vertLineColor = "calculated"; + this.sectionBkgColor = rgba2(102, 102, 255, 0.49); + this.altSectionBkgColor = "white"; + this.sectionBkgColor2 = "#fff400"; + this.taskBorderColor = "#534fbc"; + this.taskBkgColor = "#8a90dd"; + this.taskTextLightColor = "white"; + this.taskTextColor = "calculated"; + this.taskTextDarkColor = "black"; + this.taskTextOutsideColor = "calculated"; + this.taskTextClickableColor = "#003163"; + this.activeTaskBorderColor = "#534fbc"; + this.activeTaskBkgColor = "#bfc7ff"; + this.gridColor = "lightgrey"; + this.doneTaskBkgColor = "lightgrey"; + this.doneTaskBorderColor = "grey"; + this.critBorderColor = "#ff8888"; + this.critBkgColor = "red"; + this.todayLineColor = "red"; + this.vertLineColor = "navy"; + this.personBorder = this.primaryBorderColor; + this.personBkg = this.mainBkg; + this.archEdgeColor = "calculated"; + this.archEdgeArrowColor = "calculated"; + this.archEdgeWidth = "3"; + this.archGroupBorderColor = this.primaryBorderColor; + this.archGroupBorderWidth = "2px"; + this.rowOdd = "calculated"; + this.rowEven = "calculated"; + this.labelColor = "black"; + this.errorBkgColor = "#552222"; + this.errorTextColor = "#552222"; + this.updateColors(); + } + updateColors() { + this.cScale0 = this.cScale0 || this.primaryColor; + this.cScale1 = this.cScale1 || this.secondaryColor; + this.cScale2 = this.cScale2 || this.tertiaryColor; + this.cScale3 = this.cScale3 || adjust4(this.primaryColor, { h: 30 }); + this.cScale4 = this.cScale4 || adjust4(this.primaryColor, { h: 60 }); + this.cScale5 = this.cScale5 || adjust4(this.primaryColor, { h: 90 }); + this.cScale6 = this.cScale6 || adjust4(this.primaryColor, { h: 120 }); + this.cScale7 = this.cScale7 || adjust4(this.primaryColor, { h: 150 }); + this.cScale8 = this.cScale8 || adjust4(this.primaryColor, { h: 210 }); + this.cScale9 = this.cScale9 || adjust4(this.primaryColor, { h: 270 }); + this.cScale10 = this.cScale10 || adjust4(this.primaryColor, { h: 300 }); + this.cScale11 = this.cScale11 || adjust4(this.primaryColor, { h: 330 }); + this["cScalePeer1"] = this["cScalePeer1"] || darken3(this.secondaryColor, 45); + this["cScalePeer2"] = this["cScalePeer2"] || darken3(this.tertiaryColor, 40); + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScale" + i] = darken3(this["cScale" + i], 10); + this["cScalePeer" + i] = this["cScalePeer" + i] || darken3(this["cScale" + i], 25); + } + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScaleInv" + i] = this["cScaleInv" + i] || adjust4(this["cScale" + i], { h: 180 }); + } + for (let i = 0; i < 5; i++) { + this["surface" + i] = this["surface" + i] || adjust4(this.mainBkg, { h: 30, l: -(5 + i * 5) }); + this["surfacePeer" + i] = this["surfacePeer" + i] || adjust4(this.mainBkg, { h: 30, l: -(7 + i * 5) }); + } + this.scaleLabelColor = this.scaleLabelColor !== "calculated" && this.scaleLabelColor ? this.scaleLabelColor : this.labelTextColor; + if (this.labelTextColor !== "calculated") { + this.cScaleLabel0 = this.cScaleLabel0 || invert3(this.labelTextColor); + this.cScaleLabel3 = this.cScaleLabel3 || invert3(this.labelTextColor); + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScaleLabel" + i] = this["cScaleLabel" + i] || this.labelTextColor; + } + } + this.nodeBkg = this.mainBkg; + this.nodeBorder = this.border1; + this.clusterBkg = this.secondBkg; + this.clusterBorder = this.border2; + this.defaultLinkColor = this.lineColor; + this.titleColor = this.textColor; + this.edgeLabelBackground = this.labelBackground; + this.actorBorder = lighten3(this.border1, 23); + this.actorBkg = this.mainBkg; + this.labelBoxBkgColor = this.actorBkg; + this.signalColor = this.textColor; + this.signalTextColor = this.textColor; + this.labelBoxBorderColor = this.actorBorder; + this.labelTextColor = this.actorTextColor; + this.loopTextColor = this.actorTextColor; + this.noteBorderColor = this.border2; + this.noteTextColor = this.actorTextColor; + this.actorLineColor = this.actorBorder; + this.taskTextColor = this.taskTextLightColor; + this.taskTextOutsideColor = this.taskTextDarkColor; + this.archEdgeColor = this.lineColor; + this.archEdgeArrowColor = this.lineColor; + this.rowOdd = this.rowOdd || lighten3(this.primaryColor, 75) || "#ffffff"; + this.rowEven = this.rowEven || lighten3(this.primaryColor, 1); + this.transitionColor = this.transitionColor || this.lineColor; + this.transitionLabelColor = this.transitionLabelColor || this.textColor; + this.stateLabelColor = this.stateLabelColor || this.stateBkg || this.primaryTextColor; + this.stateBkg = this.stateBkg || this.mainBkg; + this.labelBackgroundColor = this.labelBackgroundColor || this.stateBkg; + this.compositeBackground = this.compositeBackground || this.background || this.tertiaryColor; + this.altBackground = this.altBackground || "#f0f0f0"; + this.compositeTitleBackground = this.compositeTitleBackground || this.mainBkg; + this.compositeBorder = this.compositeBorder || this.nodeBorder; + this.innerEndBackground = this.nodeBorder; + this.specialStateColor = this.lineColor; + this.errorBkgColor = this.errorBkgColor || this.tertiaryColor; + this.errorTextColor = this.errorTextColor || this.tertiaryTextColor; + this.transitionColor = this.transitionColor || this.lineColor; + this.classText = this.primaryTextColor; + this.fillType0 = this.primaryColor; + this.fillType1 = this.secondaryColor; + this.fillType2 = adjust4(this.primaryColor, { h: 64 }); + this.fillType3 = adjust4(this.secondaryColor, { h: 64 }); + this.fillType4 = adjust4(this.primaryColor, { h: -64 }); + this.fillType5 = adjust4(this.secondaryColor, { h: -64 }); + this.fillType6 = adjust4(this.primaryColor, { h: 128 }); + this.fillType7 = adjust4(this.secondaryColor, { h: 128 }); + this.pie1 = this.pie1 || this.primaryColor; + this.pie2 = this.pie2 || this.secondaryColor; + this.pie3 = this.pie3 || adjust4(this.tertiaryColor, { l: -40 }); + this.pie4 = this.pie4 || adjust4(this.primaryColor, { l: -10 }); + this.pie5 = this.pie5 || adjust4(this.secondaryColor, { l: -30 }); + this.pie6 = this.pie6 || adjust4(this.tertiaryColor, { l: -20 }); + this.pie7 = this.pie7 || adjust4(this.primaryColor, { h: 60, l: -20 }); + this.pie8 = this.pie8 || adjust4(this.primaryColor, { h: -60, l: -40 }); + this.pie9 = this.pie9 || adjust4(this.primaryColor, { h: 120, l: -40 }); + this.pie10 = this.pie10 || adjust4(this.primaryColor, { h: 60, l: -40 }); + this.pie11 = this.pie11 || adjust4(this.primaryColor, { h: -90, l: -40 }); + this.pie12 = this.pie12 || adjust4(this.primaryColor, { h: 120, l: -30 }); + this.pieTitleTextSize = this.pieTitleTextSize || "25px"; + this.pieTitleTextColor = this.pieTitleTextColor || this.taskTextDarkColor; + this.pieSectionTextSize = this.pieSectionTextSize || "17px"; + this.pieSectionTextColor = this.pieSectionTextColor || this.textColor; + this.pieLegendTextSize = this.pieLegendTextSize || "17px"; + this.pieLegendTextColor = this.pieLegendTextColor || this.taskTextDarkColor; + this.pieStrokeColor = this.pieStrokeColor || "black"; + this.pieStrokeWidth = this.pieStrokeWidth || "2px"; + this.pieOuterStrokeWidth = this.pieOuterStrokeWidth || "2px"; + this.pieOuterStrokeColor = this.pieOuterStrokeColor || "black"; + this.pieOpacity = this.pieOpacity || "0.7"; + this.quadrant1Fill = this.quadrant1Fill || this.primaryColor; + this.quadrant2Fill = this.quadrant2Fill || adjust4(this.primaryColor, { r: 5, g: 5, b: 5 }); + this.quadrant3Fill = this.quadrant3Fill || adjust4(this.primaryColor, { r: 10, g: 10, b: 10 }); + this.quadrant4Fill = this.quadrant4Fill || adjust4(this.primaryColor, { r: 15, g: 15, b: 15 }); + this.quadrant1TextFill = this.quadrant1TextFill || this.primaryTextColor; + this.quadrant2TextFill = this.quadrant2TextFill || adjust4(this.primaryTextColor, { r: -5, g: -5, b: -5 }); + this.quadrant3TextFill = this.quadrant3TextFill || adjust4(this.primaryTextColor, { r: -10, g: -10, b: -10 }); + this.quadrant4TextFill = this.quadrant4TextFill || adjust4(this.primaryTextColor, { r: -15, g: -15, b: -15 }); + this.quadrantPointFill = this.quadrantPointFill || isDark3(this.quadrant1Fill) ? lighten3(this.quadrant1Fill) : darken3(this.quadrant1Fill); + this.quadrantPointTextFill = this.quadrantPointTextFill || this.primaryTextColor; + this.quadrantXAxisTextFill = this.quadrantXAxisTextFill || this.primaryTextColor; + this.quadrantYAxisTextFill = this.quadrantYAxisTextFill || this.primaryTextColor; + this.quadrantInternalBorderStrokeFill = this.quadrantInternalBorderStrokeFill || this.primaryBorderColor; + this.quadrantExternalBorderStrokeFill = this.quadrantExternalBorderStrokeFill || this.primaryBorderColor; + this.quadrantTitleFill = this.quadrantTitleFill || this.primaryTextColor; + this.radar = { + axisColor: this.radar?.axisColor || this.lineColor, + axisStrokeWidth: this.radar?.axisStrokeWidth || 2, + axisLabelFontSize: this.radar?.axisLabelFontSize || 12, + curveOpacity: this.radar?.curveOpacity || 0.5, + curveStrokeWidth: this.radar?.curveStrokeWidth || 2, + graticuleColor: this.radar?.graticuleColor || "#DEDEDE", + graticuleStrokeWidth: this.radar?.graticuleStrokeWidth || 1, + graticuleOpacity: this.radar?.graticuleOpacity || 0.3, + legendBoxSize: this.radar?.legendBoxSize || 12, + legendFontSize: this.radar?.legendFontSize || 12 + }; + this.xyChart = { + backgroundColor: this.xyChart?.backgroundColor || this.background, + titleColor: this.xyChart?.titleColor || this.primaryTextColor, + xAxisTitleColor: this.xyChart?.xAxisTitleColor || this.primaryTextColor, + xAxisLabelColor: this.xyChart?.xAxisLabelColor || this.primaryTextColor, + xAxisTickColor: this.xyChart?.xAxisTickColor || this.primaryTextColor, + xAxisLineColor: this.xyChart?.xAxisLineColor || this.primaryTextColor, + yAxisTitleColor: this.xyChart?.yAxisTitleColor || this.primaryTextColor, + yAxisLabelColor: this.xyChart?.yAxisLabelColor || this.primaryTextColor, + yAxisTickColor: this.xyChart?.yAxisTickColor || this.primaryTextColor, + yAxisLineColor: this.xyChart?.yAxisLineColor || this.primaryTextColor, + plotColorPalette: this.xyChart?.plotColorPalette || "#ECECFF,#8493A6,#FFC3A0,#DCDDE1,#B8E994,#D1A36F,#C3CDE6,#FFB6C1,#496078,#F8F3E3" + }; + this.requirementBackground = this.requirementBackground || this.primaryColor; + this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor; + this.requirementBorderSize = this.requirementBorderSize || "1"; + this.requirementTextColor = this.requirementTextColor || this.primaryTextColor; + this.relationColor = this.relationColor || this.lineColor; + this.relationLabelBackground = this.relationLabelBackground || this.labelBackground; + this.relationLabelColor = this.relationLabelColor || this.actorTextColor; + this.git0 = this.git0 || this.primaryColor; + this.git1 = this.git1 || this.secondaryColor; + this.git2 = this.git2 || this.tertiaryColor; + this.git3 = this.git3 || adjust4(this.primaryColor, { h: -30 }); + this.git4 = this.git4 || adjust4(this.primaryColor, { h: -60 }); + this.git5 = this.git5 || adjust4(this.primaryColor, { h: -90 }); + this.git6 = this.git6 || adjust4(this.primaryColor, { h: 60 }); + this.git7 = this.git7 || adjust4(this.primaryColor, { h: 120 }); + if (this.darkMode) { + this.git0 = lighten3(this.git0, 25); + this.git1 = lighten3(this.git1, 25); + this.git2 = lighten3(this.git2, 25); + this.git3 = lighten3(this.git3, 25); + this.git4 = lighten3(this.git4, 25); + this.git5 = lighten3(this.git5, 25); + this.git6 = lighten3(this.git6, 25); + this.git7 = lighten3(this.git7, 25); + } else { + this.git0 = darken3(this.git0, 25); + this.git1 = darken3(this.git1, 25); + this.git2 = darken3(this.git2, 25); + this.git3 = darken3(this.git3, 25); + this.git4 = darken3(this.git4, 25); + this.git5 = darken3(this.git5, 25); + this.git6 = darken3(this.git6, 25); + this.git7 = darken3(this.git7, 25); + } + this.gitInv0 = this.gitInv0 || darken3(invert3(this.git0), 25); + this.gitInv1 = this.gitInv1 || invert3(this.git1); + this.gitInv2 = this.gitInv2 || invert3(this.git2); + this.gitInv3 = this.gitInv3 || invert3(this.git3); + this.gitInv4 = this.gitInv4 || invert3(this.git4); + this.gitInv5 = this.gitInv5 || invert3(this.git5); + this.gitInv6 = this.gitInv6 || invert3(this.git6); + this.gitInv7 = this.gitInv7 || invert3(this.git7); + this.gitBranchLabel0 = this.gitBranchLabel0 || invert3(this.labelTextColor); + this.gitBranchLabel1 = this.gitBranchLabel1 || this.labelTextColor; + this.gitBranchLabel2 = this.gitBranchLabel2 || this.labelTextColor; + this.gitBranchLabel3 = this.gitBranchLabel3 || invert3(this.labelTextColor); + this.gitBranchLabel4 = this.gitBranchLabel4 || this.labelTextColor; + this.gitBranchLabel5 = this.gitBranchLabel5 || this.labelTextColor; + this.gitBranchLabel6 = this.gitBranchLabel6 || this.labelTextColor; + this.gitBranchLabel7 = this.gitBranchLabel7 || this.labelTextColor; + this.tagLabelColor = this.tagLabelColor || this.primaryTextColor; + this.tagLabelBackground = this.tagLabelBackground || this.primaryColor; + this.tagLabelBorder = this.tagBorder || this.primaryBorderColor; + this.tagLabelFontSize = this.tagLabelFontSize || "10px"; + this.commitLabelColor = this.commitLabelColor || this.secondaryTextColor; + this.commitLabelBackground = this.commitLabelBackground || this.secondaryColor; + this.commitLabelFontSize = this.commitLabelFontSize || "10px"; + this.attributeBackgroundColorOdd = this.attributeBackgroundColorOdd || oldAttributeBackgroundColorOdd; + this.attributeBackgroundColorEven = this.attributeBackgroundColorEven || oldAttributeBackgroundColorEven; + } + calculate(overrides) { + Object.keys(this).forEach((k) => { + if (this[k] === "calculated") { + this[k] = void 0; + } + }); + if (typeof overrides !== "object") { + this.updateColors(); + return; + } + const keys = Object.keys(overrides); + keys.forEach((k) => { + this[k] = overrides[k]; + }); + this.updateColors(); + keys.forEach((k) => { + this[k] = overrides[k]; + }); + } +}; +var getThemeVariables3 = /* @__PURE__ */ __name((userOverrides) => { + const theme = new Theme3(); + theme.calculate(userOverrides); + return theme; +}, "getThemeVariables"); + +// src/themes/theme-forest.js +import { adjust as adjust5, darken as darken4, invert as invert4, isDark as isDark4, lighten as lighten4 } from "khroma"; +var Theme4 = class { + static { + __name(this, "Theme"); + } + constructor() { + this.background = "#f4f4f4"; + this.primaryColor = "#cde498"; + this.secondaryColor = "#cdffb2"; + this.background = "white"; + this.mainBkg = "#cde498"; + this.secondBkg = "#cdffb2"; + this.lineColor = "green"; + this.border1 = "#13540c"; + this.border2 = "#6eaa49"; + this.arrowheadColor = "green"; + this.fontFamily = '"trebuchet ms", verdana, arial, sans-serif'; + this.fontSize = "16px"; + this.tertiaryColor = lighten4("#cde498", 10); + this.primaryBorderColor = mkBorder(this.primaryColor, this.darkMode); + this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode); + this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode); + this.primaryTextColor = invert4(this.primaryColor); + this.secondaryTextColor = invert4(this.secondaryColor); + this.tertiaryTextColor = invert4(this.primaryColor); + this.lineColor = invert4(this.background); + this.textColor = invert4(this.background); + this.THEME_COLOR_LIMIT = 12; + this.nodeBkg = "calculated"; + this.nodeBorder = "calculated"; + this.clusterBkg = "calculated"; + this.clusterBorder = "calculated"; + this.defaultLinkColor = "calculated"; + this.titleColor = "#333"; + this.edgeLabelBackground = "#e8e8e8"; + this.actorBorder = "calculated"; + this.actorBkg = "calculated"; + this.actorTextColor = "black"; + this.actorLineColor = "calculated"; + this.signalColor = "#333"; + this.signalTextColor = "#333"; + this.labelBoxBkgColor = "calculated"; + this.labelBoxBorderColor = "#326932"; + this.labelTextColor = "calculated"; + this.loopTextColor = "calculated"; + this.noteBorderColor = "calculated"; + this.noteBkgColor = "#fff5ad"; + this.noteTextColor = "calculated"; + this.activationBorderColor = "#666"; + this.activationBkgColor = "#f4f4f4"; + this.sequenceNumberColor = "white"; + this.sectionBkgColor = "#6eaa49"; + this.altSectionBkgColor = "white"; + this.sectionBkgColor2 = "#6eaa49"; + this.excludeBkgColor = "#eeeeee"; + this.taskBorderColor = "calculated"; + this.taskBkgColor = "#487e3a"; + this.taskTextLightColor = "white"; + this.taskTextColor = "calculated"; + this.taskTextDarkColor = "black"; + this.taskTextOutsideColor = "calculated"; + this.taskTextClickableColor = "#003163"; + this.activeTaskBorderColor = "calculated"; + this.activeTaskBkgColor = "calculated"; + this.gridColor = "lightgrey"; + this.doneTaskBkgColor = "lightgrey"; + this.doneTaskBorderColor = "grey"; + this.critBorderColor = "#ff8888"; + this.critBkgColor = "red"; + this.todayLineColor = "red"; + this.vertLineColor = "#00BFFF"; + this.personBorder = this.primaryBorderColor; + this.personBkg = this.mainBkg; + this.archEdgeColor = "calculated"; + this.archEdgeArrowColor = "calculated"; + this.archEdgeWidth = "3"; + this.archGroupBorderColor = this.primaryBorderColor; + this.archGroupBorderWidth = "2px"; + this.labelColor = "black"; + this.errorBkgColor = "#552222"; + this.errorTextColor = "#552222"; + } + updateColors() { + this.actorBorder = darken4(this.mainBkg, 20); + this.actorBkg = this.mainBkg; + this.labelBoxBkgColor = this.actorBkg; + this.labelTextColor = this.actorTextColor; + this.loopTextColor = this.actorTextColor; + this.noteBorderColor = this.border2; + this.noteTextColor = this.actorTextColor; + this.actorLineColor = this.actorBorder; + this.cScale0 = this.cScale0 || this.primaryColor; + this.cScale1 = this.cScale1 || this.secondaryColor; + this.cScale2 = this.cScale2 || this.tertiaryColor; + this.cScale3 = this.cScale3 || adjust5(this.primaryColor, { h: 30 }); + this.cScale4 = this.cScale4 || adjust5(this.primaryColor, { h: 60 }); + this.cScale5 = this.cScale5 || adjust5(this.primaryColor, { h: 90 }); + this.cScale6 = this.cScale6 || adjust5(this.primaryColor, { h: 120 }); + this.cScale7 = this.cScale7 || adjust5(this.primaryColor, { h: 150 }); + this.cScale8 = this.cScale8 || adjust5(this.primaryColor, { h: 210 }); + this.cScale9 = this.cScale9 || adjust5(this.primaryColor, { h: 270 }); + this.cScale10 = this.cScale10 || adjust5(this.primaryColor, { h: 300 }); + this.cScale11 = this.cScale11 || adjust5(this.primaryColor, { h: 330 }); + this["cScalePeer1"] = this["cScalePeer1"] || darken4(this.secondaryColor, 45); + this["cScalePeer2"] = this["cScalePeer2"] || darken4(this.tertiaryColor, 40); + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScale" + i] = darken4(this["cScale" + i], 10); + this["cScalePeer" + i] = this["cScalePeer" + i] || darken4(this["cScale" + i], 25); + } + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScaleInv" + i] = this["cScaleInv" + i] || adjust5(this["cScale" + i], { h: 180 }); + } + this.scaleLabelColor = this.scaleLabelColor !== "calculated" && this.scaleLabelColor ? this.scaleLabelColor : this.labelTextColor; + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScaleLabel" + i] = this["cScaleLabel" + i] || this.scaleLabelColor; + } + for (let i = 0; i < 5; i++) { + this["surface" + i] = this["surface" + i] || adjust5(this.mainBkg, { h: 30, s: -30, l: -(5 + i * 5) }); + this["surfacePeer" + i] = this["surfacePeer" + i] || adjust5(this.mainBkg, { h: 30, s: -30, l: -(8 + i * 5) }); + } + this.nodeBkg = this.mainBkg; + this.nodeBorder = this.border1; + this.clusterBkg = this.secondBkg; + this.clusterBorder = this.border2; + this.defaultLinkColor = this.lineColor; + this.taskBorderColor = this.border1; + this.taskTextColor = this.taskTextLightColor; + this.taskTextOutsideColor = this.taskTextDarkColor; + this.activeTaskBorderColor = this.taskBorderColor; + this.activeTaskBkgColor = this.mainBkg; + this.archEdgeColor = this.lineColor; + this.archEdgeArrowColor = this.lineColor; + this.rowOdd = this.rowOdd || lighten4(this.mainBkg, 75) || "#ffffff"; + this.rowEven = this.rowEven || lighten4(this.mainBkg, 20); + this.transitionColor = this.transitionColor || this.lineColor; + this.transitionLabelColor = this.transitionLabelColor || this.textColor; + this.stateLabelColor = this.stateLabelColor || this.stateBkg || this.primaryTextColor; + this.stateBkg = this.stateBkg || this.mainBkg; + this.labelBackgroundColor = this.labelBackgroundColor || this.stateBkg; + this.compositeBackground = this.compositeBackground || this.background || this.tertiaryColor; + this.altBackground = this.altBackground || "#f0f0f0"; + this.compositeTitleBackground = this.compositeTitleBackground || this.mainBkg; + this.compositeBorder = this.compositeBorder || this.nodeBorder; + this.innerEndBackground = this.primaryBorderColor; + this.specialStateColor = this.lineColor; + this.errorBkgColor = this.errorBkgColor || this.tertiaryColor; + this.errorTextColor = this.errorTextColor || this.tertiaryTextColor; + this.transitionColor = this.transitionColor || this.lineColor; + this.classText = this.primaryTextColor; + this.fillType0 = this.primaryColor; + this.fillType1 = this.secondaryColor; + this.fillType2 = adjust5(this.primaryColor, { h: 64 }); + this.fillType3 = adjust5(this.secondaryColor, { h: 64 }); + this.fillType4 = adjust5(this.primaryColor, { h: -64 }); + this.fillType5 = adjust5(this.secondaryColor, { h: -64 }); + this.fillType6 = adjust5(this.primaryColor, { h: 128 }); + this.fillType7 = adjust5(this.secondaryColor, { h: 128 }); + this.pie1 = this.pie1 || this.primaryColor; + this.pie2 = this.pie2 || this.secondaryColor; + this.pie3 = this.pie3 || this.tertiaryColor; + this.pie4 = this.pie4 || adjust5(this.primaryColor, { l: -30 }); + this.pie5 = this.pie5 || adjust5(this.secondaryColor, { l: -30 }); + this.pie6 = this.pie6 || adjust5(this.tertiaryColor, { h: 40, l: -40 }); + this.pie7 = this.pie7 || adjust5(this.primaryColor, { h: 60, l: -10 }); + this.pie8 = this.pie8 || adjust5(this.primaryColor, { h: -60, l: -10 }); + this.pie9 = this.pie9 || adjust5(this.primaryColor, { h: 120, l: 0 }); + this.pie10 = this.pie10 || adjust5(this.primaryColor, { h: 60, l: -50 }); + this.pie11 = this.pie11 || adjust5(this.primaryColor, { h: -60, l: -50 }); + this.pie12 = this.pie12 || adjust5(this.primaryColor, { h: 120, l: -50 }); + this.pieTitleTextSize = this.pieTitleTextSize || "25px"; + this.pieTitleTextColor = this.pieTitleTextColor || this.taskTextDarkColor; + this.pieSectionTextSize = this.pieSectionTextSize || "17px"; + this.pieSectionTextColor = this.pieSectionTextColor || this.textColor; + this.pieLegendTextSize = this.pieLegendTextSize || "17px"; + this.pieLegendTextColor = this.pieLegendTextColor || this.taskTextDarkColor; + this.pieStrokeColor = this.pieStrokeColor || "black"; + this.pieStrokeWidth = this.pieStrokeWidth || "2px"; + this.pieOuterStrokeWidth = this.pieOuterStrokeWidth || "2px"; + this.pieOuterStrokeColor = this.pieOuterStrokeColor || "black"; + this.pieOpacity = this.pieOpacity || "0.7"; + this.quadrant1Fill = this.quadrant1Fill || this.primaryColor; + this.quadrant2Fill = this.quadrant2Fill || adjust5(this.primaryColor, { r: 5, g: 5, b: 5 }); + this.quadrant3Fill = this.quadrant3Fill || adjust5(this.primaryColor, { r: 10, g: 10, b: 10 }); + this.quadrant4Fill = this.quadrant4Fill || adjust5(this.primaryColor, { r: 15, g: 15, b: 15 }); + this.quadrant1TextFill = this.quadrant1TextFill || this.primaryTextColor; + this.quadrant2TextFill = this.quadrant2TextFill || adjust5(this.primaryTextColor, { r: -5, g: -5, b: -5 }); + this.quadrant3TextFill = this.quadrant3TextFill || adjust5(this.primaryTextColor, { r: -10, g: -10, b: -10 }); + this.quadrant4TextFill = this.quadrant4TextFill || adjust5(this.primaryTextColor, { r: -15, g: -15, b: -15 }); + this.quadrantPointFill = this.quadrantPointFill || isDark4(this.quadrant1Fill) ? lighten4(this.quadrant1Fill) : darken4(this.quadrant1Fill); + this.quadrantPointTextFill = this.quadrantPointTextFill || this.primaryTextColor; + this.quadrantXAxisTextFill = this.quadrantXAxisTextFill || this.primaryTextColor; + this.quadrantYAxisTextFill = this.quadrantYAxisTextFill || this.primaryTextColor; + this.quadrantInternalBorderStrokeFill = this.quadrantInternalBorderStrokeFill || this.primaryBorderColor; + this.quadrantExternalBorderStrokeFill = this.quadrantExternalBorderStrokeFill || this.primaryBorderColor; + this.quadrantTitleFill = this.quadrantTitleFill || this.primaryTextColor; + this.packet = { + startByteColor: this.primaryTextColor, + endByteColor: this.primaryTextColor, + labelColor: this.primaryTextColor, + titleColor: this.primaryTextColor, + blockStrokeColor: this.primaryTextColor, + blockFillColor: this.mainBkg + }; + this.radar = { + axisColor: this.radar?.axisColor || this.lineColor, + axisStrokeWidth: this.radar?.axisStrokeWidth || 2, + axisLabelFontSize: this.radar?.axisLabelFontSize || 12, + curveOpacity: this.radar?.curveOpacity || 0.5, + curveStrokeWidth: this.radar?.curveStrokeWidth || 2, + graticuleColor: this.radar?.graticuleColor || "#DEDEDE", + graticuleStrokeWidth: this.radar?.graticuleStrokeWidth || 1, + graticuleOpacity: this.radar?.graticuleOpacity || 0.3, + legendBoxSize: this.radar?.legendBoxSize || 12, + legendFontSize: this.radar?.legendFontSize || 12 + }; + this.xyChart = { + backgroundColor: this.xyChart?.backgroundColor || this.background, + titleColor: this.xyChart?.titleColor || this.primaryTextColor, + xAxisTitleColor: this.xyChart?.xAxisTitleColor || this.primaryTextColor, + xAxisLabelColor: this.xyChart?.xAxisLabelColor || this.primaryTextColor, + xAxisTickColor: this.xyChart?.xAxisTickColor || this.primaryTextColor, + xAxisLineColor: this.xyChart?.xAxisLineColor || this.primaryTextColor, + yAxisTitleColor: this.xyChart?.yAxisTitleColor || this.primaryTextColor, + yAxisLabelColor: this.xyChart?.yAxisLabelColor || this.primaryTextColor, + yAxisTickColor: this.xyChart?.yAxisTickColor || this.primaryTextColor, + yAxisLineColor: this.xyChart?.yAxisLineColor || this.primaryTextColor, + plotColorPalette: this.xyChart?.plotColorPalette || "#CDE498,#FF6B6B,#A0D2DB,#D7BDE2,#F0F0F0,#FFC3A0,#7FD8BE,#FF9A8B,#FAF3E0,#FFF176" + }; + this.requirementBackground = this.requirementBackground || this.primaryColor; + this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor; + this.requirementBorderSize = this.requirementBorderSize || "1"; + this.requirementTextColor = this.requirementTextColor || this.primaryTextColor; + this.relationColor = this.relationColor || this.lineColor; + this.relationLabelBackground = this.relationLabelBackground || this.edgeLabelBackground; + this.relationLabelColor = this.relationLabelColor || this.actorTextColor; + this.git0 = this.git0 || this.primaryColor; + this.git1 = this.git1 || this.secondaryColor; + this.git2 = this.git2 || this.tertiaryColor; + this.git3 = this.git3 || adjust5(this.primaryColor, { h: -30 }); + this.git4 = this.git4 || adjust5(this.primaryColor, { h: -60 }); + this.git5 = this.git5 || adjust5(this.primaryColor, { h: -90 }); + this.git6 = this.git6 || adjust5(this.primaryColor, { h: 60 }); + this.git7 = this.git7 || adjust5(this.primaryColor, { h: 120 }); + if (this.darkMode) { + this.git0 = lighten4(this.git0, 25); + this.git1 = lighten4(this.git1, 25); + this.git2 = lighten4(this.git2, 25); + this.git3 = lighten4(this.git3, 25); + this.git4 = lighten4(this.git4, 25); + this.git5 = lighten4(this.git5, 25); + this.git6 = lighten4(this.git6, 25); + this.git7 = lighten4(this.git7, 25); + } else { + this.git0 = darken4(this.git0, 25); + this.git1 = darken4(this.git1, 25); + this.git2 = darken4(this.git2, 25); + this.git3 = darken4(this.git3, 25); + this.git4 = darken4(this.git4, 25); + this.git5 = darken4(this.git5, 25); + this.git6 = darken4(this.git6, 25); + this.git7 = darken4(this.git7, 25); + } + this.gitInv0 = this.gitInv0 || invert4(this.git0); + this.gitInv1 = this.gitInv1 || invert4(this.git1); + this.gitInv2 = this.gitInv2 || invert4(this.git2); + this.gitInv3 = this.gitInv3 || invert4(this.git3); + this.gitInv4 = this.gitInv4 || invert4(this.git4); + this.gitInv5 = this.gitInv5 || invert4(this.git5); + this.gitInv6 = this.gitInv6 || invert4(this.git6); + this.gitInv7 = this.gitInv7 || invert4(this.git7); + this.gitBranchLabel0 = this.gitBranchLabel0 || invert4(this.labelTextColor); + this.gitBranchLabel1 = this.gitBranchLabel1 || this.labelTextColor; + this.gitBranchLabel2 = this.gitBranchLabel2 || this.labelTextColor; + this.gitBranchLabel3 = this.gitBranchLabel3 || invert4(this.labelTextColor); + this.gitBranchLabel4 = this.gitBranchLabel4 || this.labelTextColor; + this.gitBranchLabel5 = this.gitBranchLabel5 || this.labelTextColor; + this.gitBranchLabel6 = this.gitBranchLabel6 || this.labelTextColor; + this.gitBranchLabel7 = this.gitBranchLabel7 || this.labelTextColor; + this.tagLabelColor = this.tagLabelColor || this.primaryTextColor; + this.tagLabelBackground = this.tagLabelBackground || this.primaryColor; + this.tagLabelBorder = this.tagBorder || this.primaryBorderColor; + this.tagLabelFontSize = this.tagLabelFontSize || "10px"; + this.commitLabelColor = this.commitLabelColor || this.secondaryTextColor; + this.commitLabelBackground = this.commitLabelBackground || this.secondaryColor; + this.commitLabelFontSize = this.commitLabelFontSize || "10px"; + this.attributeBackgroundColorOdd = this.attributeBackgroundColorOdd || oldAttributeBackgroundColorOdd; + this.attributeBackgroundColorEven = this.attributeBackgroundColorEven || oldAttributeBackgroundColorEven; + } + calculate(overrides) { + if (typeof overrides !== "object") { + this.updateColors(); + return; + } + const keys = Object.keys(overrides); + keys.forEach((k) => { + this[k] = overrides[k]; + }); + this.updateColors(); + keys.forEach((k) => { + this[k] = overrides[k]; + }); + } +}; +var getThemeVariables4 = /* @__PURE__ */ __name((userOverrides) => { + const theme = new Theme4(); + theme.calculate(userOverrides); + return theme; +}, "getThemeVariables"); + +// src/themes/theme-neutral.js +import { invert as invert5, darken as darken5, lighten as lighten5, adjust as adjust6, isDark as isDark5 } from "khroma"; +var Theme5 = class { + static { + __name(this, "Theme"); + } + constructor() { + this.primaryColor = "#eee"; + this.contrast = "#707070"; + this.secondaryColor = lighten5(this.contrast, 55); + this.background = "#ffffff"; + this.tertiaryColor = adjust6(this.primaryColor, { h: -160 }); + this.primaryBorderColor = mkBorder(this.primaryColor, this.darkMode); + this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode); + this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode); + this.primaryTextColor = invert5(this.primaryColor); + this.secondaryTextColor = invert5(this.secondaryColor); + this.tertiaryTextColor = invert5(this.tertiaryColor); + this.lineColor = invert5(this.background); + this.textColor = invert5(this.background); + this.mainBkg = "#eee"; + this.secondBkg = "calculated"; + this.lineColor = "#666"; + this.border1 = "#999"; + this.border2 = "calculated"; + this.note = "#ffa"; + this.text = "#333"; + this.critical = "#d42"; + this.done = "#bbb"; + this.arrowheadColor = "#333333"; + this.fontFamily = '"trebuchet ms", verdana, arial, sans-serif'; + this.fontSize = "16px"; + this.THEME_COLOR_LIMIT = 12; + this.nodeBkg = "calculated"; + this.nodeBorder = "calculated"; + this.clusterBkg = "calculated"; + this.clusterBorder = "calculated"; + this.defaultLinkColor = "calculated"; + this.titleColor = "calculated"; + this.edgeLabelBackground = "white"; + this.actorBorder = "calculated"; + this.actorBkg = "calculated"; + this.actorTextColor = "calculated"; + this.actorLineColor = this.actorBorder; + this.signalColor = "calculated"; + this.signalTextColor = "calculated"; + this.labelBoxBkgColor = "calculated"; + this.labelBoxBorderColor = "calculated"; + this.labelTextColor = "calculated"; + this.loopTextColor = "calculated"; + this.noteBorderColor = "calculated"; + this.noteBkgColor = "calculated"; + this.noteTextColor = "calculated"; + this.activationBorderColor = "#666"; + this.activationBkgColor = "#f4f4f4"; + this.sequenceNumberColor = "white"; + this.sectionBkgColor = "calculated"; + this.altSectionBkgColor = "white"; + this.sectionBkgColor2 = "calculated"; + this.excludeBkgColor = "#eeeeee"; + this.taskBorderColor = "calculated"; + this.taskBkgColor = "calculated"; + this.taskTextLightColor = "white"; + this.taskTextColor = "calculated"; + this.taskTextDarkColor = "calculated"; + this.taskTextOutsideColor = "calculated"; + this.taskTextClickableColor = "#003163"; + this.activeTaskBorderColor = "calculated"; + this.activeTaskBkgColor = "calculated"; + this.gridColor = "calculated"; + this.doneTaskBkgColor = "calculated"; + this.doneTaskBorderColor = "calculated"; + this.critBkgColor = "calculated"; + this.critBorderColor = "calculated"; + this.todayLineColor = "calculated"; + this.vertLineColor = "calculated"; + this.personBorder = this.primaryBorderColor; + this.personBkg = this.mainBkg; + this.archEdgeColor = "calculated"; + this.archEdgeArrowColor = "calculated"; + this.archEdgeWidth = "3"; + this.archGroupBorderColor = this.primaryBorderColor; + this.archGroupBorderWidth = "2px"; + this.rowOdd = this.rowOdd || lighten5(this.mainBkg, 75) || "#ffffff"; + this.rowEven = this.rowEven || "#f4f4f4"; + this.labelColor = "black"; + this.errorBkgColor = "#552222"; + this.errorTextColor = "#552222"; + } + updateColors() { + this.secondBkg = lighten5(this.contrast, 55); + this.border2 = this.contrast; + this.actorBorder = lighten5(this.border1, 23); + this.actorBkg = this.mainBkg; + this.actorTextColor = this.text; + this.actorLineColor = this.actorBorder; + this.signalColor = this.text; + this.signalTextColor = this.text; + this.labelBoxBkgColor = this.actorBkg; + this.labelBoxBorderColor = this.actorBorder; + this.labelTextColor = this.text; + this.loopTextColor = this.text; + this.noteBorderColor = "#999"; + this.noteBkgColor = "#666"; + this.noteTextColor = "#fff"; + this.cScale0 = this.cScale0 || "#555"; + this.cScale1 = this.cScale1 || "#F4F4F4"; + this.cScale2 = this.cScale2 || "#555"; + this.cScale3 = this.cScale3 || "#BBB"; + this.cScale4 = this.cScale4 || "#777"; + this.cScale5 = this.cScale5 || "#999"; + this.cScale6 = this.cScale6 || "#DDD"; + this.cScale7 = this.cScale7 || "#FFF"; + this.cScale8 = this.cScale8 || "#DDD"; + this.cScale9 = this.cScale9 || "#BBB"; + this.cScale10 = this.cScale10 || "#999"; + this.cScale11 = this.cScale11 || "#777"; + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScaleInv" + i] = this["cScaleInv" + i] || invert5(this["cScale" + i]); + } + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + if (this.darkMode) { + this["cScalePeer" + i] = this["cScalePeer" + i] || lighten5(this["cScale" + i], 10); + } else { + this["cScalePeer" + i] = this["cScalePeer" + i] || darken5(this["cScale" + i], 10); + } + } + this.scaleLabelColor = this.scaleLabelColor || (this.darkMode ? "black" : this.labelTextColor); + this.cScaleLabel0 = this.cScaleLabel0 || this.cScale1; + this.cScaleLabel2 = this.cScaleLabel2 || this.cScale1; + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["cScaleLabel" + i] = this["cScaleLabel" + i] || this.scaleLabelColor; + } + for (let i = 0; i < 5; i++) { + this["surface" + i] = this["surface" + i] || adjust6(this.mainBkg, { l: -(5 + i * 5) }); + this["surfacePeer" + i] = this["surfacePeer" + i] || adjust6(this.mainBkg, { l: -(8 + i * 5) }); + } + this.nodeBkg = this.mainBkg; + this.nodeBorder = this.border1; + this.clusterBkg = this.secondBkg; + this.clusterBorder = this.border2; + this.defaultLinkColor = this.lineColor; + this.titleColor = this.text; + this.sectionBkgColor = lighten5(this.contrast, 30); + this.sectionBkgColor2 = lighten5(this.contrast, 30); + this.taskBorderColor = darken5(this.contrast, 10); + this.taskBkgColor = this.contrast; + this.taskTextColor = this.taskTextLightColor; + this.taskTextDarkColor = this.text; + this.taskTextOutsideColor = this.taskTextDarkColor; + this.activeTaskBorderColor = this.taskBorderColor; + this.activeTaskBkgColor = this.mainBkg; + this.gridColor = lighten5(this.border1, 30); + this.doneTaskBkgColor = this.done; + this.doneTaskBorderColor = this.lineColor; + this.critBkgColor = this.critical; + this.critBorderColor = darken5(this.critBkgColor, 10); + this.todayLineColor = this.critBkgColor; + this.vertLineColor = this.critBkgColor; + this.archEdgeColor = this.lineColor; + this.archEdgeArrowColor = this.lineColor; + this.transitionColor = this.transitionColor || "#000"; + this.transitionLabelColor = this.transitionLabelColor || this.textColor; + this.stateLabelColor = this.stateLabelColor || this.stateBkg || this.primaryTextColor; + this.stateBkg = this.stateBkg || this.mainBkg; + this.labelBackgroundColor = this.labelBackgroundColor || this.stateBkg; + this.compositeBackground = this.compositeBackground || this.background || this.tertiaryColor; + this.altBackground = this.altBackground || "#f4f4f4"; + this.compositeTitleBackground = this.compositeTitleBackground || this.mainBkg; + this.stateBorder = this.stateBorder || "#000"; + this.innerEndBackground = this.primaryBorderColor; + this.specialStateColor = "#222"; + this.errorBkgColor = this.errorBkgColor || this.tertiaryColor; + this.errorTextColor = this.errorTextColor || this.tertiaryTextColor; + this.classText = this.primaryTextColor; + this.fillType0 = this.primaryColor; + this.fillType1 = this.secondaryColor; + this.fillType2 = adjust6(this.primaryColor, { h: 64 }); + this.fillType3 = adjust6(this.secondaryColor, { h: 64 }); + this.fillType4 = adjust6(this.primaryColor, { h: -64 }); + this.fillType5 = adjust6(this.secondaryColor, { h: -64 }); + this.fillType6 = adjust6(this.primaryColor, { h: 128 }); + this.fillType7 = adjust6(this.secondaryColor, { h: 128 }); + for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) { + this["pie" + i] = this["cScale" + i]; + } + this.pie12 = this.pie0; + this.pieTitleTextSize = this.pieTitleTextSize || "25px"; + this.pieTitleTextColor = this.pieTitleTextColor || this.taskTextDarkColor; + this.pieSectionTextSize = this.pieSectionTextSize || "17px"; + this.pieSectionTextColor = this.pieSectionTextColor || this.textColor; + this.pieLegendTextSize = this.pieLegendTextSize || "17px"; + this.pieLegendTextColor = this.pieLegendTextColor || this.taskTextDarkColor; + this.pieStrokeColor = this.pieStrokeColor || "black"; + this.pieStrokeWidth = this.pieStrokeWidth || "2px"; + this.pieOuterStrokeWidth = this.pieOuterStrokeWidth || "2px"; + this.pieOuterStrokeColor = this.pieOuterStrokeColor || "black"; + this.pieOpacity = this.pieOpacity || "0.7"; + this.quadrant1Fill = this.quadrant1Fill || this.primaryColor; + this.quadrant2Fill = this.quadrant2Fill || adjust6(this.primaryColor, { r: 5, g: 5, b: 5 }); + this.quadrant3Fill = this.quadrant3Fill || adjust6(this.primaryColor, { r: 10, g: 10, b: 10 }); + this.quadrant4Fill = this.quadrant4Fill || adjust6(this.primaryColor, { r: 15, g: 15, b: 15 }); + this.quadrant1TextFill = this.quadrant1TextFill || this.primaryTextColor; + this.quadrant2TextFill = this.quadrant2TextFill || adjust6(this.primaryTextColor, { r: -5, g: -5, b: -5 }); + this.quadrant3TextFill = this.quadrant3TextFill || adjust6(this.primaryTextColor, { r: -10, g: -10, b: -10 }); + this.quadrant4TextFill = this.quadrant4TextFill || adjust6(this.primaryTextColor, { r: -15, g: -15, b: -15 }); + this.quadrantPointFill = this.quadrantPointFill || isDark5(this.quadrant1Fill) ? lighten5(this.quadrant1Fill) : darken5(this.quadrant1Fill); + this.quadrantPointTextFill = this.quadrantPointTextFill || this.primaryTextColor; + this.quadrantXAxisTextFill = this.quadrantXAxisTextFill || this.primaryTextColor; + this.quadrantYAxisTextFill = this.quadrantYAxisTextFill || this.primaryTextColor; + this.quadrantInternalBorderStrokeFill = this.quadrantInternalBorderStrokeFill || this.primaryBorderColor; + this.quadrantExternalBorderStrokeFill = this.quadrantExternalBorderStrokeFill || this.primaryBorderColor; + this.quadrantTitleFill = this.quadrantTitleFill || this.primaryTextColor; + this.xyChart = { + backgroundColor: this.xyChart?.backgroundColor || this.background, + titleColor: this.xyChart?.titleColor || this.primaryTextColor, + xAxisTitleColor: this.xyChart?.xAxisTitleColor || this.primaryTextColor, + xAxisLabelColor: this.xyChart?.xAxisLabelColor || this.primaryTextColor, + xAxisTickColor: this.xyChart?.xAxisTickColor || this.primaryTextColor, + xAxisLineColor: this.xyChart?.xAxisLineColor || this.primaryTextColor, + yAxisTitleColor: this.xyChart?.yAxisTitleColor || this.primaryTextColor, + yAxisLabelColor: this.xyChart?.yAxisLabelColor || this.primaryTextColor, + yAxisTickColor: this.xyChart?.yAxisTickColor || this.primaryTextColor, + yAxisLineColor: this.xyChart?.yAxisLineColor || this.primaryTextColor, + plotColorPalette: this.xyChart?.plotColorPalette || "#EEE,#6BB8E4,#8ACB88,#C7ACD6,#E8DCC2,#FFB2A8,#FFF380,#7E8D91,#FFD8B1,#FAF3E0" + }; + this.radar = { + axisColor: this.radar?.axisColor || this.lineColor, + axisStrokeWidth: this.radar?.axisStrokeWidth || 2, + axisLabelFontSize: this.radar?.axisLabelFontSize || 12, + curveOpacity: this.radar?.curveOpacity || 0.5, + curveStrokeWidth: this.radar?.curveStrokeWidth || 2, + graticuleColor: this.radar?.graticuleColor || "#DEDEDE", + graticuleStrokeWidth: this.radar?.graticuleStrokeWidth || 1, + graticuleOpacity: this.radar?.graticuleOpacity || 0.3, + legendBoxSize: this.radar?.legendBoxSize || 12, + legendFontSize: this.radar?.legendFontSize || 12 + }; + this.requirementBackground = this.requirementBackground || this.primaryColor; + this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor; + this.requirementBorderSize = this.requirementBorderSize || "1"; + this.requirementTextColor = this.requirementTextColor || this.primaryTextColor; + this.relationColor = this.relationColor || this.lineColor; + this.relationLabelBackground = this.relationLabelBackground || this.edgeLabelBackground; + this.relationLabelColor = this.relationLabelColor || this.actorTextColor; + this.git0 = darken5(this.pie1, 25) || this.primaryColor; + this.git1 = this.pie2 || this.secondaryColor; + this.git2 = this.pie3 || this.tertiaryColor; + this.git3 = this.pie4 || adjust6(this.primaryColor, { h: -30 }); + this.git4 = this.pie5 || adjust6(this.primaryColor, { h: -60 }); + this.git5 = this.pie6 || adjust6(this.primaryColor, { h: -90 }); + this.git6 = this.pie7 || adjust6(this.primaryColor, { h: 60 }); + this.git7 = this.pie8 || adjust6(this.primaryColor, { h: 120 }); + this.gitInv0 = this.gitInv0 || invert5(this.git0); + this.gitInv1 = this.gitInv1 || invert5(this.git1); + this.gitInv2 = this.gitInv2 || invert5(this.git2); + this.gitInv3 = this.gitInv3 || invert5(this.git3); + this.gitInv4 = this.gitInv4 || invert5(this.git4); + this.gitInv5 = this.gitInv5 || invert5(this.git5); + this.gitInv6 = this.gitInv6 || invert5(this.git6); + this.gitInv7 = this.gitInv7 || invert5(this.git7); + this.branchLabelColor = this.branchLabelColor || this.labelTextColor; + this.gitBranchLabel0 = this.branchLabelColor; + this.gitBranchLabel1 = "white"; + this.gitBranchLabel2 = this.branchLabelColor; + this.gitBranchLabel3 = "white"; + this.gitBranchLabel4 = this.branchLabelColor; + this.gitBranchLabel5 = this.branchLabelColor; + this.gitBranchLabel6 = this.branchLabelColor; + this.gitBranchLabel7 = this.branchLabelColor; + this.tagLabelColor = this.tagLabelColor || this.primaryTextColor; + this.tagLabelBackground = this.tagLabelBackground || this.primaryColor; + this.tagLabelBorder = this.tagBorder || this.primaryBorderColor; + this.tagLabelFontSize = this.tagLabelFontSize || "10px"; + this.commitLabelColor = this.commitLabelColor || this.secondaryTextColor; + this.commitLabelBackground = this.commitLabelBackground || this.secondaryColor; + this.commitLabelFontSize = this.commitLabelFontSize || "10px"; + this.attributeBackgroundColorOdd = this.attributeBackgroundColorOdd || oldAttributeBackgroundColorOdd; + this.attributeBackgroundColorEven = this.attributeBackgroundColorEven || oldAttributeBackgroundColorEven; + } + calculate(overrides) { + if (typeof overrides !== "object") { + this.updateColors(); + return; + } + const keys = Object.keys(overrides); + keys.forEach((k) => { + this[k] = overrides[k]; + }); + this.updateColors(); + keys.forEach((k) => { + this[k] = overrides[k]; + }); + } +}; +var getThemeVariables5 = /* @__PURE__ */ __name((userOverrides) => { + const theme = new Theme5(); + theme.calculate(userOverrides); + return theme; +}, "getThemeVariables"); + +// src/themes/index.js +var themes_default = { + base: { + getThemeVariables + }, + dark: { + getThemeVariables: getThemeVariables2 + }, + default: { + getThemeVariables: getThemeVariables3 + }, + forest: { + getThemeVariables: getThemeVariables4 + }, + neutral: { + getThemeVariables: getThemeVariables5 + } +}; + +// src/schemas/config.schema.yaml?only-defaults=true +var config_schema_default = { + "flowchart": { + "useMaxWidth": true, + "titleTopMargin": 25, + "subGraphTitleMargin": { + "top": 0, + "bottom": 0 + }, + "diagramPadding": 8, + "htmlLabels": true, + "nodeSpacing": 50, + "rankSpacing": 50, + "curve": "basis", + "padding": 15, + "defaultRenderer": "dagre-wrapper", + "wrappingWidth": 200, + "inheritDir": false + }, + "sequence": { + "useMaxWidth": true, + "hideUnusedParticipants": false, + "activationWidth": 10, + "diagramMarginX": 50, + "diagramMarginY": 10, + "actorMargin": 50, + "width": 150, + "height": 65, + "boxMargin": 10, + "boxTextMargin": 5, + "noteMargin": 10, + "messageMargin": 35, + "messageAlign": "center", + "mirrorActors": true, + "forceMenus": false, + "bottomMarginAdj": 1, + "rightAngles": false, + "showSequenceNumbers": false, + "actorFontSize": 14, + "actorFontFamily": '"Open Sans", sans-serif', + "actorFontWeight": 400, + "noteFontSize": 14, + "noteFontFamily": '"trebuchet ms", verdana, arial, sans-serif', + "noteFontWeight": 400, + "noteAlign": "center", + "messageFontSize": 16, + "messageFontFamily": '"trebuchet ms", verdana, arial, sans-serif', + "messageFontWeight": 400, + "wrap": false, + "wrapPadding": 10, + "labelBoxWidth": 50, + "labelBoxHeight": 20 + }, + "gantt": { + "useMaxWidth": true, + "titleTopMargin": 25, + "barHeight": 20, + "barGap": 4, + "topPadding": 50, + "rightPadding": 75, + "leftPadding": 75, + "gridLineStartPadding": 35, + "fontSize": 11, + "sectionFontSize": 11, + "numberSectionStyles": 4, + "axisFormat": "%Y-%m-%d", + "topAxis": false, + "displayMode": "", + "weekday": "sunday" + }, + "journey": { + "useMaxWidth": true, + "diagramMarginX": 50, + "diagramMarginY": 10, + "leftMargin": 150, + "maxLabelWidth": 360, + "width": 150, + "height": 50, + "boxMargin": 10, + "boxTextMargin": 5, + "noteMargin": 10, + "messageMargin": 35, + "messageAlign": "center", + "bottomMarginAdj": 1, + "rightAngles": false, + "taskFontSize": 14, + "taskFontFamily": '"Open Sans", sans-serif', + "taskMargin": 50, + "activationWidth": 10, + "textPlacement": "fo", + "actorColours": [ + "#8FBC8F", + "#7CFC00", + "#00FFFF", + "#20B2AA", + "#B0E0E6", + "#FFFFE0" + ], + "sectionFills": [ + "#191970", + "#8B008B", + "#4B0082", + "#2F4F4F", + "#800000", + "#8B4513", + "#00008B" + ], + "sectionColours": [ + "#fff" + ], + "titleColor": "", + "titleFontFamily": '"trebuchet ms", verdana, arial, sans-serif', + "titleFontSize": "4ex" + }, + "class": { + "useMaxWidth": true, + "titleTopMargin": 25, + "arrowMarkerAbsolute": false, + "dividerMargin": 10, + "padding": 5, + "textHeight": 10, + "defaultRenderer": "dagre-wrapper", + "htmlLabels": false, + "hideEmptyMembersBox": false + }, + "state": { + "useMaxWidth": true, + "titleTopMargin": 25, + "dividerMargin": 10, + "sizeUnit": 5, + "padding": 8, + "textHeight": 10, + "titleShift": -15, + "noteMargin": 10, + "forkWidth": 70, + "forkHeight": 7, + "miniPadding": 2, + "fontSizeFactor": 5.02, + "fontSize": 24, + "labelHeight": 16, + "edgeLengthFactor": "20", + "compositTitleSize": 35, + "radius": 5, + "defaultRenderer": "dagre-wrapper" + }, + "er": { + "useMaxWidth": true, + "titleTopMargin": 25, + "diagramPadding": 20, + "layoutDirection": "TB", + "minEntityWidth": 100, + "minEntityHeight": 75, + "entityPadding": 15, + "nodeSpacing": 140, + "rankSpacing": 80, + "stroke": "gray", + "fill": "honeydew", + "fontSize": 12 + }, + "pie": { + "useMaxWidth": true, + "textPosition": 0.75 + }, + "quadrantChart": { + "useMaxWidth": true, + "chartWidth": 500, + "chartHeight": 500, + "titleFontSize": 20, + "titlePadding": 10, + "quadrantPadding": 5, + "xAxisLabelPadding": 5, + "yAxisLabelPadding": 5, + "xAxisLabelFontSize": 16, + "yAxisLabelFontSize": 16, + "quadrantLabelFontSize": 16, + "quadrantTextTopPadding": 5, + "pointTextPadding": 5, + "pointLabelFontSize": 12, + "pointRadius": 5, + "xAxisPosition": "top", + "yAxisPosition": "left", + "quadrantInternalBorderStrokeWidth": 1, + "quadrantExternalBorderStrokeWidth": 2 + }, + "xyChart": { + "useMaxWidth": true, + "width": 700, + "height": 500, + "titleFontSize": 20, + "titlePadding": 10, + "showDataLabel": false, + "showTitle": true, + "xAxis": { + "$ref": "#/$defs/XYChartAxisConfig", + "showLabel": true, + "labelFontSize": 14, + "labelPadding": 5, + "showTitle": true, + "titleFontSize": 16, + "titlePadding": 5, + "showTick": true, + "tickLength": 5, + "tickWidth": 2, + "showAxisLine": true, + "axisLineWidth": 2 + }, + "yAxis": { + "$ref": "#/$defs/XYChartAxisConfig", + "showLabel": true, + "labelFontSize": 14, + "labelPadding": 5, + "showTitle": true, + "titleFontSize": 16, + "titlePadding": 5, + "showTick": true, + "tickLength": 5, + "tickWidth": 2, + "showAxisLine": true, + "axisLineWidth": 2 + }, + "chartOrientation": "vertical", + "plotReservedSpacePercent": 50 + }, + "requirement": { + "useMaxWidth": true, + "rect_fill": "#f9f9f9", + "text_color": "#333", + "rect_border_size": "0.5px", + "rect_border_color": "#bbb", + "rect_min_width": 200, + "rect_min_height": 200, + "fontSize": 14, + "rect_padding": 10, + "line_height": 20 + }, + "mindmap": { + "useMaxWidth": true, + "padding": 10, + "maxNodeWidth": 200, + "layoutAlgorithm": "cose-bilkent" + }, + "kanban": { + "useMaxWidth": true, + "padding": 8, + "sectionWidth": 200, + "ticketBaseUrl": "" + }, + "timeline": { + "useMaxWidth": true, + "diagramMarginX": 50, + "diagramMarginY": 10, + "leftMargin": 150, + "width": 150, + "height": 50, + "boxMargin": 10, + "boxTextMargin": 5, + "noteMargin": 10, + "messageMargin": 35, + "messageAlign": "center", + "bottomMarginAdj": 1, + "rightAngles": false, + "taskFontSize": 14, + "taskFontFamily": '"Open Sans", sans-serif', + "taskMargin": 50, + "activationWidth": 10, + "textPlacement": "fo", + "actorColours": [ + "#8FBC8F", + "#7CFC00", + "#00FFFF", + "#20B2AA", + "#B0E0E6", + "#FFFFE0" + ], + "sectionFills": [ + "#191970", + "#8B008B", + "#4B0082", + "#2F4F4F", + "#800000", + "#8B4513", + "#00008B" + ], + "sectionColours": [ + "#fff" + ], + "disableMulticolor": false + }, + "gitGraph": { + "useMaxWidth": true, + "titleTopMargin": 25, + "diagramPadding": 8, + "nodeLabel": { + "width": 75, + "height": 100, + "x": -25, + "y": 0 + }, + "mainBranchName": "main", + "mainBranchOrder": 0, + "showCommitLabel": true, + "showBranches": true, + "rotateCommitLabel": true, + "parallelCommits": false, + "arrowMarkerAbsolute": false + }, + "c4": { + "useMaxWidth": true, + "diagramMarginX": 50, + "diagramMarginY": 10, + "c4ShapeMargin": 50, + "c4ShapePadding": 20, + "width": 216, + "height": 60, + "boxMargin": 10, + "c4ShapeInRow": 4, + "nextLinePaddingX": 0, + "c4BoundaryInRow": 2, + "personFontSize": 14, + "personFontFamily": '"Open Sans", sans-serif', + "personFontWeight": "normal", + "external_personFontSize": 14, + "external_personFontFamily": '"Open Sans", sans-serif', + "external_personFontWeight": "normal", + "systemFontSize": 14, + "systemFontFamily": '"Open Sans", sans-serif', + "systemFontWeight": "normal", + "external_systemFontSize": 14, + "external_systemFontFamily": '"Open Sans", sans-serif', + "external_systemFontWeight": "normal", + "system_dbFontSize": 14, + "system_dbFontFamily": '"Open Sans", sans-serif', + "system_dbFontWeight": "normal", + "external_system_dbFontSize": 14, + "external_system_dbFontFamily": '"Open Sans", sans-serif', + "external_system_dbFontWeight": "normal", + "system_queueFontSize": 14, + "system_queueFontFamily": '"Open Sans", sans-serif', + "system_queueFontWeight": "normal", + "external_system_queueFontSize": 14, + "external_system_queueFontFamily": '"Open Sans", sans-serif', + "external_system_queueFontWeight": "normal", + "boundaryFontSize": 14, + "boundaryFontFamily": '"Open Sans", sans-serif', + "boundaryFontWeight": "normal", + "messageFontSize": 12, + "messageFontFamily": '"Open Sans", sans-serif', + "messageFontWeight": "normal", + "containerFontSize": 14, + "containerFontFamily": '"Open Sans", sans-serif', + "containerFontWeight": "normal", + "external_containerFontSize": 14, + "external_containerFontFamily": '"Open Sans", sans-serif', + "external_containerFontWeight": "normal", + "container_dbFontSize": 14, + "container_dbFontFamily": '"Open Sans", sans-serif', + "container_dbFontWeight": "normal", + "external_container_dbFontSize": 14, + "external_container_dbFontFamily": '"Open Sans", sans-serif', + "external_container_dbFontWeight": "normal", + "container_queueFontSize": 14, + "container_queueFontFamily": '"Open Sans", sans-serif', + "container_queueFontWeight": "normal", + "external_container_queueFontSize": 14, + "external_container_queueFontFamily": '"Open Sans", sans-serif', + "external_container_queueFontWeight": "normal", + "componentFontSize": 14, + "componentFontFamily": '"Open Sans", sans-serif', + "componentFontWeight": "normal", + "external_componentFontSize": 14, + "external_componentFontFamily": '"Open Sans", sans-serif', + "external_componentFontWeight": "normal", + "component_dbFontSize": 14, + "component_dbFontFamily": '"Open Sans", sans-serif', + "component_dbFontWeight": "normal", + "external_component_dbFontSize": 14, + "external_component_dbFontFamily": '"Open Sans", sans-serif', + "external_component_dbFontWeight": "normal", + "component_queueFontSize": 14, + "component_queueFontFamily": '"Open Sans", sans-serif', + "component_queueFontWeight": "normal", + "external_component_queueFontSize": 14, + "external_component_queueFontFamily": '"Open Sans", sans-serif', + "external_component_queueFontWeight": "normal", + "wrap": true, + "wrapPadding": 10, + "person_bg_color": "#08427B", + "person_border_color": "#073B6F", + "external_person_bg_color": "#686868", + "external_person_border_color": "#8A8A8A", + "system_bg_color": "#1168BD", + "system_border_color": "#3C7FC0", + "system_db_bg_color": "#1168BD", + "system_db_border_color": "#3C7FC0", + "system_queue_bg_color": "#1168BD", + "system_queue_border_color": "#3C7FC0", + "external_system_bg_color": "#999999", + "external_system_border_color": "#8A8A8A", + "external_system_db_bg_color": "#999999", + "external_system_db_border_color": "#8A8A8A", + "external_system_queue_bg_color": "#999999", + "external_system_queue_border_color": "#8A8A8A", + "container_bg_color": "#438DD5", + "container_border_color": "#3C7FC0", + "container_db_bg_color": "#438DD5", + "container_db_border_color": "#3C7FC0", + "container_queue_bg_color": "#438DD5", + "container_queue_border_color": "#3C7FC0", + "external_container_bg_color": "#B3B3B3", + "external_container_border_color": "#A6A6A6", + "external_container_db_bg_color": "#B3B3B3", + "external_container_db_border_color": "#A6A6A6", + "external_container_queue_bg_color": "#B3B3B3", + "external_container_queue_border_color": "#A6A6A6", + "component_bg_color": "#85BBF0", + "component_border_color": "#78A8D8", + "component_db_bg_color": "#85BBF0", + "component_db_border_color": "#78A8D8", + "component_queue_bg_color": "#85BBF0", + "component_queue_border_color": "#78A8D8", + "external_component_bg_color": "#CCCCCC", + "external_component_border_color": "#BFBFBF", + "external_component_db_bg_color": "#CCCCCC", + "external_component_db_border_color": "#BFBFBF", + "external_component_queue_bg_color": "#CCCCCC", + "external_component_queue_border_color": "#BFBFBF" + }, + "sankey": { + "useMaxWidth": true, + "width": 600, + "height": 400, + "linkColor": "gradient", + "nodeAlignment": "justify", + "showValues": true, + "prefix": "", + "suffix": "" + }, + "block": { + "useMaxWidth": true, + "padding": 8 + }, + "packet": { + "useMaxWidth": true, + "rowHeight": 32, + "bitWidth": 32, + "bitsPerRow": 32, + "showBits": true, + "paddingX": 5, + "paddingY": 5 + }, + "architecture": { + "useMaxWidth": true, + "padding": 40, + "iconSize": 80, + "fontSize": 16 + }, + "radar": { + "useMaxWidth": true, + "width": 600, + "height": 600, + "marginTop": 50, + "marginRight": 50, + "marginBottom": 50, + "marginLeft": 50, + "axisScaleFactor": 1, + "axisLabelFactor": 1.05, + "curveTension": 0.17 + }, + "theme": "default", + "look": "classic", + "handDrawnSeed": 0, + "layout": "dagre", + "maxTextSize": 5e4, + "maxEdges": 500, + "darkMode": false, + "fontFamily": '"trebuchet ms", verdana, arial, sans-serif;', + "logLevel": 5, + "securityLevel": "strict", + "startOnLoad": true, + "arrowMarkerAbsolute": false, + "secure": [ + "secure", + "securityLevel", + "startOnLoad", + "maxTextSize", + "suppressErrorRendering", + "maxEdges" + ], + "legacyMathML": false, + "forceLegacyMathML": false, + "deterministicIds": false, + "fontSize": 16, + "markdownAutoWrap": true, + "suppressErrorRendering": false +}; + +// src/defaultConfig.ts +var config = { + ...config_schema_default, + // Set, even though they're `undefined` so that `configKeys` finds these keys + // TODO: Should we replace these with `null` so that they can go in the JSON Schema? + deterministicIDSeed: void 0, + elk: { + // mergeEdges is needed here to be considered + mergeEdges: false, + nodePlacementStrategy: "BRANDES_KOEPF", + forceNodeModelOrder: false, + considerModelOrder: "NODES_AND_EDGES" + }, + themeCSS: void 0, + // add non-JSON default config values + themeVariables: themes_default.default.getThemeVariables(), + sequence: { + ...config_schema_default.sequence, + messageFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.messageFontFamily, + fontSize: this.messageFontSize, + fontWeight: this.messageFontWeight + }; + }, "messageFont"), + noteFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.noteFontFamily, + fontSize: this.noteFontSize, + fontWeight: this.noteFontWeight + }; + }, "noteFont"), + actorFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.actorFontFamily, + fontSize: this.actorFontSize, + fontWeight: this.actorFontWeight + }; + }, "actorFont") + }, + class: { + hideEmptyMembersBox: false + }, + gantt: { + ...config_schema_default.gantt, + tickInterval: void 0, + useWidth: void 0 + // can probably be removed since `configKeys` already includes this + }, + c4: { + ...config_schema_default.c4, + useWidth: void 0, + personFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.personFontFamily, + fontSize: this.personFontSize, + fontWeight: this.personFontWeight + }; + }, "personFont"), + flowchart: { + ...config_schema_default.flowchart, + inheritDir: false + // default to legacy behavior + }, + external_personFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.external_personFontFamily, + fontSize: this.external_personFontSize, + fontWeight: this.external_personFontWeight + }; + }, "external_personFont"), + systemFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.systemFontFamily, + fontSize: this.systemFontSize, + fontWeight: this.systemFontWeight + }; + }, "systemFont"), + external_systemFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.external_systemFontFamily, + fontSize: this.external_systemFontSize, + fontWeight: this.external_systemFontWeight + }; + }, "external_systemFont"), + system_dbFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.system_dbFontFamily, + fontSize: this.system_dbFontSize, + fontWeight: this.system_dbFontWeight + }; + }, "system_dbFont"), + external_system_dbFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.external_system_dbFontFamily, + fontSize: this.external_system_dbFontSize, + fontWeight: this.external_system_dbFontWeight + }; + }, "external_system_dbFont"), + system_queueFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.system_queueFontFamily, + fontSize: this.system_queueFontSize, + fontWeight: this.system_queueFontWeight + }; + }, "system_queueFont"), + external_system_queueFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.external_system_queueFontFamily, + fontSize: this.external_system_queueFontSize, + fontWeight: this.external_system_queueFontWeight + }; + }, "external_system_queueFont"), + containerFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.containerFontFamily, + fontSize: this.containerFontSize, + fontWeight: this.containerFontWeight + }; + }, "containerFont"), + external_containerFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.external_containerFontFamily, + fontSize: this.external_containerFontSize, + fontWeight: this.external_containerFontWeight + }; + }, "external_containerFont"), + container_dbFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.container_dbFontFamily, + fontSize: this.container_dbFontSize, + fontWeight: this.container_dbFontWeight + }; + }, "container_dbFont"), + external_container_dbFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.external_container_dbFontFamily, + fontSize: this.external_container_dbFontSize, + fontWeight: this.external_container_dbFontWeight + }; + }, "external_container_dbFont"), + container_queueFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.container_queueFontFamily, + fontSize: this.container_queueFontSize, + fontWeight: this.container_queueFontWeight + }; + }, "container_queueFont"), + external_container_queueFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.external_container_queueFontFamily, + fontSize: this.external_container_queueFontSize, + fontWeight: this.external_container_queueFontWeight + }; + }, "external_container_queueFont"), + componentFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.componentFontFamily, + fontSize: this.componentFontSize, + fontWeight: this.componentFontWeight + }; + }, "componentFont"), + external_componentFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.external_componentFontFamily, + fontSize: this.external_componentFontSize, + fontWeight: this.external_componentFontWeight + }; + }, "external_componentFont"), + component_dbFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.component_dbFontFamily, + fontSize: this.component_dbFontSize, + fontWeight: this.component_dbFontWeight + }; + }, "component_dbFont"), + external_component_dbFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.external_component_dbFontFamily, + fontSize: this.external_component_dbFontSize, + fontWeight: this.external_component_dbFontWeight + }; + }, "external_component_dbFont"), + component_queueFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.component_queueFontFamily, + fontSize: this.component_queueFontSize, + fontWeight: this.component_queueFontWeight + }; + }, "component_queueFont"), + external_component_queueFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.external_component_queueFontFamily, + fontSize: this.external_component_queueFontSize, + fontWeight: this.external_component_queueFontWeight + }; + }, "external_component_queueFont"), + boundaryFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.boundaryFontFamily, + fontSize: this.boundaryFontSize, + fontWeight: this.boundaryFontWeight + }; + }, "boundaryFont"), + messageFont: /* @__PURE__ */ __name(function() { + return { + fontFamily: this.messageFontFamily, + fontSize: this.messageFontSize, + fontWeight: this.messageFontWeight + }; + }, "messageFont") + }, + pie: { + ...config_schema_default.pie, + useWidth: 984 + }, + xyChart: { + ...config_schema_default.xyChart, + useWidth: void 0 + }, + requirement: { + ...config_schema_default.requirement, + useWidth: void 0 + }, + packet: { + ...config_schema_default.packet + }, + radar: { + ...config_schema_default.radar + }, + treemap: { + useMaxWidth: true, + padding: 10, + diagramPadding: 8, + showValues: true, + nodeWidth: 100, + nodeHeight: 40, + borderWidth: 1, + valueFontSize: 12, + labelFontSize: 14, + valueFormat: "," + } +}; +var keyify = /* @__PURE__ */ __name((obj, prefix = "") => Object.keys(obj).reduce((res, el) => { + if (Array.isArray(obj[el])) { + return res; + } else if (typeof obj[el] === "object" && obj[el] !== null) { + return [...res, prefix + el, ...keyify(obj[el], "")]; + } + return [...res, prefix + el]; +}, []), "keyify"); +var configKeys = new Set(keyify(config, "")); +var defaultConfig_default = config; + +// src/utils/sanitizeDirective.ts +var sanitizeDirective = /* @__PURE__ */ __name((args) => { + log.debug("sanitizeDirective called with", args); + if (typeof args !== "object" || args == null) { + return; + } + if (Array.isArray(args)) { + args.forEach((arg) => sanitizeDirective(arg)); + return; + } + for (const key of Object.keys(args)) { + log.debug("Checking key", key); + if (key.startsWith("__") || key.includes("proto") || key.includes("constr") || !configKeys.has(key) || args[key] == null) { + log.debug("sanitize deleting key: ", key); + delete args[key]; + continue; + } + if (typeof args[key] === "object") { + log.debug("sanitizing object", key); + sanitizeDirective(args[key]); + continue; + } + const cssMatchers = ["themeCSS", "fontFamily", "altFontFamily"]; + for (const cssKey of cssMatchers) { + if (key.includes(cssKey)) { + log.debug("sanitizing css option", key); + args[key] = sanitizeCss(args[key]); + } + } + } + if (args.themeVariables) { + for (const k of Object.keys(args.themeVariables)) { + const val = args.themeVariables[k]; + if (val?.match && !val.match(/^[\d "#%(),.;A-Za-z]+$/)) { + args.themeVariables[k] = ""; + } + } + } + log.debug("After sanitization", args); +}, "sanitizeDirective"); +var sanitizeCss = /* @__PURE__ */ __name((str) => { + let startCnt = 0; + let endCnt = 0; + for (const element of str) { + if (startCnt < endCnt) { + return "{ /* ERROR: Unbalanced CSS */ }"; + } + if (element === "{") { + startCnt++; + } else if (element === "}") { + endCnt++; + } + } + if (startCnt !== endCnt) { + return "{ /* ERROR: Unbalanced CSS */ }"; + } + return str; +}, "sanitizeCss"); + +// src/config.ts +var defaultConfig = Object.freeze(defaultConfig_default); +var siteConfig = assignWithDepth_default({}, defaultConfig); +var configFromInitialize; +var directives = []; +var currentConfig = assignWithDepth_default({}, defaultConfig); +var updateCurrentConfig = /* @__PURE__ */ __name((siteCfg, _directives) => { + let cfg = assignWithDepth_default({}, siteCfg); + let sumOfDirectives = {}; + for (const d of _directives) { + sanitize(d); + sumOfDirectives = assignWithDepth_default(sumOfDirectives, d); + } + cfg = assignWithDepth_default(cfg, sumOfDirectives); + if (sumOfDirectives.theme && sumOfDirectives.theme in themes_default) { + const tmpConfigFromInitialize = assignWithDepth_default({}, configFromInitialize); + const themeVariables = assignWithDepth_default( + tmpConfigFromInitialize.themeVariables || {}, + sumOfDirectives.themeVariables + ); + if (cfg.theme && cfg.theme in themes_default) { + cfg.themeVariables = themes_default[cfg.theme].getThemeVariables(themeVariables); + } + } + currentConfig = cfg; + checkConfig(currentConfig); + return currentConfig; +}, "updateCurrentConfig"); +var setSiteConfig = /* @__PURE__ */ __name((conf) => { + siteConfig = assignWithDepth_default({}, defaultConfig); + siteConfig = assignWithDepth_default(siteConfig, conf); + if (conf.theme && themes_default[conf.theme]) { + siteConfig.themeVariables = themes_default[conf.theme].getThemeVariables(conf.themeVariables); + } + updateCurrentConfig(siteConfig, directives); + return siteConfig; +}, "setSiteConfig"); +var saveConfigFromInitialize = /* @__PURE__ */ __name((conf) => { + configFromInitialize = assignWithDepth_default({}, conf); +}, "saveConfigFromInitialize"); +var updateSiteConfig = /* @__PURE__ */ __name((conf) => { + siteConfig = assignWithDepth_default(siteConfig, conf); + updateCurrentConfig(siteConfig, directives); + return siteConfig; +}, "updateSiteConfig"); +var getSiteConfig = /* @__PURE__ */ __name(() => { + return assignWithDepth_default({}, siteConfig); +}, "getSiteConfig"); +var setConfig = /* @__PURE__ */ __name((conf) => { + checkConfig(conf); + assignWithDepth_default(currentConfig, conf); + return getConfig(); +}, "setConfig"); +var getConfig = /* @__PURE__ */ __name(() => { + return assignWithDepth_default({}, currentConfig); +}, "getConfig"); +var sanitize = /* @__PURE__ */ __name((options) => { + if (!options) { + return; + } + ["secure", ...siteConfig.secure ?? []].forEach((key) => { + if (Object.hasOwn(options, key)) { + log.debug(`Denied attempt to modify a secure key ${key}`, options[key]); + delete options[key]; + } + }); + Object.keys(options).forEach((key) => { + if (key.startsWith("__")) { + delete options[key]; + } + }); + Object.keys(options).forEach((key) => { + if (typeof options[key] === "string" && (options[key].includes("<") || options[key].includes(">") || options[key].includes("url(data:"))) { + delete options[key]; + } + if (typeof options[key] === "object") { + sanitize(options[key]); + } + }); +}, "sanitize"); +var addDirective = /* @__PURE__ */ __name((directive) => { + sanitizeDirective(directive); + if (directive.fontFamily && !directive.themeVariables?.fontFamily) { + directive.themeVariables = { + ...directive.themeVariables, + fontFamily: directive.fontFamily + }; + } + directives.push(directive); + updateCurrentConfig(siteConfig, directives); +}, "addDirective"); +var reset = /* @__PURE__ */ __name((config2 = siteConfig) => { + directives = []; + updateCurrentConfig(config2, directives); +}, "reset"); +var ConfigWarning = { + LAZY_LOAD_DEPRECATED: "The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead." +}; +var issuedWarnings = {}; +var issueWarning = /* @__PURE__ */ __name((warning) => { + if (issuedWarnings[warning]) { + return; + } + log.warn(ConfigWarning[warning]); + issuedWarnings[warning] = true; +}, "issueWarning"); +var checkConfig = /* @__PURE__ */ __name((config2) => { + if (!config2) { + return; + } + if (config2.lazyLoadedDiagrams || config2.loadExternalDiagramsAtStartup) { + issueWarning("LAZY_LOAD_DEPRECATED"); + } +}, "checkConfig"); +var getUserDefinedConfig = /* @__PURE__ */ __name(() => { + let userConfig = {}; + if (configFromInitialize) { + userConfig = assignWithDepth_default(userConfig, configFromInitialize); + } + for (const d of directives) { + userConfig = assignWithDepth_default(userConfig, d); + } + return userConfig; +}, "getUserDefinedConfig"); + +// src/diagrams/common/common.ts +import DOMPurify from "dompurify"; +var lineBreakRegex = //gi; +var getRows = /* @__PURE__ */ __name((s) => { + if (!s) { + return [""]; + } + const str = breakToPlaceholder(s).replace(/\\n/g, "#br#"); + return str.split("#br#"); +}, "getRows"); +var setupDompurifyHooksIfNotSetup = /* @__PURE__ */ (() => { + let setup = false; + return () => { + if (!setup) { + setupDompurifyHooks(); + setup = true; + } + }; +})(); +function setupDompurifyHooks() { + const TEMPORARY_ATTRIBUTE = "data-temp-href-target"; + DOMPurify.addHook("beforeSanitizeAttributes", (node) => { + if (node.tagName === "A" && node.hasAttribute("target")) { + node.setAttribute(TEMPORARY_ATTRIBUTE, node.getAttribute("target") ?? ""); + } + }); + DOMPurify.addHook("afterSanitizeAttributes", (node) => { + if (node.tagName === "A" && node.hasAttribute(TEMPORARY_ATTRIBUTE)) { + node.setAttribute("target", node.getAttribute(TEMPORARY_ATTRIBUTE) ?? ""); + node.removeAttribute(TEMPORARY_ATTRIBUTE); + if (node.getAttribute("target") === "_blank") { + node.setAttribute("rel", "noopener"); + } + } + }); +} +__name(setupDompurifyHooks, "setupDompurifyHooks"); +var removeScript = /* @__PURE__ */ __name((txt) => { + setupDompurifyHooksIfNotSetup(); + const sanitizedText = DOMPurify.sanitize(txt); + return sanitizedText; +}, "removeScript"); +var sanitizeMore = /* @__PURE__ */ __name((text, config2) => { + if (config2.flowchart?.htmlLabels !== false) { + const level = config2.securityLevel; + if (level === "antiscript" || level === "strict") { + text = removeScript(text); + } else if (level !== "loose") { + text = breakToPlaceholder(text); + text = text.replace(//g, ">"); + text = text.replace(/=/g, "="); + text = placeholderToBreak(text); + } + } + return text; +}, "sanitizeMore"); +var sanitizeText = /* @__PURE__ */ __name((text, config2) => { + if (!text) { + return text; + } + if (config2.dompurifyConfig) { + text = DOMPurify.sanitize(sanitizeMore(text, config2), config2.dompurifyConfig).toString(); + } else { + text = DOMPurify.sanitize(sanitizeMore(text, config2), { + FORBID_TAGS: ["style"] + }).toString(); + } + return text; +}, "sanitizeText"); +var sanitizeTextOrArray = /* @__PURE__ */ __name((a, config2) => { + if (typeof a === "string") { + return sanitizeText(a, config2); + } + return a.flat().map((x) => sanitizeText(x, config2)); +}, "sanitizeTextOrArray"); +var hasBreaks = /* @__PURE__ */ __name((text) => { + return lineBreakRegex.test(text); +}, "hasBreaks"); +var splitBreaks = /* @__PURE__ */ __name((text) => { + return text.split(lineBreakRegex); +}, "splitBreaks"); +var placeholderToBreak = /* @__PURE__ */ __name((s) => { + return s.replace(/#br#/g, "
"); +}, "placeholderToBreak"); +var breakToPlaceholder = /* @__PURE__ */ __name((s) => { + return s.replace(lineBreakRegex, "#br#"); +}, "breakToPlaceholder"); +var getUrl = /* @__PURE__ */ __name((useAbsolute) => { + let url = ""; + if (useAbsolute) { + url = window.location.protocol + "//" + window.location.host + window.location.pathname + window.location.search; + url = CSS.escape(url); + } + return url; +}, "getUrl"); +var evaluate = /* @__PURE__ */ __name((val) => val === false || ["false", "null", "0"].includes(String(val).trim().toLowerCase()) ? false : true, "evaluate"); +var getMax = /* @__PURE__ */ __name(function(...values) { + const newValues = values.filter((value) => { + return !isNaN(value); + }); + return Math.max(...newValues); +}, "getMax"); +var getMin = /* @__PURE__ */ __name(function(...values) { + const newValues = values.filter((value) => { + return !isNaN(value); + }); + return Math.min(...newValues); +}, "getMin"); +var parseGenericTypes = /* @__PURE__ */ __name(function(input) { + const inputSets = input.split(/(,)/); + const output = []; + for (let i = 0; i < inputSets.length; i++) { + let thisSet = inputSets[i]; + if (thisSet === "," && i > 0 && i + 1 < inputSets.length) { + const previousSet = inputSets[i - 1]; + const nextSet = inputSets[i + 1]; + if (shouldCombineSets(previousSet, nextSet)) { + thisSet = previousSet + "," + nextSet; + i++; + output.pop(); + } + } + output.push(processSet(thisSet)); + } + return output.join(""); +}, "parseGenericTypes"); +var countOccurrence = /* @__PURE__ */ __name((string, substring) => { + return Math.max(0, string.split(substring).length - 1); +}, "countOccurrence"); +var shouldCombineSets = /* @__PURE__ */ __name((previousSet, nextSet) => { + const prevCount = countOccurrence(previousSet, "~"); + const nextCount = countOccurrence(nextSet, "~"); + return prevCount === 1 && nextCount === 1; +}, "shouldCombineSets"); +var processSet = /* @__PURE__ */ __name((input) => { + const tildeCount = countOccurrence(input, "~"); + let hasStartingTilde = false; + if (tildeCount <= 1) { + return input; + } + if (tildeCount % 2 !== 0 && input.startsWith("~")) { + input = input.substring(1); + hasStartingTilde = true; + } + const chars = [...input]; + let first = chars.indexOf("~"); + let last = chars.lastIndexOf("~"); + while (first !== -1 && last !== -1 && first !== last) { + chars[first] = "<"; + chars[last] = ">"; + first = chars.indexOf("~"); + last = chars.lastIndexOf("~"); + } + if (hasStartingTilde) { + chars.unshift("~"); + } + return chars.join(""); +}, "processSet"); +var isMathMLSupported = /* @__PURE__ */ __name(() => window.MathMLElement !== void 0, "isMathMLSupported"); +var katexRegex = /\$\$(.*)\$\$/g; +var hasKatex = /* @__PURE__ */ __name((text) => (text.match(katexRegex)?.length ?? 0) > 0, "hasKatex"); +var calculateMathMLDimensions = /* @__PURE__ */ __name(async (text, config2) => { + const divElem = document.createElement("div"); + divElem.innerHTML = await renderKatexSanitized(text, config2); + divElem.id = "katex-temp"; + divElem.style.visibility = "hidden"; + divElem.style.position = "absolute"; + divElem.style.top = "0"; + const body = document.querySelector("body"); + body?.insertAdjacentElement("beforeend", divElem); + const dim = { width: divElem.clientWidth, height: divElem.clientHeight }; + divElem.remove(); + return dim; +}, "calculateMathMLDimensions"); +var renderKatexUnsanitized = /* @__PURE__ */ __name(async (text, config2) => { + if (!hasKatex(text)) { + return text; + } + if (!(isMathMLSupported() || config2.legacyMathML || config2.forceLegacyMathML)) { + return text.replace(katexRegex, "MathML is unsupported in this environment."); + } + if (true) { + const { default: katex } = await import("katex"); + const outputMode = config2.forceLegacyMathML || !isMathMLSupported() && config2.legacyMathML ? "htmlAndMathml" : "mathml"; + return text.split(lineBreakRegex).map( + (line) => hasKatex(line) ? `
${line}
` : `
${line}
` + ).join("").replace( + katexRegex, + (_, c) => katex.renderToString(c, { + throwOnError: true, + displayMode: true, + output: outputMode + }).replace(/\n/g, " ").replace(//g, "") + ); + } + return text.replace( + katexRegex, + "Katex is not supported in @mermaid-js/tiny. Please use the full mermaid library." + ); +}, "renderKatexUnsanitized"); +var renderKatexSanitized = /* @__PURE__ */ __name(async (text, config2) => { + return sanitizeText(await renderKatexUnsanitized(text, config2), config2); +}, "renderKatexSanitized"); +var common_default = { + getRows, + sanitizeText, + sanitizeTextOrArray, + hasBreaks, + splitBreaks, + lineBreakRegex, + removeScript, + getUrl, + evaluate, + getMax, + getMin +}; + +// src/setupGraphViewbox.js +var d3Attrs = /* @__PURE__ */ __name(function(d3Elem, attrs) { + for (let attr of attrs) { + d3Elem.attr(attr[0], attr[1]); + } +}, "d3Attrs"); +var calculateSvgSizeAttrs = /* @__PURE__ */ __name(function(height, width, useMaxWidth) { + let attrs = /* @__PURE__ */ new Map(); + if (useMaxWidth) { + attrs.set("width", "100%"); + attrs.set("style", `max-width: ${width}px;`); + } else { + attrs.set("height", height); + attrs.set("width", width); + } + return attrs; +}, "calculateSvgSizeAttrs"); +var configureSvgSize = /* @__PURE__ */ __name(function(svgElem, height, width, useMaxWidth) { + const attrs = calculateSvgSizeAttrs(height, width, useMaxWidth); + d3Attrs(svgElem, attrs); +}, "configureSvgSize"); +var setupGraphViewbox = /* @__PURE__ */ __name(function(graph, svgElem, padding, useMaxWidth) { + const svgBounds = svgElem.node().getBBox(); + const sWidth = svgBounds.width; + const sHeight = svgBounds.height; + log.info(`SVG bounds: ${sWidth}x${sHeight}`, svgBounds); + let width = 0; + let height = 0; + log.info(`Graph bounds: ${width}x${height}`, graph); + width = sWidth + padding * 2; + height = sHeight + padding * 2; + log.info(`Calculated bounds: ${width}x${height}`); + configureSvgSize(svgElem, height, width, useMaxWidth); + const vBox = `${svgBounds.x - padding} ${svgBounds.y - padding} ${svgBounds.width + 2 * padding} ${svgBounds.height + 2 * padding}`; + svgElem.attr("viewBox", vBox); +}, "setupGraphViewbox"); + +// src/styles.ts +var themes = {}; +var getStyles = /* @__PURE__ */ __name((type, userStyles, options) => { + let diagramStyles = ""; + if (type in themes && themes[type]) { + diagramStyles = themes[type](options); + } else { + log.warn(`No theme found for ${type}`); + } + return ` & { + font-family: ${options.fontFamily}; + font-size: ${options.fontSize}; + fill: ${options.textColor} + } + @keyframes edge-animation-frame { + from { + stroke-dashoffset: 0; + } + } + @keyframes dash { + to { + stroke-dashoffset: 0; + } + } + & .edge-animation-slow { + stroke-dasharray: 9,5 !important; + stroke-dashoffset: 900; + animation: dash 50s linear infinite; + stroke-linecap: round; + } + & .edge-animation-fast { + stroke-dasharray: 9,5 !important; + stroke-dashoffset: 900; + animation: dash 20s linear infinite; + stroke-linecap: round; + } + /* Classes common for multiple diagrams */ + + & .error-icon { + fill: ${options.errorBkgColor}; + } + & .error-text { + fill: ${options.errorTextColor}; + stroke: ${options.errorTextColor}; + } + + & .edge-thickness-normal { + stroke-width: 1px; + } + & .edge-thickness-thick { + stroke-width: 3.5px + } + & .edge-pattern-solid { + stroke-dasharray: 0; + } + & .edge-thickness-invisible { + stroke-width: 0; + fill: none; + } + & .edge-pattern-dashed{ + stroke-dasharray: 3; + } + .edge-pattern-dotted { + stroke-dasharray: 2; + } + + & .marker { + fill: ${options.lineColor}; + stroke: ${options.lineColor}; + } + & .marker.cross { + stroke: ${options.lineColor}; + } + + & svg { + font-family: ${options.fontFamily}; + font-size: ${options.fontSize}; + } + & p { + margin: 0 + } + + ${diagramStyles} + + ${userStyles} +`; +}, "getStyles"); +var addStylesForDiagram = /* @__PURE__ */ __name((type, diagramTheme) => { + if (diagramTheme !== void 0) { + themes[type] = diagramTheme; + } +}, "addStylesForDiagram"); +var styles_default = getStyles; + +// src/diagrams/common/commonDb.ts +var commonDb_exports = {}; +__export(commonDb_exports, { + clear: () => clear, + getAccDescription: () => getAccDescription, + getAccTitle: () => getAccTitle, + getDiagramTitle: () => getDiagramTitle, + setAccDescription: () => setAccDescription, + setAccTitle: () => setAccTitle, + setDiagramTitle: () => setDiagramTitle +}); +var accTitle = ""; +var diagramTitle = ""; +var accDescription = ""; +var sanitizeText2 = /* @__PURE__ */ __name((txt) => sanitizeText(txt, getConfig()), "sanitizeText"); +var clear = /* @__PURE__ */ __name(() => { + accTitle = ""; + accDescription = ""; + diagramTitle = ""; +}, "clear"); +var setAccTitle = /* @__PURE__ */ __name((txt) => { + accTitle = sanitizeText2(txt).replace(/^\s+/g, ""); +}, "setAccTitle"); +var getAccTitle = /* @__PURE__ */ __name(() => accTitle, "getAccTitle"); +var setAccDescription = /* @__PURE__ */ __name((txt) => { + accDescription = sanitizeText2(txt).replace(/\n\s+/g, "\n"); +}, "setAccDescription"); +var getAccDescription = /* @__PURE__ */ __name(() => accDescription, "getAccDescription"); +var setDiagramTitle = /* @__PURE__ */ __name((txt) => { + diagramTitle = sanitizeText2(txt); +}, "setDiagramTitle"); +var getDiagramTitle = /* @__PURE__ */ __name(() => diagramTitle, "getDiagramTitle"); + +// src/diagram-api/diagramAPI.ts +var log2 = log; +var setLogLevel2 = setLogLevel; +var getConfig2 = getConfig; +var setConfig2 = setConfig; +var defaultConfig2 = defaultConfig; +var sanitizeText3 = /* @__PURE__ */ __name((text) => sanitizeText(text, getConfig2()), "sanitizeText"); +var setupGraphViewbox2 = setupGraphViewbox; +var getCommonDb = /* @__PURE__ */ __name(() => { + return commonDb_exports; +}, "getCommonDb"); +var diagrams = {}; +var registerDiagram = /* @__PURE__ */ __name((id, diagram, detector) => { + if (diagrams[id]) { + log2.warn(`Diagram with id ${id} already registered. Overwriting.`); + } + diagrams[id] = diagram; + if (detector) { + addDetector(id, detector); + } + addStylesForDiagram(id, diagram.styles); + diagram.injectUtils?.( + log2, + setLogLevel2, + getConfig2, + sanitizeText3, + setupGraphViewbox2, + getCommonDb(), + () => { + } + ); +}, "registerDiagram"); +var getDiagram = /* @__PURE__ */ __name((name) => { + if (name in diagrams) { + return diagrams[name]; + } + throw new DiagramNotFoundError(name); +}, "getDiagram"); +var DiagramNotFoundError = class extends Error { + static { + __name(this, "DiagramNotFoundError"); + } + constructor(name) { + super(`Diagram ${name} not found.`); + } +}; + +export { + assignWithDepth_default, + getThemeVariables3 as getThemeVariables, + themes_default, + defaultConfig_default, + sanitizeDirective, + defaultConfig, + setSiteConfig, + saveConfigFromInitialize, + updateSiteConfig, + getSiteConfig, + setConfig, + getConfig, + addDirective, + reset, + getUserDefinedConfig, + lineBreakRegex, + sanitizeText, + getUrl, + evaluate, + parseGenericTypes, + hasKatex, + calculateMathMLDimensions, + renderKatexSanitized, + common_default, + frontMatterRegex, + directiveRegex, + UnknownDiagramError, + detectors, + detectType, + registerLazyLoadedDiagrams, + getDiagramLoader, + configureSvgSize, + setupGraphViewbox, + styles_default, + clear, + setAccTitle, + getAccTitle, + setAccDescription, + getAccDescription, + setDiagramTitle, + getDiagramTitle, + commonDb_exports, + getConfig2, + setConfig2, + defaultConfig2, + sanitizeText3 as sanitizeText2, + setupGraphViewbox2, + registerDiagram, + getDiagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ABZYJK2D.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ABZYJK2D.mjs.map new file mode 100644 index 0000000..0f98df8 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ABZYJK2D.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagram-api/regexes.ts", "../../../src/errors.ts", "../../../src/diagram-api/detectType.ts", "../../../src/assignWithDepth.ts", "../../../src/themes/theme-base.js", "../../../src/themes/erDiagram-oldHardcodedValues.ts", "../../../src/themes/theme-helpers.js", "../../../src/themes/theme-dark.js", "../../../src/themes/theme-default.js", "../../../src/themes/theme-forest.js", "../../../src/themes/theme-neutral.js", "../../../src/themes/index.js", "../../../src/schemas/config.schema.yaml", "../../../src/defaultConfig.ts", "../../../src/utils/sanitizeDirective.ts", "../../../src/config.ts", "../../../src/diagrams/common/common.ts", "../../../src/setupGraphViewbox.js", "../../../src/styles.ts", "../../../src/diagrams/common/commonDb.ts", "../../../src/diagram-api/diagramAPI.ts"], + "sourcesContent": ["// Match Jekyll-style front matter blocks (https://jekyllrb.com/docs/front-matter/).\n// Based on regex used by Jekyll: https://github.com/jekyll/jekyll/blob/6dd3cc21c40b98054851846425af06c64f9fb466/lib/jekyll/document.rb#L10\n// Note that JS doesn't support the \"\\A\" anchor, which means we can't use\n// multiline mode.\n// Relevant YAML spec: https://yaml.org/spec/1.2.2/#914-explicit-documents\nexport const frontMatterRegex = /^-{3}\\s*[\\n\\r](.*?)[\\n\\r]-{3}\\s*[\\n\\r]+/s;\n\nexport const directiveRegex =\n /%{2}{\\s*(?:(\\w+)\\s*:|(\\w+))\\s*(?:(\\w+)|((?:(?!}%{2}).|\\r?\\n)*))?\\s*(?:}%{2})?/gi;\n\nexport const anyCommentRegex = /\\s*%%.*\\n/gm;\n", "export class UnknownDiagramError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'UnknownDiagramError';\n }\n}\n", "import type { MermaidConfig } from '../config.type.js';\nimport { log } from '../logger.js';\nimport type {\n DetectorRecord,\n DiagramDetector,\n DiagramLoader,\n ExternalDiagramDefinition,\n} from './types.js';\nimport { anyCommentRegex, directiveRegex, frontMatterRegex } from './regexes.js';\nimport { UnknownDiagramError } from '../errors.js';\n\nexport const detectors: Record = {};\n\n/**\n * Detects the type of the graph text.\n *\n * Takes into consideration the possible existence of an `%%init` directive\n *\n * @param text - The text defining the graph. For example:\n *\n * ```mermaid\n * %%{initialize: {\"startOnLoad\": true, logLevel: \"fatal\" }}%%\n * graph LR\n * a-->b\n * b-->c\n * c-->d\n * d-->e\n * e-->f\n * f-->g\n * g-->h\n * ```\n *\n * @param config - The mermaid config.\n * @returns A graph definition key\n */\nexport const detectType = function (text: string, config?: MermaidConfig): string {\n text = text\n .replace(frontMatterRegex, '')\n .replace(directiveRegex, '')\n .replace(anyCommentRegex, '\\n');\n for (const [key, { detector }] of Object.entries(detectors)) {\n const diagram = detector(text, config);\n if (diagram) {\n return key;\n }\n }\n\n throw new UnknownDiagramError(\n `No diagram type detected matching given configuration for text: ${text}`\n );\n};\n\n/**\n * Registers lazy-loaded diagrams to Mermaid.\n *\n * The diagram function is loaded asynchronously, so that diagrams are only loaded\n * if the diagram is detected.\n *\n * @remarks\n * Please note that the order of diagram detectors is important.\n * The first detector to return `true` is the diagram that will be loaded\n * and used, so put more specific detectors at the beginning!\n *\n * @param diagrams - Diagrams to lazy load, and their detectors, in order of importance.\n */\nexport const registerLazyLoadedDiagrams = (...diagrams: ExternalDiagramDefinition[]) => {\n for (const { id, detector, loader } of diagrams) {\n addDetector(id, detector, loader);\n }\n};\n\nexport const addDetector = (key: string, detector: DiagramDetector, loader?: DiagramLoader) => {\n if (detectors[key]) {\n log.warn(`Detector with key ${key} already exists. Overwriting.`);\n }\n detectors[key] = { detector, loader };\n log.debug(`Detector with key ${key} added${loader ? ' with loader' : ''}`);\n};\n\nexport const getDiagramLoader = (key: string) => {\n return detectors[key].loader;\n};\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * assignWithDepth Extends the functionality of {@link Object.assign} with the\n * ability to merge arbitrary-depth objects For each key in src with path `k` (recursively)\n * performs an Object.assign(dst[`k`], src[`k`]) with a slight change from the typical handling of\n * undefined for dst[`k`]: instead of raising an error, dst[`k`] is auto-initialized to `{}` and\n * effectively merged with src[`k`]

Additionally, dissimilar types will not clobber unless the\n * config.clobber parameter === true. Example:\n *\n * ```\n * const config_0 = { foo: { bar: 'bar' }, bar: 'foo' };\n * const config_1 = { foo: 'foo', bar: 'bar' };\n * const result = assignWithDepth(config_0, config_1);\n * console.log(result);\n * //-> result: { foo: { bar: 'bar' }, bar: 'bar' }\n * ```\n *\n * Traditional Object.assign would have clobbered foo in config_0 with foo in config_1. If src is a\n * destructured array of objects and dst is not an array, assignWithDepth will apply each element\n * of src to dst in order.\n * @param dst - The destination of the merge\n * @param src - The source object(s) to merge into destination\n * @param config -\n * * depth: depth to traverse within src and dst for merging\n * * clobber: should dissimilar types clobber\n */\nconst assignWithDepth = (\n dst: any,\n src: any,\n { depth = 2, clobber = false }: { depth?: number; clobber?: boolean } = {}\n): any => {\n const config: { depth: number; clobber: boolean } = { depth, clobber };\n if (Array.isArray(src) && !Array.isArray(dst)) {\n src.forEach((s) => assignWithDepth(dst, s, config));\n return dst;\n } else if (Array.isArray(src) && Array.isArray(dst)) {\n src.forEach((s) => {\n if (!dst.includes(s)) {\n dst.push(s);\n }\n });\n return dst;\n }\n if (dst === undefined || depth <= 0) {\n if (dst !== undefined && dst !== null && typeof dst === 'object' && typeof src === 'object') {\n return Object.assign(dst, src);\n } else {\n return src;\n }\n }\n if (src !== undefined && typeof dst === 'object' && typeof src === 'object') {\n Object.keys(src).forEach((key) => {\n if (\n typeof src[key] === 'object' &&\n (dst[key] === undefined || typeof dst[key] === 'object')\n ) {\n if (dst[key] === undefined) {\n dst[key] = Array.isArray(src[key]) ? [] : {};\n }\n dst[key] = assignWithDepth(dst[key], src[key], { depth: depth - 1, clobber });\n } else if (clobber || (typeof dst[key] !== 'object' && typeof src[key] !== 'object')) {\n dst[key] = src[key];\n }\n });\n }\n return dst;\n};\n\nexport default assignWithDepth;\n", "import { adjust, darken, invert, isDark, lighten } from 'khroma';\nimport {\n oldAttributeBackgroundColorEven,\n oldAttributeBackgroundColorOdd,\n} from './erDiagram-oldHardcodedValues.js';\nimport { mkBorder } from './theme-helpers.js';\n\nclass Theme {\n constructor() {\n /** # Base variables */\n /**\n * - Background - used to know what the background color is of the diagram. This is used for\n * deducing colors for instance line color. Default value is #f4f4f4.\n */\n this.background = '#f4f4f4';\n\n this.primaryColor = '#fff4dd';\n\n this.noteBkgColor = '#fff5ad';\n this.noteTextColor = '#333';\n\n this.THEME_COLOR_LIMIT = 12;\n\n // dark\n\n this.fontFamily = '\"trebuchet ms\", verdana, arial, sans-serif';\n this.fontSize = '16px';\n }\n updateColors() {\n // The || is to make sure that if the variable has been defined by a user override that value is to be used\n\n /* Main */\n this.primaryTextColor = this.primaryTextColor || (this.darkMode ? '#eee' : '#333'); // invert(this.primaryColor);\n this.secondaryColor = this.secondaryColor || adjust(this.primaryColor, { h: -120 });\n this.tertiaryColor = this.tertiaryColor || adjust(this.primaryColor, { h: 180, l: 5 });\n\n this.primaryBorderColor = this.primaryBorderColor || mkBorder(this.primaryColor, this.darkMode);\n this.secondaryBorderColor =\n this.secondaryBorderColor || mkBorder(this.secondaryColor, this.darkMode);\n this.tertiaryBorderColor =\n this.tertiaryBorderColor || mkBorder(this.tertiaryColor, this.darkMode);\n this.noteBorderColor = this.noteBorderColor || mkBorder(this.noteBkgColor, this.darkMode);\n this.noteBkgColor = this.noteBkgColor || '#fff5ad';\n this.noteTextColor = this.noteTextColor || '#333';\n\n this.secondaryTextColor = this.secondaryTextColor || invert(this.secondaryColor);\n this.tertiaryTextColor = this.tertiaryTextColor || invert(this.tertiaryColor);\n this.lineColor = this.lineColor || invert(this.background);\n this.arrowheadColor = this.arrowheadColor || invert(this.background);\n this.textColor = this.textColor || this.primaryTextColor;\n\n // TODO: should this instead default to secondaryBorderColor?\n this.border2 = this.border2 || this.tertiaryBorderColor;\n\n /* Flowchart variables */\n this.nodeBkg = this.nodeBkg || this.primaryColor;\n this.mainBkg = this.mainBkg || this.primaryColor;\n this.nodeBorder = this.nodeBorder || this.primaryBorderColor;\n this.clusterBkg = this.clusterBkg || this.tertiaryColor;\n this.clusterBorder = this.clusterBorder || this.tertiaryBorderColor;\n this.defaultLinkColor = this.defaultLinkColor || this.lineColor;\n this.titleColor = this.titleColor || this.tertiaryTextColor;\n this.edgeLabelBackground =\n this.edgeLabelBackground ||\n (this.darkMode ? darken(this.secondaryColor, 30) : this.secondaryColor);\n this.nodeTextColor = this.nodeTextColor || this.primaryTextColor;\n /* Sequence Diagram variables */\n\n // this.actorBorder = lighten(this.border1, 0.5);\n this.actorBorder = this.actorBorder || this.primaryBorderColor;\n this.actorBkg = this.actorBkg || this.mainBkg;\n this.actorTextColor = this.actorTextColor || this.primaryTextColor;\n this.actorLineColor = this.actorLineColor || this.actorBorder;\n this.labelBoxBkgColor = this.labelBoxBkgColor || this.actorBkg;\n this.signalColor = this.signalColor || this.textColor;\n this.signalTextColor = this.signalTextColor || this.textColor;\n this.labelBoxBorderColor = this.labelBoxBorderColor || this.actorBorder;\n this.labelTextColor = this.labelTextColor || this.actorTextColor;\n this.loopTextColor = this.loopTextColor || this.actorTextColor;\n this.activationBorderColor = this.activationBorderColor || darken(this.secondaryColor, 10);\n this.activationBkgColor = this.activationBkgColor || this.secondaryColor;\n this.sequenceNumberColor = this.sequenceNumberColor || invert(this.lineColor);\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = this.sectionBkgColor || this.tertiaryColor;\n this.altSectionBkgColor = this.altSectionBkgColor || 'white';\n this.sectionBkgColor = this.sectionBkgColor || this.secondaryColor;\n this.sectionBkgColor2 = this.sectionBkgColor2 || this.primaryColor;\n this.excludeBkgColor = this.excludeBkgColor || '#eeeeee';\n this.taskBorderColor = this.taskBorderColor || this.primaryBorderColor;\n this.taskBkgColor = this.taskBkgColor || this.primaryColor;\n this.activeTaskBorderColor = this.activeTaskBorderColor || this.primaryColor;\n this.activeTaskBkgColor = this.activeTaskBkgColor || lighten(this.primaryColor, 23);\n this.gridColor = this.gridColor || 'lightgrey';\n this.doneTaskBkgColor = this.doneTaskBkgColor || 'lightgrey';\n this.doneTaskBorderColor = this.doneTaskBorderColor || 'grey';\n this.critBorderColor = this.critBorderColor || '#ff8888';\n this.critBkgColor = this.critBkgColor || 'red';\n this.todayLineColor = this.todayLineColor || 'red';\n this.vertLineColor = this.vertLineColor || 'navy';\n this.taskTextColor = this.taskTextColor || this.textColor;\n this.taskTextOutsideColor = this.taskTextOutsideColor || this.textColor;\n this.taskTextLightColor = this.taskTextLightColor || this.textColor;\n this.taskTextColor = this.taskTextColor || this.primaryTextColor;\n this.taskTextDarkColor = this.taskTextDarkColor || this.textColor;\n this.taskTextClickableColor = this.taskTextClickableColor || '#003163';\n\n /* Sequence Diagram variables */\n\n this.personBorder = this.personBorder || this.primaryBorderColor;\n this.personBkg = this.personBkg || this.mainBkg;\n\n /* ER diagram */\n\n if (this.darkMode) {\n this.rowOdd = this.rowOdd || darken(this.mainBkg, 5) || '#ffffff';\n this.rowEven = this.rowEven || darken(this.mainBkg, 10);\n } else {\n this.rowOdd = this.rowOdd || lighten(this.mainBkg, 75) || '#ffffff';\n this.rowEven = this.rowEven || lighten(this.mainBkg, 5);\n }\n\n /* state colors */\n this.transitionColor = this.transitionColor || this.lineColor;\n this.transitionLabelColor = this.transitionLabelColor || this.textColor;\n /* The color of the text tables of the states*/\n this.stateLabelColor = this.stateLabelColor || this.stateBkg || this.primaryTextColor;\n\n this.stateBkg = this.stateBkg || this.mainBkg;\n this.labelBackgroundColor = this.labelBackgroundColor || this.stateBkg;\n this.compositeBackground = this.compositeBackground || this.background || this.tertiaryColor;\n this.altBackground = this.altBackground || this.tertiaryColor;\n this.compositeTitleBackground = this.compositeTitleBackground || this.mainBkg;\n this.compositeBorder = this.compositeBorder || this.nodeBorder;\n this.innerEndBackground = this.nodeBorder;\n this.errorBkgColor = this.errorBkgColor || this.tertiaryColor;\n this.errorTextColor = this.errorTextColor || this.tertiaryTextColor;\n this.transitionColor = this.transitionColor || this.lineColor;\n this.specialStateColor = this.lineColor;\n\n /* Color Scale */\n /* Each color-set will have a background, a foreground and a border color */\n this.cScale0 = this.cScale0 || this.primaryColor;\n this.cScale1 = this.cScale1 || this.secondaryColor;\n this.cScale2 = this.cScale2 || this.tertiaryColor;\n this.cScale3 = this.cScale3 || adjust(this.primaryColor, { h: 30 });\n this.cScale4 = this.cScale4 || adjust(this.primaryColor, { h: 60 });\n this.cScale5 = this.cScale5 || adjust(this.primaryColor, { h: 90 });\n this.cScale6 = this.cScale6 || adjust(this.primaryColor, { h: 120 });\n this.cScale7 = this.cScale7 || adjust(this.primaryColor, { h: 150 });\n this.cScale8 = this.cScale8 || adjust(this.primaryColor, { h: 210, l: 150 });\n this.cScale9 = this.cScale9 || adjust(this.primaryColor, { h: 270 });\n this.cScale10 = this.cScale10 || adjust(this.primaryColor, { h: 300 });\n this.cScale11 = this.cScale11 || adjust(this.primaryColor, { h: 330 });\n if (this.darkMode) {\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScale' + i] = darken(this['cScale' + i], 75);\n }\n } else {\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScale' + i] = darken(this['cScale' + i], 25);\n }\n }\n\n // Setup the inverted color for the set\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScaleInv' + i] = this['cScaleInv' + i] || invert(this['cScale' + i]);\n }\n // Setup the peer color for the set, useful for borders\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n if (this.darkMode) {\n this['cScalePeer' + i] = this['cScalePeer' + i] || lighten(this['cScale' + i], 10);\n } else {\n this['cScalePeer' + i] = this['cScalePeer' + i] || darken(this['cScale' + i], 10);\n }\n }\n\n // Setup the label color for the set\n this.scaleLabelColor = this.scaleLabelColor || this.labelTextColor;\n\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScaleLabel' + i] = this['cScaleLabel' + i] || this.scaleLabelColor;\n }\n\n const multiplier = this.darkMode ? -4 : -1;\n for (let i = 0; i < 5; i++) {\n this['surface' + i] =\n this['surface' + i] ||\n adjust(this.mainBkg, { h: 180, s: -15, l: multiplier * (5 + i * 3) });\n this['surfacePeer' + i] =\n this['surfacePeer' + i] ||\n adjust(this.mainBkg, { h: 180, s: -15, l: multiplier * (8 + i * 3) });\n }\n\n /* class */\n this.classText = this.classText || this.textColor;\n\n /* user-journey */\n this.fillType0 = this.fillType0 || this.primaryColor;\n this.fillType1 = this.fillType1 || this.secondaryColor;\n this.fillType2 = this.fillType2 || adjust(this.primaryColor, { h: 64 });\n this.fillType3 = this.fillType3 || adjust(this.secondaryColor, { h: 64 });\n this.fillType4 = this.fillType4 || adjust(this.primaryColor, { h: -64 });\n this.fillType5 = this.fillType5 || adjust(this.secondaryColor, { h: -64 });\n this.fillType6 = this.fillType6 || adjust(this.primaryColor, { h: 128 });\n this.fillType7 = this.fillType7 || adjust(this.secondaryColor, { h: 128 });\n\n /* pie */\n this.pie1 = this.pie1 || this.primaryColor;\n this.pie2 = this.pie2 || this.secondaryColor;\n this.pie3 = this.pie3 || this.tertiaryColor;\n this.pie4 = this.pie4 || adjust(this.primaryColor, { l: -10 });\n this.pie5 = this.pie5 || adjust(this.secondaryColor, { l: -10 });\n this.pie6 = this.pie6 || adjust(this.tertiaryColor, { l: -10 });\n this.pie7 = this.pie7 || adjust(this.primaryColor, { h: +60, l: -10 });\n this.pie8 = this.pie8 || adjust(this.primaryColor, { h: -60, l: -10 });\n this.pie9 = this.pie9 || adjust(this.primaryColor, { h: 120, l: 0 });\n this.pie10 = this.pie10 || adjust(this.primaryColor, { h: +60, l: -20 });\n this.pie11 = this.pie11 || adjust(this.primaryColor, { h: -60, l: -20 });\n this.pie12 = this.pie12 || adjust(this.primaryColor, { h: 120, l: -10 });\n this.pieTitleTextSize = this.pieTitleTextSize || '25px';\n this.pieTitleTextColor = this.pieTitleTextColor || this.taskTextDarkColor;\n this.pieSectionTextSize = this.pieSectionTextSize || '17px';\n this.pieSectionTextColor = this.pieSectionTextColor || this.textColor;\n this.pieLegendTextSize = this.pieLegendTextSize || '17px';\n this.pieLegendTextColor = this.pieLegendTextColor || this.taskTextDarkColor;\n this.pieStrokeColor = this.pieStrokeColor || 'black';\n this.pieStrokeWidth = this.pieStrokeWidth || '2px';\n this.pieOuterStrokeWidth = this.pieOuterStrokeWidth || '2px';\n this.pieOuterStrokeColor = this.pieOuterStrokeColor || 'black';\n this.pieOpacity = this.pieOpacity || '0.7';\n\n /* radar */\n this.radar = {\n axisColor: this.radar?.axisColor || this.lineColor,\n axisStrokeWidth: this.radar?.axisStrokeWidth || 2,\n axisLabelFontSize: this.radar?.axisLabelFontSize || 12,\n curveOpacity: this.radar?.curveOpacity || 0.5,\n curveStrokeWidth: this.radar?.curveStrokeWidth || 2,\n graticuleColor: this.radar?.graticuleColor || '#DEDEDE',\n graticuleStrokeWidth: this.radar?.graticuleStrokeWidth || 1,\n graticuleOpacity: this.radar?.graticuleOpacity || 0.3,\n legendBoxSize: this.radar?.legendBoxSize || 12,\n legendFontSize: this.radar?.legendFontSize || 12,\n };\n\n /* architecture */\n this.archEdgeColor = this.archEdgeColor || '#777';\n this.archEdgeArrowColor = this.archEdgeArrowColor || '#777';\n this.archEdgeWidth = this.archEdgeWidth || '3';\n this.archGroupBorderColor = this.archGroupBorderColor || '#000';\n this.archGroupBorderWidth = this.archGroupBorderWidth || '2px';\n\n /* quadrant-graph */\n this.quadrant1Fill = this.quadrant1Fill || this.primaryColor;\n this.quadrant2Fill = this.quadrant2Fill || adjust(this.primaryColor, { r: 5, g: 5, b: 5 });\n this.quadrant3Fill = this.quadrant3Fill || adjust(this.primaryColor, { r: 10, g: 10, b: 10 });\n this.quadrant4Fill = this.quadrant4Fill || adjust(this.primaryColor, { r: 15, g: 15, b: 15 });\n this.quadrant1TextFill = this.quadrant1TextFill || this.primaryTextColor;\n this.quadrant2TextFill =\n this.quadrant2TextFill || adjust(this.primaryTextColor, { r: -5, g: -5, b: -5 });\n this.quadrant3TextFill =\n this.quadrant3TextFill || adjust(this.primaryTextColor, { r: -10, g: -10, b: -10 });\n this.quadrant4TextFill =\n this.quadrant4TextFill || adjust(this.primaryTextColor, { r: -15, g: -15, b: -15 });\n this.quadrantPointFill =\n this.quadrantPointFill || isDark(this.quadrant1Fill)\n ? lighten(this.quadrant1Fill)\n : darken(this.quadrant1Fill);\n this.quadrantPointTextFill = this.quadrantPointTextFill || this.primaryTextColor;\n this.quadrantXAxisTextFill = this.quadrantXAxisTextFill || this.primaryTextColor;\n this.quadrantYAxisTextFill = this.quadrantYAxisTextFill || this.primaryTextColor;\n this.quadrantInternalBorderStrokeFill =\n this.quadrantInternalBorderStrokeFill || this.primaryBorderColor;\n this.quadrantExternalBorderStrokeFill =\n this.quadrantExternalBorderStrokeFill || this.primaryBorderColor;\n this.quadrantTitleFill = this.quadrantTitleFill || this.primaryTextColor;\n\n /* xychart */\n this.xyChart = {\n backgroundColor: this.xyChart?.backgroundColor || this.background,\n titleColor: this.xyChart?.titleColor || this.primaryTextColor,\n xAxisTitleColor: this.xyChart?.xAxisTitleColor || this.primaryTextColor,\n xAxisLabelColor: this.xyChart?.xAxisLabelColor || this.primaryTextColor,\n xAxisTickColor: this.xyChart?.xAxisTickColor || this.primaryTextColor,\n xAxisLineColor: this.xyChart?.xAxisLineColor || this.primaryTextColor,\n yAxisTitleColor: this.xyChart?.yAxisTitleColor || this.primaryTextColor,\n yAxisLabelColor: this.xyChart?.yAxisLabelColor || this.primaryTextColor,\n yAxisTickColor: this.xyChart?.yAxisTickColor || this.primaryTextColor,\n yAxisLineColor: this.xyChart?.yAxisLineColor || this.primaryTextColor,\n plotColorPalette:\n this.xyChart?.plotColorPalette ||\n '#FFF4DD,#FFD8B1,#FFA07A,#ECEFF1,#D6DBDF,#C3E0A8,#FFB6A4,#FFD74D,#738FA7,#FFFFF0',\n };\n\n /* requirement-diagram */\n this.requirementBackground = this.requirementBackground || this.primaryColor;\n this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor;\n this.requirementBorderSize = this.requirementBorderSize || '1';\n this.requirementTextColor = this.requirementTextColor || this.primaryTextColor;\n this.relationColor = this.relationColor || this.lineColor;\n this.relationLabelBackground =\n this.relationLabelBackground ||\n (this.darkMode ? darken(this.secondaryColor, 30) : this.secondaryColor);\n this.relationLabelColor = this.relationLabelColor || this.actorTextColor;\n\n /* git */\n this.git0 = this.git0 || this.primaryColor;\n this.git1 = this.git1 || this.secondaryColor;\n this.git2 = this.git2 || this.tertiaryColor;\n this.git3 = this.git3 || adjust(this.primaryColor, { h: -30 });\n this.git4 = this.git4 || adjust(this.primaryColor, { h: -60 });\n this.git5 = this.git5 || adjust(this.primaryColor, { h: -90 });\n this.git6 = this.git6 || adjust(this.primaryColor, { h: +60 });\n this.git7 = this.git7 || adjust(this.primaryColor, { h: +120 });\n if (this.darkMode) {\n this.git0 = lighten(this.git0, 25);\n this.git1 = lighten(this.git1, 25);\n this.git2 = lighten(this.git2, 25);\n this.git3 = lighten(this.git3, 25);\n this.git4 = lighten(this.git4, 25);\n this.git5 = lighten(this.git5, 25);\n this.git6 = lighten(this.git6, 25);\n this.git7 = lighten(this.git7, 25);\n } else {\n this.git0 = darken(this.git0, 25);\n this.git1 = darken(this.git1, 25);\n this.git2 = darken(this.git2, 25);\n this.git3 = darken(this.git3, 25);\n this.git4 = darken(this.git4, 25);\n this.git5 = darken(this.git5, 25);\n this.git6 = darken(this.git6, 25);\n this.git7 = darken(this.git7, 25);\n }\n this.gitInv0 = this.gitInv0 || invert(this.git0);\n this.gitInv1 = this.gitInv1 || invert(this.git1);\n this.gitInv2 = this.gitInv2 || invert(this.git2);\n this.gitInv3 = this.gitInv3 || invert(this.git3);\n this.gitInv4 = this.gitInv4 || invert(this.git4);\n this.gitInv5 = this.gitInv5 || invert(this.git5);\n this.gitInv6 = this.gitInv6 || invert(this.git6);\n this.gitInv7 = this.gitInv7 || invert(this.git7);\n this.branchLabelColor =\n this.branchLabelColor || (this.darkMode ? 'black' : this.labelTextColor);\n this.gitBranchLabel0 = this.gitBranchLabel0 || this.branchLabelColor;\n this.gitBranchLabel1 = this.gitBranchLabel1 || this.branchLabelColor;\n this.gitBranchLabel2 = this.gitBranchLabel2 || this.branchLabelColor;\n this.gitBranchLabel3 = this.gitBranchLabel3 || this.branchLabelColor;\n this.gitBranchLabel4 = this.gitBranchLabel4 || this.branchLabelColor;\n this.gitBranchLabel5 = this.gitBranchLabel5 || this.branchLabelColor;\n this.gitBranchLabel6 = this.gitBranchLabel6 || this.branchLabelColor;\n this.gitBranchLabel7 = this.gitBranchLabel7 || this.branchLabelColor;\n\n this.tagLabelColor = this.tagLabelColor || this.primaryTextColor;\n this.tagLabelBackground = this.tagLabelBackground || this.primaryColor;\n this.tagLabelBorder = this.tagBorder || this.primaryBorderColor;\n this.tagLabelFontSize = this.tagLabelFontSize || '10px';\n this.commitLabelColor = this.commitLabelColor || this.secondaryTextColor;\n this.commitLabelBackground = this.commitLabelBackground || this.secondaryColor;\n this.commitLabelFontSize = this.commitLabelFontSize || '10px';\n\n /* -------------------------------------------------- */\n /* EntityRelationship diagrams */\n\n this.attributeBackgroundColorOdd =\n this.attributeBackgroundColorOdd || oldAttributeBackgroundColorOdd;\n this.attributeBackgroundColorEven =\n this.attributeBackgroundColorEven || oldAttributeBackgroundColorEven;\n /* -------------------------------------------------- */\n }\n calculate(overrides) {\n if (typeof overrides !== 'object') {\n // Calculate colors form base colors\n this.updateColors();\n return;\n }\n\n const keys = Object.keys(overrides);\n\n // Copy values from overrides, this is mainly for base colors\n keys.forEach((k) => {\n this[k] = overrides[k];\n });\n\n // Calculate colors form base colors\n this.updateColors();\n // Copy values from overrides again in case of an override of derived value\n keys.forEach((k) => {\n this[k] = overrides[k];\n });\n }\n}\n\nexport const getThemeVariables = (userOverrides) => {\n const theme = new Theme();\n theme.calculate(userOverrides);\n return theme;\n};\n", "/**\n * Values that have been hardcoded in src/diagrams/er/styles.js. These can be used by\n * theme-_._ files to maintain display styles until themes, styles, renderers are revised. --\n * 2022-09-22\n */\nexport const oldAttributeBackgroundColorOdd = '#ffffff';\nexport const oldAttributeBackgroundColorEven = '#f2f2f2';\n", "import { adjust } from 'khroma';\n\nexport const mkBorder = (col, darkMode) =>\n darkMode ? adjust(col, { s: -40, l: 10 }) : adjust(col, { s: -40, l: -10 });\n", "import { adjust, darken, invert, isDark, lighten, rgba } from 'khroma';\nimport { mkBorder } from './theme-helpers.js';\n\nclass Theme {\n constructor() {\n this.background = '#333';\n this.primaryColor = '#1f2020';\n this.secondaryColor = lighten(this.primaryColor, 16);\n this.tertiaryColor = adjust(this.primaryColor, { h: -160 });\n this.primaryBorderColor = invert(this.background);\n this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode);\n this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode);\n this.primaryTextColor = invert(this.primaryColor);\n this.secondaryTextColor = invert(this.secondaryColor);\n this.tertiaryTextColor = invert(this.tertiaryColor);\n this.lineColor = invert(this.background);\n this.textColor = invert(this.background);\n\n this.mainBkg = '#1f2020';\n this.secondBkg = 'calculated';\n this.mainContrastColor = 'lightgrey';\n this.darkTextColor = lighten(invert('#323D47'), 10);\n this.lineColor = 'calculated';\n this.border1 = '#ccc';\n this.border2 = rgba(255, 255, 255, 0.25);\n this.arrowheadColor = 'calculated';\n this.fontFamily = '\"trebuchet ms\", verdana, arial, sans-serif';\n this.fontSize = '16px';\n this.labelBackground = '#181818';\n this.textColor = '#ccc';\n this.THEME_COLOR_LIMIT = 12;\n\n /* Flowchart variables */\n this.nodeBkg = 'calculated';\n this.nodeBorder = 'calculated';\n this.clusterBkg = 'calculated';\n this.clusterBorder = 'calculated';\n this.defaultLinkColor = 'calculated';\n this.titleColor = '#F9FFFE';\n this.edgeLabelBackground = 'calculated';\n\n /* Sequence Diagram variables */\n\n this.actorBorder = 'calculated';\n this.actorBkg = 'calculated';\n this.actorTextColor = 'calculated';\n this.actorLineColor = 'calculated';\n this.signalColor = 'calculated';\n this.signalTextColor = 'calculated';\n this.labelBoxBkgColor = 'calculated';\n this.labelBoxBorderColor = 'calculated';\n this.labelTextColor = 'calculated';\n this.loopTextColor = 'calculated';\n this.noteBorderColor = 'calculated';\n this.noteBkgColor = '#fff5ad';\n this.noteTextColor = 'calculated';\n this.activationBorderColor = 'calculated';\n this.activationBkgColor = 'calculated';\n this.sequenceNumberColor = 'black';\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = darken('#EAE8D9', 30);\n this.altSectionBkgColor = 'calculated';\n this.sectionBkgColor2 = '#EAE8D9';\n this.excludeBkgColor = darken(this.sectionBkgColor, 10);\n this.taskBorderColor = rgba(255, 255, 255, 70);\n this.taskBkgColor = 'calculated';\n this.taskTextColor = 'calculated';\n this.taskTextLightColor = 'calculated';\n this.taskTextOutsideColor = 'calculated';\n this.taskTextClickableColor = '#003163';\n this.activeTaskBorderColor = rgba(255, 255, 255, 50);\n this.activeTaskBkgColor = '#81B1DB';\n this.gridColor = 'calculated';\n this.doneTaskBkgColor = 'calculated';\n this.doneTaskBorderColor = 'grey';\n this.critBorderColor = '#E83737';\n this.critBkgColor = '#E83737';\n this.taskTextDarkColor = 'calculated';\n this.todayLineColor = '#DB5757';\n this.vertLineColor = '#00BFFF';\n\n /* C4 Context Diagram variables */\n this.personBorder = this.primaryBorderColor;\n this.personBkg = this.mainBkg;\n\n /* Architecture Diagram variables */\n this.archEdgeColor = 'calculated';\n this.archEdgeArrowColor = 'calculated';\n this.archEdgeWidth = '3';\n this.archGroupBorderColor = this.primaryBorderColor;\n this.archGroupBorderWidth = '2px';\n\n /* Entity Relationship variables */\n this.rowOdd = this.rowOdd || lighten(this.mainBkg, 5) || '#ffffff';\n this.rowEven = this.rowEven || darken(this.mainBkg, 10);\n\n /* state colors */\n this.labelColor = 'calculated';\n\n this.errorBkgColor = '#a44141';\n this.errorTextColor = '#ddd';\n }\n updateColors() {\n this.secondBkg = lighten(this.mainBkg, 16);\n this.lineColor = this.mainContrastColor;\n this.arrowheadColor = this.mainContrastColor;\n /* Flowchart variables */\n\n this.nodeBkg = this.mainBkg;\n this.nodeBorder = this.border1;\n this.clusterBkg = this.secondBkg;\n this.clusterBorder = this.border2;\n this.defaultLinkColor = this.lineColor;\n this.edgeLabelBackground = lighten(this.labelBackground, 25);\n\n /* Sequence Diagram variables */\n\n this.actorBorder = this.border1;\n this.actorBkg = this.mainBkg;\n this.actorTextColor = this.mainContrastColor;\n this.actorLineColor = this.actorBorder;\n this.signalColor = this.mainContrastColor;\n this.signalTextColor = this.mainContrastColor;\n this.labelBoxBkgColor = this.actorBkg;\n this.labelBoxBorderColor = this.actorBorder;\n this.labelTextColor = this.mainContrastColor;\n this.loopTextColor = this.mainContrastColor;\n this.noteBorderColor = this.secondaryBorderColor;\n this.noteBkgColor = this.secondBkg;\n this.noteTextColor = this.secondaryTextColor;\n this.activationBorderColor = this.border1;\n this.activationBkgColor = this.secondBkg;\n\n /* Gantt chart variables */\n\n this.altSectionBkgColor = this.background;\n this.taskBkgColor = lighten(this.mainBkg, 23);\n this.taskTextColor = this.darkTextColor;\n this.taskTextLightColor = this.mainContrastColor;\n this.taskTextOutsideColor = this.taskTextLightColor;\n this.gridColor = this.mainContrastColor;\n this.doneTaskBkgColor = this.mainContrastColor;\n this.taskTextDarkColor = this.darkTextColor;\n\n /* Architecture Diagram variables */\n this.archEdgeColor = this.lineColor;\n this.archEdgeArrowColor = this.lineColor;\n\n /* state colors */\n this.transitionColor = this.transitionColor || this.lineColor;\n this.transitionLabelColor = this.transitionLabelColor || this.textColor;\n this.stateLabelColor = this.stateLabelColor || this.stateBkg || this.primaryTextColor;\n this.stateBkg = this.stateBkg || this.mainBkg;\n this.labelBackgroundColor = this.labelBackgroundColor || this.stateBkg;\n this.compositeBackground = this.compositeBackground || this.background || this.tertiaryColor;\n this.altBackground = this.altBackground || '#555';\n this.compositeTitleBackground = this.compositeTitleBackground || this.mainBkg;\n this.compositeBorder = this.compositeBorder || this.nodeBorder;\n this.innerEndBackground = this.primaryBorderColor;\n this.specialStateColor = '#f4f4f4'; // this.lineColor;\n\n this.errorBkgColor = this.errorBkgColor || this.tertiaryColor;\n this.errorTextColor = this.errorTextColor || this.tertiaryTextColor;\n\n this.fillType0 = this.primaryColor;\n this.fillType1 = this.secondaryColor;\n this.fillType2 = adjust(this.primaryColor, { h: 64 });\n this.fillType3 = adjust(this.secondaryColor, { h: 64 });\n this.fillType4 = adjust(this.primaryColor, { h: -64 });\n this.fillType5 = adjust(this.secondaryColor, { h: -64 });\n this.fillType6 = adjust(this.primaryColor, { h: 128 });\n this.fillType7 = adjust(this.secondaryColor, { h: 128 });\n\n /* cScale */\n this.cScale1 = this.cScale1 || '#0b0000';\n this.cScale2 = this.cScale2 || '#4d1037';\n this.cScale3 = this.cScale3 || '#3f5258';\n this.cScale4 = this.cScale4 || '#4f2f1b';\n this.cScale5 = this.cScale5 || '#6e0a0a';\n this.cScale6 = this.cScale6 || '#3b0048';\n this.cScale7 = this.cScale7 || '#995a01';\n this.cScale8 = this.cScale8 || '#154706';\n this.cScale9 = this.cScale9 || '#161722';\n this.cScale10 = this.cScale10 || '#00296f';\n this.cScale11 = this.cScale11 || '#01629c';\n this.cScale12 = this.cScale12 || '#010029';\n\n /* Color Scale */\n /* Each color-set will have a background, a foreground and a border color */\n this.cScale0 = this.cScale0 || this.primaryColor;\n this.cScale1 = this.cScale1 || this.secondaryColor;\n this.cScale2 = this.cScale2 || this.tertiaryColor;\n this.cScale3 = this.cScale3 || adjust(this.primaryColor, { h: 30 });\n this.cScale4 = this.cScale4 || adjust(this.primaryColor, { h: 60 });\n this.cScale5 = this.cScale5 || adjust(this.primaryColor, { h: 90 });\n this.cScale6 = this.cScale6 || adjust(this.primaryColor, { h: 120 });\n this.cScale7 = this.cScale7 || adjust(this.primaryColor, { h: 150 });\n this.cScale8 = this.cScale8 || adjust(this.primaryColor, { h: 210 });\n this.cScale9 = this.cScale9 || adjust(this.primaryColor, { h: 270 });\n this.cScale10 = this.cScale10 || adjust(this.primaryColor, { h: 300 });\n this.cScale11 = this.cScale11 || adjust(this.primaryColor, { h: 330 });\n\n // Setup the inverted color for the set\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScaleInv' + i] = this['cScaleInv' + i] || invert(this['cScale' + i]);\n }\n // Setup the peer color for the set, useful for borders\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScalePeer' + i] = this['cScalePeer' + i] || lighten(this['cScale' + i], 10);\n }\n\n for (let i = 0; i < 5; i++) {\n this['surface' + i] =\n this['surface' + i] || adjust(this.mainBkg, { h: 30, s: -30, l: -(-10 + i * 4) });\n this['surfacePeer' + i] =\n this['surfacePeer' + i] || adjust(this.mainBkg, { h: 30, s: -30, l: -(-7 + i * 4) });\n }\n\n // Setup the label color for the set\n this.scaleLabelColor = this.scaleLabelColor || (this.darkMode ? 'black' : this.labelTextColor);\n\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScaleLabel' + i] = this['cScaleLabel' + i] || this.scaleLabelColor;\n }\n\n /* Pie diagram */\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['pie' + i] = this['cScale' + i];\n }\n this.pieTitleTextSize = this.pieTitleTextSize || '25px';\n this.pieTitleTextColor = this.pieTitleTextColor || this.taskTextDarkColor;\n this.pieSectionTextSize = this.pieSectionTextSize || '17px';\n this.pieSectionTextColor = this.pieSectionTextColor || this.textColor;\n this.pieLegendTextSize = this.pieLegendTextSize || '17px';\n this.pieLegendTextColor = this.pieLegendTextColor || this.taskTextDarkColor;\n this.pieStrokeColor = this.pieStrokeColor || 'black';\n this.pieStrokeWidth = this.pieStrokeWidth || '2px';\n this.pieOuterStrokeWidth = this.pieOuterStrokeWidth || '2px';\n this.pieOuterStrokeColor = this.pieOuterStrokeColor || 'black';\n this.pieOpacity = this.pieOpacity || '0.7';\n\n /* quadrant-graph */\n this.quadrant1Fill = this.quadrant1Fill || this.primaryColor;\n this.quadrant2Fill = this.quadrant2Fill || adjust(this.primaryColor, { r: 5, g: 5, b: 5 });\n this.quadrant3Fill = this.quadrant3Fill || adjust(this.primaryColor, { r: 10, g: 10, b: 10 });\n this.quadrant4Fill = this.quadrant4Fill || adjust(this.primaryColor, { r: 15, g: 15, b: 15 });\n this.quadrant1TextFill = this.quadrant1TextFill || this.primaryTextColor;\n this.quadrant2TextFill =\n this.quadrant2TextFill || adjust(this.primaryTextColor, { r: -5, g: -5, b: -5 });\n this.quadrant3TextFill =\n this.quadrant3TextFill || adjust(this.primaryTextColor, { r: -10, g: -10, b: -10 });\n this.quadrant4TextFill =\n this.quadrant4TextFill || adjust(this.primaryTextColor, { r: -15, g: -15, b: -15 });\n this.quadrantPointFill =\n this.quadrantPointFill || isDark(this.quadrant1Fill)\n ? lighten(this.quadrant1Fill)\n : darken(this.quadrant1Fill);\n this.quadrantPointTextFill = this.quadrantPointTextFill || this.primaryTextColor;\n this.quadrantXAxisTextFill = this.quadrantXAxisTextFill || this.primaryTextColor;\n this.quadrantYAxisTextFill = this.quadrantYAxisTextFill || this.primaryTextColor;\n this.quadrantInternalBorderStrokeFill =\n this.quadrantInternalBorderStrokeFill || this.primaryBorderColor;\n this.quadrantExternalBorderStrokeFill =\n this.quadrantExternalBorderStrokeFill || this.primaryBorderColor;\n this.quadrantTitleFill = this.quadrantTitleFill || this.primaryTextColor;\n\n /* xychart */\n this.xyChart = {\n backgroundColor: this.xyChart?.backgroundColor || this.background,\n titleColor: this.xyChart?.titleColor || this.primaryTextColor,\n xAxisTitleColor: this.xyChart?.xAxisTitleColor || this.primaryTextColor,\n xAxisLabelColor: this.xyChart?.xAxisLabelColor || this.primaryTextColor,\n xAxisTickColor: this.xyChart?.xAxisTickColor || this.primaryTextColor,\n xAxisLineColor: this.xyChart?.xAxisLineColor || this.primaryTextColor,\n yAxisTitleColor: this.xyChart?.yAxisTitleColor || this.primaryTextColor,\n yAxisLabelColor: this.xyChart?.yAxisLabelColor || this.primaryTextColor,\n yAxisTickColor: this.xyChart?.yAxisTickColor || this.primaryTextColor,\n yAxisLineColor: this.xyChart?.yAxisLineColor || this.primaryTextColor,\n plotColorPalette:\n this.xyChart?.plotColorPalette ||\n '#3498db,#2ecc71,#e74c3c,#f1c40f,#bdc3c7,#ffffff,#34495e,#9b59b6,#1abc9c,#e67e22',\n };\n\n this.packet = {\n startByteColor: this.primaryTextColor,\n endByteColor: this.primaryTextColor,\n labelColor: this.primaryTextColor,\n titleColor: this.primaryTextColor,\n blockStrokeColor: this.primaryTextColor,\n blockFillColor: this.background,\n };\n\n /* radar */\n this.radar = {\n axisColor: this.radar?.axisColor || this.lineColor,\n axisStrokeWidth: this.radar?.axisStrokeWidth || 2,\n axisLabelFontSize: this.radar?.axisLabelFontSize || 12,\n curveOpacity: this.radar?.curveOpacity || 0.5,\n curveStrokeWidth: this.radar?.curveStrokeWidth || 2,\n graticuleColor: this.radar?.graticuleColor || '#DEDEDE',\n graticuleStrokeWidth: this.radar?.graticuleStrokeWidth || 1,\n graticuleOpacity: this.radar?.graticuleOpacity || 0.3,\n legendBoxSize: this.radar?.legendBoxSize || 12,\n legendFontSize: this.radar?.legendFontSize || 12,\n };\n\n /* class */\n this.classText = this.primaryTextColor;\n\n /* requirement-diagram */\n this.requirementBackground = this.requirementBackground || this.primaryColor;\n this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor;\n this.requirementBorderSize = this.requirementBorderSize || '1';\n this.requirementTextColor = this.requirementTextColor || this.primaryTextColor;\n this.relationColor = this.relationColor || this.lineColor;\n this.relationLabelBackground =\n this.relationLabelBackground ||\n (this.darkMode ? darken(this.secondaryColor, 30) : this.secondaryColor);\n this.relationLabelColor = this.relationLabelColor || this.actorTextColor;\n\n /* git */\n this.git0 = lighten(this.secondaryColor, 20);\n this.git1 = lighten(this.pie2 || this.secondaryColor, 20);\n this.git2 = lighten(this.pie3 || this.tertiaryColor, 20);\n this.git3 = lighten(this.pie4 || adjust(this.primaryColor, { h: -30 }), 20);\n this.git4 = lighten(this.pie5 || adjust(this.primaryColor, { h: -60 }), 20);\n this.git5 = lighten(this.pie6 || adjust(this.primaryColor, { h: -90 }), 10);\n this.git6 = lighten(this.pie7 || adjust(this.primaryColor, { h: +60 }), 10);\n this.git7 = lighten(this.pie8 || adjust(this.primaryColor, { h: +120 }), 20);\n this.gitInv0 = this.gitInv0 || invert(this.git0);\n this.gitInv1 = this.gitInv1 || invert(this.git1);\n this.gitInv2 = this.gitInv2 || invert(this.git2);\n this.gitInv3 = this.gitInv3 || invert(this.git3);\n this.gitInv4 = this.gitInv4 || invert(this.git4);\n this.gitInv5 = this.gitInv5 || invert(this.git5);\n this.gitInv6 = this.gitInv6 || invert(this.git6);\n this.gitInv7 = this.gitInv7 || invert(this.git7);\n this.gitBranchLabel0 = this.gitBranchLabel0 || invert(this.labelTextColor);\n this.gitBranchLabel1 = this.gitBranchLabel1 || this.labelTextColor;\n this.gitBranchLabel2 = this.gitBranchLabel2 || this.labelTextColor;\n this.gitBranchLabel3 = this.gitBranchLabel3 || invert(this.labelTextColor);\n this.gitBranchLabel4 = this.gitBranchLabel4 || this.labelTextColor;\n this.gitBranchLabel5 = this.gitBranchLabel5 || this.labelTextColor;\n this.gitBranchLabel6 = this.gitBranchLabel6 || this.labelTextColor;\n this.gitBranchLabel7 = this.gitBranchLabel7 || this.labelTextColor;\n\n this.tagLabelColor = this.tagLabelColor || this.primaryTextColor;\n this.tagLabelBackground = this.tagLabelBackground || this.primaryColor;\n this.tagLabelBorder = this.tagBorder || this.primaryBorderColor;\n this.tagLabelFontSize = this.tagLabelFontSize || '10px';\n this.commitLabelColor = this.commitLabelColor || this.secondaryTextColor;\n this.commitLabelBackground = this.commitLabelBackground || this.secondaryColor;\n this.commitLabelFontSize = this.commitLabelFontSize || '10px';\n\n /* -------------------------------------------------- */\n /* EntityRelationship diagrams */\n\n this.attributeBackgroundColorOdd =\n this.attributeBackgroundColorOdd || lighten(this.background, 12);\n this.attributeBackgroundColorEven =\n this.attributeBackgroundColorEven || lighten(this.background, 2);\n /* -------------------------------------------------- */\n\n this.nodeBorder = this.nodeBorder || '#999';\n }\n calculate(overrides) {\n if (typeof overrides !== 'object') {\n // Calculate colors form base colors\n this.updateColors();\n return;\n }\n\n const keys = Object.keys(overrides);\n\n // Copy values from overrides, this is mainly for base colors\n keys.forEach((k) => {\n this[k] = overrides[k];\n });\n\n // Calculate colors form base colors\n this.updateColors();\n // Copy values from overrides again in case of an override of derived value\n keys.forEach((k) => {\n this[k] = overrides[k];\n });\n }\n}\n\nexport const getThemeVariables = (userOverrides) => {\n const theme = new Theme();\n theme.calculate(userOverrides);\n return theme;\n};\n", "import { invert, lighten, rgba, adjust, darken, isDark } from 'khroma';\nimport { mkBorder } from './theme-helpers.js';\nimport {\n oldAttributeBackgroundColorEven,\n oldAttributeBackgroundColorOdd,\n} from './erDiagram-oldHardcodedValues.js';\n\nclass Theme {\n constructor() {\n /* Base variables */\n this.background = '#f4f4f4';\n this.primaryColor = '#ECECFF';\n\n this.secondaryColor = adjust(this.primaryColor, { h: 120 });\n this.secondaryColor = '#ffffde';\n this.tertiaryColor = adjust(this.primaryColor, { h: -160 });\n this.primaryBorderColor = mkBorder(this.primaryColor, this.darkMode);\n this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode);\n this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode);\n // this.noteBorderColor = mkBorder(this.noteBkgColor, this.darkMode);\n\n this.primaryTextColor = invert(this.primaryColor);\n this.secondaryTextColor = invert(this.secondaryColor);\n this.tertiaryTextColor = invert(this.tertiaryColor);\n this.lineColor = invert(this.background);\n this.textColor = invert(this.background);\n\n this.background = 'white';\n this.mainBkg = '#ECECFF';\n this.secondBkg = '#ffffde';\n this.lineColor = '#333333';\n this.border1 = '#9370DB';\n this.border2 = '#aaaa33';\n this.arrowheadColor = '#333333';\n this.fontFamily = '\"trebuchet ms\", verdana, arial, sans-serif';\n this.fontSize = '16px';\n this.labelBackground = 'rgba(232,232,232, 0.8)';\n this.textColor = '#333';\n this.THEME_COLOR_LIMIT = 12;\n\n /* Flowchart variables */\n\n this.nodeBkg = 'calculated';\n this.nodeBorder = 'calculated';\n this.clusterBkg = 'calculated';\n this.clusterBorder = 'calculated';\n this.defaultLinkColor = 'calculated';\n this.titleColor = 'calculated';\n this.edgeLabelBackground = 'calculated';\n\n /* Sequence Diagram variables */\n\n this.actorBorder = 'calculated';\n this.actorBkg = 'calculated';\n this.actorTextColor = 'black';\n this.actorLineColor = 'calculated';\n this.signalColor = 'calculated';\n this.signalTextColor = 'calculated';\n this.labelBoxBkgColor = 'calculated';\n this.labelBoxBorderColor = 'calculated';\n this.labelTextColor = 'calculated';\n this.loopTextColor = 'calculated';\n this.noteBorderColor = 'calculated';\n this.noteBkgColor = '#fff5ad';\n this.noteTextColor = 'calculated';\n this.activationBorderColor = '#666';\n this.activationBkgColor = '#f4f4f4';\n this.sequenceNumberColor = 'white';\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = 'calculated';\n this.altSectionBkgColor = 'calculated';\n this.sectionBkgColor2 = 'calculated';\n this.excludeBkgColor = '#eeeeee';\n this.taskBorderColor = 'calculated';\n this.taskBkgColor = 'calculated';\n this.taskTextLightColor = 'calculated';\n this.taskTextColor = this.taskTextLightColor;\n this.taskTextDarkColor = 'calculated';\n this.taskTextOutsideColor = this.taskTextDarkColor;\n this.taskTextClickableColor = 'calculated';\n this.activeTaskBorderColor = 'calculated';\n this.activeTaskBkgColor = 'calculated';\n this.gridColor = 'calculated';\n this.doneTaskBkgColor = 'calculated';\n this.doneTaskBorderColor = 'calculated';\n this.critBorderColor = 'calculated';\n this.critBkgColor = 'calculated';\n this.todayLineColor = 'calculated';\n this.vertLineColor = 'calculated';\n\n this.sectionBkgColor = rgba(102, 102, 255, 0.49);\n this.altSectionBkgColor = 'white';\n this.sectionBkgColor2 = '#fff400';\n this.taskBorderColor = '#534fbc';\n this.taskBkgColor = '#8a90dd';\n this.taskTextLightColor = 'white';\n this.taskTextColor = 'calculated';\n this.taskTextDarkColor = 'black';\n this.taskTextOutsideColor = 'calculated';\n this.taskTextClickableColor = '#003163';\n this.activeTaskBorderColor = '#534fbc';\n this.activeTaskBkgColor = '#bfc7ff';\n this.gridColor = 'lightgrey';\n this.doneTaskBkgColor = 'lightgrey';\n this.doneTaskBorderColor = 'grey';\n this.critBorderColor = '#ff8888';\n this.critBkgColor = 'red';\n this.todayLineColor = 'red';\n this.vertLineColor = 'navy';\n\n /* C4 Context Diagram variables */\n this.personBorder = this.primaryBorderColor;\n this.personBkg = this.mainBkg;\n\n /* Architecture Diagram variables */\n this.archEdgeColor = 'calculated';\n this.archEdgeArrowColor = 'calculated';\n this.archEdgeWidth = '3';\n this.archGroupBorderColor = this.primaryBorderColor;\n this.archGroupBorderWidth = '2px';\n\n /* Entity Relationship variables */\n this.rowOdd = 'calculated';\n this.rowEven = 'calculated';\n\n /* state colors */\n this.labelColor = 'black';\n this.errorBkgColor = '#552222';\n this.errorTextColor = '#552222';\n this.updateColors();\n }\n updateColors() {\n /* Color Scale */\n /* Each color-set will have a background, a foreground and a border color */\n\n this.cScale0 = this.cScale0 || this.primaryColor;\n this.cScale1 = this.cScale1 || this.secondaryColor;\n this.cScale2 = this.cScale2 || this.tertiaryColor;\n this.cScale3 = this.cScale3 || adjust(this.primaryColor, { h: 30 });\n this.cScale4 = this.cScale4 || adjust(this.primaryColor, { h: 60 });\n this.cScale5 = this.cScale5 || adjust(this.primaryColor, { h: 90 });\n this.cScale6 = this.cScale6 || adjust(this.primaryColor, { h: 120 });\n this.cScale7 = this.cScale7 || adjust(this.primaryColor, { h: 150 });\n this.cScale8 = this.cScale8 || adjust(this.primaryColor, { h: 210 });\n this.cScale9 = this.cScale9 || adjust(this.primaryColor, { h: 270 });\n this.cScale10 = this.cScale10 || adjust(this.primaryColor, { h: 300 });\n this.cScale11 = this.cScale11 || adjust(this.primaryColor, { h: 330 });\n this['cScalePeer' + 1] = this['cScalePeer' + 1] || darken(this.secondaryColor, 45);\n this['cScalePeer' + 2] = this['cScalePeer' + 2] || darken(this.tertiaryColor, 40);\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n // Setup the peer color for the set, useful for borders\n this['cScale' + i] = darken(this['cScale' + i], 10);\n this['cScalePeer' + i] = this['cScalePeer' + i] || darken(this['cScale' + i], 25);\n }\n // Setup the inverted color for the set\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScaleInv' + i] = this['cScaleInv' + i] || adjust(this['cScale' + i], { h: 180 });\n }\n\n for (let i = 0; i < 5; i++) {\n this['surface' + i] = this['surface' + i] || adjust(this.mainBkg, { h: 30, l: -(5 + i * 5) });\n this['surfacePeer' + i] =\n this['surfacePeer' + i] || adjust(this.mainBkg, { h: 30, l: -(7 + i * 5) });\n }\n // Setup the label color for the set\n this.scaleLabelColor =\n this.scaleLabelColor !== 'calculated' && this.scaleLabelColor\n ? this.scaleLabelColor\n : this.labelTextColor;\n\n if (this.labelTextColor !== 'calculated') {\n this.cScaleLabel0 = this.cScaleLabel0 || invert(this.labelTextColor);\n this.cScaleLabel3 = this.cScaleLabel3 || invert(this.labelTextColor);\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScaleLabel' + i] = this['cScaleLabel' + i] || this.labelTextColor;\n }\n }\n\n /* Flowchart variables */\n this.nodeBkg = this.mainBkg;\n this.nodeBorder = this.border1; // border 1\n this.clusterBkg = this.secondBkg;\n this.clusterBorder = this.border2;\n this.defaultLinkColor = this.lineColor;\n this.titleColor = this.textColor;\n this.edgeLabelBackground = this.labelBackground;\n\n /* Sequence Diagram variables */\n\n // this.actorBorder = lighten(this.border1, 0.5);\n this.actorBorder = lighten(this.border1, 23);\n this.actorBkg = this.mainBkg;\n this.labelBoxBkgColor = this.actorBkg;\n this.signalColor = this.textColor;\n this.signalTextColor = this.textColor;\n this.labelBoxBorderColor = this.actorBorder;\n this.labelTextColor = this.actorTextColor;\n this.loopTextColor = this.actorTextColor;\n this.noteBorderColor = this.border2;\n this.noteTextColor = this.actorTextColor;\n this.actorLineColor = this.actorBorder;\n\n /* Gantt chart variables */\n\n this.taskTextColor = this.taskTextLightColor;\n this.taskTextOutsideColor = this.taskTextDarkColor;\n\n /* Architecture Diagram variables */\n this.archEdgeColor = this.lineColor;\n this.archEdgeArrowColor = this.lineColor;\n\n /* Entity Relationship variables */\n this.rowOdd = this.rowOdd || lighten(this.primaryColor, 75) || '#ffffff';\n this.rowEven = this.rowEven || lighten(this.primaryColor, 1);\n /* state colors */\n this.transitionColor = this.transitionColor || this.lineColor;\n this.transitionLabelColor = this.transitionLabelColor || this.textColor;\n this.stateLabelColor = this.stateLabelColor || this.stateBkg || this.primaryTextColor;\n\n this.stateBkg = this.stateBkg || this.mainBkg;\n this.labelBackgroundColor = this.labelBackgroundColor || this.stateBkg;\n this.compositeBackground = this.compositeBackground || this.background || this.tertiaryColor;\n this.altBackground = this.altBackground || '#f0f0f0';\n this.compositeTitleBackground = this.compositeTitleBackground || this.mainBkg;\n this.compositeBorder = this.compositeBorder || this.nodeBorder;\n this.innerEndBackground = this.nodeBorder;\n this.specialStateColor = this.lineColor;\n\n this.errorBkgColor = this.errorBkgColor || this.tertiaryColor;\n this.errorTextColor = this.errorTextColor || this.tertiaryTextColor;\n this.transitionColor = this.transitionColor || this.lineColor;\n /* class */\n this.classText = this.primaryTextColor;\n /* journey */\n this.fillType0 = this.primaryColor;\n this.fillType1 = this.secondaryColor;\n this.fillType2 = adjust(this.primaryColor, { h: 64 });\n this.fillType3 = adjust(this.secondaryColor, { h: 64 });\n this.fillType4 = adjust(this.primaryColor, { h: -64 });\n this.fillType5 = adjust(this.secondaryColor, { h: -64 });\n this.fillType6 = adjust(this.primaryColor, { h: 128 });\n this.fillType7 = adjust(this.secondaryColor, { h: 128 });\n\n /* pie */\n this.pie1 = this.pie1 || this.primaryColor;\n this.pie2 = this.pie2 || this.secondaryColor;\n this.pie3 = this.pie3 || adjust(this.tertiaryColor, { l: -40 });\n this.pie4 = this.pie4 || adjust(this.primaryColor, { l: -10 });\n this.pie5 = this.pie5 || adjust(this.secondaryColor, { l: -30 });\n this.pie6 = this.pie6 || adjust(this.tertiaryColor, { l: -20 });\n this.pie7 = this.pie7 || adjust(this.primaryColor, { h: +60, l: -20 });\n this.pie8 = this.pie8 || adjust(this.primaryColor, { h: -60, l: -40 });\n this.pie9 = this.pie9 || adjust(this.primaryColor, { h: 120, l: -40 });\n this.pie10 = this.pie10 || adjust(this.primaryColor, { h: +60, l: -40 });\n this.pie11 = this.pie11 || adjust(this.primaryColor, { h: -90, l: -40 });\n this.pie12 = this.pie12 || adjust(this.primaryColor, { h: 120, l: -30 });\n this.pieTitleTextSize = this.pieTitleTextSize || '25px';\n this.pieTitleTextColor = this.pieTitleTextColor || this.taskTextDarkColor;\n this.pieSectionTextSize = this.pieSectionTextSize || '17px';\n this.pieSectionTextColor = this.pieSectionTextColor || this.textColor;\n this.pieLegendTextSize = this.pieLegendTextSize || '17px';\n this.pieLegendTextColor = this.pieLegendTextColor || this.taskTextDarkColor;\n this.pieStrokeColor = this.pieStrokeColor || 'black';\n this.pieStrokeWidth = this.pieStrokeWidth || '2px';\n this.pieOuterStrokeWidth = this.pieOuterStrokeWidth || '2px';\n this.pieOuterStrokeColor = this.pieOuterStrokeColor || 'black';\n this.pieOpacity = this.pieOpacity || '0.7';\n\n /* quadrant-graph */\n this.quadrant1Fill = this.quadrant1Fill || this.primaryColor;\n this.quadrant2Fill = this.quadrant2Fill || adjust(this.primaryColor, { r: 5, g: 5, b: 5 });\n this.quadrant3Fill = this.quadrant3Fill || adjust(this.primaryColor, { r: 10, g: 10, b: 10 });\n this.quadrant4Fill = this.quadrant4Fill || adjust(this.primaryColor, { r: 15, g: 15, b: 15 });\n this.quadrant1TextFill = this.quadrant1TextFill || this.primaryTextColor;\n this.quadrant2TextFill =\n this.quadrant2TextFill || adjust(this.primaryTextColor, { r: -5, g: -5, b: -5 });\n this.quadrant3TextFill =\n this.quadrant3TextFill || adjust(this.primaryTextColor, { r: -10, g: -10, b: -10 });\n this.quadrant4TextFill =\n this.quadrant4TextFill || adjust(this.primaryTextColor, { r: -15, g: -15, b: -15 });\n this.quadrantPointFill =\n this.quadrantPointFill || isDark(this.quadrant1Fill)\n ? lighten(this.quadrant1Fill)\n : darken(this.quadrant1Fill);\n this.quadrantPointTextFill = this.quadrantPointTextFill || this.primaryTextColor;\n this.quadrantXAxisTextFill = this.quadrantXAxisTextFill || this.primaryTextColor;\n this.quadrantYAxisTextFill = this.quadrantYAxisTextFill || this.primaryTextColor;\n this.quadrantInternalBorderStrokeFill =\n this.quadrantInternalBorderStrokeFill || this.primaryBorderColor;\n this.quadrantExternalBorderStrokeFill =\n this.quadrantExternalBorderStrokeFill || this.primaryBorderColor;\n this.quadrantTitleFill = this.quadrantTitleFill || this.primaryTextColor;\n\n /* radar */\n this.radar = {\n axisColor: this.radar?.axisColor || this.lineColor,\n axisStrokeWidth: this.radar?.axisStrokeWidth || 2,\n axisLabelFontSize: this.radar?.axisLabelFontSize || 12,\n curveOpacity: this.radar?.curveOpacity || 0.5,\n curveStrokeWidth: this.radar?.curveStrokeWidth || 2,\n graticuleColor: this.radar?.graticuleColor || '#DEDEDE',\n graticuleStrokeWidth: this.radar?.graticuleStrokeWidth || 1,\n graticuleOpacity: this.radar?.graticuleOpacity || 0.3,\n legendBoxSize: this.radar?.legendBoxSize || 12,\n legendFontSize: this.radar?.legendFontSize || 12,\n };\n\n /* xychart */\n this.xyChart = {\n backgroundColor: this.xyChart?.backgroundColor || this.background,\n titleColor: this.xyChart?.titleColor || this.primaryTextColor,\n xAxisTitleColor: this.xyChart?.xAxisTitleColor || this.primaryTextColor,\n xAxisLabelColor: this.xyChart?.xAxisLabelColor || this.primaryTextColor,\n xAxisTickColor: this.xyChart?.xAxisTickColor || this.primaryTextColor,\n xAxisLineColor: this.xyChart?.xAxisLineColor || this.primaryTextColor,\n yAxisTitleColor: this.xyChart?.yAxisTitleColor || this.primaryTextColor,\n yAxisLabelColor: this.xyChart?.yAxisLabelColor || this.primaryTextColor,\n yAxisTickColor: this.xyChart?.yAxisTickColor || this.primaryTextColor,\n yAxisLineColor: this.xyChart?.yAxisLineColor || this.primaryTextColor,\n plotColorPalette:\n this.xyChart?.plotColorPalette ||\n '#ECECFF,#8493A6,#FFC3A0,#DCDDE1,#B8E994,#D1A36F,#C3CDE6,#FFB6C1,#496078,#F8F3E3',\n };\n\n /* requirement-diagram */\n this.requirementBackground = this.requirementBackground || this.primaryColor;\n this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor;\n this.requirementBorderSize = this.requirementBorderSize || '1';\n this.requirementTextColor = this.requirementTextColor || this.primaryTextColor;\n this.relationColor = this.relationColor || this.lineColor;\n this.relationLabelBackground = this.relationLabelBackground || this.labelBackground;\n this.relationLabelColor = this.relationLabelColor || this.actorTextColor;\n\n /* git */\n this.git0 = this.git0 || this.primaryColor;\n this.git1 = this.git1 || this.secondaryColor;\n this.git2 = this.git2 || this.tertiaryColor;\n this.git3 = this.git3 || adjust(this.primaryColor, { h: -30 });\n this.git4 = this.git4 || adjust(this.primaryColor, { h: -60 });\n this.git5 = this.git5 || adjust(this.primaryColor, { h: -90 });\n this.git6 = this.git6 || adjust(this.primaryColor, { h: +60 });\n this.git7 = this.git7 || adjust(this.primaryColor, { h: +120 });\n if (this.darkMode) {\n this.git0 = lighten(this.git0, 25);\n this.git1 = lighten(this.git1, 25);\n this.git2 = lighten(this.git2, 25);\n this.git3 = lighten(this.git3, 25);\n this.git4 = lighten(this.git4, 25);\n this.git5 = lighten(this.git5, 25);\n this.git6 = lighten(this.git6, 25);\n this.git7 = lighten(this.git7, 25);\n } else {\n this.git0 = darken(this.git0, 25);\n this.git1 = darken(this.git1, 25);\n this.git2 = darken(this.git2, 25);\n this.git3 = darken(this.git3, 25);\n this.git4 = darken(this.git4, 25);\n this.git5 = darken(this.git5, 25);\n this.git6 = darken(this.git6, 25);\n this.git7 = darken(this.git7, 25);\n }\n this.gitInv0 = this.gitInv0 || darken(invert(this.git0), 25);\n this.gitInv1 = this.gitInv1 || invert(this.git1);\n this.gitInv2 = this.gitInv2 || invert(this.git2);\n this.gitInv3 = this.gitInv3 || invert(this.git3);\n this.gitInv4 = this.gitInv4 || invert(this.git4);\n this.gitInv5 = this.gitInv5 || invert(this.git5);\n this.gitInv6 = this.gitInv6 || invert(this.git6);\n this.gitInv7 = this.gitInv7 || invert(this.git7);\n this.gitBranchLabel0 = this.gitBranchLabel0 || invert(this.labelTextColor);\n this.gitBranchLabel1 = this.gitBranchLabel1 || this.labelTextColor;\n this.gitBranchLabel2 = this.gitBranchLabel2 || this.labelTextColor;\n this.gitBranchLabel3 = this.gitBranchLabel3 || invert(this.labelTextColor);\n this.gitBranchLabel4 = this.gitBranchLabel4 || this.labelTextColor;\n this.gitBranchLabel5 = this.gitBranchLabel5 || this.labelTextColor;\n this.gitBranchLabel6 = this.gitBranchLabel6 || this.labelTextColor;\n this.gitBranchLabel7 = this.gitBranchLabel7 || this.labelTextColor;\n\n this.tagLabelColor = this.tagLabelColor || this.primaryTextColor;\n this.tagLabelBackground = this.tagLabelBackground || this.primaryColor;\n this.tagLabelBorder = this.tagBorder || this.primaryBorderColor;\n this.tagLabelFontSize = this.tagLabelFontSize || '10px';\n this.commitLabelColor = this.commitLabelColor || this.secondaryTextColor;\n this.commitLabelBackground = this.commitLabelBackground || this.secondaryColor;\n this.commitLabelFontSize = this.commitLabelFontSize || '10px';\n\n /* -------------------------------------------------- */\n /* EntityRelationship diagrams */\n\n this.attributeBackgroundColorOdd =\n this.attributeBackgroundColorOdd || oldAttributeBackgroundColorOdd;\n this.attributeBackgroundColorEven =\n this.attributeBackgroundColorEven || oldAttributeBackgroundColorEven;\n /* -------------------------------------------------- */\n }\n calculate(overrides) {\n // for all keys in this object, if it is 'calculated' then set it to undefined\n Object.keys(this).forEach((k) => {\n if (this[k] === 'calculated') {\n this[k] = undefined;\n }\n });\n\n if (typeof overrides !== 'object') {\n // Calculate colors form base colors\n this.updateColors();\n return;\n }\n\n const keys = Object.keys(overrides);\n\n // Copy values from overrides, this is mainly for base colors\n keys.forEach((k) => {\n this[k] = overrides[k];\n });\n\n // Calculate colors form base colors\n this.updateColors();\n // Copy values from overrides again in case of an override of derived value\n keys.forEach((k) => {\n this[k] = overrides[k];\n });\n }\n}\n\nexport const getThemeVariables = (userOverrides) => {\n const theme = new Theme();\n theme.calculate(userOverrides);\n return theme;\n};\n", "import { adjust, darken, invert, isDark, lighten } from 'khroma';\nimport {\n oldAttributeBackgroundColorEven,\n oldAttributeBackgroundColorOdd,\n} from './erDiagram-oldHardcodedValues.js';\nimport { mkBorder } from './theme-helpers.js';\n\nclass Theme {\n constructor() {\n /* Base vales */\n this.background = '#f4f4f4';\n this.primaryColor = '#cde498';\n this.secondaryColor = '#cdffb2';\n this.background = 'white';\n this.mainBkg = '#cde498';\n this.secondBkg = '#cdffb2';\n this.lineColor = 'green';\n this.border1 = '#13540c';\n this.border2 = '#6eaa49';\n this.arrowheadColor = 'green';\n this.fontFamily = '\"trebuchet ms\", verdana, arial, sans-serif';\n this.fontSize = '16px';\n\n this.tertiaryColor = lighten('#cde498', 10);\n this.primaryBorderColor = mkBorder(this.primaryColor, this.darkMode);\n this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode);\n this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode);\n this.primaryTextColor = invert(this.primaryColor);\n this.secondaryTextColor = invert(this.secondaryColor);\n this.tertiaryTextColor = invert(this.primaryColor);\n this.lineColor = invert(this.background);\n this.textColor = invert(this.background);\n this.THEME_COLOR_LIMIT = 12;\n\n /* Flowchart variables */\n this.nodeBkg = 'calculated';\n this.nodeBorder = 'calculated';\n this.clusterBkg = 'calculated';\n this.clusterBorder = 'calculated';\n this.defaultLinkColor = 'calculated';\n this.titleColor = '#333';\n this.edgeLabelBackground = '#e8e8e8';\n\n /* Sequence Diagram variables */\n\n this.actorBorder = 'calculated';\n this.actorBkg = 'calculated';\n this.actorTextColor = 'black';\n this.actorLineColor = 'calculated';\n this.signalColor = '#333';\n this.signalTextColor = '#333';\n this.labelBoxBkgColor = 'calculated';\n this.labelBoxBorderColor = '#326932';\n this.labelTextColor = 'calculated';\n this.loopTextColor = 'calculated';\n this.noteBorderColor = 'calculated';\n this.noteBkgColor = '#fff5ad';\n this.noteTextColor = 'calculated';\n this.activationBorderColor = '#666';\n this.activationBkgColor = '#f4f4f4';\n this.sequenceNumberColor = 'white';\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = '#6eaa49';\n this.altSectionBkgColor = 'white';\n this.sectionBkgColor2 = '#6eaa49';\n this.excludeBkgColor = '#eeeeee';\n this.taskBorderColor = 'calculated';\n this.taskBkgColor = '#487e3a';\n this.taskTextLightColor = 'white';\n this.taskTextColor = 'calculated';\n this.taskTextDarkColor = 'black';\n this.taskTextOutsideColor = 'calculated';\n this.taskTextClickableColor = '#003163';\n this.activeTaskBorderColor = 'calculated';\n this.activeTaskBkgColor = 'calculated';\n this.gridColor = 'lightgrey';\n this.doneTaskBkgColor = 'lightgrey';\n this.doneTaskBorderColor = 'grey';\n this.critBorderColor = '#ff8888';\n this.critBkgColor = 'red';\n this.todayLineColor = 'red';\n this.vertLineColor = '#00BFFF';\n\n /* C4 Context Diagram variables */\n this.personBorder = this.primaryBorderColor;\n this.personBkg = this.mainBkg;\n\n /* Architecture Diagram variables */\n this.archEdgeColor = 'calculated';\n this.archEdgeArrowColor = 'calculated';\n this.archEdgeWidth = '3';\n this.archGroupBorderColor = this.primaryBorderColor;\n this.archGroupBorderWidth = '2px';\n\n /* state colors */\n this.labelColor = 'black';\n\n this.errorBkgColor = '#552222';\n this.errorTextColor = '#552222';\n }\n updateColors() {\n /* Sequence Diagram variables */\n this.actorBorder = darken(this.mainBkg, 20);\n this.actorBkg = this.mainBkg;\n this.labelBoxBkgColor = this.actorBkg;\n this.labelTextColor = this.actorTextColor;\n this.loopTextColor = this.actorTextColor;\n this.noteBorderColor = this.border2;\n this.noteTextColor = this.actorTextColor;\n this.actorLineColor = this.actorBorder;\n\n /* Each color-set will have a background, a foreground and a border color */\n this.cScale0 = this.cScale0 || this.primaryColor;\n this.cScale1 = this.cScale1 || this.secondaryColor;\n this.cScale2 = this.cScale2 || this.tertiaryColor;\n this.cScale3 = this.cScale3 || adjust(this.primaryColor, { h: 30 });\n this.cScale4 = this.cScale4 || adjust(this.primaryColor, { h: 60 });\n this.cScale5 = this.cScale5 || adjust(this.primaryColor, { h: 90 });\n this.cScale6 = this.cScale6 || adjust(this.primaryColor, { h: 120 });\n this.cScale7 = this.cScale7 || adjust(this.primaryColor, { h: 150 });\n this.cScale8 = this.cScale8 || adjust(this.primaryColor, { h: 210 });\n this.cScale9 = this.cScale9 || adjust(this.primaryColor, { h: 270 });\n this.cScale10 = this.cScale10 || adjust(this.primaryColor, { h: 300 });\n this.cScale11 = this.cScale11 || adjust(this.primaryColor, { h: 330 });\n this['cScalePeer' + 1] = this['cScalePeer' + 1] || darken(this.secondaryColor, 45);\n this['cScalePeer' + 2] = this['cScalePeer' + 2] || darken(this.tertiaryColor, 40);\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n // Setup the peer color for the set, useful for borders\n this['cScale' + i] = darken(this['cScale' + i], 10);\n this['cScalePeer' + i] = this['cScalePeer' + i] || darken(this['cScale' + i], 25);\n }\n\n // Setup the inverted color for the set\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScaleInv' + i] = this['cScaleInv' + i] || adjust(this['cScale' + i], { h: 180 });\n }\n\n // Setup the label color for the set\n this.scaleLabelColor =\n this.scaleLabelColor !== 'calculated' && this.scaleLabelColor\n ? this.scaleLabelColor\n : this.labelTextColor;\n\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScaleLabel' + i] = this['cScaleLabel' + i] || this.scaleLabelColor;\n }\n\n for (let i = 0; i < 5; i++) {\n this['surface' + i] =\n this['surface' + i] || adjust(this.mainBkg, { h: 30, s: -30, l: -(5 + i * 5) });\n this['surfacePeer' + i] =\n this['surfacePeer' + i] || adjust(this.mainBkg, { h: 30, s: -30, l: -(8 + i * 5) });\n }\n\n /* Flowchart variables */\n\n this.nodeBkg = this.mainBkg;\n this.nodeBorder = this.border1;\n this.clusterBkg = this.secondBkg;\n this.clusterBorder = this.border2;\n this.defaultLinkColor = this.lineColor;\n\n /* Gantt chart variables */\n\n this.taskBorderColor = this.border1;\n this.taskTextColor = this.taskTextLightColor;\n this.taskTextOutsideColor = this.taskTextDarkColor;\n this.activeTaskBorderColor = this.taskBorderColor;\n this.activeTaskBkgColor = this.mainBkg;\n\n /* Architecture Diagram variables */\n this.archEdgeColor = this.lineColor;\n this.archEdgeArrowColor = this.lineColor;\n\n /* ER diagram */\n this.rowOdd = this.rowOdd || lighten(this.mainBkg, 75) || '#ffffff';\n this.rowEven = this.rowEven || lighten(this.mainBkg, 20);\n\n /* state colors */\n this.transitionColor = this.transitionColor || this.lineColor;\n this.transitionLabelColor = this.transitionLabelColor || this.textColor;\n this.stateLabelColor = this.stateLabelColor || this.stateBkg || this.primaryTextColor;\n\n this.stateBkg = this.stateBkg || this.mainBkg;\n this.labelBackgroundColor = this.labelBackgroundColor || this.stateBkg;\n this.compositeBackground = this.compositeBackground || this.background || this.tertiaryColor;\n this.altBackground = this.altBackground || '#f0f0f0';\n this.compositeTitleBackground = this.compositeTitleBackground || this.mainBkg;\n this.compositeBorder = this.compositeBorder || this.nodeBorder;\n this.innerEndBackground = this.primaryBorderColor;\n this.specialStateColor = this.lineColor;\n\n this.errorBkgColor = this.errorBkgColor || this.tertiaryColor;\n this.errorTextColor = this.errorTextColor || this.tertiaryTextColor;\n this.transitionColor = this.transitionColor || this.lineColor;\n /* class */\n this.classText = this.primaryTextColor;\n /* journey */\n this.fillType0 = this.primaryColor;\n this.fillType1 = this.secondaryColor;\n this.fillType2 = adjust(this.primaryColor, { h: 64 });\n this.fillType3 = adjust(this.secondaryColor, { h: 64 });\n this.fillType4 = adjust(this.primaryColor, { h: -64 });\n this.fillType5 = adjust(this.secondaryColor, { h: -64 });\n this.fillType6 = adjust(this.primaryColor, { h: 128 });\n this.fillType7 = adjust(this.secondaryColor, { h: 128 });\n\n /* pie */\n this.pie1 = this.pie1 || this.primaryColor;\n this.pie2 = this.pie2 || this.secondaryColor;\n this.pie3 = this.pie3 || this.tertiaryColor;\n this.pie4 = this.pie4 || adjust(this.primaryColor, { l: -30 });\n this.pie5 = this.pie5 || adjust(this.secondaryColor, { l: -30 });\n this.pie6 = this.pie6 || adjust(this.tertiaryColor, { h: +40, l: -40 });\n this.pie7 = this.pie7 || adjust(this.primaryColor, { h: +60, l: -10 });\n this.pie8 = this.pie8 || adjust(this.primaryColor, { h: -60, l: -10 });\n this.pie9 = this.pie9 || adjust(this.primaryColor, { h: 120, l: 0 });\n this.pie10 = this.pie10 || adjust(this.primaryColor, { h: +60, l: -50 });\n this.pie11 = this.pie11 || adjust(this.primaryColor, { h: -60, l: -50 });\n this.pie12 = this.pie12 || adjust(this.primaryColor, { h: 120, l: -50 });\n this.pieTitleTextSize = this.pieTitleTextSize || '25px';\n this.pieTitleTextColor = this.pieTitleTextColor || this.taskTextDarkColor;\n this.pieSectionTextSize = this.pieSectionTextSize || '17px';\n this.pieSectionTextColor = this.pieSectionTextColor || this.textColor;\n this.pieLegendTextSize = this.pieLegendTextSize || '17px';\n this.pieLegendTextColor = this.pieLegendTextColor || this.taskTextDarkColor;\n this.pieStrokeColor = this.pieStrokeColor || 'black';\n this.pieStrokeWidth = this.pieStrokeWidth || '2px';\n this.pieOuterStrokeWidth = this.pieOuterStrokeWidth || '2px';\n this.pieOuterStrokeColor = this.pieOuterStrokeColor || 'black';\n this.pieOpacity = this.pieOpacity || '0.7';\n\n /* quadrant-graph */\n this.quadrant1Fill = this.quadrant1Fill || this.primaryColor;\n this.quadrant2Fill = this.quadrant2Fill || adjust(this.primaryColor, { r: 5, g: 5, b: 5 });\n this.quadrant3Fill = this.quadrant3Fill || adjust(this.primaryColor, { r: 10, g: 10, b: 10 });\n this.quadrant4Fill = this.quadrant4Fill || adjust(this.primaryColor, { r: 15, g: 15, b: 15 });\n this.quadrant1TextFill = this.quadrant1TextFill || this.primaryTextColor;\n this.quadrant2TextFill =\n this.quadrant2TextFill || adjust(this.primaryTextColor, { r: -5, g: -5, b: -5 });\n this.quadrant3TextFill =\n this.quadrant3TextFill || adjust(this.primaryTextColor, { r: -10, g: -10, b: -10 });\n this.quadrant4TextFill =\n this.quadrant4TextFill || adjust(this.primaryTextColor, { r: -15, g: -15, b: -15 });\n this.quadrantPointFill =\n this.quadrantPointFill || isDark(this.quadrant1Fill)\n ? lighten(this.quadrant1Fill)\n : darken(this.quadrant1Fill);\n this.quadrantPointTextFill = this.quadrantPointTextFill || this.primaryTextColor;\n this.quadrantXAxisTextFill = this.quadrantXAxisTextFill || this.primaryTextColor;\n this.quadrantYAxisTextFill = this.quadrantYAxisTextFill || this.primaryTextColor;\n this.quadrantInternalBorderStrokeFill =\n this.quadrantInternalBorderStrokeFill || this.primaryBorderColor;\n this.quadrantExternalBorderStrokeFill =\n this.quadrantExternalBorderStrokeFill || this.primaryBorderColor;\n this.quadrantTitleFill = this.quadrantTitleFill || this.primaryTextColor;\n\n this.packet = {\n startByteColor: this.primaryTextColor,\n endByteColor: this.primaryTextColor,\n labelColor: this.primaryTextColor,\n titleColor: this.primaryTextColor,\n blockStrokeColor: this.primaryTextColor,\n blockFillColor: this.mainBkg,\n };\n\n /* radar */\n this.radar = {\n axisColor: this.radar?.axisColor || this.lineColor,\n axisStrokeWidth: this.radar?.axisStrokeWidth || 2,\n axisLabelFontSize: this.radar?.axisLabelFontSize || 12,\n curveOpacity: this.radar?.curveOpacity || 0.5,\n curveStrokeWidth: this.radar?.curveStrokeWidth || 2,\n graticuleColor: this.radar?.graticuleColor || '#DEDEDE',\n graticuleStrokeWidth: this.radar?.graticuleStrokeWidth || 1,\n graticuleOpacity: this.radar?.graticuleOpacity || 0.3,\n legendBoxSize: this.radar?.legendBoxSize || 12,\n legendFontSize: this.radar?.legendFontSize || 12,\n };\n\n /* xychart */\n this.xyChart = {\n backgroundColor: this.xyChart?.backgroundColor || this.background,\n titleColor: this.xyChart?.titleColor || this.primaryTextColor,\n xAxisTitleColor: this.xyChart?.xAxisTitleColor || this.primaryTextColor,\n xAxisLabelColor: this.xyChart?.xAxisLabelColor || this.primaryTextColor,\n xAxisTickColor: this.xyChart?.xAxisTickColor || this.primaryTextColor,\n xAxisLineColor: this.xyChart?.xAxisLineColor || this.primaryTextColor,\n yAxisTitleColor: this.xyChart?.yAxisTitleColor || this.primaryTextColor,\n yAxisLabelColor: this.xyChart?.yAxisLabelColor || this.primaryTextColor,\n yAxisTickColor: this.xyChart?.yAxisTickColor || this.primaryTextColor,\n yAxisLineColor: this.xyChart?.yAxisLineColor || this.primaryTextColor,\n plotColorPalette:\n this.xyChart?.plotColorPalette ||\n '#CDE498,#FF6B6B,#A0D2DB,#D7BDE2,#F0F0F0,#FFC3A0,#7FD8BE,#FF9A8B,#FAF3E0,#FFF176',\n };\n\n /* requirement-diagram */\n this.requirementBackground = this.requirementBackground || this.primaryColor;\n this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor;\n this.requirementBorderSize = this.requirementBorderSize || '1';\n this.requirementTextColor = this.requirementTextColor || this.primaryTextColor;\n this.relationColor = this.relationColor || this.lineColor;\n this.relationLabelBackground = this.relationLabelBackground || this.edgeLabelBackground;\n this.relationLabelColor = this.relationLabelColor || this.actorTextColor;\n\n /* git */\n this.git0 = this.git0 || this.primaryColor;\n this.git1 = this.git1 || this.secondaryColor;\n this.git2 = this.git2 || this.tertiaryColor;\n this.git3 = this.git3 || adjust(this.primaryColor, { h: -30 });\n this.git4 = this.git4 || adjust(this.primaryColor, { h: -60 });\n this.git5 = this.git5 || adjust(this.primaryColor, { h: -90 });\n this.git6 = this.git6 || adjust(this.primaryColor, { h: +60 });\n this.git7 = this.git7 || adjust(this.primaryColor, { h: +120 });\n if (this.darkMode) {\n this.git0 = lighten(this.git0, 25);\n this.git1 = lighten(this.git1, 25);\n this.git2 = lighten(this.git2, 25);\n this.git3 = lighten(this.git3, 25);\n this.git4 = lighten(this.git4, 25);\n this.git5 = lighten(this.git5, 25);\n this.git6 = lighten(this.git6, 25);\n this.git7 = lighten(this.git7, 25);\n } else {\n this.git0 = darken(this.git0, 25);\n this.git1 = darken(this.git1, 25);\n this.git2 = darken(this.git2, 25);\n this.git3 = darken(this.git3, 25);\n this.git4 = darken(this.git4, 25);\n this.git5 = darken(this.git5, 25);\n this.git6 = darken(this.git6, 25);\n this.git7 = darken(this.git7, 25);\n }\n this.gitInv0 = this.gitInv0 || invert(this.git0);\n this.gitInv1 = this.gitInv1 || invert(this.git1);\n this.gitInv2 = this.gitInv2 || invert(this.git2);\n this.gitInv3 = this.gitInv3 || invert(this.git3);\n this.gitInv4 = this.gitInv4 || invert(this.git4);\n this.gitInv5 = this.gitInv5 || invert(this.git5);\n this.gitInv6 = this.gitInv6 || invert(this.git6);\n this.gitInv7 = this.gitInv7 || invert(this.git7);\n this.gitBranchLabel0 = this.gitBranchLabel0 || invert(this.labelTextColor);\n this.gitBranchLabel1 = this.gitBranchLabel1 || this.labelTextColor;\n this.gitBranchLabel2 = this.gitBranchLabel2 || this.labelTextColor;\n this.gitBranchLabel3 = this.gitBranchLabel3 || invert(this.labelTextColor);\n this.gitBranchLabel4 = this.gitBranchLabel4 || this.labelTextColor;\n this.gitBranchLabel5 = this.gitBranchLabel5 || this.labelTextColor;\n this.gitBranchLabel6 = this.gitBranchLabel6 || this.labelTextColor;\n this.gitBranchLabel7 = this.gitBranchLabel7 || this.labelTextColor;\n\n this.tagLabelColor = this.tagLabelColor || this.primaryTextColor;\n this.tagLabelBackground = this.tagLabelBackground || this.primaryColor;\n this.tagLabelBorder = this.tagBorder || this.primaryBorderColor;\n this.tagLabelFontSize = this.tagLabelFontSize || '10px';\n this.commitLabelColor = this.commitLabelColor || this.secondaryTextColor;\n this.commitLabelBackground = this.commitLabelBackground || this.secondaryColor;\n this.commitLabelFontSize = this.commitLabelFontSize || '10px';\n\n /* -------------------------------------------------- */\n /* EntityRelationship diagrams */\n\n this.attributeBackgroundColorOdd =\n this.attributeBackgroundColorOdd || oldAttributeBackgroundColorOdd;\n this.attributeBackgroundColorEven =\n this.attributeBackgroundColorEven || oldAttributeBackgroundColorEven;\n /* -------------------------------------------------- */\n }\n calculate(overrides) {\n if (typeof overrides !== 'object') {\n // Calculate colors form base colors\n this.updateColors();\n return;\n }\n\n const keys = Object.keys(overrides);\n\n // Copy values from overrides, this is mainly for base colors\n keys.forEach((k) => {\n this[k] = overrides[k];\n });\n\n // Calculate colors form base colors\n this.updateColors();\n // Copy values from overrides again in case of an override of derived value\n keys.forEach((k) => {\n this[k] = overrides[k];\n });\n }\n}\n\nexport const getThemeVariables = (userOverrides) => {\n const theme = new Theme();\n theme.calculate(userOverrides);\n return theme;\n};\n", "import { invert, darken, lighten, adjust, isDark } from 'khroma';\nimport { mkBorder } from './theme-helpers.js';\nimport {\n oldAttributeBackgroundColorEven,\n oldAttributeBackgroundColorOdd,\n} from './erDiagram-oldHardcodedValues.js';\n\n// const Color = require ( 'khroma/dist/color' ).default\n// Color.format.hex.stringify(Color.parse('hsl(210, 66.6666666667%, 95%)')); // => \"#EAF2FB\"\n\nclass Theme {\n constructor() {\n this.primaryColor = '#eee';\n this.contrast = '#707070';\n this.secondaryColor = lighten(this.contrast, 55);\n this.background = '#ffffff';\n\n // this.secondaryColor = adjust(this.primaryColor, { h: 120 });\n this.tertiaryColor = adjust(this.primaryColor, { h: -160 });\n this.primaryBorderColor = mkBorder(this.primaryColor, this.darkMode);\n this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode);\n this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode);\n // this.noteBorderColor = mkBorder(this.noteBkgColor, this.darkMode);\n\n this.primaryTextColor = invert(this.primaryColor);\n this.secondaryTextColor = invert(this.secondaryColor);\n this.tertiaryTextColor = invert(this.tertiaryColor);\n this.lineColor = invert(this.background);\n this.textColor = invert(this.background);\n\n // this.altBackground = lighten(this.contrast, 55);\n this.mainBkg = '#eee';\n this.secondBkg = 'calculated';\n this.lineColor = '#666';\n this.border1 = '#999';\n this.border2 = 'calculated';\n this.note = '#ffa';\n this.text = '#333';\n this.critical = '#d42';\n this.done = '#bbb';\n this.arrowheadColor = '#333333';\n this.fontFamily = '\"trebuchet ms\", verdana, arial, sans-serif';\n this.fontSize = '16px';\n this.THEME_COLOR_LIMIT = 12;\n\n /* Flowchart variables */\n\n this.nodeBkg = 'calculated';\n this.nodeBorder = 'calculated';\n this.clusterBkg = 'calculated';\n this.clusterBorder = 'calculated';\n this.defaultLinkColor = 'calculated';\n this.titleColor = 'calculated';\n this.edgeLabelBackground = 'white';\n\n /* Sequence Diagram variables */\n\n this.actorBorder = 'calculated';\n this.actorBkg = 'calculated';\n this.actorTextColor = 'calculated';\n this.actorLineColor = this.actorBorder;\n this.signalColor = 'calculated';\n this.signalTextColor = 'calculated';\n this.labelBoxBkgColor = 'calculated';\n this.labelBoxBorderColor = 'calculated';\n this.labelTextColor = 'calculated';\n this.loopTextColor = 'calculated';\n this.noteBorderColor = 'calculated';\n this.noteBkgColor = 'calculated';\n this.noteTextColor = 'calculated';\n this.activationBorderColor = '#666';\n this.activationBkgColor = '#f4f4f4';\n this.sequenceNumberColor = 'white';\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = 'calculated';\n this.altSectionBkgColor = 'white';\n this.sectionBkgColor2 = 'calculated';\n this.excludeBkgColor = '#eeeeee';\n this.taskBorderColor = 'calculated';\n this.taskBkgColor = 'calculated';\n this.taskTextLightColor = 'white';\n this.taskTextColor = 'calculated';\n this.taskTextDarkColor = 'calculated';\n this.taskTextOutsideColor = 'calculated';\n this.taskTextClickableColor = '#003163';\n this.activeTaskBorderColor = 'calculated';\n this.activeTaskBkgColor = 'calculated';\n this.gridColor = 'calculated';\n this.doneTaskBkgColor = 'calculated';\n this.doneTaskBorderColor = 'calculated';\n this.critBkgColor = 'calculated';\n this.critBorderColor = 'calculated';\n this.todayLineColor = 'calculated';\n this.vertLineColor = 'calculated';\n\n /* C4 Context Diagram variables */\n this.personBorder = this.primaryBorderColor;\n this.personBkg = this.mainBkg;\n\n /* Architecture Diagram variables */\n this.archEdgeColor = 'calculated';\n this.archEdgeArrowColor = 'calculated';\n this.archEdgeWidth = '3';\n this.archGroupBorderColor = this.primaryBorderColor;\n this.archGroupBorderWidth = '2px';\n\n /* ER diagram */\n this.rowOdd = this.rowOdd || lighten(this.mainBkg, 75) || '#ffffff';\n this.rowEven = this.rowEven || '#f4f4f4';\n\n /* state colors */\n this.labelColor = 'black';\n\n this.errorBkgColor = '#552222';\n this.errorTextColor = '#552222';\n }\n updateColors() {\n this.secondBkg = lighten(this.contrast, 55);\n this.border2 = this.contrast;\n\n /* Sequence Diagram variables */\n\n this.actorBorder = lighten(this.border1, 23);\n this.actorBkg = this.mainBkg;\n this.actorTextColor = this.text;\n this.actorLineColor = this.actorBorder;\n this.signalColor = this.text;\n this.signalTextColor = this.text;\n this.labelBoxBkgColor = this.actorBkg;\n this.labelBoxBorderColor = this.actorBorder;\n this.labelTextColor = this.text;\n this.loopTextColor = this.text;\n this.noteBorderColor = '#999';\n this.noteBkgColor = '#666';\n this.noteTextColor = '#fff';\n\n /* Color Scale */\n /* Each color-set will have a background, a foreground and a border color */\n\n this.cScale0 = this.cScale0 || '#555';\n this.cScale1 = this.cScale1 || '#F4F4F4';\n this.cScale2 = this.cScale2 || '#555';\n this.cScale3 = this.cScale3 || '#BBB';\n this.cScale4 = this.cScale4 || '#777';\n this.cScale5 = this.cScale5 || '#999';\n this.cScale6 = this.cScale6 || '#DDD';\n this.cScale7 = this.cScale7 || '#FFF';\n this.cScale8 = this.cScale8 || '#DDD';\n this.cScale9 = this.cScale9 || '#BBB';\n this.cScale10 = this.cScale10 || '#999';\n this.cScale11 = this.cScale11 || '#777';\n\n // Setup the inverted color for the set\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScaleInv' + i] = this['cScaleInv' + i] || invert(this['cScale' + i]);\n }\n // Setup the peer color for the set, useful for borders\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n if (this.darkMode) {\n this['cScalePeer' + i] = this['cScalePeer' + i] || lighten(this['cScale' + i], 10);\n } else {\n this['cScalePeer' + i] = this['cScalePeer' + i] || darken(this['cScale' + i], 10);\n }\n }\n\n // Setup the label color for the set\n this.scaleLabelColor = this.scaleLabelColor || (this.darkMode ? 'black' : this.labelTextColor);\n\n this.cScaleLabel0 = this.cScaleLabel0 || this.cScale1;\n this.cScaleLabel2 = this.cScaleLabel2 || this.cScale1;\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['cScaleLabel' + i] = this['cScaleLabel' + i] || this.scaleLabelColor;\n }\n\n for (let i = 0; i < 5; i++) {\n this['surface' + i] = this['surface' + i] || adjust(this.mainBkg, { l: -(5 + i * 5) });\n this['surfacePeer' + i] =\n this['surfacePeer' + i] || adjust(this.mainBkg, { l: -(8 + i * 5) });\n }\n\n /* Flowchart variables */\n\n this.nodeBkg = this.mainBkg;\n this.nodeBorder = this.border1;\n this.clusterBkg = this.secondBkg;\n this.clusterBorder = this.border2;\n this.defaultLinkColor = this.lineColor;\n this.titleColor = this.text;\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = lighten(this.contrast, 30);\n this.sectionBkgColor2 = lighten(this.contrast, 30);\n\n this.taskBorderColor = darken(this.contrast, 10);\n\n this.taskBkgColor = this.contrast;\n this.taskTextColor = this.taskTextLightColor;\n this.taskTextDarkColor = this.text;\n this.taskTextOutsideColor = this.taskTextDarkColor;\n this.activeTaskBorderColor = this.taskBorderColor;\n this.activeTaskBkgColor = this.mainBkg;\n this.gridColor = lighten(this.border1, 30);\n\n this.doneTaskBkgColor = this.done;\n this.doneTaskBorderColor = this.lineColor;\n this.critBkgColor = this.critical;\n this.critBorderColor = darken(this.critBkgColor, 10);\n\n this.todayLineColor = this.critBkgColor;\n this.vertLineColor = this.critBkgColor;\n\n /* Architecture Diagram variables */\n this.archEdgeColor = this.lineColor;\n this.archEdgeArrowColor = this.lineColor;\n\n /* state colors */\n this.transitionColor = this.transitionColor || '#000';\n this.transitionLabelColor = this.transitionLabelColor || this.textColor;\n this.stateLabelColor = this.stateLabelColor || this.stateBkg || this.primaryTextColor;\n\n this.stateBkg = this.stateBkg || this.mainBkg;\n this.labelBackgroundColor = this.labelBackgroundColor || this.stateBkg;\n this.compositeBackground = this.compositeBackground || this.background || this.tertiaryColor;\n this.altBackground = this.altBackground || '#f4f4f4';\n this.compositeTitleBackground = this.compositeTitleBackground || this.mainBkg;\n this.stateBorder = this.stateBorder || '#000';\n this.innerEndBackground = this.primaryBorderColor;\n this.specialStateColor = '#222';\n\n this.errorBkgColor = this.errorBkgColor || this.tertiaryColor;\n this.errorTextColor = this.errorTextColor || this.tertiaryTextColor;\n\n /* class */\n this.classText = this.primaryTextColor;\n /* journey */\n this.fillType0 = this.primaryColor;\n this.fillType1 = this.secondaryColor;\n this.fillType2 = adjust(this.primaryColor, { h: 64 });\n this.fillType3 = adjust(this.secondaryColor, { h: 64 });\n this.fillType4 = adjust(this.primaryColor, { h: -64 });\n this.fillType5 = adjust(this.secondaryColor, { h: -64 });\n this.fillType6 = adjust(this.primaryColor, { h: 128 });\n this.fillType7 = adjust(this.secondaryColor, { h: 128 });\n\n // /* pie */\n /* Pie diagram */\n for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {\n this['pie' + i] = this['cScale' + i];\n }\n this.pie12 = this.pie0;\n this.pieTitleTextSize = this.pieTitleTextSize || '25px';\n this.pieTitleTextColor = this.pieTitleTextColor || this.taskTextDarkColor;\n this.pieSectionTextSize = this.pieSectionTextSize || '17px';\n this.pieSectionTextColor = this.pieSectionTextColor || this.textColor;\n this.pieLegendTextSize = this.pieLegendTextSize || '17px';\n this.pieLegendTextColor = this.pieLegendTextColor || this.taskTextDarkColor;\n this.pieStrokeColor = this.pieStrokeColor || 'black';\n this.pieStrokeWidth = this.pieStrokeWidth || '2px';\n this.pieOuterStrokeWidth = this.pieOuterStrokeWidth || '2px';\n this.pieOuterStrokeColor = this.pieOuterStrokeColor || 'black';\n this.pieOpacity = this.pieOpacity || '0.7';\n\n /* quadrant-graph */\n this.quadrant1Fill = this.quadrant1Fill || this.primaryColor;\n this.quadrant2Fill = this.quadrant2Fill || adjust(this.primaryColor, { r: 5, g: 5, b: 5 });\n this.quadrant3Fill = this.quadrant3Fill || adjust(this.primaryColor, { r: 10, g: 10, b: 10 });\n this.quadrant4Fill = this.quadrant4Fill || adjust(this.primaryColor, { r: 15, g: 15, b: 15 });\n this.quadrant1TextFill = this.quadrant1TextFill || this.primaryTextColor;\n this.quadrant2TextFill =\n this.quadrant2TextFill || adjust(this.primaryTextColor, { r: -5, g: -5, b: -5 });\n this.quadrant3TextFill =\n this.quadrant3TextFill || adjust(this.primaryTextColor, { r: -10, g: -10, b: -10 });\n this.quadrant4TextFill =\n this.quadrant4TextFill || adjust(this.primaryTextColor, { r: -15, g: -15, b: -15 });\n this.quadrantPointFill =\n this.quadrantPointFill || isDark(this.quadrant1Fill)\n ? lighten(this.quadrant1Fill)\n : darken(this.quadrant1Fill);\n this.quadrantPointTextFill = this.quadrantPointTextFill || this.primaryTextColor;\n this.quadrantXAxisTextFill = this.quadrantXAxisTextFill || this.primaryTextColor;\n this.quadrantYAxisTextFill = this.quadrantYAxisTextFill || this.primaryTextColor;\n this.quadrantInternalBorderStrokeFill =\n this.quadrantInternalBorderStrokeFill || this.primaryBorderColor;\n this.quadrantExternalBorderStrokeFill =\n this.quadrantExternalBorderStrokeFill || this.primaryBorderColor;\n this.quadrantTitleFill = this.quadrantTitleFill || this.primaryTextColor;\n\n /* xychart */\n this.xyChart = {\n backgroundColor: this.xyChart?.backgroundColor || this.background,\n titleColor: this.xyChart?.titleColor || this.primaryTextColor,\n xAxisTitleColor: this.xyChart?.xAxisTitleColor || this.primaryTextColor,\n xAxisLabelColor: this.xyChart?.xAxisLabelColor || this.primaryTextColor,\n xAxisTickColor: this.xyChart?.xAxisTickColor || this.primaryTextColor,\n xAxisLineColor: this.xyChart?.xAxisLineColor || this.primaryTextColor,\n yAxisTitleColor: this.xyChart?.yAxisTitleColor || this.primaryTextColor,\n yAxisLabelColor: this.xyChart?.yAxisLabelColor || this.primaryTextColor,\n yAxisTickColor: this.xyChart?.yAxisTickColor || this.primaryTextColor,\n yAxisLineColor: this.xyChart?.yAxisLineColor || this.primaryTextColor,\n plotColorPalette:\n this.xyChart?.plotColorPalette ||\n '#EEE,#6BB8E4,#8ACB88,#C7ACD6,#E8DCC2,#FFB2A8,#FFF380,#7E8D91,#FFD8B1,#FAF3E0',\n };\n\n /* radar */\n this.radar = {\n axisColor: this.radar?.axisColor || this.lineColor,\n axisStrokeWidth: this.radar?.axisStrokeWidth || 2,\n axisLabelFontSize: this.radar?.axisLabelFontSize || 12,\n curveOpacity: this.radar?.curveOpacity || 0.5,\n curveStrokeWidth: this.radar?.curveStrokeWidth || 2,\n graticuleColor: this.radar?.graticuleColor || '#DEDEDE',\n graticuleStrokeWidth: this.radar?.graticuleStrokeWidth || 1,\n graticuleOpacity: this.radar?.graticuleOpacity || 0.3,\n legendBoxSize: this.radar?.legendBoxSize || 12,\n legendFontSize: this.radar?.legendFontSize || 12,\n };\n\n /* requirement-diagram */\n this.requirementBackground = this.requirementBackground || this.primaryColor;\n this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor;\n this.requirementBorderSize = this.requirementBorderSize || '1';\n this.requirementTextColor = this.requirementTextColor || this.primaryTextColor;\n this.relationColor = this.relationColor || this.lineColor;\n this.relationLabelBackground = this.relationLabelBackground || this.edgeLabelBackground;\n this.relationLabelColor = this.relationLabelColor || this.actorTextColor;\n\n /* git */\n this.git0 = darken(this.pie1, 25) || this.primaryColor;\n this.git1 = this.pie2 || this.secondaryColor;\n this.git2 = this.pie3 || this.tertiaryColor;\n this.git3 = this.pie4 || adjust(this.primaryColor, { h: -30 });\n this.git4 = this.pie5 || adjust(this.primaryColor, { h: -60 });\n this.git5 = this.pie6 || adjust(this.primaryColor, { h: -90 });\n this.git6 = this.pie7 || adjust(this.primaryColor, { h: +60 });\n this.git7 = this.pie8 || adjust(this.primaryColor, { h: +120 });\n\n this.gitInv0 = this.gitInv0 || invert(this.git0);\n this.gitInv1 = this.gitInv1 || invert(this.git1);\n this.gitInv2 = this.gitInv2 || invert(this.git2);\n this.gitInv3 = this.gitInv3 || invert(this.git3);\n this.gitInv4 = this.gitInv4 || invert(this.git4);\n this.gitInv5 = this.gitInv5 || invert(this.git5);\n this.gitInv6 = this.gitInv6 || invert(this.git6);\n this.gitInv7 = this.gitInv7 || invert(this.git7);\n\n this.branchLabelColor = this.branchLabelColor || this.labelTextColor;\n this.gitBranchLabel0 = this.branchLabelColor;\n this.gitBranchLabel1 = 'white';\n this.gitBranchLabel2 = this.branchLabelColor;\n this.gitBranchLabel3 = 'white';\n this.gitBranchLabel4 = this.branchLabelColor;\n this.gitBranchLabel5 = this.branchLabelColor;\n this.gitBranchLabel6 = this.branchLabelColor;\n this.gitBranchLabel7 = this.branchLabelColor;\n\n this.tagLabelColor = this.tagLabelColor || this.primaryTextColor;\n this.tagLabelBackground = this.tagLabelBackground || this.primaryColor;\n this.tagLabelBorder = this.tagBorder || this.primaryBorderColor;\n this.tagLabelFontSize = this.tagLabelFontSize || '10px';\n this.commitLabelColor = this.commitLabelColor || this.secondaryTextColor;\n this.commitLabelBackground = this.commitLabelBackground || this.secondaryColor;\n this.commitLabelFontSize = this.commitLabelFontSize || '10px';\n\n /* -------------------------------------------------- */\n /* EntityRelationship diagrams */\n\n this.attributeBackgroundColorOdd =\n this.attributeBackgroundColorOdd || oldAttributeBackgroundColorOdd;\n this.attributeBackgroundColorEven =\n this.attributeBackgroundColorEven || oldAttributeBackgroundColorEven;\n /* -------------------------------------------------- */\n }\n calculate(overrides) {\n if (typeof overrides !== 'object') {\n // Calculate colors form base colors\n this.updateColors();\n return;\n }\n\n const keys = Object.keys(overrides);\n\n // Copy values from overrides, this is mainly for base colors\n keys.forEach((k) => {\n this[k] = overrides[k];\n });\n\n // Calculate colors form base colors\n this.updateColors();\n // Copy values from overrides again in case of an override of derived value\n keys.forEach((k) => {\n this[k] = overrides[k];\n });\n }\n}\n\nexport const getThemeVariables = (userOverrides) => {\n const theme = new Theme();\n theme.calculate(userOverrides);\n return theme;\n};\n", "import { getThemeVariables as baseThemeVariables } from './theme-base.js';\nimport { getThemeVariables as darkThemeVariables } from './theme-dark.js';\nimport { getThemeVariables as defaultThemeVariables } from './theme-default.js';\nimport { getThemeVariables as forestThemeVariables } from './theme-forest.js';\nimport { getThemeVariables as neutralThemeVariables } from './theme-neutral.js';\n\nexport default {\n base: {\n getThemeVariables: baseThemeVariables,\n },\n dark: {\n getThemeVariables: darkThemeVariables,\n },\n default: {\n getThemeVariables: defaultThemeVariables,\n },\n forest: {\n getThemeVariables: forestThemeVariables,\n },\n neutral: {\n getThemeVariables: neutralThemeVariables,\n },\n};\n", "export default {\n \"flowchart\": {\n \"useMaxWidth\": true,\n \"titleTopMargin\": 25,\n \"subGraphTitleMargin\": {\n \"top\": 0,\n \"bottom\": 0\n },\n \"diagramPadding\": 8,\n \"htmlLabels\": true,\n \"nodeSpacing\": 50,\n \"rankSpacing\": 50,\n \"curve\": \"basis\",\n \"padding\": 15,\n \"defaultRenderer\": \"dagre-wrapper\",\n \"wrappingWidth\": 200,\n \"inheritDir\": false\n },\n \"sequence\": {\n \"useMaxWidth\": true,\n \"hideUnusedParticipants\": false,\n \"activationWidth\": 10,\n \"diagramMarginX\": 50,\n \"diagramMarginY\": 10,\n \"actorMargin\": 50,\n \"width\": 150,\n \"height\": 65,\n \"boxMargin\": 10,\n \"boxTextMargin\": 5,\n \"noteMargin\": 10,\n \"messageMargin\": 35,\n \"messageAlign\": \"center\",\n \"mirrorActors\": true,\n \"forceMenus\": false,\n \"bottomMarginAdj\": 1,\n \"rightAngles\": false,\n \"showSequenceNumbers\": false,\n \"actorFontSize\": 14,\n \"actorFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"actorFontWeight\": 400,\n \"noteFontSize\": 14,\n \"noteFontFamily\": \"\\\"trebuchet ms\\\", verdana, arial, sans-serif\",\n \"noteFontWeight\": 400,\n \"noteAlign\": \"center\",\n \"messageFontSize\": 16,\n \"messageFontFamily\": \"\\\"trebuchet ms\\\", verdana, arial, sans-serif\",\n \"messageFontWeight\": 400,\n \"wrap\": false,\n \"wrapPadding\": 10,\n \"labelBoxWidth\": 50,\n \"labelBoxHeight\": 20\n },\n \"gantt\": {\n \"useMaxWidth\": true,\n \"titleTopMargin\": 25,\n \"barHeight\": 20,\n \"barGap\": 4,\n \"topPadding\": 50,\n \"rightPadding\": 75,\n \"leftPadding\": 75,\n \"gridLineStartPadding\": 35,\n \"fontSize\": 11,\n \"sectionFontSize\": 11,\n \"numberSectionStyles\": 4,\n \"axisFormat\": \"%Y-%m-%d\",\n \"topAxis\": false,\n \"displayMode\": \"\",\n \"weekday\": \"sunday\"\n },\n \"journey\": {\n \"useMaxWidth\": true,\n \"diagramMarginX\": 50,\n \"diagramMarginY\": 10,\n \"leftMargin\": 150,\n \"maxLabelWidth\": 360,\n \"width\": 150,\n \"height\": 50,\n \"boxMargin\": 10,\n \"boxTextMargin\": 5,\n \"noteMargin\": 10,\n \"messageMargin\": 35,\n \"messageAlign\": \"center\",\n \"bottomMarginAdj\": 1,\n \"rightAngles\": false,\n \"taskFontSize\": 14,\n \"taskFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"taskMargin\": 50,\n \"activationWidth\": 10,\n \"textPlacement\": \"fo\",\n \"actorColours\": [\n \"#8FBC8F\",\n \"#7CFC00\",\n \"#00FFFF\",\n \"#20B2AA\",\n \"#B0E0E6\",\n \"#FFFFE0\"\n ],\n \"sectionFills\": [\n \"#191970\",\n \"#8B008B\",\n \"#4B0082\",\n \"#2F4F4F\",\n \"#800000\",\n \"#8B4513\",\n \"#00008B\"\n ],\n \"sectionColours\": [\n \"#fff\"\n ],\n \"titleColor\": \"\",\n \"titleFontFamily\": \"\\\"trebuchet ms\\\", verdana, arial, sans-serif\",\n \"titleFontSize\": \"4ex\"\n },\n \"class\": {\n \"useMaxWidth\": true,\n \"titleTopMargin\": 25,\n \"arrowMarkerAbsolute\": false,\n \"dividerMargin\": 10,\n \"padding\": 5,\n \"textHeight\": 10,\n \"defaultRenderer\": \"dagre-wrapper\",\n \"htmlLabels\": false,\n \"hideEmptyMembersBox\": false\n },\n \"state\": {\n \"useMaxWidth\": true,\n \"titleTopMargin\": 25,\n \"dividerMargin\": 10,\n \"sizeUnit\": 5,\n \"padding\": 8,\n \"textHeight\": 10,\n \"titleShift\": -15,\n \"noteMargin\": 10,\n \"forkWidth\": 70,\n \"forkHeight\": 7,\n \"miniPadding\": 2,\n \"fontSizeFactor\": 5.02,\n \"fontSize\": 24,\n \"labelHeight\": 16,\n \"edgeLengthFactor\": \"20\",\n \"compositTitleSize\": 35,\n \"radius\": 5,\n \"defaultRenderer\": \"dagre-wrapper\"\n },\n \"er\": {\n \"useMaxWidth\": true,\n \"titleTopMargin\": 25,\n \"diagramPadding\": 20,\n \"layoutDirection\": \"TB\",\n \"minEntityWidth\": 100,\n \"minEntityHeight\": 75,\n \"entityPadding\": 15,\n \"nodeSpacing\": 140,\n \"rankSpacing\": 80,\n \"stroke\": \"gray\",\n \"fill\": \"honeydew\",\n \"fontSize\": 12\n },\n \"pie\": {\n \"useMaxWidth\": true,\n \"textPosition\": 0.75\n },\n \"quadrantChart\": {\n \"useMaxWidth\": true,\n \"chartWidth\": 500,\n \"chartHeight\": 500,\n \"titleFontSize\": 20,\n \"titlePadding\": 10,\n \"quadrantPadding\": 5,\n \"xAxisLabelPadding\": 5,\n \"yAxisLabelPadding\": 5,\n \"xAxisLabelFontSize\": 16,\n \"yAxisLabelFontSize\": 16,\n \"quadrantLabelFontSize\": 16,\n \"quadrantTextTopPadding\": 5,\n \"pointTextPadding\": 5,\n \"pointLabelFontSize\": 12,\n \"pointRadius\": 5,\n \"xAxisPosition\": \"top\",\n \"yAxisPosition\": \"left\",\n \"quadrantInternalBorderStrokeWidth\": 1,\n \"quadrantExternalBorderStrokeWidth\": 2\n },\n \"xyChart\": {\n \"useMaxWidth\": true,\n \"width\": 700,\n \"height\": 500,\n \"titleFontSize\": 20,\n \"titlePadding\": 10,\n \"showDataLabel\": false,\n \"showTitle\": true,\n \"xAxis\": {\n \"$ref\": \"#/$defs/XYChartAxisConfig\",\n \"showLabel\": true,\n \"labelFontSize\": 14,\n \"labelPadding\": 5,\n \"showTitle\": true,\n \"titleFontSize\": 16,\n \"titlePadding\": 5,\n \"showTick\": true,\n \"tickLength\": 5,\n \"tickWidth\": 2,\n \"showAxisLine\": true,\n \"axisLineWidth\": 2\n },\n \"yAxis\": {\n \"$ref\": \"#/$defs/XYChartAxisConfig\",\n \"showLabel\": true,\n \"labelFontSize\": 14,\n \"labelPadding\": 5,\n \"showTitle\": true,\n \"titleFontSize\": 16,\n \"titlePadding\": 5,\n \"showTick\": true,\n \"tickLength\": 5,\n \"tickWidth\": 2,\n \"showAxisLine\": true,\n \"axisLineWidth\": 2\n },\n \"chartOrientation\": \"vertical\",\n \"plotReservedSpacePercent\": 50\n },\n \"requirement\": {\n \"useMaxWidth\": true,\n \"rect_fill\": \"#f9f9f9\",\n \"text_color\": \"#333\",\n \"rect_border_size\": \"0.5px\",\n \"rect_border_color\": \"#bbb\",\n \"rect_min_width\": 200,\n \"rect_min_height\": 200,\n \"fontSize\": 14,\n \"rect_padding\": 10,\n \"line_height\": 20\n },\n \"mindmap\": {\n \"useMaxWidth\": true,\n \"padding\": 10,\n \"maxNodeWidth\": 200,\n \"layoutAlgorithm\": \"cose-bilkent\"\n },\n \"kanban\": {\n \"useMaxWidth\": true,\n \"padding\": 8,\n \"sectionWidth\": 200,\n \"ticketBaseUrl\": \"\"\n },\n \"timeline\": {\n \"useMaxWidth\": true,\n \"diagramMarginX\": 50,\n \"diagramMarginY\": 10,\n \"leftMargin\": 150,\n \"width\": 150,\n \"height\": 50,\n \"boxMargin\": 10,\n \"boxTextMargin\": 5,\n \"noteMargin\": 10,\n \"messageMargin\": 35,\n \"messageAlign\": \"center\",\n \"bottomMarginAdj\": 1,\n \"rightAngles\": false,\n \"taskFontSize\": 14,\n \"taskFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"taskMargin\": 50,\n \"activationWidth\": 10,\n \"textPlacement\": \"fo\",\n \"actorColours\": [\n \"#8FBC8F\",\n \"#7CFC00\",\n \"#00FFFF\",\n \"#20B2AA\",\n \"#B0E0E6\",\n \"#FFFFE0\"\n ],\n \"sectionFills\": [\n \"#191970\",\n \"#8B008B\",\n \"#4B0082\",\n \"#2F4F4F\",\n \"#800000\",\n \"#8B4513\",\n \"#00008B\"\n ],\n \"sectionColours\": [\n \"#fff\"\n ],\n \"disableMulticolor\": false\n },\n \"gitGraph\": {\n \"useMaxWidth\": true,\n \"titleTopMargin\": 25,\n \"diagramPadding\": 8,\n \"nodeLabel\": {\n \"width\": 75,\n \"height\": 100,\n \"x\": -25,\n \"y\": 0\n },\n \"mainBranchName\": \"main\",\n \"mainBranchOrder\": 0,\n \"showCommitLabel\": true,\n \"showBranches\": true,\n \"rotateCommitLabel\": true,\n \"parallelCommits\": false,\n \"arrowMarkerAbsolute\": false\n },\n \"c4\": {\n \"useMaxWidth\": true,\n \"diagramMarginX\": 50,\n \"diagramMarginY\": 10,\n \"c4ShapeMargin\": 50,\n \"c4ShapePadding\": 20,\n \"width\": 216,\n \"height\": 60,\n \"boxMargin\": 10,\n \"c4ShapeInRow\": 4,\n \"nextLinePaddingX\": 0,\n \"c4BoundaryInRow\": 2,\n \"personFontSize\": 14,\n \"personFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"personFontWeight\": \"normal\",\n \"external_personFontSize\": 14,\n \"external_personFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"external_personFontWeight\": \"normal\",\n \"systemFontSize\": 14,\n \"systemFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"systemFontWeight\": \"normal\",\n \"external_systemFontSize\": 14,\n \"external_systemFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"external_systemFontWeight\": \"normal\",\n \"system_dbFontSize\": 14,\n \"system_dbFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"system_dbFontWeight\": \"normal\",\n \"external_system_dbFontSize\": 14,\n \"external_system_dbFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"external_system_dbFontWeight\": \"normal\",\n \"system_queueFontSize\": 14,\n \"system_queueFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"system_queueFontWeight\": \"normal\",\n \"external_system_queueFontSize\": 14,\n \"external_system_queueFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"external_system_queueFontWeight\": \"normal\",\n \"boundaryFontSize\": 14,\n \"boundaryFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"boundaryFontWeight\": \"normal\",\n \"messageFontSize\": 12,\n \"messageFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"messageFontWeight\": \"normal\",\n \"containerFontSize\": 14,\n \"containerFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"containerFontWeight\": \"normal\",\n \"external_containerFontSize\": 14,\n \"external_containerFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"external_containerFontWeight\": \"normal\",\n \"container_dbFontSize\": 14,\n \"container_dbFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"container_dbFontWeight\": \"normal\",\n \"external_container_dbFontSize\": 14,\n \"external_container_dbFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"external_container_dbFontWeight\": \"normal\",\n \"container_queueFontSize\": 14,\n \"container_queueFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"container_queueFontWeight\": \"normal\",\n \"external_container_queueFontSize\": 14,\n \"external_container_queueFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"external_container_queueFontWeight\": \"normal\",\n \"componentFontSize\": 14,\n \"componentFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"componentFontWeight\": \"normal\",\n \"external_componentFontSize\": 14,\n \"external_componentFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"external_componentFontWeight\": \"normal\",\n \"component_dbFontSize\": 14,\n \"component_dbFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"component_dbFontWeight\": \"normal\",\n \"external_component_dbFontSize\": 14,\n \"external_component_dbFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"external_component_dbFontWeight\": \"normal\",\n \"component_queueFontSize\": 14,\n \"component_queueFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"component_queueFontWeight\": \"normal\",\n \"external_component_queueFontSize\": 14,\n \"external_component_queueFontFamily\": \"\\\"Open Sans\\\", sans-serif\",\n \"external_component_queueFontWeight\": \"normal\",\n \"wrap\": true,\n \"wrapPadding\": 10,\n \"person_bg_color\": \"#08427B\",\n \"person_border_color\": \"#073B6F\",\n \"external_person_bg_color\": \"#686868\",\n \"external_person_border_color\": \"#8A8A8A\",\n \"system_bg_color\": \"#1168BD\",\n \"system_border_color\": \"#3C7FC0\",\n \"system_db_bg_color\": \"#1168BD\",\n \"system_db_border_color\": \"#3C7FC0\",\n \"system_queue_bg_color\": \"#1168BD\",\n \"system_queue_border_color\": \"#3C7FC0\",\n \"external_system_bg_color\": \"#999999\",\n \"external_system_border_color\": \"#8A8A8A\",\n \"external_system_db_bg_color\": \"#999999\",\n \"external_system_db_border_color\": \"#8A8A8A\",\n \"external_system_queue_bg_color\": \"#999999\",\n \"external_system_queue_border_color\": \"#8A8A8A\",\n \"container_bg_color\": \"#438DD5\",\n \"container_border_color\": \"#3C7FC0\",\n \"container_db_bg_color\": \"#438DD5\",\n \"container_db_border_color\": \"#3C7FC0\",\n \"container_queue_bg_color\": \"#438DD5\",\n \"container_queue_border_color\": \"#3C7FC0\",\n \"external_container_bg_color\": \"#B3B3B3\",\n \"external_container_border_color\": \"#A6A6A6\",\n \"external_container_db_bg_color\": \"#B3B3B3\",\n \"external_container_db_border_color\": \"#A6A6A6\",\n \"external_container_queue_bg_color\": \"#B3B3B3\",\n \"external_container_queue_border_color\": \"#A6A6A6\",\n \"component_bg_color\": \"#85BBF0\",\n \"component_border_color\": \"#78A8D8\",\n \"component_db_bg_color\": \"#85BBF0\",\n \"component_db_border_color\": \"#78A8D8\",\n \"component_queue_bg_color\": \"#85BBF0\",\n \"component_queue_border_color\": \"#78A8D8\",\n \"external_component_bg_color\": \"#CCCCCC\",\n \"external_component_border_color\": \"#BFBFBF\",\n \"external_component_db_bg_color\": \"#CCCCCC\",\n \"external_component_db_border_color\": \"#BFBFBF\",\n \"external_component_queue_bg_color\": \"#CCCCCC\",\n \"external_component_queue_border_color\": \"#BFBFBF\"\n },\n \"sankey\": {\n \"useMaxWidth\": true,\n \"width\": 600,\n \"height\": 400,\n \"linkColor\": \"gradient\",\n \"nodeAlignment\": \"justify\",\n \"showValues\": true,\n \"prefix\": \"\",\n \"suffix\": \"\"\n },\n \"block\": {\n \"useMaxWidth\": true,\n \"padding\": 8\n },\n \"packet\": {\n \"useMaxWidth\": true,\n \"rowHeight\": 32,\n \"bitWidth\": 32,\n \"bitsPerRow\": 32,\n \"showBits\": true,\n \"paddingX\": 5,\n \"paddingY\": 5\n },\n \"architecture\": {\n \"useMaxWidth\": true,\n \"padding\": 40,\n \"iconSize\": 80,\n \"fontSize\": 16\n },\n \"radar\": {\n \"useMaxWidth\": true,\n \"width\": 600,\n \"height\": 600,\n \"marginTop\": 50,\n \"marginRight\": 50,\n \"marginBottom\": 50,\n \"marginLeft\": 50,\n \"axisScaleFactor\": 1,\n \"axisLabelFactor\": 1.05,\n \"curveTension\": 0.17\n },\n \"theme\": \"default\",\n \"look\": \"classic\",\n \"handDrawnSeed\": 0,\n \"layout\": \"dagre\",\n \"maxTextSize\": 50000,\n \"maxEdges\": 500,\n \"darkMode\": false,\n \"fontFamily\": \"\\\"trebuchet ms\\\", verdana, arial, sans-serif;\",\n \"logLevel\": 5,\n \"securityLevel\": \"strict\",\n \"startOnLoad\": true,\n \"arrowMarkerAbsolute\": false,\n \"secure\": [\n \"secure\",\n \"securityLevel\",\n \"startOnLoad\",\n \"maxTextSize\",\n \"suppressErrorRendering\",\n \"maxEdges\"\n ],\n \"legacyMathML\": false,\n \"forceLegacyMathML\": false,\n \"deterministicIds\": false,\n \"fontSize\": 16,\n \"markdownAutoWrap\": true,\n \"suppressErrorRendering\": false\n};", "import type { RequiredDeep } from 'type-fest';\n\nimport theme from './themes/index.js';\nimport type { MermaidConfig } from './config.type.js';\n\n// Uses our custom Vite jsonSchemaPlugin to load only the default values from\n// our JSON Schema\n// @ts-expect-error This file is automatically generated via a custom Vite plugin\nimport defaultConfigJson from './schemas/config.schema.yaml?only-defaults=true';\n\n/**\n * Default mermaid configuration options.\n *\n * Please see the Mermaid config JSON Schema for the default JSON values.\n * Non-JSON JS default values are listed in this file, e.g. functions, or\n * `undefined` (explicitly set so that `configKeys` finds them).\n */\nconst config: RequiredDeep = {\n ...defaultConfigJson,\n // Set, even though they're `undefined` so that `configKeys` finds these keys\n // TODO: Should we replace these with `null` so that they can go in the JSON Schema?\n deterministicIDSeed: undefined,\n elk: {\n // mergeEdges is needed here to be considered\n mergeEdges: false,\n nodePlacementStrategy: 'BRANDES_KOEPF',\n forceNodeModelOrder: false,\n considerModelOrder: 'NODES_AND_EDGES',\n },\n themeCSS: undefined,\n\n // add non-JSON default config values\n themeVariables: theme.default.getThemeVariables(),\n sequence: {\n ...defaultConfigJson.sequence,\n messageFont: function () {\n return {\n fontFamily: this.messageFontFamily,\n fontSize: this.messageFontSize,\n fontWeight: this.messageFontWeight,\n };\n },\n noteFont: function () {\n return {\n fontFamily: this.noteFontFamily,\n fontSize: this.noteFontSize,\n fontWeight: this.noteFontWeight,\n };\n },\n actorFont: function () {\n return {\n fontFamily: this.actorFontFamily,\n fontSize: this.actorFontSize,\n fontWeight: this.actorFontWeight,\n };\n },\n },\n class: {\n hideEmptyMembersBox: false,\n },\n gantt: {\n ...defaultConfigJson.gantt,\n tickInterval: undefined,\n useWidth: undefined, // can probably be removed since `configKeys` already includes this\n },\n c4: {\n ...defaultConfigJson.c4,\n useWidth: undefined,\n personFont: function () {\n return {\n fontFamily: this.personFontFamily,\n fontSize: this.personFontSize,\n fontWeight: this.personFontWeight,\n };\n },\n flowchart: {\n ...defaultConfigJson.flowchart,\n inheritDir: false, // default to legacy behavior\n },\n\n external_personFont: function () {\n return {\n fontFamily: this.external_personFontFamily,\n fontSize: this.external_personFontSize,\n fontWeight: this.external_personFontWeight,\n };\n },\n\n systemFont: function () {\n return {\n fontFamily: this.systemFontFamily,\n fontSize: this.systemFontSize,\n fontWeight: this.systemFontWeight,\n };\n },\n\n external_systemFont: function () {\n return {\n fontFamily: this.external_systemFontFamily,\n fontSize: this.external_systemFontSize,\n fontWeight: this.external_systemFontWeight,\n };\n },\n\n system_dbFont: function () {\n return {\n fontFamily: this.system_dbFontFamily,\n fontSize: this.system_dbFontSize,\n fontWeight: this.system_dbFontWeight,\n };\n },\n\n external_system_dbFont: function () {\n return {\n fontFamily: this.external_system_dbFontFamily,\n fontSize: this.external_system_dbFontSize,\n fontWeight: this.external_system_dbFontWeight,\n };\n },\n\n system_queueFont: function () {\n return {\n fontFamily: this.system_queueFontFamily,\n fontSize: this.system_queueFontSize,\n fontWeight: this.system_queueFontWeight,\n };\n },\n\n external_system_queueFont: function () {\n return {\n fontFamily: this.external_system_queueFontFamily,\n fontSize: this.external_system_queueFontSize,\n fontWeight: this.external_system_queueFontWeight,\n };\n },\n\n containerFont: function () {\n return {\n fontFamily: this.containerFontFamily,\n fontSize: this.containerFontSize,\n fontWeight: this.containerFontWeight,\n };\n },\n\n external_containerFont: function () {\n return {\n fontFamily: this.external_containerFontFamily,\n fontSize: this.external_containerFontSize,\n fontWeight: this.external_containerFontWeight,\n };\n },\n\n container_dbFont: function () {\n return {\n fontFamily: this.container_dbFontFamily,\n fontSize: this.container_dbFontSize,\n fontWeight: this.container_dbFontWeight,\n };\n },\n\n external_container_dbFont: function () {\n return {\n fontFamily: this.external_container_dbFontFamily,\n fontSize: this.external_container_dbFontSize,\n fontWeight: this.external_container_dbFontWeight,\n };\n },\n\n container_queueFont: function () {\n return {\n fontFamily: this.container_queueFontFamily,\n fontSize: this.container_queueFontSize,\n fontWeight: this.container_queueFontWeight,\n };\n },\n\n external_container_queueFont: function () {\n return {\n fontFamily: this.external_container_queueFontFamily,\n fontSize: this.external_container_queueFontSize,\n fontWeight: this.external_container_queueFontWeight,\n };\n },\n\n componentFont: function () {\n return {\n fontFamily: this.componentFontFamily,\n fontSize: this.componentFontSize,\n fontWeight: this.componentFontWeight,\n };\n },\n\n external_componentFont: function () {\n return {\n fontFamily: this.external_componentFontFamily,\n fontSize: this.external_componentFontSize,\n fontWeight: this.external_componentFontWeight,\n };\n },\n\n component_dbFont: function () {\n return {\n fontFamily: this.component_dbFontFamily,\n fontSize: this.component_dbFontSize,\n fontWeight: this.component_dbFontWeight,\n };\n },\n\n external_component_dbFont: function () {\n return {\n fontFamily: this.external_component_dbFontFamily,\n fontSize: this.external_component_dbFontSize,\n fontWeight: this.external_component_dbFontWeight,\n };\n },\n\n component_queueFont: function () {\n return {\n fontFamily: this.component_queueFontFamily,\n fontSize: this.component_queueFontSize,\n fontWeight: this.component_queueFontWeight,\n };\n },\n\n external_component_queueFont: function () {\n return {\n fontFamily: this.external_component_queueFontFamily,\n fontSize: this.external_component_queueFontSize,\n fontWeight: this.external_component_queueFontWeight,\n };\n },\n\n boundaryFont: function () {\n return {\n fontFamily: this.boundaryFontFamily,\n fontSize: this.boundaryFontSize,\n fontWeight: this.boundaryFontWeight,\n };\n },\n\n messageFont: function () {\n return {\n fontFamily: this.messageFontFamily,\n fontSize: this.messageFontSize,\n fontWeight: this.messageFontWeight,\n };\n },\n },\n pie: {\n ...defaultConfigJson.pie,\n useWidth: 984,\n },\n xyChart: {\n ...defaultConfigJson.xyChart,\n useWidth: undefined,\n },\n requirement: {\n ...defaultConfigJson.requirement,\n useWidth: undefined,\n },\n packet: {\n ...defaultConfigJson.packet,\n },\n radar: {\n ...defaultConfigJson.radar,\n },\n treemap: {\n useMaxWidth: true,\n padding: 10,\n diagramPadding: 8,\n showValues: true,\n nodeWidth: 100,\n nodeHeight: 40,\n borderWidth: 1,\n valueFontSize: 12,\n labelFontSize: 14,\n valueFormat: ',',\n },\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst keyify = (obj: any, prefix = ''): string[] =>\n Object.keys(obj).reduce((res: string[], el): string[] => {\n if (Array.isArray(obj[el])) {\n return res;\n } else if (typeof obj[el] === 'object' && obj[el] !== null) {\n return [...res, prefix + el, ...keyify(obj[el], '')];\n }\n return [...res, prefix + el];\n }, []);\n\nexport const configKeys = new Set(keyify(config, ''));\nexport default config;\n", "import { configKeys } from '../defaultConfig.js';\nimport { log } from '../logger.js';\n\n/**\n * Sanitizes directive objects\n *\n * @param args - Directive's JSON\n */\nexport const sanitizeDirective = (args: any): void => {\n log.debug('sanitizeDirective called with', args);\n\n // Return if not an object\n if (typeof args !== 'object' || args == null) {\n return;\n }\n\n // Sanitize each element if an array\n if (Array.isArray(args)) {\n args.forEach((arg) => sanitizeDirective(arg));\n return;\n }\n\n // Sanitize each key if an object\n for (const key of Object.keys(args)) {\n log.debug('Checking key', key);\n if (\n key.startsWith('__') ||\n key.includes('proto') ||\n key.includes('constr') ||\n !configKeys.has(key) ||\n args[key] == null\n ) {\n log.debug('sanitize deleting key: ', key);\n delete args[key];\n continue;\n }\n\n // Recurse if an object\n if (typeof args[key] === 'object') {\n log.debug('sanitizing object', key);\n sanitizeDirective(args[key]);\n continue;\n }\n\n const cssMatchers = ['themeCSS', 'fontFamily', 'altFontFamily'];\n for (const cssKey of cssMatchers) {\n if (key.includes(cssKey)) {\n log.debug('sanitizing css option', key);\n args[key] = sanitizeCss(args[key]);\n }\n }\n }\n\n if (args.themeVariables) {\n for (const k of Object.keys(args.themeVariables)) {\n const val = args.themeVariables[k];\n if (val?.match && !val.match(/^[\\d \"#%(),.;A-Za-z]+$/)) {\n args.themeVariables[k] = '';\n }\n }\n }\n log.debug('After sanitization', args);\n};\n\nexport const sanitizeCss = (str: string): string => {\n let startCnt = 0;\n let endCnt = 0;\n\n for (const element of str) {\n if (startCnt < endCnt) {\n return '{ /* ERROR: Unbalanced CSS */ }';\n }\n if (element === '{') {\n startCnt++;\n } else if (element === '}') {\n endCnt++;\n }\n }\n if (startCnt !== endCnt) {\n return '{ /* ERROR: Unbalanced CSS */ }';\n }\n // Todo add more checks here\n return str;\n};\n", "import assignWithDepth from './assignWithDepth.js';\nimport { log } from './logger.js';\nimport theme from './themes/index.js';\nimport config from './defaultConfig.js';\nimport type { MermaidConfig } from './config.type.js';\nimport { sanitizeDirective } from './utils/sanitizeDirective.js';\n\nexport const defaultConfig: MermaidConfig = Object.freeze(config);\n\nlet siteConfig: MermaidConfig = assignWithDepth({}, defaultConfig);\nlet configFromInitialize: MermaidConfig;\nlet directives: MermaidConfig[] = [];\nlet currentConfig: MermaidConfig = assignWithDepth({}, defaultConfig);\n\nexport const updateCurrentConfig = (siteCfg: MermaidConfig, _directives: MermaidConfig[]) => {\n // start with config being the siteConfig\n let cfg: MermaidConfig = assignWithDepth({}, siteCfg);\n // let sCfg = assignWithDepth(defaultConfig, siteConfigDelta);\n\n // Join directives\n let sumOfDirectives: MermaidConfig = {};\n for (const d of _directives) {\n sanitize(d);\n // Apply the data from the directive where the overrides the themeVariables\n sumOfDirectives = assignWithDepth(sumOfDirectives, d);\n }\n\n cfg = assignWithDepth(cfg, sumOfDirectives);\n\n if (sumOfDirectives.theme && sumOfDirectives.theme in theme) {\n const tmpConfigFromInitialize = assignWithDepth({}, configFromInitialize);\n const themeVariables = assignWithDepth(\n tmpConfigFromInitialize.themeVariables || {},\n sumOfDirectives.themeVariables\n );\n if (cfg.theme && cfg.theme in theme) {\n cfg.themeVariables = theme[cfg.theme as keyof typeof theme].getThemeVariables(themeVariables);\n }\n }\n\n currentConfig = cfg;\n checkConfig(currentConfig);\n return currentConfig;\n};\n\n/**\n * ## setSiteConfig\n *\n * | Function | Description | Type | Values |\n * | ------------- | ------------------------------------- | ----------- | --------------------------------------- |\n * | setSiteConfig | Sets the siteConfig to desired values | Put Request | Any Values, except ones in secure array |\n *\n * **Notes:** Sets the siteConfig. The siteConfig is a protected configuration for repeat use. Calls\n * to reset() will reset the currentConfig to siteConfig. Calls to reset(configApi.defaultConfig)\n * will reset siteConfig and currentConfig to the defaultConfig Note: currentConfig is set in this\n * function _Default value: At default, will mirror Global Config_\n *\n * @param conf - The base currentConfig to use as siteConfig\n * @returns The new siteConfig\n */\nexport const setSiteConfig = (conf: MermaidConfig): MermaidConfig => {\n siteConfig = assignWithDepth({}, defaultConfig);\n siteConfig = assignWithDepth(siteConfig, conf);\n\n // @ts-ignore: TODO Fix ts errors\n if (conf.theme && theme[conf.theme]) {\n // @ts-ignore: TODO Fix ts errors\n siteConfig.themeVariables = theme[conf.theme].getThemeVariables(conf.themeVariables);\n }\n\n updateCurrentConfig(siteConfig, directives);\n return siteConfig;\n};\n\nexport const saveConfigFromInitialize = (conf: MermaidConfig): void => {\n configFromInitialize = assignWithDepth({}, conf);\n};\n\nexport const updateSiteConfig = (conf: MermaidConfig): MermaidConfig => {\n siteConfig = assignWithDepth(siteConfig, conf);\n updateCurrentConfig(siteConfig, directives);\n\n return siteConfig;\n};\n/**\n * ## getSiteConfig\n *\n * | Function | Description | Type | Values |\n * | ------------- | ------------------------------------------------- | ----------- | -------------------------------- |\n * | setSiteConfig | Returns the current siteConfig base configuration | Get Request | Returns Any Values in siteConfig |\n *\n * **Notes**: Returns **any** values in siteConfig.\n *\n * @returns The siteConfig\n */\nexport const getSiteConfig = (): MermaidConfig => {\n return assignWithDepth({}, siteConfig);\n};\n/**\n * ## setConfig\n *\n * | Function | Description | Type | Values |\n * | ------------- | ------------------------------------- | ----------- | --------------------------------------- |\n * | setSiteConfig | Sets the siteConfig to desired values | Put Request | Any Values, except ones in secure array |\n *\n * **Notes**: Sets the currentConfig. The parameter conf is sanitized based on the siteConfig.secure\n * keys. Any values found in conf with key found in siteConfig.secure will be replaced with the\n * corresponding siteConfig value.\n *\n * @param conf - The potential currentConfig\n * @returns The currentConfig merged with the sanitized conf\n */\nexport const setConfig = (conf: MermaidConfig): MermaidConfig => {\n checkConfig(conf);\n assignWithDepth(currentConfig, conf);\n\n return getConfig();\n};\n\n/**\n * ## getConfig\n *\n * | Function | Description | Type | Return Values |\n * | --------- | ------------------------- | ----------- | ------------------------------ |\n * | getConfig | Obtains the currentConfig | Get Request | Any Values from current Config |\n *\n * **Notes**: Avoid calling this function repeatedly. Instead, store the result in a variable and use it, and pass it down to function calls.\n *\n * @returns The currentConfig\n */\nexport const getConfig = (): MermaidConfig => {\n return assignWithDepth({}, currentConfig);\n};\n/**\n * ## sanitize\n *\n * | Function | Description | Type | Values |\n * | -------- | -------------------------------------- | ----------- | ------ |\n * | sanitize | Sets the siteConfig to desired values. | Put Request | None |\n *\n * Ensures options parameter does not attempt to override siteConfig secure keys **Notes**: modifies\n * options in-place\n *\n * @param options - The potential setConfig parameter\n */\nexport const sanitize = (options: any) => {\n if (!options) {\n return;\n }\n // Checking that options are not in the list of excluded options\n ['secure', ...(siteConfig.secure ?? [])].forEach((key) => {\n if (Object.hasOwn(options, key)) {\n // DO NOT attempt to print options[key] within `${}` as a malicious script\n // can exploit the logger's attempt to stringify the value and execute arbitrary code\n log.debug(`Denied attempt to modify a secure key ${key}`, options[key]);\n delete options[key];\n }\n });\n\n // Check that there no attempts of prototype pollution\n Object.keys(options).forEach((key) => {\n if (key.startsWith('__')) {\n delete options[key];\n }\n });\n // Check that there no attempts of xss, there should be no tags at all in the directive\n // blocking data urls as base64 urls can contain svg's with inline script tags\n Object.keys(options).forEach((key) => {\n if (\n typeof options[key] === 'string' &&\n (options[key].includes('<') ||\n options[key].includes('>') ||\n options[key].includes('url(data:'))\n ) {\n delete options[key];\n }\n if (typeof options[key] === 'object') {\n sanitize(options[key]);\n }\n });\n};\n\n/**\n * Pushes in a directive to the configuration\n *\n * @param directive - The directive to push in\n */\nexport const addDirective = (directive: MermaidConfig) => {\n sanitizeDirective(directive);\n\n // If the directive has a fontFamily, but no themeVariables, add the fontFamily to the themeVariables\n if (directive.fontFamily && !directive.themeVariables?.fontFamily) {\n directive.themeVariables = {\n ...directive.themeVariables,\n fontFamily: directive.fontFamily,\n };\n }\n\n directives.push(directive);\n updateCurrentConfig(siteConfig, directives);\n};\n\n/**\n * ## reset\n *\n * | Function | Description | Type | Required | Values |\n * | -------- | ---------------------------- | ----------- | -------- | ------ |\n * | reset | Resets currentConfig to conf | Put Request | Required | None |\n *\n * ## conf\n *\n * | Parameter | Description | Type | Required | Values |\n * | --------- | -------------------------------------------------------------- | ---------- | -------- | -------------------------------------------- |\n * | conf | base set of values, which currentConfig could be **reset** to. | Dictionary | Required | Any Values, with respect to the secure Array |\n *\n * **Notes**: (default: current siteConfig ) (optional, default `getSiteConfig()`)\n *\n * @param config - base set of values, which currentConfig could be **reset** to.\n * Defaults to the current siteConfig (e.g returned by {@link getSiteConfig}).\n */\nexport const reset = (config = siteConfig): void => {\n // Replace current config with siteConfig\n directives = [];\n updateCurrentConfig(config, directives);\n};\n\nconst ConfigWarning = {\n LAZY_LOAD_DEPRECATED:\n 'The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead.',\n} as const;\n\ntype ConfigWarningStrings = keyof typeof ConfigWarning;\nconst issuedWarnings: Partial> = {};\nconst issueWarning = (warning: ConfigWarningStrings) => {\n if (issuedWarnings[warning]) {\n return;\n }\n log.warn(ConfigWarning[warning]);\n issuedWarnings[warning] = true;\n};\n\nconst checkConfig = (config: MermaidConfig) => {\n if (!config) {\n return;\n }\n // @ts-expect-error Properties were removed in v10. Warning should exist.\n if (config.lazyLoadedDiagrams || config.loadExternalDiagramsAtStartup) {\n issueWarning('LAZY_LOAD_DEPRECATED');\n }\n};\n\nexport const getUserDefinedConfig = (): MermaidConfig => {\n let userConfig: MermaidConfig = {};\n\n if (configFromInitialize) {\n userConfig = assignWithDepth(userConfig, configFromInitialize);\n }\n\n for (const d of directives) {\n userConfig = assignWithDepth(userConfig, d);\n }\n\n return userConfig;\n};\n", "import DOMPurify from 'dompurify';\nimport type { MermaidConfig } from '../../config.type.js';\n\n// Remove and ignore br:s\nexport const lineBreakRegex = //gi;\n\n/**\n * Gets the rows of lines in a string\n *\n * @param s - The string to check the lines for\n * @returns The rows in that string\n */\nexport const getRows = (s?: string): string[] => {\n if (!s) {\n return [''];\n }\n const str = breakToPlaceholder(s).replace(/\\\\n/g, '#br#');\n return str.split('#br#');\n};\n\nconst setupDompurifyHooksIfNotSetup = (() => {\n let setup = false;\n\n return () => {\n if (!setup) {\n setupDompurifyHooks();\n setup = true;\n }\n };\n})();\n\nfunction setupDompurifyHooks() {\n const TEMPORARY_ATTRIBUTE = 'data-temp-href-target';\n\n DOMPurify.addHook('beforeSanitizeAttributes', (node) => {\n if (node.tagName === 'A' && node.hasAttribute('target')) {\n node.setAttribute(TEMPORARY_ATTRIBUTE, node.getAttribute('target') ?? '');\n }\n });\n\n DOMPurify.addHook('afterSanitizeAttributes', (node) => {\n if (node.tagName === 'A' && node.hasAttribute(TEMPORARY_ATTRIBUTE)) {\n node.setAttribute('target', node.getAttribute(TEMPORARY_ATTRIBUTE) ?? '');\n node.removeAttribute(TEMPORARY_ATTRIBUTE);\n if (node.getAttribute('target') === '_blank') {\n node.setAttribute('rel', 'noopener');\n }\n }\n });\n}\n\n/**\n * Removes script tags from a text\n *\n * @param txt - The text to sanitize\n * @returns The safer text\n */\nexport const removeScript = (txt: string): string => {\n setupDompurifyHooksIfNotSetup();\n\n const sanitizedText = DOMPurify.sanitize(txt);\n\n return sanitizedText;\n};\n\nconst sanitizeMore = (text: string, config: MermaidConfig) => {\n if (config.flowchart?.htmlLabels !== false) {\n const level = config.securityLevel;\n if (level === 'antiscript' || level === 'strict') {\n text = removeScript(text);\n } else if (level !== 'loose') {\n text = breakToPlaceholder(text);\n text = text.replace(//g, '>');\n text = text.replace(/=/g, '=');\n text = placeholderToBreak(text);\n }\n }\n return text;\n};\n\nexport const sanitizeText = (text: string, config: MermaidConfig): string => {\n if (!text) {\n return text;\n }\n if (config.dompurifyConfig) {\n text = DOMPurify.sanitize(sanitizeMore(text, config), config.dompurifyConfig).toString();\n } else {\n text = DOMPurify.sanitize(sanitizeMore(text, config), {\n FORBID_TAGS: ['style'],\n }).toString();\n }\n return text;\n};\n\nexport const sanitizeTextOrArray = (\n a: string | string[] | string[][],\n config: MermaidConfig\n): string | string[] => {\n if (typeof a === 'string') {\n return sanitizeText(a, config);\n }\n // TODO: Refactor to avoid flat.\n return a.flat().map((x: string) => sanitizeText(x, config));\n};\n\n/**\n * Whether or not a text has any line breaks\n *\n * @param text - The text to test\n * @returns Whether or not the text has breaks\n */\nexport const hasBreaks = (text: string): boolean => {\n return lineBreakRegex.test(text);\n};\n\n/**\n * Splits on
tags\n *\n * @param text - Text to split\n * @returns List of lines as strings\n */\nexport const splitBreaks = (text: string): string[] => {\n return text.split(lineBreakRegex);\n};\n\n/**\n * Converts placeholders to line breaks in HTML\n *\n * @param s - HTML with placeholders\n * @returns HTML with breaks instead of placeholders\n */\nconst placeholderToBreak = (s: string): string => {\n return s.replace(/#br#/g, '
');\n};\n\n/**\n * Opposite of `placeholderToBreak`, converts breaks to placeholders\n *\n * @param s - HTML string\n * @returns String with placeholders\n */\nconst breakToPlaceholder = (s: string): string => {\n return s.replace(lineBreakRegex, '#br#');\n};\n\n/**\n * Gets the current URL\n *\n * @param useAbsolute - Whether to return the absolute URL or not\n * @returns The current URL\n */\nexport const getUrl = (useAbsolute: boolean): string => {\n let url = '';\n if (useAbsolute) {\n url =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n window.location.search;\n\n url = CSS.escape(url);\n }\n\n return url;\n};\n\n/**\n * Converts a string/boolean into a boolean\n *\n * @param val - String or boolean to convert\n * @returns The result from the input\n */\nexport const evaluate = (val?: string | boolean): boolean =>\n val === false || ['false', 'null', '0'].includes(String(val).trim().toLowerCase()) ? false : true;\n\n/**\n * Wrapper around Math.max which removes non-numeric values\n * Returns the larger of a set of supplied numeric expressions.\n * @param values - Numeric expressions to be evaluated\n * @returns The smaller value\n */\nexport const getMax = function (...values: number[]): number {\n const newValues: number[] = values.filter((value) => {\n return !isNaN(value);\n });\n return Math.max(...newValues);\n};\n\n/**\n * Wrapper around Math.min which removes non-numeric values\n * Returns the smaller of a set of supplied numeric expressions.\n * @param values - Numeric expressions to be evaluated\n * @returns The smaller value\n */\nexport const getMin = function (...values: number[]): number {\n const newValues: number[] = values.filter((value) => {\n return !isNaN(value);\n });\n return Math.min(...newValues);\n};\n\n/**\n * Makes generics in typescript syntax\n *\n * @example\n * Array of array of strings in typescript syntax\n *\n * ```js\n * // returns \"Array>\"\n * parseGenericTypes('Array~Array~string~~');\n * ```\n * @param text - The text to convert\n * @returns The converted string\n */\nexport const parseGenericTypes = function (input: string): string {\n const inputSets = input.split(/(,)/);\n const output = [];\n\n for (let i = 0; i < inputSets.length; i++) {\n let thisSet = inputSets[i];\n\n // if the original input included a value such as \"~K, V~\"\", these will be split into\n // an array of [\"~K\",\",\",\" V~\"].\n // This means that on each call of processSet, there will only be 1 ~ present\n // To account for this, if we encounter a \",\", we are checking the previous and next sets in the array\n // to see if they contain matching ~'s\n // in which case we are assuming that they should be rejoined and sent to be processed\n if (thisSet === ',' && i > 0 && i + 1 < inputSets.length) {\n const previousSet = inputSets[i - 1];\n const nextSet = inputSets[i + 1];\n\n if (shouldCombineSets(previousSet, nextSet)) {\n thisSet = previousSet + ',' + nextSet;\n i++; // Move the index forward to skip the next iteration since we're combining sets\n output.pop();\n }\n }\n\n output.push(processSet(thisSet));\n }\n\n return output.join('');\n};\n\nexport const countOccurrence = (string: string, substring: string): number => {\n return Math.max(0, string.split(substring).length - 1);\n};\n\nconst shouldCombineSets = (previousSet: string, nextSet: string): boolean => {\n const prevCount = countOccurrence(previousSet, '~');\n const nextCount = countOccurrence(nextSet, '~');\n\n return prevCount === 1 && nextCount === 1;\n};\n\nconst processSet = (input: string): string => {\n const tildeCount = countOccurrence(input, '~');\n let hasStartingTilde = false;\n\n if (tildeCount <= 1) {\n return input;\n }\n\n // If there is an odd number of tildes, and the input starts with a tilde, we need to remove it and add it back in later\n if (tildeCount % 2 !== 0 && input.startsWith('~')) {\n input = input.substring(1);\n hasStartingTilde = true;\n }\n\n const chars = [...input];\n\n let first = chars.indexOf('~');\n let last = chars.lastIndexOf('~');\n\n while (first !== -1 && last !== -1 && first !== last) {\n chars[first] = '<';\n chars[last] = '>';\n\n first = chars.indexOf('~');\n last = chars.lastIndexOf('~');\n }\n\n // Add the starting tilde back in if we removed it\n if (hasStartingTilde) {\n chars.unshift('~');\n }\n\n return chars.join('');\n};\n\n// TODO: find a better method for detecting support. This interface was added in the MathML 4 spec.\n// Firefox versions between [4,71] (0.47%) and Safari versions between [5,13.4] (0.17%) don't have this interface implemented but MathML is supported\nexport const isMathMLSupported = () => window.MathMLElement !== undefined;\n\nexport const katexRegex = /\\$\\$(.*)\\$\\$/g;\n\n/**\n * Whether or not a text has KaTeX delimiters\n *\n * @param text - The text to test\n * @returns Whether or not the text has KaTeX delimiters\n */\nexport const hasKatex = (text: string): boolean => (text.match(katexRegex)?.length ?? 0) > 0;\n\n/**\n * Computes the minimum dimensions needed to display a div containing MathML\n *\n * @param text - The text to test\n * @param config - Configuration for Mermaid\n * @returns Object containing \\{width, height\\}\n */\nexport const calculateMathMLDimensions = async (text: string, config: MermaidConfig) => {\n const divElem = document.createElement('div');\n divElem.innerHTML = await renderKatexSanitized(text, config);\n divElem.id = 'katex-temp';\n divElem.style.visibility = 'hidden';\n divElem.style.position = 'absolute';\n divElem.style.top = '0';\n const body = document.querySelector('body');\n body?.insertAdjacentElement('beforeend', divElem);\n const dim = { width: divElem.clientWidth, height: divElem.clientHeight };\n divElem.remove();\n return dim;\n};\n\nconst renderKatexUnsanitized = async (text: string, config: MermaidConfig): Promise => {\n if (!hasKatex(text)) {\n return text;\n }\n\n if (!(isMathMLSupported() || config.legacyMathML || config.forceLegacyMathML)) {\n return text.replace(katexRegex, 'MathML is unsupported in this environment.');\n }\n\n if (includeLargeFeatures) {\n const { default: katex } = await import('katex');\n const outputMode =\n config.forceLegacyMathML || (!isMathMLSupported() && config.legacyMathML)\n ? 'htmlAndMathml'\n : 'mathml';\n return text\n .split(lineBreakRegex)\n .map((line) =>\n hasKatex(line)\n ? `

${line}
`\n : `
${line}
`\n )\n .join('')\n .replace(katexRegex, (_, c) =>\n katex\n .renderToString(c, {\n throwOnError: true,\n displayMode: true,\n output: outputMode,\n })\n .replace(/\\n/g, ' ')\n .replace(//g, '')\n );\n }\n\n return text.replace(\n katexRegex,\n 'Katex is not supported in @mermaid-js/tiny. Please use the full mermaid library.'\n );\n};\n\n/**\n * Attempts to render and return the KaTeX portion of a string with MathML\n *\n * @param text - The text to test\n * @param config - Configuration for Mermaid\n * @returns String containing MathML if KaTeX is supported, or an error message if it is not and stylesheets aren't present\n */\nexport const renderKatexSanitized = async (\n text: string,\n config: MermaidConfig\n): Promise => {\n return sanitizeText(await renderKatexUnsanitized(text, config), config);\n};\n\nexport default {\n getRows,\n sanitizeText,\n sanitizeTextOrArray,\n hasBreaks,\n splitBreaks,\n lineBreakRegex,\n removeScript,\n getUrl,\n evaluate,\n getMax,\n getMin,\n};\n", "import { log } from './logger.js';\n\n/**\n * Applies d3 attributes\n *\n * @param {any} d3Elem D3 Element to apply the attributes onto\n * @param {[string, string][]} attrs Object.keys equivalent format of key to value mapping of attributes\n */\nconst d3Attrs = function (d3Elem, attrs) {\n for (let attr of attrs) {\n d3Elem.attr(attr[0], attr[1]);\n }\n};\n\n/**\n * Gives attributes for an SVG's size given arguments\n *\n * @param {number} height The height of the SVG\n * @param {number} width The width of the SVG\n * @param {boolean} useMaxWidth Whether or not to use max-width and set width to 100%\n * @returns {Map<'height' | 'width' | 'style', string>} Attributes for the SVG\n */\nexport const calculateSvgSizeAttrs = function (height, width, useMaxWidth) {\n let attrs = new Map();\n if (useMaxWidth) {\n attrs.set('width', '100%');\n attrs.set('style', `max-width: ${width}px;`);\n } else {\n attrs.set('height', height);\n attrs.set('width', width);\n }\n return attrs;\n};\n\n/**\n * Applies attributes from `calculateSvgSizeAttrs`\n *\n * @param {import('./diagram-api/types.js').SVG} svgElem The SVG Element to configure\n * @param {number} height The height of the SVG\n * @param {number} width The width of the SVG\n * @param {boolean} useMaxWidth Whether or not to use max-width and set width to 100%\n */\nexport const configureSvgSize = function (svgElem, height, width, useMaxWidth) {\n const attrs = calculateSvgSizeAttrs(height, width, useMaxWidth);\n d3Attrs(svgElem, attrs);\n};\n\n// TODO v11: Remove the graph parameter. It is not used.\nexport const setupGraphViewbox = function (graph, svgElem, padding, useMaxWidth) {\n const svgBounds = svgElem.node().getBBox();\n const sWidth = svgBounds.width;\n const sHeight = svgBounds.height;\n\n log.info(`SVG bounds: ${sWidth}x${sHeight}`, svgBounds);\n\n let width = 0;\n let height = 0;\n log.info(`Graph bounds: ${width}x${height}`, graph);\n\n width = sWidth + padding * 2;\n height = sHeight + padding * 2;\n\n log.info(`Calculated bounds: ${width}x${height}`);\n configureSvgSize(svgElem, height, width, useMaxWidth);\n\n // Ensure the viewBox includes the whole svgBounds area with extra space for padding\n const vBox = `${svgBounds.x - padding} ${svgBounds.y - padding} ${\n svgBounds.width + 2 * padding\n } ${svgBounds.height + 2 * padding}`;\n\n svgElem.attr('viewBox', vBox);\n};\n", "import type { FlowChartStyleOptions } from './diagrams/flowchart/styles.js';\nimport { log } from './logger.js';\nimport type { DiagramStylesProvider } from './diagram-api/types.js';\n\nconst themes: Record = {};\n\nconst getStyles = (\n type: string,\n userStyles: string,\n options: {\n fontFamily: string;\n fontSize: string;\n textColor: string;\n errorBkgColor: string;\n errorTextColor: string;\n lineColor: string;\n } & FlowChartStyleOptions\n) => {\n let diagramStyles = '';\n if (type in themes && themes[type]) {\n diagramStyles = themes[type](options);\n } else {\n log.warn(`No theme found for ${type}`);\n }\n return ` & {\n font-family: ${options.fontFamily};\n font-size: ${options.fontSize};\n fill: ${options.textColor}\n }\n @keyframes edge-animation-frame {\n from {\n stroke-dashoffset: 0;\n }\n }\n @keyframes dash {\n to {\n stroke-dashoffset: 0;\n }\n }\n & .edge-animation-slow {\n stroke-dasharray: 9,5 !important;\n stroke-dashoffset: 900;\n animation: dash 50s linear infinite;\n stroke-linecap: round;\n }\n & .edge-animation-fast {\n stroke-dasharray: 9,5 !important;\n stroke-dashoffset: 900;\n animation: dash 20s linear infinite;\n stroke-linecap: round;\n }\n /* Classes common for multiple diagrams */\n\n & .error-icon {\n fill: ${options.errorBkgColor};\n }\n & .error-text {\n fill: ${options.errorTextColor};\n stroke: ${options.errorTextColor};\n }\n\n & .edge-thickness-normal {\n stroke-width: 1px;\n }\n & .edge-thickness-thick {\n stroke-width: 3.5px\n }\n & .edge-pattern-solid {\n stroke-dasharray: 0;\n }\n & .edge-thickness-invisible {\n stroke-width: 0;\n fill: none;\n }\n & .edge-pattern-dashed{\n stroke-dasharray: 3;\n }\n .edge-pattern-dotted {\n stroke-dasharray: 2;\n }\n\n & .marker {\n fill: ${options.lineColor};\n stroke: ${options.lineColor};\n }\n & .marker.cross {\n stroke: ${options.lineColor};\n }\n\n & svg {\n font-family: ${options.fontFamily};\n font-size: ${options.fontSize};\n }\n & p {\n margin: 0\n }\n\n ${diagramStyles}\n\n ${userStyles}\n`;\n};\n\nexport const addStylesForDiagram = (type: string, diagramTheme?: DiagramStylesProvider): void => {\n if (diagramTheme !== undefined) {\n themes[type] = diagramTheme;\n }\n};\n\nexport default getStyles;\n", "import { sanitizeText as _sanitizeText } from './common.js';\nimport { getConfig } from '../../config.js';\n\nlet accTitle = '';\nlet diagramTitle = '';\nlet accDescription = '';\n\nconst sanitizeText = (txt: string): string => _sanitizeText(txt, getConfig());\n\nexport const clear = (): void => {\n accTitle = '';\n accDescription = '';\n diagramTitle = '';\n};\n\nexport const setAccTitle = (txt: string): void => {\n accTitle = sanitizeText(txt).replace(/^\\s+/g, '');\n};\n\nexport const getAccTitle = (): string => accTitle;\n\nexport const setAccDescription = (txt: string): void => {\n accDescription = sanitizeText(txt).replace(/\\n\\s+/g, '\\n');\n};\n\nexport const getAccDescription = (): string => accDescription;\n\nexport const setDiagramTitle = (txt: string): void => {\n diagramTitle = sanitizeText(txt);\n};\n\nexport const getDiagramTitle = (): string => diagramTitle;\n", "import { addDetector } from './detectType.js';\nimport { log as _log, setLogLevel as _setLogLevel } from '../logger.js';\nimport {\n getConfig as _getConfig,\n setConfig as _setConfig,\n defaultConfig as _defaultConfig,\n setSiteConfig as _setSiteConfig,\n} from '../config.js';\nimport { sanitizeText as _sanitizeText } from '../diagrams/common/common.js';\nimport { setupGraphViewbox as _setupGraphViewbox } from '../setupGraphViewbox.js';\nimport { addStylesForDiagram } from '../styles.js';\nimport type { DiagramDefinition, DiagramDetector } from './types.js';\nimport * as _commonDb from '../diagrams/common/commonDb.js';\n\n/*\n Packaging and exposing resources for external diagrams so that they can import\n diagramAPI and have access to select parts of mermaid common code required to\n create diagrams working like the internal diagrams.\n*/\nexport const log = _log;\nexport const setLogLevel = _setLogLevel;\nexport const getConfig = _getConfig;\nexport const setConfig = _setConfig;\nexport const defaultConfig = _defaultConfig;\nexport const setSiteConfig = _setSiteConfig;\nexport const sanitizeText = (text: string) => _sanitizeText(text, getConfig());\nexport const setupGraphViewbox = _setupGraphViewbox;\nexport const getCommonDb = () => {\n return _commonDb;\n};\n\nconst diagrams: Record = {};\nexport type Detectors = Record;\n\n/**\n * Registers the given diagram with Mermaid.\n *\n * Can be used for third-party custom diagrams.\n *\n * @param id - A unique ID for the given diagram.\n * @param diagram - The diagram definition.\n * @param detector - Function that returns `true` if a given mermaid text is this diagram definition.\n */\nexport const registerDiagram = (\n id: string,\n diagram: DiagramDefinition,\n detector?: DiagramDetector\n) => {\n if (diagrams[id]) {\n log.warn(`Diagram with id ${id} already registered. Overwriting.`);\n }\n diagrams[id] = diagram;\n if (detector) {\n addDetector(id, detector);\n }\n addStylesForDiagram(id, diagram.styles);\n\n diagram.injectUtils?.(\n log,\n setLogLevel,\n getConfig,\n sanitizeText,\n setupGraphViewbox,\n getCommonDb(),\n () => {\n // parseDirective is removed in https://github.com/mermaid-js/mermaid/pull/4759.\n // This is a no-op for legacy support.\n }\n );\n};\n\nexport const getDiagram = (name: string): DiagramDefinition => {\n if (name in diagrams) {\n return diagrams[name];\n }\n throw new DiagramNotFoundError(name);\n};\n\nexport class DiagramNotFoundError extends Error {\n constructor(name: string) {\n super(`Diagram ${name} not found.`);\n }\n}\n"], + "mappings": "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", + "names": ["config", "diagrams", "config", "adjust", "adjust", "adjust", "darken", "invert", "isDark", "lighten", "Theme", "lighten", "adjust", "invert", "darken", "isDark", "getThemeVariables", "invert", "lighten", "rgba", "adjust", "darken", "isDark", "Theme", "adjust", "invert", "rgba", "darken", "lighten", "isDark", "getThemeVariables", "adjust", "darken", "invert", "isDark", "lighten", "Theme", "lighten", "invert", "darken", "adjust", "isDark", "getThemeVariables", "invert", "darken", "lighten", "adjust", "isDark", "Theme", "lighten", "adjust", "invert", "darken", "isDark", "getThemeVariables", "getThemeVariables", "config", "config", "sanitizeText", "log", "setLogLevel", "getConfig", "setConfig", "defaultConfig", "sanitizeText", "getConfig", "setupGraphViewbox", "log", "setLogLevel"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-AGHRB4JF.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-AGHRB4JF.mjs new file mode 100644 index 0000000..90a6fae --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-AGHRB4JF.mjs @@ -0,0 +1,82 @@ +var __defProp = Object.defineProperty; +var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; + +// src/logger.ts +import dayjs from "dayjs"; +var LEVELS = { + trace: 0, + debug: 1, + info: 2, + warn: 3, + error: 4, + fatal: 5 +}; +var log = { + trace: /* @__PURE__ */ __name((..._args) => { + }, "trace"), + debug: /* @__PURE__ */ __name((..._args) => { + }, "debug"), + info: /* @__PURE__ */ __name((..._args) => { + }, "info"), + warn: /* @__PURE__ */ __name((..._args) => { + }, "warn"), + error: /* @__PURE__ */ __name((..._args) => { + }, "error"), + fatal: /* @__PURE__ */ __name((..._args) => { + }, "fatal") +}; +var setLogLevel = /* @__PURE__ */ __name(function(level = "fatal") { + let numericLevel = LEVELS.fatal; + if (typeof level === "string") { + if (level.toLowerCase() in LEVELS) { + numericLevel = LEVELS[level]; + } + } else if (typeof level === "number") { + numericLevel = level; + } + log.trace = () => { + }; + log.debug = () => { + }; + log.info = () => { + }; + log.warn = () => { + }; + log.error = () => { + }; + log.fatal = () => { + }; + if (numericLevel <= LEVELS.fatal) { + log.fatal = console.error ? console.error.bind(console, format("FATAL"), "color: orange") : console.log.bind(console, "\x1B[35m", format("FATAL")); + } + if (numericLevel <= LEVELS.error) { + log.error = console.error ? console.error.bind(console, format("ERROR"), "color: orange") : console.log.bind(console, "\x1B[31m", format("ERROR")); + } + if (numericLevel <= LEVELS.warn) { + log.warn = console.warn ? console.warn.bind(console, format("WARN"), "color: orange") : console.log.bind(console, `\x1B[33m`, format("WARN")); + } + if (numericLevel <= LEVELS.info) { + log.info = console.info ? console.info.bind(console, format("INFO"), "color: lightblue") : console.log.bind(console, "\x1B[34m", format("INFO")); + } + if (numericLevel <= LEVELS.debug) { + log.debug = console.debug ? console.debug.bind(console, format("DEBUG"), "color: lightgreen") : console.log.bind(console, "\x1B[32m", format("DEBUG")); + } + if (numericLevel <= LEVELS.trace) { + log.trace = console.debug ? console.debug.bind(console, format("TRACE"), "color: lightgreen") : console.log.bind(console, "\x1B[32m", format("TRACE")); + } +}, "setLogLevel"); +var format = /* @__PURE__ */ __name((level) => { + const time = dayjs().format("ss.SSS"); + return `%c${time} : ${level} : `; +}, "format"); + +export { + __name, + __export, + log, + setLogLevel +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-AGHRB4JF.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-AGHRB4JF.mjs.map new file mode 100644 index 0000000..e967811 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-AGHRB4JF.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/logger.ts"], + "sourcesContent": ["/* eslint-disable @typescript-eslint/no-empty-function */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/* eslint-disable no-console */\nimport dayjs from 'dayjs';\n\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\nexport const LEVELS: Record = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\nexport const log: Record = {\n trace: (..._args: any[]) => {},\n debug: (..._args: any[]) => {},\n info: (..._args: any[]) => {},\n warn: (..._args: any[]) => {},\n error: (..._args: any[]) => {},\n fatal: (..._args: any[]) => {},\n};\n\n/**\n * Sets a log level\n *\n * @param level - The level to set the logging to. Default is `\"fatal\"`\n */\nexport const setLogLevel = function (level: keyof typeof LEVELS | number = 'fatal') {\n let numericLevel: number = LEVELS.fatal;\n if (typeof level === 'string') {\n if (level.toLowerCase() in LEVELS) {\n numericLevel = LEVELS[level];\n }\n } else if (typeof level === 'number') {\n numericLevel = level;\n }\n log.trace = () => {};\n log.debug = () => {};\n log.info = () => {};\n log.warn = () => {};\n log.error = () => {};\n log.fatal = () => {};\n\n if (numericLevel <= LEVELS.fatal) {\n log.fatal = console.error\n ? console.error.bind(console, format('FATAL'), 'color: orange')\n : console.log.bind(console, '\\x1b[35m', format('FATAL'));\n }\n if (numericLevel <= LEVELS.error) {\n log.error = console.error\n ? console.error.bind(console, format('ERROR'), 'color: orange')\n : console.log.bind(console, '\\x1b[31m', format('ERROR'));\n }\n if (numericLevel <= LEVELS.warn) {\n log.warn = console.warn\n ? console.warn.bind(console, format('WARN'), 'color: orange')\n : console.log.bind(console, `\\x1b[33m`, format('WARN'));\n }\n if (numericLevel <= LEVELS.info) {\n log.info = console.info\n ? console.info.bind(console, format('INFO'), 'color: lightblue')\n : console.log.bind(console, '\\x1b[34m', format('INFO'));\n }\n if (numericLevel <= LEVELS.debug) {\n log.debug = console.debug\n ? console.debug.bind(console, format('DEBUG'), 'color: lightgreen')\n : console.log.bind(console, '\\x1b[32m', format('DEBUG'));\n }\n if (numericLevel <= LEVELS.trace) {\n log.trace = console.debug\n ? console.debug.bind(console, format('TRACE'), 'color: lightgreen')\n : console.log.bind(console, '\\x1b[32m', format('TRACE'));\n }\n};\n\n/**\n * Returns a format with the timestamp and the log level\n *\n * @param level - The level for the log format\n * @returns The format with the timestamp and log level\n */\nconst format = (level: Uppercase): string => {\n const time = dayjs().format('ss.SSS');\n return `%c${time} : ${level} : `;\n};\n"], + "mappings": ";;;;;;;;AAIA,OAAO,WAAW;AAIX,IAAM,SAAmC;AAAA,EAC9C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AACT;AAEO,IAAM,MAAuD;AAAA,EAClE,OAAO,2BAAI,UAAiB;AAAA,EAAC,GAAtB;AAAA,EACP,OAAO,2BAAI,UAAiB;AAAA,EAAC,GAAtB;AAAA,EACP,MAAM,2BAAI,UAAiB;AAAA,EAAC,GAAtB;AAAA,EACN,MAAM,2BAAI,UAAiB;AAAA,EAAC,GAAtB;AAAA,EACN,OAAO,2BAAI,UAAiB;AAAA,EAAC,GAAtB;AAAA,EACP,OAAO,2BAAI,UAAiB;AAAA,EAAC,GAAtB;AACT;AAOO,IAAM,cAAc,gCAAU,QAAsC,SAAS;AAClF,MAAI,eAAuB,OAAO;AAClC,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,MAAM,YAAY,KAAK,QAAQ;AACjC,qBAAe,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF,WAAW,OAAO,UAAU,UAAU;AACpC,mBAAe;AAAA,EACjB;AACA,MAAI,QAAQ,MAAM;AAAA,EAAC;AACnB,MAAI,QAAQ,MAAM;AAAA,EAAC;AACnB,MAAI,OAAO,MAAM;AAAA,EAAC;AAClB,MAAI,OAAO,MAAM;AAAA,EAAC;AAClB,MAAI,QAAQ,MAAM;AAAA,EAAC;AACnB,MAAI,QAAQ,MAAM;AAAA,EAAC;AAEnB,MAAI,gBAAgB,OAAO,OAAO;AAChC,QAAI,QAAQ,QAAQ,QAChB,QAAQ,MAAM,KAAK,SAAS,OAAO,OAAO,GAAG,eAAe,IAC5D,QAAQ,IAAI,KAAK,SAAS,YAAY,OAAO,OAAO,CAAC;AAAA,EAC3D;AACA,MAAI,gBAAgB,OAAO,OAAO;AAChC,QAAI,QAAQ,QAAQ,QAChB,QAAQ,MAAM,KAAK,SAAS,OAAO,OAAO,GAAG,eAAe,IAC5D,QAAQ,IAAI,KAAK,SAAS,YAAY,OAAO,OAAO,CAAC;AAAA,EAC3D;AACA,MAAI,gBAAgB,OAAO,MAAM;AAC/B,QAAI,OAAO,QAAQ,OACf,QAAQ,KAAK,KAAK,SAAS,OAAO,MAAM,GAAG,eAAe,IAC1D,QAAQ,IAAI,KAAK,SAAS,YAAY,OAAO,MAAM,CAAC;AAAA,EAC1D;AACA,MAAI,gBAAgB,OAAO,MAAM;AAC/B,QAAI,OAAO,QAAQ,OACf,QAAQ,KAAK,KAAK,SAAS,OAAO,MAAM,GAAG,kBAAkB,IAC7D,QAAQ,IAAI,KAAK,SAAS,YAAY,OAAO,MAAM,CAAC;AAAA,EAC1D;AACA,MAAI,gBAAgB,OAAO,OAAO;AAChC,QAAI,QAAQ,QAAQ,QAChB,QAAQ,MAAM,KAAK,SAAS,OAAO,OAAO,GAAG,mBAAmB,IAChE,QAAQ,IAAI,KAAK,SAAS,YAAY,OAAO,OAAO,CAAC;AAAA,EAC3D;AACA,MAAI,gBAAgB,OAAO,OAAO;AAChC,QAAI,QAAQ,QAAQ,QAChB,QAAQ,MAAM,KAAK,SAAS,OAAO,OAAO,GAAG,mBAAmB,IAChE,QAAQ,IAAI,KAAK,SAAS,YAAY,OAAO,OAAO,CAAC;AAAA,EAC3D;AACF,GA9C2B;AAsD3B,IAAM,SAAS,wBAAC,UAAuC;AACrD,QAAM,OAAO,MAAM,EAAE,OAAO,QAAQ;AACpC,SAAO,KAAK,IAAI,MAAM,KAAK;AAC7B,GAHe;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ATLVNIR6.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ATLVNIR6.mjs new file mode 100644 index 0000000..4e2f5f4 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ATLVNIR6.mjs @@ -0,0 +1,111 @@ +import { + getConfig2 as getConfig +} from "./chunk-ABZYJK2D.mjs"; +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.ts +var solidStateFill = /* @__PURE__ */ __name((color) => { + const { handDrawnSeed } = getConfig(); + return { + fill: color, + hachureAngle: 120, + // angle of hachure, + hachureGap: 4, + fillWeight: 2, + roughness: 0.7, + stroke: color, + seed: handDrawnSeed + }; +}, "solidStateFill"); +var compileStyles = /* @__PURE__ */ __name((node) => { + const stylesMap = styles2Map([ + ...node.cssCompiledStyles || [], + ...node.cssStyles || [], + ...node.labelStyle || [] + ]); + return { stylesMap, stylesArray: [...stylesMap] }; +}, "compileStyles"); +var styles2Map = /* @__PURE__ */ __name((styles) => { + const styleMap = /* @__PURE__ */ new Map(); + styles.forEach((style) => { + const [key, value] = style.split(":"); + styleMap.set(key.trim(), value?.trim()); + }); + return styleMap; +}, "styles2Map"); +var isLabelStyle = /* @__PURE__ */ __name((key) => { + return key === "color" || key === "font-size" || key === "font-family" || key === "font-weight" || key === "font-style" || key === "text-decoration" || key === "text-align" || key === "text-transform" || key === "line-height" || key === "letter-spacing" || key === "word-spacing" || key === "text-shadow" || key === "text-overflow" || key === "white-space" || key === "word-wrap" || key === "word-break" || key === "overflow-wrap" || key === "hyphens"; +}, "isLabelStyle"); +var styles2String = /* @__PURE__ */ __name((node) => { + const { stylesArray } = compileStyles(node); + const labelStyles = []; + const nodeStyles = []; + const borderStyles = []; + const backgroundStyles = []; + stylesArray.forEach((style) => { + const key = style[0]; + if (isLabelStyle(key)) { + labelStyles.push(style.join(":") + " !important"); + } else { + nodeStyles.push(style.join(":") + " !important"); + if (key.includes("stroke")) { + borderStyles.push(style.join(":") + " !important"); + } + if (key === "fill") { + backgroundStyles.push(style.join(":") + " !important"); + } + } + }); + return { + labelStyles: labelStyles.join(";"), + nodeStyles: nodeStyles.join(";"), + stylesArray, + borderStyles, + backgroundStyles + }; +}, "styles2String"); +var userNodeOverrides = /* @__PURE__ */ __name((node, options) => { + const { themeVariables, handDrawnSeed } = getConfig(); + const { nodeBorder, mainBkg } = themeVariables; + const { stylesMap } = compileStyles(node); + const result = Object.assign( + { + roughness: 0.7, + fill: stylesMap.get("fill") || mainBkg, + fillStyle: "hachure", + // solid fill + fillWeight: 4, + hachureGap: 5.2, + stroke: stylesMap.get("stroke") || nodeBorder, + seed: handDrawnSeed, + strokeWidth: stylesMap.get("stroke-width")?.replace("px", "") || 1.3, + fillLineDash: [0, 0], + strokeLineDash: getStrokeDashArray(stylesMap.get("stroke-dasharray")) + }, + options + ); + return result; +}, "userNodeOverrides"); +var getStrokeDashArray = /* @__PURE__ */ __name((strokeDasharrayStyle) => { + if (!strokeDasharrayStyle) { + return [0, 0]; + } + const dashArray = strokeDasharrayStyle.trim().split(/\s+/).map(Number); + if (dashArray.length === 1) { + const val = isNaN(dashArray[0]) ? 0 : dashArray[0]; + return [val, val]; + } + const first = isNaN(dashArray[0]) ? 0 : dashArray[0]; + const second = isNaN(dashArray[1]) ? 0 : dashArray[1]; + return [first, second]; +}, "getStrokeDashArray"); + +export { + solidStateFill, + compileStyles, + isLabelStyle, + styles2String, + userNodeOverrides +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ATLVNIR6.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ATLVNIR6.mjs.map new file mode 100644 index 0000000..92be168 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-ATLVNIR6.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.ts"], + "sourcesContent": ["import { getConfig } from '../../../diagram-api/diagramAPI.js';\nimport type { Node } from '../../types.js';\n\n// Striped fill like start or fork nodes in state diagrams\nexport const solidStateFill = (color: string) => {\n const { handDrawnSeed } = getConfig();\n return {\n fill: color,\n hachureAngle: 120, // angle of hachure,\n hachureGap: 4,\n fillWeight: 2,\n roughness: 0.7,\n stroke: color,\n seed: handDrawnSeed,\n };\n};\n\nexport const compileStyles = (node: Node) => {\n // node.cssCompiledStyles is an array of strings in the form of 'key: value' where key is the css property and value is the value\n // the array is the styles of node from the classes it is using\n // node.cssStyles is an array of styles directly set on the node\n // concat the arrays and remove duplicates such that the values from node.cssStyles are used if there are duplicates\n const stylesMap = styles2Map([\n ...(node.cssCompiledStyles || []),\n ...(node.cssStyles || []),\n ...(node.labelStyle || []),\n ]);\n return { stylesMap, stylesArray: [...stylesMap] };\n};\n\nexport const styles2Map = (styles: string[]) => {\n const styleMap = new Map();\n styles.forEach((style) => {\n const [key, value] = style.split(':');\n styleMap.set(key.trim(), value?.trim());\n });\n return styleMap;\n};\nexport const isLabelStyle = (key: string) => {\n return (\n key === 'color' ||\n key === 'font-size' ||\n key === 'font-family' ||\n key === 'font-weight' ||\n key === 'font-style' ||\n key === 'text-decoration' ||\n key === 'text-align' ||\n key === 'text-transform' ||\n key === 'line-height' ||\n key === 'letter-spacing' ||\n key === 'word-spacing' ||\n key === 'text-shadow' ||\n key === 'text-overflow' ||\n key === 'white-space' ||\n key === 'word-wrap' ||\n key === 'word-break' ||\n key === 'overflow-wrap' ||\n key === 'hyphens'\n );\n};\nexport const styles2String = (node: Node) => {\n const { stylesArray } = compileStyles(node);\n const labelStyles: string[] = [];\n const nodeStyles: string[] = [];\n const borderStyles: string[] = [];\n const backgroundStyles: string[] = [];\n\n stylesArray.forEach((style) => {\n const key = style[0];\n if (isLabelStyle(key)) {\n labelStyles.push(style.join(':') + ' !important');\n } else {\n nodeStyles.push(style.join(':') + ' !important');\n if (key.includes('stroke')) {\n borderStyles.push(style.join(':') + ' !important');\n }\n if (key === 'fill') {\n backgroundStyles.push(style.join(':') + ' !important');\n }\n }\n });\n\n return {\n labelStyles: labelStyles.join(';'),\n nodeStyles: nodeStyles.join(';'),\n stylesArray,\n borderStyles,\n backgroundStyles,\n };\n};\n\n// Striped fill like start or fork nodes in state diagrams\n// TODO remove any\nexport const userNodeOverrides = (node: Node, options: any) => {\n const { themeVariables, handDrawnSeed } = getConfig();\n const { nodeBorder, mainBkg } = themeVariables;\n const { stylesMap } = compileStyles(node);\n\n // index the style array to a map object\n const result = Object.assign(\n {\n roughness: 0.7,\n fill: stylesMap.get('fill') || mainBkg,\n fillStyle: 'hachure', // solid fill\n fillWeight: 4,\n hachureGap: 5.2,\n stroke: stylesMap.get('stroke') || nodeBorder,\n seed: handDrawnSeed,\n strokeWidth: stylesMap.get('stroke-width')?.replace('px', '') || 1.3,\n fillLineDash: [0, 0],\n strokeLineDash: getStrokeDashArray(stylesMap.get('stroke-dasharray')),\n },\n options\n );\n return result;\n};\n\nconst getStrokeDashArray = (strokeDasharrayStyle?: string) => {\n if (!strokeDasharrayStyle) {\n return [0, 0];\n }\n const dashArray = strokeDasharrayStyle.trim().split(/\\s+/).map(Number);\n if (dashArray.length === 1) {\n const val = isNaN(dashArray[0]) ? 0 : dashArray[0];\n return [val, val];\n }\n const first = isNaN(dashArray[0]) ? 0 : dashArray[0];\n const second = isNaN(dashArray[1]) ? 0 : dashArray[1];\n return [first, second];\n};\n"], + "mappings": "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", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-B4BG7PRW.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-B4BG7PRW.mjs new file mode 100644 index 0000000..045fe3a --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-B4BG7PRW.mjs @@ -0,0 +1,1962 @@ +import { + getIconStyles +} from "./chunk-FMBD7UC4.mjs"; +import { + getDiagramElement +} from "./chunk-55IACEB6.mjs"; +import { + setupViewPortForSVG +} from "./chunk-QN33PNHL.mjs"; +import { + getRegisteredLayoutAlgorithm, + render +} from "./chunk-N4CR4FBY.mjs"; +import { + getEdgeId, + utils_default +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + common_default, + getAccDescription, + getAccTitle, + getConfig2 as getConfig, + getDiagramTitle, + parseGenericTypes, + sanitizeText, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/class/parser/classDiagram.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 18], $V1 = [1, 19], $V2 = [1, 20], $V3 = [1, 41], $V4 = [1, 42], $V5 = [1, 26], $V6 = [1, 24], $V7 = [1, 25], $V8 = [1, 32], $V9 = [1, 33], $Va = [1, 34], $Vb = [1, 45], $Vc = [1, 35], $Vd = [1, 36], $Ve = [1, 37], $Vf = [1, 38], $Vg = [1, 27], $Vh = [1, 28], $Vi = [1, 29], $Vj = [1, 30], $Vk = [1, 31], $Vl = [1, 44], $Vm = [1, 46], $Vn = [1, 43], $Vo = [1, 47], $Vp = [1, 9], $Vq = [1, 8, 9], $Vr = [1, 58], $Vs = [1, 59], $Vt = [1, 60], $Vu = [1, 61], $Vv = [1, 62], $Vw = [1, 63], $Vx = [1, 64], $Vy = [1, 8, 9, 41], $Vz = [1, 76], $VA = [1, 8, 9, 12, 13, 22, 39, 41, 44, 68, 69, 70, 71, 72, 73, 74, 79, 81], $VB = [1, 8, 9, 12, 13, 18, 20, 22, 39, 41, 44, 50, 60, 68, 69, 70, 71, 72, 73, 74, 79, 81, 86, 100, 102, 103], $VC = [13, 60, 86, 100, 102, 103], $VD = [13, 60, 73, 74, 86, 100, 102, 103], $VE = [13, 60, 68, 69, 70, 71, 72, 86, 100, 102, 103], $VF = [1, 100], $VG = [1, 117], $VH = [1, 113], $VI = [1, 109], $VJ = [1, 115], $VK = [1, 110], $VL = [1, 111], $VM = [1, 112], $VN = [1, 114], $VO = [1, 116], $VP = [22, 48, 60, 61, 82, 86, 87, 88, 89, 90], $VQ = [1, 8, 9, 39, 41, 44], $VR = [1, 8, 9, 22], $VS = [1, 145], $VT = [1, 8, 9, 61], $VU = [1, 8, 9, 22, 48, 60, 61, 82, 86, 87, 88, 89, 90]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "mermaidDoc": 4, "statements": 5, "graphConfig": 6, "CLASS_DIAGRAM": 7, "NEWLINE": 8, "EOF": 9, "statement": 10, "classLabel": 11, "SQS": 12, "STR": 13, "SQE": 14, "namespaceName": 15, "alphaNumToken": 16, "classLiteralName": 17, "DOT": 18, "className": 19, "GENERICTYPE": 20, "relationStatement": 21, "LABEL": 22, "namespaceStatement": 23, "classStatement": 24, "memberStatement": 25, "annotationStatement": 26, "clickStatement": 27, "styleStatement": 28, "cssClassStatement": 29, "noteStatement": 30, "classDefStatement": 31, "direction": 32, "acc_title": 33, "acc_title_value": 34, "acc_descr": 35, "acc_descr_value": 36, "acc_descr_multiline_value": 37, "namespaceIdentifier": 38, "STRUCT_START": 39, "classStatements": 40, "STRUCT_STOP": 41, "NAMESPACE": 42, "classIdentifier": 43, "STYLE_SEPARATOR": 44, "members": 45, "CLASS": 46, "emptyBody": 47, "SPACE": 48, "ANNOTATION_START": 49, "ANNOTATION_END": 50, "MEMBER": 51, "SEPARATOR": 52, "relation": 53, "NOTE_FOR": 54, "noteText": 55, "NOTE": 56, "CLASSDEF": 57, "classList": 58, "stylesOpt": 59, "ALPHA": 60, "COMMA": 61, "direction_tb": 62, "direction_bt": 63, "direction_rl": 64, "direction_lr": 65, "relationType": 66, "lineType": 67, "AGGREGATION": 68, "EXTENSION": 69, "COMPOSITION": 70, "DEPENDENCY": 71, "LOLLIPOP": 72, "LINE": 73, "DOTTED_LINE": 74, "CALLBACK": 75, "LINK": 76, "LINK_TARGET": 77, "CLICK": 78, "CALLBACK_NAME": 79, "CALLBACK_ARGS": 80, "HREF": 81, "STYLE": 82, "CSSCLASS": 83, "style": 84, "styleComponent": 85, "NUM": 86, "COLON": 87, "UNIT": 88, "BRKT": 89, "PCT": 90, "commentToken": 91, "textToken": 92, "graphCodeTokens": 93, "textNoTagsToken": 94, "TAGSTART": 95, "TAGEND": 96, "==": 97, "--": 98, "DEFAULT": 99, "MINUS": 100, "keywords": 101, "UNICODE_TEXT": 102, "BQUOTE_STR": 103, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 7: "CLASS_DIAGRAM", 8: "NEWLINE", 9: "EOF", 12: "SQS", 13: "STR", 14: "SQE", 18: "DOT", 20: "GENERICTYPE", 22: "LABEL", 33: "acc_title", 34: "acc_title_value", 35: "acc_descr", 36: "acc_descr_value", 37: "acc_descr_multiline_value", 39: "STRUCT_START", 41: "STRUCT_STOP", 42: "NAMESPACE", 44: "STYLE_SEPARATOR", 46: "CLASS", 48: "SPACE", 49: "ANNOTATION_START", 50: "ANNOTATION_END", 51: "MEMBER", 52: "SEPARATOR", 54: "NOTE_FOR", 56: "NOTE", 57: "CLASSDEF", 60: "ALPHA", 61: "COMMA", 62: "direction_tb", 63: "direction_bt", 64: "direction_rl", 65: "direction_lr", 68: "AGGREGATION", 69: "EXTENSION", 70: "COMPOSITION", 71: "DEPENDENCY", 72: "LOLLIPOP", 73: "LINE", 74: "DOTTED_LINE", 75: "CALLBACK", 76: "LINK", 77: "LINK_TARGET", 78: "CLICK", 79: "CALLBACK_NAME", 80: "CALLBACK_ARGS", 81: "HREF", 82: "STYLE", 83: "CSSCLASS", 86: "NUM", 87: "COLON", 88: "UNIT", 89: "BRKT", 90: "PCT", 93: "graphCodeTokens", 95: "TAGSTART", 96: "TAGEND", 97: "==", 98: "--", 99: "DEFAULT", 100: "MINUS", 101: "keywords", 102: "UNICODE_TEXT", 103: "BQUOTE_STR" }, + productions_: [0, [3, 1], [3, 1], [4, 1], [6, 4], [5, 1], [5, 2], [5, 3], [11, 3], [15, 1], [15, 1], [15, 3], [15, 2], [19, 1], [19, 3], [19, 1], [19, 2], [19, 2], [19, 2], [10, 1], [10, 2], [10, 1], [10, 1], [10, 1], [10, 1], [10, 1], [10, 1], [10, 1], [10, 1], [10, 1], [10, 1], [10, 2], [10, 2], [10, 1], [23, 4], [23, 5], [38, 2], [40, 1], [40, 2], [40, 3], [24, 1], [24, 3], [24, 4], [24, 3], [24, 6], [43, 2], [43, 3], [47, 0], [47, 2], [47, 2], [26, 4], [45, 1], [45, 2], [25, 1], [25, 2], [25, 1], [25, 1], [21, 3], [21, 4], [21, 4], [21, 5], [30, 3], [30, 2], [31, 3], [58, 1], [58, 3], [32, 1], [32, 1], [32, 1], [32, 1], [53, 3], [53, 2], [53, 2], [53, 1], [66, 1], [66, 1], [66, 1], [66, 1], [66, 1], [67, 1], [67, 1], [27, 3], [27, 4], [27, 3], [27, 4], [27, 4], [27, 5], [27, 3], [27, 4], [27, 4], [27, 5], [27, 4], [27, 5], [27, 5], [27, 6], [28, 3], [29, 3], [59, 1], [59, 3], [84, 1], [84, 2], [85, 1], [85, 1], [85, 1], [85, 1], [85, 1], [85, 1], [85, 1], [85, 1], [85, 1], [91, 1], [91, 1], [92, 1], [92, 1], [92, 1], [92, 1], [92, 1], [92, 1], [92, 1], [94, 1], [94, 1], [94, 1], [94, 1], [16, 1], [16, 1], [16, 1], [16, 1], [17, 1], [55, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 8: + this.$ = $$[$0 - 1]; + break; + case 9: + case 10: + case 13: + case 15: + this.$ = $$[$0]; + break; + case 11: + case 14: + this.$ = $$[$0 - 2] + "." + $$[$0]; + break; + case 12: + case 16: + this.$ = $$[$0 - 1] + $$[$0]; + break; + case 17: + case 18: + this.$ = $$[$0 - 1] + "~" + $$[$0] + "~"; + break; + case 19: + yy.addRelation($$[$0]); + break; + case 20: + $$[$0 - 1].title = yy.cleanupLabel($$[$0]); + yy.addRelation($$[$0 - 1]); + break; + case 31: + this.$ = $$[$0].trim(); + yy.setAccTitle(this.$); + break; + case 32: + case 33: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 34: + yy.addClassesToNamespace($$[$0 - 3], $$[$0 - 1]); + break; + case 35: + yy.addClassesToNamespace($$[$0 - 4], $$[$0 - 1]); + break; + case 36: + this.$ = $$[$0]; + yy.addNamespace($$[$0]); + break; + case 37: + this.$ = [$$[$0]]; + break; + case 38: + this.$ = [$$[$0 - 1]]; + break; + case 39: + $$[$0].unshift($$[$0 - 2]); + this.$ = $$[$0]; + break; + case 41: + yy.setCssClass($$[$0 - 2], $$[$0]); + break; + case 42: + yy.addMembers($$[$0 - 3], $$[$0 - 1]); + break; + case 44: + yy.setCssClass($$[$0 - 5], $$[$0 - 3]); + yy.addMembers($$[$0 - 5], $$[$0 - 1]); + break; + case 45: + this.$ = $$[$0]; + yy.addClass($$[$0]); + break; + case 46: + this.$ = $$[$0 - 1]; + yy.addClass($$[$0 - 1]); + yy.setClassLabel($$[$0 - 1], $$[$0]); + break; + case 50: + yy.addAnnotation($$[$0], $$[$0 - 2]); + break; + case 51: + case 64: + this.$ = [$$[$0]]; + break; + case 52: + $$[$0].push($$[$0 - 1]); + this.$ = $$[$0]; + break; + case 53: + break; + case 54: + yy.addMember($$[$0 - 1], yy.cleanupLabel($$[$0])); + break; + case 55: + break; + case 56: + break; + case 57: + this.$ = { "id1": $$[$0 - 2], "id2": $$[$0], relation: $$[$0 - 1], relationTitle1: "none", relationTitle2: "none" }; + break; + case 58: + this.$ = { id1: $$[$0 - 3], id2: $$[$0], relation: $$[$0 - 1], relationTitle1: $$[$0 - 2], relationTitle2: "none" }; + break; + case 59: + this.$ = { id1: $$[$0 - 3], id2: $$[$0], relation: $$[$0 - 2], relationTitle1: "none", relationTitle2: $$[$0 - 1] }; + break; + case 60: + this.$ = { id1: $$[$0 - 4], id2: $$[$0], relation: $$[$0 - 2], relationTitle1: $$[$0 - 3], relationTitle2: $$[$0 - 1] }; + break; + case 61: + yy.addNote($$[$0], $$[$0 - 1]); + break; + case 62: + yy.addNote($$[$0]); + break; + case 63: + this.$ = $$[$0 - 2]; + yy.defineClass($$[$0 - 1], $$[$0]); + break; + case 65: + this.$ = $$[$0 - 2].concat([$$[$0]]); + break; + case 66: + yy.setDirection("TB"); + break; + case 67: + yy.setDirection("BT"); + break; + case 68: + yy.setDirection("RL"); + break; + case 69: + yy.setDirection("LR"); + break; + case 70: + this.$ = { type1: $$[$0 - 2], type2: $$[$0], lineType: $$[$0 - 1] }; + break; + case 71: + this.$ = { type1: "none", type2: $$[$0], lineType: $$[$0 - 1] }; + break; + case 72: + this.$ = { type1: $$[$0 - 1], type2: "none", lineType: $$[$0] }; + break; + case 73: + this.$ = { type1: "none", type2: "none", lineType: $$[$0] }; + break; + case 74: + this.$ = yy.relationType.AGGREGATION; + break; + case 75: + this.$ = yy.relationType.EXTENSION; + break; + case 76: + this.$ = yy.relationType.COMPOSITION; + break; + case 77: + this.$ = yy.relationType.DEPENDENCY; + break; + case 78: + this.$ = yy.relationType.LOLLIPOP; + break; + case 79: + this.$ = yy.lineType.LINE; + break; + case 80: + this.$ = yy.lineType.DOTTED_LINE; + break; + case 81: + case 87: + this.$ = $$[$0 - 2]; + yy.setClickEvent($$[$0 - 1], $$[$0]); + break; + case 82: + case 88: + this.$ = $$[$0 - 3]; + yy.setClickEvent($$[$0 - 2], $$[$0 - 1]); + yy.setTooltip($$[$0 - 2], $$[$0]); + break; + case 83: + this.$ = $$[$0 - 2]; + yy.setLink($$[$0 - 1], $$[$0]); + break; + case 84: + this.$ = $$[$0 - 3]; + yy.setLink($$[$0 - 2], $$[$0 - 1], $$[$0]); + break; + case 85: + this.$ = $$[$0 - 3]; + yy.setLink($$[$0 - 2], $$[$0 - 1]); + yy.setTooltip($$[$0 - 2], $$[$0]); + break; + case 86: + this.$ = $$[$0 - 4]; + yy.setLink($$[$0 - 3], $$[$0 - 2], $$[$0]); + yy.setTooltip($$[$0 - 3], $$[$0 - 1]); + break; + case 89: + this.$ = $$[$0 - 3]; + yy.setClickEvent($$[$0 - 2], $$[$0 - 1], $$[$0]); + break; + case 90: + this.$ = $$[$0 - 4]; + yy.setClickEvent($$[$0 - 3], $$[$0 - 2], $$[$0 - 1]); + yy.setTooltip($$[$0 - 3], $$[$0]); + break; + case 91: + this.$ = $$[$0 - 3]; + yy.setLink($$[$0 - 2], $$[$0]); + break; + case 92: + this.$ = $$[$0 - 4]; + yy.setLink($$[$0 - 3], $$[$0 - 1], $$[$0]); + break; + case 93: + this.$ = $$[$0 - 4]; + yy.setLink($$[$0 - 3], $$[$0 - 1]); + yy.setTooltip($$[$0 - 3], $$[$0]); + break; + case 94: + this.$ = $$[$0 - 5]; + yy.setLink($$[$0 - 4], $$[$0 - 2], $$[$0]); + yy.setTooltip($$[$0 - 4], $$[$0 - 1]); + break; + case 95: + this.$ = $$[$0 - 2]; + yy.setCssStyle($$[$0 - 1], $$[$0]); + break; + case 96: + yy.setCssClass($$[$0 - 1], $$[$0]); + break; + case 97: + this.$ = [$$[$0]]; + break; + case 98: + $$[$0 - 2].push($$[$0]); + this.$ = $$[$0 - 2]; + break; + case 100: + this.$ = $$[$0 - 1] + $$[$0]; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: 2, 5: 3, 6: 4, 7: [1, 6], 10: 5, 16: 39, 17: 40, 19: 21, 21: 7, 23: 8, 24: 9, 25: 10, 26: 11, 27: 12, 28: 13, 29: 14, 30: 15, 31: 16, 32: 17, 33: $V0, 35: $V1, 37: $V2, 38: 22, 42: $V3, 43: 23, 46: $V4, 49: $V5, 51: $V6, 52: $V7, 54: $V8, 56: $V9, 57: $Va, 60: $Vb, 62: $Vc, 63: $Vd, 64: $Ve, 65: $Vf, 75: $Vg, 76: $Vh, 78: $Vi, 82: $Vj, 83: $Vk, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, { 1: [3] }, { 1: [2, 1] }, { 1: [2, 2] }, { 1: [2, 3] }, o($Vp, [2, 5], { 8: [1, 48] }), { 8: [1, 49] }, o($Vq, [2, 19], { 22: [1, 50] }), o($Vq, [2, 21]), o($Vq, [2, 22]), o($Vq, [2, 23]), o($Vq, [2, 24]), o($Vq, [2, 25]), o($Vq, [2, 26]), o($Vq, [2, 27]), o($Vq, [2, 28]), o($Vq, [2, 29]), o($Vq, [2, 30]), { 34: [1, 51] }, { 36: [1, 52] }, o($Vq, [2, 33]), o($Vq, [2, 53], { 53: 53, 66: 56, 67: 57, 13: [1, 54], 22: [1, 55], 68: $Vr, 69: $Vs, 70: $Vt, 71: $Vu, 72: $Vv, 73: $Vw, 74: $Vx }), { 39: [1, 65] }, o($Vy, [2, 40], { 39: [1, 67], 44: [1, 66] }), o($Vq, [2, 55]), o($Vq, [2, 56]), { 16: 68, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn }, { 16: 39, 17: 40, 19: 69, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, { 16: 39, 17: 40, 19: 70, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, { 16: 39, 17: 40, 19: 71, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, { 60: [1, 72] }, { 13: [1, 73] }, { 16: 39, 17: 40, 19: 74, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, { 13: $Vz, 55: 75 }, { 58: 77, 60: [1, 78] }, o($Vq, [2, 66]), o($Vq, [2, 67]), o($Vq, [2, 68]), o($Vq, [2, 69]), o($VA, [2, 13], { 16: 39, 17: 40, 19: 80, 18: [1, 79], 20: [1, 81], 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }), o($VA, [2, 15], { 20: [1, 82] }), { 15: 83, 16: 84, 17: 85, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, { 16: 39, 17: 40, 19: 86, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, o($VB, [2, 123]), o($VB, [2, 124]), o($VB, [2, 125]), o($VB, [2, 126]), o([1, 8, 9, 12, 13, 20, 22, 39, 41, 44, 68, 69, 70, 71, 72, 73, 74, 79, 81], [2, 127]), o($Vp, [2, 6], { 10: 5, 21: 7, 23: 8, 24: 9, 25: 10, 26: 11, 27: 12, 28: 13, 29: 14, 30: 15, 31: 16, 32: 17, 19: 21, 38: 22, 43: 23, 16: 39, 17: 40, 5: 87, 33: $V0, 35: $V1, 37: $V2, 42: $V3, 46: $V4, 49: $V5, 51: $V6, 52: $V7, 54: $V8, 56: $V9, 57: $Va, 60: $Vb, 62: $Vc, 63: $Vd, 64: $Ve, 65: $Vf, 75: $Vg, 76: $Vh, 78: $Vi, 82: $Vj, 83: $Vk, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }), { 5: 88, 10: 5, 16: 39, 17: 40, 19: 21, 21: 7, 23: 8, 24: 9, 25: 10, 26: 11, 27: 12, 28: 13, 29: 14, 30: 15, 31: 16, 32: 17, 33: $V0, 35: $V1, 37: $V2, 38: 22, 42: $V3, 43: 23, 46: $V4, 49: $V5, 51: $V6, 52: $V7, 54: $V8, 56: $V9, 57: $Va, 60: $Vb, 62: $Vc, 63: $Vd, 64: $Ve, 65: $Vf, 75: $Vg, 76: $Vh, 78: $Vi, 82: $Vj, 83: $Vk, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, o($Vq, [2, 20]), o($Vq, [2, 31]), o($Vq, [2, 32]), { 13: [1, 90], 16: 39, 17: 40, 19: 89, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, { 53: 91, 66: 56, 67: 57, 68: $Vr, 69: $Vs, 70: $Vt, 71: $Vu, 72: $Vv, 73: $Vw, 74: $Vx }, o($Vq, [2, 54]), { 67: 92, 73: $Vw, 74: $Vx }, o($VC, [2, 73], { 66: 93, 68: $Vr, 69: $Vs, 70: $Vt, 71: $Vu, 72: $Vv }), o($VD, [2, 74]), o($VD, [2, 75]), o($VD, [2, 76]), o($VD, [2, 77]), o($VD, [2, 78]), o($VE, [2, 79]), o($VE, [2, 80]), { 8: [1, 95], 24: 96, 40: 94, 43: 23, 46: $V4 }, { 16: 97, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn }, { 41: [1, 99], 45: 98, 51: $VF }, { 50: [1, 101] }, { 13: [1, 102] }, { 13: [1, 103] }, { 79: [1, 104], 81: [1, 105] }, { 22: $VG, 48: $VH, 59: 106, 60: $VI, 82: $VJ, 84: 107, 85: 108, 86: $VK, 87: $VL, 88: $VM, 89: $VN, 90: $VO }, { 60: [1, 118] }, { 13: $Vz, 55: 119 }, o($Vq, [2, 62]), o($Vq, [2, 128]), { 22: $VG, 48: $VH, 59: 120, 60: $VI, 61: [1, 121], 82: $VJ, 84: 107, 85: 108, 86: $VK, 87: $VL, 88: $VM, 89: $VN, 90: $VO }, o($VP, [2, 64]), { 16: 39, 17: 40, 19: 122, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, o($VA, [2, 16]), o($VA, [2, 17]), o($VA, [2, 18]), { 39: [2, 36] }, { 15: 124, 16: 84, 17: 85, 18: [1, 123], 39: [2, 9], 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, { 39: [2, 10] }, o($VQ, [2, 45], { 11: 125, 12: [1, 126] }), o($Vp, [2, 7]), { 9: [1, 127] }, o($VR, [2, 57]), { 16: 39, 17: 40, 19: 128, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, { 13: [1, 130], 16: 39, 17: 40, 19: 129, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, o($VC, [2, 72], { 66: 131, 68: $Vr, 69: $Vs, 70: $Vt, 71: $Vu, 72: $Vv }), o($VC, [2, 71]), { 41: [1, 132] }, { 24: 96, 40: 133, 43: 23, 46: $V4 }, { 8: [1, 134], 41: [2, 37] }, o($Vy, [2, 41], { 39: [1, 135] }), { 41: [1, 136] }, o($Vy, [2, 43]), { 41: [2, 51], 45: 137, 51: $VF }, { 16: 39, 17: 40, 19: 138, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, o($Vq, [2, 81], { 13: [1, 139] }), o($Vq, [2, 83], { 13: [1, 141], 77: [1, 140] }), o($Vq, [2, 87], { 13: [1, 142], 80: [1, 143] }), { 13: [1, 144] }, o($Vq, [2, 95], { 61: $VS }), o($VT, [2, 97], { 85: 146, 22: $VG, 48: $VH, 60: $VI, 82: $VJ, 86: $VK, 87: $VL, 88: $VM, 89: $VN, 90: $VO }), o($VU, [2, 99]), o($VU, [2, 101]), o($VU, [2, 102]), o($VU, [2, 103]), o($VU, [2, 104]), o($VU, [2, 105]), o($VU, [2, 106]), o($VU, [2, 107]), o($VU, [2, 108]), o($VU, [2, 109]), o($Vq, [2, 96]), o($Vq, [2, 61]), o($Vq, [2, 63], { 61: $VS }), { 60: [1, 147] }, o($VA, [2, 14]), { 15: 148, 16: 84, 17: 85, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, { 39: [2, 12] }, o($VQ, [2, 46]), { 13: [1, 149] }, { 1: [2, 4] }, o($VR, [2, 59]), o($VR, [2, 58]), { 16: 39, 17: 40, 19: 150, 60: $Vb, 86: $Vl, 100: $Vm, 102: $Vn, 103: $Vo }, o($VC, [2, 70]), o($Vq, [2, 34]), { 41: [1, 151] }, { 24: 96, 40: 152, 41: [2, 38], 43: 23, 46: $V4 }, { 45: 153, 51: $VF }, o($Vy, [2, 42]), { 41: [2, 52] }, o($Vq, [2, 50]), o($Vq, [2, 82]), o($Vq, [2, 84]), o($Vq, [2, 85], { 77: [1, 154] }), o($Vq, [2, 88]), o($Vq, [2, 89], { 13: [1, 155] }), o($Vq, [2, 91], { 13: [1, 157], 77: [1, 156] }), { 22: $VG, 48: $VH, 60: $VI, 82: $VJ, 84: 158, 85: 108, 86: $VK, 87: $VL, 88: $VM, 89: $VN, 90: $VO }, o($VU, [2, 100]), o($VP, [2, 65]), { 39: [2, 11] }, { 14: [1, 159] }, o($VR, [2, 60]), o($Vq, [2, 35]), { 41: [2, 39] }, { 41: [1, 160] }, o($Vq, [2, 86]), o($Vq, [2, 90]), o($Vq, [2, 92]), o($Vq, [2, 93], { 77: [1, 161] }), o($VT, [2, 98], { 85: 146, 22: $VG, 48: $VH, 60: $VI, 82: $VJ, 86: $VK, 87: $VL, 88: $VM, 89: $VN, 90: $VO }), o($VQ, [2, 8]), o($Vy, [2, 44]), o($Vq, [2, 94])], + defaultActions: { 2: [2, 1], 3: [2, 2], 4: [2, 3], 83: [2, 36], 85: [2, 10], 124: [2, 12], 127: [2, 4], 137: [2, 52], 148: [2, 11], 152: [2, 39] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: {}, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + return 62; + break; + case 1: + return 63; + break; + case 2: + return 64; + break; + case 3: + return 65; + break; + case 4: + break; + case 5: + break; + case 6: + this.begin("acc_title"); + return 33; + break; + case 7: + this.popState(); + return "acc_title_value"; + break; + case 8: + this.begin("acc_descr"); + return 35; + break; + case 9: + this.popState(); + return "acc_descr_value"; + break; + case 10: + this.begin("acc_descr_multiline"); + break; + case 11: + this.popState(); + break; + case 12: + return "acc_descr_multiline_value"; + break; + case 13: + return 8; + break; + case 14: + break; + case 15: + return 7; + break; + case 16: + return 7; + break; + case 17: + return "EDGE_STATE"; + break; + case 18: + this.begin("callback_name"); + break; + case 19: + this.popState(); + break; + case 20: + this.popState(); + this.begin("callback_args"); + break; + case 21: + return 79; + break; + case 22: + this.popState(); + break; + case 23: + return 80; + break; + case 24: + this.popState(); + break; + case 25: + return "STR"; + break; + case 26: + this.begin("string"); + break; + case 27: + return 82; + break; + case 28: + return 57; + break; + case 29: + this.begin("namespace"); + return 42; + break; + case 30: + this.popState(); + return 8; + break; + case 31: + break; + case 32: + this.begin("namespace-body"); + return 39; + break; + case 33: + this.popState(); + return 41; + break; + case 34: + return "EOF_IN_STRUCT"; + break; + case 35: + return 8; + break; + case 36: + break; + case 37: + return "EDGE_STATE"; + break; + case 38: + this.begin("class"); + return 46; + break; + case 39: + this.popState(); + return 8; + break; + case 40: + break; + case 41: + this.popState(); + this.popState(); + return 41; + break; + case 42: + this.begin("class-body"); + return 39; + break; + case 43: + this.popState(); + return 41; + break; + case 44: + return "EOF_IN_STRUCT"; + break; + case 45: + return "EDGE_STATE"; + break; + case 46: + return "OPEN_IN_STRUCT"; + break; + case 47: + break; + case 48: + return "MEMBER"; + break; + case 49: + return 83; + break; + case 50: + return 75; + break; + case 51: + return 76; + break; + case 52: + return 78; + break; + case 53: + return 54; + break; + case 54: + return 56; + break; + case 55: + return 49; + break; + case 56: + return 50; + break; + case 57: + return 81; + break; + case 58: + this.popState(); + break; + case 59: + return "GENERICTYPE"; + break; + case 60: + this.begin("generic"); + break; + case 61: + this.popState(); + break; + case 62: + return "BQUOTE_STR"; + break; + case 63: + this.begin("bqstring"); + break; + case 64: + return 77; + break; + case 65: + return 77; + break; + case 66: + return 77; + break; + case 67: + return 77; + break; + case 68: + return 69; + break; + case 69: + return 69; + break; + case 70: + return 71; + break; + case 71: + return 71; + break; + case 72: + return 70; + break; + case 73: + return 68; + break; + case 74: + return 72; + break; + case 75: + return 73; + break; + case 76: + return 74; + break; + case 77: + return 22; + break; + case 78: + return 44; + break; + case 79: + return 100; + break; + case 80: + return 18; + break; + case 81: + return "PLUS"; + break; + case 82: + return 87; + break; + case 83: + return 61; + break; + case 84: + return 89; + break; + case 85: + return 89; + break; + case 86: + return 90; + break; + case 87: + return "EQUALS"; + break; + case 88: + return "EQUALS"; + break; + case 89: + return 60; + break; + case 90: + return 12; + break; + case 91: + return 14; + break; + case 92: + return "PUNCTUATION"; + break; + case 93: + return 86; + break; + case 94: + return 102; + break; + case 95: + return 48; + break; + case 96: + return 48; + break; + case 97: + return 9; + break; + } + }, "anonymous"), + rules: [/^(?:.*direction\s+TB[^\n]*)/, /^(?:.*direction\s+BT[^\n]*)/, /^(?:.*direction\s+RL[^\n]*)/, /^(?:.*direction\s+LR[^\n]*)/, /^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/, /^(?:%%[^\n]*(\r?\n)*)/, /^(?:accTitle\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*\{\s*)/, /^(?:[\}])/, /^(?:[^\}]*)/, /^(?:\s*(\r?\n)+)/, /^(?:\s+)/, /^(?:classDiagram-v2\b)/, /^(?:classDiagram\b)/, /^(?:\[\*\])/, /^(?:call[\s]+)/, /^(?:\([\s]*\))/, /^(?:\()/, /^(?:[^(]*)/, /^(?:\))/, /^(?:[^)]*)/, /^(?:["])/, /^(?:[^"]*)/, /^(?:["])/, /^(?:style\b)/, /^(?:classDef\b)/, /^(?:namespace\b)/, /^(?:\s*(\r?\n)+)/, /^(?:\s+)/, /^(?:[{])/, /^(?:[}])/, /^(?:$)/, /^(?:\s*(\r?\n)+)/, /^(?:\s+)/, /^(?:\[\*\])/, /^(?:class\b)/, /^(?:\s*(\r?\n)+)/, /^(?:\s+)/, /^(?:[}])/, /^(?:[{])/, /^(?:[}])/, /^(?:$)/, /^(?:\[\*\])/, /^(?:[{])/, /^(?:[\n])/, /^(?:[^{}\n]*)/, /^(?:cssClass\b)/, /^(?:callback\b)/, /^(?:link\b)/, /^(?:click\b)/, /^(?:note for\b)/, /^(?:note\b)/, /^(?:<<)/, /^(?:>>)/, /^(?:href\b)/, /^(?:[~])/, /^(?:[^~]*)/, /^(?:~)/, /^(?:[`])/, /^(?:[^`]+)/, /^(?:[`])/, /^(?:_self\b)/, /^(?:_blank\b)/, /^(?:_parent\b)/, /^(?:_top\b)/, /^(?:\s*<\|)/, /^(?:\s*\|>)/, /^(?:\s*>)/, /^(?:\s*<)/, /^(?:\s*\*)/, /^(?:\s*o\b)/, /^(?:\s*\(\))/, /^(?:--)/, /^(?:\.\.)/, /^(?::{1}[^:\n;]+)/, /^(?::{3})/, /^(?:-)/, /^(?:\.)/, /^(?:\+)/, /^(?::)/, /^(?:,)/, /^(?:#)/, /^(?:#)/, /^(?:%)/, /^(?:=)/, /^(?:=)/, /^(?:\w+)/, /^(?:\[)/, /^(?:\])/, /^(?:[!"#$%&'*+,-.`?\\/])/, /^(?:[0-9]+)/, /^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/, /^(?:\s)/, /^(?:\s)/, /^(?:$)/], + conditions: { "namespace-body": { "rules": [26, 33, 34, 35, 36, 37, 38, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "namespace": { "rules": [26, 29, 30, 31, 32, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "class-body": { "rules": [26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "class": { "rules": [26, 39, 40, 41, 42, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "acc_descr_multiline": { "rules": [11, 12, 26, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "acc_descr": { "rules": [9, 26, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "acc_title": { "rules": [7, 26, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "callback_args": { "rules": [22, 23, 26, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "callback_name": { "rules": [19, 20, 21, 26, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "href": { "rules": [26, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "struct": { "rules": [26, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "generic": { "rules": [26, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "bqstring": { "rules": [26, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "string": { "rules": [24, 25, 26, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 26, 27, 28, 29, 38, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var classDiagram_default = parser; + +// src/diagrams/class/classDb.ts +import { select } from "d3"; + +// src/diagrams/class/classTypes.ts +var visibilityValues = ["#", "+", "~", "-", ""]; +var ClassMember = class { + static { + __name(this, "ClassMember"); + } + constructor(input, memberType) { + this.memberType = memberType; + this.visibility = ""; + this.classifier = ""; + this.text = ""; + const sanitizedInput = sanitizeText(input, getConfig()); + this.parseMember(sanitizedInput); + } + getDisplayDetails() { + let displayText = this.visibility + parseGenericTypes(this.id); + if (this.memberType === "method") { + displayText += `(${parseGenericTypes(this.parameters.trim())})`; + if (this.returnType) { + displayText += " : " + parseGenericTypes(this.returnType); + } + } + displayText = displayText.trim(); + const cssStyle = this.parseClassifier(); + return { + displayText, + cssStyle + }; + } + parseMember(input) { + let potentialClassifier = ""; + if (this.memberType === "method") { + const methodRegEx = /([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/; + const match = methodRegEx.exec(input); + if (match) { + const detectedVisibility = match[1] ? match[1].trim() : ""; + if (visibilityValues.includes(detectedVisibility)) { + this.visibility = detectedVisibility; + } + this.id = match[2]; + this.parameters = match[3] ? match[3].trim() : ""; + potentialClassifier = match[4] ? match[4].trim() : ""; + this.returnType = match[5] ? match[5].trim() : ""; + if (potentialClassifier === "") { + const lastChar = this.returnType.substring(this.returnType.length - 1); + if (/[$*]/.exec(lastChar)) { + potentialClassifier = lastChar; + this.returnType = this.returnType.substring(0, this.returnType.length - 1); + } + } + } + } else { + const length = input.length; + const firstChar = input.substring(0, 1); + const lastChar = input.substring(length - 1); + if (visibilityValues.includes(firstChar)) { + this.visibility = firstChar; + } + if (/[$*]/.exec(lastChar)) { + potentialClassifier = lastChar; + } + this.id = input.substring( + this.visibility === "" ? 0 : 1, + potentialClassifier === "" ? length : length - 1 + ); + } + this.classifier = potentialClassifier; + this.id = this.id.startsWith(" ") ? " " + this.id.trim() : this.id.trim(); + const combinedText = `${this.visibility ? "\\" + this.visibility : ""}${parseGenericTypes(this.id)}${this.memberType === "method" ? `(${parseGenericTypes(this.parameters)})${this.returnType ? " : " + parseGenericTypes(this.returnType) : ""}` : ""}`; + this.text = combinedText.replaceAll("<", "<").replaceAll(">", ">"); + if (this.text.startsWith("\\<")) { + this.text = this.text.replace("\\<", "~"); + } + } + parseClassifier() { + switch (this.classifier) { + case "*": + return "font-style:italic;"; + case "$": + return "text-decoration:underline;"; + default: + return ""; + } + } +}; + +// src/diagrams/class/classDb.ts +var MERMAID_DOM_ID_PREFIX = "classId-"; +var classCounter = 0; +var sanitizeText2 = /* @__PURE__ */ __name((txt) => common_default.sanitizeText(txt, getConfig()), "sanitizeText"); +var ClassDB = class { + constructor() { + this.relations = []; + this.classes = /* @__PURE__ */ new Map(); + this.styleClasses = /* @__PURE__ */ new Map(); + this.notes = []; + this.interfaces = []; + // private static classCounter = 0; + this.namespaces = /* @__PURE__ */ new Map(); + this.namespaceCounter = 0; + this.functions = []; + this.lineType = { + LINE: 0, + DOTTED_LINE: 1 + }; + this.relationType = { + AGGREGATION: 0, + EXTENSION: 1, + COMPOSITION: 2, + DEPENDENCY: 3, + LOLLIPOP: 4 + }; + this.setupToolTips = /* @__PURE__ */ __name((element) => { + let tooltipElem = select(".mermaidTooltip"); + if ((tooltipElem._groups || tooltipElem)[0][0] === null) { + tooltipElem = select("body").append("div").attr("class", "mermaidTooltip").style("opacity", 0); + } + const svg = select(element).select("svg"); + const nodes = svg.selectAll("g.node"); + nodes.on("mouseover", (event) => { + const el = select(event.currentTarget); + const title = el.attr("title"); + if (title === null) { + return; + } + const rect = this.getBoundingClientRect(); + tooltipElem.transition().duration(200).style("opacity", ".9"); + tooltipElem.text(el.attr("title")).style("left", window.scrollX + rect.left + (rect.right - rect.left) / 2 + "px").style("top", window.scrollY + rect.top - 14 + document.body.scrollTop + "px"); + tooltipElem.html(tooltipElem.html().replace(/<br\/>/g, "
")); + el.classed("hover", true); + }).on("mouseout", (event) => { + tooltipElem.transition().duration(500).style("opacity", 0); + const el = select(event.currentTarget); + el.classed("hover", false); + }); + }, "setupToolTips"); + this.direction = "TB"; + this.setAccTitle = setAccTitle; + this.getAccTitle = getAccTitle; + this.setAccDescription = setAccDescription; + this.getAccDescription = getAccDescription; + this.setDiagramTitle = setDiagramTitle; + this.getDiagramTitle = getDiagramTitle; + this.getConfig = /* @__PURE__ */ __name(() => getConfig().class, "getConfig"); + this.functions.push(this.setupToolTips.bind(this)); + this.clear(); + this.addRelation = this.addRelation.bind(this); + this.addClassesToNamespace = this.addClassesToNamespace.bind(this); + this.addNamespace = this.addNamespace.bind(this); + this.setCssClass = this.setCssClass.bind(this); + this.addMembers = this.addMembers.bind(this); + this.addClass = this.addClass.bind(this); + this.setClassLabel = this.setClassLabel.bind(this); + this.addAnnotation = this.addAnnotation.bind(this); + this.addMember = this.addMember.bind(this); + this.cleanupLabel = this.cleanupLabel.bind(this); + this.addNote = this.addNote.bind(this); + this.defineClass = this.defineClass.bind(this); + this.setDirection = this.setDirection.bind(this); + this.setLink = this.setLink.bind(this); + this.bindFunctions = this.bindFunctions.bind(this); + this.clear = this.clear.bind(this); + this.setTooltip = this.setTooltip.bind(this); + this.setClickEvent = this.setClickEvent.bind(this); + this.setCssStyle = this.setCssStyle.bind(this); + } + static { + __name(this, "ClassDB"); + } + splitClassNameAndType(_id) { + const id = common_default.sanitizeText(_id, getConfig()); + let genericType = ""; + let className = id; + if (id.indexOf("~") > 0) { + const split = id.split("~"); + className = sanitizeText2(split[0]); + genericType = sanitizeText2(split[1]); + } + return { className, type: genericType }; + } + setClassLabel(_id, label) { + const id = common_default.sanitizeText(_id, getConfig()); + if (label) { + label = sanitizeText2(label); + } + const { className } = this.splitClassNameAndType(id); + this.classes.get(className).label = label; + this.classes.get(className).text = `${label}${this.classes.get(className).type ? `<${this.classes.get(className).type}>` : ""}`; + } + /** + * Function called by parser when a node definition has been found. + * + * @param id - ID of the class to add + * @public + */ + addClass(_id) { + const id = common_default.sanitizeText(_id, getConfig()); + const { className, type } = this.splitClassNameAndType(id); + if (this.classes.has(className)) { + return; + } + const name = common_default.sanitizeText(className, getConfig()); + this.classes.set(name, { + id: name, + type, + label: name, + text: `${name}${type ? `<${type}>` : ""}`, + shape: "classBox", + cssClasses: "default", + methods: [], + members: [], + annotations: [], + styles: [], + domId: MERMAID_DOM_ID_PREFIX + name + "-" + classCounter + }); + classCounter++; + } + addInterface(label, classId) { + const classInterface = { + id: `interface${this.interfaces.length}`, + label, + classId + }; + this.interfaces.push(classInterface); + } + /** + * Function to lookup domId from id in the graph definition. + * + * @param id - class ID to lookup + * @public + */ + lookUpDomId(_id) { + const id = common_default.sanitizeText(_id, getConfig()); + if (this.classes.has(id)) { + return this.classes.get(id).domId; + } + throw new Error("Class not found: " + id); + } + clear() { + this.relations = []; + this.classes = /* @__PURE__ */ new Map(); + this.notes = []; + this.interfaces = []; + this.functions = []; + this.functions.push(this.setupToolTips.bind(this)); + this.namespaces = /* @__PURE__ */ new Map(); + this.namespaceCounter = 0; + this.direction = "TB"; + clear(); + } + getClass(id) { + return this.classes.get(id); + } + getClasses() { + return this.classes; + } + getRelations() { + return this.relations; + } + getNotes() { + return this.notes; + } + addRelation(classRelation) { + log.debug("Adding relation: " + JSON.stringify(classRelation)); + const invalidTypes = [ + this.relationType.LOLLIPOP, + this.relationType.AGGREGATION, + this.relationType.COMPOSITION, + this.relationType.DEPENDENCY, + this.relationType.EXTENSION + ]; + if (classRelation.relation.type1 === this.relationType.LOLLIPOP && !invalidTypes.includes(classRelation.relation.type2)) { + this.addClass(classRelation.id2); + this.addInterface(classRelation.id1, classRelation.id2); + classRelation.id1 = `interface${this.interfaces.length - 1}`; + } else if (classRelation.relation.type2 === this.relationType.LOLLIPOP && !invalidTypes.includes(classRelation.relation.type1)) { + this.addClass(classRelation.id1); + this.addInterface(classRelation.id2, classRelation.id1); + classRelation.id2 = `interface${this.interfaces.length - 1}`; + } else { + this.addClass(classRelation.id1); + this.addClass(classRelation.id2); + } + classRelation.id1 = this.splitClassNameAndType(classRelation.id1).className; + classRelation.id2 = this.splitClassNameAndType(classRelation.id2).className; + classRelation.relationTitle1 = common_default.sanitizeText( + classRelation.relationTitle1.trim(), + getConfig() + ); + classRelation.relationTitle2 = common_default.sanitizeText( + classRelation.relationTitle2.trim(), + getConfig() + ); + this.relations.push(classRelation); + } + /** + * Adds an annotation to the specified class Annotations mark special properties of the given type + * (like 'interface' or 'service') + * + * @param className - The class name + * @param annotation - The name of the annotation without any brackets + * @public + */ + addAnnotation(className, annotation) { + const validatedClassName = this.splitClassNameAndType(className).className; + this.classes.get(validatedClassName).annotations.push(annotation); + } + /** + * Adds a member to the specified class + * + * @param className - The class name + * @param member - The full name of the member. If the member is enclosed in `<>` it is + * treated as an annotation If the member is ending with a closing bracket ) it is treated as a + * method Otherwise the member will be treated as a normal property + * @public + */ + addMember(className, member) { + this.addClass(className); + const validatedClassName = this.splitClassNameAndType(className).className; + const theClass = this.classes.get(validatedClassName); + if (typeof member === "string") { + const memberString = member.trim(); + if (memberString.startsWith("<<") && memberString.endsWith(">>")) { + theClass.annotations.push(sanitizeText2(memberString.substring(2, memberString.length - 2))); + } else if (memberString.indexOf(")") > 0) { + theClass.methods.push(new ClassMember(memberString, "method")); + } else if (memberString) { + theClass.members.push(new ClassMember(memberString, "attribute")); + } + } + } + addMembers(className, members) { + if (Array.isArray(members)) { + members.reverse(); + members.forEach((member) => this.addMember(className, member)); + } + } + addNote(text, className) { + const note = { + id: `note${this.notes.length}`, + class: className, + text + }; + this.notes.push(note); + } + cleanupLabel(label) { + if (label.startsWith(":")) { + label = label.substring(1); + } + return sanitizeText2(label.trim()); + } + /** + * Called by parser when assigning cssClass to a class + * + * @param ids - Comma separated list of ids + * @param className - Class to add + */ + setCssClass(ids, className) { + ids.split(",").forEach((_id) => { + let id = _id; + if (/\d/.exec(_id[0])) { + id = MERMAID_DOM_ID_PREFIX + id; + } + const classNode = this.classes.get(id); + if (classNode) { + classNode.cssClasses += " " + className; + } + }); + } + defineClass(ids, style) { + for (const id of ids) { + let styleClass = this.styleClasses.get(id); + if (styleClass === void 0) { + styleClass = { id, styles: [], textStyles: [] }; + this.styleClasses.set(id, styleClass); + } + if (style) { + style.forEach((s) => { + if (/color/.exec(s)) { + const newStyle = s.replace("fill", "bgFill"); + styleClass.textStyles.push(newStyle); + } + styleClass.styles.push(s); + }); + } + this.classes.forEach((value) => { + if (value.cssClasses.includes(id)) { + value.styles.push(...style.flatMap((s) => s.split(","))); + } + }); + } + } + /** + * Called by parser when a tooltip is found, e.g. a clickable element. + * + * @param ids - Comma separated list of ids + * @param tooltip - Tooltip to add + */ + setTooltip(ids, tooltip) { + ids.split(",").forEach((id) => { + if (tooltip !== void 0) { + this.classes.get(id).tooltip = sanitizeText2(tooltip); + } + }); + } + getTooltip(id, namespace) { + if (namespace && this.namespaces.has(namespace)) { + return this.namespaces.get(namespace).classes.get(id).tooltip; + } + return this.classes.get(id).tooltip; + } + /** + * Called by parser when a link is found. Adds the URL to the vertex data. + * + * @param ids - Comma separated list of ids + * @param linkStr - URL to create a link for + * @param target - Target of the link, _blank by default as originally defined in the svgDraw.js file + */ + setLink(ids, linkStr, target) { + const config = getConfig(); + ids.split(",").forEach((_id) => { + let id = _id; + if (/\d/.exec(_id[0])) { + id = MERMAID_DOM_ID_PREFIX + id; + } + const theClass = this.classes.get(id); + if (theClass) { + theClass.link = utils_default.formatUrl(linkStr, config); + if (config.securityLevel === "sandbox") { + theClass.linkTarget = "_top"; + } else if (typeof target === "string") { + theClass.linkTarget = sanitizeText2(target); + } else { + theClass.linkTarget = "_blank"; + } + } + }); + this.setCssClass(ids, "clickable"); + } + /** + * Called by parser when a click definition is found. Registers an event handler. + * + * @param ids - Comma separated list of ids + * @param functionName - Function to be called on click + * @param functionArgs - Function args the function should be called with + */ + setClickEvent(ids, functionName, functionArgs) { + ids.split(",").forEach((id) => { + this.setClickFunc(id, functionName, functionArgs); + this.classes.get(id).haveCallback = true; + }); + this.setCssClass(ids, "clickable"); + } + setClickFunc(_domId, functionName, functionArgs) { + const domId = common_default.sanitizeText(_domId, getConfig()); + const config = getConfig(); + if (config.securityLevel !== "loose") { + return; + } + if (functionName === void 0) { + return; + } + const id = domId; + if (this.classes.has(id)) { + const elemId = this.lookUpDomId(id); + let argList = []; + if (typeof functionArgs === "string") { + argList = functionArgs.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/); + for (let i = 0; i < argList.length; i++) { + let item = argList[i].trim(); + if (item.startsWith('"') && item.endsWith('"')) { + item = item.substr(1, item.length - 2); + } + argList[i] = item; + } + } + if (argList.length === 0) { + argList.push(elemId); + } + this.functions.push(() => { + const elem = document.querySelector(`[id="${elemId}"]`); + if (elem !== null) { + elem.addEventListener( + "click", + () => { + utils_default.runFunc(functionName, ...argList); + }, + false + ); + } + }); + } + } + bindFunctions(element) { + this.functions.forEach((fun) => { + fun(element); + }); + } + getDirection() { + return this.direction; + } + setDirection(dir) { + this.direction = dir; + } + /** + * Function called by parser when a namespace definition has been found. + * + * @param id - ID of the namespace to add + * @public + */ + addNamespace(id) { + if (this.namespaces.has(id)) { + return; + } + this.namespaces.set(id, { + id, + classes: /* @__PURE__ */ new Map(), + children: {}, + domId: MERMAID_DOM_ID_PREFIX + id + "-" + this.namespaceCounter + }); + this.namespaceCounter++; + } + getNamespace(name) { + return this.namespaces.get(name); + } + getNamespaces() { + return this.namespaces; + } + /** + * Function called by parser when a namespace definition has been found. + * + * @param id - ID of the namespace to add + * @param classNames - IDs of the class to add + * @public + */ + addClassesToNamespace(id, classNames) { + if (!this.namespaces.has(id)) { + return; + } + for (const name of classNames) { + const { className } = this.splitClassNameAndType(name); + this.classes.get(className).parent = id; + this.namespaces.get(id).classes.set(className, this.classes.get(className)); + } + } + setCssStyle(id, styles) { + const thisClass = this.classes.get(id); + if (!styles || !thisClass) { + return; + } + for (const s of styles) { + if (s.includes(",")) { + thisClass.styles.push(...s.split(",")); + } else { + thisClass.styles.push(s); + } + } + } + /** + * Gets the arrow marker for a type index + * + * @param type - The type to look for + * @returns The arrow marker + */ + getArrowMarker(type) { + let marker; + switch (type) { + case 0: + marker = "aggregation"; + break; + case 1: + marker = "extension"; + break; + case 2: + marker = "composition"; + break; + case 3: + marker = "dependency"; + break; + case 4: + marker = "lollipop"; + break; + default: + marker = "none"; + } + return marker; + } + getData() { + const nodes = []; + const edges = []; + const config = getConfig(); + for (const namespaceKey of this.namespaces.keys()) { + const namespace = this.namespaces.get(namespaceKey); + if (namespace) { + const node = { + id: namespace.id, + label: namespace.id, + isGroup: true, + padding: config.class.padding ?? 16, + // parent node must be one of [rect, roundedWithTitle, noteGroup, divider] + shape: "rect", + cssStyles: ["fill: none", "stroke: black"], + look: config.look + }; + nodes.push(node); + } + } + for (const classKey of this.classes.keys()) { + const classNode = this.classes.get(classKey); + if (classNode) { + const node = classNode; + node.parentId = classNode.parent; + node.look = config.look; + nodes.push(node); + } + } + let cnt = 0; + for (const note of this.notes) { + cnt++; + const noteNode = { + id: note.id, + label: note.text, + isGroup: false, + shape: "note", + padding: config.class.padding ?? 6, + cssStyles: [ + "text-align: left", + "white-space: nowrap", + `fill: ${config.themeVariables.noteBkgColor}`, + `stroke: ${config.themeVariables.noteBorderColor}` + ], + look: config.look + }; + nodes.push(noteNode); + const noteClassId = this.classes.get(note.class)?.id ?? ""; + if (noteClassId) { + const edge = { + id: `edgeNote${cnt}`, + start: note.id, + end: noteClassId, + type: "normal", + thickness: "normal", + classes: "relation", + arrowTypeStart: "none", + arrowTypeEnd: "none", + arrowheadStyle: "", + labelStyle: [""], + style: ["fill: none"], + pattern: "dotted", + look: config.look + }; + edges.push(edge); + } + } + for (const _interface of this.interfaces) { + const interfaceNode = { + id: _interface.id, + label: _interface.label, + isGroup: false, + shape: "rect", + cssStyles: ["opacity: 0;"], + look: config.look + }; + nodes.push(interfaceNode); + } + cnt = 0; + for (const classRelation of this.relations) { + cnt++; + const edge = { + id: getEdgeId(classRelation.id1, classRelation.id2, { + prefix: "id", + counter: cnt + }), + start: classRelation.id1, + end: classRelation.id2, + type: "normal", + label: classRelation.title, + labelpos: "c", + thickness: "normal", + classes: "relation", + arrowTypeStart: this.getArrowMarker(classRelation.relation.type1), + arrowTypeEnd: this.getArrowMarker(classRelation.relation.type2), + startLabelRight: classRelation.relationTitle1 === "none" ? "" : classRelation.relationTitle1, + endLabelLeft: classRelation.relationTitle2 === "none" ? "" : classRelation.relationTitle2, + arrowheadStyle: "", + labelStyle: ["display: inline-block"], + style: classRelation.style || "", + pattern: classRelation.relation.lineType == 1 ? "dashed" : "solid", + look: config.look + }; + edges.push(edge); + } + return { nodes, edges, other: {}, config, direction: this.getDirection() }; + } +}; + +// src/diagrams/class/styles.js +var getStyles = /* @__PURE__ */ __name((options) => `g.classGroup text { + fill: ${options.nodeBorder || options.classText}; + stroke: none; + font-family: ${options.fontFamily}; + font-size: 10px; + + .title { + font-weight: bolder; + } + +} + +.nodeLabel, .edgeLabel { + color: ${options.classText}; +} +.edgeLabel .label rect { + fill: ${options.mainBkg}; +} +.label text { + fill: ${options.classText}; +} + +.labelBkg { + background: ${options.mainBkg}; +} +.edgeLabel .label span { + background: ${options.mainBkg}; +} + +.classTitle { + font-weight: bolder; +} +.node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; + stroke-width: 1px; + } + + +.divider { + stroke: ${options.nodeBorder}; + stroke-width: 1; +} + +g.clickable { + cursor: pointer; +} + +g.classGroup rect { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; +} + +g.classGroup line { + stroke: ${options.nodeBorder}; + stroke-width: 1; +} + +.classLabel .box { + stroke: none; + stroke-width: 0; + fill: ${options.mainBkg}; + opacity: 0.5; +} + +.classLabel .label { + fill: ${options.nodeBorder}; + font-size: 10px; +} + +.relation { + stroke: ${options.lineColor}; + stroke-width: 1; + fill: none; +} + +.dashed-line{ + stroke-dasharray: 3; +} + +.dotted-line{ + stroke-dasharray: 1 2; +} + +#compositionStart, .composition { + fill: ${options.lineColor} !important; + stroke: ${options.lineColor} !important; + stroke-width: 1; +} + +#compositionEnd, .composition { + fill: ${options.lineColor} !important; + stroke: ${options.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${options.lineColor} !important; + stroke: ${options.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${options.lineColor} !important; + stroke: ${options.lineColor} !important; + stroke-width: 1; +} + +#extensionStart, .extension { + fill: transparent !important; + stroke: ${options.lineColor} !important; + stroke-width: 1; +} + +#extensionEnd, .extension { + fill: transparent !important; + stroke: ${options.lineColor} !important; + stroke-width: 1; +} + +#aggregationStart, .aggregation { + fill: transparent !important; + stroke: ${options.lineColor} !important; + stroke-width: 1; +} + +#aggregationEnd, .aggregation { + fill: transparent !important; + stroke: ${options.lineColor} !important; + stroke-width: 1; +} + +#lollipopStart, .lollipop { + fill: ${options.mainBkg} !important; + stroke: ${options.lineColor} !important; + stroke-width: 1; +} + +#lollipopEnd, .lollipop { + fill: ${options.mainBkg} !important; + stroke: ${options.lineColor} !important; + stroke-width: 1; +} + +.edgeTerminals { + font-size: 11px; + line-height: initial; +} + +.classTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${options.textColor}; +} + ${getIconStyles()} +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/class/classRenderer-v3-unified.ts +var getDir = /* @__PURE__ */ __name((parsedItem, defaultDir = "TB") => { + if (!parsedItem.doc) { + return defaultDir; + } + let dir = defaultDir; + for (const parsedItemDoc of parsedItem.doc) { + if (parsedItemDoc.stmt === "dir") { + dir = parsedItemDoc.value; + } + } + return dir; +}, "getDir"); +var getClasses = /* @__PURE__ */ __name(function(text, diagramObj) { + return diagramObj.db.getClasses(); +}, "getClasses"); +var draw = /* @__PURE__ */ __name(async function(text, id, _version, diag) { + log.info("REF0:"); + log.info("Drawing class diagram (v3)", id); + const { securityLevel, state: conf, layout } = getConfig(); + const data4Layout = diag.db.getData(); + const svg = getDiagramElement(id, securityLevel); + data4Layout.type = diag.type; + data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(layout); + data4Layout.nodeSpacing = conf?.nodeSpacing || 50; + data4Layout.rankSpacing = conf?.rankSpacing || 50; + data4Layout.markers = ["aggregation", "extension", "composition", "dependency", "lollipop"]; + data4Layout.diagramId = id; + await render(data4Layout, svg); + const padding = 8; + utils_default.insertTitle( + svg, + "classDiagramTitleText", + conf?.titleTopMargin ?? 25, + diag.db.getDiagramTitle() + ); + setupViewPortForSVG(svg, padding, "classDiagram", conf?.useMaxWidth ?? true); +}, "draw"); +var classRenderer_v3_unified_default = { + getClasses, + draw, + getDir +}; + +export { + classDiagram_default, + ClassDB, + styles_default, + classRenderer_v3_unified_default +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-B4BG7PRW.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-B4BG7PRW.mjs.map new file mode 100644 index 0000000..9ad3886 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-B4BG7PRW.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/class/parser/classDiagram.jison", "../../../src/diagrams/class/classDb.ts", "../../../src/diagrams/class/classTypes.ts", "../../../src/diagrams/class/styles.js", "../../../src/diagrams/class/classRenderer-v3-unified.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,18],$V1=[1,19],$V2=[1,20],$V3=[1,41],$V4=[1,42],$V5=[1,26],$V6=[1,24],$V7=[1,25],$V8=[1,32],$V9=[1,33],$Va=[1,34],$Vb=[1,45],$Vc=[1,35],$Vd=[1,36],$Ve=[1,37],$Vf=[1,38],$Vg=[1,27],$Vh=[1,28],$Vi=[1,29],$Vj=[1,30],$Vk=[1,31],$Vl=[1,44],$Vm=[1,46],$Vn=[1,43],$Vo=[1,47],$Vp=[1,9],$Vq=[1,8,9],$Vr=[1,58],$Vs=[1,59],$Vt=[1,60],$Vu=[1,61],$Vv=[1,62],$Vw=[1,63],$Vx=[1,64],$Vy=[1,8,9,41],$Vz=[1,76],$VA=[1,8,9,12,13,22,39,41,44,68,69,70,71,72,73,74,79,81],$VB=[1,8,9,12,13,18,20,22,39,41,44,50,60,68,69,70,71,72,73,74,79,81,86,100,102,103],$VC=[13,60,86,100,102,103],$VD=[13,60,73,74,86,100,102,103],$VE=[13,60,68,69,70,71,72,86,100,102,103],$VF=[1,100],$VG=[1,117],$VH=[1,113],$VI=[1,109],$VJ=[1,115],$VK=[1,110],$VL=[1,111],$VM=[1,112],$VN=[1,114],$VO=[1,116],$VP=[22,48,60,61,82,86,87,88,89,90],$VQ=[1,8,9,39,41,44],$VR=[1,8,9,22],$VS=[1,145],$VT=[1,8,9,61],$VU=[1,8,9,22,48,60,61,82,86,87,88,89,90];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"mermaidDoc\":4,\"statements\":5,\"graphConfig\":6,\"CLASS_DIAGRAM\":7,\"NEWLINE\":8,\"EOF\":9,\"statement\":10,\"classLabel\":11,\"SQS\":12,\"STR\":13,\"SQE\":14,\"namespaceName\":15,\"alphaNumToken\":16,\"classLiteralName\":17,\"DOT\":18,\"className\":19,\"GENERICTYPE\":20,\"relationStatement\":21,\"LABEL\":22,\"namespaceStatement\":23,\"classStatement\":24,\"memberStatement\":25,\"annotationStatement\":26,\"clickStatement\":27,\"styleStatement\":28,\"cssClassStatement\":29,\"noteStatement\":30,\"classDefStatement\":31,\"direction\":32,\"acc_title\":33,\"acc_title_value\":34,\"acc_descr\":35,\"acc_descr_value\":36,\"acc_descr_multiline_value\":37,\"namespaceIdentifier\":38,\"STRUCT_START\":39,\"classStatements\":40,\"STRUCT_STOP\":41,\"NAMESPACE\":42,\"classIdentifier\":43,\"STYLE_SEPARATOR\":44,\"members\":45,\"CLASS\":46,\"emptyBody\":47,\"SPACE\":48,\"ANNOTATION_START\":49,\"ANNOTATION_END\":50,\"MEMBER\":51,\"SEPARATOR\":52,\"relation\":53,\"NOTE_FOR\":54,\"noteText\":55,\"NOTE\":56,\"CLASSDEF\":57,\"classList\":58,\"stylesOpt\":59,\"ALPHA\":60,\"COMMA\":61,\"direction_tb\":62,\"direction_bt\":63,\"direction_rl\":64,\"direction_lr\":65,\"relationType\":66,\"lineType\":67,\"AGGREGATION\":68,\"EXTENSION\":69,\"COMPOSITION\":70,\"DEPENDENCY\":71,\"LOLLIPOP\":72,\"LINE\":73,\"DOTTED_LINE\":74,\"CALLBACK\":75,\"LINK\":76,\"LINK_TARGET\":77,\"CLICK\":78,\"CALLBACK_NAME\":79,\"CALLBACK_ARGS\":80,\"HREF\":81,\"STYLE\":82,\"CSSCLASS\":83,\"style\":84,\"styleComponent\":85,\"NUM\":86,\"COLON\":87,\"UNIT\":88,\"BRKT\":89,\"PCT\":90,\"commentToken\":91,\"textToken\":92,\"graphCodeTokens\":93,\"textNoTagsToken\":94,\"TAGSTART\":95,\"TAGEND\":96,\"==\":97,\"--\":98,\"DEFAULT\":99,\"MINUS\":100,\"keywords\":101,\"UNICODE_TEXT\":102,\"BQUOTE_STR\":103,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",7:\"CLASS_DIAGRAM\",8:\"NEWLINE\",9:\"EOF\",12:\"SQS\",13:\"STR\",14:\"SQE\",18:\"DOT\",20:\"GENERICTYPE\",22:\"LABEL\",33:\"acc_title\",34:\"acc_title_value\",35:\"acc_descr\",36:\"acc_descr_value\",37:\"acc_descr_multiline_value\",39:\"STRUCT_START\",41:\"STRUCT_STOP\",42:\"NAMESPACE\",44:\"STYLE_SEPARATOR\",46:\"CLASS\",48:\"SPACE\",49:\"ANNOTATION_START\",50:\"ANNOTATION_END\",51:\"MEMBER\",52:\"SEPARATOR\",54:\"NOTE_FOR\",56:\"NOTE\",57:\"CLASSDEF\",60:\"ALPHA\",61:\"COMMA\",62:\"direction_tb\",63:\"direction_bt\",64:\"direction_rl\",65:\"direction_lr\",68:\"AGGREGATION\",69:\"EXTENSION\",70:\"COMPOSITION\",71:\"DEPENDENCY\",72:\"LOLLIPOP\",73:\"LINE\",74:\"DOTTED_LINE\",75:\"CALLBACK\",76:\"LINK\",77:\"LINK_TARGET\",78:\"CLICK\",79:\"CALLBACK_NAME\",80:\"CALLBACK_ARGS\",81:\"HREF\",82:\"STYLE\",83:\"CSSCLASS\",86:\"NUM\",87:\"COLON\",88:\"UNIT\",89:\"BRKT\",90:\"PCT\",93:\"graphCodeTokens\",95:\"TAGSTART\",96:\"TAGEND\",97:\"==\",98:\"--\",99:\"DEFAULT\",100:\"MINUS\",101:\"keywords\",102:\"UNICODE_TEXT\",103:\"BQUOTE_STR\"},\nproductions_: [0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,1],[15,3],[15,2],[19,1],[19,3],[19,1],[19,2],[19,2],[19,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[23,4],[23,5],[38,2],[40,1],[40,2],[40,3],[24,1],[24,3],[24,4],[24,3],[24,6],[43,2],[43,3],[47,0],[47,2],[47,2],[26,4],[45,1],[45,2],[25,1],[25,2],[25,1],[25,1],[21,3],[21,4],[21,4],[21,5],[30,3],[30,2],[31,3],[58,1],[58,3],[32,1],[32,1],[32,1],[32,1],[53,3],[53,2],[53,2],[53,1],[66,1],[66,1],[66,1],[66,1],[66,1],[67,1],[67,1],[27,3],[27,4],[27,3],[27,4],[27,4],[27,5],[27,3],[27,4],[27,4],[27,5],[27,4],[27,5],[27,5],[27,6],[28,3],[29,3],[59,1],[59,3],[84,1],[84,2],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[91,1],[91,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[94,1],[94,1],[94,1],[94,1],[16,1],[16,1],[16,1],[16,1],[17,1],[55,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 8:\n this.$=$$[$0-1]; \nbreak;\ncase 9: case 10: case 13: case 15:\n this.$=$$[$0]; \nbreak;\ncase 11: case 14:\n this.$=$$[$0-2]+'.'+$$[$0]; \nbreak;\ncase 12: case 16:\n this.$=$$[$0-1]+$$[$0]; \nbreak;\ncase 17: case 18:\n this.$=$$[$0-1]+'~'+$$[$0]+'~'; \nbreak;\ncase 19:\n yy.addRelation($$[$0]); \nbreak;\ncase 20:\n $$[$0-1].title = yy.cleanupLabel($$[$0]); yy.addRelation($$[$0-1]); \nbreak;\ncase 31:\n this.$=$$[$0].trim();yy.setAccTitle(this.$); \nbreak;\ncase 32: case 33:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 34:\n yy.addClassesToNamespace($$[$0-3], $$[$0-1]); \nbreak;\ncase 35:\n yy.addClassesToNamespace($$[$0-4], $$[$0-1]); \nbreak;\ncase 36:\n this.$=$$[$0]; yy.addNamespace($$[$0]); \nbreak;\ncase 37:\nthis.$=[$$[$0]]\nbreak;\ncase 38:\nthis.$=[$$[$0-1]]\nbreak;\ncase 39:\n$$[$0].unshift($$[$0-2]); this.$=$$[$0]\nbreak;\ncase 41:\nyy.setCssClass($$[$0-2], $$[$0]);\nbreak;\ncase 42:\nyy.addMembers($$[$0-3],$$[$0-1]);\nbreak;\ncase 44:\nyy.setCssClass($$[$0-5], $$[$0-3]);yy.addMembers($$[$0-5],$$[$0-1]);\nbreak;\ncase 45:\nthis.$=$$[$0]; yy.addClass($$[$0]);\nbreak;\ncase 46:\nthis.$=$$[$0-1]; yy.addClass($$[$0-1]);yy.setClassLabel($$[$0-1], $$[$0]);\nbreak;\ncase 50:\n yy.addAnnotation($$[$0],$$[$0-2]); \nbreak;\ncase 51: case 64:\n this.$ = [$$[$0]]; \nbreak;\ncase 52:\n $$[$0].push($$[$0-1]);this.$=$$[$0];\nbreak;\ncase 53:\n/*console.log('Rel found',$$[$0]);*/\nbreak;\ncase 54:\nyy.addMember($$[$0-1],yy.cleanupLabel($$[$0]));\nbreak;\ncase 55:\n/*console.warn('Member',$$[$0]);*/\nbreak;\ncase 56:\n/*console.log('sep found',$$[$0]);*/\nbreak;\ncase 57:\n this.$ = {'id1':$$[$0-2],'id2':$$[$0], relation:$$[$0-1], relationTitle1:'none', relationTitle2:'none'}; \nbreak;\ncase 58:\n this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-1], relationTitle1:$$[$0-2], relationTitle2:'none'}\nbreak;\ncase 59:\n this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-2], relationTitle1:'none', relationTitle2:$$[$0-1]}; \nbreak;\ncase 60:\n this.$ = {id1:$$[$0-4], id2:$$[$0], relation:$$[$0-2], relationTitle1:$$[$0-3], relationTitle2:$$[$0-1]} \nbreak;\ncase 61:\n yy.addNote($$[$0], $$[$0-1]); \nbreak;\ncase 62:\n yy.addNote($$[$0]); \nbreak;\ncase 63:\nthis.$ = $$[$0-2];yy.defineClass($$[$0-1],$$[$0]);\nbreak;\ncase 65:\n this.$ = $$[$0-2].concat([$$[$0]]); \nbreak;\ncase 66:\n yy.setDirection('TB');\nbreak;\ncase 67:\n yy.setDirection('BT');\nbreak;\ncase 68:\n yy.setDirection('RL');\nbreak;\ncase 69:\n yy.setDirection('LR');\nbreak;\ncase 70:\n this.$={type1:$$[$0-2],type2:$$[$0],lineType:$$[$0-1]}; \nbreak;\ncase 71:\n this.$={type1:'none',type2:$$[$0],lineType:$$[$0-1]}; \nbreak;\ncase 72:\n this.$={type1:$$[$0-1],type2:'none',lineType:$$[$0]}; \nbreak;\ncase 73:\n this.$={type1:'none',type2:'none',lineType:$$[$0]}; \nbreak;\ncase 74:\n this.$=yy.relationType.AGGREGATION;\nbreak;\ncase 75:\n this.$=yy.relationType.EXTENSION;\nbreak;\ncase 76:\n this.$=yy.relationType.COMPOSITION;\nbreak;\ncase 77:\n this.$=yy.relationType.DEPENDENCY;\nbreak;\ncase 78:\n this.$=yy.relationType.LOLLIPOP;\nbreak;\ncase 79:\nthis.$=yy.lineType.LINE;\nbreak;\ncase 80:\nthis.$=yy.lineType.DOTTED_LINE;\nbreak;\ncase 81: case 87:\nthis.$ = $$[$0-2];yy.setClickEvent($$[$0-1], $$[$0]);\nbreak;\ncase 82: case 88:\nthis.$ = $$[$0-3];yy.setClickEvent($$[$0-2], $$[$0-1]);yy.setTooltip($$[$0-2], $$[$0]);\nbreak;\ncase 83:\nthis.$ = $$[$0-2];yy.setLink($$[$0-1], $$[$0]);\nbreak;\ncase 84:\nthis.$ = $$[$0-3];yy.setLink($$[$0-2], $$[$0-1],$$[$0]);\nbreak;\ncase 85:\nthis.$ = $$[$0-3];yy.setLink($$[$0-2], $$[$0-1]);yy.setTooltip($$[$0-2], $$[$0]);\nbreak;\ncase 86:\nthis.$ = $$[$0-4];yy.setLink($$[$0-3], $$[$0-2], $$[$0]);yy.setTooltip($$[$0-3], $$[$0-1]);\nbreak;\ncase 89:\nthis.$ = $$[$0-3];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]);\nbreak;\ncase 90:\nthis.$ = $$[$0-4];yy.setClickEvent($$[$0-3], $$[$0-2], $$[$0-1]);yy.setTooltip($$[$0-3], $$[$0]);\nbreak;\ncase 91:\nthis.$ = $$[$0-3];yy.setLink($$[$0-2], $$[$0]);\nbreak;\ncase 92:\nthis.$ = $$[$0-4];yy.setLink($$[$0-3], $$[$0-1], $$[$0]);\nbreak;\ncase 93:\nthis.$ = $$[$0-4];yy.setLink($$[$0-3], $$[$0-1]);yy.setTooltip($$[$0-3], $$[$0]);\nbreak;\ncase 94:\nthis.$ = $$[$0-5];yy.setLink($$[$0-4], $$[$0-2], $$[$0]);yy.setTooltip($$[$0-4], $$[$0-1]);\nbreak;\ncase 95:\nthis.$ = $$[$0-2];yy.setCssStyle($$[$0-1],$$[$0]);\nbreak;\ncase 96:\nyy.setCssClass($$[$0-1], $$[$0]);\nbreak;\ncase 97:\nthis.$ = [$$[$0]]\nbreak;\ncase 98:\n$$[$0-2].push($$[$0]);this.$ = $$[$0-2];\nbreak;\ncase 100:\nthis.$ = $$[$0-1] + $$[$0];\nbreak;\n}\n},\ntable: [{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:$V0,35:$V1,37:$V2,38:22,42:$V3,43:23,46:$V4,49:$V5,51:$V6,52:$V7,54:$V8,56:$V9,57:$Va,60:$Vb,62:$Vc,63:$Vd,64:$Ve,65:$Vf,75:$Vg,76:$Vh,78:$Vi,82:$Vj,83:$Vk,86:$Vl,100:$Vm,102:$Vn,103:$Vo},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},o($Vp,[2,5],{8:[1,48]}),{8:[1,49]},o($Vq,[2,19],{22:[1,50]}),o($Vq,[2,21]),o($Vq,[2,22]),o($Vq,[2,23]),o($Vq,[2,24]),o($Vq,[2,25]),o($Vq,[2,26]),o($Vq,[2,27]),o($Vq,[2,28]),o($Vq,[2,29]),o($Vq,[2,30]),{34:[1,51]},{36:[1,52]},o($Vq,[2,33]),o($Vq,[2,53],{53:53,66:56,67:57,13:[1,54],22:[1,55],68:$Vr,69:$Vs,70:$Vt,71:$Vu,72:$Vv,73:$Vw,74:$Vx}),{39:[1,65]},o($Vy,[2,40],{39:[1,67],44:[1,66]}),o($Vq,[2,55]),o($Vq,[2,56]),{16:68,60:$Vb,86:$Vl,100:$Vm,102:$Vn},{16:39,17:40,19:69,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},{16:39,17:40,19:70,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},{16:39,17:40,19:71,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},{60:[1,72]},{13:[1,73]},{16:39,17:40,19:74,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},{13:$Vz,55:75},{58:77,60:[1,78]},o($Vq,[2,66]),o($Vq,[2,67]),o($Vq,[2,68]),o($Vq,[2,69]),o($VA,[2,13],{16:39,17:40,19:80,18:[1,79],20:[1,81],60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo}),o($VA,[2,15],{20:[1,82]}),{15:83,16:84,17:85,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},{16:39,17:40,19:86,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},o($VB,[2,123]),o($VB,[2,124]),o($VB,[2,125]),o($VB,[2,126]),o([1,8,9,12,13,20,22,39,41,44,68,69,70,71,72,73,74,79,81],[2,127]),o($Vp,[2,6],{10:5,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,19:21,38:22,43:23,16:39,17:40,5:87,33:$V0,35:$V1,37:$V2,42:$V3,46:$V4,49:$V5,51:$V6,52:$V7,54:$V8,56:$V9,57:$Va,60:$Vb,62:$Vc,63:$Vd,64:$Ve,65:$Vf,75:$Vg,76:$Vh,78:$Vi,82:$Vj,83:$Vk,86:$Vl,100:$Vm,102:$Vn,103:$Vo}),{5:88,10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:$V0,35:$V1,37:$V2,38:22,42:$V3,43:23,46:$V4,49:$V5,51:$V6,52:$V7,54:$V8,56:$V9,57:$Va,60:$Vb,62:$Vc,63:$Vd,64:$Ve,65:$Vf,75:$Vg,76:$Vh,78:$Vi,82:$Vj,83:$Vk,86:$Vl,100:$Vm,102:$Vn,103:$Vo},o($Vq,[2,20]),o($Vq,[2,31]),o($Vq,[2,32]),{13:[1,90],16:39,17:40,19:89,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},{53:91,66:56,67:57,68:$Vr,69:$Vs,70:$Vt,71:$Vu,72:$Vv,73:$Vw,74:$Vx},o($Vq,[2,54]),{67:92,73:$Vw,74:$Vx},o($VC,[2,73],{66:93,68:$Vr,69:$Vs,70:$Vt,71:$Vu,72:$Vv}),o($VD,[2,74]),o($VD,[2,75]),o($VD,[2,76]),o($VD,[2,77]),o($VD,[2,78]),o($VE,[2,79]),o($VE,[2,80]),{8:[1,95],24:96,40:94,43:23,46:$V4},{16:97,60:$Vb,86:$Vl,100:$Vm,102:$Vn},{41:[1,99],45:98,51:$VF},{50:[1,101]},{13:[1,102]},{13:[1,103]},{79:[1,104],81:[1,105]},{22:$VG,48:$VH,59:106,60:$VI,82:$VJ,84:107,85:108,86:$VK,87:$VL,88:$VM,89:$VN,90:$VO},{60:[1,118]},{13:$Vz,55:119},o($Vq,[2,62]),o($Vq,[2,128]),{22:$VG,48:$VH,59:120,60:$VI,61:[1,121],82:$VJ,84:107,85:108,86:$VK,87:$VL,88:$VM,89:$VN,90:$VO},o($VP,[2,64]),{16:39,17:40,19:122,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},o($VA,[2,16]),o($VA,[2,17]),o($VA,[2,18]),{39:[2,36]},{15:124,16:84,17:85,18:[1,123],39:[2,9],60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},{39:[2,10]},o($VQ,[2,45],{11:125,12:[1,126]}),o($Vp,[2,7]),{9:[1,127]},o($VR,[2,57]),{16:39,17:40,19:128,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},{13:[1,130],16:39,17:40,19:129,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},o($VC,[2,72],{66:131,68:$Vr,69:$Vs,70:$Vt,71:$Vu,72:$Vv}),o($VC,[2,71]),{41:[1,132]},{24:96,40:133,43:23,46:$V4},{8:[1,134],41:[2,37]},o($Vy,[2,41],{39:[1,135]}),{41:[1,136]},o($Vy,[2,43]),{41:[2,51],45:137,51:$VF},{16:39,17:40,19:138,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},o($Vq,[2,81],{13:[1,139]}),o($Vq,[2,83],{13:[1,141],77:[1,140]}),o($Vq,[2,87],{13:[1,142],80:[1,143]}),{13:[1,144]},o($Vq,[2,95],{61:$VS}),o($VT,[2,97],{85:146,22:$VG,48:$VH,60:$VI,82:$VJ,86:$VK,87:$VL,88:$VM,89:$VN,90:$VO}),o($VU,[2,99]),o($VU,[2,101]),o($VU,[2,102]),o($VU,[2,103]),o($VU,[2,104]),o($VU,[2,105]),o($VU,[2,106]),o($VU,[2,107]),o($VU,[2,108]),o($VU,[2,109]),o($Vq,[2,96]),o($Vq,[2,61]),o($Vq,[2,63],{61:$VS}),{60:[1,147]},o($VA,[2,14]),{15:148,16:84,17:85,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},{39:[2,12]},o($VQ,[2,46]),{13:[1,149]},{1:[2,4]},o($VR,[2,59]),o($VR,[2,58]),{16:39,17:40,19:150,60:$Vb,86:$Vl,100:$Vm,102:$Vn,103:$Vo},o($VC,[2,70]),o($Vq,[2,34]),{41:[1,151]},{24:96,40:152,41:[2,38],43:23,46:$V4},{45:153,51:$VF},o($Vy,[2,42]),{41:[2,52]},o($Vq,[2,50]),o($Vq,[2,82]),o($Vq,[2,84]),o($Vq,[2,85],{77:[1,154]}),o($Vq,[2,88]),o($Vq,[2,89],{13:[1,155]}),o($Vq,[2,91],{13:[1,157],77:[1,156]}),{22:$VG,48:$VH,60:$VI,82:$VJ,84:158,85:108,86:$VK,87:$VL,88:$VM,89:$VN,90:$VO},o($VU,[2,100]),o($VP,[2,65]),{39:[2,11]},{14:[1,159]},o($VR,[2,60]),o($Vq,[2,35]),{41:[2,39]},{41:[1,160]},o($Vq,[2,86]),o($Vq,[2,90]),o($Vq,[2,92]),o($Vq,[2,93],{77:[1,161]}),o($VT,[2,98],{85:146,22:$VG,48:$VH,60:$VI,82:$VJ,86:$VK,87:$VL,88:$VM,89:$VN,90:$VO}),o($VQ,[2,8]),o($Vy,[2,44]),o($Vq,[2,94])],\ndefaultActions: {2:[2,1],3:[2,2],4:[2,3],83:[2,36],85:[2,10],124:[2,12],127:[2,4],137:[2,52],148:[2,11],152:[2,39]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 62;\nbreak;\ncase 1:return 63;\nbreak;\ncase 2:return 64;\nbreak;\ncase 3:return 65;\nbreak;\ncase 4:/* skip comments */\nbreak;\ncase 5:/* skip comments */\nbreak;\ncase 6: this.begin(\"acc_title\");return 33; \nbreak;\ncase 7: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 8: this.begin(\"acc_descr\");return 35; \nbreak;\ncase 9: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 10: this.begin(\"acc_descr_multiline\");\nbreak;\ncase 11: this.popState(); \nbreak;\ncase 12:return \"acc_descr_multiline_value\";\nbreak;\ncase 13:return 8;\nbreak;\ncase 14:/* skip whitespace */\nbreak;\ncase 15:return 7;\nbreak;\ncase 16:return 7;\nbreak;\ncase 17:return 'EDGE_STATE';\nbreak;\ncase 18:this.begin(\"callback_name\");\nbreak;\ncase 19:this.popState();\nbreak;\ncase 20:this.popState(); this.begin(\"callback_args\");\nbreak;\ncase 21:return 79;\nbreak;\ncase 22:this.popState();\nbreak;\ncase 23:return 80;\nbreak;\ncase 24:this.popState();\nbreak;\ncase 25:return \"STR\";\nbreak;\ncase 26:this.begin(\"string\");\nbreak;\ncase 27:return 82;\nbreak;\ncase 28:return 57;\nbreak;\ncase 29: this.begin('namespace'); return 42; \nbreak;\ncase 30: this.popState(); return 8; \nbreak;\ncase 31:/* skip whitespace */\nbreak;\ncase 32: this.begin(\"namespace-body\"); return 39;\nbreak;\ncase 33: this.popState(); return 41; \nbreak;\ncase 34:return \"EOF_IN_STRUCT\";\nbreak;\ncase 35:return 8;\nbreak;\ncase 36:/* skip whitespace */\nbreak;\ncase 37:return 'EDGE_STATE';\nbreak;\ncase 38: this.begin('class'); return 46;\nbreak;\ncase 39: this.popState(); return 8; \nbreak;\ncase 40:/* skip whitespace */\nbreak;\ncase 41: this.popState(); this.popState(); return 41;\nbreak;\ncase 42: this.begin(\"class-body\"); return 39;\nbreak;\ncase 43: this.popState(); return 41; \nbreak;\ncase 44:return \"EOF_IN_STRUCT\";\nbreak;\ncase 45: return 'EDGE_STATE';\nbreak;\ncase 46:return \"OPEN_IN_STRUCT\";\nbreak;\ncase 47:/* nothing */\nbreak;\ncase 48: return \"MEMBER\";\nbreak;\ncase 49:return 83;\nbreak;\ncase 50:return 75;\nbreak;\ncase 51:return 76;\nbreak;\ncase 52:return 78;\nbreak;\ncase 53:return 54;\nbreak;\ncase 54:return 56;\nbreak;\ncase 55:return 49;\nbreak;\ncase 56:return 50;\nbreak;\ncase 57:return 81;\nbreak;\ncase 58:this.popState();\nbreak;\ncase 59:return \"GENERICTYPE\";\nbreak;\ncase 60:this.begin(\"generic\");\nbreak;\ncase 61:this.popState();\nbreak;\ncase 62:return \"BQUOTE_STR\";\nbreak;\ncase 63:this.begin(\"bqstring\");\nbreak;\ncase 64:return 77;\nbreak;\ncase 65:return 77;\nbreak;\ncase 66:return 77;\nbreak;\ncase 67:return 77;\nbreak;\ncase 68:return 69;\nbreak;\ncase 69:return 69;\nbreak;\ncase 70:return 71;\nbreak;\ncase 71:return 71;\nbreak;\ncase 72:return 70;\nbreak;\ncase 73:return 68;\nbreak;\ncase 74:return 72;\nbreak;\ncase 75:return 73;\nbreak;\ncase 76:return 74;\nbreak;\ncase 77:return 22;\nbreak;\ncase 78:return 44;\nbreak;\ncase 79:return 100;\nbreak;\ncase 80:return 18;\nbreak;\ncase 81:return 'PLUS';\nbreak;\ncase 82:return 87;\nbreak;\ncase 83:return 61;\nbreak;\ncase 84:return 89;\nbreak;\ncase 85:return 89;\nbreak;\ncase 86:return 90;\nbreak;\ncase 87:return 'EQUALS';\nbreak;\ncase 88:return 'EQUALS';\nbreak;\ncase 89:return 60;\nbreak;\ncase 90:return 12;\nbreak;\ncase 91:return 14;\nbreak;\ncase 92:return 'PUNCTUATION';\nbreak;\ncase 93:return 86;\nbreak;\ncase 94:return 102;\nbreak;\ncase 95:return 48;\nbreak;\ncase 96:return 48;\nbreak;\ncase 97:return 9;\nbreak;\n}\n},\nrules: [/^(?:.*direction\\s+TB[^\\n]*)/,/^(?:.*direction\\s+BT[^\\n]*)/,/^(?:.*direction\\s+RL[^\\n]*)/,/^(?:.*direction\\s+LR[^\\n]*)/,/^(?:%%(?!\\{)*[^\\n]*(\\r?\\n?)+)/,/^(?:%%[^\\n]*(\\r?\\n)*)/,/^(?:accTitle\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*\\{\\s*)/,/^(?:[\\}])/,/^(?:[^\\}]*)/,/^(?:\\s*(\\r?\\n)+)/,/^(?:\\s+)/,/^(?:classDiagram-v2\\b)/,/^(?:classDiagram\\b)/,/^(?:\\[\\*\\])/,/^(?:call[\\s]+)/,/^(?:\\([\\s]*\\))/,/^(?:\\()/,/^(?:[^(]*)/,/^(?:\\))/,/^(?:[^)]*)/,/^(?:[\"])/,/^(?:[^\"]*)/,/^(?:[\"])/,/^(?:style\\b)/,/^(?:classDef\\b)/,/^(?:namespace\\b)/,/^(?:\\s*(\\r?\\n)+)/,/^(?:\\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\\s*(\\r?\\n)+)/,/^(?:\\s+)/,/^(?:\\[\\*\\])/,/^(?:class\\b)/,/^(?:\\s*(\\r?\\n)+)/,/^(?:\\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\\[\\*\\])/,/^(?:[{])/,/^(?:[\\n])/,/^(?:[^{}\\n]*)/,/^(?:cssClass\\b)/,/^(?:callback\\b)/,/^(?:link\\b)/,/^(?:click\\b)/,/^(?:note for\\b)/,/^(?:note\\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\\b)/,/^(?:_blank\\b)/,/^(?:_parent\\b)/,/^(?:_top\\b)/,/^(?:\\s*<\\|)/,/^(?:\\s*\\|>)/,/^(?:\\s*>)/,/^(?:\\s*<)/,/^(?:\\s*\\*)/,/^(?:\\s*o\\b)/,/^(?:\\s*\\(\\))/,/^(?:--)/,/^(?:\\.\\.)/,/^(?::{1}[^:\\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\\.)/,/^(?:\\+)/,/^(?::)/,/^(?:,)/,/^(?:#)/,/^(?:#)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\\w+)/,/^(?:\\[)/,/^(?:\\])/,/^(?:[!\"#$%&'*+,-.`?\\\\/])/,/^(?:[0-9]+)/,/^(?:[\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6]|[\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377]|[\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5]|[\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA]|[\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE]|[\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA]|[\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0]|[\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977]|[\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2]|[\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A]|[\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39]|[\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8]|[\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C]|[\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C]|[\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99]|[\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0]|[\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D]|[\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3]|[\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10]|[\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1]|[\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81]|[\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3]|[\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6]|[\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A]|[\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081]|[\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D]|[\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0]|[\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310]|[\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C]|[\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711]|[\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7]|[\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C]|[\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16]|[\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF]|[\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC]|[\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D]|[\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D]|[\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3]|[\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F]|[\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128]|[\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184]|[\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3]|[\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6]|[\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE]|[\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C]|[\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D]|[\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC]|[\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B]|[\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788]|[\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805]|[\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB]|[\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28]|[\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5]|[\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4]|[\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E]|[\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D]|[\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36]|[\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D]|[\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC]|[\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF]|[\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC])/,/^(?:\\s)/,/^(?:\\s)/,/^(?:$)/],\nconditions: {\"namespace-body\":{\"rules\":[26,33,34,35,36,37,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"namespace\":{\"rules\":[26,29,30,31,32,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"class-body\":{\"rules\":[26,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"class\":{\"rules\":[26,39,40,41,42,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"acc_descr_multiline\":{\"rules\":[11,12,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"acc_descr\":{\"rules\":[9,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"acc_title\":{\"rules\":[7,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"callback_args\":{\"rules\":[22,23,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"callback_name\":{\"rules\":[19,20,21,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"href\":{\"rules\":[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"struct\":{\"rules\":[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"generic\":{\"rules\":[26,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"bqstring\":{\"rules\":[26,49,50,51,52,53,54,55,56,57,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"string\":{\"rules\":[24,25,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,28,29,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { select, type Selection } from 'd3';\nimport { log } from '../../logger.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport common from '../common/common.js';\nimport utils, { getEdgeId } from '../../utils.js';\nimport {\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n clear as commonClear,\n setDiagramTitle,\n getDiagramTitle,\n} from '../common/commonDb.js';\nimport { ClassMember } from './classTypes.js';\nimport type {\n ClassRelation,\n ClassNode,\n ClassNote,\n ClassMap,\n NamespaceMap,\n NamespaceNode,\n StyleClass,\n Interface,\n} from './classTypes.js';\nimport type { Node, Edge } from '../../rendering-util/types.js';\nimport type { DiagramDB } from '../../diagram-api/types.js';\n\nconst MERMAID_DOM_ID_PREFIX = 'classId-';\nlet classCounter = 0;\n\nconst sanitizeText = (txt: string) => common.sanitizeText(txt, getConfig());\n\nexport class ClassDB implements DiagramDB {\n private relations: ClassRelation[] = [];\n private classes = new Map();\n private readonly styleClasses = new Map();\n private notes: ClassNote[] = [];\n private interfaces: Interface[] = [];\n // private static classCounter = 0;\n private namespaces = new Map();\n private namespaceCounter = 0;\n\n private functions: any[] = [];\n\n constructor() {\n this.functions.push(this.setupToolTips.bind(this));\n this.clear();\n\n // Needed for JISON since it only supports direct properties\n this.addRelation = this.addRelation.bind(this);\n this.addClassesToNamespace = this.addClassesToNamespace.bind(this);\n this.addNamespace = this.addNamespace.bind(this);\n this.setCssClass = this.setCssClass.bind(this);\n this.addMembers = this.addMembers.bind(this);\n this.addClass = this.addClass.bind(this);\n this.setClassLabel = this.setClassLabel.bind(this);\n this.addAnnotation = this.addAnnotation.bind(this);\n this.addMember = this.addMember.bind(this);\n this.cleanupLabel = this.cleanupLabel.bind(this);\n this.addNote = this.addNote.bind(this);\n this.defineClass = this.defineClass.bind(this);\n this.setDirection = this.setDirection.bind(this);\n this.setLink = this.setLink.bind(this);\n this.bindFunctions = this.bindFunctions.bind(this);\n this.clear = this.clear.bind(this);\n\n this.setTooltip = this.setTooltip.bind(this);\n this.setClickEvent = this.setClickEvent.bind(this);\n this.setCssStyle = this.setCssStyle.bind(this);\n }\n\n private splitClassNameAndType(_id: string) {\n const id = common.sanitizeText(_id, getConfig());\n let genericType = '';\n let className = id;\n\n if (id.indexOf('~') > 0) {\n const split = id.split('~');\n className = sanitizeText(split[0]);\n genericType = sanitizeText(split[1]);\n }\n\n return { className: className, type: genericType };\n }\n\n public setClassLabel(_id: string, label: string) {\n const id = common.sanitizeText(_id, getConfig());\n if (label) {\n label = sanitizeText(label);\n }\n\n const { className } = this.splitClassNameAndType(id);\n this.classes.get(className)!.label = label;\n this.classes.get(className)!.text =\n `${label}${this.classes.get(className)!.type ? `<${this.classes.get(className)!.type}>` : ''}`;\n }\n\n /**\n * Function called by parser when a node definition has been found.\n *\n * @param id - ID of the class to add\n * @public\n */\n public addClass(_id: string) {\n const id = common.sanitizeText(_id, getConfig());\n const { className, type } = this.splitClassNameAndType(id);\n // Only add class if not exists\n if (this.classes.has(className)) {\n return;\n }\n // alert('Adding class: ' + className);\n const name = common.sanitizeText(className, getConfig());\n // alert('Adding class after: ' + name);\n this.classes.set(name, {\n id: name,\n type: type,\n label: name,\n text: `${name}${type ? `<${type}>` : ''}`,\n shape: 'classBox',\n cssClasses: 'default',\n methods: [],\n members: [],\n annotations: [],\n styles: [],\n domId: MERMAID_DOM_ID_PREFIX + name + '-' + classCounter,\n } as ClassNode);\n\n classCounter++;\n }\n\n private addInterface(label: string, classId: string) {\n const classInterface: Interface = {\n id: `interface${this.interfaces.length}`,\n label,\n classId,\n };\n\n this.interfaces.push(classInterface);\n }\n\n /**\n * Function to lookup domId from id in the graph definition.\n *\n * @param id - class ID to lookup\n * @public\n */\n public lookUpDomId(_id: string): string {\n const id = common.sanitizeText(_id, getConfig());\n if (this.classes.has(id)) {\n return this.classes.get(id)!.domId;\n }\n throw new Error('Class not found: ' + id);\n }\n\n public clear() {\n this.relations = [];\n this.classes = new Map();\n this.notes = [];\n this.interfaces = [];\n this.functions = [];\n this.functions.push(this.setupToolTips.bind(this));\n this.namespaces = new Map();\n this.namespaceCounter = 0;\n this.direction = 'TB';\n commonClear();\n }\n\n public getClass(id: string): ClassNode {\n return this.classes.get(id)!;\n }\n\n public getClasses(): ClassMap {\n return this.classes;\n }\n\n public getRelations(): ClassRelation[] {\n return this.relations;\n }\n\n public getNotes() {\n return this.notes;\n }\n\n public addRelation(classRelation: ClassRelation) {\n log.debug('Adding relation: ' + JSON.stringify(classRelation));\n // Due to relationType cannot just check if it is equal to 'none' or it complains, can fix this later\n const invalidTypes = [\n this.relationType.LOLLIPOP,\n this.relationType.AGGREGATION,\n this.relationType.COMPOSITION,\n this.relationType.DEPENDENCY,\n this.relationType.EXTENSION,\n ];\n\n if (\n classRelation.relation.type1 === this.relationType.LOLLIPOP &&\n !invalidTypes.includes(classRelation.relation.type2)\n ) {\n this.addClass(classRelation.id2);\n this.addInterface(classRelation.id1, classRelation.id2);\n classRelation.id1 = `interface${this.interfaces.length - 1}`;\n } else if (\n classRelation.relation.type2 === this.relationType.LOLLIPOP &&\n !invalidTypes.includes(classRelation.relation.type1)\n ) {\n this.addClass(classRelation.id1);\n this.addInterface(classRelation.id2, classRelation.id1);\n classRelation.id2 = `interface${this.interfaces.length - 1}`;\n } else {\n this.addClass(classRelation.id1);\n this.addClass(classRelation.id2);\n }\n\n classRelation.id1 = this.splitClassNameAndType(classRelation.id1).className;\n classRelation.id2 = this.splitClassNameAndType(classRelation.id2).className;\n\n classRelation.relationTitle1 = common.sanitizeText(\n classRelation.relationTitle1.trim(),\n getConfig()\n );\n\n classRelation.relationTitle2 = common.sanitizeText(\n classRelation.relationTitle2.trim(),\n getConfig()\n );\n\n this.relations.push(classRelation);\n }\n\n /**\n * Adds an annotation to the specified class Annotations mark special properties of the given type\n * (like 'interface' or 'service')\n *\n * @param className - The class name\n * @param annotation - The name of the annotation without any brackets\n * @public\n */\n public addAnnotation(className: string, annotation: string) {\n const validatedClassName = this.splitClassNameAndType(className).className;\n this.classes.get(validatedClassName)!.annotations.push(annotation);\n }\n\n /**\n * Adds a member to the specified class\n *\n * @param className - The class name\n * @param member - The full name of the member. If the member is enclosed in `<>` it is\n * treated as an annotation If the member is ending with a closing bracket ) it is treated as a\n * method Otherwise the member will be treated as a normal property\n * @public\n */\n public addMember(className: string, member: string) {\n this.addClass(className);\n\n const validatedClassName = this.splitClassNameAndType(className).className;\n const theClass = this.classes.get(validatedClassName)!;\n\n if (typeof member === 'string') {\n // Member can contain white spaces, we trim them out\n const memberString = member.trim();\n\n if (memberString.startsWith('<<') && memberString.endsWith('>>')) {\n // its an annotation\n theClass.annotations.push(sanitizeText(memberString.substring(2, memberString.length - 2)));\n } else if (memberString.indexOf(')') > 0) {\n //its a method\n theClass.methods.push(new ClassMember(memberString, 'method'));\n } else if (memberString) {\n theClass.members.push(new ClassMember(memberString, 'attribute'));\n }\n }\n }\n\n public addMembers(className: string, members: string[]) {\n if (Array.isArray(members)) {\n members.reverse();\n members.forEach((member) => this.addMember(className, member));\n }\n }\n\n public addNote(text: string, className: string) {\n const note = {\n id: `note${this.notes.length}`,\n class: className,\n text: text,\n };\n this.notes.push(note);\n }\n\n public cleanupLabel(label: string) {\n if (label.startsWith(':')) {\n label = label.substring(1);\n }\n return sanitizeText(label.trim());\n }\n\n /**\n * Called by parser when assigning cssClass to a class\n *\n * @param ids - Comma separated list of ids\n * @param className - Class to add\n */\n public setCssClass(ids: string, className: string) {\n ids.split(',').forEach((_id) => {\n let id = _id;\n if (/\\d/.exec(_id[0])) {\n id = MERMAID_DOM_ID_PREFIX + id;\n }\n const classNode = this.classes.get(id);\n if (classNode) {\n classNode.cssClasses += ' ' + className;\n }\n });\n }\n\n public defineClass(ids: string[], style: string[]) {\n for (const id of ids) {\n let styleClass = this.styleClasses.get(id);\n if (styleClass === undefined) {\n styleClass = { id, styles: [], textStyles: [] };\n this.styleClasses.set(id, styleClass);\n }\n\n if (style) {\n style.forEach((s) => {\n if (/color/.exec(s)) {\n const newStyle = s.replace('fill', 'bgFill'); // .replace('color', 'fill');\n styleClass.textStyles.push(newStyle);\n }\n styleClass.styles.push(s);\n });\n }\n\n this.classes.forEach((value) => {\n if (value.cssClasses.includes(id)) {\n value.styles.push(...style.flatMap((s) => s.split(',')));\n }\n });\n }\n }\n\n /**\n * Called by parser when a tooltip is found, e.g. a clickable element.\n *\n * @param ids - Comma separated list of ids\n * @param tooltip - Tooltip to add\n */\n public setTooltip(ids: string, tooltip?: string) {\n ids.split(',').forEach((id) => {\n if (tooltip !== undefined) {\n this.classes.get(id)!.tooltip = sanitizeText(tooltip);\n }\n });\n }\n\n public getTooltip(id: string, namespace?: string) {\n if (namespace && this.namespaces.has(namespace)) {\n return this.namespaces.get(namespace)!.classes.get(id)!.tooltip;\n }\n\n return this.classes.get(id)!.tooltip;\n }\n\n /**\n * Called by parser when a link is found. Adds the URL to the vertex data.\n *\n * @param ids - Comma separated list of ids\n * @param linkStr - URL to create a link for\n * @param target - Target of the link, _blank by default as originally defined in the svgDraw.js file\n */\n public setLink(ids: string, linkStr: string, target: string) {\n const config = getConfig();\n ids.split(',').forEach((_id) => {\n let id = _id;\n if (/\\d/.exec(_id[0])) {\n id = MERMAID_DOM_ID_PREFIX + id;\n }\n const theClass = this.classes.get(id);\n if (theClass) {\n theClass.link = utils.formatUrl(linkStr, config);\n if (config.securityLevel === 'sandbox') {\n theClass.linkTarget = '_top';\n } else if (typeof target === 'string') {\n theClass.linkTarget = sanitizeText(target);\n } else {\n theClass.linkTarget = '_blank';\n }\n }\n });\n this.setCssClass(ids, 'clickable');\n }\n\n /**\n * Called by parser when a click definition is found. Registers an event handler.\n *\n * @param ids - Comma separated list of ids\n * @param functionName - Function to be called on click\n * @param functionArgs - Function args the function should be called with\n */\n public setClickEvent(ids: string, functionName: string, functionArgs: string) {\n ids.split(',').forEach((id) => {\n this.setClickFunc(id, functionName, functionArgs);\n this.classes.get(id)!.haveCallback = true;\n });\n this.setCssClass(ids, 'clickable');\n }\n\n private setClickFunc(_domId: string, functionName: string, functionArgs: string) {\n const domId = common.sanitizeText(_domId, getConfig());\n const config = getConfig();\n if (config.securityLevel !== 'loose') {\n return;\n }\n if (functionName === undefined) {\n return;\n }\n\n const id = domId;\n if (this.classes.has(id)) {\n const elemId = this.lookUpDomId(id);\n let argList: string[] = [];\n if (typeof functionArgs === 'string') {\n /* Splits functionArgs by ',', ignoring all ',' in double quoted strings */\n argList = functionArgs.split(/,(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n for (let i = 0; i < argList.length; i++) {\n let item = argList[i].trim();\n /* Removes all double quotes at the start and end of an argument */\n /* This preserves all starting and ending whitespace inside */\n if (item.startsWith('\"') && item.endsWith('\"')) {\n item = item.substr(1, item.length - 2);\n }\n argList[i] = item;\n }\n }\n\n /* if no arguments passed into callback, default to passing in id */\n if (argList.length === 0) {\n argList.push(elemId);\n }\n\n this.functions.push(() => {\n const elem = document.querySelector(`[id=\"${elemId}\"]`);\n if (elem !== null) {\n elem.addEventListener(\n 'click',\n () => {\n utils.runFunc(functionName, ...argList);\n },\n false\n );\n }\n });\n }\n }\n\n public bindFunctions(element: Element) {\n this.functions.forEach((fun) => {\n fun(element);\n });\n }\n\n public readonly lineType = {\n LINE: 0,\n DOTTED_LINE: 1,\n };\n\n public readonly relationType = {\n AGGREGATION: 0,\n EXTENSION: 1,\n COMPOSITION: 2,\n DEPENDENCY: 3,\n LOLLIPOP: 4,\n };\n\n private readonly setupToolTips = (element: Element) => {\n let tooltipElem: Selection =\n select('.mermaidTooltip');\n // @ts-expect-error - Incorrect types\n if ((tooltipElem._groups || tooltipElem)[0][0] === null) {\n tooltipElem = select('body')\n .append('div')\n .attr('class', 'mermaidTooltip')\n .style('opacity', 0);\n }\n\n const svg = select(element).select('svg');\n\n const nodes = svg.selectAll('g.node');\n nodes\n .on('mouseover', (event: MouseEvent) => {\n const el = select(event.currentTarget as HTMLElement);\n const title = el.attr('title');\n // Don't try to draw a tooltip if no data is provided\n if (title === null) {\n return;\n }\n // @ts-ignore - getBoundingClientRect is not part of the d3 type definition\n const rect = this.getBoundingClientRect();\n\n tooltipElem.transition().duration(200).style('opacity', '.9');\n tooltipElem\n .text(el.attr('title'))\n .style('left', window.scrollX + rect.left + (rect.right - rect.left) / 2 + 'px')\n .style('top', window.scrollY + rect.top - 14 + document.body.scrollTop + 'px');\n tooltipElem.html(tooltipElem.html().replace(/<br\\/>/g, '
'));\n el.classed('hover', true);\n })\n .on('mouseout', (event: MouseEvent) => {\n tooltipElem.transition().duration(500).style('opacity', 0);\n const el = select(event.currentTarget as HTMLElement);\n el.classed('hover', false);\n });\n };\n\n private direction = 'TB';\n public getDirection() {\n return this.direction;\n }\n public setDirection(dir: string) {\n this.direction = dir;\n }\n\n /**\n * Function called by parser when a namespace definition has been found.\n *\n * @param id - ID of the namespace to add\n * @public\n */\n public addNamespace(id: string) {\n if (this.namespaces.has(id)) {\n return;\n }\n\n this.namespaces.set(id, {\n id: id,\n classes: new Map(),\n children: {},\n domId: MERMAID_DOM_ID_PREFIX + id + '-' + this.namespaceCounter,\n } as NamespaceNode);\n\n this.namespaceCounter++;\n }\n\n public getNamespace(name: string): NamespaceNode {\n return this.namespaces.get(name)!;\n }\n\n public getNamespaces(): NamespaceMap {\n return this.namespaces;\n }\n\n /**\n * Function called by parser when a namespace definition has been found.\n *\n * @param id - ID of the namespace to add\n * @param classNames - IDs of the class to add\n * @public\n */\n public addClassesToNamespace(id: string, classNames: string[]) {\n if (!this.namespaces.has(id)) {\n return;\n }\n for (const name of classNames) {\n const { className } = this.splitClassNameAndType(name);\n this.classes.get(className)!.parent = id;\n this.namespaces.get(id)!.classes.set(className, this.classes.get(className)!);\n }\n }\n\n public setCssStyle(id: string, styles: string[]) {\n const thisClass = this.classes.get(id);\n if (!styles || !thisClass) {\n return;\n }\n for (const s of styles) {\n if (s.includes(',')) {\n thisClass.styles.push(...s.split(','));\n } else {\n thisClass.styles.push(s);\n }\n }\n }\n\n /**\n * Gets the arrow marker for a type index\n *\n * @param type - The type to look for\n * @returns The arrow marker\n */\n private getArrowMarker(type: number) {\n let marker;\n switch (type) {\n case 0:\n marker = 'aggregation';\n break;\n case 1:\n marker = 'extension';\n break;\n case 2:\n marker = 'composition';\n break;\n case 3:\n marker = 'dependency';\n break;\n case 4:\n marker = 'lollipop';\n break;\n default:\n marker = 'none';\n }\n return marker;\n }\n\n public getData() {\n const nodes: Node[] = [];\n const edges: Edge[] = [];\n const config = getConfig();\n\n for (const namespaceKey of this.namespaces.keys()) {\n const namespace = this.namespaces.get(namespaceKey);\n if (namespace) {\n const node: Node = {\n id: namespace.id,\n label: namespace.id,\n isGroup: true,\n padding: config.class!.padding ?? 16,\n // parent node must be one of [rect, roundedWithTitle, noteGroup, divider]\n shape: 'rect',\n cssStyles: ['fill: none', 'stroke: black'],\n look: config.look,\n };\n nodes.push(node);\n }\n }\n\n for (const classKey of this.classes.keys()) {\n const classNode = this.classes.get(classKey);\n if (classNode) {\n const node = classNode as unknown as Node;\n node.parentId = classNode.parent;\n node.look = config.look;\n nodes.push(node);\n }\n }\n\n let cnt = 0;\n for (const note of this.notes) {\n cnt++;\n const noteNode: Node = {\n id: note.id,\n label: note.text,\n isGroup: false,\n shape: 'note',\n padding: config.class!.padding ?? 6,\n cssStyles: [\n 'text-align: left',\n 'white-space: nowrap',\n `fill: ${config.themeVariables.noteBkgColor}`,\n `stroke: ${config.themeVariables.noteBorderColor}`,\n ],\n look: config.look,\n };\n nodes.push(noteNode);\n\n const noteClassId = this.classes.get(note.class)?.id ?? '';\n\n if (noteClassId) {\n const edge: Edge = {\n id: `edgeNote${cnt}`,\n start: note.id,\n end: noteClassId,\n type: 'normal',\n thickness: 'normal',\n classes: 'relation',\n arrowTypeStart: 'none',\n arrowTypeEnd: 'none',\n arrowheadStyle: '',\n labelStyle: [''],\n style: ['fill: none'],\n pattern: 'dotted',\n look: config.look,\n };\n edges.push(edge);\n }\n }\n\n for (const _interface of this.interfaces) {\n const interfaceNode: Node = {\n id: _interface.id,\n label: _interface.label,\n isGroup: false,\n shape: 'rect',\n cssStyles: ['opacity: 0;'],\n look: config.look,\n };\n nodes.push(interfaceNode);\n }\n\n cnt = 0;\n for (const classRelation of this.relations) {\n cnt++;\n const edge: Edge = {\n id: getEdgeId(classRelation.id1, classRelation.id2, {\n prefix: 'id',\n counter: cnt,\n }),\n start: classRelation.id1,\n end: classRelation.id2,\n type: 'normal',\n label: classRelation.title,\n labelpos: 'c',\n thickness: 'normal',\n classes: 'relation',\n arrowTypeStart: this.getArrowMarker(classRelation.relation.type1),\n arrowTypeEnd: this.getArrowMarker(classRelation.relation.type2),\n startLabelRight:\n classRelation.relationTitle1 === 'none' ? '' : classRelation.relationTitle1,\n endLabelLeft: classRelation.relationTitle2 === 'none' ? '' : classRelation.relationTitle2,\n arrowheadStyle: '',\n labelStyle: ['display: inline-block'],\n style: classRelation.style || '',\n pattern: classRelation.relation.lineType == 1 ? 'dashed' : 'solid',\n look: config.look,\n };\n edges.push(edge);\n }\n\n return { nodes, edges, other: {}, config, direction: this.getDirection() };\n }\n\n public setAccTitle = setAccTitle;\n public getAccTitle = getAccTitle;\n public setAccDescription = setAccDescription;\n public getAccDescription = getAccDescription;\n public setDiagramTitle = setDiagramTitle;\n public getDiagramTitle = getDiagramTitle;\n public getConfig = () => getConfig().class;\n}\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { parseGenericTypes, sanitizeText } from '../common/common.js';\n\nexport interface ClassNode {\n id: string;\n type: string;\n label: string;\n shape: string;\n text: string;\n cssClasses: string;\n methods: ClassMember[];\n members: ClassMember[];\n annotations: string[];\n domId: string;\n styles: string[];\n parent?: string;\n link?: string;\n linkTarget?: string;\n haveCallback?: boolean;\n tooltip?: string;\n look?: string;\n}\n\nexport type Visibility = '#' | '+' | '~' | '-' | '';\nexport const visibilityValues = ['#', '+', '~', '-', ''];\n\n/**\n * Parses and stores class diagram member variables/methods.\n *\n */\nexport class ClassMember {\n id!: string;\n cssStyle!: string;\n memberType!: 'method' | 'attribute';\n visibility!: Visibility;\n text: string;\n /**\n * denote if static or to determine which css class to apply to the node\n * @defaultValue ''\n */\n classifier!: string;\n /**\n * parameters for method\n * @defaultValue ''\n */\n parameters!: string;\n /**\n * return type for method\n * @defaultValue ''\n */\n returnType!: string;\n\n constructor(input: string, memberType: 'method' | 'attribute') {\n this.memberType = memberType;\n this.visibility = '';\n this.classifier = '';\n this.text = '';\n const sanitizedInput = sanitizeText(input, getConfig());\n this.parseMember(sanitizedInput);\n }\n\n getDisplayDetails() {\n let displayText = this.visibility + parseGenericTypes(this.id);\n if (this.memberType === 'method') {\n displayText += `(${parseGenericTypes(this.parameters.trim())})`;\n if (this.returnType) {\n displayText += ' : ' + parseGenericTypes(this.returnType);\n }\n }\n\n displayText = displayText.trim();\n const cssStyle = this.parseClassifier();\n\n return {\n displayText,\n cssStyle,\n };\n }\n\n parseMember(input: string) {\n let potentialClassifier = '';\n\n if (this.memberType === 'method') {\n const methodRegEx = /([#+~-])?(.+)\\((.*)\\)([\\s$*])?(.*)([$*])?/;\n const match = methodRegEx.exec(input);\n if (match) {\n const detectedVisibility = match[1] ? match[1].trim() : '';\n\n if (visibilityValues.includes(detectedVisibility)) {\n this.visibility = detectedVisibility as Visibility;\n }\n\n this.id = match[2];\n this.parameters = match[3] ? match[3].trim() : '';\n potentialClassifier = match[4] ? match[4].trim() : '';\n this.returnType = match[5] ? match[5].trim() : '';\n\n if (potentialClassifier === '') {\n const lastChar = this.returnType.substring(this.returnType.length - 1);\n if (/[$*]/.exec(lastChar)) {\n potentialClassifier = lastChar;\n this.returnType = this.returnType.substring(0, this.returnType.length - 1);\n }\n }\n }\n } else {\n const length = input.length;\n const firstChar = input.substring(0, 1);\n const lastChar = input.substring(length - 1);\n\n if (visibilityValues.includes(firstChar)) {\n this.visibility = firstChar as Visibility;\n }\n\n if (/[$*]/.exec(lastChar)) {\n potentialClassifier = lastChar;\n }\n\n this.id = input.substring(\n this.visibility === '' ? 0 : 1,\n potentialClassifier === '' ? length : length - 1\n );\n }\n\n this.classifier = potentialClassifier;\n // Preserve one space only\n this.id = this.id.startsWith(' ') ? ' ' + this.id.trim() : this.id.trim();\n\n const combinedText = `${this.visibility ? '\\\\' + this.visibility : ''}${parseGenericTypes(this.id)}${this.memberType === 'method' ? `(${parseGenericTypes(this.parameters)})${this.returnType ? ' : ' + parseGenericTypes(this.returnType) : ''}` : ''}`;\n this.text = combinedText.replaceAll('<', '<').replaceAll('>', '>');\n if (this.text.startsWith('\\\\<')) {\n this.text = this.text.replace('\\\\<', '~');\n }\n }\n\n parseClassifier() {\n switch (this.classifier) {\n case '*':\n return 'font-style:italic;';\n case '$':\n return 'text-decoration:underline;';\n default:\n return '';\n }\n }\n}\n\nexport interface ClassNote {\n id: string;\n class: string;\n text: string;\n}\n\nexport interface ClassRelation {\n id1: string;\n id2: string;\n relationTitle1: string;\n relationTitle2: string;\n type: string;\n title: string;\n text: string;\n style: string[];\n relation: {\n type1: number;\n type2: number;\n lineType: number;\n };\n}\n\nexport interface Interface {\n id: string;\n label: string;\n classId: string;\n}\n\nexport interface NamespaceNode {\n id: string;\n domId: string;\n classes: ClassMap;\n children: NamespaceMap;\n}\n\nexport interface StyleClass {\n id: string;\n styles: string[];\n textStyles: string[];\n}\n\nexport type ClassMap = Map;\nexport type NamespaceMap = Map;\n", "import { getIconStyles } from '../globalStyles.js';\n\nconst getStyles = (options) =>\n `g.classGroup text {\n fill: ${options.nodeBorder || options.classText};\n stroke: none;\n font-family: ${options.fontFamily};\n font-size: 10px;\n\n .title {\n font-weight: bolder;\n }\n\n}\n\n.nodeLabel, .edgeLabel {\n color: ${options.classText};\n}\n.edgeLabel .label rect {\n fill: ${options.mainBkg};\n}\n.label text {\n fill: ${options.classText};\n}\n\n.labelBkg {\n background: ${options.mainBkg};\n}\n.edgeLabel .label span {\n background: ${options.mainBkg};\n}\n\n.classTitle {\n font-weight: bolder;\n}\n.node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n }\n\n\n.divider {\n stroke: ${options.nodeBorder};\n stroke-width: 1;\n}\n\ng.clickable {\n cursor: pointer;\n}\n\ng.classGroup rect {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n}\n\ng.classGroup line {\n stroke: ${options.nodeBorder};\n stroke-width: 1;\n}\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${options.mainBkg};\n opacity: 0.5;\n}\n\n.classLabel .label {\n fill: ${options.nodeBorder};\n font-size: 10px;\n}\n\n.relation {\n stroke: ${options.lineColor};\n stroke-width: 1;\n fill: none;\n}\n\n.dashed-line{\n stroke-dasharray: 3;\n}\n\n.dotted-line{\n stroke-dasharray: 1 2;\n}\n\n#compositionStart, .composition {\n fill: ${options.lineColor} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#compositionEnd, .composition {\n fill: ${options.lineColor} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${options.lineColor} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${options.lineColor} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionStart, .extension {\n fill: transparent !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionEnd, .extension {\n fill: transparent !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationStart, .aggregation {\n fill: transparent !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationEnd, .aggregation {\n fill: transparent !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopStart, .lollipop {\n fill: ${options.mainBkg} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopEnd, .lollipop {\n fill: ${options.mainBkg} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n.edgeTerminals {\n font-size: 11px;\n line-height: initial;\n}\n\n.classTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${options.textColor};\n}\n ${getIconStyles()}\n`;\n\nexport default getStyles;\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport type { DiagramStyleClassDef } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { getDiagramElement } from '../../rendering-util/insertElementsForSize.js';\nimport { getRegisteredLayoutAlgorithm, render } from '../../rendering-util/render.js';\nimport { setupViewPortForSVG } from '../../rendering-util/setupViewPortForSVG.js';\nimport type { LayoutData } from '../../rendering-util/types.js';\nimport utils from '../../utils.js';\n\n/**\n * Get the direction from the statement items.\n * Look through all of the documents (docs) in the parsedItems\n * Because is a _document_ direction, the default direction is not necessarily the same as the overall default _diagram_ direction.\n * @param parsedItem - the parsed statement item to look through\n * @param defaultDir - the direction to use if none is found\n * @returns The direction to use\n */\nexport const getDir = (parsedItem: any, defaultDir = 'TB') => {\n if (!parsedItem.doc) {\n return defaultDir;\n }\n\n let dir = defaultDir;\n\n for (const parsedItemDoc of parsedItem.doc) {\n if (parsedItemDoc.stmt === 'dir') {\n dir = parsedItemDoc.value;\n }\n }\n\n return dir;\n};\n\nexport const getClasses = function (\n text: string,\n diagramObj: any\n): Map {\n return diagramObj.db.getClasses();\n};\n\nexport const draw = async function (text: string, id: string, _version: string, diag: any) {\n log.info('REF0:');\n log.info('Drawing class diagram (v3)', id);\n const { securityLevel, state: conf, layout } = getConfig();\n // Extracting the data from the parsed structure into a more usable form\n // Not related to the refactoring, but this is the first step in the rendering process\n // diag.db.extract(diag.db.getRootDocV2());\n\n // The getData method provided in all supported diagrams is used to extract the data from the parsed structure\n // into the Layout data format\n const data4Layout = diag.db.getData() as LayoutData;\n\n // Create the root SVG - the element is the div containing the SVG element\n const svg = getDiagramElement(id, securityLevel);\n\n data4Layout.type = diag.type;\n data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(layout);\n\n data4Layout.nodeSpacing = conf?.nodeSpacing || 50;\n data4Layout.rankSpacing = conf?.rankSpacing || 50;\n data4Layout.markers = ['aggregation', 'extension', 'composition', 'dependency', 'lollipop'];\n data4Layout.diagramId = id;\n await render(data4Layout, svg);\n const padding = 8;\n utils.insertTitle(\n svg,\n 'classDiagramTitleText',\n conf?.titleTopMargin ?? 25,\n diag.db.getDiagramTitle()\n );\n\n setupViewPortForSVG(svg, padding, 'classDiagram', conf?.useMaxWidth ?? true);\n};\n\nexport default {\n getClasses,\n draw,\n getDir,\n};\n"], + "mappings": "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,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG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AC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,GAAE,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,GAAE,EAAC,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,CAAC,GAAE,EAAC,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GA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", + "names": ["o", "parser", "lexer", "sanitizeText"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-CVBHYZKI.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-CVBHYZKI.mjs new file mode 100644 index 0000000..732cac1 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-CVBHYZKI.mjs @@ -0,0 +1,21 @@ +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/utils/subGraphTitleMargins.ts +var getSubGraphTitleMargins = /* @__PURE__ */ __name(({ + flowchart +}) => { + const subGraphTitleTopMargin = flowchart?.subGraphTitleMargin?.top ?? 0; + const subGraphTitleBottomMargin = flowchart?.subGraphTitleMargin?.bottom ?? 0; + const subGraphTitleTotalMargin = subGraphTitleTopMargin + subGraphTitleBottomMargin; + return { + subGraphTitleTopMargin, + subGraphTitleBottomMargin, + subGraphTitleTotalMargin + }; +}, "getSubGraphTitleMargins"); + +export { + getSubGraphTitleMargins +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-CVBHYZKI.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-CVBHYZKI.mjs.map new file mode 100644 index 0000000..91e28cc --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-CVBHYZKI.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/utils/subGraphTitleMargins.ts"], + "sourcesContent": ["import type { FlowchartDiagramConfig } from '../config.type.js';\n\nexport const getSubGraphTitleMargins = ({\n flowchart,\n}: {\n flowchart: FlowchartDiagramConfig;\n}): {\n subGraphTitleTopMargin: number;\n subGraphTitleBottomMargin: number;\n subGraphTitleTotalMargin: number;\n} => {\n const subGraphTitleTopMargin = flowchart?.subGraphTitleMargin?.top ?? 0;\n const subGraphTitleBottomMargin = flowchart?.subGraphTitleMargin?.bottom ?? 0;\n const subGraphTitleTotalMargin = subGraphTitleTopMargin + subGraphTitleBottomMargin;\n\n return {\n subGraphTitleTopMargin,\n subGraphTitleBottomMargin,\n subGraphTitleTotalMargin,\n };\n};\n"], + "mappings": ";;;;;AAEO,IAAM,0BAA0B,wBAAC;AAAA,EACtC;AACF,MAMK;AACH,QAAM,yBAAyB,WAAW,qBAAqB,OAAO;AACtE,QAAM,4BAA4B,WAAW,qBAAqB,UAAU;AAC5E,QAAM,2BAA2B,yBAAyB;AAE1D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF,GAlBuC;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-DI55MBZ5.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-DI55MBZ5.mjs new file mode 100644 index 0000000..fbde927 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-DI55MBZ5.mjs @@ -0,0 +1,2032 @@ +import { + getDiagramElement +} from "./chunk-55IACEB6.mjs"; +import { + setupViewPortForSVG +} from "./chunk-QN33PNHL.mjs"; +import { + render +} from "./chunk-N4CR4FBY.mjs"; +import { + generateId, + utils_default +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + common_default, + getAccDescription, + getAccTitle, + getConfig2 as getConfig, + getDiagramTitle, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/state/parser/stateDiagram.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 2], $V1 = [1, 3], $V2 = [1, 4], $V3 = [2, 4], $V4 = [1, 9], $V5 = [1, 11], $V6 = [1, 16], $V7 = [1, 17], $V8 = [1, 18], $V9 = [1, 19], $Va = [1, 33], $Vb = [1, 20], $Vc = [1, 21], $Vd = [1, 22], $Ve = [1, 23], $Vf = [1, 24], $Vg = [1, 26], $Vh = [1, 27], $Vi = [1, 28], $Vj = [1, 29], $Vk = [1, 30], $Vl = [1, 31], $Vm = [1, 32], $Vn = [1, 35], $Vo = [1, 36], $Vp = [1, 37], $Vq = [1, 38], $Vr = [1, 34], $Vs = [1, 4, 5, 16, 17, 19, 21, 22, 24, 25, 26, 27, 28, 29, 33, 35, 37, 38, 41, 45, 48, 51, 52, 53, 54, 57], $Vt = [1, 4, 5, 14, 15, 16, 17, 19, 21, 22, 24, 25, 26, 27, 28, 29, 33, 35, 37, 38, 39, 40, 41, 45, 48, 51, 52, 53, 54, 57], $Vu = [4, 5, 16, 17, 19, 21, 22, 24, 25, 26, 27, 28, 29, 33, 35, 37, 38, 41, 45, 48, 51, 52, 53, 54, 57]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "SPACE": 4, "NL": 5, "SD": 6, "document": 7, "line": 8, "statement": 9, "classDefStatement": 10, "styleStatement": 11, "cssClassStatement": 12, "idStatement": 13, "DESCR": 14, "-->": 15, "HIDE_EMPTY": 16, "scale": 17, "WIDTH": 18, "COMPOSIT_STATE": 19, "STRUCT_START": 20, "STRUCT_STOP": 21, "STATE_DESCR": 22, "AS": 23, "ID": 24, "FORK": 25, "JOIN": 26, "CHOICE": 27, "CONCURRENT": 28, "note": 29, "notePosition": 30, "NOTE_TEXT": 31, "direction": 32, "acc_title": 33, "acc_title_value": 34, "acc_descr": 35, "acc_descr_value": 36, "acc_descr_multiline_value": 37, "CLICK": 38, "STRING": 39, "HREF": 40, "classDef": 41, "CLASSDEF_ID": 42, "CLASSDEF_STYLEOPTS": 43, "DEFAULT": 44, "style": 45, "STYLE_IDS": 46, "STYLEDEF_STYLEOPTS": 47, "class": 48, "CLASSENTITY_IDS": 49, "STYLECLASS": 50, "direction_tb": 51, "direction_bt": 52, "direction_rl": 53, "direction_lr": 54, "eol": 55, ";": 56, "EDGE_STATE": 57, "STYLE_SEPARATOR": 58, "left_of": 59, "right_of": 60, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "SPACE", 5: "NL", 6: "SD", 14: "DESCR", 15: "-->", 16: "HIDE_EMPTY", 17: "scale", 18: "WIDTH", 19: "COMPOSIT_STATE", 20: "STRUCT_START", 21: "STRUCT_STOP", 22: "STATE_DESCR", 23: "AS", 24: "ID", 25: "FORK", 26: "JOIN", 27: "CHOICE", 28: "CONCURRENT", 29: "note", 31: "NOTE_TEXT", 33: "acc_title", 34: "acc_title_value", 35: "acc_descr", 36: "acc_descr_value", 37: "acc_descr_multiline_value", 38: "CLICK", 39: "STRING", 40: "HREF", 41: "classDef", 42: "CLASSDEF_ID", 43: "CLASSDEF_STYLEOPTS", 44: "DEFAULT", 45: "style", 46: "STYLE_IDS", 47: "STYLEDEF_STYLEOPTS", 48: "class", 49: "CLASSENTITY_IDS", 50: "STYLECLASS", 51: "direction_tb", 52: "direction_bt", 53: "direction_rl", 54: "direction_lr", 56: ";", 57: "EDGE_STATE", 58: "STYLE_SEPARATOR", 59: "left_of", 60: "right_of" }, + productions_: [0, [3, 2], [3, 2], [3, 2], [7, 0], [7, 2], [8, 2], [8, 1], [8, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 2], [9, 3], [9, 4], [9, 1], [9, 2], [9, 1], [9, 4], [9, 3], [9, 6], [9, 1], [9, 1], [9, 1], [9, 1], [9, 4], [9, 4], [9, 1], [9, 2], [9, 2], [9, 1], [9, 5], [9, 5], [10, 3], [10, 3], [11, 3], [12, 3], [32, 1], [32, 1], [32, 1], [32, 1], [55, 1], [55, 1], [13, 1], [13, 1], [13, 3], [13, 3], [30, 1], [30, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 3: + yy.setRootDoc($$[$0]); + return $$[$0]; + break; + case 4: + this.$ = []; + break; + case 5: + if ($$[$0] != "nl") { + $$[$0 - 1].push($$[$0]); + this.$ = $$[$0 - 1]; + } + break; + case 6: + case 7: + this.$ = $$[$0]; + break; + case 8: + this.$ = "nl"; + break; + case 12: + this.$ = $$[$0]; + break; + case 13: + const stateStmt = $$[$0 - 1]; + stateStmt.description = yy.trimColon($$[$0]); + this.$ = stateStmt; + break; + case 14: + this.$ = { stmt: "relation", state1: $$[$0 - 2], state2: $$[$0] }; + break; + case 15: + const relDescription = yy.trimColon($$[$0]); + this.$ = { stmt: "relation", state1: $$[$0 - 3], state2: $$[$0 - 1], description: relDescription }; + break; + case 19: + this.$ = { stmt: "state", id: $$[$0 - 3], type: "default", description: "", doc: $$[$0 - 1] }; + break; + case 20: + var id = $$[$0]; + var description = $$[$0 - 2].trim(); + if ($$[$0].match(":")) { + var parts = $$[$0].split(":"); + id = parts[0]; + description = [description, parts[1]]; + } + this.$ = { stmt: "state", id, type: "default", description }; + break; + case 21: + this.$ = { stmt: "state", id: $$[$0 - 3], type: "default", description: $$[$0 - 5], doc: $$[$0 - 1] }; + break; + case 22: + this.$ = { stmt: "state", id: $$[$0], type: "fork" }; + break; + case 23: + this.$ = { stmt: "state", id: $$[$0], type: "join" }; + break; + case 24: + this.$ = { stmt: "state", id: $$[$0], type: "choice" }; + break; + case 25: + this.$ = { stmt: "state", id: yy.getDividerId(), type: "divider" }; + break; + case 26: + this.$ = { stmt: "state", id: $$[$0 - 1].trim(), note: { position: $$[$0 - 2].trim(), text: $$[$0].trim() } }; + break; + case 29: + this.$ = $$[$0].trim(); + yy.setAccTitle(this.$); + break; + case 30: + case 31: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 32: + this.$ = { + stmt: "click", + id: $$[$0 - 3], + url: $$[$0 - 2], + tooltip: $$[$0 - 1] + }; + break; + case 33: + this.$ = { + stmt: "click", + id: $$[$0 - 3], + url: $$[$0 - 1], + tooltip: "" + }; + break; + case 34: + case 35: + this.$ = { stmt: "classDef", id: $$[$0 - 1].trim(), classes: $$[$0].trim() }; + break; + case 36: + this.$ = { stmt: "style", id: $$[$0 - 1].trim(), styleClass: $$[$0].trim() }; + break; + case 37: + this.$ = { stmt: "applyClass", id: $$[$0 - 1].trim(), styleClass: $$[$0].trim() }; + break; + case 38: + yy.setDirection("TB"); + this.$ = { stmt: "dir", value: "TB" }; + break; + case 39: + yy.setDirection("BT"); + this.$ = { stmt: "dir", value: "BT" }; + break; + case 40: + yy.setDirection("RL"); + this.$ = { stmt: "dir", value: "RL" }; + break; + case 41: + yy.setDirection("LR"); + this.$ = { stmt: "dir", value: "LR" }; + break; + case 44: + case 45: + this.$ = { stmt: "state", id: $$[$0].trim(), type: "default", description: "" }; + break; + case 46: + this.$ = { stmt: "state", id: $$[$0 - 2].trim(), classes: [$$[$0].trim()], type: "default", description: "" }; + break; + case 47: + this.$ = { stmt: "state", id: $$[$0 - 2].trim(), classes: [$$[$0].trim()], type: "default", description: "" }; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: $V0, 5: $V1, 6: $V2 }, { 1: [3] }, { 3: 5, 4: $V0, 5: $V1, 6: $V2 }, { 3: 6, 4: $V0, 5: $V1, 6: $V2 }, o([1, 4, 5, 16, 17, 19, 22, 24, 25, 26, 27, 28, 29, 33, 35, 37, 38, 41, 45, 48, 51, 52, 53, 54, 57], $V3, { 7: 7 }), { 1: [2, 1] }, { 1: [2, 2] }, { 1: [2, 3], 4: $V4, 5: $V5, 8: 8, 9: 10, 10: 12, 11: 13, 12: 14, 13: 15, 16: $V6, 17: $V7, 19: $V8, 22: $V9, 24: $Va, 25: $Vb, 26: $Vc, 27: $Vd, 28: $Ve, 29: $Vf, 32: 25, 33: $Vg, 35: $Vh, 37: $Vi, 38: $Vj, 41: $Vk, 45: $Vl, 48: $Vm, 51: $Vn, 52: $Vo, 53: $Vp, 54: $Vq, 57: $Vr }, o($Vs, [2, 5]), { 9: 39, 10: 12, 11: 13, 12: 14, 13: 15, 16: $V6, 17: $V7, 19: $V8, 22: $V9, 24: $Va, 25: $Vb, 26: $Vc, 27: $Vd, 28: $Ve, 29: $Vf, 32: 25, 33: $Vg, 35: $Vh, 37: $Vi, 38: $Vj, 41: $Vk, 45: $Vl, 48: $Vm, 51: $Vn, 52: $Vo, 53: $Vp, 54: $Vq, 57: $Vr }, o($Vs, [2, 7]), o($Vs, [2, 8]), o($Vs, [2, 9]), o($Vs, [2, 10]), o($Vs, [2, 11]), o($Vs, [2, 12], { 14: [1, 40], 15: [1, 41] }), o($Vs, [2, 16]), { 18: [1, 42] }, o($Vs, [2, 18], { 20: [1, 43] }), { 23: [1, 44] }, o($Vs, [2, 22]), o($Vs, [2, 23]), o($Vs, [2, 24]), o($Vs, [2, 25]), { 30: 45, 31: [1, 46], 59: [1, 47], 60: [1, 48] }, o($Vs, [2, 28]), { 34: [1, 49] }, { 36: [1, 50] }, o($Vs, [2, 31]), { 13: 51, 24: $Va, 57: $Vr }, { 42: [1, 52], 44: [1, 53] }, { 46: [1, 54] }, { 49: [1, 55] }, o($Vt, [2, 44], { 58: [1, 56] }), o($Vt, [2, 45], { 58: [1, 57] }), o($Vs, [2, 38]), o($Vs, [2, 39]), o($Vs, [2, 40]), o($Vs, [2, 41]), o($Vs, [2, 6]), o($Vs, [2, 13]), { 13: 58, 24: $Va, 57: $Vr }, o($Vs, [2, 17]), o($Vu, $V3, { 7: 59 }), { 24: [1, 60] }, { 24: [1, 61] }, { 23: [1, 62] }, { 24: [2, 48] }, { 24: [2, 49] }, o($Vs, [2, 29]), o($Vs, [2, 30]), { 39: [1, 63], 40: [1, 64] }, { 43: [1, 65] }, { 43: [1, 66] }, { 47: [1, 67] }, { 50: [1, 68] }, { 24: [1, 69] }, { 24: [1, 70] }, o($Vs, [2, 14], { 14: [1, 71] }), { 4: $V4, 5: $V5, 8: 8, 9: 10, 10: 12, 11: 13, 12: 14, 13: 15, 16: $V6, 17: $V7, 19: $V8, 21: [1, 72], 22: $V9, 24: $Va, 25: $Vb, 26: $Vc, 27: $Vd, 28: $Ve, 29: $Vf, 32: 25, 33: $Vg, 35: $Vh, 37: $Vi, 38: $Vj, 41: $Vk, 45: $Vl, 48: $Vm, 51: $Vn, 52: $Vo, 53: $Vp, 54: $Vq, 57: $Vr }, o($Vs, [2, 20], { 20: [1, 73] }), { 31: [1, 74] }, { 24: [1, 75] }, { 39: [1, 76] }, { 39: [1, 77] }, o($Vs, [2, 34]), o($Vs, [2, 35]), o($Vs, [2, 36]), o($Vs, [2, 37]), o($Vt, [2, 46]), o($Vt, [2, 47]), o($Vs, [2, 15]), o($Vs, [2, 19]), o($Vu, $V3, { 7: 78 }), o($Vs, [2, 26]), o($Vs, [2, 27]), { 5: [1, 79] }, { 5: [1, 80] }, { 4: $V4, 5: $V5, 8: 8, 9: 10, 10: 12, 11: 13, 12: 14, 13: 15, 16: $V6, 17: $V7, 19: $V8, 21: [1, 81], 22: $V9, 24: $Va, 25: $Vb, 26: $Vc, 27: $Vd, 28: $Ve, 29: $Vf, 32: 25, 33: $Vg, 35: $Vh, 37: $Vi, 38: $Vj, 41: $Vk, 45: $Vl, 48: $Vm, 51: $Vn, 52: $Vo, 53: $Vp, 54: $Vq, 57: $Vr }, o($Vs, [2, 32]), o($Vs, [2, 33]), o($Vs, [2, 21])], + defaultActions: { 5: [2, 1], 6: [2, 2], 47: [2, 48], 48: [2, 49] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + return 38; + break; + case 1: + return 40; + break; + case 2: + return 39; + break; + case 3: + return 44; + break; + case 4: + return 51; + break; + case 5: + return 52; + break; + case 6: + return 53; + break; + case 7: + return 54; + break; + case 8: + break; + case 9: + { + } + break; + case 10: + return 5; + break; + case 11: + break; + case 12: + break; + case 13: + break; + case 14: + break; + case 15: + this.pushState("SCALE"); + return 17; + break; + case 16: + return 18; + break; + case 17: + this.popState(); + break; + case 18: + this.begin("acc_title"); + return 33; + break; + case 19: + this.popState(); + return "acc_title_value"; + break; + case 20: + this.begin("acc_descr"); + return 35; + break; + case 21: + this.popState(); + return "acc_descr_value"; + break; + case 22: + this.begin("acc_descr_multiline"); + break; + case 23: + this.popState(); + break; + case 24: + return "acc_descr_multiline_value"; + break; + case 25: + this.pushState("CLASSDEF"); + return 41; + break; + case 26: + this.popState(); + this.pushState("CLASSDEFID"); + return "DEFAULT_CLASSDEF_ID"; + break; + case 27: + this.popState(); + this.pushState("CLASSDEFID"); + return 42; + break; + case 28: + this.popState(); + return 43; + break; + case 29: + this.pushState("CLASS"); + return 48; + break; + case 30: + this.popState(); + this.pushState("CLASS_STYLE"); + return 49; + break; + case 31: + this.popState(); + return 50; + break; + case 32: + this.pushState("STYLE"); + return 45; + break; + case 33: + this.popState(); + this.pushState("STYLEDEF_STYLES"); + return 46; + break; + case 34: + this.popState(); + return 47; + break; + case 35: + this.pushState("SCALE"); + return 17; + break; + case 36: + return 18; + break; + case 37: + this.popState(); + break; + case 38: + this.pushState("STATE"); + break; + case 39: + this.popState(); + yy_.yytext = yy_.yytext.slice(0, -8).trim(); + return 25; + break; + case 40: + this.popState(); + yy_.yytext = yy_.yytext.slice(0, -8).trim(); + return 26; + break; + case 41: + this.popState(); + yy_.yytext = yy_.yytext.slice(0, -10).trim(); + return 27; + break; + case 42: + this.popState(); + yy_.yytext = yy_.yytext.slice(0, -8).trim(); + return 25; + break; + case 43: + this.popState(); + yy_.yytext = yy_.yytext.slice(0, -8).trim(); + return 26; + break; + case 44: + this.popState(); + yy_.yytext = yy_.yytext.slice(0, -10).trim(); + return 27; + break; + case 45: + return 51; + break; + case 46: + return 52; + break; + case 47: + return 53; + break; + case 48: + return 54; + break; + case 49: + this.pushState("STATE_STRING"); + break; + case 50: + this.pushState("STATE_ID"); + return "AS"; + break; + case 51: + this.popState(); + return "ID"; + break; + case 52: + this.popState(); + break; + case 53: + return "STATE_DESCR"; + break; + case 54: + return 19; + break; + case 55: + this.popState(); + break; + case 56: + this.popState(); + this.pushState("struct"); + return 20; + break; + case 57: + break; + case 58: + this.popState(); + return 21; + break; + case 59: + break; + case 60: + this.begin("NOTE"); + return 29; + break; + case 61: + this.popState(); + this.pushState("NOTE_ID"); + return 59; + break; + case 62: + this.popState(); + this.pushState("NOTE_ID"); + return 60; + break; + case 63: + this.popState(); + this.pushState("FLOATING_NOTE"); + break; + case 64: + this.popState(); + this.pushState("FLOATING_NOTE_ID"); + return "AS"; + break; + case 65: + break; + case 66: + return "NOTE_TEXT"; + break; + case 67: + this.popState(); + return "ID"; + break; + case 68: + this.popState(); + this.pushState("NOTE_TEXT"); + return 24; + break; + case 69: + this.popState(); + yy_.yytext = yy_.yytext.substr(2).trim(); + return 31; + break; + case 70: + this.popState(); + yy_.yytext = yy_.yytext.slice(0, -8).trim(); + return 31; + break; + case 71: + return 6; + break; + case 72: + return 6; + break; + case 73: + return 16; + break; + case 74: + return 57; + break; + case 75: + return 24; + break; + case 76: + yy_.yytext = yy_.yytext.trim(); + return 14; + break; + case 77: + return 15; + break; + case 78: + return 28; + break; + case 79: + return 58; + break; + case 80: + return 5; + break; + case 81: + return "INVALID"; + break; + } + }, "anonymous"), + rules: [/^(?:click\b)/i, /^(?:href\b)/i, /^(?:"[^"]*")/i, /^(?:default\b)/i, /^(?:.*direction\s+TB[^\n]*)/i, /^(?:.*direction\s+BT[^\n]*)/i, /^(?:.*direction\s+RL[^\n]*)/i, /^(?:.*direction\s+LR[^\n]*)/i, /^(?:%%(?!\{)[^\n]*)/i, /^(?:[^\}]%%[^\n]*)/i, /^(?:[\n]+)/i, /^(?:[\s]+)/i, /^(?:((?!\n)\s)+)/i, /^(?:#[^\n]*)/i, /^(?:%[^\n]*)/i, /^(?:scale\s+)/i, /^(?:\d+)/i, /^(?:\s+width\b)/i, /^(?:accTitle\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*\{\s*)/i, /^(?:[\}])/i, /^(?:[^\}]*)/i, /^(?:classDef\s+)/i, /^(?:DEFAULT\s+)/i, /^(?:\w+\s+)/i, /^(?:[^\n]*)/i, /^(?:class\s+)/i, /^(?:(\w+)+((,\s*\w+)*))/i, /^(?:[^\n]*)/i, /^(?:style\s+)/i, /^(?:[\w,]+\s+)/i, /^(?:[^\n]*)/i, /^(?:scale\s+)/i, /^(?:\d+)/i, /^(?:\s+width\b)/i, /^(?:state\s+)/i, /^(?:.*<>)/i, /^(?:.*<>)/i, /^(?:.*<>)/i, /^(?:.*\[\[fork\]\])/i, /^(?:.*\[\[join\]\])/i, /^(?:.*\[\[choice\]\])/i, /^(?:.*direction\s+TB[^\n]*)/i, /^(?:.*direction\s+BT[^\n]*)/i, /^(?:.*direction\s+RL[^\n]*)/i, /^(?:.*direction\s+LR[^\n]*)/i, /^(?:["])/i, /^(?:\s*as\s+)/i, /^(?:[^\n\{]*)/i, /^(?:["])/i, /^(?:[^"]*)/i, /^(?:[^\n\s\{]+)/i, /^(?:\n)/i, /^(?:\{)/i, /^(?:%%(?!\{)[^\n]*)/i, /^(?:\})/i, /^(?:[\n])/i, /^(?:note\s+)/i, /^(?:left of\b)/i, /^(?:right of\b)/i, /^(?:")/i, /^(?:\s*as\s*)/i, /^(?:["])/i, /^(?:[^"]*)/i, /^(?:[^\n]*)/i, /^(?:\s*[^:\n\s\-]+)/i, /^(?:\s*:[^:\n;]+)/i, /^(?:[\s\S]*?end note\b)/i, /^(?:stateDiagram\s+)/i, /^(?:stateDiagram-v2\s+)/i, /^(?:hide empty description\b)/i, /^(?:\[\*\])/i, /^(?:[^:\n\s\-\{]+)/i, /^(?:\s*:[^:\n;]+)/i, /^(?:-->)/i, /^(?:--)/i, /^(?::::)/i, /^(?:$)/i, /^(?:.)/i], + conditions: { "LINE": { "rules": [12, 13], "inclusive": false }, "struct": { "rules": [12, 13, 25, 29, 32, 38, 45, 46, 47, 48, 57, 58, 59, 60, 74, 75, 76, 77, 78], "inclusive": false }, "FLOATING_NOTE_ID": { "rules": [67], "inclusive": false }, "FLOATING_NOTE": { "rules": [64, 65, 66], "inclusive": false }, "NOTE_TEXT": { "rules": [69, 70], "inclusive": false }, "NOTE_ID": { "rules": [68], "inclusive": false }, "NOTE": { "rules": [61, 62, 63], "inclusive": false }, "STYLEDEF_STYLEOPTS": { "rules": [], "inclusive": false }, "STYLEDEF_STYLES": { "rules": [34], "inclusive": false }, "STYLE_IDS": { "rules": [], "inclusive": false }, "STYLE": { "rules": [33], "inclusive": false }, "CLASS_STYLE": { "rules": [31], "inclusive": false }, "CLASS": { "rules": [30], "inclusive": false }, "CLASSDEFID": { "rules": [28], "inclusive": false }, "CLASSDEF": { "rules": [26, 27], "inclusive": false }, "acc_descr_multiline": { "rules": [23, 24], "inclusive": false }, "acc_descr": { "rules": [21], "inclusive": false }, "acc_title": { "rules": [19], "inclusive": false }, "SCALE": { "rules": [16, 17, 36, 37], "inclusive": false }, "ALIAS": { "rules": [], "inclusive": false }, "STATE_ID": { "rules": [51], "inclusive": false }, "STATE_STRING": { "rules": [52, 53], "inclusive": false }, "FORK_STATE": { "rules": [], "inclusive": false }, "STATE": { "rules": [12, 13, 39, 40, 41, 42, 43, 44, 49, 50, 54, 55, 56], "inclusive": false }, "ID": { "rules": [12, 13], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 18, 20, 22, 25, 29, 32, 35, 38, 56, 60, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var stateDiagram_default = parser; + +// src/diagrams/state/stateCommon.ts +var DEFAULT_DIAGRAM_DIRECTION = "TB"; +var DEFAULT_NESTED_DOC_DIR = "TB"; +var STMT_DIRECTION = "dir"; +var STMT_STATE = "state"; +var STMT_ROOT = "root"; +var STMT_RELATION = "relation"; +var STMT_CLASSDEF = "classDef"; +var STMT_STYLEDEF = "style"; +var STMT_APPLYCLASS = "applyClass"; +var DEFAULT_STATE_TYPE = "default"; +var DIVIDER_TYPE = "divider"; +var G_EDGE_STYLE = "fill:none"; +var G_EDGE_ARROWHEADSTYLE = "fill: #333"; +var G_EDGE_LABELPOS = "c"; +var G_EDGE_LABELTYPE = "text"; +var G_EDGE_THICKNESS = "normal"; +var SHAPE_STATE = "rect"; +var SHAPE_STATE_WITH_DESC = "rectWithTitle"; +var SHAPE_START = "stateStart"; +var SHAPE_END = "stateEnd"; +var SHAPE_DIVIDER = "divider"; +var SHAPE_GROUP = "roundedWithTitle"; +var SHAPE_NOTE = "note"; +var SHAPE_NOTEGROUP = "noteGroup"; +var CSS_DIAGRAM = "statediagram"; +var CSS_STATE = "state"; +var CSS_DIAGRAM_STATE = `${CSS_DIAGRAM}-${CSS_STATE}`; +var CSS_EDGE = "transition"; +var CSS_NOTE = "note"; +var CSS_NOTE_EDGE = "note-edge"; +var CSS_EDGE_NOTE_EDGE = `${CSS_EDGE} ${CSS_NOTE_EDGE}`; +var CSS_DIAGRAM_NOTE = `${CSS_DIAGRAM}-${CSS_NOTE}`; +var CSS_CLUSTER = "cluster"; +var CSS_DIAGRAM_CLUSTER = `${CSS_DIAGRAM}-${CSS_CLUSTER}`; +var CSS_CLUSTER_ALT = "cluster-alt"; +var CSS_DIAGRAM_CLUSTER_ALT = `${CSS_DIAGRAM}-${CSS_CLUSTER_ALT}`; +var PARENT = "parent"; +var NOTE = "note"; +var DOMID_STATE = "state"; +var DOMID_TYPE_SPACER = "----"; +var NOTE_ID = `${DOMID_TYPE_SPACER}${NOTE}`; +var PARENT_ID = `${DOMID_TYPE_SPACER}${PARENT}`; + +// src/diagrams/state/stateRenderer-v3-unified.ts +var getDir = /* @__PURE__ */ __name((parsedItem, defaultDir = DEFAULT_NESTED_DOC_DIR) => { + if (!parsedItem.doc) { + return defaultDir; + } + let dir = defaultDir; + for (const parsedItemDoc of parsedItem.doc) { + if (parsedItemDoc.stmt === "dir") { + dir = parsedItemDoc.value; + } + } + return dir; +}, "getDir"); +var getClasses = /* @__PURE__ */ __name(function(text, diagramObj) { + return diagramObj.db.getClasses(); +}, "getClasses"); +var draw = /* @__PURE__ */ __name(async function(text, id, _version, diag) { + log.info("REF0:"); + log.info("Drawing state diagram (v2)", id); + const { securityLevel, state: conf, layout } = getConfig(); + diag.db.extract(diag.db.getRootDocV2()); + const data4Layout = diag.db.getData(); + const svg = getDiagramElement(id, securityLevel); + data4Layout.type = diag.type; + data4Layout.layoutAlgorithm = layout; + data4Layout.nodeSpacing = conf?.nodeSpacing || 50; + data4Layout.rankSpacing = conf?.rankSpacing || 50; + data4Layout.markers = ["barb"]; + data4Layout.diagramId = id; + await render(data4Layout, svg); + const padding = 8; + try { + const links = typeof diag.db.getLinks === "function" ? diag.db.getLinks() : /* @__PURE__ */ new Map(); + links.forEach((linkInfo, key) => { + const stateId = typeof key === "string" ? key : typeof key?.id === "string" ? key.id : ""; + if (!stateId) { + log.warn("\u26A0\uFE0F Invalid or missing stateId from key:", JSON.stringify(key)); + return; + } + const allNodes = svg.node()?.querySelectorAll("g"); + let matchedElem; + allNodes?.forEach((g) => { + const text2 = g.textContent?.trim(); + if (text2 === stateId) { + matchedElem = g; + } + }); + if (!matchedElem) { + log.warn("\u26A0\uFE0F Could not find node matching text:", stateId); + return; + } + const parent = matchedElem.parentNode; + if (!parent) { + log.warn("\u26A0\uFE0F Node has no parent, cannot wrap:", stateId); + return; + } + const a = document.createElementNS("http://www.w3.org/2000/svg", "a"); + const cleanedUrl = linkInfo.url.replace(/^"+|"+$/g, ""); + a.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", cleanedUrl); + a.setAttribute("target", "_blank"); + if (linkInfo.tooltip) { + const tooltip = linkInfo.tooltip.replace(/^"+|"+$/g, ""); + a.setAttribute("title", tooltip); + } + parent.replaceChild(a, matchedElem); + a.appendChild(matchedElem); + log.info("\u{1F517} Wrapped node in tag for:", stateId, linkInfo.url); + }); + } catch (err) { + log.error("\u274C Error injecting clickable links:", err); + } + utils_default.insertTitle( + svg, + "statediagramTitleText", + conf?.titleTopMargin ?? 25, + diag.db.getDiagramTitle() + ); + setupViewPortForSVG(svg, padding, CSS_DIAGRAM, conf?.useMaxWidth ?? true); +}, "draw"); +var stateRenderer_v3_unified_default = { + getClasses, + draw, + getDir +}; + +// src/diagrams/state/dataFetcher.ts +var nodeDb = /* @__PURE__ */ new Map(); +var graphItemCount = 0; +function stateDomId(itemId = "", counter = 0, type = "", typeSpacer = DOMID_TYPE_SPACER) { + const typeStr = type !== null && type.length > 0 ? `${typeSpacer}${type}` : ""; + return `${DOMID_STATE}-${itemId}${typeStr}-${counter}`; +} +__name(stateDomId, "stateDomId"); +var setupDoc = /* @__PURE__ */ __name((parentParsedItem, doc, diagramStates, nodes, edges, altFlag, look, classes) => { + log.trace("items", doc); + doc.forEach((item) => { + switch (item.stmt) { + case STMT_STATE: + dataFetcher(parentParsedItem, item, diagramStates, nodes, edges, altFlag, look, classes); + break; + case DEFAULT_STATE_TYPE: + dataFetcher(parentParsedItem, item, diagramStates, nodes, edges, altFlag, look, classes); + break; + case STMT_RELATION: + { + dataFetcher( + parentParsedItem, + item.state1, + diagramStates, + nodes, + edges, + altFlag, + look, + classes + ); + dataFetcher( + parentParsedItem, + item.state2, + diagramStates, + nodes, + edges, + altFlag, + look, + classes + ); + const edgeData = { + id: "edge" + graphItemCount, + start: item.state1.id, + end: item.state2.id, + arrowhead: "normal", + arrowTypeEnd: "arrow_barb", + style: G_EDGE_STYLE, + labelStyle: "", + label: common_default.sanitizeText(item.description ?? "", getConfig()), + arrowheadStyle: G_EDGE_ARROWHEADSTYLE, + labelpos: G_EDGE_LABELPOS, + labelType: G_EDGE_LABELTYPE, + thickness: G_EDGE_THICKNESS, + classes: CSS_EDGE, + look + }; + edges.push(edgeData); + graphItemCount++; + } + break; + } + }); +}, "setupDoc"); +var getDir2 = /* @__PURE__ */ __name((parsedItem, defaultDir = DEFAULT_NESTED_DOC_DIR) => { + let dir = defaultDir; + if (parsedItem.doc) { + for (const parsedItemDoc of parsedItem.doc) { + if (parsedItemDoc.stmt === "dir") { + dir = parsedItemDoc.value; + } + } + } + return dir; +}, "getDir"); +function insertOrUpdateNode(nodes, nodeData, classes) { + if (!nodeData.id || nodeData.id === "" || nodeData.id === "") { + return; + } + if (nodeData.cssClasses) { + if (!Array.isArray(nodeData.cssCompiledStyles)) { + nodeData.cssCompiledStyles = []; + } + nodeData.cssClasses.split(" ").forEach((cssClass) => { + const classDef = classes.get(cssClass); + if (classDef) { + nodeData.cssCompiledStyles = [...nodeData.cssCompiledStyles ?? [], ...classDef.styles]; + } + }); + } + const existingNodeData = nodes.find((node) => node.id === nodeData.id); + if (existingNodeData) { + Object.assign(existingNodeData, nodeData); + } else { + nodes.push(nodeData); + } +} +__name(insertOrUpdateNode, "insertOrUpdateNode"); +function getClassesFromDbInfo(dbInfoItem) { + return dbInfoItem?.classes?.join(" ") ?? ""; +} +__name(getClassesFromDbInfo, "getClassesFromDbInfo"); +function getStylesFromDbInfo(dbInfoItem) { + return dbInfoItem?.styles ?? []; +} +__name(getStylesFromDbInfo, "getStylesFromDbInfo"); +var dataFetcher = /* @__PURE__ */ __name((parent, parsedItem, diagramStates, nodes, edges, altFlag, look, classes) => { + const itemId = parsedItem.id; + const dbState = diagramStates.get(itemId); + const classStr = getClassesFromDbInfo(dbState); + const style = getStylesFromDbInfo(dbState); + const config = getConfig(); + log.info("dataFetcher parsedItem", parsedItem, dbState, style); + if (itemId !== "root") { + let shape = SHAPE_STATE; + if (parsedItem.start === true) { + shape = SHAPE_START; + } else if (parsedItem.start === false) { + shape = SHAPE_END; + } + if (parsedItem.type !== DEFAULT_STATE_TYPE) { + shape = parsedItem.type; + } + if (!nodeDb.get(itemId)) { + nodeDb.set(itemId, { + id: itemId, + shape, + description: common_default.sanitizeText(itemId, config), + cssClasses: `${classStr} ${CSS_DIAGRAM_STATE}`, + cssStyles: style + }); + } + const newNode = nodeDb.get(itemId); + if (parsedItem.description) { + if (Array.isArray(newNode.description)) { + newNode.shape = SHAPE_STATE_WITH_DESC; + newNode.description.push(parsedItem.description); + } else { + if (newNode.description?.length && newNode.description.length > 0) { + newNode.shape = SHAPE_STATE_WITH_DESC; + if (newNode.description === itemId) { + newNode.description = [parsedItem.description]; + } else { + newNode.description = [newNode.description, parsedItem.description]; + } + } else { + newNode.shape = SHAPE_STATE; + newNode.description = parsedItem.description; + } + } + newNode.description = common_default.sanitizeTextOrArray(newNode.description, config); + } + if (newNode.description?.length === 1 && newNode.shape === SHAPE_STATE_WITH_DESC) { + if (newNode.type === "group") { + newNode.shape = SHAPE_GROUP; + } else { + newNode.shape = SHAPE_STATE; + } + } + if (!newNode.type && parsedItem.doc) { + log.info("Setting cluster for XCX", itemId, getDir2(parsedItem)); + newNode.type = "group"; + newNode.isGroup = true; + newNode.dir = getDir2(parsedItem); + newNode.shape = parsedItem.type === DIVIDER_TYPE ? SHAPE_DIVIDER : SHAPE_GROUP; + newNode.cssClasses = `${newNode.cssClasses} ${CSS_DIAGRAM_CLUSTER} ${altFlag ? CSS_DIAGRAM_CLUSTER_ALT : ""}`; + } + const nodeData = { + labelStyle: "", + shape: newNode.shape, + label: newNode.description, + cssClasses: newNode.cssClasses, + cssCompiledStyles: [], + cssStyles: newNode.cssStyles, + id: itemId, + dir: newNode.dir, + domId: stateDomId(itemId, graphItemCount), + type: newNode.type, + isGroup: newNode.type === "group", + padding: 8, + rx: 10, + ry: 10, + look + }; + if (nodeData.shape === SHAPE_DIVIDER) { + nodeData.label = ""; + } + if (parent && parent.id !== "root") { + log.trace("Setting node ", itemId, " to be child of its parent ", parent.id); + nodeData.parentId = parent.id; + } + nodeData.centerLabel = true; + if (parsedItem.note) { + const noteData = { + labelStyle: "", + shape: SHAPE_NOTE, + label: parsedItem.note.text, + cssClasses: CSS_DIAGRAM_NOTE, + // useHtmlLabels: false, + cssStyles: [], + cssCompiledStyles: [], + id: itemId + NOTE_ID + "-" + graphItemCount, + domId: stateDomId(itemId, graphItemCount, NOTE), + type: newNode.type, + isGroup: newNode.type === "group", + padding: config.flowchart?.padding, + look, + position: parsedItem.note.position + }; + const parentNodeId = itemId + PARENT_ID; + const groupData = { + labelStyle: "", + shape: SHAPE_NOTEGROUP, + label: parsedItem.note.text, + cssClasses: newNode.cssClasses, + cssStyles: [], + id: itemId + PARENT_ID, + domId: stateDomId(itemId, graphItemCount, PARENT), + type: "group", + isGroup: true, + padding: 16, + //getConfig().flowchart.padding + look, + position: parsedItem.note.position + }; + graphItemCount++; + groupData.id = parentNodeId; + noteData.parentId = parentNodeId; + insertOrUpdateNode(nodes, groupData, classes); + insertOrUpdateNode(nodes, noteData, classes); + insertOrUpdateNode(nodes, nodeData, classes); + let from = itemId; + let to = noteData.id; + if (parsedItem.note.position === "left of") { + from = noteData.id; + to = itemId; + } + edges.push({ + id: from + "-" + to, + start: from, + end: to, + arrowhead: "none", + arrowTypeEnd: "", + style: G_EDGE_STYLE, + labelStyle: "", + classes: CSS_EDGE_NOTE_EDGE, + arrowheadStyle: G_EDGE_ARROWHEADSTYLE, + labelpos: G_EDGE_LABELPOS, + labelType: G_EDGE_LABELTYPE, + thickness: G_EDGE_THICKNESS, + look + }); + } else { + insertOrUpdateNode(nodes, nodeData, classes); + } + } + if (parsedItem.doc) { + log.trace("Adding nodes children "); + setupDoc(parsedItem, parsedItem.doc, diagramStates, nodes, edges, !altFlag, look, classes); + } +}, "dataFetcher"); +var reset = /* @__PURE__ */ __name(() => { + nodeDb.clear(); + graphItemCount = 0; +}, "reset"); + +// src/diagrams/state/stateDb.ts +var CONSTANTS = { + START_NODE: "[*]", + START_TYPE: "start", + END_NODE: "[*]", + END_TYPE: "end", + COLOR_KEYWORD: "color", + FILL_KEYWORD: "fill", + BG_FILL: "bgFill", + STYLECLASS_SEP: "," +}; +var newClassesList = /* @__PURE__ */ __name(() => /* @__PURE__ */ new Map(), "newClassesList"); +var newDoc = /* @__PURE__ */ __name(() => ({ + relations: [], + states: /* @__PURE__ */ new Map(), + documents: {} +}), "newDoc"); +var clone = /* @__PURE__ */ __name((o) => JSON.parse(JSON.stringify(o)), "clone"); +var StateDB = class { + constructor(version) { + this.version = version; + this.nodes = []; + this.edges = []; + this.rootDoc = []; + this.classes = newClassesList(); + this.documents = { root: newDoc() }; + this.currentDocument = this.documents.root; + this.startEndCount = 0; + this.dividerCnt = 0; + this.links = /* @__PURE__ */ new Map(); + this.getAccTitle = getAccTitle; + this.setAccTitle = setAccTitle; + this.getAccDescription = getAccDescription; + this.setAccDescription = setAccDescription; + this.setDiagramTitle = setDiagramTitle; + this.getDiagramTitle = getDiagramTitle; + this.clear(); + this.setRootDoc = this.setRootDoc.bind(this); + this.getDividerId = this.getDividerId.bind(this); + this.setDirection = this.setDirection.bind(this); + this.trimColon = this.trimColon.bind(this); + } + static { + __name(this, "StateDB"); + } + static { + this.relationType = { + AGGREGATION: 0, + EXTENSION: 1, + COMPOSITION: 2, + DEPENDENCY: 3 + }; + } + /** + * Convert all of the statements (stmts) that were parsed into states and relationships. + * This is done because a state diagram may have nested sections, + * where each section is a 'document' and has its own set of statements. + * Ex: the section within a fork has its own statements, and incoming and outgoing statements + * refer to the fork as a whole (document). + * See the parser grammar: the definition of a document is a document then a 'line', where a line can be a statement. + * This will push the statement into the list of statements for the current document. + */ + extract(statements) { + this.clear(true); + for (const item of Array.isArray(statements) ? statements : statements.doc) { + switch (item.stmt) { + case STMT_STATE: + this.addState(item.id.trim(), item.type, item.doc, item.description, item.note); + break; + case STMT_RELATION: + this.addRelation(item.state1, item.state2, item.description); + break; + case STMT_CLASSDEF: + this.addStyleClass(item.id.trim(), item.classes); + break; + case STMT_STYLEDEF: + this.handleStyleDef(item); + break; + case STMT_APPLYCLASS: + this.setCssClass(item.id.trim(), item.styleClass); + break; + case "click": + this.addLink(item.id, item.url, item.tooltip); + break; + } + } + const diagramStates = this.getStates(); + const config = getConfig(); + reset(); + dataFetcher( + void 0, + this.getRootDocV2(), + diagramStates, + this.nodes, + this.edges, + true, + config.look, + this.classes + ); + for (const node of this.nodes) { + if (!Array.isArray(node.label)) { + continue; + } + node.description = node.label.slice(1); + if (node.isGroup && node.description.length > 0) { + throw new Error( + `Group nodes can only have label. Remove the additional description for node [${node.id}]` + ); + } + node.label = node.label[0]; + } + } + handleStyleDef(item) { + const ids = item.id.trim().split(","); + const styles = item.styleClass.split(","); + for (const id of ids) { + let state = this.getState(id); + if (!state) { + const trimmedId = id.trim(); + this.addState(trimmedId); + state = this.getState(trimmedId); + } + if (state) { + state.styles = styles.map((s) => s.replace(/;/g, "")?.trim()); + } + } + } + setRootDoc(o) { + log.info("Setting root doc", o); + this.rootDoc = o; + if (this.version === 1) { + this.extract(o); + } else { + this.extract(this.getRootDocV2()); + } + } + docTranslator(parent, node, first) { + if (node.stmt === STMT_RELATION) { + this.docTranslator(parent, node.state1, true); + this.docTranslator(parent, node.state2, false); + return; + } + if (node.stmt === STMT_STATE) { + if (node.id === CONSTANTS.START_NODE) { + node.id = parent.id + (first ? "_start" : "_end"); + node.start = first; + } else { + node.id = node.id.trim(); + } + } + if (node.stmt !== STMT_ROOT && node.stmt !== STMT_STATE || !node.doc) { + return; + } + const doc = []; + let currentDoc = []; + for (const stmt of node.doc) { + if (stmt.type === DIVIDER_TYPE) { + const newNode = clone(stmt); + newNode.doc = clone(currentDoc); + doc.push(newNode); + currentDoc = []; + } else { + currentDoc.push(stmt); + } + } + if (doc.length > 0 && currentDoc.length > 0) { + const newNode = { + stmt: STMT_STATE, + id: generateId(), + type: "divider", + doc: clone(currentDoc) + }; + doc.push(clone(newNode)); + node.doc = doc; + } + node.doc.forEach((docNode) => this.docTranslator(node, docNode, true)); + } + getRootDocV2() { + this.docTranslator( + { id: STMT_ROOT, stmt: STMT_ROOT }, + { id: STMT_ROOT, stmt: STMT_ROOT, doc: this.rootDoc }, + true + ); + return { id: STMT_ROOT, doc: this.rootDoc }; + } + /** + * Function called by parser when a node definition has been found. + * + * @param descr - description for the state. Can be a string or a list or strings + * @param classes - class styles to apply to this state. Can be a string (1 style) or an array of styles. If it's just 1 class, convert it to an array of that 1 class. + * @param styles - styles to apply to this state. Can be a string (1 style) or an array of styles. If it's just 1 style, convert it to an array of that 1 style. + * @param textStyles - text styles to apply to this state. Can be a string (1 text test) or an array of text styles. If it's just 1 text style, convert it to an array of that 1 text style. + */ + addState(id, type = DEFAULT_STATE_TYPE, doc = void 0, descr = void 0, note = void 0, classes = void 0, styles = void 0, textStyles = void 0) { + const trimmedId = id?.trim(); + if (!this.currentDocument.states.has(trimmedId)) { + log.info("Adding state ", trimmedId, descr); + this.currentDocument.states.set(trimmedId, { + stmt: STMT_STATE, + id: trimmedId, + descriptions: [], + type, + doc, + note, + classes: [], + styles: [], + textStyles: [] + }); + } else { + const state = this.currentDocument.states.get(trimmedId); + if (!state) { + throw new Error(`State not found: ${trimmedId}`); + } + if (!state.doc) { + state.doc = doc; + } + if (!state.type) { + state.type = type; + } + } + if (descr) { + log.info("Setting state description", trimmedId, descr); + const descriptions = Array.isArray(descr) ? descr : [descr]; + descriptions.forEach((des) => this.addDescription(trimmedId, des.trim())); + } + if (note) { + const doc2 = this.currentDocument.states.get(trimmedId); + if (!doc2) { + throw new Error(`State not found: ${trimmedId}`); + } + doc2.note = note; + doc2.note.text = common_default.sanitizeText(doc2.note.text, getConfig()); + } + if (classes) { + log.info("Setting state classes", trimmedId, classes); + const classesList = Array.isArray(classes) ? classes : [classes]; + classesList.forEach((cssClass) => this.setCssClass(trimmedId, cssClass.trim())); + } + if (styles) { + log.info("Setting state styles", trimmedId, styles); + const stylesList = Array.isArray(styles) ? styles : [styles]; + stylesList.forEach((style) => this.setStyle(trimmedId, style.trim())); + } + if (textStyles) { + log.info("Setting state styles", trimmedId, styles); + const textStylesList = Array.isArray(textStyles) ? textStyles : [textStyles]; + textStylesList.forEach((textStyle) => this.setTextStyle(trimmedId, textStyle.trim())); + } + } + clear(saveCommon) { + this.nodes = []; + this.edges = []; + this.documents = { root: newDoc() }; + this.currentDocument = this.documents.root; + this.startEndCount = 0; + this.classes = newClassesList(); + if (!saveCommon) { + this.links = /* @__PURE__ */ new Map(); + clear(); + } + } + getState(id) { + return this.currentDocument.states.get(id); + } + getStates() { + return this.currentDocument.states; + } + logDocuments() { + log.info("Documents = ", this.documents); + } + getRelations() { + return this.currentDocument.relations; + } + /** + * Adds a clickable link to a state. + */ + addLink(stateId, url, tooltip) { + this.links.set(stateId, { url, tooltip }); + log.warn("Adding link", stateId, url, tooltip); + } + /** + * Get all registered links. + */ + getLinks() { + return this.links; + } + /** + * If the id is a start node ( [*] ), then return a new id constructed from + * the start node name and the current start node count. + * else return the given id + */ + startIdIfNeeded(id = "") { + if (id === CONSTANTS.START_NODE) { + this.startEndCount++; + return `${CONSTANTS.START_TYPE}${this.startEndCount}`; + } + return id; + } + /** + * If the id is a start node ( [*] ), then return the start type ('start') + * else return the given type + */ + startTypeIfNeeded(id = "", type = DEFAULT_STATE_TYPE) { + return id === CONSTANTS.START_NODE ? CONSTANTS.START_TYPE : type; + } + /** + * If the id is an end node ( [*] ), then return a new id constructed from + * the end node name and the current start_end node count. + * else return the given id + */ + endIdIfNeeded(id = "") { + if (id === CONSTANTS.END_NODE) { + this.startEndCount++; + return `${CONSTANTS.END_TYPE}${this.startEndCount}`; + } + return id; + } + /** + * If the id is an end node ( [*] ), then return the end type + * else return the given type + * + */ + endTypeIfNeeded(id = "", type = DEFAULT_STATE_TYPE) { + return id === CONSTANTS.END_NODE ? CONSTANTS.END_TYPE : type; + } + addRelationObjs(item1, item2, relationTitle = "") { + const id1 = this.startIdIfNeeded(item1.id.trim()); + const type1 = this.startTypeIfNeeded(item1.id.trim(), item1.type); + const id2 = this.startIdIfNeeded(item2.id.trim()); + const type2 = this.startTypeIfNeeded(item2.id.trim(), item2.type); + this.addState( + id1, + type1, + item1.doc, + item1.description, + item1.note, + item1.classes, + item1.styles, + item1.textStyles + ); + this.addState( + id2, + type2, + item2.doc, + item2.description, + item2.note, + item2.classes, + item2.styles, + item2.textStyles + ); + this.currentDocument.relations.push({ + id1, + id2, + relationTitle: common_default.sanitizeText(relationTitle, getConfig()) + }); + } + /** + * Add a relation between two items. The items may be full objects or just the string id of a state. + */ + addRelation(item1, item2, title) { + if (typeof item1 === "object" && typeof item2 === "object") { + this.addRelationObjs(item1, item2, title); + } else if (typeof item1 === "string" && typeof item2 === "string") { + const id1 = this.startIdIfNeeded(item1.trim()); + const type1 = this.startTypeIfNeeded(item1); + const id2 = this.endIdIfNeeded(item2.trim()); + const type2 = this.endTypeIfNeeded(item2); + this.addState(id1, type1); + this.addState(id2, type2); + this.currentDocument.relations.push({ + id1, + id2, + relationTitle: title ? common_default.sanitizeText(title, getConfig()) : void 0 + }); + } + } + addDescription(id, descr) { + const theState = this.currentDocument.states.get(id); + const _descr = descr.startsWith(":") ? descr.replace(":", "").trim() : descr; + theState?.descriptions?.push(common_default.sanitizeText(_descr, getConfig())); + } + cleanupLabel(label) { + return label.startsWith(":") ? label.slice(2).trim() : label.trim(); + } + getDividerId() { + this.dividerCnt++; + return `divider-id-${this.dividerCnt}`; + } + /** + * Called when the parser comes across a (style) class definition + * @example classDef my-style fill:#f96; + * + * @param id - the id of this (style) class + * @param styleAttributes - the string with 1 or more style attributes (each separated by a comma) + */ + addStyleClass(id, styleAttributes = "") { + if (!this.classes.has(id)) { + this.classes.set(id, { id, styles: [], textStyles: [] }); + } + const foundClass = this.classes.get(id); + if (styleAttributes && foundClass) { + styleAttributes.split(CONSTANTS.STYLECLASS_SEP).forEach((attrib) => { + const fixedAttrib = attrib.replace(/([^;]*);/, "$1").trim(); + if (RegExp(CONSTANTS.COLOR_KEYWORD).exec(attrib)) { + const newStyle1 = fixedAttrib.replace(CONSTANTS.FILL_KEYWORD, CONSTANTS.BG_FILL); + const newStyle2 = newStyle1.replace(CONSTANTS.COLOR_KEYWORD, CONSTANTS.FILL_KEYWORD); + foundClass.textStyles.push(newStyle2); + } + foundClass.styles.push(fixedAttrib); + }); + } + } + getClasses() { + return this.classes; + } + /** + * Add a (style) class or css class to a state with the given id. + * If the state isn't already in the list of known states, add it. + * Might be called by parser when a style class or CSS class should be applied to a state + * + * @param itemIds - The id or a list of ids of the item(s) to apply the css class to + * @param cssClassName - CSS class name + */ + setCssClass(itemIds, cssClassName) { + itemIds.split(",").forEach((id) => { + let foundState = this.getState(id); + if (!foundState) { + const trimmedId = id.trim(); + this.addState(trimmedId); + foundState = this.getState(trimmedId); + } + foundState?.classes?.push(cssClassName); + }); + } + /** + * Add a style to a state with the given id. + * @example style stateId fill:#f9f,stroke:#333,stroke-width:4px + * where 'style' is the keyword + * stateId is the id of a state + * the rest of the string is the styleText (all of the attributes to be applied to the state) + * + * @param itemId - The id of item to apply the style to + * @param styleText - the text of the attributes for the style + */ + setStyle(itemId, styleText) { + this.getState(itemId)?.styles?.push(styleText); + } + /** + * Add a text style to a state with the given id + * + * @param itemId - The id of item to apply the css class to + * @param cssClassName - CSS class name + */ + setTextStyle(itemId, cssClassName) { + this.getState(itemId)?.textStyles?.push(cssClassName); + } + /** + * Finds the direction statement in the root document. + * @returns the direction statement if present + */ + getDirectionStatement() { + return this.rootDoc.find((doc) => doc.stmt === STMT_DIRECTION); + } + getDirection() { + return this.getDirectionStatement()?.value ?? DEFAULT_DIAGRAM_DIRECTION; + } + setDirection(dir) { + const doc = this.getDirectionStatement(); + if (doc) { + doc.value = dir; + } else { + this.rootDoc.unshift({ stmt: STMT_DIRECTION, value: dir }); + } + } + trimColon(str) { + return str.startsWith(":") ? str.slice(1).trim() : str.trim(); + } + getData() { + const config = getConfig(); + return { + nodes: this.nodes, + edges: this.edges, + other: {}, + config, + direction: getDir(this.getRootDocV2()) + }; + } + getConfig() { + return getConfig().state; + } +}; + +// src/diagrams/state/styles.js +var getStyles = /* @__PURE__ */ __name((options) => ` +defs #statediagram-barbEnd { + fill: ${options.transitionColor}; + stroke: ${options.transitionColor}; + } +g.stateGroup text { + fill: ${options.nodeBorder}; + stroke: none; + font-size: 10px; +} +g.stateGroup text { + fill: ${options.textColor}; + stroke: none; + font-size: 10px; + +} +g.stateGroup .state-title { + font-weight: bolder; + fill: ${options.stateLabelColor}; +} + +g.stateGroup rect { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; +} + +g.stateGroup line { + stroke: ${options.lineColor}; + stroke-width: 1; +} + +.transition { + stroke: ${options.transitionColor}; + stroke-width: 1; + fill: none; +} + +.stateGroup .composit { + fill: ${options.background}; + border-bottom: 1px +} + +.stateGroup .alt-composit { + fill: #e0e0e0; + border-bottom: 1px +} + +.state-note { + stroke: ${options.noteBorderColor}; + fill: ${options.noteBkgColor}; + + text { + fill: ${options.noteTextColor}; + stroke: none; + font-size: 10px; + } +} + +.stateLabel .box { + stroke: none; + stroke-width: 0; + fill: ${options.mainBkg}; + opacity: 0.5; +} + +.edgeLabel .label rect { + fill: ${options.labelBackgroundColor}; + opacity: 0.5; +} +.edgeLabel { + background-color: ${options.edgeLabelBackground}; + p { + background-color: ${options.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${options.edgeLabelBackground}; + fill: ${options.edgeLabelBackground}; + } + text-align: center; +} +.edgeLabel .label text { + fill: ${options.transitionLabelColor || options.tertiaryTextColor}; +} +.label div .edgeLabel { + color: ${options.transitionLabelColor || options.tertiaryTextColor}; +} + +.stateLabel text { + fill: ${options.stateLabelColor}; + font-size: 10px; + font-weight: bold; +} + +.node circle.state-start { + fill: ${options.specialStateColor}; + stroke: ${options.specialStateColor}; +} + +.node .fork-join { + fill: ${options.specialStateColor}; + stroke: ${options.specialStateColor}; +} + +.node circle.state-end { + fill: ${options.innerEndBackground}; + stroke: ${options.background}; + stroke-width: 1.5 +} +.end-state-inner { + fill: ${options.compositeBackground || options.background}; + // stroke: ${options.background}; + stroke-width: 1.5 +} + +.node rect { + fill: ${options.stateBkg || options.mainBkg}; + stroke: ${options.stateBorder || options.nodeBorder}; + stroke-width: 1px; +} +.node polygon { + fill: ${options.mainBkg}; + stroke: ${options.stateBorder || options.nodeBorder};; + stroke-width: 1px; +} +#statediagram-barbEnd { + fill: ${options.lineColor}; +} + +.statediagram-cluster rect { + fill: ${options.compositeTitleBackground}; + stroke: ${options.stateBorder || options.nodeBorder}; + stroke-width: 1px; +} + +.cluster-label, .nodeLabel { + color: ${options.stateLabelColor}; + // line-height: 1; +} + +.statediagram-cluster rect.outer { + rx: 5px; + ry: 5px; +} +.statediagram-state .divider { + stroke: ${options.stateBorder || options.nodeBorder}; +} + +.statediagram-state .title-state { + rx: 5px; + ry: 5px; +} +.statediagram-cluster.statediagram-cluster .inner { + fill: ${options.compositeBackground || options.background}; +} +.statediagram-cluster.statediagram-cluster-alt .inner { + fill: ${options.altBackground ? options.altBackground : "#efefef"}; +} + +.statediagram-cluster .inner { + rx:0; + ry:0; +} + +.statediagram-state rect.basic { + rx: 5px; + ry: 5px; +} +.statediagram-state rect.divider { + stroke-dasharray: 10,10; + fill: ${options.altBackground ? options.altBackground : "#efefef"}; +} + +.note-edge { + stroke-dasharray: 5; +} + +.statediagram-note rect { + fill: ${options.noteBkgColor}; + stroke: ${options.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} +.statediagram-note rect { + fill: ${options.noteBkgColor}; + stroke: ${options.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} + +.statediagram-note text { + fill: ${options.noteTextColor}; +} + +.statediagram-note .nodeLabel { + color: ${options.noteTextColor}; +} +.statediagram .edgeLabel { + color: red; // ${options.noteTextColor}; +} + +#dependencyStart, #dependencyEnd { + fill: ${options.lineColor}; + stroke: ${options.lineColor}; + stroke-width: 1; +} + +.statediagramTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${options.textColor}; +} +`, "getStyles"); +var styles_default = getStyles; + +export { + stateDiagram_default, + stateRenderer_v3_unified_default, + StateDB, + styles_default +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-DI55MBZ5.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-DI55MBZ5.mjs.map new file mode 100644 index 0000000..439af6d --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-DI55MBZ5.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/state/parser/stateDiagram.jison", "../../../src/diagrams/state/stateCommon.ts", "../../../src/diagrams/state/stateRenderer-v3-unified.ts", "../../../src/diagrams/state/dataFetcher.ts", "../../../src/diagrams/state/stateDb.ts", "../../../src/diagrams/state/styles.js"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,3],$V2=[1,4],$V3=[2,4],$V4=[1,9],$V5=[1,11],$V6=[1,16],$V7=[1,17],$V8=[1,18],$V9=[1,19],$Va=[1,33],$Vb=[1,20],$Vc=[1,21],$Vd=[1,22],$Ve=[1,23],$Vf=[1,24],$Vg=[1,26],$Vh=[1,27],$Vi=[1,28],$Vj=[1,29],$Vk=[1,30],$Vl=[1,31],$Vm=[1,32],$Vn=[1,35],$Vo=[1,36],$Vp=[1,37],$Vq=[1,38],$Vr=[1,34],$Vs=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],$Vt=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,39,40,41,45,48,51,52,53,54,57],$Vu=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"SPACE\":4,\"NL\":5,\"SD\":6,\"document\":7,\"line\":8,\"statement\":9,\"classDefStatement\":10,\"styleStatement\":11,\"cssClassStatement\":12,\"idStatement\":13,\"DESCR\":14,\"-->\":15,\"HIDE_EMPTY\":16,\"scale\":17,\"WIDTH\":18,\"COMPOSIT_STATE\":19,\"STRUCT_START\":20,\"STRUCT_STOP\":21,\"STATE_DESCR\":22,\"AS\":23,\"ID\":24,\"FORK\":25,\"JOIN\":26,\"CHOICE\":27,\"CONCURRENT\":28,\"note\":29,\"notePosition\":30,\"NOTE_TEXT\":31,\"direction\":32,\"acc_title\":33,\"acc_title_value\":34,\"acc_descr\":35,\"acc_descr_value\":36,\"acc_descr_multiline_value\":37,\"CLICK\":38,\"STRING\":39,\"HREF\":40,\"classDef\":41,\"CLASSDEF_ID\":42,\"CLASSDEF_STYLEOPTS\":43,\"DEFAULT\":44,\"style\":45,\"STYLE_IDS\":46,\"STYLEDEF_STYLEOPTS\":47,\"class\":48,\"CLASSENTITY_IDS\":49,\"STYLECLASS\":50,\"direction_tb\":51,\"direction_bt\":52,\"direction_rl\":53,\"direction_lr\":54,\"eol\":55,\";\":56,\"EDGE_STATE\":57,\"STYLE_SEPARATOR\":58,\"left_of\":59,\"right_of\":60,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"SPACE\",5:\"NL\",6:\"SD\",14:\"DESCR\",15:\"-->\",16:\"HIDE_EMPTY\",17:\"scale\",18:\"WIDTH\",19:\"COMPOSIT_STATE\",20:\"STRUCT_START\",21:\"STRUCT_STOP\",22:\"STATE_DESCR\",23:\"AS\",24:\"ID\",25:\"FORK\",26:\"JOIN\",27:\"CHOICE\",28:\"CONCURRENT\",29:\"note\",31:\"NOTE_TEXT\",33:\"acc_title\",34:\"acc_title_value\",35:\"acc_descr\",36:\"acc_descr_value\",37:\"acc_descr_multiline_value\",38:\"CLICK\",39:\"STRING\",40:\"HREF\",41:\"classDef\",42:\"CLASSDEF_ID\",43:\"CLASSDEF_STYLEOPTS\",44:\"DEFAULT\",45:\"style\",46:\"STYLE_IDS\",47:\"STYLEDEF_STYLEOPTS\",48:\"class\",49:\"CLASSENTITY_IDS\",50:\"STYLECLASS\",51:\"direction_tb\",52:\"direction_bt\",53:\"direction_rl\",54:\"direction_lr\",56:\";\",57:\"EDGE_STATE\",58:\"STYLE_SEPARATOR\",59:\"left_of\",60:\"right_of\"},\nproductions_: [0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[9,5],[9,5],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[55,1],[55,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 3:\n /* console.log('--> Root document', $$[$0]); */ yy.setRootDoc($$[$0]); return $$[$0]; \nbreak;\ncase 4:\n /*console.log('empty document'); */ this.$ = [] \nbreak;\ncase 5:\n\n if($$[$0] !='nl'){\n /* console.log(' document: 1: ', $$[$0-1], ' pushing 2: ', $$[$0]); */\n $$[$0-1].push($$[$0]); this.$ = $$[$0-1]\n }\n /* console.log('Got document',$$[$0-1], $$[$0]); */\n \nbreak;\ncase 6: case 7:\n this.$ = $$[$0] \nbreak;\ncase 8:\n this.$='nl';\nbreak;\ncase 12:\n /* console.log('got id', $$[$0]); */\n this.$=$$[$0];\n\t \nbreak;\ncase 13:\n\n const stateStmt = $$[$0-1];\n stateStmt.description = yy.trimColon($$[$0]);\n this.$ = stateStmt;\n\t \nbreak;\ncase 14:\n\n /* console.info('got ids: 1: ', $$[$0-2], ' 2:', $$[$0-1],' 3: ', $$[$0]); */\n // console.log(' idStatement --> idStatement : state1 =', $$[$0-2], ' state2 =', $$[$0]);\n this.$={ stmt: 'relation', state1: $$[$0-2], state2: $$[$0]};\n \nbreak;\ncase 15:\n\n const relDescription = yy.trimColon($$[$0]);\n /* console.log(' idStatement --> idStatement DESCR : state1 =', $$[$0-3], ' state2stmt =', $$[$0-1], ' description: ', relDescription); */\n this.$={ stmt: 'relation', state1: $$[$0-3], state2: $$[$0-1], description: relDescription};\n \nbreak;\ncase 19:\n\n // console.log('Adding document for state without id ', $$[$0-3]);\n this.$={ stmt: 'state', id: $$[$0-3], type: 'default', description: '', doc: $$[$0-1] }\n \nbreak;\ncase 20:\n\n var id=$$[$0];\n var description = $$[$0-2].trim();\n if($$[$0].match(':')){\n var parts = $$[$0].split(':');\n id=parts[0];\n description = [description, parts[1]];\n }\n this.$={stmt: 'state', id: id, type: 'default', description: description};\n\n \nbreak;\ncase 21:\n\n // console.log('state with id ', $$[$0-3],' document = ', $$[$0-1], );\n this.$={ stmt: 'state', id: $$[$0-3], type: 'default', description: $$[$0-5], doc: $$[$0-1] }\n \nbreak;\ncase 22:\n\n this.$={ stmt: 'state', id: $$[$0], type: 'fork' }\n \nbreak;\ncase 23:\n\n this.$={ stmt: 'state', id: $$[$0], type: 'join' }\n \nbreak;\ncase 24:\n\n this.$={ stmt: 'state', id: $$[$0], type: 'choice' }\n \nbreak;\ncase 25:\n\n this.$={ stmt: 'state', id: yy.getDividerId(), type: 'divider' }\n \nbreak;\ncase 26:\n\n /* console.warn('got NOTE, position: ', $$[$0-2].trim(), 'id = ', $$[$0-1].trim(), 'note: ', $$[$0]);*/\n this.$={ stmt: 'state', id: $$[$0-1].trim(), note:{position: $$[$0-2].trim(), text: $$[$0].trim()}};\n \nbreak;\ncase 29:\n this.$=$$[$0].trim();yy.setAccTitle(this.$); \nbreak;\ncase 30: case 31:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 32:\n\n this.$ = {\n stmt: \"click\",\n id: $$[$0-3],\n url: $$[$0-2],\n tooltip: $$[$0-1]\n };\n \nbreak;\ncase 33:\n\n this.$ = {\n stmt: \"click\",\n id: $$[$0-3],\n url: $$[$0-1],\n tooltip: \"\"\n };\n \nbreak;\ncase 34: case 35:\n\n this.$ = { stmt: 'classDef', id: $$[$0-1].trim(), classes: $$[$0].trim() };\n \nbreak;\ncase 36:\n\n this.$ = { stmt: 'style', id: $$[$0-1].trim(), styleClass: $$[$0].trim() };\n \nbreak;\ncase 37:\n\n //console.log('apply class: id(s): ',$$[$0-1], ' style class: ', $$[$0]);\n this.$={ stmt: 'applyClass', id: $$[$0-1].trim(), styleClass: $$[$0].trim() };\n \nbreak;\ncase 38:\n yy.setDirection('TB');this.$={stmt:'dir', value:'TB'};\nbreak;\ncase 39:\n yy.setDirection('BT');this.$={stmt:'dir', value:'BT'};\nbreak;\ncase 40:\n yy.setDirection('RL'); this.$={stmt:'dir', value:'RL'};\nbreak;\ncase 41:\n yy.setDirection('LR');this.$={stmt:'dir', value:'LR'};\nbreak;\ncase 44: case 45:\n /* console.log('idStatement id: ', $$[$0]); */\n this.$={ stmt: 'state', id: $$[$0].trim(), type: 'default', description: '' };\n \nbreak;\ncase 46:\n /*console.log('idStatement ID STYLE_SEPARATOR ID'); */\n this.$={ stmt: 'state', id: $$[$0-2].trim(), classes: [$$[$0].trim()], type: 'default', description: '' };\n \nbreak;\ncase 47:\n /*console.log('idStatement EDGE_STATE STYLE_SEPARATOR ID'); */\n this.$={ stmt: 'state', id: $$[$0-2].trim(), classes: [$$[$0].trim()], type: 'default', description: '' };\n \nbreak;\n}\n},\ntable: [{3:1,4:$V0,5:$V1,6:$V2},{1:[3]},{3:5,4:$V0,5:$V1,6:$V2},{3:6,4:$V0,5:$V1,6:$V2},o([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],$V3,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:$V4,5:$V5,8:8,9:10,10:12,11:13,12:14,13:15,16:$V6,17:$V7,19:$V8,22:$V9,24:$Va,25:$Vb,26:$Vc,27:$Vd,28:$Ve,29:$Vf,32:25,33:$Vg,35:$Vh,37:$Vi,38:$Vj,41:$Vk,45:$Vl,48:$Vm,51:$Vn,52:$Vo,53:$Vp,54:$Vq,57:$Vr},o($Vs,[2,5]),{9:39,10:12,11:13,12:14,13:15,16:$V6,17:$V7,19:$V8,22:$V9,24:$Va,25:$Vb,26:$Vc,27:$Vd,28:$Ve,29:$Vf,32:25,33:$Vg,35:$Vh,37:$Vi,38:$Vj,41:$Vk,45:$Vl,48:$Vm,51:$Vn,52:$Vo,53:$Vp,54:$Vq,57:$Vr},o($Vs,[2,7]),o($Vs,[2,8]),o($Vs,[2,9]),o($Vs,[2,10]),o($Vs,[2,11]),o($Vs,[2,12],{14:[1,40],15:[1,41]}),o($Vs,[2,16]),{18:[1,42]},o($Vs,[2,18],{20:[1,43]}),{23:[1,44]},o($Vs,[2,22]),o($Vs,[2,23]),o($Vs,[2,24]),o($Vs,[2,25]),{30:45,31:[1,46],59:[1,47],60:[1,48]},o($Vs,[2,28]),{34:[1,49]},{36:[1,50]},o($Vs,[2,31]),{13:51,24:$Va,57:$Vr},{42:[1,52],44:[1,53]},{46:[1,54]},{49:[1,55]},o($Vt,[2,44],{58:[1,56]}),o($Vt,[2,45],{58:[1,57]}),o($Vs,[2,38]),o($Vs,[2,39]),o($Vs,[2,40]),o($Vs,[2,41]),o($Vs,[2,6]),o($Vs,[2,13]),{13:58,24:$Va,57:$Vr},o($Vs,[2,17]),o($Vu,$V3,{7:59}),{24:[1,60]},{24:[1,61]},{23:[1,62]},{24:[2,48]},{24:[2,49]},o($Vs,[2,29]),o($Vs,[2,30]),{39:[1,63],40:[1,64]},{43:[1,65]},{43:[1,66]},{47:[1,67]},{50:[1,68]},{24:[1,69]},{24:[1,70]},o($Vs,[2,14],{14:[1,71]}),{4:$V4,5:$V5,8:8,9:10,10:12,11:13,12:14,13:15,16:$V6,17:$V7,19:$V8,21:[1,72],22:$V9,24:$Va,25:$Vb,26:$Vc,27:$Vd,28:$Ve,29:$Vf,32:25,33:$Vg,35:$Vh,37:$Vi,38:$Vj,41:$Vk,45:$Vl,48:$Vm,51:$Vn,52:$Vo,53:$Vp,54:$Vq,57:$Vr},o($Vs,[2,20],{20:[1,73]}),{31:[1,74]},{24:[1,75]},{39:[1,76]},{39:[1,77]},o($Vs,[2,34]),o($Vs,[2,35]),o($Vs,[2,36]),o($Vs,[2,37]),o($Vt,[2,46]),o($Vt,[2,47]),o($Vs,[2,15]),o($Vs,[2,19]),o($Vu,$V3,{7:78}),o($Vs,[2,26]),o($Vs,[2,27]),{5:[1,79]},{5:[1,80]},{4:$V4,5:$V5,8:8,9:10,10:12,11:13,12:14,13:15,16:$V6,17:$V7,19:$V8,21:[1,81],22:$V9,24:$Va,25:$Vb,26:$Vc,27:$Vd,28:$Ve,29:$Vf,32:25,33:$Vg,35:$Vh,37:$Vi,38:$Vj,41:$Vk,45:$Vl,48:$Vm,51:$Vn,52:$Vo,53:$Vp,54:$Vq,57:$Vr},o($Vs,[2,32]),o($Vs,[2,33]),o($Vs,[2,21])],\ndefaultActions: {5:[2,1],6:[2,2],47:[2,48],48:[2,49]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 38;\nbreak;\ncase 1:return 40;\nbreak;\ncase 2:return 39; \nbreak;\ncase 3:return 44;\nbreak;\ncase 4:return 51;\nbreak;\ncase 5:return 52;\nbreak;\ncase 6:return 53;\nbreak;\ncase 7:return 54;\nbreak;\ncase 8:/* skip comments */\nbreak;\ncase 9:/* skip comments */{ /*console.log('Crap after close');*/ }\nbreak;\ncase 10:return 5;\nbreak;\ncase 11:/* skip all whitespace */\nbreak;\ncase 12:/* skip same-line whitespace */\nbreak;\ncase 13:/* skip comments */\nbreak;\ncase 14:/* skip comments */\nbreak;\ncase 15: this.pushState('SCALE'); /* console.log('Got scale', yy_.yytext);*/ return 17; \nbreak;\ncase 16:return 18;\nbreak;\ncase 17: this.popState(); \nbreak;\ncase 18: this.begin(\"acc_title\");return 33; \nbreak;\ncase 19: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 20: this.begin(\"acc_descr\");return 35; \nbreak;\ncase 21: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 22: this.begin(\"acc_descr_multiline\"); \nbreak;\ncase 23: this.popState(); \nbreak;\ncase 24:return \"acc_descr_multiline_value\";\nbreak;\ncase 25: this.pushState('CLASSDEF'); return 41; \nbreak;\ncase 26: this.popState(); this.pushState('CLASSDEFID'); return 'DEFAULT_CLASSDEF_ID' \nbreak;\ncase 27: this.popState(); this.pushState('CLASSDEFID'); return 42 \nbreak;\ncase 28: this.popState(); return 43 \nbreak;\ncase 29: this.pushState('CLASS'); return 48; \nbreak;\ncase 30: this.popState(); this.pushState('CLASS_STYLE'); return 49 \nbreak;\ncase 31: this.popState(); return 50 \nbreak;\ncase 32: this.pushState('STYLE'); return 45; \nbreak;\ncase 33: this.popState(); this.pushState('STYLEDEF_STYLES'); return 46 \nbreak;\ncase 34: this.popState(); return 47 \nbreak;\ncase 35: this.pushState('SCALE'); /* console.log('Got scale', yy_.yytext);*/ return 17; \nbreak;\ncase 36:return 18;\nbreak;\ncase 37:this.popState();\nbreak;\ncase 38: /* console.log('Starting STATE '); */ this.pushState('STATE'); \nbreak;\ncase 39:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim(); /*console.warn('Fork Fork: ',yy_.yytext);*/return 25;\nbreak;\ncase 40:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 26;\nbreak;\ncase 41:this.popState();yy_.yytext=yy_.yytext.slice(0,-10).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 27;\nbreak;\ncase 42:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Fork: ',yy_.yytext);*/return 25;\nbreak;\ncase 43:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 26;\nbreak;\ncase 44:this.popState();yy_.yytext=yy_.yytext.slice(0,-10).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 27;\nbreak;\ncase 45: return 51;\nbreak;\ncase 46: return 52;\nbreak;\ncase 47: return 53;\nbreak;\ncase 48: return 54;\nbreak;\ncase 49: /* console.log('Starting STATE_STRING'); */ this.pushState(\"STATE_STRING\"); \nbreak;\ncase 50: this.pushState('STATE_ID'); /* console.log('pushState(STATE_ID)'); */ return \"AS\"; \nbreak;\ncase 51: this.popState(); /* console.log('STATE_ID', yy_.yytext); */ return \"ID\"; \nbreak;\ncase 52: this.popState(); \nbreak;\ncase 53: /* console.log('Long description:', yy_.yytext); */ return \"STATE_DESCR\"; \nbreak;\ncase 54: /* console.log('COMPOSIT_STATE', yy_.yytext); */ return 19; \nbreak;\ncase 55: this.popState(); \nbreak;\ncase 56: this.popState(); this.pushState('struct'); /* console.log('begin struct', yy_.yytext); */ return 20; \nbreak;\ncase 57:/* skip comments inside state*/\nbreak;\ncase 58: /*console.log('Ending struct');*/ this.popState(); return 21;\nbreak;\ncase 59:/* nothing */\nbreak;\ncase 60: this.begin('NOTE'); return 29; \nbreak;\ncase 61: this.popState(); this.pushState('NOTE_ID'); return 59; \nbreak;\ncase 62: this.popState(); this.pushState('NOTE_ID'); return 60; \nbreak;\ncase 63: this.popState(); this.pushState('FLOATING_NOTE'); \nbreak;\ncase 64: this.popState(); this.pushState('FLOATING_NOTE_ID'); return \"AS\"; \nbreak;\ncase 65:/**/\nbreak;\ncase 66: /* console.log('Floating note text: ', yy_.yytext); */ return \"NOTE_TEXT\"; \nbreak;\ncase 67: this.popState(); /* console.log('Floating note ID', yy_.yytext);*/ return \"ID\"; \nbreak;\ncase 68: this.popState(); this.pushState('NOTE_TEXT'); /*console.log('Got ID for note', yy_.yytext);*/ return 24; \nbreak;\ncase 69: this.popState(); /* console.log('Got NOTE_TEXT for note',yy_.yytext);*/yy_.yytext = yy_.yytext.substr(2).trim(); return 31; \nbreak;\ncase 70: this.popState(); /* console.log('Got NOTE_TEXT for note',yy_.yytext);*/yy_.yytext = yy_.yytext.slice(0,-8).trim(); return 31; \nbreak;\ncase 71: /* console.log('Got state diagram', yy_.yytext,'#'); */ return 6; \nbreak;\ncase 72: /* console.log('Got state diagram', yy_.yytext,'#'); */ return 6; \nbreak;\ncase 73: /* console.log('HIDE_EMPTY', yy_.yytext,'#'); */ return 16; \nbreak;\ncase 74: /* console.log('EDGE_STATE=',yy_.yytext); */ return 57; \nbreak;\ncase 75: /* console.log('=>ID=',yy_.yytext); */ return 24; \nbreak;\ncase 76: yy_.yytext = yy_.yytext.trim(); /* console.log('Descr = ', yy_.yytext); */ return 14; \nbreak;\ncase 77:return 15;\nbreak;\ncase 78:return 28;\nbreak;\ncase 79:return 58;\nbreak;\ncase 80:return 5;\nbreak;\ncase 81:return 'INVALID';\nbreak;\n}\n},\nrules: [/^(?:click\\b)/i,/^(?:href\\b)/i,/^(?:\"[^\"]*\")/i,/^(?:default\\b)/i,/^(?:.*direction\\s+TB[^\\n]*)/i,/^(?:.*direction\\s+BT[^\\n]*)/i,/^(?:.*direction\\s+RL[^\\n]*)/i,/^(?:.*direction\\s+LR[^\\n]*)/i,/^(?:%%(?!\\{)[^\\n]*)/i,/^(?:[^\\}]%%[^\\n]*)/i,/^(?:[\\n]+)/i,/^(?:[\\s]+)/i,/^(?:((?!\\n)\\s)+)/i,/^(?:#[^\\n]*)/i,/^(?:%[^\\n]*)/i,/^(?:scale\\s+)/i,/^(?:\\d+)/i,/^(?:\\s+width\\b)/i,/^(?:accTitle\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*\\{\\s*)/i,/^(?:[\\}])/i,/^(?:[^\\}]*)/i,/^(?:classDef\\s+)/i,/^(?:DEFAULT\\s+)/i,/^(?:\\w+\\s+)/i,/^(?:[^\\n]*)/i,/^(?:class\\s+)/i,/^(?:(\\w+)+((,\\s*\\w+)*))/i,/^(?:[^\\n]*)/i,/^(?:style\\s+)/i,/^(?:[\\w,]+\\s+)/i,/^(?:[^\\n]*)/i,/^(?:scale\\s+)/i,/^(?:\\d+)/i,/^(?:\\s+width\\b)/i,/^(?:state\\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\\[\\[fork\\]\\])/i,/^(?:.*\\[\\[join\\]\\])/i,/^(?:.*\\[\\[choice\\]\\])/i,/^(?:.*direction\\s+TB[^\\n]*)/i,/^(?:.*direction\\s+BT[^\\n]*)/i,/^(?:.*direction\\s+RL[^\\n]*)/i,/^(?:.*direction\\s+LR[^\\n]*)/i,/^(?:[\"])/i,/^(?:\\s*as\\s+)/i,/^(?:[^\\n\\{]*)/i,/^(?:[\"])/i,/^(?:[^\"]*)/i,/^(?:[^\\n\\s\\{]+)/i,/^(?:\\n)/i,/^(?:\\{)/i,/^(?:%%(?!\\{)[^\\n]*)/i,/^(?:\\})/i,/^(?:[\\n])/i,/^(?:note\\s+)/i,/^(?:left of\\b)/i,/^(?:right of\\b)/i,/^(?:\")/i,/^(?:\\s*as\\s*)/i,/^(?:[\"])/i,/^(?:[^\"]*)/i,/^(?:[^\\n]*)/i,/^(?:\\s*[^:\\n\\s\\-]+)/i,/^(?:\\s*:[^:\\n;]+)/i,/^(?:[\\s\\S]*?end note\\b)/i,/^(?:stateDiagram\\s+)/i,/^(?:stateDiagram-v2\\s+)/i,/^(?:hide empty description\\b)/i,/^(?:\\[\\*\\])/i,/^(?:[^:\\n\\s\\-\\{]+)/i,/^(?:\\s*:[^:\\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],\nconditions: {\"LINE\":{\"rules\":[12,13],\"inclusive\":false},\"struct\":{\"rules\":[12,13,25,29,32,38,45,46,47,48,57,58,59,60,74,75,76,77,78],\"inclusive\":false},\"FLOATING_NOTE_ID\":{\"rules\":[67],\"inclusive\":false},\"FLOATING_NOTE\":{\"rules\":[64,65,66],\"inclusive\":false},\"NOTE_TEXT\":{\"rules\":[69,70],\"inclusive\":false},\"NOTE_ID\":{\"rules\":[68],\"inclusive\":false},\"NOTE\":{\"rules\":[61,62,63],\"inclusive\":false},\"STYLEDEF_STYLEOPTS\":{\"rules\":[],\"inclusive\":false},\"STYLEDEF_STYLES\":{\"rules\":[34],\"inclusive\":false},\"STYLE_IDS\":{\"rules\":[],\"inclusive\":false},\"STYLE\":{\"rules\":[33],\"inclusive\":false},\"CLASS_STYLE\":{\"rules\":[31],\"inclusive\":false},\"CLASS\":{\"rules\":[30],\"inclusive\":false},\"CLASSDEFID\":{\"rules\":[28],\"inclusive\":false},\"CLASSDEF\":{\"rules\":[26,27],\"inclusive\":false},\"acc_descr_multiline\":{\"rules\":[23,24],\"inclusive\":false},\"acc_descr\":{\"rules\":[21],\"inclusive\":false},\"acc_title\":{\"rules\":[19],\"inclusive\":false},\"SCALE\":{\"rules\":[16,17,36,37],\"inclusive\":false},\"ALIAS\":{\"rules\":[],\"inclusive\":false},\"STATE_ID\":{\"rules\":[51],\"inclusive\":false},\"STATE_STRING\":{\"rules\":[52,53],\"inclusive\":false},\"FORK_STATE\":{\"rules\":[],\"inclusive\":false},\"STATE\":{\"rules\":[12,13,39,40,41,42,43,44,49,50,54,55,56],\"inclusive\":false},\"ID\":{\"rules\":[12,13],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,18,20,22,25,29,32,35,38,56,60,71,72,73,74,75,76,77,79,80,81],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "/**\n * Constants common to all State Diagram code\n */\n\n// default diagram direction\nexport const DEFAULT_DIAGRAM_DIRECTION = 'TB';\n\n// default direction for any nested documents (composites)\nexport const DEFAULT_NESTED_DOC_DIR = 'TB';\n\n// parsed statement type for a direction\nexport const STMT_DIRECTION = 'dir';\n\n// parsed statement type for a state\nexport const STMT_STATE = 'state';\n\n// parsed statement type for a root\nexport const STMT_ROOT = 'root';\n\n// parsed statement type for a relation\nexport const STMT_RELATION = 'relation';\n// parsed statement type for a classDef\nexport const STMT_CLASSDEF = 'classDef';\nexport const STMT_STYLEDEF = 'style';\n// parsed statement type for applyClass\nexport const STMT_APPLYCLASS = 'applyClass';\n\nexport const DEFAULT_STATE_TYPE = 'default';\nexport const DIVIDER_TYPE = 'divider';\n\n// Graph edge settings\nexport const G_EDGE_STYLE = 'fill:none';\nexport const G_EDGE_ARROWHEADSTYLE = 'fill: #333';\nexport const G_EDGE_LABELPOS = 'c';\nexport const G_EDGE_LABELTYPE = 'text';\nexport const G_EDGE_THICKNESS = 'normal';\n\nexport const SHAPE_STATE = 'rect';\nexport const SHAPE_STATE_WITH_DESC = 'rectWithTitle';\nexport const SHAPE_START = 'stateStart';\nexport const SHAPE_END = 'stateEnd';\nexport const SHAPE_DIVIDER = 'divider';\nexport const SHAPE_GROUP = 'roundedWithTitle';\nexport const SHAPE_NOTE = 'note';\nexport const SHAPE_NOTEGROUP = 'noteGroup';\n\n// CSS classes\nexport const CSS_DIAGRAM = 'statediagram';\nexport const CSS_STATE = 'state';\nexport const CSS_DIAGRAM_STATE = `${CSS_DIAGRAM}-${CSS_STATE}`;\nexport const CSS_EDGE = 'transition';\nexport const CSS_NOTE = 'note';\nexport const CSS_NOTE_EDGE = 'note-edge';\nexport const CSS_EDGE_NOTE_EDGE = `${CSS_EDGE} ${CSS_NOTE_EDGE}`;\nexport const CSS_DIAGRAM_NOTE = `${CSS_DIAGRAM}-${CSS_NOTE}`;\nexport const CSS_CLUSTER = 'cluster';\nexport const CSS_DIAGRAM_CLUSTER = `${CSS_DIAGRAM}-${CSS_CLUSTER}`;\nexport const CSS_CLUSTER_ALT = 'cluster-alt';\nexport const CSS_DIAGRAM_CLUSTER_ALT = `${CSS_DIAGRAM}-${CSS_CLUSTER_ALT}`;\n\nexport const PARENT = 'parent';\nexport const NOTE = 'note';\nexport const DOMID_STATE = 'state';\nexport const DOMID_TYPE_SPACER = '----';\nexport const NOTE_ID = `${DOMID_TYPE_SPACER}${NOTE}`;\nexport const PARENT_ID = `${DOMID_TYPE_SPACER}${PARENT}`;\n// --------------------------------------\n\nexport default {\n DEFAULT_DIAGRAM_DIRECTION,\n DEFAULT_NESTED_DOC_DIR,\n STMT_STATE,\n STMT_RELATION,\n STMT_CLASSDEF,\n STMT_STYLEDEF,\n STMT_APPLYCLASS,\n DEFAULT_STATE_TYPE,\n DIVIDER_TYPE,\n G_EDGE_STYLE,\n G_EDGE_ARROWHEADSTYLE,\n G_EDGE_LABELPOS,\n G_EDGE_LABELTYPE,\n G_EDGE_THICKNESS,\n CSS_EDGE,\n CSS_DIAGRAM,\n SHAPE_STATE,\n SHAPE_STATE_WITH_DESC,\n SHAPE_START,\n SHAPE_END,\n SHAPE_DIVIDER,\n SHAPE_GROUP,\n SHAPE_NOTE,\n SHAPE_NOTEGROUP,\n CSS_STATE,\n CSS_DIAGRAM_STATE,\n CSS_NOTE,\n CSS_NOTE_EDGE,\n CSS_EDGE_NOTE_EDGE,\n CSS_DIAGRAM_NOTE,\n CSS_CLUSTER,\n CSS_DIAGRAM_CLUSTER,\n CSS_CLUSTER_ALT,\n CSS_DIAGRAM_CLUSTER_ALT,\n PARENT,\n NOTE,\n DOMID_STATE,\n DOMID_TYPE_SPACER,\n NOTE_ID,\n PARENT_ID,\n};\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport type { DiagramStyleClassDef } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { getDiagramElement } from '../../rendering-util/insertElementsForSize.js';\nimport { render } from '../../rendering-util/render.js';\nimport { setupViewPortForSVG } from '../../rendering-util/setupViewPortForSVG.js';\nimport type { LayoutData } from '../../rendering-util/types.js';\nimport utils from '../../utils.js';\nimport { CSS_DIAGRAM, DEFAULT_NESTED_DOC_DIR } from './stateCommon.js';\n\n/**\n * Get the direction from the statement items.\n * Look through all of the documents (docs) in the parsedItems\n * Because is a _document_ direction, the default direction is not necessarily the same as the overall default _diagram_ direction.\n * @param parsedItem - the parsed statement item to look through\n * @param defaultDir - the direction to use if none is found\n * @returns The direction to use\n */\nexport const getDir = (parsedItem: any, defaultDir = DEFAULT_NESTED_DOC_DIR) => {\n if (!parsedItem.doc) {\n return defaultDir;\n }\n\n let dir = defaultDir;\n\n for (const parsedItemDoc of parsedItem.doc) {\n if (parsedItemDoc.stmt === 'dir') {\n dir = parsedItemDoc.value;\n }\n }\n\n return dir;\n};\n\nexport const getClasses = function (\n text: string,\n diagramObj: any\n): Map {\n return diagramObj.db.getClasses();\n};\n\nexport const draw = async function (text: string, id: string, _version: string, diag: any) {\n log.info('REF0:');\n log.info('Drawing state diagram (v2)', id);\n const { securityLevel, state: conf, layout } = getConfig();\n // Extracting the data from the parsed structure into a more usable form\n // Not related to the refactoring, but this is the first step in the rendering process\n diag.db.extract(diag.db.getRootDocV2());\n\n //const DIR = getDir(diag.db.getRootDocV2());\n\n // The getData method provided in all supported diagrams is used to extract the data from the parsed structure\n // into the Layout data format\n const data4Layout = diag.db.getData() as LayoutData;\n\n // Create the root SVG - the element is the div containing the SVG element\n const svg = getDiagramElement(id, securityLevel);\n\n data4Layout.type = diag.type;\n data4Layout.layoutAlgorithm = layout;\n\n // TODO: Should we move these two to baseConfig? These types are not there in StateConfig.\n\n data4Layout.nodeSpacing = conf?.nodeSpacing || 50;\n data4Layout.rankSpacing = conf?.rankSpacing || 50;\n data4Layout.markers = ['barb'];\n data4Layout.diagramId = id;\n // console.log('REF1:', data4Layout);\n await render(data4Layout, svg);\n const padding = 8;\n\n // Inject clickable links after nodes are rendered\n try {\n const links: Map =\n typeof diag.db.getLinks === 'function' ? diag.db.getLinks() : new Map();\n\n type StateKey = string | { id: string };\n\n links.forEach((linkInfo, key: StateKey) => {\n const stateId = typeof key === 'string' ? key : typeof key?.id === 'string' ? key.id : '';\n\n if (!stateId) {\n log.warn('\u26A0\uFE0F Invalid or missing stateId from key:', JSON.stringify(key));\n return;\n }\n\n const allNodes = svg.node()?.querySelectorAll('g');\n let matchedElem: SVGGElement | undefined;\n\n allNodes?.forEach((g: SVGGElement) => {\n const text = g.textContent?.trim();\n if (text === stateId) {\n matchedElem = g;\n }\n });\n\n if (!matchedElem) {\n log.warn('\u26A0\uFE0F Could not find node matching text:', stateId);\n return;\n }\n\n const parent = matchedElem.parentNode;\n if (!parent) {\n log.warn('\u26A0\uFE0F Node has no parent, cannot wrap:', stateId);\n return;\n }\n\n const a = document.createElementNS('http://www.w3.org/2000/svg', 'a');\n const cleanedUrl = linkInfo.url.replace(/^\"+|\"+$/g, ''); // remove leading/trailing quotes\n a.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', cleanedUrl);\n a.setAttribute('target', '_blank');\n if (linkInfo.tooltip) {\n const tooltip = linkInfo.tooltip.replace(/^\"+|\"+$/g, '');\n a.setAttribute('title', tooltip);\n }\n\n parent.replaceChild(a, matchedElem);\n a.appendChild(matchedElem);\n\n log.info('\uD83D\uDD17 Wrapped node in tag for:', stateId, linkInfo.url);\n });\n } catch (err) {\n log.error('\u274C Error injecting clickable links:', err);\n }\n\n utils.insertTitle(\n svg,\n 'statediagramTitleText',\n conf?.titleTopMargin ?? 25,\n diag.db.getDiagramTitle()\n );\n setupViewPortForSVG(svg, padding, CSS_DIAGRAM, conf?.useMaxWidth ?? true);\n};\n\nexport default {\n getClasses,\n draw,\n getDir,\n};\n", "import type { MermaidConfig } from '../../config.type.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { log } from '../../logger.js';\nimport common from '../common/common.js';\nimport {\n CSS_DIAGRAM_CLUSTER,\n CSS_DIAGRAM_CLUSTER_ALT,\n CSS_DIAGRAM_NOTE,\n CSS_DIAGRAM_STATE,\n CSS_EDGE,\n CSS_EDGE_NOTE_EDGE,\n DEFAULT_NESTED_DOC_DIR,\n DEFAULT_STATE_TYPE,\n DIVIDER_TYPE,\n DOMID_STATE,\n DOMID_TYPE_SPACER,\n G_EDGE_ARROWHEADSTYLE,\n G_EDGE_LABELPOS,\n G_EDGE_LABELTYPE,\n G_EDGE_STYLE,\n G_EDGE_THICKNESS,\n NOTE,\n NOTE_ID,\n PARENT,\n PARENT_ID,\n SHAPE_DIVIDER,\n SHAPE_END,\n SHAPE_GROUP,\n SHAPE_NOTE,\n SHAPE_NOTEGROUP,\n SHAPE_START,\n SHAPE_STATE,\n SHAPE_STATE_WITH_DESC,\n STMT_RELATION,\n STMT_STATE,\n} from './stateCommon.js';\nimport type { Edge, NodeData, StateStmt, Stmt, StyleClass } from './stateDb.js';\n\n// List of nodes created from the parsed diagram statement items\nconst nodeDb = new Map();\n\nlet graphItemCount = 0; // used to construct ids, etc.\n\n/**\n * Create a standard string for the dom ID of an item.\n * If a type is given, insert that before the counter, preceded by the type spacer\n *\n */\nexport function stateDomId(\n itemId = '',\n counter = 0,\n type: string | null = '',\n typeSpacer = DOMID_TYPE_SPACER\n) {\n const typeStr = type !== null && type.length > 0 ? `${typeSpacer}${type}` : '';\n return `${DOMID_STATE}-${itemId}${typeStr}-${counter}`;\n}\n\nconst setupDoc = (\n parentParsedItem: StateStmt | undefined,\n doc: Stmt[],\n diagramStates: Map,\n nodes: NodeData[],\n edges: Edge[],\n altFlag: boolean,\n look: MermaidConfig['look'],\n classes: Map\n) => {\n // graphItemCount = 0;\n log.trace('items', doc);\n doc.forEach((item) => {\n switch (item.stmt) {\n case STMT_STATE:\n dataFetcher(parentParsedItem, item, diagramStates, nodes, edges, altFlag, look, classes);\n break;\n case DEFAULT_STATE_TYPE:\n dataFetcher(parentParsedItem, item, diagramStates, nodes, edges, altFlag, look, classes);\n break;\n case STMT_RELATION:\n {\n dataFetcher(\n parentParsedItem,\n item.state1,\n diagramStates,\n nodes,\n edges,\n altFlag,\n look,\n classes\n );\n dataFetcher(\n parentParsedItem,\n item.state2,\n diagramStates,\n nodes,\n edges,\n altFlag,\n look,\n classes\n );\n const edgeData = {\n id: 'edge' + graphItemCount,\n start: item.state1.id,\n end: item.state2.id,\n arrowhead: 'normal',\n arrowTypeEnd: 'arrow_barb',\n style: G_EDGE_STYLE,\n labelStyle: '',\n label: common.sanitizeText(item.description ?? '', getConfig()),\n arrowheadStyle: G_EDGE_ARROWHEADSTYLE,\n labelpos: G_EDGE_LABELPOS,\n labelType: G_EDGE_LABELTYPE,\n thickness: G_EDGE_THICKNESS,\n classes: CSS_EDGE,\n look,\n };\n edges.push(edgeData);\n graphItemCount++;\n }\n break;\n }\n });\n};\n\n/**\n * Get the direction from the statement items.\n * Look through all of the documents (docs) in the parsedItems\n * Because is a _document_ direction, the default direction is not necessarily the same as the overall default _diagram_ direction.\n * @param parsedItem - the parsed statement item to look through\n * @param defaultDir - the direction to use if none is found\n */\nconst getDir = (parsedItem: { doc?: Stmt[] }, defaultDir = DEFAULT_NESTED_DOC_DIR) => {\n let dir = defaultDir;\n if (parsedItem.doc) {\n for (const parsedItemDoc of parsedItem.doc) {\n if (parsedItemDoc.stmt === 'dir') {\n dir = parsedItemDoc.value;\n }\n }\n }\n return dir;\n};\n\nfunction insertOrUpdateNode(\n nodes: NodeData[],\n nodeData: NodeData,\n classes: Map\n) {\n if (!nodeData.id || nodeData.id === '' || nodeData.id === '') {\n return;\n }\n\n //Populate node style attributes if nodeData has classes defined\n if (nodeData.cssClasses) {\n if (!Array.isArray(nodeData.cssCompiledStyles)) {\n nodeData.cssCompiledStyles = [];\n }\n\n nodeData.cssClasses.split(' ').forEach((cssClass) => {\n const classDef = classes.get(cssClass);\n if (classDef) {\n nodeData.cssCompiledStyles = [...(nodeData.cssCompiledStyles ?? []), ...classDef.styles];\n }\n });\n }\n const existingNodeData = nodes.find((node) => node.id === nodeData.id);\n if (existingNodeData) {\n //update the existing nodeData\n Object.assign(existingNodeData, nodeData);\n } else {\n nodes.push(nodeData);\n }\n}\n/**\n * Get classes from the db for the info item.\n * If there aren't any or if dbInfoItem isn't defined, return an empty string.\n * Else create 1 string from the list of classes found\n *\n */\nfunction getClassesFromDbInfo(dbInfoItem?: StateStmt): string {\n return dbInfoItem?.classes?.join(' ') ?? '';\n}\n\nfunction getStylesFromDbInfo(dbInfoItem?: StateStmt): string[] {\n return dbInfoItem?.styles ?? [];\n}\n\nexport const dataFetcher = (\n parent: StateStmt | undefined,\n parsedItem: StateStmt,\n diagramStates: Map,\n nodes: NodeData[],\n edges: Edge[],\n altFlag: boolean,\n look: MermaidConfig['look'],\n classes: Map\n) => {\n const itemId = parsedItem.id;\n const dbState = diagramStates.get(itemId);\n const classStr = getClassesFromDbInfo(dbState);\n const style = getStylesFromDbInfo(dbState);\n const config = getConfig();\n\n log.info('dataFetcher parsedItem', parsedItem, dbState, style);\n\n if (itemId !== 'root') {\n let shape = SHAPE_STATE;\n // The if === true / false can be removed if we can guarantee that the parsedItem.start is always a boolean\n if (parsedItem.start === true) {\n shape = SHAPE_START;\n } else if (parsedItem.start === false) {\n shape = SHAPE_END;\n }\n if (parsedItem.type !== DEFAULT_STATE_TYPE) {\n shape = parsedItem.type;\n }\n\n // Add the node to our list (nodeDb)\n if (!nodeDb.get(itemId)) {\n nodeDb.set(itemId, {\n id: itemId,\n shape,\n description: common.sanitizeText(itemId, config),\n cssClasses: `${classStr} ${CSS_DIAGRAM_STATE}`,\n cssStyles: style,\n });\n }\n\n const newNode = nodeDb.get(itemId)!;\n\n // Save data for description and group so that for instance a statement without description overwrites\n // one with description @todo TODO What does this mean? If important, add a test for it\n\n // Build of the array of description strings\n if (parsedItem.description) {\n if (Array.isArray(newNode.description)) {\n // There already is an array of strings,add to it\n newNode.shape = SHAPE_STATE_WITH_DESC;\n newNode.description.push(parsedItem.description);\n } else {\n if (newNode.description?.length && newNode.description.length > 0) {\n // if there is a description already transform it to an array\n newNode.shape = SHAPE_STATE_WITH_DESC;\n if (newNode.description === itemId) {\n // If the previous description was this, remove it\n newNode.description = [parsedItem.description];\n } else {\n newNode.description = [newNode.description, parsedItem.description];\n }\n } else {\n newNode.shape = SHAPE_STATE;\n newNode.description = parsedItem.description;\n }\n }\n newNode.description = common.sanitizeTextOrArray(newNode.description, config);\n }\n\n // If there's only 1 description entry, just use a regular state shape\n if (newNode.description?.length === 1 && newNode.shape === SHAPE_STATE_WITH_DESC) {\n if (newNode.type === 'group') {\n newNode.shape = SHAPE_GROUP;\n } else {\n newNode.shape = SHAPE_STATE;\n }\n }\n\n // group\n if (!newNode.type && parsedItem.doc) {\n log.info('Setting cluster for XCX', itemId, getDir(parsedItem));\n newNode.type = 'group';\n newNode.isGroup = true;\n newNode.dir = getDir(parsedItem);\n newNode.shape = parsedItem.type === DIVIDER_TYPE ? SHAPE_DIVIDER : SHAPE_GROUP;\n newNode.cssClasses = `${newNode.cssClasses} ${CSS_DIAGRAM_CLUSTER} ${altFlag ? CSS_DIAGRAM_CLUSTER_ALT : ''}`;\n }\n\n // This is what will be added to the graph\n const nodeData: NodeData = {\n labelStyle: '',\n shape: newNode.shape,\n label: newNode.description,\n cssClasses: newNode.cssClasses,\n cssCompiledStyles: [],\n cssStyles: newNode.cssStyles,\n id: itemId,\n dir: newNode.dir,\n domId: stateDomId(itemId, graphItemCount),\n type: newNode.type,\n isGroup: newNode.type === 'group',\n padding: 8,\n rx: 10,\n ry: 10,\n look,\n };\n\n // Clear the label for dividers who have no description\n if (nodeData.shape === SHAPE_DIVIDER) {\n nodeData.label = '';\n }\n\n if (parent && parent.id !== 'root') {\n log.trace('Setting node ', itemId, ' to be child of its parent ', parent.id);\n nodeData.parentId = parent.id;\n }\n\n nodeData.centerLabel = true;\n\n if (parsedItem.note) {\n // Todo: set random id\n const noteData: NodeData = {\n labelStyle: '',\n shape: SHAPE_NOTE,\n label: parsedItem.note.text,\n cssClasses: CSS_DIAGRAM_NOTE,\n // useHtmlLabels: false,\n cssStyles: [],\n cssCompiledStyles: [],\n id: itemId + NOTE_ID + '-' + graphItemCount,\n domId: stateDomId(itemId, graphItemCount, NOTE),\n type: newNode.type,\n isGroup: newNode.type === 'group',\n padding: config.flowchart?.padding,\n look,\n position: parsedItem.note.position,\n };\n const parentNodeId = itemId + PARENT_ID;\n const groupData = {\n labelStyle: '',\n shape: SHAPE_NOTEGROUP,\n label: parsedItem.note.text,\n cssClasses: newNode.cssClasses,\n cssStyles: [],\n id: itemId + PARENT_ID,\n domId: stateDomId(itemId, graphItemCount, PARENT),\n type: 'group',\n isGroup: true,\n padding: 16, //getConfig().flowchart.padding\n look,\n position: parsedItem.note.position,\n };\n graphItemCount++;\n\n //add parent id to groupData\n groupData.id = parentNodeId;\n //add parent id to noteData\n noteData.parentId = parentNodeId;\n //nodeData.parentId = parentNodeId;\n\n //insert groupData\n insertOrUpdateNode(nodes, groupData, classes);\n //insert noteData\n insertOrUpdateNode(nodes, noteData, classes);\n //insert nodeData\n insertOrUpdateNode(nodes, nodeData, classes);\n\n let from = itemId;\n let to = noteData.id;\n\n if (parsedItem.note.position === 'left of') {\n from = noteData.id;\n to = itemId;\n }\n\n edges.push({\n id: from + '-' + to,\n start: from,\n end: to,\n arrowhead: 'none',\n arrowTypeEnd: '',\n style: G_EDGE_STYLE,\n labelStyle: '',\n classes: CSS_EDGE_NOTE_EDGE,\n arrowheadStyle: G_EDGE_ARROWHEADSTYLE,\n labelpos: G_EDGE_LABELPOS,\n labelType: G_EDGE_LABELTYPE,\n thickness: G_EDGE_THICKNESS,\n look,\n });\n } else {\n insertOrUpdateNode(nodes, nodeData, classes);\n }\n }\n if (parsedItem.doc) {\n log.trace('Adding nodes children ');\n setupDoc(parsedItem, parsedItem.doc, diagramStates, nodes, edges, !altFlag, look, classes);\n }\n};\n\nexport const reset = () => {\n nodeDb.clear();\n graphItemCount = 0;\n};\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { log } from '../../logger.js';\nimport { generateId } from '../../utils.js';\nimport common from '../common/common.js';\nimport {\n clear as commonClear,\n getAccDescription,\n getAccTitle,\n getDiagramTitle,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n} from '../common/commonDb.js';\nimport { dataFetcher, reset as resetDataFetcher } from './dataFetcher.js';\nimport { getDir } from './stateRenderer-v3-unified.js';\nimport {\n DEFAULT_DIAGRAM_DIRECTION,\n DEFAULT_STATE_TYPE,\n DIVIDER_TYPE,\n STMT_APPLYCLASS,\n STMT_CLASSDEF,\n STMT_RELATION,\n STMT_ROOT,\n STMT_DIRECTION,\n STMT_STATE,\n STMT_STYLEDEF,\n} from './stateCommon.js';\nimport type { MermaidConfig } from '../../config.type.js';\n\nconst CONSTANTS = {\n START_NODE: '[*]',\n START_TYPE: 'start',\n END_NODE: '[*]',\n END_TYPE: 'end',\n COLOR_KEYWORD: 'color',\n FILL_KEYWORD: 'fill',\n BG_FILL: 'bgFill',\n STYLECLASS_SEP: ',',\n} as const;\n\ninterface BaseStmt {\n stmt:\n | 'applyClass'\n | 'classDef'\n | 'dir'\n | 'relation'\n | 'state'\n | 'style'\n | 'root'\n | 'default'\n | 'click';\n}\n\ninterface ApplyClassStmt extends BaseStmt {\n stmt: 'applyClass';\n id: string;\n styleClass: string;\n}\n\ninterface ClassDefStmt extends BaseStmt {\n stmt: 'classDef';\n id: string;\n classes: string;\n}\n\ninterface DirectionStmt extends BaseStmt {\n stmt: 'dir';\n value: 'TB' | 'BT' | 'RL' | 'LR';\n}\n\ninterface RelationStmt extends BaseStmt {\n stmt: 'relation';\n state1: StateStmt;\n state2: StateStmt;\n description?: string;\n}\n\nexport interface StateStmt extends BaseStmt {\n stmt: 'state' | 'default';\n id: string;\n type: 'default' | 'fork' | 'join' | 'choice' | 'divider' | 'start' | 'end';\n description?: string;\n descriptions?: string[];\n doc?: Stmt[];\n note?: Note;\n start?: boolean;\n classes?: string[];\n styles?: string[];\n textStyles?: string[];\n}\n\ninterface StyleStmt extends BaseStmt {\n stmt: 'style';\n id: string;\n styleClass: string;\n}\n\nexport interface RootStmt {\n id: 'root';\n stmt: 'root';\n doc?: Stmt[];\n}\n\nexport interface ClickStmt extends BaseStmt {\n stmt: 'click';\n id: string;\n url: string;\n tooltip: string;\n}\n\ninterface Note {\n position?: 'left of' | 'right of';\n text: string;\n}\n\nexport type Stmt =\n | ApplyClassStmt\n | ClassDefStmt\n | DirectionStmt\n | RelationStmt\n | StateStmt\n | StyleStmt\n | RootStmt\n | ClickStmt;\n\ninterface DiagramEdge {\n id1: string;\n id2: string;\n relationTitle?: string;\n}\n\ninterface Document {\n relations: DiagramEdge[];\n states: Map;\n documents: Record;\n}\n\nexport interface StyleClass {\n id: string;\n styles: string[];\n textStyles: string[];\n}\n\nexport interface NodeData {\n labelStyle?: string;\n shape: string;\n label?: string | string[];\n cssClasses: string;\n cssCompiledStyles?: string[];\n cssStyles: string[];\n id: string;\n dir?: string;\n domId?: string;\n type?: string;\n isGroup?: boolean;\n padding?: number;\n rx?: number;\n ry?: number;\n look?: MermaidConfig['look'];\n parentId?: string;\n centerLabel?: boolean;\n position?: string;\n description?: string | string[];\n}\n\nexport interface Edge {\n id: string;\n start: string;\n end: string;\n arrowhead: string;\n arrowTypeEnd: string;\n style: string;\n labelStyle: string;\n label?: string;\n arrowheadStyle: string;\n labelpos: string;\n labelType: string;\n thickness: string;\n classes: string;\n look: MermaidConfig['look'];\n}\n\n/**\n * Returns a new list of classes.\n * In the future, this can be replaced with a class common to all diagrams.\n * ClassDef information = \\{ id: id, styles: [], textStyles: [] \\}\n */\nconst newClassesList = (): Map => new Map();\nconst newDoc = (): Document => ({\n relations: [],\n states: new Map(),\n documents: {},\n});\nconst clone = (o: T): T => JSON.parse(JSON.stringify(o));\n\nexport class StateDB {\n private nodes: NodeData[] = [];\n private edges: Edge[] = [];\n private rootDoc: Stmt[] = [];\n private classes = newClassesList();\n private documents = { root: newDoc() };\n private currentDocument = this.documents.root;\n private startEndCount = 0;\n private dividerCnt = 0;\n private links = new Map();\n\n static readonly relationType = {\n AGGREGATION: 0,\n EXTENSION: 1,\n COMPOSITION: 2,\n DEPENDENCY: 3,\n } as const;\n\n constructor(private version: 1 | 2) {\n this.clear();\n // Bind methods used by JISON\n this.setRootDoc = this.setRootDoc.bind(this);\n this.getDividerId = this.getDividerId.bind(this);\n this.setDirection = this.setDirection.bind(this);\n this.trimColon = this.trimColon.bind(this);\n }\n\n /**\n * Convert all of the statements (stmts) that were parsed into states and relationships.\n * This is done because a state diagram may have nested sections,\n * where each section is a 'document' and has its own set of statements.\n * Ex: the section within a fork has its own statements, and incoming and outgoing statements\n * refer to the fork as a whole (document).\n * See the parser grammar: the definition of a document is a document then a 'line', where a line can be a statement.\n * This will push the statement into the list of statements for the current document.\n */\n extract(statements: Stmt[] | { doc: Stmt[] }) {\n this.clear(true);\n for (const item of Array.isArray(statements) ? statements : statements.doc) {\n switch (item.stmt) {\n case STMT_STATE:\n this.addState(item.id.trim(), item.type, item.doc, item.description, item.note);\n break;\n case STMT_RELATION:\n this.addRelation(item.state1, item.state2, item.description);\n break;\n case STMT_CLASSDEF:\n this.addStyleClass(item.id.trim(), item.classes);\n break;\n case STMT_STYLEDEF:\n this.handleStyleDef(item);\n break;\n case STMT_APPLYCLASS:\n this.setCssClass(item.id.trim(), item.styleClass);\n break;\n case 'click':\n this.addLink(item.id, item.url, item.tooltip);\n break;\n }\n }\n const diagramStates = this.getStates();\n const config = getConfig();\n\n resetDataFetcher();\n dataFetcher(\n undefined,\n this.getRootDocV2() as StateStmt,\n diagramStates,\n this.nodes,\n this.edges,\n true,\n config.look,\n this.classes\n );\n\n // Process node labels\n for (const node of this.nodes) {\n if (!Array.isArray(node.label)) {\n continue;\n }\n\n node.description = node.label.slice(1);\n if (node.isGroup && node.description.length > 0) {\n throw new Error(\n `Group nodes can only have label. Remove the additional description for node [${node.id}]`\n );\n }\n node.label = node.label[0];\n }\n }\n\n private handleStyleDef(item: StyleStmt) {\n const ids = item.id.trim().split(',');\n const styles = item.styleClass.split(',');\n\n for (const id of ids) {\n let state = this.getState(id);\n if (!state) {\n const trimmedId = id.trim();\n this.addState(trimmedId);\n state = this.getState(trimmedId);\n }\n if (state) {\n state.styles = styles.map((s) => s.replace(/;/g, '')?.trim());\n }\n }\n }\n\n setRootDoc(o: Stmt[]) {\n log.info('Setting root doc', o);\n this.rootDoc = o;\n if (this.version === 1) {\n this.extract(o);\n } else {\n this.extract(this.getRootDocV2());\n }\n }\n\n docTranslator(parent: RootStmt | StateStmt, node: Stmt, first: boolean) {\n if (node.stmt === STMT_RELATION) {\n this.docTranslator(parent, node.state1, true);\n this.docTranslator(parent, node.state2, false);\n return;\n }\n\n if (node.stmt === STMT_STATE) {\n if (node.id === CONSTANTS.START_NODE) {\n node.id = parent.id + (first ? '_start' : '_end');\n node.start = first;\n } else {\n // This is just a plain state, not a start or end\n node.id = node.id.trim();\n }\n }\n\n if ((node.stmt !== STMT_ROOT && node.stmt !== STMT_STATE) || !node.doc) {\n return;\n }\n\n const doc = [];\n // Check for concurrency\n let currentDoc = [];\n for (const stmt of node.doc) {\n if ((stmt as StateStmt).type === DIVIDER_TYPE) {\n const newNode = clone(stmt as StateStmt);\n newNode.doc = clone(currentDoc);\n doc.push(newNode);\n currentDoc = [];\n } else {\n currentDoc.push(stmt);\n }\n }\n\n // If any divider was encountered\n if (doc.length > 0 && currentDoc.length > 0) {\n const newNode = {\n stmt: STMT_STATE,\n id: generateId(),\n type: 'divider',\n doc: clone(currentDoc),\n } satisfies StateStmt;\n doc.push(clone(newNode));\n node.doc = doc;\n }\n\n node.doc.forEach((docNode) => this.docTranslator(node, docNode, true));\n }\n\n private getRootDocV2() {\n this.docTranslator(\n { id: STMT_ROOT, stmt: STMT_ROOT },\n { id: STMT_ROOT, stmt: STMT_ROOT, doc: this.rootDoc },\n true\n );\n return { id: STMT_ROOT, doc: this.rootDoc };\n }\n\n /**\n * Function called by parser when a node definition has been found.\n *\n * @param descr - description for the state. Can be a string or a list or strings\n * @param classes - class styles to apply to this state. Can be a string (1 style) or an array of styles. If it's just 1 class, convert it to an array of that 1 class.\n * @param styles - styles to apply to this state. Can be a string (1 style) or an array of styles. If it's just 1 style, convert it to an array of that 1 style.\n * @param textStyles - text styles to apply to this state. Can be a string (1 text test) or an array of text styles. If it's just 1 text style, convert it to an array of that 1 text style.\n */\n addState(\n id: string,\n type: StateStmt['type'] = DEFAULT_STATE_TYPE,\n doc: Stmt[] | undefined = undefined,\n descr: string | string[] | undefined = undefined,\n note: Note | undefined = undefined,\n classes: string | string[] | undefined = undefined,\n styles: string | string[] | undefined = undefined,\n textStyles: string | string[] | undefined = undefined\n ) {\n const trimmedId = id?.trim();\n if (!this.currentDocument.states.has(trimmedId)) {\n log.info('Adding state ', trimmedId, descr);\n this.currentDocument.states.set(trimmedId, {\n stmt: STMT_STATE,\n id: trimmedId,\n descriptions: [],\n type,\n doc,\n note,\n classes: [],\n styles: [],\n textStyles: [],\n });\n } else {\n const state = this.currentDocument.states.get(trimmedId);\n if (!state) {\n throw new Error(`State not found: ${trimmedId}`);\n }\n if (!state.doc) {\n state.doc = doc;\n }\n if (!state.type) {\n state.type = type;\n }\n }\n\n if (descr) {\n log.info('Setting state description', trimmedId, descr);\n const descriptions = Array.isArray(descr) ? descr : [descr];\n descriptions.forEach((des) => this.addDescription(trimmedId, des.trim()));\n }\n\n if (note) {\n const doc2 = this.currentDocument.states.get(trimmedId);\n if (!doc2) {\n throw new Error(`State not found: ${trimmedId}`);\n }\n doc2.note = note;\n doc2.note.text = common.sanitizeText(doc2.note.text, getConfig());\n }\n\n if (classes) {\n log.info('Setting state classes', trimmedId, classes);\n const classesList = Array.isArray(classes) ? classes : [classes];\n classesList.forEach((cssClass) => this.setCssClass(trimmedId, cssClass.trim()));\n }\n\n if (styles) {\n log.info('Setting state styles', trimmedId, styles);\n const stylesList = Array.isArray(styles) ? styles : [styles];\n stylesList.forEach((style) => this.setStyle(trimmedId, style.trim()));\n }\n\n if (textStyles) {\n log.info('Setting state styles', trimmedId, styles);\n const textStylesList = Array.isArray(textStyles) ? textStyles : [textStyles];\n textStylesList.forEach((textStyle) => this.setTextStyle(trimmedId, textStyle.trim()));\n }\n }\n\n clear(saveCommon?: boolean) {\n this.nodes = [];\n this.edges = [];\n this.documents = { root: newDoc() };\n this.currentDocument = this.documents.root;\n\n // number of start and end nodes; used to construct ids\n this.startEndCount = 0;\n this.classes = newClassesList();\n if (!saveCommon) {\n this.links = new Map(); // <-- add here\n commonClear();\n }\n }\n\n getState(id: string) {\n return this.currentDocument.states.get(id);\n }\n\n getStates() {\n return this.currentDocument.states;\n }\n\n logDocuments() {\n log.info('Documents = ', this.documents);\n }\n\n getRelations() {\n return this.currentDocument.relations;\n }\n\n /**\n * Adds a clickable link to a state.\n */\n addLink(stateId: string, url: string, tooltip: string): void {\n this.links.set(stateId, { url, tooltip });\n log.warn('Adding link', stateId, url, tooltip);\n }\n\n /**\n * Get all registered links.\n */\n getLinks(): Map {\n return this.links;\n }\n\n /**\n * If the id is a start node ( [*] ), then return a new id constructed from\n * the start node name and the current start node count.\n * else return the given id\n */\n startIdIfNeeded(id = '') {\n if (id === CONSTANTS.START_NODE) {\n this.startEndCount++;\n return `${CONSTANTS.START_TYPE}${this.startEndCount}`;\n }\n return id;\n }\n\n /**\n * If the id is a start node ( [*] ), then return the start type ('start')\n * else return the given type\n */\n startTypeIfNeeded(id = '', type: StateStmt['type'] = DEFAULT_STATE_TYPE) {\n return id === CONSTANTS.START_NODE ? CONSTANTS.START_TYPE : type;\n }\n\n /**\n * If the id is an end node ( [*] ), then return a new id constructed from\n * the end node name and the current start_end node count.\n * else return the given id\n */\n endIdIfNeeded(id = '') {\n if (id === CONSTANTS.END_NODE) {\n this.startEndCount++;\n return `${CONSTANTS.END_TYPE}${this.startEndCount}`;\n }\n return id;\n }\n\n /**\n * If the id is an end node ( [*] ), then return the end type\n * else return the given type\n *\n */\n endTypeIfNeeded(id = '', type: StateStmt['type'] = DEFAULT_STATE_TYPE) {\n return id === CONSTANTS.END_NODE ? CONSTANTS.END_TYPE : type;\n }\n\n addRelationObjs(item1: StateStmt, item2: StateStmt, relationTitle = '') {\n const id1 = this.startIdIfNeeded(item1.id.trim());\n const type1 = this.startTypeIfNeeded(item1.id.trim(), item1.type);\n const id2 = this.startIdIfNeeded(item2.id.trim());\n const type2 = this.startTypeIfNeeded(item2.id.trim(), item2.type);\n this.addState(\n id1,\n type1,\n item1.doc,\n item1.description,\n item1.note,\n item1.classes,\n item1.styles,\n item1.textStyles\n );\n this.addState(\n id2,\n type2,\n item2.doc,\n item2.description,\n item2.note,\n item2.classes,\n item2.styles,\n item2.textStyles\n );\n this.currentDocument.relations.push({\n id1,\n id2,\n relationTitle: common.sanitizeText(relationTitle, getConfig()),\n });\n }\n\n /**\n * Add a relation between two items. The items may be full objects or just the string id of a state.\n */\n addRelation(item1: string | StateStmt, item2: string | StateStmt, title?: string) {\n if (typeof item1 === 'object' && typeof item2 === 'object') {\n this.addRelationObjs(item1, item2, title);\n } else if (typeof item1 === 'string' && typeof item2 === 'string') {\n const id1 = this.startIdIfNeeded(item1.trim());\n const type1 = this.startTypeIfNeeded(item1);\n const id2 = this.endIdIfNeeded(item2.trim());\n const type2 = this.endTypeIfNeeded(item2);\n\n this.addState(id1, type1);\n this.addState(id2, type2);\n this.currentDocument.relations.push({\n id1,\n id2,\n relationTitle: title ? common.sanitizeText(title, getConfig()) : undefined,\n });\n }\n }\n\n addDescription(id: string, descr: string) {\n const theState = this.currentDocument.states.get(id);\n const _descr = descr.startsWith(':') ? descr.replace(':', '').trim() : descr;\n theState?.descriptions?.push(common.sanitizeText(_descr, getConfig()));\n }\n\n cleanupLabel(label: string) {\n return label.startsWith(':') ? label.slice(2).trim() : label.trim();\n }\n\n getDividerId() {\n this.dividerCnt++;\n return `divider-id-${this.dividerCnt}`;\n }\n\n /**\n * Called when the parser comes across a (style) class definition\n * @example classDef my-style fill:#f96;\n *\n * @param id - the id of this (style) class\n * @param styleAttributes - the string with 1 or more style attributes (each separated by a comma)\n */\n addStyleClass(id: string, styleAttributes = '') {\n // create a new style class object with this id\n if (!this.classes.has(id)) {\n this.classes.set(id, { id, styles: [], textStyles: [] });\n }\n const foundClass = this.classes.get(id);\n if (styleAttributes && foundClass) {\n styleAttributes.split(CONSTANTS.STYLECLASS_SEP).forEach((attrib) => {\n const fixedAttrib = attrib.replace(/([^;]*);/, '$1').trim();\n if (RegExp(CONSTANTS.COLOR_KEYWORD).exec(attrib)) {\n const newStyle1 = fixedAttrib.replace(CONSTANTS.FILL_KEYWORD, CONSTANTS.BG_FILL);\n const newStyle2 = newStyle1.replace(CONSTANTS.COLOR_KEYWORD, CONSTANTS.FILL_KEYWORD);\n foundClass.textStyles.push(newStyle2);\n }\n foundClass.styles.push(fixedAttrib);\n });\n }\n }\n\n getClasses() {\n return this.classes;\n }\n\n /**\n * Add a (style) class or css class to a state with the given id.\n * If the state isn't already in the list of known states, add it.\n * Might be called by parser when a style class or CSS class should be applied to a state\n *\n * @param itemIds - The id or a list of ids of the item(s) to apply the css class to\n * @param cssClassName - CSS class name\n */\n setCssClass(itemIds: string, cssClassName: string) {\n itemIds.split(',').forEach((id) => {\n let foundState = this.getState(id);\n if (!foundState) {\n const trimmedId = id.trim();\n this.addState(trimmedId);\n foundState = this.getState(trimmedId);\n }\n foundState?.classes?.push(cssClassName);\n });\n }\n\n /**\n * Add a style to a state with the given id.\n * @example style stateId fill:#f9f,stroke:#333,stroke-width:4px\n * where 'style' is the keyword\n * stateId is the id of a state\n * the rest of the string is the styleText (all of the attributes to be applied to the state)\n *\n * @param itemId - The id of item to apply the style to\n * @param styleText - the text of the attributes for the style\n */\n setStyle(itemId: string, styleText: string) {\n this.getState(itemId)?.styles?.push(styleText);\n }\n\n /**\n * Add a text style to a state with the given id\n *\n * @param itemId - The id of item to apply the css class to\n * @param cssClassName - CSS class name\n */\n setTextStyle(itemId: string, cssClassName: string) {\n this.getState(itemId)?.textStyles?.push(cssClassName);\n }\n\n /**\n * Finds the direction statement in the root document.\n * @returns the direction statement if present\n */\n private getDirectionStatement() {\n return this.rootDoc.find((doc): doc is DirectionStmt => doc.stmt === STMT_DIRECTION);\n }\n\n getDirection() {\n return this.getDirectionStatement()?.value ?? DEFAULT_DIAGRAM_DIRECTION;\n }\n\n setDirection(dir: DirectionStmt['value']) {\n const doc = this.getDirectionStatement();\n if (doc) {\n doc.value = dir;\n } else {\n this.rootDoc.unshift({ stmt: STMT_DIRECTION, value: dir });\n }\n }\n\n trimColon(str: string) {\n return str.startsWith(':') ? str.slice(1).trim() : str.trim();\n }\n\n getData() {\n const config = getConfig();\n return {\n nodes: this.nodes,\n edges: this.edges,\n other: {},\n config,\n direction: getDir(this.getRootDocV2()),\n };\n }\n\n getConfig() {\n return getConfig().state;\n }\n\n getAccTitle = getAccTitle;\n setAccTitle = setAccTitle;\n getAccDescription = getAccDescription;\n setAccDescription = setAccDescription;\n setDiagramTitle = setDiagramTitle;\n getDiagramTitle = getDiagramTitle;\n}\n", "const getStyles = (options) =>\n `\ndefs #statediagram-barbEnd {\n fill: ${options.transitionColor};\n stroke: ${options.transitionColor};\n }\ng.stateGroup text {\n fill: ${options.nodeBorder};\n stroke: none;\n font-size: 10px;\n}\ng.stateGroup text {\n fill: ${options.textColor};\n stroke: none;\n font-size: 10px;\n\n}\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: ${options.stateLabelColor};\n}\n\ng.stateGroup rect {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n}\n\ng.stateGroup line {\n stroke: ${options.lineColor};\n stroke-width: 1;\n}\n\n.transition {\n stroke: ${options.transitionColor};\n stroke-width: 1;\n fill: none;\n}\n\n.stateGroup .composit {\n fill: ${options.background};\n border-bottom: 1px\n}\n\n.stateGroup .alt-composit {\n fill: #e0e0e0;\n border-bottom: 1px\n}\n\n.state-note {\n stroke: ${options.noteBorderColor};\n fill: ${options.noteBkgColor};\n\n text {\n fill: ${options.noteTextColor};\n stroke: none;\n font-size: 10px;\n }\n}\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${options.mainBkg};\n opacity: 0.5;\n}\n\n.edgeLabel .label rect {\n fill: ${options.labelBackgroundColor};\n opacity: 0.5;\n}\n.edgeLabel {\n background-color: ${options.edgeLabelBackground};\n p {\n background-color: ${options.edgeLabelBackground};\n }\n rect {\n opacity: 0.5;\n background-color: ${options.edgeLabelBackground};\n fill: ${options.edgeLabelBackground};\n }\n text-align: center;\n}\n.edgeLabel .label text {\n fill: ${options.transitionLabelColor || options.tertiaryTextColor};\n}\n.label div .edgeLabel {\n color: ${options.transitionLabelColor || options.tertiaryTextColor};\n}\n\n.stateLabel text {\n fill: ${options.stateLabelColor};\n font-size: 10px;\n font-weight: bold;\n}\n\n.node circle.state-start {\n fill: ${options.specialStateColor};\n stroke: ${options.specialStateColor};\n}\n\n.node .fork-join {\n fill: ${options.specialStateColor};\n stroke: ${options.specialStateColor};\n}\n\n.node circle.state-end {\n fill: ${options.innerEndBackground};\n stroke: ${options.background};\n stroke-width: 1.5\n}\n.end-state-inner {\n fill: ${options.compositeBackground || options.background};\n // stroke: ${options.background};\n stroke-width: 1.5\n}\n\n.node rect {\n fill: ${options.stateBkg || options.mainBkg};\n stroke: ${options.stateBorder || options.nodeBorder};\n stroke-width: 1px;\n}\n.node polygon {\n fill: ${options.mainBkg};\n stroke: ${options.stateBorder || options.nodeBorder};;\n stroke-width: 1px;\n}\n#statediagram-barbEnd {\n fill: ${options.lineColor};\n}\n\n.statediagram-cluster rect {\n fill: ${options.compositeTitleBackground};\n stroke: ${options.stateBorder || options.nodeBorder};\n stroke-width: 1px;\n}\n\n.cluster-label, .nodeLabel {\n color: ${options.stateLabelColor};\n // line-height: 1;\n}\n\n.statediagram-cluster rect.outer {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state .divider {\n stroke: ${options.stateBorder || options.nodeBorder};\n}\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-cluster.statediagram-cluster .inner {\n fill: ${options.compositeBackground || options.background};\n}\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: ${options.altBackground ? options.altBackground : '#efefef'};\n}\n\n.statediagram-cluster .inner {\n rx:0;\n ry:0;\n}\n\n.statediagram-state rect.basic {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state rect.divider {\n stroke-dasharray: 10,10;\n fill: ${options.altBackground ? options.altBackground : '#efefef'};\n}\n\n.note-edge {\n stroke-dasharray: 5;\n}\n\n.statediagram-note rect {\n fill: ${options.noteBkgColor};\n stroke: ${options.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n.statediagram-note rect {\n fill: ${options.noteBkgColor};\n stroke: ${options.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n\n.statediagram-note text {\n fill: ${options.noteTextColor};\n}\n\n.statediagram-note .nodeLabel {\n color: ${options.noteTextColor};\n}\n.statediagram .edgeLabel {\n color: red; // ${options.noteTextColor};\n}\n\n#dependencyStart, #dependencyEnd {\n fill: ${options.lineColor};\n stroke: ${options.lineColor};\n stroke-width: 1;\n}\n\n.statediagramTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${options.textColor};\n}\n`;\n\n// todo: change composit to composite\n// cspell:ignore composit\n\nexport default getStyles;\n"], + "mappings": "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AAC,GAAE,EAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,IAAG,GAAE,EAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,IAAG,GAAE,EAAE,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,KAAI,EAAC,GAAE,EAAC,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAC,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,KAAI,EAAC,GAAE,GAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,E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", + "names": ["o", "parser", "lexer", "text", "getDir"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-EXTU4WIE.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-EXTU4WIE.mjs new file mode 100644 index 0000000..e0b9161 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-EXTU4WIE.mjs @@ -0,0 +1,24 @@ +import { + getConfig2 as getConfig +} from "./chunk-ABZYJK2D.mjs"; +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/rendering-util/selectSvgElement.ts +import { select } from "d3"; +var selectSvgElement = /* @__PURE__ */ __name((id) => { + const { securityLevel } = getConfig(); + let root = select("body"); + if (securityLevel === "sandbox") { + const sandboxElement = select(`#i${id}`); + const doc = sandboxElement.node()?.contentDocument ?? document; + root = select(doc.body); + } + const svg = root.select(`#${id}`); + return svg; +}, "selectSvgElement"); + +export { + selectSvgElement +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-EXTU4WIE.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-EXTU4WIE.mjs.map new file mode 100644 index 0000000..e5538c5 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-EXTU4WIE.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/rendering-util/selectSvgElement.ts"], + "sourcesContent": ["import { select } from 'd3';\nimport { getConfig } from '../diagram-api/diagramAPI.js';\nimport type { HTML, SVG } from '../diagram-api/types.js';\n\n/**\n * Selects the SVG element using {@link id}.\n *\n * @param id - The diagram ID.\n * @returns The selected {@link SVG} element using {@link id}.\n */\nexport const selectSvgElement = (id: string): SVG => {\n const { securityLevel } = getConfig();\n // handle root and document for when rendering in sandbox mode\n let root: HTML = select('body');\n if (securityLevel === 'sandbox') {\n const sandboxElement: HTML = select(`#i${id}`);\n const doc: Document = sandboxElement.node()?.contentDocument ?? document;\n root = select(doc.body as HTMLIFrameElement);\n }\n const svg: SVG = root.select(`#${id}`);\n return svg;\n};\n"], + "mappings": ";;;;;;;;AAAA,SAAS,cAAc;AAUhB,IAAM,mBAAmB,wBAAC,OAAoB;AACnD,QAAM,EAAE,cAAc,IAAI,UAAU;AAEpC,MAAI,OAAa,OAAO,MAAM;AAC9B,MAAI,kBAAkB,WAAW;AAC/B,UAAM,iBAAuB,OAAO,KAAK,EAAE,EAAE;AAC7C,UAAM,MAAgB,eAAe,KAAK,GAAG,mBAAmB;AAChE,WAAO,OAAO,IAAI,IAAyB;AAAA,EAC7C;AACA,QAAM,MAAW,KAAK,OAAO,IAAI,EAAE,EAAE;AACrC,SAAO;AACT,GAXgC;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-FMBD7UC4.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-FMBD7UC4.mjs new file mode 100644 index 0000000..5cefa0d --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-FMBD7UC4.mjs @@ -0,0 +1,24 @@ +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/globalStyles.ts +var getIconStyles = /* @__PURE__ */ __name(() => ` + /* Font Awesome icon styling - consolidated */ + .label-icon { + display: inline-block; + height: 1em; + overflow: visible; + vertical-align: -0.125em; + } + + .node .label-icon path { + fill: currentColor; + stroke: revert; + stroke-width: revert; + } +`, "getIconStyles"); + +export { + getIconStyles +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-FMBD7UC4.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-FMBD7UC4.mjs.map new file mode 100644 index 0000000..84f7dd8 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-FMBD7UC4.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/globalStyles.ts"], + "sourcesContent": ["export const getIconStyles = () => `\n /* Font Awesome icon styling - consolidated */\n .label-icon {\n display: inline-block;\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n \n .node .label-icon path {\n fill: currentColor;\n stroke: revert;\n stroke-width: revert;\n }\n`;\n"], + "mappings": ";;;;;AAAO,IAAM,gBAAgB,6BAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAN;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-HN2XXSSU.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-HN2XXSSU.mjs new file mode 100644 index 0000000..d9246b4 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-HN2XXSSU.mjs @@ -0,0 +1,159 @@ +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/utils/lineWithOffset.ts +var markerOffsets = { + aggregation: 17.25, + extension: 17.25, + composition: 17.25, + dependency: 6, + lollipop: 13.5, + arrow_point: 4 + //arrow_cross: 24, +}; +var markerOffsets2 = { + arrow_point: 9, + arrow_cross: 12.5, + arrow_circle: 12.5 +}; +function calculateDeltaAndAngle(point1, point2) { + if (point1 === void 0 || point2 === void 0) { + return { angle: 0, deltaX: 0, deltaY: 0 }; + } + point1 = pointTransformer(point1); + point2 = pointTransformer(point2); + const [x1, y1] = [point1.x, point1.y]; + const [x2, y2] = [point2.x, point2.y]; + const deltaX = x2 - x1; + const deltaY = y2 - y1; + return { angle: Math.atan(deltaY / deltaX), deltaX, deltaY }; +} +__name(calculateDeltaAndAngle, "calculateDeltaAndAngle"); +var pointTransformer = /* @__PURE__ */ __name((data) => { + if (Array.isArray(data)) { + return { x: data[0], y: data[1] }; + } + return data; +}, "pointTransformer"); +var getLineFunctionsWithOffset = /* @__PURE__ */ __name((edge) => { + return { + x: /* @__PURE__ */ __name(function(d, i, data) { + let offset = 0; + const DIRECTION = pointTransformer(data[0]).x < pointTransformer(data[data.length - 1]).x ? "left" : "right"; + if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) { + const { angle, deltaX } = calculateDeltaAndAngle(data[0], data[1]); + offset = markerOffsets[edge.arrowTypeStart] * Math.cos(angle) * (deltaX >= 0 ? 1 : -1); + } else if (i === data.length - 1 && Object.hasOwn(markerOffsets, edge.arrowTypeEnd)) { + const { angle, deltaX } = calculateDeltaAndAngle( + data[data.length - 1], + data[data.length - 2] + ); + offset = markerOffsets[edge.arrowTypeEnd] * Math.cos(angle) * (deltaX >= 0 ? 1 : -1); + } + const differenceToEnd = Math.abs( + pointTransformer(d).x - pointTransformer(data[data.length - 1]).x + ); + const differenceInYEnd = Math.abs( + pointTransformer(d).y - pointTransformer(data[data.length - 1]).y + ); + const differenceToStart = Math.abs(pointTransformer(d).x - pointTransformer(data[0]).x); + const differenceInYStart = Math.abs(pointTransformer(d).y - pointTransformer(data[0]).y); + const startMarkerHeight = markerOffsets[edge.arrowTypeStart]; + const endMarkerHeight = markerOffsets[edge.arrowTypeEnd]; + const extraRoom = 1; + if (differenceToEnd < endMarkerHeight && differenceToEnd > 0 && differenceInYEnd < endMarkerHeight) { + let adjustment = endMarkerHeight + extraRoom - differenceToEnd; + adjustment *= DIRECTION === "right" ? -1 : 1; + offset -= adjustment; + } + if (differenceToStart < startMarkerHeight && differenceToStart > 0 && differenceInYStart < startMarkerHeight) { + let adjustment = startMarkerHeight + extraRoom - differenceToStart; + adjustment *= DIRECTION === "right" ? -1 : 1; + offset += adjustment; + } + return pointTransformer(d).x + offset; + }, "x"), + y: /* @__PURE__ */ __name(function(d, i, data) { + let offset = 0; + const DIRECTION = pointTransformer(data[0]).y < pointTransformer(data[data.length - 1]).y ? "down" : "up"; + if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) { + const { angle, deltaY } = calculateDeltaAndAngle(data[0], data[1]); + offset = markerOffsets[edge.arrowTypeStart] * Math.abs(Math.sin(angle)) * (deltaY >= 0 ? 1 : -1); + } else if (i === data.length - 1 && Object.hasOwn(markerOffsets, edge.arrowTypeEnd)) { + const { angle, deltaY } = calculateDeltaAndAngle( + data[data.length - 1], + data[data.length - 2] + ); + offset = markerOffsets[edge.arrowTypeEnd] * Math.abs(Math.sin(angle)) * (deltaY >= 0 ? 1 : -1); + } + const differenceToEnd = Math.abs( + pointTransformer(d).y - pointTransformer(data[data.length - 1]).y + ); + const differenceInXEnd = Math.abs( + pointTransformer(d).x - pointTransformer(data[data.length - 1]).x + ); + const differenceToStart = Math.abs(pointTransformer(d).y - pointTransformer(data[0]).y); + const differenceInXStart = Math.abs(pointTransformer(d).x - pointTransformer(data[0]).x); + const startMarkerHeight = markerOffsets[edge.arrowTypeStart]; + const endMarkerHeight = markerOffsets[edge.arrowTypeEnd]; + const extraRoom = 1; + if (differenceToEnd < endMarkerHeight && differenceToEnd > 0 && differenceInXEnd < endMarkerHeight) { + let adjustment = endMarkerHeight + extraRoom - differenceToEnd; + adjustment *= DIRECTION === "up" ? -1 : 1; + offset -= adjustment; + } + if (differenceToStart < startMarkerHeight && differenceToStart > 0 && differenceInXStart < startMarkerHeight) { + let adjustment = startMarkerHeight + extraRoom - differenceToStart; + adjustment *= DIRECTION === "up" ? -1 : 1; + offset += adjustment; + } + return pointTransformer(d).y + offset; + }, "y") + }; +}, "getLineFunctionsWithOffset"); +if (void 0) { + const { it, expect, describe } = void 0; + describe("calculateDeltaAndAngle", () => { + it("should calculate the angle and deltas between two points", () => { + expect(calculateDeltaAndAngle([0, 0], [0, 1])).toStrictEqual({ + angle: 1.5707963267948966, + deltaX: 0, + deltaY: 1 + }); + expect(calculateDeltaAndAngle([1, 0], [0, -1])).toStrictEqual({ + angle: 0.7853981633974483, + deltaX: -1, + deltaY: -1 + }); + expect(calculateDeltaAndAngle({ x: 1, y: 0 }, [0, -1])).toStrictEqual({ + angle: 0.7853981633974483, + deltaX: -1, + deltaY: -1 + }); + expect(calculateDeltaAndAngle({ x: 1, y: 0 }, { x: 1, y: 0 })).toStrictEqual({ + angle: NaN, + deltaX: 0, + deltaY: 0 + }); + }); + it("should calculate the angle and deltas if one point in undefined", () => { + expect(calculateDeltaAndAngle(void 0, [0, 1])).toStrictEqual({ + angle: 0, + deltaX: 0, + deltaY: 0 + }); + expect(calculateDeltaAndAngle([0, 1], void 0)).toStrictEqual({ + angle: 0, + deltaX: 0, + deltaY: 0 + }); + }); + }); +} + +export { + markerOffsets, + markerOffsets2, + getLineFunctionsWithOffset +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-HN2XXSSU.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-HN2XXSSU.mjs.map new file mode 100644 index 0000000..46f3fc8 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-HN2XXSSU.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/utils/lineWithOffset.ts"], + "sourcesContent": ["import type { EdgeData, Point } from '../types.js';\n\n// We need to draw the lines a bit shorter to avoid drawing\n// under any transparent markers.\n// The offsets are calculated from the markers' dimensions.\nexport const markerOffsets = {\n aggregation: 17.25,\n extension: 17.25,\n composition: 17.25,\n dependency: 6,\n lollipop: 13.5,\n arrow_point: 4,\n //arrow_cross: 24,\n} as const;\n\n// We need to draw the lines a bit shorter to avoid drawing\n// under any transparent markers.\n// The offsets are calculated from the markers' dimensions.\nexport const markerOffsets2 = {\n arrow_point: 9,\n arrow_cross: 12.5,\n arrow_circle: 12.5,\n} as const;\n\n/**\n * Calculate the deltas and angle between two points\n * @param point1 - First point\n * @param point2 - Second point\n * @returns The angle, deltaX and deltaY\n */\nfunction calculateDeltaAndAngle(\n point1?: Point | [number, number],\n point2?: Point | [number, number]\n): { angle: number; deltaX: number; deltaY: number } {\n if (point1 === undefined || point2 === undefined) {\n return { angle: 0, deltaX: 0, deltaY: 0 };\n }\n point1 = pointTransformer(point1);\n point2 = pointTransformer(point2);\n const [x1, y1] = [point1.x, point1.y];\n const [x2, y2] = [point2.x, point2.y];\n const deltaX = x2 - x1;\n const deltaY = y2 - y1;\n return { angle: Math.atan(deltaY / deltaX), deltaX, deltaY };\n}\n\nconst pointTransformer = (data: Point | [number, number]) => {\n if (Array.isArray(data)) {\n return { x: data[0], y: data[1] };\n }\n return data;\n};\n\nexport const getLineFunctionsWithOffset = (\n edge: Pick\n) => {\n return {\n x: function (\n this: void,\n d: Point | [number, number],\n i: number,\n data: (Point | [number, number])[]\n ) {\n let offset = 0;\n const DIRECTION =\n pointTransformer(data[0]).x < pointTransformer(data[data.length - 1]).x ? 'left' : 'right';\n if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) {\n const { angle, deltaX } = calculateDeltaAndAngle(data[0], data[1]);\n offset =\n markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets] *\n Math.cos(angle) *\n (deltaX >= 0 ? 1 : -1);\n } else if (i === data.length - 1 && Object.hasOwn(markerOffsets, edge.arrowTypeEnd)) {\n const { angle, deltaX } = calculateDeltaAndAngle(\n data[data.length - 1],\n data[data.length - 2]\n );\n offset =\n markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets] *\n Math.cos(angle) *\n (deltaX >= 0 ? 1 : -1);\n }\n\n const differenceToEnd = Math.abs(\n pointTransformer(d).x - pointTransformer(data[data.length - 1]).x\n );\n const differenceInYEnd = Math.abs(\n pointTransformer(d).y - pointTransformer(data[data.length - 1]).y\n );\n const differenceToStart = Math.abs(pointTransformer(d).x - pointTransformer(data[0]).x);\n const differenceInYStart = Math.abs(pointTransformer(d).y - pointTransformer(data[0]).y);\n const startMarkerHeight = markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets];\n const endMarkerHeight = markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets];\n const extraRoom = 1;\n\n // Adjust the offset if the difference is smaller than the marker height\n if (\n differenceToEnd < endMarkerHeight &&\n differenceToEnd > 0 &&\n differenceInYEnd < endMarkerHeight\n ) {\n let adjustment = endMarkerHeight + extraRoom - differenceToEnd;\n adjustment *= DIRECTION === 'right' ? -1 : 1;\n // Adjust the offset by the amount needed to fit the marker\n offset -= adjustment;\n }\n\n if (\n differenceToStart < startMarkerHeight &&\n differenceToStart > 0 &&\n differenceInYStart < startMarkerHeight\n ) {\n let adjustment = startMarkerHeight + extraRoom - differenceToStart;\n adjustment *= DIRECTION === 'right' ? -1 : 1;\n offset += adjustment;\n }\n\n return pointTransformer(d).x + offset;\n },\n y: function (\n this: void,\n d: Point | [number, number],\n i: number,\n data: (Point | [number, number])[]\n ) {\n let offset = 0;\n const DIRECTION =\n pointTransformer(data[0]).y < pointTransformer(data[data.length - 1]).y ? 'down' : 'up';\n if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) {\n const { angle, deltaY } = calculateDeltaAndAngle(data[0], data[1]);\n offset =\n markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets] *\n Math.abs(Math.sin(angle)) *\n (deltaY >= 0 ? 1 : -1);\n } else if (i === data.length - 1 && Object.hasOwn(markerOffsets, edge.arrowTypeEnd)) {\n const { angle, deltaY } = calculateDeltaAndAngle(\n data[data.length - 1],\n data[data.length - 2]\n );\n offset =\n markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets] *\n Math.abs(Math.sin(angle)) *\n (deltaY >= 0 ? 1 : -1);\n }\n\n const differenceToEnd = Math.abs(\n pointTransformer(d).y - pointTransformer(data[data.length - 1]).y\n );\n const differenceInXEnd = Math.abs(\n pointTransformer(d).x - pointTransformer(data[data.length - 1]).x\n );\n const differenceToStart = Math.abs(pointTransformer(d).y - pointTransformer(data[0]).y);\n const differenceInXStart = Math.abs(pointTransformer(d).x - pointTransformer(data[0]).x);\n const startMarkerHeight = markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets];\n const endMarkerHeight = markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets];\n const extraRoom = 1;\n\n // Adjust the offset if the difference is smaller than the marker height\n if (\n differenceToEnd < endMarkerHeight &&\n differenceToEnd > 0 &&\n differenceInXEnd < endMarkerHeight\n ) {\n let adjustment = endMarkerHeight + extraRoom - differenceToEnd;\n adjustment *= DIRECTION === 'up' ? -1 : 1;\n // Adjust the offset by the amount needed to fit the marker\n offset -= adjustment;\n }\n\n if (\n differenceToStart < startMarkerHeight &&\n differenceToStart > 0 &&\n differenceInXStart < startMarkerHeight\n ) {\n let adjustment = startMarkerHeight + extraRoom - differenceToStart;\n adjustment *= DIRECTION === 'up' ? -1 : 1;\n offset += adjustment;\n }\n return pointTransformer(d).y + offset;\n },\n };\n};\n\nif (import.meta.vitest) {\n const { it, expect, describe } = import.meta.vitest;\n describe('calculateDeltaAndAngle', () => {\n it('should calculate the angle and deltas between two points', () => {\n expect(calculateDeltaAndAngle([0, 0], [0, 1])).toStrictEqual({\n angle: 1.5707963267948966,\n deltaX: 0,\n deltaY: 1,\n });\n expect(calculateDeltaAndAngle([1, 0], [0, -1])).toStrictEqual({\n angle: 0.7853981633974483,\n deltaX: -1,\n deltaY: -1,\n });\n expect(calculateDeltaAndAngle({ x: 1, y: 0 }, [0, -1])).toStrictEqual({\n angle: 0.7853981633974483,\n deltaX: -1,\n deltaY: -1,\n });\n expect(calculateDeltaAndAngle({ x: 1, y: 0 }, { x: 1, y: 0 })).toStrictEqual({\n angle: NaN,\n deltaX: 0,\n deltaY: 0,\n });\n });\n\n it('should calculate the angle and deltas if one point in undefined', () => {\n expect(calculateDeltaAndAngle(undefined, [0, 1])).toStrictEqual({\n angle: 0,\n deltaX: 0,\n deltaY: 0,\n });\n expect(calculateDeltaAndAngle([0, 1], undefined)).toStrictEqual({\n angle: 0,\n deltaX: 0,\n deltaY: 0,\n });\n });\n });\n}\n"], + "mappings": "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", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JA3XYJ7Z.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JA3XYJ7Z.mjs new file mode 100644 index 0000000..258cb3d --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JA3XYJ7Z.mjs @@ -0,0 +1,443 @@ +import { + decodeEntities +} from "./chunk-S3R3BYOJ.mjs"; +import { + common_default, + getConfig, + hasKatex, + renderKatexSanitized, + sanitizeText +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/rendering-util/icons.ts +import { getIconData, iconToHTML, iconToSVG, replaceIDs, stringToIcon } from "@iconify/utils"; +var unknownIcon = { + body: '?', + height: 80, + width: 80 +}; +var iconsStore = /* @__PURE__ */ new Map(); +var loaderStore = /* @__PURE__ */ new Map(); +var registerIconPacks = /* @__PURE__ */ __name((iconLoaders) => { + for (const iconLoader of iconLoaders) { + if (!iconLoader.name) { + throw new Error( + 'Invalid icon loader. Must have a "name" property with non-empty string value.' + ); + } + log.debug("Registering icon pack:", iconLoader.name); + if ("loader" in iconLoader) { + loaderStore.set(iconLoader.name, iconLoader.loader); + } else if ("icons" in iconLoader) { + iconsStore.set(iconLoader.name, iconLoader.icons); + } else { + log.error("Invalid icon loader:", iconLoader); + throw new Error('Invalid icon loader. Must have either "icons" or "loader" property.'); + } + } +}, "registerIconPacks"); +var getRegisteredIconData = /* @__PURE__ */ __name(async (iconName, fallbackPrefix) => { + const data = stringToIcon(iconName, true, fallbackPrefix !== void 0); + if (!data) { + throw new Error(`Invalid icon name: ${iconName}`); + } + const prefix = data.prefix || fallbackPrefix; + if (!prefix) { + throw new Error(`Icon name must contain a prefix: ${iconName}`); + } + let icons = iconsStore.get(prefix); + if (!icons) { + const loader = loaderStore.get(prefix); + if (!loader) { + throw new Error(`Icon set not found: ${data.prefix}`); + } + try { + const loaded = await loader(); + icons = { ...loaded, prefix }; + iconsStore.set(prefix, icons); + } catch (e) { + log.error(e); + throw new Error(`Failed to load icon set: ${data.prefix}`); + } + } + const iconData = getIconData(icons, data.name); + if (!iconData) { + throw new Error(`Icon not found: ${iconName}`); + } + return iconData; +}, "getRegisteredIconData"); +var isIconAvailable = /* @__PURE__ */ __name(async (iconName) => { + try { + await getRegisteredIconData(iconName); + return true; + } catch { + return false; + } +}, "isIconAvailable"); +var getIconSVG = /* @__PURE__ */ __name(async (iconName, customisations, extraAttributes) => { + let iconData; + try { + iconData = await getRegisteredIconData(iconName, customisations?.fallbackPrefix); + } catch (e) { + log.error(e); + iconData = unknownIcon; + } + const renderData = iconToSVG(iconData, customisations); + const svg = iconToHTML(replaceIDs(renderData.body), { + ...renderData.attributes, + ...extraAttributes + }); + return sanitizeText(svg, getConfig()); +}, "getIconSVG"); + +// src/rendering-util/createText.ts +import { select } from "d3"; + +// src/rendering-util/handle-markdown-text.ts +import { marked } from "marked"; +import { dedent } from "ts-dedent"; +function preprocessMarkdown(markdown, { markdownAutoWrap }) { + const withoutBR = markdown.replace(//g, "\n"); + const withoutMultipleNewlines = withoutBR.replace(/\n{2,}/g, "\n"); + const withoutExtraSpaces = dedent(withoutMultipleNewlines); + if (markdownAutoWrap === false) { + return withoutExtraSpaces.replace(/ /g, " "); + } + return withoutExtraSpaces; +} +__name(preprocessMarkdown, "preprocessMarkdown"); +function markdownToLines(markdown, config = {}) { + const preprocessedMarkdown = preprocessMarkdown(markdown, config); + const nodes = marked.lexer(preprocessedMarkdown); + const lines = [[]]; + let currentLine = 0; + function processNode(node, parentType = "normal") { + if (node.type === "text") { + const textLines = node.text.split("\n"); + textLines.forEach((textLine, index) => { + if (index !== 0) { + currentLine++; + lines.push([]); + } + textLine.split(" ").forEach((word) => { + word = word.replace(/'/g, `'`); + if (word) { + lines[currentLine].push({ content: word, type: parentType }); + } + }); + }); + } else if (node.type === "strong" || node.type === "em") { + node.tokens.forEach((contentNode) => { + processNode(contentNode, node.type); + }); + } else if (node.type === "html") { + lines[currentLine].push({ content: node.text, type: "normal" }); + } + } + __name(processNode, "processNode"); + nodes.forEach((treeNode) => { + if (treeNode.type === "paragraph") { + treeNode.tokens?.forEach((contentNode) => { + processNode(contentNode); + }); + } else if (treeNode.type === "html") { + lines[currentLine].push({ content: treeNode.text, type: "normal" }); + } else { + lines[currentLine].push({ content: treeNode.raw, type: "normal" }); + } + }); + return lines; +} +__name(markdownToLines, "markdownToLines"); +function markdownToHTML(markdown, { markdownAutoWrap } = {}) { + const nodes = marked.lexer(markdown); + function output(node) { + if (node.type === "text") { + if (markdownAutoWrap === false) { + return node.text.replace(/\n */g, "
").replace(/ /g, " "); + } + return node.text.replace(/\n */g, "
"); + } else if (node.type === "strong") { + return `${node.tokens?.map(output).join("")}`; + } else if (node.type === "em") { + return `${node.tokens?.map(output).join("")}`; + } else if (node.type === "paragraph") { + return `

${node.tokens?.map(output).join("")}

`; + } else if (node.type === "space") { + return ""; + } else if (node.type === "html") { + return `${node.text}`; + } else if (node.type === "escape") { + return node.text; + } + log.warn(`Unsupported markdown: ${node.type}`); + return node.raw; + } + __name(output, "output"); + return nodes.map(output).join(""); +} +__name(markdownToHTML, "markdownToHTML"); + +// src/rendering-util/splitText.ts +function splitTextToChars(text) { + if (Intl.Segmenter) { + return [...new Intl.Segmenter().segment(text)].map((s) => s.segment); + } + return [...text]; +} +__name(splitTextToChars, "splitTextToChars"); +function splitWordToFitWidth(checkFit, word) { + const characters = splitTextToChars(word.content); + return splitWordToFitWidthRecursion(checkFit, [], characters, word.type); +} +__name(splitWordToFitWidth, "splitWordToFitWidth"); +function splitWordToFitWidthRecursion(checkFit, usedChars, remainingChars, type) { + if (remainingChars.length === 0) { + return [ + { content: usedChars.join(""), type }, + { content: "", type } + ]; + } + const [nextChar, ...rest] = remainingChars; + const newWord = [...usedChars, nextChar]; + if (checkFit([{ content: newWord.join(""), type }])) { + return splitWordToFitWidthRecursion(checkFit, newWord, rest, type); + } + if (usedChars.length === 0 && nextChar) { + usedChars.push(nextChar); + remainingChars.shift(); + } + return [ + { content: usedChars.join(""), type }, + { content: remainingChars.join(""), type } + ]; +} +__name(splitWordToFitWidthRecursion, "splitWordToFitWidthRecursion"); +function splitLineToFitWidth(line, checkFit) { + if (line.some(({ content }) => content.includes("\n"))) { + throw new Error("splitLineToFitWidth does not support newlines in the line"); + } + return splitLineToFitWidthRecursion(line, checkFit); +} +__name(splitLineToFitWidth, "splitLineToFitWidth"); +function splitLineToFitWidthRecursion(words, checkFit, lines = [], newLine = []) { + if (words.length === 0) { + if (newLine.length > 0) { + lines.push(newLine); + } + return lines.length > 0 ? lines : []; + } + let joiner = ""; + if (words[0].content === " ") { + joiner = " "; + words.shift(); + } + const nextWord = words.shift() ?? { content: " ", type: "normal" }; + const lineWithNextWord = [...newLine]; + if (joiner !== "") { + lineWithNextWord.push({ content: joiner, type: "normal" }); + } + lineWithNextWord.push(nextWord); + if (checkFit(lineWithNextWord)) { + return splitLineToFitWidthRecursion(words, checkFit, lines, lineWithNextWord); + } + if (newLine.length > 0) { + lines.push(newLine); + words.unshift(nextWord); + } else if (nextWord.content) { + const [line, rest] = splitWordToFitWidth(checkFit, nextWord); + lines.push([line]); + if (rest.content) { + words.unshift(rest); + } + } + return splitLineToFitWidthRecursion(words, checkFit, lines); +} +__name(splitLineToFitWidthRecursion, "splitLineToFitWidthRecursion"); + +// src/rendering-util/createText.ts +function applyStyle(dom, styleFn) { + if (styleFn) { + dom.attr("style", styleFn); + } +} +__name(applyStyle, "applyStyle"); +async function addHtmlSpan(element, node, width, classes, addBackground = false, config = getConfig()) { + const fo = element.append("foreignObject"); + fo.attr("width", `${10 * width}px`); + fo.attr("height", `${10 * width}px`); + const div = fo.append("xhtml:div"); + const sanitizedLabel = hasKatex(node.label) ? await renderKatexSanitized(node.label.replace(common_default.lineBreakRegex, "\n"), config) : sanitizeText(node.label, config); + const labelClass = node.isNode ? "nodeLabel" : "edgeLabel"; + const span = div.append("span"); + span.html(sanitizedLabel); + applyStyle(span, node.labelStyle); + span.attr("class", `${labelClass} ${classes}`); + applyStyle(div, node.labelStyle); + div.style("display", "table-cell"); + div.style("white-space", "nowrap"); + div.style("line-height", "1.5"); + div.style("max-width", width + "px"); + div.style("text-align", "center"); + div.attr("xmlns", "http://www.w3.org/1999/xhtml"); + if (addBackground) { + div.attr("class", "labelBkg"); + } + let bbox = div.node().getBoundingClientRect(); + if (bbox.width === width) { + div.style("display", "table"); + div.style("white-space", "break-spaces"); + div.style("width", width + "px"); + bbox = div.node().getBoundingClientRect(); + } + return fo.node(); +} +__name(addHtmlSpan, "addHtmlSpan"); +function createTspan(textElement, lineIndex, lineHeight) { + return textElement.append("tspan").attr("class", "text-outer-tspan").attr("x", 0).attr("y", lineIndex * lineHeight - 0.1 + "em").attr("dy", lineHeight + "em"); +} +__name(createTspan, "createTspan"); +function computeWidthOfText(parentNode, lineHeight, line) { + const testElement = parentNode.append("text"); + const testSpan = createTspan(testElement, 1, lineHeight); + updateTextContentAndStyles(testSpan, line); + const textLength = testSpan.node().getComputedTextLength(); + testElement.remove(); + return textLength; +} +__name(computeWidthOfText, "computeWidthOfText"); +function computeDimensionOfText(parentNode, lineHeight, text) { + const testElement = parentNode.append("text"); + const testSpan = createTspan(testElement, 1, lineHeight); + updateTextContentAndStyles(testSpan, [{ content: text, type: "normal" }]); + const textDimension = testSpan.node()?.getBoundingClientRect(); + if (textDimension) { + testElement.remove(); + } + return textDimension; +} +__name(computeDimensionOfText, "computeDimensionOfText"); +function createFormattedText(width, g, structuredText, addBackground = false) { + const lineHeight = 1.1; + const labelGroup = g.append("g"); + const bkg = labelGroup.insert("rect").attr("class", "background").attr("style", "stroke: none"); + const textElement = labelGroup.append("text").attr("y", "-10.1"); + let lineIndex = 0; + for (const line of structuredText) { + const checkWidth = /* @__PURE__ */ __name((line2) => computeWidthOfText(labelGroup, lineHeight, line2) <= width, "checkWidth"); + const linesUnderWidth = checkWidth(line) ? [line] : splitLineToFitWidth(line, checkWidth); + for (const preparedLine of linesUnderWidth) { + const tspan = createTspan(textElement, lineIndex, lineHeight); + updateTextContentAndStyles(tspan, preparedLine); + lineIndex++; + } + } + if (addBackground) { + const bbox = textElement.node().getBBox(); + const padding = 2; + bkg.attr("x", bbox.x - padding).attr("y", bbox.y - padding).attr("width", bbox.width + 2 * padding).attr("height", bbox.height + 2 * padding); + return labelGroup.node(); + } else { + return textElement.node(); + } +} +__name(createFormattedText, "createFormattedText"); +function updateTextContentAndStyles(tspan, wrappedLine) { + tspan.text(""); + wrappedLine.forEach((word, index) => { + const innerTspan = tspan.append("tspan").attr("font-style", word.type === "em" ? "italic" : "normal").attr("class", "text-inner-tspan").attr("font-weight", word.type === "strong" ? "bold" : "normal"); + if (index === 0) { + innerTspan.text(word.content); + } else { + innerTspan.text(" " + word.content); + } + }); +} +__name(updateTextContentAndStyles, "updateTextContentAndStyles"); +async function replaceIconSubstring(text, config = {}) { + const pendingReplacements = []; + text.replace(/(fa[bklrs]?):fa-([\w-]+)/g, (fullMatch, prefix, iconName) => { + pendingReplacements.push( + (async () => { + const registeredIconName = `${prefix}:${iconName}`; + if (await isIconAvailable(registeredIconName)) { + return await getIconSVG(registeredIconName, void 0, { class: "label-icon" }); + } else { + return ``; + } + })() + ); + return fullMatch; + }); + const replacements = await Promise.all(pendingReplacements); + return text.replace(/(fa[bklrs]?):fa-([\w-]+)/g, () => replacements.shift() ?? ""); +} +__name(replaceIconSubstring, "replaceIconSubstring"); +var createText = /* @__PURE__ */ __name(async (el, text = "", { + style = "", + isTitle = false, + classes = "", + useHtmlLabels = true, + isNode = true, + width = 200, + addSvgBackground = false +} = {}, config) => { + log.debug( + "XYZ createText", + text, + style, + isTitle, + classes, + useHtmlLabels, + isNode, + "addSvgBackground: ", + addSvgBackground + ); + if (useHtmlLabels) { + const htmlText = markdownToHTML(text, config); + const decodedReplacedText = await replaceIconSubstring(decodeEntities(htmlText), config); + const inputForKatex = text.replace(/\\\\/g, "\\"); + const node = { + isNode, + label: hasKatex(text) ? inputForKatex : decodedReplacedText, + labelStyle: style.replace("fill:", "color:") + }; + const vertexNode = await addHtmlSpan(el, node, width, classes, addSvgBackground, config); + return vertexNode; + } else { + const sanitizeBR = text.replace(//g, "
"); + const structuredText = markdownToLines(sanitizeBR.replace("
", "
"), config); + const svgLabel = createFormattedText( + width, + el, + structuredText, + text ? addSvgBackground : false + ); + if (isNode) { + if (/stroke:/.exec(style)) { + style = style.replace("stroke:", "lineColor:"); + } + const nodeLabelTextStyle = style.replace(/stroke:[^;]+;?/g, "").replace(/stroke-width:[^;]+;?/g, "").replace(/fill:[^;]+;?/g, "").replace(/color:/g, "fill:"); + select(svgLabel).attr("style", nodeLabelTextStyle); + } else { + const edgeLabelRectStyle = style.replace(/stroke:[^;]+;?/g, "").replace(/stroke-width:[^;]+;?/g, "").replace(/fill:[^;]+;?/g, "").replace(/background:/g, "fill:"); + select(svgLabel).select("rect").attr("style", edgeLabelRectStyle.replace(/background:/g, "fill:")); + const edgeLabelTextStyle = style.replace(/stroke:[^;]+;?/g, "").replace(/stroke-width:[^;]+;?/g, "").replace(/fill:[^;]+;?/g, "").replace(/color:/g, "fill:"); + select(svgLabel).select("text").attr("style", edgeLabelTextStyle); + } + return svgLabel; + } +}, "createText"); + +export { + unknownIcon, + registerIconPacks, + getIconSVG, + computeDimensionOfText, + replaceIconSubstring, + createText +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JA3XYJ7Z.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JA3XYJ7Z.mjs.map new file mode 100644 index 0000000..a5b8f9d --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JA3XYJ7Z.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/rendering-util/icons.ts", "../../../src/rendering-util/createText.ts", "../../../src/rendering-util/handle-markdown-text.ts", "../../../src/rendering-util/splitText.ts"], + "sourcesContent": ["import type { ExtendedIconifyIcon, IconifyIcon, IconifyJSON } from '@iconify/types';\nimport type { IconifyIconCustomisations } from '@iconify/utils';\nimport { getIconData, iconToHTML, iconToSVG, replaceIDs, stringToIcon } from '@iconify/utils';\nimport { getConfig } from '../config.js';\nimport { sanitizeText } from '../diagrams/common/common.js';\nimport { log } from '../logger.js';\n\ninterface AsyncIconLoader {\n name: string;\n loader: () => Promise;\n}\n\ninterface SyncIconLoader {\n name: string;\n icons: IconifyJSON;\n}\n\nexport type IconLoader = AsyncIconLoader | SyncIconLoader;\n\nexport const unknownIcon: IconifyIcon = {\n body: '?',\n height: 80,\n width: 80,\n};\n\nconst iconsStore = new Map();\nconst loaderStore = new Map();\n\nexport const registerIconPacks = (iconLoaders: IconLoader[]) => {\n for (const iconLoader of iconLoaders) {\n if (!iconLoader.name) {\n throw new Error(\n 'Invalid icon loader. Must have a \"name\" property with non-empty string value.'\n );\n }\n log.debug('Registering icon pack:', iconLoader.name);\n if ('loader' in iconLoader) {\n loaderStore.set(iconLoader.name, iconLoader.loader);\n } else if ('icons' in iconLoader) {\n iconsStore.set(iconLoader.name, iconLoader.icons);\n } else {\n log.error('Invalid icon loader:', iconLoader);\n throw new Error('Invalid icon loader. Must have either \"icons\" or \"loader\" property.');\n }\n }\n};\n\nconst getRegisteredIconData = async (iconName: string, fallbackPrefix?: string) => {\n const data = stringToIcon(iconName, true, fallbackPrefix !== undefined);\n if (!data) {\n throw new Error(`Invalid icon name: ${iconName}`);\n }\n const prefix = data.prefix || fallbackPrefix;\n if (!prefix) {\n throw new Error(`Icon name must contain a prefix: ${iconName}`);\n }\n let icons = iconsStore.get(prefix);\n if (!icons) {\n const loader = loaderStore.get(prefix);\n if (!loader) {\n throw new Error(`Icon set not found: ${data.prefix}`);\n }\n try {\n const loaded = await loader();\n icons = { ...loaded, prefix };\n iconsStore.set(prefix, icons);\n } catch (e) {\n log.error(e);\n throw new Error(`Failed to load icon set: ${data.prefix}`);\n }\n }\n const iconData = getIconData(icons, data.name);\n if (!iconData) {\n throw new Error(`Icon not found: ${iconName}`);\n }\n return iconData;\n};\n\nexport const isIconAvailable = async (iconName: string) => {\n try {\n await getRegisteredIconData(iconName);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getIconSVG = async (\n iconName: string,\n customisations?: IconifyIconCustomisations & { fallbackPrefix?: string },\n extraAttributes?: Record\n) => {\n let iconData: ExtendedIconifyIcon;\n try {\n iconData = await getRegisteredIconData(iconName, customisations?.fallbackPrefix);\n } catch (e) {\n log.error(e);\n iconData = unknownIcon;\n }\n const renderData = iconToSVG(iconData, customisations);\n const svg = iconToHTML(replaceIDs(renderData.body), {\n ...renderData.attributes,\n ...extraAttributes,\n });\n return sanitizeText(svg, getConfig());\n};\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n// @ts-nocheck TODO: Fix types\nimport { select } from 'd3';\nimport type { MermaidConfig } from '../config.type.js';\nimport type { SVGGroup } from '../diagram-api/types.js';\nimport common, { hasKatex, renderKatexSanitized, sanitizeText } from '../diagrams/common/common.js';\nimport type { D3TSpanElement, D3TextElement } from '../diagrams/common/commonTypes.js';\nimport { log } from '../logger.js';\nimport { markdownToHTML, markdownToLines } from '../rendering-util/handle-markdown-text.js';\nimport { decodeEntities } from '../utils.js';\nimport { getIconSVG, isIconAvailable } from './icons.js';\nimport { splitLineToFitWidth } from './splitText.js';\nimport type { MarkdownLine, MarkdownWord } from './types.js';\nimport { getConfig } from '../config.js';\n\nfunction applyStyle(dom, styleFn) {\n if (styleFn) {\n dom.attr('style', styleFn);\n }\n}\n\nasync function addHtmlSpan(\n element,\n node,\n width,\n classes,\n addBackground = false,\n // TODO: Make config mandatory\n config: MermaidConfig = getConfig()\n) {\n const fo = element.append('foreignObject');\n // This is not the final width but used in order to make sure the foreign\n // object in firefox gets a width at all. The final width is fetched from the div\n fo.attr('width', `${10 * width}px`);\n fo.attr('height', `${10 * width}px`);\n\n const div = fo.append('xhtml:div');\n const sanitizedLabel = hasKatex(node.label)\n ? await renderKatexSanitized(node.label.replace(common.lineBreakRegex, '\\n'), config)\n : sanitizeText(node.label, config);\n const labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel';\n const span = div.append('span');\n span.html(sanitizedLabel);\n applyStyle(span, node.labelStyle);\n span.attr('class', `${labelClass} ${classes}`);\n\n applyStyle(div, node.labelStyle);\n div.style('display', 'table-cell');\n div.style('white-space', 'nowrap');\n div.style('line-height', '1.5');\n div.style('max-width', width + 'px');\n div.style('text-align', 'center');\n div.attr('xmlns', 'http://www.w3.org/1999/xhtml');\n if (addBackground) {\n div.attr('class', 'labelBkg');\n }\n\n let bbox = div.node().getBoundingClientRect();\n if (bbox.width === width) {\n div.style('display', 'table');\n div.style('white-space', 'break-spaces');\n div.style('width', width + 'px');\n bbox = div.node().getBoundingClientRect();\n }\n\n return fo.node();\n}\n\n/**\n * Creates a tspan element with the specified attributes for text positioning.\n *\n * @param textElement - The parent text element to append the tspan element.\n * @param lineIndex - The index of the current line in the structuredText array.\n * @param lineHeight - The line height value for the text.\n * @returns The created tspan element.\n */\nfunction createTspan(textElement: any, lineIndex: number, lineHeight: number) {\n return textElement\n .append('tspan')\n .attr('class', 'text-outer-tspan')\n .attr('x', 0)\n .attr('y', lineIndex * lineHeight - 0.1 + 'em')\n .attr('dy', lineHeight + 'em');\n}\n\nfunction computeWidthOfText(parentNode: any, lineHeight: number, line: MarkdownLine): number {\n const testElement = parentNode.append('text');\n const testSpan = createTspan(testElement, 1, lineHeight);\n updateTextContentAndStyles(testSpan, line);\n const textLength = testSpan.node().getComputedTextLength();\n testElement.remove();\n return textLength;\n}\n\nexport function computeDimensionOfText(\n parentNode: SVGGroup,\n lineHeight: number,\n text: string\n): DOMRect | undefined {\n const testElement: D3TextElement = parentNode.append('text');\n const testSpan: D3TSpanElement = createTspan(testElement, 1, lineHeight);\n updateTextContentAndStyles(testSpan, [{ content: text, type: 'normal' }]);\n const textDimension: DOMRect | undefined = testSpan.node()?.getBoundingClientRect();\n if (textDimension) {\n testElement.remove();\n }\n return textDimension;\n}\n\n/**\n * Creates a formatted text element by breaking lines and applying styles based on\n * the given structuredText.\n *\n * @param width - The maximum allowed width of the text.\n * @param g - The parent group element to append the formatted text.\n * @param structuredText - The structured text data to format.\n * @param addBackground - Whether to add a background to the text.\n */\nfunction createFormattedText(\n width: number,\n g: any,\n structuredText: MarkdownWord[][],\n addBackground = false\n) {\n const lineHeight = 1.1;\n const labelGroup = g.append('g');\n const bkg = labelGroup.insert('rect').attr('class', 'background').attr('style', 'stroke: none');\n const textElement = labelGroup.append('text').attr('y', '-10.1');\n let lineIndex = 0;\n for (const line of structuredText) {\n /**\n * Preprocess raw string content of line data\n * Creating an array of strings pre-split to satisfy width limit\n */\n const checkWidth = (line: MarkdownLine) =>\n computeWidthOfText(labelGroup, lineHeight, line) <= width;\n const linesUnderWidth = checkWidth(line) ? [line] : splitLineToFitWidth(line, checkWidth);\n /** Add each prepared line as a tspan to the parent node */\n for (const preparedLine of linesUnderWidth) {\n const tspan = createTspan(textElement, lineIndex, lineHeight);\n updateTextContentAndStyles(tspan, preparedLine);\n lineIndex++;\n }\n }\n if (addBackground) {\n const bbox = textElement.node().getBBox();\n const padding = 2;\n bkg\n .attr('x', bbox.x - padding)\n .attr('y', bbox.y - padding)\n .attr('width', bbox.width + 2 * padding)\n .attr('height', bbox.height + 2 * padding);\n\n return labelGroup.node();\n } else {\n return textElement.node();\n }\n}\n\n/**\n * Updates the text content and styles of the given tspan element based on the\n * provided wrappedLine data.\n *\n * @param tspan - The tspan element to update.\n * @param wrappedLine - The line data to apply to the tspan element.\n */\nfunction updateTextContentAndStyles(tspan: any, wrappedLine: MarkdownWord[]) {\n tspan.text('');\n\n wrappedLine.forEach((word, index) => {\n const innerTspan = tspan\n .append('tspan')\n .attr('font-style', word.type === 'em' ? 'italic' : 'normal')\n .attr('class', 'text-inner-tspan')\n .attr('font-weight', word.type === 'strong' ? 'bold' : 'normal');\n if (index === 0) {\n innerTspan.text(word.content);\n } else {\n // TODO: check what joiner to use.\n innerTspan.text(' ' + word.content);\n }\n });\n}\n\n/**\n * Convert fontawesome labels into fontawesome icons by using a regex pattern\n * @param text - The raw string to convert\n * @param config - Mermaid config\n * @returns string with fontawesome icons as svg if the icon is registered otherwise as i tags\n */\nexport async function replaceIconSubstring(\n text: string,\n // TODO: Make config mandatory\n config: MermaidConfig = {}\n): Promise {\n const pendingReplacements: Promise[] = [];\n // cspell: disable-next-line\n text.replace(/(fa[bklrs]?):fa-([\\w-]+)/g, (fullMatch, prefix, iconName) => {\n pendingReplacements.push(\n (async () => {\n const registeredIconName = `${prefix}:${iconName}`;\n if (await isIconAvailable(registeredIconName)) {\n return await getIconSVG(registeredIconName, undefined, { class: 'label-icon' });\n } else {\n return ``;\n }\n })()\n );\n return fullMatch;\n });\n\n const replacements = await Promise.all(pendingReplacements);\n // cspell: disable-next-line\n return text.replace(/(fa[bklrs]?):fa-([\\w-]+)/g, () => replacements.shift() ?? '');\n}\n\n// Note when using from flowcharts converting the API isNode means classes should be set accordingly. When using htmlLabels => to set classes to 'nodeLabel' when isNode=true otherwise 'edgeLabel'\n// When not using htmlLabels => to set classes to 'title-row' when isTitle=true otherwise 'title-row'\nexport const createText = async (\n el,\n text = '',\n {\n style = '',\n isTitle = false,\n classes = '',\n useHtmlLabels = true,\n isNode = true,\n width = 200,\n addSvgBackground = false,\n } = {},\n config?: MermaidConfig\n) => {\n log.debug(\n 'XYZ createText',\n text,\n style,\n isTitle,\n classes,\n useHtmlLabels,\n isNode,\n 'addSvgBackground: ',\n addSvgBackground\n );\n if (useHtmlLabels) {\n // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?\n\n const htmlText = markdownToHTML(text, config);\n const decodedReplacedText = await replaceIconSubstring(decodeEntities(htmlText), config);\n\n //for Katex the text could contain escaped characters, \\\\relax that should be transformed to \\relax\n const inputForKatex = text.replace(/\\\\\\\\/g, '\\\\');\n\n const node = {\n isNode,\n label: hasKatex(text) ? inputForKatex : decodedReplacedText,\n labelStyle: style.replace('fill:', 'color:'),\n };\n const vertexNode = await addHtmlSpan(el, node, width, classes, addSvgBackground, config);\n return vertexNode;\n } else {\n //sometimes the user might add br tags with 1 or more spaces in between, so we need to replace them with
\n const sanitizeBR = text.replace(//g, '
');\n const structuredText = markdownToLines(sanitizeBR.replace('
', '
'), config);\n const svgLabel = createFormattedText(\n width,\n el,\n structuredText,\n text ? addSvgBackground : false\n );\n if (isNode) {\n if (/stroke:/.exec(style)) {\n style = style.replace('stroke:', 'lineColor:');\n }\n\n const nodeLabelTextStyle = style\n .replace(/stroke:[^;]+;?/g, '')\n .replace(/stroke-width:[^;]+;?/g, '')\n .replace(/fill:[^;]+;?/g, '')\n .replace(/color:/g, 'fill:');\n select(svgLabel).attr('style', nodeLabelTextStyle);\n // svgLabel.setAttribute('style', style);\n } else {\n //On style, assume `stroke`, `stroke-width` are used for edge path, so remove them\n // remove `fill`\n // use `background` as `fill` for label rect,\n\n const edgeLabelRectStyle = style\n .replace(/stroke:[^;]+;?/g, '')\n .replace(/stroke-width:[^;]+;?/g, '')\n .replace(/fill:[^;]+;?/g, '')\n .replace(/background:/g, 'fill:');\n select(svgLabel)\n .select('rect')\n .attr('style', edgeLabelRectStyle.replace(/background:/g, 'fill:'));\n\n // for text, update fill color with `color`\n const edgeLabelTextStyle = style\n .replace(/stroke:[^;]+;?/g, '')\n .replace(/stroke-width:[^;]+;?/g, '')\n .replace(/fill:[^;]+;?/g, '')\n .replace(/color:/g, 'fill:');\n select(svgLabel).select('text').attr('style', edgeLabelTextStyle);\n }\n return svgLabel;\n }\n};\n", "import type { MarkedToken, Token } from 'marked';\nimport { marked } from 'marked';\nimport { dedent } from 'ts-dedent';\nimport type { MarkdownLine, MarkdownWordType } from './types.js';\nimport type { MermaidConfig } from '../config.type.js';\nimport { log } from '../logger.js';\n\n/**\n * @param markdown - markdown to process\n * @returns processed markdown\n */\nfunction preprocessMarkdown(markdown: string, { markdownAutoWrap }: MermaidConfig): string {\n //Replace
with \\n\n const withoutBR = markdown.replace(//g, '\\n');\n // Replace multiple newlines with a single newline\n const withoutMultipleNewlines = withoutBR.replace(/\\n{2,}/g, '\\n');\n // Remove extra spaces at the beginning of each line\n const withoutExtraSpaces = dedent(withoutMultipleNewlines);\n if (markdownAutoWrap === false) {\n return withoutExtraSpaces.replace(/ /g, ' ');\n }\n return withoutExtraSpaces;\n}\n\n/**\n * @param markdown - markdown to split into lines\n */\nexport function markdownToLines(markdown: string, config: MermaidConfig = {}): MarkdownLine[] {\n const preprocessedMarkdown = preprocessMarkdown(markdown, config);\n const nodes = marked.lexer(preprocessedMarkdown);\n const lines: MarkdownLine[] = [[]];\n let currentLine = 0;\n\n function processNode(node: MarkedToken, parentType: MarkdownWordType = 'normal') {\n if (node.type === 'text') {\n const textLines = node.text.split('\\n');\n textLines.forEach((textLine, index) => {\n if (index !== 0) {\n currentLine++;\n lines.push([]);\n }\n textLine.split(' ').forEach((word) => {\n word = word.replace(/'/g, `'`);\n if (word) {\n lines[currentLine].push({ content: word, type: parentType });\n }\n });\n });\n } else if (node.type === 'strong' || node.type === 'em') {\n node.tokens.forEach((contentNode) => {\n processNode(contentNode as MarkedToken, node.type);\n });\n } else if (node.type === 'html') {\n lines[currentLine].push({ content: node.text, type: 'normal' });\n }\n }\n\n nodes.forEach((treeNode) => {\n if (treeNode.type === 'paragraph') {\n treeNode.tokens?.forEach((contentNode) => {\n processNode(contentNode as MarkedToken);\n });\n } else if (treeNode.type === 'html') {\n lines[currentLine].push({ content: treeNode.text, type: 'normal' });\n } else {\n lines[currentLine].push({ content: treeNode.raw, type: 'normal' });\n }\n });\n\n return lines;\n}\n\nexport function markdownToHTML(markdown: string, { markdownAutoWrap }: MermaidConfig = {}) {\n const nodes = marked.lexer(markdown);\n\n function output(node: Token): string {\n if (node.type === 'text') {\n if (markdownAutoWrap === false) {\n return node.text.replace(/\\n */g, '
').replace(/ /g, ' ');\n }\n return node.text.replace(/\\n */g, '
');\n } else if (node.type === 'strong') {\n return `${node.tokens?.map(output).join('')}`;\n } else if (node.type === 'em') {\n return `${node.tokens?.map(output).join('')}`;\n } else if (node.type === 'paragraph') {\n return `

${node.tokens?.map(output).join('')}

`;\n } else if (node.type === 'space') {\n return '';\n } else if (node.type === 'html') {\n return `${node.text}`;\n } else if (node.type === 'escape') {\n return node.text;\n }\n log.warn(`Unsupported markdown: ${node.type}`);\n return node.raw;\n }\n\n return nodes.map(output).join('');\n}\n", "import type { CheckFitFunction, MarkdownLine, MarkdownWord, MarkdownWordType } from './types.js';\n\n/**\n * Splits a string into graphemes if available, otherwise characters.\n */\nexport function splitTextToChars(text: string): string[] {\n if (Intl.Segmenter) {\n return [...new Intl.Segmenter().segment(text)].map((s) => s.segment);\n }\n return [...text];\n}\n\n/**\n * Splits a string into words by using `Intl.Segmenter` if available, or splitting by ' '.\n * `Intl.Segmenter` uses the default locale, which might be different across browsers.\n */\nexport function splitLineToWords(text: string): string[] {\n if (Intl.Segmenter) {\n return [...new Intl.Segmenter(undefined, { granularity: 'word' }).segment(text)].map(\n (s) => s.segment\n );\n }\n // Split by ' ' removes the ' 's from the result.\n const words = text.split(' ');\n // Add the ' 's back to the result.\n const wordsWithSpaces = words.flatMap((s) => [s, ' ']).filter((s) => s);\n // Remove last space.\n wordsWithSpaces.pop();\n return wordsWithSpaces;\n}\n\n/**\n * Splits a word into two parts, the first part fits the width and the remaining part.\n * @param checkFit - Function to check if word fits\n * @param word - Word to split\n * @returns [first part of word that fits, rest of word]\n */\nexport function splitWordToFitWidth(\n checkFit: CheckFitFunction,\n word: MarkdownWord\n): [MarkdownWord, MarkdownWord] {\n const characters = splitTextToChars(word.content);\n return splitWordToFitWidthRecursion(checkFit, [], characters, word.type);\n}\n\nfunction splitWordToFitWidthRecursion(\n checkFit: CheckFitFunction,\n usedChars: string[],\n remainingChars: string[],\n type: MarkdownWordType\n): [MarkdownWord, MarkdownWord] {\n if (remainingChars.length === 0) {\n return [\n { content: usedChars.join(''), type },\n { content: '', type },\n ];\n }\n const [nextChar, ...rest] = remainingChars;\n const newWord = [...usedChars, nextChar];\n if (checkFit([{ content: newWord.join(''), type }])) {\n return splitWordToFitWidthRecursion(checkFit, newWord, rest, type);\n }\n if (usedChars.length === 0 && nextChar) {\n // If the first character does not fit, split it anyway\n usedChars.push(nextChar);\n remainingChars.shift();\n }\n return [\n { content: usedChars.join(''), type },\n { content: remainingChars.join(''), type },\n ];\n}\n\n/**\n * Splits a line into multiple lines that satisfy the checkFit function.\n * @param line - Line to split\n * @param checkFit - Function to check if line fits\n * @returns Array of lines that fit\n */\nexport function splitLineToFitWidth(\n line: MarkdownLine,\n checkFit: CheckFitFunction\n): MarkdownLine[] {\n if (line.some(({ content }) => content.includes('\\n'))) {\n throw new Error('splitLineToFitWidth does not support newlines in the line');\n }\n return splitLineToFitWidthRecursion(line, checkFit);\n}\n\nfunction splitLineToFitWidthRecursion(\n words: MarkdownWord[],\n checkFit: CheckFitFunction,\n lines: MarkdownLine[] = [],\n newLine: MarkdownLine = []\n): MarkdownLine[] {\n // Return if there is nothing left to split\n if (words.length === 0) {\n // If there is a new line, add it to the lines\n if (newLine.length > 0) {\n lines.push(newLine);\n }\n return lines.length > 0 ? lines : [];\n }\n let joiner = '';\n if (words[0].content === ' ') {\n joiner = ' ';\n words.shift();\n }\n const nextWord: MarkdownWord = words.shift() ?? { content: ' ', type: 'normal' };\n const lineWithNextWord: MarkdownLine = [...newLine];\n if (joiner !== '') {\n lineWithNextWord.push({ content: joiner, type: 'normal' });\n }\n lineWithNextWord.push(nextWord);\n\n if (checkFit(lineWithNextWord)) {\n // nextWord fits, so we can add it to the new line and continue\n return splitLineToFitWidthRecursion(words, checkFit, lines, lineWithNextWord);\n }\n\n // nextWord doesn't fit, so we need to split it\n if (newLine.length > 0) {\n // There was text in newLine, so add it to lines and push nextWord back into words.\n lines.push(newLine);\n words.unshift(nextWord);\n } else if (nextWord.content) {\n // There was no text in newLine, so we need to split nextWord\n const [line, rest] = splitWordToFitWidth(checkFit, nextWord);\n lines.push([line]);\n if (rest.content) {\n words.unshift(rest);\n }\n }\n return splitLineToFitWidthRecursion(words, checkFit, lines);\n}\n"], + "mappings": "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", + "names": ["line"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JZLCHNYA.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JZLCHNYA.mjs new file mode 100644 index 0000000..2cdaefe --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JZLCHNYA.mjs @@ -0,0 +1,5494 @@ +import { + getSubGraphTitleMargins +} from "./chunk-CVBHYZKI.mjs"; +import { + compileStyles, + solidStateFill, + styles2String, + userNodeOverrides +} from "./chunk-ATLVNIR6.mjs"; +import { + createText, + getIconSVG +} from "./chunk-JA3XYJ7Z.mjs"; +import { + calculateTextWidth, + decodeEntities, + handleUndefinedAttr, + parseFontSize +} from "./chunk-S3R3BYOJ.mjs"; +import { + common_default, + defaultConfig_default, + evaluate, + getConfig, + getConfig2, + hasKatex, + parseGenericTypes, + renderKatexSanitized, + sanitizeText, + sanitizeText2 +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/rendering-util/rendering-elements/shapes/util.ts +import { select } from "d3"; +var labelHelper = /* @__PURE__ */ __name(async (parent, node, _classes) => { + let cssClasses; + const useHtmlLabels = node.useHtmlLabels || evaluate(getConfig2()?.htmlLabels); + if (!_classes) { + cssClasses = "node default"; + } else { + cssClasses = _classes; + } + const shapeSvg = parent.insert("g").attr("class", cssClasses).attr("id", node.domId || node.id); + const labelEl = shapeSvg.insert("g").attr("class", "label").attr("style", handleUndefinedAttr(node.labelStyle)); + let label; + if (node.label === void 0) { + label = ""; + } else { + label = typeof node.label === "string" ? node.label : node.label[0]; + } + const text2 = await createText(labelEl, sanitizeText(decodeEntities(label), getConfig2()), { + useHtmlLabels, + width: node.width || getConfig2().flowchart?.wrappingWidth, + // @ts-expect-error -- This is currently not used. Should this be `classes` instead? + cssClasses: "markdown-node-label", + style: node.labelStyle, + addSvgBackground: !!node.icon || !!node.img + }); + let bbox = text2.getBBox(); + const halfPadding = (node?.padding ?? 0) / 2; + if (useHtmlLabels) { + const div = text2.children[0]; + const dv = select(text2); + const images = div.getElementsByTagName("img"); + if (images) { + const noImgText = label.replace(/]*>/g, "").trim() === ""; + await Promise.all( + [...images].map( + (img) => new Promise((res) => { + function setupImage() { + img.style.display = "flex"; + img.style.flexDirection = "column"; + if (noImgText) { + const bodyFontSize = getConfig2().fontSize ? getConfig2().fontSize : window.getComputedStyle(document.body).fontSize; + const enlargingFactor = 5; + const [parsedBodyFontSize = defaultConfig_default.fontSize] = parseFontSize(bodyFontSize); + const width = parsedBodyFontSize * enlargingFactor + "px"; + img.style.minWidth = width; + img.style.maxWidth = width; + } else { + img.style.width = "100%"; + } + res(img); + } + __name(setupImage, "setupImage"); + setTimeout(() => { + if (img.complete) { + setupImage(); + } + }); + img.addEventListener("error", setupImage); + img.addEventListener("load", setupImage); + }) + ) + ); + } + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + if (useHtmlLabels) { + labelEl.attr("transform", "translate(" + -bbox.width / 2 + ", " + -bbox.height / 2 + ")"); + } else { + labelEl.attr("transform", "translate(0, " + -bbox.height / 2 + ")"); + } + if (node.centerLabel) { + labelEl.attr("transform", "translate(" + -bbox.width / 2 + ", " + -bbox.height / 2 + ")"); + } + labelEl.insert("rect", ":first-child"); + return { shapeSvg, bbox, halfPadding, label: labelEl }; +}, "labelHelper"); +var insertLabel = /* @__PURE__ */ __name(async (parent, label, options) => { + const useHtmlLabels = options.useHtmlLabels || evaluate(getConfig2()?.flowchart?.htmlLabels); + const labelEl = parent.insert("g").attr("class", "label").attr("style", options.labelStyle || ""); + const text2 = await createText(labelEl, sanitizeText(decodeEntities(label), getConfig2()), { + useHtmlLabels, + width: options.width || getConfig2()?.flowchart?.wrappingWidth, + style: options.labelStyle, + addSvgBackground: !!options.icon || !!options.img + }); + let bbox = text2.getBBox(); + const halfPadding = options.padding / 2; + if (evaluate(getConfig2()?.flowchart?.htmlLabels)) { + const div = text2.children[0]; + const dv = select(text2); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + if (useHtmlLabels) { + labelEl.attr("transform", "translate(" + -bbox.width / 2 + ", " + -bbox.height / 2 + ")"); + } else { + labelEl.attr("transform", "translate(0, " + -bbox.height / 2 + ")"); + } + if (options.centerLabel) { + labelEl.attr("transform", "translate(" + -bbox.width / 2 + ", " + -bbox.height / 2 + ")"); + } + labelEl.insert("rect", ":first-child"); + return { shapeSvg: parent, bbox, halfPadding, label: labelEl }; +}, "insertLabel"); +var updateNodeBounds = /* @__PURE__ */ __name((node, element) => { + const bbox = element.node().getBBox(); + node.width = bbox.width; + node.height = bbox.height; +}, "updateNodeBounds"); +var getNodeClasses = /* @__PURE__ */ __name((node, extra) => (node.look === "handDrawn" ? "rough-node" : "node") + " " + node.cssClasses + " " + (extra || ""), "getNodeClasses"); +function createPathFromPoints(points) { + const pointStrings = points.map((p, i) => `${i === 0 ? "M" : "L"}${p.x},${p.y}`); + pointStrings.push("Z"); + return pointStrings.join(" "); +} +__name(createPathFromPoints, "createPathFromPoints"); +function generateFullSineWavePoints(x1, y1, x2, y2, amplitude, numCycles) { + const points = []; + const steps = 50; + const deltaX = x2 - x1; + const deltaY = y2 - y1; + const cycleLength = deltaX / numCycles; + const frequency = 2 * Math.PI / cycleLength; + const midY = y1 + deltaY / 2; + for (let i = 0; i <= steps; i++) { + const t = i / steps; + const x = x1 + t * deltaX; + const y = midY + amplitude * Math.sin(frequency * (x - x1)); + points.push({ x, y }); + } + return points; +} +__name(generateFullSineWavePoints, "generateFullSineWavePoints"); +function generateCirclePoints(centerX, centerY, radius, numPoints, startAngle, endAngle) { + const points = []; + const startAngleRad = startAngle * Math.PI / 180; + const endAngleRad = endAngle * Math.PI / 180; + const angleRange = endAngleRad - startAngleRad; + const angleStep = angleRange / (numPoints - 1); + for (let i = 0; i < numPoints; i++) { + const angle = startAngleRad + i * angleStep; + const x = centerX + radius * Math.cos(angle); + const y = centerY + radius * Math.sin(angle); + points.push({ x: -x, y: -y }); + } + return points; +} +__name(generateCirclePoints, "generateCirclePoints"); + +// src/rendering-util/rendering-elements/clusters.js +import { select as select3 } from "d3"; +import rough from "roughjs"; + +// src/rendering-util/rendering-elements/intersect/intersect-rect.js +var intersectRect = /* @__PURE__ */ __name((node, point) => { + var x = node.x; + var y = node.y; + var dx = point.x - x; + var dy = point.y - y; + var w = node.width / 2; + var h = node.height / 2; + var sx, sy; + if (Math.abs(dy) * w > Math.abs(dx) * h) { + if (dy < 0) { + h = -h; + } + sx = dy === 0 ? 0 : h * dx / dy; + sy = h; + } else { + if (dx < 0) { + w = -w; + } + sx = w; + sy = dx === 0 ? 0 : w * dy / dx; + } + return { x: x + sx, y: y + sy }; +}, "intersectRect"); +var intersect_rect_default = intersectRect; + +// src/rendering-util/rendering-elements/createLabel.js +import { select as select2 } from "d3"; +function applyStyle(dom, styleFn) { + if (styleFn) { + dom.attr("style", styleFn); + } +} +__name(applyStyle, "applyStyle"); +async function addHtmlLabel(node) { + const fo = select2(document.createElementNS("http://www.w3.org/2000/svg", "foreignObject")); + const div = fo.append("xhtml:div"); + const config = getConfig2(); + let label = node.label; + if (node.label && hasKatex(node.label)) { + label = await renderKatexSanitized(node.label.replace(common_default.lineBreakRegex, "\n"), config); + } + const labelClass = node.isNode ? "nodeLabel" : "edgeLabel"; + const labelSpan = '" + label + ""; + div.html(sanitizeText(labelSpan, config)); + applyStyle(div, node.labelStyle); + div.style("display", "inline-block"); + div.style("padding-right", "1px"); + div.style("white-space", "nowrap"); + div.attr("xmlns", "http://www.w3.org/1999/xhtml"); + return fo.node(); +} +__name(addHtmlLabel, "addHtmlLabel"); +var createLabel = /* @__PURE__ */ __name(async (_vertexText, style, isTitle, isNode) => { + let vertexText = _vertexText || ""; + if (typeof vertexText === "object") { + vertexText = vertexText[0]; + } + if (evaluate(getConfig2().flowchart.htmlLabels)) { + vertexText = vertexText.replace(/\\n|\n/g, "
"); + log.info("vertexText" + vertexText); + const node = { + isNode, + label: decodeEntities(vertexText).replace( + /fa[blrs]?:fa-[\w-]+/g, + (s) => `` + ), + labelStyle: style ? style.replace("fill:", "color:") : style + }; + let vertexNode = await addHtmlLabel(node); + return vertexNode; + } else { + const svgLabel = document.createElementNS("http://www.w3.org/2000/svg", "text"); + svgLabel.setAttribute("style", style.replace("color:", "fill:")); + let rows = []; + if (typeof vertexText === "string") { + rows = vertexText.split(/\\n|\n|/gi); + } else if (Array.isArray(vertexText)) { + rows = vertexText; + } else { + rows = []; + } + for (const row of rows) { + const tspan = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + tspan.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve"); + tspan.setAttribute("dy", "1em"); + tspan.setAttribute("x", "0"); + if (isTitle) { + tspan.setAttribute("class", "title-row"); + } else { + tspan.setAttribute("class", "row"); + } + tspan.textContent = row.trim(); + svgLabel.appendChild(tspan); + } + return svgLabel; + } +}, "createLabel"); +var createLabel_default = createLabel; + +// src/rendering-util/rendering-elements/shapes/roundedRectPath.ts +var createRoundedRectPathD = /* @__PURE__ */ __name((x, y, totalWidth, totalHeight, radius) => [ + "M", + x + radius, + y, + // Move to the first point + "H", + x + totalWidth - radius, + // Draw horizontal line to the beginning of the right corner + "A", + radius, + radius, + 0, + 0, + 1, + x + totalWidth, + y + radius, + // Draw arc to the right top corner + "V", + y + totalHeight - radius, + // Draw vertical line down to the beginning of the right bottom corner + "A", + radius, + radius, + 0, + 0, + 1, + x + totalWidth - radius, + y + totalHeight, + // Draw arc to the right bottom corner + "H", + x + radius, + // Draw horizontal line to the beginning of the left bottom corner + "A", + radius, + radius, + 0, + 0, + 1, + x, + y + totalHeight - radius, + // Draw arc to the left bottom corner + "V", + y + radius, + // Draw vertical line up to the beginning of the left top corner + "A", + radius, + radius, + 0, + 0, + 1, + x + radius, + y, + // Draw arc to the left top corner + "Z" + // Close the path +].join(" "), "createRoundedRectPathD"); + +// src/rendering-util/rendering-elements/clusters.js +var rect = /* @__PURE__ */ __name(async (parent, node) => { + log.info("Creating subgraph rect for ", node.id, node); + const siteConfig = getConfig2(); + const { themeVariables, handDrawnSeed } = siteConfig; + const { clusterBkg, clusterBorder } = themeVariables; + const { labelStyles, nodeStyles, borderStyles, backgroundStyles } = styles2String(node); + const shapeSvg = parent.insert("g").attr("class", "cluster " + node.cssClasses).attr("id", node.id).attr("data-look", node.look); + const useHtmlLabels = evaluate(siteConfig.flowchart.htmlLabels); + const labelEl = shapeSvg.insert("g").attr("class", "cluster-label "); + const text2 = await createText(labelEl, node.label, { + style: node.labelStyle, + useHtmlLabels, + isNode: true + }); + let bbox = text2.getBBox(); + if (evaluate(siteConfig.flowchart.htmlLabels)) { + const div = text2.children[0]; + const dv = select3(text2); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + const width = node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width; + if (node.width <= bbox.width + node.padding) { + node.diff = (width - node.width) / 2 - node.padding; + } else { + node.diff = -node.padding; + } + const height = node.height; + const x = node.x - width / 2; + const y = node.y - height / 2; + log.trace("Data ", node, JSON.stringify(node)); + let rect2; + if (node.look === "handDrawn") { + const rc = rough.svg(shapeSvg); + const options = userNodeOverrides(node, { + roughness: 0.7, + fill: clusterBkg, + // fill: 'red', + stroke: clusterBorder, + fillWeight: 3, + seed: handDrawnSeed + }); + const roughNode = rc.path(createRoundedRectPathD(x, y, width, height, 0), options); + rect2 = shapeSvg.insert(() => { + log.debug("Rough node insert CXC", roughNode); + return roughNode; + }, ":first-child"); + rect2.select("path:nth-child(2)").attr("style", borderStyles.join(";")); + rect2.select("path").attr("style", backgroundStyles.join(";").replace("fill", "stroke")); + } else { + rect2 = shapeSvg.insert("rect", ":first-child"); + rect2.attr("style", nodeStyles).attr("rx", node.rx).attr("ry", node.ry).attr("x", x).attr("y", y).attr("width", width).attr("height", height); + } + const { subGraphTitleTopMargin } = getSubGraphTitleMargins(siteConfig); + labelEl.attr( + "transform", + // This puts the label on top of the box instead of inside it + `translate(${node.x - bbox.width / 2}, ${node.y - node.height / 2 + subGraphTitleTopMargin})` + ); + if (labelStyles) { + const span = labelEl.select("span"); + if (span) { + span.attr("style", labelStyles); + } + } + const rectBox = rect2.node().getBBox(); + node.offsetX = 0; + node.width = rectBox.width; + node.height = rectBox.height; + node.offsetY = bbox.height - node.padding / 2; + node.intersect = function(point) { + return intersect_rect_default(node, point); + }; + return { cluster: shapeSvg, labelBBox: bbox }; +}, "rect"); +var noteGroup = /* @__PURE__ */ __name((parent, node) => { + const shapeSvg = parent.insert("g").attr("class", "note-cluster").attr("id", node.id); + const rect2 = shapeSvg.insert("rect", ":first-child"); + const padding = 0 * node.padding; + const halfPadding = padding / 2; + rect2.attr("rx", node.rx).attr("ry", node.ry).attr("x", node.x - node.width / 2 - halfPadding).attr("y", node.y - node.height / 2 - halfPadding).attr("width", node.width + padding).attr("height", node.height + padding).attr("fill", "none"); + const rectBox = rect2.node().getBBox(); + node.width = rectBox.width; + node.height = rectBox.height; + node.intersect = function(point) { + return intersect_rect_default(node, point); + }; + return { cluster: shapeSvg, labelBBox: { width: 0, height: 0 } }; +}, "noteGroup"); +var roundedWithTitle = /* @__PURE__ */ __name(async (parent, node) => { + const siteConfig = getConfig2(); + const { themeVariables, handDrawnSeed } = siteConfig; + const { altBackground, compositeBackground, compositeTitleBackground, nodeBorder } = themeVariables; + const shapeSvg = parent.insert("g").attr("class", node.cssClasses).attr("id", node.id).attr("data-id", node.id).attr("data-look", node.look); + const outerRectG = shapeSvg.insert("g", ":first-child"); + const label = shapeSvg.insert("g").attr("class", "cluster-label"); + let innerRect = shapeSvg.append("rect"); + const text2 = label.node().appendChild(await createLabel_default(node.label, node.labelStyle, void 0, true)); + let bbox = text2.getBBox(); + if (evaluate(siteConfig.flowchart.htmlLabels)) { + const div = text2.children[0]; + const dv = select3(text2); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + const padding = 0 * node.padding; + const halfPadding = padding / 2; + const width = (node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width) + padding; + if (node.width <= bbox.width + node.padding) { + node.diff = (width - node.width) / 2 - node.padding; + } else { + node.diff = -node.padding; + } + const height = node.height + padding; + const innerHeight = node.height + padding - bbox.height - 6; + const x = node.x - width / 2; + const y = node.y - height / 2; + node.width = width; + const innerY = node.y - node.height / 2 - halfPadding + bbox.height + 2; + let rect2; + if (node.look === "handDrawn") { + const isAlt = node.cssClasses.includes("statediagram-cluster-alt"); + const rc = rough.svg(shapeSvg); + const roughOuterNode = node.rx || node.ry ? rc.path(createRoundedRectPathD(x, y, width, height, 10), { + roughness: 0.7, + fill: compositeTitleBackground, + fillStyle: "solid", + stroke: nodeBorder, + seed: handDrawnSeed + }) : rc.rectangle(x, y, width, height, { seed: handDrawnSeed }); + rect2 = shapeSvg.insert(() => roughOuterNode, ":first-child"); + const roughInnerNode = rc.rectangle(x, innerY, width, innerHeight, { + fill: isAlt ? altBackground : compositeBackground, + fillStyle: isAlt ? "hachure" : "solid", + stroke: nodeBorder, + seed: handDrawnSeed + }); + rect2 = shapeSvg.insert(() => roughOuterNode, ":first-child"); + innerRect = shapeSvg.insert(() => roughInnerNode); + } else { + rect2 = outerRectG.insert("rect", ":first-child"); + const outerRectClass = "outer"; + rect2.attr("class", outerRectClass).attr("x", x).attr("y", y).attr("width", width).attr("height", height).attr("data-look", node.look); + innerRect.attr("class", "inner").attr("x", x).attr("y", innerY).attr("width", width).attr("height", innerHeight); + } + label.attr( + "transform", + `translate(${node.x - bbox.width / 2}, ${y + 1 - (evaluate(siteConfig.flowchart.htmlLabels) ? 0 : 3)})` + ); + const rectBox = rect2.node().getBBox(); + node.height = rectBox.height; + node.offsetX = 0; + node.offsetY = bbox.height - node.padding / 2; + node.labelBBox = bbox; + node.intersect = function(point) { + return intersect_rect_default(node, point); + }; + return { cluster: shapeSvg, labelBBox: bbox }; +}, "roundedWithTitle"); +var kanbanSection = /* @__PURE__ */ __name(async (parent, node) => { + log.info("Creating subgraph rect for ", node.id, node); + const siteConfig = getConfig2(); + const { themeVariables, handDrawnSeed } = siteConfig; + const { clusterBkg, clusterBorder } = themeVariables; + const { labelStyles, nodeStyles, borderStyles, backgroundStyles } = styles2String(node); + const shapeSvg = parent.insert("g").attr("class", "cluster " + node.cssClasses).attr("id", node.id).attr("data-look", node.look); + const useHtmlLabels = evaluate(siteConfig.flowchart.htmlLabels); + const labelEl = shapeSvg.insert("g").attr("class", "cluster-label "); + const text2 = await createText(labelEl, node.label, { + style: node.labelStyle, + useHtmlLabels, + isNode: true, + width: node.width + }); + let bbox = text2.getBBox(); + if (evaluate(siteConfig.flowchart.htmlLabels)) { + const div = text2.children[0]; + const dv = select3(text2); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + const width = node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width; + if (node.width <= bbox.width + node.padding) { + node.diff = (width - node.width) / 2 - node.padding; + } else { + node.diff = -node.padding; + } + const height = node.height; + const x = node.x - width / 2; + const y = node.y - height / 2; + log.trace("Data ", node, JSON.stringify(node)); + let rect2; + if (node.look === "handDrawn") { + const rc = rough.svg(shapeSvg); + const options = userNodeOverrides(node, { + roughness: 0.7, + fill: clusterBkg, + // fill: 'red', + stroke: clusterBorder, + fillWeight: 4, + seed: handDrawnSeed + }); + const roughNode = rc.path(createRoundedRectPathD(x, y, width, height, node.rx), options); + rect2 = shapeSvg.insert(() => { + log.debug("Rough node insert CXC", roughNode); + return roughNode; + }, ":first-child"); + rect2.select("path:nth-child(2)").attr("style", borderStyles.join(";")); + rect2.select("path").attr("style", backgroundStyles.join(";").replace("fill", "stroke")); + } else { + rect2 = shapeSvg.insert("rect", ":first-child"); + rect2.attr("style", nodeStyles).attr("rx", node.rx).attr("ry", node.ry).attr("x", x).attr("y", y).attr("width", width).attr("height", height); + } + const { subGraphTitleTopMargin } = getSubGraphTitleMargins(siteConfig); + labelEl.attr( + "transform", + // This puts the label on top of the box instead of inside it + `translate(${node.x - bbox.width / 2}, ${node.y - node.height / 2 + subGraphTitleTopMargin})` + ); + if (labelStyles) { + const span = labelEl.select("span"); + if (span) { + span.attr("style", labelStyles); + } + } + const rectBox = rect2.node().getBBox(); + node.offsetX = 0; + node.width = rectBox.width; + node.height = rectBox.height; + node.offsetY = bbox.height - node.padding / 2; + node.intersect = function(point) { + return intersect_rect_default(node, point); + }; + return { cluster: shapeSvg, labelBBox: bbox }; +}, "kanbanSection"); +var divider = /* @__PURE__ */ __name((parent, node) => { + const siteConfig = getConfig2(); + const { themeVariables, handDrawnSeed } = siteConfig; + const { nodeBorder } = themeVariables; + const shapeSvg = parent.insert("g").attr("class", node.cssClasses).attr("id", node.id).attr("data-look", node.look); + const outerRectG = shapeSvg.insert("g", ":first-child"); + const padding = 0 * node.padding; + const width = node.width + padding; + node.diff = -node.padding; + const height = node.height + padding; + const x = node.x - width / 2; + const y = node.y - height / 2; + node.width = width; + let rect2; + if (node.look === "handDrawn") { + const rc = rough.svg(shapeSvg); + const roughOuterNode = rc.rectangle(x, y, width, height, { + fill: "lightgrey", + roughness: 0.5, + strokeLineDash: [5], + stroke: nodeBorder, + seed: handDrawnSeed + }); + rect2 = shapeSvg.insert(() => roughOuterNode, ":first-child"); + } else { + rect2 = outerRectG.insert("rect", ":first-child"); + const outerRectClass = "divider"; + rect2.attr("class", outerRectClass).attr("x", x).attr("y", y).attr("width", width).attr("height", height).attr("data-look", node.look); + } + const rectBox = rect2.node().getBBox(); + node.height = rectBox.height; + node.offsetX = 0; + node.offsetY = 0; + node.intersect = function(point) { + return intersect_rect_default(node, point); + }; + return { cluster: shapeSvg, labelBBox: {} }; +}, "divider"); +var squareRect = rect; +var shapes = { + rect, + squareRect, + roundedWithTitle, + noteGroup, + divider, + kanbanSection +}; +var clusterElems = /* @__PURE__ */ new Map(); +var insertCluster = /* @__PURE__ */ __name(async (elem, node) => { + const shape = node.shape || "rect"; + const cluster = await shapes[shape](elem, node); + clusterElems.set(node.id, cluster); + return cluster; +}, "insertCluster"); +var clear = /* @__PURE__ */ __name(() => { + clusterElems = /* @__PURE__ */ new Map(); +}, "clear"); + +// src/rendering-util/rendering-elements/intersect/intersect-node.js +function intersectNode(node, point) { + return node.intersect(point); +} +__name(intersectNode, "intersectNode"); +var intersect_node_default = intersectNode; + +// src/rendering-util/rendering-elements/intersect/intersect-ellipse.js +function intersectEllipse(node, rx, ry, point) { + var cx = node.x; + var cy = node.y; + var px = cx - point.x; + var py = cy - point.y; + var det = Math.sqrt(rx * rx * py * py + ry * ry * px * px); + var dx = Math.abs(rx * ry * px / det); + if (point.x < cx) { + dx = -dx; + } + var dy = Math.abs(rx * ry * py / det); + if (point.y < cy) { + dy = -dy; + } + return { x: cx + dx, y: cy + dy }; +} +__name(intersectEllipse, "intersectEllipse"); +var intersect_ellipse_default = intersectEllipse; + +// src/rendering-util/rendering-elements/intersect/intersect-circle.js +function intersectCircle(node, rx, point) { + return intersect_ellipse_default(node, rx, rx, point); +} +__name(intersectCircle, "intersectCircle"); +var intersect_circle_default = intersectCircle; + +// src/rendering-util/rendering-elements/intersect/intersect-line.js +function intersectLine(p1, p2, q1, q2) { + { + const a1 = p2.y - p1.y; + const b1 = p1.x - p2.x; + const c1 = p2.x * p1.y - p1.x * p2.y; + const r3 = a1 * q1.x + b1 * q1.y + c1; + const r4 = a1 * q2.x + b1 * q2.y + c1; + const epsilon = 1e-6; + if (r3 !== 0 && r4 !== 0 && sameSign(r3, r4)) { + return; + } + const a2 = q2.y - q1.y; + const b2 = q1.x - q2.x; + const c2 = q2.x * q1.y - q1.x * q2.y; + const r1 = a2 * p1.x + b2 * p1.y + c2; + const r2 = a2 * p2.x + b2 * p2.y + c2; + if (Math.abs(r1) < epsilon && Math.abs(r2) < epsilon && sameSign(r1, r2)) { + return; + } + const denom = a1 * b2 - a2 * b1; + if (denom === 0) { + return; + } + const offset = Math.abs(denom / 2); + let num = b1 * c2 - b2 * c1; + const x = num < 0 ? (num - offset) / denom : (num + offset) / denom; + num = a2 * c1 - a1 * c2; + const y = num < 0 ? (num - offset) / denom : (num + offset) / denom; + return { x, y }; + } +} +__name(intersectLine, "intersectLine"); +function sameSign(r1, r2) { + return r1 * r2 > 0; +} +__name(sameSign, "sameSign"); +var intersect_line_default = intersectLine; + +// src/rendering-util/rendering-elements/intersect/intersect-polygon.js +function intersectPolygon(node, polyPoints, point) { + let x1 = node.x; + let y1 = node.y; + let intersections = []; + let minX = Number.POSITIVE_INFINITY; + let minY = Number.POSITIVE_INFINITY; + if (typeof polyPoints.forEach === "function") { + polyPoints.forEach(function(entry) { + minX = Math.min(minX, entry.x); + minY = Math.min(minY, entry.y); + }); + } else { + minX = Math.min(minX, polyPoints.x); + minY = Math.min(minY, polyPoints.y); + } + let left = x1 - node.width / 2 - minX; + let top = y1 - node.height / 2 - minY; + for (let i = 0; i < polyPoints.length; i++) { + let p1 = polyPoints[i]; + let p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0]; + let intersect = intersect_line_default( + node, + point, + { x: left + p1.x, y: top + p1.y }, + { x: left + p2.x, y: top + p2.y } + ); + if (intersect) { + intersections.push(intersect); + } + } + if (!intersections.length) { + return node; + } + if (intersections.length > 1) { + intersections.sort(function(p, q) { + let pdx = p.x - point.x; + let pdy = p.y - point.y; + let distp = Math.sqrt(pdx * pdx + pdy * pdy); + let qdx = q.x - point.x; + let qdy = q.y - point.y; + let distq = Math.sqrt(qdx * qdx + qdy * qdy); + return distp < distq ? -1 : distp === distq ? 0 : 1; + }); + } + return intersections[0]; +} +__name(intersectPolygon, "intersectPolygon"); +var intersect_polygon_default = intersectPolygon; + +// src/rendering-util/rendering-elements/intersect/index.js +var intersect_default = { + node: intersect_node_default, + circle: intersect_circle_default, + ellipse: intersect_ellipse_default, + polygon: intersect_polygon_default, + rect: intersect_rect_default +}; + +// src/rendering-util/rendering-elements/shapes/anchor.ts +import rough2 from "roughjs"; +function anchor(parent, node) { + const { labelStyles } = styles2String(node); + node.labelStyle = labelStyles; + const classes = getNodeClasses(node); + let cssClasses = classes; + if (!classes) { + cssClasses = "anchor"; + } + const shapeSvg = parent.insert("g").attr("class", cssClasses).attr("id", node.domId || node.id); + const radius = 1; + const { cssStyles } = node; + const rc = rough2.svg(shapeSvg); + const options = userNodeOverrides(node, { fill: "black", stroke: "none", fillStyle: "solid" }); + if (node.look !== "handDrawn") { + options.roughness = 0; + } + const roughNode = rc.circle(0, 0, radius * 2, options); + const circleElem = shapeSvg.insert(() => roughNode, ":first-child"); + circleElem.attr("class", "anchor").attr("style", handleUndefinedAttr(cssStyles)); + updateNodeBounds(node, circleElem); + node.intersect = function(point) { + log.info("Circle intersect", node, radius, point); + return intersect_default.circle(node, radius, point); + }; + return shapeSvg; +} +__name(anchor, "anchor"); + +// src/rendering-util/rendering-elements/shapes/bowTieRect.ts +import rough3 from "roughjs"; +function generateArcPoints(x1, y1, x2, y2, rx, ry, clockwise) { + const numPoints = 20; + const midX = (x1 + x2) / 2; + const midY = (y1 + y2) / 2; + const angle = Math.atan2(y2 - y1, x2 - x1); + const dx = (x2 - x1) / 2; + const dy = (y2 - y1) / 2; + const transformedX = dx / rx; + const transformedY = dy / ry; + const distance = Math.sqrt(transformedX ** 2 + transformedY ** 2); + if (distance > 1) { + throw new Error("The given radii are too small to create an arc between the points."); + } + const scaledCenterDistance = Math.sqrt(1 - distance ** 2); + const centerX = midX + scaledCenterDistance * ry * Math.sin(angle) * (clockwise ? -1 : 1); + const centerY = midY - scaledCenterDistance * rx * Math.cos(angle) * (clockwise ? -1 : 1); + const startAngle = Math.atan2((y1 - centerY) / ry, (x1 - centerX) / rx); + const endAngle = Math.atan2((y2 - centerY) / ry, (x2 - centerX) / rx); + let angleRange = endAngle - startAngle; + if (clockwise && angleRange < 0) { + angleRange += 2 * Math.PI; + } + if (!clockwise && angleRange > 0) { + angleRange -= 2 * Math.PI; + } + const points = []; + for (let i = 0; i < numPoints; i++) { + const t = i / (numPoints - 1); + const angle2 = startAngle + t * angleRange; + const x = centerX + rx * Math.cos(angle2); + const y = centerY + ry * Math.sin(angle2); + points.push({ x, y }); + } + return points; +} +__name(generateArcPoints, "generateArcPoints"); +async function bowTieRect(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const w = bbox.width + node.padding + 20; + const h = bbox.height + node.padding; + const ry = h / 2; + const rx = ry / (2.5 + h / 50); + const { cssStyles } = node; + const points = [ + { x: w / 2, y: -h / 2 }, + { x: -w / 2, y: -h / 2 }, + ...generateArcPoints(-w / 2, -h / 2, -w / 2, h / 2, rx, ry, false), + { x: w / 2, y: h / 2 }, + ...generateArcPoints(w / 2, h / 2, w / 2, -h / 2, rx, ry, true) + ]; + const rc = rough3.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const bowTieRectPath = createPathFromPoints(points); + const bowTieRectShapePath = rc.path(bowTieRectPath, options); + const bowTieRectShape = shapeSvg.insert(() => bowTieRectShapePath, ":first-child"); + bowTieRectShape.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + bowTieRectShape.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + bowTieRectShape.selectAll("path").attr("style", nodeStyles); + } + bowTieRectShape.attr("transform", `translate(${rx / 2}, 0)`); + updateNodeBounds(node, bowTieRectShape); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(bowTieRect, "bowTieRect"); + +// src/rendering-util/rendering-elements/shapes/card.ts +import rough4 from "roughjs"; + +// src/rendering-util/rendering-elements/shapes/insertPolygonShape.ts +function insertPolygonShape(parent, w, h, points) { + return parent.insert("polygon", ":first-child").attr( + "points", + points.map(function(d) { + return d.x + "," + d.y; + }).join(" ") + ).attr("class", "label-container").attr("transform", "translate(" + -w / 2 + "," + h / 2 + ")"); +} +__name(insertPolygonShape, "insertPolygonShape"); + +// src/rendering-util/rendering-elements/shapes/card.ts +async function card(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const h = bbox.height + node.padding; + const padding = 12; + const w = bbox.width + node.padding + padding; + const left = 0; + const right = w; + const top = -h; + const bottom = 0; + const points = [ + { x: left + padding, y: top }, + { x: right, y: top }, + { x: right, y: bottom }, + { x: left, y: bottom }, + { x: left, y: top + padding }, + { x: left + padding, y: top } + ]; + let polygon; + const { cssStyles } = node; + if (node.look === "handDrawn") { + const rc = rough4.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const pathData = createPathFromPoints(points); + const roughNode = rc.path(pathData, options); + polygon = shapeSvg.insert(() => roughNode, ":first-child").attr("transform", `translate(${-w / 2}, ${h / 2})`); + if (cssStyles) { + polygon.attr("style", cssStyles); + } + } else { + polygon = insertPolygonShape(shapeSvg, w, h, points); + } + if (nodeStyles) { + polygon.attr("style", nodeStyles); + } + updateNodeBounds(node, polygon); + node.intersect = function(point) { + return intersect_default.polygon(node, points, point); + }; + return shapeSvg; +} +__name(card, "card"); + +// src/rendering-util/rendering-elements/shapes/choice.ts +import rough5 from "roughjs"; +function choice(parent, node) { + const { nodeStyles } = styles2String(node); + node.label = ""; + const shapeSvg = parent.insert("g").attr("class", getNodeClasses(node)).attr("id", node.domId ?? node.id); + const { cssStyles } = node; + const s = Math.max(28, node.width ?? 0); + const points = [ + { x: 0, y: s / 2 }, + { x: s / 2, y: 0 }, + { x: 0, y: -s / 2 }, + { x: -s / 2, y: 0 } + ]; + const rc = rough5.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const choicePath = createPathFromPoints(points); + const roughNode = rc.path(choicePath, options); + const choiceShape = shapeSvg.insert(() => roughNode, ":first-child"); + if (cssStyles && node.look !== "handDrawn") { + choiceShape.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + choiceShape.selectAll("path").attr("style", nodeStyles); + } + node.width = 28; + node.height = 28; + node.intersect = function(point) { + return intersect_default.polygon(node, points, point); + }; + return shapeSvg; +} +__name(choice, "choice"); + +// src/rendering-util/rendering-elements/shapes/circle.ts +import rough6 from "roughjs"; +async function circle(parent, node, options) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, halfPadding } = await labelHelper(parent, node, getNodeClasses(node)); + const padding = options?.padding ?? halfPadding; + const radius = bbox.width / 2 + padding; + let circleElem; + const { cssStyles } = node; + if (node.look === "handDrawn") { + const rc = rough6.svg(shapeSvg); + const options2 = userNodeOverrides(node, {}); + const roughNode = rc.circle(0, 0, radius * 2, options2); + circleElem = shapeSvg.insert(() => roughNode, ":first-child"); + circleElem.attr("class", "basic label-container").attr("style", handleUndefinedAttr(cssStyles)); + } else { + circleElem = shapeSvg.insert("circle", ":first-child").attr("class", "basic label-container").attr("style", nodeStyles).attr("r", radius).attr("cx", 0).attr("cy", 0); + } + updateNodeBounds(node, circleElem); + node.calcIntersect = function(bounds, point) { + const radius2 = bounds.width / 2; + return intersect_default.circle(bounds, radius2, point); + }; + node.intersect = function(point) { + log.info("Circle intersect", node, radius, point); + return intersect_default.circle(node, radius, point); + }; + return shapeSvg; +} +__name(circle, "circle"); + +// src/rendering-util/rendering-elements/shapes/crossedCircle.ts +import rough7 from "roughjs"; +function createLine(r) { + const xAxis45 = Math.cos(Math.PI / 4); + const yAxis45 = Math.sin(Math.PI / 4); + const lineLength = r * 2; + const pointQ1 = { x: lineLength / 2 * xAxis45, y: lineLength / 2 * yAxis45 }; + const pointQ2 = { x: -(lineLength / 2) * xAxis45, y: lineLength / 2 * yAxis45 }; + const pointQ3 = { x: -(lineLength / 2) * xAxis45, y: -(lineLength / 2) * yAxis45 }; + const pointQ4 = { x: lineLength / 2 * xAxis45, y: -(lineLength / 2) * yAxis45 }; + return `M ${pointQ2.x},${pointQ2.y} L ${pointQ4.x},${pointQ4.y} + M ${pointQ1.x},${pointQ1.y} L ${pointQ3.x},${pointQ3.y}`; +} +__name(createLine, "createLine"); +function crossedCircle(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + node.label = ""; + const shapeSvg = parent.insert("g").attr("class", getNodeClasses(node)).attr("id", node.domId ?? node.id); + const radius = Math.max(30, node?.width ?? 0); + const { cssStyles } = node; + const rc = rough7.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const circleNode = rc.circle(0, 0, radius * 2, options); + const linePath = createLine(radius); + const lineNode = rc.path(linePath, options); + const crossedCircle2 = shapeSvg.insert(() => circleNode, ":first-child"); + crossedCircle2.insert(() => lineNode); + if (cssStyles && node.look !== "handDrawn") { + crossedCircle2.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + crossedCircle2.selectAll("path").attr("style", nodeStyles); + } + updateNodeBounds(node, crossedCircle2); + node.intersect = function(point) { + log.info("crossedCircle intersect", node, { radius, point }); + const pos = intersect_default.circle(node, radius, point); + return pos; + }; + return shapeSvg; +} +__name(crossedCircle, "crossedCircle"); + +// src/rendering-util/rendering-elements/shapes/curlyBraceLeft.ts +import rough8 from "roughjs"; +function generateCirclePoints2(centerX, centerY, radius, numPoints = 100, startAngle = 0, endAngle = 180) { + const points = []; + const startAngleRad = startAngle * Math.PI / 180; + const endAngleRad = endAngle * Math.PI / 180; + const angleRange = endAngleRad - startAngleRad; + const angleStep = angleRange / (numPoints - 1); + for (let i = 0; i < numPoints; i++) { + const angle = startAngleRad + i * angleStep; + const x = centerX + radius * Math.cos(angle); + const y = centerY + radius * Math.sin(angle); + points.push({ x: -x, y: -y }); + } + return points; +} +__name(generateCirclePoints2, "generateCirclePoints"); +async function curlyBraceLeft(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = bbox.width + (node.padding ?? 0); + const h = bbox.height + (node.padding ?? 0); + const radius = Math.max(5, h * 0.1); + const { cssStyles } = node; + const points = [ + ...generateCirclePoints2(w / 2, -h / 2, radius, 30, -90, 0), + { x: -w / 2 - radius, y: radius }, + ...generateCirclePoints2(w / 2 + radius * 2, -radius, radius, 20, -180, -270), + ...generateCirclePoints2(w / 2 + radius * 2, radius, radius, 20, -90, -180), + { x: -w / 2 - radius, y: -h / 2 }, + ...generateCirclePoints2(w / 2, h / 2, radius, 20, 0, 90) + ]; + const rectPoints = [ + { x: w / 2, y: -h / 2 - radius }, + { x: -w / 2, y: -h / 2 - radius }, + ...generateCirclePoints2(w / 2, -h / 2, radius, 20, -90, 0), + { x: -w / 2 - radius, y: -radius }, + ...generateCirclePoints2(w / 2 + w * 0.1, -radius, radius, 20, -180, -270), + ...generateCirclePoints2(w / 2 + w * 0.1, radius, radius, 20, -90, -180), + { x: -w / 2 - radius, y: h / 2 }, + ...generateCirclePoints2(w / 2, h / 2, radius, 20, 0, 90), + { x: -w / 2, y: h / 2 + radius }, + { x: w / 2, y: h / 2 + radius } + ]; + const rc = rough8.svg(shapeSvg); + const options = userNodeOverrides(node, { fill: "none" }); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const curlyBraceLeftPath = createPathFromPoints(points); + const newCurlyBracePath = curlyBraceLeftPath.replace("Z", ""); + const curlyBraceLeftNode = rc.path(newCurlyBracePath, options); + const rectPath = createPathFromPoints(rectPoints); + const rectShape = rc.path(rectPath, { ...options }); + const curlyBraceLeftShape = shapeSvg.insert("g", ":first-child"); + curlyBraceLeftShape.insert(() => rectShape, ":first-child").attr("stroke-opacity", 0); + curlyBraceLeftShape.insert(() => curlyBraceLeftNode, ":first-child"); + curlyBraceLeftShape.attr("class", "text"); + if (cssStyles && node.look !== "handDrawn") { + curlyBraceLeftShape.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + curlyBraceLeftShape.selectAll("path").attr("style", nodeStyles); + } + curlyBraceLeftShape.attr("transform", `translate(${radius}, 0)`); + label.attr( + "transform", + `translate(${-w / 2 + radius - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) / 2 - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, curlyBraceLeftShape); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, rectPoints, point); + return pos; + }; + return shapeSvg; +} +__name(curlyBraceLeft, "curlyBraceLeft"); + +// src/rendering-util/rendering-elements/shapes/curlyBraceRight.ts +import rough9 from "roughjs"; +function generateCirclePoints3(centerX, centerY, radius, numPoints = 100, startAngle = 0, endAngle = 180) { + const points = []; + const startAngleRad = startAngle * Math.PI / 180; + const endAngleRad = endAngle * Math.PI / 180; + const angleRange = endAngleRad - startAngleRad; + const angleStep = angleRange / (numPoints - 1); + for (let i = 0; i < numPoints; i++) { + const angle = startAngleRad + i * angleStep; + const x = centerX + radius * Math.cos(angle); + const y = centerY + radius * Math.sin(angle); + points.push({ x, y }); + } + return points; +} +__name(generateCirclePoints3, "generateCirclePoints"); +async function curlyBraceRight(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = bbox.width + (node.padding ?? 0); + const h = bbox.height + (node.padding ?? 0); + const radius = Math.max(5, h * 0.1); + const { cssStyles } = node; + const points = [ + ...generateCirclePoints3(w / 2, -h / 2, radius, 20, -90, 0), + { x: w / 2 + radius, y: -radius }, + ...generateCirclePoints3(w / 2 + radius * 2, -radius, radius, 20, -180, -270), + ...generateCirclePoints3(w / 2 + radius * 2, radius, radius, 20, -90, -180), + { x: w / 2 + radius, y: h / 2 }, + ...generateCirclePoints3(w / 2, h / 2, radius, 20, 0, 90) + ]; + const rectPoints = [ + { x: -w / 2, y: -h / 2 - radius }, + { x: w / 2, y: -h / 2 - radius }, + ...generateCirclePoints3(w / 2, -h / 2, radius, 20, -90, 0), + { x: w / 2 + radius, y: -radius }, + ...generateCirclePoints3(w / 2 + radius * 2, -radius, radius, 20, -180, -270), + ...generateCirclePoints3(w / 2 + radius * 2, radius, radius, 20, -90, -180), + { x: w / 2 + radius, y: h / 2 }, + ...generateCirclePoints3(w / 2, h / 2, radius, 20, 0, 90), + { x: w / 2, y: h / 2 + radius }, + { x: -w / 2, y: h / 2 + radius } + ]; + const rc = rough9.svg(shapeSvg); + const options = userNodeOverrides(node, { fill: "none" }); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const curlyBraceRightPath = createPathFromPoints(points); + const newCurlyBracePath = curlyBraceRightPath.replace("Z", ""); + const curlyBraceRightNode = rc.path(newCurlyBracePath, options); + const rectPath = createPathFromPoints(rectPoints); + const rectShape = rc.path(rectPath, { ...options }); + const curlyBraceRightShape = shapeSvg.insert("g", ":first-child"); + curlyBraceRightShape.insert(() => rectShape, ":first-child").attr("stroke-opacity", 0); + curlyBraceRightShape.insert(() => curlyBraceRightNode, ":first-child"); + curlyBraceRightShape.attr("class", "text"); + if (cssStyles && node.look !== "handDrawn") { + curlyBraceRightShape.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + curlyBraceRightShape.selectAll("path").attr("style", nodeStyles); + } + curlyBraceRightShape.attr("transform", `translate(${-radius}, 0)`); + label.attr( + "transform", + `translate(${-w / 2 + (node.padding ?? 0) / 2 - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) / 2 - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, curlyBraceRightShape); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, rectPoints, point); + return pos; + }; + return shapeSvg; +} +__name(curlyBraceRight, "curlyBraceRight"); + +// src/rendering-util/rendering-elements/shapes/curlyBraces.ts +import rough10 from "roughjs"; +function generateCirclePoints4(centerX, centerY, radius, numPoints = 100, startAngle = 0, endAngle = 180) { + const points = []; + const startAngleRad = startAngle * Math.PI / 180; + const endAngleRad = endAngle * Math.PI / 180; + const angleRange = endAngleRad - startAngleRad; + const angleStep = angleRange / (numPoints - 1); + for (let i = 0; i < numPoints; i++) { + const angle = startAngleRad + i * angleStep; + const x = centerX + radius * Math.cos(angle); + const y = centerY + radius * Math.sin(angle); + points.push({ x: -x, y: -y }); + } + return points; +} +__name(generateCirclePoints4, "generateCirclePoints"); +async function curlyBraces(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = bbox.width + (node.padding ?? 0); + const h = bbox.height + (node.padding ?? 0); + const radius = Math.max(5, h * 0.1); + const { cssStyles } = node; + const leftCurlyBracePoints = [ + ...generateCirclePoints4(w / 2, -h / 2, radius, 30, -90, 0), + { x: -w / 2 - radius, y: radius }, + ...generateCirclePoints4(w / 2 + radius * 2, -radius, radius, 20, -180, -270), + ...generateCirclePoints4(w / 2 + radius * 2, radius, radius, 20, -90, -180), + { x: -w / 2 - radius, y: -h / 2 }, + ...generateCirclePoints4(w / 2, h / 2, radius, 20, 0, 90) + ]; + const rightCurlyBracePoints = [ + ...generateCirclePoints4(-w / 2 + radius + radius / 2, -h / 2, radius, 20, -90, -180), + { x: w / 2 - radius / 2, y: radius }, + ...generateCirclePoints4(-w / 2 - radius / 2, -radius, radius, 20, 0, 90), + ...generateCirclePoints4(-w / 2 - radius / 2, radius, radius, 20, -90, 0), + { x: w / 2 - radius / 2, y: -radius }, + ...generateCirclePoints4(-w / 2 + radius + radius / 2, h / 2, radius, 30, -180, -270) + ]; + const rectPoints = [ + { x: w / 2, y: -h / 2 - radius }, + { x: -w / 2, y: -h / 2 - radius }, + ...generateCirclePoints4(w / 2, -h / 2, radius, 20, -90, 0), + { x: -w / 2 - radius, y: -radius }, + ...generateCirclePoints4(w / 2 + radius * 2, -radius, radius, 20, -180, -270), + ...generateCirclePoints4(w / 2 + radius * 2, radius, radius, 20, -90, -180), + { x: -w / 2 - radius, y: h / 2 }, + ...generateCirclePoints4(w / 2, h / 2, radius, 20, 0, 90), + { x: -w / 2, y: h / 2 + radius }, + { x: w / 2 - radius - radius / 2, y: h / 2 + radius }, + ...generateCirclePoints4(-w / 2 + radius + radius / 2, -h / 2, radius, 20, -90, -180), + { x: w / 2 - radius / 2, y: radius }, + ...generateCirclePoints4(-w / 2 - radius / 2, -radius, radius, 20, 0, 90), + ...generateCirclePoints4(-w / 2 - radius / 2, radius, radius, 20, -90, 0), + { x: w / 2 - radius / 2, y: -radius }, + ...generateCirclePoints4(-w / 2 + radius + radius / 2, h / 2, radius, 30, -180, -270) + ]; + const rc = rough10.svg(shapeSvg); + const options = userNodeOverrides(node, { fill: "none" }); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const leftCurlyBracePath = createPathFromPoints(leftCurlyBracePoints); + const newLeftCurlyBracePath = leftCurlyBracePath.replace("Z", ""); + const leftCurlyBraceNode = rc.path(newLeftCurlyBracePath, options); + const rightCurlyBracePath = createPathFromPoints(rightCurlyBracePoints); + const newRightCurlyBracePath = rightCurlyBracePath.replace("Z", ""); + const rightCurlyBraceNode = rc.path(newRightCurlyBracePath, options); + const rectPath = createPathFromPoints(rectPoints); + const rectShape = rc.path(rectPath, { ...options }); + const curlyBracesShape = shapeSvg.insert("g", ":first-child"); + curlyBracesShape.insert(() => rectShape, ":first-child").attr("stroke-opacity", 0); + curlyBracesShape.insert(() => leftCurlyBraceNode, ":first-child"); + curlyBracesShape.insert(() => rightCurlyBraceNode, ":first-child"); + curlyBracesShape.attr("class", "text"); + if (cssStyles && node.look !== "handDrawn") { + curlyBracesShape.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + curlyBracesShape.selectAll("path").attr("style", nodeStyles); + } + curlyBracesShape.attr("transform", `translate(${radius - radius / 4}, 0)`); + label.attr( + "transform", + `translate(${-w / 2 + (node.padding ?? 0) / 2 - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) / 2 - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, curlyBracesShape); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, rectPoints, point); + return pos; + }; + return shapeSvg; +} +__name(curlyBraces, "curlyBraces"); + +// src/rendering-util/rendering-elements/shapes/curvedTrapezoid.ts +import rough11 from "roughjs"; +async function curvedTrapezoid(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const minWidth = 80, minHeight = 20; + const w = Math.max(minWidth, (bbox.width + (node.padding ?? 0) * 2) * 1.25, node?.width ?? 0); + const h = Math.max(minHeight, bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const radius = h / 2; + const { cssStyles } = node; + const rc = rough11.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const totalWidth = w, totalHeight = h; + const rw = totalWidth - radius; + const tw = totalHeight / 4; + const points = [ + { x: rw, y: 0 }, + { x: tw, y: 0 }, + { x: 0, y: totalHeight / 2 }, + { x: tw, y: totalHeight }, + { x: rw, y: totalHeight }, + ...generateCirclePoints(-rw, -totalHeight / 2, radius, 50, 270, 90) + ]; + const pathData = createPathFromPoints(points); + const shapeNode = rc.path(pathData, options); + const polygon = shapeSvg.insert(() => shapeNode, ":first-child"); + polygon.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", nodeStyles); + } + polygon.attr("transform", `translate(${-w / 2}, ${-h / 2})`); + updateNodeBounds(node, polygon); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(curvedTrapezoid, "curvedTrapezoid"); + +// src/rendering-util/rendering-elements/shapes/cylinder.ts +import rough12 from "roughjs"; +var createCylinderPathD = /* @__PURE__ */ __name((x, y, width, height, rx, ry) => { + return [ + `M${x},${y + ry}`, + `a${rx},${ry} 0,0,0 ${width},0`, + `a${rx},${ry} 0,0,0 ${-width},0`, + `l0,${height}`, + `a${rx},${ry} 0,0,0 ${width},0`, + `l0,${-height}` + ].join(" "); +}, "createCylinderPathD"); +var createOuterCylinderPathD = /* @__PURE__ */ __name((x, y, width, height, rx, ry) => { + return [ + `M${x},${y + ry}`, + `M${x + width},${y + ry}`, + `a${rx},${ry} 0,0,0 ${-width},0`, + `l0,${height}`, + `a${rx},${ry} 0,0,0 ${width},0`, + `l0,${-height}` + ].join(" "); +}, "createOuterCylinderPathD"); +var createInnerCylinderPathD = /* @__PURE__ */ __name((x, y, width, height, rx, ry) => { + return [`M${x - width / 2},${-height / 2}`, `a${rx},${ry} 0,0,0 ${width},0`].join(" "); +}, "createInnerCylinderPathD"); +async function cylinder(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + node.padding, node.width ?? 0); + const rx = w / 2; + const ry = rx / (2.5 + w / 50); + const h = Math.max(bbox.height + ry + node.padding, node.height ?? 0); + let cylinder2; + const { cssStyles } = node; + if (node.look === "handDrawn") { + const rc = rough12.svg(shapeSvg); + const outerPathData = createOuterCylinderPathD(0, 0, w, h, rx, ry); + const innerPathData = createInnerCylinderPathD(0, ry, w, h, rx, ry); + const outerNode = rc.path(outerPathData, userNodeOverrides(node, {})); + const innerLine = rc.path(innerPathData, userNodeOverrides(node, { fill: "none" })); + cylinder2 = shapeSvg.insert(() => innerLine, ":first-child"); + cylinder2 = shapeSvg.insert(() => outerNode, ":first-child"); + cylinder2.attr("class", "basic label-container"); + if (cssStyles) { + cylinder2.attr("style", cssStyles); + } + } else { + const pathData = createCylinderPathD(0, 0, w, h, rx, ry); + cylinder2 = shapeSvg.insert("path", ":first-child").attr("d", pathData).attr("class", "basic label-container").attr("style", handleUndefinedAttr(cssStyles)).attr("style", nodeStyles); + } + cylinder2.attr("label-offset-y", ry); + cylinder2.attr("transform", `translate(${-w / 2}, ${-(h / 2 + ry)})`); + updateNodeBounds(node, cylinder2); + label.attr( + "transform", + `translate(${-(bbox.width / 2) - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) + (node.padding ?? 0) / 1.5 - (bbox.y - (bbox.top ?? 0))})` + ); + node.intersect = function(point) { + const pos = intersect_default.rect(node, point); + const x = pos.x - (node.x ?? 0); + if (rx != 0 && (Math.abs(x) < (node.width ?? 0) / 2 || Math.abs(x) == (node.width ?? 0) / 2 && Math.abs(pos.y - (node.y ?? 0)) > (node.height ?? 0) / 2 - ry)) { + let y = ry * ry * (1 - x * x / (rx * rx)); + if (y > 0) { + y = Math.sqrt(y); + } + y = ry - y; + if (point.y - (node.y ?? 0) > 0) { + y = -y; + } + pos.y += y; + } + return pos; + }; + return shapeSvg; +} +__name(cylinder, "cylinder"); + +// src/rendering-util/rendering-elements/shapes/dividedRect.ts +import rough13 from "roughjs"; +async function dividedRectangle(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const rectOffset = h * 0.2; + const x = -w / 2; + const y = -h / 2 - rectOffset / 2; + const { cssStyles } = node; + const rc = rough13.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const pts = [ + { x, y: y + rectOffset }, + { x: -x, y: y + rectOffset }, + { x: -x, y: -y }, + { x, y: -y }, + { x, y }, + { x: -x, y }, + { x: -x, y: y + rectOffset } + ]; + const poly = rc.polygon( + pts.map((p) => [p.x, p.y]), + options + ); + const polygon = shapeSvg.insert(() => poly, ":first-child"); + polygon.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + polygon.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + polygon.selectAll("path").attr("style", nodeStyles); + } + label.attr( + "transform", + `translate(${x + (node.padding ?? 0) / 2 - (bbox.x - (bbox.left ?? 0))}, ${y + rectOffset + (node.padding ?? 0) / 2 - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, polygon); + node.intersect = function(point) { + const pos = intersect_default.rect(node, point); + return pos; + }; + return shapeSvg; +} +__name(dividedRectangle, "dividedRectangle"); + +// src/rendering-util/rendering-elements/shapes/doubleCircle.ts +import rough14 from "roughjs"; +async function doublecircle(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, halfPadding } = await labelHelper(parent, node, getNodeClasses(node)); + const gap = 5; + const outerRadius = bbox.width / 2 + halfPadding + gap; + const innerRadius = bbox.width / 2 + halfPadding; + let circleGroup; + const { cssStyles } = node; + if (node.look === "handDrawn") { + const rc = rough14.svg(shapeSvg); + const outerOptions = userNodeOverrides(node, { roughness: 0.2, strokeWidth: 2.5 }); + const innerOptions = userNodeOverrides(node, { roughness: 0.2, strokeWidth: 1.5 }); + const outerRoughNode = rc.circle(0, 0, outerRadius * 2, outerOptions); + const innerRoughNode = rc.circle(0, 0, innerRadius * 2, innerOptions); + circleGroup = shapeSvg.insert("g", ":first-child"); + circleGroup.attr("class", handleUndefinedAttr(node.cssClasses)).attr("style", handleUndefinedAttr(cssStyles)); + circleGroup.node()?.appendChild(outerRoughNode); + circleGroup.node()?.appendChild(innerRoughNode); + } else { + circleGroup = shapeSvg.insert("g", ":first-child"); + const outerCircle = circleGroup.insert("circle", ":first-child"); + const innerCircle = circleGroup.insert("circle"); + circleGroup.attr("class", "basic label-container").attr("style", nodeStyles); + outerCircle.attr("class", "outer-circle").attr("style", nodeStyles).attr("r", outerRadius).attr("cx", 0).attr("cy", 0); + innerCircle.attr("class", "inner-circle").attr("style", nodeStyles).attr("r", innerRadius).attr("cx", 0).attr("cy", 0); + } + updateNodeBounds(node, circleGroup); + node.intersect = function(point) { + log.info("DoubleCircle intersect", node, outerRadius, point); + return intersect_default.circle(node, outerRadius, point); + }; + return shapeSvg; +} +__name(doublecircle, "doublecircle"); + +// src/rendering-util/rendering-elements/shapes/filledCircle.ts +import rough15 from "roughjs"; +function filledCircle(parent, node, { config: { themeVariables } }) { + const { labelStyles, nodeStyles } = styles2String(node); + node.label = ""; + node.labelStyle = labelStyles; + const shapeSvg = parent.insert("g").attr("class", getNodeClasses(node)).attr("id", node.domId ?? node.id); + const radius = 7; + const { cssStyles } = node; + const rc = rough15.svg(shapeSvg); + const { nodeBorder } = themeVariables; + const options = userNodeOverrides(node, { fillStyle: "solid" }); + if (node.look !== "handDrawn") { + options.roughness = 0; + } + const circleNode = rc.circle(0, 0, radius * 2, options); + const filledCircle2 = shapeSvg.insert(() => circleNode, ":first-child"); + filledCircle2.selectAll("path").attr("style", `fill: ${nodeBorder} !important;`); + if (cssStyles && cssStyles.length > 0 && node.look !== "handDrawn") { + filledCircle2.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + filledCircle2.selectAll("path").attr("style", nodeStyles); + } + updateNodeBounds(node, filledCircle2); + node.intersect = function(point) { + log.info("filledCircle intersect", node, { radius, point }); + const pos = intersect_default.circle(node, radius, point); + return pos; + }; + return shapeSvg; +} +__name(filledCircle, "filledCircle"); + +// src/rendering-util/rendering-elements/shapes/flippedTriangle.ts +import rough16 from "roughjs"; +async function flippedTriangle(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = bbox.width + (node.padding ?? 0); + const h = w + bbox.height; + const tw = w + bbox.height; + const points = [ + { x: 0, y: -h }, + { x: tw, y: -h }, + { x: tw / 2, y: 0 } + ]; + const { cssStyles } = node; + const rc = rough16.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const pathData = createPathFromPoints(points); + const roughNode = rc.path(pathData, options); + const flippedTriangle2 = shapeSvg.insert(() => roughNode, ":first-child").attr("transform", `translate(${-h / 2}, ${h / 2})`); + if (cssStyles && node.look !== "handDrawn") { + flippedTriangle2.selectChildren("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + flippedTriangle2.selectChildren("path").attr("style", nodeStyles); + } + node.width = w; + node.height = h; + updateNodeBounds(node, flippedTriangle2); + label.attr( + "transform", + `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))}, ${-h / 2 + (node.padding ?? 0) / 2 + (bbox.y - (bbox.top ?? 0))})` + ); + node.intersect = function(point) { + log.info("Triangle intersect", node, points, point); + return intersect_default.polygon(node, points, point); + }; + return shapeSvg; +} +__name(flippedTriangle, "flippedTriangle"); + +// src/rendering-util/rendering-elements/shapes/forkJoin.ts +import rough17 from "roughjs"; +function forkJoin(parent, node, { dir, config: { state: state2, themeVariables } }) { + const { nodeStyles } = styles2String(node); + node.label = ""; + const shapeSvg = parent.insert("g").attr("class", getNodeClasses(node)).attr("id", node.domId ?? node.id); + const { cssStyles } = node; + let width = Math.max(70, node?.width ?? 0); + let height = Math.max(10, node?.height ?? 0); + if (dir === "LR") { + width = Math.max(10, node?.width ?? 0); + height = Math.max(70, node?.height ?? 0); + } + const x = -1 * width / 2; + const y = -1 * height / 2; + const rc = rough17.svg(shapeSvg); + const options = userNodeOverrides(node, { + stroke: themeVariables.lineColor, + fill: themeVariables.lineColor + }); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const roughNode = rc.rectangle(x, y, width, height, options); + const shape = shapeSvg.insert(() => roughNode, ":first-child"); + if (cssStyles && node.look !== "handDrawn") { + shape.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + shape.selectAll("path").attr("style", nodeStyles); + } + updateNodeBounds(node, shape); + const padding = state2?.padding ?? 0; + if (node.width && node.height) { + node.width += padding / 2 || 0; + node.height += padding / 2 || 0; + } + node.intersect = function(point) { + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(forkJoin, "forkJoin"); + +// src/rendering-util/rendering-elements/shapes/halfRoundedRectangle.ts +import rough18 from "roughjs"; +async function halfRoundedRectangle(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const minWidth = 80, minHeight = 50; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(minWidth, bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(minHeight, bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const radius = h / 2; + const { cssStyles } = node; + const rc = rough18.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const points = [ + { x: -w / 2, y: -h / 2 }, + { x: w / 2 - radius, y: -h / 2 }, + ...generateCirclePoints(-w / 2 + radius, 0, radius, 50, 90, 270), + { x: w / 2 - radius, y: h / 2 }, + { x: -w / 2, y: h / 2 } + ]; + const pathData = createPathFromPoints(points); + const shapeNode = rc.path(pathData, options); + const polygon = shapeSvg.insert(() => shapeNode, ":first-child"); + polygon.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", nodeStyles); + } + updateNodeBounds(node, polygon); + node.intersect = function(point) { + log.info("Pill intersect", node, { radius, point }); + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(halfRoundedRectangle, "halfRoundedRectangle"); + +// src/rendering-util/rendering-elements/shapes/hexagon.ts +import rough19 from "roughjs"; +async function hexagon(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const h = bbox.height + (node.padding ?? 0); + const w = bbox.width + (node.padding ?? 0) * 2.5; + const { cssStyles } = node; + const rc = rough19.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + let halfWidth = w / 2; + const m = halfWidth / 6; + halfWidth = halfWidth + m; + const halfHeight = h / 2; + const fixedLength = halfHeight / 2; + const deducedWidth = halfWidth - fixedLength; + const points = [ + { x: -deducedWidth, y: -halfHeight }, + { x: 0, y: -halfHeight }, + { x: deducedWidth, y: -halfHeight }, + { x: halfWidth, y: 0 }, + { x: deducedWidth, y: halfHeight }, + { x: 0, y: halfHeight }, + { x: -deducedWidth, y: halfHeight }, + { x: -halfWidth, y: 0 } + ]; + const pathData = createPathFromPoints(points); + const shapeNode = rc.path(pathData, options); + const polygon = shapeSvg.insert(() => shapeNode, ":first-child"); + polygon.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", nodeStyles); + } + node.width = w; + node.height = h; + updateNodeBounds(node, polygon); + node.intersect = function(point) { + return intersect_default.polygon(node, points, point); + }; + return shapeSvg; +} +__name(hexagon, "hexagon"); + +// src/rendering-util/rendering-elements/shapes/hourglass.ts +import rough20 from "roughjs"; +async function hourglass(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.label = ""; + node.labelStyle = labelStyles; + const { shapeSvg } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(30, node?.width ?? 0); + const h = Math.max(30, node?.height ?? 0); + const { cssStyles } = node; + const rc = rough20.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const points = [ + { x: 0, y: 0 }, + { x: w, y: 0 }, + { x: 0, y: h }, + { x: w, y: h } + ]; + const pathData = createPathFromPoints(points); + const shapeNode = rc.path(pathData, options); + const polygon = shapeSvg.insert(() => shapeNode, ":first-child"); + polygon.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", nodeStyles); + } + polygon.attr("transform", `translate(${-w / 2}, ${-h / 2})`); + updateNodeBounds(node, polygon); + node.intersect = function(point) { + log.info("Pill intersect", node, { points }); + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(hourglass, "hourglass"); + +// src/rendering-util/rendering-elements/shapes/icon.ts +import rough21 from "roughjs"; +async function icon(parent, node, { config: { themeVariables, flowchart } }) { + const { labelStyles } = styles2String(node); + node.labelStyle = labelStyles; + const assetHeight = node.assetHeight ?? 48; + const assetWidth = node.assetWidth ?? 48; + const iconSize = Math.max(assetHeight, assetWidth); + const defaultWidth = flowchart?.wrappingWidth; + node.width = Math.max(iconSize, defaultWidth ?? 0); + const { shapeSvg, bbox, label } = await labelHelper(parent, node, "icon-shape default"); + const topLabel = node.pos === "t"; + const height = iconSize; + const width = iconSize; + const { nodeBorder } = themeVariables; + const { stylesMap } = compileStyles(node); + const x = -width / 2; + const y = -height / 2; + const labelPadding = node.label ? 8 : 0; + const rc = rough21.svg(shapeSvg); + const options = userNodeOverrides(node, { stroke: "none", fill: "none" }); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const iconNode = rc.rectangle(x, y, width, height, options); + const outerWidth = Math.max(width, bbox.width); + const outerHeight = height + bbox.height + labelPadding; + const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, { + ...options, + fill: "transparent", + stroke: "none" + }); + const iconShape = shapeSvg.insert(() => iconNode, ":first-child"); + const outerShape = shapeSvg.insert(() => outerNode); + if (node.icon) { + const iconElem = shapeSvg.append("g"); + iconElem.html( + `${await getIconSVG(node.icon, { + height: iconSize, + width: iconSize, + fallbackPrefix: "" + })}` + ); + const iconBBox = iconElem.node().getBBox(); + const iconWidth = iconBBox.width; + const iconHeight = iconBBox.height; + const iconX = iconBBox.x; + const iconY = iconBBox.y; + iconElem.attr( + "transform", + `translate(${-iconWidth / 2 - iconX},${topLabel ? bbox.height / 2 + labelPadding / 2 - iconHeight / 2 - iconY : -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY})` + ); + iconElem.attr("style", `color: ${stylesMap.get("stroke") ?? nodeBorder};`); + } + label.attr( + "transform", + `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${topLabel ? -outerHeight / 2 : outerHeight / 2 - bbox.height})` + ); + iconShape.attr( + "transform", + `translate(${0},${topLabel ? bbox.height / 2 + labelPadding / 2 : -bbox.height / 2 - labelPadding / 2})` + ); + updateNodeBounds(node, outerShape); + node.intersect = function(point) { + log.info("iconSquare intersect", node, point); + if (!node.label) { + return intersect_default.rect(node, point); + } + const dx = node.x ?? 0; + const dy = node.y ?? 0; + const nodeHeight = node.height ?? 0; + let points = []; + if (topLabel) { + points = [ + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx + width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx + width / 2, y: dy + nodeHeight / 2 }, + { x: dx - width / 2, y: dy + nodeHeight / 2 }, + { x: dx - width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding } + ]; + } else { + points = [ + { x: dx - width / 2, y: dy - nodeHeight / 2 }, + { x: dx + width / 2, y: dy - nodeHeight / 2 }, + { x: dx + width / 2, y: dy - nodeHeight / 2 + height }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + height }, + { x: dx + bbox.width / 2 / 2, y: dy + nodeHeight / 2 }, + { x: dx - bbox.width / 2, y: dy + nodeHeight / 2 }, + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + height }, + { x: dx - width / 2, y: dy - nodeHeight / 2 + height } + ]; + } + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(icon, "icon"); + +// src/rendering-util/rendering-elements/shapes/iconCircle.ts +import rough22 from "roughjs"; +async function iconCircle(parent, node, { config: { themeVariables, flowchart } }) { + const { labelStyles } = styles2String(node); + node.labelStyle = labelStyles; + const assetHeight = node.assetHeight ?? 48; + const assetWidth = node.assetWidth ?? 48; + const iconSize = Math.max(assetHeight, assetWidth); + const defaultWidth = flowchart?.wrappingWidth; + node.width = Math.max(iconSize, defaultWidth ?? 0); + const { shapeSvg, bbox, label } = await labelHelper(parent, node, "icon-shape default"); + const padding = 20; + const labelPadding = node.label ? 8 : 0; + const topLabel = node.pos === "t"; + const { nodeBorder, mainBkg } = themeVariables; + const { stylesMap } = compileStyles(node); + const rc = rough22.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const fill = stylesMap.get("fill"); + options.stroke = fill ?? mainBkg; + const iconElem = shapeSvg.append("g"); + if (node.icon) { + iconElem.html( + `${await getIconSVG(node.icon, { + height: iconSize, + width: iconSize, + fallbackPrefix: "" + })}` + ); + } + const iconBBox = iconElem.node().getBBox(); + const iconWidth = iconBBox.width; + const iconHeight = iconBBox.height; + const iconX = iconBBox.x; + const iconY = iconBBox.y; + const diameter = Math.max(iconWidth, iconHeight) * Math.SQRT2 + padding * 2; + const iconNode = rc.circle(0, 0, diameter, options); + const outerWidth = Math.max(diameter, bbox.width); + const outerHeight = diameter + bbox.height + labelPadding; + const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, { + ...options, + fill: "transparent", + stroke: "none" + }); + const iconShape = shapeSvg.insert(() => iconNode, ":first-child"); + const outerShape = shapeSvg.insert(() => outerNode); + iconElem.attr( + "transform", + `translate(${-iconWidth / 2 - iconX},${topLabel ? bbox.height / 2 + labelPadding / 2 - iconHeight / 2 - iconY : -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY})` + ); + iconElem.attr("style", `color: ${stylesMap.get("stroke") ?? nodeBorder};`); + label.attr( + "transform", + `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${topLabel ? -outerHeight / 2 : outerHeight / 2 - bbox.height})` + ); + iconShape.attr( + "transform", + `translate(${0},${topLabel ? bbox.height / 2 + labelPadding / 2 : -bbox.height / 2 - labelPadding / 2})` + ); + updateNodeBounds(node, outerShape); + node.intersect = function(point) { + log.info("iconSquare intersect", node, point); + const pos = intersect_default.rect(node, point); + return pos; + }; + return shapeSvg; +} +__name(iconCircle, "iconCircle"); + +// src/rendering-util/rendering-elements/shapes/iconRounded.ts +import rough23 from "roughjs"; +async function iconRounded(parent, node, { config: { themeVariables, flowchart } }) { + const { labelStyles } = styles2String(node); + node.labelStyle = labelStyles; + const assetHeight = node.assetHeight ?? 48; + const assetWidth = node.assetWidth ?? 48; + const iconSize = Math.max(assetHeight, assetWidth); + const defaultWidth = flowchart?.wrappingWidth; + node.width = Math.max(iconSize, defaultWidth ?? 0); + const { shapeSvg, bbox, halfPadding, label } = await labelHelper( + parent, + node, + "icon-shape default" + ); + const topLabel = node.pos === "t"; + const height = iconSize + halfPadding * 2; + const width = iconSize + halfPadding * 2; + const { nodeBorder, mainBkg } = themeVariables; + const { stylesMap } = compileStyles(node); + const x = -width / 2; + const y = -height / 2; + const labelPadding = node.label ? 8 : 0; + const rc = rough23.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const fill = stylesMap.get("fill"); + options.stroke = fill ?? mainBkg; + const iconNode = rc.path(createRoundedRectPathD(x, y, width, height, 5), options); + const outerWidth = Math.max(width, bbox.width); + const outerHeight = height + bbox.height + labelPadding; + const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, { + ...options, + fill: "transparent", + stroke: "none" + }); + const iconShape = shapeSvg.insert(() => iconNode, ":first-child").attr("class", "icon-shape2"); + const outerShape = shapeSvg.insert(() => outerNode); + if (node.icon) { + const iconElem = shapeSvg.append("g"); + iconElem.html( + `${await getIconSVG(node.icon, { + height: iconSize, + width: iconSize, + fallbackPrefix: "" + })}` + ); + const iconBBox = iconElem.node().getBBox(); + const iconWidth = iconBBox.width; + const iconHeight = iconBBox.height; + const iconX = iconBBox.x; + const iconY = iconBBox.y; + iconElem.attr( + "transform", + `translate(${-iconWidth / 2 - iconX},${topLabel ? bbox.height / 2 + labelPadding / 2 - iconHeight / 2 - iconY : -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY})` + ); + iconElem.attr("style", `color: ${stylesMap.get("stroke") ?? nodeBorder};`); + } + label.attr( + "transform", + `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${topLabel ? -outerHeight / 2 : outerHeight / 2 - bbox.height})` + ); + iconShape.attr( + "transform", + `translate(${0},${topLabel ? bbox.height / 2 + labelPadding / 2 : -bbox.height / 2 - labelPadding / 2})` + ); + updateNodeBounds(node, outerShape); + node.intersect = function(point) { + log.info("iconSquare intersect", node, point); + if (!node.label) { + return intersect_default.rect(node, point); + } + const dx = node.x ?? 0; + const dy = node.y ?? 0; + const nodeHeight = node.height ?? 0; + let points = []; + if (topLabel) { + points = [ + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx + width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx + width / 2, y: dy + nodeHeight / 2 }, + { x: dx - width / 2, y: dy + nodeHeight / 2 }, + { x: dx - width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding } + ]; + } else { + points = [ + { x: dx - width / 2, y: dy - nodeHeight / 2 }, + { x: dx + width / 2, y: dy - nodeHeight / 2 }, + { x: dx + width / 2, y: dy - nodeHeight / 2 + height }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + height }, + { x: dx + bbox.width / 2 / 2, y: dy + nodeHeight / 2 }, + { x: dx - bbox.width / 2, y: dy + nodeHeight / 2 }, + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + height }, + { x: dx - width / 2, y: dy - nodeHeight / 2 + height } + ]; + } + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(iconRounded, "iconRounded"); + +// src/rendering-util/rendering-elements/shapes/iconSquare.ts +import rough24 from "roughjs"; +async function iconSquare(parent, node, { config: { themeVariables, flowchart } }) { + const { labelStyles } = styles2String(node); + node.labelStyle = labelStyles; + const assetHeight = node.assetHeight ?? 48; + const assetWidth = node.assetWidth ?? 48; + const iconSize = Math.max(assetHeight, assetWidth); + const defaultWidth = flowchart?.wrappingWidth; + node.width = Math.max(iconSize, defaultWidth ?? 0); + const { shapeSvg, bbox, halfPadding, label } = await labelHelper( + parent, + node, + "icon-shape default" + ); + const topLabel = node.pos === "t"; + const height = iconSize + halfPadding * 2; + const width = iconSize + halfPadding * 2; + const { nodeBorder, mainBkg } = themeVariables; + const { stylesMap } = compileStyles(node); + const x = -width / 2; + const y = -height / 2; + const labelPadding = node.label ? 8 : 0; + const rc = rough24.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const fill = stylesMap.get("fill"); + options.stroke = fill ?? mainBkg; + const iconNode = rc.path(createRoundedRectPathD(x, y, width, height, 0.1), options); + const outerWidth = Math.max(width, bbox.width); + const outerHeight = height + bbox.height + labelPadding; + const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, { + ...options, + fill: "transparent", + stroke: "none" + }); + const iconShape = shapeSvg.insert(() => iconNode, ":first-child"); + const outerShape = shapeSvg.insert(() => outerNode); + if (node.icon) { + const iconElem = shapeSvg.append("g"); + iconElem.html( + `${await getIconSVG(node.icon, { + height: iconSize, + width: iconSize, + fallbackPrefix: "" + })}` + ); + const iconBBox = iconElem.node().getBBox(); + const iconWidth = iconBBox.width; + const iconHeight = iconBBox.height; + const iconX = iconBBox.x; + const iconY = iconBBox.y; + iconElem.attr( + "transform", + `translate(${-iconWidth / 2 - iconX},${topLabel ? bbox.height / 2 + labelPadding / 2 - iconHeight / 2 - iconY : -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY})` + ); + iconElem.attr("style", `color: ${stylesMap.get("stroke") ?? nodeBorder};`); + } + label.attr( + "transform", + `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${topLabel ? -outerHeight / 2 : outerHeight / 2 - bbox.height})` + ); + iconShape.attr( + "transform", + `translate(${0},${topLabel ? bbox.height / 2 + labelPadding / 2 : -bbox.height / 2 - labelPadding / 2})` + ); + updateNodeBounds(node, outerShape); + node.intersect = function(point) { + log.info("iconSquare intersect", node, point); + if (!node.label) { + return intersect_default.rect(node, point); + } + const dx = node.x ?? 0; + const dy = node.y ?? 0; + const nodeHeight = node.height ?? 0; + let points = []; + if (topLabel) { + points = [ + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx + width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx + width / 2, y: dy + nodeHeight / 2 }, + { x: dx - width / 2, y: dy + nodeHeight / 2 }, + { x: dx - width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding } + ]; + } else { + points = [ + { x: dx - width / 2, y: dy - nodeHeight / 2 }, + { x: dx + width / 2, y: dy - nodeHeight / 2 }, + { x: dx + width / 2, y: dy - nodeHeight / 2 + height }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + height }, + { x: dx + bbox.width / 2 / 2, y: dy + nodeHeight / 2 }, + { x: dx - bbox.width / 2, y: dy + nodeHeight / 2 }, + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + height }, + { x: dx - width / 2, y: dy - nodeHeight / 2 + height } + ]; + } + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(iconSquare, "iconSquare"); + +// src/rendering-util/rendering-elements/shapes/imageSquare.ts +import rough25 from "roughjs"; +async function imageSquare(parent, node, { config: { flowchart } }) { + const img = new Image(); + img.src = node?.img ?? ""; + await img.decode(); + const imageNaturalWidth = Number(img.naturalWidth.toString().replace("px", "")); + const imageNaturalHeight = Number(img.naturalHeight.toString().replace("px", "")); + node.imageAspectRatio = imageNaturalWidth / imageNaturalHeight; + const { labelStyles } = styles2String(node); + node.labelStyle = labelStyles; + const defaultWidth = flowchart?.wrappingWidth; + node.defaultWidth = flowchart?.wrappingWidth; + const imageRawWidth = Math.max( + node.label ? defaultWidth ?? 0 : 0, + node?.assetWidth ?? imageNaturalWidth + ); + const imageWidth = node.constraint === "on" ? node?.assetHeight ? node.assetHeight * node.imageAspectRatio : imageRawWidth : imageRawWidth; + const imageHeight = node.constraint === "on" ? imageWidth / node.imageAspectRatio : node?.assetHeight ?? imageNaturalHeight; + node.width = Math.max(imageWidth, defaultWidth ?? 0); + const { shapeSvg, bbox, label } = await labelHelper(parent, node, "image-shape default"); + const topLabel = node.pos === "t"; + const x = -imageWidth / 2; + const y = -imageHeight / 2; + const labelPadding = node.label ? 8 : 0; + const rc = rough25.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const imageNode = rc.rectangle(x, y, imageWidth, imageHeight, options); + const outerWidth = Math.max(imageWidth, bbox.width); + const outerHeight = imageHeight + bbox.height + labelPadding; + const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, { + ...options, + fill: "none", + stroke: "none" + }); + const iconShape = shapeSvg.insert(() => imageNode, ":first-child"); + const outerShape = shapeSvg.insert(() => outerNode); + if (node.img) { + const image = shapeSvg.append("image"); + image.attr("href", node.img); + image.attr("width", imageWidth); + image.attr("height", imageHeight); + image.attr("preserveAspectRatio", "none"); + image.attr( + "transform", + `translate(${-imageWidth / 2},${topLabel ? outerHeight / 2 - imageHeight : -outerHeight / 2})` + ); + } + label.attr( + "transform", + `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${topLabel ? -imageHeight / 2 - bbox.height / 2 - labelPadding / 2 : imageHeight / 2 - bbox.height / 2 + labelPadding / 2})` + ); + iconShape.attr( + "transform", + `translate(${0},${topLabel ? bbox.height / 2 + labelPadding / 2 : -bbox.height / 2 - labelPadding / 2})` + ); + updateNodeBounds(node, outerShape); + node.intersect = function(point) { + log.info("iconSquare intersect", node, point); + if (!node.label) { + return intersect_default.rect(node, point); + } + const dx = node.x ?? 0; + const dy = node.y ?? 0; + const nodeHeight = node.height ?? 0; + let points = []; + if (topLabel) { + points = [ + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx + imageWidth / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx + imageWidth / 2, y: dy + nodeHeight / 2 }, + { x: dx - imageWidth / 2, y: dy + nodeHeight / 2 }, + { x: dx - imageWidth / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding }, + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding } + ]; + } else { + points = [ + { x: dx - imageWidth / 2, y: dy - nodeHeight / 2 }, + { x: dx + imageWidth / 2, y: dy - nodeHeight / 2 }, + { x: dx + imageWidth / 2, y: dy - nodeHeight / 2 + imageHeight }, + { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + imageHeight }, + { x: dx + bbox.width / 2 / 2, y: dy + nodeHeight / 2 }, + { x: dx - bbox.width / 2, y: dy + nodeHeight / 2 }, + { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + imageHeight }, + { x: dx - imageWidth / 2, y: dy - nodeHeight / 2 + imageHeight } + ]; + } + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(imageSquare, "imageSquare"); + +// src/rendering-util/rendering-elements/shapes/invertedTrapezoid.ts +import rough26 from "roughjs"; +async function inv_trapezoid(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const points = [ + { x: 0, y: 0 }, + { x: w, y: 0 }, + { x: w + 3 * h / 6, y: -h }, + { x: -3 * h / 6, y: -h } + ]; + let polygon; + const { cssStyles } = node; + if (node.look === "handDrawn") { + const rc = rough26.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const pathData = createPathFromPoints(points); + const roughNode = rc.path(pathData, options); + polygon = shapeSvg.insert(() => roughNode, ":first-child").attr("transform", `translate(${-w / 2}, ${h / 2})`); + if (cssStyles) { + polygon.attr("style", cssStyles); + } + } else { + polygon = insertPolygonShape(shapeSvg, w, h, points); + } + if (nodeStyles) { + polygon.attr("style", nodeStyles); + } + node.width = w; + node.height = h; + updateNodeBounds(node, polygon); + node.intersect = function(point) { + return intersect_default.polygon(node, points, point); + }; + return shapeSvg; +} +__name(inv_trapezoid, "inv_trapezoid"); + +// src/rendering-util/rendering-elements/shapes/drawRect.ts +import rough27 from "roughjs"; +async function drawRect(parent, node, options) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const totalWidth = Math.max(bbox.width + options.labelPaddingX * 2, node?.width || 0); + const totalHeight = Math.max(bbox.height + options.labelPaddingY * 2, node?.height || 0); + const x = -totalWidth / 2; + const y = -totalHeight / 2; + let rect2; + let { rx, ry } = node; + const { cssStyles } = node; + if (options?.rx && options.ry) { + rx = options.rx; + ry = options.ry; + } + if (node.look === "handDrawn") { + const rc = rough27.svg(shapeSvg); + const options2 = userNodeOverrides(node, {}); + const roughNode = rx || ry ? rc.path(createRoundedRectPathD(x, y, totalWidth, totalHeight, rx || 0), options2) : rc.rectangle(x, y, totalWidth, totalHeight, options2); + rect2 = shapeSvg.insert(() => roughNode, ":first-child"); + rect2.attr("class", "basic label-container").attr("style", handleUndefinedAttr(cssStyles)); + } else { + rect2 = shapeSvg.insert("rect", ":first-child"); + rect2.attr("class", "basic label-container").attr("style", nodeStyles).attr("rx", handleUndefinedAttr(rx)).attr("ry", handleUndefinedAttr(ry)).attr("x", x).attr("y", y).attr("width", totalWidth).attr("height", totalHeight); + } + updateNodeBounds(node, rect2); + node.calcIntersect = function(bounds, point) { + return intersect_default.rect(bounds, point); + }; + node.intersect = function(point) { + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(drawRect, "drawRect"); + +// src/rendering-util/rendering-elements/shapes/labelRect.ts +async function labelRect(parent, node) { + const { shapeSvg, bbox, label } = await labelHelper(parent, node, "label"); + const rect2 = shapeSvg.insert("rect", ":first-child"); + const totalWidth = 0.1; + const totalHeight = 0.1; + rect2.attr("width", totalWidth).attr("height", totalHeight); + shapeSvg.attr("class", "label edgeLabel"); + label.attr( + "transform", + `translate(${-(bbox.width / 2) - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, rect2); + node.intersect = function(point) { + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(labelRect, "labelRect"); + +// src/rendering-util/rendering-elements/shapes/leanLeft.ts +import rough28 from "roughjs"; +async function lean_left(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0), node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0), node?.height ?? 0); + const points = [ + { x: 0, y: 0 }, + { x: w + 3 * h / 6, y: 0 }, + { x: w, y: -h }, + { x: -(3 * h) / 6, y: -h } + ]; + let polygon; + const { cssStyles } = node; + if (node.look === "handDrawn") { + const rc = rough28.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const pathData = createPathFromPoints(points); + const roughNode = rc.path(pathData, options); + polygon = shapeSvg.insert(() => roughNode, ":first-child").attr("transform", `translate(${-w / 2}, ${h / 2})`); + if (cssStyles) { + polygon.attr("style", cssStyles); + } + } else { + polygon = insertPolygonShape(shapeSvg, w, h, points); + } + if (nodeStyles) { + polygon.attr("style", nodeStyles); + } + node.width = w; + node.height = h; + updateNodeBounds(node, polygon); + node.intersect = function(point) { + return intersect_default.polygon(node, points, point); + }; + return shapeSvg; +} +__name(lean_left, "lean_left"); + +// src/rendering-util/rendering-elements/shapes/leanRight.ts +import rough29 from "roughjs"; +async function lean_right(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0), node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0), node?.height ?? 0); + const points = [ + { x: -3 * h / 6, y: 0 }, + { x: w, y: 0 }, + { x: w + 3 * h / 6, y: -h }, + { x: 0, y: -h } + ]; + let polygon; + const { cssStyles } = node; + if (node.look === "handDrawn") { + const rc = rough29.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const pathData = createPathFromPoints(points); + const roughNode = rc.path(pathData, options); + polygon = shapeSvg.insert(() => roughNode, ":first-child").attr("transform", `translate(${-w / 2}, ${h / 2})`); + if (cssStyles) { + polygon.attr("style", cssStyles); + } + } else { + polygon = insertPolygonShape(shapeSvg, w, h, points); + } + if (nodeStyles) { + polygon.attr("style", nodeStyles); + } + node.width = w; + node.height = h; + updateNodeBounds(node, polygon); + node.intersect = function(point) { + return intersect_default.polygon(node, points, point); + }; + return shapeSvg; +} +__name(lean_right, "lean_right"); + +// src/rendering-util/rendering-elements/shapes/lightningBolt.ts +import rough30 from "roughjs"; +function lightningBolt(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.label = ""; + node.labelStyle = labelStyles; + const shapeSvg = parent.insert("g").attr("class", getNodeClasses(node)).attr("id", node.domId ?? node.id); + const { cssStyles } = node; + const width = Math.max(35, node?.width ?? 0); + const height = Math.max(35, node?.height ?? 0); + const gap = 7; + const points = [ + { x: width, y: 0 }, + { x: 0, y: height + gap / 2 }, + { x: width - 2 * gap, y: height + gap / 2 }, + { x: 0, y: 2 * height }, + { x: width, y: height - gap / 2 }, + { x: 2 * gap, y: height - gap / 2 } + ]; + const rc = rough30.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const linePath = createPathFromPoints(points); + const lineNode = rc.path(linePath, options); + const lightningBolt2 = shapeSvg.insert(() => lineNode, ":first-child"); + if (cssStyles && node.look !== "handDrawn") { + lightningBolt2.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + lightningBolt2.selectAll("path").attr("style", nodeStyles); + } + lightningBolt2.attr("transform", `translate(-${width / 2},${-height})`); + updateNodeBounds(node, lightningBolt2); + node.intersect = function(point) { + log.info("lightningBolt intersect", node, point); + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(lightningBolt, "lightningBolt"); + +// src/rendering-util/rendering-elements/shapes/linedCylinder.ts +import rough31 from "roughjs"; +var createCylinderPathD2 = /* @__PURE__ */ __name((x, y, width, height, rx, ry, outerOffset) => { + return [ + `M${x},${y + ry}`, + `a${rx},${ry} 0,0,0 ${width},0`, + `a${rx},${ry} 0,0,0 ${-width},0`, + `l0,${height}`, + `a${rx},${ry} 0,0,0 ${width},0`, + `l0,${-height}`, + `M${x},${y + ry + outerOffset}`, + `a${rx},${ry} 0,0,0 ${width},0` + ].join(" "); +}, "createCylinderPathD"); +var createOuterCylinderPathD2 = /* @__PURE__ */ __name((x, y, width, height, rx, ry, outerOffset) => { + return [ + `M${x},${y + ry}`, + `M${x + width},${y + ry}`, + `a${rx},${ry} 0,0,0 ${-width},0`, + `l0,${height}`, + `a${rx},${ry} 0,0,0 ${width},0`, + `l0,${-height}`, + `M${x},${y + ry + outerOffset}`, + `a${rx},${ry} 0,0,0 ${width},0` + ].join(" "); +}, "createOuterCylinderPathD"); +var createInnerCylinderPathD2 = /* @__PURE__ */ __name((x, y, width, height, rx, ry) => { + return [`M${x - width / 2},${-height / 2}`, `a${rx},${ry} 0,0,0 ${width},0`].join(" "); +}, "createInnerCylinderPathD"); +async function linedCylinder(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0), node.width ?? 0); + const rx = w / 2; + const ry = rx / (2.5 + w / 50); + const h = Math.max(bbox.height + ry + (node.padding ?? 0), node.height ?? 0); + const outerOffset = h * 0.1; + let cylinder2; + const { cssStyles } = node; + if (node.look === "handDrawn") { + const rc = rough31.svg(shapeSvg); + const outerPathData = createOuterCylinderPathD2(0, 0, w, h, rx, ry, outerOffset); + const innerPathData = createInnerCylinderPathD2(0, ry, w, h, rx, ry); + const options = userNodeOverrides(node, {}); + const outerNode = rc.path(outerPathData, options); + const innerLine = rc.path(innerPathData, options); + const innerLineEl = shapeSvg.insert(() => innerLine, ":first-child"); + innerLineEl.attr("class", "line"); + cylinder2 = shapeSvg.insert(() => outerNode, ":first-child"); + cylinder2.attr("class", "basic label-container"); + if (cssStyles) { + cylinder2.attr("style", cssStyles); + } + } else { + const pathData = createCylinderPathD2(0, 0, w, h, rx, ry, outerOffset); + cylinder2 = shapeSvg.insert("path", ":first-child").attr("d", pathData).attr("class", "basic label-container").attr("style", handleUndefinedAttr(cssStyles)).attr("style", nodeStyles); + } + cylinder2.attr("label-offset-y", ry); + cylinder2.attr("transform", `translate(${-w / 2}, ${-(h / 2 + ry)})`); + updateNodeBounds(node, cylinder2); + label.attr( + "transform", + `translate(${-(bbox.width / 2) - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) + ry - (bbox.y - (bbox.top ?? 0))})` + ); + node.intersect = function(point) { + const pos = intersect_default.rect(node, point); + const x = pos.x - (node.x ?? 0); + if (rx != 0 && (Math.abs(x) < (node.width ?? 0) / 2 || Math.abs(x) == (node.width ?? 0) / 2 && Math.abs(pos.y - (node.y ?? 0)) > (node.height ?? 0) / 2 - ry)) { + let y = ry * ry * (1 - x * x / (rx * rx)); + if (y > 0) { + y = Math.sqrt(y); + } + y = ry - y; + if (point.y - (node.y ?? 0) > 0) { + y = -y; + } + pos.y += y; + } + return pos; + }; + return shapeSvg; +} +__name(linedCylinder, "linedCylinder"); + +// src/rendering-util/rendering-elements/shapes/linedWaveEdgedRect.ts +import rough32 from "roughjs"; +async function linedWaveEdgedRect(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const waveAmplitude = h / 4; + const finalH = h + waveAmplitude; + const { cssStyles } = node; + const rc = rough32.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const points = [ + { x: -w / 2 - w / 2 * 0.1, y: -finalH / 2 }, + { x: -w / 2 - w / 2 * 0.1, y: finalH / 2 }, + ...generateFullSineWavePoints( + -w / 2 - w / 2 * 0.1, + finalH / 2, + w / 2 + w / 2 * 0.1, + finalH / 2, + waveAmplitude, + 0.8 + ), + { x: w / 2 + w / 2 * 0.1, y: -finalH / 2 }, + { x: -w / 2 - w / 2 * 0.1, y: -finalH / 2 }, + { x: -w / 2, y: -finalH / 2 }, + { x: -w / 2, y: finalH / 2 * 1.1 }, + { x: -w / 2, y: -finalH / 2 } + ]; + const poly = rc.polygon( + points.map((p) => [p.x, p.y]), + options + ); + const waveEdgeRect = shapeSvg.insert(() => poly, ":first-child"); + waveEdgeRect.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + waveEdgeRect.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + waveEdgeRect.selectAll("path").attr("style", nodeStyles); + } + waveEdgeRect.attr("transform", `translate(0,${-waveAmplitude / 2})`); + label.attr( + "transform", + `translate(${-w / 2 + (node.padding ?? 0) + w / 2 * 0.1 / 2 - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) - waveAmplitude / 2 - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, waveEdgeRect); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(linedWaveEdgedRect, "linedWaveEdgedRect"); + +// src/rendering-util/rendering-elements/shapes/multiRect.ts +import rough33 from "roughjs"; +async function multiRect(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const rectOffset = 5; + const x = -w / 2; + const y = -h / 2; + const { cssStyles } = node; + const rc = rough33.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const outerPathPoints = [ + { x: x - rectOffset, y: y + rectOffset }, + { x: x - rectOffset, y: y + h + rectOffset }, + { x: x + w - rectOffset, y: y + h + rectOffset }, + { x: x + w - rectOffset, y: y + h }, + { x: x + w, y: y + h }, + { x: x + w, y: y + h - rectOffset }, + { x: x + w + rectOffset, y: y + h - rectOffset }, + { x: x + w + rectOffset, y: y - rectOffset }, + { x: x + rectOffset, y: y - rectOffset }, + { x: x + rectOffset, y }, + { x, y }, + { x, y: y + rectOffset } + ]; + const innerPathPoints = [ + { x, y: y + rectOffset }, + { x: x + w - rectOffset, y: y + rectOffset }, + { x: x + w - rectOffset, y: y + h }, + { x: x + w, y: y + h }, + { x: x + w, y }, + { x, y } + ]; + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const outerPath = createPathFromPoints(outerPathPoints); + const outerNode = rc.path(outerPath, options); + const innerPath = createPathFromPoints(innerPathPoints); + const innerNode = rc.path(innerPath, { ...options, fill: "none" }); + const multiRect2 = shapeSvg.insert(() => innerNode, ":first-child"); + multiRect2.insert(() => outerNode, ":first-child"); + multiRect2.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + multiRect2.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + multiRect2.selectAll("path").attr("style", nodeStyles); + } + label.attr( + "transform", + `translate(${-(bbox.width / 2) - rectOffset - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) + rectOffset - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, multiRect2); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, outerPathPoints, point); + return pos; + }; + return shapeSvg; +} +__name(multiRect, "multiRect"); + +// src/rendering-util/rendering-elements/shapes/multiWaveEdgedRectangle.ts +import rough34 from "roughjs"; +async function multiWaveEdgedRectangle(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const waveAmplitude = h / 4; + const finalH = h + waveAmplitude; + const x = -w / 2; + const y = -finalH / 2; + const rectOffset = 5; + const { cssStyles } = node; + const wavePoints = generateFullSineWavePoints( + x - rectOffset, + y + finalH + rectOffset, + x + w - rectOffset, + y + finalH + rectOffset, + waveAmplitude, + 0.8 + ); + const lastWavePoint = wavePoints?.[wavePoints.length - 1]; + const outerPathPoints = [ + { x: x - rectOffset, y: y + rectOffset }, + { x: x - rectOffset, y: y + finalH + rectOffset }, + ...wavePoints, + { x: x + w - rectOffset, y: lastWavePoint.y - rectOffset }, + { x: x + w, y: lastWavePoint.y - rectOffset }, + { x: x + w, y: lastWavePoint.y - 2 * rectOffset }, + { x: x + w + rectOffset, y: lastWavePoint.y - 2 * rectOffset }, + { x: x + w + rectOffset, y: y - rectOffset }, + { x: x + rectOffset, y: y - rectOffset }, + { x: x + rectOffset, y }, + { x, y }, + { x, y: y + rectOffset } + ]; + const innerPathPoints = [ + { x, y: y + rectOffset }, + { x: x + w - rectOffset, y: y + rectOffset }, + { x: x + w - rectOffset, y: lastWavePoint.y - rectOffset }, + { x: x + w, y: lastWavePoint.y - rectOffset }, + { x: x + w, y }, + { x, y } + ]; + const rc = rough34.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const outerPath = createPathFromPoints(outerPathPoints); + const outerNode = rc.path(outerPath, options); + const innerPath = createPathFromPoints(innerPathPoints); + const innerNode = rc.path(innerPath, options); + const shape = shapeSvg.insert(() => outerNode, ":first-child"); + shape.insert(() => innerNode); + shape.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + shape.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + shape.selectAll("path").attr("style", nodeStyles); + } + shape.attr("transform", `translate(0,${-waveAmplitude / 2})`); + label.attr( + "transform", + `translate(${-(bbox.width / 2) - rectOffset - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) + rectOffset - waveAmplitude / 2 - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, shape); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, outerPathPoints, point); + return pos; + }; + return shapeSvg; +} +__name(multiWaveEdgedRectangle, "multiWaveEdgedRectangle"); + +// src/rendering-util/rendering-elements/shapes/note.ts +import rough35 from "roughjs"; +async function note(parent, node, { config: { themeVariables } }) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const useHtmlLabels = node.useHtmlLabels || getConfig().flowchart?.htmlLabels !== false; + if (!useHtmlLabels) { + node.centerLabel = true; + } + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const totalWidth = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const totalHeight = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const x = -totalWidth / 2; + const y = -totalHeight / 2; + const { cssStyles } = node; + const rc = rough35.svg(shapeSvg); + const options = userNodeOverrides(node, { + fill: themeVariables.noteBkgColor, + stroke: themeVariables.noteBorderColor + }); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const noteShapeNode = rc.rectangle(x, y, totalWidth, totalHeight, options); + const rect2 = shapeSvg.insert(() => noteShapeNode, ":first-child"); + rect2.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + rect2.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + rect2.selectAll("path").attr("style", nodeStyles); + } + label.attr( + "transform", + `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, rect2); + node.intersect = function(point) { + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(note, "note"); + +// src/rendering-util/rendering-elements/shapes/question.ts +import rough36 from "roughjs"; +var createDecisionBoxPathD = /* @__PURE__ */ __name((x, y, size) => { + return [ + `M${x + size / 2},${y}`, + `L${x + size},${y - size / 2}`, + `L${x + size / 2},${y - size}`, + `L${x},${y - size / 2}`, + "Z" + ].join(" "); +}, "createDecisionBoxPathD"); +async function question(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const s = w + h; + const adjustment = 0.5; + const points = [ + { x: s / 2, y: 0 }, + { x: s, y: -s / 2 }, + { x: s / 2, y: -s }, + { x: 0, y: -s / 2 } + ]; + let polygon; + const { cssStyles } = node; + if (node.look === "handDrawn") { + const rc = rough36.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const pathData = createDecisionBoxPathD(0, 0, s); + const roughNode = rc.path(pathData, options); + polygon = shapeSvg.insert(() => roughNode, ":first-child").attr("transform", `translate(${-s / 2 + adjustment}, ${s / 2})`); + if (cssStyles) { + polygon.attr("style", cssStyles); + } + } else { + polygon = insertPolygonShape(shapeSvg, s, s, points); + polygon.attr("transform", `translate(${-s / 2 + adjustment}, ${s / 2})`); + } + if (nodeStyles) { + polygon.attr("style", nodeStyles); + } + updateNodeBounds(node, polygon); + node.calcIntersect = function(bounds, point) { + const s2 = bounds.width; + const points2 = [ + { x: s2 / 2, y: 0 }, + { x: s2, y: -s2 / 2 }, + { x: s2 / 2, y: -s2 }, + { x: 0, y: -s2 / 2 } + ]; + const res = intersect_default.polygon(bounds, points2, point); + return { x: res.x - 0.5, y: res.y - 0.5 }; + }; + node.intersect = function(point) { + return this.calcIntersect(node, point); + }; + return shapeSvg; +} +__name(question, "question"); + +// src/rendering-util/rendering-elements/shapes/rectLeftInvArrow.ts +import rough37 from "roughjs"; +async function rect_left_inv_arrow(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0), node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0), node?.height ?? 0); + const x = -w / 2; + const y = -h / 2; + const notch = y / 2; + const points = [ + { x: x + notch, y }, + { x, y: 0 }, + { x: x + notch, y: -y }, + { x: -x, y: -y }, + { x: -x, y } + ]; + const { cssStyles } = node; + const rc = rough37.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const pathData = createPathFromPoints(points); + const roughNode = rc.path(pathData, options); + const polygon = shapeSvg.insert(() => roughNode, ":first-child"); + polygon.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + polygon.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + polygon.selectAll("path").attr("style", nodeStyles); + } + polygon.attr("transform", `translate(${-notch / 2},0)`); + label.attr( + "transform", + `translate(${-notch / 2 - bbox.width / 2 - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, polygon); + node.intersect = function(point) { + return intersect_default.polygon(node, points, point); + }; + return shapeSvg; +} +__name(rect_left_inv_arrow, "rect_left_inv_arrow"); + +// src/rendering-util/rendering-elements/shapes/rectWithTitle.ts +import { select as select4 } from "d3"; +import rough38 from "roughjs"; +async function rectWithTitle(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + let classes; + if (!node.cssClasses) { + classes = "node default"; + } else { + classes = "node " + node.cssClasses; + } + const shapeSvg = parent.insert("g").attr("class", classes).attr("id", node.domId || node.id); + const g = shapeSvg.insert("g"); + const label = shapeSvg.insert("g").attr("class", "label").attr("style", nodeStyles); + const description = node.description; + const title = node.label; + const text2 = label.node().appendChild(await createLabel_default(title, node.labelStyle, true, true)); + let bbox = { width: 0, height: 0 }; + if (evaluate(getConfig2()?.flowchart?.htmlLabels)) { + const div2 = text2.children[0]; + const dv2 = select4(text2); + bbox = div2.getBoundingClientRect(); + dv2.attr("width", bbox.width); + dv2.attr("height", bbox.height); + } + log.info("Text 2", description); + const textRows = description || []; + const titleBox = text2.getBBox(); + const descr = label.node().appendChild( + await createLabel_default( + textRows.join ? textRows.join("
") : textRows, + node.labelStyle, + true, + true + ) + ); + const div = descr.children[0]; + const dv = select4(descr); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + const halfPadding = (node.padding || 0) / 2; + select4(descr).attr( + "transform", + "translate( " + (bbox.width > titleBox.width ? 0 : (titleBox.width - bbox.width) / 2) + ", " + (titleBox.height + halfPadding + 5) + ")" + ); + select4(text2).attr( + "transform", + "translate( " + (bbox.width < titleBox.width ? 0 : -(titleBox.width - bbox.width) / 2) + ", 0)" + ); + bbox = label.node().getBBox(); + label.attr( + "transform", + "translate(" + -bbox.width / 2 + ", " + (-bbox.height / 2 - halfPadding + 3) + ")" + ); + const totalWidth = bbox.width + (node.padding || 0); + const totalHeight = bbox.height + (node.padding || 0); + const x = -bbox.width / 2 - halfPadding; + const y = -bbox.height / 2 - halfPadding; + let rect2; + let innerLine; + if (node.look === "handDrawn") { + const rc = rough38.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const roughNode = rc.path( + createRoundedRectPathD(x, y, totalWidth, totalHeight, node.rx || 0), + options + ); + const roughLine = rc.line( + -bbox.width / 2 - halfPadding, + -bbox.height / 2 - halfPadding + titleBox.height + halfPadding, + bbox.width / 2 + halfPadding, + -bbox.height / 2 - halfPadding + titleBox.height + halfPadding, + options + ); + innerLine = shapeSvg.insert(() => { + log.debug("Rough node insert CXC", roughNode); + return roughLine; + }, ":first-child"); + rect2 = shapeSvg.insert(() => { + log.debug("Rough node insert CXC", roughNode); + return roughNode; + }, ":first-child"); + } else { + rect2 = g.insert("rect", ":first-child"); + innerLine = g.insert("line"); + rect2.attr("class", "outer title-state").attr("style", nodeStyles).attr("x", -bbox.width / 2 - halfPadding).attr("y", -bbox.height / 2 - halfPadding).attr("width", bbox.width + (node.padding || 0)).attr("height", bbox.height + (node.padding || 0)); + innerLine.attr("class", "divider").attr("x1", -bbox.width / 2 - halfPadding).attr("x2", bbox.width / 2 + halfPadding).attr("y1", -bbox.height / 2 - halfPadding + titleBox.height + halfPadding).attr("y2", -bbox.height / 2 - halfPadding + titleBox.height + halfPadding); + } + updateNodeBounds(node, rect2); + node.intersect = function(point) { + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(rectWithTitle, "rectWithTitle"); + +// src/rendering-util/rendering-elements/shapes/roundedRect.ts +import rough39 from "roughjs"; +function generateArcPoints2(x1, y1, x2, y2, rx, ry, clockwise) { + const numPoints = 20; + const midX = (x1 + x2) / 2; + const midY = (y1 + y2) / 2; + const angle = Math.atan2(y2 - y1, x2 - x1); + const dx = (x2 - x1) / 2; + const dy = (y2 - y1) / 2; + const transformedX = dx / rx; + const transformedY = dy / ry; + const distance = Math.sqrt(transformedX ** 2 + transformedY ** 2); + if (distance > 1) { + throw new Error("The given radii are too small to create an arc between the points."); + } + const scaledCenterDistance = Math.sqrt(1 - distance ** 2); + const centerX = midX + scaledCenterDistance * ry * Math.sin(angle) * (clockwise ? -1 : 1); + const centerY = midY - scaledCenterDistance * rx * Math.cos(angle) * (clockwise ? -1 : 1); + const startAngle = Math.atan2((y1 - centerY) / ry, (x1 - centerX) / rx); + const endAngle = Math.atan2((y2 - centerY) / ry, (x2 - centerX) / rx); + let angleRange = endAngle - startAngle; + if (clockwise && angleRange < 0) { + angleRange += 2 * Math.PI; + } + if (!clockwise && angleRange > 0) { + angleRange -= 2 * Math.PI; + } + const points = []; + for (let i = 0; i < numPoints; i++) { + const t = i / (numPoints - 1); + const angle2 = startAngle + t * angleRange; + const x = centerX + rx * Math.cos(angle2); + const y = centerY + ry * Math.sin(angle2); + points.push({ x, y }); + } + return points; +} +__name(generateArcPoints2, "generateArcPoints"); +async function roundedRect(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const labelPaddingX = node?.padding ?? 0; + const labelPaddingY = node?.padding ?? 0; + const w = (node?.width ? node?.width : bbox.width) + labelPaddingX * 2; + const h = (node?.height ? node?.height : bbox.height) + labelPaddingY * 2; + const radius = node.radius || 5; + const taper = node.taper || 5; + const { cssStyles } = node; + const rc = rough39.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.stroke) { + options.stroke = node.stroke; + } + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const points = [ + // Top edge (left to right) + { x: -w / 2 + taper, y: -h / 2 }, + // Top-left corner start (1) + { x: w / 2 - taper, y: -h / 2 }, + // Top-right corner start (2) + ...generateArcPoints2(w / 2 - taper, -h / 2, w / 2, -h / 2 + taper, radius, radius, true), + // Top-left arc (2 to 3) + // Right edge (top to bottom) + { x: w / 2, y: -h / 2 + taper }, + // Top-right taper point (3) + { x: w / 2, y: h / 2 - taper }, + // Bottom-right taper point (4) + ...generateArcPoints2(w / 2, h / 2 - taper, w / 2 - taper, h / 2, radius, radius, true), + // Top-left arc (4 to 5) + // Bottom edge (right to left) + { x: w / 2 - taper, y: h / 2 }, + // Bottom-right corner start (5) + { x: -w / 2 + taper, y: h / 2 }, + // Bottom-left corner start (6) + ...generateArcPoints2(-w / 2 + taper, h / 2, -w / 2, h / 2 - taper, radius, radius, true), + // Top-left arc (4 to 5) + // Left edge (bottom to top) + { x: -w / 2, y: h / 2 - taper }, + // Bottom-left taper point (7) + { x: -w / 2, y: -h / 2 + taper }, + // Top-left taper point (8) + ...generateArcPoints2(-w / 2, -h / 2 + taper, -w / 2 + taper, -h / 2, radius, radius, true) + // Top-left arc (4 to 5) + ]; + const pathData = createPathFromPoints(points); + const shapeNode = rc.path(pathData, options); + const polygon = shapeSvg.insert(() => shapeNode, ":first-child"); + polygon.attr("class", "basic label-container outer-path"); + if (cssStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", nodeStyles); + } + updateNodeBounds(node, polygon); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(roundedRect, "roundedRect"); + +// src/rendering-util/rendering-elements/shapes/shadedProcess.ts +import rough40 from "roughjs"; +async function shadedProcess(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const halfPadding = node?.padding ?? 0; + const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const x = -bbox.width / 2 - halfPadding; + const y = -bbox.height / 2 - halfPadding; + const { cssStyles } = node; + const rc = rough40.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const points = [ + { x, y }, + { x: x + w + 8, y }, + { x: x + w + 8, y: y + h }, + { x: x - 8, y: y + h }, + { x: x - 8, y }, + { x, y }, + { x, y: y + h } + ]; + const roughNode = rc.polygon( + points.map((p) => [p.x, p.y]), + options + ); + const rect2 = shapeSvg.insert(() => roughNode, ":first-child"); + rect2.attr("class", "basic label-container").attr("style", handleUndefinedAttr(cssStyles)); + if (nodeStyles && node.look !== "handDrawn") { + rect2.selectAll("path").attr("style", nodeStyles); + } + if (cssStyles && node.look !== "handDrawn") { + rect2.selectAll("path").attr("style", nodeStyles); + } + label.attr( + "transform", + `translate(${-w / 2 + 4 + (node.padding ?? 0) - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, rect2); + node.intersect = function(point) { + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(shadedProcess, "shadedProcess"); + +// src/rendering-util/rendering-elements/shapes/slopedRect.ts +import rough41 from "roughjs"; +async function slopedRect(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const x = -w / 2; + const y = -h / 2; + const { cssStyles } = node; + const rc = rough41.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const points = [ + { x, y }, + { x, y: y + h }, + { x: x + w, y: y + h }, + { x: x + w, y: y - h / 2 } + ]; + const pathData = createPathFromPoints(points); + const shapeNode = rc.path(pathData, options); + const polygon = shapeSvg.insert(() => shapeNode, ":first-child"); + polygon.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", nodeStyles); + } + polygon.attr("transform", `translate(0, ${h / 4})`); + label.attr( + "transform", + `translate(${-w / 2 + (node.padding ?? 0) - (bbox.x - (bbox.left ?? 0))}, ${-h / 4 + (node.padding ?? 0) - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, polygon); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(slopedRect, "slopedRect"); + +// src/rendering-util/rendering-elements/shapes/squareRect.ts +async function squareRect2(parent, node) { + const options = { + rx: 0, + ry: 0, + classes: "", + labelPaddingX: node.labelPaddingX ?? (node?.padding || 0) * 2, + labelPaddingY: (node?.padding || 0) * 1 + }; + return drawRect(parent, node, options); +} +__name(squareRect2, "squareRect"); + +// src/rendering-util/rendering-elements/shapes/stadium.ts +import rough42 from "roughjs"; +async function stadium(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const h = bbox.height + node.padding; + const w = bbox.width + h / 4 + node.padding; + const radius = h / 2; + const { cssStyles } = node; + const rc = rough42.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const points = [ + { x: -w / 2 + radius, y: -h / 2 }, + { x: w / 2 - radius, y: -h / 2 }, + ...generateCirclePoints(-w / 2 + radius, 0, radius, 50, 90, 270), + { x: w / 2 - radius, y: h / 2 }, + ...generateCirclePoints(w / 2 - radius, 0, radius, 50, 270, 450) + ]; + const pathData = createPathFromPoints(points); + const shapeNode = rc.path(pathData, options); + const polygon = shapeSvg.insert(() => shapeNode, ":first-child"); + polygon.attr("class", "basic label-container outer-path"); + if (cssStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", nodeStyles); + } + updateNodeBounds(node, polygon); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(stadium, "stadium"); + +// src/rendering-util/rendering-elements/shapes/state.ts +async function state(parent, node) { + const options = { + rx: 5, + ry: 5, + classes: "flowchart-node" + }; + return drawRect(parent, node, options); +} +__name(state, "state"); + +// src/rendering-util/rendering-elements/shapes/stateEnd.ts +import rough43 from "roughjs"; +function stateEnd(parent, node, { config: { themeVariables } }) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { cssStyles } = node; + const { lineColor, stateBorder, nodeBorder } = themeVariables; + const shapeSvg = parent.insert("g").attr("class", "node default").attr("id", node.domId || node.id); + const rc = rough43.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const roughNode = rc.circle(0, 0, 14, { + ...options, + stroke: lineColor, + strokeWidth: 2 + }); + const innerFill = stateBorder ?? nodeBorder; + const roughInnerNode = rc.circle(0, 0, 5, { + ...options, + fill: innerFill, + stroke: innerFill, + strokeWidth: 2, + fillStyle: "solid" + }); + const circle2 = shapeSvg.insert(() => roughNode, ":first-child"); + circle2.insert(() => roughInnerNode); + if (cssStyles) { + circle2.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles) { + circle2.selectAll("path").attr("style", nodeStyles); + } + updateNodeBounds(node, circle2); + node.intersect = function(point) { + return intersect_default.circle(node, 7, point); + }; + return shapeSvg; +} +__name(stateEnd, "stateEnd"); + +// src/rendering-util/rendering-elements/shapes/stateStart.ts +import rough44 from "roughjs"; +function stateStart(parent, node, { config: { themeVariables } }) { + const { lineColor } = themeVariables; + const shapeSvg = parent.insert("g").attr("class", "node default").attr("id", node.domId || node.id); + let circle2; + if (node.look === "handDrawn") { + const rc = rough44.svg(shapeSvg); + const roughNode = rc.circle(0, 0, 14, solidStateFill(lineColor)); + circle2 = shapeSvg.insert(() => roughNode); + circle2.attr("class", "state-start").attr("r", 7).attr("width", 14).attr("height", 14); + } else { + circle2 = shapeSvg.insert("circle", ":first-child"); + circle2.attr("class", "state-start").attr("r", 7).attr("width", 14).attr("height", 14); + } + updateNodeBounds(node, circle2); + node.intersect = function(point) { + return intersect_default.circle(node, 7, point); + }; + return shapeSvg; +} +__name(stateStart, "stateStart"); + +// src/rendering-util/rendering-elements/shapes/subroutine.ts +import rough45 from "roughjs"; +async function subroutine(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const halfPadding = (node?.padding || 0) / 2; + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const x = -bbox.width / 2 - halfPadding; + const y = -bbox.height / 2 - halfPadding; + const points = [ + { x: 0, y: 0 }, + { x: w, y: 0 }, + { x: w, y: -h }, + { x: 0, y: -h }, + { x: 0, y: 0 }, + { x: -8, y: 0 }, + { x: w + 8, y: 0 }, + { x: w + 8, y: -h }, + { x: -8, y: -h }, + { x: -8, y: 0 } + ]; + if (node.look === "handDrawn") { + const rc = rough45.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const roughNode = rc.rectangle(x - 8, y, w + 16, h, options); + const l1 = rc.line(x, y, x, y + h, options); + const l2 = rc.line(x + w, y, x + w, y + h, options); + shapeSvg.insert(() => l1, ":first-child"); + shapeSvg.insert(() => l2, ":first-child"); + const rect2 = shapeSvg.insert(() => roughNode, ":first-child"); + const { cssStyles } = node; + rect2.attr("class", "basic label-container").attr("style", handleUndefinedAttr(cssStyles)); + updateNodeBounds(node, rect2); + } else { + const el = insertPolygonShape(shapeSvg, w, h, points); + if (nodeStyles) { + el.attr("style", nodeStyles); + } + updateNodeBounds(node, el); + } + node.intersect = function(point) { + return intersect_default.polygon(node, points, point); + }; + return shapeSvg; +} +__name(subroutine, "subroutine"); + +// src/rendering-util/rendering-elements/shapes/taggedRect.ts +import rough46 from "roughjs"; +async function taggedRect(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const x = -w / 2; + const y = -h / 2; + const tagWidth = 0.2 * h; + const tagHeight = 0.2 * h; + const { cssStyles } = node; + const rc = rough46.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const rectPoints = [ + { x: x - tagWidth / 2, y }, + { x: x + w + tagWidth / 2, y }, + { x: x + w + tagWidth / 2, y: y + h }, + { x: x - tagWidth / 2, y: y + h } + ]; + const tagPoints = [ + { x: x + w - tagWidth / 2, y: y + h }, + { x: x + w + tagWidth / 2, y: y + h }, + { x: x + w + tagWidth / 2, y: y + h - tagHeight } + ]; + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const rectPath = createPathFromPoints(rectPoints); + const rectNode = rc.path(rectPath, options); + const tagPath = createPathFromPoints(tagPoints); + const tagNode = rc.path(tagPath, { ...options, fillStyle: "solid" }); + const taggedRect2 = shapeSvg.insert(() => tagNode, ":first-child"); + taggedRect2.insert(() => rectNode, ":first-child"); + taggedRect2.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + taggedRect2.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + taggedRect2.selectAll("path").attr("style", nodeStyles); + } + updateNodeBounds(node, taggedRect2); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, rectPoints, point); + return pos; + }; + return shapeSvg; +} +__name(taggedRect, "taggedRect"); + +// src/rendering-util/rendering-elements/shapes/taggedWaveEdgedRectangle.ts +import rough47 from "roughjs"; +async function taggedWaveEdgedRectangle(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const waveAmplitude = h / 4; + const tagWidth = 0.2 * w; + const tagHeight = 0.2 * h; + const finalH = h + waveAmplitude; + const { cssStyles } = node; + const rc = rough47.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const points = [ + { x: -w / 2 - w / 2 * 0.1, y: finalH / 2 }, + ...generateFullSineWavePoints( + -w / 2 - w / 2 * 0.1, + finalH / 2, + w / 2 + w / 2 * 0.1, + finalH / 2, + waveAmplitude, + 0.8 + ), + { x: w / 2 + w / 2 * 0.1, y: -finalH / 2 }, + { x: -w / 2 - w / 2 * 0.1, y: -finalH / 2 } + ]; + const x = -w / 2 + w / 2 * 0.1; + const y = -finalH / 2 - tagHeight * 0.4; + const tagPoints = [ + { x: x + w - tagWidth, y: (y + h) * 1.4 }, + { x: x + w, y: y + h - tagHeight }, + { x: x + w, y: (y + h) * 0.9 }, + ...generateFullSineWavePoints( + x + w, + (y + h) * 1.3, + x + w - tagWidth, + (y + h) * 1.5, + -h * 0.03, + 0.5 + ) + ]; + const waveEdgeRectPath = createPathFromPoints(points); + const waveEdgeRectNode = rc.path(waveEdgeRectPath, options); + const taggedWaveEdgeRectPath = createPathFromPoints(tagPoints); + const taggedWaveEdgeRectNode = rc.path(taggedWaveEdgeRectPath, { + ...options, + fillStyle: "solid" + }); + const waveEdgeRect = shapeSvg.insert(() => taggedWaveEdgeRectNode, ":first-child"); + waveEdgeRect.insert(() => waveEdgeRectNode, ":first-child"); + waveEdgeRect.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + waveEdgeRect.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + waveEdgeRect.selectAll("path").attr("style", nodeStyles); + } + waveEdgeRect.attr("transform", `translate(0,${-waveAmplitude / 2})`); + label.attr( + "transform", + `translate(${-w / 2 + (node.padding ?? 0) - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) - waveAmplitude / 2 - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, waveEdgeRect); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(taggedWaveEdgedRectangle, "taggedWaveEdgedRectangle"); + +// src/rendering-util/rendering-elements/shapes/text.ts +async function text(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const totalWidth = Math.max(bbox.width + node.padding, node?.width || 0); + const totalHeight = Math.max(bbox.height + node.padding, node?.height || 0); + const x = -totalWidth / 2; + const y = -totalHeight / 2; + const rect2 = shapeSvg.insert("rect", ":first-child"); + rect2.attr("class", "text").attr("style", nodeStyles).attr("rx", 0).attr("ry", 0).attr("x", x).attr("y", y).attr("width", totalWidth).attr("height", totalHeight); + updateNodeBounds(node, rect2); + node.intersect = function(point) { + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(text, "text"); + +// src/rendering-util/rendering-elements/shapes/tiltedCylinder.ts +import rough48 from "roughjs"; +var createCylinderPathD3 = /* @__PURE__ */ __name((x, y, width, height, rx, ry) => { + return `M${x},${y} + a${rx},${ry} 0,0,1 ${0},${-height} + l${width},${0} + a${rx},${ry} 0,0,1 ${0},${height} + M${width},${-height} + a${rx},${ry} 0,0,0 ${0},${height} + l${-width},${0}`; +}, "createCylinderPathD"); +var createOuterCylinderPathD3 = /* @__PURE__ */ __name((x, y, width, height, rx, ry) => { + return [ + `M${x},${y}`, + `M${x + width},${y}`, + `a${rx},${ry} 0,0,0 ${0},${-height}`, + `l${-width},0`, + `a${rx},${ry} 0,0,0 ${0},${height}`, + `l${width},0` + ].join(" "); +}, "createOuterCylinderPathD"); +var createInnerCylinderPathD3 = /* @__PURE__ */ __name((x, y, width, height, rx, ry) => { + return [`M${x + width / 2},${-height / 2}`, `a${rx},${ry} 0,0,0 0,${height}`].join(" "); +}, "createInnerCylinderPathD"); +async function tiltedCylinder(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label, halfPadding } = await labelHelper( + parent, + node, + getNodeClasses(node) + ); + const labelPadding = node.look === "neo" ? halfPadding * 2 : halfPadding; + const h = bbox.height + labelPadding; + const ry = h / 2; + const rx = ry / (2.5 + h / 50); + const w = bbox.width + rx + labelPadding; + const { cssStyles } = node; + let cylinder2; + if (node.look === "handDrawn") { + const rc = rough48.svg(shapeSvg); + const outerPathData = createOuterCylinderPathD3(0, 0, w, h, rx, ry); + const innerPathData = createInnerCylinderPathD3(0, 0, w, h, rx, ry); + const outerNode = rc.path(outerPathData, userNodeOverrides(node, {})); + const innerLine = rc.path(innerPathData, userNodeOverrides(node, { fill: "none" })); + cylinder2 = shapeSvg.insert(() => innerLine, ":first-child"); + cylinder2 = shapeSvg.insert(() => outerNode, ":first-child"); + cylinder2.attr("class", "basic label-container"); + if (cssStyles) { + cylinder2.attr("style", cssStyles); + } + } else { + const pathData = createCylinderPathD3(0, 0, w, h, rx, ry); + cylinder2 = shapeSvg.insert("path", ":first-child").attr("d", pathData).attr("class", "basic label-container").attr("style", handleUndefinedAttr(cssStyles)).attr("style", nodeStyles); + cylinder2.attr("class", "basic label-container"); + if (cssStyles) { + cylinder2.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles) { + cylinder2.selectAll("path").attr("style", nodeStyles); + } + } + cylinder2.attr("label-offset-x", rx); + cylinder2.attr("transform", `translate(${-w / 2}, ${h / 2} )`); + label.attr( + "transform", + `translate(${-(bbox.width / 2) - rx - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, cylinder2); + node.intersect = function(point) { + const pos = intersect_default.rect(node, point); + const y = pos.y - (node.y ?? 0); + if (ry != 0 && (Math.abs(y) < (node.height ?? 0) / 2 || Math.abs(y) == (node.height ?? 0) / 2 && Math.abs(pos.x - (node.x ?? 0)) > (node.width ?? 0) / 2 - rx)) { + let x = rx * rx * (1 - y * y / (ry * ry)); + if (x != 0) { + x = Math.sqrt(Math.abs(x)); + } + x = rx - x; + if (point.x - (node.x ?? 0) > 0) { + x = -x; + } + pos.x += x; + } + return pos; + }; + return shapeSvg; +} +__name(tiltedCylinder, "tiltedCylinder"); + +// src/rendering-util/rendering-elements/shapes/trapezoid.ts +import rough49 from "roughjs"; +async function trapezoid(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const w = bbox.width + node.padding; + const h = bbox.height + node.padding; + const points = [ + { x: -3 * h / 6, y: 0 }, + { x: w + 3 * h / 6, y: 0 }, + { x: w, y: -h }, + { x: 0, y: -h } + ]; + let polygon; + const { cssStyles } = node; + if (node.look === "handDrawn") { + const rc = rough49.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const pathData = createPathFromPoints(points); + const roughNode = rc.path(pathData, options); + polygon = shapeSvg.insert(() => roughNode, ":first-child").attr("transform", `translate(${-w / 2}, ${h / 2})`); + if (cssStyles) { + polygon.attr("style", cssStyles); + } + } else { + polygon = insertPolygonShape(shapeSvg, w, h, points); + } + if (nodeStyles) { + polygon.attr("style", nodeStyles); + } + node.width = w; + node.height = h; + updateNodeBounds(node, polygon); + node.intersect = function(point) { + return intersect_default.polygon(node, points, point); + }; + return shapeSvg; +} +__name(trapezoid, "trapezoid"); + +// src/rendering-util/rendering-elements/shapes/trapezoidalPentagon.ts +import rough50 from "roughjs"; +async function trapezoidalPentagon(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const minWidth = 60, minHeight = 20; + const w = Math.max(minWidth, bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(minHeight, bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const { cssStyles } = node; + const rc = rough50.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const points = [ + { x: -w / 2 * 0.8, y: -h / 2 }, + { x: w / 2 * 0.8, y: -h / 2 }, + { x: w / 2, y: -h / 2 * 0.6 }, + { x: w / 2, y: h / 2 }, + { x: -w / 2, y: h / 2 }, + { x: -w / 2, y: -h / 2 * 0.6 } + ]; + const pathData = createPathFromPoints(points); + const shapeNode = rc.path(pathData, options); + const polygon = shapeSvg.insert(() => shapeNode, ":first-child"); + polygon.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", nodeStyles); + } + updateNodeBounds(node, polygon); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(trapezoidalPentagon, "trapezoidalPentagon"); + +// src/rendering-util/rendering-elements/shapes/triangle.ts +import rough51 from "roughjs"; +async function triangle(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const useHtmlLabels = evaluate(getConfig2().flowchart?.htmlLabels); + const w = bbox.width + (node.padding ?? 0); + const h = w + bbox.height; + const tw = w + bbox.height; + const points = [ + { x: 0, y: 0 }, + { x: tw, y: 0 }, + { x: tw / 2, y: -h } + ]; + const { cssStyles } = node; + const rc = rough51.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const pathData = createPathFromPoints(points); + const roughNode = rc.path(pathData, options); + const polygon = shapeSvg.insert(() => roughNode, ":first-child").attr("transform", `translate(${-h / 2}, ${h / 2})`); + if (cssStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + polygon.selectChildren("path").attr("style", nodeStyles); + } + node.width = w; + node.height = h; + updateNodeBounds(node, polygon); + label.attr( + "transform", + `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))}, ${h / 2 - (bbox.height + (node.padding ?? 0) / (useHtmlLabels ? 2 : 1) - (bbox.y - (bbox.top ?? 0)))})` + ); + node.intersect = function(point) { + log.info("Triangle intersect", node, points, point); + return intersect_default.polygon(node, points, point); + }; + return shapeSvg; +} +__name(triangle, "triangle"); + +// src/rendering-util/rendering-elements/shapes/waveEdgedRectangle.ts +import rough52 from "roughjs"; +async function waveEdgedRectangle(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const waveAmplitude = h / 8; + const finalH = h + waveAmplitude; + const { cssStyles } = node; + const minWidth = 70; + const widthDif = minWidth - w; + const extraW = widthDif > 0 ? widthDif / 2 : 0; + const rc = rough52.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const points = [ + { x: -w / 2 - extraW, y: finalH / 2 }, + ...generateFullSineWavePoints( + -w / 2 - extraW, + finalH / 2, + w / 2 + extraW, + finalH / 2, + waveAmplitude, + 0.8 + ), + { x: w / 2 + extraW, y: -finalH / 2 }, + { x: -w / 2 - extraW, y: -finalH / 2 } + ]; + const waveEdgeRectPath = createPathFromPoints(points); + const waveEdgeRectNode = rc.path(waveEdgeRectPath, options); + const waveEdgeRect = shapeSvg.insert(() => waveEdgeRectNode, ":first-child"); + waveEdgeRect.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + waveEdgeRect.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + waveEdgeRect.selectAll("path").attr("style", nodeStyles); + } + waveEdgeRect.attr("transform", `translate(0,${-waveAmplitude / 2})`); + label.attr( + "transform", + `translate(${-w / 2 + (node.padding ?? 0) - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) - waveAmplitude - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, waveEdgeRect); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(waveEdgedRectangle, "waveEdgedRectangle"); + +// src/rendering-util/rendering-elements/shapes/waveRectangle.ts +import rough53 from "roughjs"; +async function waveRectangle(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); + const minWidth = 100; + const minHeight = 50; + const baseWidth = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const baseHeight = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const aspectRatio = baseWidth / baseHeight; + let w = baseWidth; + let h = baseHeight; + if (w > h * aspectRatio) { + h = w / aspectRatio; + } else { + w = h * aspectRatio; + } + w = Math.max(w, minWidth); + h = Math.max(h, minHeight); + const waveAmplitude = Math.min(h * 0.2, h / 4); + const finalH = h + waveAmplitude * 2; + const { cssStyles } = node; + const rc = rough53.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const points = [ + { x: -w / 2, y: finalH / 2 }, + ...generateFullSineWavePoints(-w / 2, finalH / 2, w / 2, finalH / 2, waveAmplitude, 1), + { x: w / 2, y: -finalH / 2 }, + ...generateFullSineWavePoints(w / 2, -finalH / 2, -w / 2, -finalH / 2, waveAmplitude, -1) + ]; + const waveRectPath = createPathFromPoints(points); + const waveRectNode = rc.path(waveRectPath, options); + const waveRect = shapeSvg.insert(() => waveRectNode, ":first-child"); + waveRect.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + waveRect.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + waveRect.selectAll("path").attr("style", nodeStyles); + } + updateNodeBounds(node, waveRect); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, points, point); + return pos; + }; + return shapeSvg; +} +__name(waveRectangle, "waveRectangle"); + +// src/rendering-util/rendering-elements/shapes/windowPane.ts +import rough54 from "roughjs"; +async function windowPane(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node)); + const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0); + const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0); + const rectOffset = 5; + const x = -w / 2; + const y = -h / 2; + const { cssStyles } = node; + const rc = rough54.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const outerPathPoints = [ + { x: x - rectOffset, y: y - rectOffset }, + { x: x - rectOffset, y: y + h }, + { x: x + w, y: y + h }, + { x: x + w, y: y - rectOffset } + ]; + const path = `M${x - rectOffset},${y - rectOffset} L${x + w},${y - rectOffset} L${x + w},${y + h} L${x - rectOffset},${y + h} L${x - rectOffset},${y - rectOffset} + M${x - rectOffset},${y} L${x + w},${y} + M${x},${y - rectOffset} L${x},${y + h}`; + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const no = rc.path(path, options); + const windowPane2 = shapeSvg.insert(() => no, ":first-child"); + windowPane2.attr("transform", `translate(${rectOffset / 2}, ${rectOffset / 2})`); + windowPane2.attr("class", "basic label-container"); + if (cssStyles && node.look !== "handDrawn") { + windowPane2.selectAll("path").attr("style", cssStyles); + } + if (nodeStyles && node.look !== "handDrawn") { + windowPane2.selectAll("path").attr("style", nodeStyles); + } + label.attr( + "transform", + `translate(${-(bbox.width / 2) + rectOffset / 2 - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) + rectOffset / 2 - (bbox.y - (bbox.top ?? 0))})` + ); + updateNodeBounds(node, windowPane2); + node.intersect = function(point) { + const pos = intersect_default.polygon(node, outerPathPoints, point); + return pos; + }; + return shapeSvg; +} +__name(windowPane, "windowPane"); + +// src/rendering-util/rendering-elements/shapes/erBox.ts +import rough55 from "roughjs"; +import { select as select5 } from "d3"; +async function erBox(parent, node) { + const entityNode = node; + if (entityNode.alias) { + node.label = entityNode.alias; + } + if (node.look === "handDrawn") { + const { themeVariables: themeVariables2 } = getConfig(); + const { background } = themeVariables2; + const backgroundNode = { + ...node, + id: node.id + "-background", + look: "default", + cssStyles: ["stroke: none", `fill: ${background}`] + }; + await erBox(parent, backgroundNode); + } + const config = getConfig(); + node.useHtmlLabels = config.htmlLabels; + let PADDING = config.er?.diagramPadding ?? 10; + let TEXT_PADDING = config.er?.entityPadding ?? 6; + const { cssStyles } = node; + const { labelStyles, nodeStyles } = styles2String(node); + if (entityNode.attributes.length === 0 && node.label) { + const options2 = { + rx: 0, + ry: 0, + labelPaddingX: PADDING, + labelPaddingY: PADDING * 1.5, + classes: "" + }; + if (calculateTextWidth(node.label, config) + options2.labelPaddingX * 2 < config.er.minEntityWidth) { + node.width = config.er.minEntityWidth; + } + const shapeSvg2 = await drawRect(parent, node, options2); + if (!evaluate(config.htmlLabels)) { + const textElement = shapeSvg2.select("text"); + const bbox = textElement.node()?.getBBox(); + textElement.attr("transform", `translate(${-bbox.width / 2}, 0)`); + } + return shapeSvg2; + } + if (!config.htmlLabels) { + PADDING *= 1.25; + TEXT_PADDING *= 1.25; + } + let cssClasses = getNodeClasses(node); + if (!cssClasses) { + cssClasses = "node default"; + } + const shapeSvg = parent.insert("g").attr("class", cssClasses).attr("id", node.domId || node.id); + const nameBBox = await addText(shapeSvg, node.label ?? "", config, 0, 0, ["name"], labelStyles); + nameBBox.height += TEXT_PADDING; + let yOffset = 0; + const yOffsets = []; + const rows = []; + let maxTypeWidth = 0; + let maxNameWidth = 0; + let maxKeysWidth = 0; + let maxCommentWidth = 0; + let keysPresent = true; + let commentPresent = true; + for (const attribute of entityNode.attributes) { + const typeBBox = await addText( + shapeSvg, + attribute.type, + config, + 0, + yOffset, + ["attribute-type"], + labelStyles + ); + maxTypeWidth = Math.max(maxTypeWidth, typeBBox.width + PADDING); + const nameBBox2 = await addText( + shapeSvg, + attribute.name, + config, + 0, + yOffset, + ["attribute-name"], + labelStyles + ); + maxNameWidth = Math.max(maxNameWidth, nameBBox2.width + PADDING); + const keysBBox = await addText( + shapeSvg, + attribute.keys.join(), + config, + 0, + yOffset, + ["attribute-keys"], + labelStyles + ); + maxKeysWidth = Math.max(maxKeysWidth, keysBBox.width + PADDING); + const commentBBox = await addText( + shapeSvg, + attribute.comment, + config, + 0, + yOffset, + ["attribute-comment"], + labelStyles + ); + maxCommentWidth = Math.max(maxCommentWidth, commentBBox.width + PADDING); + const rowHeight = Math.max(typeBBox.height, nameBBox2.height, keysBBox.height, commentBBox.height) + TEXT_PADDING; + rows.push({ yOffset, rowHeight }); + yOffset += rowHeight; + } + let totalWidthSections = 4; + if (maxKeysWidth <= PADDING) { + keysPresent = false; + maxKeysWidth = 0; + totalWidthSections--; + } + if (maxCommentWidth <= PADDING) { + commentPresent = false; + maxCommentWidth = 0; + totalWidthSections--; + } + const shapeBBox = shapeSvg.node().getBBox(); + if (nameBBox.width + PADDING * 2 - (maxTypeWidth + maxNameWidth + maxKeysWidth + maxCommentWidth) > 0) { + const difference = nameBBox.width + PADDING * 2 - (maxTypeWidth + maxNameWidth + maxKeysWidth + maxCommentWidth); + maxTypeWidth += difference / totalWidthSections; + maxNameWidth += difference / totalWidthSections; + if (maxKeysWidth > 0) { + maxKeysWidth += difference / totalWidthSections; + } + if (maxCommentWidth > 0) { + maxCommentWidth += difference / totalWidthSections; + } + } + const maxWidth = maxTypeWidth + maxNameWidth + maxKeysWidth + maxCommentWidth; + const rc = rough55.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + let totalShapeBBoxHeight = 0; + if (rows.length > 0) { + totalShapeBBoxHeight = rows.reduce((sum, row) => sum + (row?.rowHeight ?? 0), 0); + } + const w = Math.max(shapeBBox.width + PADDING * 2, node?.width || 0, maxWidth); + const h = Math.max((totalShapeBBoxHeight ?? 0) + nameBBox.height, node?.height || 0); + const x = -w / 2; + const y = -h / 2; + shapeSvg.selectAll("g:not(:first-child)").each((_, i, nodes) => { + const text2 = select5(nodes[i]); + const transform = text2.attr("transform"); + let translateX = 0; + let translateY = 0; + if (transform) { + const regex = RegExp(/translate\(([^,]+),([^)]+)\)/); + const translate = regex.exec(transform); + if (translate) { + translateX = parseFloat(translate[1]); + translateY = parseFloat(translate[2]); + if (text2.attr("class").includes("attribute-name")) { + translateX += maxTypeWidth; + } else if (text2.attr("class").includes("attribute-keys")) { + translateX += maxTypeWidth + maxNameWidth; + } else if (text2.attr("class").includes("attribute-comment")) { + translateX += maxTypeWidth + maxNameWidth + maxKeysWidth; + } + } + } + text2.attr( + "transform", + `translate(${x + PADDING / 2 + translateX}, ${translateY + y + nameBBox.height + TEXT_PADDING / 2})` + ); + }); + shapeSvg.select(".name").attr("transform", "translate(" + -nameBBox.width / 2 + ", " + (y + TEXT_PADDING / 2) + ")"); + const roughRect = rc.rectangle(x, y, w, h, options); + const rect2 = shapeSvg.insert(() => roughRect, ":first-child").attr("style", cssStyles.join("")); + const { themeVariables } = getConfig(); + const { rowEven, rowOdd, nodeBorder } = themeVariables; + yOffsets.push(0); + for (const [i, row] of rows.entries()) { + const contentRowIndex = i + 1; + const isEven = contentRowIndex % 2 === 0 && row.yOffset !== 0; + const roughRect2 = rc.rectangle(x, nameBBox.height + y + row?.yOffset, w, row?.rowHeight, { + ...options, + fill: isEven ? rowEven : rowOdd, + stroke: nodeBorder + }); + shapeSvg.insert(() => roughRect2, "g.label").attr("style", cssStyles.join("")).attr("class", `row-rect-${isEven ? "even" : "odd"}`); + } + let roughLine = rc.line(x, nameBBox.height + y, w + x, nameBBox.height + y, options); + shapeSvg.insert(() => roughLine).attr("class", "divider"); + roughLine = rc.line(maxTypeWidth + x, nameBBox.height + y, maxTypeWidth + x, h + y, options); + shapeSvg.insert(() => roughLine).attr("class", "divider"); + if (keysPresent) { + roughLine = rc.line( + maxTypeWidth + maxNameWidth + x, + nameBBox.height + y, + maxTypeWidth + maxNameWidth + x, + h + y, + options + ); + shapeSvg.insert(() => roughLine).attr("class", "divider"); + } + if (commentPresent) { + roughLine = rc.line( + maxTypeWidth + maxNameWidth + maxKeysWidth + x, + nameBBox.height + y, + maxTypeWidth + maxNameWidth + maxKeysWidth + x, + h + y, + options + ); + shapeSvg.insert(() => roughLine).attr("class", "divider"); + } + for (const yOffset2 of yOffsets) { + roughLine = rc.line( + x, + nameBBox.height + y + yOffset2, + w + x, + nameBBox.height + y + yOffset2, + options + ); + shapeSvg.insert(() => roughLine).attr("class", "divider"); + } + updateNodeBounds(node, rect2); + if (nodeStyles && node.look !== "handDrawn") { + const allStyle = nodeStyles.split(";"); + const strokeStyles = allStyle?.filter((e) => { + return e.includes("stroke"); + })?.map((s) => `${s}`).join("; "); + shapeSvg.selectAll("path").attr("style", strokeStyles ?? ""); + shapeSvg.selectAll(".row-rect-even path").attr("style", nodeStyles); + } + node.intersect = function(point) { + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(erBox, "erBox"); +async function addText(shapeSvg, labelText, config, translateX = 0, translateY = 0, classes = [], style = "") { + const label = shapeSvg.insert("g").attr("class", `label ${classes.join(" ")}`).attr("transform", `translate(${translateX}, ${translateY})`).attr("style", style); + if (labelText !== parseGenericTypes(labelText)) { + labelText = parseGenericTypes(labelText); + labelText = labelText.replaceAll("<", "<").replaceAll(">", ">"); + } + const text2 = label.node().appendChild( + await createText( + label, + labelText, + { + width: calculateTextWidth(labelText, config) + 100, + style, + useHtmlLabels: config.htmlLabels + }, + config + ) + ); + if (labelText.includes("<") || labelText.includes(">")) { + let child = text2.children[0]; + child.textContent = child.textContent.replaceAll("<", "<").replaceAll(">", ">"); + while (child.childNodes[0]) { + child = child.childNodes[0]; + child.textContent = child.textContent.replaceAll("<", "<").replaceAll(">", ">"); + } + } + let bbox = text2.getBBox(); + if (evaluate(config.htmlLabels)) { + const div = text2.children[0]; + div.style.textAlign = "start"; + const dv = select5(text2); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + return bbox; +} +__name(addText, "addText"); + +// src/rendering-util/rendering-elements/shapes/classBox.ts +import { select as select7 } from "d3"; +import rough56 from "roughjs"; + +// src/diagrams/class/shapeUtil.ts +import { select as select6 } from "d3"; +async function textHelper(parent, node, config, useHtmlLabels, GAP = config.class.padding ?? 12) { + const TEXT_PADDING = !useHtmlLabels ? 3 : 0; + const shapeSvg = parent.insert("g").attr("class", getNodeClasses(node)).attr("id", node.domId || node.id); + let annotationGroup = null; + let labelGroup = null; + let membersGroup = null; + let methodsGroup = null; + let annotationGroupHeight = 0; + let labelGroupHeight = 0; + let membersGroupHeight = 0; + annotationGroup = shapeSvg.insert("g").attr("class", "annotation-group text"); + if (node.annotations.length > 0) { + const annotation = node.annotations[0]; + await addText2(annotationGroup, { text: `\xAB${annotation}\xBB` }, 0); + const annotationGroupBBox = annotationGroup.node().getBBox(); + annotationGroupHeight = annotationGroupBBox.height; + } + labelGroup = shapeSvg.insert("g").attr("class", "label-group text"); + await addText2(labelGroup, node, 0, ["font-weight: bolder"]); + const labelGroupBBox = labelGroup.node().getBBox(); + labelGroupHeight = labelGroupBBox.height; + membersGroup = shapeSvg.insert("g").attr("class", "members-group text"); + let yOffset = 0; + for (const member of node.members) { + const height = await addText2(membersGroup, member, yOffset, [member.parseClassifier()]); + yOffset += height + TEXT_PADDING; + } + membersGroupHeight = membersGroup.node().getBBox().height; + if (membersGroupHeight <= 0) { + membersGroupHeight = GAP / 2; + } + methodsGroup = shapeSvg.insert("g").attr("class", "methods-group text"); + let methodsYOffset = 0; + for (const method of node.methods) { + const height = await addText2(methodsGroup, method, methodsYOffset, [method.parseClassifier()]); + methodsYOffset += height + TEXT_PADDING; + } + let bbox = shapeSvg.node().getBBox(); + if (annotationGroup !== null) { + const annotationGroupBBox = annotationGroup.node().getBBox(); + annotationGroup.attr("transform", `translate(${-annotationGroupBBox.width / 2})`); + } + labelGroup.attr("transform", `translate(${-labelGroupBBox.width / 2}, ${annotationGroupHeight})`); + bbox = shapeSvg.node().getBBox(); + membersGroup.attr( + "transform", + `translate(${0}, ${annotationGroupHeight + labelGroupHeight + GAP * 2})` + ); + bbox = shapeSvg.node().getBBox(); + methodsGroup.attr( + "transform", + `translate(${0}, ${annotationGroupHeight + labelGroupHeight + (membersGroupHeight ? membersGroupHeight + GAP * 4 : GAP * 2)})` + ); + bbox = shapeSvg.node().getBBox(); + return { shapeSvg, bbox }; +} +__name(textHelper, "textHelper"); +async function addText2(parentGroup, node, yOffset, styles = []) { + const textEl = parentGroup.insert("g").attr("class", "label").attr("style", styles.join("; ")); + const config = getConfig(); + let useHtmlLabels = "useHtmlLabels" in node ? node.useHtmlLabels : evaluate(config.htmlLabels) ?? true; + let textContent = ""; + if ("text" in node) { + textContent = node.text; + } else { + textContent = node.label; + } + if (!useHtmlLabels && textContent.startsWith("\\")) { + textContent = textContent.substring(1); + } + if (hasKatex(textContent)) { + useHtmlLabels = true; + } + const text2 = await createText( + textEl, + sanitizeText2(decodeEntities(textContent)), + { + width: calculateTextWidth(textContent, config) + 50, + // Add room for error when splitting text into multiple lines + classes: "markdown-node-label", + useHtmlLabels + }, + config + ); + let bbox; + let numberOfLines = 1; + if (!useHtmlLabels) { + if (styles.includes("font-weight: bolder")) { + select6(text2).selectAll("tspan").attr("font-weight", ""); + } + numberOfLines = text2.children.length; + const textChild = text2.children[0]; + if (text2.textContent === "" || text2.textContent.includes(">")) { + textChild.textContent = textContent[0] + textContent.substring(1).replaceAll(">", ">").replaceAll("<", "<").trim(); + const preserveSpace = textContent[1] === " "; + if (preserveSpace) { + textChild.textContent = textChild.textContent[0] + " " + textChild.textContent.substring(1); + } + } + if (textChild.textContent === "undefined") { + textChild.textContent = ""; + } + bbox = text2.getBBox(); + } else { + const div = text2.children[0]; + const dv = select6(text2); + numberOfLines = div.innerHTML.split("
").length; + if (div.innerHTML.includes("")) { + numberOfLines += div.innerHTML.split("").length - 1; + } + const images = div.getElementsByTagName("img"); + if (images) { + const noImgText = textContent.replace(/]*>/g, "").trim() === ""; + await Promise.all( + [...images].map( + (img) => new Promise((res) => { + function setupImage() { + img.style.display = "flex"; + img.style.flexDirection = "column"; + if (noImgText) { + const bodyFontSize = config.fontSize?.toString() ?? window.getComputedStyle(document.body).fontSize; + const enlargingFactor = 5; + const width = parseInt(bodyFontSize, 10) * enlargingFactor + "px"; + img.style.minWidth = width; + img.style.maxWidth = width; + } else { + img.style.width = "100%"; + } + res(img); + } + __name(setupImage, "setupImage"); + setTimeout(() => { + if (img.complete) { + setupImage(); + } + }); + img.addEventListener("error", setupImage); + img.addEventListener("load", setupImage); + }) + ) + ); + } + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + textEl.attr("transform", "translate(0," + (-bbox.height / (2 * numberOfLines) + yOffset) + ")"); + return bbox.height; +} +__name(addText2, "addText"); + +// src/rendering-util/rendering-elements/shapes/classBox.ts +async function classBox(parent, node) { + const config = getConfig2(); + const PADDING = config.class.padding ?? 12; + const GAP = PADDING; + const useHtmlLabels = node.useHtmlLabels ?? evaluate(config.htmlLabels) ?? true; + const classNode = node; + classNode.annotations = classNode.annotations ?? []; + classNode.members = classNode.members ?? []; + classNode.methods = classNode.methods ?? []; + const { shapeSvg, bbox } = await textHelper(parent, node, config, useHtmlLabels, GAP); + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + node.cssStyles = classNode.styles || ""; + const styles = classNode.styles?.join(";") || nodeStyles || ""; + if (!node.cssStyles) { + node.cssStyles = styles.replaceAll("!important", "").split(";"); + } + const renderExtraBox = classNode.members.length === 0 && classNode.methods.length === 0 && !config.class?.hideEmptyMembersBox; + const rc = rough56.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const w = bbox.width; + let h = bbox.height; + if (classNode.members.length === 0 && classNode.methods.length === 0) { + h += GAP; + } else if (classNode.members.length > 0 && classNode.methods.length === 0) { + h += GAP * 2; + } + const x = -w / 2; + const y = -h / 2; + const roughRect = rc.rectangle( + x - PADDING, + y - PADDING - (renderExtraBox ? PADDING : classNode.members.length === 0 && classNode.methods.length === 0 ? -PADDING / 2 : 0), + w + 2 * PADDING, + h + 2 * PADDING + (renderExtraBox ? PADDING * 2 : classNode.members.length === 0 && classNode.methods.length === 0 ? -PADDING : 0), + options + ); + const rect2 = shapeSvg.insert(() => roughRect, ":first-child"); + rect2.attr("class", "basic label-container"); + const rectBBox = rect2.node().getBBox(); + shapeSvg.selectAll(".text").each((_, i, nodes) => { + const text2 = select7(nodes[i]); + const transform = text2.attr("transform"); + let translateY = 0; + if (transform) { + const regex = RegExp(/translate\(([^,]+),([^)]+)\)/); + const translate = regex.exec(transform); + if (translate) { + translateY = parseFloat(translate[2]); + } + } + let newTranslateY = translateY + y + PADDING - (renderExtraBox ? PADDING : classNode.members.length === 0 && classNode.methods.length === 0 ? -PADDING / 2 : 0); + if (!useHtmlLabels) { + newTranslateY -= 4; + } + let newTranslateX = x; + if (text2.attr("class").includes("label-group") || text2.attr("class").includes("annotation-group")) { + newTranslateX = -text2.node()?.getBBox().width / 2 || 0; + shapeSvg.selectAll("text").each(function(_2, i2, nodes2) { + if (window.getComputedStyle(nodes2[i2]).textAnchor === "middle") { + newTranslateX = 0; + } + }); + } + text2.attr("transform", `translate(${newTranslateX}, ${newTranslateY})`); + }); + const annotationGroupHeight = shapeSvg.select(".annotation-group").node().getBBox().height - (renderExtraBox ? PADDING / 2 : 0) || 0; + const labelGroupHeight = shapeSvg.select(".label-group").node().getBBox().height - (renderExtraBox ? PADDING / 2 : 0) || 0; + const membersGroupHeight = shapeSvg.select(".members-group").node().getBBox().height - (renderExtraBox ? PADDING / 2 : 0) || 0; + if (classNode.members.length > 0 || classNode.methods.length > 0 || renderExtraBox) { + const roughLine = rc.line( + rectBBox.x, + annotationGroupHeight + labelGroupHeight + y + PADDING, + rectBBox.x + rectBBox.width, + annotationGroupHeight + labelGroupHeight + y + PADDING, + options + ); + const line = shapeSvg.insert(() => roughLine); + line.attr("class", "divider").attr("style", styles); + } + if (renderExtraBox || classNode.members.length > 0 || classNode.methods.length > 0) { + const roughLine = rc.line( + rectBBox.x, + annotationGroupHeight + labelGroupHeight + membersGroupHeight + y + GAP * 2 + PADDING, + rectBBox.x + rectBBox.width, + annotationGroupHeight + labelGroupHeight + membersGroupHeight + y + PADDING + GAP * 2, + options + ); + const line = shapeSvg.insert(() => roughLine); + line.attr("class", "divider").attr("style", styles); + } + if (classNode.look !== "handDrawn") { + shapeSvg.selectAll("path").attr("style", styles); + } + rect2.select(":nth-child(2)").attr("style", styles); + shapeSvg.selectAll(".divider").select("path").attr("style", styles); + if (node.labelStyle) { + shapeSvg.selectAll("span").attr("style", node.labelStyle); + } else { + shapeSvg.selectAll("span").attr("style", styles); + } + if (!useHtmlLabels) { + const colorRegex = RegExp(/color\s*:\s*([^;]*)/); + const match = colorRegex.exec(styles); + if (match) { + const colorStyle = match[0].replace("color", "fill"); + shapeSvg.selectAll("tspan").attr("style", colorStyle); + } else if (labelStyles) { + const match2 = colorRegex.exec(labelStyles); + if (match2) { + const colorStyle = match2[0].replace("color", "fill"); + shapeSvg.selectAll("tspan").attr("style", colorStyle); + } + } + } + updateNodeBounds(node, rect2); + node.intersect = function(point) { + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(classBox, "classBox"); + +// src/rendering-util/rendering-elements/shapes/requirementBox.ts +import rough57 from "roughjs"; +import { select as select8 } from "d3"; +async function requirementBox(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const requirementNode = node; + const elementNode = node; + const padding = 20; + const gap = 20; + const isRequirementNode = "verifyMethod" in node; + const classes = getNodeClasses(node); + const shapeSvg = parent.insert("g").attr("class", classes).attr("id", node.domId ?? node.id); + let typeHeight; + if (isRequirementNode) { + typeHeight = await addText3( + shapeSvg, + `<<${requirementNode.type}>>`, + 0, + node.labelStyle + ); + } else { + typeHeight = await addText3(shapeSvg, "<<Element>>", 0, node.labelStyle); + } + let accumulativeHeight = typeHeight; + const nameHeight = await addText3( + shapeSvg, + requirementNode.name, + accumulativeHeight, + node.labelStyle + "; font-weight: bold;" + ); + accumulativeHeight += nameHeight + gap; + if (isRequirementNode) { + const idHeight = await addText3( + shapeSvg, + `${requirementNode.requirementId ? `ID: ${requirementNode.requirementId}` : ""}`, + accumulativeHeight, + node.labelStyle + ); + accumulativeHeight += idHeight; + const textHeight = await addText3( + shapeSvg, + `${requirementNode.text ? `Text: ${requirementNode.text}` : ""}`, + accumulativeHeight, + node.labelStyle + ); + accumulativeHeight += textHeight; + const riskHeight = await addText3( + shapeSvg, + `${requirementNode.risk ? `Risk: ${requirementNode.risk}` : ""}`, + accumulativeHeight, + node.labelStyle + ); + accumulativeHeight += riskHeight; + await addText3( + shapeSvg, + `${requirementNode.verifyMethod ? `Verification: ${requirementNode.verifyMethod}` : ""}`, + accumulativeHeight, + node.labelStyle + ); + } else { + const typeHeight2 = await addText3( + shapeSvg, + `${elementNode.type ? `Type: ${elementNode.type}` : ""}`, + accumulativeHeight, + node.labelStyle + ); + accumulativeHeight += typeHeight2; + await addText3( + shapeSvg, + `${elementNode.docRef ? `Doc Ref: ${elementNode.docRef}` : ""}`, + accumulativeHeight, + node.labelStyle + ); + } + const totalWidth = (shapeSvg.node()?.getBBox().width ?? 200) + padding; + const totalHeight = (shapeSvg.node()?.getBBox().height ?? 200) + padding; + const x = -totalWidth / 2; + const y = -totalHeight / 2; + const rc = rough57.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + if (node.look !== "handDrawn") { + options.roughness = 0; + options.fillStyle = "solid"; + } + const roughRect = rc.rectangle(x, y, totalWidth, totalHeight, options); + const rect2 = shapeSvg.insert(() => roughRect, ":first-child"); + rect2.attr("class", "basic label-container").attr("style", nodeStyles); + shapeSvg.selectAll(".label").each((_, i, nodes) => { + const text2 = select8(nodes[i]); + const transform = text2.attr("transform"); + let translateX = 0; + let translateY = 0; + if (transform) { + const regex = RegExp(/translate\(([^,]+),([^)]+)\)/); + const translate = regex.exec(transform); + if (translate) { + translateX = parseFloat(translate[1]); + translateY = parseFloat(translate[2]); + } + } + const newTranslateY = translateY - totalHeight / 2; + let newTranslateX = x + padding / 2; + if (i === 0 || i === 1) { + newTranslateX = translateX; + } + text2.attr("transform", `translate(${newTranslateX}, ${newTranslateY + padding})`); + }); + if (accumulativeHeight > typeHeight + nameHeight + gap) { + const roughLine = rc.line( + x, + y + typeHeight + nameHeight + gap, + x + totalWidth, + y + typeHeight + nameHeight + gap, + options + ); + const dividerLine = shapeSvg.insert(() => roughLine); + dividerLine.attr("style", nodeStyles); + } + updateNodeBounds(node, rect2); + node.intersect = function(point) { + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(requirementBox, "requirementBox"); +async function addText3(parentGroup, inputText, yOffset, style = "") { + if (inputText === "") { + return 0; + } + const textEl = parentGroup.insert("g").attr("class", "label").attr("style", style); + const config = getConfig2(); + const useHtmlLabels = config.htmlLabels ?? true; + const text2 = await createText( + textEl, + sanitizeText2(decodeEntities(inputText)), + { + width: calculateTextWidth(inputText, config) + 50, + // Add room for error when splitting text into multiple lines + classes: "markdown-node-label", + useHtmlLabels, + style + }, + config + ); + let bbox; + if (!useHtmlLabels) { + const textChild = text2.children[0]; + for (const child of textChild.children) { + child.textContent = child.textContent.replaceAll(">", ">").replaceAll("<", "<"); + if (style) { + child.setAttribute("style", style); + } + } + bbox = text2.getBBox(); + bbox.height += 6; + } else { + const div = text2.children[0]; + const dv = select8(text2); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + textEl.attr("transform", `translate(${-bbox.width / 2},${-bbox.height / 2 + yOffset})`); + return bbox.height; +} +__name(addText3, "addText"); + +// src/rendering-util/rendering-elements/shapes/kanbanItem.ts +import rough58 from "roughjs"; +var colorFromPriority = /* @__PURE__ */ __name((priority) => { + switch (priority) { + case "Very High": + return "red"; + case "High": + return "orange"; + case "Medium": + return null; + // no stroke + case "Low": + return "blue"; + case "Very Low": + return "lightblue"; + } +}, "colorFromPriority"); +async function kanbanItem(parent, kanbanNode, { config }) { + const { labelStyles, nodeStyles } = styles2String(kanbanNode); + kanbanNode.labelStyle = labelStyles || ""; + const labelPaddingX = 10; + const orgWidth = kanbanNode.width; + kanbanNode.width = (kanbanNode.width ?? 200) - 10; + const { + shapeSvg, + bbox, + label: labelElTitle + } = await labelHelper(parent, kanbanNode, getNodeClasses(kanbanNode)); + const padding = kanbanNode.padding || 10; + let ticketUrl = ""; + let link; + if ("ticket" in kanbanNode && kanbanNode.ticket && config?.kanban?.ticketBaseUrl) { + ticketUrl = config?.kanban?.ticketBaseUrl.replace("#TICKET#", kanbanNode.ticket); + link = shapeSvg.insert("svg:a", ":first-child").attr("class", "kanban-ticket-link").attr("xlink:href", ticketUrl).attr("target", "_blank"); + } + const options = { + useHtmlLabels: kanbanNode.useHtmlLabels, + labelStyle: kanbanNode.labelStyle || "", + width: kanbanNode.width, + img: kanbanNode.img, + padding: kanbanNode.padding || 8, + centerLabel: false + }; + let labelEl, bbox2; + if (link) { + ({ label: labelEl, bbox: bbox2 } = await insertLabel( + link, + "ticket" in kanbanNode && kanbanNode.ticket || "", + options + )); + } else { + ({ label: labelEl, bbox: bbox2 } = await insertLabel( + shapeSvg, + "ticket" in kanbanNode && kanbanNode.ticket || "", + options + )); + } + const { label: labelElAssigned, bbox: bboxAssigned } = await insertLabel( + shapeSvg, + "assigned" in kanbanNode && kanbanNode.assigned || "", + options + ); + kanbanNode.width = orgWidth; + const labelPaddingY = 10; + const totalWidth = kanbanNode?.width || 0; + const heightAdj = Math.max(bbox2.height, bboxAssigned.height) / 2; + const totalHeight = Math.max(bbox.height + labelPaddingY * 2, kanbanNode?.height || 0) + heightAdj; + const x = -totalWidth / 2; + const y = -totalHeight / 2; + labelElTitle.attr( + "transform", + "translate(" + (padding - totalWidth / 2) + ", " + (-heightAdj - bbox.height / 2) + ")" + ); + labelEl.attr( + "transform", + "translate(" + (padding - totalWidth / 2) + ", " + (-heightAdj + bbox.height / 2) + ")" + ); + labelElAssigned.attr( + "transform", + "translate(" + (padding + totalWidth / 2 - bboxAssigned.width - 2 * labelPaddingX) + ", " + (-heightAdj + bbox.height / 2) + ")" + ); + let rect2; + const { rx, ry } = kanbanNode; + const { cssStyles } = kanbanNode; + if (kanbanNode.look === "handDrawn") { + const rc = rough58.svg(shapeSvg); + const options2 = userNodeOverrides(kanbanNode, {}); + const roughNode = rx || ry ? rc.path(createRoundedRectPathD(x, y, totalWidth, totalHeight, rx || 0), options2) : rc.rectangle(x, y, totalWidth, totalHeight, options2); + rect2 = shapeSvg.insert(() => roughNode, ":first-child"); + rect2.attr("class", "basic label-container").attr("style", cssStyles ? cssStyles : null); + } else { + rect2 = shapeSvg.insert("rect", ":first-child"); + rect2.attr("class", "basic label-container __APA__").attr("style", nodeStyles).attr("rx", rx ?? 5).attr("ry", ry ?? 5).attr("x", x).attr("y", y).attr("width", totalWidth).attr("height", totalHeight); + const priority = "priority" in kanbanNode && kanbanNode.priority; + if (priority) { + const line = shapeSvg.append("line"); + const lineX = x + 2; + const y1 = y + Math.floor((rx ?? 0) / 2); + const y2 = y + totalHeight - Math.floor((rx ?? 0) / 2); + line.attr("x1", lineX).attr("y1", y1).attr("x2", lineX).attr("y2", y2).attr("stroke-width", "4").attr("stroke", colorFromPriority(priority)); + } + } + updateNodeBounds(kanbanNode, rect2); + kanbanNode.height = totalHeight; + kanbanNode.intersect = function(point) { + return intersect_default.rect(kanbanNode, point); + }; + return shapeSvg; +} +__name(kanbanItem, "kanbanItem"); + +// src/rendering-util/rendering-elements/shapes/bang.ts +import rough59 from "roughjs"; +async function bang(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, halfPadding, label } = await labelHelper( + parent, + node, + getNodeClasses(node) + ); + const w = bbox.width + 10 * halfPadding; + const h = bbox.height + 8 * halfPadding; + const r = 0.15 * w; + const { cssStyles } = node; + const minWidth = bbox.width + 20; + const minHeight = bbox.height + 20; + const effectiveWidth = Math.max(w, minWidth); + const effectiveHeight = Math.max(h, minHeight); + label.attr("transform", `translate(${-bbox.width / 2}, ${-bbox.height / 2})`); + let bangElem; + const path = `M0 0 + a${r},${r} 1 0,0 ${effectiveWidth * 0.25},${-1 * effectiveHeight * 0.1} + a${r},${r} 1 0,0 ${effectiveWidth * 0.25},${0} + a${r},${r} 1 0,0 ${effectiveWidth * 0.25},${0} + a${r},${r} 1 0,0 ${effectiveWidth * 0.25},${effectiveHeight * 0.1} + + a${r},${r} 1 0,0 ${effectiveWidth * 0.15},${effectiveHeight * 0.33} + a${r * 0.8},${r * 0.8} 1 0,0 0,${effectiveHeight * 0.34} + a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.15},${effectiveHeight * 0.33} + + a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.25},${effectiveHeight * 0.15} + a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.25},0 + a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.25},0 + a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.25},${-1 * effectiveHeight * 0.15} + + a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.1},${-1 * effectiveHeight * 0.33} + a${r * 0.8},${r * 0.8} 1 0,0 0,${-1 * effectiveHeight * 0.34} + a${r},${r} 1 0,0 ${effectiveWidth * 0.1},${-1 * effectiveHeight * 0.33} + H0 V0 Z`; + if (node.look === "handDrawn") { + const rc = rough59.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const roughNode = rc.path(path, options); + bangElem = shapeSvg.insert(() => roughNode, ":first-child"); + bangElem.attr("class", "basic label-container").attr("style", handleUndefinedAttr(cssStyles)); + } else { + bangElem = shapeSvg.insert("path", ":first-child").attr("class", "basic label-container").attr("style", nodeStyles).attr("d", path); + } + bangElem.attr("transform", `translate(${-effectiveWidth / 2}, ${-effectiveHeight / 2})`); + updateNodeBounds(node, bangElem); + node.calcIntersect = function(bounds, point) { + return intersect_default.rect(bounds, point); + }; + node.intersect = function(point) { + log.info("Bang intersect", node, point); + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(bang, "bang"); + +// src/rendering-util/rendering-elements/shapes/cloud.ts +import rough60 from "roughjs"; +async function cloud(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, halfPadding, label } = await labelHelper( + parent, + node, + getNodeClasses(node) + ); + const w = bbox.width + 2 * halfPadding; + const h = bbox.height + 2 * halfPadding; + const r1 = 0.15 * w; + const r2 = 0.25 * w; + const r3 = 0.35 * w; + const r4 = 0.2 * w; + const { cssStyles } = node; + let cloudElem; + const path = `M0 0 + a${r1},${r1} 0 0,1 ${w * 0.25},${-1 * w * 0.1} + a${r3},${r3} 1 0,1 ${w * 0.4},${-1 * w * 0.1} + a${r2},${r2} 1 0,1 ${w * 0.35},${w * 0.2} + + a${r1},${r1} 1 0,1 ${w * 0.15},${h * 0.35} + a${r4},${r4} 1 0,1 ${-1 * w * 0.15},${h * 0.65} + + a${r2},${r1} 1 0,1 ${-1 * w * 0.25},${w * 0.15} + a${r3},${r3} 1 0,1 ${-1 * w * 0.5},0 + a${r1},${r1} 1 0,1 ${-1 * w * 0.25},${-1 * w * 0.15} + + a${r1},${r1} 1 0,1 ${-1 * w * 0.1},${-1 * h * 0.35} + a${r4},${r4} 1 0,1 ${w * 0.1},${-1 * h * 0.65} + H0 V0 Z`; + if (node.look === "handDrawn") { + const rc = rough60.svg(shapeSvg); + const options = userNodeOverrides(node, {}); + const roughNode = rc.path(path, options); + cloudElem = shapeSvg.insert(() => roughNode, ":first-child"); + cloudElem.attr("class", "basic label-container").attr("style", handleUndefinedAttr(cssStyles)); + } else { + cloudElem = shapeSvg.insert("path", ":first-child").attr("class", "basic label-container").attr("style", nodeStyles).attr("d", path); + } + label.attr("transform", `translate(${-bbox.width / 2}, ${-bbox.height / 2})`); + cloudElem.attr("transform", `translate(${-w / 2}, ${-h / 2})`); + updateNodeBounds(node, cloudElem); + node.calcIntersect = function(bounds, point) { + return intersect_default.rect(bounds, point); + }; + node.intersect = function(point) { + log.info("Cloud intersect", node, point); + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(cloud, "cloud"); + +// src/rendering-util/rendering-elements/shapes/defaultMindmapNode.ts +async function defaultMindmapNode(parent, node) { + const { labelStyles, nodeStyles } = styles2String(node); + node.labelStyle = labelStyles; + const { shapeSvg, bbox, halfPadding, label } = await labelHelper( + parent, + node, + getNodeClasses(node) + ); + const w = bbox.width + 8 * halfPadding; + const h = bbox.height + 2 * halfPadding; + const rd = 5; + const rectPath = ` + M${-w / 2} ${h / 2 - rd} + v${-h + 2 * rd} + q0,-${rd} ${rd},-${rd} + h${w - 2 * rd} + q${rd},0 ${rd},${rd} + v${h - 2 * rd} + q0,${rd} -${rd},${rd} + h${-w + 2 * rd} + q-${rd},0 -${rd},-${rd} + Z + `; + const bg = shapeSvg.append("path").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + node.type).attr("style", nodeStyles).attr("d", rectPath); + shapeSvg.append("line").attr("class", "node-line-").attr("x1", -w / 2).attr("y1", h / 2).attr("x2", w / 2).attr("y2", h / 2); + label.attr("transform", `translate(${-bbox.width / 2}, ${-bbox.height / 2})`); + shapeSvg.append(() => label.node()); + updateNodeBounds(node, bg); + node.calcIntersect = function(bounds, point) { + return intersect_default.rect(bounds, point); + }; + node.intersect = function(point) { + return intersect_default.rect(node, point); + }; + return shapeSvg; +} +__name(defaultMindmapNode, "defaultMindmapNode"); + +// src/rendering-util/rendering-elements/shapes/mindmapCircle.ts +async function mindmapCircle(parent, node) { + const options = { + padding: node.padding ?? 0 + }; + return circle(parent, node, options); +} +__name(mindmapCircle, "mindmapCircle"); + +// src/rendering-util/rendering-elements/shapes.ts +var shapesDefs = [ + { + semanticName: "Process", + name: "Rectangle", + shortName: "rect", + description: "Standard process shape", + aliases: ["proc", "process", "rectangle"], + internalAliases: ["squareRect"], + handler: squareRect2 + }, + { + semanticName: "Event", + name: "Rounded Rectangle", + shortName: "rounded", + description: "Represents an event", + aliases: ["event"], + internalAliases: ["roundedRect"], + handler: roundedRect + }, + { + semanticName: "Terminal Point", + name: "Stadium", + shortName: "stadium", + description: "Terminal point", + aliases: ["terminal", "pill"], + handler: stadium + }, + { + semanticName: "Subprocess", + name: "Framed Rectangle", + shortName: "fr-rect", + description: "Subprocess", + aliases: ["subprocess", "subproc", "framed-rectangle", "subroutine"], + handler: subroutine + }, + { + semanticName: "Database", + name: "Cylinder", + shortName: "cyl", + description: "Database storage", + aliases: ["db", "database", "cylinder"], + handler: cylinder + }, + { + semanticName: "Start", + name: "Circle", + shortName: "circle", + description: "Starting point", + aliases: ["circ"], + handler: circle + }, + { + semanticName: "Bang", + name: "Bang", + shortName: "bang", + description: "Bang", + aliases: ["bang"], + handler: bang + }, + { + semanticName: "Cloud", + name: "Cloud", + shortName: "cloud", + description: "cloud", + aliases: ["cloud"], + handler: cloud + }, + { + semanticName: "Decision", + name: "Diamond", + shortName: "diam", + description: "Decision-making step", + aliases: ["decision", "diamond", "question"], + handler: question + }, + { + semanticName: "Prepare Conditional", + name: "Hexagon", + shortName: "hex", + description: "Preparation or condition step", + aliases: ["hexagon", "prepare"], + handler: hexagon + }, + { + semanticName: "Data Input/Output", + name: "Lean Right", + shortName: "lean-r", + description: "Represents input or output", + aliases: ["lean-right", "in-out"], + internalAliases: ["lean_right"], + handler: lean_right + }, + { + semanticName: "Data Input/Output", + name: "Lean Left", + shortName: "lean-l", + description: "Represents output or input", + aliases: ["lean-left", "out-in"], + internalAliases: ["lean_left"], + handler: lean_left + }, + { + semanticName: "Priority Action", + name: "Trapezoid Base Bottom", + shortName: "trap-b", + description: "Priority action", + aliases: ["priority", "trapezoid-bottom", "trapezoid"], + handler: trapezoid + }, + { + semanticName: "Manual Operation", + name: "Trapezoid Base Top", + shortName: "trap-t", + description: "Represents a manual task", + aliases: ["manual", "trapezoid-top", "inv-trapezoid"], + internalAliases: ["inv_trapezoid"], + handler: inv_trapezoid + }, + { + semanticName: "Stop", + name: "Double Circle", + shortName: "dbl-circ", + description: "Represents a stop point", + aliases: ["double-circle"], + internalAliases: ["doublecircle"], + handler: doublecircle + }, + { + semanticName: "Text Block", + name: "Text Block", + shortName: "text", + description: "Text block", + handler: text + }, + { + semanticName: "Card", + name: "Notched Rectangle", + shortName: "notch-rect", + description: "Represents a card", + aliases: ["card", "notched-rectangle"], + handler: card + }, + { + semanticName: "Lined/Shaded Process", + name: "Lined Rectangle", + shortName: "lin-rect", + description: "Lined process shape", + aliases: ["lined-rectangle", "lined-process", "lin-proc", "shaded-process"], + handler: shadedProcess + }, + { + semanticName: "Start", + name: "Small Circle", + shortName: "sm-circ", + description: "Small starting point", + aliases: ["start", "small-circle"], + internalAliases: ["stateStart"], + handler: stateStart + }, + { + semanticName: "Stop", + name: "Framed Circle", + shortName: "fr-circ", + description: "Stop point", + aliases: ["stop", "framed-circle"], + internalAliases: ["stateEnd"], + handler: stateEnd + }, + { + semanticName: "Fork/Join", + name: "Filled Rectangle", + shortName: "fork", + description: "Fork or join in process flow", + aliases: ["join"], + internalAliases: ["forkJoin"], + handler: forkJoin + }, + { + semanticName: "Collate", + name: "Hourglass", + shortName: "hourglass", + description: "Represents a collate operation", + aliases: ["hourglass", "collate"], + handler: hourglass + }, + { + semanticName: "Comment", + name: "Curly Brace", + shortName: "brace", + description: "Adds a comment", + aliases: ["comment", "brace-l"], + handler: curlyBraceLeft + }, + { + semanticName: "Comment Right", + name: "Curly Brace", + shortName: "brace-r", + description: "Adds a comment", + handler: curlyBraceRight + }, + { + semanticName: "Comment with braces on both sides", + name: "Curly Braces", + shortName: "braces", + description: "Adds a comment", + handler: curlyBraces + }, + { + semanticName: "Com Link", + name: "Lightning Bolt", + shortName: "bolt", + description: "Communication link", + aliases: ["com-link", "lightning-bolt"], + handler: lightningBolt + }, + { + semanticName: "Document", + name: "Document", + shortName: "doc", + description: "Represents a document", + aliases: ["doc", "document"], + handler: waveEdgedRectangle + }, + { + semanticName: "Delay", + name: "Half-Rounded Rectangle", + shortName: "delay", + description: "Represents a delay", + aliases: ["half-rounded-rectangle"], + handler: halfRoundedRectangle + }, + { + semanticName: "Direct Access Storage", + name: "Horizontal Cylinder", + shortName: "h-cyl", + description: "Direct access storage", + aliases: ["das", "horizontal-cylinder"], + handler: tiltedCylinder + }, + { + semanticName: "Disk Storage", + name: "Lined Cylinder", + shortName: "lin-cyl", + description: "Disk storage", + aliases: ["disk", "lined-cylinder"], + handler: linedCylinder + }, + { + semanticName: "Display", + name: "Curved Trapezoid", + shortName: "curv-trap", + description: "Represents a display", + aliases: ["curved-trapezoid", "display"], + handler: curvedTrapezoid + }, + { + semanticName: "Divided Process", + name: "Divided Rectangle", + shortName: "div-rect", + description: "Divided process shape", + aliases: ["div-proc", "divided-rectangle", "divided-process"], + handler: dividedRectangle + }, + { + semanticName: "Extract", + name: "Triangle", + shortName: "tri", + description: "Extraction process", + aliases: ["extract", "triangle"], + handler: triangle + }, + { + semanticName: "Internal Storage", + name: "Window Pane", + shortName: "win-pane", + description: "Internal storage", + aliases: ["internal-storage", "window-pane"], + handler: windowPane + }, + { + semanticName: "Junction", + name: "Filled Circle", + shortName: "f-circ", + description: "Junction point", + aliases: ["junction", "filled-circle"], + handler: filledCircle + }, + { + semanticName: "Loop Limit", + name: "Trapezoidal Pentagon", + shortName: "notch-pent", + description: "Loop limit step", + aliases: ["loop-limit", "notched-pentagon"], + handler: trapezoidalPentagon + }, + { + semanticName: "Manual File", + name: "Flipped Triangle", + shortName: "flip-tri", + description: "Manual file operation", + aliases: ["manual-file", "flipped-triangle"], + handler: flippedTriangle + }, + { + semanticName: "Manual Input", + name: "Sloped Rectangle", + shortName: "sl-rect", + description: "Manual input step", + aliases: ["manual-input", "sloped-rectangle"], + handler: slopedRect + }, + { + semanticName: "Multi-Document", + name: "Stacked Document", + shortName: "docs", + description: "Multiple documents", + aliases: ["documents", "st-doc", "stacked-document"], + handler: multiWaveEdgedRectangle + }, + { + semanticName: "Multi-Process", + name: "Stacked Rectangle", + shortName: "st-rect", + description: "Multiple processes", + aliases: ["procs", "processes", "stacked-rectangle"], + handler: multiRect + }, + { + semanticName: "Stored Data", + name: "Bow Tie Rectangle", + shortName: "bow-rect", + description: "Stored data", + aliases: ["stored-data", "bow-tie-rectangle"], + handler: bowTieRect + }, + { + semanticName: "Summary", + name: "Crossed Circle", + shortName: "cross-circ", + description: "Summary", + aliases: ["summary", "crossed-circle"], + handler: crossedCircle + }, + { + semanticName: "Tagged Document", + name: "Tagged Document", + shortName: "tag-doc", + description: "Tagged document", + aliases: ["tag-doc", "tagged-document"], + handler: taggedWaveEdgedRectangle + }, + { + semanticName: "Tagged Process", + name: "Tagged Rectangle", + shortName: "tag-rect", + description: "Tagged process", + aliases: ["tagged-rectangle", "tag-proc", "tagged-process"], + handler: taggedRect + }, + { + semanticName: "Paper Tape", + name: "Flag", + shortName: "flag", + description: "Paper tape", + aliases: ["paper-tape"], + handler: waveRectangle + }, + { + semanticName: "Odd", + name: "Odd", + shortName: "odd", + description: "Odd shape", + internalAliases: ["rect_left_inv_arrow"], + handler: rect_left_inv_arrow + }, + { + semanticName: "Lined Document", + name: "Lined Document", + shortName: "lin-doc", + description: "Lined document", + aliases: ["lined-document"], + handler: linedWaveEdgedRect + } +]; +var generateShapeMap = /* @__PURE__ */ __name(() => { + const undocumentedShapes = { + // States + state, + choice, + note, + // Rectangles + rectWithTitle, + labelRect, + // Icons + iconSquare, + iconCircle, + icon, + iconRounded, + imageSquare, + anchor, + // Kanban diagram + kanbanItem, + //Mindmap diagram + mindmapCircle, + defaultMindmapNode, + // class diagram + classBox, + // er diagram + erBox, + // Requirement diagram + requirementBox + }; + const entries = [ + ...Object.entries(undocumentedShapes), + ...shapesDefs.flatMap((shape) => { + const aliases = [ + shape.shortName, + ..."aliases" in shape ? shape.aliases : [], + ..."internalAliases" in shape ? shape.internalAliases : [] + ]; + return aliases.map((alias) => [alias, shape.handler]); + }) + ]; + return Object.fromEntries(entries); +}, "generateShapeMap"); +var shapes2 = generateShapeMap(); +function isValidShape(shape) { + return shape in shapes2; +} +__name(isValidShape, "isValidShape"); + +// src/rendering-util/rendering-elements/nodes.ts +var nodeElems = /* @__PURE__ */ new Map(); +async function insertNode(elem, node, renderOptions) { + let newEl; + let el; + if (node.shape === "rect") { + if (node.rx && node.ry) { + node.shape = "roundedRect"; + } else { + node.shape = "squareRect"; + } + } + const shapeHandler = node.shape ? shapes2[node.shape] : void 0; + if (!shapeHandler) { + throw new Error(`No such shape: ${node.shape}. Please check your syntax.`); + } + if (node.link) { + let target; + if (renderOptions.config.securityLevel === "sandbox") { + target = "_top"; + } else if (node.linkTarget) { + target = node.linkTarget || "_blank"; + } + newEl = elem.insert("svg:a").attr("xlink:href", node.link).attr("target", target ?? null); + el = await shapeHandler(newEl, node, renderOptions); + } else { + el = await shapeHandler(elem, node, renderOptions); + newEl = el; + } + if (node.tooltip) { + el.attr("title", node.tooltip); + } + nodeElems.set(node.id, newEl); + if (node.haveCallback) { + newEl.attr("class", newEl.attr("class") + " clickable"); + } + return newEl; +} +__name(insertNode, "insertNode"); +var setNodeElem = /* @__PURE__ */ __name((elem, node) => { + nodeElems.set(node.id, elem); +}, "setNodeElem"); +var clear2 = /* @__PURE__ */ __name(() => { + nodeElems.clear(); +}, "clear"); +var positionNode = /* @__PURE__ */ __name((node) => { + const el = nodeElems.get(node.id); + log.trace( + "Transforming node", + node.diff, + node, + "translate(" + (node.x - node.width / 2 - 5) + ", " + node.width / 2 + ")" + ); + const padding = 8; + const diff = node.diff || 0; + if (node.clusterNode) { + el.attr( + "transform", + "translate(" + (node.x + diff - node.width / 2) + ", " + (node.y - node.height / 2 - padding) + ")" + ); + } else { + el.attr("transform", "translate(" + node.x + ", " + node.y + ")"); + } + return diff; +}, "positionNode"); + +export { + labelHelper, + updateNodeBounds, + createLabel_default, + isValidShape, + insertCluster, + clear, + insertNode, + setNodeElem, + clear2, + positionNode +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JZLCHNYA.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JZLCHNYA.mjs.map new file mode 100644 index 0000000..07e4844 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-JZLCHNYA.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/rendering-util/rendering-elements/shapes/util.ts", "../../../src/rendering-util/rendering-elements/clusters.js", "../../../src/rendering-util/rendering-elements/intersect/intersect-rect.js", "../../../src/rendering-util/rendering-elements/createLabel.js", "../../../src/rendering-util/rendering-elements/shapes/roundedRectPath.ts", "../../../src/rendering-util/rendering-elements/intersect/intersect-node.js", "../../../src/rendering-util/rendering-elements/intersect/intersect-ellipse.js", "../../../src/rendering-util/rendering-elements/intersect/intersect-circle.js", "../../../src/rendering-util/rendering-elements/intersect/intersect-line.js", "../../../src/rendering-util/rendering-elements/intersect/intersect-polygon.js", "../../../src/rendering-util/rendering-elements/intersect/index.js", "../../../src/rendering-util/rendering-elements/shapes/anchor.ts", "../../../src/rendering-util/rendering-elements/shapes/bowTieRect.ts", "../../../src/rendering-util/rendering-elements/shapes/card.ts", "../../../src/rendering-util/rendering-elements/shapes/insertPolygonShape.ts", "../../../src/rendering-util/rendering-elements/shapes/choice.ts", "../../../src/rendering-util/rendering-elements/shapes/circle.ts", "../../../src/rendering-util/rendering-elements/shapes/crossedCircle.ts", "../../../src/rendering-util/rendering-elements/shapes/curlyBraceLeft.ts", "../../../src/rendering-util/rendering-elements/shapes/curlyBraceRight.ts", "../../../src/rendering-util/rendering-elements/shapes/curlyBraces.ts", "../../../src/rendering-util/rendering-elements/shapes/curvedTrapezoid.ts", "../../../src/rendering-util/rendering-elements/shapes/cylinder.ts", "../../../src/rendering-util/rendering-elements/shapes/dividedRect.ts", "../../../src/rendering-util/rendering-elements/shapes/doubleCircle.ts", "../../../src/rendering-util/rendering-elements/shapes/filledCircle.ts", "../../../src/rendering-util/rendering-elements/shapes/flippedTriangle.ts", "../../../src/rendering-util/rendering-elements/shapes/forkJoin.ts", "../../../src/rendering-util/rendering-elements/shapes/halfRoundedRectangle.ts", "../../../src/rendering-util/rendering-elements/shapes/hexagon.ts", "../../../src/rendering-util/rendering-elements/shapes/hourglass.ts", "../../../src/rendering-util/rendering-elements/shapes/icon.ts", "../../../src/rendering-util/rendering-elements/shapes/iconCircle.ts", "../../../src/rendering-util/rendering-elements/shapes/iconRounded.ts", "../../../src/rendering-util/rendering-elements/shapes/iconSquare.ts", "../../../src/rendering-util/rendering-elements/shapes/imageSquare.ts", "../../../src/rendering-util/rendering-elements/shapes/invertedTrapezoid.ts", "../../../src/rendering-util/rendering-elements/shapes/drawRect.ts", "../../../src/rendering-util/rendering-elements/shapes/labelRect.ts", "../../../src/rendering-util/rendering-elements/shapes/leanLeft.ts", "../../../src/rendering-util/rendering-elements/shapes/leanRight.ts", "../../../src/rendering-util/rendering-elements/shapes/lightningBolt.ts", "../../../src/rendering-util/rendering-elements/shapes/linedCylinder.ts", "../../../src/rendering-util/rendering-elements/shapes/linedWaveEdgedRect.ts", "../../../src/rendering-util/rendering-elements/shapes/multiRect.ts", "../../../src/rendering-util/rendering-elements/shapes/multiWaveEdgedRectangle.ts", "../../../src/rendering-util/rendering-elements/shapes/note.ts", "../../../src/rendering-util/rendering-elements/shapes/question.ts", "../../../src/rendering-util/rendering-elements/shapes/rectLeftInvArrow.ts", "../../../src/rendering-util/rendering-elements/shapes/rectWithTitle.ts", "../../../src/rendering-util/rendering-elements/shapes/roundedRect.ts", "../../../src/rendering-util/rendering-elements/shapes/shadedProcess.ts", "../../../src/rendering-util/rendering-elements/shapes/slopedRect.ts", "../../../src/rendering-util/rendering-elements/shapes/squareRect.ts", "../../../src/rendering-util/rendering-elements/shapes/stadium.ts", "../../../src/rendering-util/rendering-elements/shapes/state.ts", "../../../src/rendering-util/rendering-elements/shapes/stateEnd.ts", "../../../src/rendering-util/rendering-elements/shapes/stateStart.ts", "../../../src/rendering-util/rendering-elements/shapes/subroutine.ts", "../../../src/rendering-util/rendering-elements/shapes/taggedRect.ts", "../../../src/rendering-util/rendering-elements/shapes/taggedWaveEdgedRectangle.ts", "../../../src/rendering-util/rendering-elements/shapes/text.ts", "../../../src/rendering-util/rendering-elements/shapes/tiltedCylinder.ts", "../../../src/rendering-util/rendering-elements/shapes/trapezoid.ts", "../../../src/rendering-util/rendering-elements/shapes/trapezoidalPentagon.ts", "../../../src/rendering-util/rendering-elements/shapes/triangle.ts", "../../../src/rendering-util/rendering-elements/shapes/waveEdgedRectangle.ts", "../../../src/rendering-util/rendering-elements/shapes/waveRectangle.ts", "../../../src/rendering-util/rendering-elements/shapes/windowPane.ts", "../../../src/rendering-util/rendering-elements/shapes/erBox.ts", "../../../src/rendering-util/rendering-elements/shapes/classBox.ts", "../../../src/diagrams/class/shapeUtil.ts", "../../../src/rendering-util/rendering-elements/shapes/requirementBox.ts", "../../../src/rendering-util/rendering-elements/shapes/kanbanItem.ts", "../../../src/rendering-util/rendering-elements/shapes/bang.ts", "../../../src/rendering-util/rendering-elements/shapes/cloud.ts", "../../../src/rendering-util/rendering-elements/shapes/defaultMindmapNode.ts", "../../../src/rendering-util/rendering-elements/shapes/mindmapCircle.ts", "../../../src/rendering-util/rendering-elements/shapes.ts", "../../../src/rendering-util/rendering-elements/nodes.ts"], + "sourcesContent": ["import { createText } from '../../createText.js';\nimport type { Node } from '../../types.js';\nimport { getConfig } from '../../../diagram-api/diagramAPI.js';\nimport { select } from 'd3';\nimport defaultConfig from '../../../defaultConfig.js';\nimport { evaluate, sanitizeText } from '../../../diagrams/common/common.js';\nimport { decodeEntities, handleUndefinedAttr, parseFontSize } from '../../../utils.js';\nimport type { D3Selection, Point } from '../../../types.js';\n\nexport const labelHelper = async (\n parent: D3Selection,\n node: Node,\n _classes?: string\n) => {\n let cssClasses;\n const useHtmlLabels = node.useHtmlLabels || evaluate(getConfig()?.htmlLabels);\n if (!_classes) {\n cssClasses = 'node default';\n } else {\n cssClasses = _classes;\n }\n\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', cssClasses)\n .attr('id', node.domId || node.id);\n\n // Create the label and insert it after the rect\n const labelEl = shapeSvg\n .insert('g')\n .attr('class', 'label')\n .attr('style', handleUndefinedAttr(node.labelStyle));\n\n // Replace label with default value if undefined\n let label;\n if (node.label === undefined) {\n label = '';\n } else {\n label = typeof node.label === 'string' ? node.label : node.label[0];\n }\n\n const text = await createText(labelEl, sanitizeText(decodeEntities(label), getConfig()), {\n useHtmlLabels,\n width: node.width || getConfig().flowchart?.wrappingWidth,\n // @ts-expect-error -- This is currently not used. Should this be `classes` instead?\n cssClasses: 'markdown-node-label',\n style: node.labelStyle,\n addSvgBackground: !!node.icon || !!node.img,\n });\n // Get the size of the label\n let bbox = text.getBBox();\n const halfPadding = (node?.padding ?? 0) / 2;\n\n if (useHtmlLabels) {\n const div = text.children[0];\n const dv = select(text);\n\n // if there are images, need to wait for them to load before getting the bounding box\n const images = div.getElementsByTagName('img');\n if (images) {\n const noImgText = label.replace(/]*>/g, '').trim() === '';\n\n await Promise.all(\n [...images].map(\n (img) =>\n new Promise((res) => {\n /**\n *\n */\n function setupImage() {\n img.style.display = 'flex';\n img.style.flexDirection = 'column';\n\n if (noImgText) {\n // default size if no text\n const bodyFontSize = getConfig().fontSize\n ? getConfig().fontSize\n : window.getComputedStyle(document.body).fontSize;\n const enlargingFactor = 5;\n const [parsedBodyFontSize = defaultConfig.fontSize] = parseFontSize(bodyFontSize);\n const width = parsedBodyFontSize * enlargingFactor + 'px';\n img.style.minWidth = width;\n img.style.maxWidth = width;\n } else {\n img.style.width = '100%';\n }\n res(img);\n }\n setTimeout(() => {\n if (img.complete) {\n setupImage();\n }\n });\n img.addEventListener('error', setupImage);\n img.addEventListener('load', setupImage);\n })\n )\n );\n }\n\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n // Center the label\n if (useHtmlLabels) {\n labelEl.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n } else {\n labelEl.attr('transform', 'translate(' + 0 + ', ' + -bbox.height / 2 + ')');\n }\n if (node.centerLabel) {\n labelEl.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n }\n labelEl.insert('rect', ':first-child');\n return { shapeSvg, bbox, halfPadding, label: labelEl };\n};\nexport const insertLabel = async (\n parent: D3Selection,\n label: string,\n options: {\n labelStyle?: string | undefined;\n icon?: boolean | undefined;\n img?: string | undefined;\n useHtmlLabels?: boolean | undefined;\n padding: number;\n width?: number | undefined;\n centerLabel?: boolean | undefined;\n addSvgBackground?: boolean | undefined;\n }\n) => {\n const useHtmlLabels = options.useHtmlLabels || evaluate(getConfig()?.flowchart?.htmlLabels);\n\n // Create the label and insert it after the rect\n const labelEl = parent\n .insert('g')\n .attr('class', 'label')\n .attr('style', options.labelStyle || '');\n\n const text = await createText(labelEl, sanitizeText(decodeEntities(label), getConfig()), {\n useHtmlLabels,\n width: options.width || getConfig()?.flowchart?.wrappingWidth,\n style: options.labelStyle,\n addSvgBackground: !!options.icon || !!options.img,\n });\n // Get the size of the label\n let bbox = text.getBBox();\n const halfPadding = options.padding / 2;\n\n if (evaluate(getConfig()?.flowchart?.htmlLabels)) {\n const div = text.children[0];\n const dv = select(text);\n\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n // Center the label\n if (useHtmlLabels) {\n labelEl.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n } else {\n labelEl.attr('transform', 'translate(' + 0 + ', ' + -bbox.height / 2 + ')');\n }\n if (options.centerLabel) {\n labelEl.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n }\n labelEl.insert('rect', ':first-child');\n return { shapeSvg: parent, bbox, halfPadding, label: labelEl };\n};\nexport const updateNodeBounds = (\n node: Node,\n // D3Selection is for the roughjs case, D3Selection is for the non-roughjs case\n element: D3Selection | D3Selection\n) => {\n const bbox = element.node()!.getBBox();\n node.width = bbox.width;\n node.height = bbox.height;\n};\n\n/**\n * @param parent - Parent element to append the polygon to\n * @param w - Width of the polygon\n * @param h - Height of the polygon\n * @param points - Array of points to create the polygon\n */\nexport function insertPolygonShape(\n parent: D3Selection,\n w: number,\n h: number,\n points: Point[]\n) {\n return parent\n .insert('polygon', ':first-child')\n .attr(\n 'points',\n points\n .map(function (d) {\n return d.x + ',' + d.y;\n })\n .join(' ')\n )\n .attr('class', 'label-container')\n .attr('transform', 'translate(' + -w / 2 + ',' + h / 2 + ')');\n}\n\nexport const getNodeClasses = (node: Node, extra?: string) =>\n (node.look === 'handDrawn' ? 'rough-node' : 'node') + ' ' + node.cssClasses + ' ' + (extra || '');\n\nexport function createPathFromPoints(points: Point[]) {\n const pointStrings = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x},${p.y}`);\n pointStrings.push('Z');\n return pointStrings.join(' ');\n}\n\nexport function generateFullSineWavePoints(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n amplitude: number,\n numCycles: number\n) {\n const points = [];\n const steps = 50; // Number of segments to create a smooth curve\n const deltaX = x2 - x1;\n const deltaY = y2 - y1;\n const cycleLength = deltaX / numCycles;\n\n // Calculate frequency and phase shift\n const frequency = (2 * Math.PI) / cycleLength;\n const midY = y1 + deltaY / 2;\n\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const x = x1 + t * deltaX;\n const y = midY + amplitude * Math.sin(frequency * (x - x1));\n\n points.push({ x, y });\n }\n\n return points;\n}\n\n/**\n * @param centerX - x-coordinate of center of circle\n * @param centerY - y-coordinate of center of circle\n * @param radius - radius of circle\n * @param numPoints - total points required\n * @param startAngle - angle where arc will start\n * @param endAngle - angle where arc will end\n */\nexport function generateCirclePoints(\n centerX: number,\n centerY: number,\n radius: number,\n numPoints: number,\n startAngle: number,\n endAngle: number\n) {\n const points = [];\n\n // Convert angles to radians\n const startAngleRad = (startAngle * Math.PI) / 180;\n const endAngleRad = (endAngle * Math.PI) / 180;\n\n // Calculate the angle range in radians\n const angleRange = endAngleRad - startAngleRad;\n\n // Calculate the angle step\n const angleStep = angleRange / (numPoints - 1);\n\n for (let i = 0; i < numPoints; i++) {\n const angle = startAngleRad + i * angleStep;\n const x = centerX + radius * Math.cos(angle);\n const y = centerY + radius * Math.sin(angle);\n points.push({ x: -x, y: -y });\n }\n\n return points;\n}\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { evaluate } from '../../diagrams/common/common.js';\nimport { log } from '../../logger.js';\nimport { getSubGraphTitleMargins } from '../../utils/subGraphTitleMargins.js';\nimport { select } from 'd3';\nimport rough from 'roughjs';\nimport { createText } from '../createText.ts';\nimport intersectRect from '../rendering-elements/intersect/intersect-rect.js';\nimport createLabel from './createLabel.js';\nimport { createRoundedRectPathD } from './shapes/roundedRectPath.ts';\nimport { styles2String, userNodeOverrides } from './shapes/handDrawnShapeStyles.js';\n\nconst rect = async (parent, node) => {\n log.info('Creating subgraph rect for ', node.id, node);\n const siteConfig = getConfig();\n const { themeVariables, handDrawnSeed } = siteConfig;\n const { clusterBkg, clusterBorder } = themeVariables;\n\n const { labelStyles, nodeStyles, borderStyles, backgroundStyles } = styles2String(node);\n\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'cluster ' + node.cssClasses)\n .attr('id', node.id)\n .attr('data-look', node.look);\n\n const useHtmlLabels = evaluate(siteConfig.flowchart.htmlLabels);\n\n // Create the label and insert it after the rect\n const labelEl = shapeSvg.insert('g').attr('class', 'cluster-label ');\n\n const text = await createText(labelEl, node.label, {\n style: node.labelStyle,\n useHtmlLabels,\n isNode: true,\n });\n\n // Get the size of the label\n let bbox = text.getBBox();\n\n if (evaluate(siteConfig.flowchart.htmlLabels)) {\n const div = text.children[0];\n const dv = select(text);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n const width = node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width;\n if (node.width <= bbox.width + node.padding) {\n node.diff = (width - node.width) / 2 - node.padding;\n } else {\n node.diff = -node.padding;\n }\n\n const height = node.height;\n const x = node.x - width / 2;\n const y = node.y - height / 2;\n\n log.trace('Data ', node, JSON.stringify(node));\n let rect;\n if (node.look === 'handDrawn') {\n // @ts-ignore TODO: Fix rough typings\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {\n roughness: 0.7,\n fill: clusterBkg,\n // fill: 'red',\n stroke: clusterBorder,\n fillWeight: 3,\n seed: handDrawnSeed,\n });\n const roughNode = rc.path(createRoundedRectPathD(x, y, width, height, 0), options);\n rect = shapeSvg.insert(() => {\n log.debug('Rough node insert CXC', roughNode);\n return roughNode;\n }, ':first-child');\n // Should we affect the options instead of doing this?\n rect.select('path:nth-child(2)').attr('style', borderStyles.join(';'));\n rect.select('path').attr('style', backgroundStyles.join(';').replace('fill', 'stroke'));\n } else {\n // add the rect\n rect = shapeSvg.insert('rect', ':first-child');\n // center the rect around its coordinate\n rect\n .attr('style', nodeStyles)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height);\n }\n const { subGraphTitleTopMargin } = getSubGraphTitleMargins(siteConfig);\n labelEl.attr(\n 'transform',\n // This puts the label on top of the box instead of inside it\n `translate(${node.x - bbox.width / 2}, ${node.y - node.height / 2 + subGraphTitleTopMargin})`\n );\n\n if (labelStyles) {\n const span = labelEl.select('span');\n if (span) {\n span.attr('style', labelStyles);\n }\n }\n // Center the label\n\n const rectBox = rect.node().getBBox();\n node.offsetX = 0;\n node.width = rectBox.width;\n node.height = rectBox.height;\n // Used by layout engine to position subgraph in parent\n node.offsetY = bbox.height - node.padding / 2;\n\n node.intersect = function (point) {\n return intersectRect(node, point);\n };\n\n return { cluster: shapeSvg, labelBBox: bbox };\n};\n\n/**\n * Non visible cluster where the note is group with its\n *\n * @param {any} parent\n * @param {any} node\n * @returns {any} ShapeSvg\n */\nconst noteGroup = (parent, node) => {\n // Add outer g element\n const shapeSvg = parent.insert('g').attr('class', 'note-cluster').attr('id', node.id);\n\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n const padding = 0 * node.padding;\n const halfPadding = padding / 2;\n\n // center the rect around its coordinate\n rect\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', node.x - node.width / 2 - halfPadding)\n .attr('y', node.y - node.height / 2 - halfPadding)\n .attr('width', node.width + padding)\n .attr('height', node.height + padding)\n .attr('fill', 'none');\n\n const rectBox = rect.node().getBBox();\n node.width = rectBox.width;\n node.height = rectBox.height;\n\n node.intersect = function (point) {\n return intersectRect(node, point);\n };\n\n return { cluster: shapeSvg, labelBBox: { width: 0, height: 0 } };\n};\n\nconst roundedWithTitle = async (parent, node) => {\n const siteConfig = getConfig();\n\n const { themeVariables, handDrawnSeed } = siteConfig;\n const { altBackground, compositeBackground, compositeTitleBackground, nodeBorder } =\n themeVariables;\n\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', node.cssClasses)\n .attr('id', node.id)\n .attr('data-id', node.id)\n .attr('data-look', node.look);\n\n // add the rect\n const outerRectG = shapeSvg.insert('g', ':first-child');\n\n // Create the label and insert it after the rect\n const label = shapeSvg.insert('g').attr('class', 'cluster-label');\n let innerRect = shapeSvg.append('rect');\n\n const text = label\n .node()\n .appendChild(await createLabel(node.label, node.labelStyle, undefined, true));\n\n // Get the size of the label\n let bbox = text.getBBox();\n\n if (evaluate(siteConfig.flowchart.htmlLabels)) {\n const div = text.children[0];\n const dv = select(text);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n // Rounded With Title\n const padding = 0 * node.padding;\n const halfPadding = padding / 2;\n\n const width =\n (node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width) + padding;\n if (node.width <= bbox.width + node.padding) {\n node.diff = (width - node.width) / 2 - node.padding;\n } else {\n node.diff = -node.padding;\n }\n\n const height = node.height + padding;\n // const height = node.height + padding;\n const innerHeight = node.height + padding - bbox.height - 6;\n const x = node.x - width / 2;\n const y = node.y - height / 2;\n node.width = width;\n const innerY = node.y - node.height / 2 - halfPadding + bbox.height + 2;\n\n // add the rect\n let rect;\n if (node.look === 'handDrawn') {\n const isAlt = node.cssClasses.includes('statediagram-cluster-alt');\n const rc = rough.svg(shapeSvg);\n const roughOuterNode =\n node.rx || node.ry\n ? rc.path(createRoundedRectPathD(x, y, width, height, 10), {\n roughness: 0.7,\n fill: compositeTitleBackground,\n fillStyle: 'solid',\n stroke: nodeBorder,\n seed: handDrawnSeed,\n })\n : rc.rectangle(x, y, width, height, { seed: handDrawnSeed });\n\n rect = shapeSvg.insert(() => roughOuterNode, ':first-child');\n const roughInnerNode = rc.rectangle(x, innerY, width, innerHeight, {\n fill: isAlt ? altBackground : compositeBackground,\n fillStyle: isAlt ? 'hachure' : 'solid',\n stroke: nodeBorder,\n seed: handDrawnSeed,\n });\n\n rect = shapeSvg.insert(() => roughOuterNode, ':first-child');\n innerRect = shapeSvg.insert(() => roughInnerNode);\n } else {\n rect = outerRectG.insert('rect', ':first-child');\n const outerRectClass = 'outer';\n\n // center the rect around its coordinate\n rect\n .attr('class', outerRectClass)\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height)\n .attr('data-look', node.look);\n innerRect\n .attr('class', 'inner')\n .attr('x', x)\n .attr('y', innerY)\n .attr('width', width)\n .attr('height', innerHeight);\n }\n\n label.attr(\n 'transform',\n `translate(${node.x - bbox.width / 2}, ${y + 1 - (evaluate(siteConfig.flowchart.htmlLabels) ? 0 : 3)})`\n );\n\n const rectBox = rect.node().getBBox();\n node.height = rectBox.height;\n node.offsetX = 0;\n // Used by layout engine to position subgraph in parent\n node.offsetY = bbox.height - node.padding / 2;\n node.labelBBox = bbox;\n\n node.intersect = function (point) {\n return intersectRect(node, point);\n };\n\n return { cluster: shapeSvg, labelBBox: bbox };\n};\nconst kanbanSection = async (parent, node) => {\n log.info('Creating subgraph rect for ', node.id, node);\n const siteConfig = getConfig();\n const { themeVariables, handDrawnSeed } = siteConfig;\n const { clusterBkg, clusterBorder } = themeVariables;\n\n const { labelStyles, nodeStyles, borderStyles, backgroundStyles } = styles2String(node);\n\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'cluster ' + node.cssClasses)\n .attr('id', node.id)\n .attr('data-look', node.look);\n\n const useHtmlLabels = evaluate(siteConfig.flowchart.htmlLabels);\n\n // Create the label and insert it after the rect\n const labelEl = shapeSvg.insert('g').attr('class', 'cluster-label ');\n\n const text = await createText(labelEl, node.label, {\n style: node.labelStyle,\n useHtmlLabels,\n isNode: true,\n width: node.width,\n });\n\n // Get the size of the label\n let bbox = text.getBBox();\n\n if (evaluate(siteConfig.flowchart.htmlLabels)) {\n const div = text.children[0];\n const dv = select(text);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n const width = node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width;\n if (node.width <= bbox.width + node.padding) {\n node.diff = (width - node.width) / 2 - node.padding;\n } else {\n node.diff = -node.padding;\n }\n\n const height = node.height;\n const x = node.x - width / 2;\n const y = node.y - height / 2;\n\n log.trace('Data ', node, JSON.stringify(node));\n let rect;\n if (node.look === 'handDrawn') {\n // @ts-ignore TODO: Fix rough typings\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {\n roughness: 0.7,\n fill: clusterBkg,\n // fill: 'red',\n stroke: clusterBorder,\n fillWeight: 4,\n seed: handDrawnSeed,\n });\n const roughNode = rc.path(createRoundedRectPathD(x, y, width, height, node.rx), options);\n rect = shapeSvg.insert(() => {\n log.debug('Rough node insert CXC', roughNode);\n return roughNode;\n }, ':first-child');\n // Should we affect the options instead of doing this?\n rect.select('path:nth-child(2)').attr('style', borderStyles.join(';'));\n rect.select('path').attr('style', backgroundStyles.join(';').replace('fill', 'stroke'));\n } else {\n // add the rect\n rect = shapeSvg.insert('rect', ':first-child');\n // center the rect around its coordinate\n rect\n .attr('style', nodeStyles)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height);\n }\n const { subGraphTitleTopMargin } = getSubGraphTitleMargins(siteConfig);\n labelEl.attr(\n 'transform',\n // This puts the label on top of the box instead of inside it\n `translate(${node.x - bbox.width / 2}, ${node.y - node.height / 2 + subGraphTitleTopMargin})`\n );\n\n if (labelStyles) {\n const span = labelEl.select('span');\n if (span) {\n span.attr('style', labelStyles);\n }\n }\n // Center the label\n\n const rectBox = rect.node().getBBox();\n node.offsetX = 0;\n node.width = rectBox.width;\n node.height = rectBox.height;\n // Used by layout engine to position subgraph in parent\n node.offsetY = bbox.height - node.padding / 2;\n\n node.intersect = function (point) {\n return intersectRect(node, point);\n };\n\n return { cluster: shapeSvg, labelBBox: bbox };\n};\nconst divider = (parent, node) => {\n const siteConfig = getConfig();\n\n const { themeVariables, handDrawnSeed } = siteConfig;\n const { nodeBorder } = themeVariables;\n\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', node.cssClasses)\n .attr('id', node.id)\n .attr('data-look', node.look);\n\n // add the rect\n const outerRectG = shapeSvg.insert('g', ':first-child');\n\n const padding = 0 * node.padding;\n\n const width = node.width + padding;\n\n node.diff = -node.padding;\n\n const height = node.height + padding;\n // const height = node.height + padding;\n const x = node.x - width / 2;\n const y = node.y - height / 2;\n node.width = width;\n\n // add the rect\n let rect;\n if (node.look === 'handDrawn') {\n const rc = rough.svg(shapeSvg);\n const roughOuterNode = rc.rectangle(x, y, width, height, {\n fill: 'lightgrey',\n roughness: 0.5,\n strokeLineDash: [5],\n stroke: nodeBorder,\n seed: handDrawnSeed,\n });\n\n rect = shapeSvg.insert(() => roughOuterNode, ':first-child');\n } else {\n rect = outerRectG.insert('rect', ':first-child');\n const outerRectClass = 'divider';\n\n // center the rect around its coordinate\n rect\n .attr('class', outerRectClass)\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height)\n .attr('data-look', node.look);\n }\n\n const rectBox = rect.node().getBBox();\n node.height = rectBox.height;\n node.offsetX = 0;\n // Used by layout engine to position subgraph in parent\n node.offsetY = 0;\n\n node.intersect = function (point) {\n return intersectRect(node, point);\n };\n\n return { cluster: shapeSvg, labelBBox: {} };\n};\n\nconst squareRect = rect;\nconst shapes = {\n rect,\n squareRect,\n roundedWithTitle,\n noteGroup,\n divider,\n kanbanSection,\n};\n\nlet clusterElems = new Map();\n\n/**\n * @typedef {keyof typeof shapes} ClusterShapeID\n */\n\n/**\n * @param {import('../types.js').ClusterNode} node - Shape defaults to 'rect'\n */\nexport const insertCluster = async (elem, node) => {\n const shape = node.shape || 'rect';\n const cluster = await shapes[shape](elem, node);\n clusterElems.set(node.id, cluster);\n return cluster;\n};\n\nexport const getClusterTitleWidth = (elem, node) => {\n const label = createLabel(node.label, node.labelStyle, undefined, true);\n elem.node().appendChild(label);\n const width = label.getBBox().width;\n elem.node().removeChild(label);\n return width;\n};\n\nexport const clear = () => {\n clusterElems = new Map();\n};\n\nexport const positionCluster = (node) => {\n log.info(\n 'Position cluster (' +\n node.id +\n ', ' +\n node.x +\n ', ' +\n node.y +\n ') (' +\n node?.width +\n ', ' +\n node?.height +\n ')',\n clusterElems.get(node.id)\n );\n const el = clusterElems.get(node.id);\n el.cluster.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');\n};\n", "const intersectRect = (node, point) => {\n var x = node.x;\n var y = node.y;\n\n // Rectangle intersection algorithm from:\n // https://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\n var dx = point.x - x;\n var dy = point.y - y;\n var w = node.width / 2;\n var h = node.height / 2;\n\n var sx, sy;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n // Intersection is top or bottom of rect.\n if (dy < 0) {\n h = -h;\n }\n sx = dy === 0 ? 0 : (h * dx) / dy;\n sy = h;\n } else {\n // Intersection is left or right of rect.\n if (dx < 0) {\n w = -w;\n }\n sx = w;\n sy = dx === 0 ? 0 : (w * dy) / dx;\n }\n\n return { x: x + sx, y: y + sy };\n};\n\nexport default intersectRect;\n", "import { select } from 'd3';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport common, {\n evaluate,\n hasKatex,\n renderKatexSanitized,\n sanitizeText,\n} from '../../diagrams/common/common.js';\nimport { log } from '../../logger.js';\nimport { decodeEntities } from '../../utils.js';\n\n/**\n * @param dom\n * @param styleFn\n */\nfunction applyStyle(dom, styleFn) {\n if (styleFn) {\n dom.attr('style', styleFn);\n }\n}\n\n/**\n * @param {any} node\n * @returns {Promise} Node\n */\nasync function addHtmlLabel(node) {\n const fo = select(document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject'));\n const div = fo.append('xhtml:div');\n\n const config = getConfig();\n let label = node.label;\n if (node.label && hasKatex(node.label)) {\n label = await renderKatexSanitized(node.label.replace(common.lineBreakRegex, '\\n'), config);\n }\n const labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel';\n const labelSpan =\n '' +\n label +\n '';\n div.html(sanitizeText(labelSpan, config));\n\n applyStyle(div, node.labelStyle);\n div.style('display', 'inline-block');\n div.style('padding-right', '1px');\n // Fix for firefox\n div.style('white-space', 'nowrap');\n div.attr('xmlns', 'http://www.w3.org/1999/xhtml');\n return fo.node();\n}\n/**\n * @param _vertexText\n * @param style\n * @param isTitle\n * @param isNode\n * @deprecated svg-util/createText instead\n */\nconst createLabel = async (_vertexText, style, isTitle, isNode) => {\n let vertexText = _vertexText || '';\n if (typeof vertexText === 'object') {\n vertexText = vertexText[0];\n }\n\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?\n vertexText = vertexText.replace(/\\\\n|\\n/g, '
');\n log.info('vertexText' + vertexText);\n const node = {\n isNode,\n label: decodeEntities(vertexText).replace(\n /fa[blrs]?:fa-[\\w-]+/g,\n (s) => ``\n ),\n labelStyle: style ? style.replace('fill:', 'color:') : style,\n };\n let vertexNode = await addHtmlLabel(node);\n // vertexNode.parentNode.removeChild(vertexNode);\n return vertexNode;\n } else {\n const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n svgLabel.setAttribute('style', style.replace('color:', 'fill:'));\n let rows = [];\n if (typeof vertexText === 'string') {\n rows = vertexText.split(/\\\\n|\\n|/gi);\n } else if (Array.isArray(vertexText)) {\n rows = vertexText;\n } else {\n rows = [];\n }\n\n for (const row of rows) {\n const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n tspan.setAttribute('dy', '1em');\n tspan.setAttribute('x', '0');\n if (isTitle) {\n tspan.setAttribute('class', 'title-row');\n } else {\n tspan.setAttribute('class', 'row');\n }\n tspan.textContent = row.trim();\n svgLabel.appendChild(tspan);\n }\n return svgLabel;\n }\n};\n\nexport default createLabel;\n", "export const createRoundedRectPathD = (\n x: number,\n y: number,\n totalWidth: number,\n totalHeight: number,\n radius: number\n) =>\n [\n 'M',\n x + radius,\n y, // Move to the first point\n 'H',\n x + totalWidth - radius, // Draw horizontal line to the beginning of the right corner\n 'A',\n radius,\n radius,\n 0,\n 0,\n 1,\n x + totalWidth,\n y + radius, // Draw arc to the right top corner\n 'V',\n y + totalHeight - radius, // Draw vertical line down to the beginning of the right bottom corner\n 'A',\n radius,\n radius,\n 0,\n 0,\n 1,\n x + totalWidth - radius,\n y + totalHeight, // Draw arc to the right bottom corner\n 'H',\n x + radius, // Draw horizontal line to the beginning of the left bottom corner\n 'A',\n radius,\n radius,\n 0,\n 0,\n 1,\n x,\n y + totalHeight - radius, // Draw arc to the left bottom corner\n 'V',\n y + radius, // Draw vertical line up to the beginning of the left top corner\n 'A',\n radius,\n radius,\n 0,\n 0,\n 1,\n x + radius,\n y, // Draw arc to the left top corner\n 'Z', // Close the path\n ].join(' ');\n", "function intersectNode(node, point) {\n return node.intersect(point);\n}\n\nexport default intersectNode;\n", "function intersectEllipse(node, rx, ry, point) {\n // Formulae from: https://mathworld.wolfram.com/Ellipse-LineIntersection.html\n\n var cx = node.x;\n var cy = node.y;\n\n var px = cx - point.x;\n var py = cy - point.y;\n\n var det = Math.sqrt(rx * rx * py * py + ry * ry * px * px);\n\n var dx = Math.abs((rx * ry * px) / det);\n if (point.x < cx) {\n dx = -dx;\n }\n var dy = Math.abs((rx * ry * py) / det);\n if (point.y < cy) {\n dy = -dy;\n }\n\n return { x: cx + dx, y: cy + dy };\n}\n\nexport default intersectEllipse;\n", "import intersectEllipse from './intersect-ellipse.js';\n\nfunction intersectCircle(node, rx, point) {\n return intersectEllipse(node, rx, rx, point);\n}\n\nexport default intersectCircle;\n", "/**\n * Returns the point at which two lines, p and q, intersect or returns undefined if they do not intersect.\n */\nfunction intersectLine(p1, p2, q1, q2) {\n {\n // Algorithm from J. Avro, (ed.) Graphics Gems, No 2, Morgan Kaufmann, 1994,\n // p7 and p473.\n\n // Compute a1, b1, c1, where line joining points 1 and 2 is F(x,y) = a1 x +\n // b1 y + c1 = 0.\n const a1 = p2.y - p1.y;\n const b1 = p1.x - p2.x;\n const c1 = p2.x * p1.y - p1.x * p2.y;\n\n // Compute r3 and r4.\n const r3 = a1 * q1.x + b1 * q1.y + c1;\n const r4 = a1 * q2.x + b1 * q2.y + c1;\n\n const epsilon = 1e-6;\n\n // Check signs of r3 and r4. If both point 3 and point 4 lie on\n // same side of line 1, the line segments do not intersect.\n if (r3 !== 0 && r4 !== 0 && sameSign(r3, r4)) {\n return /*DON'T_INTERSECT*/;\n }\n\n // Compute a2, b2, c2 where line joining points 3 and 4 is G(x,y) = a2 x + b2 y + c2 = 0\n const a2 = q2.y - q1.y;\n const b2 = q1.x - q2.x;\n const c2 = q2.x * q1.y - q1.x * q2.y;\n\n // Compute r1 and r2\n const r1 = a2 * p1.x + b2 * p1.y + c2;\n const r2 = a2 * p2.x + b2 * p2.y + c2;\n\n // Check signs of r1 and r2. If both point 1 and point 2 lie\n // on same side of second line segment, the line segments do\n // not intersect.\n if (Math.abs(r1) < epsilon && Math.abs(r2) < epsilon && sameSign(r1, r2)) {\n return /*DON'T_INTERSECT*/;\n }\n\n // Line segments intersect: compute intersection point.\n const denom = a1 * b2 - a2 * b1;\n if (denom === 0) {\n return /*COLLINEAR*/;\n }\n\n const offset = Math.abs(denom / 2);\n\n // The denom/2 is to get rounding instead of truncating. It\n // is added or subtracted to the numerator, depending upon the\n // sign of the numerator.\n let num = b1 * c2 - b2 * c1;\n const x = num < 0 ? (num - offset) / denom : (num + offset) / denom;\n\n num = a2 * c1 - a1 * c2;\n const y = num < 0 ? (num - offset) / denom : (num + offset) / denom;\n\n return { x: x, y: y };\n }\n}\n\nfunction sameSign(r1, r2) {\n return r1 * r2 > 0;\n}\n\nexport default intersectLine;\n", "import intersectLine from './intersect-line.js';\n\n/**\n * Returns the point ({x, y}) at which the point argument intersects with the node argument assuming\n * that it has the shape specified by polygon.\n */\nfunction intersectPolygon(node, polyPoints, point) {\n let x1 = node.x;\n let y1 = node.y;\n\n let intersections = [];\n\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n if (typeof polyPoints.forEach === 'function') {\n polyPoints.forEach(function (entry) {\n minX = Math.min(minX, entry.x);\n minY = Math.min(minY, entry.y);\n });\n } else {\n minX = Math.min(minX, polyPoints.x);\n minY = Math.min(minY, polyPoints.y);\n }\n\n let left = x1 - node.width / 2 - minX;\n let top = y1 - node.height / 2 - minY;\n\n for (let i = 0; i < polyPoints.length; i++) {\n let p1 = polyPoints[i];\n let p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0];\n let intersect = intersectLine(\n node,\n point,\n { x: left + p1.x, y: top + p1.y },\n { x: left + p2.x, y: top + p2.y }\n );\n if (intersect) {\n intersections.push(intersect);\n }\n }\n\n if (!intersections.length) {\n return node;\n }\n\n if (intersections.length > 1) {\n // More intersections, find the one nearest to edge end point\n intersections.sort(function (p, q) {\n let pdx = p.x - point.x;\n let pdy = p.y - point.y;\n let distp = Math.sqrt(pdx * pdx + pdy * pdy);\n\n let qdx = q.x - point.x;\n let qdy = q.y - point.y;\n let distq = Math.sqrt(qdx * qdx + qdy * qdy);\n\n return distp < distq ? -1 : distp === distq ? 0 : 1;\n });\n }\n return intersections[0];\n}\n\nexport default intersectPolygon;\n", "/*\n * Borrowed with love from dagre-d3. Many thanks to cpettitt!\n */\n\nimport node from './intersect-node.js';\nimport circle from './intersect-circle.js';\nimport ellipse from './intersect-ellipse.js';\nimport polygon from './intersect-polygon.js';\nimport rect from './intersect-rect.js';\n\nexport default {\n node,\n circle,\n ellipse,\n polygon,\n rect,\n};\n", "import { log } from '../../../logger.js';\nimport { updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport { handleUndefinedAttr } from '../../../utils.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport function anchor(parent: D3Selection, node: Node) {\n const { labelStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const classes = getNodeClasses(node);\n let cssClasses = classes;\n if (!classes) {\n cssClasses = 'anchor';\n }\n const shapeSvg = parent\n .insert('g')\n .attr('class', cssClasses)\n .attr('id', node.domId || node.id);\n\n const radius = 1;\n\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, { fill: 'black', stroke: 'none', fillStyle: 'solid' });\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n }\n const roughNode = rc.circle(0, 0, radius * 2, options);\n const circleElem = shapeSvg.insert(() => roughNode, ':first-child');\n circleElem.attr('class', 'anchor').attr('style', handleUndefinedAttr(cssStyles));\n\n updateNodeBounds(node, circleElem);\n\n node.intersect = function (point) {\n log.info('Circle intersect', node, radius, point);\n return intersect.circle(node, radius, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nfunction generateArcPoints(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n rx: number,\n ry: number,\n clockwise: boolean\n) {\n const numPoints = 20;\n // Calculate midpoint\n const midX = (x1 + x2) / 2;\n const midY = (y1 + y2) / 2;\n\n // Calculate the angle of the line connecting the points\n const angle = Math.atan2(y2 - y1, x2 - x1);\n\n // Calculate transformed coordinates for the ellipse\n const dx = (x2 - x1) / 2;\n const dy = (y2 - y1) / 2;\n\n // Scale to unit circle\n const transformedX = dx / rx;\n const transformedY = dy / ry;\n\n // Calculate the distance between points on the unit circle\n const distance = Math.sqrt(transformedX ** 2 + transformedY ** 2);\n\n // Check if the ellipse can be drawn with the given radii\n if (distance > 1) {\n throw new Error('The given radii are too small to create an arc between the points.');\n }\n\n // Calculate the distance from the midpoint to the center of the ellipse\n const scaledCenterDistance = Math.sqrt(1 - distance ** 2);\n\n // Calculate the center of the ellipse\n const centerX = midX + scaledCenterDistance * ry * Math.sin(angle) * (clockwise ? -1 : 1);\n const centerY = midY - scaledCenterDistance * rx * Math.cos(angle) * (clockwise ? -1 : 1);\n\n // Calculate the start and end angles on the ellipse\n const startAngle = Math.atan2((y1 - centerY) / ry, (x1 - centerX) / rx);\n const endAngle = Math.atan2((y2 - centerY) / ry, (x2 - centerX) / rx);\n\n // Adjust angles for clockwise/counterclockwise\n let angleRange = endAngle - startAngle;\n if (clockwise && angleRange < 0) {\n angleRange += 2 * Math.PI;\n }\n if (!clockwise && angleRange > 0) {\n angleRange -= 2 * Math.PI;\n }\n\n // Generate points\n const points = [];\n for (let i = 0; i < numPoints; i++) {\n const t = i / (numPoints - 1);\n const angle = startAngle + t * angleRange;\n const x = centerX + rx * Math.cos(angle);\n const y = centerY + ry * Math.sin(angle);\n points.push({ x, y });\n }\n\n return points;\n}\n\nexport async function bowTieRect(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n const w = bbox.width + node.padding + 20;\n const h = bbox.height + node.padding;\n\n const ry = h / 2;\n const rx = ry / (2.5 + h / 50);\n\n // let shape: d3.Selection;\n const { cssStyles } = node;\n\n const points = [\n { x: w / 2, y: -h / 2 },\n { x: -w / 2, y: -h / 2 },\n ...generateArcPoints(-w / 2, -h / 2, -w / 2, h / 2, rx, ry, false),\n { x: w / 2, y: h / 2 },\n ...generateArcPoints(w / 2, h / 2, w / 2, -h / 2, rx, ry, true),\n ];\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n const bowTieRectPath = createPathFromPoints(points);\n const bowTieRectShapePath = rc.path(bowTieRectPath, options);\n const bowTieRectShape = shapeSvg.insert(() => bowTieRectShapePath, ':first-child');\n\n bowTieRectShape.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n bowTieRectShape.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n bowTieRectShape.selectAll('path').attr('style', nodeStyles);\n }\n\n bowTieRectShape.attr('transform', `translate(${rx / 2}, 0)`);\n\n updateNodeBounds(node, bowTieRectShape);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\n\nimport { insertPolygonShape } from './insertPolygonShape.js';\nimport { createPathFromPoints } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\n// const createPathFromPoints = (points: { x: number; y: number }[]): string => {\n// const pointStrings = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x},${p.y}`);\n// pointStrings.push('Z');\n// return pointStrings.join(' ');\n// };\n\nexport async function card(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n\n const h = bbox.height + node.padding;\n const padding = 12;\n const w = bbox.width + node.padding + padding;\n const left = 0;\n const right = w;\n const top = -h;\n const bottom = 0;\n const points = [\n { x: left + padding, y: top },\n { x: right, y: top },\n { x: right, y: bottom },\n { x: left, y: bottom },\n { x: left, y: top + padding },\n { x: left + padding, y: top },\n ];\n\n let polygon: D3Selection | Awaited>;\n const { cssStyles } = node;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n const pathData = createPathFromPoints(points);\n const roughNode = rc.path(pathData, options);\n\n polygon = shapeSvg\n .insert(() => roughNode, ':first-child')\n .attr('transform', `translate(${-w / 2}, ${h / 2})`);\n\n if (cssStyles) {\n polygon.attr('style', cssStyles);\n }\n } else {\n polygon = insertPolygonShape(shapeSvg, w, h, points);\n }\n\n if (nodeStyles) {\n polygon.attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n}\n", "import type { D3Selection } from '../../../types.js';\n\nexport function insertPolygonShape(\n parent: D3Selection,\n w: number,\n h: number,\n points: { x: number; y: number }[]\n) {\n return parent\n .insert('polygon', ':first-child')\n .attr(\n 'points',\n points\n .map(function (d) {\n return d.x + ',' + d.y;\n })\n .join(' ')\n )\n .attr('class', 'label-container')\n .attr('transform', 'translate(' + -w / 2 + ',' + h / 2 + ')');\n}\n", "import intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport rough from 'roughjs';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { createPathFromPoints, getNodeClasses } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport function choice(parent: D3Selection, node: Node) {\n const { nodeStyles } = styles2String(node);\n node.label = '';\n const shapeSvg = parent\n .insert('g')\n .attr('class', getNodeClasses(node))\n .attr('id', node.domId ?? node.id);\n const { cssStyles } = node;\n\n const s = Math.max(28, node.width ?? 0);\n\n const points = [\n { x: 0, y: s / 2 },\n { x: s / 2, y: 0 },\n { x: 0, y: -s / 2 },\n { x: -s / 2, y: 0 },\n ];\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const choicePath = createPathFromPoints(points);\n const roughNode = rc.path(choicePath, options);\n const choiceShape = shapeSvg.insert(() => roughNode, ':first-child');\n\n if (cssStyles && node.look !== 'handDrawn') {\n choiceShape.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n choiceShape.selectAll('path').attr('style', nodeStyles);\n }\n\n node.width = 28;\n node.height = 28;\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n}\n", "import rough from 'roughjs';\nimport { log } from '../../../logger.js';\nimport type { Bounds, D3Selection, Point } from '../../../types.js';\nimport { handleUndefinedAttr } from '../../../utils.js';\nimport type { MindmapOptions, Node, ShapeRenderOptions } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { getNodeClasses, labelHelper, updateNodeBounds } from './util.js';\n\nexport async function circle(\n parent: D3Selection,\n node: Node,\n options?: MindmapOptions | ShapeRenderOptions\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, halfPadding } = await labelHelper(parent, node, getNodeClasses(node));\n const padding = options?.padding ?? halfPadding;\n const radius = bbox.width / 2 + padding;\n let circleElem;\n const { cssStyles } = node;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n const roughNode = rc.circle(0, 0, radius * 2, options);\n\n circleElem = shapeSvg.insert(() => roughNode, ':first-child');\n circleElem.attr('class', 'basic label-container').attr('style', handleUndefinedAttr(cssStyles));\n } else {\n circleElem = shapeSvg\n .insert('circle', ':first-child')\n .attr('class', 'basic label-container')\n .attr('style', nodeStyles)\n .attr('r', radius)\n .attr('cx', 0)\n .attr('cy', 0);\n }\n\n updateNodeBounds(node, circleElem);\n node.calcIntersect = function (bounds: Bounds, point: Point) {\n const radius = bounds.width / 2;\n return intersect.circle(bounds, radius, point);\n };\n node.intersect = function (point) {\n log.info('Circle intersect', node, radius, point);\n return intersect.circle(node, radius, point);\n };\n\n return shapeSvg;\n}\n", "import { log } from '../../../logger.js';\nimport { getNodeClasses, updateNodeBounds } from './util.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport intersect from '../intersect/index.js';\nimport type { D3Selection } from '../../../types.js';\n\nfunction createLine(r: number) {\n const xAxis45 = Math.cos(Math.PI / 4); // cosine of 45 degrees\n const yAxis45 = Math.sin(Math.PI / 4); // sine of 45 degrees\n const lineLength = r * 2;\n\n const pointQ1 = { x: (lineLength / 2) * xAxis45, y: (lineLength / 2) * yAxis45 }; // Quadrant I\n const pointQ2 = { x: -(lineLength / 2) * xAxis45, y: (lineLength / 2) * yAxis45 }; // Quadrant II\n const pointQ3 = { x: -(lineLength / 2) * xAxis45, y: -(lineLength / 2) * yAxis45 }; // Quadrant III\n const pointQ4 = { x: (lineLength / 2) * xAxis45, y: -(lineLength / 2) * yAxis45 }; // Quadrant IV\n\n return `M ${pointQ2.x},${pointQ2.y} L ${pointQ4.x},${pointQ4.y}\n M ${pointQ1.x},${pointQ1.y} L ${pointQ3.x},${pointQ3.y}`;\n}\n\nexport function crossedCircle(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n node.label = '';\n const shapeSvg = parent\n .insert('g')\n .attr('class', getNodeClasses(node))\n .attr('id', node.domId ?? node.id);\n const radius = Math.max(30, node?.width ?? 0);\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const circleNode = rc.circle(0, 0, radius * 2, options);\n const linePath = createLine(radius);\n const lineNode = rc.path(linePath, options);\n\n const crossedCircle = shapeSvg.insert(() => circleNode, ':first-child');\n crossedCircle.insert(() => lineNode);\n\n if (cssStyles && node.look !== 'handDrawn') {\n crossedCircle.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n crossedCircle.selectAll('path').attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, crossedCircle);\n\n node.intersect = function (point) {\n log.info('crossedCircle intersect', node, { radius, point });\n const pos = intersect.circle(node, radius, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nfunction generateCirclePoints(\n centerX: number,\n centerY: number,\n radius: number,\n numPoints = 100,\n startAngle = 0,\n endAngle = 180\n) {\n const points = [];\n\n // Convert angles to radians\n const startAngleRad = (startAngle * Math.PI) / 180;\n const endAngleRad = (endAngle * Math.PI) / 180;\n\n // Calculate the angle range in radians\n const angleRange = endAngleRad - startAngleRad;\n\n // Calculate the angle step\n const angleStep = angleRange / (numPoints - 1);\n\n for (let i = 0; i < numPoints; i++) {\n const angle = startAngleRad + i * angleStep;\n const x = centerX + radius * Math.cos(angle);\n const y = centerY + radius * Math.sin(angle);\n points.push({ x: -x, y: -y });\n }\n\n return points;\n}\n\nexport async function curlyBraceLeft(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = bbox.width + (node.padding ?? 0);\n const h = bbox.height + (node.padding ?? 0);\n const radius = Math.max(5, h * 0.1);\n\n const { cssStyles } = node;\n\n const points = [\n ...generateCirclePoints(w / 2, -h / 2, radius, 30, -90, 0),\n { x: -w / 2 - radius, y: radius },\n ...generateCirclePoints(w / 2 + radius * 2, -radius, radius, 20, -180, -270),\n ...generateCirclePoints(w / 2 + radius * 2, radius, radius, 20, -90, -180),\n { x: -w / 2 - radius, y: -h / 2 },\n ...generateCirclePoints(w / 2, h / 2, radius, 20, 0, 90),\n ];\n\n const rectPoints = [\n { x: w / 2, y: -h / 2 - radius },\n { x: -w / 2, y: -h / 2 - radius },\n ...generateCirclePoints(w / 2, -h / 2, radius, 20, -90, 0),\n { x: -w / 2 - radius, y: -radius },\n ...generateCirclePoints(w / 2 + w * 0.1, -radius, radius, 20, -180, -270),\n ...generateCirclePoints(w / 2 + w * 0.1, radius, radius, 20, -90, -180),\n { x: -w / 2 - radius, y: h / 2 },\n ...generateCirclePoints(w / 2, h / 2, radius, 20, 0, 90),\n { x: -w / 2, y: h / 2 + radius },\n { x: w / 2, y: h / 2 + radius },\n ];\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, { fill: 'none' });\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n const curlyBraceLeftPath = createPathFromPoints(points);\n const newCurlyBracePath = curlyBraceLeftPath.replace('Z', '');\n const curlyBraceLeftNode = rc.path(newCurlyBracePath, options);\n const rectPath = createPathFromPoints(rectPoints);\n const rectShape = rc.path(rectPath, { ...options });\n const curlyBraceLeftShape = shapeSvg.insert('g', ':first-child');\n curlyBraceLeftShape.insert(() => rectShape, ':first-child').attr('stroke-opacity', 0);\n curlyBraceLeftShape.insert(() => curlyBraceLeftNode, ':first-child');\n curlyBraceLeftShape.attr('class', 'text');\n\n if (cssStyles && node.look !== 'handDrawn') {\n curlyBraceLeftShape.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n curlyBraceLeftShape.selectAll('path').attr('style', nodeStyles);\n }\n\n curlyBraceLeftShape.attr('transform', `translate(${radius}, 0)`);\n\n label.attr(\n 'transform',\n `translate(${-w / 2 + radius - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) / 2 - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, curlyBraceLeftShape);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, rectPoints, point);\n\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nfunction generateCirclePoints(\n centerX: number,\n centerY: number,\n radius: number,\n numPoints = 100,\n startAngle = 0,\n endAngle = 180\n) {\n const points = [];\n\n // Convert angles to radians\n const startAngleRad = (startAngle * Math.PI) / 180;\n const endAngleRad = (endAngle * Math.PI) / 180;\n\n // Calculate the angle range in radians\n const angleRange = endAngleRad - startAngleRad;\n\n // Calculate the angle step\n const angleStep = angleRange / (numPoints - 1);\n\n for (let i = 0; i < numPoints; i++) {\n const angle = startAngleRad + i * angleStep;\n const x = centerX + radius * Math.cos(angle);\n const y = centerY + radius * Math.sin(angle);\n points.push({ x, y });\n }\n\n return points;\n}\n\nexport async function curlyBraceRight(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = bbox.width + (node.padding ?? 0);\n const h = bbox.height + (node.padding ?? 0);\n const radius = Math.max(5, h * 0.1);\n\n const { cssStyles } = node;\n\n const points = [\n ...generateCirclePoints(w / 2, -h / 2, radius, 20, -90, 0),\n { x: w / 2 + radius, y: -radius },\n ...generateCirclePoints(w / 2 + radius * 2, -radius, radius, 20, -180, -270),\n ...generateCirclePoints(w / 2 + radius * 2, radius, radius, 20, -90, -180),\n { x: w / 2 + radius, y: h / 2 },\n ...generateCirclePoints(w / 2, h / 2, radius, 20, 0, 90),\n ];\n\n const rectPoints = [\n { x: -w / 2, y: -h / 2 - radius },\n { x: w / 2, y: -h / 2 - radius },\n ...generateCirclePoints(w / 2, -h / 2, radius, 20, -90, 0),\n { x: w / 2 + radius, y: -radius },\n ...generateCirclePoints(w / 2 + radius * 2, -radius, radius, 20, -180, -270),\n ...generateCirclePoints(w / 2 + radius * 2, radius, radius, 20, -90, -180),\n { x: w / 2 + radius, y: h / 2 },\n ...generateCirclePoints(w / 2, h / 2, radius, 20, 0, 90),\n { x: w / 2, y: h / 2 + radius },\n { x: -w / 2, y: h / 2 + radius },\n ];\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, { fill: 'none' });\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n const curlyBraceRightPath = createPathFromPoints(points);\n const newCurlyBracePath = curlyBraceRightPath.replace('Z', '');\n const curlyBraceRightNode = rc.path(newCurlyBracePath, options);\n const rectPath = createPathFromPoints(rectPoints);\n const rectShape = rc.path(rectPath, { ...options });\n const curlyBraceRightShape = shapeSvg.insert('g', ':first-child');\n curlyBraceRightShape.insert(() => rectShape, ':first-child').attr('stroke-opacity', 0);\n curlyBraceRightShape.insert(() => curlyBraceRightNode, ':first-child');\n curlyBraceRightShape.attr('class', 'text');\n\n if (cssStyles && node.look !== 'handDrawn') {\n curlyBraceRightShape.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n curlyBraceRightShape.selectAll('path').attr('style', nodeStyles);\n }\n\n curlyBraceRightShape.attr('transform', `translate(${-radius}, 0)`);\n\n label.attr(\n 'transform',\n `translate(${-w / 2 + (node.padding ?? 0) / 2 - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) / 2 - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, curlyBraceRightShape);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, rectPoints, point);\n\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nfunction generateCirclePoints(\n centerX: number,\n centerY: number,\n radius: number,\n numPoints = 100,\n startAngle = 0,\n endAngle = 180\n) {\n const points = [];\n\n // Convert angles to radians\n const startAngleRad = (startAngle * Math.PI) / 180;\n const endAngleRad = (endAngle * Math.PI) / 180;\n\n // Calculate the angle range in radians\n const angleRange = endAngleRad - startAngleRad;\n\n // Calculate the angle step\n const angleStep = angleRange / (numPoints - 1);\n\n for (let i = 0; i < numPoints; i++) {\n const angle = startAngleRad + i * angleStep;\n const x = centerX + radius * Math.cos(angle);\n const y = centerY + radius * Math.sin(angle);\n points.push({ x: -x, y: -y });\n }\n\n return points;\n}\n\nexport async function curlyBraces(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = bbox.width + (node.padding ?? 0);\n const h = bbox.height + (node.padding ?? 0);\n const radius = Math.max(5, h * 0.1);\n\n const { cssStyles } = node;\n\n const leftCurlyBracePoints = [\n ...generateCirclePoints(w / 2, -h / 2, radius, 30, -90, 0),\n { x: -w / 2 - radius, y: radius },\n ...generateCirclePoints(w / 2 + radius * 2, -radius, radius, 20, -180, -270),\n ...generateCirclePoints(w / 2 + radius * 2, radius, radius, 20, -90, -180),\n { x: -w / 2 - radius, y: -h / 2 },\n ...generateCirclePoints(w / 2, h / 2, radius, 20, 0, 90),\n ];\n\n const rightCurlyBracePoints = [\n ...generateCirclePoints(-w / 2 + radius + radius / 2, -h / 2, radius, 20, -90, -180),\n { x: w / 2 - radius / 2, y: radius },\n ...generateCirclePoints(-w / 2 - radius / 2, -radius, radius, 20, 0, 90),\n ...generateCirclePoints(-w / 2 - radius / 2, radius, radius, 20, -90, 0),\n { x: w / 2 - radius / 2, y: -radius },\n ...generateCirclePoints(-w / 2 + radius + radius / 2, h / 2, radius, 30, -180, -270),\n ];\n\n const rectPoints = [\n { x: w / 2, y: -h / 2 - radius },\n { x: -w / 2, y: -h / 2 - radius },\n ...generateCirclePoints(w / 2, -h / 2, radius, 20, -90, 0),\n { x: -w / 2 - radius, y: -radius },\n ...generateCirclePoints(w / 2 + radius * 2, -radius, radius, 20, -180, -270),\n ...generateCirclePoints(w / 2 + radius * 2, radius, radius, 20, -90, -180),\n { x: -w / 2 - radius, y: h / 2 },\n ...generateCirclePoints(w / 2, h / 2, radius, 20, 0, 90),\n { x: -w / 2, y: h / 2 + radius },\n { x: w / 2 - radius - radius / 2, y: h / 2 + radius },\n ...generateCirclePoints(-w / 2 + radius + radius / 2, -h / 2, radius, 20, -90, -180),\n { x: w / 2 - radius / 2, y: radius },\n ...generateCirclePoints(-w / 2 - radius / 2, -radius, radius, 20, 0, 90),\n ...generateCirclePoints(-w / 2 - radius / 2, radius, radius, 20, -90, 0),\n { x: w / 2 - radius / 2, y: -radius },\n ...generateCirclePoints(-w / 2 + radius + radius / 2, h / 2, radius, 30, -180, -270),\n ];\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, { fill: 'none' });\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n const leftCurlyBracePath = createPathFromPoints(leftCurlyBracePoints);\n const newLeftCurlyBracePath = leftCurlyBracePath.replace('Z', '');\n const leftCurlyBraceNode = rc.path(newLeftCurlyBracePath, options);\n const rightCurlyBracePath = createPathFromPoints(rightCurlyBracePoints);\n const newRightCurlyBracePath = rightCurlyBracePath.replace('Z', '');\n const rightCurlyBraceNode = rc.path(newRightCurlyBracePath, options);\n const rectPath = createPathFromPoints(rectPoints);\n const rectShape = rc.path(rectPath, { ...options });\n const curlyBracesShape = shapeSvg.insert('g', ':first-child');\n curlyBracesShape.insert(() => rectShape, ':first-child').attr('stroke-opacity', 0);\n curlyBracesShape.insert(() => leftCurlyBraceNode, ':first-child');\n curlyBracesShape.insert(() => rightCurlyBraceNode, ':first-child');\n curlyBracesShape.attr('class', 'text');\n\n if (cssStyles && node.look !== 'handDrawn') {\n curlyBracesShape.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n curlyBracesShape.selectAll('path').attr('style', nodeStyles);\n }\n\n curlyBracesShape.attr('transform', `translate(${radius - radius / 4}, 0)`);\n\n label.attr(\n 'transform',\n `translate(${-w / 2 + (node.padding ?? 0) / 2 - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) / 2 - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, curlyBracesShape);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, rectPoints, point);\n\n return pos;\n };\n\n return shapeSvg;\n}\n", "import {\n labelHelper,\n updateNodeBounds,\n getNodeClasses,\n createPathFromPoints,\n generateCirclePoints,\n} from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function curvedTrapezoid(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n const minWidth = 80,\n minHeight = 20;\n const w = Math.max(minWidth, (bbox.width + (node.padding ?? 0) * 2) * 1.25, node?.width ?? 0);\n const h = Math.max(minHeight, bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const radius = h / 2;\n\n const { cssStyles } = node;\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const totalWidth = w,\n totalHeight = h;\n const rw = totalWidth - radius;\n const tw = totalHeight / 4;\n\n const points = [\n { x: rw, y: 0 },\n { x: tw, y: 0 },\n { x: 0, y: totalHeight / 2 },\n { x: tw, y: totalHeight },\n { x: rw, y: totalHeight },\n ...generateCirclePoints(-rw, -totalHeight / 2, radius, 50, 270, 90),\n ];\n\n const pathData = createPathFromPoints(points);\n const shapeNode = rc.path(pathData, options);\n\n const polygon = shapeSvg.insert(() => shapeNode, ':first-child');\n polygon.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', nodeStyles);\n }\n\n polygon.attr('transform', `translate(${-w / 2}, ${-h / 2})`);\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\nimport { handleUndefinedAttr } from '../../../utils.js';\n\nexport const createCylinderPathD = (\n x: number,\n y: number,\n width: number,\n height: number,\n rx: number,\n ry: number\n): string => {\n return [\n `M${x},${y + ry}`,\n `a${rx},${ry} 0,0,0 ${width},0`,\n `a${rx},${ry} 0,0,0 ${-width},0`,\n `l0,${height}`,\n `a${rx},${ry} 0,0,0 ${width},0`,\n `l0,${-height}`,\n ].join(' ');\n};\nexport const createOuterCylinderPathD = (\n x: number,\n y: number,\n width: number,\n height: number,\n rx: number,\n ry: number\n): string => {\n return [\n `M${x},${y + ry}`,\n `M${x + width},${y + ry}`,\n `a${rx},${ry} 0,0,0 ${-width},0`,\n `l0,${height}`,\n `a${rx},${ry} 0,0,0 ${width},0`,\n `l0,${-height}`,\n ].join(' ');\n};\nexport const createInnerCylinderPathD = (\n x: number,\n y: number,\n width: number,\n height: number,\n rx: number,\n ry: number\n): string => {\n return [`M${x - width / 2},${-height / 2}`, `a${rx},${ry} 0,0,0 ${width},0`].join(' ');\n};\nexport async function cylinder(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + node.padding, node.width ?? 0);\n const rx = w / 2;\n const ry = rx / (2.5 + w / 50);\n const h = Math.max(bbox.height + ry + node.padding, node.height ?? 0);\n\n let cylinder: D3Selection | D3Selection;\n const { cssStyles } = node;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const outerPathData = createOuterCylinderPathD(0, 0, w, h, rx, ry);\n const innerPathData = createInnerCylinderPathD(0, ry, w, h, rx, ry);\n const outerNode = rc.path(outerPathData, userNodeOverrides(node, {}));\n const innerLine = rc.path(innerPathData, userNodeOverrides(node, { fill: 'none' }));\n\n cylinder = shapeSvg.insert(() => innerLine, ':first-child');\n cylinder = shapeSvg.insert(() => outerNode, ':first-child');\n cylinder.attr('class', 'basic label-container');\n if (cssStyles) {\n cylinder.attr('style', cssStyles);\n }\n } else {\n const pathData = createCylinderPathD(0, 0, w, h, rx, ry);\n cylinder = shapeSvg\n .insert('path', ':first-child')\n .attr('d', pathData)\n .attr('class', 'basic label-container')\n .attr('style', handleUndefinedAttr(cssStyles))\n .attr('style', nodeStyles);\n }\n\n cylinder.attr('label-offset-y', ry);\n cylinder.attr('transform', `translate(${-w / 2}, ${-(h / 2 + ry)})`);\n\n updateNodeBounds(node, cylinder);\n\n label.attr(\n 'transform',\n `translate(${-(bbox.width / 2) - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) + (node.padding ?? 0) / 1.5 - (bbox.y - (bbox.top ?? 0))})`\n );\n\n node.intersect = function (point) {\n const pos = intersect.rect(node, point);\n const x = pos.x - (node.x ?? 0);\n\n if (\n rx != 0 &&\n (Math.abs(x) < (node.width ?? 0) / 2 ||\n (Math.abs(x) == (node.width ?? 0) / 2 &&\n Math.abs(pos.y - (node.y ?? 0)) > (node.height ?? 0) / 2 - ry))\n ) {\n let y = ry * ry * (1 - (x * x) / (rx * rx));\n if (y > 0) {\n y = Math.sqrt(y);\n }\n y = ry - y;\n if (point.y - (node.y ?? 0) > 0) {\n y = -y;\n }\n\n pos.y += y;\n }\n\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function dividedRectangle(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const rectOffset = h * 0.2;\n\n const x = -w / 2;\n const y = -h / 2 - rectOffset / 2;\n\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const pts = [\n { x, y: y + rectOffset },\n { x: -x, y: y + rectOffset },\n { x: -x, y: -y },\n { x, y: -y },\n { x, y },\n { x: -x, y },\n { x: -x, y: y + rectOffset },\n ];\n\n const poly = rc.polygon(\n pts.map((p) => [p.x, p.y]),\n options\n );\n\n const polygon = shapeSvg.insert(() => poly, ':first-child');\n polygon.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n polygon.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n polygon.selectAll('path').attr('style', nodeStyles);\n }\n\n label.attr(\n 'transform',\n `translate(${x + (node.padding ?? 0) / 2 - (bbox.x - (bbox.left ?? 0))}, ${y + rectOffset + (node.padding ?? 0) / 2 - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n const pos = intersect.rect(node, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { log } from '../../../logger.js';\nimport { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\nimport { handleUndefinedAttr } from '../../../utils.js';\n\nexport async function doublecircle(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, halfPadding } = await labelHelper(parent, node, getNodeClasses(node));\n const gap = 5;\n const outerRadius = bbox.width / 2 + halfPadding + gap;\n const innerRadius = bbox.width / 2 + halfPadding;\n\n let circleGroup;\n const { cssStyles } = node;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const outerOptions = userNodeOverrides(node, { roughness: 0.2, strokeWidth: 2.5 });\n\n const innerOptions = userNodeOverrides(node, { roughness: 0.2, strokeWidth: 1.5 });\n const outerRoughNode = rc.circle(0, 0, outerRadius * 2, outerOptions);\n const innerRoughNode = rc.circle(0, 0, innerRadius * 2, innerOptions);\n\n circleGroup = shapeSvg.insert('g', ':first-child');\n // circleGroup = circleGroup.insert(() => outerRoughNode, ':first-child');\n circleGroup\n .attr('class', handleUndefinedAttr(node.cssClasses))\n .attr('style', handleUndefinedAttr(cssStyles));\n\n circleGroup.node()?.appendChild(outerRoughNode);\n circleGroup.node()?.appendChild(innerRoughNode);\n } else {\n circleGroup = shapeSvg.insert('g', ':first-child');\n\n const outerCircle = circleGroup.insert('circle', ':first-child');\n const innerCircle = circleGroup.insert('circle');\n circleGroup.attr('class', 'basic label-container').attr('style', nodeStyles);\n\n outerCircle\n .attr('class', 'outer-circle')\n .attr('style', nodeStyles)\n .attr('r', outerRadius)\n .attr('cx', 0)\n .attr('cy', 0);\n\n innerCircle\n .attr('class', 'inner-circle')\n .attr('style', nodeStyles)\n .attr('r', innerRadius)\n .attr('cx', 0)\n .attr('cy', 0);\n }\n\n updateNodeBounds(node, circleGroup);\n\n node.intersect = function (point) {\n log.info('DoubleCircle intersect', node, outerRadius, point);\n return intersect.circle(node, outerRadius, point);\n };\n\n return shapeSvg;\n}\n", "import rough from 'roughjs';\nimport { log } from '../../../logger.js';\nimport type { Node, ShapeRenderOptions } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { getNodeClasses, updateNodeBounds } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport function filledCircle(\n parent: D3Selection,\n node: Node,\n { config: { themeVariables } }: ShapeRenderOptions\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.label = '';\n node.labelStyle = labelStyles;\n const shapeSvg = parent\n .insert('g')\n .attr('class', getNodeClasses(node))\n .attr('id', node.domId ?? node.id);\n const radius = 7;\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const { nodeBorder } = themeVariables;\n const options = userNodeOverrides(node, { fillStyle: 'solid' });\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n }\n\n const circleNode = rc.circle(0, 0, radius * 2, options);\n\n const filledCircle = shapeSvg.insert(() => circleNode, ':first-child');\n\n filledCircle.selectAll('path').attr('style', `fill: ${nodeBorder} !important;`);\n\n if (cssStyles && cssStyles.length > 0 && node.look !== 'handDrawn') {\n filledCircle.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n filledCircle.selectAll('path').attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, filledCircle);\n\n node.intersect = function (point) {\n log.info('filledCircle intersect', node, { radius, point });\n const pos = intersect.circle(node, radius, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { log } from '../../../logger.js';\nimport { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport { createPathFromPoints } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function flippedTriangle(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n\n const w = bbox.width + (node.padding ?? 0);\n const h = w + bbox.height;\n\n const tw = w + bbox.height;\n const points = [\n { x: 0, y: -h },\n { x: tw, y: -h },\n { x: tw / 2, y: 0 },\n ];\n\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n const pathData = createPathFromPoints(points);\n const roughNode = rc.path(pathData, options);\n\n const flippedTriangle = shapeSvg\n .insert(() => roughNode, ':first-child')\n .attr('transform', `translate(${-h / 2}, ${h / 2})`);\n\n if (cssStyles && node.look !== 'handDrawn') {\n flippedTriangle.selectChildren('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n flippedTriangle.selectChildren('path').attr('style', nodeStyles);\n }\n\n node.width = w;\n node.height = h;\n\n updateNodeBounds(node, flippedTriangle);\n\n label.attr(\n 'transform',\n `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))}, ${-h / 2 + (node.padding ?? 0) / 2 + (bbox.y - (bbox.top ?? 0))})`\n );\n\n node.intersect = function (point) {\n log.info('Triangle intersect', node, points, point);\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n}\n", "import rough from 'roughjs';\nimport type { Node, ShapeRenderOptions } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { getNodeClasses, updateNodeBounds } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport function forkJoin(\n parent: D3Selection,\n node: Node,\n { dir, config: { state, themeVariables } }: ShapeRenderOptions\n) {\n const { nodeStyles } = styles2String(node);\n node.label = '';\n const shapeSvg = parent\n .insert('g')\n .attr('class', getNodeClasses(node))\n .attr('id', node.domId ?? node.id);\n\n const { cssStyles } = node;\n let width = Math.max(70, node?.width ?? 0);\n let height = Math.max(10, node?.height ?? 0);\n\n if (dir === 'LR') {\n width = Math.max(10, node?.width ?? 0);\n height = Math.max(70, node?.height ?? 0);\n }\n\n const x = (-1 * width) / 2;\n const y = (-1 * height) / 2;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {\n stroke: themeVariables.lineColor,\n fill: themeVariables.lineColor,\n });\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const roughNode = rc.rectangle(x, y, width, height, options);\n\n const shape = shapeSvg.insert(() => roughNode, ':first-child');\n\n if (cssStyles && node.look !== 'handDrawn') {\n shape.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n shape.selectAll('path').attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, shape);\n const padding = state?.padding ?? 0;\n if (node.width && node.height) {\n node.width += padding / 2 || 0;\n node.height += padding / 2 || 0;\n }\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n return shapeSvg;\n}\n", "import { log } from '../../../logger.js';\nimport {\n labelHelper,\n updateNodeBounds,\n getNodeClasses,\n createPathFromPoints,\n generateCirclePoints,\n} from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function halfRoundedRectangle(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const minWidth = 80,\n minHeight = 50;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(minWidth, bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(minHeight, bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const radius = h / 2;\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const points = [\n { x: -w / 2, y: -h / 2 },\n { x: w / 2 - radius, y: -h / 2 },\n ...generateCirclePoints(-w / 2 + radius, 0, radius, 50, 90, 270),\n { x: w / 2 - radius, y: h / 2 },\n { x: -w / 2, y: h / 2 },\n ];\n\n const pathData = createPathFromPoints(points);\n const shapeNode = rc.path(pathData, options);\n const polygon = shapeSvg.insert(() => shapeNode, ':first-child');\n polygon.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', nodeStyles);\n }\n\n // label.attr(\n // 'transform',\n // `translate(${-w / 2 + (node.padding ?? 0) - (bbox.x - (bbox.left ?? 0))}, ${-h / 2 + (node.padding ?? 0) - (bbox.y - (bbox.top ?? 0))})`\n // );\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n log.info('Pill intersect', node, { radius, point });\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nexport const createHexagonPathD = (\n x: number,\n y: number,\n width: number,\n height: number,\n m: number\n): string => {\n return [\n `M${x + m},${y}`,\n `L${x + width - m},${y}`,\n `L${x + width},${y - height / 2}`,\n `L${x + width - m},${y - height}`,\n `L${x + m},${y - height}`,\n `L${x},${y - height / 2}`,\n 'Z',\n ].join(' ');\n};\n\nexport async function hexagon(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n\n const h = bbox.height + (node.padding ?? 0);\n const w = bbox.width + (node.padding ?? 0) * 2.5;\n const { cssStyles } = node;\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n let halfWidth = w / 2;\n const m = halfWidth / 6; // Margin for label\n halfWidth = halfWidth + m; // Adjusted half width for hexagon\n\n const halfHeight = h / 2;\n\n const fixedLength = halfHeight / 2;\n const deducedWidth = halfWidth - fixedLength;\n\n const points = [\n { x: -deducedWidth, y: -halfHeight },\n { x: 0, y: -halfHeight },\n { x: deducedWidth, y: -halfHeight },\n { x: halfWidth, y: 0 },\n { x: deducedWidth, y: halfHeight },\n { x: 0, y: halfHeight },\n { x: -deducedWidth, y: halfHeight },\n { x: -halfWidth, y: 0 },\n ];\n\n const pathData = createPathFromPoints(points);\n const shapeNode = rc.path(pathData, options);\n\n const polygon = shapeSvg.insert(() => shapeNode, ':first-child');\n polygon.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', nodeStyles);\n }\n\n node.width = w;\n node.height = h;\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n}\n", "import { log } from '../../../logger.js';\nimport { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function hourglass(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.label = '';\n node.labelStyle = labelStyles;\n const { shapeSvg } = await labelHelper(parent, node, getNodeClasses(node));\n\n const w = Math.max(30, node?.width ?? 0);\n const h = Math.max(30, node?.height ?? 0);\n\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const points = [\n { x: 0, y: 0 },\n { x: w, y: 0 },\n { x: 0, y: h },\n { x: w, y: h },\n ];\n\n const pathData = createPathFromPoints(points);\n const shapeNode = rc.path(pathData, options);\n const polygon = shapeSvg.insert(() => shapeNode, ':first-child');\n polygon.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', nodeStyles);\n }\n\n polygon.attr('transform', `translate(${-w / 2}, ${-h / 2})`);\n\n updateNodeBounds(node, polygon);\n\n // label.attr('transform', `translate(${-bbox.width / 2}, ${(h/2)})`); // To transform text below hourglass shape\n\n node.intersect = function (point) {\n log.info('Pill intersect', node, { points });\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import rough from 'roughjs';\nimport { log } from '../../../logger.js';\nimport { getIconSVG } from '../../icons.js';\nimport type { Node, ShapeRenderOptions } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { compileStyles, styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { labelHelper, updateNodeBounds } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function icon(\n parent: D3Selection,\n node: Node,\n { config: { themeVariables, flowchart } }: ShapeRenderOptions\n) {\n const { labelStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const assetHeight = node.assetHeight ?? 48;\n const assetWidth = node.assetWidth ?? 48;\n const iconSize = Math.max(assetHeight, assetWidth);\n const defaultWidth = flowchart?.wrappingWidth;\n node.width = Math.max(iconSize, defaultWidth ?? 0);\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, 'icon-shape default');\n\n const topLabel = node.pos === 't';\n\n const height = iconSize;\n const width = iconSize;\n const { nodeBorder } = themeVariables;\n const { stylesMap } = compileStyles(node);\n\n const x = -width / 2;\n const y = -height / 2;\n\n const labelPadding = node.label ? 8 : 0;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, { stroke: 'none', fill: 'none' });\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const iconNode = rc.rectangle(x, y, width, height, options);\n\n const outerWidth = Math.max(width, bbox.width);\n const outerHeight = height + bbox.height + labelPadding;\n\n const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, {\n ...options,\n fill: 'transparent',\n stroke: 'none',\n });\n\n const iconShape = shapeSvg.insert(() => iconNode, ':first-child');\n const outerShape = shapeSvg.insert(() => outerNode);\n\n if (node.icon) {\n const iconElem = shapeSvg.append('g');\n iconElem.html(\n `${await getIconSVG(node.icon, {\n height: iconSize,\n width: iconSize,\n fallbackPrefix: '',\n })}`\n );\n const iconBBox = iconElem.node()!.getBBox();\n const iconWidth = iconBBox.width;\n const iconHeight = iconBBox.height;\n const iconX = iconBBox.x;\n const iconY = iconBBox.y;\n iconElem.attr(\n 'transform',\n `translate(${-iconWidth / 2 - iconX},${\n topLabel\n ? bbox.height / 2 + labelPadding / 2 - iconHeight / 2 - iconY\n : -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY\n })`\n );\n iconElem.attr('style', `color: ${stylesMap.get('stroke') ?? nodeBorder};`);\n }\n\n label.attr(\n 'transform',\n `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${\n topLabel ? -outerHeight / 2 : outerHeight / 2 - bbox.height\n })`\n );\n\n iconShape.attr(\n 'transform',\n `translate(${0},${\n topLabel ? bbox.height / 2 + labelPadding / 2 : -bbox.height / 2 - labelPadding / 2\n })`\n );\n\n updateNodeBounds(node, outerShape);\n\n node.intersect = function (point) {\n log.info('iconSquare intersect', node, point);\n if (!node.label) {\n return intersect.rect(node, point);\n }\n const dx = node.x ?? 0;\n const dy = node.y ?? 0;\n const nodeHeight = node.height ?? 0;\n let points = [];\n if (topLabel) {\n points = [\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx + width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx + width / 2, y: dy + nodeHeight / 2 },\n { x: dx - width / 2, y: dy + nodeHeight / 2 },\n { x: dx - width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n ];\n } else {\n points = [\n { x: dx - width / 2, y: dy - nodeHeight / 2 },\n { x: dx + width / 2, y: dy - nodeHeight / 2 },\n { x: dx + width / 2, y: dy - nodeHeight / 2 + height },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + height },\n { x: dx + bbox.width / 2 / 2, y: dy + nodeHeight / 2 },\n { x: dx - bbox.width / 2, y: dy + nodeHeight / 2 },\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + height },\n { x: dx - width / 2, y: dy - nodeHeight / 2 + height },\n ];\n }\n\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import rough from 'roughjs';\nimport { log } from '../../../logger.js';\nimport { getIconSVG } from '../../icons.js';\nimport type { Node, ShapeRenderOptions } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { compileStyles, styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { labelHelper, updateNodeBounds } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function iconCircle(\n parent: D3Selection,\n node: Node,\n { config: { themeVariables, flowchart } }: ShapeRenderOptions\n) {\n const { labelStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const assetHeight = node.assetHeight ?? 48;\n const assetWidth = node.assetWidth ?? 48;\n const iconSize = Math.max(assetHeight, assetWidth);\n const defaultWidth = flowchart?.wrappingWidth;\n node.width = Math.max(iconSize, defaultWidth ?? 0);\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, 'icon-shape default');\n\n const padding = 20;\n const labelPadding = node.label ? 8 : 0;\n\n const topLabel = node.pos === 't';\n\n const { nodeBorder, mainBkg } = themeVariables;\n const { stylesMap } = compileStyles(node);\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n const fill = stylesMap.get('fill');\n options.stroke = fill ?? mainBkg;\n\n const iconElem = shapeSvg.append('g');\n if (node.icon) {\n iconElem.html(\n `${await getIconSVG(node.icon, {\n height: iconSize,\n width: iconSize,\n fallbackPrefix: '',\n })}`\n );\n }\n const iconBBox = iconElem.node()!.getBBox();\n const iconWidth = iconBBox.width;\n const iconHeight = iconBBox.height;\n const iconX = iconBBox.x;\n const iconY = iconBBox.y;\n\n const diameter = Math.max(iconWidth, iconHeight) * Math.SQRT2 + padding * 2;\n const iconNode = rc.circle(0, 0, diameter, options);\n\n const outerWidth = Math.max(diameter, bbox.width);\n const outerHeight = diameter + bbox.height + labelPadding;\n\n const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, {\n ...options,\n fill: 'transparent',\n stroke: 'none',\n });\n\n const iconShape = shapeSvg.insert(() => iconNode, ':first-child');\n const outerShape = shapeSvg.insert(() => outerNode);\n iconElem.attr(\n 'transform',\n `translate(${-iconWidth / 2 - iconX},${\n topLabel\n ? bbox.height / 2 + labelPadding / 2 - iconHeight / 2 - iconY\n : -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY\n })`\n );\n iconElem.attr('style', `color: ${stylesMap.get('stroke') ?? nodeBorder};`);\n label.attr(\n 'transform',\n `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${\n topLabel ? -outerHeight / 2 : outerHeight / 2 - bbox.height\n })`\n );\n\n iconShape.attr(\n 'transform',\n `translate(${0},${\n topLabel ? bbox.height / 2 + labelPadding / 2 : -bbox.height / 2 - labelPadding / 2\n })`\n );\n\n updateNodeBounds(node, outerShape);\n\n node.intersect = function (point) {\n log.info('iconSquare intersect', node, point);\n const pos = intersect.rect(node, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import rough from 'roughjs';\nimport { log } from '../../../logger.js';\nimport { getIconSVG } from '../../icons.js';\nimport type { Node, ShapeRenderOptions } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { compileStyles, styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { createRoundedRectPathD } from './roundedRectPath.js';\nimport { labelHelper, updateNodeBounds } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function iconRounded(\n parent: D3Selection,\n node: Node,\n { config: { themeVariables, flowchart } }: ShapeRenderOptions\n) {\n const { labelStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const assetHeight = node.assetHeight ?? 48;\n const assetWidth = node.assetWidth ?? 48;\n const iconSize = Math.max(assetHeight, assetWidth);\n const defaultWidth = flowchart?.wrappingWidth;\n node.width = Math.max(iconSize, defaultWidth ?? 0);\n const { shapeSvg, bbox, halfPadding, label } = await labelHelper(\n parent,\n node,\n 'icon-shape default'\n );\n\n const topLabel = node.pos === 't';\n\n const height = iconSize + halfPadding * 2;\n const width = iconSize + halfPadding * 2;\n const { nodeBorder, mainBkg } = themeVariables;\n const { stylesMap } = compileStyles(node);\n\n const x = -width / 2;\n const y = -height / 2;\n\n const labelPadding = node.label ? 8 : 0;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n const fill = stylesMap.get('fill');\n options.stroke = fill ?? mainBkg;\n\n const iconNode = rc.path(createRoundedRectPathD(x, y, width, height, 5), options);\n\n const outerWidth = Math.max(width, bbox.width);\n const outerHeight = height + bbox.height + labelPadding;\n\n const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, {\n ...options,\n fill: 'transparent',\n stroke: 'none',\n });\n\n const iconShape = shapeSvg.insert(() => iconNode, ':first-child').attr('class', 'icon-shape2');\n const outerShape = shapeSvg.insert(() => outerNode);\n\n if (node.icon) {\n const iconElem = shapeSvg.append('g');\n iconElem.html(\n `${await getIconSVG(node.icon, {\n height: iconSize,\n width: iconSize,\n fallbackPrefix: '',\n })}`\n );\n const iconBBox = iconElem.node()!.getBBox();\n const iconWidth = iconBBox.width;\n const iconHeight = iconBBox.height;\n const iconX = iconBBox.x;\n const iconY = iconBBox.y;\n iconElem.attr(\n 'transform',\n `translate(${-iconWidth / 2 - iconX},${\n topLabel\n ? bbox.height / 2 + labelPadding / 2 - iconHeight / 2 - iconY\n : -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY\n })`\n );\n iconElem.attr('style', `color: ${stylesMap.get('stroke') ?? nodeBorder};`);\n }\n\n label.attr(\n 'transform',\n `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${\n topLabel ? -outerHeight / 2 : outerHeight / 2 - bbox.height\n })`\n );\n\n iconShape.attr(\n 'transform',\n `translate(${0},${\n topLabel ? bbox.height / 2 + labelPadding / 2 : -bbox.height / 2 - labelPadding / 2\n })`\n );\n\n updateNodeBounds(node, outerShape);\n\n node.intersect = function (point) {\n log.info('iconSquare intersect', node, point);\n if (!node.label) {\n return intersect.rect(node, point);\n }\n const dx = node.x ?? 0;\n const dy = node.y ?? 0;\n const nodeHeight = node.height ?? 0;\n let points = [];\n if (topLabel) {\n points = [\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx + width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx + width / 2, y: dy + nodeHeight / 2 },\n { x: dx - width / 2, y: dy + nodeHeight / 2 },\n { x: dx - width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n ];\n } else {\n points = [\n { x: dx - width / 2, y: dy - nodeHeight / 2 },\n { x: dx + width / 2, y: dy - nodeHeight / 2 },\n { x: dx + width / 2, y: dy - nodeHeight / 2 + height },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + height },\n { x: dx + bbox.width / 2 / 2, y: dy + nodeHeight / 2 },\n { x: dx - bbox.width / 2, y: dy + nodeHeight / 2 },\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + height },\n { x: dx - width / 2, y: dy - nodeHeight / 2 + height },\n ];\n }\n\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import rough from 'roughjs';\nimport { log } from '../../../logger.js';\nimport { getIconSVG } from '../../icons.js';\nimport type { Node, ShapeRenderOptions } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { createRoundedRectPathD } from './roundedRectPath.js';\nimport { compileStyles, styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { labelHelper, updateNodeBounds } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function iconSquare(\n parent: D3Selection,\n node: Node,\n { config: { themeVariables, flowchart } }: ShapeRenderOptions\n) {\n const { labelStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const assetHeight = node.assetHeight ?? 48;\n const assetWidth = node.assetWidth ?? 48;\n const iconSize = Math.max(assetHeight, assetWidth);\n const defaultWidth = flowchart?.wrappingWidth;\n node.width = Math.max(iconSize, defaultWidth ?? 0);\n const { shapeSvg, bbox, halfPadding, label } = await labelHelper(\n parent,\n node,\n 'icon-shape default'\n );\n\n const topLabel = node.pos === 't';\n\n const height = iconSize + halfPadding * 2;\n const width = iconSize + halfPadding * 2;\n const { nodeBorder, mainBkg } = themeVariables;\n const { stylesMap } = compileStyles(node);\n\n const x = -width / 2;\n const y = -height / 2;\n\n const labelPadding = node.label ? 8 : 0;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n const fill = stylesMap.get('fill');\n options.stroke = fill ?? mainBkg;\n\n const iconNode = rc.path(createRoundedRectPathD(x, y, width, height, 0.1), options);\n\n const outerWidth = Math.max(width, bbox.width);\n const outerHeight = height + bbox.height + labelPadding;\n\n const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, {\n ...options,\n fill: 'transparent',\n stroke: 'none',\n });\n\n const iconShape = shapeSvg.insert(() => iconNode, ':first-child');\n const outerShape = shapeSvg.insert(() => outerNode);\n\n if (node.icon) {\n const iconElem = shapeSvg.append('g');\n iconElem.html(\n `${await getIconSVG(node.icon, {\n height: iconSize,\n width: iconSize,\n fallbackPrefix: '',\n })}`\n );\n const iconBBox = iconElem.node()!.getBBox();\n const iconWidth = iconBBox.width;\n const iconHeight = iconBBox.height;\n const iconX = iconBBox.x;\n const iconY = iconBBox.y;\n iconElem.attr(\n 'transform',\n `translate(${-iconWidth / 2 - iconX},${\n topLabel\n ? bbox.height / 2 + labelPadding / 2 - iconHeight / 2 - iconY\n : -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY\n })`\n );\n iconElem.attr('style', `color: ${stylesMap.get('stroke') ?? nodeBorder};`);\n }\n\n label.attr(\n 'transform',\n `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${\n topLabel ? -outerHeight / 2 : outerHeight / 2 - bbox.height\n })`\n );\n\n iconShape.attr(\n 'transform',\n `translate(${0},${\n topLabel ? bbox.height / 2 + labelPadding / 2 : -bbox.height / 2 - labelPadding / 2\n })`\n );\n\n updateNodeBounds(node, outerShape);\n\n node.intersect = function (point) {\n log.info('iconSquare intersect', node, point);\n if (!node.label) {\n return intersect.rect(node, point);\n }\n const dx = node.x ?? 0;\n const dy = node.y ?? 0;\n const nodeHeight = node.height ?? 0;\n let points = [];\n if (topLabel) {\n points = [\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx + width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx + width / 2, y: dy + nodeHeight / 2 },\n { x: dx - width / 2, y: dy + nodeHeight / 2 },\n { x: dx - width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n ];\n } else {\n points = [\n { x: dx - width / 2, y: dy - nodeHeight / 2 },\n { x: dx + width / 2, y: dy - nodeHeight / 2 },\n { x: dx + width / 2, y: dy - nodeHeight / 2 + height },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + height },\n { x: dx + bbox.width / 2 / 2, y: dy + nodeHeight / 2 },\n { x: dx - bbox.width / 2, y: dy + nodeHeight / 2 },\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + height },\n { x: dx - width / 2, y: dy - nodeHeight / 2 + height },\n ];\n }\n\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import rough from 'roughjs';\nimport { log } from '../../../logger.js';\nimport type { Node, ShapeRenderOptions } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { labelHelper, updateNodeBounds } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function imageSquare(\n parent: D3Selection,\n node: Node,\n { config: { flowchart } }: ShapeRenderOptions\n) {\n const img = new Image();\n img.src = node?.img ?? '';\n await img.decode();\n\n const imageNaturalWidth = Number(img.naturalWidth.toString().replace('px', ''));\n const imageNaturalHeight = Number(img.naturalHeight.toString().replace('px', ''));\n node.imageAspectRatio = imageNaturalWidth / imageNaturalHeight;\n\n const { labelStyles } = styles2String(node);\n\n node.labelStyle = labelStyles;\n\n const defaultWidth = flowchart?.wrappingWidth;\n node.defaultWidth = flowchart?.wrappingWidth;\n\n const imageRawWidth = Math.max(\n node.label ? (defaultWidth ?? 0) : 0,\n node?.assetWidth ?? imageNaturalWidth\n );\n\n const imageWidth =\n node.constraint === 'on'\n ? node?.assetHeight\n ? node.assetHeight * node.imageAspectRatio\n : imageRawWidth\n : imageRawWidth;\n\n const imageHeight =\n node.constraint === 'on'\n ? imageWidth / node.imageAspectRatio\n : (node?.assetHeight ?? imageNaturalHeight);\n node.width = Math.max(imageWidth, defaultWidth ?? 0);\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, 'image-shape default');\n\n const topLabel = node.pos === 't';\n\n const x = -imageWidth / 2;\n const y = -imageHeight / 2;\n\n const labelPadding = node.label ? 8 : 0;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const imageNode = rc.rectangle(x, y, imageWidth, imageHeight, options);\n\n const outerWidth = Math.max(imageWidth, bbox.width);\n const outerHeight = imageHeight + bbox.height + labelPadding;\n\n const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, {\n ...options,\n fill: 'none',\n stroke: 'none',\n });\n\n const iconShape = shapeSvg.insert(() => imageNode, ':first-child');\n const outerShape = shapeSvg.insert(() => outerNode);\n\n if (node.img) {\n const image = shapeSvg.append('image');\n\n // Set the image attributes\n image.attr('href', node.img);\n image.attr('width', imageWidth);\n image.attr('height', imageHeight);\n image.attr('preserveAspectRatio', 'none');\n\n image.attr(\n 'transform',\n `translate(${-imageWidth / 2},${topLabel ? outerHeight / 2 - imageHeight : -outerHeight / 2})`\n );\n }\n\n label.attr(\n 'transform',\n `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${\n topLabel\n ? -imageHeight / 2 - bbox.height / 2 - labelPadding / 2\n : imageHeight / 2 - bbox.height / 2 + labelPadding / 2\n })`\n );\n\n iconShape.attr(\n 'transform',\n `translate(${0},${\n topLabel ? bbox.height / 2 + labelPadding / 2 : -bbox.height / 2 - labelPadding / 2\n })`\n );\n\n updateNodeBounds(node, outerShape);\n\n node.intersect = function (point) {\n log.info('iconSquare intersect', node, point);\n if (!node.label) {\n return intersect.rect(node, point);\n }\n const dx = node.x ?? 0;\n const dy = node.y ?? 0;\n const nodeHeight = node.height ?? 0;\n let points = [];\n if (topLabel) {\n points = [\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx + imageWidth / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx + imageWidth / 2, y: dy + nodeHeight / 2 },\n { x: dx - imageWidth / 2, y: dy + nodeHeight / 2 },\n { x: dx - imageWidth / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },\n ];\n } else {\n points = [\n { x: dx - imageWidth / 2, y: dy - nodeHeight / 2 },\n { x: dx + imageWidth / 2, y: dy - nodeHeight / 2 },\n { x: dx + imageWidth / 2, y: dy - nodeHeight / 2 + imageHeight },\n { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + imageHeight },\n { x: dx + bbox.width / 2 / 2, y: dy + nodeHeight / 2 },\n { x: dx - bbox.width / 2, y: dy + nodeHeight / 2 },\n { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + imageHeight },\n { x: dx - imageWidth / 2, y: dy - nodeHeight / 2 + imageHeight },\n ];\n }\n\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport { insertPolygonShape } from './insertPolygonShape.js';\nimport type { D3Selection } from '../../../types.js';\n\n// export const createInvertedTrapezoidPathD = (\n// x: number,\n// y: number,\n// width: number,\n// height: number\n// ): string => {\n// return [\n// `M${x + height / 6},${y}`,\n// `L${x + width - height / 6},${y}`,\n// `L${x + width + (2 * height) / 6},${y - height}`,\n// `L${x - (2 * height) / 6},${y - height}`,\n// 'Z',\n// ].join(' ');\n// };\n\nexport async function inv_trapezoid(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n\n const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n\n const points = [\n { x: 0, y: 0 },\n { x: w, y: 0 },\n { x: w + (3 * h) / 6, y: -h },\n { x: (-3 * h) / 6, y: -h },\n ];\n\n let polygon: typeof shapeSvg | ReturnType;\n const { cssStyles } = node;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n const pathData = createPathFromPoints(points);\n // const pathData = createInvertedTrapezoidPathD(0, 0, w, h);\n const roughNode = rc.path(pathData, options);\n\n polygon = shapeSvg\n .insert(() => roughNode, ':first-child')\n .attr('transform', `translate(${-w / 2}, ${h / 2})`);\n\n if (cssStyles) {\n polygon.attr('style', cssStyles);\n }\n } else {\n polygon = insertPolygonShape(shapeSvg, w, h, points);\n }\n\n if (nodeStyles) {\n polygon.attr('style', nodeStyles);\n }\n\n node.width = w;\n node.height = h;\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node, RectOptions } from '../../types.js';\nimport { createRoundedRectPathD } from './roundedRectPath.js';\nimport { userNodeOverrides, styles2String } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\nimport { handleUndefinedAttr } from '../../../utils.js';\nimport type { Bounds, Point } from '../../../types.js';\n\nexport async function drawRect(\n parent: D3Selection,\n node: Node,\n options: RectOptions\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n // console.log('IPI labelStyles:', labelStyles);\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n\n const totalWidth = Math.max(bbox.width + options.labelPaddingX * 2, node?.width || 0);\n const totalHeight = Math.max(bbox.height + options.labelPaddingY * 2, node?.height || 0);\n const x = -totalWidth / 2;\n const y = -totalHeight / 2;\n\n // log.info('IPI node = ', node);\n\n let rect;\n let { rx, ry } = node;\n const { cssStyles } = node;\n\n //use options rx, ry overrides if present\n if (options?.rx && options.ry) {\n rx = options.rx;\n ry = options.ry;\n }\n\n if (node.look === 'handDrawn') {\n // @ts-ignore TODO: Fix rough typings\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n const roughNode =\n rx || ry\n ? rc.path(createRoundedRectPathD(x, y, totalWidth, totalHeight, rx || 0), options)\n : rc.rectangle(x, y, totalWidth, totalHeight, options);\n\n rect = shapeSvg.insert(() => roughNode, ':first-child');\n rect.attr('class', 'basic label-container').attr('style', handleUndefinedAttr(cssStyles));\n } else {\n rect = shapeSvg.insert('rect', ':first-child');\n\n rect\n .attr('class', 'basic label-container')\n .attr('style', nodeStyles)\n .attr('rx', handleUndefinedAttr(rx))\n .attr('ry', handleUndefinedAttr(ry))\n .attr('x', x)\n .attr('y', y)\n .attr('width', totalWidth)\n .attr('height', totalHeight);\n }\n\n updateNodeBounds(node, rect);\n\n node.calcIntersect = function (bounds: Bounds, point: Point) {\n return intersect.rect(bounds, point);\n };\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n}\n", "import type { Node, RectOptions } from '../../types.js';\nimport { drawRect } from './drawRect.js';\nimport { labelHelper, updateNodeBounds } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function roundedRect(\n parent: D3Selection,\n node: Node\n) {\n const options = {\n rx: 5,\n ry: 5,\n classes: '',\n labelPaddingX: (node?.padding || 0) * 1,\n labelPaddingY: (node?.padding || 0) * 1,\n } as RectOptions;\n\n return drawRect(parent, node, options);\n}\n\nexport async function labelRect(parent: D3Selection, node: Node) {\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, 'label');\n\n // log.trace('Classes = ', node.class);\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n // Hide the rect we are only after the label\n const totalWidth = 0.1;\n const totalHeight = 0.1;\n rect.attr('width', totalWidth).attr('height', totalHeight);\n shapeSvg.attr('class', 'label edgeLabel');\n label.attr(\n 'transform',\n `translate(${-(bbox.width / 2) - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) - (bbox.y - (bbox.top ?? 0))})`\n );\n\n // if (node.props) {\n // const propKeys = new Set(Object.keys(node.props));\n // if (node.props.borders) {\n // applyNodePropertyBorders(rect, node.borders, totalWidth, totalHeight);\n // propKeys.delete('borders');\n // }\n // propKeys.forEach((propKey) => {\n // log.warn(`Unknown node property ${propKey}`);\n // });\n // }\n\n updateNodeBounds(node, rect);\n // node.width = 1;\n // node.height = 1;\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport { insertPolygonShape } from './insertPolygonShape.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function lean_left(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + (node.padding ?? 0), node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0), node?.height ?? 0);\n const points = [\n { x: 0, y: 0 },\n { x: w + (3 * h) / 6, y: 0 },\n { x: w, y: -h },\n { x: -(3 * h) / 6, y: -h },\n ];\n\n let polygon: typeof shapeSvg | ReturnType;\n const { cssStyles } = node;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n const pathData = createPathFromPoints(points);\n // const pathData = createLeanLeftPathD(0, 0, w, h);\n const roughNode = rc.path(pathData, options);\n\n polygon = shapeSvg\n .insert(() => roughNode, ':first-child')\n .attr('transform', `translate(${-w / 2}, ${h / 2})`);\n\n if (cssStyles) {\n polygon.attr('style', cssStyles);\n }\n } else {\n polygon = insertPolygonShape(shapeSvg, w, h, points);\n }\n\n if (nodeStyles) {\n polygon.attr('style', nodeStyles);\n }\n\n node.width = w;\n node.height = h;\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport { insertPolygonShape } from './insertPolygonShape.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function lean_right(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + (node.padding ?? 0), node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0), node?.height ?? 0);\n const points = [\n { x: (-3 * h) / 6, y: 0 },\n { x: w, y: 0 },\n { x: w + (3 * h) / 6, y: -h },\n { x: 0, y: -h },\n ];\n\n let polygon: typeof shapeSvg | ReturnType;\n const { cssStyles } = node;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n const pathData = createPathFromPoints(points);\n const roughNode = rc.path(pathData, options);\n\n polygon = shapeSvg\n .insert(() => roughNode, ':first-child')\n .attr('transform', `translate(${-w / 2}, ${h / 2})`);\n\n if (cssStyles) {\n polygon.attr('style', cssStyles);\n }\n } else {\n polygon = insertPolygonShape(shapeSvg, w, h, points);\n }\n\n if (nodeStyles) {\n polygon.attr('style', nodeStyles);\n }\n\n node.width = w;\n node.height = h;\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n}\n", "import { log } from '../../../logger.js';\nimport { getNodeClasses, updateNodeBounds } from './util.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport intersect from '../intersect/index.js';\nimport { createPathFromPoints } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport function lightningBolt(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.label = '';\n node.labelStyle = labelStyles;\n const shapeSvg = parent\n .insert('g')\n .attr('class', getNodeClasses(node))\n .attr('id', node.domId ?? node.id);\n const { cssStyles } = node;\n const width = Math.max(35, node?.width ?? 0);\n const height = Math.max(35, node?.height ?? 0);\n const gap = 7;\n\n const points = [\n { x: width, y: 0 },\n { x: 0, y: height + gap / 2 },\n { x: width - 2 * gap, y: height + gap / 2 },\n { x: 0, y: 2 * height },\n { x: width, y: height - gap / 2 },\n { x: 2 * gap, y: height - gap / 2 },\n ];\n\n // @ts-expect-error shapeSvg d3 class is incorrect?\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const linePath = createPathFromPoints(points);\n const lineNode = rc.path(linePath, options);\n\n const lightningBolt = shapeSvg.insert(() => lineNode, ':first-child');\n\n if (cssStyles && node.look !== 'handDrawn') {\n lightningBolt.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n lightningBolt.selectAll('path').attr('style', nodeStyles);\n }\n\n lightningBolt.attr('transform', `translate(-${width / 2},${-height})`);\n\n updateNodeBounds(node, lightningBolt);\n\n node.intersect = function (point) {\n log.info('lightningBolt intersect', node, point);\n const pos = intersect.polygon(node, points, point);\n\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\nimport { handleUndefinedAttr } from '../../../utils.js';\n\nexport const createCylinderPathD = (\n x: number,\n y: number,\n width: number,\n height: number,\n rx: number,\n ry: number,\n outerOffset: number\n): string => {\n return [\n `M${x},${y + ry}`,\n `a${rx},${ry} 0,0,0 ${width},0`,\n `a${rx},${ry} 0,0,0 ${-width},0`,\n `l0,${height}`,\n `a${rx},${ry} 0,0,0 ${width},0`,\n `l0,${-height}`,\n `M${x},${y + ry + outerOffset}`,\n `a${rx},${ry} 0,0,0 ${width},0`,\n ].join(' ');\n};\nexport const createOuterCylinderPathD = (\n x: number,\n y: number,\n width: number,\n height: number,\n rx: number,\n ry: number,\n outerOffset: number\n): string => {\n return [\n `M${x},${y + ry}`,\n `M${x + width},${y + ry}`,\n `a${rx},${ry} 0,0,0 ${-width},0`,\n `l0,${height}`,\n `a${rx},${ry} 0,0,0 ${width},0`,\n `l0,${-height}`,\n `M${x},${y + ry + outerOffset}`,\n `a${rx},${ry} 0,0,0 ${width},0`,\n ].join(' ');\n};\nexport const createInnerCylinderPathD = (\n x: number,\n y: number,\n width: number,\n height: number,\n rx: number,\n ry: number\n): string => {\n return [`M${x - width / 2},${-height / 2}`, `a${rx},${ry} 0,0,0 ${width},0`].join(' ');\n};\nexport async function linedCylinder(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + (node.padding ?? 0), node.width ?? 0);\n const rx = w / 2;\n const ry = rx / (2.5 + w / 50);\n const h = Math.max(bbox.height + ry + (node.padding ?? 0), node.height ?? 0);\n const outerOffset = h * 0.1; // 10% of height\n\n let cylinder: typeof shapeSvg | D3Selection;\n const { cssStyles } = node;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const outerPathData = createOuterCylinderPathD(0, 0, w, h, rx, ry, outerOffset);\n const innerPathData = createInnerCylinderPathD(0, ry, w, h, rx, ry);\n const options = userNodeOverrides(node, {});\n\n const outerNode = rc.path(outerPathData, options);\n const innerLine = rc.path(innerPathData, options);\n\n const innerLineEl = shapeSvg.insert(() => innerLine, ':first-child');\n innerLineEl.attr('class', 'line');\n cylinder = shapeSvg.insert(() => outerNode, ':first-child');\n cylinder.attr('class', 'basic label-container');\n if (cssStyles) {\n cylinder.attr('style', cssStyles);\n }\n } else {\n const pathData = createCylinderPathD(0, 0, w, h, rx, ry, outerOffset);\n cylinder = shapeSvg\n .insert('path', ':first-child')\n .attr('d', pathData)\n .attr('class', 'basic label-container')\n .attr('style', handleUndefinedAttr(cssStyles))\n .attr('style', nodeStyles);\n }\n\n // find label and move it down\n cylinder.attr('label-offset-y', ry);\n cylinder.attr('transform', `translate(${-w / 2}, ${-(h / 2 + ry)})`);\n\n updateNodeBounds(node, cylinder);\n\n label.attr(\n 'transform',\n `translate(${-(bbox.width / 2) - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) + ry - (bbox.y - (bbox.top ?? 0))})`\n );\n\n node.intersect = function (point) {\n const pos = intersect.rect(node, point);\n const x = pos.x - (node.x ?? 0);\n\n if (\n rx != 0 &&\n (Math.abs(x) < (node.width ?? 0) / 2 ||\n (Math.abs(x) == (node.width ?? 0) / 2 &&\n Math.abs(pos.y - (node.y ?? 0)) > (node.height ?? 0) / 2 - ry))\n ) {\n let y = ry * ry * (1 - (x * x) / (rx * rx));\n if (y > 0) {\n y = Math.sqrt(y);\n }\n y = ry - y;\n if (point.y - (node.y ?? 0) > 0) {\n y = -y;\n }\n\n pos.y += y;\n }\n\n return pos;\n };\n\n return shapeSvg;\n}\n", "import {\n labelHelper,\n updateNodeBounds,\n getNodeClasses,\n generateFullSineWavePoints,\n} from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport rough from 'roughjs';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function linedWaveEdgedRect(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const waveAmplitude = h / 4;\n const finalH = h + waveAmplitude;\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const points = [\n { x: -w / 2 - (w / 2) * 0.1, y: -finalH / 2 },\n { x: -w / 2 - (w / 2) * 0.1, y: finalH / 2 },\n ...generateFullSineWavePoints(\n -w / 2 - (w / 2) * 0.1,\n finalH / 2,\n w / 2 + (w / 2) * 0.1,\n finalH / 2,\n waveAmplitude,\n 0.8\n ),\n { x: w / 2 + (w / 2) * 0.1, y: -finalH / 2 },\n { x: -w / 2 - (w / 2) * 0.1, y: -finalH / 2 },\n { x: -w / 2, y: -finalH / 2 },\n { x: -w / 2, y: (finalH / 2) * 1.1 },\n { x: -w / 2, y: -finalH / 2 },\n ];\n\n const poly = rc.polygon(\n points.map((p) => [p.x, p.y]),\n options\n );\n\n const waveEdgeRect = shapeSvg.insert(() => poly, ':first-child');\n\n waveEdgeRect.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n waveEdgeRect.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n waveEdgeRect.selectAll('path').attr('style', nodeStyles);\n }\n\n waveEdgeRect.attr('transform', `translate(0,${-waveAmplitude / 2})`);\n label.attr(\n 'transform',\n `translate(${-w / 2 + (node.padding ?? 0) + ((w / 2) * 0.1) / 2 - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) - waveAmplitude / 2 - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, waveEdgeRect);\n node.intersect = function (point) {\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, getNodeClasses, updateNodeBounds, createPathFromPoints } from './util.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport intersect from '../intersect/index.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function multiRect(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const rectOffset = 5;\n const x = -w / 2;\n const y = -h / 2;\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n const outerPathPoints = [\n { x: x - rectOffset, y: y + rectOffset },\n { x: x - rectOffset, y: y + h + rectOffset },\n { x: x + w - rectOffset, y: y + h + rectOffset },\n { x: x + w - rectOffset, y: y + h },\n { x: x + w, y: y + h },\n { x: x + w, y: y + h - rectOffset },\n { x: x + w + rectOffset, y: y + h - rectOffset },\n { x: x + w + rectOffset, y: y - rectOffset },\n { x: x + rectOffset, y: y - rectOffset },\n { x: x + rectOffset, y: y },\n { x, y },\n { x, y: y + rectOffset },\n ];\n\n const innerPathPoints = [\n { x, y: y + rectOffset },\n { x: x + w - rectOffset, y: y + rectOffset },\n { x: x + w - rectOffset, y: y + h },\n { x: x + w, y: y + h },\n { x: x + w, y },\n { x, y },\n ];\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const outerPath = createPathFromPoints(outerPathPoints);\n const outerNode = rc.path(outerPath, options);\n const innerPath = createPathFromPoints(innerPathPoints);\n const innerNode = rc.path(innerPath, { ...options, fill: 'none' });\n\n const multiRect = shapeSvg.insert(() => innerNode, ':first-child');\n multiRect.insert(() => outerNode, ':first-child');\n\n multiRect.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n multiRect.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n multiRect.selectAll('path').attr('style', nodeStyles);\n }\n\n label.attr(\n 'transform',\n `translate(${-(bbox.width / 2) - rectOffset - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) + rectOffset - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, multiRect);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, outerPathPoints, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import {\n labelHelper,\n updateNodeBounds,\n getNodeClasses,\n createPathFromPoints,\n generateFullSineWavePoints,\n} from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport rough from 'roughjs';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function multiWaveEdgedRectangle(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const waveAmplitude = h / 4;\n const finalH = h + waveAmplitude;\n const x = -w / 2;\n const y = -finalH / 2;\n const rectOffset = 5;\n\n const { cssStyles } = node;\n\n const wavePoints = generateFullSineWavePoints(\n x - rectOffset,\n y + finalH + rectOffset,\n x + w - rectOffset,\n y + finalH + rectOffset,\n waveAmplitude,\n 0.8\n );\n\n const lastWavePoint = wavePoints?.[wavePoints.length - 1];\n\n const outerPathPoints = [\n { x: x - rectOffset, y: y + rectOffset },\n { x: x - rectOffset, y: y + finalH + rectOffset },\n ...wavePoints,\n { x: x + w - rectOffset, y: lastWavePoint.y - rectOffset },\n { x: x + w, y: lastWavePoint.y - rectOffset },\n { x: x + w, y: lastWavePoint.y - 2 * rectOffset },\n { x: x + w + rectOffset, y: lastWavePoint.y - 2 * rectOffset },\n { x: x + w + rectOffset, y: y - rectOffset },\n { x: x + rectOffset, y: y - rectOffset },\n { x: x + rectOffset, y: y },\n { x, y },\n { x, y: y + rectOffset },\n ];\n\n const innerPathPoints = [\n { x, y: y + rectOffset },\n { x: x + w - rectOffset, y: y + rectOffset },\n { x: x + w - rectOffset, y: lastWavePoint.y - rectOffset },\n { x: x + w, y: lastWavePoint.y - rectOffset },\n { x: x + w, y },\n { x, y },\n ];\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const outerPath = createPathFromPoints(outerPathPoints);\n const outerNode = rc.path(outerPath, options);\n const innerPath = createPathFromPoints(innerPathPoints);\n const innerNode = rc.path(innerPath, options);\n\n const shape = shapeSvg.insert(() => outerNode, ':first-child');\n shape.insert(() => innerNode);\n\n shape.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n shape.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n shape.selectAll('path').attr('style', nodeStyles);\n }\n\n shape.attr('transform', `translate(0,${-waveAmplitude / 2})`);\n\n label.attr(\n 'transform',\n `translate(${-(bbox.width / 2) - rectOffset - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) + rectOffset - waveAmplitude / 2 - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, shape);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, outerPathPoints, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import rough from 'roughjs';\nimport type { Node, ShapeRenderOptions } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { getNodeClasses, labelHelper, updateNodeBounds } from './util.js';\nimport type { D3Selection } from '../../../types.js';\nimport { getConfig } from '../../../config.js';\n\nexport async function note(\n parent: D3Selection,\n node: Node,\n { config: { themeVariables } }: ShapeRenderOptions\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const useHtmlLabels = node.useHtmlLabels || getConfig().flowchart?.htmlLabels !== false;\n if (!useHtmlLabels) {\n node.centerLabel = true;\n }\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const totalWidth = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const totalHeight = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const x = -totalWidth / 2;\n const y = -totalHeight / 2;\n const { cssStyles } = node;\n\n // add the rect\n // @ts-ignore TODO: Fix rough typings\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {\n fill: themeVariables.noteBkgColor,\n stroke: themeVariables.noteBorderColor,\n });\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const noteShapeNode = rc.rectangle(x, y, totalWidth, totalHeight, options);\n\n const rect = shapeSvg.insert(() => noteShapeNode, ':first-child');\n rect.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n rect.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n rect.selectAll('path').attr('style', nodeStyles);\n }\n\n label.attr(\n 'transform',\n `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport { insertPolygonShape } from './insertPolygonShape.js';\nimport type { D3Selection } from '../../../types.js';\nimport type { Bounds, Point } from '../../../types.js';\n\nexport const createDecisionBoxPathD = (x: number, y: number, size: number): string => {\n return [\n `M${x + size / 2},${y}`,\n `L${x + size},${y - size / 2}`,\n `L${x + size / 2},${y - size}`,\n `L${x},${y - size / 2}`,\n 'Z',\n ].join(' ');\n};\n\nexport async function question(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const s = w + h;\n const adjustment = 0.5;\n\n const points = [\n { x: s / 2, y: 0 },\n { x: s, y: -s / 2 },\n { x: s / 2, y: -s },\n { x: 0, y: -s / 2 },\n ];\n\n let polygon: typeof shapeSvg | ReturnType;\n const { cssStyles } = node;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n const pathData = createDecisionBoxPathD(0, 0, s);\n const roughNode = rc.path(pathData, options);\n\n polygon = shapeSvg\n .insert(() => roughNode, ':first-child')\n .attr('transform', `translate(${-s / 2 + adjustment}, ${s / 2})`);\n\n if (cssStyles) {\n polygon.attr('style', cssStyles);\n }\n } else {\n polygon = insertPolygonShape(shapeSvg, s, s, points);\n polygon.attr('transform', `translate(${-s / 2 + adjustment}, ${s / 2})`);\n }\n\n if (nodeStyles) {\n polygon.attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, polygon);\n node.calcIntersect = function (bounds: Bounds, point: Point) {\n const s = bounds.width;\n\n // Define polygon points\n const points = [\n { x: s / 2, y: 0 },\n { x: s, y: -s / 2 },\n { x: s / 2, y: -s },\n { x: 0, y: -s / 2 },\n ];\n\n // Calculate the intersection point\n const res = intersect.polygon(bounds, points, point);\n\n return { x: res.x - 0.5, y: res.y - 0.5 }; // Adjusted result\n };\n\n node.intersect = function (point) {\n // @ts-ignore TODO fix this (KNSV)\n return this.calcIntersect(node as Bounds, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function rect_left_inv_arrow(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n\n const w = Math.max(bbox.width + (node.padding ?? 0), node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0), node?.height ?? 0);\n\n const x = -w / 2;\n const y = -h / 2;\n const notch = y / 2;\n\n const points = [\n { x: x + notch, y },\n { x: x, y: 0 },\n { x: x + notch, y: -y },\n { x: -x, y: -y },\n { x: -x, y },\n ];\n\n const { cssStyles } = node;\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const pathData = createPathFromPoints(points);\n const roughNode = rc.path(pathData, options);\n\n const polygon = shapeSvg.insert(() => roughNode, ':first-child');\n\n polygon.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n polygon.selectAll('path').attr('style', cssStyles);\n }\n if (nodeStyles && node.look !== 'handDrawn') {\n polygon.selectAll('path').attr('style', nodeStyles);\n }\n\n polygon.attr('transform', `translate(${-notch / 2},0)`);\n\n label.attr(\n 'transform',\n `translate(${-notch / 2 - bbox.width / 2 - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) - (bbox.y - (bbox.top ?? 0))})`\n );\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n}\n", "import type { Node } from '../../types.js';\nimport { select } from 'd3';\nimport { evaluate } from '../../../diagrams/common/common.js';\nimport { updateNodeBounds } from './util.js';\nimport createLabel from '../createLabel.js';\nimport intersect from '../intersect/index.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport { getConfig } from '../../../diagram-api/diagramAPI.js';\nimport { createRoundedRectPathD } from './roundedRectPath.js';\nimport { log } from '../../../logger.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function rectWithTitle(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n let classes;\n if (!node.cssClasses) {\n classes = 'node default';\n } else {\n classes = 'node ' + node.cssClasses;\n }\n\n // Add outer g element\n const shapeSvg = parent\n // @ts-ignore - d3 typings are not correct\n .insert('g')\n .attr('class', classes)\n .attr('id', node.domId || node.id);\n\n // Create the title label and insert it after the rect\n const g = shapeSvg.insert('g');\n\n const label = shapeSvg.insert('g').attr('class', 'label').attr('style', nodeStyles);\n\n const description = node.description;\n\n const title = node.label;\n\n const text = label.node()!.appendChild(await createLabel(title, node.labelStyle, true, true));\n let bbox = { width: 0, height: 0 };\n if (evaluate(getConfig()?.flowchart?.htmlLabels)) {\n const div = text.children[0];\n const dv = select(text);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n log.info('Text 2', description);\n const textRows = description || [];\n const titleBox = text.getBBox();\n const descr = label\n .node()!\n .appendChild(\n await createLabel(\n textRows.join ? textRows.join('
') : textRows,\n node.labelStyle,\n true,\n true\n )\n );\n\n //if (evaluate(getConfig()?.flowchart?.htmlLabels)) {\n const div = descr.children[0];\n const dv = select(descr);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n // }\n\n const halfPadding = (node.padding || 0) / 2;\n select(descr).attr(\n 'transform',\n 'translate( ' +\n (bbox.width > titleBox.width ? 0 : (titleBox.width - bbox.width) / 2) +\n ', ' +\n (titleBox.height + halfPadding + 5) +\n ')'\n );\n select(text).attr(\n 'transform',\n 'translate( ' +\n (bbox.width < titleBox.width ? 0 : -(titleBox.width - bbox.width) / 2) +\n ', ' +\n 0 +\n ')'\n );\n // Get the size of the label\n\n // Bounding box for title and text\n bbox = label.node()!.getBBox();\n\n // Center the label\n label.attr(\n 'transform',\n 'translate(' + -bbox.width / 2 + ', ' + (-bbox.height / 2 - halfPadding + 3) + ')'\n );\n\n const totalWidth = bbox.width + (node.padding || 0);\n const totalHeight = bbox.height + (node.padding || 0);\n const x = -bbox.width / 2 - halfPadding;\n const y = -bbox.height / 2 - halfPadding;\n let rect;\n let innerLine;\n if (node.look === 'handDrawn') {\n // @ts-ignore No typings for rough\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n const roughNode = rc.path(\n createRoundedRectPathD(x, y, totalWidth, totalHeight, node.rx || 0),\n options\n );\n\n const roughLine = rc.line(\n -bbox.width / 2 - halfPadding,\n -bbox.height / 2 - halfPadding + titleBox.height + halfPadding,\n bbox.width / 2 + halfPadding,\n -bbox.height / 2 - halfPadding + titleBox.height + halfPadding,\n options\n );\n\n innerLine = shapeSvg.insert(() => {\n log.debug('Rough node insert CXC', roughNode);\n return roughLine;\n }, ':first-child');\n rect = shapeSvg.insert(() => {\n log.debug('Rough node insert CXC', roughNode);\n return roughNode;\n }, ':first-child');\n } else {\n rect = g.insert('rect', ':first-child');\n innerLine = g.insert('line');\n rect\n .attr('class', 'outer title-state')\n .attr('style', nodeStyles)\n .attr('x', -bbox.width / 2 - halfPadding)\n .attr('y', -bbox.height / 2 - halfPadding)\n .attr('width', bbox.width + (node.padding || 0))\n .attr('height', bbox.height + (node.padding || 0));\n\n innerLine\n .attr('class', 'divider')\n .attr('x1', -bbox.width / 2 - halfPadding)\n .attr('x2', bbox.width / 2 + halfPadding)\n .attr('y1', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding)\n .attr('y2', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding);\n }\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\n/**\n * Generates evenly spaced points along an elliptical arc connecting two points.\n *\n * @param x1 - x-coordinate of the start point of the arc\n * @param y1 - y-coordinate of the start point of the arc\n * @param x2 - x-coordinate of the end point of the arc\n * @param y2 - y-coordinate of the end point of the arc\n * @param rx - horizontal radius of the ellipse\n * @param ry - vertical radius of the ellipse\n * @param clockwise - direction of the arc; true for clockwise, false for counterclockwise\n * @returns Array of points `{ x, y }` along the elliptical arc\n *\n * @throws Error if the given radii are too small to draw an arc between the points\n */\nexport function generateArcPoints(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n rx: number,\n ry: number,\n clockwise: boolean\n) {\n const numPoints = 20;\n // Calculate midpoint\n const midX = (x1 + x2) / 2;\n const midY = (y1 + y2) / 2;\n\n // Calculate the angle of the line connecting the points\n const angle = Math.atan2(y2 - y1, x2 - x1);\n\n // Calculate transformed coordinates for the ellipse\n const dx = (x2 - x1) / 2;\n const dy = (y2 - y1) / 2;\n\n // Scale to unit circle\n const transformedX = dx / rx;\n const transformedY = dy / ry;\n\n // Calculate the distance between points on the unit circle\n const distance = Math.sqrt(transformedX ** 2 + transformedY ** 2);\n\n // Check if the ellipse can be drawn with the given radii\n if (distance > 1) {\n throw new Error('The given radii are too small to create an arc between the points.');\n }\n\n // Calculate the distance from the midpoint to the center of the ellipse\n const scaledCenterDistance = Math.sqrt(1 - distance ** 2);\n\n // Calculate the center of the ellipse\n const centerX = midX + scaledCenterDistance * ry * Math.sin(angle) * (clockwise ? -1 : 1);\n const centerY = midY - scaledCenterDistance * rx * Math.cos(angle) * (clockwise ? -1 : 1);\n\n // Calculate the start and end angles on the ellipse\n const startAngle = Math.atan2((y1 - centerY) / ry, (x1 - centerX) / rx);\n const endAngle = Math.atan2((y2 - centerY) / ry, (x2 - centerX) / rx);\n\n // Adjust angles for clockwise/counterclockwise\n let angleRange = endAngle - startAngle;\n if (clockwise && angleRange < 0) {\n angleRange += 2 * Math.PI;\n }\n if (!clockwise && angleRange > 0) {\n angleRange -= 2 * Math.PI;\n }\n\n // Generate points\n const points = [];\n for (let i = 0; i < numPoints; i++) {\n const t = i / (numPoints - 1);\n const angle = startAngle + t * angleRange;\n const x = centerX + rx * Math.cos(angle);\n const y = centerY + ry * Math.sin(angle);\n points.push({ x, y });\n }\n\n return points;\n}\n\nexport async function roundedRect(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n\n const labelPaddingX = node?.padding ?? 0;\n const labelPaddingY = node?.padding ?? 0;\n\n const w = (node?.width ? node?.width : bbox.width) + labelPaddingX * 2;\n const h = (node?.height ? node?.height : bbox.height) + labelPaddingY * 2;\n const radius = node.radius || 5;\n const taper = node.taper || 5; // Taper width for the rounded corners\n const { cssStyles } = node;\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n if (node.stroke) {\n options.stroke = node.stroke;\n }\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n const points = [\n // Top edge (left to right)\n { x: -w / 2 + taper, y: -h / 2 }, // Top-left corner start (1)\n { x: w / 2 - taper, y: -h / 2 }, // Top-right corner start (2)\n\n ...generateArcPoints(w / 2 - taper, -h / 2, w / 2, -h / 2 + taper, radius, radius, true), // Top-left arc (2 to 3)\n\n // Right edge (top to bottom)\n { x: w / 2, y: -h / 2 + taper }, // Top-right taper point (3)\n { x: w / 2, y: h / 2 - taper }, // Bottom-right taper point (4)\n\n ...generateArcPoints(w / 2, h / 2 - taper, w / 2 - taper, h / 2, radius, radius, true), // Top-left arc (4 to 5)\n\n // Bottom edge (right to left)\n { x: w / 2 - taper, y: h / 2 }, // Bottom-right corner start (5)\n { x: -w / 2 + taper, y: h / 2 }, // Bottom-left corner start (6)\n\n ...generateArcPoints(-w / 2 + taper, h / 2, -w / 2, h / 2 - taper, radius, radius, true), // Top-left arc (4 to 5)\n\n // Left edge (bottom to top)\n { x: -w / 2, y: h / 2 - taper }, // Bottom-left taper point (7)\n { x: -w / 2, y: -h / 2 + taper }, // Top-left taper point (8)\n ...generateArcPoints(-w / 2, -h / 2 + taper, -w / 2 + taper, -h / 2, radius, radius, true), // Top-left arc (4 to 5)\n ];\n\n const pathData = createPathFromPoints(points);\n const shapeNode = rc.path(pathData, options);\n\n const polygon = shapeSvg.insert(() => shapeNode, ':first-child');\n polygon.attr('class', 'basic label-container outer-path');\n\n if (cssStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\nimport { handleUndefinedAttr } from '../../../utils.js';\n\nexport async function shadedProcess(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const halfPadding = node?.padding ?? 0;\n const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const x = -bbox.width / 2 - halfPadding;\n const y = -bbox.height / 2 - halfPadding;\n\n const { cssStyles } = node;\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const points = [\n { x, y },\n { x: x + w + 8, y },\n { x: x + w + 8, y: y + h },\n { x: x - 8, y: y + h },\n { x: x - 8, y: y },\n { x, y },\n { x, y: y + h },\n ];\n\n const roughNode = rc.polygon(\n points.map((p) => [p.x, p.y]),\n options\n );\n\n const rect = shapeSvg.insert(() => roughNode, ':first-child');\n\n rect.attr('class', 'basic label-container').attr('style', handleUndefinedAttr(cssStyles));\n\n if (nodeStyles && node.look !== 'handDrawn') {\n rect.selectAll('path').attr('style', nodeStyles);\n }\n\n if (cssStyles && node.look !== 'handDrawn') {\n rect.selectAll('path').attr('style', nodeStyles);\n }\n\n label.attr(\n 'transform',\n `translate(${-w / 2 + 4 + (node.padding ?? 0) - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function slopedRect(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const x = -w / 2;\n const y = -h / 2;\n\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const points = [\n { x, y },\n { x, y: y + h },\n { x: x + w, y: y + h },\n { x: x + w, y: y - h / 2 },\n ];\n\n const pathData = createPathFromPoints(points);\n const shapeNode = rc.path(pathData, options);\n\n const polygon = shapeSvg.insert(() => shapeNode, ':first-child');\n polygon.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', nodeStyles);\n }\n\n polygon.attr('transform', `translate(0, ${h / 4})`);\n label.attr(\n 'transform',\n `translate(${-w / 2 + (node.padding ?? 0) - (bbox.x - (bbox.left ?? 0))}, ${-h / 4 + (node.padding ?? 0) - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import type { Node, RectOptions } from '../../types.js';\nimport type { D3Selection } from '../../../types.js';\nimport { drawRect } from './drawRect.js';\n\nexport async function squareRect(parent: D3Selection, node: Node) {\n const options = {\n rx: 0,\n ry: 0,\n classes: '',\n labelPaddingX: node.labelPaddingX ?? (node?.padding || 0) * 2,\n labelPaddingY: (node?.padding || 0) * 1,\n } as RectOptions;\n return drawRect(parent, node, options);\n}\n", "import {\n labelHelper,\n updateNodeBounds,\n getNodeClasses,\n generateCirclePoints,\n createPathFromPoints,\n} from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nexport const createStadiumPathD = (\n x: number,\n y: number,\n totalWidth: number,\n totalHeight: number\n) => {\n const radius = totalHeight / 2;\n return [\n 'M',\n x + radius,\n y, // Move to the start of the top-left arc\n 'H',\n x + totalWidth - radius, // Draw horizontal line to the start of the top-right arc\n 'A',\n radius,\n radius,\n 0,\n 0,\n 1,\n x + totalWidth,\n y + radius, // Draw top-right arc\n 'H',\n x, // Draw horizontal line to the start of the bottom-right arc\n 'A',\n radius,\n radius,\n 0,\n 0,\n 1,\n x + totalWidth - radius,\n y + totalHeight, // Draw bottom-right arc\n 'H',\n x + radius, // Draw horizontal line to the start of the bottom-left arc\n 'A',\n radius,\n radius,\n 0,\n 0,\n 1,\n x,\n y + radius, // Draw bottom-left arc\n 'Z', // Close the path\n ].join(' ');\n};\n\nexport async function stadium(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n\n const h = bbox.height + node.padding;\n const w = bbox.width + h / 4 + node.padding;\n\n const radius = h / 2;\n const { cssStyles } = node;\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const points = [\n { x: -w / 2 + radius, y: -h / 2 },\n { x: w / 2 - radius, y: -h / 2 },\n ...generateCirclePoints(-w / 2 + radius, 0, radius, 50, 90, 270),\n { x: w / 2 - radius, y: h / 2 },\n ...generateCirclePoints(w / 2 - radius, 0, radius, 50, 270, 450),\n ];\n\n const pathData = createPathFromPoints(points);\n const shapeNode = rc.path(pathData, options);\n\n const polygon = shapeSvg.insert(() => shapeNode, ':first-child');\n polygon.attr('class', 'basic label-container outer-path');\n\n if (cssStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import type { Node, RectOptions } from '../../types.js';\nimport type { D3Selection } from '../../../types.js';\nimport { drawRect } from './drawRect.js';\n\nexport async function state(parent: D3Selection, node: Node) {\n const options = {\n rx: 5,\n ry: 5,\n classes: 'flowchart-node',\n } as RectOptions;\n return drawRect(parent, node, options);\n}\n", "import rough from 'roughjs';\nimport type { Node, ShapeRenderOptions } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { updateNodeBounds } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport function stateEnd(\n parent: D3Selection,\n node: Node,\n { config: { themeVariables } }: ShapeRenderOptions\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { cssStyles } = node;\n const { lineColor, stateBorder, nodeBorder } = themeVariables;\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n\n // @ts-ignore TODO: Fix rough typings\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const roughNode = rc.circle(0, 0, 14, {\n ...options,\n stroke: lineColor,\n strokeWidth: 2,\n });\n const innerFill = stateBorder ?? nodeBorder;\n const roughInnerNode = rc.circle(0, 0, 5, {\n ...options,\n fill: innerFill,\n stroke: innerFill,\n strokeWidth: 2,\n fillStyle: 'solid',\n });\n const circle = shapeSvg.insert(() => roughNode, ':first-child');\n circle.insert(() => roughInnerNode);\n\n if (cssStyles) {\n circle.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles) {\n circle.selectAll('path').attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, circle);\n\n node.intersect = function (point) {\n return intersect.circle(node, 7, point);\n };\n\n return shapeSvg;\n}\n", "import rough from 'roughjs';\nimport type { Node, ShapeRenderOptions } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { solidStateFill } from './handDrawnShapeStyles.js';\nimport { updateNodeBounds } from './util.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport function stateStart(\n parent: D3Selection,\n node: Node,\n { config: { themeVariables } }: ShapeRenderOptions\n) {\n const { lineColor } = themeVariables;\n\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n\n let circle: D3Selection | D3Selection;\n if (node.look === 'handDrawn') {\n // @ts-ignore TODO: Fix rough typings\n const rc = rough.svg(shapeSvg);\n const roughNode = rc.circle(0, 0, 14, solidStateFill(lineColor));\n circle = shapeSvg.insert(() => roughNode);\n // center the circle around its coordinate\n circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);\n } else {\n circle = shapeSvg.insert('circle', ':first-child');\n // center the circle around its coordinate\n circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);\n }\n\n updateNodeBounds(node, circle);\n\n node.intersect = function (point) {\n return intersect.circle(node, 7, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport { insertPolygonShape } from './insertPolygonShape.js';\nimport type { D3Selection } from '../../../types.js';\nimport { handleUndefinedAttr } from '../../../utils.js';\n\nexport const createSubroutinePathD = (\n x: number,\n y: number,\n width: number,\n height: number\n): string => {\n const offset = 8;\n return [\n `M${x - offset},${y}`,\n `H${x + width + offset}`,\n `V${y + height}`,\n `H${x - offset}`,\n `V${y}`,\n 'M',\n x,\n y,\n 'H',\n x + width,\n 'V',\n y + height,\n 'H',\n x,\n 'Z',\n ].join(' ');\n};\n\nexport async function subroutine(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n const halfPadding = (node?.padding || 0) / 2;\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const x = -bbox.width / 2 - halfPadding;\n const y = -bbox.height / 2 - halfPadding;\n\n const points = [\n { x: 0, y: 0 },\n { x: w, y: 0 },\n { x: w, y: -h },\n { x: 0, y: -h },\n { x: 0, y: 0 },\n { x: -8, y: 0 },\n { x: w + 8, y: 0 },\n { x: w + 8, y: -h },\n { x: -8, y: -h },\n { x: -8, y: 0 },\n ];\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n const roughNode = rc.rectangle(x - 8, y, w + 16, h, options);\n const l1 = rc.line(x, y, x, y + h, options);\n const l2 = rc.line(x + w, y, x + w, y + h, options);\n\n shapeSvg.insert(() => l1, ':first-child');\n shapeSvg.insert(() => l2, ':first-child');\n const rect = shapeSvg.insert(() => roughNode, ':first-child');\n const { cssStyles } = node;\n rect.attr('class', 'basic label-container').attr('style', handleUndefinedAttr(cssStyles));\n updateNodeBounds(node, rect);\n } else {\n const el = insertPolygonShape(shapeSvg, w, h, points);\n if (nodeStyles) {\n el.attr('style', nodeStyles);\n }\n updateNodeBounds(node, el);\n }\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, getNodeClasses, updateNodeBounds, createPathFromPoints } from './util.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport intersect from '../intersect/index.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function taggedRect(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const x = -w / 2;\n const y = -h / 2;\n const tagWidth = 0.2 * h;\n const tagHeight = 0.2 * h;\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n const rectPoints = [\n { x: x - tagWidth / 2, y },\n { x: x + w + tagWidth / 2, y },\n { x: x + w + tagWidth / 2, y: y + h },\n { x: x - tagWidth / 2, y: y + h },\n ];\n\n const tagPoints = [\n { x: x + w - tagWidth / 2, y: y + h },\n { x: x + w + tagWidth / 2, y: y + h },\n { x: x + w + tagWidth / 2, y: y + h - tagHeight },\n ];\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const rectPath = createPathFromPoints(rectPoints);\n const rectNode = rc.path(rectPath, options);\n\n const tagPath = createPathFromPoints(tagPoints);\n const tagNode = rc.path(tagPath, { ...options, fillStyle: 'solid' });\n\n const taggedRect = shapeSvg.insert(() => tagNode, ':first-child');\n taggedRect.insert(() => rectNode, ':first-child');\n\n taggedRect.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n taggedRect.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n taggedRect.selectAll('path').attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, taggedRect);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, rectPoints, point);\n\n return pos;\n };\n\n return shapeSvg;\n}\n", "import {\n labelHelper,\n updateNodeBounds,\n getNodeClasses,\n generateFullSineWavePoints,\n createPathFromPoints,\n} from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport rough from 'roughjs';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function taggedWaveEdgedRectangle(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const waveAmplitude = h / 4;\n const tagWidth = 0.2 * w;\n const tagHeight = 0.2 * h;\n const finalH = h + waveAmplitude;\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const points = [\n { x: -w / 2 - (w / 2) * 0.1, y: finalH / 2 },\n ...generateFullSineWavePoints(\n -w / 2 - (w / 2) * 0.1,\n finalH / 2,\n w / 2 + (w / 2) * 0.1,\n finalH / 2,\n waveAmplitude,\n 0.8\n ),\n\n { x: w / 2 + (w / 2) * 0.1, y: -finalH / 2 },\n { x: -w / 2 - (w / 2) * 0.1, y: -finalH / 2 },\n ];\n\n const x = -w / 2 + (w / 2) * 0.1;\n const y = -finalH / 2 - tagHeight * 0.4;\n\n const tagPoints = [\n { x: x + w - tagWidth, y: (y + h) * 1.4 },\n { x: x + w, y: y + h - tagHeight },\n { x: x + w, y: (y + h) * 0.9 },\n ...generateFullSineWavePoints(\n x + w,\n (y + h) * 1.3,\n x + w - tagWidth,\n (y + h) * 1.5,\n -h * 0.03,\n 0.5\n ),\n ];\n\n const waveEdgeRectPath = createPathFromPoints(points);\n const waveEdgeRectNode = rc.path(waveEdgeRectPath, options);\n\n const taggedWaveEdgeRectPath = createPathFromPoints(tagPoints);\n const taggedWaveEdgeRectNode = rc.path(taggedWaveEdgeRectPath, {\n ...options,\n fillStyle: 'solid',\n });\n\n const waveEdgeRect = shapeSvg.insert(() => taggedWaveEdgeRectNode, ':first-child');\n waveEdgeRect.insert(() => waveEdgeRectNode, ':first-child');\n\n waveEdgeRect.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n waveEdgeRect.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n waveEdgeRect.selectAll('path').attr('style', nodeStyles);\n }\n\n waveEdgeRect.attr('transform', `translate(0,${-waveAmplitude / 2})`);\n label.attr(\n 'transform',\n `translate(${-w / 2 + (node.padding ?? 0) - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) - waveAmplitude / 2 - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, waveEdgeRect);\n node.intersect = function (point) {\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String } from './handDrawnShapeStyles.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function text(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n\n const totalWidth = Math.max(bbox.width + node.padding, node?.width || 0);\n const totalHeight = Math.max(bbox.height + node.padding, node?.height || 0);\n const x = -totalWidth / 2;\n const y = -totalHeight / 2;\n\n const rect = shapeSvg.insert('rect', ':first-child');\n\n rect\n .attr('class', 'text')\n .attr('style', nodeStyles)\n .attr('rx', 0)\n .attr('ry', 0)\n .attr('x', x)\n .attr('y', y)\n .attr('width', totalWidth)\n .attr('height', totalHeight);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, getNodeClasses, updateNodeBounds } from './util.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport intersect from '../intersect/index.js';\nimport type { D3Selection } from '../../../types.js';\nimport { handleUndefinedAttr } from '../../../utils.js';\n\nexport const createCylinderPathD = (\n x: number,\n y: number,\n width: number,\n height: number,\n rx: number,\n ry: number\n): string => {\n return `M${x},${y}\n a${rx},${ry} 0,0,1 ${0},${-height}\n l${width},${0}\n a${rx},${ry} 0,0,1 ${0},${height}\n M${width},${-height}\n a${rx},${ry} 0,0,0 ${0},${height}\n l${-width},${0}`;\n};\n\nexport const createOuterCylinderPathD = (\n x: number,\n y: number,\n width: number,\n height: number,\n rx: number,\n ry: number\n): string => {\n return [\n `M${x},${y}`,\n `M${x + width},${y}`,\n `a${rx},${ry} 0,0,0 ${0},${-height}`,\n `l${-width},0`,\n `a${rx},${ry} 0,0,0 ${0},${height}`,\n `l${width},0`,\n ].join(' ');\n};\nexport const createInnerCylinderPathD = (\n x: number,\n y: number,\n width: number,\n height: number,\n rx: number,\n ry: number\n): string => {\n return [`M${x + width / 2},${-height / 2}`, `a${rx},${ry} 0,0,0 0,${height}`].join(' ');\n};\n\nexport async function tiltedCylinder(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label, halfPadding } = await labelHelper(\n parent,\n node,\n getNodeClasses(node)\n );\n const labelPadding = node.look === 'neo' ? halfPadding * 2 : halfPadding;\n const h = bbox.height + labelPadding;\n const ry = h / 2;\n const rx = ry / (2.5 + h / 50);\n const w = bbox.width + rx + labelPadding;\n const { cssStyles } = node;\n\n let cylinder: D3Selection | D3Selection;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const outerPathData = createOuterCylinderPathD(0, 0, w, h, rx, ry);\n const innerPathData = createInnerCylinderPathD(0, 0, w, h, rx, ry);\n const outerNode = rc.path(outerPathData, userNodeOverrides(node, {}));\n const innerLine = rc.path(innerPathData, userNodeOverrides(node, { fill: 'none' }));\n cylinder = shapeSvg.insert(() => innerLine, ':first-child');\n cylinder = shapeSvg.insert(() => outerNode, ':first-child');\n cylinder.attr('class', 'basic label-container');\n if (cssStyles) {\n cylinder.attr('style', cssStyles);\n }\n } else {\n const pathData = createCylinderPathD(0, 0, w, h, rx, ry);\n cylinder = shapeSvg\n .insert('path', ':first-child')\n .attr('d', pathData)\n .attr('class', 'basic label-container')\n .attr('style', handleUndefinedAttr(cssStyles))\n .attr('style', nodeStyles);\n cylinder.attr('class', 'basic label-container');\n\n if (cssStyles) {\n cylinder.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles) {\n cylinder.selectAll('path').attr('style', nodeStyles);\n }\n }\n\n cylinder.attr('label-offset-x', rx);\n cylinder.attr('transform', `translate(${-w / 2}, ${h / 2} )`);\n\n label.attr(\n 'transform',\n `translate(${-(bbox.width / 2) - rx - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, cylinder);\n\n node.intersect = function (point) {\n const pos = intersect.rect(node, point);\n const y = pos.y - (node.y ?? 0);\n\n if (\n ry != 0 &&\n (Math.abs(y) < (node.height ?? 0) / 2 ||\n (Math.abs(y) == (node.height ?? 0) / 2 &&\n Math.abs(pos.x - (node.x ?? 0)) > (node.width ?? 0) / 2 - rx))\n ) {\n let x = rx * rx * (1 - (y * y) / (ry * ry));\n if (x != 0) {\n x = Math.sqrt(Math.abs(x));\n }\n x = rx - x;\n if (point.x - (node.x ?? 0) > 0) {\n x = -x;\n }\n\n pos.x += x;\n }\n\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport { insertPolygonShape } from './insertPolygonShape.js';\nimport type { D3Selection } from '../../../types.js';\n\n// export const createTrapezoidPathD = (\n// x: number,\n// y: number,\n// width: number,\n// height: number\n// ): string => {\n// return [\n// `M${x - (2 * height) / 6},${y}`,\n// `L${x + width + (2 * height) / 6},${y}`,\n// `L${x + width - height / 6},${y - height}`,\n// `L${x + height / 6},${y - height}`,\n// 'Z',\n// ].join(' ');\n// };\n\nexport async function trapezoid(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: (-3 * h) / 6, y: 0 },\n { x: w + (3 * h) / 6, y: 0 },\n { x: w, y: -h },\n { x: 0, y: -h },\n ];\n\n let polygon: typeof shapeSvg | ReturnType;\n const { cssStyles } = node;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n const pathData = createPathFromPoints(points);\n const roughNode = rc.path(pathData, options);\n\n polygon = shapeSvg\n .insert(() => roughNode, ':first-child')\n .attr('transform', `translate(${-w / 2}, ${h / 2})`);\n\n if (cssStyles) {\n polygon.attr('style', cssStyles);\n }\n } else {\n polygon = insertPolygonShape(shapeSvg, w, h, points);\n }\n\n if (nodeStyles) {\n polygon.attr('style', nodeStyles);\n }\n\n node.width = w;\n node.height = h;\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function trapezoidalPentagon(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n const minWidth = 60,\n minHeight = 20;\n const w = Math.max(minWidth, bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(minHeight, bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n\n const { cssStyles } = node;\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const points = [\n { x: (-w / 2) * 0.8, y: -h / 2 },\n { x: (w / 2) * 0.8, y: -h / 2 },\n { x: w / 2, y: (-h / 2) * 0.6 },\n { x: w / 2, y: h / 2 },\n { x: -w / 2, y: h / 2 },\n { x: -w / 2, y: (-h / 2) * 0.6 },\n ];\n\n const pathData = createPathFromPoints(points);\n const shapeNode = rc.path(pathData, options);\n\n const polygon = shapeSvg.insert(() => shapeNode, ':first-child');\n polygon.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, polygon);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { log } from '../../../logger.js';\nimport { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport { createPathFromPoints } from './util.js';\nimport { evaluate } from '../../../diagrams/common/common.js';\nimport { getConfig } from '../../../diagram-api/diagramAPI.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function triangle(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const useHtmlLabels = evaluate(getConfig().flowchart?.htmlLabels);\n\n const w = bbox.width + (node.padding ?? 0);\n const h = w + bbox.height;\n\n const tw = w + bbox.height;\n const points = [\n { x: 0, y: 0 },\n { x: tw, y: 0 },\n { x: tw / 2, y: -h },\n ];\n\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n const pathData = createPathFromPoints(points);\n const roughNode = rc.path(pathData, options);\n\n const polygon = shapeSvg\n .insert(() => roughNode, ':first-child')\n .attr('transform', `translate(${-h / 2}, ${h / 2})`);\n\n if (cssStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n polygon.selectChildren('path').attr('style', nodeStyles);\n }\n\n node.width = w;\n node.height = h;\n\n updateNodeBounds(node, polygon);\n\n label.attr(\n 'transform',\n `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))}, ${h / 2 - (bbox.height + (node.padding ?? 0) / (useHtmlLabels ? 2 : 1) - (bbox.y - (bbox.top ?? 0)))})`\n );\n\n node.intersect = function (point) {\n log.info('Triangle intersect', node, points, point);\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n}\n", "import {\n labelHelper,\n updateNodeBounds,\n getNodeClasses,\n generateFullSineWavePoints,\n createPathFromPoints,\n} from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport rough from 'roughjs';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function waveEdgedRectangle(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const waveAmplitude = h / 8;\n const finalH = h + waveAmplitude;\n const { cssStyles } = node;\n\n // To maintain minimum width\n const minWidth = 70;\n const widthDif = minWidth - w;\n const extraW = widthDif > 0 ? widthDif / 2 : 0;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const points = [\n { x: -w / 2 - extraW, y: finalH / 2 },\n ...generateFullSineWavePoints(\n -w / 2 - extraW,\n finalH / 2,\n w / 2 + extraW,\n finalH / 2,\n waveAmplitude,\n 0.8\n ),\n { x: w / 2 + extraW, y: -finalH / 2 },\n { x: -w / 2 - extraW, y: -finalH / 2 },\n ];\n\n const waveEdgeRectPath = createPathFromPoints(points);\n const waveEdgeRectNode = rc.path(waveEdgeRectPath, options);\n\n const waveEdgeRect = shapeSvg.insert(() => waveEdgeRectNode, ':first-child');\n\n waveEdgeRect.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n waveEdgeRect.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n waveEdgeRect.selectAll('path').attr('style', nodeStyles);\n }\n\n waveEdgeRect.attr('transform', `translate(0,${-waveAmplitude / 2})`);\n label.attr(\n 'transform',\n `translate(${-w / 2 + (node.padding ?? 0) - (bbox.x - (bbox.left ?? 0))},${-h / 2 + (node.padding ?? 0) - waveAmplitude - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, waveEdgeRect);\n node.intersect = function (point) {\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import {\n labelHelper,\n updateNodeBounds,\n getNodeClasses,\n createPathFromPoints,\n generateFullSineWavePoints,\n} from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function waveRectangle(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));\n\n const minWidth = 100; // Minimum width\n const minHeight = 50; // Minimum height\n\n const baseWidth = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const baseHeight = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n\n const aspectRatio = baseWidth / baseHeight;\n\n let w = baseWidth;\n let h = baseHeight;\n\n if (w > h * aspectRatio) {\n h = w / aspectRatio;\n } else {\n w = h * aspectRatio;\n }\n\n w = Math.max(w, minWidth);\n h = Math.max(h, minHeight);\n\n const waveAmplitude = Math.min(h * 0.2, h / 4);\n const finalH = h + waveAmplitude * 2;\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const points = [\n { x: -w / 2, y: finalH / 2 },\n ...generateFullSineWavePoints(-w / 2, finalH / 2, w / 2, finalH / 2, waveAmplitude, 1),\n { x: w / 2, y: -finalH / 2 },\n ...generateFullSineWavePoints(w / 2, -finalH / 2, -w / 2, -finalH / 2, waveAmplitude, -1),\n ];\n\n const waveRectPath = createPathFromPoints(points);\n const waveRectNode = rc.path(waveRectPath, options);\n\n const waveRect = shapeSvg.insert(() => waveRectNode, ':first-child');\n\n waveRect.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n waveRect.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n waveRect.selectAll('path').attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, waveRect);\n node.intersect = function (point) {\n const pos = intersect.polygon(node, points, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { labelHelper, getNodeClasses, updateNodeBounds } from './util.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport intersect from '../intersect/index.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function windowPane(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));\n const w = Math.max(bbox.width + (node.padding ?? 0) * 2, node?.width ?? 0);\n const h = Math.max(bbox.height + (node.padding ?? 0) * 2, node?.height ?? 0);\n const rectOffset = 5;\n const x = -w / 2;\n const y = -h / 2;\n const { cssStyles } = node;\n\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n const outerPathPoints = [\n { x: x - rectOffset, y: y - rectOffset },\n { x: x - rectOffset, y: y + h },\n { x: x + w, y: y + h },\n { x: x + w, y: y - rectOffset },\n ];\n\n const path = `M${x - rectOffset},${y - rectOffset} L${x + w},${y - rectOffset} L${x + w},${y + h} L${x - rectOffset},${y + h} L${x - rectOffset},${y - rectOffset}\n M${x - rectOffset},${y} L${x + w},${y}\n M${x},${y - rectOffset} L${x},${y + h}`;\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const no = rc.path(path, options);\n\n const windowPane = shapeSvg.insert(() => no, ':first-child');\n windowPane.attr('transform', `translate(${rectOffset / 2}, ${rectOffset / 2})`);\n\n windowPane.attr('class', 'basic label-container');\n\n if (cssStyles && node.look !== 'handDrawn') {\n windowPane.selectAll('path').attr('style', cssStyles);\n }\n\n if (nodeStyles && node.look !== 'handDrawn') {\n windowPane.selectAll('path').attr('style', nodeStyles);\n }\n\n label.attr(\n 'transform',\n `translate(${-(bbox.width / 2) + rectOffset / 2 - (bbox.x - (bbox.left ?? 0))}, ${-(bbox.height / 2) + rectOffset / 2 - (bbox.y - (bbox.top ?? 0))})`\n );\n\n updateNodeBounds(node, windowPane);\n\n node.intersect = function (point) {\n const pos = intersect.polygon(node, outerPathPoints, point);\n return pos;\n };\n\n return shapeSvg;\n}\n", "import { updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { userNodeOverrides, styles2String } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport { drawRect } from './drawRect.js';\nimport { getConfig } from '../../../config.js';\nimport type { EntityNode } from '../../../diagrams/er/erTypes.js';\nimport { createText } from '../../createText.js';\nimport { evaluate, parseGenericTypes } from '../../../diagrams/common/common.js';\nimport { select } from 'd3';\nimport { calculateTextWidth } from '../../../utils.js';\nimport type { MermaidConfig } from '../../../config.type.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function erBox(parent: D3Selection, node: Node) {\n // Treat node as entityNode for certain entityNode checks\n const entityNode = node as unknown as EntityNode;\n if (entityNode.alias) {\n node.label = entityNode.alias;\n }\n\n // Background shapes are drawn to fill in the background color and cover up the ER diagram edge markers.\n // Draw background shape once.\n if (node.look === 'handDrawn') {\n const { themeVariables } = getConfig();\n const { background } = themeVariables;\n const backgroundNode = {\n ...node,\n id: node.id + '-background',\n look: 'default',\n cssStyles: ['stroke: none', `fill: ${background}`],\n };\n await erBox(parent, backgroundNode);\n }\n\n const config = getConfig();\n node.useHtmlLabels = config.htmlLabels;\n let PADDING = config.er?.diagramPadding ?? 10;\n let TEXT_PADDING = config.er?.entityPadding ?? 6;\n\n const { cssStyles } = node;\n const { labelStyles, nodeStyles } = styles2String(node);\n\n // Draw rect if no attributes are found\n if (entityNode.attributes.length === 0 && node.label) {\n const options = {\n rx: 0,\n ry: 0,\n labelPaddingX: PADDING,\n labelPaddingY: PADDING * 1.5,\n classes: '',\n };\n // Set minimum width\n if (\n calculateTextWidth(node.label, config) + options.labelPaddingX * 2 <\n config.er!.minEntityWidth!\n ) {\n node.width = config.er!.minEntityWidth;\n }\n const shapeSvg = await drawRect(parent, node, options);\n\n // drawRect doesn't center non-htmlLabels correctly as of now, so translate label\n if (!evaluate(config.htmlLabels)) {\n const textElement = shapeSvg.select('text');\n const bbox = (textElement.node() as SVGTextElement)?.getBBox();\n textElement.attr('transform', `translate(${-bbox.width / 2}, 0)`);\n }\n return shapeSvg;\n }\n\n if (!config.htmlLabels) {\n PADDING *= 1.25;\n TEXT_PADDING *= 1.25;\n }\n\n let cssClasses = getNodeClasses(node);\n if (!cssClasses) {\n cssClasses = 'node default';\n }\n\n const shapeSvg = parent\n // @ts-ignore Ignore .insert on SVGAElement\n .insert('g')\n .attr('class', cssClasses)\n .attr('id', node.domId || node.id);\n\n const nameBBox = await addText(shapeSvg, node.label ?? '', config, 0, 0, ['name'], labelStyles);\n nameBBox.height += TEXT_PADDING;\n let yOffset = 0;\n const yOffsets = [];\n const rows = [];\n let maxTypeWidth = 0;\n let maxNameWidth = 0;\n let maxKeysWidth = 0;\n let maxCommentWidth = 0;\n let keysPresent = true;\n let commentPresent = true;\n for (const attribute of entityNode.attributes) {\n const typeBBox = await addText(\n shapeSvg,\n attribute.type,\n config,\n 0,\n yOffset,\n ['attribute-type'],\n labelStyles\n );\n maxTypeWidth = Math.max(maxTypeWidth, typeBBox.width + PADDING);\n const nameBBox = await addText(\n shapeSvg,\n attribute.name,\n config,\n 0,\n yOffset,\n ['attribute-name'],\n labelStyles\n );\n maxNameWidth = Math.max(maxNameWidth, nameBBox.width + PADDING);\n const keysBBox = await addText(\n shapeSvg,\n attribute.keys.join(),\n config,\n 0,\n yOffset,\n ['attribute-keys'],\n labelStyles\n );\n maxKeysWidth = Math.max(maxKeysWidth, keysBBox.width + PADDING);\n const commentBBox = await addText(\n shapeSvg,\n attribute.comment,\n config,\n 0,\n yOffset,\n ['attribute-comment'],\n labelStyles\n );\n maxCommentWidth = Math.max(maxCommentWidth, commentBBox.width + PADDING);\n\n const rowHeight =\n Math.max(typeBBox.height, nameBBox.height, keysBBox.height, commentBBox.height) +\n TEXT_PADDING;\n rows.push({ yOffset, rowHeight });\n yOffset += rowHeight;\n }\n let totalWidthSections = 4;\n\n if (maxKeysWidth <= PADDING) {\n keysPresent = false;\n maxKeysWidth = 0;\n totalWidthSections--;\n }\n if (maxCommentWidth <= PADDING) {\n commentPresent = false;\n maxCommentWidth = 0;\n totalWidthSections--;\n }\n\n const shapeBBox = shapeSvg.node()!.getBBox();\n // Add extra padding to attribute components to accommodate for difference in width\n if (\n nameBBox.width + PADDING * 2 - (maxTypeWidth + maxNameWidth + maxKeysWidth + maxCommentWidth) >\n 0\n ) {\n const difference =\n nameBBox.width + PADDING * 2 - (maxTypeWidth + maxNameWidth + maxKeysWidth + maxCommentWidth);\n maxTypeWidth += difference / totalWidthSections;\n maxNameWidth += difference / totalWidthSections;\n if (maxKeysWidth > 0) {\n maxKeysWidth += difference / totalWidthSections;\n }\n if (maxCommentWidth > 0) {\n maxCommentWidth += difference / totalWidthSections;\n }\n }\n\n const maxWidth = maxTypeWidth + maxNameWidth + maxKeysWidth + maxCommentWidth;\n\n // @ts-ignore TODO: Fix rough typings\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n let totalShapeBBoxHeight = 0;\n if (rows.length > 0) {\n totalShapeBBoxHeight = rows.reduce((sum, row) => sum + (row?.rowHeight ?? 0), 0);\n }\n const w = Math.max(shapeBBox.width + PADDING * 2, node?.width || 0, maxWidth);\n const h = Math.max((totalShapeBBoxHeight ?? 0) + nameBBox.height, node?.height || 0);\n const x = -w / 2;\n const y = -h / 2;\n\n // Translate attribute text labels\n shapeSvg.selectAll('g:not(:first-child)').each((_: any, i: number, nodes: any) => {\n const text = select(nodes[i]);\n const transform = text.attr('transform');\n let translateX = 0;\n let translateY = 0;\n\n if (transform) {\n const regex = RegExp(/translate\\(([^,]+),([^)]+)\\)/);\n const translate = regex.exec(transform);\n if (translate) {\n translateX = parseFloat(translate[1]);\n translateY = parseFloat(translate[2]);\n if (text.attr('class').includes('attribute-name')) {\n translateX += maxTypeWidth;\n } else if (text.attr('class').includes('attribute-keys')) {\n translateX += maxTypeWidth + maxNameWidth;\n } else if (text.attr('class').includes('attribute-comment')) {\n translateX += maxTypeWidth + maxNameWidth + maxKeysWidth;\n }\n }\n }\n\n text.attr(\n 'transform',\n `translate(${x + PADDING / 2 + translateX}, ${translateY + y + nameBBox.height + TEXT_PADDING / 2})`\n );\n });\n // Center the name\n shapeSvg\n .select('.name')\n .attr('transform', 'translate(' + -nameBBox.width / 2 + ', ' + (y + TEXT_PADDING / 2) + ')');\n\n // Draw shape\n const roughRect = rc.rectangle(x, y, w, h, options);\n const rect = shapeSvg.insert(() => roughRect, ':first-child').attr('style', cssStyles!.join(''));\n\n const { themeVariables } = getConfig();\n const { rowEven, rowOdd, nodeBorder } = themeVariables;\n\n yOffsets.push(0);\n // Draw row rects\n for (const [i, row] of rows.entries()) {\n const contentRowIndex = i + 1; // Adjusted index to skip the header (name) row\n const isEven = contentRowIndex % 2 === 0 && row.yOffset !== 0;\n const roughRect = rc.rectangle(x, nameBBox.height + y + row?.yOffset, w, row?.rowHeight, {\n ...options,\n fill: isEven ? rowEven : rowOdd,\n stroke: nodeBorder,\n });\n shapeSvg\n .insert(() => roughRect, 'g.label')\n .attr('style', cssStyles!.join(''))\n .attr('class', `row-rect-${isEven ? 'even' : 'odd'}`);\n }\n\n // Draw divider lines\n // Name line\n let roughLine = rc.line(x, nameBBox.height + y, w + x, nameBBox.height + y, options);\n shapeSvg.insert(() => roughLine).attr('class', 'divider');\n // First line\n roughLine = rc.line(maxTypeWidth + x, nameBBox.height + y, maxTypeWidth + x, h + y, options);\n shapeSvg.insert(() => roughLine).attr('class', 'divider');\n // Second line\n if (keysPresent) {\n roughLine = rc.line(\n maxTypeWidth + maxNameWidth + x,\n nameBBox.height + y,\n maxTypeWidth + maxNameWidth + x,\n h + y,\n options\n );\n shapeSvg.insert(() => roughLine).attr('class', 'divider');\n }\n // Third line\n if (commentPresent) {\n roughLine = rc.line(\n maxTypeWidth + maxNameWidth + maxKeysWidth + x,\n nameBBox.height + y,\n maxTypeWidth + maxNameWidth + maxKeysWidth + x,\n h + y,\n options\n );\n shapeSvg.insert(() => roughLine).attr('class', 'divider');\n }\n\n // Attribute divider lines\n for (const yOffset of yOffsets) {\n roughLine = rc.line(\n x,\n nameBBox.height + y + yOffset,\n w + x,\n nameBBox.height + y + yOffset,\n options\n );\n shapeSvg.insert(() => roughLine).attr('class', 'divider');\n }\n\n updateNodeBounds(node, rect);\n\n if (nodeStyles && node.look !== 'handDrawn') {\n const allStyle = nodeStyles.split(';');\n const strokeStyles = allStyle\n ?.filter((e) => {\n return e.includes('stroke');\n })\n ?.map((s) => `${s}`)\n .join('; ');\n shapeSvg.selectAll('path').attr('style', strokeStyles ?? '');\n shapeSvg.selectAll('.row-rect-even path').attr('style', nodeStyles);\n }\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n return shapeSvg;\n}\n\n// Helper function to add label text g with translate position and style\nasync function addText(\n shapeSvg: D3Selection,\n labelText: string,\n config: MermaidConfig,\n translateX = 0,\n translateY = 0,\n classes: string[] = [],\n style = ''\n) {\n const label = shapeSvg\n .insert('g')\n .attr('class', `label ${classes.join(' ')}`)\n .attr('transform', `translate(${translateX}, ${translateY})`)\n .attr('style', style);\n\n // Return types need to be parsed\n if (labelText !== parseGenericTypes(labelText)) {\n labelText = parseGenericTypes(labelText);\n // Work around\n labelText = labelText.replaceAll('<', '<').replaceAll('>', '>');\n }\n\n const text = label.node()!.appendChild(\n await createText(\n label,\n labelText,\n {\n width: calculateTextWidth(labelText, config) + 100,\n style,\n useHtmlLabels: config.htmlLabels,\n },\n config\n )\n );\n // Undo work around now that text passed through correctly\n if (labelText.includes('<') || labelText.includes('>')) {\n let child = text.children[0];\n child.textContent = child.textContent.replaceAll('<', '<').replaceAll('>', '>');\n while (child.childNodes[0]) {\n child = child.childNodes[0];\n // Replace its text content\n child.textContent = child.textContent.replaceAll('<', '<').replaceAll('>', '>');\n }\n }\n\n let bbox = text.getBBox();\n if (evaluate(config.htmlLabels)) {\n const div = text.children[0];\n div.style.textAlign = 'start';\n const dv = select(text);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n return bbox;\n}\n", "import { updateNodeBounds } from './util.js';\nimport { getConfig } from '../../../diagram-api/diagramAPI.js';\nimport { select } from 'd3';\nimport type { Node } from '../../types.js';\nimport type { ClassNode } from '../../../diagrams/class/classTypes.js';\nimport rough from 'roughjs';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport intersect from '../intersect/index.js';\nimport { textHelper } from '../../../diagrams/class/shapeUtil.js';\nimport { evaluate } from '../../../diagrams/common/common.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function classBox(parent: D3Selection, node: Node) {\n const config = getConfig();\n const PADDING = config.class!.padding ?? 12;\n const GAP = PADDING;\n const useHtmlLabels = node.useHtmlLabels ?? evaluate(config.htmlLabels) ?? true;\n // Treat node as classNode\n const classNode = node as unknown as ClassNode;\n classNode.annotations = classNode.annotations ?? [];\n classNode.members = classNode.members ?? [];\n classNode.methods = classNode.methods ?? [];\n\n const { shapeSvg, bbox } = await textHelper(parent, node, config, useHtmlLabels, GAP);\n\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n\n node.cssStyles = classNode.styles || '';\n\n const styles = classNode.styles?.join(';') || nodeStyles || '';\n\n if (!node.cssStyles) {\n node.cssStyles = styles.replaceAll('!important', '').split(';');\n }\n\n const renderExtraBox =\n classNode.members.length === 0 &&\n classNode.methods.length === 0 &&\n !config.class?.hideEmptyMembersBox;\n\n // Setup roughjs\n // @ts-ignore TODO: Fix rough typings\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n const w = bbox.width;\n let h = bbox.height;\n if (classNode.members.length === 0 && classNode.methods.length === 0) {\n h += GAP;\n } else if (classNode.members.length > 0 && classNode.methods.length === 0) {\n h += GAP * 2;\n }\n const x = -w / 2;\n const y = -h / 2;\n\n // Create and center rectangle\n const roughRect = rc.rectangle(\n x - PADDING,\n y -\n PADDING -\n (renderExtraBox\n ? PADDING\n : classNode.members.length === 0 && classNode.methods.length === 0\n ? -PADDING / 2\n : 0),\n w + 2 * PADDING,\n h +\n 2 * PADDING +\n (renderExtraBox\n ? PADDING * 2\n : classNode.members.length === 0 && classNode.methods.length === 0\n ? -PADDING\n : 0),\n options\n );\n\n const rect = shapeSvg.insert(() => roughRect, ':first-child');\n rect.attr('class', 'basic label-container');\n const rectBBox = rect.node()!.getBBox();\n\n // Rect is centered so now adjust labels.\n // TODO: Fix types\n shapeSvg.selectAll('.text').each((_: any, i: number, nodes: any) => {\n const text = select(nodes[i]);\n // Get the current transform attribute\n const transform = text.attr('transform');\n // Initialize variables for the translation values\n let translateY = 0;\n // Check if the transform attribute exists\n if (transform) {\n const regex = RegExp(/translate\\(([^,]+),([^)]+)\\)/);\n const translate = regex.exec(transform);\n if (translate) {\n translateY = parseFloat(translate[2]);\n }\n }\n // Add to the y value\n let newTranslateY =\n translateY +\n y +\n PADDING -\n (renderExtraBox\n ? PADDING\n : classNode.members.length === 0 && classNode.methods.length === 0\n ? -PADDING / 2\n : 0);\n if (!useHtmlLabels) {\n // Fix so non html labels are better centered.\n // BBox of text seems to be slightly different when calculated so we offset\n newTranslateY -= 4;\n }\n let newTranslateX = x;\n if (\n text.attr('class').includes('label-group') ||\n text.attr('class').includes('annotation-group')\n ) {\n newTranslateX = -text.node()?.getBBox().width / 2 || 0;\n shapeSvg.selectAll('text').each(function (_: any, i: number, nodes: any) {\n if (window.getComputedStyle(nodes[i]).textAnchor === 'middle') {\n newTranslateX = 0;\n }\n });\n }\n // Set the updated transform attribute\n text.attr('transform', `translate(${newTranslateX}, ${newTranslateY})`);\n });\n\n // Render divider lines.\n const annotationGroupHeight =\n (shapeSvg.select('.annotation-group').node() as SVGGraphicsElement).getBBox().height -\n (renderExtraBox ? PADDING / 2 : 0) || 0;\n const labelGroupHeight =\n (shapeSvg.select('.label-group').node() as SVGGraphicsElement).getBBox().height -\n (renderExtraBox ? PADDING / 2 : 0) || 0;\n const membersGroupHeight =\n (shapeSvg.select('.members-group').node() as SVGGraphicsElement).getBBox().height -\n (renderExtraBox ? PADDING / 2 : 0) || 0;\n // First line (under label)\n if (classNode.members.length > 0 || classNode.methods.length > 0 || renderExtraBox) {\n const roughLine = rc.line(\n rectBBox.x,\n annotationGroupHeight + labelGroupHeight + y + PADDING,\n rectBBox.x + rectBBox.width,\n annotationGroupHeight + labelGroupHeight + y + PADDING,\n options\n );\n const line = shapeSvg.insert(() => roughLine);\n line.attr('class', 'divider').attr('style', styles);\n }\n\n // Second line (under members)\n if (renderExtraBox || classNode.members.length > 0 || classNode.methods.length > 0) {\n const roughLine = rc.line(\n rectBBox.x,\n annotationGroupHeight + labelGroupHeight + membersGroupHeight + y + GAP * 2 + PADDING,\n rectBBox.x + rectBBox.width,\n annotationGroupHeight + labelGroupHeight + membersGroupHeight + y + PADDING + GAP * 2,\n options\n );\n const line = shapeSvg.insert(() => roughLine);\n line.attr('class', 'divider').attr('style', styles);\n }\n\n /// Apply styles ///\n if (classNode.look !== 'handDrawn') {\n shapeSvg.selectAll('path').attr('style', styles);\n }\n // Apply other styles like stroke-width and stroke-dasharray to border (not background of shape)\n rect.select(':nth-child(2)').attr('style', styles);\n // Divider lines\n shapeSvg.selectAll('.divider').select('path').attr('style', styles);\n // Text elements\n if (node.labelStyle) {\n shapeSvg.selectAll('span').attr('style', node.labelStyle);\n } else {\n shapeSvg.selectAll('span').attr('style', styles);\n }\n // SVG text uses fill not color\n if (!useHtmlLabels) {\n // We just want to apply color to the text\n const colorRegex = RegExp(/color\\s*:\\s*([^;]*)/);\n const match = colorRegex.exec(styles);\n if (match) {\n const colorStyle = match[0].replace('color', 'fill');\n shapeSvg.selectAll('tspan').attr('style', colorStyle);\n } else if (labelStyles) {\n const match = colorRegex.exec(labelStyles);\n if (match) {\n const colorStyle = match[0].replace('color', 'fill');\n shapeSvg.selectAll('tspan').attr('style', colorStyle);\n }\n }\n }\n\n updateNodeBounds(node, rect);\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n}\n", "import { select } from 'd3';\nimport { getConfig } from '../../config.js';\nimport { getNodeClasses } from '../../rendering-util/rendering-elements/shapes/util.js';\nimport { calculateTextWidth, decodeEntities } from '../../utils.js';\nimport type { ClassMember, ClassNode } from './classTypes.js';\nimport { sanitizeText } from '../../diagram-api/diagramAPI.js';\nimport { createText } from '../../rendering-util/createText.js';\nimport { evaluate, hasKatex } from '../common/common.js';\nimport type { Node } from '../../rendering-util/types.js';\nimport type { MermaidConfig } from '../../config.type.js';\nimport type { D3Selection } from '../../types.js';\n\n// Creates the shapeSvg and inserts text\nexport async function textHelper(\n parent: D3Selection,\n node: any,\n config: MermaidConfig,\n useHtmlLabels: boolean,\n GAP = config.class!.padding ?? 12\n) {\n const TEXT_PADDING = !useHtmlLabels ? 3 : 0;\n const shapeSvg = parent\n // @ts-ignore: Ignore error for using .insert on SVGAElement\n .insert('g')\n .attr('class', getNodeClasses(node))\n .attr('id', node.domId || node.id);\n\n let annotationGroup = null;\n let labelGroup = null;\n let membersGroup = null;\n let methodsGroup = null;\n\n let annotationGroupHeight = 0;\n let labelGroupHeight = 0;\n let membersGroupHeight = 0;\n\n annotationGroup = shapeSvg.insert('g').attr('class', 'annotation-group text');\n if (node.annotations.length > 0) {\n const annotation = node.annotations[0];\n await addText(annotationGroup, { text: `\u00AB${annotation}\u00BB` } as unknown as ClassMember, 0);\n\n const annotationGroupBBox = annotationGroup.node()!.getBBox();\n annotationGroupHeight = annotationGroupBBox.height;\n }\n\n labelGroup = shapeSvg.insert('g').attr('class', 'label-group text');\n await addText(labelGroup, node, 0, ['font-weight: bolder']);\n const labelGroupBBox = labelGroup.node()!.getBBox();\n labelGroupHeight = labelGroupBBox.height;\n\n membersGroup = shapeSvg.insert('g').attr('class', 'members-group text');\n let yOffset = 0;\n for (const member of node.members) {\n const height = await addText(membersGroup, member, yOffset, [member.parseClassifier()]);\n yOffset += height + TEXT_PADDING;\n }\n membersGroupHeight = membersGroup.node()!.getBBox().height;\n if (membersGroupHeight <= 0) {\n membersGroupHeight = GAP / 2;\n }\n\n methodsGroup = shapeSvg.insert('g').attr('class', 'methods-group text');\n let methodsYOffset = 0;\n for (const method of node.methods) {\n const height = await addText(methodsGroup, method, methodsYOffset, [method.parseClassifier()]);\n methodsYOffset += height + TEXT_PADDING;\n }\n\n let bbox = shapeSvg.node()!.getBBox();\n\n // Center annotation\n if (annotationGroup !== null) {\n const annotationGroupBBox = annotationGroup.node()!.getBBox();\n annotationGroup.attr('transform', `translate(${-annotationGroupBBox.width / 2})`);\n }\n\n // Adjust label\n labelGroup.attr('transform', `translate(${-labelGroupBBox.width / 2}, ${annotationGroupHeight})`);\n\n bbox = shapeSvg.node()!.getBBox();\n\n membersGroup.attr(\n 'transform',\n `translate(${0}, ${annotationGroupHeight + labelGroupHeight + GAP * 2})`\n );\n bbox = shapeSvg.node()!.getBBox();\n methodsGroup.attr(\n 'transform',\n `translate(${0}, ${annotationGroupHeight + labelGroupHeight + (membersGroupHeight ? membersGroupHeight + GAP * 4 : GAP * 2)})`\n );\n\n bbox = shapeSvg.node()!.getBBox();\n\n return { shapeSvg, bbox };\n}\n\n// Modified version of labelHelper() to help create and place text for classes\nasync function addText(\n parentGroup: D3Selection,\n node: Node | ClassNode | ClassMember,\n yOffset: number,\n styles: string[] = []\n) {\n const textEl = parentGroup.insert('g').attr('class', 'label').attr('style', styles.join('; '));\n const config = getConfig();\n let useHtmlLabels =\n 'useHtmlLabels' in node ? node.useHtmlLabels : (evaluate(config.htmlLabels) ?? true);\n\n let textContent = '';\n // Support regular node type (.label) and classNodes (.text)\n if ('text' in node) {\n textContent = node.text;\n } else {\n textContent = node.label!;\n }\n\n // createText() will cause unwanted behavior because of classDiagram syntax so workarounds are needed\n\n if (!useHtmlLabels && textContent.startsWith('\\\\')) {\n textContent = textContent.substring(1);\n }\n\n if (hasKatex(textContent)) {\n useHtmlLabels = true;\n }\n\n const text = await createText(\n textEl,\n sanitizeText(decodeEntities(textContent)),\n {\n width: calculateTextWidth(textContent, config) + 50, // Add room for error when splitting text into multiple lines\n classes: 'markdown-node-label',\n useHtmlLabels,\n },\n config\n );\n let bbox;\n let numberOfLines = 1;\n\n if (!useHtmlLabels) {\n // Undo font-weight normal\n if (styles.includes('font-weight: bolder')) {\n select(text).selectAll('tspan').attr('font-weight', '');\n }\n\n numberOfLines = text.children.length;\n\n const textChild = text.children[0];\n if (text.textContent === '' || text.textContent.includes('>')) {\n textChild.textContent =\n textContent[0] +\n textContent.substring(1).replaceAll('>', '>').replaceAll('<', '<').trim();\n\n // Text was improperly removed due to spaces (preserve one space if present)\n const preserveSpace = textContent[1] === ' ';\n if (preserveSpace) {\n textChild.textContent = textChild.textContent[0] + ' ' + textChild.textContent.substring(1);\n }\n }\n\n // To support empty boxes\n if (textChild.textContent === 'undefined') {\n textChild.textContent = '';\n }\n\n // Get the bounding box after the text update\n bbox = text.getBBox();\n } else {\n const div = text.children[0];\n const dv = select(text);\n\n numberOfLines = div.innerHTML.split('
').length;\n // Katex math support\n if (div.innerHTML.includes('')) {\n numberOfLines += div.innerHTML.split('').length - 1;\n }\n\n // Support images\n const images = div.getElementsByTagName('img');\n if (images) {\n const noImgText = textContent.replace(/]*>/g, '').trim() === '';\n await Promise.all(\n [...images].map(\n (img) =>\n new Promise((res) => {\n function setupImage() {\n img.style.display = 'flex';\n img.style.flexDirection = 'column';\n\n if (noImgText) {\n // default size if no text\n const bodyFontSize =\n config.fontSize?.toString() ?? window.getComputedStyle(document.body).fontSize;\n const enlargingFactor = 5;\n const width = parseInt(bodyFontSize, 10) * enlargingFactor + 'px';\n img.style.minWidth = width;\n img.style.maxWidth = width;\n } else {\n img.style.width = '100%';\n }\n res(img);\n }\n setTimeout(() => {\n if (img.complete) {\n setupImage();\n }\n });\n img.addEventListener('error', setupImage);\n img.addEventListener('load', setupImage);\n })\n )\n );\n }\n\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n // Center text and offset by yOffset\n textEl.attr('transform', 'translate(0,' + (-bbox.height / (2 * numberOfLines) + yOffset) + ')');\n return bbox.height;\n}\n", "import { getNodeClasses, updateNodeBounds } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\nimport { calculateTextWidth, decodeEntities } from '../../../utils.js';\nimport { getConfig, sanitizeText } from '../../../diagram-api/diagramAPI.js';\nimport { createText } from '../../createText.js';\nimport { select } from 'd3';\nimport type { Requirement, Element } from '../../../diagrams/requirement/types.js';\n\nexport async function requirementBox(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const requirementNode = node as unknown as Requirement;\n const elementNode = node as unknown as Element;\n const padding = 20;\n const gap = 20;\n const isRequirementNode = 'verifyMethod' in node;\n const classes = getNodeClasses(node);\n\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', classes)\n .attr('id', node.domId ?? node.id);\n\n let typeHeight;\n if (isRequirementNode) {\n typeHeight = await addText(\n shapeSvg,\n `<<${requirementNode.type}>>`,\n 0,\n node.labelStyle\n );\n } else {\n typeHeight = await addText(shapeSvg, '<<Element>>', 0, node.labelStyle);\n }\n\n let accumulativeHeight = typeHeight;\n const nameHeight = await addText(\n shapeSvg,\n requirementNode.name,\n accumulativeHeight,\n node.labelStyle + '; font-weight: bold;'\n );\n accumulativeHeight += nameHeight + gap;\n\n // Requirement\n if (isRequirementNode) {\n const idHeight = await addText(\n shapeSvg,\n `${requirementNode.requirementId ? `ID: ${requirementNode.requirementId}` : ''}`,\n accumulativeHeight,\n node.labelStyle\n );\n\n accumulativeHeight += idHeight;\n const textHeight = await addText(\n shapeSvg,\n `${requirementNode.text ? `Text: ${requirementNode.text}` : ''}`,\n accumulativeHeight,\n node.labelStyle\n );\n accumulativeHeight += textHeight;\n const riskHeight = await addText(\n shapeSvg,\n `${requirementNode.risk ? `Risk: ${requirementNode.risk}` : ''}`,\n accumulativeHeight,\n node.labelStyle\n );\n accumulativeHeight += riskHeight;\n await addText(\n shapeSvg,\n `${requirementNode.verifyMethod ? `Verification: ${requirementNode.verifyMethod}` : ''}`,\n accumulativeHeight,\n node.labelStyle\n );\n } else {\n // Element\n const typeHeight = await addText(\n shapeSvg,\n `${elementNode.type ? `Type: ${elementNode.type}` : ''}`,\n accumulativeHeight,\n node.labelStyle\n );\n accumulativeHeight += typeHeight;\n await addText(\n shapeSvg,\n `${elementNode.docRef ? `Doc Ref: ${elementNode.docRef}` : ''}`,\n accumulativeHeight,\n node.labelStyle\n );\n }\n\n const totalWidth = (shapeSvg.node()?.getBBox().width ?? 200) + padding;\n const totalHeight = (shapeSvg.node()?.getBBox().height ?? 200) + padding;\n const x = -totalWidth / 2;\n const y = -totalHeight / 2;\n\n // Setup roughjs\n // @ts-ignore TODO: Fix rough typings\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n\n if (node.look !== 'handDrawn') {\n options.roughness = 0;\n options.fillStyle = 'solid';\n }\n\n // Create and center rectangle\n const roughRect = rc.rectangle(x, y, totalWidth, totalHeight, options);\n\n const rect = shapeSvg.insert(() => roughRect, ':first-child');\n rect.attr('class', 'basic label-container').attr('style', nodeStyles);\n\n // Re-translate labels now that rect is centered\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n shapeSvg.selectAll('.label').each((_: any, i: number, nodes: any) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const text = select(nodes[i]);\n\n const transform = text.attr('transform');\n let translateX = 0;\n let translateY = 0;\n if (transform) {\n const regex = RegExp(/translate\\(([^,]+),([^)]+)\\)/);\n const translate = regex.exec(transform);\n if (translate) {\n translateX = parseFloat(translate[1]);\n translateY = parseFloat(translate[2]);\n }\n }\n\n const newTranslateY = translateY - totalHeight / 2;\n let newTranslateX = x + padding / 2;\n\n // Keep type and name labels centered.\n if (i === 0 || i === 1) {\n newTranslateX = translateX;\n }\n // Set the updated transform attribute\n text.attr('transform', `translate(${newTranslateX}, ${newTranslateY + padding})`);\n });\n\n // Insert divider line if there is body text\n if (accumulativeHeight > typeHeight + nameHeight + gap) {\n const roughLine = rc.line(\n x,\n y + typeHeight + nameHeight + gap,\n x + totalWidth,\n y + typeHeight + nameHeight + gap,\n options\n );\n const dividerLine = shapeSvg.insert(() => roughLine);\n dividerLine.attr('style', nodeStyles);\n }\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n}\n\nasync function addText(\n parentGroup: D3Selection,\n inputText: string,\n yOffset: number,\n style = ''\n) {\n if (inputText === '') {\n return 0;\n }\n const textEl = parentGroup.insert('g').attr('class', 'label').attr('style', style);\n const config = getConfig();\n const useHtmlLabels = config.htmlLabels ?? true;\n\n const text = await createText(\n textEl,\n sanitizeText(decodeEntities(inputText)),\n {\n width: calculateTextWidth(inputText, config) + 50, // Add room for error when splitting text into multiple lines\n classes: 'markdown-node-label',\n useHtmlLabels,\n style,\n },\n config\n );\n let bbox;\n\n if (!useHtmlLabels) {\n const textChild = text.children[0];\n for (const child of textChild.children) {\n child.textContent = child.textContent.replaceAll('>', '>').replaceAll('<', '<');\n if (style) {\n child.setAttribute('style', style);\n }\n }\n // Get the bounding box after the text update\n bbox = text.getBBox();\n // Add extra height so it is similar to the html labels\n bbox.height += 6;\n } else {\n const div = text.children[0];\n const dv = select(text);\n\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n // Center text and offset by yOffset\n textEl.attr('transform', `translate(${-bbox.width / 2},${-bbox.height / 2 + yOffset})`);\n return bbox.height;\n}\n", "import { labelHelper, insertLabel, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node, KanbanNode, ShapeRenderOptions } from '../../types.js';\nimport { createRoundedRectPathD } from './roundedRectPath.js';\nimport { userNodeOverrides, styles2String } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\n\nconst colorFromPriority = (priority: NonNullable) => {\n switch (priority) {\n case 'Very High':\n return 'red';\n case 'High':\n return 'orange';\n case 'Medium':\n return null; // no stroke\n case 'Low':\n return 'blue';\n case 'Very Low':\n return 'lightblue';\n }\n};\nexport async function kanbanItem(\n parent: D3Selection,\n // Omit the 'shape' prop since otherwise, it causes a TypeScript circular dependency error\n kanbanNode: Omit | Omit,\n { config }: ShapeRenderOptions\n) {\n const { labelStyles, nodeStyles } = styles2String(kanbanNode);\n kanbanNode.labelStyle = labelStyles || '';\n\n const labelPaddingX = 10;\n const orgWidth = kanbanNode.width;\n kanbanNode.width = (kanbanNode.width ?? 200) - 10;\n\n const {\n shapeSvg,\n bbox,\n label: labelElTitle,\n } = await labelHelper(parent, kanbanNode, getNodeClasses(kanbanNode));\n const padding = kanbanNode.padding || 10;\n\n let ticketUrl = '';\n let link;\n\n if ('ticket' in kanbanNode && kanbanNode.ticket && config?.kanban?.ticketBaseUrl) {\n ticketUrl = config?.kanban?.ticketBaseUrl.replace('#TICKET#', kanbanNode.ticket);\n link = shapeSvg\n .insert('svg:a', ':first-child')\n .attr('class', 'kanban-ticket-link')\n .attr('xlink:href', ticketUrl)\n .attr('target', '_blank');\n }\n\n const options = {\n useHtmlLabels: kanbanNode.useHtmlLabels,\n labelStyle: kanbanNode.labelStyle || '',\n width: kanbanNode.width,\n img: kanbanNode.img,\n padding: kanbanNode.padding || 8,\n centerLabel: false,\n };\n let labelEl, bbox2;\n if (link) {\n ({ label: labelEl, bbox: bbox2 } = await insertLabel(\n link,\n ('ticket' in kanbanNode && kanbanNode.ticket) || '',\n options\n ));\n } else {\n ({ label: labelEl, bbox: bbox2 } = await insertLabel(\n shapeSvg,\n ('ticket' in kanbanNode && kanbanNode.ticket) || '',\n options\n ));\n }\n const { label: labelElAssigned, bbox: bboxAssigned } = await insertLabel(\n shapeSvg,\n ('assigned' in kanbanNode && kanbanNode.assigned) || '',\n options\n );\n kanbanNode.width = orgWidth;\n const labelPaddingY = 10;\n const totalWidth = kanbanNode?.width || 0;\n const heightAdj = Math.max(bbox2.height, bboxAssigned.height) / 2;\n const totalHeight =\n Math.max(bbox.height + labelPaddingY * 2, kanbanNode?.height || 0) + heightAdj;\n const x = -totalWidth / 2;\n const y = -totalHeight / 2;\n labelElTitle.attr(\n 'transform',\n 'translate(' + (padding - totalWidth / 2) + ', ' + (-heightAdj - bbox.height / 2) + ')'\n );\n labelEl.attr(\n 'transform',\n 'translate(' + (padding - totalWidth / 2) + ', ' + (-heightAdj + bbox.height / 2) + ')'\n );\n labelElAssigned.attr(\n 'transform',\n 'translate(' +\n (padding + totalWidth / 2 - bboxAssigned.width - 2 * labelPaddingX) +\n ', ' +\n (-heightAdj + bbox.height / 2) +\n ')'\n );\n\n let rect;\n\n const { rx, ry } = kanbanNode;\n const { cssStyles } = kanbanNode;\n\n if (kanbanNode.look === 'handDrawn') {\n // @ts-ignore TODO: Fix rough typings\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(kanbanNode, {});\n\n const roughNode =\n rx || ry\n ? rc.path(createRoundedRectPathD(x, y, totalWidth, totalHeight, rx || 0), options)\n : rc.rectangle(x, y, totalWidth, totalHeight, options);\n\n rect = shapeSvg.insert(() => roughNode, ':first-child');\n rect.attr('class', 'basic label-container').attr('style', cssStyles ? cssStyles : null);\n } else {\n rect = shapeSvg.insert('rect', ':first-child');\n\n rect\n .attr('class', 'basic label-container __APA__')\n .attr('style', nodeStyles)\n .attr('rx', rx ?? 5)\n .attr('ry', ry ?? 5)\n .attr('x', x)\n .attr('y', y)\n .attr('width', totalWidth)\n .attr('height', totalHeight);\n\n const priority = 'priority' in kanbanNode && kanbanNode.priority;\n if (priority) {\n const line = shapeSvg.append('line');\n const lineX = x + 2;\n\n const y1 = y + Math.floor((rx ?? 0) / 2);\n const y2 = y + totalHeight - Math.floor((rx ?? 0) / 2);\n line\n .attr('x1', lineX)\n .attr('y1', y1)\n .attr('x2', lineX)\n .attr('y2', y2)\n\n .attr('stroke-width', '4')\n .attr('stroke', colorFromPriority(priority));\n }\n }\n\n updateNodeBounds(kanbanNode, rect);\n kanbanNode.height = totalHeight;\n\n kanbanNode.intersect = function (point) {\n return intersect.rect(kanbanNode, point);\n };\n\n return shapeSvg;\n}\n", "import { log } from '../../../logger.js';\nimport { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';\nimport intersect from '../intersect/index.js';\nimport type { Node } from '../../types.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport rough from 'roughjs';\nimport type { D3Selection } from '../../../types.js';\nimport { handleUndefinedAttr } from '../../../utils.js';\nimport type { Bounds, Point } from '../../../types.js';\n\nexport async function bang(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n const { shapeSvg, bbox, halfPadding, label } = await labelHelper(\n parent,\n node,\n getNodeClasses(node)\n );\n\n const w = bbox.width + 10 * halfPadding;\n const h = bbox.height + 8 * halfPadding;\n const r = 0.15 * w;\n const { cssStyles } = node;\n\n const minWidth = bbox.width + 20;\n const minHeight = bbox.height + 20;\n const effectiveWidth = Math.max(w, minWidth);\n const effectiveHeight = Math.max(h, minHeight);\n\n label.attr('transform', `translate(${-bbox.width / 2}, ${-bbox.height / 2})`);\n\n let bangElem;\n const path = `M0 0 \n a${r},${r} 1 0,0 ${effectiveWidth * 0.25},${-1 * effectiveHeight * 0.1}\n a${r},${r} 1 0,0 ${effectiveWidth * 0.25},${0}\n a${r},${r} 1 0,0 ${effectiveWidth * 0.25},${0}\n a${r},${r} 1 0,0 ${effectiveWidth * 0.25},${effectiveHeight * 0.1}\n\n a${r},${r} 1 0,0 ${effectiveWidth * 0.15},${effectiveHeight * 0.33}\n a${r * 0.8},${r * 0.8} 1 0,0 0,${effectiveHeight * 0.34}\n a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.15},${effectiveHeight * 0.33}\n\n a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.25},${effectiveHeight * 0.15}\n a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.25},0\n a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.25},0\n a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.25},${-1 * effectiveHeight * 0.15}\n\n a${r},${r} 1 0,0 ${-1 * effectiveWidth * 0.1},${-1 * effectiveHeight * 0.33}\n a${r * 0.8},${r * 0.8} 1 0,0 0,${-1 * effectiveHeight * 0.34}\n a${r},${r} 1 0,0 ${effectiveWidth * 0.1},${-1 * effectiveHeight * 0.33}\n H0 V0 Z`;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n const roughNode = rc.path(path, options);\n bangElem = shapeSvg.insert(() => roughNode, ':first-child');\n bangElem.attr('class', 'basic label-container').attr('style', handleUndefinedAttr(cssStyles));\n } else {\n bangElem = shapeSvg\n .insert('path', ':first-child')\n .attr('class', 'basic label-container')\n .attr('style', nodeStyles)\n .attr('d', path);\n }\n\n // Translate the path (center the shape)\n bangElem.attr('transform', `translate(${-effectiveWidth / 2}, ${-effectiveHeight / 2})`);\n\n updateNodeBounds(node, bangElem);\n node.calcIntersect = function (bounds: Bounds, point: Point) {\n return intersect.rect(bounds, point);\n };\n node.intersect = function (point) {\n log.info('Bang intersect', node, point);\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n}\n", "import rough from 'roughjs';\nimport { log } from '../../../logger.js';\nimport type { Bounds, D3Selection, Point } from '../../../types.js';\nimport { handleUndefinedAttr } from '../../../utils.js';\nimport type { Node } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';\nimport { getNodeClasses, labelHelper, updateNodeBounds } from './util.js';\n\nexport async function cloud(parent: D3Selection, node: Node) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n\n const { shapeSvg, bbox, halfPadding, label } = await labelHelper(\n parent,\n node,\n getNodeClasses(node)\n );\n\n const w = bbox.width + 2 * halfPadding;\n const h = bbox.height + 2 * halfPadding;\n\n // Cloud radii\n const r1 = 0.15 * w;\n const r2 = 0.25 * w;\n const r3 = 0.35 * w;\n const r4 = 0.2 * w;\n\n const { cssStyles } = node;\n let cloudElem;\n\n // Cloud path\n const path = `M0 0 \n a${r1},${r1} 0 0,1 ${w * 0.25},${-1 * w * 0.1}\n a${r3},${r3} 1 0,1 ${w * 0.4},${-1 * w * 0.1}\n a${r2},${r2} 1 0,1 ${w * 0.35},${w * 0.2}\n\n a${r1},${r1} 1 0,1 ${w * 0.15},${h * 0.35}\n a${r4},${r4} 1 0,1 ${-1 * w * 0.15},${h * 0.65}\n\n a${r2},${r1} 1 0,1 ${-1 * w * 0.25},${w * 0.15}\n a${r3},${r3} 1 0,1 ${-1 * w * 0.5},0\n a${r1},${r1} 1 0,1 ${-1 * w * 0.25},${-1 * w * 0.15}\n\n a${r1},${r1} 1 0,1 ${-1 * w * 0.1},${-1 * h * 0.35}\n a${r4},${r4} 1 0,1 ${w * 0.1},${-1 * h * 0.65}\n H0 V0 Z`;\n\n if (node.look === 'handDrawn') {\n // @ts-expect-error -- Passing a D3.Selection seems to work for some reason\n const rc = rough.svg(shapeSvg);\n const options = userNodeOverrides(node, {});\n const roughNode = rc.path(path, options);\n cloudElem = shapeSvg.insert(() => roughNode, ':first-child');\n cloudElem.attr('class', 'basic label-container').attr('style', handleUndefinedAttr(cssStyles));\n } else {\n cloudElem = shapeSvg\n .insert('path', ':first-child')\n .attr('class', 'basic label-container')\n .attr('style', nodeStyles)\n .attr('d', path);\n }\n\n label.attr('transform', `translate(${-bbox.width / 2}, ${-bbox.height / 2})`);\n\n // Center the shape\n cloudElem.attr('transform', `translate(${-w / 2}, ${-h / 2})`);\n\n updateNodeBounds(node, cloudElem);\n\n node.calcIntersect = function (bounds: Bounds, point: Point) {\n return intersect.rect(bounds, point);\n };\n node.intersect = function (point) {\n log.info('Cloud intersect', node, point);\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n}\n", "import type { Bounds, D3Selection, Point } from '../../../types.js';\nimport type { Node } from '../../types.js';\nimport intersect from '../intersect/index.js';\nimport { styles2String } from './handDrawnShapeStyles.js';\nimport { getNodeClasses, labelHelper, updateNodeBounds } from './util.js';\n\nexport async function defaultMindmapNode(\n parent: D3Selection,\n node: Node\n) {\n const { labelStyles, nodeStyles } = styles2String(node);\n node.labelStyle = labelStyles;\n\n const { shapeSvg, bbox, halfPadding, label } = await labelHelper(\n parent,\n node,\n getNodeClasses(node)\n );\n\n const w = bbox.width + 8 * halfPadding;\n const h = bbox.height + 2 * halfPadding;\n const rd = 5;\n\n const rectPath = `\n M${-w / 2} ${h / 2 - rd}\n v${-h + 2 * rd}\n q0,-${rd} ${rd},-${rd}\n h${w - 2 * rd}\n q${rd},0 ${rd},${rd}\n v${h - 2 * rd}\n q0,${rd} -${rd},${rd}\n h${-w + 2 * rd}\n q-${rd},0 -${rd},-${rd}\n Z\n `;\n\n const bg = shapeSvg\n .append('path')\n .attr('id', 'node-' + node.id)\n .attr('class', 'node-bkg node-' + node.type)\n .attr('style', nodeStyles)\n .attr('d', rectPath);\n\n shapeSvg\n .append('line')\n .attr('class', 'node-line-')\n .attr('x1', -w / 2)\n .attr('y1', h / 2)\n .attr('x2', w / 2)\n .attr('y2', h / 2);\n\n label.attr('transform', `translate(${-bbox.width / 2}, ${-bbox.height / 2})`);\n shapeSvg.append(() => label.node());\n\n updateNodeBounds(node, bg);\n node.calcIntersect = function (bounds: Bounds, point: Point) {\n return intersect.rect(bounds, point);\n };\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n}\n", "import { circle } from './circle.js';\nimport type { Node, MindmapOptions } from '../../types.js';\nimport type { D3Selection } from '../../../types.js';\n\nexport async function mindmapCircle(\n parent: D3Selection,\n node: Node\n) {\n const options = {\n padding: node.padding ?? 0,\n } as MindmapOptions;\n return circle(parent, node, options);\n}\n", "import type { Entries } from 'type-fest';\nimport type { D3Selection, MaybePromise } from '../../types.js';\nimport type { Node, ShapeRenderOptions } from '../types.js';\nimport { anchor } from './shapes/anchor.js';\nimport { bowTieRect } from './shapes/bowTieRect.js';\nimport { card } from './shapes/card.js';\nimport { choice } from './shapes/choice.js';\nimport { circle } from './shapes/circle.js';\nimport { crossedCircle } from './shapes/crossedCircle.js';\nimport { curlyBraceLeft } from './shapes/curlyBraceLeft.js';\nimport { curlyBraceRight } from './shapes/curlyBraceRight.js';\nimport { curlyBraces } from './shapes/curlyBraces.js';\nimport { curvedTrapezoid } from './shapes/curvedTrapezoid.js';\nimport { cylinder } from './shapes/cylinder.js';\nimport { dividedRectangle } from './shapes/dividedRect.js';\nimport { doublecircle } from './shapes/doubleCircle.js';\nimport { filledCircle } from './shapes/filledCircle.js';\nimport { flippedTriangle } from './shapes/flippedTriangle.js';\nimport { forkJoin } from './shapes/forkJoin.js';\nimport { halfRoundedRectangle } from './shapes/halfRoundedRectangle.js';\nimport { hexagon } from './shapes/hexagon.js';\nimport { hourglass } from './shapes/hourglass.js';\nimport { icon } from './shapes/icon.js';\nimport { iconCircle } from './shapes/iconCircle.js';\nimport { iconRounded } from './shapes/iconRounded.js';\nimport { iconSquare } from './shapes/iconSquare.js';\nimport { imageSquare } from './shapes/imageSquare.js';\nimport { inv_trapezoid } from './shapes/invertedTrapezoid.js';\nimport { labelRect } from './shapes/labelRect.js';\nimport { lean_left } from './shapes/leanLeft.js';\nimport { lean_right } from './shapes/leanRight.js';\nimport { lightningBolt } from './shapes/lightningBolt.js';\nimport { linedCylinder } from './shapes/linedCylinder.js';\nimport { linedWaveEdgedRect } from './shapes/linedWaveEdgedRect.js';\nimport { multiRect } from './shapes/multiRect.js';\nimport { multiWaveEdgedRectangle } from './shapes/multiWaveEdgedRectangle.js';\nimport { note } from './shapes/note.js';\nimport { question } from './shapes/question.js';\nimport { rect_left_inv_arrow } from './shapes/rectLeftInvArrow.js';\nimport { rectWithTitle } from './shapes/rectWithTitle.js';\nimport { roundedRect } from './shapes/roundedRect.js';\nimport { shadedProcess } from './shapes/shadedProcess.js';\nimport { slopedRect } from './shapes/slopedRect.js';\nimport { squareRect } from './shapes/squareRect.js';\nimport { stadium } from './shapes/stadium.js';\nimport { state } from './shapes/state.js';\nimport { stateEnd } from './shapes/stateEnd.js';\nimport { stateStart } from './shapes/stateStart.js';\nimport { subroutine } from './shapes/subroutine.js';\nimport { taggedRect } from './shapes/taggedRect.js';\nimport { taggedWaveEdgedRectangle } from './shapes/taggedWaveEdgedRectangle.js';\nimport { text } from './shapes/text.js';\nimport { tiltedCylinder } from './shapes/tiltedCylinder.js';\nimport { trapezoid } from './shapes/trapezoid.js';\nimport { trapezoidalPentagon } from './shapes/trapezoidalPentagon.js';\nimport { triangle } from './shapes/triangle.js';\nimport { waveEdgedRectangle } from './shapes/waveEdgedRectangle.js';\nimport { waveRectangle } from './shapes/waveRectangle.js';\nimport { windowPane } from './shapes/windowPane.js';\nimport { erBox } from './shapes/erBox.js';\nimport { classBox } from './shapes/classBox.js';\nimport { requirementBox } from './shapes/requirementBox.js';\nimport { kanbanItem } from './shapes/kanbanItem.js';\nimport { bang } from './shapes/bang.js';\nimport { cloud } from './shapes/cloud.js';\nimport { defaultMindmapNode } from './shapes/defaultMindmapNode.js';\nimport { mindmapCircle } from './shapes/mindmapCircle.js';\n\ntype ShapeHandler = (\n parent: D3Selection,\n node: Node,\n options: ShapeRenderOptions\n) => MaybePromise>;\n\nexport interface ShapeDefinition {\n semanticName: string;\n name: string;\n shortName: string;\n description: string;\n /**\n * Aliases can include descriptive names, other short names, etc.\n */\n aliases?: string[];\n /**\n * These are names used by mermaid before the introduction of new shapes. These will not be in standard formats, and shouldn't be used by the users\n */\n internalAliases?: string[];\n handler: ShapeHandler;\n}\n\nexport const shapesDefs = [\n {\n semanticName: 'Process',\n name: 'Rectangle',\n shortName: 'rect',\n description: 'Standard process shape',\n aliases: ['proc', 'process', 'rectangle'],\n internalAliases: ['squareRect'],\n handler: squareRect,\n },\n {\n semanticName: 'Event',\n name: 'Rounded Rectangle',\n shortName: 'rounded',\n description: 'Represents an event',\n aliases: ['event'],\n internalAliases: ['roundedRect'],\n handler: roundedRect,\n },\n {\n semanticName: 'Terminal Point',\n name: 'Stadium',\n shortName: 'stadium',\n description: 'Terminal point',\n aliases: ['terminal', 'pill'],\n handler: stadium,\n },\n {\n semanticName: 'Subprocess',\n name: 'Framed Rectangle',\n shortName: 'fr-rect',\n description: 'Subprocess',\n aliases: ['subprocess', 'subproc', 'framed-rectangle', 'subroutine'],\n handler: subroutine,\n },\n {\n semanticName: 'Database',\n name: 'Cylinder',\n shortName: 'cyl',\n description: 'Database storage',\n aliases: ['db', 'database', 'cylinder'],\n handler: cylinder,\n },\n {\n semanticName: 'Start',\n name: 'Circle',\n shortName: 'circle',\n description: 'Starting point',\n aliases: ['circ'],\n handler: circle,\n },\n {\n semanticName: 'Bang',\n name: 'Bang',\n shortName: 'bang',\n description: 'Bang',\n aliases: ['bang'],\n handler: bang,\n },\n {\n semanticName: 'Cloud',\n name: 'Cloud',\n shortName: 'cloud',\n description: 'cloud',\n aliases: ['cloud'],\n handler: cloud,\n },\n {\n semanticName: 'Decision',\n name: 'Diamond',\n shortName: 'diam',\n description: 'Decision-making step',\n aliases: ['decision', 'diamond', 'question'],\n handler: question,\n },\n {\n semanticName: 'Prepare Conditional',\n name: 'Hexagon',\n shortName: 'hex',\n description: 'Preparation or condition step',\n aliases: ['hexagon', 'prepare'],\n handler: hexagon,\n },\n {\n semanticName: 'Data Input/Output',\n name: 'Lean Right',\n shortName: 'lean-r',\n description: 'Represents input or output',\n aliases: ['lean-right', 'in-out'],\n internalAliases: ['lean_right'],\n handler: lean_right,\n },\n {\n semanticName: 'Data Input/Output',\n name: 'Lean Left',\n shortName: 'lean-l',\n description: 'Represents output or input',\n aliases: ['lean-left', 'out-in'],\n internalAliases: ['lean_left'],\n handler: lean_left,\n },\n {\n semanticName: 'Priority Action',\n name: 'Trapezoid Base Bottom',\n shortName: 'trap-b',\n description: 'Priority action',\n aliases: ['priority', 'trapezoid-bottom', 'trapezoid'],\n handler: trapezoid,\n },\n {\n semanticName: 'Manual Operation',\n name: 'Trapezoid Base Top',\n shortName: 'trap-t',\n description: 'Represents a manual task',\n aliases: ['manual', 'trapezoid-top', 'inv-trapezoid'],\n internalAliases: ['inv_trapezoid'],\n handler: inv_trapezoid,\n },\n {\n semanticName: 'Stop',\n name: 'Double Circle',\n shortName: 'dbl-circ',\n description: 'Represents a stop point',\n aliases: ['double-circle'],\n internalAliases: ['doublecircle'],\n handler: doublecircle,\n },\n {\n semanticName: 'Text Block',\n name: 'Text Block',\n shortName: 'text',\n description: 'Text block',\n handler: text,\n },\n {\n semanticName: 'Card',\n name: 'Notched Rectangle',\n shortName: 'notch-rect',\n description: 'Represents a card',\n aliases: ['card', 'notched-rectangle'],\n handler: card,\n },\n {\n semanticName: 'Lined/Shaded Process',\n name: 'Lined Rectangle',\n shortName: 'lin-rect',\n description: 'Lined process shape',\n aliases: ['lined-rectangle', 'lined-process', 'lin-proc', 'shaded-process'],\n handler: shadedProcess,\n },\n {\n semanticName: 'Start',\n name: 'Small Circle',\n shortName: 'sm-circ',\n description: 'Small starting point',\n aliases: ['start', 'small-circle'],\n internalAliases: ['stateStart'],\n handler: stateStart,\n },\n {\n semanticName: 'Stop',\n name: 'Framed Circle',\n shortName: 'fr-circ',\n description: 'Stop point',\n aliases: ['stop', 'framed-circle'],\n internalAliases: ['stateEnd'],\n handler: stateEnd,\n },\n {\n semanticName: 'Fork/Join',\n name: 'Filled Rectangle',\n shortName: 'fork',\n description: 'Fork or join in process flow',\n aliases: ['join'],\n internalAliases: ['forkJoin'],\n handler: forkJoin,\n },\n {\n semanticName: 'Collate',\n name: 'Hourglass',\n shortName: 'hourglass',\n description: 'Represents a collate operation',\n aliases: ['hourglass', 'collate'],\n handler: hourglass,\n },\n {\n semanticName: 'Comment',\n name: 'Curly Brace',\n shortName: 'brace',\n description: 'Adds a comment',\n aliases: ['comment', 'brace-l'],\n handler: curlyBraceLeft,\n },\n {\n semanticName: 'Comment Right',\n name: 'Curly Brace',\n shortName: 'brace-r',\n description: 'Adds a comment',\n handler: curlyBraceRight,\n },\n {\n semanticName: 'Comment with braces on both sides',\n name: 'Curly Braces',\n shortName: 'braces',\n description: 'Adds a comment',\n handler: curlyBraces,\n },\n {\n semanticName: 'Com Link',\n name: 'Lightning Bolt',\n shortName: 'bolt',\n description: 'Communication link',\n aliases: ['com-link', 'lightning-bolt'],\n handler: lightningBolt,\n },\n {\n semanticName: 'Document',\n name: 'Document',\n shortName: 'doc',\n description: 'Represents a document',\n aliases: ['doc', 'document'],\n handler: waveEdgedRectangle,\n },\n {\n semanticName: 'Delay',\n name: 'Half-Rounded Rectangle',\n shortName: 'delay',\n description: 'Represents a delay',\n aliases: ['half-rounded-rectangle'],\n handler: halfRoundedRectangle,\n },\n {\n semanticName: 'Direct Access Storage',\n name: 'Horizontal Cylinder',\n shortName: 'h-cyl',\n description: 'Direct access storage',\n aliases: ['das', 'horizontal-cylinder'],\n handler: tiltedCylinder,\n },\n {\n semanticName: 'Disk Storage',\n name: 'Lined Cylinder',\n shortName: 'lin-cyl',\n description: 'Disk storage',\n aliases: ['disk', 'lined-cylinder'],\n handler: linedCylinder,\n },\n {\n semanticName: 'Display',\n name: 'Curved Trapezoid',\n shortName: 'curv-trap',\n description: 'Represents a display',\n aliases: ['curved-trapezoid', 'display'],\n handler: curvedTrapezoid,\n },\n {\n semanticName: 'Divided Process',\n name: 'Divided Rectangle',\n shortName: 'div-rect',\n description: 'Divided process shape',\n aliases: ['div-proc', 'divided-rectangle', 'divided-process'],\n handler: dividedRectangle,\n },\n {\n semanticName: 'Extract',\n name: 'Triangle',\n shortName: 'tri',\n description: 'Extraction process',\n aliases: ['extract', 'triangle'],\n handler: triangle,\n },\n {\n semanticName: 'Internal Storage',\n name: 'Window Pane',\n shortName: 'win-pane',\n description: 'Internal storage',\n aliases: ['internal-storage', 'window-pane'],\n handler: windowPane,\n },\n {\n semanticName: 'Junction',\n name: 'Filled Circle',\n shortName: 'f-circ',\n description: 'Junction point',\n aliases: ['junction', 'filled-circle'],\n handler: filledCircle,\n },\n {\n semanticName: 'Loop Limit',\n name: 'Trapezoidal Pentagon',\n shortName: 'notch-pent',\n description: 'Loop limit step',\n aliases: ['loop-limit', 'notched-pentagon'],\n handler: trapezoidalPentagon,\n },\n {\n semanticName: 'Manual File',\n name: 'Flipped Triangle',\n shortName: 'flip-tri',\n description: 'Manual file operation',\n aliases: ['manual-file', 'flipped-triangle'],\n handler: flippedTriangle,\n },\n {\n semanticName: 'Manual Input',\n name: 'Sloped Rectangle',\n shortName: 'sl-rect',\n description: 'Manual input step',\n aliases: ['manual-input', 'sloped-rectangle'],\n handler: slopedRect,\n },\n {\n semanticName: 'Multi-Document',\n name: 'Stacked Document',\n shortName: 'docs',\n description: 'Multiple documents',\n aliases: ['documents', 'st-doc', 'stacked-document'],\n handler: multiWaveEdgedRectangle,\n },\n {\n semanticName: 'Multi-Process',\n name: 'Stacked Rectangle',\n shortName: 'st-rect',\n description: 'Multiple processes',\n aliases: ['procs', 'processes', 'stacked-rectangle'],\n handler: multiRect,\n },\n {\n semanticName: 'Stored Data',\n name: 'Bow Tie Rectangle',\n shortName: 'bow-rect',\n description: 'Stored data',\n aliases: ['stored-data', 'bow-tie-rectangle'],\n handler: bowTieRect,\n },\n {\n semanticName: 'Summary',\n name: 'Crossed Circle',\n shortName: 'cross-circ',\n description: 'Summary',\n aliases: ['summary', 'crossed-circle'],\n handler: crossedCircle,\n },\n {\n semanticName: 'Tagged Document',\n name: 'Tagged Document',\n shortName: 'tag-doc',\n description: 'Tagged document',\n aliases: ['tag-doc', 'tagged-document'],\n handler: taggedWaveEdgedRectangle,\n },\n {\n semanticName: 'Tagged Process',\n name: 'Tagged Rectangle',\n shortName: 'tag-rect',\n description: 'Tagged process',\n aliases: ['tagged-rectangle', 'tag-proc', 'tagged-process'],\n handler: taggedRect,\n },\n {\n semanticName: 'Paper Tape',\n name: 'Flag',\n shortName: 'flag',\n description: 'Paper tape',\n aliases: ['paper-tape'],\n handler: waveRectangle,\n },\n {\n semanticName: 'Odd',\n name: 'Odd',\n shortName: 'odd',\n description: 'Odd shape',\n internalAliases: ['rect_left_inv_arrow'],\n handler: rect_left_inv_arrow,\n },\n {\n semanticName: 'Lined Document',\n name: 'Lined Document',\n shortName: 'lin-doc',\n description: 'Lined document',\n aliases: ['lined-document'],\n handler: linedWaveEdgedRect,\n },\n] as const satisfies ShapeDefinition[];\n\nconst generateShapeMap = () => {\n // These are the shapes that didn't have documentation present\n const undocumentedShapes = {\n // States\n state,\n choice,\n note,\n\n // Rectangles\n rectWithTitle,\n labelRect,\n\n // Icons\n iconSquare,\n iconCircle,\n icon,\n iconRounded,\n imageSquare,\n anchor,\n\n // Kanban diagram\n kanbanItem,\n\n //Mindmap diagram\n mindmapCircle,\n defaultMindmapNode,\n // class diagram\n classBox,\n\n // er diagram\n erBox,\n\n // Requirement diagram\n requirementBox,\n } as const;\n\n const entries = [\n ...(Object.entries(undocumentedShapes) as Entries),\n ...shapesDefs.flatMap((shape) => {\n const aliases = [\n shape.shortName,\n ...('aliases' in shape ? shape.aliases : []),\n ...('internalAliases' in shape ? shape.internalAliases : []),\n ];\n return aliases.map((alias) => [alias, shape.handler] as const);\n }),\n ];\n return Object.fromEntries(entries) as Record<\n (typeof entries)[number][0],\n (typeof entries)[number][1]\n > satisfies Record;\n};\n\nexport const shapes = generateShapeMap();\n\nexport function isValidShape(shape: string): shape is ShapeID {\n return shape in shapes;\n}\n\nexport type ShapeID = keyof typeof shapes;\n", "import { log } from '../../logger.js';\nimport { shapes } from './shapes.js';\nimport type { Node, NonClusterNode, ShapeRenderOptions } from '../types.js';\nimport type { SVGGroup } from '../../mermaid.js';\nimport type { D3Selection } from '../../types.js';\nimport type { graphlib } from 'dagre-d3-es';\n\ntype ShapeHandler = (typeof shapes)[keyof typeof shapes];\ntype NodeElement = D3Selection | Awaited>;\n\nconst nodeElems = new Map();\n\nexport async function insertNode(\n elem: SVGGroup,\n node: NonClusterNode,\n renderOptions: ShapeRenderOptions\n) {\n let newEl: NodeElement | undefined;\n let el;\n\n //special check for rect shape (with or without rounded corners)\n if (node.shape === 'rect') {\n if (node.rx && node.ry) {\n node.shape = 'roundedRect';\n } else {\n node.shape = 'squareRect';\n }\n }\n\n const shapeHandler = node.shape ? shapes[node.shape] : undefined;\n\n if (!shapeHandler) {\n throw new Error(`No such shape: ${node.shape}. Please check your syntax.`);\n }\n\n if (node.link) {\n // Add link when appropriate\n let target;\n if (renderOptions.config.securityLevel === 'sandbox') {\n target = '_top';\n } else if (node.linkTarget) {\n target = node.linkTarget || '_blank';\n }\n newEl = elem\n .insert('svg:a')\n .attr('xlink:href', node.link)\n .attr('target', target ?? null);\n el = await shapeHandler(newEl, node, renderOptions);\n } else {\n el = await shapeHandler(elem, node, renderOptions);\n newEl = el;\n }\n if (node.tooltip) {\n el.attr('title', node.tooltip);\n }\n\n nodeElems.set(node.id, newEl);\n\n if (node.haveCallback) {\n newEl.attr('class', newEl.attr('class') + ' clickable');\n }\n return newEl;\n}\n\nexport const setNodeElem = (elem: NodeElement, node: Pick) => {\n nodeElems.set(node.id, elem);\n};\n\nexport const clear = () => {\n nodeElems.clear();\n};\n\nexport const positionNode = (node: ReturnType) => {\n const el = nodeElems.get(node.id)!;\n log.trace(\n 'Transforming node',\n node.diff,\n node,\n 'translate(' + (node.x - node.width / 2 - 5) + ', ' + node.width / 2 + ')'\n );\n const padding = 8;\n const diff = node.diff || 0;\n if (node.clusterNode) {\n el.attr(\n 'transform',\n 'translate(' +\n (node.x + diff - node.width / 2) +\n ', ' +\n (node.y - node.height / 2 - padding) +\n ')'\n );\n } else {\n el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');\n }\n return diff;\n};\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,SAAS,cAAc;AAMhB,IAAM,cAAc,8BACzB,QACA,MACA,aACG;AACH,MAAI;AACJ,QAAM,gBAAgB,KAAK,iBAAiB,SAASA,WAAU,GAAG,UAAU;AAC5E,MAAI,CAAC,UAAU;AACb,iBAAa;AAAA,EACf,OAAO;AACL,iBAAa;AAAA,EACf;AAGA,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,UAAU,EACxB,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AAGnC,QAAM,UAAU,SACb,OAAO,GAAG,EACV,KAAK,SAAS,OAAO,EACrB,KAAK,SAAS,oBAAoB,KAAK,UAAU,CAAC;AAGrD,MAAI;AACJ,MAAI,KAAK,UAAU,QAAW;AAC5B,YAAQ;AAAA,EACV,OAAO;AACL,YAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAK,MAAM,CAAC;AAAA,EACpE;AAEA,QAAMC,QAAO,MAAM,WAAW,SAAS,aAAa,eAAe,KAAK,GAAGD,WAAU,CAAC,GAAG;AAAA,IACvF;AAAA,IACA,OAAO,KAAK,SAASA,WAAU,EAAE,WAAW;AAAA;AAAA,IAE5C,YAAY;AAAA,IACZ,OAAO,KAAK;AAAA,IACZ,kBAAkB,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,OAAOC,MAAK,QAAQ;AACxB,QAAM,eAAe,MAAM,WAAW,KAAK;AAE3C,MAAI,eAAe;AACjB,UAAM,MAAMA,MAAK,SAAS,CAAC;AAC3B,UAAM,KAAK,OAAOA,KAAI;AAGtB,UAAM,SAAS,IAAI,qBAAqB,KAAK;AAC7C,QAAI,QAAQ;AACV,YAAM,YAAY,MAAM,QAAQ,eAAe,EAAE,EAAE,KAAK,MAAM;AAE9D,YAAM,QAAQ;AAAA,QACZ,CAAC,GAAG,MAAM,EAAE;AAAA,UACV,CAAC,QACC,IAAI,QAAQ,CAAC,QAAQ;AAInB,qBAAS,aAAa;AACpB,kBAAI,MAAM,UAAU;AACpB,kBAAI,MAAM,gBAAgB;AAE1B,kBAAI,WAAW;AAEb,sBAAM,eAAeD,WAAU,EAAE,WAC7BA,WAAU,EAAE,WACZ,OAAO,iBAAiB,SAAS,IAAI,EAAE;AAC3C,sBAAM,kBAAkB;AACxB,sBAAM,CAAC,qBAAqB,sBAAc,QAAQ,IAAI,cAAc,YAAY;AAChF,sBAAM,QAAQ,qBAAqB,kBAAkB;AACrD,oBAAI,MAAM,WAAW;AACrB,oBAAI,MAAM,WAAW;AAAA,cACvB,OAAO;AACL,oBAAI,MAAM,QAAQ;AAAA,cACpB;AACA,kBAAI,GAAG;AAAA,YACT;AAlBS;AAmBT,uBAAW,MAAM;AACf,kBAAI,IAAI,UAAU;AAChB,2BAAW;AAAA,cACb;AAAA,YACF,CAAC;AACD,gBAAI,iBAAiB,SAAS,UAAU;AACxC,gBAAI,iBAAiB,QAAQ,UAAU;AAAA,UACzC,CAAC;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAEA,WAAO,IAAI,sBAAsB;AACjC,OAAG,KAAK,SAAS,KAAK,KAAK;AAC3B,OAAG,KAAK,UAAU,KAAK,MAAM;AAAA,EAC/B;AAGA,MAAI,eAAe;AACjB,YAAQ,KAAK,aAAa,eAAe,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,IAAI,GAAG;AAAA,EAC1F,OAAO;AACL,YAAQ,KAAK,aAAa,kBAA0B,CAAC,KAAK,SAAS,IAAI,GAAG;AAAA,EAC5E;AACA,MAAI,KAAK,aAAa;AACpB,YAAQ,KAAK,aAAa,eAAe,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,IAAI,GAAG;AAAA,EAC1F;AACA,UAAQ,OAAO,QAAQ,cAAc;AACrC,SAAO,EAAE,UAAU,MAAM,aAAa,OAAO,QAAQ;AACvD,GA5G2B;AA6GpB,IAAM,cAAc,8BACzB,QACA,OACA,YAUG;AACH,QAAM,gBAAgB,QAAQ,iBAAiB,SAASA,WAAU,GAAG,WAAW,UAAU;AAG1F,QAAM,UAAU,OACb,OAAO,GAAG,EACV,KAAK,SAAS,OAAO,EACrB,KAAK,SAAS,QAAQ,cAAc,EAAE;AAEzC,QAAMC,QAAO,MAAM,WAAW,SAAS,aAAa,eAAe,KAAK,GAAGD,WAAU,CAAC,GAAG;AAAA,IACvF;AAAA,IACA,OAAO,QAAQ,SAASA,WAAU,GAAG,WAAW;AAAA,IAChD,OAAO,QAAQ;AAAA,IACf,kBAAkB,CAAC,CAAC,QAAQ,QAAQ,CAAC,CAAC,QAAQ;AAAA,EAChD,CAAC;AAED,MAAI,OAAOC,MAAK,QAAQ;AACxB,QAAM,cAAc,QAAQ,UAAU;AAEtC,MAAI,SAASD,WAAU,GAAG,WAAW,UAAU,GAAG;AAChD,UAAM,MAAMC,MAAK,SAAS,CAAC;AAC3B,UAAM,KAAK,OAAOA,KAAI;AAEtB,WAAO,IAAI,sBAAsB;AACjC,OAAG,KAAK,SAAS,KAAK,KAAK;AAC3B,OAAG,KAAK,UAAU,KAAK,MAAM;AAAA,EAC/B;AAGA,MAAI,eAAe;AACjB,YAAQ,KAAK,aAAa,eAAe,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,IAAI,GAAG;AAAA,EAC1F,OAAO;AACL,YAAQ,KAAK,aAAa,kBAA0B,CAAC,KAAK,SAAS,IAAI,GAAG;AAAA,EAC5E;AACA,MAAI,QAAQ,aAAa;AACvB,YAAQ,KAAK,aAAa,eAAe,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,IAAI,GAAG;AAAA,EAC1F;AACA,UAAQ,OAAO,QAAQ,cAAc;AACrC,SAAO,EAAE,UAAU,QAAQ,MAAM,aAAa,OAAO,QAAQ;AAC/D,GApD2B;AAqDpB,IAAM,mBAAmB,wBAC9B,MAEA,YACG;AACH,QAAM,OAAO,QAAQ,KAAK,EAAG,QAAQ;AACrC,OAAK,QAAQ,KAAK;AAClB,OAAK,SAAS,KAAK;AACrB,GARgC;AAoCzB,IAAM,iBAAiB,wBAAC,MAAY,WACxC,KAAK,SAAS,cAAc,eAAe,UAAU,MAAM,KAAK,aAAa,OAAO,SAAS,KADlE;AAGvB,SAAS,qBAAqB,QAAiB;AACpD,QAAM,eAAe,OAAO,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE;AAC/E,eAAa,KAAK,GAAG;AACrB,SAAO,aAAa,KAAK,GAAG;AAC9B;AAJgB;AAMT,SAAS,2BACd,IACA,IACA,IACA,IACA,WACA,WACA;AACA,QAAM,SAAS,CAAC;AAChB,QAAM,QAAQ;AACd,QAAM,SAAS,KAAK;AACpB,QAAM,SAAS,KAAK;AACpB,QAAM,cAAc,SAAS;AAG7B,QAAM,YAAa,IAAI,KAAK,KAAM;AAClC,QAAM,OAAO,KAAK,SAAS;AAE3B,WAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,UAAM,IAAI,IAAI;AACd,UAAM,IAAI,KAAK,IAAI;AACnB,UAAM,IAAI,OAAO,YAAY,KAAK,IAAI,aAAa,IAAI,GAAG;AAE1D,WAAO,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA,EACtB;AAEA,SAAO;AACT;AA3BgB;AAqCT,SAAS,qBACd,SACA,SACA,QACA,WACA,YACA,UACA;AACA,QAAM,SAAS,CAAC;AAGhB,QAAM,gBAAiB,aAAa,KAAK,KAAM;AAC/C,QAAM,cAAe,WAAW,KAAK,KAAM;AAG3C,QAAM,aAAa,cAAc;AAGjC,QAAM,YAAY,cAAc,YAAY;AAE5C,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,UAAM,QAAQ,gBAAgB,IAAI;AAClC,UAAM,IAAI,UAAU,SAAS,KAAK,IAAI,KAAK;AAC3C,UAAM,IAAI,UAAU,SAAS,KAAK,IAAI,KAAK;AAC3C,WAAO,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;AAAA,EAC9B;AAEA,SAAO;AACT;AA5BgB;;;ACzPhB,SAAS,UAAAC,eAAc;AACvB,OAAO,WAAW;;;ACLlB,IAAM,gBAAgB,wBAAC,MAAM,UAAU;AACrC,MAAI,IAAI,KAAK;AACb,MAAI,IAAI,KAAK;AAIb,MAAI,KAAK,MAAM,IAAI;AACnB,MAAI,KAAK,MAAM,IAAI;AACnB,MAAI,IAAI,KAAK,QAAQ;AACrB,MAAI,IAAI,KAAK,SAAS;AAEtB,MAAI,IAAI;AACR,MAAI,KAAK,IAAI,EAAE,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI,GAAG;AAEvC,QAAI,KAAK,GAAG;AACV,UAAI,CAAC;AAAA,IACP;AACA,SAAK,OAAO,IAAI,IAAK,IAAI,KAAM;AAC/B,SAAK;AAAA,EACP,OAAO;AAEL,QAAI,KAAK,GAAG;AACV,UAAI,CAAC;AAAA,IACP;AACA,SAAK;AACL,SAAK,OAAO,IAAI,IAAK,IAAI,KAAM;AAAA,EACjC;AAEA,SAAO,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG;AAChC,GA7BsB;AA+BtB,IAAO,yBAAQ;;;AC/Bf,SAAS,UAAAC,eAAc;AAevB,SAAS,WAAW,KAAK,SAAS;AAChC,MAAI,SAAS;AACX,QAAI,KAAK,SAAS,OAAO;AAAA,EAC3B;AACF;AAJS;AAUT,eAAe,aAAa,MAAM;AAChC,QAAM,KAAKC,QAAO,SAAS,gBAAgB,8BAA8B,eAAe,CAAC;AACzF,QAAM,MAAM,GAAG,OAAO,WAAW;AAEjC,QAAM,SAASC,WAAU;AACzB,MAAI,QAAQ,KAAK;AACjB,MAAI,KAAK,SAAS,SAAS,KAAK,KAAK,GAAG;AACtC,YAAQ,MAAM,qBAAqB,KAAK,MAAM,QAAQ,eAAO,gBAAgB,IAAI,GAAG,MAAM;AAAA,EAC5F;AACA,QAAM,aAAa,KAAK,SAAS,cAAc;AAC/C,QAAM,YACJ,kBACA,aACA,QACC,KAAK,aAAa,YAAY,KAAK,aAAa,MAAM;AAAA,EACvD,MACA,QACA;AACF,MAAI,KAAK,aAAa,WAAW,MAAM,CAAC;AAExC,aAAW,KAAK,KAAK,UAAU;AAC/B,MAAI,MAAM,WAAW,cAAc;AACnC,MAAI,MAAM,iBAAiB,KAAK;AAEhC,MAAI,MAAM,eAAe,QAAQ;AACjC,MAAI,KAAK,SAAS,8BAA8B;AAChD,SAAO,GAAG,KAAK;AACjB;AA3Be;AAmCf,IAAM,cAAc,8BAAO,aAAa,OAAO,SAAS,WAAW;AACjE,MAAI,aAAa,eAAe;AAChC,MAAI,OAAO,eAAe,UAAU;AAClC,iBAAa,WAAW,CAAC;AAAA,EAC3B;AAEA,MAAI,SAASA,WAAU,EAAE,UAAU,UAAU,GAAG;AAE9C,iBAAa,WAAW,QAAQ,WAAW,QAAQ;AACnD,QAAI,KAAK,eAAe,UAAU;AAClC,UAAM,OAAO;AAAA,MACX;AAAA,MACA,OAAO,eAAe,UAAU,EAAE;AAAA,QAChC;AAAA,QACA,CAAC,MAAM,aAAa,EAAE,QAAQ,KAAK,GAAG,CAAC;AAAA,MACzC;AAAA,MACA,YAAY,QAAQ,MAAM,QAAQ,SAAS,QAAQ,IAAI;AAAA,IACzD;AACA,QAAI,aAAa,MAAM,aAAa,IAAI;AAExC,WAAO;AAAA,EACT,OAAO;AACL,UAAM,WAAW,SAAS,gBAAgB,8BAA8B,MAAM;AAC9E,aAAS,aAAa,SAAS,MAAM,QAAQ,UAAU,OAAO,CAAC;AAC/D,QAAI,OAAO,CAAC;AACZ,QAAI,OAAO,eAAe,UAAU;AAClC,aAAO,WAAW,MAAM,qBAAqB;AAAA,IAC/C,WAAW,MAAM,QAAQ,UAAU,GAAG;AACpC,aAAO;AAAA,IACT,OAAO;AACL,aAAO,CAAC;AAAA,IACV;AAEA,eAAW,OAAO,MAAM;AACtB,YAAM,QAAQ,SAAS,gBAAgB,8BAA8B,OAAO;AAC5E,YAAM,eAAe,wCAAwC,aAAa,UAAU;AACpF,YAAM,aAAa,MAAM,KAAK;AAC9B,YAAM,aAAa,KAAK,GAAG;AAC3B,UAAI,SAAS;AACX,cAAM,aAAa,SAAS,WAAW;AAAA,MACzC,OAAO;AACL,cAAM,aAAa,SAAS,KAAK;AAAA,MACnC;AACA,YAAM,cAAc,IAAI,KAAK;AAC7B,eAAS,YAAY,KAAK;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AACF,GAhDoB;AAkDpB,IAAO,sBAAQ;;;AC9GR,IAAM,yBAAyB,wBACpC,GACA,GACA,YACA,aACA,WAEA;AAAA,EACE;AAAA,EACA,IAAI;AAAA,EACJ;AAAA;AAAA,EACA;AAAA,EACA,IAAI,aAAa;AAAA;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA;AAAA,EACJ;AAAA,EACA,IAAI,cAAc;AAAA;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,IAAI,aAAa;AAAA,EACjB,IAAI;AAAA;AAAA,EACJ;AAAA,EACA,IAAI;AAAA;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,IAAI,cAAc;AAAA;AAAA,EAClB;AAAA,EACA,IAAI;AAAA;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,IAAI;AAAA,EACJ;AAAA;AAAA,EACA;AAAA;AACF,EAAE,KAAK,GAAG,GApD0B;;;AHYtC,IAAM,OAAO,8BAAO,QAAQ,SAAS;AACnC,MAAI,KAAK,+BAA+B,KAAK,IAAI,IAAI;AACrD,QAAM,aAAaC,WAAU;AAC7B,QAAM,EAAE,gBAAgB,cAAc,IAAI;AAC1C,QAAM,EAAE,YAAY,cAAc,IAAI;AAEtC,QAAM,EAAE,aAAa,YAAY,cAAc,iBAAiB,IAAI,cAAc,IAAI;AAGtF,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,aAAa,KAAK,UAAU,EAC1C,KAAK,MAAM,KAAK,EAAE,EAClB,KAAK,aAAa,KAAK,IAAI;AAE9B,QAAM,gBAAgB,SAAS,WAAW,UAAU,UAAU;AAG9D,QAAM,UAAU,SAAS,OAAO,GAAG,EAAE,KAAK,SAAS,gBAAgB;AAEnE,QAAMC,QAAO,MAAM,WAAW,SAAS,KAAK,OAAO;AAAA,IACjD,OAAO,KAAK;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAGD,MAAI,OAAOA,MAAK,QAAQ;AAExB,MAAI,SAAS,WAAW,UAAU,UAAU,GAAG;AAC7C,UAAM,MAAMA,MAAK,SAAS,CAAC;AAC3B,UAAM,KAAKC,QAAOD,KAAI;AACtB,WAAO,IAAI,sBAAsB;AACjC,OAAG,KAAK,SAAS,KAAK,KAAK;AAC3B,OAAG,KAAK,UAAU,KAAK,MAAM;AAAA,EAC/B;AAEA,QAAM,QAAQ,KAAK,SAAS,KAAK,QAAQ,KAAK,UAAU,KAAK,QAAQ,KAAK,UAAU,KAAK;AACzF,MAAI,KAAK,SAAS,KAAK,QAAQ,KAAK,SAAS;AAC3C,SAAK,QAAQ,QAAQ,KAAK,SAAS,IAAI,KAAK;AAAA,EAC9C,OAAO;AACL,SAAK,OAAO,CAAC,KAAK;AAAA,EACpB;AAEA,QAAM,SAAS,KAAK;AACpB,QAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,QAAM,IAAI,KAAK,IAAI,SAAS;AAE5B,MAAI,MAAM,SAAS,MAAM,KAAK,UAAU,IAAI,CAAC;AAC7C,MAAIE;AACJ,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAK,MAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM;AAAA,MACtC,WAAW;AAAA,MACX,MAAM;AAAA;AAAA,MAEN,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AACD,UAAM,YAAY,GAAG,KAAK,uBAAuB,GAAG,GAAG,OAAO,QAAQ,CAAC,GAAG,OAAO;AACjF,IAAAA,QAAO,SAAS,OAAO,MAAM;AAC3B,UAAI,MAAM,yBAAyB,SAAS;AAC5C,aAAO;AAAA,IACT,GAAG,cAAc;AAEjB,IAAAA,MAAK,OAAO,mBAAmB,EAAE,KAAK,SAAS,aAAa,KAAK,GAAG,CAAC;AACrE,IAAAA,MAAK,OAAO,MAAM,EAAE,KAAK,SAAS,iBAAiB,KAAK,GAAG,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAAA,EACxF,OAAO;AAEL,IAAAA,QAAO,SAAS,OAAO,QAAQ,cAAc;AAE7C,IAAAA,MACG,KAAK,SAAS,UAAU,EACxB,KAAK,MAAM,KAAK,EAAE,EAClB,KAAK,MAAM,KAAK,EAAE,EAClB,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,SAAS,KAAK,EACnB,KAAK,UAAU,MAAM;AAAA,EAC1B;AACA,QAAM,EAAE,uBAAuB,IAAI,wBAAwB,UAAU;AACrE,UAAQ;AAAA,IACN;AAAA;AAAA,IAEA,aAAa,KAAK,IAAI,KAAK,QAAQ,CAAC,KAAK,KAAK,IAAI,KAAK,SAAS,IAAI,sBAAsB;AAAA,EAC5F;AAEA,MAAI,aAAa;AACf,UAAM,OAAO,QAAQ,OAAO,MAAM;AAClC,QAAI,MAAM;AACR,WAAK,KAAK,SAAS,WAAW;AAAA,IAChC;AAAA,EACF;AAGA,QAAM,UAAUA,MAAK,KAAK,EAAE,QAAQ;AACpC,OAAK,UAAU;AACf,OAAK,QAAQ,QAAQ;AACrB,OAAK,SAAS,QAAQ;AAEtB,OAAK,UAAU,KAAK,SAAS,KAAK,UAAU;AAE5C,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,uBAAc,MAAM,KAAK;AAAA,EAClC;AAEA,SAAO,EAAE,SAAS,UAAU,WAAW,KAAK;AAC9C,GA7Ga;AAsHb,IAAM,YAAY,wBAAC,QAAQ,SAAS;AAElC,QAAM,WAAW,OAAO,OAAO,GAAG,EAAE,KAAK,SAAS,cAAc,EAAE,KAAK,MAAM,KAAK,EAAE;AAGpF,QAAMA,QAAO,SAAS,OAAO,QAAQ,cAAc;AAEnD,QAAM,UAAU,IAAI,KAAK;AACzB,QAAM,cAAc,UAAU;AAG9B,EAAAA,MACG,KAAK,MAAM,KAAK,EAAE,EAClB,KAAK,MAAM,KAAK,EAAE,EAClB,KAAK,KAAK,KAAK,IAAI,KAAK,QAAQ,IAAI,WAAW,EAC/C,KAAK,KAAK,KAAK,IAAI,KAAK,SAAS,IAAI,WAAW,EAChD,KAAK,SAAS,KAAK,QAAQ,OAAO,EAClC,KAAK,UAAU,KAAK,SAAS,OAAO,EACpC,KAAK,QAAQ,MAAM;AAEtB,QAAM,UAAUA,MAAK,KAAK,EAAE,QAAQ;AACpC,OAAK,QAAQ,QAAQ;AACrB,OAAK,SAAS,QAAQ;AAEtB,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,uBAAc,MAAM,KAAK;AAAA,EAClC;AAEA,SAAO,EAAE,SAAS,UAAU,WAAW,EAAE,OAAO,GAAG,QAAQ,EAAE,EAAE;AACjE,GA7BkB;AA+BlB,IAAM,mBAAmB,8BAAO,QAAQ,SAAS;AAC/C,QAAM,aAAaH,WAAU;AAE7B,QAAM,EAAE,gBAAgB,cAAc,IAAI;AAC1C,QAAM,EAAE,eAAe,qBAAqB,0BAA0B,WAAW,IAC/E;AAGF,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,KAAK,UAAU,EAC7B,KAAK,MAAM,KAAK,EAAE,EAClB,KAAK,WAAW,KAAK,EAAE,EACvB,KAAK,aAAa,KAAK,IAAI;AAG9B,QAAM,aAAa,SAAS,OAAO,KAAK,cAAc;AAGtD,QAAM,QAAQ,SAAS,OAAO,GAAG,EAAE,KAAK,SAAS,eAAe;AAChE,MAAI,YAAY,SAAS,OAAO,MAAM;AAEtC,QAAMC,QAAO,MACV,KAAK,EACL,YAAY,MAAM,oBAAY,KAAK,OAAO,KAAK,YAAY,QAAW,IAAI,CAAC;AAG9E,MAAI,OAAOA,MAAK,QAAQ;AAExB,MAAI,SAAS,WAAW,UAAU,UAAU,GAAG;AAC7C,UAAM,MAAMA,MAAK,SAAS,CAAC;AAC3B,UAAM,KAAKC,QAAOD,KAAI;AACtB,WAAO,IAAI,sBAAsB;AACjC,OAAG,KAAK,SAAS,KAAK,KAAK;AAC3B,OAAG,KAAK,UAAU,KAAK,MAAM;AAAA,EAC/B;AAGA,QAAM,UAAU,IAAI,KAAK;AACzB,QAAM,cAAc,UAAU;AAE9B,QAAM,SACH,KAAK,SAAS,KAAK,QAAQ,KAAK,UAAU,KAAK,QAAQ,KAAK,UAAU,KAAK,SAAS;AACvF,MAAI,KAAK,SAAS,KAAK,QAAQ,KAAK,SAAS;AAC3C,SAAK,QAAQ,QAAQ,KAAK,SAAS,IAAI,KAAK;AAAA,EAC9C,OAAO;AACL,SAAK,OAAO,CAAC,KAAK;AAAA,EACpB;AAEA,QAAM,SAAS,KAAK,SAAS;AAE7B,QAAM,cAAc,KAAK,SAAS,UAAU,KAAK,SAAS;AAC1D,QAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,QAAM,IAAI,KAAK,IAAI,SAAS;AAC5B,OAAK,QAAQ;AACb,QAAM,SAAS,KAAK,IAAI,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS;AAGtE,MAAIE;AACJ,MAAI,KAAK,SAAS,aAAa;AAC7B,UAAM,QAAQ,KAAK,WAAW,SAAS,0BAA0B;AACjE,UAAM,KAAK,MAAM,IAAI,QAAQ;AAC7B,UAAM,iBACJ,KAAK,MAAM,KAAK,KACZ,GAAG,KAAK,uBAAuB,GAAG,GAAG,OAAO,QAAQ,EAAE,GAAG;AAAA,MACvD,WAAW;AAAA,MACX,MAAM;AAAA,MACN,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC,IACD,GAAG,UAAU,GAAG,GAAG,OAAO,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE/D,IAAAA,QAAO,SAAS,OAAO,MAAM,gBAAgB,cAAc;AAC3D,UAAM,iBAAiB,GAAG,UAAU,GAAG,QAAQ,OAAO,aAAa;AAAA,MACjE,MAAM,QAAQ,gBAAgB;AAAA,MAC9B,WAAW,QAAQ,YAAY;AAAA,MAC/B,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAED,IAAAA,QAAO,SAAS,OAAO,MAAM,gBAAgB,cAAc;AAC3D,gBAAY,SAAS,OAAO,MAAM,cAAc;AAAA,EAClD,OAAO;AACL,IAAAA,QAAO,WAAW,OAAO,QAAQ,cAAc;AAC/C,UAAM,iBAAiB;AAGvB,IAAAA,MACG,KAAK,SAAS,cAAc,EAC5B,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,SAAS,KAAK,EACnB,KAAK,UAAU,MAAM,EACrB,KAAK,aAAa,KAAK,IAAI;AAC9B,cACG,KAAK,SAAS,OAAO,EACrB,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,MAAM,EAChB,KAAK,SAAS,KAAK,EACnB,KAAK,UAAU,WAAW;AAAA,EAC/B;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,KAAK,IAAI,KAAK,QAAQ,CAAC,KAAK,IAAI,KAAK,SAAS,WAAW,UAAU,UAAU,IAAI,IAAI,EAAE;AAAA,EACtG;AAEA,QAAM,UAAUA,MAAK,KAAK,EAAE,QAAQ;AACpC,OAAK,SAAS,QAAQ;AACtB,OAAK,UAAU;AAEf,OAAK,UAAU,KAAK,SAAS,KAAK,UAAU;AAC5C,OAAK,YAAY;AAEjB,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,uBAAc,MAAM,KAAK;AAAA,EAClC;AAEA,SAAO,EAAE,SAAS,UAAU,WAAW,KAAK;AAC9C,GAxHyB;AAyHzB,IAAM,gBAAgB,8BAAO,QAAQ,SAAS;AAC5C,MAAI,KAAK,+BAA+B,KAAK,IAAI,IAAI;AACrD,QAAM,aAAaH,WAAU;AAC7B,QAAM,EAAE,gBAAgB,cAAc,IAAI;AAC1C,QAAM,EAAE,YAAY,cAAc,IAAI;AAEtC,QAAM,EAAE,aAAa,YAAY,cAAc,iBAAiB,IAAI,cAAc,IAAI;AAGtF,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,aAAa,KAAK,UAAU,EAC1C,KAAK,MAAM,KAAK,EAAE,EAClB,KAAK,aAAa,KAAK,IAAI;AAE9B,QAAM,gBAAgB,SAAS,WAAW,UAAU,UAAU;AAG9D,QAAM,UAAU,SAAS,OAAO,GAAG,EAAE,KAAK,SAAS,gBAAgB;AAEnE,QAAMC,QAAO,MAAM,WAAW,SAAS,KAAK,OAAO;AAAA,IACjD,OAAO,KAAK;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,IACR,OAAO,KAAK;AAAA,EACd,CAAC;AAGD,MAAI,OAAOA,MAAK,QAAQ;AAExB,MAAI,SAAS,WAAW,UAAU,UAAU,GAAG;AAC7C,UAAM,MAAMA,MAAK,SAAS,CAAC;AAC3B,UAAM,KAAKC,QAAOD,KAAI;AACtB,WAAO,IAAI,sBAAsB;AACjC,OAAG,KAAK,SAAS,KAAK,KAAK;AAC3B,OAAG,KAAK,UAAU,KAAK,MAAM;AAAA,EAC/B;AAEA,QAAM,QAAQ,KAAK,SAAS,KAAK,QAAQ,KAAK,UAAU,KAAK,QAAQ,KAAK,UAAU,KAAK;AACzF,MAAI,KAAK,SAAS,KAAK,QAAQ,KAAK,SAAS;AAC3C,SAAK,QAAQ,QAAQ,KAAK,SAAS,IAAI,KAAK;AAAA,EAC9C,OAAO;AACL,SAAK,OAAO,CAAC,KAAK;AAAA,EACpB;AAEA,QAAM,SAAS,KAAK;AACpB,QAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,QAAM,IAAI,KAAK,IAAI,SAAS;AAE5B,MAAI,MAAM,SAAS,MAAM,KAAK,UAAU,IAAI,CAAC;AAC7C,MAAIE;AACJ,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAK,MAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM;AAAA,MACtC,WAAW;AAAA,MACX,MAAM;AAAA;AAAA,MAEN,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AACD,UAAM,YAAY,GAAG,KAAK,uBAAuB,GAAG,GAAG,OAAO,QAAQ,KAAK,EAAE,GAAG,OAAO;AACvF,IAAAA,QAAO,SAAS,OAAO,MAAM;AAC3B,UAAI,MAAM,yBAAyB,SAAS;AAC5C,aAAO;AAAA,IACT,GAAG,cAAc;AAEjB,IAAAA,MAAK,OAAO,mBAAmB,EAAE,KAAK,SAAS,aAAa,KAAK,GAAG,CAAC;AACrE,IAAAA,MAAK,OAAO,MAAM,EAAE,KAAK,SAAS,iBAAiB,KAAK,GAAG,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAAA,EACxF,OAAO;AAEL,IAAAA,QAAO,SAAS,OAAO,QAAQ,cAAc;AAE7C,IAAAA,MACG,KAAK,SAAS,UAAU,EACxB,KAAK,MAAM,KAAK,EAAE,EAClB,KAAK,MAAM,KAAK,EAAE,EAClB,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,SAAS,KAAK,EACnB,KAAK,UAAU,MAAM;AAAA,EAC1B;AACA,QAAM,EAAE,uBAAuB,IAAI,wBAAwB,UAAU;AACrE,UAAQ;AAAA,IACN;AAAA;AAAA,IAEA,aAAa,KAAK,IAAI,KAAK,QAAQ,CAAC,KAAK,KAAK,IAAI,KAAK,SAAS,IAAI,sBAAsB;AAAA,EAC5F;AAEA,MAAI,aAAa;AACf,UAAM,OAAO,QAAQ,OAAO,MAAM;AAClC,QAAI,MAAM;AACR,WAAK,KAAK,SAAS,WAAW;AAAA,IAChC;AAAA,EACF;AAGA,QAAM,UAAUA,MAAK,KAAK,EAAE,QAAQ;AACpC,OAAK,UAAU;AACf,OAAK,QAAQ,QAAQ;AACrB,OAAK,SAAS,QAAQ;AAEtB,OAAK,UAAU,KAAK,SAAS,KAAK,UAAU;AAE5C,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,uBAAc,MAAM,KAAK;AAAA,EAClC;AAEA,SAAO,EAAE,SAAS,UAAU,WAAW,KAAK;AAC9C,GA9GsB;AA+GtB,IAAM,UAAU,wBAAC,QAAQ,SAAS;AAChC,QAAM,aAAaH,WAAU;AAE7B,QAAM,EAAE,gBAAgB,cAAc,IAAI;AAC1C,QAAM,EAAE,WAAW,IAAI;AAGvB,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,KAAK,UAAU,EAC7B,KAAK,MAAM,KAAK,EAAE,EAClB,KAAK,aAAa,KAAK,IAAI;AAG9B,QAAM,aAAa,SAAS,OAAO,KAAK,cAAc;AAEtD,QAAM,UAAU,IAAI,KAAK;AAEzB,QAAM,QAAQ,KAAK,QAAQ;AAE3B,OAAK,OAAO,CAAC,KAAK;AAElB,QAAM,SAAS,KAAK,SAAS;AAE7B,QAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,QAAM,IAAI,KAAK,IAAI,SAAS;AAC5B,OAAK,QAAQ;AAGb,MAAIG;AACJ,MAAI,KAAK,SAAS,aAAa;AAC7B,UAAM,KAAK,MAAM,IAAI,QAAQ;AAC7B,UAAM,iBAAiB,GAAG,UAAU,GAAG,GAAG,OAAO,QAAQ;AAAA,MACvD,MAAM;AAAA,MACN,WAAW;AAAA,MACX,gBAAgB,CAAC,CAAC;AAAA,MAClB,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAED,IAAAA,QAAO,SAAS,OAAO,MAAM,gBAAgB,cAAc;AAAA,EAC7D,OAAO;AACL,IAAAA,QAAO,WAAW,OAAO,QAAQ,cAAc;AAC/C,UAAM,iBAAiB;AAGvB,IAAAA,MACG,KAAK,SAAS,cAAc,EAC5B,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,SAAS,KAAK,EACnB,KAAK,UAAU,MAAM,EACrB,KAAK,aAAa,KAAK,IAAI;AAAA,EAChC;AAEA,QAAM,UAAUA,MAAK,KAAK,EAAE,QAAQ;AACpC,OAAK,SAAS,QAAQ;AACtB,OAAK,UAAU;AAEf,OAAK,UAAU;AAEf,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,uBAAc,MAAM,KAAK;AAAA,EAClC;AAEA,SAAO,EAAE,SAAS,UAAU,WAAW,CAAC,EAAE;AAC5C,GAlEgB;AAoEhB,IAAM,aAAa;AACnB,IAAM,SAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAI,eAAe,oBAAI,IAAI;AASpB,IAAM,gBAAgB,8BAAO,MAAM,SAAS;AACjD,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,UAAU,MAAM,OAAO,KAAK,EAAE,MAAM,IAAI;AAC9C,eAAa,IAAI,KAAK,IAAI,OAAO;AACjC,SAAO;AACT,GAL6B;AAetB,IAAM,QAAQ,6BAAM;AACzB,iBAAe,oBAAI,IAAI;AACzB,GAFqB;;;AI/erB,SAAS,cAAc,MAAM,OAAO;AAClC,SAAO,KAAK,UAAU,KAAK;AAC7B;AAFS;AAIT,IAAO,yBAAQ;;;ACJf,SAAS,iBAAiB,MAAM,IAAI,IAAI,OAAO;AAG7C,MAAI,KAAK,KAAK;AACd,MAAI,KAAK,KAAK;AAEd,MAAI,KAAK,KAAK,MAAM;AACpB,MAAI,KAAK,KAAK,MAAM;AAEpB,MAAI,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAEzD,MAAI,KAAK,KAAK,IAAK,KAAK,KAAK,KAAM,GAAG;AACtC,MAAI,MAAM,IAAI,IAAI;AAChB,SAAK,CAAC;AAAA,EACR;AACA,MAAI,KAAK,KAAK,IAAK,KAAK,KAAK,KAAM,GAAG;AACtC,MAAI,MAAM,IAAI,IAAI;AAChB,SAAK,CAAC;AAAA,EACR;AAEA,SAAO,EAAE,GAAG,KAAK,IAAI,GAAG,KAAK,GAAG;AAClC;AArBS;AAuBT,IAAO,4BAAQ;;;ACrBf,SAAS,gBAAgB,MAAM,IAAI,OAAO;AACxC,SAAO,0BAAiB,MAAM,IAAI,IAAI,KAAK;AAC7C;AAFS;AAIT,IAAO,2BAAQ;;;ACHf,SAAS,cAAc,IAAI,IAAI,IAAI,IAAI;AACrC;AAME,UAAM,KAAK,GAAG,IAAI,GAAG;AACrB,UAAM,KAAK,GAAG,IAAI,GAAG;AACrB,UAAM,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG;AAGnC,UAAM,KAAK,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI;AACnC,UAAM,KAAK,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI;AAEnC,UAAM,UAAU;AAIhB,QAAI,OAAO,KAAK,OAAO,KAAK,SAAS,IAAI,EAAE,GAAG;AAC5C;AAAA,IACF;AAGA,UAAM,KAAK,GAAG,IAAI,GAAG;AACrB,UAAM,KAAK,GAAG,IAAI,GAAG;AACrB,UAAM,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG;AAGnC,UAAM,KAAK,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI;AACnC,UAAM,KAAK,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI;AAKnC,QAAI,KAAK,IAAI,EAAE,IAAI,WAAW,KAAK,IAAI,EAAE,IAAI,WAAW,SAAS,IAAI,EAAE,GAAG;AACxE;AAAA,IACF;AAGA,UAAM,QAAQ,KAAK,KAAK,KAAK;AAC7B,QAAI,UAAU,GAAG;AACf;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,IAAI,QAAQ,CAAC;AAKjC,QAAI,MAAM,KAAK,KAAK,KAAK;AACzB,UAAM,IAAI,MAAM,KAAK,MAAM,UAAU,SAAS,MAAM,UAAU;AAE9D,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,IAAI,MAAM,KAAK,MAAM,UAAU,SAAS,MAAM,UAAU;AAE9D,WAAO,EAAE,GAAM,EAAK;AAAA,EACtB;AACF;AA1DS;AA4DT,SAAS,SAAS,IAAI,IAAI;AACxB,SAAO,KAAK,KAAK;AACnB;AAFS;AAIT,IAAO,yBAAQ;;;AC7Df,SAAS,iBAAiB,MAAM,YAAY,OAAO;AACjD,MAAI,KAAK,KAAK;AACd,MAAI,KAAK,KAAK;AAEd,MAAI,gBAAgB,CAAC;AAErB,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,WAAW,YAAY,YAAY;AAC5C,eAAW,QAAQ,SAAU,OAAO;AAClC,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAAA,IAC/B,CAAC;AAAA,EACH,OAAO;AACL,WAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,WAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAAA,EACpC;AAEA,MAAI,OAAO,KAAK,KAAK,QAAQ,IAAI;AACjC,MAAI,MAAM,KAAK,KAAK,SAAS,IAAI;AAEjC,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,QAAI,KAAK,WAAW,CAAC;AACrB,QAAI,KAAK,WAAW,IAAI,WAAW,SAAS,IAAI,IAAI,IAAI,CAAC;AACzD,QAAI,YAAY;AAAA,MACd;AAAA,MACA;AAAA,MACA,EAAE,GAAG,OAAO,GAAG,GAAG,GAAG,MAAM,GAAG,EAAE;AAAA,MAChC,EAAE,GAAG,OAAO,GAAG,GAAG,GAAG,MAAM,GAAG,EAAE;AAAA,IAClC;AACA,QAAI,WAAW;AACb,oBAAc,KAAK,SAAS;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,QAAQ;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,SAAS,GAAG;AAE5B,kBAAc,KAAK,SAAU,GAAG,GAAG;AACjC,UAAI,MAAM,EAAE,IAAI,MAAM;AACtB,UAAI,MAAM,EAAE,IAAI,MAAM;AACtB,UAAI,QAAQ,KAAK,KAAK,MAAM,MAAM,MAAM,GAAG;AAE3C,UAAI,MAAM,EAAE,IAAI,MAAM;AACtB,UAAI,MAAM,EAAE,IAAI,MAAM;AACtB,UAAI,QAAQ,KAAK,KAAK,MAAM,MAAM,MAAM,GAAG;AAE3C,aAAO,QAAQ,QAAQ,KAAK,UAAU,QAAQ,IAAI;AAAA,IACpD,CAAC;AAAA,EACH;AACA,SAAO,cAAc,CAAC;AACxB;AAtDS;AAwDT,IAAO,4BAAQ;;;ACpDf,IAAO,oBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACXA,OAAOC,YAAW;AAIX,SAAS,OAAqC,QAAwB,MAAY;AACvF,QAAM,EAAE,YAAY,IAAI,cAAc,IAAI;AAC1C,OAAK,aAAa;AAClB,QAAM,UAAU,eAAe,IAAI;AACnC,MAAI,aAAa;AACjB,MAAI,CAAC,SAAS;AACZ,iBAAa;AAAA,EACf;AACA,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,UAAU,EACxB,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AAEnC,QAAM,SAAS;AAEf,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,OAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQ,WAAW,QAAQ,CAAC;AAE7F,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AAAA,EACtB;AACA,QAAM,YAAY,GAAG,OAAO,GAAG,GAAG,SAAS,GAAG,OAAO;AACrD,QAAM,aAAa,SAAS,OAAO,MAAM,WAAW,cAAc;AAClE,aAAW,KAAK,SAAS,QAAQ,EAAE,KAAK,SAAS,oBAAoB,SAAS,CAAC;AAE/E,mBAAiB,MAAM,UAAU;AAEjC,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,oBAAoB,MAAM,QAAQ,KAAK;AAChD,WAAO,kBAAU,OAAO,MAAM,QAAQ,KAAK;AAAA,EAC7C;AAEA,SAAO;AACT;AApCgB;;;ACLhB,OAAOC,YAAW;AAGlB,SAAS,kBACP,IACA,IACA,IACA,IACA,IACA,IACA,WACA;AACA,QAAM,YAAY;AAElB,QAAM,QAAQ,KAAK,MAAM;AACzB,QAAM,QAAQ,KAAK,MAAM;AAGzB,QAAM,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;AAGzC,QAAM,MAAM,KAAK,MAAM;AACvB,QAAM,MAAM,KAAK,MAAM;AAGvB,QAAM,eAAe,KAAK;AAC1B,QAAM,eAAe,KAAK;AAG1B,QAAM,WAAW,KAAK,KAAK,gBAAgB,IAAI,gBAAgB,CAAC;AAGhE,MAAI,WAAW,GAAG;AAChB,UAAM,IAAI,MAAM,oEAAoE;AAAA,EACtF;AAGA,QAAM,uBAAuB,KAAK,KAAK,IAAI,YAAY,CAAC;AAGxD,QAAM,UAAU,OAAO,uBAAuB,KAAK,KAAK,IAAI,KAAK,KAAK,YAAY,KAAK;AACvF,QAAM,UAAU,OAAO,uBAAuB,KAAK,KAAK,IAAI,KAAK,KAAK,YAAY,KAAK;AAGvF,QAAM,aAAa,KAAK,OAAO,KAAK,WAAW,KAAK,KAAK,WAAW,EAAE;AACtE,QAAM,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,KAAK,WAAW,EAAE;AAGpE,MAAI,aAAa,WAAW;AAC5B,MAAI,aAAa,aAAa,GAAG;AAC/B,kBAAc,IAAI,KAAK;AAAA,EACzB;AACA,MAAI,CAAC,aAAa,aAAa,GAAG;AAChC,kBAAc,IAAI,KAAK;AAAA,EACzB;AAGA,QAAM,SAAS,CAAC;AAChB,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,UAAM,IAAI,KAAK,YAAY;AAC3B,UAAMC,SAAQ,aAAa,IAAI;AAC/B,UAAM,IAAI,UAAU,KAAK,KAAK,IAAIA,MAAK;AACvC,UAAM,IAAI,UAAU,KAAK,KAAK,IAAIA,MAAK;AACvC,WAAO,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA,EACtB;AAEA,SAAO;AACT;AAhES;AAkET,eAAsB,WAAyC,QAAwB,MAAY;AACjG,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAC/E,QAAM,IAAI,KAAK,QAAQ,KAAK,UAAU;AACtC,QAAM,IAAI,KAAK,SAAS,KAAK;AAE7B,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,MAAM,MAAM,IAAI;AAG3B,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE;AAAA,IACtB,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE;AAAA,IACvB,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,KAAK;AAAA,IACjE,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IACrB,GAAG,kBAAkB,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI;AAAA,EAChE;AAGA,QAAM,KAAKC,OAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AACA,QAAM,iBAAiB,qBAAqB,MAAM;AAClD,QAAM,sBAAsB,GAAG,KAAK,gBAAgB,OAAO;AAC3D,QAAM,kBAAkB,SAAS,OAAO,MAAM,qBAAqB,cAAc;AAEjF,kBAAgB,KAAK,SAAS,uBAAuB;AAErD,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,oBAAgB,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EAC3D;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,oBAAgB,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EAC5D;AAEA,kBAAgB,KAAK,aAAa,aAAa,KAAK,CAAC,MAAM;AAE3D,mBAAiB,MAAM,eAAe;AAEtC,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AArDsB;;;ACrEtB,OAAOC,YAAW;;;ACFX,SAAS,mBACd,QACA,GACA,GACA,QACA;AACA,SAAO,OACJ,OAAO,WAAW,cAAc,EAChC;AAAA,IACC;AAAA,IACA,OACG,IAAI,SAAU,GAAG;AAChB,aAAO,EAAE,IAAI,MAAM,EAAE;AAAA,IACvB,CAAC,EACA,KAAK,GAAG;AAAA,EACb,EACC,KAAK,SAAS,iBAAiB,EAC/B,KAAK,aAAa,eAAe,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,GAAG;AAChE;AAlBgB;;;ADchB,eAAsB,KAAmC,QAAwB,MAAY;AAC3F,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAE/E,QAAM,IAAI,KAAK,SAAS,KAAK;AAC7B,QAAM,UAAU;AAChB,QAAM,IAAI,KAAK,QAAQ,KAAK,UAAU;AACtC,QAAM,OAAO;AACb,QAAM,QAAQ;AACd,QAAM,MAAM,CAAC;AACb,QAAM,SAAS;AACf,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,OAAO,SAAS,GAAG,IAAI;AAAA,IAC5B,EAAE,GAAG,OAAO,GAAG,IAAI;AAAA,IACnB,EAAE,GAAG,OAAO,GAAG,OAAO;AAAA,IACtB,EAAE,GAAG,MAAM,GAAG,OAAO;AAAA,IACrB,EAAE,GAAG,MAAM,GAAG,MAAM,QAAQ;AAAA,IAC5B,EAAE,GAAG,OAAO,SAAS,GAAG,IAAI;AAAA,EAC9B;AAEA,MAAI;AACJ,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,OAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,UAAM,WAAW,qBAAqB,MAAM;AAC5C,UAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,cAAU,SACP,OAAO,MAAM,WAAW,cAAc,EACtC,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAErD,QAAI,WAAW;AACb,cAAQ,KAAK,SAAS,SAAS;AAAA,IACjC;AAAA,EACF,OAAO;AACL,cAAU,mBAAmB,UAAU,GAAG,GAAG,MAAM;AAAA,EACrD;AAEA,MAAI,YAAY;AACd,YAAQ,KAAK,SAAS,UAAU;AAAA,EAClC;AAEA,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;AArDsB;;;AEdtB,OAAOC,YAAW;AAKX,SAAS,OAAqC,QAAwB,MAAY;AACvF,QAAM,EAAE,WAAW,IAAI,cAAc,IAAI;AACzC,OAAK,QAAQ;AACb,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,eAAe,IAAI,CAAC,EAClC,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AACnC,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS,CAAC;AAEtC,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE;AAAA,IACjB,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,IACjB,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE;AAAA,IAClB,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE;AAAA,EACpB;AAGA,QAAM,KAAKC,OAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,aAAa,qBAAqB,MAAM;AAC9C,QAAM,YAAY,GAAG,KAAK,YAAY,OAAO;AAC7C,QAAM,cAAc,SAAS,OAAO,MAAM,WAAW,cAAc;AAEnE,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,gBAAY,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACvD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,gBAAY,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACxD;AAEA,OAAK,QAAQ;AACb,OAAK,SAAS;AAEd,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;AA/CgB;;;ACPhB,OAAOC,YAAW;AASlB,eAAsB,OACpB,QACA,MACA,SACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,YAAY,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAC5F,QAAM,UAAU,SAAS,WAAW;AACpC,QAAM,SAAS,KAAK,QAAQ,IAAI;AAChC,MAAI;AACJ,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,OAAM,IAAI,QAAQ;AAC7B,UAAMC,WAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,UAAM,YAAY,GAAG,OAAO,GAAG,GAAG,SAAS,GAAGA,QAAO;AAErD,iBAAa,SAAS,OAAO,MAAM,WAAW,cAAc;AAC5D,eAAW,KAAK,SAAS,uBAAuB,EAAE,KAAK,SAAS,oBAAoB,SAAS,CAAC;AAAA,EAChG,OAAO;AACL,iBAAa,SACV,OAAO,UAAU,cAAc,EAC/B,KAAK,SAAS,uBAAuB,EACrC,KAAK,SAAS,UAAU,EACxB,KAAK,KAAK,MAAM,EAChB,KAAK,MAAM,CAAC,EACZ,KAAK,MAAM,CAAC;AAAA,EACjB;AAEA,mBAAiB,MAAM,UAAU;AACjC,OAAK,gBAAgB,SAAU,QAAgB,OAAc;AAC3D,UAAMC,UAAS,OAAO,QAAQ;AAC9B,WAAO,kBAAU,OAAO,QAAQA,SAAQ,KAAK;AAAA,EAC/C;AACA,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,oBAAoB,MAAM,QAAQ,KAAK;AAChD,WAAO,kBAAU,OAAO,MAAM,QAAQ,KAAK;AAAA,EAC7C;AAEA,SAAO;AACT;AA1CsB;;;ACLtB,OAAOC,YAAW;AAIlB,SAAS,WAAW,GAAW;AAC7B,QAAM,UAAU,KAAK,IAAI,KAAK,KAAK,CAAC;AACpC,QAAM,UAAU,KAAK,IAAI,KAAK,KAAK,CAAC;AACpC,QAAM,aAAa,IAAI;AAEvB,QAAM,UAAU,EAAE,GAAI,aAAa,IAAK,SAAS,GAAI,aAAa,IAAK,QAAQ;AAC/E,QAAM,UAAU,EAAE,GAAG,EAAE,aAAa,KAAK,SAAS,GAAI,aAAa,IAAK,QAAQ;AAChF,QAAM,UAAU,EAAE,GAAG,EAAE,aAAa,KAAK,SAAS,GAAG,EAAE,aAAa,KAAK,QAAQ;AACjF,QAAM,UAAU,EAAE,GAAI,aAAa,IAAK,SAAS,GAAG,EAAE,aAAa,KAAK,QAAQ;AAEhF,SAAO,KAAK,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,QAAQ,CAAC;AAAA,uBACzC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,QAAQ,CAAC;AACzE;AAZS;AAcF,SAAS,cAA4C,QAAwB,MAAY;AAC9F,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,OAAK,QAAQ;AACb,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,eAAe,IAAI,CAAC,EAClC,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AACnC,QAAM,SAAS,KAAK,IAAI,IAAI,MAAM,SAAS,CAAC;AAC5C,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,OAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,aAAa,GAAG,OAAO,GAAG,GAAG,SAAS,GAAG,OAAO;AACtD,QAAM,WAAW,WAAW,MAAM;AAClC,QAAM,WAAW,GAAG,KAAK,UAAU,OAAO;AAE1C,QAAMC,iBAAgB,SAAS,OAAO,MAAM,YAAY,cAAc;AACtE,EAAAA,eAAc,OAAO,MAAM,QAAQ;AAEnC,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,IAAAA,eAAc,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACzD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,IAAAA,eAAc,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EAC1D;AAEA,mBAAiB,MAAMA,cAAa;AAEpC,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,2BAA2B,MAAM,EAAE,QAAQ,MAAM,CAAC;AAC3D,UAAM,MAAM,kBAAU,OAAO,MAAM,QAAQ,KAAK;AAChD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA5CgB;;;AClBhB,OAAOC,YAAW;AAGlB,SAASC,sBACP,SACA,SACA,QACA,YAAY,KACZ,aAAa,GACb,WAAW,KACX;AACA,QAAM,SAAS,CAAC;AAGhB,QAAM,gBAAiB,aAAa,KAAK,KAAM;AAC/C,QAAM,cAAe,WAAW,KAAK,KAAM;AAG3C,QAAM,aAAa,cAAc;AAGjC,QAAM,YAAY,cAAc,YAAY;AAE5C,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,UAAM,QAAQ,gBAAgB,IAAI;AAClC,UAAM,IAAI,UAAU,SAAS,KAAK,IAAI,KAAK;AAC3C,UAAM,IAAI,UAAU,SAAS,KAAK,IAAI,KAAK;AAC3C,WAAO,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;AAAA,EAC9B;AAEA,SAAO;AACT;AA5BS,OAAAA,uBAAA;AA8BT,eAAsB,eACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,SAAS,KAAK,WAAW;AACxC,QAAM,IAAI,KAAK,UAAU,KAAK,WAAW;AACzC,QAAM,SAAS,KAAK,IAAI,GAAG,IAAI,GAAG;AAElC,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,SAAS;AAAA,IACb,GAAGA,sBAAqB,IAAI,GAAG,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,CAAC;AAAA,IACzD,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,OAAO;AAAA,IAChC,GAAGA,sBAAqB,IAAI,IAAI,SAAS,GAAG,CAAC,QAAQ,QAAQ,IAAI,MAAM,IAAI;AAAA,IAC3E,GAAGA,sBAAqB,IAAI,IAAI,SAAS,GAAG,QAAQ,QAAQ,IAAI,KAAK,IAAI;AAAA,IACzE,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,CAAC,IAAI,EAAE;AAAA,IAChC,GAAGA,sBAAqB,IAAI,GAAG,IAAI,GAAG,QAAQ,IAAI,GAAG,EAAE;AAAA,EACzD;AAEA,QAAM,aAAa;AAAA,IACjB,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO;AAAA,IAC/B,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO;AAAA,IAChC,GAAGA,sBAAqB,IAAI,GAAG,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,CAAC;AAAA,IACzD,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,CAAC,OAAO;AAAA,IACjC,GAAGA,sBAAqB,IAAI,IAAI,IAAI,KAAK,CAAC,QAAQ,QAAQ,IAAI,MAAM,IAAI;AAAA,IACxE,GAAGA,sBAAqB,IAAI,IAAI,IAAI,KAAK,QAAQ,QAAQ,IAAI,KAAK,IAAI;AAAA,IACtE,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,IAAI,EAAE;AAAA,IAC/B,GAAGA,sBAAqB,IAAI,GAAG,IAAI,GAAG,QAAQ,IAAI,GAAG,EAAE;AAAA,IACvD,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO;AAAA,IAC/B,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO;AAAA,EAChC;AAGA,QAAM,KAAKC,OAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,EAAE,MAAM,OAAO,CAAC;AAExD,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AACA,QAAM,qBAAqB,qBAAqB,MAAM;AACtD,QAAM,oBAAoB,mBAAmB,QAAQ,KAAK,EAAE;AAC5D,QAAM,qBAAqB,GAAG,KAAK,mBAAmB,OAAO;AAC7D,QAAM,WAAW,qBAAqB,UAAU;AAChD,QAAM,YAAY,GAAG,KAAK,UAAU,EAAE,GAAG,QAAQ,CAAC;AAClD,QAAM,sBAAsB,SAAS,OAAO,KAAK,cAAc;AAC/D,sBAAoB,OAAO,MAAM,WAAW,cAAc,EAAE,KAAK,kBAAkB,CAAC;AACpF,sBAAoB,OAAO,MAAM,oBAAoB,cAAc;AACnE,sBAAoB,KAAK,SAAS,MAAM;AAExC,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,wBAAoB,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EAC/D;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,wBAAoB,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EAChE;AAEA,sBAAoB,KAAK,aAAa,aAAa,MAAM,MAAM;AAE/D,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,IAAI,IAAI,UAAU,KAAK,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAC7H;AAEA,mBAAiB,MAAM,mBAAmB;AAE1C,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,YAAY,KAAK;AAErD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA7EsB;;;ACjCtB,OAAOC,YAAW;AAGlB,SAASC,sBACP,SACA,SACA,QACA,YAAY,KACZ,aAAa,GACb,WAAW,KACX;AACA,QAAM,SAAS,CAAC;AAGhB,QAAM,gBAAiB,aAAa,KAAK,KAAM;AAC/C,QAAM,cAAe,WAAW,KAAK,KAAM;AAG3C,QAAM,aAAa,cAAc;AAGjC,QAAM,YAAY,cAAc,YAAY;AAE5C,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,UAAM,QAAQ,gBAAgB,IAAI;AAClC,UAAM,IAAI,UAAU,SAAS,KAAK,IAAI,KAAK;AAC3C,UAAM,IAAI,UAAU,SAAS,KAAK,IAAI,KAAK;AAC3C,WAAO,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA,EACtB;AAEA,SAAO;AACT;AA5BS,OAAAA,uBAAA;AA8BT,eAAsB,gBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,SAAS,KAAK,WAAW;AACxC,QAAM,IAAI,KAAK,UAAU,KAAK,WAAW;AACzC,QAAM,SAAS,KAAK,IAAI,GAAG,IAAI,GAAG;AAElC,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,SAAS;AAAA,IACb,GAAGA,sBAAqB,IAAI,GAAG,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,CAAC;AAAA,IACzD,EAAE,GAAG,IAAI,IAAI,QAAQ,GAAG,CAAC,OAAO;AAAA,IAChC,GAAGA,sBAAqB,IAAI,IAAI,SAAS,GAAG,CAAC,QAAQ,QAAQ,IAAI,MAAM,IAAI;AAAA,IAC3E,GAAGA,sBAAqB,IAAI,IAAI,SAAS,GAAG,QAAQ,QAAQ,IAAI,KAAK,IAAI;AAAA,IACzE,EAAE,GAAG,IAAI,IAAI,QAAQ,GAAG,IAAI,EAAE;AAAA,IAC9B,GAAGA,sBAAqB,IAAI,GAAG,IAAI,GAAG,QAAQ,IAAI,GAAG,EAAE;AAAA,EACzD;AAEA,QAAM,aAAa;AAAA,IACjB,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO;AAAA,IAChC,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO;AAAA,IAC/B,GAAGA,sBAAqB,IAAI,GAAG,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,CAAC;AAAA,IACzD,EAAE,GAAG,IAAI,IAAI,QAAQ,GAAG,CAAC,OAAO;AAAA,IAChC,GAAGA,sBAAqB,IAAI,IAAI,SAAS,GAAG,CAAC,QAAQ,QAAQ,IAAI,MAAM,IAAI;AAAA,IAC3E,GAAGA,sBAAqB,IAAI,IAAI,SAAS,GAAG,QAAQ,QAAQ,IAAI,KAAK,IAAI;AAAA,IACzE,EAAE,GAAG,IAAI,IAAI,QAAQ,GAAG,IAAI,EAAE;AAAA,IAC9B,GAAGA,sBAAqB,IAAI,GAAG,IAAI,GAAG,QAAQ,IAAI,GAAG,EAAE;AAAA,IACvD,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO;AAAA,IAC9B,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO;AAAA,EACjC;AAGA,QAAM,KAAKC,OAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,EAAE,MAAM,OAAO,CAAC;AAExD,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AACA,QAAM,sBAAsB,qBAAqB,MAAM;AACvD,QAAM,oBAAoB,oBAAoB,QAAQ,KAAK,EAAE;AAC7D,QAAM,sBAAsB,GAAG,KAAK,mBAAmB,OAAO;AAC9D,QAAM,WAAW,qBAAqB,UAAU;AAChD,QAAM,YAAY,GAAG,KAAK,UAAU,EAAE,GAAG,QAAQ,CAAC;AAClD,QAAM,uBAAuB,SAAS,OAAO,KAAK,cAAc;AAChE,uBAAqB,OAAO,MAAM,WAAW,cAAc,EAAE,KAAK,kBAAkB,CAAC;AACrF,uBAAqB,OAAO,MAAM,qBAAqB,cAAc;AACrE,uBAAqB,KAAK,SAAS,MAAM;AAEzC,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,yBAAqB,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EAChE;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,yBAAqB,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACjE;AAEA,uBAAqB,KAAK,aAAa,aAAa,CAAC,MAAM,MAAM;AAEjE,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,IAAI,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAC9I;AAEA,mBAAiB,MAAM,oBAAoB;AAE3C,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,YAAY,KAAK;AAErD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA7EsB;;;ACjCtB,OAAOC,aAAW;AAGlB,SAASC,sBACP,SACA,SACA,QACA,YAAY,KACZ,aAAa,GACb,WAAW,KACX;AACA,QAAM,SAAS,CAAC;AAGhB,QAAM,gBAAiB,aAAa,KAAK,KAAM;AAC/C,QAAM,cAAe,WAAW,KAAK,KAAM;AAG3C,QAAM,aAAa,cAAc;AAGjC,QAAM,YAAY,cAAc,YAAY;AAE5C,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,UAAM,QAAQ,gBAAgB,IAAI;AAClC,UAAM,IAAI,UAAU,SAAS,KAAK,IAAI,KAAK;AAC3C,UAAM,IAAI,UAAU,SAAS,KAAK,IAAI,KAAK;AAC3C,WAAO,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;AAAA,EAC9B;AAEA,SAAO;AACT;AA5BS,OAAAA,uBAAA;AA8BT,eAAsB,YACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,SAAS,KAAK,WAAW;AACxC,QAAM,IAAI,KAAK,UAAU,KAAK,WAAW;AACzC,QAAM,SAAS,KAAK,IAAI,GAAG,IAAI,GAAG;AAElC,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,uBAAuB;AAAA,IAC3B,GAAGA,sBAAqB,IAAI,GAAG,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,CAAC;AAAA,IACzD,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,OAAO;AAAA,IAChC,GAAGA,sBAAqB,IAAI,IAAI,SAAS,GAAG,CAAC,QAAQ,QAAQ,IAAI,MAAM,IAAI;AAAA,IAC3E,GAAGA,sBAAqB,IAAI,IAAI,SAAS,GAAG,QAAQ,QAAQ,IAAI,KAAK,IAAI;AAAA,IACzE,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,CAAC,IAAI,EAAE;AAAA,IAChC,GAAGA,sBAAqB,IAAI,GAAG,IAAI,GAAG,QAAQ,IAAI,GAAG,EAAE;AAAA,EACzD;AAEA,QAAM,wBAAwB;AAAA,IAC5B,GAAGA,sBAAqB,CAAC,IAAI,IAAI,SAAS,SAAS,GAAG,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,IACnF,EAAE,GAAG,IAAI,IAAI,SAAS,GAAG,GAAG,OAAO;AAAA,IACnC,GAAGA,sBAAqB,CAAC,IAAI,IAAI,SAAS,GAAG,CAAC,QAAQ,QAAQ,IAAI,GAAG,EAAE;AAAA,IACvE,GAAGA,sBAAqB,CAAC,IAAI,IAAI,SAAS,GAAG,QAAQ,QAAQ,IAAI,KAAK,CAAC;AAAA,IACvE,EAAE,GAAG,IAAI,IAAI,SAAS,GAAG,GAAG,CAAC,OAAO;AAAA,IACpC,GAAGA,sBAAqB,CAAC,IAAI,IAAI,SAAS,SAAS,GAAG,IAAI,GAAG,QAAQ,IAAI,MAAM,IAAI;AAAA,EACrF;AAEA,QAAM,aAAa;AAAA,IACjB,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO;AAAA,IAC/B,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO;AAAA,IAChC,GAAGA,sBAAqB,IAAI,GAAG,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,CAAC;AAAA,IACzD,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,CAAC,OAAO;AAAA,IACjC,GAAGA,sBAAqB,IAAI,IAAI,SAAS,GAAG,CAAC,QAAQ,QAAQ,IAAI,MAAM,IAAI;AAAA,IAC3E,GAAGA,sBAAqB,IAAI,IAAI,SAAS,GAAG,QAAQ,QAAQ,IAAI,KAAK,IAAI;AAAA,IACzE,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,IAAI,EAAE;AAAA,IAC/B,GAAGA,sBAAqB,IAAI,GAAG,IAAI,GAAG,QAAQ,IAAI,GAAG,EAAE;AAAA,IACvD,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO;AAAA,IAC/B,EAAE,GAAG,IAAI,IAAI,SAAS,SAAS,GAAG,GAAG,IAAI,IAAI,OAAO;AAAA,IACpD,GAAGA,sBAAqB,CAAC,IAAI,IAAI,SAAS,SAAS,GAAG,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,IACnF,EAAE,GAAG,IAAI,IAAI,SAAS,GAAG,GAAG,OAAO;AAAA,IACnC,GAAGA,sBAAqB,CAAC,IAAI,IAAI,SAAS,GAAG,CAAC,QAAQ,QAAQ,IAAI,GAAG,EAAE;AAAA,IACvE,GAAGA,sBAAqB,CAAC,IAAI,IAAI,SAAS,GAAG,QAAQ,QAAQ,IAAI,KAAK,CAAC;AAAA,IACvE,EAAE,GAAG,IAAI,IAAI,SAAS,GAAG,GAAG,CAAC,OAAO;AAAA,IACpC,GAAGA,sBAAqB,CAAC,IAAI,IAAI,SAAS,SAAS,GAAG,IAAI,GAAG,QAAQ,IAAI,MAAM,IAAI;AAAA,EACrF;AAGA,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,EAAE,MAAM,OAAO,CAAC;AAExD,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AACA,QAAM,qBAAqB,qBAAqB,oBAAoB;AACpE,QAAM,wBAAwB,mBAAmB,QAAQ,KAAK,EAAE;AAChE,QAAM,qBAAqB,GAAG,KAAK,uBAAuB,OAAO;AACjE,QAAM,sBAAsB,qBAAqB,qBAAqB;AACtE,QAAM,yBAAyB,oBAAoB,QAAQ,KAAK,EAAE;AAClE,QAAM,sBAAsB,GAAG,KAAK,wBAAwB,OAAO;AACnE,QAAM,WAAW,qBAAqB,UAAU;AAChD,QAAM,YAAY,GAAG,KAAK,UAAU,EAAE,GAAG,QAAQ,CAAC;AAClD,QAAM,mBAAmB,SAAS,OAAO,KAAK,cAAc;AAC5D,mBAAiB,OAAO,MAAM,WAAW,cAAc,EAAE,KAAK,kBAAkB,CAAC;AACjF,mBAAiB,OAAO,MAAM,oBAAoB,cAAc;AAChE,mBAAiB,OAAO,MAAM,qBAAqB,cAAc;AACjE,mBAAiB,KAAK,SAAS,MAAM;AAErC,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,qBAAiB,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EAC5D;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,qBAAiB,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EAC7D;AAEA,mBAAiB,KAAK,aAAa,aAAa,SAAS,SAAS,CAAC,MAAM;AAEzE,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,IAAI,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAC9I;AAEA,mBAAiB,MAAM,gBAAgB;AAEvC,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,YAAY,KAAK;AAErD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAhGsB;;;AC3BtB,OAAOC,aAAW;AAGlB,eAAsB,gBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAC/E,QAAM,WAAW,IACf,YAAY;AACd,QAAM,IAAI,KAAK,IAAI,WAAW,KAAK,SAAS,KAAK,WAAW,KAAK,KAAK,MAAM,MAAM,SAAS,CAAC;AAC5F,QAAM,IAAI,KAAK,IAAI,WAAW,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AACtF,QAAM,SAAS,IAAI;AAEnB,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,aAAa,GACjB,cAAc;AAChB,QAAM,KAAK,aAAa;AACxB,QAAM,KAAK,cAAc;AAEzB,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,IAAI,GAAG,EAAE;AAAA,IACd,EAAE,GAAG,IAAI,GAAG,EAAE;AAAA,IACd,EAAE,GAAG,GAAG,GAAG,cAAc,EAAE;AAAA,IAC3B,EAAE,GAAG,IAAI,GAAG,YAAY;AAAA,IACxB,EAAE,GAAG,IAAI,GAAG,YAAY;AAAA,IACxB,GAAG,qBAAqB,CAAC,IAAI,CAAC,cAAc,GAAG,QAAQ,IAAI,KAAK,EAAE;AAAA,EACpE;AAEA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,QAAM,UAAU,SAAS,OAAO,MAAM,WAAW,cAAc;AAC/D,UAAQ,KAAK,SAAS,uBAAuB;AAE7C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,UAAQ,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;AAE3D,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA7DsB;;;ACTtB,OAAOC,aAAW;AAIX,IAAM,sBAAsB,wBACjC,GACA,GACA,OACA,QACA,IACA,OACW;AACX,SAAO;AAAA,IACL,IAAI,CAAC,IAAI,IAAI,EAAE;AAAA,IACf,IAAI,EAAE,IAAI,EAAE,UAAU,KAAK;AAAA,IAC3B,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK;AAAA,IAC5B,MAAM,MAAM;AAAA,IACZ,IAAI,EAAE,IAAI,EAAE,UAAU,KAAK;AAAA,IAC3B,MAAM,CAAC,MAAM;AAAA,EACf,EAAE,KAAK,GAAG;AACZ,GAhBmC;AAiB5B,IAAM,2BAA2B,wBACtC,GACA,GACA,OACA,QACA,IACA,OACW;AACX,SAAO;AAAA,IACL,IAAI,CAAC,IAAI,IAAI,EAAE;AAAA,IACf,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;AAAA,IACvB,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK;AAAA,IAC5B,MAAM,MAAM;AAAA,IACZ,IAAI,EAAE,IAAI,EAAE,UAAU,KAAK;AAAA,IAC3B,MAAM,CAAC,MAAM;AAAA,EACf,EAAE,KAAK,GAAG;AACZ,GAhBwC;AAiBjC,IAAM,2BAA2B,wBACtC,GACA,GACA,OACA,QACA,IACA,OACW;AACX,SAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,EAAE,KAAK,GAAG;AACvF,GATwC;AAUxC,eAAsB,SAAuC,QAAwB,MAAY;AAC/F,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,IAAI,KAAK,QAAQ,KAAK,SAAS,KAAK,SAAS,CAAC;AAC7D,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,MAAM,MAAM,IAAI;AAC3B,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,KAAK,SAAS,KAAK,UAAU,CAAC;AAEpE,MAAIC;AACJ,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,gBAAgB,yBAAyB,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AACjE,UAAM,gBAAgB,yBAAyB,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAClE,UAAM,YAAY,GAAG,KAAK,eAAe,kBAAkB,MAAM,CAAC,CAAC,CAAC;AACpE,UAAM,YAAY,GAAG,KAAK,eAAe,kBAAkB,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC;AAElF,IAAAD,YAAW,SAAS,OAAO,MAAM,WAAW,cAAc;AAC1D,IAAAA,YAAW,SAAS,OAAO,MAAM,WAAW,cAAc;AAC1D,IAAAA,UAAS,KAAK,SAAS,uBAAuB;AAC9C,QAAI,WAAW;AACb,MAAAA,UAAS,KAAK,SAAS,SAAS;AAAA,IAClC;AAAA,EACF,OAAO;AACL,UAAM,WAAW,oBAAoB,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AACvD,IAAAA,YAAW,SACR,OAAO,QAAQ,cAAc,EAC7B,KAAK,KAAK,QAAQ,EAClB,KAAK,SAAS,uBAAuB,EACrC,KAAK,SAAS,oBAAoB,SAAS,CAAC,EAC5C,KAAK,SAAS,UAAU;AAAA,EAC7B;AAEA,EAAAA,UAAS,KAAK,kBAAkB,EAAE;AAClC,EAAAA,UAAS,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,GAAG,GAAG;AAEnE,mBAAiB,MAAMA,SAAQ;AAE/B,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,EAAE,KAAK,QAAQ,MAAM,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,EAAE,KAAK,SAAS,MAAM,KAAK,WAAW,KAAK,OAAO,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAC9I;AAEA,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,KAAK,MAAM,KAAK;AACtC,UAAM,IAAI,IAAI,KAAK,KAAK,KAAK;AAE7B,QACE,MAAM,MACL,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,KAAK,KAChC,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,KAAK,KAClC,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,UAAU,KAAK,IAAI,KAC/D;AACA,UAAI,IAAI,KAAK,MAAM,IAAK,IAAI,KAAM,KAAK;AACvC,UAAI,IAAI,GAAG;AACT,YAAI,KAAK,KAAK,CAAC;AAAA,MACjB;AACA,UAAI,KAAK;AACT,UAAI,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;AAC/B,YAAI,CAAC;AAAA,MACP;AAEA,UAAI,KAAK;AAAA,IACX;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAxEsB;;;AChDtB,OAAOE,aAAW;AAGlB,eAAsB,iBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,QAAQ,KAAK;AAC5B,QAAM,IAAI,KAAK,SAAS,KAAK;AAC7B,QAAM,aAAa,IAAI;AAEvB,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,IAAI,CAAC,IAAI,IAAI,aAAa;AAEhC,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,MAAM;AAAA,IACV,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA,IACvB,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,WAAW;AAAA,IAC3B,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE;AAAA,IACf,EAAE,GAAG,GAAG,CAAC,EAAE;AAAA,IACX,EAAE,GAAG,EAAE;AAAA,IACP,EAAE,GAAG,CAAC,GAAG,EAAE;AAAA,IACX,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,WAAW;AAAA,EAC7B;AAEA,QAAM,OAAO,GAAG;AAAA,IACd,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,OAAO,MAAM,MAAM,cAAc;AAC1D,UAAQ,KAAK,SAAS,uBAAuB;AAE7C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,YAAQ,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACnD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,YAAQ,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACpD;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,IAAI,cAAc,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAClJ;AAEA,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,KAAK,MAAM,KAAK;AACtC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA/DsB;;;ACFtB,OAAOC,aAAW;AAIlB,eAAsB,aACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,YAAY,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAC5F,QAAM,MAAM;AACZ,QAAM,cAAc,KAAK,QAAQ,IAAI,cAAc;AACnD,QAAM,cAAc,KAAK,QAAQ,IAAI;AAErC,MAAI;AACJ,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,eAAe,kBAAkB,MAAM,EAAE,WAAW,KAAK,aAAa,IAAI,CAAC;AAEjF,UAAM,eAAe,kBAAkB,MAAM,EAAE,WAAW,KAAK,aAAa,IAAI,CAAC;AACjF,UAAM,iBAAiB,GAAG,OAAO,GAAG,GAAG,cAAc,GAAG,YAAY;AACpE,UAAM,iBAAiB,GAAG,OAAO,GAAG,GAAG,cAAc,GAAG,YAAY;AAEpE,kBAAc,SAAS,OAAO,KAAK,cAAc;AAEjD,gBACG,KAAK,SAAS,oBAAoB,KAAK,UAAU,CAAC,EAClD,KAAK,SAAS,oBAAoB,SAAS,CAAC;AAE/C,gBAAY,KAAK,GAAG,YAAY,cAAc;AAC9C,gBAAY,KAAK,GAAG,YAAY,cAAc;AAAA,EAChD,OAAO;AACL,kBAAc,SAAS,OAAO,KAAK,cAAc;AAEjD,UAAM,cAAc,YAAY,OAAO,UAAU,cAAc;AAC/D,UAAM,cAAc,YAAY,OAAO,QAAQ;AAC/C,gBAAY,KAAK,SAAS,uBAAuB,EAAE,KAAK,SAAS,UAAU;AAE3E,gBACG,KAAK,SAAS,cAAc,EAC5B,KAAK,SAAS,UAAU,EACxB,KAAK,KAAK,WAAW,EACrB,KAAK,MAAM,CAAC,EACZ,KAAK,MAAM,CAAC;AAEf,gBACG,KAAK,SAAS,cAAc,EAC5B,KAAK,SAAS,UAAU,EACxB,KAAK,KAAK,WAAW,EACrB,KAAK,MAAM,CAAC,EACZ,KAAK,MAAM,CAAC;AAAA,EACjB;AAEA,mBAAiB,MAAM,WAAW;AAElC,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,0BAA0B,MAAM,aAAa,KAAK;AAC3D,WAAO,kBAAU,OAAO,MAAM,aAAa,KAAK;AAAA,EAClD;AAEA,SAAO;AACT;AA7DsB;;;ACTtB,OAAOC,aAAW;AAQX,SAAS,aACd,QACA,MACA,EAAE,QAAQ,EAAE,eAAe,EAAE,GAC7B;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,QAAQ;AACb,OAAK,aAAa;AAClB,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,eAAe,IAAI,CAAC,EAClC,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AACnC,QAAM,SAAS;AACf,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,EAAE,WAAW,IAAI;AACvB,QAAM,UAAU,kBAAkB,MAAM,EAAE,WAAW,QAAQ,CAAC;AAE9D,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,aAAa,GAAG,OAAO,GAAG,GAAG,SAAS,GAAG,OAAO;AAEtD,QAAMC,gBAAe,SAAS,OAAO,MAAM,YAAY,cAAc;AAErE,EAAAA,cAAa,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS,UAAU,cAAc;AAE9E,MAAI,aAAa,UAAU,SAAS,KAAK,KAAK,SAAS,aAAa;AAClE,IAAAA,cAAa,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,IAAAA,cAAa,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,mBAAiB,MAAMA,aAAY;AAEnC,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,0BAA0B,MAAM,EAAE,QAAQ,MAAM,CAAC;AAC1D,UAAM,MAAM,kBAAU,OAAO,MAAM,QAAQ,KAAK;AAChD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA/CgB;;;ACHhB,OAAOC,aAAW;AAIlB,eAAsB,gBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAEtF,QAAM,IAAI,KAAK,SAAS,KAAK,WAAW;AACxC,QAAM,IAAI,IAAI,KAAK;AAEnB,QAAM,KAAK,IAAI,KAAK;AACpB,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,IACd,EAAE,GAAG,IAAI,GAAG,CAAC,EAAE;AAAA,IACf,EAAE,GAAG,KAAK,GAAG,GAAG,EAAE;AAAA,EACpB;AAEA,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AACA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,QAAMC,mBAAkB,SACrB,OAAO,MAAM,WAAW,cAAc,EACtC,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAErD,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,IAAAA,iBAAgB,eAAe,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EAChE;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,IAAAA,iBAAgB,eAAe,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACjE;AAEA,OAAK,QAAQ;AACb,OAAK,SAAS;AAEd,mBAAiB,MAAMA,gBAAe;AAEtC,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAC9H;AAEA,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,sBAAsB,MAAM,QAAQ,KAAK;AAClD,WAAO,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;AA1DsB;;;ACTtB,OAAOC,aAAW;AAOX,SAAS,SACd,QACA,MACA,EAAE,KAAK,QAAQ,EAAE,OAAAC,QAAO,eAAe,EAAE,GACzC;AACA,QAAM,EAAE,WAAW,IAAI,cAAc,IAAI;AACzC,OAAK,QAAQ;AACb,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,eAAe,IAAI,CAAC,EAClC,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AAEnC,QAAM,EAAE,UAAU,IAAI;AACtB,MAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,SAAS,CAAC;AACzC,MAAI,SAAS,KAAK,IAAI,IAAI,MAAM,UAAU,CAAC;AAE3C,MAAI,QAAQ,MAAM;AAChB,YAAQ,KAAK,IAAI,IAAI,MAAM,SAAS,CAAC;AACrC,aAAS,KAAK,IAAI,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAEA,QAAM,IAAK,KAAK,QAAS;AACzB,QAAM,IAAK,KAAK,SAAU;AAG1B,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM;AAAA,IACtC,QAAQ,eAAe;AAAA,IACvB,MAAM,eAAe;AAAA,EACvB,CAAC;AAED,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,YAAY,GAAG,UAAU,GAAG,GAAG,OAAO,QAAQ,OAAO;AAE3D,QAAM,QAAQ,SAAS,OAAO,MAAM,WAAW,cAAc;AAE7D,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,UAAM,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACjD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,UAAM,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EAClD;AAEA,mBAAiB,MAAM,KAAK;AAC5B,QAAM,UAAUD,QAAO,WAAW;AAClC,MAAI,KAAK,SAAS,KAAK,QAAQ;AAC7B,SAAK,SAAS,UAAU,KAAK;AAC7B,SAAK,UAAU,UAAU,KAAK;AAAA,EAChC;AACA,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AACA,SAAO;AACT;AA1DgB;;;ACIhB,OAAOE,aAAW;AAGlB,eAAsB,qBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,WAAW,IACf,YAAY;AACd,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAC/E,QAAM,IAAI,KAAK,IAAI,UAAU,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACnF,QAAM,IAAI,KAAK,IAAI,WAAW,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AACtF,QAAM,SAAS,IAAI;AACnB,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE;AAAA,IACvB,EAAE,GAAG,IAAI,IAAI,QAAQ,GAAG,CAAC,IAAI,EAAE;AAAA,IAC/B,GAAG,qBAAqB,CAAC,IAAI,IAAI,QAAQ,GAAG,QAAQ,IAAI,IAAI,GAAG;AAAA,IAC/D,EAAE,GAAG,IAAI,IAAI,QAAQ,GAAG,IAAI,EAAE;AAAA,IAC9B,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,EACxB;AAEA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAC3C,QAAM,UAAU,SAAS,OAAO,MAAM,WAAW,cAAc;AAC/D,UAAQ,KAAK,SAAS,uBAAuB;AAE7C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAOA,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,kBAAkB,MAAM,EAAE,QAAQ,MAAM,CAAC;AAClD,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAzDsB;;;ACVtB,OAAOC,aAAW;AAqBlB,eAAsB,QAAsC,QAAwB,MAAY;AAC9F,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAE/E,QAAM,IAAI,KAAK,UAAU,KAAK,WAAW;AACzC,QAAM,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK;AAC7C,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,MAAI,YAAY,IAAI;AACpB,QAAM,IAAI,YAAY;AACtB,cAAY,YAAY;AAExB,QAAM,aAAa,IAAI;AAEvB,QAAM,cAAc,aAAa;AACjC,QAAM,eAAe,YAAY;AAEjC,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,CAAC,cAAc,GAAG,CAAC,WAAW;AAAA,IACnC,EAAE,GAAG,GAAG,GAAG,CAAC,WAAW;AAAA,IACvB,EAAE,GAAG,cAAc,GAAG,CAAC,WAAW;AAAA,IAClC,EAAE,GAAG,WAAW,GAAG,EAAE;AAAA,IACrB,EAAE,GAAG,cAAc,GAAG,WAAW;AAAA,IACjC,EAAE,GAAG,GAAG,GAAG,WAAW;AAAA,IACtB,EAAE,GAAG,CAAC,cAAc,GAAG,WAAW;AAAA,IAClC,EAAE,GAAG,CAAC,WAAW,GAAG,EAAE;AAAA,EACxB;AAEA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,QAAM,UAAU,SAAS,OAAO,MAAM,WAAW,cAAc;AAC/D,UAAQ,KAAK,SAAS,uBAAuB;AAE7C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,OAAK,QAAQ;AACb,OAAK,SAAS;AAEd,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;AA7DsB;;;ACpBtB,OAAOC,aAAW;AAGlB,eAAsB,UAAwC,QAAwB,MAAY;AAChG,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,QAAQ;AACb,OAAK,aAAa;AAClB,QAAM,EAAE,SAAS,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAEzE,QAAM,IAAI,KAAK,IAAI,IAAI,MAAM,SAAS,CAAC;AACvC,QAAM,IAAI,KAAK,IAAI,IAAI,MAAM,UAAU,CAAC;AAExC,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACf;AAEA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAC3C,QAAM,UAAU,SAAS,OAAO,MAAM,WAAW,cAAc;AAC/D,UAAQ,KAAK,SAAS,uBAAuB;AAE7C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,UAAQ,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;AAE3D,mBAAiB,MAAM,OAAO;AAI9B,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,kBAAkB,MAAM,EAAE,OAAO,CAAC;AAC3C,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AArDsB;;;ACRtB,OAAOC,aAAW;AASlB,eAAsB,KACpB,QACA,MACA,EAAE,QAAQ,EAAE,gBAAgB,UAAU,EAAE,GACxC;AACA,QAAM,EAAE,YAAY,IAAI,cAAc,IAAI;AAC1C,OAAK,aAAa;AAClB,QAAM,cAAc,KAAK,eAAe;AACxC,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,WAAW,KAAK,IAAI,aAAa,UAAU;AACjD,QAAM,eAAe,WAAW;AAChC,OAAK,QAAQ,KAAK,IAAI,UAAU,gBAAgB,CAAC;AACjD,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,oBAAoB;AAEtF,QAAM,WAAW,KAAK,QAAQ;AAE9B,QAAM,SAAS;AACf,QAAM,QAAQ;AACd,QAAM,EAAE,WAAW,IAAI;AACvB,QAAM,EAAE,UAAU,IAAI,cAAc,IAAI;AAExC,QAAM,IAAI,CAAC,QAAQ;AACnB,QAAM,IAAI,CAAC,SAAS;AAEpB,QAAM,eAAe,KAAK,QAAQ,IAAI;AAGtC,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,EAAE,QAAQ,QAAQ,MAAM,OAAO,CAAC;AAExE,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,WAAW,GAAG,UAAU,GAAG,GAAG,OAAO,QAAQ,OAAO;AAE1D,QAAM,aAAa,KAAK,IAAI,OAAO,KAAK,KAAK;AAC7C,QAAM,cAAc,SAAS,KAAK,SAAS;AAE3C,QAAM,YAAY,GAAG,UAAU,CAAC,aAAa,GAAG,CAAC,cAAc,GAAG,YAAY,aAAa;AAAA,IACzF,GAAG;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,YAAY,SAAS,OAAO,MAAM,UAAU,cAAc;AAChE,QAAM,aAAa,SAAS,OAAO,MAAM,SAAS;AAElD,MAAI,KAAK,MAAM;AACb,UAAM,WAAW,SAAS,OAAO,GAAG;AACpC,aAAS;AAAA,MACP,MAAM,MAAM,WAAW,KAAK,MAAM;AAAA,QAChC,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,gBAAgB;AAAA,MAClB,CAAC,CAAC;AAAA,IACJ;AACA,UAAM,WAAW,SAAS,KAAK,EAAG,QAAQ;AAC1C,UAAM,YAAY,SAAS;AAC3B,UAAM,aAAa,SAAS;AAC5B,UAAM,QAAQ,SAAS;AACvB,UAAM,QAAQ,SAAS;AACvB,aAAS;AAAA,MACP;AAAA,MACA,aAAa,CAAC,YAAY,IAAI,KAAK,IACjC,WACI,KAAK,SAAS,IAAI,eAAe,IAAI,aAAa,IAAI,QACtD,CAAC,KAAK,SAAS,IAAI,eAAe,IAAI,aAAa,IAAI,KAC7D;AAAA,IACF;AACA,aAAS,KAAK,SAAS,UAAU,UAAU,IAAI,QAAQ,KAAK,UAAU,GAAG;AAAA,EAC3E;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,IACxD,WAAW,CAAC,cAAc,IAAI,cAAc,IAAI,KAAK,MACvD;AAAA,EACF;AAEA,YAAU;AAAA,IACR;AAAA,IACA,aAAa,CAAC,IACZ,WAAW,KAAK,SAAS,IAAI,eAAe,IAAI,CAAC,KAAK,SAAS,IAAI,eAAe,CACpF;AAAA,EACF;AAEA,mBAAiB,MAAM,UAAU;AAEjC,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,wBAAwB,MAAM,KAAK;AAC5C,QAAI,CAAC,KAAK,OAAO;AACf,aAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,IACnC;AACA,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,aAAa,KAAK,UAAU;AAClC,QAAI,SAAS,CAAC;AACd,QAAI,UAAU;AACZ,eAAS;AAAA,QACP,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QAC9E,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QACzE,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QACzE,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,MAChF;AAAA,IACF,OAAO;AACL,eAAS;AAAA,QACP,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,QACrD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,QAC1D,EAAE,GAAG,KAAK,KAAK,QAAQ,IAAI,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACrD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,QAC1D,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,MACvD;AAAA,IACF;AAEA,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAhIsB;;;ACTtB,OAAOC,aAAW;AASlB,eAAsB,WACpB,QACA,MACA,EAAE,QAAQ,EAAE,gBAAgB,UAAU,EAAE,GACxC;AACA,QAAM,EAAE,YAAY,IAAI,cAAc,IAAI;AAC1C,OAAK,aAAa;AAClB,QAAM,cAAc,KAAK,eAAe;AACxC,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,WAAW,KAAK,IAAI,aAAa,UAAU;AACjD,QAAM,eAAe,WAAW;AAChC,OAAK,QAAQ,KAAK,IAAI,UAAU,gBAAgB,CAAC;AACjD,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,oBAAoB;AAEtF,QAAM,UAAU;AAChB,QAAM,eAAe,KAAK,QAAQ,IAAI;AAEtC,QAAM,WAAW,KAAK,QAAQ;AAE9B,QAAM,EAAE,YAAY,QAAQ,IAAI;AAChC,QAAM,EAAE,UAAU,IAAI,cAAc,IAAI;AAExC,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AACA,QAAM,OAAO,UAAU,IAAI,MAAM;AACjC,UAAQ,SAAS,QAAQ;AAEzB,QAAM,WAAW,SAAS,OAAO,GAAG;AACpC,MAAI,KAAK,MAAM;AACb,aAAS;AAAA,MACP,MAAM,MAAM,WAAW,KAAK,MAAM;AAAA,QAChC,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,gBAAgB;AAAA,MAClB,CAAC,CAAC;AAAA,IACJ;AAAA,EACF;AACA,QAAM,WAAW,SAAS,KAAK,EAAG,QAAQ;AAC1C,QAAM,YAAY,SAAS;AAC3B,QAAM,aAAa,SAAS;AAC5B,QAAM,QAAQ,SAAS;AACvB,QAAM,QAAQ,SAAS;AAEvB,QAAM,WAAW,KAAK,IAAI,WAAW,UAAU,IAAI,KAAK,QAAQ,UAAU;AAC1E,QAAM,WAAW,GAAG,OAAO,GAAG,GAAG,UAAU,OAAO;AAElD,QAAM,aAAa,KAAK,IAAI,UAAU,KAAK,KAAK;AAChD,QAAM,cAAc,WAAW,KAAK,SAAS;AAE7C,QAAM,YAAY,GAAG,UAAU,CAAC,aAAa,GAAG,CAAC,cAAc,GAAG,YAAY,aAAa;AAAA,IACzF,GAAG;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,YAAY,SAAS,OAAO,MAAM,UAAU,cAAc;AAChE,QAAM,aAAa,SAAS,OAAO,MAAM,SAAS;AAClD,WAAS;AAAA,IACP;AAAA,IACA,aAAa,CAAC,YAAY,IAAI,KAAK,IACjC,WACI,KAAK,SAAS,IAAI,eAAe,IAAI,aAAa,IAAI,QACtD,CAAC,KAAK,SAAS,IAAI,eAAe,IAAI,aAAa,IAAI,KAC7D;AAAA,EACF;AACA,WAAS,KAAK,SAAS,UAAU,UAAU,IAAI,QAAQ,KAAK,UAAU,GAAG;AACzE,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,IACxD,WAAW,CAAC,cAAc,IAAI,cAAc,IAAI,KAAK,MACvD;AAAA,EACF;AAEA,YAAU;AAAA,IACR;AAAA,IACA,aAAa,CAAC,IACZ,WAAW,KAAK,SAAS,IAAI,eAAe,IAAI,CAAC,KAAK,SAAS,IAAI,eAAe,CACpF;AAAA,EACF;AAEA,mBAAiB,MAAM,UAAU;AAEjC,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,wBAAwB,MAAM,KAAK;AAC5C,UAAM,MAAM,kBAAU,KAAK,MAAM,KAAK;AACtC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA9FsB;;;ACTtB,OAAOC,aAAW;AAUlB,eAAsB,YACpB,QACA,MACA,EAAE,QAAQ,EAAE,gBAAgB,UAAU,EAAE,GACxC;AACA,QAAM,EAAE,YAAY,IAAI,cAAc,IAAI;AAC1C,OAAK,aAAa;AAClB,QAAM,cAAc,KAAK,eAAe;AACxC,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,WAAW,KAAK,IAAI,aAAa,UAAU;AACjD,QAAM,eAAe,WAAW;AAChC,OAAK,QAAQ,KAAK,IAAI,UAAU,gBAAgB,CAAC;AACjD,QAAM,EAAE,UAAU,MAAM,aAAa,MAAM,IAAI,MAAM;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,QAAQ;AAE9B,QAAM,SAAS,WAAW,cAAc;AACxC,QAAM,QAAQ,WAAW,cAAc;AACvC,QAAM,EAAE,YAAY,QAAQ,IAAI;AAChC,QAAM,EAAE,UAAU,IAAI,cAAc,IAAI;AAExC,QAAM,IAAI,CAAC,QAAQ;AACnB,QAAM,IAAI,CAAC,SAAS;AAEpB,QAAM,eAAe,KAAK,QAAQ,IAAI;AAGtC,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AACA,QAAM,OAAO,UAAU,IAAI,MAAM;AACjC,UAAQ,SAAS,QAAQ;AAEzB,QAAM,WAAW,GAAG,KAAK,uBAAuB,GAAG,GAAG,OAAO,QAAQ,CAAC,GAAG,OAAO;AAEhF,QAAM,aAAa,KAAK,IAAI,OAAO,KAAK,KAAK;AAC7C,QAAM,cAAc,SAAS,KAAK,SAAS;AAE3C,QAAM,YAAY,GAAG,UAAU,CAAC,aAAa,GAAG,CAAC,cAAc,GAAG,YAAY,aAAa;AAAA,IACzF,GAAG;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,YAAY,SAAS,OAAO,MAAM,UAAU,cAAc,EAAE,KAAK,SAAS,aAAa;AAC7F,QAAM,aAAa,SAAS,OAAO,MAAM,SAAS;AAElD,MAAI,KAAK,MAAM;AACb,UAAM,WAAW,SAAS,OAAO,GAAG;AACpC,aAAS;AAAA,MACP,MAAM,MAAM,WAAW,KAAK,MAAM;AAAA,QAChC,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,gBAAgB;AAAA,MAClB,CAAC,CAAC;AAAA,IACJ;AACA,UAAM,WAAW,SAAS,KAAK,EAAG,QAAQ;AAC1C,UAAM,YAAY,SAAS;AAC3B,UAAM,aAAa,SAAS;AAC5B,UAAM,QAAQ,SAAS;AACvB,UAAM,QAAQ,SAAS;AACvB,aAAS;AAAA,MACP;AAAA,MACA,aAAa,CAAC,YAAY,IAAI,KAAK,IACjC,WACI,KAAK,SAAS,IAAI,eAAe,IAAI,aAAa,IAAI,QACtD,CAAC,KAAK,SAAS,IAAI,eAAe,IAAI,aAAa,IAAI,KAC7D;AAAA,IACF;AACA,aAAS,KAAK,SAAS,UAAU,UAAU,IAAI,QAAQ,KAAK,UAAU,GAAG;AAAA,EAC3E;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,IACxD,WAAW,CAAC,cAAc,IAAI,cAAc,IAAI,KAAK,MACvD;AAAA,EACF;AAEA,YAAU;AAAA,IACR;AAAA,IACA,aAAa,CAAC,IACZ,WAAW,KAAK,SAAS,IAAI,eAAe,IAAI,CAAC,KAAK,SAAS,IAAI,eAAe,CACpF;AAAA,EACF;AAEA,mBAAiB,MAAM,UAAU;AAEjC,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,wBAAwB,MAAM,KAAK;AAC5C,QAAI,CAAC,KAAK,OAAO;AACf,aAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,IACnC;AACA,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,aAAa,KAAK,UAAU;AAClC,QAAI,SAAS,CAAC;AACd,QAAI,UAAU;AACZ,eAAS;AAAA,QACP,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QAC9E,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QACzE,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QACzE,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,MAChF;AAAA,IACF,OAAO;AACL,eAAS;AAAA,QACP,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,QACrD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,QAC1D,EAAE,GAAG,KAAK,KAAK,QAAQ,IAAI,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACrD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,QAC1D,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,MACvD;AAAA,IACF;AAEA,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAtIsB;;;ACVtB,OAAOC,aAAW;AAUlB,eAAsB,WACpB,QACA,MACA,EAAE,QAAQ,EAAE,gBAAgB,UAAU,EAAE,GACxC;AACA,QAAM,EAAE,YAAY,IAAI,cAAc,IAAI;AAC1C,OAAK,aAAa;AAClB,QAAM,cAAc,KAAK,eAAe;AACxC,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,WAAW,KAAK,IAAI,aAAa,UAAU;AACjD,QAAM,eAAe,WAAW;AAChC,OAAK,QAAQ,KAAK,IAAI,UAAU,gBAAgB,CAAC;AACjD,QAAM,EAAE,UAAU,MAAM,aAAa,MAAM,IAAI,MAAM;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,QAAQ;AAE9B,QAAM,SAAS,WAAW,cAAc;AACxC,QAAM,QAAQ,WAAW,cAAc;AACvC,QAAM,EAAE,YAAY,QAAQ,IAAI;AAChC,QAAM,EAAE,UAAU,IAAI,cAAc,IAAI;AAExC,QAAM,IAAI,CAAC,QAAQ;AACnB,QAAM,IAAI,CAAC,SAAS;AAEpB,QAAM,eAAe,KAAK,QAAQ,IAAI;AAGtC,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AACA,QAAM,OAAO,UAAU,IAAI,MAAM;AACjC,UAAQ,SAAS,QAAQ;AAEzB,QAAM,WAAW,GAAG,KAAK,uBAAuB,GAAG,GAAG,OAAO,QAAQ,GAAG,GAAG,OAAO;AAElF,QAAM,aAAa,KAAK,IAAI,OAAO,KAAK,KAAK;AAC7C,QAAM,cAAc,SAAS,KAAK,SAAS;AAE3C,QAAM,YAAY,GAAG,UAAU,CAAC,aAAa,GAAG,CAAC,cAAc,GAAG,YAAY,aAAa;AAAA,IACzF,GAAG;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,YAAY,SAAS,OAAO,MAAM,UAAU,cAAc;AAChE,QAAM,aAAa,SAAS,OAAO,MAAM,SAAS;AAElD,MAAI,KAAK,MAAM;AACb,UAAM,WAAW,SAAS,OAAO,GAAG;AACpC,aAAS;AAAA,MACP,MAAM,MAAM,WAAW,KAAK,MAAM;AAAA,QAChC,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,gBAAgB;AAAA,MAClB,CAAC,CAAC;AAAA,IACJ;AACA,UAAM,WAAW,SAAS,KAAK,EAAG,QAAQ;AAC1C,UAAM,YAAY,SAAS;AAC3B,UAAM,aAAa,SAAS;AAC5B,UAAM,QAAQ,SAAS;AACvB,UAAM,QAAQ,SAAS;AACvB,aAAS;AAAA,MACP;AAAA,MACA,aAAa,CAAC,YAAY,IAAI,KAAK,IACjC,WACI,KAAK,SAAS,IAAI,eAAe,IAAI,aAAa,IAAI,QACtD,CAAC,KAAK,SAAS,IAAI,eAAe,IAAI,aAAa,IAAI,KAC7D;AAAA,IACF;AACA,aAAS,KAAK,SAAS,UAAU,UAAU,IAAI,QAAQ,KAAK,UAAU,GAAG;AAAA,EAC3E;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,IACxD,WAAW,CAAC,cAAc,IAAI,cAAc,IAAI,KAAK,MACvD;AAAA,EACF;AAEA,YAAU;AAAA,IACR;AAAA,IACA,aAAa,CAAC,IACZ,WAAW,KAAK,SAAS,IAAI,eAAe,IAAI,CAAC,KAAK,SAAS,IAAI,eAAe,CACpF;AAAA,EACF;AAEA,mBAAiB,MAAM,UAAU;AAEjC,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,wBAAwB,MAAM,KAAK;AAC5C,QAAI,CAAC,KAAK,OAAO;AACf,aAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,IACnC;AACA,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,aAAa,KAAK,UAAU;AAClC,QAAI,SAAS,CAAC;AACd,QAAI,UAAU;AACZ,eAAS;AAAA,QACP,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QAC9E,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QACzE,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QACzE,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,MAChF;AAAA,IACF,OAAO;AACL,eAAS;AAAA,QACP,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QAC5C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,QACrD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,QAC1D,EAAE,GAAG,KAAK,KAAK,QAAQ,IAAI,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACrD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,QAC1D,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,OAAO;AAAA,MACvD;AAAA,IACF;AAEA,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAtIsB;;;ACVtB,OAAOC,aAAW;AAQlB,eAAsB,YACpB,QACA,MACA,EAAE,QAAQ,EAAE,UAAU,EAAE,GACxB;AACA,QAAM,MAAM,IAAI,MAAM;AACtB,MAAI,MAAM,MAAM,OAAO;AACvB,QAAM,IAAI,OAAO;AAEjB,QAAM,oBAAoB,OAAO,IAAI,aAAa,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAC9E,QAAM,qBAAqB,OAAO,IAAI,cAAc,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAChF,OAAK,mBAAmB,oBAAoB;AAE5C,QAAM,EAAE,YAAY,IAAI,cAAc,IAAI;AAE1C,OAAK,aAAa;AAElB,QAAM,eAAe,WAAW;AAChC,OAAK,eAAe,WAAW;AAE/B,QAAM,gBAAgB,KAAK;AAAA,IACzB,KAAK,QAAS,gBAAgB,IAAK;AAAA,IACnC,MAAM,cAAc;AAAA,EACtB;AAEA,QAAM,aACJ,KAAK,eAAe,OAChB,MAAM,cACJ,KAAK,cAAc,KAAK,mBACxB,gBACF;AAEN,QAAM,cACJ,KAAK,eAAe,OAChB,aAAa,KAAK,mBACjB,MAAM,eAAe;AAC5B,OAAK,QAAQ,KAAK,IAAI,YAAY,gBAAgB,CAAC;AACnD,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,qBAAqB;AAEvF,QAAM,WAAW,KAAK,QAAQ;AAE9B,QAAM,IAAI,CAAC,aAAa;AACxB,QAAM,IAAI,CAAC,cAAc;AAEzB,QAAM,eAAe,KAAK,QAAQ,IAAI;AAGtC,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,YAAY,GAAG,UAAU,GAAG,GAAG,YAAY,aAAa,OAAO;AAErE,QAAM,aAAa,KAAK,IAAI,YAAY,KAAK,KAAK;AAClD,QAAM,cAAc,cAAc,KAAK,SAAS;AAEhD,QAAM,YAAY,GAAG,UAAU,CAAC,aAAa,GAAG,CAAC,cAAc,GAAG,YAAY,aAAa;AAAA,IACzF,GAAG;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,YAAY,SAAS,OAAO,MAAM,WAAW,cAAc;AACjE,QAAM,aAAa,SAAS,OAAO,MAAM,SAAS;AAElD,MAAI,KAAK,KAAK;AACZ,UAAM,QAAQ,SAAS,OAAO,OAAO;AAGrC,UAAM,KAAK,QAAQ,KAAK,GAAG;AAC3B,UAAM,KAAK,SAAS,UAAU;AAC9B,UAAM,KAAK,UAAU,WAAW;AAChC,UAAM,KAAK,uBAAuB,MAAM;AAExC,UAAM;AAAA,MACJ;AAAA,MACA,aAAa,CAAC,aAAa,CAAC,IAAI,WAAW,cAAc,IAAI,cAAc,CAAC,cAAc,CAAC;AAAA,IAC7F;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,IACxD,WACI,CAAC,cAAc,IAAI,KAAK,SAAS,IAAI,eAAe,IACpD,cAAc,IAAI,KAAK,SAAS,IAAI,eAAe,CACzD;AAAA,EACF;AAEA,YAAU;AAAA,IACR;AAAA,IACA,aAAa,CAAC,IACZ,WAAW,KAAK,SAAS,IAAI,eAAe,IAAI,CAAC,KAAK,SAAS,IAAI,eAAe,CACpF;AAAA,EACF;AAEA,mBAAiB,MAAM,UAAU;AAEjC,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,wBAAwB,MAAM,KAAK;AAC5C,QAAI,CAAC,KAAK,OAAO;AACf,aAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,IACnC;AACA,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,aAAa,KAAK,UAAU;AAClC,QAAI,SAAS,CAAC;AACd,QAAI,UAAU;AACZ,eAAS;AAAA,QACP,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QAC9E,EAAE,GAAG,KAAK,aAAa,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QAC9E,EAAE,GAAG,KAAK,aAAa,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,aAAa,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,aAAa,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,QAC9E,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,KAAK,SAAS,aAAa;AAAA,MAChF;AAAA,IACF,OAAO;AACL,eAAS;AAAA,QACP,EAAE,GAAG,KAAK,aAAa,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,aAAa,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,aAAa,GAAG,GAAG,KAAK,aAAa,IAAI,YAAY;AAAA,QAC/D,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,YAAY;AAAA,QAC/D,EAAE,GAAG,KAAK,KAAK,QAAQ,IAAI,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACrD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,EAAE;AAAA,QACjD,EAAE,GAAG,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,aAAa,IAAI,YAAY;AAAA,QAC/D,EAAE,GAAG,KAAK,aAAa,GAAG,GAAG,KAAK,aAAa,IAAI,YAAY;AAAA,MACjE;AAAA,IACF;AAEA,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA5IsB;;;ACJtB,OAAOC,aAAW;AAmBlB,eAAsB,cACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAE/E,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACzE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAE3E,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,IAAK,IAAI,IAAK,GAAG,GAAG,CAAC,EAAE;AAAA,IAC5B,EAAE,GAAI,KAAK,IAAK,GAAG,GAAG,CAAC,EAAE;AAAA,EAC3B;AAEA,MAAI;AACJ,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,UAAM,WAAW,qBAAqB,MAAM;AAE5C,UAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,cAAU,SACP,OAAO,MAAM,WAAW,cAAc,EACtC,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAErD,QAAI,WAAW;AACb,cAAQ,KAAK,SAAS,SAAS;AAAA,IACjC;AAAA,EACF,OAAO;AACL,cAAU,mBAAmB,UAAU,GAAG,GAAG,MAAM;AAAA,EACrD;AAEA,MAAI,YAAY;AACd,YAAQ,KAAK,SAAS,UAAU;AAAA,EAClC;AAEA,OAAK,QAAQ;AACb,OAAK,SAAS;AAEd,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;AAtDsB;;;AClBtB,OAAOC,aAAW;AAKlB,eAAsB,SACpB,QACA,MACA,SACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAElB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAE/E,QAAM,aAAa,KAAK,IAAI,KAAK,QAAQ,QAAQ,gBAAgB,GAAG,MAAM,SAAS,CAAC;AACpF,QAAM,cAAc,KAAK,IAAI,KAAK,SAAS,QAAQ,gBAAgB,GAAG,MAAM,UAAU,CAAC;AACvF,QAAM,IAAI,CAAC,aAAa;AACxB,QAAM,IAAI,CAAC,cAAc;AAIzB,MAAIC;AACJ,MAAI,EAAE,IAAI,GAAG,IAAI;AACjB,QAAM,EAAE,UAAU,IAAI;AAGtB,MAAI,SAAS,MAAM,QAAQ,IAAI;AAC7B,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACf;AAEA,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAMC,WAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,UAAM,YACJ,MAAM,KACF,GAAG,KAAK,uBAAuB,GAAG,GAAG,YAAY,aAAa,MAAM,CAAC,GAAGA,QAAO,IAC/E,GAAG,UAAU,GAAG,GAAG,YAAY,aAAaA,QAAO;AAEzD,IAAAF,QAAO,SAAS,OAAO,MAAM,WAAW,cAAc;AACtD,IAAAA,MAAK,KAAK,SAAS,uBAAuB,EAAE,KAAK,SAAS,oBAAoB,SAAS,CAAC;AAAA,EAC1F,OAAO;AACL,IAAAA,QAAO,SAAS,OAAO,QAAQ,cAAc;AAE7C,IAAAA,MACG,KAAK,SAAS,uBAAuB,EACrC,KAAK,SAAS,UAAU,EACxB,KAAK,MAAM,oBAAoB,EAAE,CAAC,EAClC,KAAK,MAAM,oBAAoB,EAAE,CAAC,EAClC,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,SAAS,UAAU,EACxB,KAAK,UAAU,WAAW;AAAA,EAC/B;AAEA,mBAAiB,MAAMA,KAAI;AAE3B,OAAK,gBAAgB,SAAU,QAAgB,OAAc;AAC3D,WAAO,kBAAU,KAAK,QAAQ,KAAK;AAAA,EACrC;AAEA,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;AAhEsB;;;ACWtB,eAAsB,UAAwC,QAAwB,MAAY;AAChG,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,OAAO;AAIzE,QAAMG,QAAO,SAAS,OAAO,QAAQ,cAAc;AAGnD,QAAM,aAAa;AACnB,QAAM,cAAc;AACpB,EAAAA,MAAK,KAAK,SAAS,UAAU,EAAE,KAAK,UAAU,WAAW;AACzD,WAAS,KAAK,SAAS,iBAAiB;AACxC,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,EAAE,KAAK,QAAQ,MAAM,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,EAAE,KAAK,SAAS,MAAM,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAClH;AAaA,mBAAiB,MAAMA,KAAI;AAI3B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;AArCsB;;;ACjBtB,OAAOC,aAAW;AAIlB,eAAsB,UAAwC,QAAwB,MAAY;AAChG,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAC/E,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,IAAI,MAAM,SAAS,CAAC;AACrE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,IAAI,MAAM,UAAU,CAAC;AACvE,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,IAAK,IAAI,IAAK,GAAG,GAAG,EAAE;AAAA,IAC3B,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,IACd,EAAE,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,CAAC,EAAE;AAAA,EAC3B;AAEA,MAAI;AACJ,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,UAAM,WAAW,qBAAqB,MAAM;AAE5C,UAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,cAAU,SACP,OAAO,MAAM,WAAW,cAAc,EACtC,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAErD,QAAI,WAAW;AACb,cAAQ,KAAK,SAAS,SAAS;AAAA,IACjC;AAAA,EACF,OAAO;AACL,cAAU,mBAAmB,UAAU,GAAG,GAAG,MAAM;AAAA,EACrD;AAEA,MAAI,YAAY;AACd,YAAQ,KAAK,SAAS,UAAU;AAAA,EAClC;AAEA,OAAK,QAAQ;AACb,OAAK,SAAS;AAEd,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;AAjDsB;;;ACJtB,OAAOC,aAAW;AAIlB,eAAsB,WAAyC,QAAwB,MAAY;AACjG,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAC/E,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,IAAI,MAAM,SAAS,CAAC;AACrE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,IAAI,MAAM,UAAU,CAAC;AACvE,QAAM,SAAS;AAAA,IACb,EAAE,GAAI,KAAK,IAAK,GAAG,GAAG,EAAE;AAAA,IACxB,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,IAAK,IAAI,IAAK,GAAG,GAAG,CAAC,EAAE;AAAA,IAC5B,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,EAChB;AAEA,MAAI;AACJ,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,UAAM,WAAW,qBAAqB,MAAM;AAC5C,UAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,cAAU,SACP,OAAO,MAAM,WAAW,cAAc,EACtC,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAErD,QAAI,WAAW;AACb,cAAQ,KAAK,SAAS,SAAS;AAAA,IACjC;AAAA,EACF,OAAO;AACL,cAAU,mBAAmB,UAAU,GAAG,GAAG,MAAM;AAAA,EACrD;AAEA,MAAI,YAAY;AACd,YAAQ,KAAK,SAAS,UAAU;AAAA,EAClC;AAEA,OAAK,QAAQ;AACb,OAAK,SAAS;AAEd,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;AAhDsB;;;ACJtB,OAAOC,aAAW;AAKX,SAAS,cAA4C,QAAwB,MAAY;AAC9F,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,QAAQ;AACb,OAAK,aAAa;AAClB,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,eAAe,IAAI,CAAC,EAClC,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AACnC,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,QAAQ,KAAK,IAAI,IAAI,MAAM,SAAS,CAAC;AAC3C,QAAM,SAAS,KAAK,IAAI,IAAI,MAAM,UAAU,CAAC;AAC7C,QAAM,MAAM;AAEZ,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,OAAO,GAAG,EAAE;AAAA,IACjB,EAAE,GAAG,GAAG,GAAG,SAAS,MAAM,EAAE;AAAA,IAC5B,EAAE,GAAG,QAAQ,IAAI,KAAK,GAAG,SAAS,MAAM,EAAE;AAAA,IAC1C,EAAE,GAAG,GAAG,GAAG,IAAI,OAAO;AAAA,IACtB,EAAE,GAAG,OAAO,GAAG,SAAS,MAAM,EAAE;AAAA,IAChC,EAAE,GAAG,IAAI,KAAK,GAAG,SAAS,MAAM,EAAE;AAAA,EACpC;AAGA,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,WAAW,GAAG,KAAK,UAAU,OAAO;AAE1C,QAAMC,iBAAgB,SAAS,OAAO,MAAM,UAAU,cAAc;AAEpE,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,IAAAA,eAAc,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACzD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,IAAAA,eAAc,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EAC1D;AAEA,EAAAA,eAAc,KAAK,aAAa,cAAc,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG;AAErE,mBAAiB,MAAMA,cAAa;AAEpC,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,2BAA2B,MAAM,KAAK;AAC/C,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAEjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAxDgB;;;ACLhB,OAAOC,aAAW;AAIX,IAAMC,uBAAsB,wBACjC,GACA,GACA,OACA,QACA,IACA,IACA,gBACW;AACX,SAAO;AAAA,IACL,IAAI,CAAC,IAAI,IAAI,EAAE;AAAA,IACf,IAAI,EAAE,IAAI,EAAE,UAAU,KAAK;AAAA,IAC3B,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK;AAAA,IAC5B,MAAM,MAAM;AAAA,IACZ,IAAI,EAAE,IAAI,EAAE,UAAU,KAAK;AAAA,IAC3B,MAAM,CAAC,MAAM;AAAA,IACb,IAAI,CAAC,IAAI,IAAI,KAAK,WAAW;AAAA,IAC7B,IAAI,EAAE,IAAI,EAAE,UAAU,KAAK;AAAA,EAC7B,EAAE,KAAK,GAAG;AACZ,GAnBmC;AAoB5B,IAAMC,4BAA2B,wBACtC,GACA,GACA,OACA,QACA,IACA,IACA,gBACW;AACX,SAAO;AAAA,IACL,IAAI,CAAC,IAAI,IAAI,EAAE;AAAA,IACf,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;AAAA,IACvB,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK;AAAA,IAC5B,MAAM,MAAM;AAAA,IACZ,IAAI,EAAE,IAAI,EAAE,UAAU,KAAK;AAAA,IAC3B,MAAM,CAAC,MAAM;AAAA,IACb,IAAI,CAAC,IAAI,IAAI,KAAK,WAAW;AAAA,IAC7B,IAAI,EAAE,IAAI,EAAE,UAAU,KAAK;AAAA,EAC7B,EAAE,KAAK,GAAG;AACZ,GAnBwC;AAoBjC,IAAMC,4BAA2B,wBACtC,GACA,GACA,OACA,QACA,IACA,OACW;AACX,SAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,EAAE,KAAK,GAAG;AACvF,GATwC;AAUxC,eAAsB,cACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,IAAI,KAAK,SAAS,CAAC;AACpE,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,MAAM,MAAM,IAAI;AAC3B,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,UAAU,CAAC;AAC3E,QAAM,cAAc,IAAI;AAExB,MAAIC;AACJ,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,gBAAgBH,0BAAyB,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,WAAW;AAC9E,UAAM,gBAAgBC,0BAAyB,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAClE,UAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,UAAM,YAAY,GAAG,KAAK,eAAe,OAAO;AAChD,UAAM,YAAY,GAAG,KAAK,eAAe,OAAO;AAEhD,UAAM,cAAc,SAAS,OAAO,MAAM,WAAW,cAAc;AACnE,gBAAY,KAAK,SAAS,MAAM;AAChC,IAAAC,YAAW,SAAS,OAAO,MAAM,WAAW,cAAc;AAC1D,IAAAA,UAAS,KAAK,SAAS,uBAAuB;AAC9C,QAAI,WAAW;AACb,MAAAA,UAAS,KAAK,SAAS,SAAS;AAAA,IAClC;AAAA,EACF,OAAO;AACL,UAAM,WAAWH,qBAAoB,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,WAAW;AACpE,IAAAG,YAAW,SACR,OAAO,QAAQ,cAAc,EAC7B,KAAK,KAAK,QAAQ,EAClB,KAAK,SAAS,uBAAuB,EACrC,KAAK,SAAS,oBAAoB,SAAS,CAAC,EAC5C,KAAK,SAAS,UAAU;AAAA,EAC7B;AAGA,EAAAA,UAAS,KAAK,kBAAkB,EAAE;AAClC,EAAAA,UAAS,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,GAAG,GAAG;AAEnE,mBAAiB,MAAMA,SAAQ;AAE/B,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,EAAE,KAAK,QAAQ,MAAM,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,EAAE,KAAK,SAAS,KAAK,MAAM,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EACvH;AAEA,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,KAAK,MAAM,KAAK;AACtC,UAAM,IAAI,IAAI,KAAK,KAAK,KAAK;AAE7B,QACE,MAAM,MACL,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,KAAK,KAChC,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,KAAK,KAClC,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,UAAU,KAAK,IAAI,KAC/D;AACA,UAAI,IAAI,KAAK,MAAM,IAAK,IAAI,KAAM,KAAK;AACvC,UAAI,IAAI,GAAG;AACT,YAAI,KAAK,KAAK,CAAC;AAAA,MACjB;AACA,UAAI,KAAK;AACT,UAAI,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;AAC/B,YAAI,CAAC;AAAA,MACP;AAEA,UAAI,KAAK;AAAA,IACX;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAhFsB;;;AClDtB,OAAOE,aAAW;AAIlB,eAAsB,mBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACzE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAC3E,QAAM,gBAAgB,IAAI;AAC1B,QAAM,SAAS,IAAI;AACnB,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,CAAC,IAAI,IAAK,IAAI,IAAK,KAAK,GAAG,CAAC,SAAS,EAAE;AAAA,IAC5C,EAAE,GAAG,CAAC,IAAI,IAAK,IAAI,IAAK,KAAK,GAAG,SAAS,EAAE;AAAA,IAC3C,GAAG;AAAA,MACD,CAAC,IAAI,IAAK,IAAI,IAAK;AAAA,MACnB,SAAS;AAAA,MACT,IAAI,IAAK,IAAI,IAAK;AAAA,MAClB,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACA,EAAE,GAAG,IAAI,IAAK,IAAI,IAAK,KAAK,GAAG,CAAC,SAAS,EAAE;AAAA,IAC3C,EAAE,GAAG,CAAC,IAAI,IAAK,IAAI,IAAK,KAAK,GAAG,CAAC,SAAS,EAAE;AAAA,IAC5C,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE;AAAA,IAC5B,EAAE,GAAG,CAAC,IAAI,GAAG,GAAI,SAAS,IAAK,IAAI;AAAA,IACnC,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE;AAAA,EAC9B;AAEA,QAAM,OAAO,GAAG;AAAA,IACd,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,eAAe,SAAS,OAAO,MAAM,MAAM,cAAc;AAE/D,eAAa,KAAK,SAAS,uBAAuB;AAElD,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,iBAAa,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,iBAAa,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,eAAa,KAAK,aAAa,eAAe,CAAC,gBAAgB,CAAC,GAAG;AACnE,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,IAAI,KAAK,KAAK,WAAW,KAAO,IAAI,IAAK,MAAO,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,WAAW,KAAK,gBAAgB,KAAK,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAChL;AAEA,mBAAiB,MAAM,YAAY;AACnC,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAtEsB;;;ACTtB,OAAOC,aAAW;AAIlB,eAAsB,UAAwC,QAAwB,MAAY;AAChG,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACzE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAC3E,QAAM,aAAa;AACnB,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,QAAM,kBAAkB;AAAA,IACtB,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,WAAW;AAAA,IACvC,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,IAAI,WAAW;AAAA,IAC3C,EAAE,GAAG,IAAI,IAAI,YAAY,GAAG,IAAI,IAAI,WAAW;AAAA,IAC/C,EAAE,GAAG,IAAI,IAAI,YAAY,GAAG,IAAI,EAAE;AAAA,IAClC,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IACrB,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,WAAW;AAAA,IAClC,EAAE,GAAG,IAAI,IAAI,YAAY,GAAG,IAAI,IAAI,WAAW;AAAA,IAC/C,EAAE,GAAG,IAAI,IAAI,YAAY,GAAG,IAAI,WAAW;AAAA,IAC3C,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,WAAW;AAAA,IACvC,EAAE,GAAG,IAAI,YAAY,EAAK;AAAA,IAC1B,EAAE,GAAG,EAAE;AAAA,IACP,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA,EACzB;AAEA,QAAM,kBAAkB;AAAA,IACtB,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA,IACvB,EAAE,GAAG,IAAI,IAAI,YAAY,GAAG,IAAI,WAAW;AAAA,IAC3C,EAAE,GAAG,IAAI,IAAI,YAAY,GAAG,IAAI,EAAE;AAAA,IAClC,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IACrB,EAAE,GAAG,IAAI,GAAG,EAAE;AAAA,IACd,EAAE,GAAG,EAAE;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,YAAY,qBAAqB,eAAe;AACtD,QAAM,YAAY,GAAG,KAAK,WAAW,OAAO;AAC5C,QAAM,YAAY,qBAAqB,eAAe;AACtD,QAAM,YAAY,GAAG,KAAK,WAAW,EAAE,GAAG,SAAS,MAAM,OAAO,CAAC;AAEjE,QAAMC,aAAY,SAAS,OAAO,MAAM,WAAW,cAAc;AACjE,EAAAA,WAAU,OAAO,MAAM,WAAW,cAAc;AAEhD,EAAAA,WAAU,KAAK,SAAS,uBAAuB;AAE/C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,IAAAA,WAAU,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACrD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,IAAAA,WAAU,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACtD;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,EAAE,KAAK,QAAQ,KAAK,cAAc,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,EAAE,KAAK,SAAS,KAAK,cAAc,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAC5I;AAEA,mBAAiB,MAAMA,UAAS;AAEhC,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,iBAAiB,KAAK;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA3EsB;;;ACEtB,OAAOC,aAAW;AAIlB,eAAsB,wBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACzE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAC3E,QAAM,gBAAgB,IAAI;AAC1B,QAAM,SAAS,IAAI;AACnB,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,IAAI,CAAC,SAAS;AACpB,QAAM,aAAa;AAEnB,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,aAAa;AAAA,IACjB,IAAI;AAAA,IACJ,IAAI,SAAS;AAAA,IACb,IAAI,IAAI;AAAA,IACR,IAAI,SAAS;AAAA,IACb;AAAA,IACA;AAAA,EACF;AAEA,QAAM,gBAAgB,aAAa,WAAW,SAAS,CAAC;AAExD,QAAM,kBAAkB;AAAA,IACtB,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,WAAW;AAAA,IACvC,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,SAAS,WAAW;AAAA,IAChD,GAAG;AAAA,IACH,EAAE,GAAG,IAAI,IAAI,YAAY,GAAG,cAAc,IAAI,WAAW;AAAA,IACzD,EAAE,GAAG,IAAI,GAAG,GAAG,cAAc,IAAI,WAAW;AAAA,IAC5C,EAAE,GAAG,IAAI,GAAG,GAAG,cAAc,IAAI,IAAI,WAAW;AAAA,IAChD,EAAE,GAAG,IAAI,IAAI,YAAY,GAAG,cAAc,IAAI,IAAI,WAAW;AAAA,IAC7D,EAAE,GAAG,IAAI,IAAI,YAAY,GAAG,IAAI,WAAW;AAAA,IAC3C,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,WAAW;AAAA,IACvC,EAAE,GAAG,IAAI,YAAY,EAAK;AAAA,IAC1B,EAAE,GAAG,EAAE;AAAA,IACP,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA,EACzB;AAEA,QAAM,kBAAkB;AAAA,IACtB,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA,IACvB,EAAE,GAAG,IAAI,IAAI,YAAY,GAAG,IAAI,WAAW;AAAA,IAC3C,EAAE,GAAG,IAAI,IAAI,YAAY,GAAG,cAAc,IAAI,WAAW;AAAA,IACzD,EAAE,GAAG,IAAI,GAAG,GAAG,cAAc,IAAI,WAAW;AAAA,IAC5C,EAAE,GAAG,IAAI,GAAG,EAAE;AAAA,IACd,EAAE,GAAG,EAAE;AAAA,EACT;AAGA,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,YAAY,qBAAqB,eAAe;AACtD,QAAM,YAAY,GAAG,KAAK,WAAW,OAAO;AAC5C,QAAM,YAAY,qBAAqB,eAAe;AACtD,QAAM,YAAY,GAAG,KAAK,WAAW,OAAO;AAE5C,QAAM,QAAQ,SAAS,OAAO,MAAM,WAAW,cAAc;AAC7D,QAAM,OAAO,MAAM,SAAS;AAE5B,QAAM,KAAK,SAAS,uBAAuB;AAE3C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,UAAM,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACjD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,UAAM,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EAClD;AAEA,QAAM,KAAK,aAAa,eAAe,CAAC,gBAAgB,CAAC,GAAG;AAE5D,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,EAAE,KAAK,QAAQ,KAAK,cAAc,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,EAAE,KAAK,SAAS,KAAK,aAAa,gBAAgB,KAAK,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAChK;AAEA,mBAAiB,MAAM,KAAK;AAE5B,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,iBAAiB,KAAK;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA9FsB;;;ACbtB,OAAOC,aAAW;AAQlB,eAAsB,KACpB,QACA,MACA,EAAE,QAAQ,EAAE,eAAe,EAAE,GAC7B;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,gBAAgB,KAAK,iBAAiB,UAAU,EAAE,WAAW,eAAe;AAClF,MAAI,CAAC,eAAe;AAClB,SAAK,cAAc;AAAA,EACrB;AACA,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,aAAa,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AAClF,QAAM,cAAc,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AACrF,QAAM,IAAI,CAAC,aAAa;AACxB,QAAM,IAAI,CAAC,cAAc;AACzB,QAAM,EAAE,UAAU,IAAI;AAItB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM;AAAA,IACtC,MAAM,eAAe;AAAA,IACrB,QAAQ,eAAe;AAAA,EACzB,CAAC;AAED,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,gBAAgB,GAAG,UAAU,GAAG,GAAG,YAAY,aAAa,OAAO;AAEzE,QAAMC,QAAO,SAAS,OAAO,MAAM,eAAe,cAAc;AAChE,EAAAA,MAAK,KAAK,SAAS,uBAAuB;AAE1C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,IAAAA,MAAK,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EAChD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,IAAAA,MAAK,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACjD;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,EAAE,KAAK,SAAS,MAAM,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAChH;AAEA,mBAAiB,MAAMA,KAAI;AAE3B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;AAxDsB;;;ACJtB,OAAOC,aAAW;AAKX,IAAM,yBAAyB,wBAAC,GAAW,GAAW,SAAyB;AACpF,SAAO;AAAA,IACL,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;AAAA,IACrB,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC;AAAA,IAC5B,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI;AAAA,IAC5B,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC;AAAA,IACrB;AAAA,EACF,EAAE,KAAK,GAAG;AACZ,GARsC;AAUtC,eAAsB,SAAuC,QAAwB,MAAY;AAC/F,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAE/E,QAAM,IAAI,KAAK,QAAQ,KAAK;AAC5B,QAAM,IAAI,KAAK,SAAS,KAAK;AAC7B,QAAM,IAAI,IAAI;AACd,QAAM,aAAa;AAEnB,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,IACjB,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE;AAAA,IAClB,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,EAAE;AAAA,IAClB,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE;AAAA,EACpB;AAEA,MAAI;AACJ,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,UAAM,WAAW,uBAAuB,GAAG,GAAG,CAAC;AAC/C,UAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,cAAU,SACP,OAAO,MAAM,WAAW,cAAc,EACtC,KAAK,aAAa,aAAa,CAAC,IAAI,IAAI,UAAU,KAAK,IAAI,CAAC,GAAG;AAElE,QAAI,WAAW;AACb,cAAQ,KAAK,SAAS,SAAS;AAAA,IACjC;AAAA,EACF,OAAO;AACL,cAAU,mBAAmB,UAAU,GAAG,GAAG,MAAM;AACnD,YAAQ,KAAK,aAAa,aAAa,CAAC,IAAI,IAAI,UAAU,KAAK,IAAI,CAAC,GAAG;AAAA,EACzE;AAEA,MAAI,YAAY;AACd,YAAQ,KAAK,SAAS,UAAU;AAAA,EAClC;AAEA,mBAAiB,MAAM,OAAO;AAC9B,OAAK,gBAAgB,SAAU,QAAgB,OAAc;AAC3D,UAAMC,KAAI,OAAO;AAGjB,UAAMC,UAAS;AAAA,MACb,EAAE,GAAGD,KAAI,GAAG,GAAG,EAAE;AAAA,MACjB,EAAE,GAAGA,IAAG,GAAG,CAACA,KAAI,EAAE;AAAA,MAClB,EAAE,GAAGA,KAAI,GAAG,GAAG,CAACA,GAAE;AAAA,MAClB,EAAE,GAAG,GAAG,GAAG,CAACA,KAAI,EAAE;AAAA,IACpB;AAGA,UAAM,MAAM,kBAAU,QAAQ,QAAQC,SAAQ,KAAK;AAEnD,WAAO,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,IAAI;AAAA,EAC1C;AAEA,OAAK,YAAY,SAAU,OAAO;AAEhC,WAAO,KAAK,cAAc,MAAgB,KAAK;AAAA,EACjD;AAEA,SAAO;AACT;AAnEsB;;;ACftB,OAAOC,aAAW;AAGlB,eAAsB,oBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAEtF,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,IAAI,MAAM,SAAS,CAAC;AACrE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,IAAI,MAAM,UAAU,CAAC;AAEvE,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,QAAQ,IAAI;AAElB,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,IAAI,OAAO,EAAE;AAAA,IAClB,EAAE,GAAM,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE;AAAA,IACtB,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE;AAAA,IACf,EAAE,GAAG,CAAC,GAAG,EAAE;AAAA,EACb;AAEA,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,QAAM,UAAU,SAAS,OAAO,MAAM,WAAW,cAAc;AAE/D,UAAQ,KAAK,SAAS,uBAAuB;AAE7C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,YAAQ,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACnD;AACA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,YAAQ,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACpD;AAEA,UAAQ,KAAK,aAAa,aAAa,CAAC,QAAQ,CAAC,KAAK;AAEtD,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,QAAQ,IAAI,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,EAAE,KAAK,SAAS,MAAM,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAC5H;AACA,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;AA5DsB;;;ACNtB,SAAS,UAAAC,eAAc;AAMvB,OAAOC,aAAW;AAMlB,eAAsB,cACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,MAAI;AACJ,MAAI,CAAC,KAAK,YAAY;AACpB,cAAU;AAAA,EACZ,OAAO;AACL,cAAU,UAAU,KAAK;AAAA,EAC3B;AAGA,QAAM,WAAW,OAEd,OAAO,GAAG,EACV,KAAK,SAAS,OAAO,EACrB,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AAGnC,QAAM,IAAI,SAAS,OAAO,GAAG;AAE7B,QAAM,QAAQ,SAAS,OAAO,GAAG,EAAE,KAAK,SAAS,OAAO,EAAE,KAAK,SAAS,UAAU;AAElF,QAAM,cAAc,KAAK;AAEzB,QAAM,QAAQ,KAAK;AAEnB,QAAMC,QAAO,MAAM,KAAK,EAAG,YAAY,MAAM,oBAAY,OAAO,KAAK,YAAY,MAAM,IAAI,CAAC;AAC5F,MAAI,OAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AACjC,MAAI,SAASC,WAAU,GAAG,WAAW,UAAU,GAAG;AAChD,UAAMC,OAAMF,MAAK,SAAS,CAAC;AAC3B,UAAMG,MAAKC,QAAOJ,KAAI;AACtB,WAAOE,KAAI,sBAAsB;AACjC,IAAAC,IAAG,KAAK,SAAS,KAAK,KAAK;AAC3B,IAAAA,IAAG,KAAK,UAAU,KAAK,MAAM;AAAA,EAC/B;AACA,MAAI,KAAK,UAAU,WAAW;AAC9B,QAAM,WAAW,eAAe,CAAC;AACjC,QAAM,WAAWH,MAAK,QAAQ;AAC9B,QAAM,QAAQ,MACX,KAAK,EACL;AAAA,IACC,MAAM;AAAA,MACJ,SAAS,OAAO,SAAS,KAAK,OAAO,IAAI;AAAA,MACzC,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGF,QAAM,MAAM,MAAM,SAAS,CAAC;AAC5B,QAAM,KAAKI,QAAO,KAAK;AACvB,SAAO,IAAI,sBAAsB;AACjC,KAAG,KAAK,SAAS,KAAK,KAAK;AAC3B,KAAG,KAAK,UAAU,KAAK,MAAM;AAG7B,QAAM,eAAe,KAAK,WAAW,KAAK;AAC1C,EAAAA,QAAO,KAAK,EAAE;AAAA,IACZ;AAAA,IACA,iBACG,KAAK,QAAQ,SAAS,QAAQ,KAAK,SAAS,QAAQ,KAAK,SAAS,KACnE,QACC,SAAS,SAAS,cAAc,KACjC;AAAA,EACJ;AACA,EAAAA,QAAOJ,KAAI,EAAE;AAAA,IACX;AAAA,IACA,iBACG,KAAK,QAAQ,SAAS,QAAQ,IAAI,EAAE,SAAS,QAAQ,KAAK,SAAS,KACpE;AAAA,EAGJ;AAIA,SAAO,MAAM,KAAK,EAAG,QAAQ;AAG7B,QAAM;AAAA,IACJ;AAAA,IACA,eAAe,CAAC,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,SAAS,IAAI,cAAc,KAAK;AAAA,EACjF;AAEA,QAAM,aAAa,KAAK,SAAS,KAAK,WAAW;AACjD,QAAM,cAAc,KAAK,UAAU,KAAK,WAAW;AACnD,QAAM,IAAI,CAAC,KAAK,QAAQ,IAAI;AAC5B,QAAM,IAAI,CAAC,KAAK,SAAS,IAAI;AAC7B,MAAIK;AACJ,MAAI;AACJ,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,UAAM,YAAY,GAAG;AAAA,MACnB,uBAAuB,GAAG,GAAG,YAAY,aAAa,KAAK,MAAM,CAAC;AAAA,MAClE;AAAA,IACF;AAEA,UAAM,YAAY,GAAG;AAAA,MACnB,CAAC,KAAK,QAAQ,IAAI;AAAA,MAClB,CAAC,KAAK,SAAS,IAAI,cAAc,SAAS,SAAS;AAAA,MACnD,KAAK,QAAQ,IAAI;AAAA,MACjB,CAAC,KAAK,SAAS,IAAI,cAAc,SAAS,SAAS;AAAA,MACnD;AAAA,IACF;AAEA,gBAAY,SAAS,OAAO,MAAM;AAChC,UAAI,MAAM,yBAAyB,SAAS;AAC5C,aAAO;AAAA,IACT,GAAG,cAAc;AACjB,IAAAD,QAAO,SAAS,OAAO,MAAM;AAC3B,UAAI,MAAM,yBAAyB,SAAS;AAC5C,aAAO;AAAA,IACT,GAAG,cAAc;AAAA,EACnB,OAAO;AACL,IAAAA,QAAO,EAAE,OAAO,QAAQ,cAAc;AACtC,gBAAY,EAAE,OAAO,MAAM;AAC3B,IAAAA,MACG,KAAK,SAAS,mBAAmB,EACjC,KAAK,SAAS,UAAU,EACxB,KAAK,KAAK,CAAC,KAAK,QAAQ,IAAI,WAAW,EACvC,KAAK,KAAK,CAAC,KAAK,SAAS,IAAI,WAAW,EACxC,KAAK,SAAS,KAAK,SAAS,KAAK,WAAW,EAAE,EAC9C,KAAK,UAAU,KAAK,UAAU,KAAK,WAAW,EAAE;AAEnD,cACG,KAAK,SAAS,SAAS,EACvB,KAAK,MAAM,CAAC,KAAK,QAAQ,IAAI,WAAW,EACxC,KAAK,MAAM,KAAK,QAAQ,IAAI,WAAW,EACvC,KAAK,MAAM,CAAC,KAAK,SAAS,IAAI,cAAc,SAAS,SAAS,WAAW,EACzE,KAAK,MAAM,CAAC,KAAK,SAAS,IAAI,cAAc,SAAS,SAAS,WAAW;AAAA,EAC9E;AACA,mBAAiB,MAAMA,KAAI;AAE3B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;AAhJsB;;;ACTtB,OAAOE,aAAW;AAiBX,SAASC,mBACd,IACA,IACA,IACA,IACA,IACA,IACA,WACA;AACA,QAAM,YAAY;AAElB,QAAM,QAAQ,KAAK,MAAM;AACzB,QAAM,QAAQ,KAAK,MAAM;AAGzB,QAAM,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;AAGzC,QAAM,MAAM,KAAK,MAAM;AACvB,QAAM,MAAM,KAAK,MAAM;AAGvB,QAAM,eAAe,KAAK;AAC1B,QAAM,eAAe,KAAK;AAG1B,QAAM,WAAW,KAAK,KAAK,gBAAgB,IAAI,gBAAgB,CAAC;AAGhE,MAAI,WAAW,GAAG;AAChB,UAAM,IAAI,MAAM,oEAAoE;AAAA,EACtF;AAGA,QAAM,uBAAuB,KAAK,KAAK,IAAI,YAAY,CAAC;AAGxD,QAAM,UAAU,OAAO,uBAAuB,KAAK,KAAK,IAAI,KAAK,KAAK,YAAY,KAAK;AACvF,QAAM,UAAU,OAAO,uBAAuB,KAAK,KAAK,IAAI,KAAK,KAAK,YAAY,KAAK;AAGvF,QAAM,aAAa,KAAK,OAAO,KAAK,WAAW,KAAK,KAAK,WAAW,EAAE;AACtE,QAAM,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,KAAK,WAAW,EAAE;AAGpE,MAAI,aAAa,WAAW;AAC5B,MAAI,aAAa,aAAa,GAAG;AAC/B,kBAAc,IAAI,KAAK;AAAA,EACzB;AACA,MAAI,CAAC,aAAa,aAAa,GAAG;AAChC,kBAAc,IAAI,KAAK;AAAA,EACzB;AAGA,QAAM,SAAS,CAAC;AAChB,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,UAAM,IAAI,KAAK,YAAY;AAC3B,UAAMC,SAAQ,aAAa,IAAI;AAC/B,UAAM,IAAI,UAAU,KAAK,KAAK,IAAIA,MAAK;AACvC,UAAM,IAAI,UAAU,KAAK,KAAK,IAAIA,MAAK;AACvC,WAAO,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA,EACtB;AAEA,SAAO;AACT;AAhEgB,OAAAD,oBAAA;AAkEhB,eAAsB,YACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAE/E,QAAM,gBAAgB,MAAM,WAAW;AACvC,QAAM,gBAAgB,MAAM,WAAW;AAEvC,QAAM,KAAK,MAAM,QAAQ,MAAM,QAAQ,KAAK,SAAS,gBAAgB;AACrE,QAAM,KAAK,MAAM,SAAS,MAAM,SAAS,KAAK,UAAU,gBAAgB;AACxE,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,KAAKE,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,MAAI,KAAK,QAAQ;AACf,YAAQ,SAAS,KAAK;AAAA,EACxB;AACA,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AACA,QAAM,SAAS;AAAA;AAAA,IAEb,EAAE,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,EAAE;AAAA;AAAA,IAC/B,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,EAAE;AAAA;AAAA,IAE9B,GAAGF,mBAAkB,IAAI,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,QAAQ,QAAQ,IAAI;AAAA;AAAA;AAAA,IAGvF,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,MAAM;AAAA;AAAA,IAC9B,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,MAAM;AAAA;AAAA,IAE7B,GAAGA,mBAAkB,IAAI,GAAG,IAAI,IAAI,OAAO,IAAI,IAAI,OAAO,IAAI,GAAG,QAAQ,QAAQ,IAAI;AAAA;AAAA;AAAA,IAGrF,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,EAAE;AAAA;AAAA,IAC7B,EAAE,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,IAAI,EAAE;AAAA;AAAA,IAE9B,GAAGA,mBAAkB,CAAC,IAAI,IAAI,OAAO,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,OAAO,QAAQ,QAAQ,IAAI;AAAA;AAAA;AAAA,IAGvF,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,MAAM;AAAA;AAAA,IAC9B,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,MAAM;AAAA;AAAA,IAC/B,GAAGA,mBAAkB,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,GAAG,QAAQ,QAAQ,IAAI;AAAA;AAAA,EAC3F;AAEA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,QAAM,UAAU,SAAS,OAAO,MAAM,WAAW,cAAc;AAC/D,UAAQ,KAAK,SAAS,kCAAkC;AAExD,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAzEsB;;;ACnFtB,OAAOG,aAAW;AAIlB,eAAsB,cACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,cAAc,MAAM,WAAW;AACrC,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACzE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAC3E,QAAM,IAAI,CAAC,KAAK,QAAQ,IAAI;AAC5B,QAAM,IAAI,CAAC,KAAK,SAAS,IAAI;AAE7B,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,EAAE;AAAA,IACP,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE;AAAA,IAClB,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IACzB,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IACrB,EAAE,GAAG,IAAI,GAAG,EAAK;AAAA,IACjB,EAAE,GAAG,EAAE;AAAA,IACP,EAAE,GAAG,GAAG,IAAI,EAAE;AAAA,EAChB;AAEA,QAAM,YAAY,GAAG;AAAA,IACnB,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAAA,IAC5B;AAAA,EACF;AAEA,QAAMC,QAAO,SAAS,OAAO,MAAM,WAAW,cAAc;AAE5D,EAAAA,MAAK,KAAK,SAAS,uBAAuB,EAAE,KAAK,SAAS,oBAAoB,SAAS,CAAC;AAExF,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,IAAAA,MAAK,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACjD;AAEA,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,IAAAA,MAAK,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACjD;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,IAAI,IAAI,KAAK,KAAK,WAAW,MAAM,KAAK,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,WAAW,MAAM,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAC1I;AAEA,mBAAiB,MAAMA,KAAI;AAE3B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;AA9DsB;;;ACJtB,OAAOC,aAAW;AAGlB,eAAsB,WAAyC,QAAwB,MAAY;AACjG,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACzE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAC3E,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,IAAI,CAAC,IAAI;AAEf,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,EAAE;AAAA,IACP,EAAE,GAAG,GAAG,IAAI,EAAE;AAAA,IACd,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IACrB,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE;AAAA,EAC3B;AAEA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,QAAM,UAAU,SAAS,OAAO,MAAM,WAAW,cAAc;AAC/D,UAAQ,KAAK,SAAS,uBAAuB;AAE7C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,UAAQ,KAAK,aAAa,gBAAgB,IAAI,CAAC,GAAG;AAClD,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,IAAI,KAAK,KAAK,WAAW,MAAM,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,WAAW,MAAM,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EACvI;AAEA,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAvDsB;;;ACHtB,eAAsBC,YAAyC,QAAwB,MAAY;AACjG,QAAM,UAAU;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,eAAe,KAAK,kBAAkB,MAAM,WAAW,KAAK;AAAA,IAC5D,gBAAgB,MAAM,WAAW,KAAK;AAAA,EACxC;AACA,SAAO,SAAS,QAAQ,MAAM,OAAO;AACvC;AATsB,OAAAA,aAAA;;;ACMtB,OAAOC,aAAW;AAgDlB,eAAsB,QAAsC,QAAwB,MAAY;AAC9F,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAE/E,QAAM,IAAI,KAAK,SAAS,KAAK;AAC7B,QAAM,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK;AAEpC,QAAM,SAAS,IAAI;AACnB,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,CAAC,IAAI,EAAE;AAAA,IAChC,EAAE,GAAG,IAAI,IAAI,QAAQ,GAAG,CAAC,IAAI,EAAE;AAAA,IAC/B,GAAG,qBAAqB,CAAC,IAAI,IAAI,QAAQ,GAAG,QAAQ,IAAI,IAAI,GAAG;AAAA,IAC/D,EAAE,GAAG,IAAI,IAAI,QAAQ,GAAG,IAAI,EAAE;AAAA,IAC9B,GAAG,qBAAqB,IAAI,IAAI,QAAQ,GAAG,QAAQ,IAAI,KAAK,GAAG;AAAA,EACjE;AAEA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,QAAM,UAAU,SAAS,OAAO,MAAM,WAAW,cAAc;AAC/D,UAAQ,KAAK,SAAS,kCAAkC;AAExD,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAjDsB;;;ACtDtB,eAAsB,MAAoC,QAAwB,MAAY;AAC5F,QAAM,UAAU;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,EACX;AACA,SAAO,SAAS,QAAQ,MAAM,OAAO;AACvC;AAPsB;;;ACJtB,OAAOC,aAAW;AAOX,SAAS,SACd,QACA,MACA,EAAE,QAAQ,EAAE,eAAe,EAAE,GAC7B;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,EAAE,WAAW,aAAa,WAAW,IAAI;AAC/C,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,cAAc,EAC5B,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AAGnC,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,YAAY,GAAG,OAAO,GAAG,GAAG,IAAI;AAAA,IACpC,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,CAAC;AACD,QAAM,YAAY,eAAe;AACjC,QAAM,iBAAiB,GAAG,OAAO,GAAG,GAAG,GAAG;AAAA,IACxC,GAAG;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,WAAW;AAAA,EACb,CAAC;AACD,QAAMC,UAAS,SAAS,OAAO,MAAM,WAAW,cAAc;AAC9D,EAAAA,QAAO,OAAO,MAAM,cAAc;AAElC,MAAI,WAAW;AACb,IAAAA,QAAO,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EAClD;AAEA,MAAI,YAAY;AACd,IAAAA,QAAO,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACnD;AAEA,mBAAiB,MAAMA,OAAM;AAE7B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,OAAO,MAAM,GAAG,KAAK;AAAA,EACxC;AAEA,SAAO;AACT;AAtDgB;;;ACPhB,OAAOC,aAAW;AAOX,SAAS,WACd,QACA,MACA,EAAE,QAAQ,EAAE,eAAe,EAAE,GAC7B;AACA,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,cAAc,EAC5B,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AAEnC,MAAIC;AACJ,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,YAAY,GAAG,OAAO,GAAG,GAAG,IAAI,eAAe,SAAS,CAAC;AAC/D,IAAAD,UAAS,SAAS,OAAO,MAAM,SAAS;AAExC,IAAAA,QAAO,KAAK,SAAS,aAAa,EAAE,KAAK,KAAK,CAAC,EAAE,KAAK,SAAS,EAAE,EAAE,KAAK,UAAU,EAAE;AAAA,EACtF,OAAO;AACL,IAAAA,UAAS,SAAS,OAAO,UAAU,cAAc;AAEjD,IAAAA,QAAO,KAAK,SAAS,aAAa,EAAE,KAAK,KAAK,CAAC,EAAE,KAAK,SAAS,EAAE,EAAE,KAAK,UAAU,EAAE;AAAA,EACtF;AAEA,mBAAiB,MAAMA,OAAM;AAE7B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,OAAO,MAAM,GAAG,KAAK;AAAA,EACxC;AAEA,SAAO;AACT;AAjCgB;;;ACHhB,OAAOE,aAAW;AA+BlB,eAAsB,WAAyC,QAAwB,MAAY;AACjG,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAC/E,QAAM,eAAe,MAAM,WAAW,KAAK;AAC3C,QAAM,IAAI,KAAK,QAAQ,KAAK;AAC5B,QAAM,IAAI,KAAK,SAAS,KAAK;AAC7B,QAAM,IAAI,CAAC,KAAK,QAAQ,IAAI;AAC5B,QAAM,IAAI,CAAC,KAAK,SAAS,IAAI;AAE7B,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,IACd,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,IACd,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,IAAI,GAAG,EAAE;AAAA,IACd,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,IACjB,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,EAAE;AAAA,IAClB,EAAE,GAAG,IAAI,GAAG,CAAC,EAAE;AAAA,IACf,EAAE,GAAG,IAAI,GAAG,EAAE;AAAA,EAChB;AAEA,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,UAAM,YAAY,GAAG,UAAU,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,OAAO;AAC3D,UAAM,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,OAAO;AAC1C,UAAM,KAAK,GAAG,KAAK,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO;AAElD,aAAS,OAAO,MAAM,IAAI,cAAc;AACxC,aAAS,OAAO,MAAM,IAAI,cAAc;AACxC,UAAMC,QAAO,SAAS,OAAO,MAAM,WAAW,cAAc;AAC5D,UAAM,EAAE,UAAU,IAAI;AACtB,IAAAA,MAAK,KAAK,SAAS,uBAAuB,EAAE,KAAK,SAAS,oBAAoB,SAAS,CAAC;AACxF,qBAAiB,MAAMA,KAAI;AAAA,EAC7B,OAAO;AACL,UAAM,KAAK,mBAAmB,UAAU,GAAG,GAAG,MAAM;AACpD,QAAI,YAAY;AACd,SAAG,KAAK,SAAS,UAAU;AAAA,IAC7B;AACA,qBAAiB,MAAM,EAAE;AAAA,EAC3B;AAEA,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;AAnDsB;;;AChCtB,OAAOC,aAAW;AAIlB,eAAsB,WAAyC,QAAwB,MAAY;AACjG,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAC/E,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACzE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAC3E,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,QAAM,aAAa;AAAA,IACjB,EAAE,GAAG,IAAI,WAAW,GAAG,EAAE;AAAA,IACzB,EAAE,GAAG,IAAI,IAAI,WAAW,GAAG,EAAE;AAAA,IAC7B,EAAE,GAAG,IAAI,IAAI,WAAW,GAAG,GAAG,IAAI,EAAE;AAAA,IACpC,EAAE,GAAG,IAAI,WAAW,GAAG,GAAG,IAAI,EAAE;AAAA,EAClC;AAEA,QAAM,YAAY;AAAA,IAChB,EAAE,GAAG,IAAI,IAAI,WAAW,GAAG,GAAG,IAAI,EAAE;AAAA,IACpC,EAAE,GAAG,IAAI,IAAI,WAAW,GAAG,GAAG,IAAI,EAAE;AAAA,IACpC,EAAE,GAAG,IAAI,IAAI,WAAW,GAAG,GAAG,IAAI,IAAI,UAAU;AAAA,EAClD;AAEA,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,WAAW,qBAAqB,UAAU;AAChD,QAAM,WAAW,GAAG,KAAK,UAAU,OAAO;AAE1C,QAAM,UAAU,qBAAqB,SAAS;AAC9C,QAAM,UAAU,GAAG,KAAK,SAAS,EAAE,GAAG,SAAS,WAAW,QAAQ,CAAC;AAEnE,QAAMC,cAAa,SAAS,OAAO,MAAM,SAAS,cAAc;AAChE,EAAAA,YAAW,OAAO,MAAM,UAAU,cAAc;AAEhD,EAAAA,YAAW,KAAK,SAAS,uBAAuB;AAEhD,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,IAAAA,YAAW,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACtD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,IAAAA,YAAW,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACvD;AAEA,mBAAiB,MAAMA,WAAU;AAEjC,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,YAAY,KAAK;AAErD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA9DsB;;;ACEtB,OAAOC,aAAW;AAIlB,eAAsB,yBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACzE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAC3E,QAAM,gBAAgB,IAAI;AAC1B,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,QAAM,SAAS,IAAI;AACnB,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,CAAC,IAAI,IAAK,IAAI,IAAK,KAAK,GAAG,SAAS,EAAE;AAAA,IAC3C,GAAG;AAAA,MACD,CAAC,IAAI,IAAK,IAAI,IAAK;AAAA,MACnB,SAAS;AAAA,MACT,IAAI,IAAK,IAAI,IAAK;AAAA,MAClB,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IAEA,EAAE,GAAG,IAAI,IAAK,IAAI,IAAK,KAAK,GAAG,CAAC,SAAS,EAAE;AAAA,IAC3C,EAAE,GAAG,CAAC,IAAI,IAAK,IAAI,IAAK,KAAK,GAAG,CAAC,SAAS,EAAE;AAAA,EAC9C;AAEA,QAAM,IAAI,CAAC,IAAI,IAAK,IAAI,IAAK;AAC7B,QAAM,IAAI,CAAC,SAAS,IAAI,YAAY;AAEpC,QAAM,YAAY;AAAA,IAChB,EAAE,GAAG,IAAI,IAAI,UAAU,IAAI,IAAI,KAAK,IAAI;AAAA,IACxC,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,UAAU;AAAA,IACjC,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,KAAK,IAAI;AAAA,IAC7B,GAAG;AAAA,MACD,IAAI;AAAA,OACH,IAAI,KAAK;AAAA,MACV,IAAI,IAAI;AAAA,OACP,IAAI,KAAK;AAAA,MACV,CAAC,IAAI;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,qBAAqB,MAAM;AACpD,QAAM,mBAAmB,GAAG,KAAK,kBAAkB,OAAO;AAE1D,QAAM,yBAAyB,qBAAqB,SAAS;AAC7D,QAAM,yBAAyB,GAAG,KAAK,wBAAwB;AAAA,IAC7D,GAAG;AAAA,IACH,WAAW;AAAA,EACb,CAAC;AAED,QAAM,eAAe,SAAS,OAAO,MAAM,wBAAwB,cAAc;AACjF,eAAa,OAAO,MAAM,kBAAkB,cAAc;AAE1D,eAAa,KAAK,SAAS,uBAAuB;AAElD,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,iBAAa,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,iBAAa,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,eAAa,KAAK,aAAa,eAAe,CAAC,gBAAgB,CAAC,GAAG;AACnE,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,IAAI,KAAK,KAAK,WAAW,MAAM,KAAK,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,WAAW,KAAK,gBAAgB,KAAK,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EAC1J;AAEA,mBAAiB,MAAM,YAAY;AACnC,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA3FsB;;;ACPtB,eAAsB,KAAmC,QAAwB,MAAY;AAC3F,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAElB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAE/E,QAAM,aAAa,KAAK,IAAI,KAAK,QAAQ,KAAK,SAAS,MAAM,SAAS,CAAC;AACvE,QAAM,cAAc,KAAK,IAAI,KAAK,SAAS,KAAK,SAAS,MAAM,UAAU,CAAC;AAC1E,QAAM,IAAI,CAAC,aAAa;AACxB,QAAM,IAAI,CAAC,cAAc;AAEzB,QAAMC,QAAO,SAAS,OAAO,QAAQ,cAAc;AAEnD,EAAAA,MACG,KAAK,SAAS,MAAM,EACpB,KAAK,SAAS,UAAU,EACxB,KAAK,MAAM,CAAC,EACZ,KAAK,MAAM,CAAC,EACZ,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,SAAS,UAAU,EACxB,KAAK,UAAU,WAAW;AAE7B,mBAAiB,MAAMA,KAAI;AAE3B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;AA9BsB;;;ACHtB,OAAOC,aAAW;AAKX,IAAMC,uBAAsB,wBACjC,GACA,GACA,OACA,QACA,IACA,OACW;AACX,SAAO,IAAI,CAAC,IAAI,CAAC;AAAA,OACZ,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM;AAAA,OAC9B,KAAK,IAAI,CAAC;AAAA,OACV,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM;AAAA,OAC7B,KAAK,IAAI,CAAC,MAAM;AAAA,OAChB,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM;AAAA,OAC7B,CAAC,KAAK,IAAI,CAAC;AAClB,GAfmC;AAiB5B,IAAMC,4BAA2B,wBACtC,GACA,GACA,OACA,QACA,IACA,OACW;AACX,SAAO;AAAA,IACL,IAAI,CAAC,IAAI,CAAC;AAAA,IACV,IAAI,IAAI,KAAK,IAAI,CAAC;AAAA,IAClB,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM;AAAA,IAClC,IAAI,CAAC,KAAK;AAAA,IACV,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM;AAAA,IACjC,IAAI,KAAK;AAAA,EACX,EAAE,KAAK,GAAG;AACZ,GAhBwC;AAiBjC,IAAMC,4BAA2B,wBACtC,GACA,GACA,OACA,QACA,IACA,OACW;AACX,SAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,YAAY,MAAM,EAAE,EAAE,KAAK,GAAG;AACxF,GATwC;AAWxC,eAAsB,eACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,OAAO,YAAY,IAAI,MAAM;AAAA,IACnD;AAAA,IACA;AAAA,IACA,eAAe,IAAI;AAAA,EACrB;AACA,QAAM,eAAe,KAAK,SAAS,QAAQ,cAAc,IAAI;AAC7D,QAAM,IAAI,KAAK,SAAS;AACxB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,MAAM,MAAM,IAAI;AAC3B,QAAM,IAAI,KAAK,QAAQ,KAAK;AAC5B,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAIC;AAEJ,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,gBAAgBH,0BAAyB,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AACjE,UAAM,gBAAgBC,0BAAyB,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AACjE,UAAM,YAAY,GAAG,KAAK,eAAe,kBAAkB,MAAM,CAAC,CAAC,CAAC;AACpE,UAAM,YAAY,GAAG,KAAK,eAAe,kBAAkB,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC;AAClF,IAAAC,YAAW,SAAS,OAAO,MAAM,WAAW,cAAc;AAC1D,IAAAA,YAAW,SAAS,OAAO,MAAM,WAAW,cAAc;AAC1D,IAAAA,UAAS,KAAK,SAAS,uBAAuB;AAC9C,QAAI,WAAW;AACb,MAAAA,UAAS,KAAK,SAAS,SAAS;AAAA,IAClC;AAAA,EACF,OAAO;AACL,UAAM,WAAWH,qBAAoB,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AACvD,IAAAG,YAAW,SACR,OAAO,QAAQ,cAAc,EAC7B,KAAK,KAAK,QAAQ,EAClB,KAAK,SAAS,uBAAuB,EACrC,KAAK,SAAS,oBAAoB,SAAS,CAAC,EAC5C,KAAK,SAAS,UAAU;AAC3B,IAAAA,UAAS,KAAK,SAAS,uBAAuB;AAE9C,QAAI,WAAW;AACb,MAAAA,UAAS,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,IACpD;AAEA,QAAI,YAAY;AACd,MAAAA,UAAS,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,IACrD;AAAA,EACF;AAEA,EAAAA,UAAS,KAAK,kBAAkB,EAAE;AAClC,EAAAA,UAAS,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;AAE5D,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,EAAE,KAAK,QAAQ,KAAK,MAAM,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,EAAE,KAAK,SAAS,MAAM,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EACvH;AAEA,mBAAiB,MAAMA,SAAQ;AAE/B,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,KAAK,MAAM,KAAK;AACtC,UAAM,IAAI,IAAI,KAAK,KAAK,KAAK;AAE7B,QACE,MAAM,MACL,KAAK,IAAI,CAAC,KAAK,KAAK,UAAU,KAAK,KACjC,KAAK,IAAI,CAAC,MAAM,KAAK,UAAU,KAAK,KACnC,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,SAAS,KAAK,IAAI,KAC9D;AACA,UAAI,IAAI,KAAK,MAAM,IAAK,IAAI,KAAM,KAAK;AACvC,UAAI,KAAK,GAAG;AACV,YAAI,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;AAAA,MAC3B;AACA,UAAI,KAAK;AACT,UAAI,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;AAC/B,YAAI,CAAC;AAAA,MACP;AAEA,UAAI,KAAK;AAAA,IACX;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAxFsB;;;ACjDtB,OAAOE,aAAW;AAmBlB,eAAsB,UAAwC,QAAwB,MAAY;AAChG,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAE/E,QAAM,IAAI,KAAK,QAAQ,KAAK;AAC5B,QAAM,IAAI,KAAK,SAAS,KAAK;AAC7B,QAAM,SAAS;AAAA,IACb,EAAE,GAAI,KAAK,IAAK,GAAG,GAAG,EAAE;AAAA,IACxB,EAAE,GAAG,IAAK,IAAI,IAAK,GAAG,GAAG,EAAE;AAAA,IAC3B,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,IACd,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,EAChB;AAEA,MAAI;AACJ,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,UAAM,WAAW,qBAAqB,MAAM;AAC5C,UAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,cAAU,SACP,OAAO,MAAM,WAAW,cAAc,EACtC,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAErD,QAAI,WAAW;AACb,cAAQ,KAAK,SAAS,SAAS;AAAA,IACjC;AAAA,EACF,OAAO;AACL,cAAU,mBAAmB,UAAU,GAAG,GAAG,MAAM;AAAA,EACrD;AAEA,MAAI,YAAY;AACd,YAAQ,KAAK,SAAS,UAAU;AAAA,EAClC;AAEA,OAAK,QAAQ;AACb,OAAK,SAAS;AAEd,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;AAjDsB;;;ACnBtB,OAAOC,aAAW;AAGlB,eAAsB,oBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAC/E,QAAM,WAAW,IACf,YAAY;AACd,QAAM,IAAI,KAAK,IAAI,UAAU,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACnF,QAAM,IAAI,KAAK,IAAI,WAAW,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAEtF,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,SAAS;AAAA,IACb,EAAE,GAAI,CAAC,IAAI,IAAK,KAAK,GAAG,CAAC,IAAI,EAAE;AAAA,IAC/B,EAAE,GAAI,IAAI,IAAK,KAAK,GAAG,CAAC,IAAI,EAAE;AAAA,IAC9B,EAAE,GAAG,IAAI,GAAG,GAAI,CAAC,IAAI,IAAK,IAAI;AAAA,IAC9B,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IACrB,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IACtB,EAAE,GAAG,CAAC,IAAI,GAAG,GAAI,CAAC,IAAI,IAAK,IAAI;AAAA,EACjC;AAEA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,QAAM,UAAU,SAAS,OAAO,MAAM,WAAW,cAAc;AAC/D,UAAQ,KAAK,SAAS,uBAAuB;AAE7C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,mBAAiB,MAAM,OAAO;AAE9B,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AArDsB;;;ACFtB,OAAOC,aAAW;AAMlB,eAAsB,SAAuC,QAAwB,MAAY;AAC/F,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,gBAAgB,SAASC,WAAU,EAAE,WAAW,UAAU;AAEhE,QAAM,IAAI,KAAK,SAAS,KAAK,WAAW;AACxC,QAAM,IAAI,IAAI,KAAK;AAEnB,QAAM,KAAK,IAAI,KAAK;AACpB,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACb,EAAE,GAAG,IAAI,GAAG,EAAE;AAAA,IACd,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC,EAAE;AAAA,EACrB;AAEA,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AACA,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,YAAY,GAAG,KAAK,UAAU,OAAO;AAE3C,QAAM,UAAU,SACb,OAAO,MAAM,WAAW,cAAc,EACtC,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAErD,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,YAAQ,eAAe,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,OAAK,QAAQ;AACb,OAAK,SAAS;AAEd,mBAAiB,MAAM,OAAO;AAE9B,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,IAAI,KAAK,KAAK,UAAU,KAAK,WAAW,MAAM,gBAAgB,IAAI,MAAM,KAAK,KAAK,KAAK,OAAO,IAAI;AAAA,EACnK;AAEA,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,sBAAsB,MAAM,QAAQ,KAAK;AAClD,WAAO,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;AAxDsB;;;ACFtB,OAAOC,aAAW;AAIlB,eAAsB,mBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACzE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAC3E,QAAM,gBAAgB,IAAI;AAC1B,QAAM,SAAS,IAAI;AACnB,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,WAAW;AACjB,QAAM,WAAW,WAAW;AAC5B,QAAM,SAAS,WAAW,IAAI,WAAW,IAAI;AAG7C,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,SAAS,EAAE;AAAA,IACpC,GAAG;AAAA,MACD,CAAC,IAAI,IAAI;AAAA,MACT,SAAS;AAAA,MACT,IAAI,IAAI;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACA,EAAE,GAAG,IAAI,IAAI,QAAQ,GAAG,CAAC,SAAS,EAAE;AAAA,IACpC,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,CAAC,SAAS,EAAE;AAAA,EACvC;AAEA,QAAM,mBAAmB,qBAAqB,MAAM;AACpD,QAAM,mBAAmB,GAAG,KAAK,kBAAkB,OAAO;AAE1D,QAAM,eAAe,SAAS,OAAO,MAAM,kBAAkB,cAAc;AAE3E,eAAa,KAAK,SAAS,uBAAuB;AAElD,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,iBAAa,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACxD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,iBAAa,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACzD;AAEA,eAAa,KAAK,aAAa,eAAe,CAAC,gBAAgB,CAAC,GAAG;AACnE,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,CAAC,IAAI,KAAK,KAAK,WAAW,MAAM,KAAK,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,WAAW,KAAK,iBAAiB,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EACtJ;AAEA,mBAAiB,MAAM,YAAY;AACnC,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AArEsB;;;ACHtB,OAAOC,aAAW;AAGlB,eAAsB,cACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AAE/E,QAAM,WAAW;AACjB,QAAM,YAAY;AAElB,QAAM,YAAY,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACjF,QAAM,aAAa,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAEpF,QAAM,cAAc,YAAY;AAEhC,MAAI,IAAI;AACR,MAAI,IAAI;AAER,MAAI,IAAI,IAAI,aAAa;AACvB,QAAI,IAAI;AAAA,EACV,OAAO;AACL,QAAI,IAAI;AAAA,EACV;AAEA,MAAI,KAAK,IAAI,GAAG,QAAQ;AACxB,MAAI,KAAK,IAAI,GAAG,SAAS;AAEzB,QAAM,gBAAgB,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC;AAC7C,QAAM,SAAS,IAAI,gBAAgB;AACnC,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,SAAS;AAAA,IACb,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,SAAS,EAAE;AAAA,IAC3B,GAAG,2BAA2B,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,CAAC;AAAA,IACrF,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE;AAAA,IAC3B,GAAG,2BAA2B,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,CAAC,SAAS,GAAG,eAAe,EAAE;AAAA,EAC1F;AAEA,QAAM,eAAe,qBAAqB,MAAM;AAChD,QAAM,eAAe,GAAG,KAAK,cAAc,OAAO;AAElD,QAAM,WAAW,SAAS,OAAO,MAAM,cAAc,cAAc;AAEnE,WAAS,KAAK,SAAS,uBAAuB;AAE9C,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,aAAS,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACpD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,aAAS,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACrD;AAEA,mBAAiB,MAAM,QAAQ;AAC/B,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,QAAQ,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAtEsB;;;ACVtB,OAAOC,aAAW;AAIlB,eAAsB,WAAyC,QAAwB,MAAY;AACjG,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,eAAe,IAAI,CAAC;AACtF,QAAM,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,KAAK,GAAG,MAAM,SAAS,CAAC;AACzE,QAAM,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,GAAG,MAAM,UAAU,CAAC;AAC3E,QAAM,aAAa;AACnB,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,QAAM,kBAAkB;AAAA,IACtB,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,WAAW;AAAA,IACvC,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,EAAE;AAAA,IAC9B,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IACrB,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,WAAW;AAAA,EAChC;AAEA,QAAM,OAAO,IAAI,IAAI,UAAU,IAAI,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,UAAU,IAAI,IAAI,CAAC,KAAK,IAAI,UAAU,IAAI,IAAI,UAAU;AAAA,mBAChJ,IAAI,UAAU,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC;AAAA,mBAClC,CAAC,IAAI,IAAI,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC;AAEnD,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,KAAK,GAAG,KAAK,MAAM,OAAO;AAEhC,QAAMC,cAAa,SAAS,OAAO,MAAM,IAAI,cAAc;AAC3D,EAAAA,YAAW,KAAK,aAAa,aAAa,aAAa,CAAC,KAAK,aAAa,CAAC,GAAG;AAE9E,EAAAA,YAAW,KAAK,SAAS,uBAAuB;AAEhD,MAAI,aAAa,KAAK,SAAS,aAAa;AAC1C,IAAAA,YAAW,UAAU,MAAM,EAAE,KAAK,SAAS,SAAS;AAAA,EACtD;AAEA,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,IAAAA,YAAW,UAAU,MAAM,EAAE,KAAK,SAAS,UAAU;AAAA,EACvD;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,EAAE,KAAK,QAAQ,KAAK,aAAa,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG,KAAK,EAAE,KAAK,SAAS,KAAK,aAAa,KAAK,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,EACpJ;AAEA,mBAAiB,MAAMA,WAAU;AAEjC,OAAK,YAAY,SAAU,OAAO;AAChC,UAAM,MAAM,kBAAU,QAAQ,MAAM,iBAAiB,KAAK;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA3DsB;;;ACHtB,OAAOC,aAAW;AAMlB,SAAS,UAAAC,eAAc;AAKvB,eAAsB,MAAoC,QAAwB,MAAY;AAE5F,QAAM,aAAa;AACnB,MAAI,WAAW,OAAO;AACpB,SAAK,QAAQ,WAAW;AAAA,EAC1B;AAIA,MAAI,KAAK,SAAS,aAAa;AAC7B,UAAM,EAAE,gBAAAC,gBAAe,IAAI,UAAU;AACrC,UAAM,EAAE,WAAW,IAAIA;AACvB,UAAM,iBAAiB;AAAA,MACrB,GAAG;AAAA,MACH,IAAI,KAAK,KAAK;AAAA,MACd,MAAM;AAAA,MACN,WAAW,CAAC,gBAAgB,SAAS,UAAU,EAAE;AAAA,IACnD;AACA,UAAM,MAAM,QAAQ,cAAc;AAAA,EACpC;AAEA,QAAM,SAAS,UAAU;AACzB,OAAK,gBAAgB,OAAO;AAC5B,MAAI,UAAU,OAAO,IAAI,kBAAkB;AAC3C,MAAI,eAAe,OAAO,IAAI,iBAAiB;AAE/C,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AAGtD,MAAI,WAAW,WAAW,WAAW,KAAK,KAAK,OAAO;AACpD,UAAMC,WAAU;AAAA,MACd,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,eAAe;AAAA,MACf,eAAe,UAAU;AAAA,MACzB,SAAS;AAAA,IACX;AAEA,QACE,mBAAmB,KAAK,OAAO,MAAM,IAAIA,SAAQ,gBAAgB,IACjE,OAAO,GAAI,gBACX;AACA,WAAK,QAAQ,OAAO,GAAI;AAAA,IAC1B;AACA,UAAMC,YAAW,MAAM,SAAS,QAAQ,MAAMD,QAAO;AAGrD,QAAI,CAAC,SAAS,OAAO,UAAU,GAAG;AAChC,YAAM,cAAcC,UAAS,OAAO,MAAM;AAC1C,YAAM,OAAQ,YAAY,KAAK,GAAsB,QAAQ;AAC7D,kBAAY,KAAK,aAAa,aAAa,CAAC,KAAK,QAAQ,CAAC,MAAM;AAAA,IAClE;AACA,WAAOA;AAAA,EACT;AAEA,MAAI,CAAC,OAAO,YAAY;AACtB,eAAW;AACX,oBAAgB;AAAA,EAClB;AAEA,MAAI,aAAa,eAAe,IAAI;AACpC,MAAI,CAAC,YAAY;AACf,iBAAa;AAAA,EACf;AAEA,QAAM,WAAW,OAEd,OAAO,GAAG,EACV,KAAK,SAAS,UAAU,EACxB,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AAEnC,QAAM,WAAW,MAAM,QAAQ,UAAU,KAAK,SAAS,IAAI,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,WAAW;AAC9F,WAAS,UAAU;AACnB,MAAI,UAAU;AACd,QAAM,WAAW,CAAC;AAClB,QAAM,OAAO,CAAC;AACd,MAAI,eAAe;AACnB,MAAI,eAAe;AACnB,MAAI,eAAe;AACnB,MAAI,kBAAkB;AACtB,MAAI,cAAc;AAClB,MAAI,iBAAiB;AACrB,aAAW,aAAa,WAAW,YAAY;AAC7C,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,gBAAgB;AAAA,MACjB;AAAA,IACF;AACA,mBAAe,KAAK,IAAI,cAAc,SAAS,QAAQ,OAAO;AAC9D,UAAMC,YAAW,MAAM;AAAA,MACrB;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,gBAAgB;AAAA,MACjB;AAAA,IACF;AACA,mBAAe,KAAK,IAAI,cAAcA,UAAS,QAAQ,OAAO;AAC9D,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,UAAU,KAAK,KAAK;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,gBAAgB;AAAA,MACjB;AAAA,IACF;AACA,mBAAe,KAAK,IAAI,cAAc,SAAS,QAAQ,OAAO;AAC9D,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,mBAAmB;AAAA,MACpB;AAAA,IACF;AACA,sBAAkB,KAAK,IAAI,iBAAiB,YAAY,QAAQ,OAAO;AAEvE,UAAM,YACJ,KAAK,IAAI,SAAS,QAAQA,UAAS,QAAQ,SAAS,QAAQ,YAAY,MAAM,IAC9E;AACF,SAAK,KAAK,EAAE,SAAS,UAAU,CAAC;AAChC,eAAW;AAAA,EACb;AACA,MAAI,qBAAqB;AAEzB,MAAI,gBAAgB,SAAS;AAC3B,kBAAc;AACd,mBAAe;AACf;AAAA,EACF;AACA,MAAI,mBAAmB,SAAS;AAC9B,qBAAiB;AACjB,sBAAkB;AAClB;AAAA,EACF;AAEA,QAAM,YAAY,SAAS,KAAK,EAAG,QAAQ;AAE3C,MACE,SAAS,QAAQ,UAAU,KAAK,eAAe,eAAe,eAAe,mBAC7E,GACA;AACA,UAAM,aACJ,SAAS,QAAQ,UAAU,KAAK,eAAe,eAAe,eAAe;AAC/E,oBAAgB,aAAa;AAC7B,oBAAgB,aAAa;AAC7B,QAAI,eAAe,GAAG;AACpB,sBAAgB,aAAa;AAAA,IAC/B;AACA,QAAI,kBAAkB,GAAG;AACvB,yBAAmB,aAAa;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,WAAW,eAAe,eAAe,eAAe;AAG9D,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,MAAI,uBAAuB;AAC3B,MAAI,KAAK,SAAS,GAAG;AACnB,2BAAuB,KAAK,OAAO,CAAC,KAAK,QAAQ,OAAO,KAAK,aAAa,IAAI,CAAC;AAAA,EACjF;AACA,QAAM,IAAI,KAAK,IAAI,UAAU,QAAQ,UAAU,GAAG,MAAM,SAAS,GAAG,QAAQ;AAC5E,QAAM,IAAI,KAAK,KAAK,wBAAwB,KAAK,SAAS,QAAQ,MAAM,UAAU,CAAC;AACnF,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,IAAI,CAAC,IAAI;AAGf,WAAS,UAAU,qBAAqB,EAAE,KAAK,CAAC,GAAQ,GAAW,UAAe;AAChF,UAAMC,QAAOC,QAAqB,MAAM,CAAC,CAAC;AAC1C,UAAM,YAAYD,MAAK,KAAK,WAAW;AACvC,QAAI,aAAa;AACjB,QAAI,aAAa;AAEjB,QAAI,WAAW;AACb,YAAM,QAAQ,OAAO,8BAA8B;AACnD,YAAM,YAAY,MAAM,KAAK,SAAS;AACtC,UAAI,WAAW;AACb,qBAAa,WAAW,UAAU,CAAC,CAAC;AACpC,qBAAa,WAAW,UAAU,CAAC,CAAC;AACpC,YAAIA,MAAK,KAAK,OAAO,EAAE,SAAS,gBAAgB,GAAG;AACjD,wBAAc;AAAA,QAChB,WAAWA,MAAK,KAAK,OAAO,EAAE,SAAS,gBAAgB,GAAG;AACxD,wBAAc,eAAe;AAAA,QAC/B,WAAWA,MAAK,KAAK,OAAO,EAAE,SAAS,mBAAmB,GAAG;AAC3D,wBAAc,eAAe,eAAe;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAEA,IAAAA,MAAK;AAAA,MACH;AAAA,MACA,aAAa,IAAI,UAAU,IAAI,UAAU,KAAK,aAAa,IAAI,SAAS,SAAS,eAAe,CAAC;AAAA,IACnG;AAAA,EACF,CAAC;AAED,WACG,OAAO,OAAO,EACd,KAAK,aAAa,eAAe,CAAC,SAAS,QAAQ,IAAI,QAAQ,IAAI,eAAe,KAAK,GAAG;AAG7F,QAAM,YAAY,GAAG,UAAU,GAAG,GAAG,GAAG,GAAG,OAAO;AAClD,QAAME,QAAO,SAAS,OAAO,MAAM,WAAW,cAAc,EAAE,KAAK,SAAS,UAAW,KAAK,EAAE,CAAC;AAE/F,QAAM,EAAE,eAAe,IAAI,UAAU;AACrC,QAAM,EAAE,SAAS,QAAQ,WAAW,IAAI;AAExC,WAAS,KAAK,CAAC;AAEf,aAAW,CAAC,GAAG,GAAG,KAAK,KAAK,QAAQ,GAAG;AACrC,UAAM,kBAAkB,IAAI;AAC5B,UAAM,SAAS,kBAAkB,MAAM,KAAK,IAAI,YAAY;AAC5D,UAAMC,aAAY,GAAG,UAAU,GAAG,SAAS,SAAS,IAAI,KAAK,SAAS,GAAG,KAAK,WAAW;AAAA,MACvF,GAAG;AAAA,MACH,MAAM,SAAS,UAAU;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AACD,aACG,OAAO,MAAMA,YAAW,SAAS,EACjC,KAAK,SAAS,UAAW,KAAK,EAAE,CAAC,EACjC,KAAK,SAAS,YAAY,SAAS,SAAS,KAAK,EAAE;AAAA,EACxD;AAIA,MAAI,YAAY,GAAG,KAAK,GAAG,SAAS,SAAS,GAAG,IAAI,GAAG,SAAS,SAAS,GAAG,OAAO;AACnF,WAAS,OAAO,MAAM,SAAS,EAAE,KAAK,SAAS,SAAS;AAExD,cAAY,GAAG,KAAK,eAAe,GAAG,SAAS,SAAS,GAAG,eAAe,GAAG,IAAI,GAAG,OAAO;AAC3F,WAAS,OAAO,MAAM,SAAS,EAAE,KAAK,SAAS,SAAS;AAExD,MAAI,aAAa;AACf,gBAAY,GAAG;AAAA,MACb,eAAe,eAAe;AAAA,MAC9B,SAAS,SAAS;AAAA,MAClB,eAAe,eAAe;AAAA,MAC9B,IAAI;AAAA,MACJ;AAAA,IACF;AACA,aAAS,OAAO,MAAM,SAAS,EAAE,KAAK,SAAS,SAAS;AAAA,EAC1D;AAEA,MAAI,gBAAgB;AAClB,gBAAY,GAAG;AAAA,MACb,eAAe,eAAe,eAAe;AAAA,MAC7C,SAAS,SAAS;AAAA,MAClB,eAAe,eAAe,eAAe;AAAA,MAC7C,IAAI;AAAA,MACJ;AAAA,IACF;AACA,aAAS,OAAO,MAAM,SAAS,EAAE,KAAK,SAAS,SAAS;AAAA,EAC1D;AAGA,aAAWC,YAAW,UAAU;AAC9B,gBAAY,GAAG;AAAA,MACb;AAAA,MACA,SAAS,SAAS,IAAIA;AAAA,MACtB,IAAI;AAAA,MACJ,SAAS,SAAS,IAAIA;AAAA,MACtB;AAAA,IACF;AACA,aAAS,OAAO,MAAM,SAAS,EAAE,KAAK,SAAS,SAAS;AAAA,EAC1D;AAEA,mBAAiB,MAAMF,KAAI;AAE3B,MAAI,cAAc,KAAK,SAAS,aAAa;AAC3C,UAAM,WAAW,WAAW,MAAM,GAAG;AACrC,UAAM,eAAe,UACjB,OAAO,CAAC,MAAM;AACd,aAAO,EAAE,SAAS,QAAQ;AAAA,IAC5B,CAAC,GACC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAClB,KAAK,IAAI;AACZ,aAAS,UAAU,MAAM,EAAE,KAAK,SAAS,gBAAgB,EAAE;AAC3D,aAAS,UAAU,qBAAqB,EAAE,KAAK,SAAS,UAAU;AAAA,EACpE;AAEA,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AACA,SAAO;AACT;AA1SsB;AA6StB,eAAe,QACb,UACA,WACA,QACA,aAAa,GACb,aAAa,GACb,UAAoB,CAAC,GACrB,QAAQ,IACR;AACA,QAAM,QAAQ,SACX,OAAO,GAAG,EACV,KAAK,SAAS,SAAS,QAAQ,KAAK,GAAG,CAAC,EAAE,EAC1C,KAAK,aAAa,aAAa,UAAU,KAAK,UAAU,GAAG,EAC3D,KAAK,SAAS,KAAK;AAGtB,MAAI,cAAc,kBAAkB,SAAS,GAAG;AAC9C,gBAAY,kBAAkB,SAAS;AAEvC,gBAAY,UAAU,WAAW,KAAK,MAAM,EAAE,WAAW,KAAK,MAAM;AAAA,EACtE;AAEA,QAAMF,QAAO,MAAM,KAAK,EAAG;AAAA,IACzB,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO,mBAAmB,WAAW,MAAM,IAAI;AAAA,QAC/C;AAAA,QACA,eAAe,OAAO;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,MAAM,KAAK,UAAU,SAAS,MAAM,GAAG;AAC5D,QAAI,QAAQA,MAAK,SAAS,CAAC;AAC3B,UAAM,cAAc,MAAM,YAAY,WAAW,QAAQ,GAAG,EAAE,WAAW,QAAQ,GAAG;AACpF,WAAO,MAAM,WAAW,CAAC,GAAG;AAC1B,cAAQ,MAAM,WAAW,CAAC;AAE1B,YAAM,cAAc,MAAM,YAAY,WAAW,QAAQ,GAAG,EAAE,WAAW,QAAQ,GAAG;AAAA,IACtF;AAAA,EACF;AAEA,MAAI,OAAOA,MAAK,QAAQ;AACxB,MAAI,SAAS,OAAO,UAAU,GAAG;AAC/B,UAAM,MAAMA,MAAK,SAAS,CAAC;AAC3B,QAAI,MAAM,YAAY;AACtB,UAAM,KAAKC,QAAOD,KAAI;AACtB,WAAO,IAAI,sBAAsB;AACjC,OAAG,KAAK,SAAS,KAAK,KAAK;AAC3B,OAAG,KAAK,UAAU,KAAK,MAAM;AAAA,EAC/B;AAEA,SAAO;AACT;AAxDe;;;AC1Tf,SAAS,UAAAK,eAAc;AAGvB,OAAOC,aAAW;;;ACLlB,SAAS,UAAAC,eAAc;AAavB,eAAsB,WACpB,QACA,MACA,QACA,eACA,MAAM,OAAO,MAAO,WAAW,IAC/B;AACA,QAAM,eAAe,CAAC,gBAAgB,IAAI;AAC1C,QAAM,WAAW,OAEd,OAAO,GAAG,EACV,KAAK,SAAS,eAAe,IAAI,CAAC,EAClC,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AAEnC,MAAI,kBAAkB;AACtB,MAAI,aAAa;AACjB,MAAI,eAAe;AACnB,MAAI,eAAe;AAEnB,MAAI,wBAAwB;AAC5B,MAAI,mBAAmB;AACvB,MAAI,qBAAqB;AAEzB,oBAAkB,SAAS,OAAO,GAAG,EAAE,KAAK,SAAS,uBAAuB;AAC5E,MAAI,KAAK,YAAY,SAAS,GAAG;AAC/B,UAAM,aAAa,KAAK,YAAY,CAAC;AACrC,UAAMC,SAAQ,iBAAiB,EAAE,MAAM,OAAI,UAAU,OAAI,GAA6B,CAAC;AAEvF,UAAM,sBAAsB,gBAAgB,KAAK,EAAG,QAAQ;AAC5D,4BAAwB,oBAAoB;AAAA,EAC9C;AAEA,eAAa,SAAS,OAAO,GAAG,EAAE,KAAK,SAAS,kBAAkB;AAClE,QAAMA,SAAQ,YAAY,MAAM,GAAG,CAAC,qBAAqB,CAAC;AAC1D,QAAM,iBAAiB,WAAW,KAAK,EAAG,QAAQ;AAClD,qBAAmB,eAAe;AAElC,iBAAe,SAAS,OAAO,GAAG,EAAE,KAAK,SAAS,oBAAoB;AACtE,MAAI,UAAU;AACd,aAAW,UAAU,KAAK,SAAS;AACjC,UAAM,SAAS,MAAMA,SAAQ,cAAc,QAAQ,SAAS,CAAC,OAAO,gBAAgB,CAAC,CAAC;AACtF,eAAW,SAAS;AAAA,EACtB;AACA,uBAAqB,aAAa,KAAK,EAAG,QAAQ,EAAE;AACpD,MAAI,sBAAsB,GAAG;AAC3B,yBAAqB,MAAM;AAAA,EAC7B;AAEA,iBAAe,SAAS,OAAO,GAAG,EAAE,KAAK,SAAS,oBAAoB;AACtE,MAAI,iBAAiB;AACrB,aAAW,UAAU,KAAK,SAAS;AACjC,UAAM,SAAS,MAAMA,SAAQ,cAAc,QAAQ,gBAAgB,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC7F,sBAAkB,SAAS;AAAA,EAC7B;AAEA,MAAI,OAAO,SAAS,KAAK,EAAG,QAAQ;AAGpC,MAAI,oBAAoB,MAAM;AAC5B,UAAM,sBAAsB,gBAAgB,KAAK,EAAG,QAAQ;AAC5D,oBAAgB,KAAK,aAAa,aAAa,CAAC,oBAAoB,QAAQ,CAAC,GAAG;AAAA,EAClF;AAGA,aAAW,KAAK,aAAa,aAAa,CAAC,eAAe,QAAQ,CAAC,KAAK,qBAAqB,GAAG;AAEhG,SAAO,SAAS,KAAK,EAAG,QAAQ;AAEhC,eAAa;AAAA,IACX;AAAA,IACA,aAAa,CAAC,KAAK,wBAAwB,mBAAmB,MAAM,CAAC;AAAA,EACvE;AACA,SAAO,SAAS,KAAK,EAAG,QAAQ;AAChC,eAAa;AAAA,IACX;AAAA,IACA,aAAa,CAAC,KAAK,wBAAwB,oBAAoB,qBAAqB,qBAAqB,MAAM,IAAI,MAAM,EAAE;AAAA,EAC7H;AAEA,SAAO,SAAS,KAAK,EAAG,QAAQ;AAEhC,SAAO,EAAE,UAAU,KAAK;AAC1B;AAjFsB;AAoFtB,eAAeA,SACb,aACA,MACA,SACA,SAAmB,CAAC,GACpB;AACA,QAAM,SAAS,YAAY,OAAO,GAAG,EAAE,KAAK,SAAS,OAAO,EAAE,KAAK,SAAS,OAAO,KAAK,IAAI,CAAC;AAC7F,QAAM,SAAS,UAAU;AACzB,MAAI,gBACF,mBAAmB,OAAO,KAAK,gBAAiB,SAAS,OAAO,UAAU,KAAK;AAEjF,MAAI,cAAc;AAElB,MAAI,UAAU,MAAM;AAClB,kBAAc,KAAK;AAAA,EACrB,OAAO;AACL,kBAAc,KAAK;AAAA,EACrB;AAIA,MAAI,CAAC,iBAAiB,YAAY,WAAW,IAAI,GAAG;AAClD,kBAAc,YAAY,UAAU,CAAC;AAAA,EACvC;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,oBAAgB;AAAA,EAClB;AAEA,QAAMC,QAAO,MAAM;AAAA,IACjB;AAAA,IACAC,cAAa,eAAe,WAAW,CAAC;AAAA,IACxC;AAAA,MACE,OAAO,mBAAmB,aAAa,MAAM,IAAI;AAAA;AAAA,MACjD,SAAS;AAAA,MACT;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACA,MAAI;AACJ,MAAI,gBAAgB;AAEpB,MAAI,CAAC,eAAe;AAElB,QAAI,OAAO,SAAS,qBAAqB,GAAG;AAC1C,MAAAC,QAAOF,KAAI,EAAE,UAAU,OAAO,EAAE,KAAK,eAAe,EAAE;AAAA,IACxD;AAEA,oBAAgBA,MAAK,SAAS;AAE9B,UAAM,YAAYA,MAAK,SAAS,CAAC;AACjC,QAAIA,MAAK,gBAAgB,MAAMA,MAAK,YAAY,SAAS,KAAK,GAAG;AAC/D,gBAAU,cACR,YAAY,CAAC,IACb,YAAY,UAAU,CAAC,EAAE,WAAW,QAAQ,GAAG,EAAE,WAAW,QAAQ,GAAG,EAAE,KAAK;AAGhF,YAAM,gBAAgB,YAAY,CAAC,MAAM;AACzC,UAAI,eAAe;AACjB,kBAAU,cAAc,UAAU,YAAY,CAAC,IAAI,MAAM,UAAU,YAAY,UAAU,CAAC;AAAA,MAC5F;AAAA,IACF;AAGA,QAAI,UAAU,gBAAgB,aAAa;AACzC,gBAAU,cAAc;AAAA,IAC1B;AAGA,WAAOA,MAAK,QAAQ;AAAA,EACtB,OAAO;AACL,UAAM,MAAMA,MAAK,SAAS,CAAC;AAC3B,UAAM,KAAKE,QAAOF,KAAI;AAEtB,oBAAgB,IAAI,UAAU,MAAM,MAAM,EAAE;AAE5C,QAAI,IAAI,UAAU,SAAS,SAAS,GAAG;AACrC,uBAAiB,IAAI,UAAU,MAAM,QAAQ,EAAE,SAAS;AAAA,IAC1D;AAGA,UAAM,SAAS,IAAI,qBAAqB,KAAK;AAC7C,QAAI,QAAQ;AACV,YAAM,YAAY,YAAY,QAAQ,eAAe,EAAE,EAAE,KAAK,MAAM;AACpE,YAAM,QAAQ;AAAA,QACZ,CAAC,GAAG,MAAM,EAAE;AAAA,UACV,CAAC,QACC,IAAI,QAAQ,CAAC,QAAQ;AACnB,qBAAS,aAAa;AACpB,kBAAI,MAAM,UAAU;AACpB,kBAAI,MAAM,gBAAgB;AAE1B,kBAAI,WAAW;AAEb,sBAAM,eACJ,OAAO,UAAU,SAAS,KAAK,OAAO,iBAAiB,SAAS,IAAI,EAAE;AACxE,sBAAM,kBAAkB;AACxB,sBAAM,QAAQ,SAAS,cAAc,EAAE,IAAI,kBAAkB;AAC7D,oBAAI,MAAM,WAAW;AACrB,oBAAI,MAAM,WAAW;AAAA,cACvB,OAAO;AACL,oBAAI,MAAM,QAAQ;AAAA,cACpB;AACA,kBAAI,GAAG;AAAA,YACT;AAhBS;AAiBT,uBAAW,MAAM;AACf,kBAAI,IAAI,UAAU;AAChB,2BAAW;AAAA,cACb;AAAA,YACF,CAAC;AACD,gBAAI,iBAAiB,SAAS,UAAU;AACxC,gBAAI,iBAAiB,QAAQ,UAAU;AAAA,UACzC,CAAC;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAEA,WAAO,IAAI,sBAAsB;AACjC,OAAG,KAAK,SAAS,KAAK,KAAK;AAC3B,OAAG,KAAK,UAAU,KAAK,MAAM;AAAA,EAC/B;AAGA,SAAO,KAAK,aAAa,kBAAkB,CAAC,KAAK,UAAU,IAAI,iBAAiB,WAAW,GAAG;AAC9F,SAAO,KAAK;AACd;AA7He,OAAAD,UAAA;;;ADrFf,eAAsB,SAAuC,QAAwB,MAAY;AAC/F,QAAM,SAASI,WAAU;AACzB,QAAM,UAAU,OAAO,MAAO,WAAW;AACzC,QAAM,MAAM;AACZ,QAAM,gBAAgB,KAAK,iBAAiB,SAAS,OAAO,UAAU,KAAK;AAE3E,QAAM,YAAY;AAClB,YAAU,cAAc,UAAU,eAAe,CAAC;AAClD,YAAU,UAAU,UAAU,WAAW,CAAC;AAC1C,YAAU,UAAU,UAAU,WAAW,CAAC;AAE1C,QAAM,EAAE,UAAU,KAAK,IAAI,MAAM,WAAW,QAAQ,MAAM,QAAQ,eAAe,GAAG;AAEpF,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAElB,OAAK,YAAY,UAAU,UAAU;AAErC,QAAM,SAAS,UAAU,QAAQ,KAAK,GAAG,KAAK,cAAc;AAE5D,MAAI,CAAC,KAAK,WAAW;AACnB,SAAK,YAAY,OAAO,WAAW,cAAc,EAAE,EAAE,MAAM,GAAG;AAAA,EAChE;AAEA,QAAM,iBACJ,UAAU,QAAQ,WAAW,KAC7B,UAAU,QAAQ,WAAW,KAC7B,CAAC,OAAO,OAAO;AAIjB,QAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,IAAI,KAAK;AACf,MAAI,IAAI,KAAK;AACb,MAAI,UAAU,QAAQ,WAAW,KAAK,UAAU,QAAQ,WAAW,GAAG;AACpE,SAAK;AAAA,EACP,WAAW,UAAU,QAAQ,SAAS,KAAK,UAAU,QAAQ,WAAW,GAAG;AACzE,SAAK,MAAM;AAAA,EACb;AACA,QAAM,IAAI,CAAC,IAAI;AACf,QAAM,IAAI,CAAC,IAAI;AAGf,QAAM,YAAY,GAAG;AAAA,IACnB,IAAI;AAAA,IACJ,IACE,WACC,iBACG,UACA,UAAU,QAAQ,WAAW,KAAK,UAAU,QAAQ,WAAW,IAC7D,CAAC,UAAU,IACX;AAAA,IACR,IAAI,IAAI;AAAA,IACR,IACE,IAAI,WACH,iBACG,UAAU,IACV,UAAU,QAAQ,WAAW,KAAK,UAAU,QAAQ,WAAW,IAC7D,CAAC,UACD;AAAA,IACR;AAAA,EACF;AAEA,QAAMC,QAAO,SAAS,OAAO,MAAM,WAAW,cAAc;AAC5D,EAAAA,MAAK,KAAK,SAAS,uBAAuB;AAC1C,QAAM,WAAWA,MAAK,KAAK,EAAG,QAAQ;AAItC,WAAS,UAAU,OAAO,EAAE,KAAK,CAAC,GAAQ,GAAW,UAAe;AAClE,UAAMC,QAAOC,QAAqB,MAAM,CAAC,CAAC;AAE1C,UAAM,YAAYD,MAAK,KAAK,WAAW;AAEvC,QAAI,aAAa;AAEjB,QAAI,WAAW;AACb,YAAM,QAAQ,OAAO,8BAA8B;AACnD,YAAM,YAAY,MAAM,KAAK,SAAS;AACtC,UAAI,WAAW;AACb,qBAAa,WAAW,UAAU,CAAC,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,QAAI,gBACF,aACA,IACA,WACC,iBACG,UACA,UAAU,QAAQ,WAAW,KAAK,UAAU,QAAQ,WAAW,IAC7D,CAAC,UAAU,IACX;AACR,QAAI,CAAC,eAAe;AAGlB,uBAAiB;AAAA,IACnB;AACA,QAAI,gBAAgB;AACpB,QACEA,MAAK,KAAK,OAAO,EAAE,SAAS,aAAa,KACzCA,MAAK,KAAK,OAAO,EAAE,SAAS,kBAAkB,GAC9C;AACA,sBAAgB,CAACA,MAAK,KAAK,GAAG,QAAQ,EAAE,QAAQ,KAAK;AACrD,eAAS,UAAU,MAAM,EAAE,KAAK,SAAUE,IAAQC,IAAWC,QAAY;AACvE,YAAI,OAAO,iBAAiBA,OAAMD,EAAC,CAAC,EAAE,eAAe,UAAU;AAC7D,0BAAgB;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,IAAAH,MAAK,KAAK,aAAa,aAAa,aAAa,KAAK,aAAa,GAAG;AAAA,EACxE,CAAC;AAGD,QAAM,wBACH,SAAS,OAAO,mBAAmB,EAAE,KAAK,EAAyB,QAAQ,EAAE,UAC3E,iBAAiB,UAAU,IAAI,MAAM;AAC1C,QAAM,mBACH,SAAS,OAAO,cAAc,EAAE,KAAK,EAAyB,QAAQ,EAAE,UACtE,iBAAiB,UAAU,IAAI,MAAM;AAC1C,QAAM,qBACH,SAAS,OAAO,gBAAgB,EAAE,KAAK,EAAyB,QAAQ,EAAE,UACxE,iBAAiB,UAAU,IAAI,MAAM;AAE1C,MAAI,UAAU,QAAQ,SAAS,KAAK,UAAU,QAAQ,SAAS,KAAK,gBAAgB;AAClF,UAAM,YAAY,GAAG;AAAA,MACnB,SAAS;AAAA,MACT,wBAAwB,mBAAmB,IAAI;AAAA,MAC/C,SAAS,IAAI,SAAS;AAAA,MACtB,wBAAwB,mBAAmB,IAAI;AAAA,MAC/C;AAAA,IACF;AACA,UAAM,OAAO,SAAS,OAAO,MAAM,SAAS;AAC5C,SAAK,KAAK,SAAS,SAAS,EAAE,KAAK,SAAS,MAAM;AAAA,EACpD;AAGA,MAAI,kBAAkB,UAAU,QAAQ,SAAS,KAAK,UAAU,QAAQ,SAAS,GAAG;AAClF,UAAM,YAAY,GAAG;AAAA,MACnB,SAAS;AAAA,MACT,wBAAwB,mBAAmB,qBAAqB,IAAI,MAAM,IAAI;AAAA,MAC9E,SAAS,IAAI,SAAS;AAAA,MACtB,wBAAwB,mBAAmB,qBAAqB,IAAI,UAAU,MAAM;AAAA,MACpF;AAAA,IACF;AACA,UAAM,OAAO,SAAS,OAAO,MAAM,SAAS;AAC5C,SAAK,KAAK,SAAS,SAAS,EAAE,KAAK,SAAS,MAAM;AAAA,EACpD;AAGA,MAAI,UAAU,SAAS,aAAa;AAClC,aAAS,UAAU,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,EACjD;AAEA,EAAAD,MAAK,OAAO,eAAe,EAAE,KAAK,SAAS,MAAM;AAEjD,WAAS,UAAU,UAAU,EAAE,OAAO,MAAM,EAAE,KAAK,SAAS,MAAM;AAElE,MAAI,KAAK,YAAY;AACnB,aAAS,UAAU,MAAM,EAAE,KAAK,SAAS,KAAK,UAAU;AAAA,EAC1D,OAAO;AACL,aAAS,UAAU,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,EACjD;AAEA,MAAI,CAAC,eAAe;AAElB,UAAM,aAAa,OAAO,qBAAqB;AAC/C,UAAM,QAAQ,WAAW,KAAK,MAAM;AACpC,QAAI,OAAO;AACT,YAAM,aAAa,MAAM,CAAC,EAAE,QAAQ,SAAS,MAAM;AACnD,eAAS,UAAU,OAAO,EAAE,KAAK,SAAS,UAAU;AAAA,IACtD,WAAW,aAAa;AACtB,YAAMM,SAAQ,WAAW,KAAK,WAAW;AACzC,UAAIA,QAAO;AACT,cAAM,aAAaA,OAAM,CAAC,EAAE,QAAQ,SAAS,MAAM;AACnD,iBAAS,UAAU,OAAO,EAAE,KAAK,SAAS,UAAU;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAEA,mBAAiB,MAAMN,KAAI;AAC3B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;AAlMsB;;;AERtB,OAAOO,aAAW;AAKlB,SAAS,UAAAC,eAAc;AAGvB,eAAsB,eACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,kBAAkB;AACxB,QAAM,cAAc;AACpB,QAAM,UAAU;AAChB,QAAM,MAAM;AACZ,QAAM,oBAAoB,kBAAkB;AAC5C,QAAM,UAAU,eAAe,IAAI;AAGnC,QAAM,WAAW,OACd,OAAO,GAAG,EACV,KAAK,SAAS,OAAO,EACrB,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AAEnC,MAAI;AACJ,MAAI,mBAAmB;AACrB,iBAAa,MAAMC;AAAA,MACjB;AAAA,MACA,WAAW,gBAAgB,IAAI;AAAA,MAC/B;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF,OAAO;AACL,iBAAa,MAAMA,SAAQ,UAAU,2BAA2B,GAAG,KAAK,UAAU;AAAA,EACpF;AAEA,MAAI,qBAAqB;AACzB,QAAM,aAAa,MAAMA;AAAA,IACvB;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,KAAK,aAAa;AAAA,EACpB;AACA,wBAAsB,aAAa;AAGnC,MAAI,mBAAmB;AACrB,UAAM,WAAW,MAAMA;AAAA,MACrB;AAAA,MACA,GAAG,gBAAgB,gBAAgB,OAAO,gBAAgB,aAAa,KAAK,EAAE;AAAA,MAC9E;AAAA,MACA,KAAK;AAAA,IACP;AAEA,0BAAsB;AACtB,UAAM,aAAa,MAAMA;AAAA,MACvB;AAAA,MACA,GAAG,gBAAgB,OAAO,SAAS,gBAAgB,IAAI,KAAK,EAAE;AAAA,MAC9D;AAAA,MACA,KAAK;AAAA,IACP;AACA,0BAAsB;AACtB,UAAM,aAAa,MAAMA;AAAA,MACvB;AAAA,MACA,GAAG,gBAAgB,OAAO,SAAS,gBAAgB,IAAI,KAAK,EAAE;AAAA,MAC9D;AAAA,MACA,KAAK;AAAA,IACP;AACA,0BAAsB;AACtB,UAAMA;AAAA,MACJ;AAAA,MACA,GAAG,gBAAgB,eAAe,iBAAiB,gBAAgB,YAAY,KAAK,EAAE;AAAA,MACtF;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF,OAAO;AAEL,UAAMC,cAAa,MAAMD;AAAA,MACvB;AAAA,MACA,GAAG,YAAY,OAAO,SAAS,YAAY,IAAI,KAAK,EAAE;AAAA,MACtD;AAAA,MACA,KAAK;AAAA,IACP;AACA,0BAAsBC;AACtB,UAAMD;AAAA,MACJ;AAAA,MACA,GAAG,YAAY,SAAS,YAAY,YAAY,MAAM,KAAK,EAAE;AAAA,MAC7D;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAEA,QAAM,cAAc,SAAS,KAAK,GAAG,QAAQ,EAAE,SAAS,OAAO;AAC/D,QAAM,eAAe,SAAS,KAAK,GAAG,QAAQ,EAAE,UAAU,OAAO;AACjE,QAAM,IAAI,CAAC,aAAa;AACxB,QAAM,IAAI,CAAC,cAAc;AAIzB,QAAM,KAAKE,QAAM,IAAI,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAE1C,MAAI,KAAK,SAAS,aAAa;AAC7B,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAAA,EACtB;AAGA,QAAM,YAAY,GAAG,UAAU,GAAG,GAAG,YAAY,aAAa,OAAO;AAErE,QAAMC,QAAO,SAAS,OAAO,MAAM,WAAW,cAAc;AAC5D,EAAAA,MAAK,KAAK,SAAS,uBAAuB,EAAE,KAAK,SAAS,UAAU;AAIpE,WAAS,UAAU,QAAQ,EAAE,KAAK,CAAC,GAAQ,GAAW,UAAe;AAEnE,UAAMC,QAAOC,QAAqB,MAAM,CAAC,CAAC;AAE1C,UAAM,YAAYD,MAAK,KAAK,WAAW;AACvC,QAAI,aAAa;AACjB,QAAI,aAAa;AACjB,QAAI,WAAW;AACb,YAAM,QAAQ,OAAO,8BAA8B;AACnD,YAAM,YAAY,MAAM,KAAK,SAAS;AACtC,UAAI,WAAW;AACb,qBAAa,WAAW,UAAU,CAAC,CAAC;AACpC,qBAAa,WAAW,UAAU,CAAC,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,UAAM,gBAAgB,aAAa,cAAc;AACjD,QAAI,gBAAgB,IAAI,UAAU;AAGlC,QAAI,MAAM,KAAK,MAAM,GAAG;AACtB,sBAAgB;AAAA,IAClB;AAEA,IAAAA,MAAK,KAAK,aAAa,aAAa,aAAa,KAAK,gBAAgB,OAAO,GAAG;AAAA,EAClF,CAAC;AAGD,MAAI,qBAAqB,aAAa,aAAa,KAAK;AACtD,UAAM,YAAY,GAAG;AAAA,MACnB;AAAA,MACA,IAAI,aAAa,aAAa;AAAA,MAC9B,IAAI;AAAA,MACJ,IAAI,aAAa,aAAa;AAAA,MAC9B;AAAA,IACF;AACA,UAAM,cAAc,SAAS,OAAO,MAAM,SAAS;AACnD,gBAAY,KAAK,SAAS,UAAU;AAAA,EACtC;AAEA,mBAAiB,MAAMD,KAAI;AAE3B,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;AA7JsB;AA+JtB,eAAeH,SACb,aACA,WACA,SACA,QAAQ,IACR;AACA,MAAI,cAAc,IAAI;AACpB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,YAAY,OAAO,GAAG,EAAE,KAAK,SAAS,OAAO,EAAE,KAAK,SAAS,KAAK;AACjF,QAAM,SAASM,WAAU;AACzB,QAAM,gBAAgB,OAAO,cAAc;AAE3C,QAAMF,QAAO,MAAM;AAAA,IACjB;AAAA,IACAG,cAAa,eAAe,SAAS,CAAC;AAAA,IACtC;AAAA,MACE,OAAO,mBAAmB,WAAW,MAAM,IAAI;AAAA;AAAA,MAC/C,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACA,MAAI;AAEJ,MAAI,CAAC,eAAe;AAClB,UAAM,YAAYH,MAAK,SAAS,CAAC;AACjC,eAAW,SAAS,UAAU,UAAU;AACtC,YAAM,cAAc,MAAM,YAAY,WAAW,QAAQ,GAAG,EAAE,WAAW,QAAQ,GAAG;AACpF,UAAI,OAAO;AACT,cAAM,aAAa,SAAS,KAAK;AAAA,MACnC;AAAA,IACF;AAEA,WAAOA,MAAK,QAAQ;AAEpB,SAAK,UAAU;AAAA,EACjB,OAAO;AACL,UAAM,MAAMA,MAAK,SAAS,CAAC;AAC3B,UAAM,KAAKC,QAAOD,KAAI;AAEtB,WAAO,IAAI,sBAAsB;AACjC,OAAG,KAAK,SAAS,KAAK,KAAK;AAC3B,OAAG,KAAK,UAAU,KAAK,MAAM;AAAA,EAC/B;AAGA,SAAO,KAAK,aAAa,aAAa,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,OAAO,GAAG;AACtF,SAAO,KAAK;AACd;AAlDe,OAAAJ,UAAA;;;ACtKf,OAAOQ,aAAW;AAGlB,IAAM,oBAAoB,wBAAC,aAAkD;AAC3E,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF,GAb0B;AAc1B,eAAsB,WACpB,QAEA,YACA,EAAE,OAAO,GACT;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,UAAU;AAC5D,aAAW,aAAa,eAAe;AAEvC,QAAM,gBAAgB;AACtB,QAAM,WAAW,WAAW;AAC5B,aAAW,SAAS,WAAW,SAAS,OAAO;AAE/C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT,IAAI,MAAM,YAAY,QAAQ,YAAY,eAAe,UAAU,CAAC;AACpE,QAAM,UAAU,WAAW,WAAW;AAEtC,MAAI,YAAY;AAChB,MAAI;AAEJ,MAAI,YAAY,cAAc,WAAW,UAAU,QAAQ,QAAQ,eAAe;AAChF,gBAAY,QAAQ,QAAQ,cAAc,QAAQ,YAAY,WAAW,MAAM;AAC/E,WAAO,SACJ,OAAoB,SAAS,cAAc,EAC3C,KAAK,SAAS,oBAAoB,EAClC,KAAK,cAAc,SAAS,EAC5B,KAAK,UAAU,QAAQ;AAAA,EAC5B;AAEA,QAAM,UAAU;AAAA,IACd,eAAe,WAAW;AAAA,IAC1B,YAAY,WAAW,cAAc;AAAA,IACrC,OAAO,WAAW;AAAA,IAClB,KAAK,WAAW;AAAA,IAChB,SAAS,WAAW,WAAW;AAAA,IAC/B,aAAa;AAAA,EACf;AACA,MAAI,SAAS;AACb,MAAI,MAAM;AACR,KAAC,EAAE,OAAO,SAAS,MAAM,MAAM,IAAI,MAAM;AAAA,MACvC;AAAA,MACC,YAAY,cAAc,WAAW,UAAW;AAAA,MACjD;AAAA,IACF;AAAA,EACF,OAAO;AACL,KAAC,EAAE,OAAO,SAAS,MAAM,MAAM,IAAI,MAAM;AAAA,MACvC;AAAA,MACC,YAAY,cAAc,WAAW,UAAW;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACA,QAAM,EAAE,OAAO,iBAAiB,MAAM,aAAa,IAAI,MAAM;AAAA,IAC3D;AAAA,IACC,cAAc,cAAc,WAAW,YAAa;AAAA,IACrD;AAAA,EACF;AACA,aAAW,QAAQ;AACnB,QAAM,gBAAgB;AACtB,QAAM,aAAa,YAAY,SAAS;AACxC,QAAM,YAAY,KAAK,IAAI,MAAM,QAAQ,aAAa,MAAM,IAAI;AAChE,QAAM,cACJ,KAAK,IAAI,KAAK,SAAS,gBAAgB,GAAG,YAAY,UAAU,CAAC,IAAI;AACvE,QAAM,IAAI,CAAC,aAAa;AACxB,QAAM,IAAI,CAAC,cAAc;AACzB,eAAa;AAAA,IACX;AAAA,IACA,gBAAgB,UAAU,aAAa,KAAK,QAAQ,CAAC,YAAY,KAAK,SAAS,KAAK;AAAA,EACtF;AACA,UAAQ;AAAA,IACN;AAAA,IACA,gBAAgB,UAAU,aAAa,KAAK,QAAQ,CAAC,YAAY,KAAK,SAAS,KAAK;AAAA,EACtF;AACA,kBAAgB;AAAA,IACd;AAAA,IACA,gBACG,UAAU,aAAa,IAAI,aAAa,QAAQ,IAAI,iBACrD,QACC,CAAC,YAAY,KAAK,SAAS,KAC5B;AAAA,EACJ;AAEA,MAAIC;AAEJ,QAAM,EAAE,IAAI,GAAG,IAAI;AACnB,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,WAAW,SAAS,aAAa;AAEnC,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAMC,WAAU,kBAAkB,YAAY,CAAC,CAAC;AAEhD,UAAM,YACJ,MAAM,KACF,GAAG,KAAK,uBAAuB,GAAG,GAAG,YAAY,aAAa,MAAM,CAAC,GAAGA,QAAO,IAC/E,GAAG,UAAU,GAAG,GAAG,YAAY,aAAaA,QAAO;AAEzD,IAAAF,QAAO,SAAS,OAAO,MAAM,WAAW,cAAc;AACtD,IAAAA,MAAK,KAAK,SAAS,uBAAuB,EAAE,KAAK,SAAS,YAAY,YAAY,IAAI;AAAA,EACxF,OAAO;AACL,IAAAA,QAAO,SAAS,OAAO,QAAQ,cAAc;AAE7C,IAAAA,MACG,KAAK,SAAS,+BAA+B,EAC7C,KAAK,SAAS,UAAU,EACxB,KAAK,MAAM,MAAM,CAAC,EAClB,KAAK,MAAM,MAAM,CAAC,EAClB,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,SAAS,UAAU,EACxB,KAAK,UAAU,WAAW;AAE7B,UAAM,WAAW,cAAc,cAAc,WAAW;AACxD,QAAI,UAAU;AACZ,YAAM,OAAO,SAAS,OAAO,MAAM;AACnC,YAAM,QAAQ,IAAI;AAElB,YAAM,KAAK,IAAI,KAAK,OAAO,MAAM,KAAK,CAAC;AACvC,YAAM,KAAK,IAAI,cAAc,KAAK,OAAO,MAAM,KAAK,CAAC;AACrD,WACG,KAAK,MAAM,KAAK,EAChB,KAAK,MAAM,EAAE,EACb,KAAK,MAAM,KAAK,EAChB,KAAK,MAAM,EAAE,EAEb,KAAK,gBAAgB,GAAG,EACxB,KAAK,UAAU,kBAAkB,QAAQ,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,mBAAiB,YAAYA,KAAI;AACjC,aAAW,SAAS;AAEpB,aAAW,YAAY,SAAU,OAAO;AACtC,WAAO,kBAAU,KAAK,YAAY,KAAK;AAAA,EACzC;AAEA,SAAO;AACT;AA5IsB;;;ACjBtB,OAAOG,aAAW;AAKlB,eAAsB,KAAmC,QAAwB,MAAY;AAC3F,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAClB,QAAM,EAAE,UAAU,MAAM,aAAa,MAAM,IAAI,MAAM;AAAA,IACnD;AAAA,IACA;AAAA,IACA,eAAe,IAAI;AAAA,EACrB;AAEA,QAAM,IAAI,KAAK,QAAQ,KAAK;AAC5B,QAAM,IAAI,KAAK,SAAS,IAAI;AAC5B,QAAM,IAAI,OAAO;AACjB,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,WAAW,KAAK,QAAQ;AAC9B,QAAM,YAAY,KAAK,SAAS;AAChC,QAAM,iBAAiB,KAAK,IAAI,GAAG,QAAQ;AAC3C,QAAM,kBAAkB,KAAK,IAAI,GAAG,SAAS;AAE7C,QAAM,KAAK,aAAa,aAAa,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,GAAG;AAE5E,MAAI;AACJ,QAAM,OAAO;AAAA,OACR,CAAC,IAAI,CAAC,UAAU,iBAAiB,IAAI,IAAI,KAAK,kBAAkB,GAAG;AAAA,OACnE,CAAC,IAAI,CAAC,UAAU,iBAAiB,IAAI,IAAI,CAAC;AAAA,OAC1C,CAAC,IAAI,CAAC,UAAU,iBAAiB,IAAI,IAAI,CAAC;AAAA,OAC1C,CAAC,IAAI,CAAC,UAAU,iBAAiB,IAAI,IAAI,kBAAkB,GAAG;AAAA;AAAA,OAE9D,CAAC,IAAI,CAAC,UAAU,iBAAiB,IAAI,IAAI,kBAAkB,IAAI;AAAA,OAC/D,IAAI,GAAG,IAAI,IAAI,GAAG,YAAY,kBAAkB,IAAI;AAAA,OACpD,CAAC,IAAI,CAAC,UAAU,KAAK,iBAAiB,IAAI,IAAI,kBAAkB,IAAI;AAAA;AAAA,OAEpE,CAAC,IAAI,CAAC,UAAU,KAAK,iBAAiB,IAAI,IAAI,kBAAkB,IAAI;AAAA,OACpE,CAAC,IAAI,CAAC,UAAU,KAAK,iBAAiB,IAAI;AAAA,OAC1C,CAAC,IAAI,CAAC,UAAU,KAAK,iBAAiB,IAAI;AAAA,OAC1C,CAAC,IAAI,CAAC,UAAU,KAAK,iBAAiB,IAAI,IAAI,KAAK,kBAAkB,IAAI;AAAA;AAAA,OAEzE,CAAC,IAAI,CAAC,UAAU,KAAK,iBAAiB,GAAG,IAAI,KAAK,kBAAkB,IAAI;AAAA,OACxE,IAAI,GAAG,IAAI,IAAI,GAAG,YAAY,KAAK,kBAAkB,IAAI;AAAA,OACzD,CAAC,IAAI,CAAC,UAAU,iBAAiB,GAAG,IAAI,KAAK,kBAAkB,IAAI;AAAA;AAGxE,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,UAAM,YAAY,GAAG,KAAK,MAAM,OAAO;AACvC,eAAW,SAAS,OAAO,MAAM,WAAW,cAAc;AAC1D,aAAS,KAAK,SAAS,uBAAuB,EAAE,KAAK,SAAS,oBAAoB,SAAS,CAAC;AAAA,EAC9F,OAAO;AACL,eAAW,SACR,OAAO,QAAQ,cAAc,EAC7B,KAAK,SAAS,uBAAuB,EACrC,KAAK,SAAS,UAAU,EACxB,KAAK,KAAK,IAAI;AAAA,EACnB;AAGA,WAAS,KAAK,aAAa,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG;AAEvF,mBAAiB,MAAM,QAAQ;AAC/B,OAAK,gBAAgB,SAAU,QAAgB,OAAc;AAC3D,WAAO,kBAAU,KAAK,QAAQ,KAAK;AAAA,EACrC;AACA,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,kBAAkB,MAAM,KAAK;AACtC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;AAtEsB;;;ACVtB,OAAOC,aAAW;AASlB,eAAsB,MAAoC,QAAwB,MAAY;AAC5F,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAElB,QAAM,EAAE,UAAU,MAAM,aAAa,MAAM,IAAI,MAAM;AAAA,IACnD;AAAA,IACA;AAAA,IACA,eAAe,IAAI;AAAA,EACrB;AAEA,QAAM,IAAI,KAAK,QAAQ,IAAI;AAC3B,QAAM,IAAI,KAAK,SAAS,IAAI;AAG5B,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,MAAM;AAEjB,QAAM,EAAE,UAAU,IAAI;AACtB,MAAI;AAGJ,QAAM,OAAO;AAAA,OACR,EAAE,IAAI,EAAE,UAAU,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG;AAAA,OAC1C,EAAE,IAAI,EAAE,UAAU,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG;AAAA,OACzC,EAAE,IAAI,EAAE,UAAU,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA;AAAA,OAErC,EAAE,IAAI,EAAE,UAAU,IAAI,IAAI,IAAI,IAAI,IAAI;AAAA,OACtC,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI;AAAA;AAAA,OAE3C,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI;AAAA,OAC3C,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG;AAAA,OAC9B,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA;AAAA,OAEhD,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI;AAAA,OAC/C,EAAE,IAAI,EAAE,UAAU,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI;AAAA;AAG/C,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,KAAKC,QAAM,IAAI,QAAQ;AAC7B,UAAM,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC1C,UAAM,YAAY,GAAG,KAAK,MAAM,OAAO;AACvC,gBAAY,SAAS,OAAO,MAAM,WAAW,cAAc;AAC3D,cAAU,KAAK,SAAS,uBAAuB,EAAE,KAAK,SAAS,oBAAoB,SAAS,CAAC;AAAA,EAC/F,OAAO;AACL,gBAAY,SACT,OAAO,QAAQ,cAAc,EAC7B,KAAK,SAAS,uBAAuB,EACrC,KAAK,SAAS,UAAU,EACxB,KAAK,KAAK,IAAI;AAAA,EACnB;AAEA,QAAM,KAAK,aAAa,aAAa,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,GAAG;AAG5E,YAAU,KAAK,aAAa,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;AAE7D,mBAAiB,MAAM,SAAS;AAEhC,OAAK,gBAAgB,SAAU,QAAgB,OAAc;AAC3D,WAAO,kBAAU,KAAK,QAAQ,KAAK;AAAA,EACrC;AACA,OAAK,YAAY,SAAU,OAAO;AAChC,QAAI,KAAK,mBAAmB,MAAM,KAAK;AACvC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;AAtEsB;;;ACHtB,eAAsB,mBACpB,QACA,MACA;AACA,QAAM,EAAE,aAAa,WAAW,IAAI,cAAc,IAAI;AACtD,OAAK,aAAa;AAElB,QAAM,EAAE,UAAU,MAAM,aAAa,MAAM,IAAI,MAAM;AAAA,IACnD;AAAA,IACA;AAAA,IACA,eAAe,IAAI;AAAA,EACrB;AAEA,QAAM,IAAI,KAAK,QAAQ,IAAI;AAC3B,QAAM,IAAI,KAAK,SAAS,IAAI;AAC5B,QAAM,KAAK;AAEX,QAAM,WAAW;AAAA,OACZ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,OACpB,CAAC,IAAI,IAAI,EAAE;AAAA,UACR,EAAE,IAAI,EAAE,KAAK,EAAE;AAAA,OAClB,IAAI,IAAI,EAAE;AAAA,OACV,EAAE,MAAM,EAAE,IAAI,EAAE;AAAA,OAChB,IAAI,IAAI,EAAE;AAAA,SACR,EAAE,KAAK,EAAE,IAAI,EAAE;AAAA,OACjB,CAAC,IAAI,IAAI,EAAE;AAAA,QACV,EAAE,OAAO,EAAE,KAAK,EAAE;AAAA;AAAA;AAIxB,QAAM,KAAK,SACR,OAAO,MAAM,EACb,KAAK,MAAM,UAAU,KAAK,EAAE,EAC5B,KAAK,SAAS,mBAAmB,KAAK,IAAI,EAC1C,KAAK,SAAS,UAAU,EACxB,KAAK,KAAK,QAAQ;AAErB,WACG,OAAO,MAAM,EACb,KAAK,SAAS,YAAY,EAC1B,KAAK,MAAM,CAAC,IAAI,CAAC,EACjB,KAAK,MAAM,IAAI,CAAC,EAChB,KAAK,MAAM,IAAI,CAAC,EAChB,KAAK,MAAM,IAAI,CAAC;AAEnB,QAAM,KAAK,aAAa,aAAa,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,GAAG;AAC5E,WAAS,OAAO,MAAM,MAAM,KAAK,CAAC;AAElC,mBAAiB,MAAM,EAAE;AACzB,OAAK,gBAAgB,SAAU,QAAgB,OAAc;AAC3D,WAAO,kBAAU,KAAK,QAAQ,KAAK;AAAA,EACrC;AACA,OAAK,YAAY,SAAU,OAAO;AAChC,WAAO,kBAAU,KAAK,MAAM,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;AAzDsB;;;ACFtB,eAAsB,cACpB,QACA,MACA;AACA,QAAM,UAAU;AAAA,IACd,SAAS,KAAK,WAAW;AAAA,EAC3B;AACA,SAAO,OAAO,QAAQ,MAAM,OAAO;AACrC;AARsB;;;ACsFf,IAAM,aAAa;AAAA,EACxB;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,QAAQ,WAAW,WAAW;AAAA,IACxC,iBAAiB,CAAC,YAAY;AAAA,IAC9B,SAASC;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,OAAO;AAAA,IACjB,iBAAiB,CAAC,aAAa;AAAA,IAC/B,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,YAAY,MAAM;AAAA,IAC5B,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,cAAc,WAAW,oBAAoB,YAAY;AAAA,IACnE,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,MAAM,YAAY,UAAU;AAAA,IACtC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,MAAM;AAAA,IAChB,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,MAAM;AAAA,IAChB,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,OAAO;AAAA,IACjB,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,YAAY,WAAW,UAAU;AAAA,IAC3C,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,WAAW,SAAS;AAAA,IAC9B,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,cAAc,QAAQ;AAAA,IAChC,iBAAiB,CAAC,YAAY;AAAA,IAC9B,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,aAAa,QAAQ;AAAA,IAC/B,iBAAiB,CAAC,WAAW;AAAA,IAC7B,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,YAAY,oBAAoB,WAAW;AAAA,IACrD,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,UAAU,iBAAiB,eAAe;AAAA,IACpD,iBAAiB,CAAC,eAAe;AAAA,IACjC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,eAAe;AAAA,IACzB,iBAAiB,CAAC,cAAc;AAAA,IAChC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,QAAQ,mBAAmB;AAAA,IACrC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,mBAAmB,iBAAiB,YAAY,gBAAgB;AAAA,IAC1E,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,SAAS,cAAc;AAAA,IACjC,iBAAiB,CAAC,YAAY;AAAA,IAC9B,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,QAAQ,eAAe;AAAA,IACjC,iBAAiB,CAAC,UAAU;AAAA,IAC5B,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,MAAM;AAAA,IAChB,iBAAiB,CAAC,UAAU;AAAA,IAC5B,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,aAAa,SAAS;AAAA,IAChC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,WAAW,SAAS;AAAA,IAC9B,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,YAAY,gBAAgB;AAAA,IACtC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,OAAO,UAAU;AAAA,IAC3B,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,wBAAwB;AAAA,IAClC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,OAAO,qBAAqB;AAAA,IACtC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,QAAQ,gBAAgB;AAAA,IAClC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,oBAAoB,SAAS;AAAA,IACvC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,YAAY,qBAAqB,iBAAiB;AAAA,IAC5D,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,WAAW,UAAU;AAAA,IAC/B,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,oBAAoB,aAAa;AAAA,IAC3C,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,YAAY,eAAe;AAAA,IACrC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,cAAc,kBAAkB;AAAA,IAC1C,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,eAAe,kBAAkB;AAAA,IAC3C,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,gBAAgB,kBAAkB;AAAA,IAC5C,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,aAAa,UAAU,kBAAkB;AAAA,IACnD,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,SAAS,aAAa,mBAAmB;AAAA,IACnD,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,eAAe,mBAAmB;AAAA,IAC5C,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,WAAW,gBAAgB;AAAA,IACrC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,WAAW,iBAAiB;AAAA,IACtC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,oBAAoB,YAAY,gBAAgB;AAAA,IAC1D,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,YAAY;AAAA,IACtB,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,iBAAiB,CAAC,qBAAqB;AAAA,IACvC,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,CAAC,gBAAgB;AAAA,IAC1B,SAAS;AAAA,EACX;AACF;AAEA,IAAM,mBAAmB,6BAAM;AAE7B,QAAM,qBAAqB;AAAA;AAAA,IAEzB;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA;AAAA,EACF;AAEA,QAAM,UAAU;AAAA,IACd,GAAI,OAAO,QAAQ,kBAAkB;AAAA,IACrC,GAAG,WAAW,QAAQ,CAAC,UAAU;AAC/B,YAAM,UAAU;AAAA,QACd,MAAM;AAAA,QACN,GAAI,aAAa,QAAQ,MAAM,UAAU,CAAC;AAAA,QAC1C,GAAI,qBAAqB,QAAQ,MAAM,kBAAkB,CAAC;AAAA,MAC5D;AACA,aAAO,QAAQ,IAAI,CAAC,UAAU,CAAC,OAAO,MAAM,OAAO,CAAU;AAAA,IAC/D,CAAC;AAAA,EACH;AACA,SAAO,OAAO,YAAY,OAAO;AAInC,GAnDyB;AAqDlB,IAAMC,UAAS,iBAAiB;AAEhC,SAAS,aAAa,OAAiC;AAC5D,SAAO,SAASA;AAClB;AAFgB;;;ACxgBhB,IAAM,YAAY,oBAAI,IAAyB;AAE/C,eAAsB,WACpB,MACA,MACA,eACA;AACA,MAAI;AACJ,MAAI;AAGJ,MAAI,KAAK,UAAU,QAAQ;AACzB,QAAI,KAAK,MAAM,KAAK,IAAI;AACtB,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAEA,QAAM,eAAe,KAAK,QAAQC,QAAO,KAAK,KAAK,IAAI;AAEvD,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,kBAAkB,KAAK,KAAK,6BAA6B;AAAA,EAC3E;AAEA,MAAI,KAAK,MAAM;AAEb,QAAI;AACJ,QAAI,cAAc,OAAO,kBAAkB,WAAW;AACpD,eAAS;AAAA,IACX,WAAW,KAAK,YAAY;AAC1B,eAAS,KAAK,cAAc;AAAA,IAC9B;AACA,YAAQ,KACL,OAAoB,OAAO,EAC3B,KAAK,cAAc,KAAK,IAAI,EAC5B,KAAK,UAAU,UAAU,IAAI;AAChC,SAAK,MAAM,aAAa,OAAO,MAAM,aAAa;AAAA,EACpD,OAAO;AACL,SAAK,MAAM,aAAa,MAAM,MAAM,aAAa;AACjD,YAAQ;AAAA,EACV;AACA,MAAI,KAAK,SAAS;AAChB,OAAG,KAAK,SAAS,KAAK,OAAO;AAAA,EAC/B;AAEA,YAAU,IAAI,KAAK,IAAI,KAAK;AAE5B,MAAI,KAAK,cAAc;AACrB,UAAM,KAAK,SAAS,MAAM,KAAK,OAAO,IAAI,YAAY;AAAA,EACxD;AACA,SAAO;AACT;AAlDsB;AAoDf,IAAM,cAAc,wBAAC,MAAmB,SAA2B;AACxE,YAAU,IAAI,KAAK,IAAI,IAAI;AAC7B,GAF2B;AAIpB,IAAMC,SAAQ,6BAAM;AACzB,YAAU,MAAM;AAClB,GAFqB;AAId,IAAM,eAAe,wBAAC,SAA6C;AACxE,QAAM,KAAK,UAAU,IAAI,KAAK,EAAE;AAChC,MAAI;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA,gBAAgB,KAAK,IAAI,KAAK,QAAQ,IAAI,KAAK,OAAO,KAAK,QAAQ,IAAI;AAAA,EACzE;AACA,QAAM,UAAU;AAChB,QAAM,OAAO,KAAK,QAAQ;AAC1B,MAAI,KAAK,aAAa;AACpB,OAAG;AAAA,MACD;AAAA,MACA,gBACG,KAAK,IAAI,OAAO,KAAK,QAAQ,KAC9B,QACC,KAAK,IAAI,KAAK,SAAS,IAAI,WAC5B;AAAA,IACJ;AAAA,EACF,OAAO;AACL,OAAG,KAAK,aAAa,eAAe,KAAK,IAAI,OAAO,KAAK,IAAI,GAAG;AAAA,EAClE;AACA,SAAO;AACT,GAvB4B;", + "names": ["getConfig", "text", "select", "select", "select", "getConfig", "getConfig", "text", "select", "rect", "rough", "rough", "rough", "angle", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "options", "radius", "rough", "rough", "crossedCircle", "rough", "generateCirclePoints", "rough", "rough", "generateCirclePoints", "rough", "rough", "generateCirclePoints", "rough", "rough", "rough", "rough", "cylinder", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "filledCircle", "rough", "rough", "flippedTriangle", "rough", "state", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "rect", "rough", "options", "rect", "rough", "rough", "rough", "rough", "rough", "rough", "lightningBolt", "rough", "createCylinderPathD", "createOuterCylinderPathD", "createInnerCylinderPathD", "cylinder", "rough", "rough", "rough", "rough", "rough", "multiRect", "rough", "rough", "rough", "rough", "rect", "rough", "rough", "s", "points", "rough", "rough", "select", "rough", "text", "getConfig", "div", "dv", "select", "rect", "rough", "rough", "generateArcPoints", "angle", "rough", "rough", "rough", "rect", "rough", "rough", "squareRect", "rough", "rough", "rough", "rough", "circle", "rough", "circle", "rough", "rough", "rough", "rect", "rough", "rough", "taggedRect", "rough", "rough", "rect", "rough", "createCylinderPathD", "createOuterCylinderPathD", "createInnerCylinderPathD", "cylinder", "rough", "rough", "rough", "rough", "rough", "rough", "getConfig", "rough", "rough", "rough", "rough", "rough", "rough", "rough", "windowPane", "rough", "select", "themeVariables", "options", "shapeSvg", "nameBBox", "rough", "text", "select", "rect", "roughRect", "yOffset", "select", "rough", "select", "addText", "text", "sanitizeText", "select", "getConfig", "rough", "rect", "text", "select", "_", "i", "nodes", "match", "rough", "select", "addText", "typeHeight", "rough", "rect", "text", "select", "getConfig", "sanitizeText", "rough", "rect", "rough", "options", "rough", "rough", "rough", "rough", "squareRect", "shapes", "shapes", "clear"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-MI3HLSF2.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-MI3HLSF2.mjs new file mode 100644 index 0000000..2b001f8 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-MI3HLSF2.mjs @@ -0,0 +1,2712 @@ +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// ../../node_modules/.pnpm/js-yaml@4.1.0/node_modules/js-yaml/dist/js-yaml.mjs +function isNothing(subject) { + return typeof subject === "undefined" || subject === null; +} +__name(isNothing, "isNothing"); +function isObject(subject) { + return typeof subject === "object" && subject !== null; +} +__name(isObject, "isObject"); +function toArray(sequence) { + if (Array.isArray(sequence)) return sequence; + else if (isNothing(sequence)) return []; + return [sequence]; +} +__name(toArray, "toArray"); +function extend(target, source) { + var index, length, key, sourceKeys; + if (source) { + sourceKeys = Object.keys(source); + for (index = 0, length = sourceKeys.length; index < length; index += 1) { + key = sourceKeys[index]; + target[key] = source[key]; + } + } + return target; +} +__name(extend, "extend"); +function repeat(string, count) { + var result = "", cycle; + for (cycle = 0; cycle < count; cycle += 1) { + result += string; + } + return result; +} +__name(repeat, "repeat"); +function isNegativeZero(number) { + return number === 0 && Number.NEGATIVE_INFINITY === 1 / number; +} +__name(isNegativeZero, "isNegativeZero"); +var isNothing_1 = isNothing; +var isObject_1 = isObject; +var toArray_1 = toArray; +var repeat_1 = repeat; +var isNegativeZero_1 = isNegativeZero; +var extend_1 = extend; +var common = { + isNothing: isNothing_1, + isObject: isObject_1, + toArray: toArray_1, + repeat: repeat_1, + isNegativeZero: isNegativeZero_1, + extend: extend_1 +}; +function formatError(exception2, compact) { + var where = "", message = exception2.reason || "(unknown reason)"; + if (!exception2.mark) return message; + if (exception2.mark.name) { + where += 'in "' + exception2.mark.name + '" '; + } + where += "(" + (exception2.mark.line + 1) + ":" + (exception2.mark.column + 1) + ")"; + if (!compact && exception2.mark.snippet) { + where += "\n\n" + exception2.mark.snippet; + } + return message + " " + where; +} +__name(formatError, "formatError"); +function YAMLException$1(reason, mark) { + Error.call(this); + this.name = "YAMLException"; + this.reason = reason; + this.mark = mark; + this.message = formatError(this, false); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + this.stack = new Error().stack || ""; + } +} +__name(YAMLException$1, "YAMLException$1"); +YAMLException$1.prototype = Object.create(Error.prototype); +YAMLException$1.prototype.constructor = YAMLException$1; +YAMLException$1.prototype.toString = /* @__PURE__ */ __name(function toString(compact) { + return this.name + ": " + formatError(this, compact); +}, "toString"); +var exception = YAMLException$1; +function getLine(buffer, lineStart, lineEnd, position, maxLineLength) { + var head = ""; + var tail = ""; + var maxHalfLength = Math.floor(maxLineLength / 2) - 1; + if (position - lineStart > maxHalfLength) { + head = " ... "; + lineStart = position - maxHalfLength + head.length; + } + if (lineEnd - position > maxHalfLength) { + tail = " ..."; + lineEnd = position + maxHalfLength - tail.length; + } + return { + str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, "\u2192") + tail, + pos: position - lineStart + head.length + // relative position + }; +} +__name(getLine, "getLine"); +function padStart(string, max) { + return common.repeat(" ", max - string.length) + string; +} +__name(padStart, "padStart"); +function makeSnippet(mark, options) { + options = Object.create(options || null); + if (!mark.buffer) return null; + if (!options.maxLength) options.maxLength = 79; + if (typeof options.indent !== "number") options.indent = 1; + if (typeof options.linesBefore !== "number") options.linesBefore = 3; + if (typeof options.linesAfter !== "number") options.linesAfter = 2; + var re = /\r?\n|\r|\0/g; + var lineStarts = [0]; + var lineEnds = []; + var match; + var foundLineNo = -1; + while (match = re.exec(mark.buffer)) { + lineEnds.push(match.index); + lineStarts.push(match.index + match[0].length); + if (mark.position <= match.index && foundLineNo < 0) { + foundLineNo = lineStarts.length - 2; + } + } + if (foundLineNo < 0) foundLineNo = lineStarts.length - 1; + var result = "", i, line; + var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length; + var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3); + for (i = 1; i <= options.linesBefore; i++) { + if (foundLineNo - i < 0) break; + line = getLine( + mark.buffer, + lineStarts[foundLineNo - i], + lineEnds[foundLineNo - i], + mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]), + maxLineLength + ); + result = common.repeat(" ", options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) + " | " + line.str + "\n" + result; + } + line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength); + result += common.repeat(" ", options.indent) + padStart((mark.line + 1).toString(), lineNoLength) + " | " + line.str + "\n"; + result += common.repeat("-", options.indent + lineNoLength + 3 + line.pos) + "^\n"; + for (i = 1; i <= options.linesAfter; i++) { + if (foundLineNo + i >= lineEnds.length) break; + line = getLine( + mark.buffer, + lineStarts[foundLineNo + i], + lineEnds[foundLineNo + i], + mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]), + maxLineLength + ); + result += common.repeat(" ", options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) + " | " + line.str + "\n"; + } + return result.replace(/\n$/, ""); +} +__name(makeSnippet, "makeSnippet"); +var snippet = makeSnippet; +var TYPE_CONSTRUCTOR_OPTIONS = [ + "kind", + "multi", + "resolve", + "construct", + "instanceOf", + "predicate", + "represent", + "representName", + "defaultStyle", + "styleAliases" +]; +var YAML_NODE_KINDS = [ + "scalar", + "sequence", + "mapping" +]; +function compileStyleAliases(map2) { + var result = {}; + if (map2 !== null) { + Object.keys(map2).forEach(function(style) { + map2[style].forEach(function(alias) { + result[String(alias)] = style; + }); + }); + } + return result; +} +__name(compileStyleAliases, "compileStyleAliases"); +function Type$1(tag, options) { + options = options || {}; + Object.keys(options).forEach(function(name) { + if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { + throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); + } + }); + this.options = options; + this.tag = tag; + this.kind = options["kind"] || null; + this.resolve = options["resolve"] || function() { + return true; + }; + this.construct = options["construct"] || function(data) { + return data; + }; + this.instanceOf = options["instanceOf"] || null; + this.predicate = options["predicate"] || null; + this.represent = options["represent"] || null; + this.representName = options["representName"] || null; + this.defaultStyle = options["defaultStyle"] || null; + this.multi = options["multi"] || false; + this.styleAliases = compileStyleAliases(options["styleAliases"] || null); + if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { + throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); + } +} +__name(Type$1, "Type$1"); +var type = Type$1; +function compileList(schema2, name) { + var result = []; + schema2[name].forEach(function(currentType) { + var newIndex = result.length; + result.forEach(function(previousType, previousIndex) { + if (previousType.tag === currentType.tag && previousType.kind === currentType.kind && previousType.multi === currentType.multi) { + newIndex = previousIndex; + } + }); + result[newIndex] = currentType; + }); + return result; +} +__name(compileList, "compileList"); +function compileMap() { + var result = { + scalar: {}, + sequence: {}, + mapping: {}, + fallback: {}, + multi: { + scalar: [], + sequence: [], + mapping: [], + fallback: [] + } + }, index, length; + function collectType(type2) { + if (type2.multi) { + result.multi[type2.kind].push(type2); + result.multi["fallback"].push(type2); + } else { + result[type2.kind][type2.tag] = result["fallback"][type2.tag] = type2; + } + } + __name(collectType, "collectType"); + for (index = 0, length = arguments.length; index < length; index += 1) { + arguments[index].forEach(collectType); + } + return result; +} +__name(compileMap, "compileMap"); +function Schema$1(definition) { + return this.extend(definition); +} +__name(Schema$1, "Schema$1"); +Schema$1.prototype.extend = /* @__PURE__ */ __name(function extend2(definition) { + var implicit = []; + var explicit = []; + if (definition instanceof type) { + explicit.push(definition); + } else if (Array.isArray(definition)) { + explicit = explicit.concat(definition); + } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) { + if (definition.implicit) implicit = implicit.concat(definition.implicit); + if (definition.explicit) explicit = explicit.concat(definition.explicit); + } else { + throw new exception("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })"); + } + implicit.forEach(function(type$1) { + if (!(type$1 instanceof type)) { + throw new exception("Specified list of YAML types (or a single Type object) contains a non-Type object."); + } + if (type$1.loadKind && type$1.loadKind !== "scalar") { + throw new exception("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported."); + } + if (type$1.multi) { + throw new exception("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit."); + } + }); + explicit.forEach(function(type$1) { + if (!(type$1 instanceof type)) { + throw new exception("Specified list of YAML types (or a single Type object) contains a non-Type object."); + } + }); + var result = Object.create(Schema$1.prototype); + result.implicit = (this.implicit || []).concat(implicit); + result.explicit = (this.explicit || []).concat(explicit); + result.compiledImplicit = compileList(result, "implicit"); + result.compiledExplicit = compileList(result, "explicit"); + result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit); + return result; +}, "extend"); +var schema = Schema$1; +var str = new type("tag:yaml.org,2002:str", { + kind: "scalar", + construct: /* @__PURE__ */ __name(function(data) { + return data !== null ? data : ""; + }, "construct") +}); +var seq = new type("tag:yaml.org,2002:seq", { + kind: "sequence", + construct: /* @__PURE__ */ __name(function(data) { + return data !== null ? data : []; + }, "construct") +}); +var map = new type("tag:yaml.org,2002:map", { + kind: "mapping", + construct: /* @__PURE__ */ __name(function(data) { + return data !== null ? data : {}; + }, "construct") +}); +var failsafe = new schema({ + explicit: [ + str, + seq, + map + ] +}); +function resolveYamlNull(data) { + if (data === null) return true; + var max = data.length; + return max === 1 && data === "~" || max === 4 && (data === "null" || data === "Null" || data === "NULL"); +} +__name(resolveYamlNull, "resolveYamlNull"); +function constructYamlNull() { + return null; +} +__name(constructYamlNull, "constructYamlNull"); +function isNull(object) { + return object === null; +} +__name(isNull, "isNull"); +var _null = new type("tag:yaml.org,2002:null", { + kind: "scalar", + resolve: resolveYamlNull, + construct: constructYamlNull, + predicate: isNull, + represent: { + canonical: /* @__PURE__ */ __name(function() { + return "~"; + }, "canonical"), + lowercase: /* @__PURE__ */ __name(function() { + return "null"; + }, "lowercase"), + uppercase: /* @__PURE__ */ __name(function() { + return "NULL"; + }, "uppercase"), + camelcase: /* @__PURE__ */ __name(function() { + return "Null"; + }, "camelcase"), + empty: /* @__PURE__ */ __name(function() { + return ""; + }, "empty") + }, + defaultStyle: "lowercase" +}); +function resolveYamlBoolean(data) { + if (data === null) return false; + var max = data.length; + return max === 4 && (data === "true" || data === "True" || data === "TRUE") || max === 5 && (data === "false" || data === "False" || data === "FALSE"); +} +__name(resolveYamlBoolean, "resolveYamlBoolean"); +function constructYamlBoolean(data) { + return data === "true" || data === "True" || data === "TRUE"; +} +__name(constructYamlBoolean, "constructYamlBoolean"); +function isBoolean(object) { + return Object.prototype.toString.call(object) === "[object Boolean]"; +} +__name(isBoolean, "isBoolean"); +var bool = new type("tag:yaml.org,2002:bool", { + kind: "scalar", + resolve: resolveYamlBoolean, + construct: constructYamlBoolean, + predicate: isBoolean, + represent: { + lowercase: /* @__PURE__ */ __name(function(object) { + return object ? "true" : "false"; + }, "lowercase"), + uppercase: /* @__PURE__ */ __name(function(object) { + return object ? "TRUE" : "FALSE"; + }, "uppercase"), + camelcase: /* @__PURE__ */ __name(function(object) { + return object ? "True" : "False"; + }, "camelcase") + }, + defaultStyle: "lowercase" +}); +function isHexCode(c) { + return 48 <= c && c <= 57 || 65 <= c && c <= 70 || 97 <= c && c <= 102; +} +__name(isHexCode, "isHexCode"); +function isOctCode(c) { + return 48 <= c && c <= 55; +} +__name(isOctCode, "isOctCode"); +function isDecCode(c) { + return 48 <= c && c <= 57; +} +__name(isDecCode, "isDecCode"); +function resolveYamlInteger(data) { + if (data === null) return false; + var max = data.length, index = 0, hasDigits = false, ch; + if (!max) return false; + ch = data[index]; + if (ch === "-" || ch === "+") { + ch = data[++index]; + } + if (ch === "0") { + if (index + 1 === max) return true; + ch = data[++index]; + if (ch === "b") { + index++; + for (; index < max; index++) { + ch = data[index]; + if (ch === "_") continue; + if (ch !== "0" && ch !== "1") return false; + hasDigits = true; + } + return hasDigits && ch !== "_"; + } + if (ch === "x") { + index++; + for (; index < max; index++) { + ch = data[index]; + if (ch === "_") continue; + if (!isHexCode(data.charCodeAt(index))) return false; + hasDigits = true; + } + return hasDigits && ch !== "_"; + } + if (ch === "o") { + index++; + for (; index < max; index++) { + ch = data[index]; + if (ch === "_") continue; + if (!isOctCode(data.charCodeAt(index))) return false; + hasDigits = true; + } + return hasDigits && ch !== "_"; + } + } + if (ch === "_") return false; + for (; index < max; index++) { + ch = data[index]; + if (ch === "_") continue; + if (!isDecCode(data.charCodeAt(index))) { + return false; + } + hasDigits = true; + } + if (!hasDigits || ch === "_") return false; + return true; +} +__name(resolveYamlInteger, "resolveYamlInteger"); +function constructYamlInteger(data) { + var value = data, sign = 1, ch; + if (value.indexOf("_") !== -1) { + value = value.replace(/_/g, ""); + } + ch = value[0]; + if (ch === "-" || ch === "+") { + if (ch === "-") sign = -1; + value = value.slice(1); + ch = value[0]; + } + if (value === "0") return 0; + if (ch === "0") { + if (value[1] === "b") return sign * parseInt(value.slice(2), 2); + if (value[1] === "x") return sign * parseInt(value.slice(2), 16); + if (value[1] === "o") return sign * parseInt(value.slice(2), 8); + } + return sign * parseInt(value, 10); +} +__name(constructYamlInteger, "constructYamlInteger"); +function isInteger(object) { + return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 === 0 && !common.isNegativeZero(object)); +} +__name(isInteger, "isInteger"); +var int = new type("tag:yaml.org,2002:int", { + kind: "scalar", + resolve: resolveYamlInteger, + construct: constructYamlInteger, + predicate: isInteger, + represent: { + binary: /* @__PURE__ */ __name(function(obj) { + return obj >= 0 ? "0b" + obj.toString(2) : "-0b" + obj.toString(2).slice(1); + }, "binary"), + octal: /* @__PURE__ */ __name(function(obj) { + return obj >= 0 ? "0o" + obj.toString(8) : "-0o" + obj.toString(8).slice(1); + }, "octal"), + decimal: /* @__PURE__ */ __name(function(obj) { + return obj.toString(10); + }, "decimal"), + /* eslint-disable max-len */ + hexadecimal: /* @__PURE__ */ __name(function(obj) { + return obj >= 0 ? "0x" + obj.toString(16).toUpperCase() : "-0x" + obj.toString(16).toUpperCase().slice(1); + }, "hexadecimal") + }, + defaultStyle: "decimal", + styleAliases: { + binary: [2, "bin"], + octal: [8, "oct"], + decimal: [10, "dec"], + hexadecimal: [16, "hex"] + } +}); +var YAML_FLOAT_PATTERN = new RegExp( + // 2.5e4, 2.5 and integers + "^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$" +); +function resolveYamlFloat(data) { + if (data === null) return false; + if (!YAML_FLOAT_PATTERN.test(data) || // Quick hack to not allow integers end with `_` + // Probably should update regexp & check speed + data[data.length - 1] === "_") { + return false; + } + return true; +} +__name(resolveYamlFloat, "resolveYamlFloat"); +function constructYamlFloat(data) { + var value, sign; + value = data.replace(/_/g, "").toLowerCase(); + sign = value[0] === "-" ? -1 : 1; + if ("+-".indexOf(value[0]) >= 0) { + value = value.slice(1); + } + if (value === ".inf") { + return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; + } else if (value === ".nan") { + return NaN; + } + return sign * parseFloat(value, 10); +} +__name(constructYamlFloat, "constructYamlFloat"); +var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; +function representYamlFloat(object, style) { + var res; + if (isNaN(object)) { + switch (style) { + case "lowercase": + return ".nan"; + case "uppercase": + return ".NAN"; + case "camelcase": + return ".NaN"; + } + } else if (Number.POSITIVE_INFINITY === object) { + switch (style) { + case "lowercase": + return ".inf"; + case "uppercase": + return ".INF"; + case "camelcase": + return ".Inf"; + } + } else if (Number.NEGATIVE_INFINITY === object) { + switch (style) { + case "lowercase": + return "-.inf"; + case "uppercase": + return "-.INF"; + case "camelcase": + return "-.Inf"; + } + } else if (common.isNegativeZero(object)) { + return "-0.0"; + } + res = object.toString(10); + return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace("e", ".e") : res; +} +__name(representYamlFloat, "representYamlFloat"); +function isFloat(object) { + return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 !== 0 || common.isNegativeZero(object)); +} +__name(isFloat, "isFloat"); +var float = new type("tag:yaml.org,2002:float", { + kind: "scalar", + resolve: resolveYamlFloat, + construct: constructYamlFloat, + predicate: isFloat, + represent: representYamlFloat, + defaultStyle: "lowercase" +}); +var json = failsafe.extend({ + implicit: [ + _null, + bool, + int, + float + ] +}); +var core = json; +var YAML_DATE_REGEXP = new RegExp( + "^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$" +); +var YAML_TIMESTAMP_REGEXP = new RegExp( + "^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$" +); +function resolveYamlTimestamp(data) { + if (data === null) return false; + if (YAML_DATE_REGEXP.exec(data) !== null) return true; + if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; + return false; +} +__name(resolveYamlTimestamp, "resolveYamlTimestamp"); +function constructYamlTimestamp(data) { + var match, year, month, day, hour, minute, second, fraction = 0, delta = null, tz_hour, tz_minute, date; + match = YAML_DATE_REGEXP.exec(data); + if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); + if (match === null) throw new Error("Date resolve error"); + year = +match[1]; + month = +match[2] - 1; + day = +match[3]; + if (!match[4]) { + return new Date(Date.UTC(year, month, day)); + } + hour = +match[4]; + minute = +match[5]; + second = +match[6]; + if (match[7]) { + fraction = match[7].slice(0, 3); + while (fraction.length < 3) { + fraction += "0"; + } + fraction = +fraction; + } + if (match[9]) { + tz_hour = +match[10]; + tz_minute = +(match[11] || 0); + delta = (tz_hour * 60 + tz_minute) * 6e4; + if (match[9] === "-") delta = -delta; + } + date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); + if (delta) date.setTime(date.getTime() - delta); + return date; +} +__name(constructYamlTimestamp, "constructYamlTimestamp"); +function representYamlTimestamp(object) { + return object.toISOString(); +} +__name(representYamlTimestamp, "representYamlTimestamp"); +var timestamp = new type("tag:yaml.org,2002:timestamp", { + kind: "scalar", + resolve: resolveYamlTimestamp, + construct: constructYamlTimestamp, + instanceOf: Date, + represent: representYamlTimestamp +}); +function resolveYamlMerge(data) { + return data === "<<" || data === null; +} +__name(resolveYamlMerge, "resolveYamlMerge"); +var merge = new type("tag:yaml.org,2002:merge", { + kind: "scalar", + resolve: resolveYamlMerge +}); +var BASE64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r"; +function resolveYamlBinary(data) { + if (data === null) return false; + var code, idx, bitlen = 0, max = data.length, map2 = BASE64_MAP; + for (idx = 0; idx < max; idx++) { + code = map2.indexOf(data.charAt(idx)); + if (code > 64) continue; + if (code < 0) return false; + bitlen += 6; + } + return bitlen % 8 === 0; +} +__name(resolveYamlBinary, "resolveYamlBinary"); +function constructYamlBinary(data) { + var idx, tailbits, input = data.replace(/[\r\n=]/g, ""), max = input.length, map2 = BASE64_MAP, bits = 0, result = []; + for (idx = 0; idx < max; idx++) { + if (idx % 4 === 0 && idx) { + result.push(bits >> 16 & 255); + result.push(bits >> 8 & 255); + result.push(bits & 255); + } + bits = bits << 6 | map2.indexOf(input.charAt(idx)); + } + tailbits = max % 4 * 6; + if (tailbits === 0) { + result.push(bits >> 16 & 255); + result.push(bits >> 8 & 255); + result.push(bits & 255); + } else if (tailbits === 18) { + result.push(bits >> 10 & 255); + result.push(bits >> 2 & 255); + } else if (tailbits === 12) { + result.push(bits >> 4 & 255); + } + return new Uint8Array(result); +} +__name(constructYamlBinary, "constructYamlBinary"); +function representYamlBinary(object) { + var result = "", bits = 0, idx, tail, max = object.length, map2 = BASE64_MAP; + for (idx = 0; idx < max; idx++) { + if (idx % 3 === 0 && idx) { + result += map2[bits >> 18 & 63]; + result += map2[bits >> 12 & 63]; + result += map2[bits >> 6 & 63]; + result += map2[bits & 63]; + } + bits = (bits << 8) + object[idx]; + } + tail = max % 3; + if (tail === 0) { + result += map2[bits >> 18 & 63]; + result += map2[bits >> 12 & 63]; + result += map2[bits >> 6 & 63]; + result += map2[bits & 63]; + } else if (tail === 2) { + result += map2[bits >> 10 & 63]; + result += map2[bits >> 4 & 63]; + result += map2[bits << 2 & 63]; + result += map2[64]; + } else if (tail === 1) { + result += map2[bits >> 2 & 63]; + result += map2[bits << 4 & 63]; + result += map2[64]; + result += map2[64]; + } + return result; +} +__name(representYamlBinary, "representYamlBinary"); +function isBinary(obj) { + return Object.prototype.toString.call(obj) === "[object Uint8Array]"; +} +__name(isBinary, "isBinary"); +var binary = new type("tag:yaml.org,2002:binary", { + kind: "scalar", + resolve: resolveYamlBinary, + construct: constructYamlBinary, + predicate: isBinary, + represent: representYamlBinary +}); +var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; +var _toString$2 = Object.prototype.toString; +function resolveYamlOmap(data) { + if (data === null) return true; + var objectKeys = [], index, length, pair, pairKey, pairHasKey, object = data; + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + pairHasKey = false; + if (_toString$2.call(pair) !== "[object Object]") return false; + for (pairKey in pair) { + if (_hasOwnProperty$3.call(pair, pairKey)) { + if (!pairHasKey) pairHasKey = true; + else return false; + } + } + if (!pairHasKey) return false; + if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey); + else return false; + } + return true; +} +__name(resolveYamlOmap, "resolveYamlOmap"); +function constructYamlOmap(data) { + return data !== null ? data : []; +} +__name(constructYamlOmap, "constructYamlOmap"); +var omap = new type("tag:yaml.org,2002:omap", { + kind: "sequence", + resolve: resolveYamlOmap, + construct: constructYamlOmap +}); +var _toString$1 = Object.prototype.toString; +function resolveYamlPairs(data) { + if (data === null) return true; + var index, length, pair, keys, result, object = data; + result = new Array(object.length); + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + if (_toString$1.call(pair) !== "[object Object]") return false; + keys = Object.keys(pair); + if (keys.length !== 1) return false; + result[index] = [keys[0], pair[keys[0]]]; + } + return true; +} +__name(resolveYamlPairs, "resolveYamlPairs"); +function constructYamlPairs(data) { + if (data === null) return []; + var index, length, pair, keys, result, object = data; + result = new Array(object.length); + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + keys = Object.keys(pair); + result[index] = [keys[0], pair[keys[0]]]; + } + return result; +} +__name(constructYamlPairs, "constructYamlPairs"); +var pairs = new type("tag:yaml.org,2002:pairs", { + kind: "sequence", + resolve: resolveYamlPairs, + construct: constructYamlPairs +}); +var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; +function resolveYamlSet(data) { + if (data === null) return true; + var key, object = data; + for (key in object) { + if (_hasOwnProperty$2.call(object, key)) { + if (object[key] !== null) return false; + } + } + return true; +} +__name(resolveYamlSet, "resolveYamlSet"); +function constructYamlSet(data) { + return data !== null ? data : {}; +} +__name(constructYamlSet, "constructYamlSet"); +var set = new type("tag:yaml.org,2002:set", { + kind: "mapping", + resolve: resolveYamlSet, + construct: constructYamlSet +}); +var _default = core.extend({ + implicit: [ + timestamp, + merge + ], + explicit: [ + binary, + omap, + pairs, + set + ] +}); +var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; +var CONTEXT_FLOW_IN = 1; +var CONTEXT_FLOW_OUT = 2; +var CONTEXT_BLOCK_IN = 3; +var CONTEXT_BLOCK_OUT = 4; +var CHOMPING_CLIP = 1; +var CHOMPING_STRIP = 2; +var CHOMPING_KEEP = 3; +var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; +var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; +var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; +var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; +var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; +function _class(obj) { + return Object.prototype.toString.call(obj); +} +__name(_class, "_class"); +function is_EOL(c) { + return c === 10 || c === 13; +} +__name(is_EOL, "is_EOL"); +function is_WHITE_SPACE(c) { + return c === 9 || c === 32; +} +__name(is_WHITE_SPACE, "is_WHITE_SPACE"); +function is_WS_OR_EOL(c) { + return c === 9 || c === 32 || c === 10 || c === 13; +} +__name(is_WS_OR_EOL, "is_WS_OR_EOL"); +function is_FLOW_INDICATOR(c) { + return c === 44 || c === 91 || c === 93 || c === 123 || c === 125; +} +__name(is_FLOW_INDICATOR, "is_FLOW_INDICATOR"); +function fromHexCode(c) { + var lc; + if (48 <= c && c <= 57) { + return c - 48; + } + lc = c | 32; + if (97 <= lc && lc <= 102) { + return lc - 97 + 10; + } + return -1; +} +__name(fromHexCode, "fromHexCode"); +function escapedHexLen(c) { + if (c === 120) { + return 2; + } + if (c === 117) { + return 4; + } + if (c === 85) { + return 8; + } + return 0; +} +__name(escapedHexLen, "escapedHexLen"); +function fromDecimalCode(c) { + if (48 <= c && c <= 57) { + return c - 48; + } + return -1; +} +__name(fromDecimalCode, "fromDecimalCode"); +function simpleEscapeSequence(c) { + return c === 48 ? "\0" : c === 97 ? "\x07" : c === 98 ? "\b" : c === 116 ? " " : c === 9 ? " " : c === 110 ? "\n" : c === 118 ? "\v" : c === 102 ? "\f" : c === 114 ? "\r" : c === 101 ? "\x1B" : c === 32 ? " " : c === 34 ? '"' : c === 47 ? "/" : c === 92 ? "\\" : c === 78 ? "\x85" : c === 95 ? "\xA0" : c === 76 ? "\u2028" : c === 80 ? "\u2029" : ""; +} +__name(simpleEscapeSequence, "simpleEscapeSequence"); +function charFromCodepoint(c) { + if (c <= 65535) { + return String.fromCharCode(c); + } + return String.fromCharCode( + (c - 65536 >> 10) + 55296, + (c - 65536 & 1023) + 56320 + ); +} +__name(charFromCodepoint, "charFromCodepoint"); +var simpleEscapeCheck = new Array(256); +var simpleEscapeMap = new Array(256); +for (i = 0; i < 256; i++) { + simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; + simpleEscapeMap[i] = simpleEscapeSequence(i); +} +var i; +function State$1(input, options) { + this.input = input; + this.filename = options["filename"] || null; + this.schema = options["schema"] || _default; + this.onWarning = options["onWarning"] || null; + this.legacy = options["legacy"] || false; + this.json = options["json"] || false; + this.listener = options["listener"] || null; + this.implicitTypes = this.schema.compiledImplicit; + this.typeMap = this.schema.compiledTypeMap; + this.length = input.length; + this.position = 0; + this.line = 0; + this.lineStart = 0; + this.lineIndent = 0; + this.firstTabInLine = -1; + this.documents = []; +} +__name(State$1, "State$1"); +function generateError(state, message) { + var mark = { + name: state.filename, + buffer: state.input.slice(0, -1), + // omit trailing \0 + position: state.position, + line: state.line, + column: state.position - state.lineStart + }; + mark.snippet = snippet(mark); + return new exception(message, mark); +} +__name(generateError, "generateError"); +function throwError(state, message) { + throw generateError(state, message); +} +__name(throwError, "throwError"); +function throwWarning(state, message) { + if (state.onWarning) { + state.onWarning.call(null, generateError(state, message)); + } +} +__name(throwWarning, "throwWarning"); +var directiveHandlers = { + YAML: /* @__PURE__ */ __name(function handleYamlDirective(state, name, args) { + var match, major, minor; + if (state.version !== null) { + throwError(state, "duplication of %YAML directive"); + } + if (args.length !== 1) { + throwError(state, "YAML directive accepts exactly one argument"); + } + match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); + if (match === null) { + throwError(state, "ill-formed argument of the YAML directive"); + } + major = parseInt(match[1], 10); + minor = parseInt(match[2], 10); + if (major !== 1) { + throwError(state, "unacceptable YAML version of the document"); + } + state.version = args[0]; + state.checkLineBreaks = minor < 2; + if (minor !== 1 && minor !== 2) { + throwWarning(state, "unsupported YAML version of the document"); + } + }, "handleYamlDirective"), + TAG: /* @__PURE__ */ __name(function handleTagDirective(state, name, args) { + var handle, prefix; + if (args.length !== 2) { + throwError(state, "TAG directive accepts exactly two arguments"); + } + handle = args[0]; + prefix = args[1]; + if (!PATTERN_TAG_HANDLE.test(handle)) { + throwError(state, "ill-formed tag handle (first argument) of the TAG directive"); + } + if (_hasOwnProperty$1.call(state.tagMap, handle)) { + throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); + } + if (!PATTERN_TAG_URI.test(prefix)) { + throwError(state, "ill-formed tag prefix (second argument) of the TAG directive"); + } + try { + prefix = decodeURIComponent(prefix); + } catch (err) { + throwError(state, "tag prefix is malformed: " + prefix); + } + state.tagMap[handle] = prefix; + }, "handleTagDirective") +}; +function captureSegment(state, start, end, checkJson) { + var _position, _length, _character, _result; + if (start < end) { + _result = state.input.slice(start, end); + if (checkJson) { + for (_position = 0, _length = _result.length; _position < _length; _position += 1) { + _character = _result.charCodeAt(_position); + if (!(_character === 9 || 32 <= _character && _character <= 1114111)) { + throwError(state, "expected valid JSON character"); + } + } + } else if (PATTERN_NON_PRINTABLE.test(_result)) { + throwError(state, "the stream contains non-printable characters"); + } + state.result += _result; + } +} +__name(captureSegment, "captureSegment"); +function mergeMappings(state, destination, source, overridableKeys) { + var sourceKeys, key, index, quantity; + if (!common.isObject(source)) { + throwError(state, "cannot merge mappings; the provided source object is unacceptable"); + } + sourceKeys = Object.keys(source); + for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { + key = sourceKeys[index]; + if (!_hasOwnProperty$1.call(destination, key)) { + destination[key] = source[key]; + overridableKeys[key] = true; + } + } +} +__name(mergeMappings, "mergeMappings"); +function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startLineStart, startPos) { + var index, quantity; + if (Array.isArray(keyNode)) { + keyNode = Array.prototype.slice.call(keyNode); + for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { + if (Array.isArray(keyNode[index])) { + throwError(state, "nested arrays are not supported inside keys"); + } + if (typeof keyNode === "object" && _class(keyNode[index]) === "[object Object]") { + keyNode[index] = "[object Object]"; + } + } + } + if (typeof keyNode === "object" && _class(keyNode) === "[object Object]") { + keyNode = "[object Object]"; + } + keyNode = String(keyNode); + if (_result === null) { + _result = {}; + } + if (keyTag === "tag:yaml.org,2002:merge") { + if (Array.isArray(valueNode)) { + for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { + mergeMappings(state, _result, valueNode[index], overridableKeys); + } + } else { + mergeMappings(state, _result, valueNode, overridableKeys); + } + } else { + if (!state.json && !_hasOwnProperty$1.call(overridableKeys, keyNode) && _hasOwnProperty$1.call(_result, keyNode)) { + state.line = startLine || state.line; + state.lineStart = startLineStart || state.lineStart; + state.position = startPos || state.position; + throwError(state, "duplicated mapping key"); + } + if (keyNode === "__proto__") { + Object.defineProperty(_result, keyNode, { + configurable: true, + enumerable: true, + writable: true, + value: valueNode + }); + } else { + _result[keyNode] = valueNode; + } + delete overridableKeys[keyNode]; + } + return _result; +} +__name(storeMappingPair, "storeMappingPair"); +function readLineBreak(state) { + var ch; + ch = state.input.charCodeAt(state.position); + if (ch === 10) { + state.position++; + } else if (ch === 13) { + state.position++; + if (state.input.charCodeAt(state.position) === 10) { + state.position++; + } + } else { + throwError(state, "a line break is expected"); + } + state.line += 1; + state.lineStart = state.position; + state.firstTabInLine = -1; +} +__name(readLineBreak, "readLineBreak"); +function skipSeparationSpace(state, allowComments, checkIndent) { + var lineBreaks = 0, ch = state.input.charCodeAt(state.position); + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + if (ch === 9 && state.firstTabInLine === -1) { + state.firstTabInLine = state.position; + } + ch = state.input.charCodeAt(++state.position); + } + if (allowComments && ch === 35) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 10 && ch !== 13 && ch !== 0); + } + if (is_EOL(ch)) { + readLineBreak(state); + ch = state.input.charCodeAt(state.position); + lineBreaks++; + state.lineIndent = 0; + while (ch === 32) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + } else { + break; + } + } + if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { + throwWarning(state, "deficient indentation"); + } + return lineBreaks; +} +__name(skipSeparationSpace, "skipSeparationSpace"); +function testDocumentSeparator(state) { + var _position = state.position, ch; + ch = state.input.charCodeAt(_position); + if ((ch === 45 || ch === 46) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { + _position += 3; + ch = state.input.charCodeAt(_position); + if (ch === 0 || is_WS_OR_EOL(ch)) { + return true; + } + } + return false; +} +__name(testDocumentSeparator, "testDocumentSeparator"); +function writeFoldedLines(state, count) { + if (count === 1) { + state.result += " "; + } else if (count > 1) { + state.result += common.repeat("\n", count - 1); + } +} +__name(writeFoldedLines, "writeFoldedLines"); +function readPlainScalar(state, nodeIndent, withinFlowCollection) { + var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, _kind = state.kind, _result = state.result, ch; + ch = state.input.charCodeAt(state.position); + if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 35 || ch === 38 || ch === 42 || ch === 33 || ch === 124 || ch === 62 || ch === 39 || ch === 34 || ch === 37 || ch === 64 || ch === 96) { + return false; + } + if (ch === 63 || ch === 45) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { + return false; + } + } + state.kind = "scalar"; + state.result = ""; + captureStart = captureEnd = state.position; + hasPendingContent = false; + while (ch !== 0) { + if (ch === 58) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { + break; + } + } else if (ch === 35) { + preceding = state.input.charCodeAt(state.position - 1); + if (is_WS_OR_EOL(preceding)) { + break; + } + } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { + break; + } else if (is_EOL(ch)) { + _line = state.line; + _lineStart = state.lineStart; + _lineIndent = state.lineIndent; + skipSeparationSpace(state, false, -1); + if (state.lineIndent >= nodeIndent) { + hasPendingContent = true; + ch = state.input.charCodeAt(state.position); + continue; + } else { + state.position = captureEnd; + state.line = _line; + state.lineStart = _lineStart; + state.lineIndent = _lineIndent; + break; + } + } + if (hasPendingContent) { + captureSegment(state, captureStart, captureEnd, false); + writeFoldedLines(state, state.line - _line); + captureStart = captureEnd = state.position; + hasPendingContent = false; + } + if (!is_WHITE_SPACE(ch)) { + captureEnd = state.position + 1; + } + ch = state.input.charCodeAt(++state.position); + } + captureSegment(state, captureStart, captureEnd, false); + if (state.result) { + return true; + } + state.kind = _kind; + state.result = _result; + return false; +} +__name(readPlainScalar, "readPlainScalar"); +function readSingleQuotedScalar(state, nodeIndent) { + var ch, captureStart, captureEnd; + ch = state.input.charCodeAt(state.position); + if (ch !== 39) { + return false; + } + state.kind = "scalar"; + state.result = ""; + state.position++; + captureStart = captureEnd = state.position; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 39) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + if (ch === 39) { + captureStart = state.position; + state.position++; + captureEnd = state.position; + } else { + return true; + } + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, "unexpected end of the document within a single quoted scalar"); + } else { + state.position++; + captureEnd = state.position; + } + } + throwError(state, "unexpected end of the stream within a single quoted scalar"); +} +__name(readSingleQuotedScalar, "readSingleQuotedScalar"); +function readDoubleQuotedScalar(state, nodeIndent) { + var captureStart, captureEnd, hexLength, hexResult, tmp, ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 34) { + return false; + } + state.kind = "scalar"; + state.result = ""; + state.position++; + captureStart = captureEnd = state.position; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 34) { + captureSegment(state, captureStart, state.position, true); + state.position++; + return true; + } else if (ch === 92) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + if (is_EOL(ch)) { + skipSeparationSpace(state, false, nodeIndent); + } else if (ch < 256 && simpleEscapeCheck[ch]) { + state.result += simpleEscapeMap[ch]; + state.position++; + } else if ((tmp = escapedHexLen(ch)) > 0) { + hexLength = tmp; + hexResult = 0; + for (; hexLength > 0; hexLength--) { + ch = state.input.charCodeAt(++state.position); + if ((tmp = fromHexCode(ch)) >= 0) { + hexResult = (hexResult << 4) + tmp; + } else { + throwError(state, "expected hexadecimal character"); + } + } + state.result += charFromCodepoint(hexResult); + state.position++; + } else { + throwError(state, "unknown escape sequence"); + } + captureStart = captureEnd = state.position; + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, "unexpected end of the document within a double quoted scalar"); + } else { + state.position++; + captureEnd = state.position; + } + } + throwError(state, "unexpected end of the stream within a double quoted scalar"); +} +__name(readDoubleQuotedScalar, "readDoubleQuotedScalar"); +function readFlowCollection(state, nodeIndent) { + var readNext = true, _line, _lineStart, _pos, _tag = state.tag, _result, _anchor = state.anchor, following, terminator, isPair, isExplicitPair, isMapping, overridableKeys = /* @__PURE__ */ Object.create(null), keyNode, keyTag, valueNode, ch; + ch = state.input.charCodeAt(state.position); + if (ch === 91) { + terminator = 93; + isMapping = false; + _result = []; + } else if (ch === 123) { + terminator = 125; + isMapping = true; + _result = {}; + } else { + return false; + } + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + ch = state.input.charCodeAt(++state.position); + while (ch !== 0) { + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); + if (ch === terminator) { + state.position++; + state.tag = _tag; + state.anchor = _anchor; + state.kind = isMapping ? "mapping" : "sequence"; + state.result = _result; + return true; + } else if (!readNext) { + throwError(state, "missed comma between flow collection entries"); + } else if (ch === 44) { + throwError(state, "expected the node content, but found ','"); + } + keyTag = keyNode = valueNode = null; + isPair = isExplicitPair = false; + if (ch === 63) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following)) { + isPair = isExplicitPair = true; + state.position++; + skipSeparationSpace(state, true, nodeIndent); + } + } + _line = state.line; + _lineStart = state.lineStart; + _pos = state.position; + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + keyTag = state.tag; + keyNode = state.result; + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); + if ((isExplicitPair || state.line === _line) && ch === 58) { + isPair = true; + ch = state.input.charCodeAt(++state.position); + skipSeparationSpace(state, true, nodeIndent); + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + valueNode = state.result; + } + if (isMapping) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos); + } else if (isPair) { + _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos)); + } else { + _result.push(keyNode); + } + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); + if (ch === 44) { + readNext = true; + ch = state.input.charCodeAt(++state.position); + } else { + readNext = false; + } + } + throwError(state, "unexpected end of the stream within a flow collection"); +} +__name(readFlowCollection, "readFlowCollection"); +function readBlockScalar(state, nodeIndent) { + var captureStart, folding, chomping = CHOMPING_CLIP, didReadContent = false, detectedIndent = false, textIndent = nodeIndent, emptyLines = 0, atMoreIndented = false, tmp, ch; + ch = state.input.charCodeAt(state.position); + if (ch === 124) { + folding = false; + } else if (ch === 62) { + folding = true; + } else { + return false; + } + state.kind = "scalar"; + state.result = ""; + while (ch !== 0) { + ch = state.input.charCodeAt(++state.position); + if (ch === 43 || ch === 45) { + if (CHOMPING_CLIP === chomping) { + chomping = ch === 43 ? CHOMPING_KEEP : CHOMPING_STRIP; + } else { + throwError(state, "repeat of a chomping mode identifier"); + } + } else if ((tmp = fromDecimalCode(ch)) >= 0) { + if (tmp === 0) { + throwError(state, "bad explicit indentation width of a block scalar; it cannot be less than one"); + } else if (!detectedIndent) { + textIndent = nodeIndent + tmp - 1; + detectedIndent = true; + } else { + throwError(state, "repeat of an indentation width identifier"); + } + } else { + break; + } + } + if (is_WHITE_SPACE(ch)) { + do { + ch = state.input.charCodeAt(++state.position); + } while (is_WHITE_SPACE(ch)); + if (ch === 35) { + do { + ch = state.input.charCodeAt(++state.position); + } while (!is_EOL(ch) && ch !== 0); + } + } + while (ch !== 0) { + readLineBreak(state); + state.lineIndent = 0; + ch = state.input.charCodeAt(state.position); + while ((!detectedIndent || state.lineIndent < textIndent) && ch === 32) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + if (!detectedIndent && state.lineIndent > textIndent) { + textIndent = state.lineIndent; + } + if (is_EOL(ch)) { + emptyLines++; + continue; + } + if (state.lineIndent < textIndent) { + if (chomping === CHOMPING_KEEP) { + state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); + } else if (chomping === CHOMPING_CLIP) { + if (didReadContent) { + state.result += "\n"; + } + } + break; + } + if (folding) { + if (is_WHITE_SPACE(ch)) { + atMoreIndented = true; + state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); + } else if (atMoreIndented) { + atMoreIndented = false; + state.result += common.repeat("\n", emptyLines + 1); + } else if (emptyLines === 0) { + if (didReadContent) { + state.result += " "; + } + } else { + state.result += common.repeat("\n", emptyLines); + } + } else { + state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); + } + didReadContent = true; + detectedIndent = true; + emptyLines = 0; + captureStart = state.position; + while (!is_EOL(ch) && ch !== 0) { + ch = state.input.charCodeAt(++state.position); + } + captureSegment(state, captureStart, state.position, false); + } + return true; +} +__name(readBlockScalar, "readBlockScalar"); +function readBlockSequence(state, nodeIndent) { + var _line, _tag = state.tag, _anchor = state.anchor, _result = [], following, detected = false, ch; + if (state.firstTabInLine !== -1) return false; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + ch = state.input.charCodeAt(state.position); + while (ch !== 0) { + if (state.firstTabInLine !== -1) { + state.position = state.firstTabInLine; + throwError(state, "tab characters must not be used in indentation"); + } + if (ch !== 45) { + break; + } + following = state.input.charCodeAt(state.position + 1); + if (!is_WS_OR_EOL(following)) { + break; + } + detected = true; + state.position++; + if (skipSeparationSpace(state, true, -1)) { + if (state.lineIndent <= nodeIndent) { + _result.push(null); + ch = state.input.charCodeAt(state.position); + continue; + } + } + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); + _result.push(state.result); + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { + throwError(state, "bad indentation of a sequence entry"); + } else if (state.lineIndent < nodeIndent) { + break; + } + } + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = "sequence"; + state.result = _result; + return true; + } + return false; +} +__name(readBlockSequence, "readBlockSequence"); +function readBlockMapping(state, nodeIndent, flowIndent) { + var following, allowCompact, _line, _keyLine, _keyLineStart, _keyPos, _tag = state.tag, _anchor = state.anchor, _result = {}, overridableKeys = /* @__PURE__ */ Object.create(null), keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch; + if (state.firstTabInLine !== -1) return false; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + ch = state.input.charCodeAt(state.position); + while (ch !== 0) { + if (!atExplicitKey && state.firstTabInLine !== -1) { + state.position = state.firstTabInLine; + throwError(state, "tab characters must not be used in indentation"); + } + following = state.input.charCodeAt(state.position + 1); + _line = state.line; + if ((ch === 63 || ch === 58) && is_WS_OR_EOL(following)) { + if (ch === 63) { + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + detected = true; + atExplicitKey = true; + allowCompact = true; + } else if (atExplicitKey) { + atExplicitKey = false; + allowCompact = true; + } else { + throwError(state, "incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"); + } + state.position += 1; + ch = following; + } else { + _keyLine = state.line; + _keyLineStart = state.lineStart; + _keyPos = state.position; + if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { + break; + } + if (state.line === _line) { + ch = state.input.charCodeAt(state.position); + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + if (ch === 58) { + ch = state.input.charCodeAt(++state.position); + if (!is_WS_OR_EOL(ch)) { + throwError(state, "a whitespace character is expected after the key-value separator within a block mapping"); + } + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + detected = true; + atExplicitKey = false; + allowCompact = false; + keyTag = state.tag; + keyNode = state.result; + } else if (detected) { + throwError(state, "can not read an implicit mapping pair; a colon is missed"); + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; + } + } else if (detected) { + throwError(state, "can not read a block mapping entry; a multiline key may not be an implicit key"); + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; + } + } + if (state.line === _line || state.lineIndent > nodeIndent) { + if (atExplicitKey) { + _keyLine = state.line; + _keyLineStart = state.lineStart; + _keyPos = state.position; + } + if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { + if (atExplicitKey) { + keyNode = state.result; + } else { + valueNode = state.result; + } + } + if (!atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + } + if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { + throwError(state, "bad indentation of a mapping entry"); + } else if (state.lineIndent < nodeIndent) { + break; + } + } + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + } + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = "mapping"; + state.result = _result; + } + return detected; +} +__name(readBlockMapping, "readBlockMapping"); +function readTagProperty(state) { + var _position, isVerbatim = false, isNamed = false, tagHandle, tagName, ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 33) return false; + if (state.tag !== null) { + throwError(state, "duplication of a tag property"); + } + ch = state.input.charCodeAt(++state.position); + if (ch === 60) { + isVerbatim = true; + ch = state.input.charCodeAt(++state.position); + } else if (ch === 33) { + isNamed = true; + tagHandle = "!!"; + ch = state.input.charCodeAt(++state.position); + } else { + tagHandle = "!"; + } + _position = state.position; + if (isVerbatim) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0 && ch !== 62); + if (state.position < state.length) { + tagName = state.input.slice(_position, state.position); + ch = state.input.charCodeAt(++state.position); + } else { + throwError(state, "unexpected end of the stream within a verbatim tag"); + } + } else { + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + if (ch === 33) { + if (!isNamed) { + tagHandle = state.input.slice(_position - 1, state.position + 1); + if (!PATTERN_TAG_HANDLE.test(tagHandle)) { + throwError(state, "named tag handle cannot contain such characters"); + } + isNamed = true; + _position = state.position + 1; + } else { + throwError(state, "tag suffix cannot contain exclamation marks"); + } + } + ch = state.input.charCodeAt(++state.position); + } + tagName = state.input.slice(_position, state.position); + if (PATTERN_FLOW_INDICATORS.test(tagName)) { + throwError(state, "tag suffix cannot contain flow indicator characters"); + } + } + if (tagName && !PATTERN_TAG_URI.test(tagName)) { + throwError(state, "tag name cannot contain such characters: " + tagName); + } + try { + tagName = decodeURIComponent(tagName); + } catch (err) { + throwError(state, "tag name is malformed: " + tagName); + } + if (isVerbatim) { + state.tag = tagName; + } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) { + state.tag = state.tagMap[tagHandle] + tagName; + } else if (tagHandle === "!") { + state.tag = "!" + tagName; + } else if (tagHandle === "!!") { + state.tag = "tag:yaml.org,2002:" + tagName; + } else { + throwError(state, 'undeclared tag handle "' + tagHandle + '"'); + } + return true; +} +__name(readTagProperty, "readTagProperty"); +function readAnchorProperty(state) { + var _position, ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 38) return false; + if (state.anchor !== null) { + throwError(state, "duplication of an anchor property"); + } + ch = state.input.charCodeAt(++state.position); + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); + } + if (state.position === _position) { + throwError(state, "name of an anchor node must contain at least one character"); + } + state.anchor = state.input.slice(_position, state.position); + return true; +} +__name(readAnchorProperty, "readAnchorProperty"); +function readAlias(state) { + var _position, alias, ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 42) return false; + ch = state.input.charCodeAt(++state.position); + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); + } + if (state.position === _position) { + throwError(state, "name of an alias node must contain at least one character"); + } + alias = state.input.slice(_position, state.position); + if (!_hasOwnProperty$1.call(state.anchorMap, alias)) { + throwError(state, 'unidentified alias "' + alias + '"'); + } + state.result = state.anchorMap[alias]; + skipSeparationSpace(state, true, -1); + return true; +} +__name(readAlias, "readAlias"); +function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { + var allowBlockStyles, allowBlockScalars, allowBlockCollections, indentStatus = 1, atNewLine = false, hasContent = false, typeIndex, typeQuantity, typeList, type2, flowIndent, blockIndent; + if (state.listener !== null) { + state.listener("open", state); + } + state.tag = null; + state.anchor = null; + state.kind = null; + state.result = null; + allowBlockStyles = allowBlockScalars = allowBlockCollections = CONTEXT_BLOCK_OUT === nodeContext || CONTEXT_BLOCK_IN === nodeContext; + if (allowToSeek) { + if (skipSeparationSpace(state, true, -1)) { + atNewLine = true; + if (state.lineIndent > parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } + } + if (indentStatus === 1) { + while (readTagProperty(state) || readAnchorProperty(state)) { + if (skipSeparationSpace(state, true, -1)) { + atNewLine = true; + allowBlockCollections = allowBlockStyles; + if (state.lineIndent > parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } else { + allowBlockCollections = false; + } + } + } + if (allowBlockCollections) { + allowBlockCollections = atNewLine || allowCompact; + } + if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { + if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { + flowIndent = parentIndent; + } else { + flowIndent = parentIndent + 1; + } + blockIndent = state.position - state.lineStart; + if (indentStatus === 1) { + if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) { + hasContent = true; + } else { + if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) { + hasContent = true; + } else if (readAlias(state)) { + hasContent = true; + if (state.tag !== null || state.anchor !== null) { + throwError(state, "alias node should not have any properties"); + } + } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { + hasContent = true; + if (state.tag === null) { + state.tag = "?"; + } + } + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } else if (indentStatus === 0) { + hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); + } + } + if (state.tag === null) { + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } else if (state.tag === "?") { + if (state.result !== null && state.kind !== "scalar") { + throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); + } + for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { + type2 = state.implicitTypes[typeIndex]; + if (type2.resolve(state.result)) { + state.result = type2.construct(state.result); + state.tag = type2.tag; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + break; + } + } + } else if (state.tag !== "!") { + if (_hasOwnProperty$1.call(state.typeMap[state.kind || "fallback"], state.tag)) { + type2 = state.typeMap[state.kind || "fallback"][state.tag]; + } else { + type2 = null; + typeList = state.typeMap.multi[state.kind || "fallback"]; + for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) { + if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) { + type2 = typeList[typeIndex]; + break; + } + } + } + if (!type2) { + throwError(state, "unknown tag !<" + state.tag + ">"); + } + if (state.result !== null && type2.kind !== state.kind) { + throwError(state, "unacceptable node kind for !<" + state.tag + '> tag; it should be "' + type2.kind + '", not "' + state.kind + '"'); + } + if (!type2.resolve(state.result, state.tag)) { + throwError(state, "cannot resolve a node with !<" + state.tag + "> explicit tag"); + } else { + state.result = type2.construct(state.result, state.tag); + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } + if (state.listener !== null) { + state.listener("close", state); + } + return state.tag !== null || state.anchor !== null || hasContent; +} +__name(composeNode, "composeNode"); +function readDocument(state) { + var documentStart = state.position, _position, directiveName, directiveArgs, hasDirectives = false, ch; + state.version = null; + state.checkLineBreaks = state.legacy; + state.tagMap = /* @__PURE__ */ Object.create(null); + state.anchorMap = /* @__PURE__ */ Object.create(null); + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + if (state.lineIndent > 0 || ch !== 37) { + break; + } + hasDirectives = true; + ch = state.input.charCodeAt(++state.position); + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); + } + directiveName = state.input.slice(_position, state.position); + directiveArgs = []; + if (directiveName.length < 1) { + throwError(state, "directive name must not be less than one character in length"); + } + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + if (ch === 35) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0 && !is_EOL(ch)); + break; + } + if (is_EOL(ch)) break; + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); + } + directiveArgs.push(state.input.slice(_position, state.position)); + } + if (ch !== 0) readLineBreak(state); + if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) { + directiveHandlers[directiveName](state, directiveName, directiveArgs); + } else { + throwWarning(state, 'unknown document directive "' + directiveName + '"'); + } + } + skipSeparationSpace(state, true, -1); + if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 45 && state.input.charCodeAt(state.position + 1) === 45 && state.input.charCodeAt(state.position + 2) === 45) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } else if (hasDirectives) { + throwError(state, "directives end mark is expected"); + } + composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); + skipSeparationSpace(state, true, -1); + if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { + throwWarning(state, "non-ASCII line breaks are interpreted as content"); + } + state.documents.push(state.result); + if (state.position === state.lineStart && testDocumentSeparator(state)) { + if (state.input.charCodeAt(state.position) === 46) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } + return; + } + if (state.position < state.length - 1) { + throwError(state, "end of the stream or a document separator is expected"); + } else { + return; + } +} +__name(readDocument, "readDocument"); +function loadDocuments(input, options) { + input = String(input); + options = options || {}; + if (input.length !== 0) { + if (input.charCodeAt(input.length - 1) !== 10 && input.charCodeAt(input.length - 1) !== 13) { + input += "\n"; + } + if (input.charCodeAt(0) === 65279) { + input = input.slice(1); + } + } + var state = new State$1(input, options); + var nullpos = input.indexOf("\0"); + if (nullpos !== -1) { + state.position = nullpos; + throwError(state, "null byte is not allowed in input"); + } + state.input += "\0"; + while (state.input.charCodeAt(state.position) === 32) { + state.lineIndent += 1; + state.position += 1; + } + while (state.position < state.length - 1) { + readDocument(state); + } + return state.documents; +} +__name(loadDocuments, "loadDocuments"); +function loadAll$1(input, iterator, options) { + if (iterator !== null && typeof iterator === "object" && typeof options === "undefined") { + options = iterator; + iterator = null; + } + var documents = loadDocuments(input, options); + if (typeof iterator !== "function") { + return documents; + } + for (var index = 0, length = documents.length; index < length; index += 1) { + iterator(documents[index]); + } +} +__name(loadAll$1, "loadAll$1"); +function load$1(input, options) { + var documents = loadDocuments(input, options); + if (documents.length === 0) { + return void 0; + } else if (documents.length === 1) { + return documents[0]; + } + throw new exception("expected a single document in the stream, but found more"); +} +__name(load$1, "load$1"); +var loadAll_1 = loadAll$1; +var load_1 = load$1; +var loader = { + loadAll: loadAll_1, + load: load_1 +}; +var _toString = Object.prototype.toString; +var _hasOwnProperty = Object.prototype.hasOwnProperty; +var CHAR_BOM = 65279; +var CHAR_TAB = 9; +var CHAR_LINE_FEED = 10; +var CHAR_CARRIAGE_RETURN = 13; +var CHAR_SPACE = 32; +var CHAR_EXCLAMATION = 33; +var CHAR_DOUBLE_QUOTE = 34; +var CHAR_SHARP = 35; +var CHAR_PERCENT = 37; +var CHAR_AMPERSAND = 38; +var CHAR_SINGLE_QUOTE = 39; +var CHAR_ASTERISK = 42; +var CHAR_COMMA = 44; +var CHAR_MINUS = 45; +var CHAR_COLON = 58; +var CHAR_EQUALS = 61; +var CHAR_GREATER_THAN = 62; +var CHAR_QUESTION = 63; +var CHAR_COMMERCIAL_AT = 64; +var CHAR_LEFT_SQUARE_BRACKET = 91; +var CHAR_RIGHT_SQUARE_BRACKET = 93; +var CHAR_GRAVE_ACCENT = 96; +var CHAR_LEFT_CURLY_BRACKET = 123; +var CHAR_VERTICAL_LINE = 124; +var CHAR_RIGHT_CURLY_BRACKET = 125; +var ESCAPE_SEQUENCES = {}; +ESCAPE_SEQUENCES[0] = "\\0"; +ESCAPE_SEQUENCES[7] = "\\a"; +ESCAPE_SEQUENCES[8] = "\\b"; +ESCAPE_SEQUENCES[9] = "\\t"; +ESCAPE_SEQUENCES[10] = "\\n"; +ESCAPE_SEQUENCES[11] = "\\v"; +ESCAPE_SEQUENCES[12] = "\\f"; +ESCAPE_SEQUENCES[13] = "\\r"; +ESCAPE_SEQUENCES[27] = "\\e"; +ESCAPE_SEQUENCES[34] = '\\"'; +ESCAPE_SEQUENCES[92] = "\\\\"; +ESCAPE_SEQUENCES[133] = "\\N"; +ESCAPE_SEQUENCES[160] = "\\_"; +ESCAPE_SEQUENCES[8232] = "\\L"; +ESCAPE_SEQUENCES[8233] = "\\P"; +var DEPRECATED_BOOLEANS_SYNTAX = [ + "y", + "Y", + "yes", + "Yes", + "YES", + "on", + "On", + "ON", + "n", + "N", + "no", + "No", + "NO", + "off", + "Off", + "OFF" +]; +var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/; +function compileStyleMap(schema2, map2) { + var result, keys, index, length, tag, style, type2; + if (map2 === null) return {}; + result = {}; + keys = Object.keys(map2); + for (index = 0, length = keys.length; index < length; index += 1) { + tag = keys[index]; + style = String(map2[tag]); + if (tag.slice(0, 2) === "!!") { + tag = "tag:yaml.org,2002:" + tag.slice(2); + } + type2 = schema2.compiledTypeMap["fallback"][tag]; + if (type2 && _hasOwnProperty.call(type2.styleAliases, style)) { + style = type2.styleAliases[style]; + } + result[tag] = style; + } + return result; +} +__name(compileStyleMap, "compileStyleMap"); +function encodeHex(character) { + var string, handle, length; + string = character.toString(16).toUpperCase(); + if (character <= 255) { + handle = "x"; + length = 2; + } else if (character <= 65535) { + handle = "u"; + length = 4; + } else if (character <= 4294967295) { + handle = "U"; + length = 8; + } else { + throw new exception("code point within a string may not be greater than 0xFFFFFFFF"); + } + return "\\" + handle + common.repeat("0", length - string.length) + string; +} +__name(encodeHex, "encodeHex"); +var QUOTING_TYPE_SINGLE = 1; +var QUOTING_TYPE_DOUBLE = 2; +function State(options) { + this.schema = options["schema"] || _default; + this.indent = Math.max(1, options["indent"] || 2); + this.noArrayIndent = options["noArrayIndent"] || false; + this.skipInvalid = options["skipInvalid"] || false; + this.flowLevel = common.isNothing(options["flowLevel"]) ? -1 : options["flowLevel"]; + this.styleMap = compileStyleMap(this.schema, options["styles"] || null); + this.sortKeys = options["sortKeys"] || false; + this.lineWidth = options["lineWidth"] || 80; + this.noRefs = options["noRefs"] || false; + this.noCompatMode = options["noCompatMode"] || false; + this.condenseFlow = options["condenseFlow"] || false; + this.quotingType = options["quotingType"] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE; + this.forceQuotes = options["forceQuotes"] || false; + this.replacer = typeof options["replacer"] === "function" ? options["replacer"] : null; + this.implicitTypes = this.schema.compiledImplicit; + this.explicitTypes = this.schema.compiledExplicit; + this.tag = null; + this.result = ""; + this.duplicates = []; + this.usedDuplicates = null; +} +__name(State, "State"); +function indentString(string, spaces) { + var ind = common.repeat(" ", spaces), position = 0, next = -1, result = "", line, length = string.length; + while (position < length) { + next = string.indexOf("\n", position); + if (next === -1) { + line = string.slice(position); + position = length; + } else { + line = string.slice(position, next + 1); + position = next + 1; + } + if (line.length && line !== "\n") result += ind; + result += line; + } + return result; +} +__name(indentString, "indentString"); +function generateNextLine(state, level) { + return "\n" + common.repeat(" ", state.indent * level); +} +__name(generateNextLine, "generateNextLine"); +function testImplicitResolving(state, str2) { + var index, length, type2; + for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { + type2 = state.implicitTypes[index]; + if (type2.resolve(str2)) { + return true; + } + } + return false; +} +__name(testImplicitResolving, "testImplicitResolving"); +function isWhitespace(c) { + return c === CHAR_SPACE || c === CHAR_TAB; +} +__name(isWhitespace, "isWhitespace"); +function isPrintable(c) { + return 32 <= c && c <= 126 || 161 <= c && c <= 55295 && c !== 8232 && c !== 8233 || 57344 <= c && c <= 65533 && c !== CHAR_BOM || 65536 <= c && c <= 1114111; +} +__name(isPrintable, "isPrintable"); +function isNsCharOrWhitespace(c) { + return isPrintable(c) && c !== CHAR_BOM && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED; +} +__name(isNsCharOrWhitespace, "isNsCharOrWhitespace"); +function isPlainSafe(c, prev, inblock) { + var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c); + var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c); + return ( + // ns-plain-safe + (inblock ? ( + // c = flow-in + cIsNsCharOrWhitespace + ) : cIsNsCharOrWhitespace && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET) && c !== CHAR_SHARP && !(prev === CHAR_COLON && !cIsNsChar) || isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP || prev === CHAR_COLON && cIsNsChar + ); +} +__name(isPlainSafe, "isPlainSafe"); +function isPlainSafeFirst(c) { + return isPrintable(c) && c !== CHAR_BOM && !isWhitespace(c) && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT; +} +__name(isPlainSafeFirst, "isPlainSafeFirst"); +function isPlainSafeLast(c) { + return !isWhitespace(c) && c !== CHAR_COLON; +} +__name(isPlainSafeLast, "isPlainSafeLast"); +function codePointAt(string, pos) { + var first = string.charCodeAt(pos), second; + if (first >= 55296 && first <= 56319 && pos + 1 < string.length) { + second = string.charCodeAt(pos + 1); + if (second >= 56320 && second <= 57343) { + return (first - 55296) * 1024 + second - 56320 + 65536; + } + } + return first; +} +__name(codePointAt, "codePointAt"); +function needIndentIndicator(string) { + var leadingSpaceRe = /^\n* /; + return leadingSpaceRe.test(string); +} +__name(needIndentIndicator, "needIndentIndicator"); +var STYLE_PLAIN = 1; +var STYLE_SINGLE = 2; +var STYLE_LITERAL = 3; +var STYLE_FOLDED = 4; +var STYLE_DOUBLE = 5; +function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType, quotingType, forceQuotes, inblock) { + var i; + var char = 0; + var prevChar = null; + var hasLineBreak = false; + var hasFoldableLine = false; + var shouldTrackWidth = lineWidth !== -1; + var previousLineBreak = -1; + var plain = isPlainSafeFirst(codePointAt(string, 0)) && isPlainSafeLast(codePointAt(string, string.length - 1)); + if (singleLineOnly || forceQuotes) { + for (i = 0; i < string.length; char >= 65536 ? i += 2 : i++) { + char = codePointAt(string, i); + if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + plain = plain && isPlainSafe(char, prevChar, inblock); + prevChar = char; + } + } else { + for (i = 0; i < string.length; char >= 65536 ? i += 2 : i++) { + char = codePointAt(string, i); + if (char === CHAR_LINE_FEED) { + hasLineBreak = true; + if (shouldTrackWidth) { + hasFoldableLine = hasFoldableLine || // Foldable line = too long, and not more-indented. + i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== " "; + previousLineBreak = i; + } + } else if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + plain = plain && isPlainSafe(char, prevChar, inblock); + prevChar = char; + } + hasFoldableLine = hasFoldableLine || shouldTrackWidth && (i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== " "); + } + if (!hasLineBreak && !hasFoldableLine) { + if (plain && !forceQuotes && !testAmbiguousType(string)) { + return STYLE_PLAIN; + } + return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; + } + if (indentPerLevel > 9 && needIndentIndicator(string)) { + return STYLE_DOUBLE; + } + if (!forceQuotes) { + return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; + } + return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; +} +__name(chooseScalarStyle, "chooseScalarStyle"); +function writeScalar(state, string, level, iskey, inblock) { + state.dump = (function() { + if (string.length === 0) { + return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''"; + } + if (!state.noCompatMode) { + if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) { + return state.quotingType === QUOTING_TYPE_DOUBLE ? '"' + string + '"' : "'" + string + "'"; + } + } + var indent = state.indent * Math.max(1, level); + var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); + var singleLineOnly = iskey || state.flowLevel > -1 && level >= state.flowLevel; + function testAmbiguity(string2) { + return testImplicitResolving(state, string2); + } + __name(testAmbiguity, "testAmbiguity"); + switch (chooseScalarStyle( + string, + singleLineOnly, + state.indent, + lineWidth, + testAmbiguity, + state.quotingType, + state.forceQuotes && !iskey, + inblock + )) { + case STYLE_PLAIN: + return string; + case STYLE_SINGLE: + return "'" + string.replace(/'/g, "''") + "'"; + case STYLE_LITERAL: + return "|" + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent)); + case STYLE_FOLDED: + return ">" + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); + case STYLE_DOUBLE: + return '"' + escapeString(string) + '"'; + default: + throw new exception("impossible error: invalid scalar style"); + } + })(); +} +__name(writeScalar, "writeScalar"); +function blockHeader(string, indentPerLevel) { + var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ""; + var clip = string[string.length - 1] === "\n"; + var keep = clip && (string[string.length - 2] === "\n" || string === "\n"); + var chomp = keep ? "+" : clip ? "" : "-"; + return indentIndicator + chomp + "\n"; +} +__name(blockHeader, "blockHeader"); +function dropEndingNewline(string) { + return string[string.length - 1] === "\n" ? string.slice(0, -1) : string; +} +__name(dropEndingNewline, "dropEndingNewline"); +function foldString(string, width) { + var lineRe = /(\n+)([^\n]*)/g; + var result = (function() { + var nextLF = string.indexOf("\n"); + nextLF = nextLF !== -1 ? nextLF : string.length; + lineRe.lastIndex = nextLF; + return foldLine(string.slice(0, nextLF), width); + })(); + var prevMoreIndented = string[0] === "\n" || string[0] === " "; + var moreIndented; + var match; + while (match = lineRe.exec(string)) { + var prefix = match[1], line = match[2]; + moreIndented = line[0] === " "; + result += prefix + (!prevMoreIndented && !moreIndented && line !== "" ? "\n" : "") + foldLine(line, width); + prevMoreIndented = moreIndented; + } + return result; +} +__name(foldString, "foldString"); +function foldLine(line, width) { + if (line === "" || line[0] === " ") return line; + var breakRe = / [^ ]/g; + var match; + var start = 0, end, curr = 0, next = 0; + var result = ""; + while (match = breakRe.exec(line)) { + next = match.index; + if (next - start > width) { + end = curr > start ? curr : next; + result += "\n" + line.slice(start, end); + start = end + 1; + } + curr = next; + } + result += "\n"; + if (line.length - start > width && curr > start) { + result += line.slice(start, curr) + "\n" + line.slice(curr + 1); + } else { + result += line.slice(start); + } + return result.slice(1); +} +__name(foldLine, "foldLine"); +function escapeString(string) { + var result = ""; + var char = 0; + var escapeSeq; + for (var i = 0; i < string.length; char >= 65536 ? i += 2 : i++) { + char = codePointAt(string, i); + escapeSeq = ESCAPE_SEQUENCES[char]; + if (!escapeSeq && isPrintable(char)) { + result += string[i]; + if (char >= 65536) result += string[i + 1]; + } else { + result += escapeSeq || encodeHex(char); + } + } + return result; +} +__name(escapeString, "escapeString"); +function writeFlowSequence(state, level, object) { + var _result = "", _tag = state.tag, index, length, value; + for (index = 0, length = object.length; index < length; index += 1) { + value = object[index]; + if (state.replacer) { + value = state.replacer.call(object, String(index), value); + } + if (writeNode(state, level, value, false, false) || typeof value === "undefined" && writeNode(state, level, null, false, false)) { + if (_result !== "") _result += "," + (!state.condenseFlow ? " " : ""); + _result += state.dump; + } + } + state.tag = _tag; + state.dump = "[" + _result + "]"; +} +__name(writeFlowSequence, "writeFlowSequence"); +function writeBlockSequence(state, level, object, compact) { + var _result = "", _tag = state.tag, index, length, value; + for (index = 0, length = object.length; index < length; index += 1) { + value = object[index]; + if (state.replacer) { + value = state.replacer.call(object, String(index), value); + } + if (writeNode(state, level + 1, value, true, true, false, true) || typeof value === "undefined" && writeNode(state, level + 1, null, true, true, false, true)) { + if (!compact || _result !== "") { + _result += generateNextLine(state, level); + } + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + _result += "-"; + } else { + _result += "- "; + } + _result += state.dump; + } + } + state.tag = _tag; + state.dump = _result || "[]"; +} +__name(writeBlockSequence, "writeBlockSequence"); +function writeFlowMapping(state, level, object) { + var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, pairBuffer; + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + pairBuffer = ""; + if (_result !== "") pairBuffer += ", "; + if (state.condenseFlow) pairBuffer += '"'; + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + if (state.replacer) { + objectValue = state.replacer.call(object, objectKey, objectValue); + } + if (!writeNode(state, level, objectKey, false, false)) { + continue; + } + if (state.dump.length > 1024) pairBuffer += "? "; + pairBuffer += state.dump + (state.condenseFlow ? '"' : "") + ":" + (state.condenseFlow ? "" : " "); + if (!writeNode(state, level, objectValue, false, false)) { + continue; + } + pairBuffer += state.dump; + _result += pairBuffer; + } + state.tag = _tag; + state.dump = "{" + _result + "}"; +} +__name(writeFlowMapping, "writeFlowMapping"); +function writeBlockMapping(state, level, object, compact) { + var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, explicitPair, pairBuffer; + if (state.sortKeys === true) { + objectKeyList.sort(); + } else if (typeof state.sortKeys === "function") { + objectKeyList.sort(state.sortKeys); + } else if (state.sortKeys) { + throw new exception("sortKeys must be a boolean or a function"); + } + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + pairBuffer = ""; + if (!compact || _result !== "") { + pairBuffer += generateNextLine(state, level); + } + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + if (state.replacer) { + objectValue = state.replacer.call(object, objectKey, objectValue); + } + if (!writeNode(state, level + 1, objectKey, true, true, true)) { + continue; + } + explicitPair = state.tag !== null && state.tag !== "?" || state.dump && state.dump.length > 1024; + if (explicitPair) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += "?"; + } else { + pairBuffer += "? "; + } + } + pairBuffer += state.dump; + if (explicitPair) { + pairBuffer += generateNextLine(state, level); + } + if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { + continue; + } + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += ":"; + } else { + pairBuffer += ": "; + } + pairBuffer += state.dump; + _result += pairBuffer; + } + state.tag = _tag; + state.dump = _result || "{}"; +} +__name(writeBlockMapping, "writeBlockMapping"); +function detectType(state, object, explicit) { + var _result, typeList, index, length, type2, style; + typeList = explicit ? state.explicitTypes : state.implicitTypes; + for (index = 0, length = typeList.length; index < length; index += 1) { + type2 = typeList[index]; + if ((type2.instanceOf || type2.predicate) && (!type2.instanceOf || typeof object === "object" && object instanceof type2.instanceOf) && (!type2.predicate || type2.predicate(object))) { + if (explicit) { + if (type2.multi && type2.representName) { + state.tag = type2.representName(object); + } else { + state.tag = type2.tag; + } + } else { + state.tag = "?"; + } + if (type2.represent) { + style = state.styleMap[type2.tag] || type2.defaultStyle; + if (_toString.call(type2.represent) === "[object Function]") { + _result = type2.represent(object, style); + } else if (_hasOwnProperty.call(type2.represent, style)) { + _result = type2.represent[style](object, style); + } else { + throw new exception("!<" + type2.tag + '> tag resolver accepts not "' + style + '" style'); + } + state.dump = _result; + } + return true; + } + } + return false; +} +__name(detectType, "detectType"); +function writeNode(state, level, object, block, compact, iskey, isblockseq) { + state.tag = null; + state.dump = object; + if (!detectType(state, object, false)) { + detectType(state, object, true); + } + var type2 = _toString.call(state.dump); + var inblock = block; + var tagStr; + if (block) { + block = state.flowLevel < 0 || state.flowLevel > level; + } + var objectOrArray = type2 === "[object Object]" || type2 === "[object Array]", duplicateIndex, duplicate; + if (objectOrArray) { + duplicateIndex = state.duplicates.indexOf(object); + duplicate = duplicateIndex !== -1; + } + if (state.tag !== null && state.tag !== "?" || duplicate || state.indent !== 2 && level > 0) { + compact = false; + } + if (duplicate && state.usedDuplicates[duplicateIndex]) { + state.dump = "*ref_" + duplicateIndex; + } else { + if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { + state.usedDuplicates[duplicateIndex] = true; + } + if (type2 === "[object Object]") { + if (block && Object.keys(state.dump).length !== 0) { + writeBlockMapping(state, level, state.dump, compact); + if (duplicate) { + state.dump = "&ref_" + duplicateIndex + state.dump; + } + } else { + writeFlowMapping(state, level, state.dump); + if (duplicate) { + state.dump = "&ref_" + duplicateIndex + " " + state.dump; + } + } + } else if (type2 === "[object Array]") { + if (block && state.dump.length !== 0) { + if (state.noArrayIndent && !isblockseq && level > 0) { + writeBlockSequence(state, level - 1, state.dump, compact); + } else { + writeBlockSequence(state, level, state.dump, compact); + } + if (duplicate) { + state.dump = "&ref_" + duplicateIndex + state.dump; + } + } else { + writeFlowSequence(state, level, state.dump); + if (duplicate) { + state.dump = "&ref_" + duplicateIndex + " " + state.dump; + } + } + } else if (type2 === "[object String]") { + if (state.tag !== "?") { + writeScalar(state, state.dump, level, iskey, inblock); + } + } else if (type2 === "[object Undefined]") { + return false; + } else { + if (state.skipInvalid) return false; + throw new exception("unacceptable kind of an object to dump " + type2); + } + if (state.tag !== null && state.tag !== "?") { + tagStr = encodeURI( + state.tag[0] === "!" ? state.tag.slice(1) : state.tag + ).replace(/!/g, "%21"); + if (state.tag[0] === "!") { + tagStr = "!" + tagStr; + } else if (tagStr.slice(0, 18) === "tag:yaml.org,2002:") { + tagStr = "!!" + tagStr.slice(18); + } else { + tagStr = "!<" + tagStr + ">"; + } + state.dump = tagStr + " " + state.dump; + } + } + return true; +} +__name(writeNode, "writeNode"); +function getDuplicateReferences(object, state) { + var objects = [], duplicatesIndexes = [], index, length; + inspectNode(object, objects, duplicatesIndexes); + for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { + state.duplicates.push(objects[duplicatesIndexes[index]]); + } + state.usedDuplicates = new Array(length); +} +__name(getDuplicateReferences, "getDuplicateReferences"); +function inspectNode(object, objects, duplicatesIndexes) { + var objectKeyList, index, length; + if (object !== null && typeof object === "object") { + index = objects.indexOf(object); + if (index !== -1) { + if (duplicatesIndexes.indexOf(index) === -1) { + duplicatesIndexes.push(index); + } + } else { + objects.push(object); + if (Array.isArray(object)) { + for (index = 0, length = object.length; index < length; index += 1) { + inspectNode(object[index], objects, duplicatesIndexes); + } + } else { + objectKeyList = Object.keys(object); + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); + } + } + } + } +} +__name(inspectNode, "inspectNode"); +function dump$1(input, options) { + options = options || {}; + var state = new State(options); + if (!state.noRefs) getDuplicateReferences(input, state); + var value = input; + if (state.replacer) { + value = state.replacer.call({ "": value }, "", value); + } + if (writeNode(state, 0, value, true, true)) return state.dump + "\n"; + return ""; +} +__name(dump$1, "dump$1"); +var dump_1 = dump$1; +var dumper = { + dump: dump_1 +}; +function renamed(from, to) { + return function() { + throw new Error("Function yaml." + from + " is removed in js-yaml 4. Use yaml." + to + " instead, which is now safe by default."); + }; +} +__name(renamed, "renamed"); +var JSON_SCHEMA = json; +var load = loader.load; +var loadAll = loader.loadAll; +var dump = dumper.dump; +var safeLoad = renamed("safeLoad", "load"); +var safeLoadAll = renamed("safeLoadAll", "loadAll"); +var safeDump = renamed("safeDump", "dump"); + +export { + JSON_SCHEMA, + load +}; +/*! Bundled license information: + +js-yaml/dist/js-yaml.mjs: + (*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT *) +*/ diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-MI3HLSF2.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-MI3HLSF2.mjs.map new file mode 100644 index 0000000..2d142ec --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-MI3HLSF2.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../../node_modules/.pnpm/js-yaml@4.1.0/node_modules/js-yaml/dist/js-yaml.mjs"], + "sourcesContent": ["\n/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */\nfunction isNothing(subject) {\n return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;\n else if (isNothing(sequence)) return [];\n\n return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n var index, length, key, sourceKeys;\n\n if (source) {\n sourceKeys = Object.keys(source);\n\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\nfunction repeat(string, count) {\n var result = '', cycle;\n\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n\n return result;\n}\n\n\nfunction isNegativeZero(number) {\n return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nvar isNothing_1 = isNothing;\nvar isObject_1 = isObject;\nvar toArray_1 = toArray;\nvar repeat_1 = repeat;\nvar isNegativeZero_1 = isNegativeZero;\nvar extend_1 = extend;\n\nvar common = {\n\tisNothing: isNothing_1,\n\tisObject: isObject_1,\n\ttoArray: toArray_1,\n\trepeat: repeat_1,\n\tisNegativeZero: isNegativeZero_1,\n\textend: extend_1\n};\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n\n\nfunction formatError(exception, compact) {\n var where = '', message = exception.reason || '(unknown reason)';\n\n if (!exception.mark) return message;\n\n if (exception.mark.name) {\n where += 'in \"' + exception.mark.name + '\" ';\n }\n\n where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';\n\n if (!compact && exception.mark.snippet) {\n where += '\\n\\n' + exception.mark.snippet;\n }\n\n return message + ' ' + where;\n}\n\n\nfunction YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = formatError(this, false);\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = (new Error()).stack || '';\n }\n}\n\n\n// Inherit from Error\nYAMLException$1.prototype = Object.create(Error.prototype);\nYAMLException$1.prototype.constructor = YAMLException$1;\n\n\nYAMLException$1.prototype.toString = function toString(compact) {\n return this.name + ': ' + formatError(this, compact);\n};\n\n\nvar exception = YAMLException$1;\n\n// get snippet for a single line, respecting maxLength\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n var head = '';\n var tail = '';\n var maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... ';\n lineStart = position - maxHalfLength + head.length;\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...';\n lineEnd = position + maxHalfLength - tail.length;\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '\u2192') + tail,\n pos: position - lineStart + head.length // relative position\n };\n}\n\n\nfunction padStart(string, max) {\n return common.repeat(' ', max - string.length) + string;\n}\n\n\nfunction makeSnippet(mark, options) {\n options = Object.create(options || null);\n\n if (!mark.buffer) return null;\n\n if (!options.maxLength) options.maxLength = 79;\n if (typeof options.indent !== 'number') options.indent = 1;\n if (typeof options.linesBefore !== 'number') options.linesBefore = 3;\n if (typeof options.linesAfter !== 'number') options.linesAfter = 2;\n\n var re = /\\r?\\n|\\r|\\0/g;\n var lineStarts = [ 0 ];\n var lineEnds = [];\n var match;\n var foundLineNo = -1;\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index);\n lineStarts.push(match.index + match[0].length);\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2;\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\n var result = '', i, line;\n var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;\n var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);\n\n for (i = 1; i <= options.linesBefore; i++) {\n if (foundLineNo - i < 0) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n );\n result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n' + result;\n }\n\n line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\\n';\n\n for (i = 1; i <= options.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n );\n result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n }\n\n return result.replace(/\\n$/, '');\n}\n\n\nvar snippet = makeSnippet;\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n 'kind',\n 'multi',\n 'resolve',\n 'construct',\n 'instanceOf',\n 'predicate',\n 'represent',\n 'representName',\n 'defaultStyle',\n 'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n 'scalar',\n 'sequence',\n 'mapping'\n];\n\nfunction compileStyleAliases(map) {\n var result = {};\n\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n\n return result;\n}\n\nfunction Type$1(tag, options) {\n options = options || {};\n\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.options = options; // keep original options in case user wants to extend this type later\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () { return true; };\n this.construct = options['construct'] || function (data) { return data; };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.representName = options['representName'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.multi = options['multi'] || false;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n}\n\nvar type = Type$1;\n\n/*eslint-disable max-len*/\n\n\n\n\n\nfunction compileList(schema, name) {\n var result = [];\n\n schema[name].forEach(function (currentType) {\n var newIndex = result.length;\n\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag &&\n previousType.kind === currentType.kind &&\n previousType.multi === currentType.multi) {\n\n newIndex = previousIndex;\n }\n });\n\n result[newIndex] = currentType;\n });\n\n return result;\n}\n\n\nfunction compileMap(/* lists... */) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {},\n multi: {\n scalar: [],\n sequence: [],\n mapping: [],\n fallback: []\n }\n }, index, length;\n\n function collectType(type) {\n if (type.multi) {\n result.multi[type.kind].push(type);\n result.multi['fallback'].push(type);\n } else {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n }\n\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n}\n\n\nfunction Schema$1(definition) {\n return this.extend(definition);\n}\n\n\nSchema$1.prototype.extend = function extend(definition) {\n var implicit = [];\n var explicit = [];\n\n if (definition instanceof type) {\n // Schema.extend(type)\n explicit.push(definition);\n\n } else if (Array.isArray(definition)) {\n // Schema.extend([ type1, type2, ... ])\n explicit = explicit.concat(definition);\n\n } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {\n // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })\n if (definition.implicit) implicit = implicit.concat(definition.implicit);\n if (definition.explicit) explicit = explicit.concat(definition.explicit);\n\n } else {\n throw new exception('Schema.extend argument should be a Type, [ Type ], ' +\n 'or a schema definition ({ implicit: [...], explicit: [...] })');\n }\n\n implicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n\n if (type$1.loadKind && type$1.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n\n if (type$1.multi) {\n throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');\n }\n });\n\n explicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n });\n\n var result = Object.create(Schema$1.prototype);\n\n result.implicit = (this.implicit || []).concat(implicit);\n result.explicit = (this.explicit || []).concat(explicit);\n\n result.compiledImplicit = compileList(result, 'implicit');\n result.compiledExplicit = compileList(result, 'explicit');\n result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);\n\n return result;\n};\n\n\nvar schema = Schema$1;\n\nvar str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function (data) { return data !== null ? data : ''; }\n});\n\nvar seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function (data) { return data !== null ? data : []; }\n});\n\nvar map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function (data) { return data !== null ? data : {}; }\n});\n\nvar failsafe = new schema({\n explicit: [\n str,\n seq,\n map\n ]\n});\n\nfunction resolveYamlNull(data) {\n if (data === null) return true;\n\n var max = data.length;\n\n return (max === 1 && data === '~') ||\n (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n return null;\n}\n\nfunction isNull(object) {\n return object === null;\n}\n\nvar _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function () { return '~'; },\n lowercase: function () { return 'null'; },\n uppercase: function () { return 'NULL'; },\n camelcase: function () { return 'Null'; },\n empty: function () { return ''; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction resolveYamlBoolean(data) {\n if (data === null) return false;\n\n var max = data.length;\n\n return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n return data === 'true' ||\n data === 'True' ||\n data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nvar bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function (object) { return object ? 'true' : 'false'; },\n uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n camelcase: function (object) { return object ? 'True' : 'False'; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction isHexCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n if (data === null) return false;\n\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n\n if (!max) return false;\n\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'x') {\n // base 16\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'o') {\n // base 8\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n }\n\n // base 10 (except 0)\n\n // value should not start with `_`;\n if (ch === '_') return false;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n return true;\n}\n\nfunction constructYamlInteger(data) {\n var value = data, sign = 1, ch;\n\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n\n ch = value[0];\n\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n\n if (value === '0') return 0;\n\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);\n if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);\n }\n\n return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n return (Object.prototype.toString.call(object)) === '[object Number]' &&\n (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nvar int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); },\n decimal: function (obj) { return obj.toString(10); },\n /* eslint-disable max-len */\n hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [ 2, 'bin' ],\n octal: [ 8, 'oct' ],\n decimal: [ 10, 'dec' ],\n hexadecimal: [ 16, 'hex' ]\n }\n});\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n if (data === null) return false;\n\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n\n return true;\n}\n\nfunction constructYamlFloat(data) {\n var value, sign;\n\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n\n if (value === '.inf') {\n return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n } else if (value === '.nan') {\n return NaN;\n }\n return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n var res;\n\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase': return '.nan';\n case 'uppercase': return '.NAN';\n case 'camelcase': return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '.inf';\n case 'uppercase': return '.INF';\n case 'camelcase': return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '-.inf';\n case 'uppercase': return '-.INF';\n case 'camelcase': return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n return (Object.prototype.toString.call(object) === '[object Number]') &&\n (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nvar float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n});\n\nvar json = failsafe.extend({\n implicit: [\n _null,\n bool,\n int,\n float\n ]\n});\n\nvar core = json;\n\nvar YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9])' + // [2] month\n '-([0-9][0-9])$'); // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9]?)' + // [2] month\n '-([0-9][0-9]?)' + // [3] day\n '(?:[Tt]|[ \\\\t]+)' + // ...\n '([0-9][0-9]?)' + // [4] hour\n ':([0-9][0-9])' + // [5] minute\n ':([0-9][0-9])' + // [6] second\n '(?:\\\\.([0-9]*))?' + // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n}\n\nfunction constructYamlTimestamp(data) {\n var match, year, month, day, hour, minute, second, fraction = 0,\n delta = null, tz_hour, tz_minute, date;\n\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +(match[1]);\n month = +(match[2]) - 1; // JS month starts with 0\n day = +(match[3]);\n\n if (!match[4]) { // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +(match[4]);\n minute = +(match[5]);\n second = +(match[6]);\n\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) { // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +(match[10]);\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n if (delta) date.setTime(date.getTime() - delta);\n\n return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n}\n\nvar timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n});\n\nfunction resolveYamlMerge(data) {\n return data === '<<' || data === null;\n}\n\nvar merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n});\n\n/*eslint-disable no-bitwise*/\n\n\n\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n if (data === null) return false;\n\n var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n var idx, tailbits,\n input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n }\n\n bits = (bits << 6) | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push((bits >> 10) & 0xFF);\n result.push((bits >> 2) & 0xFF);\n } else if (tailbits === 12) {\n result.push((bits >> 4) & 0xFF);\n }\n\n return new Uint8Array(result);\n}\n\nfunction representYamlBinary(object /*, style*/) {\n var result = '', bits = 0, idx, tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 3 === 0) && idx) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n }\n\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n\n if (tail === 0) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[(bits >> 10) & 0x3F];\n result += map[(bits >> 4) & 0x3F];\n result += map[(bits << 2) & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[(bits >> 2) & 0x3F];\n result += map[(bits << 4) & 0x3F];\n result += map[64];\n result += map[64];\n }\n\n return result;\n}\n\nfunction isBinary(obj) {\n return Object.prototype.toString.call(obj) === '[object Uint8Array]';\n}\n\nvar binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n});\n\nvar _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\nvar _toString$2 = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n if (data === null) return true;\n\n var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n object = data;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n\n if (_toString$2.call(pair) !== '[object Object]') return false;\n\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;\n else return false;\n }\n }\n\n if (!pairHasKey) return false;\n\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n else return false;\n }\n\n return true;\n}\n\nfunction constructYamlOmap(data) {\n return data !== null ? data : [];\n}\n\nvar omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n});\n\nvar _toString$1 = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n if (data === null) return true;\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n if (_toString$1.call(pair) !== '[object Object]') return false;\n\n keys = Object.keys(pair);\n\n if (keys.length !== 1) return false;\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return true;\n}\n\nfunction constructYamlPairs(data) {\n if (data === null) return [];\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n keys = Object.keys(pair);\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return result;\n}\n\nvar pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n});\n\nvar _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n if (data === null) return true;\n\n var key, object = data;\n\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n\n return true;\n}\n\nfunction constructYamlSet(data) {\n return data !== null ? data : {};\n}\n\nvar set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n});\n\nvar _default = core.extend({\n implicit: [\n timestamp,\n merge\n ],\n explicit: [\n binary,\n omap,\n pairs,\n set\n ]\n});\n\n/*eslint-disable max-len,no-use-before-define*/\n\n\n\n\n\n\n\nvar _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n\n\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n return (c === 0x09/* Tab */) ||\n (c === 0x20/* Space */) ||\n (c === 0x0A/* LF */) ||\n (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n var lc;\n\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n\n if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n return lc - 0x61 + 10;\n }\n\n return -1;\n}\n\nfunction escapedHexLen(c) {\n if (c === 0x78/* x */) { return 2; }\n if (c === 0x75/* u */) { return 4; }\n if (c === 0x55/* U */) { return 8; }\n return 0;\n}\n\nfunction fromDecimalCode(c) {\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return (c === 0x30/* 0 */) ? '\\x00' :\n (c === 0x61/* a */) ? '\\x07' :\n (c === 0x62/* b */) ? '\\x08' :\n (c === 0x74/* t */) ? '\\x09' :\n (c === 0x09/* Tab */) ? '\\x09' :\n (c === 0x6E/* n */) ? '\\x0A' :\n (c === 0x76/* v */) ? '\\x0B' :\n (c === 0x66/* f */) ? '\\x0C' :\n (c === 0x72/* r */) ? '\\x0D' :\n (c === 0x65/* e */) ? '\\x1B' :\n (c === 0x20/* Space */) ? ' ' :\n (c === 0x22/* \" */) ? '\\x22' :\n (c === 0x2F/* / */) ? '/' :\n (c === 0x5C/* \\ */) ? '\\x5C' :\n (c === 0x4E/* N */) ? '\\x85' :\n (c === 0x5F/* _ */) ? '\\xA0' :\n (c === 0x4C/* L */) ? '\\u2028' :\n (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n );\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State$1(input, options) {\n this.input = input;\n\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || _default;\n this.onWarning = options['onWarning'] || null;\n // (Hidden) Remove? makes the loader to expect YAML 1.1 documents\n // if such documents have no explicit %YAML directive\n this.legacy = options['legacy'] || false;\n\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n\n // position of first leading tab in the current line,\n // used to make sure there are no tabs in the indentation\n this.firstTabInLine = -1;\n\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n var mark = {\n name: state.filename,\n buffer: state.input.slice(0, -1), // omit trailing \\0\n position: state.position,\n line: state.line,\n column: state.position - state.lineStart\n };\n\n mark.snippet = snippet(mark);\n\n return new exception(message, mark);\n}\n\nfunction throwError(state, message) {\n throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n}\n\n\nvar directiveHandlers = {\n\n YAML: function handleYamlDirective(state, name, args) {\n\n var match, major, minor;\n\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n\n state.version = args[0];\n state.checkLineBreaks = (minor < 2);\n\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n\n TAG: function handleTagDirective(state, name, args) {\n\n var handle, prefix;\n\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n\n handle = args[0];\n prefix = args[1];\n\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n\n try {\n prefix = decodeURIComponent(prefix);\n } catch (err) {\n throwError(state, 'tag prefix is malformed: ' + prefix);\n }\n\n state.tagMap[handle] = prefix;\n }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n\n if (start < end) {\n _result = state.input.slice(start, end);\n\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 ||\n (0x20 <= _character && _character <= 0x10FFFF))) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n\n state.result += _result;\n }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n\n sourceKeys = Object.keys(source);\n\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n\n if (!_hasOwnProperty$1.call(destination, key)) {\n destination[key] = source[key];\n overridableKeys[key] = true;\n }\n }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,\n startLine, startLineStart, startPos) {\n\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n\n\n keyNode = String(keyNode);\n\n if (_result === null) {\n _result = {};\n }\n\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json &&\n !_hasOwnProperty$1.call(overridableKeys, keyNode) &&\n _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.lineStart = startLineStart || state.lineStart;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n\n // used for this specific key only because Object.defineProperty is slow\n if (keyNode === '__proto__') {\n Object.defineProperty(_result, keyNode, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: valueNode\n });\n } else {\n _result[keyNode] = valueNode;\n }\n delete overridableKeys[keyNode];\n }\n\n return _result;\n}\n\nfunction readLineBreak(state) {\n var ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x0A/* LF */) {\n state.position++;\n } else if (ch === 0x0D/* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n\n state.line += 1;\n state.lineStart = state.position;\n state.firstTabInLine = -1;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (allowComments && ch === 0x23/* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n }\n\n if (is_EOL(ch)) {\n readLineBreak(state);\n\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n\n return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(_position + 1) &&\n ch === state.input.charCodeAt(_position + 2)) {\n\n _position += 3;\n\n ch = state.input.charCodeAt(_position);\n\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (is_WS_OR_EOL(ch) ||\n is_FLOW_INDICATOR(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */) {\n return false;\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n\n while (ch !== 0) {\n if (ch === 0x3A/* : */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n\n } else if (ch === 0x23/* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n\n } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, captureEnd, false);\n\n if (state.result) {\n return true;\n }\n\n state.kind = _kind;\n state.result = _result;\n return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n var ch,\n captureStart, captureEnd;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x27/* ' */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27/* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x27/* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart,\n captureEnd,\n hexLength,\n hexResult,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x22/* \" */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22/* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n\n } else if (ch === 0x5C/* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n\n state.result += charFromCodepoint(hexResult);\n\n state.position++;\n\n } else {\n throwError(state, 'unknown escape sequence');\n }\n\n captureStart = captureEnd = state.position;\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _lineStart,\n _pos,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = Object.create(null),\n keyNode,\n keyTag,\n valueNode,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x5B/* [ */) {\n terminator = 0x5D;/* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B/* { */) {\n terminator = 0x7D;/* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n } else if (ch === 0x2C/* , */) {\n // \"flow collection entries can never be completely empty\", as per YAML 1.2, section 7.4\n throwError(state, \"expected the node content, but found ','\");\n }\n\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n\n if (ch === 0x3F/* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n\n _line = state.line; // Save the current line.\n _lineStart = state.lineStart;\n _pos = state.position;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));\n } else {\n _result.push(keyNode);\n }\n\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x2C/* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x7C/* | */) {\n folding = false;\n } else if (ch === 0x3E/* > */) {\n folding = true;\n } else {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n\n } else {\n break;\n }\n }\n\n if (is_WHITE_SPACE(ch)) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (is_WHITE_SPACE(ch));\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (!is_EOL(ch) && (ch !== 0));\n }\n }\n\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n\n ch = state.input.charCodeAt(state.position);\n\n while ((!detectedIndent || state.lineIndent < textIndent) &&\n (ch === 0x20/* Space */)) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) { // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) { // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n\n while (!is_EOL(ch) && (ch !== 0)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, state.position, false);\n }\n\n return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n if (ch !== 0x2D/* - */) {\n break;\n }\n\n following = state.input.charCodeAt(state.position + 1);\n\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n\n detected = true;\n state.position++;\n\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _keyLine,\n _keyLineStart,\n _keyPos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = Object.create(null),\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n\n if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n // Neither implicit nor explicit notation.\n // Reading is done. Go to the epilogue.\n break;\n }\n\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position);\n\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (atExplicitKey) {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n }\n\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n\n return detected;\n}\n\nfunction readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x21/* ! */) return false;\n\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n\n } else if (ch === 0x21/* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n\n } else {\n tagHandle = '!';\n }\n\n _position = state.position;\n\n if (isVerbatim) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && ch !== 0x3E/* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n tagName = state.input.slice(_position, state.position);\n\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n\n try {\n tagName = decodeURIComponent(tagName);\n } catch (err) {\n throwError(state, 'tag name is malformed: ' + tagName);\n }\n\n if (isVerbatim) {\n state.tag = tagName;\n\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n\n return true;\n}\n\nfunction readAnchorProperty(state) {\n var _position,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x26/* & */) return false;\n\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n\n state.anchor = state.input.slice(_position, state.position);\n return true;\n}\n\nfunction readAlias(state) {\n var _position, alias,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x2A/* * */) return false;\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n\n alias = state.input.slice(_position, state.position);\n\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n\n blockIndent = state.position - state.lineStart;\n\n if (indentStatus === 1) {\n if (allowBlockCollections &&\n (readBlockSequence(state, blockIndent) ||\n readBlockMapping(state, blockIndent, flowIndent)) ||\n readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n readSingleQuotedScalar(state, flowIndent) ||\n readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n\n } else if (readAlias(state)) {\n hasContent = true;\n\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n\n if (state.tag === null) {\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n\n } else if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"! [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for ! tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n\n if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (state.tag !== '!') {\n if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n } else {\n // looking for multi type\n type = null;\n typeList = state.typeMap.multi[state.kind || 'fallback'];\n\n for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {\n if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {\n type = typeList[typeIndex];\n break;\n }\n }\n }\n\n if (!type) {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n\n if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result, state.tag);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n }\n\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = Object.create(null);\n state.anchorMap = Object.create(null);\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n break;\n }\n\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && !is_EOL(ch));\n break;\n }\n\n if (is_EOL(ch)) break;\n\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n\n if (ch !== 0) readLineBreak(state);\n\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n\n skipSeparationSpace(state, true, -1);\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n\n if (state.checkLineBreaks &&\n PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n\n state.documents.push(state.result);\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n\n if (state.position < (state.length - 1)) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n}\n\n\nfunction loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n\n if (input.length !== 0) {\n\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n\n var state = new State$1(input, options);\n\n var nullpos = input.indexOf('\\0');\n\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n\n while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n\n while (state.position < (state.length - 1)) {\n readDocument(state);\n }\n\n return state.documents;\n}\n\n\nfunction loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n\n var documents = loadDocuments(input, options);\n\n if (typeof iterator !== 'function') {\n return documents;\n }\n\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n}\n\n\nfunction load$1(input, options) {\n var documents = loadDocuments(input, options);\n\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n}\n\n\nvar loadAll_1 = loadAll$1;\nvar load_1 = load$1;\n\nvar loader = {\n\tloadAll: loadAll_1,\n\tload: load_1\n};\n\n/*eslint-disable no-use-before-define*/\n\n\n\n\n\nvar _toString = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_BOM = 0xFEFF;\nvar CHAR_TAB = 0x09; /* Tab */\nvar CHAR_LINE_FEED = 0x0A; /* LF */\nvar CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\nvar CHAR_SPACE = 0x20; /* Space */\nvar CHAR_EXCLAMATION = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE = 0x22; /* \" */\nvar CHAR_SHARP = 0x23; /* # */\nvar CHAR_PERCENT = 0x25; /* % */\nvar CHAR_AMPERSAND = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE = 0x27; /* ' */\nvar CHAR_ASTERISK = 0x2A; /* * */\nvar CHAR_COMMA = 0x2C; /* , */\nvar CHAR_MINUS = 0x2D; /* - */\nvar CHAR_COLON = 0x3A; /* : */\nvar CHAR_EQUALS = 0x3D; /* = */\nvar CHAR_GREATER_THAN = 0x3E; /* > */\nvar CHAR_QUESTION = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00] = '\\\\0';\nESCAPE_SEQUENCES[0x07] = '\\\\a';\nESCAPE_SEQUENCES[0x08] = '\\\\b';\nESCAPE_SEQUENCES[0x09] = '\\\\t';\nESCAPE_SEQUENCES[0x0A] = '\\\\n';\nESCAPE_SEQUENCES[0x0B] = '\\\\v';\nESCAPE_SEQUENCES[0x0C] = '\\\\f';\nESCAPE_SEQUENCES[0x0D] = '\\\\r';\nESCAPE_SEQUENCES[0x1B] = '\\\\e';\nESCAPE_SEQUENCES[0x22] = '\\\\\"';\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85] = '\\\\N';\nESCAPE_SEQUENCES[0xA0] = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nvar DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;\n\nfunction compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n\n if (map === null) return {};\n\n result = {};\n keys = Object.keys(map);\n\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n\n result[tag] = style;\n }\n\n return result;\n}\n\nfunction encodeHex(character) {\n var string, handle, length;\n\n string = character.toString(16).toUpperCase();\n\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\n\nvar QUOTING_TYPE_SINGLE = 1,\n QUOTING_TYPE_DOUBLE = 2;\n\nfunction State(options) {\n this.schema = options['schema'] || _default;\n this.indent = Math.max(1, (options['indent'] || 2));\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.quotingType = options['quotingType'] === '\"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;\n this.forceQuotes = options['forceQuotes'] || false;\n this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n\n this.tag = null;\n this.result = '';\n\n this.duplicates = [];\n this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n\n if (line.length && line !== '\\n') result += ind;\n\n result += line;\n }\n\n return result;\n}\n\nfunction generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n var index, length, type;\n\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n\n if (type.resolve(str)) {\n return true;\n }\n }\n\n return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn\u2019t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n return (0x00020 <= c && c <= 0x00007E)\n || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)\n || (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace(c) {\n return isPrintable(c)\n && c !== CHAR_BOM\n // - b-char\n && c !== CHAR_CARRIAGE_RETURN\n && c !== CHAR_LINE_FEED;\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out \u21D2 ns-plain-safe-out\n// c = flow-in \u21D2 ns-plain-safe-in\n// c = block-key \u21D2 ns-plain-safe-out\n// c = flow-key \u21D2 ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - \u201C:\u201D - \u201C#\u201D )\n// | ( /* An ns-char preceding */ \u201C#\u201D )\n// | ( \u201C:\u201D /* Followed by an ns-plain-safe(c) */ )\nfunction isPlainSafe(c, prev, inblock) {\n var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n return (\n // ns-plain-safe\n inblock ? // c = flow-in\n cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace\n // - c-flow-indicator\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n )\n // ns-plain-char\n && c !== CHAR_SHARP // false on '#'\n && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '\n || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'\n || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( \u201C?\u201D | \u201C:\u201D | \u201C-\u201D ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) && c !== CHAR_BOM\n && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // \u201C-\u201D | \u201C?\u201D | \u201C:\u201D | \u201C,\u201D | \u201C[\u201D | \u201C]\u201D | \u201C{\u201D | \u201C}\u201D\n && c !== CHAR_MINUS\n && c !== CHAR_QUESTION\n && c !== CHAR_COLON\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n // | \u201C#\u201D | \u201C&\u201D | \u201C*\u201D | \u201C!\u201D | \u201C|\u201D | \u201C=\u201D | \u201C>\u201D | \u201C'\u201D | \u201C\"\u201D\n && c !== CHAR_SHARP\n && c !== CHAR_AMPERSAND\n && c !== CHAR_ASTERISK\n && c !== CHAR_EXCLAMATION\n && c !== CHAR_VERTICAL_LINE\n && c !== CHAR_EQUALS\n && c !== CHAR_GREATER_THAN\n && c !== CHAR_SINGLE_QUOTE\n && c !== CHAR_DOUBLE_QUOTE\n // | \u201C%\u201D | \u201C@\u201D | \u201C`\u201D)\n && c !== CHAR_PERCENT\n && c !== CHAR_COMMERCIAL_AT\n && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast(c) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON;\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt(string, pos) {\n var first = string.charCodeAt(pos), second;\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,\n testAmbiguousType, quotingType, forceQuotes, inblock) {\n\n var i;\n var char = 0;\n var prevChar = null;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(codePointAt(string, 0))\n && isPlainSafeLast(codePointAt(string, string.length - 1));\n\n if (singleLineOnly || forceQuotes) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ');\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '));\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n if (plain && !forceQuotes && !testAmbiguousType(string)) {\n return STYLE_PLAIN;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n if (!forceQuotes) {\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// \u2022 No ending newline => unaffected; already using strip \"-\" chomping.\n// \u2022 Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey, inblock) {\n state.dump = (function () {\n if (string.length === 0) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? '\"\"' : \"''\";\n }\n if (!state.noCompatMode) {\n if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? ('\"' + string + '\"') : (\"'\" + string + \"'\");\n }\n }\n\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth \u2264 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1\n ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || (state.flowLevel > -1 && level >= state.flowLevel);\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,\n testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {\n\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : (clip ? '' : '-');\n\n return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines\u2014\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = (function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }());\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while ((match = lineRe.exec(string))) {\n var prefix = match[1], line = match[2];\n moreIndented = (line[0] === ' ');\n result += prefix\n + (!prevMoreIndented && !moreIndented && line !== ''\n ? '\\n' : '')\n + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n\n return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0, end, curr = 0, next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n\n return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n var result = '';\n var char = 0;\n var escapeSeq;\n\n for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n escapeSeq = ESCAPE_SEQUENCES[char];\n\n if (!escapeSeq && isPrintable(char)) {\n result += string[i];\n if (char >= 0x10000) result += string[i + 1];\n } else {\n result += escapeSeq || encodeHex(char);\n }\n }\n\n return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level, value, false, false) ||\n (typeof value === 'undefined' &&\n writeNode(state, level, null, false, false))) {\n\n if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level + 1, value, true, true, false, true) ||\n (typeof value === 'undefined' &&\n writeNode(state, level + 1, null, true, true, false, true))) {\n\n if (!compact || _result !== '') {\n _result += generateNextLine(state, level);\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n\n pairBuffer = '';\n if (_result !== '') pairBuffer += ', ';\n\n if (state.condenseFlow) pairBuffer += '\"';\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n\n if (!compact || _result !== '') {\n pairBuffer += generateNextLine(state, level);\n }\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = (state.tag !== null && state.tag !== '?') ||\n (state.dump && state.dump.length > 1024);\n\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n\n pairBuffer += state.dump;\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n\n if ((type.instanceOf || type.predicate) &&\n (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n (!type.predicate || type.predicate(object))) {\n\n if (explicit) {\n if (type.multi && type.representName) {\n state.tag = type.representName(object);\n } else {\n state.tag = type.tag;\n }\n } else {\n state.tag = '?';\n }\n\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n\n state.dump = _result;\n }\n\n return true;\n }\n }\n\n return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey, isblockseq) {\n state.tag = null;\n state.dump = object;\n\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n\n var type = _toString.call(state.dump);\n var inblock = block;\n var tagStr;\n\n if (block) {\n block = (state.flowLevel < 0 || state.flowLevel > level);\n }\n\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n\n if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n compact = false;\n }\n\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && (Object.keys(state.dump).length !== 0)) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n if (block && (state.dump.length !== 0)) {\n if (state.noArrayIndent && !isblockseq && level > 0) {\n writeBlockSequence(state, level - 1, state.dump, compact);\n } else {\n writeBlockSequence(state, level, state.dump, compact);\n }\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey, inblock);\n }\n } else if (type === '[object Undefined]') {\n return false;\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n\n if (state.tag !== null && state.tag !== '?') {\n // Need to encode all characters except those allowed by the spec:\n //\n // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */\n // [36] ns-hex-digit ::= ns-dec-digit\n // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */\n // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */\n // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | \u201C-\u201D\n // [39] ns-uri-char ::= \u201C%\u201D ns-hex-digit ns-hex-digit | ns-word-char | \u201C#\u201D\n // | \u201C;\u201D | \u201C/\u201D | \u201C?\u201D | \u201C:\u201D | \u201C@\u201D | \u201C&\u201D | \u201C=\u201D | \u201C+\u201D | \u201C$\u201D | \u201C,\u201D\n // | \u201C_\u201D | \u201C.\u201D | \u201C!\u201D | \u201C~\u201D | \u201C*\u201D | \u201C'\u201D | \u201C(\u201D | \u201C)\u201D | \u201C[\u201D | \u201C]\u201D\n //\n // Also need to encode '!' because it has special meaning (end of tag prefix).\n //\n tagStr = encodeURI(\n state.tag[0] === '!' ? state.tag.slice(1) : state.tag\n ).replace(/!/g, '%21');\n\n if (state.tag[0] === '!') {\n tagStr = '!' + tagStr;\n } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {\n tagStr = '!!' + tagStr.slice(18);\n } else {\n tagStr = '!<' + tagStr + '>';\n }\n\n state.dump = tagStr + ' ' + state.dump;\n }\n }\n\n return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n\n inspectNode(object, objects, duplicatesIndexes);\n\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList,\n index,\n length;\n\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n}\n\nfunction dump$1(input, options) {\n options = options || {};\n\n var state = new State(options);\n\n if (!state.noRefs) getDuplicateReferences(input, state);\n\n var value = input;\n\n if (state.replacer) {\n value = state.replacer.call({ '': value }, '', value);\n }\n\n if (writeNode(state, 0, value, true, true)) return state.dump + '\\n';\n\n return '';\n}\n\nvar dump_1 = dump$1;\n\nvar dumper = {\n\tdump: dump_1\n};\n\nfunction renamed(from, to) {\n return function () {\n throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +\n 'Use yaml.' + to + ' instead, which is now safe by default.');\n };\n}\n\n\nvar Type = type;\nvar Schema = schema;\nvar FAILSAFE_SCHEMA = failsafe;\nvar JSON_SCHEMA = json;\nvar CORE_SCHEMA = core;\nvar DEFAULT_SCHEMA = _default;\nvar load = loader.load;\nvar loadAll = loader.loadAll;\nvar dump = dumper.dump;\nvar YAMLException = exception;\n\n// Re-export all types in case user wants to create custom schema\nvar types = {\n binary: binary,\n float: float,\n map: map,\n null: _null,\n pairs: pairs,\n set: set,\n timestamp: timestamp,\n bool: bool,\n int: int,\n merge: merge,\n omap: omap,\n seq: seq,\n str: str\n};\n\n// Removed functions from JS-YAML 3.0.x\nvar safeLoad = renamed('safeLoad', 'load');\nvar safeLoadAll = renamed('safeLoadAll', 'loadAll');\nvar safeDump = renamed('safeDump', 'dump');\n\nvar jsYaml = {\n\tType: Type,\n\tSchema: Schema,\n\tFAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n\tJSON_SCHEMA: JSON_SCHEMA,\n\tCORE_SCHEMA: CORE_SCHEMA,\n\tDEFAULT_SCHEMA: DEFAULT_SCHEMA,\n\tload: load,\n\tloadAll: loadAll,\n\tdump: dump,\n\tYAMLException: YAMLException,\n\ttypes: types,\n\tsafeLoad: safeLoad,\n\tsafeLoadAll: safeLoadAll,\n\tsafeDump: safeDump\n};\n\nexport default jsYaml;\nexport { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };\n"], + "mappings": "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", + "names": ["exception", "map", "schema", "type", "extend", "str", "string"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-N4CR4FBY.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-N4CR4FBY.mjs new file mode 100644 index 0000000..4eaa75c --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-N4CR4FBY.mjs @@ -0,0 +1,86 @@ +import { + insertEdge, + insertEdgeLabel, + markers_default, + positionEdgeLabel +} from "./chunk-QXUST7PY.mjs"; +import { + insertCluster, + insertNode, + labelHelper +} from "./chunk-JZLCHNYA.mjs"; +import { + interpolateToCurve +} from "./chunk-S3R3BYOJ.mjs"; +import { + common_default, + getConfig +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/internals.ts +var internalHelpers = { + common: common_default, + getConfig, + insertCluster, + insertEdge, + insertEdgeLabel, + insertMarkers: markers_default, + insertNode, + interpolateToCurve, + labelHelper, + log, + positionEdgeLabel +}; + +// src/rendering-util/render.ts +var layoutAlgorithms = {}; +var registerLayoutLoaders = /* @__PURE__ */ __name((loaders) => { + for (const loader of loaders) { + layoutAlgorithms[loader.name] = loader; + } +}, "registerLayoutLoaders"); +var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => { + registerLayoutLoaders([ + { + name: "dagre", + loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP.mjs"), "loader") + }, + ...true ? [ + { + name: "cose-bilkent", + loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A.mjs"), "loader") + } + ] : [] + ]); +}, "registerDefaultLayoutLoaders"); +registerDefaultLayoutLoaders(); +var render = /* @__PURE__ */ __name(async (data4Layout, svg) => { + if (!(data4Layout.layoutAlgorithm in layoutAlgorithms)) { + throw new Error(`Unknown layout algorithm: ${data4Layout.layoutAlgorithm}`); + } + const layoutDefinition = layoutAlgorithms[data4Layout.layoutAlgorithm]; + const layoutRenderer = await layoutDefinition.loader(); + return layoutRenderer.render(data4Layout, svg, internalHelpers, { + algorithm: layoutDefinition.algorithm + }); +}, "render"); +var getRegisteredLayoutAlgorithm = /* @__PURE__ */ __name((algorithm = "", { fallback = "dagre" } = {}) => { + if (algorithm in layoutAlgorithms) { + return algorithm; + } + if (fallback in layoutAlgorithms) { + log.warn(`Layout algorithm ${algorithm} is not registered. Using ${fallback} as fallback.`); + return fallback; + } + throw new Error(`Both layout algorithms ${algorithm} and ${fallback} are not registered.`); +}, "getRegisteredLayoutAlgorithm"); + +export { + registerLayoutLoaders, + render, + getRegisteredLayoutAlgorithm +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-N4CR4FBY.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-N4CR4FBY.mjs.map new file mode 100644 index 0000000..5dbdaf1 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-N4CR4FBY.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/internals.ts", "../../../src/rendering-util/render.ts"], + "sourcesContent": ["import { getConfig } from './config.js';\nimport common from './diagrams/common/common.js';\nimport { log } from './logger.js';\nimport { insertCluster } from './rendering-util/rendering-elements/clusters.js';\nimport {\n insertEdge,\n insertEdgeLabel,\n positionEdgeLabel,\n} from './rendering-util/rendering-elements/edges.js';\nimport insertMarkers from './rendering-util/rendering-elements/markers.js';\nimport { insertNode } from './rendering-util/rendering-elements/nodes.js';\nimport { labelHelper } from './rendering-util/rendering-elements/shapes/util.js';\nimport { interpolateToCurve } from './utils.js';\n\n/**\n * Internal helpers for mermaid\n * @deprecated - This should not be used by external packages, as the definitions will change without notice.\n */\nexport const internalHelpers = {\n common,\n getConfig,\n insertCluster,\n insertEdge,\n insertEdgeLabel,\n insertMarkers,\n insertNode,\n interpolateToCurve,\n labelHelper,\n log,\n positionEdgeLabel,\n};\n\nexport type InternalHelpers = typeof internalHelpers;\n", "import type { SVG } from '../diagram-api/types.js';\nimport type { InternalHelpers } from '../internals.js';\nimport { internalHelpers } from '../internals.js';\nimport { log } from '../logger.js';\nimport type { LayoutData } from './types.js';\n\n// console.log('MUST be removed, this only for keeping dev server working');\n// import tmp from './layout-algorithms/dagre/index.js';\n\nexport interface RenderOptions {\n algorithm?: string;\n}\n\nexport interface LayoutAlgorithm {\n render(\n layoutData: LayoutData,\n svg: SVG,\n helpers: InternalHelpers,\n options?: RenderOptions\n ): Promise;\n}\n\nexport type LayoutLoader = () => Promise;\nexport interface LayoutLoaderDefinition {\n name: string;\n loader: LayoutLoader;\n algorithm?: string;\n}\n\nconst layoutAlgorithms: Record = {};\n\nexport const registerLayoutLoaders = (loaders: LayoutLoaderDefinition[]) => {\n for (const loader of loaders) {\n layoutAlgorithms[loader.name] = loader;\n }\n};\n\n// TODO: Should we load dagre without lazy loading?\nconst registerDefaultLayoutLoaders = () => {\n registerLayoutLoaders([\n {\n name: 'dagre',\n loader: async () => await import('./layout-algorithms/dagre/index.js'),\n },\n ...(includeLargeFeatures\n ? [\n {\n name: 'cose-bilkent',\n loader: async () => await import('./layout-algorithms/cose-bilkent/index.js'),\n },\n ]\n : []),\n ]);\n};\n\nregisterDefaultLayoutLoaders();\n\nexport const render = async (data4Layout: LayoutData, svg: SVG) => {\n if (!(data4Layout.layoutAlgorithm in layoutAlgorithms)) {\n throw new Error(`Unknown layout algorithm: ${data4Layout.layoutAlgorithm}`);\n }\n\n const layoutDefinition = layoutAlgorithms[data4Layout.layoutAlgorithm];\n const layoutRenderer = await layoutDefinition.loader();\n return layoutRenderer.render(data4Layout, svg, internalHelpers, {\n algorithm: layoutDefinition.algorithm,\n });\n};\n\n/**\n * Get the registered layout algorithm. If the algorithm is not registered, use the fallback algorithm.\n */\nexport const getRegisteredLayoutAlgorithm = (algorithm = '', { fallback = 'dagre' } = {}) => {\n if (algorithm in layoutAlgorithms) {\n return algorithm;\n }\n if (fallback in layoutAlgorithms) {\n log.warn(`Layout algorithm ${algorithm} is not registered. Using ${fallback} as fallback.`);\n return fallback;\n }\n throw new Error(`Both layout algorithms ${algorithm} and ${fallback} are not registered.`);\n};\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAkBO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACDA,IAAM,mBAA2D,CAAC;AAE3D,IAAM,wBAAwB,wBAAC,YAAsC;AAC1E,aAAW,UAAU,SAAS;AAC5B,qBAAiB,OAAO,IAAI,IAAI;AAAA,EAClC;AACF,GAJqC;AAOrC,IAAM,+BAA+B,6BAAM;AACzC,wBAAsB;AAAA,IACpB;AAAA,MACE,MAAM;AAAA,MACN,QAAQ,mCAAY,MAAM,OAAO,sBAAoC,GAA7D;AAAA,IACV;AAAA,IACA,GAAI,OACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,QAAQ,mCAAY,MAAM,OAAO,6BAA2C,GAApE;AAAA,MACV;AAAA,IACF,IACA,CAAC;AAAA,EACP,CAAC;AACH,GAfqC;AAiBrC,6BAA6B;AAEtB,IAAM,SAAS,8BAAO,aAAyB,QAAa;AACjE,MAAI,EAAE,YAAY,mBAAmB,mBAAmB;AACtD,UAAM,IAAI,MAAM,6BAA6B,YAAY,eAAe,EAAE;AAAA,EAC5E;AAEA,QAAM,mBAAmB,iBAAiB,YAAY,eAAe;AACrE,QAAM,iBAAiB,MAAM,iBAAiB,OAAO;AACrD,SAAO,eAAe,OAAO,aAAa,KAAK,iBAAiB;AAAA,IAC9D,WAAW,iBAAiB;AAAA,EAC9B,CAAC;AACH,GAVsB;AAef,IAAM,+BAA+B,wBAAC,YAAY,IAAI,EAAE,WAAW,QAAQ,IAAI,CAAC,MAAM;AAC3F,MAAI,aAAa,kBAAkB;AACjC,WAAO;AAAA,EACT;AACA,MAAI,YAAY,kBAAkB;AAChC,QAAI,KAAK,oBAAoB,SAAS,6BAA6B,QAAQ,eAAe;AAC1F,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,0BAA0B,SAAS,QAAQ,QAAQ,sBAAsB;AAC3F,GAT4C;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QN33PNHL.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QN33PNHL.mjs new file mode 100644 index 0000000..6e8da07 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QN33PNHL.mjs @@ -0,0 +1,33 @@ +import { + configureSvgSize +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/rendering-util/setupViewPortForSVG.ts +var setupViewPortForSVG = /* @__PURE__ */ __name((svg, padding, cssDiagram, useMaxWidth) => { + svg.attr("class", cssDiagram); + const { width, height, x, y } = calculateDimensionsWithPadding(svg, padding); + configureSvgSize(svg, height, width, useMaxWidth); + const viewBox = createViewBox(x, y, width, height, padding); + svg.attr("viewBox", viewBox); + log.debug(`viewBox configured: ${viewBox} with padding: ${padding}`); +}, "setupViewPortForSVG"); +var calculateDimensionsWithPadding = /* @__PURE__ */ __name((svg, padding) => { + const bounds = svg.node()?.getBBox() || { width: 0, height: 0, x: 0, y: 0 }; + return { + width: bounds.width + padding * 2, + height: bounds.height + padding * 2, + x: bounds.x, + y: bounds.y + }; +}, "calculateDimensionsWithPadding"); +var createViewBox = /* @__PURE__ */ __name((x, y, width, height, padding) => { + return `${x - padding} ${y - padding} ${width} ${height}`; +}, "createViewBox"); + +export { + setupViewPortForSVG +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QN33PNHL.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QN33PNHL.mjs.map new file mode 100644 index 0000000..c2ea43a --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QN33PNHL.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/rendering-util/setupViewPortForSVG.ts"], + "sourcesContent": ["import { configureSvgSize } from '../setupGraphViewbox.js';\nimport type { SVG } from '../diagram-api/types.js';\nimport { log } from '../logger.js';\n\nexport const setupViewPortForSVG = (\n svg: SVG,\n padding: number,\n cssDiagram: string,\n useMaxWidth: boolean\n) => {\n // Initialize the SVG element and set the diagram class\n svg.attr('class', cssDiagram);\n\n // Calculate the dimensions and position with padding\n const { width, height, x, y } = calculateDimensionsWithPadding(svg, padding);\n\n // Configure the size and aspect ratio of the SVG\n configureSvgSize(svg, height, width, useMaxWidth);\n\n // Update the viewBox to ensure all content is visible with padding\n const viewBox = createViewBox(x, y, width, height, padding);\n svg.attr('viewBox', viewBox);\n\n // Log the viewBox configuration for debugging\n log.debug(`viewBox configured: ${viewBox} with padding: ${padding}`);\n};\n\nconst calculateDimensionsWithPadding = (svg: SVG, padding: number) => {\n const bounds = svg.node()?.getBBox() || { width: 0, height: 0, x: 0, y: 0 };\n return {\n width: bounds.width + padding * 2,\n height: bounds.height + padding * 2,\n x: bounds.x,\n y: bounds.y,\n };\n};\n\nconst createViewBox = (x: number, y: number, width: number, height: number, padding: number) => {\n return `${x - padding} ${y - padding} ${width} ${height}`;\n};\n"], + "mappings": ";;;;;;;;;AAIO,IAAM,sBAAsB,wBACjC,KACA,SACA,YACA,gBACG;AAEH,MAAI,KAAK,SAAS,UAAU;AAG5B,QAAM,EAAE,OAAO,QAAQ,GAAG,EAAE,IAAI,+BAA+B,KAAK,OAAO;AAG3E,mBAAiB,KAAK,QAAQ,OAAO,WAAW;AAGhD,QAAM,UAAU,cAAc,GAAG,GAAG,OAAO,QAAQ,OAAO;AAC1D,MAAI,KAAK,WAAW,OAAO;AAG3B,MAAI,MAAM,uBAAuB,OAAO,kBAAkB,OAAO,EAAE;AACrE,GArBmC;AAuBnC,IAAM,iCAAiC,wBAAC,KAAU,YAAoB;AACpE,QAAM,SAAS,IAAI,KAAK,GAAG,QAAQ,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,GAAG,GAAG,GAAG,EAAE;AAC1E,SAAO;AAAA,IACL,OAAO,OAAO,QAAQ,UAAU;AAAA,IAChC,QAAQ,OAAO,SAAS,UAAU;AAAA,IAClC,GAAG,OAAO;AAAA,IACV,GAAG,OAAO;AAAA,EACZ;AACF,GARuC;AAUvC,IAAM,gBAAgB,wBAAC,GAAW,GAAW,OAAe,QAAgB,YAAoB;AAC9F,SAAO,GAAG,IAAI,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,MAAM;AACzD,GAFsB;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QXUST7PY.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QXUST7PY.mjs new file mode 100644 index 0000000..3f9c938 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QXUST7PY.mjs @@ -0,0 +1,854 @@ +import { + getLineFunctionsWithOffset, + markerOffsets, + markerOffsets2 +} from "./chunk-HN2XXSSU.mjs"; +import { + createLabel_default +} from "./chunk-JZLCHNYA.mjs"; +import { + getSubGraphTitleMargins +} from "./chunk-CVBHYZKI.mjs"; +import { + isLabelStyle, + styles2String +} from "./chunk-ATLVNIR6.mjs"; +import { + createText +} from "./chunk-JA3XYJ7Z.mjs"; +import { + utils_default +} from "./chunk-S3R3BYOJ.mjs"; +import { + evaluate, + getConfig2 as getConfig +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/rendering-util/rendering-elements/edges.js +import { + curveBasis, + curveLinear, + curveCardinal, + curveBumpX, + curveBumpY, + curveCatmullRom, + curveMonotoneX, + curveMonotoneY, + curveNatural, + curveStep, + curveStepAfter, + curveStepBefore, + line, + select +} from "d3"; +import rough from "roughjs"; + +// src/rendering-util/rendering-elements/edgeMarker.ts +var addEdgeMarkers = /* @__PURE__ */ __name((svgPath, edge, url, id, diagramType, strokeColor) => { + if (edge.arrowTypeStart) { + addEdgeMarker(svgPath, "start", edge.arrowTypeStart, url, id, diagramType, strokeColor); + } + if (edge.arrowTypeEnd) { + addEdgeMarker(svgPath, "end", edge.arrowTypeEnd, url, id, diagramType, strokeColor); + } +}, "addEdgeMarkers"); +var arrowTypesMap = { + arrow_cross: { type: "cross", fill: false }, + arrow_point: { type: "point", fill: true }, + arrow_barb: { type: "barb", fill: true }, + arrow_circle: { type: "circle", fill: false }, + aggregation: { type: "aggregation", fill: false }, + extension: { type: "extension", fill: false }, + composition: { type: "composition", fill: true }, + dependency: { type: "dependency", fill: true }, + lollipop: { type: "lollipop", fill: false }, + only_one: { type: "onlyOne", fill: false }, + zero_or_one: { type: "zeroOrOne", fill: false }, + one_or_more: { type: "oneOrMore", fill: false }, + zero_or_more: { type: "zeroOrMore", fill: false }, + requirement_arrow: { type: "requirement_arrow", fill: false }, + requirement_contains: { type: "requirement_contains", fill: false } +}; +var addEdgeMarker = /* @__PURE__ */ __name((svgPath, position, arrowType, url, id, diagramType, strokeColor) => { + const arrowTypeInfo = arrowTypesMap[arrowType]; + if (!arrowTypeInfo) { + log.warn(`Unknown arrow type: ${arrowType}`); + return; + } + const endMarkerType = arrowTypeInfo.type; + const suffix = position === "start" ? "Start" : "End"; + const originalMarkerId = `${id}_${diagramType}-${endMarkerType}${suffix}`; + if (strokeColor && strokeColor.trim() !== "") { + const colorId = strokeColor.replace(/[^\dA-Za-z]/g, "_"); + const coloredMarkerId = `${originalMarkerId}_${colorId}`; + if (!document.getElementById(coloredMarkerId)) { + const originalMarker = document.getElementById(originalMarkerId); + if (originalMarker) { + const coloredMarker = originalMarker.cloneNode(true); + coloredMarker.id = coloredMarkerId; + const paths = coloredMarker.querySelectorAll("path, circle, line"); + paths.forEach((path) => { + path.setAttribute("stroke", strokeColor); + if (arrowTypeInfo.fill) { + path.setAttribute("fill", strokeColor); + } + }); + originalMarker.parentNode?.appendChild(coloredMarker); + } + } + svgPath.attr(`marker-${position}`, `url(${url}#${coloredMarkerId})`); + } else { + svgPath.attr(`marker-${position}`, `url(${url}#${originalMarkerId})`); + } +}, "addEdgeMarker"); + +// src/rendering-util/rendering-elements/edges.js +var edgeLabels = /* @__PURE__ */ new Map(); +var terminalLabels = /* @__PURE__ */ new Map(); +var clear = /* @__PURE__ */ __name(() => { + edgeLabels.clear(); + terminalLabels.clear(); +}, "clear"); +var getLabelStyles = /* @__PURE__ */ __name((styleArray) => { + let styles = styleArray ? styleArray.reduce((acc, style) => acc + ";" + style, "") : ""; + return styles; +}, "getLabelStyles"); +var insertEdgeLabel = /* @__PURE__ */ __name(async (elem, edge) => { + let useHtmlLabels = evaluate(getConfig().flowchart.htmlLabels); + const { labelStyles } = styles2String(edge); + edge.labelStyle = labelStyles; + const labelElement = await createText(elem, edge.label, { + style: edge.labelStyle, + useHtmlLabels, + addSvgBackground: true, + isNode: false + }); + log.info("abc82", edge, edge.labelType); + const edgeLabel = elem.insert("g").attr("class", "edgeLabel"); + const label = edgeLabel.insert("g").attr("class", "label").attr("data-id", edge.id); + label.node().appendChild(labelElement); + let bbox = labelElement.getBBox(); + if (useHtmlLabels) { + const div = labelElement.children[0]; + const dv = select(labelElement); + bbox = div.getBoundingClientRect(); + dv.attr("width", bbox.width); + dv.attr("height", bbox.height); + } + label.attr("transform", "translate(" + -bbox.width / 2 + ", " + -bbox.height / 2 + ")"); + edgeLabels.set(edge.id, edgeLabel); + edge.width = bbox.width; + edge.height = bbox.height; + let fo; + if (edge.startLabelLeft) { + const startLabelElement = await createLabel_default( + edge.startLabelLeft, + getLabelStyles(edge.labelStyle) + ); + const startEdgeLabelLeft = elem.insert("g").attr("class", "edgeTerminals"); + const inner = startEdgeLabelLeft.insert("g").attr("class", "inner"); + fo = inner.node().appendChild(startLabelElement); + const slBox = startLabelElement.getBBox(); + inner.attr("transform", "translate(" + -slBox.width / 2 + ", " + -slBox.height / 2 + ")"); + if (!terminalLabels.get(edge.id)) { + terminalLabels.set(edge.id, {}); + } + terminalLabels.get(edge.id).startLeft = startEdgeLabelLeft; + setTerminalWidth(fo, edge.startLabelLeft); + } + if (edge.startLabelRight) { + const startLabelElement = await createLabel_default( + edge.startLabelRight, + getLabelStyles(edge.labelStyle) + ); + const startEdgeLabelRight = elem.insert("g").attr("class", "edgeTerminals"); + const inner = startEdgeLabelRight.insert("g").attr("class", "inner"); + fo = startEdgeLabelRight.node().appendChild(startLabelElement); + inner.node().appendChild(startLabelElement); + const slBox = startLabelElement.getBBox(); + inner.attr("transform", "translate(" + -slBox.width / 2 + ", " + -slBox.height / 2 + ")"); + if (!terminalLabels.get(edge.id)) { + terminalLabels.set(edge.id, {}); + } + terminalLabels.get(edge.id).startRight = startEdgeLabelRight; + setTerminalWidth(fo, edge.startLabelRight); + } + if (edge.endLabelLeft) { + const endLabelElement = await createLabel_default(edge.endLabelLeft, getLabelStyles(edge.labelStyle)); + const endEdgeLabelLeft = elem.insert("g").attr("class", "edgeTerminals"); + const inner = endEdgeLabelLeft.insert("g").attr("class", "inner"); + fo = inner.node().appendChild(endLabelElement); + const slBox = endLabelElement.getBBox(); + inner.attr("transform", "translate(" + -slBox.width / 2 + ", " + -slBox.height / 2 + ")"); + endEdgeLabelLeft.node().appendChild(endLabelElement); + if (!terminalLabels.get(edge.id)) { + terminalLabels.set(edge.id, {}); + } + terminalLabels.get(edge.id).endLeft = endEdgeLabelLeft; + setTerminalWidth(fo, edge.endLabelLeft); + } + if (edge.endLabelRight) { + const endLabelElement = await createLabel_default(edge.endLabelRight, getLabelStyles(edge.labelStyle)); + const endEdgeLabelRight = elem.insert("g").attr("class", "edgeTerminals"); + const inner = endEdgeLabelRight.insert("g").attr("class", "inner"); + fo = inner.node().appendChild(endLabelElement); + const slBox = endLabelElement.getBBox(); + inner.attr("transform", "translate(" + -slBox.width / 2 + ", " + -slBox.height / 2 + ")"); + endEdgeLabelRight.node().appendChild(endLabelElement); + if (!terminalLabels.get(edge.id)) { + terminalLabels.set(edge.id, {}); + } + terminalLabels.get(edge.id).endRight = endEdgeLabelRight; + setTerminalWidth(fo, edge.endLabelRight); + } + return labelElement; +}, "insertEdgeLabel"); +function setTerminalWidth(fo, value) { + if (getConfig().flowchart.htmlLabels && fo) { + fo.style.width = value.length * 9 + "px"; + fo.style.height = "12px"; + } +} +__name(setTerminalWidth, "setTerminalWidth"); +var positionEdgeLabel = /* @__PURE__ */ __name((edge, paths) => { + log.debug("Moving label abc88 ", edge.id, edge.label, edgeLabels.get(edge.id), paths); + let path = paths.updatedPath ? paths.updatedPath : paths.originalPath; + const siteConfig = getConfig(); + const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig); + if (edge.label) { + const el = edgeLabels.get(edge.id); + let x = edge.x; + let y = edge.y; + if (path) { + const pos = utils_default.calcLabelPosition(path); + log.debug( + "Moving label " + edge.label + " from (", + x, + ",", + y, + ") to (", + pos.x, + ",", + pos.y, + ") abc88" + ); + if (paths.updatedPath) { + x = pos.x; + y = pos.y; + } + } + el.attr("transform", `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`); + } + if (edge.startLabelLeft) { + const el = terminalLabels.get(edge.id).startLeft; + let x = edge.x; + let y = edge.y; + if (path) { + const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeStart ? 10 : 0, "start_left", path); + x = pos.x; + y = pos.y; + } + el.attr("transform", `translate(${x}, ${y})`); + } + if (edge.startLabelRight) { + const el = terminalLabels.get(edge.id).startRight; + let x = edge.x; + let y = edge.y; + if (path) { + const pos = utils_default.calcTerminalLabelPosition( + edge.arrowTypeStart ? 10 : 0, + "start_right", + path + ); + x = pos.x; + y = pos.y; + } + el.attr("transform", `translate(${x}, ${y})`); + } + if (edge.endLabelLeft) { + const el = terminalLabels.get(edge.id).endLeft; + let x = edge.x; + let y = edge.y; + if (path) { + const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, "end_left", path); + x = pos.x; + y = pos.y; + } + el.attr("transform", `translate(${x}, ${y})`); + } + if (edge.endLabelRight) { + const el = terminalLabels.get(edge.id).endRight; + let x = edge.x; + let y = edge.y; + if (path) { + const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, "end_right", path); + x = pos.x; + y = pos.y; + } + el.attr("transform", `translate(${x}, ${y})`); + } +}, "positionEdgeLabel"); +var outsideNode = /* @__PURE__ */ __name((node, point2) => { + const x = node.x; + const y = node.y; + const dx = Math.abs(point2.x - x); + const dy = Math.abs(point2.y - y); + const w = node.width / 2; + const h = node.height / 2; + return dx >= w || dy >= h; +}, "outsideNode"); +var intersection = /* @__PURE__ */ __name((node, outsidePoint, insidePoint) => { + log.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(outsidePoint)} + insidePoint : ${JSON.stringify(insidePoint)} + node : x:${node.x} y:${node.y} w:${node.width} h:${node.height}`); + const x = node.x; + const y = node.y; + const dx = Math.abs(x - insidePoint.x); + const w = node.width / 2; + let r = insidePoint.x < outsidePoint.x ? w - dx : w + dx; + const h = node.height / 2; + const Q = Math.abs(outsidePoint.y - insidePoint.y); + const R = Math.abs(outsidePoint.x - insidePoint.x); + if (Math.abs(y - outsidePoint.y) * w > Math.abs(x - outsidePoint.x) * h) { + let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y; + r = R * q / Q; + const res = { + x: insidePoint.x < outsidePoint.x ? insidePoint.x + r : insidePoint.x - R + r, + y: insidePoint.y < outsidePoint.y ? insidePoint.y + Q - q : insidePoint.y - Q + q + }; + if (r === 0) { + res.x = outsidePoint.x; + res.y = outsidePoint.y; + } + if (R === 0) { + res.x = outsidePoint.x; + } + if (Q === 0) { + res.y = outsidePoint.y; + } + log.debug(`abc89 top/bottom calc, Q ${Q}, q ${q}, R ${R}, r ${r}`, res); + return res; + } else { + if (insidePoint.x < outsidePoint.x) { + r = outsidePoint.x - w - x; + } else { + r = x - w - outsidePoint.x; + } + let q = Q * r / R; + let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x - R + r; + let _y = insidePoint.y < outsidePoint.y ? insidePoint.y + q : insidePoint.y - q; + log.debug(`sides calc abc89, Q ${Q}, q ${q}, R ${R}, r ${r}`, { _x, _y }); + if (r === 0) { + _x = outsidePoint.x; + _y = outsidePoint.y; + } + if (R === 0) { + _x = outsidePoint.x; + } + if (Q === 0) { + _y = outsidePoint.y; + } + return { x: _x, y: _y }; + } +}, "intersection"); +var cutPathAtIntersect = /* @__PURE__ */ __name((_points, boundaryNode) => { + log.warn("abc88 cutPathAtIntersect", _points, boundaryNode); + let points = []; + let lastPointOutside = _points[0]; + let isInside = false; + _points.forEach((point2) => { + log.info("abc88 checking point", point2, boundaryNode); + if (!outsideNode(boundaryNode, point2) && !isInside) { + const inter = intersection(boundaryNode, lastPointOutside, point2); + log.debug("abc88 inside", point2, lastPointOutside, inter); + log.debug("abc88 intersection", inter, boundaryNode); + let pointPresent = false; + points.forEach((p) => { + pointPresent = pointPresent || p.x === inter.x && p.y === inter.y; + }); + if (!points.some((e) => e.x === inter.x && e.y === inter.y)) { + points.push(inter); + } else { + log.warn("abc88 no intersect", inter, points); + } + isInside = true; + } else { + log.warn("abc88 outside", point2, lastPointOutside); + lastPointOutside = point2; + if (!isInside) { + points.push(point2); + } + } + }); + log.debug("returning points", points); + return points; +}, "cutPathAtIntersect"); +function extractCornerPoints(points) { + const cornerPoints = []; + const cornerPointPositions = []; + for (let i = 1; i < points.length - 1; i++) { + const prev = points[i - 1]; + const curr = points[i]; + const next = points[i + 1]; + if (prev.x === curr.x && curr.y === next.y && Math.abs(curr.x - next.x) > 5 && Math.abs(curr.y - prev.y) > 5) { + cornerPoints.push(curr); + cornerPointPositions.push(i); + } else if (prev.y === curr.y && curr.x === next.x && Math.abs(curr.x - prev.x) > 5 && Math.abs(curr.y - next.y) > 5) { + cornerPoints.push(curr); + cornerPointPositions.push(i); + } + } + return { cornerPoints, cornerPointPositions }; +} +__name(extractCornerPoints, "extractCornerPoints"); +var findAdjacentPoint = /* @__PURE__ */ __name(function(pointA, pointB, distance) { + const xDiff = pointB.x - pointA.x; + const yDiff = pointB.y - pointA.y; + const length = Math.sqrt(xDiff * xDiff + yDiff * yDiff); + const ratio = distance / length; + return { x: pointB.x - ratio * xDiff, y: pointB.y - ratio * yDiff }; +}, "findAdjacentPoint"); +var fixCorners = /* @__PURE__ */ __name(function(lineData) { + const { cornerPointPositions } = extractCornerPoints(lineData); + const newLineData = []; + for (let i = 0; i < lineData.length; i++) { + if (cornerPointPositions.includes(i)) { + const prevPoint = lineData[i - 1]; + const nextPoint = lineData[i + 1]; + const cornerPoint = lineData[i]; + const newPrevPoint = findAdjacentPoint(prevPoint, cornerPoint, 5); + const newNextPoint = findAdjacentPoint(nextPoint, cornerPoint, 5); + const xDiff = newNextPoint.x - newPrevPoint.x; + const yDiff = newNextPoint.y - newPrevPoint.y; + newLineData.push(newPrevPoint); + const a = Math.sqrt(2) * 2; + let newCornerPoint = { x: cornerPoint.x, y: cornerPoint.y }; + if (Math.abs(nextPoint.x - prevPoint.x) > 10 && Math.abs(nextPoint.y - prevPoint.y) >= 10) { + log.debug( + "Corner point fixing", + Math.abs(nextPoint.x - prevPoint.x), + Math.abs(nextPoint.y - prevPoint.y) + ); + const r = 5; + if (cornerPoint.x === newPrevPoint.x) { + newCornerPoint = { + x: xDiff < 0 ? newPrevPoint.x - r + a : newPrevPoint.x + r - a, + y: yDiff < 0 ? newPrevPoint.y - a : newPrevPoint.y + a + }; + } else { + newCornerPoint = { + x: xDiff < 0 ? newPrevPoint.x - a : newPrevPoint.x + a, + y: yDiff < 0 ? newPrevPoint.y - r + a : newPrevPoint.y + r - a + }; + } + } else { + log.debug( + "Corner point skipping fixing", + Math.abs(nextPoint.x - prevPoint.x), + Math.abs(nextPoint.y - prevPoint.y) + ); + } + newLineData.push(newCornerPoint, newNextPoint); + } else { + newLineData.push(lineData[i]); + } + } + return newLineData; +}, "fixCorners"); +var generateDashArray = /* @__PURE__ */ __name((len, oValueS, oValueE) => { + const middleLength = len - oValueS - oValueE; + const dashLength = 2; + const gapLength = 2; + const dashGapPairLength = dashLength + gapLength; + const numberOfPairs = Math.floor(middleLength / dashGapPairLength); + const middlePattern = Array(numberOfPairs).fill(`${dashLength} ${gapLength}`).join(" "); + const dashArray = `0 ${oValueS} ${middlePattern} ${oValueE}`; + return dashArray; +}, "generateDashArray"); +var insertEdge = /* @__PURE__ */ __name(function(elem, edge, clusterDb, diagramType, startNode, endNode, id, skipIntersect = false) { + const { handDrawnSeed } = getConfig(); + let points = edge.points; + let pointsHasChanged = false; + const tail = startNode; + var head = endNode; + const edgeClassStyles = []; + for (const key in edge.cssCompiledStyles) { + if (isLabelStyle(key)) { + continue; + } + edgeClassStyles.push(edge.cssCompiledStyles[key]); + } + log.debug("UIO intersect check", edge.points, head.x, tail.x); + if (head.intersect && tail.intersect && !skipIntersect) { + points = points.slice(1, edge.points.length - 1); + points.unshift(tail.intersect(points[0])); + log.debug( + "Last point UIO", + edge.start, + "-->", + edge.end, + points[points.length - 1], + head, + head.intersect(points[points.length - 1]) + ); + points.push(head.intersect(points[points.length - 1])); + } + const pointsStr = btoa(JSON.stringify(points)); + if (edge.toCluster) { + log.info("to cluster abc88", clusterDb.get(edge.toCluster)); + points = cutPathAtIntersect(edge.points, clusterDb.get(edge.toCluster).node); + pointsHasChanged = true; + } + if (edge.fromCluster) { + log.debug( + "from cluster abc88", + clusterDb.get(edge.fromCluster), + JSON.stringify(points, null, 2) + ); + points = cutPathAtIntersect(points.reverse(), clusterDb.get(edge.fromCluster).node).reverse(); + pointsHasChanged = true; + } + let lineData = points.filter((p) => !Number.isNaN(p.y)); + lineData = fixCorners(lineData); + let curve = curveBasis; + curve = curveLinear; + switch (edge.curve) { + case "linear": + curve = curveLinear; + break; + case "basis": + curve = curveBasis; + break; + case "cardinal": + curve = curveCardinal; + break; + case "bumpX": + curve = curveBumpX; + break; + case "bumpY": + curve = curveBumpY; + break; + case "catmullRom": + curve = curveCatmullRom; + break; + case "monotoneX": + curve = curveMonotoneX; + break; + case "monotoneY": + curve = curveMonotoneY; + break; + case "natural": + curve = curveNatural; + break; + case "step": + curve = curveStep; + break; + case "stepAfter": + curve = curveStepAfter; + break; + case "stepBefore": + curve = curveStepBefore; + break; + default: + curve = curveBasis; + } + const { x, y } = getLineFunctionsWithOffset(edge); + const lineFunction = line().x(x).y(y).curve(curve); + let strokeClasses; + switch (edge.thickness) { + case "normal": + strokeClasses = "edge-thickness-normal"; + break; + case "thick": + strokeClasses = "edge-thickness-thick"; + break; + case "invisible": + strokeClasses = "edge-thickness-invisible"; + break; + default: + strokeClasses = "edge-thickness-normal"; + } + switch (edge.pattern) { + case "solid": + strokeClasses += " edge-pattern-solid"; + break; + case "dotted": + strokeClasses += " edge-pattern-dotted"; + break; + case "dashed": + strokeClasses += " edge-pattern-dashed"; + break; + default: + strokeClasses += " edge-pattern-solid"; + } + let svgPath; + let linePath = edge.curve === "rounded" ? generateRoundedPath(applyMarkerOffsetsToPoints(lineData, edge), 5) : lineFunction(lineData); + const edgeStyles = Array.isArray(edge.style) ? edge.style : [edge.style]; + let strokeColor = edgeStyles.find((style) => style?.startsWith("stroke:")); + let animatedEdge = false; + if (edge.look === "handDrawn") { + const rc = rough.svg(elem); + Object.assign([], lineData); + const svgPathNode = rc.path(linePath, { + roughness: 0.3, + seed: handDrawnSeed + }); + strokeClasses += " transition"; + svgPath = select(svgPathNode).select("path").attr("id", edge.id).attr("class", " " + strokeClasses + (edge.classes ? " " + edge.classes : "")).attr("style", edgeStyles ? edgeStyles.reduce((acc, style) => acc + ";" + style, "") : ""); + let d = svgPath.attr("d"); + svgPath.attr("d", d); + elem.node().appendChild(svgPath.node()); + } else { + const stylesFromClasses = edgeClassStyles.join(";"); + const styles = edgeStyles ? edgeStyles.reduce((acc, style) => acc + style + ";", "") : ""; + let animationClass = ""; + if (edge.animate) { + animationClass = " edge-animation-fast"; + } + if (edge.animation) { + animationClass = " edge-animation-" + edge.animation; + } + const pathStyle = (stylesFromClasses ? stylesFromClasses + ";" + styles + ";" : styles) + ";" + (edgeStyles ? edgeStyles.reduce((acc, style) => acc + ";" + style, "") : ""); + svgPath = elem.append("path").attr("d", linePath).attr("id", edge.id).attr( + "class", + " " + strokeClasses + (edge.classes ? " " + edge.classes : "") + (animationClass ?? "") + ).attr("style", pathStyle); + strokeColor = pathStyle.match(/stroke:([^;]+)/)?.[1]; + animatedEdge = edge.animate === true || !!edge.animation || stylesFromClasses.includes("animation"); + const pathNode = svgPath.node(); + const len = typeof pathNode.getTotalLength === "function" ? pathNode.getTotalLength() : 0; + const oValueS = markerOffsets2[edge.arrowTypeStart] || 0; + const oValueE = markerOffsets2[edge.arrowTypeEnd] || 0; + if (edge.look === "neo" && !animatedEdge) { + const dashArray = edge.pattern === "dotted" || edge.pattern === "dashed" ? generateDashArray(len, oValueS, oValueE) : `0 ${oValueS} ${len - oValueS - oValueE} ${oValueE}`; + const mOffset = `stroke-dasharray: ${dashArray}; stroke-dashoffset: 0;`; + svgPath.attr("style", mOffset + svgPath.attr("style")); + } + } + svgPath.attr("data-edge", true); + svgPath.attr("data-et", "edge"); + svgPath.attr("data-id", edge.id); + svgPath.attr("data-points", pointsStr); + if (edge.showPoints) { + lineData.forEach((point3) => { + elem.append("circle").style("stroke", "red").style("fill", "red").attr("r", 1).attr("cx", point3.x).attr("cy", point3.y); + }); + } + let url = ""; + if (getConfig().flowchart.arrowMarkerAbsolute || getConfig().state.arrowMarkerAbsolute) { + url = window.location.protocol + "//" + window.location.host + window.location.pathname + window.location.search; + url = url.replace(/\(/g, "\\(").replace(/\)/g, "\\)"); + } + log.info("arrowTypeStart", edge.arrowTypeStart); + log.info("arrowTypeEnd", edge.arrowTypeEnd); + addEdgeMarkers(svgPath, edge, url, id, diagramType, strokeColor); + const midIndex = Math.floor(points.length / 2); + const point2 = points[midIndex]; + if (!utils_default.isLabelCoordinateInPath(point2, svgPath.attr("d"))) { + pointsHasChanged = true; + } + let paths = {}; + if (pointsHasChanged) { + paths.updatedPath = points; + } + paths.originalPath = edge.points; + return paths; +}, "insertEdge"); +function generateRoundedPath(points, radius) { + if (points.length < 2) { + return ""; + } + let path = ""; + const size = points.length; + const epsilon = 1e-5; + for (let i = 0; i < size; i++) { + const currPoint = points[i]; + const prevPoint = points[i - 1]; + const nextPoint = points[i + 1]; + if (i === 0) { + path += `M${currPoint.x},${currPoint.y}`; + } else if (i === size - 1) { + path += `L${currPoint.x},${currPoint.y}`; + } else { + const dx1 = currPoint.x - prevPoint.x; + const dy1 = currPoint.y - prevPoint.y; + const dx2 = nextPoint.x - currPoint.x; + const dy2 = nextPoint.y - currPoint.y; + const len1 = Math.hypot(dx1, dy1); + const len2 = Math.hypot(dx2, dy2); + if (len1 < epsilon || len2 < epsilon) { + path += `L${currPoint.x},${currPoint.y}`; + continue; + } + const nx1 = dx1 / len1; + const ny1 = dy1 / len1; + const nx2 = dx2 / len2; + const ny2 = dy2 / len2; + const dot = nx1 * nx2 + ny1 * ny2; + const clampedDot = Math.max(-1, Math.min(1, dot)); + const angle = Math.acos(clampedDot); + if (angle < epsilon || Math.abs(Math.PI - angle) < epsilon) { + path += `L${currPoint.x},${currPoint.y}`; + continue; + } + const cutLen = Math.min(radius / Math.sin(angle / 2), len1 / 2, len2 / 2); + const startX = currPoint.x - nx1 * cutLen; + const startY = currPoint.y - ny1 * cutLen; + const endX = currPoint.x + nx2 * cutLen; + const endY = currPoint.y + ny2 * cutLen; + path += `L${startX},${startY}`; + path += `Q${currPoint.x},${currPoint.y} ${endX},${endY}`; + } + } + return path; +} +__name(generateRoundedPath, "generateRoundedPath"); +function calculateDeltaAndAngle(point1, point2) { + if (!point1 || !point2) { + return { angle: 0, deltaX: 0, deltaY: 0 }; + } + const deltaX = point2.x - point1.x; + const deltaY = point2.y - point1.y; + const angle = Math.atan2(deltaY, deltaX); + return { angle, deltaX, deltaY }; +} +__name(calculateDeltaAndAngle, "calculateDeltaAndAngle"); +function applyMarkerOffsetsToPoints(points, edge) { + const newPoints = points.map((point2) => ({ ...point2 })); + if (points.length >= 2 && markerOffsets[edge.arrowTypeStart]) { + const offsetValue = markerOffsets[edge.arrowTypeStart]; + const point1 = points[0]; + const point2 = points[1]; + const { angle } = calculateDeltaAndAngle(point1, point2); + const offsetX = offsetValue * Math.cos(angle); + const offsetY = offsetValue * Math.sin(angle); + newPoints[0].x = point1.x + offsetX; + newPoints[0].y = point1.y + offsetY; + } + const n = points.length; + if (n >= 2 && markerOffsets[edge.arrowTypeEnd]) { + const offsetValue = markerOffsets[edge.arrowTypeEnd]; + const point1 = points[n - 1]; + const point2 = points[n - 2]; + const { angle } = calculateDeltaAndAngle(point2, point1); + const offsetX = offsetValue * Math.cos(angle); + const offsetY = offsetValue * Math.sin(angle); + newPoints[n - 1].x = point1.x - offsetX; + newPoints[n - 1].y = point1.y - offsetY; + } + return newPoints; +} +__name(applyMarkerOffsetsToPoints, "applyMarkerOffsetsToPoints"); + +// src/rendering-util/rendering-elements/markers.js +var insertMarkers = /* @__PURE__ */ __name((elem, markerArray, type, id) => { + markerArray.forEach((markerName) => { + markers[markerName](elem, type, id); + }); +}, "insertMarkers"); +var extension = /* @__PURE__ */ __name((elem, type, id) => { + log.trace("Making markers for ", id); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-extensionStart").attr("class", "marker extension " + type).attr("refX", 18).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("path").attr("d", "M 1,7 L18,13 V 1 Z"); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-extensionEnd").attr("class", "marker extension " + type).attr("refX", 1).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 1,1 V 13 L18,7 Z"); +}, "extension"); +var composition = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-compositionStart").attr("class", "marker composition " + type).attr("refX", 18).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L1,7 L9,1 Z"); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-compositionEnd").attr("class", "marker composition " + type).attr("refX", 1).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L1,7 L9,1 Z"); +}, "composition"); +var aggregation = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-aggregationStart").attr("class", "marker aggregation " + type).attr("refX", 18).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L1,7 L9,1 Z"); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-aggregationEnd").attr("class", "marker aggregation " + type).attr("refX", 1).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L1,7 L9,1 Z"); +}, "aggregation"); +var dependency = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-dependencyStart").attr("class", "marker dependency " + type).attr("refX", 6).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("path").attr("d", "M 5,7 L9,13 L1,7 L9,1 Z"); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-dependencyEnd").attr("class", "marker dependency " + type).attr("refX", 13).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L14,7 L9,1 Z"); +}, "dependency"); +var lollipop = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-lollipopStart").attr("class", "marker lollipop " + type).attr("refX", 13).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("circle").attr("stroke", "black").attr("fill", "transparent").attr("cx", 7).attr("cy", 7).attr("r", 6); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-lollipopEnd").attr("class", "marker lollipop " + type).attr("refX", 1).attr("refY", 7).attr("markerWidth", 190).attr("markerHeight", 240).attr("orient", "auto").append("circle").attr("stroke", "black").attr("fill", "transparent").attr("cx", 7).attr("cy", 7).attr("r", 6); +}, "lollipop"); +var point = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("marker").attr("id", id + "_" + type + "-pointEnd").attr("class", "marker " + type).attr("viewBox", "0 0 10 10").attr("refX", 5).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 8).attr("markerHeight", 8).attr("orient", "auto").append("path").attr("d", "M 0 0 L 10 5 L 0 10 z").attr("class", "arrowMarkerPath").style("stroke-width", 1).style("stroke-dasharray", "1,0"); + elem.append("marker").attr("id", id + "_" + type + "-pointStart").attr("class", "marker " + type).attr("viewBox", "0 0 10 10").attr("refX", 4.5).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 8).attr("markerHeight", 8).attr("orient", "auto").append("path").attr("d", "M 0 5 L 10 10 L 10 0 z").attr("class", "arrowMarkerPath").style("stroke-width", 1).style("stroke-dasharray", "1,0"); +}, "point"); +var circle = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("marker").attr("id", id + "_" + type + "-circleEnd").attr("class", "marker " + type).attr("viewBox", "0 0 10 10").attr("refX", 11).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 11).attr("markerHeight", 11).attr("orient", "auto").append("circle").attr("cx", "5").attr("cy", "5").attr("r", "5").attr("class", "arrowMarkerPath").style("stroke-width", 1).style("stroke-dasharray", "1,0"); + elem.append("marker").attr("id", id + "_" + type + "-circleStart").attr("class", "marker " + type).attr("viewBox", "0 0 10 10").attr("refX", -1).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 11).attr("markerHeight", 11).attr("orient", "auto").append("circle").attr("cx", "5").attr("cy", "5").attr("r", "5").attr("class", "arrowMarkerPath").style("stroke-width", 1).style("stroke-dasharray", "1,0"); +}, "circle"); +var cross = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("marker").attr("id", id + "_" + type + "-crossEnd").attr("class", "marker cross " + type).attr("viewBox", "0 0 11 11").attr("refX", 12).attr("refY", 5.2).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 11).attr("markerHeight", 11).attr("orient", "auto").append("path").attr("d", "M 1,1 l 9,9 M 10,1 l -9,9").attr("class", "arrowMarkerPath").style("stroke-width", 2).style("stroke-dasharray", "1,0"); + elem.append("marker").attr("id", id + "_" + type + "-crossStart").attr("class", "marker cross " + type).attr("viewBox", "0 0 11 11").attr("refX", -1).attr("refY", 5.2).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 11).attr("markerHeight", 11).attr("orient", "auto").append("path").attr("d", "M 1,1 l 9,9 M 10,1 l -9,9").attr("class", "arrowMarkerPath").style("stroke-width", 2).style("stroke-dasharray", "1,0"); +}, "cross"); +var barb = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-barbEnd").attr("refX", 19).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 14).attr("markerUnits", "userSpaceOnUse").attr("orient", "auto").append("path").attr("d", "M 19,7 L9,13 L14,7 L9,1 Z"); +}, "barb"); +var only_one = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-onlyOneStart").attr("class", "marker onlyOne " + type).attr("refX", 0).attr("refY", 9).attr("markerWidth", 18).attr("markerHeight", 18).attr("orient", "auto").append("path").attr("d", "M9,0 L9,18 M15,0 L15,18"); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-onlyOneEnd").attr("class", "marker onlyOne " + type).attr("refX", 18).attr("refY", 9).attr("markerWidth", 18).attr("markerHeight", 18).attr("orient", "auto").append("path").attr("d", "M3,0 L3,18 M9,0 L9,18"); +}, "only_one"); +var zero_or_one = /* @__PURE__ */ __name((elem, type, id) => { + const startMarker = elem.append("defs").append("marker").attr("id", id + "_" + type + "-zeroOrOneStart").attr("class", "marker zeroOrOne " + type).attr("refX", 0).attr("refY", 9).attr("markerWidth", 30).attr("markerHeight", 18).attr("orient", "auto"); + startMarker.append("circle").attr("fill", "white").attr("cx", 21).attr("cy", 9).attr("r", 6); + startMarker.append("path").attr("d", "M9,0 L9,18"); + const endMarker = elem.append("defs").append("marker").attr("id", id + "_" + type + "-zeroOrOneEnd").attr("class", "marker zeroOrOne " + type).attr("refX", 30).attr("refY", 9).attr("markerWidth", 30).attr("markerHeight", 18).attr("orient", "auto"); + endMarker.append("circle").attr("fill", "white").attr("cx", 9).attr("cy", 9).attr("r", 6); + endMarker.append("path").attr("d", "M21,0 L21,18"); +}, "zero_or_one"); +var one_or_more = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-oneOrMoreStart").attr("class", "marker oneOrMore " + type).attr("refX", 18).attr("refY", 18).attr("markerWidth", 45).attr("markerHeight", 36).attr("orient", "auto").append("path").attr("d", "M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"); + elem.append("defs").append("marker").attr("id", id + "_" + type + "-oneOrMoreEnd").attr("class", "marker oneOrMore " + type).attr("refX", 27).attr("refY", 18).attr("markerWidth", 45).attr("markerHeight", 36).attr("orient", "auto").append("path").attr("d", "M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18"); +}, "one_or_more"); +var zero_or_more = /* @__PURE__ */ __name((elem, type, id) => { + const startMarker = elem.append("defs").append("marker").attr("id", id + "_" + type + "-zeroOrMoreStart").attr("class", "marker zeroOrMore " + type).attr("refX", 18).attr("refY", 18).attr("markerWidth", 57).attr("markerHeight", 36).attr("orient", "auto"); + startMarker.append("circle").attr("fill", "white").attr("cx", 48).attr("cy", 18).attr("r", 6); + startMarker.append("path").attr("d", "M0,18 Q18,0 36,18 Q18,36 0,18"); + const endMarker = elem.append("defs").append("marker").attr("id", id + "_" + type + "-zeroOrMoreEnd").attr("class", "marker zeroOrMore " + type).attr("refX", 39).attr("refY", 18).attr("markerWidth", 57).attr("markerHeight", 36).attr("orient", "auto"); + endMarker.append("circle").attr("fill", "white").attr("cx", 9).attr("cy", 18).attr("r", 6); + endMarker.append("path").attr("d", "M21,18 Q39,0 57,18 Q39,36 21,18"); +}, "zero_or_more"); +var requirement_arrow = /* @__PURE__ */ __name((elem, type, id) => { + elem.append("defs").append("marker").attr("id", id + "_" + type + "-requirement_arrowEnd").attr("refX", 20).attr("refY", 10).attr("markerWidth", 20).attr("markerHeight", 20).attr("orient", "auto").append("path").attr( + "d", + `M0,0 + L20,10 + M20,10 + L0,20` + ); +}, "requirement_arrow"); +var requirement_contains = /* @__PURE__ */ __name((elem, type, id) => { + const containsNode = elem.append("defs").append("marker").attr("id", id + "_" + type + "-requirement_containsStart").attr("refX", 0).attr("refY", 10).attr("markerWidth", 20).attr("markerHeight", 20).attr("orient", "auto").append("g"); + containsNode.append("circle").attr("cx", 10).attr("cy", 10).attr("r", 9).attr("fill", "none"); + containsNode.append("line").attr("x1", 1).attr("x2", 19).attr("y1", 10).attr("y2", 10); + containsNode.append("line").attr("y1", 1).attr("y2", 19).attr("x1", 10).attr("x2", 10); +}, "requirement_contains"); +var markers = { + extension, + composition, + aggregation, + dependency, + lollipop, + point, + circle, + cross, + barb, + only_one, + zero_or_one, + one_or_more, + zero_or_more, + requirement_arrow, + requirement_contains +}; +var markers_default = insertMarkers; + +export { + clear, + insertEdgeLabel, + positionEdgeLabel, + insertEdge, + markers_default +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QXUST7PY.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QXUST7PY.mjs.map new file mode 100644 index 0000000..808e160 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QXUST7PY.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/rendering-util/rendering-elements/edges.js", "../../../src/rendering-util/rendering-elements/edgeMarker.ts", "../../../src/rendering-util/rendering-elements/markers.js"], + "sourcesContent": ["import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { evaluate } from '../../diagrams/common/common.js';\nimport { log } from '../../logger.js';\nimport { createText } from '../createText.js';\nimport utils from '../../utils.js';\nimport {\n getLineFunctionsWithOffset,\n markerOffsets,\n markerOffsets2,\n} from '../../utils/lineWithOffset.js';\nimport { getSubGraphTitleMargins } from '../../utils/subGraphTitleMargins.js';\n\nimport {\n curveBasis,\n curveLinear,\n curveCardinal,\n curveBumpX,\n curveBumpY,\n curveCatmullRom,\n curveMonotoneX,\n curveMonotoneY,\n curveNatural,\n curveStep,\n curveStepAfter,\n curveStepBefore,\n line,\n select,\n} from 'd3';\nimport rough from 'roughjs';\nimport createLabel from './createLabel.js';\nimport { addEdgeMarkers } from './edgeMarker.ts';\nimport { isLabelStyle, styles2String } from './shapes/handDrawnShapeStyles.js';\n\nexport const edgeLabels = new Map();\nexport const terminalLabels = new Map();\n\nexport const clear = () => {\n edgeLabels.clear();\n terminalLabels.clear();\n};\n\nexport const getLabelStyles = (styleArray) => {\n let styles = styleArray ? styleArray.reduce((acc, style) => acc + ';' + style, '') : '';\n return styles;\n};\n\nexport const insertEdgeLabel = async (elem, edge) => {\n let useHtmlLabels = evaluate(getConfig().flowchart.htmlLabels);\n\n const { labelStyles } = styles2String(edge);\n edge.labelStyle = labelStyles;\n const labelElement = await createText(elem, edge.label, {\n style: edge.labelStyle,\n useHtmlLabels,\n addSvgBackground: true,\n isNode: false,\n });\n log.info('abc82', edge, edge.labelType);\n\n // Create outer g, edgeLabel, this will be positioned after graph layout\n const edgeLabel = elem.insert('g').attr('class', 'edgeLabel');\n\n // Create inner g, label, this will be positioned now for centering the text\n const label = edgeLabel.insert('g').attr('class', 'label').attr('data-id', edge.id);\n label.node().appendChild(labelElement);\n\n // Center the label\n let bbox = labelElement.getBBox();\n if (useHtmlLabels) {\n const div = labelElement.children[0];\n const dv = select(labelElement);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n\n // Make element accessible by id for positioning\n edgeLabels.set(edge.id, edgeLabel);\n\n // Update the abstract data of the edge with the new information about its width and height\n edge.width = bbox.width;\n edge.height = bbox.height;\n\n let fo;\n if (edge.startLabelLeft) {\n // Create the actual text element\n const startLabelElement = await createLabel(\n edge.startLabelLeft,\n getLabelStyles(edge.labelStyle)\n );\n const startEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = startEdgeLabelLeft.insert('g').attr('class', 'inner');\n fo = inner.node().appendChild(startLabelElement);\n const slBox = startLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n if (!terminalLabels.get(edge.id)) {\n terminalLabels.set(edge.id, {});\n }\n terminalLabels.get(edge.id).startLeft = startEdgeLabelLeft;\n setTerminalWidth(fo, edge.startLabelLeft);\n }\n if (edge.startLabelRight) {\n // Create the actual text element\n const startLabelElement = await createLabel(\n edge.startLabelRight,\n getLabelStyles(edge.labelStyle)\n );\n const startEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = startEdgeLabelRight.insert('g').attr('class', 'inner');\n fo = startEdgeLabelRight.node().appendChild(startLabelElement);\n inner.node().appendChild(startLabelElement);\n const slBox = startLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n if (!terminalLabels.get(edge.id)) {\n terminalLabels.set(edge.id, {});\n }\n terminalLabels.get(edge.id).startRight = startEdgeLabelRight;\n setTerminalWidth(fo, edge.startLabelRight);\n }\n if (edge.endLabelLeft) {\n // Create the actual text element\n const endLabelElement = await createLabel(edge.endLabelLeft, getLabelStyles(edge.labelStyle));\n const endEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = endEdgeLabelLeft.insert('g').attr('class', 'inner');\n fo = inner.node().appendChild(endLabelElement);\n const slBox = endLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n endEdgeLabelLeft.node().appendChild(endLabelElement);\n\n if (!terminalLabels.get(edge.id)) {\n terminalLabels.set(edge.id, {});\n }\n terminalLabels.get(edge.id).endLeft = endEdgeLabelLeft;\n setTerminalWidth(fo, edge.endLabelLeft);\n }\n if (edge.endLabelRight) {\n // Create the actual text element\n const endLabelElement = await createLabel(edge.endLabelRight, getLabelStyles(edge.labelStyle));\n const endEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = endEdgeLabelRight.insert('g').attr('class', 'inner');\n\n fo = inner.node().appendChild(endLabelElement);\n const slBox = endLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n endEdgeLabelRight.node().appendChild(endLabelElement);\n if (!terminalLabels.get(edge.id)) {\n terminalLabels.set(edge.id, {});\n }\n terminalLabels.get(edge.id).endRight = endEdgeLabelRight;\n setTerminalWidth(fo, edge.endLabelRight);\n }\n return labelElement;\n};\n\n/**\n * @param {any} fo\n * @param {any} value\n */\nfunction setTerminalWidth(fo, value) {\n if (getConfig().flowchart.htmlLabels && fo) {\n fo.style.width = value.length * 9 + 'px';\n fo.style.height = '12px';\n }\n}\n\nexport const positionEdgeLabel = (edge, paths) => {\n log.debug('Moving label abc88 ', edge.id, edge.label, edgeLabels.get(edge.id), paths);\n let path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\n const siteConfig = getConfig();\n const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig);\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.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.updatedPath) {\n x = pos.x;\n y = pos.y;\n }\n }\n el.attr('transform', `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`);\n }\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.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.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.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.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\nconst outsideNode = (node, point) => {\n const x = node.x;\n const y = node.y;\n const dx = Math.abs(point.x - x);\n const dy = Math.abs(point.y - y);\n const w = node.width / 2;\n const h = node.height / 2;\n return dx >= w || dy >= h;\n};\n\nexport const intersection = (node, outsidePoint, insidePoint) => {\n log.debug(`intersection calc abc89:\n outsidePoint: ${JSON.stringify(outsidePoint)}\n insidePoint : ${JSON.stringify(insidePoint)}\n node : x:${node.x} y:${node.y} w:${node.width} h:${node.height}`);\n const x = node.x;\n const y = node.y;\n\n const dx = Math.abs(x - insidePoint.x);\n const w = node.width / 2;\n let r = insidePoint.x < outsidePoint.x ? w - dx : w + dx;\n const h = node.height / 2;\n\n const Q = Math.abs(outsidePoint.y - insidePoint.y);\n const R = Math.abs(outsidePoint.x - insidePoint.x);\n\n if (Math.abs(y - outsidePoint.y) * w > Math.abs(x - outsidePoint.x) * h) {\n // Intersection is top or bottom of rect.\n let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y;\n r = (R * q) / Q;\n const res = {\n x: insidePoint.x < outsidePoint.x ? insidePoint.x + r : insidePoint.x - R + r,\n y: insidePoint.y < outsidePoint.y ? insidePoint.y + Q - q : insidePoint.y - Q + q,\n };\n\n if (r === 0) {\n res.x = outsidePoint.x;\n res.y = outsidePoint.y;\n }\n if (R === 0) {\n res.x = outsidePoint.x;\n }\n if (Q === 0) {\n res.y = outsidePoint.y;\n }\n\n log.debug(`abc89 top/bottom calc, Q ${Q}, q ${q}, R ${R}, r ${r}`, res);\n\n return res;\n } else {\n // Intersection on sides of rect\n if (insidePoint.x < outsidePoint.x) {\n r = outsidePoint.x - w - x;\n } else {\n r = x - w - outsidePoint.x;\n }\n let q = (Q * r) / R;\n let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x - R + r;\n let _y = insidePoint.y < outsidePoint.y ? insidePoint.y + q : insidePoint.y - q;\n log.debug(`sides calc abc89, Q ${Q}, q ${q}, R ${R}, r ${r}`, { _x, _y });\n if (r === 0) {\n _x = outsidePoint.x;\n _y = outsidePoint.y;\n }\n if (R === 0) {\n _x = outsidePoint.x;\n }\n if (Q === 0) {\n _y = outsidePoint.y;\n }\n\n return { x: _x, y: _y };\n }\n};\n\nconst cutPathAtIntersect = (_points, boundaryNode) => {\n log.warn('abc88 cutPathAtIntersect', _points, boundaryNode);\n let points = [];\n let lastPointOutside = _points[0];\n let isInside = false;\n _points.forEach((point) => {\n log.info('abc88 checking point', point, boundaryNode);\n\n if (!outsideNode(boundaryNode, point) && !isInside) {\n const inter = intersection(boundaryNode, lastPointOutside, point);\n log.debug('abc88 inside', point, lastPointOutside, inter);\n log.debug('abc88 intersection', inter, boundaryNode);\n\n let pointPresent = false;\n points.forEach((p) => {\n pointPresent = pointPresent || (p.x === inter.x && p.y === inter.y);\n });\n\n if (!points.some((e) => e.x === inter.x && e.y === inter.y)) {\n points.push(inter);\n } else {\n log.warn('abc88 no intersect', inter, points);\n }\n isInside = true;\n } else {\n log.warn('abc88 outside', point, lastPointOutside);\n lastPointOutside = point;\n if (!isInside) {\n points.push(point);\n }\n }\n });\n log.debug('returning points', points);\n return points;\n};\n\nfunction extractCornerPoints(points) {\n const cornerPoints = [];\n const cornerPointPositions = [];\n for (let i = 1; i < points.length - 1; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n const next = points[i + 1];\n if (\n prev.x === curr.x &&\n curr.y === next.y &&\n Math.abs(curr.x - next.x) > 5 &&\n Math.abs(curr.y - prev.y) > 5\n ) {\n cornerPoints.push(curr);\n cornerPointPositions.push(i);\n } else if (\n prev.y === curr.y &&\n curr.x === next.x &&\n Math.abs(curr.x - prev.x) > 5 &&\n Math.abs(curr.y - next.y) > 5\n ) {\n cornerPoints.push(curr);\n cornerPointPositions.push(i);\n }\n }\n return { cornerPoints, cornerPointPositions };\n}\n\nconst findAdjacentPoint = function (pointA, pointB, distance) {\n const xDiff = pointB.x - pointA.x;\n const yDiff = pointB.y - pointA.y;\n const length = Math.sqrt(xDiff * xDiff + yDiff * yDiff);\n const ratio = distance / length;\n return { x: pointB.x - ratio * xDiff, y: pointB.y - ratio * yDiff };\n};\n\nconst fixCorners = function (lineData) {\n const { cornerPointPositions } = extractCornerPoints(lineData);\n const newLineData = [];\n for (let i = 0; i < lineData.length; i++) {\n if (cornerPointPositions.includes(i)) {\n const prevPoint = lineData[i - 1];\n const nextPoint = lineData[i + 1];\n const cornerPoint = lineData[i];\n\n const newPrevPoint = findAdjacentPoint(prevPoint, cornerPoint, 5);\n const newNextPoint = findAdjacentPoint(nextPoint, cornerPoint, 5);\n\n const xDiff = newNextPoint.x - newPrevPoint.x;\n const yDiff = newNextPoint.y - newPrevPoint.y;\n newLineData.push(newPrevPoint);\n\n const a = Math.sqrt(2) * 2;\n let newCornerPoint = { x: cornerPoint.x, y: cornerPoint.y };\n if (Math.abs(nextPoint.x - prevPoint.x) > 10 && Math.abs(nextPoint.y - prevPoint.y) >= 10) {\n log.debug(\n 'Corner point fixing',\n Math.abs(nextPoint.x - prevPoint.x),\n Math.abs(nextPoint.y - prevPoint.y)\n );\n const r = 5;\n if (cornerPoint.x === newPrevPoint.x) {\n newCornerPoint = {\n x: xDiff < 0 ? newPrevPoint.x - r + a : newPrevPoint.x + r - a,\n y: yDiff < 0 ? newPrevPoint.y - a : newPrevPoint.y + a,\n };\n } else {\n newCornerPoint = {\n x: xDiff < 0 ? newPrevPoint.x - a : newPrevPoint.x + a,\n y: yDiff < 0 ? newPrevPoint.y - r + a : newPrevPoint.y + r - a,\n };\n }\n } else {\n log.debug(\n 'Corner point skipping fixing',\n Math.abs(nextPoint.x - prevPoint.x),\n Math.abs(nextPoint.y - prevPoint.y)\n );\n }\n newLineData.push(newCornerPoint, newNextPoint);\n } else {\n newLineData.push(lineData[i]);\n }\n }\n return newLineData;\n};\nconst generateDashArray = (len, oValueS, oValueE) => {\n const middleLength = len - oValueS - oValueE;\n const dashLength = 2; // Length of each dash\n const gapLength = 2; // Length of each gap\n const dashGapPairLength = dashLength + gapLength;\n\n // Calculate number of complete dash-gap pairs that can fit\n const numberOfPairs = Math.floor(middleLength / dashGapPairLength);\n\n // Generate the middle pattern array\n const middlePattern = Array(numberOfPairs).fill(`${dashLength} ${gapLength}`).join(' ');\n\n // Combine all parts\n const dashArray = `0 ${oValueS} ${middlePattern} ${oValueE}`;\n\n return dashArray;\n};\nexport const insertEdge = function (\n elem,\n edge,\n clusterDb,\n diagramType,\n startNode,\n endNode,\n id,\n skipIntersect = false\n) {\n const { handDrawnSeed } = getConfig();\n let points = edge.points;\n let pointsHasChanged = false;\n const tail = startNode;\n var head = endNode;\n const edgeClassStyles = [];\n for (const key in edge.cssCompiledStyles) {\n if (isLabelStyle(key)) {\n continue;\n }\n edgeClassStyles.push(edge.cssCompiledStyles[key]);\n }\n\n log.debug('UIO intersect check', edge.points, head.x, tail.x);\n if (head.intersect && tail.intersect && !skipIntersect) {\n points = points.slice(1, edge.points.length - 1);\n points.unshift(tail.intersect(points[0]));\n log.debug(\n 'Last point UIO',\n edge.start,\n '-->',\n edge.end,\n points[points.length - 1],\n head,\n head.intersect(points[points.length - 1])\n );\n points.push(head.intersect(points[points.length - 1]));\n }\n const pointsStr = btoa(JSON.stringify(points));\n if (edge.toCluster) {\n log.info('to cluster abc88', clusterDb.get(edge.toCluster));\n points = cutPathAtIntersect(edge.points, clusterDb.get(edge.toCluster).node);\n\n pointsHasChanged = true;\n }\n\n if (edge.fromCluster) {\n log.debug(\n 'from cluster abc88',\n clusterDb.get(edge.fromCluster),\n JSON.stringify(points, null, 2)\n );\n points = cutPathAtIntersect(points.reverse(), clusterDb.get(edge.fromCluster).node).reverse();\n\n pointsHasChanged = true;\n }\n\n let lineData = points.filter((p) => !Number.isNaN(p.y));\n lineData = fixCorners(lineData);\n let curve = curveBasis;\n curve = curveLinear;\n switch (edge.curve) {\n case 'linear':\n curve = curveLinear;\n break;\n case 'basis':\n curve = curveBasis;\n break;\n case 'cardinal':\n curve = curveCardinal;\n break;\n case 'bumpX':\n curve = curveBumpX;\n break;\n case 'bumpY':\n curve = curveBumpY;\n break;\n case 'catmullRom':\n curve = curveCatmullRom;\n break;\n case 'monotoneX':\n curve = curveMonotoneX;\n break;\n case 'monotoneY':\n curve = curveMonotoneY;\n break;\n case 'natural':\n curve = curveNatural;\n break;\n case 'step':\n curve = curveStep;\n break;\n case 'stepAfter':\n curve = curveStepAfter;\n break;\n case 'stepBefore':\n curve = curveStepBefore;\n break;\n default:\n curve = curveBasis;\n }\n\n // if (edge.curve) {\n // curve = edge.curve;\n // }\n\n const { x, y } = getLineFunctionsWithOffset(edge);\n const lineFunction = line().x(x).y(y).curve(curve);\n\n let strokeClasses;\n switch (edge.thickness) {\n case 'normal':\n strokeClasses = 'edge-thickness-normal';\n break;\n case 'thick':\n strokeClasses = 'edge-thickness-thick';\n break;\n case 'invisible':\n strokeClasses = 'edge-thickness-invisible';\n break;\n default:\n strokeClasses = 'edge-thickness-normal';\n }\n switch (edge.pattern) {\n case 'solid':\n strokeClasses += ' edge-pattern-solid';\n break;\n case 'dotted':\n strokeClasses += ' edge-pattern-dotted';\n break;\n case 'dashed':\n strokeClasses += ' edge-pattern-dashed';\n break;\n default:\n strokeClasses += ' edge-pattern-solid';\n }\n let svgPath;\n let linePath =\n edge.curve === 'rounded'\n ? generateRoundedPath(applyMarkerOffsetsToPoints(lineData, edge), 5)\n : lineFunction(lineData);\n const edgeStyles = Array.isArray(edge.style) ? edge.style : [edge.style];\n let strokeColor = edgeStyles.find((style) => style?.startsWith('stroke:'));\n\n let animatedEdge = false;\n if (edge.look === 'handDrawn') {\n const rc = rough.svg(elem);\n Object.assign([], lineData);\n\n const svgPathNode = rc.path(linePath, {\n roughness: 0.3,\n seed: handDrawnSeed,\n });\n\n strokeClasses += ' transition';\n\n svgPath = select(svgPathNode)\n .select('path')\n .attr('id', edge.id)\n .attr('class', ' ' + strokeClasses + (edge.classes ? ' ' + edge.classes : ''))\n .attr('style', edgeStyles ? edgeStyles.reduce((acc, style) => acc + ';' + style, '') : '');\n let d = svgPath.attr('d');\n svgPath.attr('d', d);\n elem.node().appendChild(svgPath.node());\n } else {\n const stylesFromClasses = edgeClassStyles.join(';');\n const styles = edgeStyles ? edgeStyles.reduce((acc, style) => acc + style + ';', '') : '';\n let animationClass = '';\n if (edge.animate) {\n animationClass = ' edge-animation-fast';\n }\n if (edge.animation) {\n animationClass = ' edge-animation-' + edge.animation;\n }\n\n const pathStyle =\n (stylesFromClasses ? stylesFromClasses + ';' + styles + ';' : styles) +\n ';' +\n (edgeStyles ? edgeStyles.reduce((acc, style) => acc + ';' + style, '') : '');\n svgPath = elem\n .append('path')\n .attr('d', linePath)\n .attr('id', edge.id)\n .attr(\n 'class',\n ' ' + strokeClasses + (edge.classes ? ' ' + edge.classes : '') + (animationClass ?? '')\n )\n .attr('style', pathStyle);\n\n //eslint-disable-next-line @typescript-eslint/prefer-regexp-exec\n strokeColor = pathStyle.match(/stroke:([^;]+)/)?.[1];\n\n // Possible fix to remove eslint-disable-next-line\n //strokeColor = /stroke:([^;]+)/.exec(pathStyle)?.[1];\n\n animatedEdge =\n edge.animate === true || !!edge.animation || stylesFromClasses.includes('animation');\n const pathNode = svgPath.node();\n const len = typeof pathNode.getTotalLength === 'function' ? pathNode.getTotalLength() : 0;\n const oValueS = markerOffsets2[edge.arrowTypeStart] || 0;\n const oValueE = markerOffsets2[edge.arrowTypeEnd] || 0;\n\n if (edge.look === 'neo' && !animatedEdge) {\n const dashArray =\n edge.pattern === 'dotted' || edge.pattern === 'dashed'\n ? generateDashArray(len, oValueS, oValueE)\n : `0 ${oValueS} ${len - oValueS - oValueE} ${oValueE}`;\n\n // No offset needed because we already start with a zero-length dash that effectively sets us up for a gap at the start.\n const mOffset = `stroke-dasharray: ${dashArray}; stroke-dashoffset: 0;`;\n svgPath.attr('style', mOffset + svgPath.attr('style'));\n }\n }\n\n // MC Special\n svgPath.attr('data-edge', true);\n svgPath.attr('data-et', 'edge');\n svgPath.attr('data-id', edge.id);\n svgPath.attr('data-points', pointsStr);\n\n // DEBUG code, adds a red circle at each edge coordinate\n // cornerPoints.forEach((point) => {\n // elem\n // .append('circle')\n // .style('stroke', 'blue')\n // .style('fill', 'blue')\n // .attr('r', 3)\n // .attr('cx', point.x)\n // .attr('cy', point.y);\n // });\n if (edge.showPoints) {\n lineData.forEach((point) => {\n elem\n .append('circle')\n .style('stroke', 'red')\n .style('fill', 'red')\n .attr('r', 1)\n .attr('cx', point.x)\n .attr('cy', point.y);\n });\n }\n\n let url = '';\n if (getConfig().flowchart.arrowMarkerAbsolute || getConfig().state.arrowMarkerAbsolute) {\n url =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n window.location.search;\n url = url.replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\n }\n log.info('arrowTypeStart', edge.arrowTypeStart);\n log.info('arrowTypeEnd', edge.arrowTypeEnd);\n\n addEdgeMarkers(svgPath, edge, url, id, diagramType, strokeColor);\n const midIndex = Math.floor(points.length / 2);\n const point = points[midIndex];\n if (!utils.isLabelCoordinateInPath(point, svgPath.attr('d'))) {\n pointsHasChanged = true;\n }\n\n let paths = {};\n if (pointsHasChanged) {\n paths.updatedPath = points;\n }\n paths.originalPath = edge.points;\n return paths;\n};\n\n/**\n * Generates SVG path data with rounded corners from an array of points.\n * @param {Array} points - Array of points in the format [{x: Number, y: Number}, ...]\n * @param {Number} radius - The radius of the rounded corners\n * @returns {String} - SVG path data string\n */\nfunction generateRoundedPath(points, radius) {\n if (points.length < 2) {\n return '';\n }\n\n let path = '';\n const size = points.length;\n const epsilon = 1e-5;\n\n for (let i = 0; i < size; i++) {\n const currPoint = points[i];\n const prevPoint = points[i - 1];\n const nextPoint = points[i + 1];\n\n if (i === 0) {\n // Move to the first point\n path += `M${currPoint.x},${currPoint.y}`;\n } else if (i === size - 1) {\n // Last point, draw a straight line to the final point\n path += `L${currPoint.x},${currPoint.y}`;\n } else {\n // Calculate vectors for incoming and outgoing segments\n const dx1 = currPoint.x - prevPoint.x;\n const dy1 = currPoint.y - prevPoint.y;\n const dx2 = nextPoint.x - currPoint.x;\n const dy2 = nextPoint.y - currPoint.y;\n\n const len1 = Math.hypot(dx1, dy1);\n const len2 = Math.hypot(dx2, dy2);\n\n // Prevent division by zero\n if (len1 < epsilon || len2 < epsilon) {\n path += `L${currPoint.x},${currPoint.y}`;\n continue;\n }\n\n // Normalize the vectors\n const nx1 = dx1 / len1;\n const ny1 = dy1 / len1;\n const nx2 = dx2 / len2;\n const ny2 = dy2 / len2;\n\n // Calculate the angle between the vectors\n const dot = nx1 * nx2 + ny1 * ny2;\n // Clamp the dot product to avoid numerical issues with acos\n const clampedDot = Math.max(-1, Math.min(1, dot));\n const angle = Math.acos(clampedDot);\n\n // Skip rounding if the angle is too small or too close to 180 degrees\n if (angle < epsilon || Math.abs(Math.PI - angle) < epsilon) {\n path += `L${currPoint.x},${currPoint.y}`;\n continue;\n }\n\n // Calculate the distance to offset the control point\n const cutLen = Math.min(radius / Math.sin(angle / 2), len1 / 2, len2 / 2);\n\n // Calculate the start and end points of the curve\n const startX = currPoint.x - nx1 * cutLen;\n const startY = currPoint.y - ny1 * cutLen;\n const endX = currPoint.x + nx2 * cutLen;\n const endY = currPoint.y + ny2 * cutLen;\n\n // Draw the line to the start of the curve\n path += `L${startX},${startY}`;\n\n // Draw the quadratic Bezier curve\n path += `Q${currPoint.x},${currPoint.y} ${endX},${endY}`;\n }\n }\n\n return path;\n}\n// Helper function to calculate delta and angle between two points\nfunction calculateDeltaAndAngle(point1, point2) {\n if (!point1 || !point2) {\n return { angle: 0, deltaX: 0, deltaY: 0 };\n }\n const deltaX = point2.x - point1.x;\n const deltaY = point2.y - point1.y;\n const angle = Math.atan2(deltaY, deltaX);\n return { angle, deltaX, deltaY };\n}\n\n// Function to adjust the first and last points of the points array\nfunction applyMarkerOffsetsToPoints(points, edge) {\n // Copy the points array to avoid mutating the original data\n const newPoints = points.map((point) => ({ ...point }));\n\n // Handle the first point (start of the edge)\n if (points.length >= 2 && markerOffsets[edge.arrowTypeStart]) {\n const offsetValue = markerOffsets[edge.arrowTypeStart];\n\n const point1 = points[0];\n const point2 = points[1];\n\n const { angle } = calculateDeltaAndAngle(point1, point2);\n\n const offsetX = offsetValue * Math.cos(angle);\n const offsetY = offsetValue * Math.sin(angle);\n\n newPoints[0].x = point1.x + offsetX;\n newPoints[0].y = point1.y + offsetY;\n }\n\n // Handle the last point (end of the edge)\n const n = points.length;\n if (n >= 2 && markerOffsets[edge.arrowTypeEnd]) {\n const offsetValue = markerOffsets[edge.arrowTypeEnd];\n\n const point1 = points[n - 1];\n const point2 = points[n - 2];\n\n const { angle } = calculateDeltaAndAngle(point2, point1);\n\n const offsetX = offsetValue * Math.cos(angle);\n const offsetY = offsetValue * Math.sin(angle);\n\n newPoints[n - 1].x = point1.x - offsetX;\n newPoints[n - 1].y = point1.y - offsetY;\n }\n\n return newPoints;\n}\n", "import type { SVG } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport type { EdgeData } from '../../types.js';\n/**\n * Adds SVG markers to a path element based on the arrow types specified in the edge.\n *\n * @param svgPath - The SVG path element to add markers to.\n * @param edge - The edge data object containing the arrow types.\n * @param url - The URL of the SVG marker definitions.\n * @param id - The ID prefix for the SVG marker definitions.\n * @param diagramType - The type of diagram being rendered.\n */\nexport const addEdgeMarkers = (\n svgPath: SVG,\n edge: Pick,\n url: string,\n id: string,\n diagramType: string,\n strokeColor?: string\n) => {\n if (edge.arrowTypeStart) {\n addEdgeMarker(svgPath, 'start', edge.arrowTypeStart, url, id, diagramType, strokeColor);\n }\n if (edge.arrowTypeEnd) {\n addEdgeMarker(svgPath, 'end', edge.arrowTypeEnd, url, id, diagramType, strokeColor);\n }\n};\n\nconst arrowTypesMap = {\n arrow_cross: { type: 'cross', fill: false },\n arrow_point: { type: 'point', fill: true },\n arrow_barb: { type: 'barb', fill: true },\n arrow_circle: { type: 'circle', fill: false },\n aggregation: { type: 'aggregation', fill: false },\n extension: { type: 'extension', fill: false },\n composition: { type: 'composition', fill: true },\n dependency: { type: 'dependency', fill: true },\n lollipop: { type: 'lollipop', fill: false },\n only_one: { type: 'onlyOne', fill: false },\n zero_or_one: { type: 'zeroOrOne', fill: false },\n one_or_more: { type: 'oneOrMore', fill: false },\n zero_or_more: { type: 'zeroOrMore', fill: false },\n requirement_arrow: { type: 'requirement_arrow', fill: false },\n requirement_contains: { type: 'requirement_contains', fill: false },\n} as const;\n\nconst addEdgeMarker = (\n svgPath: SVG,\n position: 'start' | 'end',\n arrowType: string,\n url: string,\n id: string,\n diagramType: string,\n strokeColor?: string\n) => {\n const arrowTypeInfo = arrowTypesMap[arrowType as keyof typeof arrowTypesMap];\n\n if (!arrowTypeInfo) {\n log.warn(`Unknown arrow type: ${arrowType}`);\n return; // unknown arrow type, ignore\n }\n\n const endMarkerType = arrowTypeInfo.type;\n const suffix = position === 'start' ? 'Start' : 'End';\n const originalMarkerId = `${id}_${diagramType}-${endMarkerType}${suffix}`;\n\n // If stroke color is specified and non-empty, create or use a colored variant of the marker\n if (strokeColor && strokeColor.trim() !== '') {\n // Create a sanitized color value for use in IDs\n const colorId = strokeColor.replace(/[^\\dA-Za-z]/g, '_');\n const coloredMarkerId = `${originalMarkerId}_${colorId}`;\n\n // Check if the colored marker already exists\n if (!document.getElementById(coloredMarkerId)) {\n // Get the original marker\n const originalMarker = document.getElementById(originalMarkerId);\n if (originalMarker) {\n // Clone the marker and create colored version\n const coloredMarker = originalMarker.cloneNode(true) as Element;\n coloredMarker.id = coloredMarkerId;\n\n // Apply colors to the paths inside the marker\n const paths = coloredMarker.querySelectorAll('path, circle, line');\n paths.forEach((path) => {\n path.setAttribute('stroke', strokeColor);\n\n // Apply fill only to markers that should be filled\n if (arrowTypeInfo.fill) {\n path.setAttribute('fill', strokeColor);\n }\n });\n\n // Add the new colored marker to the defs section\n originalMarker.parentNode?.appendChild(coloredMarker);\n }\n }\n\n // Use the colored marker\n svgPath.attr(`marker-${position}`, `url(${url}#${coloredMarkerId})`);\n } else {\n // Always use the original marker for unstyled edges\n svgPath.attr(`marker-${position}`, `url(${url}#${originalMarkerId})`);\n }\n};\n", "/** Setup arrow head and define the marker. The result is appended to the svg. */\nimport { log } from '../../logger.js';\n\n// Only add the number of markers that the diagram needs\nconst insertMarkers = (elem, markerArray, type, id) => {\n markerArray.forEach((markerName) => {\n markers[markerName](elem, type, id);\n });\n};\n\nconst extension = (elem, type, id) => {\n log.trace('Making markers for ', id);\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-extensionStart')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,7 L18,13 V 1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-extensionEnd')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead\n};\n\nconst composition = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-compositionStart')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-compositionEnd')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst aggregation = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-aggregationStart')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-aggregationEnd')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst dependency = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-dependencyStart')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 6)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-dependencyEnd')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 13)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\nconst lollipop = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-lollipopStart')\n .attr('class', 'marker lollipop ' + type)\n .attr('refX', 13)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('circle')\n .attr('stroke', 'black')\n .attr('fill', 'transparent')\n .attr('cx', 7)\n .attr('cy', 7)\n .attr('r', 6);\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-lollipopEnd')\n .attr('class', 'marker lollipop ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('circle')\n .attr('stroke', 'black')\n .attr('fill', 'transparent')\n .attr('cx', 7)\n .attr('cy', 7)\n .attr('r', 6);\n};\nconst point = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-pointEnd')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 5)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 8)\n .attr('markerHeight', 8)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 0 L 10 5 L 0 10 z')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-pointStart')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 4.5)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 8)\n .attr('markerHeight', 8)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 5 L 10 10 L 10 0 z')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n};\nconst circle = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-circleEnd')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 11)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-circleStart')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', -1)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n};\nconst cross = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-crossEnd')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 11 11')\n .attr('refX', 12)\n .attr('refY', 5.2)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('path')\n // .attr('stroke', 'black')\n .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '1,0');\n\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-crossStart')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 11 11')\n .attr('refX', -1)\n .attr('refY', 5.2)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('path')\n // .attr('stroke', 'black')\n .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '1,0');\n};\nconst barb = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-barbEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 14)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');\n};\n// erDiagram specific markers\nconst only_one = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-onlyOneStart')\n .attr('class', 'marker onlyOne ' + type)\n .attr('refX', 0)\n .attr('refY', 9)\n .attr('markerWidth', 18)\n .attr('markerHeight', 18)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M9,0 L9,18 M15,0 L15,18');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-onlyOneEnd')\n .attr('class', 'marker onlyOne ' + type)\n .attr('refX', 18)\n .attr('refY', 9)\n .attr('markerWidth', 18)\n .attr('markerHeight', 18)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M3,0 L3,18 M9,0 L9,18');\n};\n\nconst zero_or_one = (elem, type, id) => {\n const startMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrOneStart')\n .attr('class', 'marker zeroOrOne ' + type)\n .attr('refX', 0)\n .attr('refY', 9)\n .attr('markerWidth', 30)\n .attr('markerHeight', 18)\n .attr('orient', 'auto');\n startMarker\n .append('circle')\n .attr('fill', 'white') // Fill white for now?\n .attr('cx', 21)\n .attr('cy', 9)\n .attr('r', 6);\n startMarker.append('path').attr('d', 'M9,0 L9,18');\n\n const endMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrOneEnd')\n .attr('class', 'marker zeroOrOne ' + type)\n .attr('refX', 30)\n .attr('refY', 9)\n .attr('markerWidth', 30)\n .attr('markerHeight', 18)\n .attr('orient', 'auto');\n endMarker\n .append('circle')\n .attr('fill', 'white') // Fill white for now?\n .attr('cx', 9)\n .attr('cy', 9)\n .attr('r', 6);\n endMarker.append('path').attr('d', 'M21,0 L21,18');\n};\n\nconst one_or_more = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-oneOrMoreStart')\n .attr('class', 'marker oneOrMore ' + type)\n .attr('refX', 18)\n .attr('refY', 18)\n .attr('markerWidth', 45)\n .attr('markerHeight', 36)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-oneOrMoreEnd')\n .attr('class', 'marker oneOrMore ' + type)\n .attr('refX', 27)\n .attr('refY', 18)\n .attr('markerWidth', 45)\n .attr('markerHeight', 36)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18');\n};\n\nconst zero_or_more = (elem, type, id) => {\n const startMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrMoreStart')\n .attr('class', 'marker zeroOrMore ' + type)\n .attr('refX', 18)\n .attr('refY', 18)\n .attr('markerWidth', 57)\n .attr('markerHeight', 36)\n .attr('orient', 'auto');\n startMarker.append('circle').attr('fill', 'white').attr('cx', 48).attr('cy', 18).attr('r', 6);\n startMarker.append('path').attr('d', 'M0,18 Q18,0 36,18 Q18,36 0,18');\n\n const endMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrMoreEnd')\n .attr('class', 'marker zeroOrMore ' + type)\n .attr('refX', 39)\n .attr('refY', 18)\n .attr('markerWidth', 57)\n .attr('markerHeight', 36)\n .attr('orient', 'auto');\n endMarker.append('circle').attr('fill', 'white').attr('cx', 9).attr('cy', 18).attr('r', 6);\n endMarker.append('path').attr('d', 'M21,18 Q39,0 57,18 Q39,36 21,18');\n};\n\nconst requirement_arrow = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-requirement_arrowEnd')\n .attr('refX', 20)\n .attr('refY', 10)\n .attr('markerWidth', 20)\n .attr('markerHeight', 20)\n .attr('orient', 'auto')\n .append('path')\n .attr(\n 'd',\n `M0,0\n L20,10\n M20,10\n L0,20`\n );\n};\nconst requirement_contains = (elem, type, id) => {\n const containsNode = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-requirement_containsStart')\n .attr('refX', 0)\n .attr('refY', 10)\n .attr('markerWidth', 20)\n .attr('markerHeight', 20)\n .attr('orient', 'auto')\n .append('g');\n\n containsNode.append('circle').attr('cx', 10).attr('cy', 10).attr('r', 9).attr('fill', 'none');\n\n containsNode.append('line').attr('x1', 1).attr('x2', 19).attr('y1', 10).attr('y2', 10);\n\n containsNode.append('line').attr('y1', 1).attr('y2', 19).attr('x1', 10).attr('x2', 10);\n};\n\n// TODO rename the class diagram markers to something shape descriptive and semantic free\nconst markers = {\n extension,\n composition,\n aggregation,\n dependency,\n lollipop,\n point,\n circle,\n cross,\n barb,\n only_one,\n zero_or_one,\n one_or_more,\n zero_or_more,\n requirement_arrow,\n requirement_contains,\n};\nexport default insertMarkers;\n"], + "mappings": "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", + "names": ["point"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QZHKN3VN.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QZHKN3VN.mjs new file mode 100644 index 0000000..792a9bf --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QZHKN3VN.mjs @@ -0,0 +1,24 @@ +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/utils/imperativeState.ts +var ImperativeState = class { + /** + * @param init - Function that creates the default state. + */ + constructor(init) { + this.init = init; + this.records = this.init(); + } + static { + __name(this, "ImperativeState"); + } + reset() { + this.records = this.init(); + } +}; + +export { + ImperativeState +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QZHKN3VN.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QZHKN3VN.mjs.map new file mode 100644 index 0000000..a8ca253 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-QZHKN3VN.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/utils/imperativeState.ts"], + "sourcesContent": ["/**\n * Resettable state storage.\n * @example\n * ```\n * const state = new ImperativeState(() => ({\n * foo: undefined as string | undefined,\n * bar: [] as number[],\n * baz: 1 as number | undefined,\n * }));\n *\n * state.records.foo = \"hi\";\n * console.log(state.records.foo); // prints \"hi\";\n * state.reset();\n * console.log(state.records.foo); // prints \"default\";\n *\n * // typeof state.records:\n * // {\n * // foo: string | undefined, // actual: undefined\n * // bar: number[], // actual: []\n * // baz: number | undefined, // actual: 1\n * // }\n * ```\n */\nexport class ImperativeState {\n public records: S;\n\n /**\n * @param init - Function that creates the default state.\n */\n constructor(private init: () => S) {\n this.records = this.init();\n }\n\n reset() {\n this.records = this.init();\n }\n}\n"], + "mappings": ";;;;;AAuBO,IAAM,kBAAN,MAAyB;AAAA;AAAA;AAAA;AAAA,EAM9B,YAAoB,MAAe;AAAf;AAClB,SAAK,UAAU,KAAK,KAAK;AAAA,EAC3B;AAAA,EA/BF,OAuBgC;AAAA;AAAA;AAAA,EAU9B,QAAQ;AACN,SAAK,UAAU,KAAK,KAAK;AAAA,EAC3B;AACF;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-S3R3BYOJ.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-S3R3BYOJ.mjs new file mode 100644 index 0000000..eaacb33 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-S3R3BYOJ.mjs @@ -0,0 +1,585 @@ +import { + assignWithDepth_default, + common_default, + detectType, + directiveRegex, + sanitizeDirective +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/utils.ts +import { sanitizeUrl } from "@braintree/sanitize-url"; +import { + curveBasis, + curveBasisClosed, + curveBasisOpen, + curveBumpX, + curveBumpY, + curveBundle, + curveCardinalClosed, + curveCardinalOpen, + curveCardinal, + curveCatmullRomClosed, + curveCatmullRomOpen, + curveCatmullRom, + curveLinear, + curveLinearClosed, + curveMonotoneX, + curveMonotoneY, + curveNatural, + curveStep, + curveStepAfter, + curveStepBefore, + select +} from "d3"; +import memoize from "lodash-es/memoize.js"; +import merge from "lodash-es/merge.js"; +var ZERO_WIDTH_SPACE = "\u200B"; +var d3CurveTypes = { + curveBasis, + curveBasisClosed, + curveBasisOpen, + curveBumpX, + curveBumpY, + curveBundle, + curveCardinalClosed, + curveCardinalOpen, + curveCardinal, + curveCatmullRomClosed, + curveCatmullRomOpen, + curveCatmullRom, + curveLinear, + curveLinearClosed, + curveMonotoneX, + curveMonotoneY, + curveNatural, + curveStep, + curveStepAfter, + curveStepBefore +}; +var directiveWithoutOpen = /\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi; +var detectInit = /* @__PURE__ */ __name(function(text, config) { + const inits = detectDirective(text, /(?:init\b)|(?:initialize\b)/); + let results = {}; + if (Array.isArray(inits)) { + const args = inits.map((init) => init.args); + sanitizeDirective(args); + results = assignWithDepth_default(results, [...args]); + } else { + results = inits.args; + } + if (!results) { + return; + } + let type = detectType(text, config); + const prop = "config"; + if (results[prop] !== void 0) { + if (type === "flowchart-v2") { + type = "flowchart"; + } + results[type] = results[prop]; + delete results[prop]; + } + return results; +}, "detectInit"); +var detectDirective = /* @__PURE__ */ __name(function(text, type = null) { + try { + const commentWithoutDirectives = new RegExp( + `[%]{2}(?![{]${directiveWithoutOpen.source})(?=[}][%]{2}).* +`, + "ig" + ); + text = text.trim().replace(commentWithoutDirectives, "").replace(/'/gm, '"'); + log.debug( + `Detecting diagram directive${type !== null ? " type:" + type : ""} based on the text:${text}` + ); + let match; + const result = []; + while ((match = directiveRegex.exec(text)) !== null) { + if (match.index === directiveRegex.lastIndex) { + directiveRegex.lastIndex++; + } + if (match && !type || type && match[1]?.match(type) || type && match[2]?.match(type)) { + const type2 = match[1] ? match[1] : match[2]; + const args = match[3] ? match[3].trim() : match[4] ? JSON.parse(match[4].trim()) : null; + result.push({ type: type2, args }); + } + } + if (result.length === 0) { + return { type: text, args: null }; + } + return result.length === 1 ? result[0] : result; + } catch (error) { + log.error( + `ERROR: ${error.message} - Unable to parse directive type: '${type}' based on the text: '${text}'` + ); + return { type: void 0, args: null }; + } +}, "detectDirective"); +var removeDirectives = /* @__PURE__ */ __name(function(text) { + return text.replace(directiveRegex, ""); +}, "removeDirectives"); +var isSubstringInArray = /* @__PURE__ */ __name(function(str, arr) { + for (const [i, element] of arr.entries()) { + if (element.match(str)) { + return i; + } + } + return -1; +}, "isSubstringInArray"); +function interpolateToCurve(interpolate, defaultCurve) { + if (!interpolate) { + return defaultCurve; + } + const curveName = `curve${interpolate.charAt(0).toUpperCase() + interpolate.slice(1)}`; + return d3CurveTypes[curveName] ?? defaultCurve; +} +__name(interpolateToCurve, "interpolateToCurve"); +function formatUrl(linkStr, config) { + const url = linkStr.trim(); + if (!url) { + return void 0; + } + if (config.securityLevel !== "loose") { + return sanitizeUrl(url); + } + return url; +} +__name(formatUrl, "formatUrl"); +var runFunc = /* @__PURE__ */ __name((functionName, ...params) => { + const arrPaths = functionName.split("."); + const len = arrPaths.length - 1; + const fnName = arrPaths[len]; + let obj = window; + for (let i = 0; i < len; i++) { + obj = obj[arrPaths[i]]; + if (!obj) { + log.error(`Function name: ${functionName} not found in window`); + return; + } + } + obj[fnName](...params); +}, "runFunc"); +function distance(p1, p2) { + if (!p1 || !p2) { + return 0; + } + return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2)); +} +__name(distance, "distance"); +function traverseEdge(points) { + let prevPoint; + let totalDistance = 0; + points.forEach((point) => { + totalDistance += distance(point, prevPoint); + prevPoint = point; + }); + const remainingDistance = totalDistance / 2; + return calculatePoint(points, remainingDistance); +} +__name(traverseEdge, "traverseEdge"); +function calcLabelPosition(points) { + if (points.length === 1) { + return points[0]; + } + return traverseEdge(points); +} +__name(calcLabelPosition, "calcLabelPosition"); +var roundNumber = /* @__PURE__ */ __name((num, precision = 2) => { + const factor = Math.pow(10, precision); + return Math.round(num * factor) / factor; +}, "roundNumber"); +var calculatePoint = /* @__PURE__ */ __name((points, distanceToTraverse) => { + let prevPoint = void 0; + let remainingDistance = distanceToTraverse; + for (const point of points) { + if (prevPoint) { + const vectorDistance = distance(point, prevPoint); + if (vectorDistance === 0) { + return prevPoint; + } + if (vectorDistance < remainingDistance) { + remainingDistance -= vectorDistance; + } else { + const distanceRatio = remainingDistance / vectorDistance; + if (distanceRatio <= 0) { + return prevPoint; + } + if (distanceRatio >= 1) { + return { x: point.x, y: point.y }; + } + if (distanceRatio > 0 && distanceRatio < 1) { + return { + x: roundNumber((1 - distanceRatio) * prevPoint.x + distanceRatio * point.x, 5), + y: roundNumber((1 - distanceRatio) * prevPoint.y + distanceRatio * point.y, 5) + }; + } + } + } + prevPoint = point; + } + throw new Error("Could not find a suitable point for the given distance"); +}, "calculatePoint"); +var calcCardinalityPosition = /* @__PURE__ */ __name((isRelationTypePresent, points, initialPosition) => { + log.info(`our points ${JSON.stringify(points)}`); + if (points[0] !== initialPosition) { + points = points.reverse(); + } + const distanceToCardinalityPoint = 25; + const center = calculatePoint(points, distanceToCardinalityPoint); + const d = isRelationTypePresent ? 10 : 5; + const angle = Math.atan2(points[0].y - center.y, points[0].x - center.x); + const cardinalityPosition = { x: 0, y: 0 }; + cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2; + cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2; + return cardinalityPosition; +}, "calcCardinalityPosition"); +function calcTerminalLabelPosition(terminalMarkerSize, position, _points) { + const points = structuredClone(_points); + log.info("our points", points); + if (position !== "start_left" && position !== "start_right") { + points.reverse(); + } + const distanceToCardinalityPoint = 25 + terminalMarkerSize; + const center = calculatePoint(points, distanceToCardinalityPoint); + const d = 10 + terminalMarkerSize * 0.5; + const angle = Math.atan2(points[0].y - center.y, points[0].x - center.x); + const cardinalityPosition = { x: 0, y: 0 }; + if (position === "start_left") { + cardinalityPosition.x = Math.sin(angle + Math.PI) * d + (points[0].x + center.x) / 2; + cardinalityPosition.y = -Math.cos(angle + Math.PI) * d + (points[0].y + center.y) / 2; + } else if (position === "end_right") { + cardinalityPosition.x = Math.sin(angle - Math.PI) * d + (points[0].x + center.x) / 2 - 5; + cardinalityPosition.y = -Math.cos(angle - Math.PI) * d + (points[0].y + center.y) / 2 - 5; + } else if (position === "end_left") { + cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2 - 5; + cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2 - 5; + } else { + cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2; + cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2; + } + return cardinalityPosition; +} +__name(calcTerminalLabelPosition, "calcTerminalLabelPosition"); +function getStylesFromArray(arr) { + let style = ""; + let labelStyle = ""; + for (const element of arr) { + if (element !== void 0) { + if (element.startsWith("color:") || element.startsWith("text-align:")) { + labelStyle = labelStyle + element + ";"; + } else { + style = style + element + ";"; + } + } + } + return { style, labelStyle }; +} +__name(getStylesFromArray, "getStylesFromArray"); +var cnt = 0; +var generateId = /* @__PURE__ */ __name(() => { + cnt++; + return "id-" + Math.random().toString(36).substr(2, 12) + "-" + cnt; +}, "generateId"); +function makeRandomHex(length) { + let result = ""; + const characters = "0123456789abcdef"; + const charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} +__name(makeRandomHex, "makeRandomHex"); +var random = /* @__PURE__ */ __name((options) => { + return makeRandomHex(options.length); +}, "random"); +var getTextObj = /* @__PURE__ */ __name(function() { + return { + x: 0, + y: 0, + fill: void 0, + anchor: "start", + style: "#666", + width: 100, + height: 100, + textMargin: 0, + rx: 0, + ry: 0, + valign: void 0, + text: "" + }; +}, "getTextObj"); +var drawSimpleText = /* @__PURE__ */ __name(function(elem, textData) { + const nText = textData.text.replace(common_default.lineBreakRegex, " "); + const [, _fontSizePx] = parseFontSize(textData.fontSize); + const textElem = elem.append("text"); + textElem.attr("x", textData.x); + textElem.attr("y", textData.y); + textElem.style("text-anchor", textData.anchor); + textElem.style("font-family", textData.fontFamily); + textElem.style("font-size", _fontSizePx); + textElem.style("font-weight", textData.fontWeight); + textElem.attr("fill", textData.fill); + if (textData.class !== void 0) { + textElem.attr("class", textData.class); + } + const span = textElem.append("tspan"); + span.attr("x", textData.x + textData.textMargin * 2); + span.attr("fill", textData.fill); + span.text(nText); + return textElem; +}, "drawSimpleText"); +var wrapLabel = memoize( + (label, maxWidth, config) => { + if (!label) { + return label; + } + config = Object.assign( + { fontSize: 12, fontWeight: 400, fontFamily: "Arial", joinWith: "
" }, + config + ); + if (common_default.lineBreakRegex.test(label)) { + return label; + } + const words = label.split(" ").filter(Boolean); + const completedLines = []; + let nextLine = ""; + words.forEach((word, index) => { + const wordLength = calculateTextWidth(`${word} `, config); + const nextLineLength = calculateTextWidth(nextLine, config); + if (wordLength > maxWidth) { + const { hyphenatedStrings, remainingWord } = breakString(word, maxWidth, "-", config); + completedLines.push(nextLine, ...hyphenatedStrings); + nextLine = remainingWord; + } else if (nextLineLength + wordLength >= maxWidth) { + completedLines.push(nextLine); + nextLine = word; + } else { + nextLine = [nextLine, word].filter(Boolean).join(" "); + } + const currentWord = index + 1; + const isLastWord = currentWord === words.length; + if (isLastWord) { + completedLines.push(nextLine); + } + }); + return completedLines.filter((line) => line !== "").join(config.joinWith); + }, + (label, maxWidth, config) => `${label}${maxWidth}${config.fontSize}${config.fontWeight}${config.fontFamily}${config.joinWith}` +); +var breakString = memoize( + (word, maxWidth, hyphenCharacter = "-", config) => { + config = Object.assign( + { fontSize: 12, fontWeight: 400, fontFamily: "Arial", margin: 0 }, + config + ); + const characters = [...word]; + const lines = []; + let currentLine = ""; + characters.forEach((character, index) => { + const nextLine = `${currentLine}${character}`; + const lineWidth = calculateTextWidth(nextLine, config); + if (lineWidth >= maxWidth) { + const currentCharacter = index + 1; + const isLastLine = characters.length === currentCharacter; + const hyphenatedNextLine = `${nextLine}${hyphenCharacter}`; + lines.push(isLastLine ? nextLine : hyphenatedNextLine); + currentLine = ""; + } else { + currentLine = nextLine; + } + }); + return { hyphenatedStrings: lines, remainingWord: currentLine }; + }, + (word, maxWidth, hyphenCharacter = "-", config) => `${word}${maxWidth}${hyphenCharacter}${config.fontSize}${config.fontWeight}${config.fontFamily}` +); +function calculateTextHeight(text, config) { + return calculateTextDimensions(text, config).height; +} +__name(calculateTextHeight, "calculateTextHeight"); +function calculateTextWidth(text, config) { + return calculateTextDimensions(text, config).width; +} +__name(calculateTextWidth, "calculateTextWidth"); +var calculateTextDimensions = memoize( + (text, config) => { + const { fontSize = 12, fontFamily = "Arial", fontWeight = 400 } = config; + if (!text) { + return { width: 0, height: 0 }; + } + const [, _fontSizePx] = parseFontSize(fontSize); + const fontFamilies = ["sans-serif", fontFamily]; + const lines = text.split(common_default.lineBreakRegex); + const dims = []; + const body = select("body"); + if (!body.remove) { + return { width: 0, height: 0, lineHeight: 0 }; + } + const g = body.append("svg"); + for (const fontFamily2 of fontFamilies) { + let cHeight = 0; + const dim = { width: 0, height: 0, lineHeight: 0 }; + for (const line of lines) { + const textObj = getTextObj(); + textObj.text = line || ZERO_WIDTH_SPACE; + const textElem = drawSimpleText(g, textObj).style("font-size", _fontSizePx).style("font-weight", fontWeight).style("font-family", fontFamily2); + const bBox = (textElem._groups || textElem)[0][0].getBBox(); + if (bBox.width === 0 && bBox.height === 0) { + throw new Error("svg element not in render tree"); + } + dim.width = Math.round(Math.max(dim.width, bBox.width)); + cHeight = Math.round(bBox.height); + dim.height += cHeight; + dim.lineHeight = Math.round(Math.max(dim.lineHeight, cHeight)); + } + dims.push(dim); + } + g.remove(); + const index = isNaN(dims[1].height) || isNaN(dims[1].width) || isNaN(dims[1].lineHeight) || dims[0].height > dims[1].height && dims[0].width > dims[1].width && dims[0].lineHeight > dims[1].lineHeight ? 0 : 1; + return dims[index]; + }, + (text, config) => `${text}${config.fontSize}${config.fontWeight}${config.fontFamily}` +); +var InitIDGenerator = class { + constructor(deterministic = false, seed) { + this.count = 0; + this.count = seed ? seed.length : 0; + this.next = deterministic ? () => this.count++ : () => Date.now(); + } + static { + __name(this, "InitIDGenerator"); + } +}; +var decoder; +var entityDecode = /* @__PURE__ */ __name(function(html) { + decoder = decoder || document.createElement("div"); + html = escape(html).replace(/%26/g, "&").replace(/%23/g, "#").replace(/%3B/g, ";"); + decoder.innerHTML = html; + return unescape(decoder.textContent); +}, "entityDecode"); +function isDetailedError(error) { + return "str" in error; +} +__name(isDetailedError, "isDetailedError"); +var insertTitle = /* @__PURE__ */ __name((parent, cssClass, titleTopMargin, title) => { + if (!title) { + return; + } + const bounds = parent.node()?.getBBox(); + if (!bounds) { + return; + } + parent.append("text").text(title).attr("text-anchor", "middle").attr("x", bounds.x + bounds.width / 2).attr("y", -titleTopMargin).attr("class", cssClass); +}, "insertTitle"); +var parseFontSize = /* @__PURE__ */ __name((fontSize) => { + if (typeof fontSize === "number") { + return [fontSize, fontSize + "px"]; + } + const fontSizeNumber = parseInt(fontSize ?? "", 10); + if (Number.isNaN(fontSizeNumber)) { + return [void 0, void 0]; + } else if (fontSize === String(fontSizeNumber)) { + return [fontSizeNumber, fontSize + "px"]; + } else { + return [fontSizeNumber, fontSize]; + } +}, "parseFontSize"); +function cleanAndMerge(defaultData, data) { + return merge({}, defaultData, data); +} +__name(cleanAndMerge, "cleanAndMerge"); +var utils_default = { + assignWithDepth: assignWithDepth_default, + wrapLabel, + calculateTextHeight, + calculateTextWidth, + calculateTextDimensions, + cleanAndMerge, + detectInit, + detectDirective, + isSubstringInArray, + interpolateToCurve, + calcLabelPosition, + calcCardinalityPosition, + calcTerminalLabelPosition, + formatUrl, + getStylesFromArray, + generateId, + random, + runFunc, + entityDecode, + insertTitle, + isLabelCoordinateInPath, + parseFontSize, + InitIDGenerator +}; +var encodeEntities = /* @__PURE__ */ __name(function(text) { + let txt = text; + txt = txt.replace(/style.*:\S*#.*;/g, function(s) { + return s.substring(0, s.length - 1); + }); + txt = txt.replace(/classDef.*:\S*#.*;/g, function(s) { + return s.substring(0, s.length - 1); + }); + txt = txt.replace(/#\w+;/g, function(s) { + const innerTxt = s.substring(1, s.length - 1); + const isInt = /^\+?\d+$/.test(innerTxt); + if (isInt) { + return "\uFB02\xB0\xB0" + innerTxt + "\xB6\xDF"; + } else { + return "\uFB02\xB0" + innerTxt + "\xB6\xDF"; + } + }); + return txt; +}, "encodeEntities"); +var decodeEntities = /* @__PURE__ */ __name(function(text) { + return text.replace(/fl°°/g, "&#").replace(/fl°/g, "&").replace(/¶ß/g, ";"); +}, "decodeEntities"); +var getEdgeId = /* @__PURE__ */ __name((from, to, { + counter = 0, + prefix, + suffix +}, id) => { + if (id) { + return id; + } + return `${prefix ? `${prefix}_` : ""}${from}_${to}_${counter}${suffix ? `_${suffix}` : ""}`; +}, "getEdgeId"); +function handleUndefinedAttr(attrValue) { + return attrValue ?? null; +} +__name(handleUndefinedAttr, "handleUndefinedAttr"); +function isLabelCoordinateInPath(point, dAttr) { + const roundedX = Math.round(point.x); + const roundedY = Math.round(point.y); + const sanitizedD = dAttr.replace( + /(\d+\.\d+)/g, + (match) => Math.round(parseFloat(match)).toString() + ); + return sanitizedD.includes(roundedX.toString()) || sanitizedD.includes(roundedY.toString()); +} +__name(isLabelCoordinateInPath, "isLabelCoordinateInPath"); + +export { + ZERO_WIDTH_SPACE, + removeDirectives, + interpolateToCurve, + getStylesFromArray, + generateId, + random, + wrapLabel, + calculateTextHeight, + calculateTextWidth, + isDetailedError, + parseFontSize, + cleanAndMerge, + utils_default, + encodeEntities, + decodeEntities, + getEdgeId, + handleUndefinedAttr +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-S3R3BYOJ.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-S3R3BYOJ.mjs.map new file mode 100644 index 0000000..e3ce86b --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-S3R3BYOJ.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/utils.ts"], + "sourcesContent": ["import { sanitizeUrl } from '@braintree/sanitize-url';\nimport type { BaseType, CurveFactory } from 'd3';\nimport {\n curveBasis,\n curveBasisClosed,\n curveBasisOpen,\n curveBumpX,\n curveBumpY,\n curveBundle,\n curveCardinalClosed,\n curveCardinalOpen,\n curveCardinal,\n curveCatmullRomClosed,\n curveCatmullRomOpen,\n curveCatmullRom,\n curveLinear,\n curveLinearClosed,\n curveMonotoneX,\n curveMonotoneY,\n curveNatural,\n curveStep,\n curveStepAfter,\n curveStepBefore,\n select,\n} from 'd3';\nimport common from './diagrams/common/common.js';\nimport { sanitizeDirective } from './utils/sanitizeDirective.js';\nimport { log } from './logger.js';\nimport { detectType } from './diagram-api/detectType.js';\nimport assignWithDepth from './assignWithDepth.js';\nimport type { MermaidConfig } from './config.type.js';\nimport memoize from 'lodash-es/memoize.js';\nimport merge from 'lodash-es/merge.js';\nimport { directiveRegex } from './diagram-api/regexes.js';\nimport type { D3Element, Point, TextDimensionConfig, TextDimensions } from './types.js';\n\nexport const ZERO_WIDTH_SPACE = '\\u200b';\n\n// Effectively an enum of the supported curve types, accessible by name\nconst d3CurveTypes = {\n curveBasis: curveBasis,\n curveBasisClosed: curveBasisClosed,\n curveBasisOpen: curveBasisOpen,\n curveBumpX: curveBumpX,\n curveBumpY: curveBumpY,\n curveBundle: curveBundle,\n curveCardinalClosed: curveCardinalClosed,\n curveCardinalOpen: curveCardinalOpen,\n curveCardinal: curveCardinal,\n curveCatmullRomClosed: curveCatmullRomClosed,\n curveCatmullRomOpen: curveCatmullRomOpen,\n curveCatmullRom: curveCatmullRom,\n curveLinear: curveLinear,\n curveLinearClosed: curveLinearClosed,\n curveMonotoneX: curveMonotoneX,\n curveMonotoneY: curveMonotoneY,\n curveNatural: curveNatural,\n curveStep: curveStep,\n curveStepAfter: curveStepAfter,\n curveStepBefore: curveStepBefore,\n} as const;\n\nconst directiveWithoutOpen =\n /\\s*(?:(\\w+)(?=:):|(\\w+))\\s*(?:(\\w+)|((?:(?!}%{2}).|\\r?\\n)*))?\\s*(?:}%{2})?/gi;\n/**\n * Detects the init config object from the text\n *\n * @param text - The text defining the graph. For example:\n *\n * ```mermaid\n * %%{init: {\"theme\": \"debug\", \"logLevel\": 1 }}%%\n * graph LR\n * a-->b\n * b-->c\n * c-->d\n * d-->e\n * e-->f\n * f-->g\n * g-->h\n * ```\n *\n * Or\n *\n * ```mermaid\n * %%{initialize: {\"theme\": \"dark\", logLevel: \"debug\" }}%%\n * graph LR\n * a-->b\n * b-->c\n * c-->d\n * d-->e\n * e-->f\n * f-->g\n * g-->h\n * ```\n *\n * @param config - Optional mermaid configuration object.\n * @returns The json object representing the init passed to mermaid.initialize()\n */\nexport const detectInit = function (\n text: string,\n config?: MermaidConfig\n): MermaidConfig | undefined {\n const inits = detectDirective(text, /(?:init\\b)|(?:initialize\\b)/);\n let results: MermaidConfig & { config?: unknown } = {};\n\n if (Array.isArray(inits)) {\n const args = inits.map((init) => init.args);\n sanitizeDirective(args);\n results = assignWithDepth(results, [...args]);\n } else {\n results = inits.args as MermaidConfig;\n }\n\n if (!results) {\n return;\n }\n\n let type = detectType(text, config);\n\n // Move the `config` value to appropriate diagram type value\n const prop = 'config';\n if (results[prop] !== undefined) {\n if (type === 'flowchart-v2') {\n type = 'flowchart';\n }\n results[type as keyof MermaidConfig] = results[prop];\n delete results[prop];\n }\n\n return results;\n};\n\ninterface Directive {\n type?: string;\n args?: unknown;\n}\n/**\n * Detects the directive from the text.\n *\n * Text can be single line or multiline. If type is null or omitted,\n * the first directive encountered in text will be returned\n *\n * ```mermaid\n * graph LR\n * %%{someDirective}%%\n * a-->b\n * b-->c\n * c-->d\n * d-->e\n * e-->f\n * f-->g\n * g-->h\n * ```\n *\n * @param text - The text defining the graph\n * @param type - The directive to return (default: `null`)\n * @returns An object or Array representing the directive(s) matched by the input type.\n * If a single directive was found, that directive object will be returned.\n */\nexport const detectDirective = function (\n text: string,\n type: string | RegExp | null = null\n): Directive | Directive[] {\n try {\n const commentWithoutDirectives = new RegExp(\n `[%]{2}(?![{]${directiveWithoutOpen.source})(?=[}][%]{2}).*\\n`,\n 'ig'\n );\n text = text.trim().replace(commentWithoutDirectives, '').replace(/'/gm, '\"');\n log.debug(\n `Detecting diagram directive${type !== null ? ' type:' + type : ''} based on the text:${text}`\n );\n let match: RegExpExecArray | null;\n const result: Directive[] = [];\n while ((match = directiveRegex.exec(text)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (match.index === directiveRegex.lastIndex) {\n directiveRegex.lastIndex++;\n }\n if ((match && !type) || (type && match[1]?.match(type)) || (type && match[2]?.match(type))) {\n const type = match[1] ? match[1] : match[2];\n const args = match[3] ? match[3].trim() : match[4] ? JSON.parse(match[4].trim()) : null;\n result.push({ type, args });\n }\n }\n if (result.length === 0) {\n return { type: text, args: null };\n }\n\n return result.length === 1 ? result[0] : result;\n } catch (error) {\n log.error(\n `ERROR: ${\n (error as Error).message\n } - Unable to parse directive type: '${type}' based on the text: '${text}'`\n );\n return { type: undefined, args: null };\n }\n};\n\nexport const removeDirectives = function (text: string): string {\n return text.replace(directiveRegex, '');\n};\n\n/**\n * Detects whether a substring in present in a given array\n *\n * @param str - The substring to detect\n * @param arr - The array to search\n * @returns The array index containing the substring or -1 if not present\n */\nexport const isSubstringInArray = function (str: string, arr: string[]): number {\n for (const [i, element] of arr.entries()) {\n if (element.match(str)) {\n return i;\n }\n }\n return -1;\n};\n\n/**\n * Returns a d3 curve given a curve name\n *\n * @param interpolate - The interpolation name\n * @param defaultCurve - The default curve to return\n * @returns The curve factory to use\n */\nexport function interpolateToCurve(\n interpolate: string | undefined,\n defaultCurve: CurveFactory\n): CurveFactory {\n if (!interpolate) {\n return defaultCurve;\n }\n const curveName = `curve${interpolate.charAt(0).toUpperCase() + interpolate.slice(1)}`;\n\n // @ts-ignore TODO: Fix issue with curve type\n return d3CurveTypes[curveName as keyof typeof d3CurveTypes] ?? defaultCurve;\n}\n\n/**\n * Formats a URL string\n *\n * @param linkStr - String of the URL\n * @param config - Configuration passed to MermaidJS\n * @returns The formatted URL or `undefined`.\n */\nexport function formatUrl(linkStr: string, config: MermaidConfig): string | undefined {\n const url = linkStr.trim();\n\n if (!url) {\n return undefined;\n }\n\n if (config.securityLevel !== 'loose') {\n return sanitizeUrl(url);\n }\n\n return url;\n}\n\n/**\n * Runs a function\n *\n * @param functionName - A dot separated path to the function relative to the `window`\n * @param params - Parameters to pass to the function\n */\nexport const runFunc = (functionName: string, ...params: unknown[]) => {\n const arrPaths = functionName.split('.');\n\n const len = arrPaths.length - 1;\n const fnName = arrPaths[len];\n\n let obj = window;\n for (let i = 0; i < len; i++) {\n obj = obj[arrPaths[i] as keyof typeof obj];\n if (!obj) {\n log.error(`Function name: ${functionName} not found in window`);\n return;\n }\n }\n\n obj[fnName as keyof typeof obj](...params);\n};\n\n/**\n * Finds the distance between two points using the Distance Formula\n *\n * @param p1 - The first point\n * @param p2 - The second point\n * @returns The distance between the two points.\n */\nfunction distance(p1?: Point, p2?: Point): number {\n if (!p1 || !p2) {\n return 0;\n }\n return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n}\n\n/**\n * TODO: Give this a description\n *\n * @param points - List of points\n */\nfunction traverseEdge(points: Point[]): Point {\n let prevPoint: Point | undefined;\n let totalDistance = 0;\n\n points.forEach((point) => {\n totalDistance += distance(point, prevPoint);\n prevPoint = point;\n });\n\n // Traverse half of total distance along points\n const remainingDistance = totalDistance / 2;\n return calculatePoint(points, remainingDistance);\n}\n\n/**\n * {@inheritdoc traverseEdge}\n */\nfunction calcLabelPosition(points: Point[]): Point {\n if (points.length === 1) {\n return points[0];\n }\n return traverseEdge(points);\n}\n\nexport const roundNumber = (num: number, precision = 2) => {\n const factor = Math.pow(10, precision);\n return Math.round(num * factor) / factor;\n};\n\nexport const calculatePoint = (points: Point[], distanceToTraverse: number): Point => {\n let prevPoint: Point | undefined = undefined;\n let remainingDistance = distanceToTraverse;\n for (const point of points) {\n if (prevPoint) {\n const vectorDistance = distance(point, prevPoint);\n if (vectorDistance === 0) {\n return prevPoint;\n }\n if (vectorDistance < remainingDistance) {\n remainingDistance -= vectorDistance;\n } else {\n // The point is remainingDistance from prevPoint in the vector between prevPoint and point\n // Calculate the coordinates\n const distanceRatio = remainingDistance / vectorDistance;\n if (distanceRatio <= 0) {\n return prevPoint;\n }\n if (distanceRatio >= 1) {\n return { x: point.x, y: point.y };\n }\n if (distanceRatio > 0 && distanceRatio < 1) {\n return {\n x: roundNumber((1 - distanceRatio) * prevPoint.x + distanceRatio * point.x, 5),\n y: roundNumber((1 - distanceRatio) * prevPoint.y + distanceRatio * point.y, 5),\n };\n }\n }\n }\n prevPoint = point;\n }\n throw new Error('Could not find a suitable point for the given distance');\n};\n\nconst calcCardinalityPosition = (\n isRelationTypePresent: boolean,\n points: Point[],\n initialPosition: Point\n) => {\n log.info(`our points ${JSON.stringify(points)}`);\n if (points[0] !== initialPosition) {\n points = points.reverse();\n }\n // Traverse only 25 total distance along points to find cardinality point\n const distanceToCardinalityPoint = 25;\n const center = calculatePoint(points, distanceToCardinalityPoint);\n // if relation is present (Arrows will be added), change cardinality point off-set distance (d)\n const d = isRelationTypePresent ? 10 : 5;\n //Calculate Angle for x and y axis\n const angle = Math.atan2(points[0].y - center.y, points[0].x - center.x);\n const cardinalityPosition = { x: 0, y: 0 };\n //Calculation cardinality position using angle, center point on the line/curve but perpendicular and with offset-distance\n cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2;\n cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2;\n return cardinalityPosition;\n};\n\n/**\n * Calculates the terminal label position.\n *\n * @param terminalMarkerSize - Terminal marker size.\n * @param position - Position of label relative to points.\n * @param _points - Array of points.\n * @returns - The `cardinalityPosition`.\n */\nfunction calcTerminalLabelPosition(\n terminalMarkerSize: number,\n position: 'start_left' | 'start_right' | 'end_left' | 'end_right',\n _points: Point[]\n): Point {\n const points = structuredClone(_points);\n log.info('our points', points);\n if (position !== 'start_left' && position !== 'start_right') {\n points.reverse();\n }\n\n // Traverse only 25 total distance along points to find cardinality point\n const distanceToCardinalityPoint = 25 + terminalMarkerSize;\n const center = calculatePoint(points, distanceToCardinalityPoint);\n\n // if relation is present (Arrows will be added), change cardinality point off-set distance (d)\n const d = 10 + terminalMarkerSize * 0.5;\n //Calculate Angle for x and y axis\n const angle = Math.atan2(points[0].y - center.y, points[0].x - center.x);\n\n const cardinalityPosition: Point = { x: 0, y: 0 };\n //Calculation cardinality position using angle, center point on the line/curve but perpendicular and with offset-distance\n\n if (position === 'start_left') {\n cardinalityPosition.x = Math.sin(angle + Math.PI) * d + (points[0].x + center.x) / 2;\n cardinalityPosition.y = -Math.cos(angle + Math.PI) * d + (points[0].y + center.y) / 2;\n } else if (position === 'end_right') {\n cardinalityPosition.x = Math.sin(angle - Math.PI) * d + (points[0].x + center.x) / 2 - 5;\n cardinalityPosition.y = -Math.cos(angle - Math.PI) * d + (points[0].y + center.y) / 2 - 5;\n } else if (position === 'end_left') {\n cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2 - 5;\n cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2 - 5;\n } else {\n cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2;\n cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2;\n }\n return cardinalityPosition;\n}\n\n/**\n * Gets styles from an array of declarations\n *\n * @param arr - Declarations\n * @returns The styles grouped as strings\n */\nexport function getStylesFromArray(arr: string[]): { style: string; labelStyle: string } {\n let style = '';\n let labelStyle = '';\n\n for (const element of arr) {\n if (element !== undefined) {\n // add text properties to label style definition\n if (element.startsWith('color:') || element.startsWith('text-align:')) {\n labelStyle = labelStyle + element + ';';\n } else {\n style = style + element + ';';\n }\n }\n }\n\n return { style, labelStyle };\n}\n\nlet cnt = 0;\nexport const generateId = () => {\n cnt++;\n return 'id-' + Math.random().toString(36).substr(2, 12) + '-' + cnt;\n};\n\n/**\n * Generates a random hexadecimal id of the given length.\n *\n * @param length - Length of string.\n * @returns The generated string.\n */\nfunction makeRandomHex(length: number): string {\n let result = '';\n const characters = '0123456789abcdef';\n const charactersLength = characters.length;\n for (let i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n}\n\nexport const random = (options: { length: number }) => {\n return makeRandomHex(options.length);\n};\n\nexport const getTextObj = function () {\n return {\n x: 0,\n y: 0,\n fill: undefined,\n anchor: 'start',\n style: '#666',\n width: 100,\n height: 100,\n textMargin: 0,\n rx: 0,\n ry: 0,\n valign: undefined,\n text: '',\n };\n};\n\n/**\n * Adds text to an element\n *\n * @param elem - SVG Element to add text to\n * @param textData - Text options.\n * @returns Text element with given styling and content\n */\nexport const drawSimpleText = function (\n elem: SVGElement,\n textData: {\n text: string;\n x: number;\n y: number;\n anchor: 'start' | 'middle' | 'end';\n fontFamily: string;\n fontSize: string | number;\n fontWeight: string | number;\n fill: string;\n class: string | undefined;\n textMargin: number;\n }\n): SVGTextElement {\n // Remove and ignore br:s\n const nText = textData.text.replace(common.lineBreakRegex, ' ');\n\n const [, _fontSizePx] = parseFontSize(textData.fontSize);\n\n const textElem = elem.append('text') as any;\n textElem.attr('x', textData.x);\n textElem.attr('y', textData.y);\n textElem.style('text-anchor', textData.anchor);\n textElem.style('font-family', textData.fontFamily);\n textElem.style('font-size', _fontSizePx);\n textElem.style('font-weight', textData.fontWeight);\n textElem.attr('fill', textData.fill);\n\n if (textData.class !== undefined) {\n textElem.attr('class', textData.class);\n }\n\n const span = textElem.append('tspan');\n span.attr('x', textData.x + textData.textMargin * 2);\n span.attr('fill', textData.fill);\n span.text(nText);\n\n return textElem;\n};\n\ninterface WrapLabelConfig {\n fontSize: number;\n fontFamily: string;\n fontWeight: number;\n joinWith: string;\n}\n\nexport const wrapLabel: (label: string, maxWidth: number, config: WrapLabelConfig) => string =\n memoize(\n (label: string, maxWidth: number, config: WrapLabelConfig): string => {\n if (!label) {\n return label;\n }\n config = Object.assign(\n { fontSize: 12, fontWeight: 400, fontFamily: 'Arial', joinWith: '
' },\n config\n );\n if (common.lineBreakRegex.test(label)) {\n return label;\n }\n const words = label.split(' ').filter(Boolean);\n const completedLines: string[] = [];\n let nextLine = '';\n words.forEach((word, index) => {\n const wordLength = calculateTextWidth(`${word} `, config);\n const nextLineLength = calculateTextWidth(nextLine, config);\n if (wordLength > maxWidth) {\n const { hyphenatedStrings, remainingWord } = breakString(word, maxWidth, '-', config);\n completedLines.push(nextLine, ...hyphenatedStrings);\n nextLine = remainingWord;\n } else if (nextLineLength + wordLength >= maxWidth) {\n completedLines.push(nextLine);\n nextLine = word;\n } else {\n nextLine = [nextLine, word].filter(Boolean).join(' ');\n }\n const currentWord = index + 1;\n const isLastWord = currentWord === words.length;\n if (isLastWord) {\n completedLines.push(nextLine);\n }\n });\n return completedLines.filter((line) => line !== '').join(config.joinWith);\n },\n (label, maxWidth, config) =>\n `${label}${maxWidth}${config.fontSize}${config.fontWeight}${config.fontFamily}${config.joinWith}`\n );\n\ninterface BreakStringOutput {\n hyphenatedStrings: string[];\n remainingWord: string;\n}\n\nconst breakString: (\n word: string,\n maxWidth: number,\n hyphenCharacter: string,\n config: WrapLabelConfig\n) => BreakStringOutput = memoize(\n (\n word: string,\n maxWidth: number,\n hyphenCharacter = '-',\n config: WrapLabelConfig\n ): BreakStringOutput => {\n config = Object.assign(\n { fontSize: 12, fontWeight: 400, fontFamily: 'Arial', margin: 0 },\n config\n );\n const characters = [...word];\n const lines: string[] = [];\n let currentLine = '';\n characters.forEach((character, index) => {\n const nextLine = `${currentLine}${character}`;\n const lineWidth = calculateTextWidth(nextLine, config);\n if (lineWidth >= maxWidth) {\n const currentCharacter = index + 1;\n const isLastLine = characters.length === currentCharacter;\n const hyphenatedNextLine = `${nextLine}${hyphenCharacter}`;\n lines.push(isLastLine ? nextLine : hyphenatedNextLine);\n currentLine = '';\n } else {\n currentLine = nextLine;\n }\n });\n return { hyphenatedStrings: lines, remainingWord: currentLine };\n },\n (word, maxWidth, hyphenCharacter = '-', config) =>\n `${word}${maxWidth}${hyphenCharacter}${config.fontSize}${config.fontWeight}${config.fontFamily}`\n);\n\n/**\n * This calculates the text's height, taking into account the wrap breaks and both the statically\n * configured height, width, and the length of the text (in pixels).\n *\n * If the wrapped text has greater height, we extend the height, so it's value won't overflow.\n *\n * @param text - The text to measure\n * @param config - The config for fontSize, fontFamily, and fontWeight all impacting the\n * resulting size\n * @returns The height for the given text\n */\nexport function calculateTextHeight(\n text: Parameters[0],\n config: Parameters[1]\n): ReturnType['height'] {\n return calculateTextDimensions(text, config).height;\n}\n\n/**\n * This calculates the width of the given text, font size and family.\n *\n * @param text - The text to calculate the width of\n * @param config - The config for fontSize, fontFamily, and fontWeight all impacting the\n * resulting size\n * @returns The width for the given text\n */\nexport function calculateTextWidth(\n text: Parameters[0],\n config: Parameters[1]\n): ReturnType['width'] {\n return calculateTextDimensions(text, config).width;\n}\n\n/**\n * This calculates the dimensions of the given text, font size, font family, font weight, and\n * margins.\n *\n * @param text - The text to calculate the width of\n * @param config - The config for fontSize, fontFamily, fontWeight, and margin all impacting\n * the resulting size\n * @returns The dimensions for the given text\n */\nexport const calculateTextDimensions: (\n text: string,\n config: TextDimensionConfig\n) => TextDimensions = memoize(\n (text: string, config: TextDimensionConfig): TextDimensions => {\n const { fontSize = 12, fontFamily = 'Arial', fontWeight = 400 } = config;\n if (!text) {\n return { width: 0, height: 0 };\n }\n\n const [, _fontSizePx] = parseFontSize(fontSize);\n\n // We can't really know if the user supplied font family will render on the user agent;\n // thus, we'll take the max width between the user supplied font family, and a default\n // of sans-serif.\n const fontFamilies = ['sans-serif', fontFamily];\n const lines = text.split(common.lineBreakRegex);\n const dims = [];\n\n const body = select('body');\n // We don't want to leak DOM elements - if a removal operation isn't available\n // for any reason, do not continue.\n if (!body.remove) {\n return { width: 0, height: 0, lineHeight: 0 };\n }\n\n const g = body.append('svg');\n\n for (const fontFamily of fontFamilies) {\n let cHeight = 0;\n const dim = { width: 0, height: 0, lineHeight: 0 };\n for (const line of lines) {\n const textObj = getTextObj();\n textObj.text = line || ZERO_WIDTH_SPACE;\n // @ts-ignore TODO: Fix D3 types\n const textElem = drawSimpleText(g, textObj)\n // @ts-ignore TODO: Fix D3 types\n .style('font-size', _fontSizePx)\n .style('font-weight', fontWeight)\n .style('font-family', fontFamily);\n\n const bBox = (textElem._groups || textElem)[0][0].getBBox();\n if (bBox.width === 0 && bBox.height === 0) {\n throw new Error('svg element not in render tree');\n }\n dim.width = Math.round(Math.max(dim.width, bBox.width));\n cHeight = Math.round(bBox.height);\n dim.height += cHeight;\n dim.lineHeight = Math.round(Math.max(dim.lineHeight, cHeight));\n }\n dims.push(dim);\n }\n\n g.remove();\n\n const index =\n isNaN(dims[1].height) ||\n isNaN(dims[1].width) ||\n isNaN(dims[1].lineHeight) ||\n (dims[0].height > dims[1].height &&\n dims[0].width > dims[1].width &&\n dims[0].lineHeight > dims[1].lineHeight)\n ? 0\n : 1;\n return dims[index];\n },\n (text, config) => `${text}${config.fontSize}${config.fontWeight}${config.fontFamily}`\n);\n\nexport class InitIDGenerator {\n private count = 0;\n public next: () => number;\n constructor(deterministic = false, seed?: string) {\n // TODO: Seed is only used for length?\n // v11: Use the actual value of seed string to generate an initial value for count.\n this.count = seed ? seed.length : 0;\n this.next = deterministic ? () => this.count++ : () => Date.now();\n }\n}\n\nlet decoder: HTMLDivElement;\n\n/**\n * Decodes HTML, source: {@link https://github.com/shrpne/entity-decode/blob/v2.0.1/browser.js}\n *\n * @param html - HTML as a string\n * @returns Unescaped HTML\n */\nexport const entityDecode = function (html: string): string {\n decoder = decoder || document.createElement('div');\n // Escape HTML before decoding for HTML Entities\n html = escape(html).replace(/%26/g, '&').replace(/%23/g, '#').replace(/%3B/g, ';');\n decoder.innerHTML = html;\n\n return unescape(decoder.textContent!);\n};\n\nexport interface DetailedError {\n str: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n hash: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error?: any;\n message?: string;\n}\n\n/** @param error - The error to check */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isDetailedError(error: any): error is DetailedError {\n return 'str' in error;\n}\n\n/** @param error - The error to convert to an error message */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Appends element with the given title and css class.\n *\n * @param parent - d3 svg object to append title to\n * @param cssClass - CSS class for the element containing the title\n * @param titleTopMargin - Margin in pixels between title and rest of the graph\n * @param title - The title. If empty, returns immediately.\n */\nexport const insertTitle = (\n parent: D3Element,\n cssClass: string,\n titleTopMargin: number,\n title?: string\n): void => {\n if (!title) {\n return;\n }\n const bounds = parent.node()?.getBBox();\n if (!bounds) {\n return;\n }\n parent\n .append('text')\n .text(title)\n .attr('text-anchor', 'middle')\n .attr('x', bounds.x + bounds.width / 2)\n .attr('y', -titleTopMargin)\n .attr('class', cssClass);\n};\n\n/**\n * Parses a raw fontSize configuration value into a number and string value.\n *\n * @param fontSize - a string or number font size configuration value\n *\n * @returns parsed number and string style font size values, or nulls if a number value can't\n * be parsed from an input string.\n */\nexport const parseFontSize = (fontSize: string | number | undefined): [number?, string?] => {\n // if the font size is a number, assume a px string representation\n if (typeof fontSize === 'number') {\n return [fontSize, fontSize + 'px'];\n }\n\n const fontSizeNumber = parseInt(fontSize ?? '', 10);\n if (Number.isNaN(fontSizeNumber)) {\n // if a number value can't be parsed, return null for both values\n return [undefined, undefined];\n } else if (fontSize === String(fontSizeNumber)) {\n // if a string input doesn't contain any units, assume px units\n return [fontSizeNumber, fontSize + 'px'];\n } else {\n return [fontSizeNumber, fontSize];\n }\n};\n\nexport function cleanAndMerge(defaultData: T, data?: Partial): T {\n return merge({}, defaultData, data);\n}\n\nexport default {\n assignWithDepth,\n wrapLabel,\n calculateTextHeight,\n calculateTextWidth,\n calculateTextDimensions,\n cleanAndMerge,\n detectInit,\n detectDirective,\n isSubstringInArray,\n interpolateToCurve,\n calcLabelPosition,\n calcCardinalityPosition,\n calcTerminalLabelPosition,\n formatUrl,\n getStylesFromArray,\n generateId,\n random,\n runFunc,\n entityDecode,\n insertTitle,\n isLabelCoordinateInPath,\n parseFontSize,\n InitIDGenerator,\n};\n\n/**\n * @param text - text to be encoded\n * @returns\n */\nexport const encodeEntities = function (text: string): string {\n let txt = text;\n\n txt = txt.replace(/style.*:\\S*#.*;/g, function (s): string {\n return s.substring(0, s.length - 1);\n });\n txt = txt.replace(/classDef.*:\\S*#.*;/g, function (s): string {\n return s.substring(0, s.length - 1);\n });\n\n txt = txt.replace(/#\\w+;/g, function (s) {\n const innerTxt = s.substring(1, s.length - 1);\n\n const isInt = /^\\+?\\d+$/.test(innerTxt);\n if (isInt) {\n return '\uFB02\u00B0\u00B0' + innerTxt + '\u00B6\u00DF';\n } else {\n return '\uFB02\u00B0' + innerTxt + '\u00B6\u00DF';\n }\n });\n\n return txt;\n};\n\n/**\n *\n * @param text - text to be decoded\n * @returns\n */\nexport const decodeEntities = function (text: string): string {\n return text.replace(/\uFB02\u00B0\u00B0/g, '&#').replace(/\uFB02\u00B0/g, '&').replace(/\u00B6\u00DF/g, ';');\n};\n\nexport const isString = (value: unknown): value is string => {\n return typeof value === 'string';\n};\n\nexport const getEdgeId = (\n from: string,\n to: string,\n {\n counter = 0,\n prefix,\n suffix,\n }: {\n counter?: number;\n prefix?: string;\n suffix?: string;\n },\n id?: string\n) => {\n if (id) {\n return id;\n }\n return `${prefix ? `${prefix}_` : ''}${from}_${to}_${counter}${suffix ? `_${suffix}` : ''}`;\n};\n\n/**\n * D3's `selection.attr` method doesn't officially support `undefined`.\n *\n * However, it seems if you do pass `undefined`, it seems to be treated as `null`\n * (e.g. it removes the attribute).\n */\nexport function handleUndefinedAttr(\n attrValue: Parameters['attr']>[1] | undefined\n) {\n return attrValue ?? null;\n}\n\n/**\n * Checks if the x or y coordinate of the edge label\n * appears in the given SVG path data string.\n *\n * @param point - The Point object with x and y properties to check.\n * @param dAttr - SVG path data string (the 'd' attribute of an SVG path element).\n * @returns - True if the rounded x or y coordinate of the edge label is found\n * in the sanitized path data string; otherwise, false.\n */\nexport function isLabelCoordinateInPath(point: Point, dAttr: string) {\n const roundedX = Math.round(point.x);\n const roundedY = Math.round(point.y);\n\n const sanitizedD = dAttr.replace(/(\\d+\\.\\d+)/g, (match) =>\n Math.round(parseFloat(match)).toString()\n );\n\n return sanitizedD.includes(roundedX.toString()) || sanitizedD.includes(roundedY.toString());\n}\n"], + "mappings": "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", + "names": ["type", "fontFamily"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-TZMSLE5B.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-TZMSLE5B.mjs new file mode 100644 index 0000000..980aef8 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-TZMSLE5B.mjs @@ -0,0 +1,117 @@ +import { + lineBreakRegex +} from "./chunk-ABZYJK2D.mjs"; +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/common/svgDrawCommon.ts +import { sanitizeUrl } from "@braintree/sanitize-url"; +var drawRect = /* @__PURE__ */ __name((element, rectData) => { + const rectElement = element.append("rect"); + rectElement.attr("x", rectData.x); + rectElement.attr("y", rectData.y); + rectElement.attr("fill", rectData.fill); + rectElement.attr("stroke", rectData.stroke); + rectElement.attr("width", rectData.width); + rectElement.attr("height", rectData.height); + if (rectData.name) { + rectElement.attr("name", rectData.name); + } + if (rectData.rx) { + rectElement.attr("rx", rectData.rx); + } + if (rectData.ry) { + rectElement.attr("ry", rectData.ry); + } + if (rectData.attrs !== void 0) { + for (const attrKey in rectData.attrs) { + rectElement.attr(attrKey, rectData.attrs[attrKey]); + } + } + if (rectData.class) { + rectElement.attr("class", rectData.class); + } + return rectElement; +}, "drawRect"); +var drawBackgroundRect = /* @__PURE__ */ __name((element, bounds) => { + const rectData = { + x: bounds.startx, + y: bounds.starty, + width: bounds.stopx - bounds.startx, + height: bounds.stopy - bounds.starty, + fill: bounds.fill, + stroke: bounds.stroke, + class: "rect" + }; + const rectElement = drawRect(element, rectData); + rectElement.lower(); +}, "drawBackgroundRect"); +var drawText = /* @__PURE__ */ __name((element, textData) => { + const nText = textData.text.replace(lineBreakRegex, " "); + const textElem = element.append("text"); + textElem.attr("x", textData.x); + textElem.attr("y", textData.y); + textElem.attr("class", "legend"); + textElem.style("text-anchor", textData.anchor); + if (textData.class) { + textElem.attr("class", textData.class); + } + const tspan = textElem.append("tspan"); + tspan.attr("x", textData.x + textData.textMargin * 2); + tspan.text(nText); + return textElem; +}, "drawText"); +var drawImage = /* @__PURE__ */ __name((elem, x, y, link) => { + const imageElement = elem.append("image"); + imageElement.attr("x", x); + imageElement.attr("y", y); + const sanitizedLink = sanitizeUrl(link); + imageElement.attr("xlink:href", sanitizedLink); +}, "drawImage"); +var drawEmbeddedImage = /* @__PURE__ */ __name((element, x, y, link) => { + const imageElement = element.append("use"); + imageElement.attr("x", x); + imageElement.attr("y", y); + const sanitizedLink = sanitizeUrl(link); + imageElement.attr("xlink:href", `#${sanitizedLink}`); +}, "drawEmbeddedImage"); +var getNoteRect = /* @__PURE__ */ __name(() => { + const noteRectData = { + x: 0, + y: 0, + width: 100, + height: 100, + fill: "#EDF2AE", + stroke: "#666", + anchor: "start", + rx: 0, + ry: 0 + }; + return noteRectData; +}, "getNoteRect"); +var getTextObj = /* @__PURE__ */ __name(() => { + const testObject = { + x: 0, + y: 0, + width: 100, + height: 100, + "text-anchor": "start", + style: "#666", + textMargin: 0, + rx: 0, + ry: 0, + tspan: true + }; + return testObject; +}, "getTextObj"); + +export { + drawRect, + drawBackgroundRect, + drawText, + drawImage, + drawEmbeddedImage, + getNoteRect, + getTextObj +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-TZMSLE5B.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-TZMSLE5B.mjs.map new file mode 100644 index 0000000..bba1c7a --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-TZMSLE5B.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/common/svgDrawCommon.ts"], + "sourcesContent": ["import { sanitizeUrl } from '@braintree/sanitize-url';\nimport type { SVG, SVGGroup } from '../../diagram-api/types.js';\nimport { lineBreakRegex } from './common.js';\nimport type {\n Bound,\n D3ImageElement,\n D3RectElement,\n D3TSpanElement,\n D3TextElement,\n D3UseElement,\n RectData,\n TextData,\n TextObject,\n} from './commonTypes.js';\n\nexport const drawRect = (element: SVG | SVGGroup, rectData: RectData): D3RectElement => {\n const rectElement: D3RectElement = element.append('rect');\n rectElement.attr('x', rectData.x);\n rectElement.attr('y', rectData.y);\n rectElement.attr('fill', rectData.fill);\n rectElement.attr('stroke', rectData.stroke);\n rectElement.attr('width', rectData.width);\n rectElement.attr('height', rectData.height);\n if (rectData.name) {\n rectElement.attr('name', rectData.name);\n }\n if (rectData.rx) {\n rectElement.attr('rx', rectData.rx);\n }\n if (rectData.ry) {\n rectElement.attr('ry', rectData.ry);\n }\n\n if (rectData.attrs !== undefined) {\n for (const attrKey in rectData.attrs) {\n rectElement.attr(attrKey, rectData.attrs[attrKey]);\n }\n }\n\n if (rectData.class) {\n rectElement.attr('class', rectData.class);\n }\n\n return rectElement;\n};\n\n/**\n * Draws a background rectangle\n *\n * @param element - Diagram (reference for bounds)\n * @param bounds - Shape of the rectangle\n */\nexport const drawBackgroundRect = (element: SVG | SVGGroup, bounds: Bound): void => {\n const rectData: RectData = {\n x: bounds.startx,\n y: bounds.starty,\n width: bounds.stopx - bounds.startx,\n height: bounds.stopy - bounds.starty,\n fill: bounds.fill,\n stroke: bounds.stroke,\n class: 'rect',\n };\n const rectElement: D3RectElement = drawRect(element, rectData);\n rectElement.lower();\n};\n\nexport const drawText = (element: SVG | SVGGroup, textData: TextData): D3TextElement => {\n const nText: string = textData.text.replace(lineBreakRegex, ' ');\n\n const textElem: D3TextElement = element.append('text');\n textElem.attr('x', textData.x);\n textElem.attr('y', textData.y);\n textElem.attr('class', 'legend');\n\n textElem.style('text-anchor', textData.anchor);\n if (textData.class) {\n textElem.attr('class', textData.class);\n }\n\n const tspan: D3TSpanElement = textElem.append('tspan');\n tspan.attr('x', textData.x + textData.textMargin * 2);\n tspan.text(nText);\n\n return textElem;\n};\n\nexport const drawImage = (elem: SVG | SVGGroup, x: number, y: number, link: string): void => {\n const imageElement: D3ImageElement = elem.append('image');\n imageElement.attr('x', x);\n imageElement.attr('y', y);\n const sanitizedLink: string = sanitizeUrl(link);\n imageElement.attr('xlink:href', sanitizedLink);\n};\n\nexport const drawEmbeddedImage = (\n element: SVG | SVGGroup,\n x: number,\n y: number,\n link: string\n): void => {\n const imageElement: D3UseElement = element.append('use');\n imageElement.attr('x', x);\n imageElement.attr('y', y);\n const sanitizedLink: string = sanitizeUrl(link);\n imageElement.attr('xlink:href', `#${sanitizedLink}`);\n};\n\nexport const getNoteRect = (): RectData => {\n const noteRectData: RectData = {\n x: 0,\n y: 0,\n width: 100,\n height: 100,\n fill: '#EDF2AE',\n stroke: '#666',\n anchor: 'start',\n rx: 0,\n ry: 0,\n };\n return noteRectData;\n};\n\nexport const getTextObj = (): TextObject => {\n const testObject: TextObject = {\n x: 0,\n y: 0,\n width: 100,\n height: 100,\n 'text-anchor': 'start',\n style: '#666',\n textMargin: 0,\n rx: 0,\n ry: 0,\n tspan: true,\n };\n return testObject;\n};\n"], + "mappings": ";;;;;;;;AAAA,SAAS,mBAAmB;AAerB,IAAM,WAAW,wBAAC,SAAyB,aAAsC;AACtF,QAAM,cAA6B,QAAQ,OAAO,MAAM;AACxD,cAAY,KAAK,KAAK,SAAS,CAAC;AAChC,cAAY,KAAK,KAAK,SAAS,CAAC;AAChC,cAAY,KAAK,QAAQ,SAAS,IAAI;AACtC,cAAY,KAAK,UAAU,SAAS,MAAM;AAC1C,cAAY,KAAK,SAAS,SAAS,KAAK;AACxC,cAAY,KAAK,UAAU,SAAS,MAAM;AAC1C,MAAI,SAAS,MAAM;AACjB,gBAAY,KAAK,QAAQ,SAAS,IAAI;AAAA,EACxC;AACA,MAAI,SAAS,IAAI;AACf,gBAAY,KAAK,MAAM,SAAS,EAAE;AAAA,EACpC;AACA,MAAI,SAAS,IAAI;AACf,gBAAY,KAAK,MAAM,SAAS,EAAE;AAAA,EACpC;AAEA,MAAI,SAAS,UAAU,QAAW;AAChC,eAAW,WAAW,SAAS,OAAO;AACpC,kBAAY,KAAK,SAAS,SAAS,MAAM,OAAO,CAAC;AAAA,IACnD;AAAA,EACF;AAEA,MAAI,SAAS,OAAO;AAClB,gBAAY,KAAK,SAAS,SAAS,KAAK;AAAA,EAC1C;AAEA,SAAO;AACT,GA7BwB;AAqCjB,IAAM,qBAAqB,wBAAC,SAAyB,WAAwB;AAClF,QAAM,WAAqB;AAAA,IACzB,GAAG,OAAO;AAAA,IACV,GAAG,OAAO;AAAA,IACV,OAAO,OAAO,QAAQ,OAAO;AAAA,IAC7B,QAAQ,OAAO,QAAQ,OAAO;AAAA,IAC9B,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO;AAAA,IACf,OAAO;AAAA,EACT;AACA,QAAM,cAA6B,SAAS,SAAS,QAAQ;AAC7D,cAAY,MAAM;AACpB,GAZkC;AAc3B,IAAM,WAAW,wBAAC,SAAyB,aAAsC;AACtF,QAAM,QAAgB,SAAS,KAAK,QAAQ,gBAAgB,GAAG;AAE/D,QAAM,WAA0B,QAAQ,OAAO,MAAM;AACrD,WAAS,KAAK,KAAK,SAAS,CAAC;AAC7B,WAAS,KAAK,KAAK,SAAS,CAAC;AAC7B,WAAS,KAAK,SAAS,QAAQ;AAE/B,WAAS,MAAM,eAAe,SAAS,MAAM;AAC7C,MAAI,SAAS,OAAO;AAClB,aAAS,KAAK,SAAS,SAAS,KAAK;AAAA,EACvC;AAEA,QAAM,QAAwB,SAAS,OAAO,OAAO;AACrD,QAAM,KAAK,KAAK,SAAS,IAAI,SAAS,aAAa,CAAC;AACpD,QAAM,KAAK,KAAK;AAEhB,SAAO;AACT,GAlBwB;AAoBjB,IAAM,YAAY,wBAAC,MAAsB,GAAW,GAAW,SAAuB;AAC3F,QAAM,eAA+B,KAAK,OAAO,OAAO;AACxD,eAAa,KAAK,KAAK,CAAC;AACxB,eAAa,KAAK,KAAK,CAAC;AACxB,QAAM,gBAAwB,YAAY,IAAI;AAC9C,eAAa,KAAK,cAAc,aAAa;AAC/C,GANyB;AAQlB,IAAM,oBAAoB,wBAC/B,SACA,GACA,GACA,SACS;AACT,QAAM,eAA6B,QAAQ,OAAO,KAAK;AACvD,eAAa,KAAK,KAAK,CAAC;AACxB,eAAa,KAAK,KAAK,CAAC;AACxB,QAAM,gBAAwB,YAAY,IAAI;AAC9C,eAAa,KAAK,cAAc,IAAI,aAAa,EAAE;AACrD,GAXiC;AAa1B,IAAM,cAAc,6BAAgB;AACzC,QAAM,eAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AACA,SAAO;AACT,GAb2B;AAepB,IAAM,aAAa,6BAAkB;AAC1C,QAAM,aAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,EACT;AACA,SAAO;AACT,GAd0B;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-XAJISQIX.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-XAJISQIX.mjs new file mode 100644 index 0000000..73ee6cf --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-XAJISQIX.mjs @@ -0,0 +1,146 @@ +// package.json +var package_default = { + name: "mermaid", + version: "11.12.2", + description: "Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.", + type: "module", + module: "./dist/mermaid.core.mjs", + types: "./dist/mermaid.d.ts", + exports: { + ".": { + types: "./dist/mermaid.d.ts", + import: "./dist/mermaid.core.mjs", + default: "./dist/mermaid.core.mjs" + }, + "./*": "./*" + }, + keywords: [ + "diagram", + "markdown", + "flowchart", + "sequence diagram", + "gantt", + "class diagram", + "git graph", + "mindmap", + "packet diagram", + "c4 diagram", + "er diagram", + "pie chart", + "pie diagram", + "quadrant chart", + "requirement diagram", + "graph" + ], + scripts: { + clean: "rimraf dist", + dev: "pnpm -w dev", + "docs:code": "typedoc src/defaultConfig.ts src/config.ts src/mermaid.ts && prettier --write ./src/docs/config/setup", + "docs:build": "rimraf ../../docs && pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts", + "docs:verify": "pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts --verify", + "docs:pre:vitepress": "pnpm --filter ./src/docs prefetch && rimraf src/vitepress && pnpm docs:code && tsx scripts/docs.cli.mts --vitepress && pnpm --filter ./src/vitepress install --no-frozen-lockfile --ignore-scripts", + "docs:build:vitepress": "pnpm docs:pre:vitepress && (cd src/vitepress && pnpm run build) && cpy --flat src/docs/landing/ ./src/vitepress/.vitepress/dist/landing", + "docs:dev": 'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev" "tsx scripts/docs.cli.mts --watch --vitepress"', + "docs:dev:docker": 'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev:docker" "tsx scripts/docs.cli.mts --watch --vitepress"', + "docs:serve": "pnpm docs:build:vitepress && vitepress serve src/vitepress", + "docs:spellcheck": 'cspell "src/docs/**/*.md"', + "docs:release-version": "tsx scripts/update-release-version.mts", + "docs:verify-version": "tsx scripts/update-release-version.mts --verify", + "types:build-config": "tsx scripts/create-types-from-json-schema.mts", + "types:verify-config": "tsx scripts/create-types-from-json-schema.mts --verify", + checkCircle: "npx madge --circular ./src", + prepublishOnly: "pnpm docs:verify-version" + }, + repository: { + type: "git", + url: "https://github.com/mermaid-js/mermaid" + }, + author: "Knut Sveidqvist", + license: "MIT", + standard: { + ignore: [ + "**/parser/*.js", + "dist/**/*.js", + "cypress/**/*.js" + ], + globals: [ + "page" + ] + }, + dependencies: { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.1", + "@mermaid-js/parser": "workspace:^", + "@types/d3": "^7.4.3", + cytoscape: "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + d3: "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.13", + dayjs: "^1.11.18", + dompurify: "^3.2.5", + katex: "^0.16.22", + khroma: "^2.1.0", + "lodash-es": "^4.17.21", + marked: "^16.2.1", + roughjs: "^4.6.6", + stylis: "^4.3.6", + "ts-dedent": "^2.2.0", + uuid: "^11.1.0" + }, + devDependencies: { + "@adobe/jsonschema2md": "^8.0.5", + "@iconify/types": "^2.0.0", + "@types/cytoscape": "^3.21.9", + "@types/cytoscape-fcose": "^2.2.4", + "@types/d3-sankey": "^0.12.4", + "@types/d3-scale": "^4.0.9", + "@types/d3-scale-chromatic": "^3.1.0", + "@types/d3-selection": "^3.0.11", + "@types/d3-shape": "^3.1.7", + "@types/jsdom": "^21.1.7", + "@types/katex": "^0.16.7", + "@types/lodash-es": "^4.17.12", + "@types/micromatch": "^4.0.9", + "@types/stylis": "^4.2.7", + "@types/uuid": "^10.0.0", + ajv: "^8.17.1", + canvas: "^3.1.2", + chokidar: "3.6.0", + concurrently: "^9.1.2", + "csstree-validator": "^4.0.1", + globby: "^14.1.0", + jison: "^0.4.18", + "js-base64": "^3.7.8", + jsdom: "^26.1.0", + "json-schema-to-typescript": "^15.0.4", + micromatch: "^4.0.8", + "path-browserify": "^1.0.1", + prettier: "^3.5.3", + remark: "^15.0.1", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.1", + rimraf: "^6.0.1", + "start-server-and-test": "^2.0.13", + "type-fest": "^4.35.0", + typedoc: "^0.28.12", + "typedoc-plugin-markdown": "^4.8.1", + typescript: "~5.7.3", + "unist-util-flatmap": "^1.0.0", + "unist-util-visit": "^5.0.0", + vitepress: "^1.6.4", + "vitepress-plugin-search": "1.0.4-alpha.22" + }, + files: [ + "dist/", + "README.md" + ], + publishConfig: { + access: "public" + } +}; + +export { + package_default +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-XAJISQIX.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-XAJISQIX.mjs.map new file mode 100644 index 0000000..dfa4c47 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/chunk-XAJISQIX.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../package.json"], + "sourcesContent": ["{\n \"name\": \"mermaid\",\n \"version\": \"11.12.2\",\n \"description\": \"Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.\",\n \"type\": \"module\",\n \"module\": \"./dist/mermaid.core.mjs\",\n \"types\": \"./dist/mermaid.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/mermaid.d.ts\",\n \"import\": \"./dist/mermaid.core.mjs\",\n \"default\": \"./dist/mermaid.core.mjs\"\n },\n \"./*\": \"./*\"\n },\n \"keywords\": [\n \"diagram\",\n \"markdown\",\n \"flowchart\",\n \"sequence diagram\",\n \"gantt\",\n \"class diagram\",\n \"git graph\",\n \"mindmap\",\n \"packet diagram\",\n \"c4 diagram\",\n \"er diagram\",\n \"pie chart\",\n \"pie diagram\",\n \"quadrant chart\",\n \"requirement diagram\",\n \"graph\"\n ],\n \"scripts\": {\n \"clean\": \"rimraf dist\",\n \"dev\": \"pnpm -w dev\",\n \"docs:code\": \"typedoc src/defaultConfig.ts src/config.ts src/mermaid.ts && prettier --write ./src/docs/config/setup\",\n \"docs:build\": \"rimraf ../../docs && pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts\",\n \"docs:verify\": \"pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts --verify\",\n \"docs:pre:vitepress\": \"pnpm --filter ./src/docs prefetch && rimraf src/vitepress && pnpm docs:code && tsx scripts/docs.cli.mts --vitepress && pnpm --filter ./src/vitepress install --no-frozen-lockfile --ignore-scripts\",\n \"docs:build:vitepress\": \"pnpm docs:pre:vitepress && (cd src/vitepress && pnpm run build) && cpy --flat src/docs/landing/ ./src/vitepress/.vitepress/dist/landing\",\n \"docs:dev\": \"pnpm docs:pre:vitepress && concurrently \\\"pnpm --filter ./src/vitepress dev\\\" \\\"tsx scripts/docs.cli.mts --watch --vitepress\\\"\",\n \"docs:dev:docker\": \"pnpm docs:pre:vitepress && concurrently \\\"pnpm --filter ./src/vitepress dev:docker\\\" \\\"tsx scripts/docs.cli.mts --watch --vitepress\\\"\",\n \"docs:serve\": \"pnpm docs:build:vitepress && vitepress serve src/vitepress\",\n \"docs:spellcheck\": \"cspell \\\"src/docs/**/*.md\\\"\",\n \"docs:release-version\": \"tsx scripts/update-release-version.mts\",\n \"docs:verify-version\": \"tsx scripts/update-release-version.mts --verify\",\n \"types:build-config\": \"tsx scripts/create-types-from-json-schema.mts\",\n \"types:verify-config\": \"tsx scripts/create-types-from-json-schema.mts --verify\",\n \"checkCircle\": \"npx madge --circular ./src\",\n \"prepublishOnly\": \"pnpm docs:verify-version\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/mermaid-js/mermaid\"\n },\n \"author\": \"Knut Sveidqvist\",\n \"license\": \"MIT\",\n \"standard\": {\n \"ignore\": [\n \"**/parser/*.js\",\n \"dist/**/*.js\",\n \"cypress/**/*.js\"\n ],\n \"globals\": [\n \"page\"\n ]\n },\n \"dependencies\": {\n \"@braintree/sanitize-url\": \"^7.1.1\",\n \"@iconify/utils\": \"^3.0.1\",\n \"@mermaid-js/parser\": \"workspace:^\",\n \"@types/d3\": \"^7.4.3\",\n \"cytoscape\": \"^3.29.3\",\n \"cytoscape-cose-bilkent\": \"^4.1.0\",\n \"cytoscape-fcose\": \"^2.2.0\",\n \"d3\": \"^7.9.0\",\n \"d3-sankey\": \"^0.12.3\",\n \"dagre-d3-es\": \"7.0.13\",\n \"dayjs\": \"^1.11.18\",\n \"dompurify\": \"^3.2.5\",\n \"katex\": \"^0.16.22\",\n \"khroma\": \"^2.1.0\",\n \"lodash-es\": \"^4.17.21\",\n \"marked\": \"^16.2.1\",\n \"roughjs\": \"^4.6.6\",\n \"stylis\": \"^4.3.6\",\n \"ts-dedent\": \"^2.2.0\",\n \"uuid\": \"^11.1.0\"\n },\n \"devDependencies\": {\n \"@adobe/jsonschema2md\": \"^8.0.5\",\n \"@iconify/types\": \"^2.0.0\",\n \"@types/cytoscape\": \"^3.21.9\",\n \"@types/cytoscape-fcose\": \"^2.2.4\",\n \"@types/d3-sankey\": \"^0.12.4\",\n \"@types/d3-scale\": \"^4.0.9\",\n \"@types/d3-scale-chromatic\": \"^3.1.0\",\n \"@types/d3-selection\": \"^3.0.11\",\n \"@types/d3-shape\": \"^3.1.7\",\n \"@types/jsdom\": \"^21.1.7\",\n \"@types/katex\": \"^0.16.7\",\n \"@types/lodash-es\": \"^4.17.12\",\n \"@types/micromatch\": \"^4.0.9\",\n \"@types/stylis\": \"^4.2.7\",\n \"@types/uuid\": \"^10.0.0\",\n \"ajv\": \"^8.17.1\",\n \"canvas\": \"^3.1.2\",\n \"chokidar\": \"3.6.0\",\n \"concurrently\": \"^9.1.2\",\n \"csstree-validator\": \"^4.0.1\",\n \"globby\": \"^14.1.0\",\n \"jison\": \"^0.4.18\",\n \"js-base64\": \"^3.7.8\",\n \"jsdom\": \"^26.1.0\",\n \"json-schema-to-typescript\": \"^15.0.4\",\n \"micromatch\": \"^4.0.8\",\n \"path-browserify\": \"^1.0.1\",\n \"prettier\": \"^3.5.3\",\n \"remark\": \"^15.0.1\",\n \"remark-frontmatter\": \"^5.0.0\",\n \"remark-gfm\": \"^4.0.1\",\n \"rimraf\": \"^6.0.1\",\n \"start-server-and-test\": \"^2.0.13\",\n \"type-fest\": \"^4.35.0\",\n \"typedoc\": \"^0.28.12\",\n \"typedoc-plugin-markdown\": \"^4.8.1\",\n \"typescript\": \"~5.7.3\",\n \"unist-util-flatmap\": \"^1.0.0\",\n \"unist-util-visit\": \"^5.0.0\",\n \"vitepress\": \"^1.6.4\",\n \"vitepress-plugin-search\": \"1.0.4-alpha.22\"\n },\n \"files\": [\n \"dist/\",\n \"README.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n"], + "mappings": "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", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-2ON5EDUG.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-2ON5EDUG.mjs new file mode 100644 index 0000000..65e6477 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-2ON5EDUG.mjs @@ -0,0 +1,40 @@ +import { + ClassDB, + classDiagram_default, + classRenderer_v3_unified_default, + styles_default +} from "./chunk-B4BG7PRW.mjs"; +import "./chunk-FMBD7UC4.mjs"; +import "./chunk-55IACEB6.mjs"; +import "./chunk-QN33PNHL.mjs"; +import "./chunk-N4CR4FBY.mjs"; +import "./chunk-QXUST7PY.mjs"; +import "./chunk-HN2XXSSU.mjs"; +import "./chunk-JZLCHNYA.mjs"; +import "./chunk-CVBHYZKI.mjs"; +import "./chunk-ATLVNIR6.mjs"; +import "./chunk-JA3XYJ7Z.mjs"; +import "./chunk-S3R3BYOJ.mjs"; +import "./chunk-ABZYJK2D.mjs"; +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/class/classDiagram.ts +var diagram = { + parser: classDiagram_default, + get db() { + return new ClassDB(); + }, + renderer: classRenderer_v3_unified_default, + styles: styles_default, + init: /* @__PURE__ */ __name((cnf) => { + if (!cnf.class) { + cnf.class = {}; + } + cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; + }, "init") +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-2ON5EDUG.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-2ON5EDUG.mjs.map new file mode 100644 index 0000000..3886e43 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-2ON5EDUG.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/class/classDiagram.ts"], + "sourcesContent": ["import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: JISON doesn't support types\nimport parser from './parser/classDiagram.jison';\nimport { ClassDB } from './classDb.js';\nimport styles from './styles.js';\nimport renderer from './classRenderer-v3-unified.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n get db() {\n return new ClassDB();\n },\n renderer,\n styles,\n init: (cnf) => {\n if (!cnf.class) {\n cnf.class = {};\n }\n cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n },\n};\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAOO,IAAM,UAA6B;AAAA,EACxC;AAAA,EACA,IAAI,KAAK;AACP,WAAO,IAAI,QAAQ;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM,wBAAC,QAAQ;AACb,QAAI,CAAC,IAAI,OAAO;AACd,UAAI,QAAQ,CAAC;AAAA,IACf;AACA,QAAI,MAAM,sBAAsB,IAAI;AAAA,EACtC,GALM;AAMR;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-v2-WZHVMYZB.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-v2-WZHVMYZB.mjs new file mode 100644 index 0000000..0a35281 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-v2-WZHVMYZB.mjs @@ -0,0 +1,40 @@ +import { + ClassDB, + classDiagram_default, + classRenderer_v3_unified_default, + styles_default +} from "./chunk-B4BG7PRW.mjs"; +import "./chunk-FMBD7UC4.mjs"; +import "./chunk-55IACEB6.mjs"; +import "./chunk-QN33PNHL.mjs"; +import "./chunk-N4CR4FBY.mjs"; +import "./chunk-QXUST7PY.mjs"; +import "./chunk-HN2XXSSU.mjs"; +import "./chunk-JZLCHNYA.mjs"; +import "./chunk-CVBHYZKI.mjs"; +import "./chunk-ATLVNIR6.mjs"; +import "./chunk-JA3XYJ7Z.mjs"; +import "./chunk-S3R3BYOJ.mjs"; +import "./chunk-ABZYJK2D.mjs"; +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/class/classDiagram-v2.ts +var diagram = { + parser: classDiagram_default, + get db() { + return new ClassDB(); + }, + renderer: classRenderer_v3_unified_default, + styles: styles_default, + init: /* @__PURE__ */ __name((cnf) => { + if (!cnf.class) { + cnf.class = {}; + } + cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; + }, "init") +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-v2-WZHVMYZB.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-v2-WZHVMYZB.mjs.map new file mode 100644 index 0000000..e8777f1 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/classDiagram-v2-WZHVMYZB.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/class/classDiagram-v2.ts"], + "sourcesContent": ["import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: JISON doesn't support types\nimport parser from './parser/classDiagram.jison';\nimport { ClassDB } from './classDb.js';\nimport styles from './styles.js';\nimport renderer from './classRenderer-v3-unified.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n get db() {\n return new ClassDB();\n },\n renderer,\n styles,\n init: (cnf) => {\n if (!cnf.class) {\n cnf.class = {};\n }\n cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n },\n};\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAOO,IAAM,UAA6B;AAAA,EACxC;AAAA,EACA,IAAI,KAAK;AACP,WAAO,IAAI,QAAQ;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM,wBAAC,QAAQ;AACb,QAAI,CAAC,IAAI,OAAO;AACd,UAAI,QAAQ,CAAC;AAAA,IACf;AACA,QAAI,MAAM,sBAAsB,IAAI;AAAA,EACtC,GALM;AAMR;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/cose-bilkent-S5V4N54A.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/cose-bilkent-S5V4N54A.mjs new file mode 100644 index 0000000..06b1e27 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/cose-bilkent-S5V4N54A.mjs @@ -0,0 +1,303 @@ +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/rendering-util/layout-algorithms/cose-bilkent/cytoscape-setup.ts +import cytoscape from "cytoscape"; +import coseBilkent from "cytoscape-cose-bilkent"; +import { select } from "d3"; +cytoscape.use(coseBilkent); +function addNodes(nodes, cy) { + nodes.forEach((node) => { + const nodeData = { + id: node.id, + labelText: node.label, + height: node.height, + width: node.width, + padding: node.padding ?? 0 + }; + Object.keys(node).forEach((key) => { + if (!["id", "label", "height", "width", "padding", "x", "y"].includes(key)) { + nodeData[key] = node[key]; + } + }); + cy.add({ + group: "nodes", + data: nodeData, + position: { + x: node.x ?? 0, + y: node.y ?? 0 + } + }); + }); +} +__name(addNodes, "addNodes"); +function addEdges(edges, cy) { + edges.forEach((edge) => { + const edgeData = { + id: edge.id, + source: edge.start, + target: edge.end + }; + Object.keys(edge).forEach((key) => { + if (!["id", "start", "end"].includes(key)) { + edgeData[key] = edge[key]; + } + }); + cy.add({ + group: "edges", + data: edgeData + }); + }); +} +__name(addEdges, "addEdges"); +function createCytoscapeInstance(data) { + return new Promise((resolve) => { + const renderEl = select("body").append("div").attr("id", "cy").attr("style", "display:none"); + const cy = cytoscape({ + container: document.getElementById("cy"), + // container to render in + style: [ + { + selector: "edge", + style: { + "curve-style": "bezier" + } + } + ] + }); + renderEl.remove(); + addNodes(data.nodes, cy); + addEdges(data.edges, cy); + cy.nodes().forEach(function(n) { + n.layoutDimensions = () => { + const nodeData = n.data(); + return { w: nodeData.width, h: nodeData.height }; + }; + }); + const layoutConfig = { + name: "cose-bilkent", + // @ts-ignore Types for cose-bilkent are not correct? + quality: "proof", + styleEnabled: false, + animate: false + }; + cy.layout(layoutConfig).run(); + cy.ready((e) => { + log.info("Cytoscape ready", e); + resolve(cy); + }); + }); +} +__name(createCytoscapeInstance, "createCytoscapeInstance"); +function extractPositionedNodes(cy) { + return cy.nodes().map((node) => { + const data = node.data(); + const position = node.position(); + const positionedNode = { + id: data.id, + x: position.x, + y: position.y + }; + Object.keys(data).forEach((key) => { + if (key !== "id") { + positionedNode[key] = data[key]; + } + }); + return positionedNode; + }); +} +__name(extractPositionedNodes, "extractPositionedNodes"); +function extractPositionedEdges(cy) { + return cy.edges().map((edge) => { + const data = edge.data(); + const rscratch = edge._private.rscratch; + const positionedEdge = { + id: data.id, + source: data.source, + target: data.target, + startX: rscratch.startX, + startY: rscratch.startY, + midX: rscratch.midX, + midY: rscratch.midY, + endX: rscratch.endX, + endY: rscratch.endY + }; + Object.keys(data).forEach((key) => { + if (!["id", "source", "target"].includes(key)) { + positionedEdge[key] = data[key]; + } + }); + return positionedEdge; + }); +} +__name(extractPositionedEdges, "extractPositionedEdges"); + +// src/rendering-util/layout-algorithms/cose-bilkent/layout.ts +async function executeCoseBilkentLayout(data, _config) { + log.debug("Starting cose-bilkent layout algorithm"); + try { + validateLayoutData(data); + const cy = await createCytoscapeInstance(data); + const positionedNodes = extractPositionedNodes(cy); + const positionedEdges = extractPositionedEdges(cy); + log.debug(`Layout completed: ${positionedNodes.length} nodes, ${positionedEdges.length} edges`); + return { + nodes: positionedNodes, + edges: positionedEdges + }; + } catch (error) { + log.error("Error in cose-bilkent layout algorithm:", error); + throw error; + } +} +__name(executeCoseBilkentLayout, "executeCoseBilkentLayout"); +function validateLayoutData(data) { + if (!data) { + throw new Error("Layout data is required"); + } + if (!data.config) { + throw new Error("Configuration is required in layout data"); + } + if (!data.rootNode) { + throw new Error("Root node is required"); + } + if (!data.nodes || !Array.isArray(data.nodes)) { + throw new Error("No nodes found in layout data"); + } + if (!Array.isArray(data.edges)) { + throw new Error("Edges array is required in layout data"); + } + return true; +} +__name(validateLayoutData, "validateLayoutData"); + +// src/rendering-util/layout-algorithms/cose-bilkent/render.ts +var render = /* @__PURE__ */ __name(async (data4Layout, svg, { + insertCluster, + insertEdge, + insertEdgeLabel, + insertMarkers, + insertNode, + log: log2, + positionEdgeLabel +}, { algorithm: _algorithm }) => { + const nodeDb = {}; + const clusterDb = {}; + const element = svg.select("g"); + insertMarkers(element, data4Layout.markers, data4Layout.type, data4Layout.diagramId); + const subGraphsEl = element.insert("g").attr("class", "subgraphs"); + const edgePaths = element.insert("g").attr("class", "edgePaths"); + const edgeLabels = element.insert("g").attr("class", "edgeLabels"); + const nodes = element.insert("g").attr("class", "nodes"); + log2.debug("Inserting nodes into DOM for dimension calculation"); + await Promise.all( + data4Layout.nodes.map(async (node) => { + if (node.isGroup) { + const clusterNode = { ...node }; + clusterDb[node.id] = clusterNode; + nodeDb[node.id] = clusterNode; + await insertCluster(subGraphsEl, node); + } else { + const nodeWithPosition = { ...node }; + nodeDb[node.id] = nodeWithPosition; + const nodeEl = await insertNode(nodes, node, { + config: data4Layout.config, + dir: data4Layout.direction || "TB" + }); + const boundingBox = nodeEl.node().getBBox(); + nodeWithPosition.width = boundingBox.width; + nodeWithPosition.height = boundingBox.height; + nodeWithPosition.domId = nodeEl; + log2.debug(`Node ${node.id} dimensions: ${boundingBox.width}x${boundingBox.height}`); + } + }) + ); + log2.debug("Running cose-bilkent layout algorithm"); + const updatedLayoutData = { + ...data4Layout, + nodes: data4Layout.nodes.map((node) => { + const nodeWithDimensions = nodeDb[node.id]; + return { + ...node, + width: nodeWithDimensions.width, + height: nodeWithDimensions.height + }; + }) + }; + const layoutResult = await executeCoseBilkentLayout(updatedLayoutData, data4Layout.config); + log2.debug("Positioning nodes based on layout results"); + layoutResult.nodes.forEach((positionedNode) => { + const node = nodeDb[positionedNode.id]; + if (node?.domId) { + node.domId.attr( + "transform", + `translate(${positionedNode.x}, ${positionedNode.y})` + ); + node.x = positionedNode.x; + node.y = positionedNode.y; + log2.debug(`Positioned node ${node.id} at center (${positionedNode.x}, ${positionedNode.y})`); + } + }); + layoutResult.edges.forEach((positionedEdge) => { + const edge = data4Layout.edges.find((e) => e.id === positionedEdge.id); + if (edge) { + edge.points = [ + { x: positionedEdge.startX, y: positionedEdge.startY }, + { x: positionedEdge.midX, y: positionedEdge.midY }, + { x: positionedEdge.endX, y: positionedEdge.endY } + ]; + } + }); + log2.debug("Inserting and positioning edges"); + await Promise.all( + data4Layout.edges.map(async (edge) => { + const _edgeLabel = await insertEdgeLabel(edgeLabels, edge); + const startNode = nodeDb[edge.start ?? ""]; + const endNode = nodeDb[edge.end ?? ""]; + if (startNode && endNode) { + const positionedEdge = layoutResult.edges.find((e) => e.id === edge.id); + if (positionedEdge) { + log2.debug("APA01 positionedEdge", positionedEdge); + const edgeWithPath = { ...edge }; + const paths = insertEdge( + edgePaths, + edgeWithPath, + clusterDb, + data4Layout.type, + startNode, + endNode, + data4Layout.diagramId + ); + positionEdgeLabel(edgeWithPath, paths); + } else { + const edgeWithPath = { + ...edge, + points: [ + { x: startNode.x || 0, y: startNode.y || 0 }, + { x: endNode.x || 0, y: endNode.y || 0 } + ] + }; + const paths = insertEdge( + edgePaths, + edgeWithPath, + clusterDb, + data4Layout.type, + startNode, + endNode, + data4Layout.diagramId + ); + positionEdgeLabel(edgeWithPath, paths); + } + } + }) + ); + log2.debug("Cose-bilkent rendering completed"); +}, "render"); + +// src/rendering-util/layout-algorithms/cose-bilkent/index.ts +var render2 = render; +export { + render2 as render +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/cose-bilkent-S5V4N54A.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/cose-bilkent-S5V4N54A.mjs.map new file mode 100644 index 0000000..37fd415 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/cose-bilkent-S5V4N54A.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/rendering-util/layout-algorithms/cose-bilkent/cytoscape-setup.ts", "../../../src/rendering-util/layout-algorithms/cose-bilkent/layout.ts", "../../../src/rendering-util/layout-algorithms/cose-bilkent/render.ts", "../../../src/rendering-util/layout-algorithms/cose-bilkent/index.ts"], + "sourcesContent": ["import cytoscape from 'cytoscape';\nimport coseBilkent from 'cytoscape-cose-bilkent';\nimport { select } from 'd3';\nimport { log } from '../../../logger.js';\nimport type { LayoutData, Node, Edge } from '../../types.js';\nimport type { CytoscapeLayoutConfig, PositionedNode, PositionedEdge } from './types.js';\n\n// Inject the layout algorithm into cytoscape\ncytoscape.use(coseBilkent);\n\n/**\n * Declare module augmentation for cytoscape edge types\n */\ndeclare module 'cytoscape' {\n interface EdgeSingular {\n _private: {\n bodyBounds: unknown;\n rscratch: {\n startX: number;\n startY: number;\n midX: number;\n midY: number;\n endX: number;\n endY: number;\n };\n };\n }\n}\n\n/**\n * Add nodes to cytoscape instance from provided node array\n * This function processes only the nodes provided in the data structure\n * @param nodes - Array of nodes to add\n * @param cy - The cytoscape instance\n */\nexport function addNodes(nodes: Node[], cy: cytoscape.Core): void {\n nodes.forEach((node) => {\n const nodeData: Record = {\n id: node.id,\n labelText: node.label,\n height: node.height,\n width: node.width,\n padding: node.padding ?? 0,\n };\n\n // Add any additional properties from the node\n Object.keys(node).forEach((key) => {\n if (!['id', 'label', 'height', 'width', 'padding', 'x', 'y'].includes(key)) {\n nodeData[key] = (node as unknown as Record)[key];\n }\n });\n\n cy.add({\n group: 'nodes',\n data: nodeData,\n position: {\n x: node.x ?? 0,\n y: node.y ?? 0,\n },\n });\n });\n}\n\n/**\n * Add edges to cytoscape instance from provided edge array\n * This function processes only the edges provided in the data structure\n * @param edges - Array of edges to add\n * @param cy - The cytoscape instance\n */\nexport function addEdges(edges: Edge[], cy: cytoscape.Core): void {\n edges.forEach((edge) => {\n const edgeData: Record = {\n id: edge.id,\n source: edge.start,\n target: edge.end,\n };\n\n // Add any additional properties from the edge\n Object.keys(edge).forEach((key) => {\n if (!['id', 'start', 'end'].includes(key)) {\n edgeData[key] = (edge as unknown as Record)[key];\n }\n });\n\n cy.add({\n group: 'edges',\n data: edgeData,\n });\n });\n}\n\n/**\n * Create and configure cytoscape instance\n * @param data - Layout data containing nodes and edges\n * @returns Promise resolving to configured cytoscape instance\n */\nexport function createCytoscapeInstance(data: LayoutData): Promise {\n return new Promise((resolve) => {\n // Add temporary render element\n const renderEl = select('body').append('div').attr('id', 'cy').attr('style', 'display:none');\n\n const cy = cytoscape({\n container: document.getElementById('cy'), // container to render in\n style: [\n {\n selector: 'edge',\n style: {\n 'curve-style': 'bezier',\n },\n },\n ],\n });\n\n // Remove element after layout\n renderEl.remove();\n\n // Add all nodes and edges to cytoscape using the generic functions\n addNodes(data.nodes, cy);\n addEdges(data.edges, cy);\n\n // Make cytoscape care about the dimensions of the nodes\n cy.nodes().forEach(function (n) {\n n.layoutDimensions = () => {\n const nodeData = n.data();\n return { w: nodeData.width, h: nodeData.height };\n };\n });\n\n // Configure and run the cose-bilkent layout\n const layoutConfig: CytoscapeLayoutConfig = {\n name: 'cose-bilkent',\n // @ts-ignore Types for cose-bilkent are not correct?\n quality: 'proof',\n styleEnabled: false,\n animate: false,\n };\n\n cy.layout(layoutConfig).run();\n\n cy.ready((e) => {\n log.info('Cytoscape ready', e);\n resolve(cy);\n });\n });\n}\n\n/**\n * Extract positioned nodes from cytoscape instance\n * @param cy - The cytoscape instance after layout\n * @returns Array of positioned nodes\n */\nexport function extractPositionedNodes(cy: cytoscape.Core): PositionedNode[] {\n return cy.nodes().map((node) => {\n const data = node.data();\n const position = node.position();\n\n // Create a positioned node with all original data plus position\n const positionedNode: PositionedNode = {\n id: data.id,\n x: position.x,\n y: position.y,\n };\n\n // Add all other properties from the original data\n Object.keys(data).forEach((key) => {\n if (key !== 'id') {\n positionedNode[key] = data[key];\n }\n });\n\n return positionedNode;\n });\n}\n\n/**\n * Extract positioned edges from cytoscape instance\n * @param cy - The cytoscape instance after layout\n * @returns Array of positioned edges\n */\nexport function extractPositionedEdges(cy: cytoscape.Core): PositionedEdge[] {\n return cy.edges().map((edge) => {\n const data = edge.data();\n const rscratch = edge._private.rscratch;\n\n // Create a positioned edge with all original data plus position\n const positionedEdge: PositionedEdge = {\n id: data.id,\n source: data.source,\n target: data.target,\n startX: rscratch.startX,\n startY: rscratch.startY,\n midX: rscratch.midX,\n midY: rscratch.midY,\n endX: rscratch.endX,\n endY: rscratch.endY,\n };\n\n // Add all other properties from the original data\n Object.keys(data).forEach((key) => {\n if (!['id', 'source', 'target'].includes(key)) {\n positionedEdge[key] = data[key];\n }\n });\n\n return positionedEdge;\n });\n}\n", "import type { MermaidConfig } from '../../../config.type.js';\nimport { log } from '../../../logger.js';\nimport type { LayoutData } from '../../types.js';\nimport type { LayoutResult } from './types.js';\nimport {\n createCytoscapeInstance,\n extractPositionedNodes,\n extractPositionedEdges,\n} from './cytoscape-setup.js';\n\n/**\n * Execute the cose-bilkent layout algorithm on generic layout data\n *\n * This function takes layout data and uses Cytoscape with the cose-bilkent\n * algorithm to calculate optimal node positions and edge paths.\n *\n * @param data - The layout data containing nodes, edges, and configuration\n * @param config - Mermaid configuration object\n * @returns Promise resolving to layout result with positioned nodes and edges\n */\nexport async function executeCoseBilkentLayout(\n data: LayoutData,\n _config: MermaidConfig\n): Promise {\n log.debug('Starting cose-bilkent layout algorithm');\n\n try {\n // Validate layout data structure\n validateLayoutData(data);\n\n // Create and configure cytoscape instance\n const cy = await createCytoscapeInstance(data);\n\n // Extract positioned nodes and edges after layout\n const positionedNodes = extractPositionedNodes(cy);\n const positionedEdges = extractPositionedEdges(cy);\n\n log.debug(`Layout completed: ${positionedNodes.length} nodes, ${positionedEdges.length} edges`);\n\n return {\n nodes: positionedNodes,\n edges: positionedEdges,\n };\n } catch (error) {\n log.error('Error in cose-bilkent layout algorithm:', error);\n throw error;\n }\n}\n\n/**\n * Validate layout data structure\n * @param data - The data to validate\n * @returns True if data is valid, throws error otherwise\n */\nexport function validateLayoutData(data: LayoutData): boolean {\n if (!data) {\n throw new Error('Layout data is required');\n }\n\n if (!data.config) {\n throw new Error('Configuration is required in layout data');\n }\n\n if (!data.rootNode) {\n throw new Error('Root node is required');\n }\n\n if (!data.nodes || !Array.isArray(data.nodes)) {\n throw new Error('No nodes found in layout data');\n }\n\n if (!Array.isArray(data.edges)) {\n throw new Error('Edges array is required in layout data');\n }\n\n return true;\n}\n", "import type { InternalHelpers, LayoutData, RenderOptions, SVG, SVGGroup } from 'mermaid';\nimport { executeCoseBilkentLayout } from './layout.js';\nimport type { D3Selection } from '../../../types.js';\n\ntype Node = Record;\n\ninterface NodeWithPosition extends Node {\n x?: number;\n y?: number;\n domId?: string | SVGGroup | D3Selection;\n width?: number;\n height?: number;\n id?: string;\n}\n\n/**\n * Render function for cose-bilkent layout algorithm\n *\n * This follows the same pattern as ELK and dagre renderers:\n * 1. Insert nodes into DOM to get their actual dimensions\n * 2. Run the layout algorithm to calculate positions\n * 3. Position the nodes and edges based on layout results\n */\nexport const render = async (\n data4Layout: LayoutData,\n svg: SVG,\n {\n insertCluster,\n insertEdge,\n insertEdgeLabel,\n insertMarkers,\n insertNode,\n log,\n positionEdgeLabel,\n }: InternalHelpers,\n { algorithm: _algorithm }: RenderOptions\n) => {\n const nodeDb: Record = {};\n const clusterDb: Record = {};\n\n // Insert markers for edges\n const element = svg.select('g');\n insertMarkers(element, data4Layout.markers, data4Layout.type, data4Layout.diagramId);\n\n // Create container groups\n const subGraphsEl = element.insert('g').attr('class', 'subgraphs');\n const edgePaths = element.insert('g').attr('class', 'edgePaths');\n const edgeLabels = element.insert('g').attr('class', 'edgeLabels');\n const nodes = element.insert('g').attr('class', 'nodes');\n\n // Step 1: Insert nodes into DOM to get their actual dimensions\n log.debug('Inserting nodes into DOM for dimension calculation');\n\n await Promise.all(\n data4Layout.nodes.map(async (node) => {\n if (node.isGroup) {\n // Handle subgraphs/clusters\n const clusterNode: NodeWithPosition = { ...node };\n clusterDb[node.id] = clusterNode;\n nodeDb[node.id] = clusterNode;\n\n // Insert cluster to get dimensions\n await insertCluster(subGraphsEl, node);\n } else {\n // Handle regular nodes\n const nodeWithPosition: NodeWithPosition = { ...node };\n nodeDb[node.id] = nodeWithPosition;\n\n // Insert node to get actual dimensions\n const nodeEl = await insertNode(nodes, node, {\n config: data4Layout.config,\n dir: data4Layout.direction || 'TB',\n });\n\n // Get the actual bounding box after insertion\n const boundingBox = nodeEl.node()!.getBBox();\n nodeWithPosition.width = boundingBox.width;\n nodeWithPosition.height = boundingBox.height;\n nodeWithPosition.domId = nodeEl;\n\n log.debug(`Node ${node.id} dimensions: ${boundingBox.width}x${boundingBox.height}`);\n }\n })\n );\n\n // Step 2: Run the cose-bilkent layout algorithm\n log.debug('Running cose-bilkent layout algorithm');\n\n // Update the layout data with actual dimensions\n const updatedLayoutData = {\n ...data4Layout,\n nodes: data4Layout.nodes.map((node) => {\n const nodeWithDimensions = nodeDb[node.id];\n return {\n ...node,\n width: nodeWithDimensions.width,\n height: nodeWithDimensions.height,\n };\n }),\n };\n\n const layoutResult = await executeCoseBilkentLayout(updatedLayoutData, data4Layout.config);\n\n // Step 3: Position the nodes based on layout results\n log.debug('Positioning nodes based on layout results');\n\n layoutResult.nodes.forEach((positionedNode) => {\n const node = nodeDb[positionedNode.id];\n if (node?.domId) {\n // Position the node at the calculated coordinates\n // The positionedNode.x/y represents the center of the node, so use directly\n (node.domId as D3Selection).attr(\n 'transform',\n `translate(${positionedNode.x}, ${positionedNode.y})`\n );\n\n // Store the final position\n node.x = positionedNode.x;\n node.y = positionedNode.y;\n\n log.debug(`Positioned node ${node.id} at center (${positionedNode.x}, ${positionedNode.y})`);\n }\n });\n\n layoutResult.edges.forEach((positionedEdge) => {\n const edge = data4Layout.edges.find((e) => e.id === positionedEdge.id);\n if (edge) {\n // Update the edge data with positioned coordinates\n edge.points = [\n { x: positionedEdge.startX, y: positionedEdge.startY },\n { x: positionedEdge.midX, y: positionedEdge.midY },\n { x: positionedEdge.endX, y: positionedEdge.endY },\n ];\n }\n });\n\n // Step 4: Insert and position edges\n log.debug('Inserting and positioning edges');\n\n await Promise.all(\n data4Layout.edges.map(async (edge) => {\n // Insert edge label first\n const _edgeLabel = await insertEdgeLabel(edgeLabels, edge);\n\n // Get start and end nodes\n const startNode = nodeDb[edge.start ?? ''];\n const endNode = nodeDb[edge.end ?? ''];\n\n if (startNode && endNode) {\n // Find the positioned edge data\n const positionedEdge = layoutResult.edges.find((e) => e.id === edge.id);\n\n if (positionedEdge) {\n log.debug('APA01 positionedEdge', positionedEdge);\n // Create edge path with positioned coordinates\n const edgeWithPath = { ...edge };\n\n // Insert the edge path\n const paths = insertEdge(\n edgePaths,\n edgeWithPath,\n clusterDb,\n data4Layout.type,\n startNode,\n endNode,\n data4Layout.diagramId\n );\n\n // Position the edge label\n positionEdgeLabel(edgeWithPath, paths);\n } else {\n // Fallback: create a simple straight line between nodes\n const edgeWithPath = {\n ...edge,\n points: [\n { x: startNode.x || 0, y: startNode.y || 0 },\n { x: endNode.x || 0, y: endNode.y || 0 },\n ],\n };\n\n const paths = insertEdge(\n edgePaths,\n edgeWithPath,\n clusterDb,\n data4Layout.type,\n startNode,\n endNode,\n data4Layout.diagramId\n );\n positionEdgeLabel(edgeWithPath, paths);\n }\n }\n })\n );\n\n log.debug('Cose-bilkent rendering completed');\n};\n", "import { render as renderWithCoseBilkent } from './render.js';\n\n/**\n * Cose-Bilkent Layout Algorithm for Generic Diagrams\n *\n * This module provides a layout algorithm implementation using Cytoscape\n * with the cose-bilkent algorithm for positioning nodes and edges.\n *\n * The algorithm follows the unified rendering pattern and can be used\n * by any diagram type that provides compatible LayoutData.\n */\n\n/**\n * Render function for the cose-bilkent layout algorithm\n *\n * This function follows the unified rendering pattern used by all layout algorithms.\n * It takes LayoutData, inserts nodes into DOM, runs the cose-bilkent layout algorithm,\n * and renders the positioned elements to the SVG.\n *\n * @param layoutData - Layout data containing nodes, edges, and configuration\n * @param svg - SVG element to render to\n * @param helpers - Internal helper functions for rendering\n * @param options - Rendering options\n */\nexport const render = renderWithCoseBilkent;\n"], + "mappings": "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", + "names": ["log", "render"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/dagre-6UL2VRFP.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/dagre-6UL2VRFP.mjs new file mode 100644 index 0000000..018f1ca --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/dagre-6UL2VRFP.mjs @@ -0,0 +1,687 @@ +import { + clear as clear2, + insertEdge, + insertEdgeLabel, + markers_default, + positionEdgeLabel +} from "./chunk-QXUST7PY.mjs"; +import "./chunk-HN2XXSSU.mjs"; +import { + clear, + clear2 as clear3, + insertCluster, + insertNode, + positionNode, + setNodeElem, + updateNodeBounds +} from "./chunk-JZLCHNYA.mjs"; +import { + getSubGraphTitleMargins +} from "./chunk-CVBHYZKI.mjs"; +import "./chunk-ATLVNIR6.mjs"; +import "./chunk-JA3XYJ7Z.mjs"; +import "./chunk-S3R3BYOJ.mjs"; +import { + getConfig2 as getConfig +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/rendering-util/layout-algorithms/dagre/index.js +import { layout as dagreLayout } from "dagre-d3-es/src/dagre/index.js"; +import * as graphlibJson2 from "dagre-d3-es/src/graphlib/json.js"; +import * as graphlib2 from "dagre-d3-es/src/graphlib/index.js"; + +// src/rendering-util/layout-algorithms/dagre/mermaid-graphlib.js +import * as graphlib from "dagre-d3-es/src/graphlib/index.js"; +import * as graphlibJson from "dagre-d3-es/src/graphlib/json.js"; +var clusterDb = /* @__PURE__ */ new Map(); +var descendants = /* @__PURE__ */ new Map(); +var parents = /* @__PURE__ */ new Map(); +var clear4 = /* @__PURE__ */ __name(() => { + descendants.clear(); + parents.clear(); + clusterDb.clear(); +}, "clear"); +var isDescendant = /* @__PURE__ */ __name((id, ancestorId) => { + const ancestorDescendants = descendants.get(ancestorId) || []; + log.trace("In isDescendant", ancestorId, " ", id, " = ", ancestorDescendants.includes(id)); + return ancestorDescendants.includes(id); +}, "isDescendant"); +var edgeInCluster = /* @__PURE__ */ __name((edge, clusterId) => { + const clusterDescendants = descendants.get(clusterId) || []; + log.info("Descendants of ", clusterId, " is ", clusterDescendants); + log.info("Edge is ", edge); + if (edge.v === clusterId || edge.w === clusterId) { + return false; + } + if (!clusterDescendants) { + log.debug("Tilt, ", clusterId, ",not in descendants"); + return false; + } + return clusterDescendants.includes(edge.v) || isDescendant(edge.v, clusterId) || isDescendant(edge.w, clusterId) || clusterDescendants.includes(edge.w); +}, "edgeInCluster"); +var copy = /* @__PURE__ */ __name((clusterId, graph, newGraph, rootId) => { + log.warn( + "Copying children of ", + clusterId, + "root", + rootId, + "data", + graph.node(clusterId), + rootId + ); + const nodes = graph.children(clusterId) || []; + if (clusterId !== rootId) { + nodes.push(clusterId); + } + log.warn("Copying (nodes) clusterId", clusterId, "nodes", nodes); + nodes.forEach((node) => { + if (graph.children(node).length > 0) { + copy(node, graph, newGraph, rootId); + } else { + const data = graph.node(node); + log.info("cp ", node, " to ", rootId, " with parent ", clusterId); + newGraph.setNode(node, data); + if (rootId !== graph.parent(node)) { + log.warn("Setting parent", node, graph.parent(node)); + newGraph.setParent(node, graph.parent(node)); + } + if (clusterId !== rootId && node !== clusterId) { + log.debug("Setting parent", node, clusterId); + newGraph.setParent(node, clusterId); + } else { + log.info("In copy ", clusterId, "root", rootId, "data", graph.node(clusterId), rootId); + log.debug( + "Not Setting parent for node=", + node, + "cluster!==rootId", + clusterId !== rootId, + "node!==clusterId", + node !== clusterId + ); + } + const edges = graph.edges(node); + log.debug("Copying Edges", edges); + edges.forEach((edge) => { + log.info("Edge", edge); + const data2 = graph.edge(edge.v, edge.w, edge.name); + log.info("Edge data", data2, rootId); + try { + if (edgeInCluster(edge, rootId)) { + log.info("Copying as ", edge.v, edge.w, data2, edge.name); + newGraph.setEdge(edge.v, edge.w, data2, edge.name); + log.info("newGraph edges ", newGraph.edges(), newGraph.edge(newGraph.edges()[0])); + } else { + log.info( + "Skipping copy of edge ", + edge.v, + "-->", + edge.w, + " rootId: ", + rootId, + " clusterId:", + clusterId + ); + } + } catch (e) { + log.error(e); + } + }); + } + log.debug("Removing node", node); + graph.removeNode(node); + }); +}, "copy"); +var extractDescendants = /* @__PURE__ */ __name((id, graph) => { + const children = graph.children(id); + let res = [...children]; + for (const child of children) { + parents.set(child, id); + res = [...res, ...extractDescendants(child, graph)]; + } + return res; +}, "extractDescendants"); +var findCommonEdges = /* @__PURE__ */ __name((graph, id1, id2) => { + const edges1 = graph.edges().filter((edge) => edge.v === id1 || edge.w === id1); + const edges2 = graph.edges().filter((edge) => edge.v === id2 || edge.w === id2); + const edges1Prim = edges1.map((edge) => { + return { v: edge.v === id1 ? id2 : edge.v, w: edge.w === id1 ? id1 : edge.w }; + }); + const edges2Prim = edges2.map((edge) => { + return { v: edge.v, w: edge.w }; + }); + const result = edges1Prim.filter((edgeIn1) => { + return edges2Prim.some((edge) => edgeIn1.v === edge.v && edgeIn1.w === edge.w); + }); + return result; +}, "findCommonEdges"); +var findNonClusterChild = /* @__PURE__ */ __name((id, graph, clusterId) => { + const children = graph.children(id); + log.trace("Searching children of id ", id, children); + if (children.length < 1) { + return id; + } + let reserve; + for (const child of children) { + const _id = findNonClusterChild(child, graph, clusterId); + const commonEdges = findCommonEdges(graph, clusterId, _id); + if (_id) { + if (commonEdges.length > 0) { + reserve = _id; + } else { + return _id; + } + } + } + return reserve; +}, "findNonClusterChild"); +var getAnchorId = /* @__PURE__ */ __name((id) => { + if (!clusterDb.has(id)) { + return id; + } + if (!clusterDb.get(id).externalConnections) { + return id; + } + if (clusterDb.has(id)) { + return clusterDb.get(id).id; + } + return id; +}, "getAnchorId"); +var adjustClustersAndEdges = /* @__PURE__ */ __name((graph, depth) => { + if (!graph || depth > 10) { + log.debug("Opting out, no graph "); + return; + } else { + log.debug("Opting in, graph "); + } + graph.nodes().forEach(function(id) { + const children = graph.children(id); + if (children.length > 0) { + log.warn( + "Cluster identified", + id, + " Replacement id in edges: ", + findNonClusterChild(id, graph, id) + ); + descendants.set(id, extractDescendants(id, graph)); + clusterDb.set(id, { id: findNonClusterChild(id, graph, id), clusterData: graph.node(id) }); + } + }); + graph.nodes().forEach(function(id) { + const children = graph.children(id); + const edges = graph.edges(); + if (children.length > 0) { + log.debug("Cluster identified", id, descendants); + edges.forEach((edge) => { + const d1 = isDescendant(edge.v, id); + const d2 = isDescendant(edge.w, id); + if (d1 ^ d2) { + log.warn("Edge: ", edge, " leaves cluster ", id); + log.warn("Descendants of XXX ", id, ": ", descendants.get(id)); + clusterDb.get(id).externalConnections = true; + } + }); + } else { + log.debug("Not a cluster ", id, descendants); + } + }); + for (let id of clusterDb.keys()) { + const nonClusterChild = clusterDb.get(id).id; + const parent = graph.parent(nonClusterChild); + if (parent !== id && clusterDb.has(parent) && !clusterDb.get(parent).externalConnections) { + clusterDb.get(id).id = parent; + } + } + graph.edges().forEach(function(e) { + const edge = graph.edge(e); + log.warn("Edge " + e.v + " -> " + e.w + ": " + JSON.stringify(e)); + log.warn("Edge " + e.v + " -> " + e.w + ": " + JSON.stringify(graph.edge(e))); + let v = e.v; + let w = e.w; + log.warn( + "Fix XXX", + clusterDb, + "ids:", + e.v, + e.w, + "Translating: ", + clusterDb.get(e.v), + " --- ", + clusterDb.get(e.w) + ); + if (clusterDb.get(e.v) || clusterDb.get(e.w)) { + log.warn("Fixing and trying - removing XXX", e.v, e.w, e.name); + v = getAnchorId(e.v); + w = getAnchorId(e.w); + graph.removeEdge(e.v, e.w, e.name); + if (v !== e.v) { + const parent = graph.parent(v); + clusterDb.get(parent).externalConnections = true; + edge.fromCluster = e.v; + } + if (w !== e.w) { + const parent = graph.parent(w); + clusterDb.get(parent).externalConnections = true; + edge.toCluster = e.w; + } + log.warn("Fix Replacing with XXX", v, w, e.name); + graph.setEdge(v, w, edge, e.name); + } + }); + log.warn("Adjusted Graph", graphlibJson.write(graph)); + extractor(graph, 0); + log.trace(clusterDb); +}, "adjustClustersAndEdges"); +var extractor = /* @__PURE__ */ __name((graph, depth) => { + log.warn("extractor - ", depth, graphlibJson.write(graph), graph.children("D")); + if (depth > 10) { + log.error("Bailing out"); + return; + } + let nodes = graph.nodes(); + let hasChildren = false; + for (const node of nodes) { + const children = graph.children(node); + hasChildren = hasChildren || children.length > 0; + } + if (!hasChildren) { + log.debug("Done, no node has children", graph.nodes()); + return; + } + log.debug("Nodes = ", nodes, depth); + for (const node of nodes) { + log.debug( + "Extracting node", + node, + clusterDb, + clusterDb.has(node) && !clusterDb.get(node).externalConnections, + !graph.parent(node), + graph.node(node), + graph.children("D"), + " Depth ", + depth + ); + if (!clusterDb.has(node)) { + log.debug("Not a cluster", node, depth); + } else if (!clusterDb.get(node).externalConnections && graph.children(node) && graph.children(node).length > 0) { + log.warn( + "Cluster without external connections, without a parent and with children", + node, + depth + ); + const graphSettings = graph.graph(); + let dir = graphSettings.rankdir === "TB" ? "LR" : "TB"; + if (clusterDb.get(node)?.clusterData?.dir) { + dir = clusterDb.get(node).clusterData.dir; + log.warn("Fixing dir", clusterDb.get(node).clusterData.dir, dir); + } + const clusterGraph = new graphlib.Graph({ + multigraph: true, + compound: true + }).setGraph({ + rankdir: dir, + nodesep: 50, + ranksep: 50, + marginx: 8, + marginy: 8 + }).setDefaultEdgeLabel(function() { + return {}; + }); + log.warn("Old graph before copy", graphlibJson.write(graph)); + copy(node, graph, clusterGraph, node); + graph.setNode(node, { + clusterNode: true, + id: node, + clusterData: clusterDb.get(node).clusterData, + label: clusterDb.get(node).label, + graph: clusterGraph + }); + log.warn("New graph after copy node: (", node, ")", graphlibJson.write(clusterGraph)); + log.debug("Old graph after copy", graphlibJson.write(graph)); + } else { + log.warn( + "Cluster ** ", + node, + " **not meeting the criteria !externalConnections:", + !clusterDb.get(node).externalConnections, + " no parent: ", + !graph.parent(node), + " children ", + graph.children(node) && graph.children(node).length > 0, + graph.children("D"), + depth + ); + log.debug(clusterDb); + } + } + nodes = graph.nodes(); + log.warn("New list of nodes", nodes); + for (const node of nodes) { + const data = graph.node(node); + log.warn(" Now next level", node, data); + if (data?.clusterNode) { + extractor(data.graph, depth + 1); + } + } +}, "extractor"); +var sorter = /* @__PURE__ */ __name((graph, nodes) => { + if (nodes.length === 0) { + return []; + } + let result = Object.assign([], nodes); + nodes.forEach((node) => { + const children = graph.children(node); + const sorted = sorter(graph, children); + result = [...result, ...sorted]; + }); + return result; +}, "sorter"); +var sortNodesByHierarchy = /* @__PURE__ */ __name((graph) => sorter(graph, graph.children()), "sortNodesByHierarchy"); + +// src/rendering-util/layout-algorithms/dagre/index.js +var recursiveRender = /* @__PURE__ */ __name(async (_elem, graph, diagramType, id, parentCluster, siteConfig) => { + log.warn("Graph in recursive render:XAX", graphlibJson2.write(graph), parentCluster); + const dir = graph.graph().rankdir; + log.trace("Dir in recursive render - dir:", dir); + const elem = _elem.insert("g").attr("class", "root"); + if (!graph.nodes()) { + log.info("No nodes found for", graph); + } else { + log.info("Recursive render XXX", graph.nodes()); + } + if (graph.edges().length > 0) { + log.info("Recursive edges", graph.edge(graph.edges()[0])); + } + const clusters = elem.insert("g").attr("class", "clusters"); + const edgePaths = elem.insert("g").attr("class", "edgePaths"); + const edgeLabels = elem.insert("g").attr("class", "edgeLabels"); + const nodes = elem.insert("g").attr("class", "nodes"); + await Promise.all( + graph.nodes().map(async function(v) { + const node = graph.node(v); + if (parentCluster !== void 0) { + const data = JSON.parse(JSON.stringify(parentCluster.clusterData)); + log.trace( + "Setting data for parent cluster XXX\n Node.id = ", + v, + "\n data=", + data.height, + "\nParent cluster", + parentCluster.height + ); + graph.setNode(parentCluster.id, data); + if (!graph.parent(v)) { + log.trace("Setting parent", v, parentCluster.id); + graph.setParent(v, parentCluster.id, data); + } + } + log.info("(Insert) Node XXX" + v + ": " + JSON.stringify(graph.node(v))); + if (node?.clusterNode) { + log.info("Cluster identified XBX", v, node.width, graph.node(v)); + const { ranksep, nodesep } = graph.graph(); + node.graph.setGraph({ + ...node.graph.graph(), + ranksep: ranksep + 25, + nodesep + }); + const o = await recursiveRender( + nodes, + node.graph, + diagramType, + id, + graph.node(v), + siteConfig + ); + const newEl = o.elem; + updateNodeBounds(node, newEl); + node.diff = o.diff || 0; + log.info( + "New compound node after recursive render XAX", + v, + "width", + // node, + node.width, + "height", + node.height + // node.x, + // node.y + ); + setNodeElem(newEl, node); + } else { + if (graph.children(v).length > 0) { + log.trace( + "Cluster - the non recursive path XBX", + v, + node.id, + node, + node.width, + "Graph:", + graph + ); + log.trace(findNonClusterChild(node.id, graph)); + clusterDb.set(node.id, { id: findNonClusterChild(node.id, graph), node }); + } else { + log.trace("Node - the non recursive path XAX", v, nodes, graph.node(v), dir); + await insertNode(nodes, graph.node(v), { config: siteConfig, dir }); + } + } + }) + ); + const processEdges = /* @__PURE__ */ __name(async () => { + const edgePromises = graph.edges().map(async function(e) { + const edge = graph.edge(e.v, e.w, e.name); + log.info("Edge " + e.v + " -> " + e.w + ": " + JSON.stringify(e)); + log.info("Edge " + e.v + " -> " + e.w + ": ", e, " ", JSON.stringify(graph.edge(e))); + log.info( + "Fix", + clusterDb, + "ids:", + e.v, + e.w, + "Translating: ", + clusterDb.get(e.v), + clusterDb.get(e.w) + ); + await insertEdgeLabel(edgeLabels, edge); + }); + await Promise.all(edgePromises); + }, "processEdges"); + await processEdges(); + log.info("Graph before layout:", JSON.stringify(graphlibJson2.write(graph))); + log.info("############################################# XXX"); + log.info("### Layout ### XXX"); + log.info("############################################# XXX"); + dagreLayout(graph); + log.info("Graph after layout:", JSON.stringify(graphlibJson2.write(graph))); + let diff = 0; + let { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig); + await Promise.all( + sortNodesByHierarchy(graph).map(async function(v) { + const node = graph.node(v); + log.info( + "Position XBX => " + v + ": (" + node.x, + "," + node.y, + ") width: ", + node.width, + " height: ", + node.height + ); + if (node?.clusterNode) { + node.y += subGraphTitleTotalMargin; + log.info( + "A tainted cluster node XBX1", + v, + node.id, + node.width, + node.height, + node.x, + node.y, + graph.parent(v) + ); + clusterDb.get(node.id).node = node; + positionNode(node); + } else { + if (graph.children(v).length > 0) { + log.info( + "A pure cluster node XBX1", + v, + node.id, + node.x, + node.y, + node.width, + node.height, + graph.parent(v) + ); + node.height += subGraphTitleTotalMargin; + graph.node(node.parentId); + const halfPadding = node?.padding / 2 || 0; + const labelHeight = node?.labelBBox?.height || 0; + const offsetY = labelHeight - halfPadding || 0; + log.debug("OffsetY", offsetY, "labelHeight", labelHeight, "halfPadding", halfPadding); + await insertCluster(clusters, node); + clusterDb.get(node.id).node = node; + } else { + const parent = graph.node(node.parentId); + node.y += subGraphTitleTotalMargin / 2; + log.info( + "A regular node XBX1 - using the padding", + node.id, + "parent", + node.parentId, + node.width, + node.height, + node.x, + node.y, + "offsetY", + node.offsetY, + "parent", + parent, + parent?.offsetY, + node + ); + positionNode(node); + } + } + }) + ); + graph.edges().forEach(function(e) { + const edge = graph.edge(e); + log.info("Edge " + e.v + " -> " + e.w + ": " + JSON.stringify(edge), edge); + edge.points.forEach((point) => point.y += subGraphTitleTotalMargin / 2); + const startNode = graph.node(e.v); + var endNode = graph.node(e.w); + const paths = insertEdge(edgePaths, edge, clusterDb, diagramType, startNode, endNode, id); + positionEdgeLabel(edge, paths); + }); + graph.nodes().forEach(function(v) { + const n = graph.node(v); + log.info(v, n.type, n.diff); + if (n.isGroup) { + diff = n.diff; + } + }); + log.warn("Returning from recursive render XAX", elem, diff); + return { elem, diff }; +}, "recursiveRender"); +var render = /* @__PURE__ */ __name(async (data4Layout, svg) => { + const graph = new graphlib2.Graph({ + multigraph: true, + compound: true + }).setGraph({ + rankdir: data4Layout.direction, + nodesep: data4Layout.config?.nodeSpacing || data4Layout.config?.flowchart?.nodeSpacing || data4Layout.nodeSpacing, + ranksep: data4Layout.config?.rankSpacing || data4Layout.config?.flowchart?.rankSpacing || data4Layout.rankSpacing, + marginx: 8, + marginy: 8 + }).setDefaultEdgeLabel(function() { + return {}; + }); + const element = svg.select("g"); + markers_default(element, data4Layout.markers, data4Layout.type, data4Layout.diagramId); + clear3(); + clear2(); + clear(); + clear4(); + data4Layout.nodes.forEach((node) => { + graph.setNode(node.id, { ...node }); + if (node.parentId) { + graph.setParent(node.id, node.parentId); + } + }); + log.debug("Edges:", data4Layout.edges); + data4Layout.edges.forEach((edge) => { + if (edge.start === edge.end) { + const nodeId = edge.start; + const specialId1 = nodeId + "---" + nodeId + "---1"; + const specialId2 = nodeId + "---" + nodeId + "---2"; + const node = graph.node(nodeId); + graph.setNode(specialId1, { + domId: specialId1, + id: specialId1, + parentId: node.parentId, + labelStyle: "", + label: "", + padding: 0, + shape: "labelRect", + // shape: 'rect', + style: "", + width: 10, + height: 10 + }); + graph.setParent(specialId1, node.parentId); + graph.setNode(specialId2, { + domId: specialId2, + id: specialId2, + parentId: node.parentId, + labelStyle: "", + padding: 0, + // shape: 'rect', + shape: "labelRect", + label: "", + style: "", + width: 10, + height: 10 + }); + graph.setParent(specialId2, node.parentId); + const edge1 = structuredClone(edge); + const edgeMid = structuredClone(edge); + const edge2 = structuredClone(edge); + edge1.label = ""; + edge1.arrowTypeEnd = "none"; + edge1.id = nodeId + "-cyclic-special-1"; + edgeMid.arrowTypeStart = "none"; + edgeMid.arrowTypeEnd = "none"; + edgeMid.id = nodeId + "-cyclic-special-mid"; + edge2.label = ""; + if (node.isGroup) { + edge1.fromCluster = nodeId; + edge2.toCluster = nodeId; + } + edge2.id = nodeId + "-cyclic-special-2"; + edge2.arrowTypeStart = "none"; + graph.setEdge(nodeId, specialId1, edge1, nodeId + "-cyclic-special-0"); + graph.setEdge(specialId1, specialId2, edgeMid, nodeId + "-cyclic-special-1"); + graph.setEdge(specialId2, nodeId, edge2, nodeId + "-cyc {\n log.warn('Graph in recursive render:XAX', graphlibJson.write(graph), parentCluster);\n const dir = graph.graph().rankdir;\n log.trace('Dir in recursive render - dir:', dir);\n\n const elem = _elem.insert('g').attr('class', 'root');\n if (!graph.nodes()) {\n log.info('No nodes found for', graph);\n } else {\n log.info('Recursive render XXX', graph.nodes());\n }\n if (graph.edges().length > 0) {\n log.info('Recursive edges', graph.edge(graph.edges()[0]));\n }\n const clusters = elem.insert('g').attr('class', 'clusters');\n const edgePaths = elem.insert('g').attr('class', 'edgePaths');\n const edgeLabels = elem.insert('g').attr('class', 'edgeLabels');\n const nodes = elem.insert('g').attr('class', 'nodes');\n\n // Insert nodes, this will insert them into the dom and each node will get a size. The size is updated\n // to the abstract node and is later used by dagre for the layout\n await Promise.all(\n graph.nodes().map(async function (v) {\n const node = graph.node(v);\n if (parentCluster !== undefined) {\n const data = JSON.parse(JSON.stringify(parentCluster.clusterData));\n // data.clusterPositioning = true;\n log.trace(\n 'Setting data for parent cluster XXX\\n Node.id = ',\n v,\n '\\n data=',\n data.height,\n '\\nParent cluster',\n parentCluster.height\n );\n graph.setNode(parentCluster.id, data);\n if (!graph.parent(v)) {\n log.trace('Setting parent', v, parentCluster.id);\n graph.setParent(v, parentCluster.id, data);\n }\n }\n log.info('(Insert) Node XXX' + v + ': ' + JSON.stringify(graph.node(v)));\n if (node?.clusterNode) {\n // const children = graph.children(v);\n log.info('Cluster identified XBX', v, node.width, graph.node(v));\n\n // `node.graph.setGraph` applies the graph configurations such as nodeSpacing to subgraphs as without this the default values would be used\n // We override only the `ranksep` and `nodesep` configurations to allow for setting subgraph spacing while avoiding overriding other properties\n const { ranksep, nodesep } = graph.graph();\n node.graph.setGraph({\n ...node.graph.graph(),\n ranksep: ranksep + 25,\n nodesep,\n });\n\n // \"o\" will contain the full cluster not just the children\n const o = await recursiveRender(\n nodes,\n node.graph,\n diagramType,\n id,\n graph.node(v),\n siteConfig\n );\n const newEl = o.elem;\n updateNodeBounds(node, newEl);\n // node.height = o.diff;\n node.diff = o.diff || 0;\n log.info(\n 'New compound node after recursive render XAX',\n v,\n 'width',\n // node,\n node.width,\n 'height',\n node.height\n // node.x,\n // node.y\n );\n setNodeElem(newEl, node);\n } else {\n if (graph.children(v).length > 0) {\n // This is a cluster but not to be rendered recursively\n // Render as before\n log.trace(\n 'Cluster - the non recursive path XBX',\n v,\n node.id,\n node,\n node.width,\n 'Graph:',\n graph\n );\n log.trace(findNonClusterChild(node.id, graph));\n clusterDb.set(node.id, { id: findNonClusterChild(node.id, graph), node });\n // insertCluster(clusters, graph.node(v));\n } else {\n log.trace('Node - the non recursive path XAX', v, nodes, graph.node(v), dir);\n await insertNode(nodes, graph.node(v), { config: siteConfig, dir });\n }\n }\n })\n );\n\n const processEdges = async () => {\n const edgePromises = graph.edges().map(async function (e) {\n const edge = graph.edge(e.v, e.w, e.name);\n log.info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));\n log.info('Edge ' + e.v + ' -> ' + e.w + ': ', e, ' ', JSON.stringify(graph.edge(e)));\n\n // Check if link is either from or to a cluster\n log.info(\n 'Fix',\n clusterDb,\n 'ids:',\n e.v,\n e.w,\n 'Translating: ',\n clusterDb.get(e.v),\n clusterDb.get(e.w)\n );\n await insertEdgeLabel(edgeLabels, edge);\n });\n\n await Promise.all(edgePromises);\n };\n\n await processEdges();\n\n log.info('Graph before layout:', JSON.stringify(graphlibJson.write(graph)));\n\n log.info('############################################# XXX');\n log.info('### Layout ### XXX');\n log.info('############################################# XXX');\n\n dagreLayout(graph);\n\n log.info('Graph after layout:', JSON.stringify(graphlibJson.write(graph)));\n // Move the nodes to the correct place\n let diff = 0;\n let { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig);\n await Promise.all(\n sortNodesByHierarchy(graph).map(async function (v) {\n const node = graph.node(v);\n log.info(\n 'Position XBX => ' + v + ': (' + node.x,\n ',' + node.y,\n ') width: ',\n node.width,\n ' height: ',\n node.height\n );\n if (node?.clusterNode) {\n // Adjust for padding when on root level\n node.y += subGraphTitleTotalMargin;\n\n log.info(\n 'A tainted cluster node XBX1',\n v,\n node.id,\n node.width,\n node.height,\n node.x,\n node.y,\n graph.parent(v)\n );\n clusterDb.get(node.id).node = node;\n positionNode(node);\n } else {\n // A tainted cluster node\n if (graph.children(v).length > 0) {\n log.info(\n 'A pure cluster node XBX1',\n v,\n node.id,\n node.x,\n node.y,\n node.width,\n node.height,\n graph.parent(v)\n );\n node.height += subGraphTitleTotalMargin;\n graph.node(node.parentId);\n const halfPadding = node?.padding / 2 || 0;\n const labelHeight = node?.labelBBox?.height || 0;\n const offsetY = labelHeight - halfPadding || 0;\n log.debug('OffsetY', offsetY, 'labelHeight', labelHeight, 'halfPadding', halfPadding);\n await insertCluster(clusters, node);\n\n // A cluster in the non-recursive way\n clusterDb.get(node.id).node = node;\n } else {\n // Regular node\n const parent = graph.node(node.parentId);\n node.y += subGraphTitleTotalMargin / 2;\n log.info(\n 'A regular node XBX1 - using the padding',\n node.id,\n 'parent',\n node.parentId,\n node.width,\n node.height,\n node.x,\n node.y,\n 'offsetY',\n node.offsetY,\n 'parent',\n parent,\n parent?.offsetY,\n node\n );\n\n positionNode(node);\n }\n }\n })\n );\n\n // Move the edge labels to the correct place after layout\n graph.edges().forEach(function (e) {\n const edge = graph.edge(e);\n log.info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(edge), edge);\n\n edge.points.forEach((point) => (point.y += subGraphTitleTotalMargin / 2));\n const startNode = graph.node(e.v);\n var endNode = graph.node(e.w);\n const paths = insertEdge(edgePaths, edge, clusterDb, diagramType, startNode, endNode, id);\n positionEdgeLabel(edge, paths);\n });\n\n graph.nodes().forEach(function (v) {\n const n = graph.node(v);\n log.info(v, n.type, n.diff);\n if (n.isGroup) {\n diff = n.diff;\n }\n });\n log.warn('Returning from recursive render XAX', elem, diff);\n return { elem, diff };\n};\n\nexport const render = async (data4Layout, svg) => {\n const graph = new graphlib.Graph({\n multigraph: true,\n compound: true,\n })\n .setGraph({\n rankdir: data4Layout.direction,\n nodesep:\n data4Layout.config?.nodeSpacing ||\n data4Layout.config?.flowchart?.nodeSpacing ||\n data4Layout.nodeSpacing,\n ranksep:\n data4Layout.config?.rankSpacing ||\n data4Layout.config?.flowchart?.rankSpacing ||\n data4Layout.rankSpacing,\n marginx: 8,\n marginy: 8,\n })\n .setDefaultEdgeLabel(function () {\n return {};\n });\n const element = svg.select('g');\n insertMarkers(element, data4Layout.markers, data4Layout.type, data4Layout.diagramId);\n clearNodes();\n clearEdges();\n clearClusters();\n clearGraphlib();\n\n data4Layout.nodes.forEach((node) => {\n graph.setNode(node.id, { ...node });\n if (node.parentId) {\n graph.setParent(node.id, node.parentId);\n }\n });\n\n log.debug('Edges:', data4Layout.edges);\n data4Layout.edges.forEach((edge) => {\n // Handle self-loops\n if (edge.start === edge.end) {\n const nodeId = edge.start;\n const specialId1 = nodeId + '---' + nodeId + '---1';\n const specialId2 = nodeId + '---' + nodeId + '---2';\n const node = graph.node(nodeId);\n graph.setNode(specialId1, {\n domId: specialId1,\n id: specialId1,\n parentId: node.parentId,\n labelStyle: '',\n label: '',\n padding: 0,\n shape: 'labelRect',\n // shape: 'rect',\n style: '',\n width: 10,\n height: 10,\n });\n graph.setParent(specialId1, node.parentId);\n graph.setNode(specialId2, {\n domId: specialId2,\n id: specialId2,\n parentId: node.parentId,\n labelStyle: '',\n padding: 0,\n // shape: 'rect',\n shape: 'labelRect',\n label: '',\n style: '',\n width: 10,\n height: 10,\n });\n graph.setParent(specialId2, node.parentId);\n\n const edge1 = structuredClone(edge);\n const edgeMid = structuredClone(edge);\n const edge2 = structuredClone(edge);\n edge1.label = '';\n edge1.arrowTypeEnd = 'none';\n edge1.id = nodeId + '-cyclic-special-1';\n edgeMid.arrowTypeStart = 'none';\n edgeMid.arrowTypeEnd = 'none';\n edgeMid.id = nodeId + '-cyclic-special-mid';\n edge2.label = '';\n if (node.isGroup) {\n edge1.fromCluster = nodeId;\n edge2.toCluster = nodeId;\n }\n edge2.id = nodeId + '-cyclic-special-2';\n edge2.arrowTypeStart = 'none';\n graph.setEdge(nodeId, specialId1, edge1, nodeId + '-cyclic-special-0');\n graph.setEdge(specialId1, specialId2, edgeMid, nodeId + '-cyclic-special-1');\n graph.setEdge(specialId2, nodeId, edge2, nodeId + '-cyc {\n descendants.clear();\n parents.clear();\n clusterDb.clear();\n};\n\nconst isDescendant = (id, ancestorId) => {\n const ancestorDescendants = descendants.get(ancestorId) || [];\n log.trace('In isDescendant', ancestorId, ' ', id, ' = ', ancestorDescendants.includes(id));\n return ancestorDescendants.includes(id);\n};\n\nconst edgeInCluster = (edge, clusterId) => {\n const clusterDescendants = descendants.get(clusterId) || [];\n log.info('Descendants of ', clusterId, ' is ', clusterDescendants);\n log.info('Edge is ', edge);\n if (edge.v === clusterId || edge.w === clusterId) {\n return false;\n }\n\n if (!clusterDescendants) {\n log.debug('Tilt, ', clusterId, ',not in descendants');\n return false;\n }\n\n return (\n clusterDescendants.includes(edge.v) ||\n isDescendant(edge.v, clusterId) ||\n isDescendant(edge.w, clusterId) ||\n clusterDescendants.includes(edge.w)\n );\n};\n\nconst copy = (clusterId, graph, newGraph, rootId) => {\n log.warn(\n 'Copying children of ',\n clusterId,\n 'root',\n rootId,\n 'data',\n graph.node(clusterId),\n rootId\n );\n const nodes = graph.children(clusterId) || [];\n\n if (clusterId !== rootId) {\n nodes.push(clusterId);\n }\n\n log.warn('Copying (nodes) clusterId', clusterId, 'nodes', nodes);\n\n nodes.forEach((node) => {\n if (graph.children(node).length > 0) {\n copy(node, graph, newGraph, rootId);\n } else {\n const data = graph.node(node);\n log.info('cp ', node, ' to ', rootId, ' with parent ', clusterId);\n newGraph.setNode(node, data);\n if (rootId !== graph.parent(node)) {\n log.warn('Setting parent', node, graph.parent(node));\n newGraph.setParent(node, graph.parent(node));\n }\n\n if (clusterId !== rootId && node !== clusterId) {\n log.debug('Setting parent', node, clusterId);\n newGraph.setParent(node, clusterId);\n } else {\n log.info('In copy ', clusterId, 'root', rootId, 'data', graph.node(clusterId), rootId);\n log.debug(\n 'Not Setting parent for node=',\n node,\n 'cluster!==rootId',\n clusterId !== rootId,\n 'node!==clusterId',\n node !== clusterId\n );\n }\n const edges = graph.edges(node);\n log.debug('Copying Edges', edges);\n edges.forEach((edge) => {\n log.info('Edge', edge);\n const data = graph.edge(edge.v, edge.w, edge.name);\n log.info('Edge data', data, rootId);\n try {\n if (edgeInCluster(edge, rootId)) {\n log.info('Copying as ', edge.v, edge.w, data, edge.name);\n newGraph.setEdge(edge.v, edge.w, data, edge.name);\n log.info('newGraph edges ', newGraph.edges(), newGraph.edge(newGraph.edges()[0]));\n } else {\n log.info(\n 'Skipping copy of edge ',\n edge.v,\n '-->',\n edge.w,\n ' rootId: ',\n rootId,\n ' clusterId:',\n clusterId\n );\n }\n } catch (e) {\n log.error(e);\n }\n });\n }\n log.debug('Removing node', node);\n graph.removeNode(node);\n });\n};\n\nexport const extractDescendants = (id, graph) => {\n const children = graph.children(id);\n let res = [...children];\n\n for (const child of children) {\n parents.set(child, id);\n res = [...res, ...extractDescendants(child, graph)];\n }\n\n return res;\n};\n\nexport const validate = (graph) => {\n const edges = graph.edges();\n log.trace('Edges: ', edges);\n for (const edge of edges) {\n if (graph.children(edge.v).length > 0) {\n log.trace('The node ', edge.v, ' is part of and edge even though it has children');\n return false;\n }\n if (graph.children(edge.w).length > 0) {\n log.trace('The node ', edge.w, ' is part of and edge even though it has children');\n return false;\n }\n }\n return true;\n};\n\nconst findCommonEdges = (graph, id1, id2) => {\n const edges1 = graph.edges().filter((edge) => edge.v === id1 || edge.w === id1);\n const edges2 = graph.edges().filter((edge) => edge.v === id2 || edge.w === id2);\n const edges1Prim = edges1.map((edge) => {\n return { v: edge.v === id1 ? id2 : edge.v, w: edge.w === id1 ? id1 : edge.w };\n });\n const edges2Prim = edges2.map((edge) => {\n return { v: edge.v, w: edge.w };\n });\n const result = edges1Prim.filter((edgeIn1) => {\n return edges2Prim.some((edge) => edgeIn1.v === edge.v && edgeIn1.w === edge.w);\n });\n\n return result;\n};\n\nexport const findNonClusterChild = (id, graph, clusterId) => {\n const children = graph.children(id);\n log.trace('Searching children of id ', id, children);\n if (children.length < 1) {\n return id;\n }\n let reserve;\n for (const child of children) {\n const _id = findNonClusterChild(child, graph, clusterId);\n\n const commonEdges = findCommonEdges(graph, clusterId, _id);\n\n if (_id) {\n if (commonEdges.length > 0) {\n reserve = _id;\n } else {\n return _id;\n }\n }\n }\n return reserve;\n};\n\nconst getAnchorId = (id) => {\n if (!clusterDb.has(id)) {\n return id;\n }\n if (!clusterDb.get(id).externalConnections) {\n return id;\n }\n\n if (clusterDb.has(id)) {\n return clusterDb.get(id).id;\n }\n return id;\n};\n\nexport const adjustClustersAndEdges = (graph, depth) => {\n if (!graph || depth > 10) {\n log.debug('Opting out, no graph ');\n return;\n } else {\n log.debug('Opting in, graph ');\n }\n\n graph.nodes().forEach(function (id) {\n const children = graph.children(id);\n if (children.length > 0) {\n log.warn(\n 'Cluster identified',\n id,\n ' Replacement id in edges: ',\n findNonClusterChild(id, graph, id)\n );\n descendants.set(id, extractDescendants(id, graph));\n clusterDb.set(id, { id: findNonClusterChild(id, graph, id), clusterData: graph.node(id) });\n }\n });\n\n graph.nodes().forEach(function (id) {\n const children = graph.children(id);\n const edges = graph.edges();\n if (children.length > 0) {\n log.debug('Cluster identified', id, descendants);\n edges.forEach((edge) => {\n const d1 = isDescendant(edge.v, id);\n const d2 = isDescendant(edge.w, id);\n\n if (d1 ^ d2) {\n log.warn('Edge: ', edge, ' leaves cluster ', id);\n log.warn('Descendants of XXX ', id, ': ', descendants.get(id));\n clusterDb.get(id).externalConnections = true;\n }\n });\n } else {\n log.debug('Not a cluster ', id, descendants);\n }\n });\n\n for (let id of clusterDb.keys()) {\n const nonClusterChild = clusterDb.get(id).id;\n const parent = graph.parent(nonClusterChild);\n\n if (parent !== id && clusterDb.has(parent) && !clusterDb.get(parent).externalConnections) {\n clusterDb.get(id).id = parent;\n }\n }\n\n graph.edges().forEach(function (e) {\n const edge = graph.edge(e);\n log.warn('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));\n log.warn('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(graph.edge(e)));\n\n let v = e.v;\n let w = e.w;\n log.warn(\n 'Fix XXX',\n clusterDb,\n 'ids:',\n e.v,\n e.w,\n 'Translating: ',\n clusterDb.get(e.v),\n ' --- ',\n clusterDb.get(e.w)\n );\n if (clusterDb.get(e.v) || clusterDb.get(e.w)) {\n log.warn('Fixing and trying - removing XXX', e.v, e.w, e.name);\n v = getAnchorId(e.v);\n w = getAnchorId(e.w);\n graph.removeEdge(e.v, e.w, e.name);\n if (v !== e.v) {\n const parent = graph.parent(v);\n clusterDb.get(parent).externalConnections = true;\n edge.fromCluster = e.v;\n }\n if (w !== e.w) {\n const parent = graph.parent(w);\n clusterDb.get(parent).externalConnections = true;\n edge.toCluster = e.w;\n }\n log.warn('Fix Replacing with XXX', v, w, e.name);\n graph.setEdge(v, w, edge, e.name);\n }\n });\n log.warn('Adjusted Graph', graphlibJson.write(graph));\n extractor(graph, 0);\n\n log.trace(clusterDb);\n};\n\nexport const extractor = (graph, depth) => {\n log.warn('extractor - ', depth, graphlibJson.write(graph), graph.children('D'));\n if (depth > 10) {\n log.error('Bailing out');\n return;\n }\n let nodes = graph.nodes();\n let hasChildren = false;\n for (const node of nodes) {\n const children = graph.children(node);\n hasChildren = hasChildren || children.length > 0;\n }\n\n if (!hasChildren) {\n log.debug('Done, no node has children', graph.nodes());\n return;\n }\n log.debug('Nodes = ', nodes, depth);\n for (const node of nodes) {\n log.debug(\n 'Extracting node',\n node,\n clusterDb,\n clusterDb.has(node) && !clusterDb.get(node).externalConnections,\n !graph.parent(node),\n graph.node(node),\n graph.children('D'),\n ' Depth ',\n depth\n );\n if (!clusterDb.has(node)) {\n log.debug('Not a cluster', node, depth);\n } else if (\n !clusterDb.get(node).externalConnections &&\n graph.children(node) &&\n graph.children(node).length > 0\n ) {\n log.warn(\n 'Cluster without external connections, without a parent and with children',\n node,\n depth\n );\n\n const graphSettings = graph.graph();\n let dir = graphSettings.rankdir === 'TB' ? 'LR' : 'TB';\n if (clusterDb.get(node)?.clusterData?.dir) {\n dir = clusterDb.get(node).clusterData.dir;\n log.warn('Fixing dir', clusterDb.get(node).clusterData.dir, dir);\n }\n\n const clusterGraph = new graphlib.Graph({\n multigraph: true,\n compound: true,\n })\n .setGraph({\n rankdir: dir,\n nodesep: 50,\n ranksep: 50,\n marginx: 8,\n marginy: 8,\n })\n .setDefaultEdgeLabel(function () {\n return {};\n });\n\n log.warn('Old graph before copy', graphlibJson.write(graph));\n copy(node, graph, clusterGraph, node);\n graph.setNode(node, {\n clusterNode: true,\n id: node,\n clusterData: clusterDb.get(node).clusterData,\n label: clusterDb.get(node).label,\n graph: clusterGraph,\n });\n log.warn('New graph after copy node: (', node, ')', graphlibJson.write(clusterGraph));\n log.debug('Old graph after copy', graphlibJson.write(graph));\n } else {\n log.warn(\n 'Cluster ** ',\n node,\n ' **not meeting the criteria !externalConnections:',\n !clusterDb.get(node).externalConnections,\n ' no parent: ',\n !graph.parent(node),\n ' children ',\n graph.children(node) && graph.children(node).length > 0,\n graph.children('D'),\n depth\n );\n log.debug(clusterDb);\n }\n }\n\n nodes = graph.nodes();\n log.warn('New list of nodes', nodes);\n for (const node of nodes) {\n const data = graph.node(node);\n log.warn(' Now next level', node, data);\n if (data?.clusterNode) {\n extractor(data.graph, depth + 1);\n }\n }\n};\n\nconst sorter = (graph, nodes) => {\n if (nodes.length === 0) {\n return [];\n }\n let result = Object.assign([], nodes);\n nodes.forEach((node) => {\n const children = graph.children(node);\n const sorted = sorter(graph, children);\n result = [...result, ...sorted];\n });\n\n return result;\n};\n\nexport const sortNodesByHierarchy = (graph) => sorter(graph, graph.children());\n"], + "mappings": "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", + "names": ["graphlibJson", "graphlib", "clear", "data", "clear"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-PSM6KHXK.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-PSM6KHXK.mjs new file mode 100644 index 0000000..842ba68 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-PSM6KHXK.mjs @@ -0,0 +1,564 @@ +import { + selectSvgElement +} from "./chunk-EXTU4WIE.mjs"; +import { + setupViewPortForSVG +} from "./chunk-QN33PNHL.mjs"; +import { + isLabelStyle, + styles2String +} from "./chunk-ATLVNIR6.mjs"; +import { + populateCommonDb +} from "./chunk-4BX2VUAB.mjs"; +import { + cleanAndMerge +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + configureSvgSize, + defaultConfig_default, + getAccDescription, + getAccTitle, + getConfig, + getDiagramTitle, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/treemap/db.ts +var TreeMapDB = class { + constructor() { + this.nodes = []; + this.levels = /* @__PURE__ */ new Map(); + this.outerNodes = []; + this.classes = /* @__PURE__ */ new Map(); + this.setAccTitle = setAccTitle; + this.getAccTitle = getAccTitle; + this.setDiagramTitle = setDiagramTitle; + this.getDiagramTitle = getDiagramTitle; + this.getAccDescription = getAccDescription; + this.setAccDescription = setAccDescription; + } + static { + __name(this, "TreeMapDB"); + } + getNodes() { + return this.nodes; + } + getConfig() { + const defaultConfig = defaultConfig_default; + const userConfig = getConfig(); + return cleanAndMerge({ + ...defaultConfig.treemap, + ...userConfig.treemap ?? {} + }); + } + addNode(node, level) { + this.nodes.push(node); + this.levels.set(node, level); + if (level === 0) { + this.outerNodes.push(node); + this.root ??= node; + } + } + getRoot() { + return { name: "", children: this.outerNodes }; + } + addClass(id, _style) { + const styleClass = this.classes.get(id) ?? { id, styles: [], textStyles: [] }; + const styles = _style.replace(/\\,/g, "\xA7\xA7\xA7").replace(/,/g, ";").replace(/§§§/g, ",").split(";"); + if (styles) { + styles.forEach((s) => { + if (isLabelStyle(s)) { + if (styleClass?.textStyles) { + styleClass.textStyles.push(s); + } else { + styleClass.textStyles = [s]; + } + } + if (styleClass?.styles) { + styleClass.styles.push(s); + } else { + styleClass.styles = [s]; + } + }); + } + this.classes.set(id, styleClass); + } + getClasses() { + return this.classes; + } + getStylesForClass(classSelector) { + return this.classes.get(classSelector)?.styles ?? []; + } + clear() { + clear(); + this.nodes = []; + this.levels = /* @__PURE__ */ new Map(); + this.outerNodes = []; + this.classes = /* @__PURE__ */ new Map(); + this.root = void 0; + } +}; + +// src/diagrams/treemap/parser.ts +import { parse } from "@mermaid-js/parser"; + +// src/diagrams/treemap/utils.ts +function buildHierarchy(items) { + if (!items.length) { + return []; + } + const root = []; + const stack = []; + items.forEach((item) => { + const node = { + name: item.name, + children: item.type === "Leaf" ? void 0 : [] + }; + node.classSelector = item?.classSelector; + if (item?.cssCompiledStyles) { + node.cssCompiledStyles = [item.cssCompiledStyles]; + } + if (item.type === "Leaf" && item.value !== void 0) { + node.value = item.value; + } + while (stack.length > 0 && stack[stack.length - 1].level >= item.level) { + stack.pop(); + } + if (stack.length === 0) { + root.push(node); + } else { + const parent = stack[stack.length - 1].node; + if (parent.children) { + parent.children.push(node); + } else { + parent.children = [node]; + } + } + if (item.type !== "Leaf") { + stack.push({ node, level: item.level }); + } + }); + return root; +} +__name(buildHierarchy, "buildHierarchy"); + +// src/diagrams/treemap/parser.ts +var populate = /* @__PURE__ */ __name((ast, db) => { + populateCommonDb(ast, db); + const items = []; + for (const row of ast.TreemapRows ?? []) { + if (row.$type === "ClassDefStatement") { + db.addClass(row.className ?? "", row.styleText ?? ""); + } + } + for (const row of ast.TreemapRows ?? []) { + const item = row.item; + if (!item) { + continue; + } + const level = row.indent ? parseInt(row.indent) : 0; + const name = getItemName(item); + const styles = item.classSelector ? db.getStylesForClass(item.classSelector) : []; + const cssCompiledStyles = styles.length > 0 ? styles.join(";") : void 0; + const itemData = { + level, + name, + type: item.$type, + value: item.value, + classSelector: item.classSelector, + cssCompiledStyles + }; + items.push(itemData); + } + const hierarchyNodes = buildHierarchy(items); + const addNodesRecursively = /* @__PURE__ */ __name((nodes, level) => { + for (const node of nodes) { + db.addNode(node, level); + if (node.children && node.children.length > 0) { + addNodesRecursively(node.children, level + 1); + } + } + }, "addNodesRecursively"); + addNodesRecursively(hierarchyNodes, 0); +}, "populate"); +var getItemName = /* @__PURE__ */ __name((item) => { + return item.name ? String(item.name) : ""; +}, "getItemName"); +var parser = { + // @ts-expect-error - TreeMapDB is not assignable to DiagramDB + parser: { yy: void 0 }, + parse: /* @__PURE__ */ __name(async (text) => { + try { + const parseFunc = parse; + const ast = await parseFunc("treemap", text); + log.debug("Treemap AST:", ast); + const db = parser.parser?.yy; + if (!(db instanceof TreeMapDB)) { + throw new Error( + "parser.parser?.yy was not a TreemapDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues." + ); + } + populate(ast, db); + } catch (error) { + log.error("Error parsing treemap:", error); + throw error; + } + }, "parse") +}; + +// src/diagrams/treemap/renderer.ts +import { scaleOrdinal, treemap, hierarchy, format, select } from "d3"; +var DEFAULT_INNER_PADDING = 10; +var SECTION_INNER_PADDING = 10; +var SECTION_HEADER_HEIGHT = 25; +var draw = /* @__PURE__ */ __name((_text, id, _version, diagram2) => { + const treemapDb = diagram2.db; + const config = treemapDb.getConfig(); + const treemapInnerPadding = config.padding ?? DEFAULT_INNER_PADDING; + const title = treemapDb.getDiagramTitle(); + const root = treemapDb.getRoot(); + const { themeVariables } = getConfig(); + if (!root) { + return; + } + const titleHeight = title ? 30 : 0; + const svg = selectSvgElement(id); + const width = config.nodeWidth ? config.nodeWidth * SECTION_INNER_PADDING : 960; + const height = config.nodeHeight ? config.nodeHeight * SECTION_INNER_PADDING : 500; + const svgWidth = width; + const svgHeight = height + titleHeight; + svg.attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); + configureSvgSize(svg, svgHeight, svgWidth, config.useMaxWidth); + let valueFormat; + try { + const formatStr = config.valueFormat || ","; + if (formatStr === "$0,0") { + valueFormat = /* @__PURE__ */ __name((value) => "$" + format(",")(value), "valueFormat"); + } else if (formatStr.startsWith("$") && formatStr.includes(",")) { + const precision = /\.\d+/.exec(formatStr); + const precisionStr = precision ? precision[0] : ""; + valueFormat = /* @__PURE__ */ __name((value) => "$" + format("," + precisionStr)(value), "valueFormat"); + } else if (formatStr.startsWith("$")) { + const restOfFormat = formatStr.substring(1); + valueFormat = /* @__PURE__ */ __name((value) => "$" + format(restOfFormat || "")(value), "valueFormat"); + } else { + valueFormat = format(formatStr); + } + } catch (error) { + log.error("Error creating format function:", error); + valueFormat = format(","); + } + const colorScale = scaleOrdinal().range([ + "transparent", + themeVariables.cScale0, + themeVariables.cScale1, + themeVariables.cScale2, + themeVariables.cScale3, + themeVariables.cScale4, + themeVariables.cScale5, + themeVariables.cScale6, + themeVariables.cScale7, + themeVariables.cScale8, + themeVariables.cScale9, + themeVariables.cScale10, + themeVariables.cScale11 + ]); + const colorScalePeer = scaleOrdinal().range([ + "transparent", + themeVariables.cScalePeer0, + themeVariables.cScalePeer1, + themeVariables.cScalePeer2, + themeVariables.cScalePeer3, + themeVariables.cScalePeer4, + themeVariables.cScalePeer5, + themeVariables.cScalePeer6, + themeVariables.cScalePeer7, + themeVariables.cScalePeer8, + themeVariables.cScalePeer9, + themeVariables.cScalePeer10, + themeVariables.cScalePeer11 + ]); + const colorScaleLabel = scaleOrdinal().range([ + themeVariables.cScaleLabel0, + themeVariables.cScaleLabel1, + themeVariables.cScaleLabel2, + themeVariables.cScaleLabel3, + themeVariables.cScaleLabel4, + themeVariables.cScaleLabel5, + themeVariables.cScaleLabel6, + themeVariables.cScaleLabel7, + themeVariables.cScaleLabel8, + themeVariables.cScaleLabel9, + themeVariables.cScaleLabel10, + themeVariables.cScaleLabel11 + ]); + if (title) { + svg.append("text").attr("x", svgWidth / 2).attr("y", titleHeight / 2).attr("class", "treemapTitle").attr("text-anchor", "middle").attr("dominant-baseline", "middle").text(title); + } + const g = svg.append("g").attr("transform", `translate(0, ${titleHeight})`).attr("class", "treemapContainer"); + const hierarchyRoot = hierarchy(root).sum((d) => d.value ?? 0).sort((a, b) => (b.value ?? 0) - (a.value ?? 0)); + const treemapLayout = treemap().size([width, height]).paddingTop( + (d) => d.children && d.children.length > 0 ? SECTION_HEADER_HEIGHT + SECTION_INNER_PADDING : 0 + ).paddingInner(treemapInnerPadding).paddingLeft((d) => d.children && d.children.length > 0 ? SECTION_INNER_PADDING : 0).paddingRight((d) => d.children && d.children.length > 0 ? SECTION_INNER_PADDING : 0).paddingBottom((d) => d.children && d.children.length > 0 ? SECTION_INNER_PADDING : 0).round(true); + const treemapData = treemapLayout(hierarchyRoot); + const branchNodes = treemapData.descendants().filter((d) => d.children && d.children.length > 0); + const sections = g.selectAll(".treemapSection").data(branchNodes).enter().append("g").attr("class", "treemapSection").attr("transform", (d) => `translate(${d.x0},${d.y0})`); + sections.append("rect").attr("width", (d) => d.x1 - d.x0).attr("height", SECTION_HEADER_HEIGHT).attr("class", "treemapSectionHeader").attr("fill", "none").attr("fill-opacity", 0.6).attr("stroke-width", 0.6).attr("style", (d) => { + if (d.depth === 0) { + return "display: none;"; + } + return ""; + }); + sections.append("clipPath").attr("id", (_d, i) => `clip-section-${id}-${i}`).append("rect").attr("width", (d) => Math.max(0, d.x1 - d.x0 - 12)).attr("height", SECTION_HEADER_HEIGHT); + sections.append("rect").attr("width", (d) => d.x1 - d.x0).attr("height", (d) => d.y1 - d.y0).attr("class", (_d, i) => { + return `treemapSection section${i}`; + }).attr("fill", (d) => colorScale(d.data.name)).attr("fill-opacity", 0.6).attr("stroke", (d) => colorScalePeer(d.data.name)).attr("stroke-width", 2).attr("stroke-opacity", 0.4).attr("style", (d) => { + if (d.depth === 0) { + return "display: none;"; + } + const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles }); + return styles.nodeStyles + ";" + styles.borderStyles.join(";"); + }); + sections.append("text").attr("class", "treemapSectionLabel").attr("x", 6).attr("y", SECTION_HEADER_HEIGHT / 2).attr("dominant-baseline", "middle").text((d) => d.depth === 0 ? "" : d.data.name).attr("font-weight", "bold").attr("style", (d) => { + if (d.depth === 0) { + return "display: none;"; + } + const labelStyles = "dominant-baseline: middle; font-size: 12px; fill:" + colorScaleLabel(d.data.name) + "; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"; + const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles }); + return labelStyles + styles.labelStyles.replace("color:", "fill:"); + }).each(function(d) { + if (d.depth === 0) { + return; + } + const self = select(this); + const originalText = d.data.name; + self.text(originalText); + const totalHeaderWidth = d.x1 - d.x0; + const labelXPosition = 6; + let spaceForTextContent; + if (config.showValues !== false && d.value) { + const valueEndsAtXRelative = totalHeaderWidth - 10; + const estimatedValueTextActualWidth = 30; + const gapBetweenLabelAndValue = 10; + const labelMustEndBeforeX = valueEndsAtXRelative - estimatedValueTextActualWidth - gapBetweenLabelAndValue; + spaceForTextContent = labelMustEndBeforeX - labelXPosition; + } else { + const labelOwnRightPadding = 6; + spaceForTextContent = totalHeaderWidth - labelXPosition - labelOwnRightPadding; + } + const minimumWidthToDisplay = 15; + const actualAvailableWidth = Math.max(minimumWidthToDisplay, spaceForTextContent); + const textNode = self.node(); + const currentTextContentLength = textNode.getComputedTextLength(); + if (currentTextContentLength > actualAvailableWidth) { + const ellipsis = "..."; + let currentTruncatedText = originalText; + while (currentTruncatedText.length > 0) { + currentTruncatedText = originalText.substring(0, currentTruncatedText.length - 1); + if (currentTruncatedText.length === 0) { + self.text(ellipsis); + if (textNode.getComputedTextLength() > actualAvailableWidth) { + self.text(""); + } + break; + } + self.text(currentTruncatedText + ellipsis); + if (textNode.getComputedTextLength() <= actualAvailableWidth) { + break; + } + } + } + }); + if (config.showValues !== false) { + sections.append("text").attr("class", "treemapSectionValue").attr("x", (d) => d.x1 - d.x0 - 10).attr("y", SECTION_HEADER_HEIGHT / 2).attr("text-anchor", "end").attr("dominant-baseline", "middle").text((d) => d.value ? valueFormat(d.value) : "").attr("font-style", "italic").attr("style", (d) => { + if (d.depth === 0) { + return "display: none;"; + } + const labelStyles = "text-anchor: end; dominant-baseline: middle; font-size: 10px; fill:" + colorScaleLabel(d.data.name) + "; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"; + const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles }); + return labelStyles + styles.labelStyles.replace("color:", "fill:"); + }); + } + const leafNodes = treemapData.leaves(); + const cell = g.selectAll(".treemapLeafGroup").data(leafNodes).enter().append("g").attr("class", (d, i) => { + return `treemapNode treemapLeafGroup leaf${i}${d.data.classSelector ? ` ${d.data.classSelector}` : ""}x`; + }).attr("transform", (d) => `translate(${d.x0},${d.y0})`); + cell.append("rect").attr("width", (d) => d.x1 - d.x0).attr("height", (d) => d.y1 - d.y0).attr("class", "treemapLeaf").attr("fill", (d) => { + return d.parent ? colorScale(d.parent.data.name) : colorScale(d.data.name); + }).attr("style", (d) => { + const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles }); + return styles.nodeStyles; + }).attr("fill-opacity", 0.3).attr("stroke", (d) => { + return d.parent ? colorScale(d.parent.data.name) : colorScale(d.data.name); + }).attr("stroke-width", 3); + cell.append("clipPath").attr("id", (_d, i) => `clip-${id}-${i}`).append("rect").attr("width", (d) => Math.max(0, d.x1 - d.x0 - 4)).attr("height", (d) => Math.max(0, d.y1 - d.y0 - 4)); + const leafLabels = cell.append("text").attr("class", "treemapLabel").attr("x", (d) => (d.x1 - d.x0) / 2).attr("y", (d) => (d.y1 - d.y0) / 2).attr("style", (d) => { + const labelStyles = "text-anchor: middle; dominant-baseline: middle; font-size: 38px;fill:" + colorScaleLabel(d.data.name) + ";"; + const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles }); + return labelStyles + styles.labelStyles.replace("color:", "fill:"); + }).attr("clip-path", (_d, i) => `url(#clip-${id}-${i})`).text((d) => d.data.name); + leafLabels.each(function(d) { + const self = select(this); + const nodeWidth = d.x1 - d.x0; + const nodeHeight = d.y1 - d.y0; + const textNode = self.node(); + const padding = 4; + const availableWidth = nodeWidth - 2 * padding; + const availableHeight = nodeHeight - 2 * padding; + if (availableWidth < 10 || availableHeight < 10) { + self.style("display", "none"); + return; + } + let currentLabelFontSize = parseInt(self.style("font-size"), 10); + const minLabelFontSize = 8; + const originalValueRelFontSize = 28; + const valueScaleFactor = 0.6; + const minValueFontSize = 6; + const spacingBetweenLabelAndValue = 2; + while (textNode.getComputedTextLength() > availableWidth && currentLabelFontSize > minLabelFontSize) { + currentLabelFontSize--; + self.style("font-size", `${currentLabelFontSize}px`); + } + let prospectiveValueFontSize = Math.max( + minValueFontSize, + Math.min(originalValueRelFontSize, Math.round(currentLabelFontSize * valueScaleFactor)) + ); + let combinedHeight = currentLabelFontSize + spacingBetweenLabelAndValue + prospectiveValueFontSize; + while (combinedHeight > availableHeight && currentLabelFontSize > minLabelFontSize) { + currentLabelFontSize--; + prospectiveValueFontSize = Math.max( + minValueFontSize, + Math.min(originalValueRelFontSize, Math.round(currentLabelFontSize * valueScaleFactor)) + ); + if (prospectiveValueFontSize < minValueFontSize && currentLabelFontSize === minLabelFontSize) { + break; + } + self.style("font-size", `${currentLabelFontSize}px`); + combinedHeight = currentLabelFontSize + spacingBetweenLabelAndValue + prospectiveValueFontSize; + if (prospectiveValueFontSize <= minValueFontSize && combinedHeight > availableHeight) { + } + } + self.style("font-size", `${currentLabelFontSize}px`); + if (textNode.getComputedTextLength() > availableWidth || currentLabelFontSize < minLabelFontSize || availableHeight < currentLabelFontSize) { + self.style("display", "none"); + } + }); + if (config.showValues !== false) { + const leafValues = cell.append("text").attr("class", "treemapValue").attr("x", (d) => (d.x1 - d.x0) / 2).attr("y", function(d) { + return (d.y1 - d.y0) / 2; + }).attr("style", (d) => { + const labelStyles = "text-anchor: middle; dominant-baseline: hanging; font-size: 28px;fill:" + colorScaleLabel(d.data.name) + ";"; + const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles }); + return labelStyles + styles.labelStyles.replace("color:", "fill:"); + }).attr("clip-path", (_d, i) => `url(#clip-${id}-${i})`).text((d) => d.value ? valueFormat(d.value) : ""); + leafValues.each(function(d) { + const valueTextElement = select(this); + const parentCellNode = this.parentNode; + if (!parentCellNode) { + valueTextElement.style("display", "none"); + return; + } + const labelElement = select(parentCellNode).select(".treemapLabel"); + if (labelElement.empty() || labelElement.style("display") === "none") { + valueTextElement.style("display", "none"); + return; + } + const finalLabelFontSize = parseFloat(labelElement.style("font-size")); + const originalValueFontSize = 28; + const valueScaleFactor = 0.6; + const minValueFontSize = 6; + const spacingBetweenLabelAndValue = 2; + const actualValueFontSize = Math.max( + minValueFontSize, + Math.min(originalValueFontSize, Math.round(finalLabelFontSize * valueScaleFactor)) + ); + valueTextElement.style("font-size", `${actualValueFontSize}px`); + const labelCenterY = (d.y1 - d.y0) / 2; + const valueTopActualY = labelCenterY + finalLabelFontSize / 2 + spacingBetweenLabelAndValue; + valueTextElement.attr("y", valueTopActualY); + const nodeWidth = d.x1 - d.x0; + const nodeTotalHeight = d.y1 - d.y0; + const cellBottomPadding = 4; + const maxValueBottomY = nodeTotalHeight - cellBottomPadding; + const availableWidthForValue = nodeWidth - 2 * 4; + if (valueTextElement.node().getComputedTextLength() > availableWidthForValue || valueTopActualY + actualValueFontSize > maxValueBottomY || actualValueFontSize < minValueFontSize) { + valueTextElement.style("display", "none"); + } else { + valueTextElement.style("display", null); + } + }); + } + const diagramPadding = config.diagramPadding ?? 8; + setupViewPortForSVG(svg, diagramPadding, "flowchart", config?.useMaxWidth || false); +}, "draw"); +var getClasses = /* @__PURE__ */ __name(function(_text, diagramObj) { + return diagramObj.db.getClasses(); +}, "getClasses"); +var renderer = { draw, getClasses }; + +// src/diagrams/treemap/styles.ts +var defaultTreemapStyleOptions = { + sectionStrokeColor: "black", + sectionStrokeWidth: "1", + sectionFillColor: "#efefef", + leafStrokeColor: "black", + leafStrokeWidth: "1", + leafFillColor: "#efefef", + labelColor: "black", + labelFontSize: "12px", + valueFontSize: "10px", + valueColor: "black", + titleColor: "black", + titleFontSize: "14px" +}; +var getStyles = /* @__PURE__ */ __name(({ + treemap: treemap2 +} = {}) => { + const options = cleanAndMerge(defaultTreemapStyleOptions, treemap2); + return ` + .treemapNode.section { + stroke: ${options.sectionStrokeColor}; + stroke-width: ${options.sectionStrokeWidth}; + fill: ${options.sectionFillColor}; + } + .treemapNode.leaf { + stroke: ${options.leafStrokeColor}; + stroke-width: ${options.leafStrokeWidth}; + fill: ${options.leafFillColor}; + } + .treemapLabel { + fill: ${options.labelColor}; + font-size: ${options.labelFontSize}; + } + .treemapValue { + fill: ${options.valueColor}; + font-size: ${options.valueFontSize}; + } + .treemapTitle { + fill: ${options.titleColor}; + font-size: ${options.titleFontSize}; + } + `; +}, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/treemap/diagram.ts +var diagram = { + parser, + get db() { + return new TreeMapDB(); + }, + renderer, + styles: styles_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-PSM6KHXK.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-PSM6KHXK.mjs.map new file mode 100644 index 0000000..6140fb1 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-PSM6KHXK.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/treemap/db.ts", "../../../src/diagrams/treemap/parser.ts", "../../../src/diagrams/treemap/utils.ts", "../../../src/diagrams/treemap/renderer.ts", "../../../src/diagrams/treemap/styles.ts", "../../../src/diagrams/treemap/diagram.ts"], + "sourcesContent": ["import type { DiagramDB } from '../../diagram-api/types.js';\nimport type { DiagramStyleClassDef } from '../../diagram-api/types.js';\nimport type { TreemapDiagramConfig, TreemapNode } from './types.js';\nimport DEFAULT_CONFIG from '../../defaultConfig.js';\nimport { getConfig as commonGetConfig } from '../../config.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport { isLabelStyle } from '../../rendering-util/rendering-elements/shapes/handDrawnShapeStyles.js';\nimport {\n clear as commonClear,\n getAccDescription,\n getAccTitle,\n getDiagramTitle,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n} from '../common/commonDb.js';\nexport class TreeMapDB implements DiagramDB {\n private nodes: TreemapNode[] = [];\n private levels: Map = new Map();\n private outerNodes: TreemapNode[] = [];\n private classes: Map = new Map();\n private root?: TreemapNode;\n\n public getNodes() {\n return this.nodes;\n }\n\n public getConfig() {\n const defaultConfig = DEFAULT_CONFIG as unknown as { treemap: Required };\n const userConfig = commonGetConfig() as unknown as { treemap?: Partial };\n return cleanAndMerge({\n ...defaultConfig.treemap,\n ...(userConfig.treemap ?? {}),\n }) as Required;\n }\n\n public addNode(node: TreemapNode, level: number) {\n this.nodes.push(node);\n this.levels.set(node, level);\n if (level === 0) {\n this.outerNodes.push(node);\n this.root ??= node;\n }\n }\n\n public getRoot() {\n return { name: '', children: this.outerNodes };\n }\n\n public addClass(id: string, _style: string) {\n const styleClass = this.classes.get(id) ?? { id, styles: [], textStyles: [] };\n const styles = _style.replace(/\\\\,/g, '\u00A7\u00A7\u00A7').replace(/,/g, ';').replace(/\u00A7\u00A7\u00A7/g, ',').split(';');\n if (styles) {\n styles.forEach((s) => {\n if (isLabelStyle(s)) {\n if (styleClass?.textStyles) {\n styleClass.textStyles.push(s);\n } else {\n styleClass.textStyles = [s];\n }\n }\n if (styleClass?.styles) {\n styleClass.styles.push(s);\n } else {\n styleClass.styles = [s];\n }\n });\n }\n this.classes.set(id, styleClass);\n }\n\n public getClasses() {\n return this.classes;\n }\n\n public getStylesForClass(classSelector: string): string[] {\n return this.classes.get(classSelector)?.styles ?? [];\n }\n\n public clear() {\n commonClear();\n this.nodes = [];\n this.levels = new Map();\n this.outerNodes = [];\n this.classes = new Map();\n this.root = undefined;\n }\n\n public setAccTitle = setAccTitle;\n public getAccTitle = getAccTitle;\n public setDiagramTitle = setDiagramTitle;\n public getDiagramTitle = getDiagramTitle;\n public getAccDescription = getAccDescription;\n public setAccDescription = setAccDescription;\n}\n", "import { parse } from '@mermaid-js/parser';\nimport type { ParserDefinition } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { populateCommonDb } from '../common/populateCommonDb.js';\nimport type { TreemapNode, TreemapAst, TreemapDB } from './types.js';\nimport { buildHierarchy } from './utils.js';\nimport { TreeMapDB } from './db.js';\n\n/**\n * Populates the database with data from the Treemap AST\n * @param ast - The Treemap AST\n */\nconst populate = (ast: TreemapAst, db: TreemapDB) => {\n // We need to bypass the type checking for populateCommonDb\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n populateCommonDb(ast as any, db);\n\n const items: {\n level: number;\n name: string;\n type: string;\n value?: number;\n classSelector?: string;\n cssCompiledStyles?: string;\n }[] = [];\n\n // Extract classes and styles from the treemap\n for (const row of ast.TreemapRows ?? []) {\n if (row.$type === 'ClassDefStatement') {\n db.addClass(row.className ?? '', row.styleText ?? '');\n }\n }\n\n // Extract data from each row in the treemap\n for (const row of ast.TreemapRows ?? []) {\n const item = row.item;\n\n if (!item) {\n continue;\n }\n\n const level = row.indent ? parseInt(row.indent) : 0;\n const name = getItemName(item);\n\n // Get styles as a string if they exist\n const styles = item.classSelector ? db.getStylesForClass(item.classSelector) : [];\n const cssCompiledStyles = styles.length > 0 ? styles.join(';') : undefined;\n\n const itemData = {\n level,\n name,\n type: item.$type,\n value: item.value,\n classSelector: item.classSelector,\n cssCompiledStyles,\n };\n\n items.push(itemData);\n }\n\n // Convert flat structure to hierarchical\n const hierarchyNodes = buildHierarchy(items);\n\n // Add all nodes to the database\n const addNodesRecursively = (nodes: TreemapNode[], level: number) => {\n for (const node of nodes) {\n db.addNode(node, level);\n if (node.children && node.children.length > 0) {\n addNodesRecursively(node.children, level + 1);\n }\n }\n };\n\n addNodesRecursively(hierarchyNodes, 0);\n};\n\n/**\n * Gets the name of a treemap item\n * @param item - The treemap item\n * @returns The name of the item\n */\nconst getItemName = (item: { name?: string | number }): string => {\n return item.name ? String(item.name) : '';\n};\n\nexport const parser: ParserDefinition = {\n // @ts-expect-error - TreeMapDB is not assignable to DiagramDB\n parser: { yy: undefined },\n parse: async (text: string): Promise => {\n try {\n // Use a generic parse that accepts any diagram type\n\n const parseFunc = parse as (diagramType: string, text: string) => Promise;\n const ast = await parseFunc('treemap', text);\n log.debug('Treemap AST:', ast);\n const db = parser.parser?.yy;\n if (!(db instanceof TreeMapDB)) {\n throw new Error(\n 'parser.parser?.yy was not a TreemapDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.'\n );\n }\n populate(ast, db);\n } catch (error) {\n log.error('Error parsing treemap:', error);\n throw error;\n }\n },\n};\n", "import type { TreemapNode } from './types.js';\n\n/**\n * Converts a flat array of treemap items into a hierarchical structure\n * @param items - Array of flat treemap items with level, name, type, and optional value\n * @returns A hierarchical tree structure\n */\nexport function buildHierarchy(\n items: {\n level: number;\n name: string;\n type: string;\n value?: number;\n classSelector?: string;\n cssCompiledStyles?: string;\n }[]\n): TreemapNode[] {\n if (!items.length) {\n return [];\n }\n\n const root: TreemapNode[] = [];\n const stack: { node: TreemapNode; level: number }[] = [];\n\n items.forEach((item) => {\n const node: TreemapNode = {\n name: item.name,\n children: item.type === 'Leaf' ? undefined : [],\n };\n node.classSelector = item?.classSelector;\n if (item?.cssCompiledStyles) {\n node.cssCompiledStyles = [item.cssCompiledStyles];\n }\n\n if (item.type === 'Leaf' && item.value !== undefined) {\n node.value = item.value;\n }\n\n // Find the right parent for this node\n while (stack.length > 0 && stack[stack.length - 1].level >= item.level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n // This is a root node\n root.push(node);\n } else {\n // Add as child to the parent\n const parent = stack[stack.length - 1].node;\n if (parent.children) {\n parent.children.push(node);\n } else {\n parent.children = [node];\n }\n }\n\n // Only add to stack if it can have children\n if (item.type !== 'Leaf') {\n stack.push({ node, level: item.level });\n }\n });\n\n return root;\n}\n", "import type { Diagram } from '../../Diagram.js';\nimport type {\n DiagramRenderer,\n DiagramStyleClassDef,\n DrawDefinition,\n} from '../../diagram-api/types.js';\nimport { selectSvgElement } from '../../rendering-util/selectSvgElement.js';\nimport { setupViewPortForSVG } from '../../rendering-util/setupViewPortForSVG.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\nimport type { TreemapDB, TreemapNode } from './types.js';\nimport { scaleOrdinal, treemap, hierarchy, format, select } from 'd3';\nimport { styles2String } from '../../rendering-util/rendering-elements/shapes/handDrawnShapeStyles.js';\nimport { getConfig } from '../../config.js';\nimport { log } from '../../logger.js';\nimport type { Node } from '../../rendering-util/types.js';\n\nconst DEFAULT_INNER_PADDING = 10; // Default for inner padding between cells/sections\nconst SECTION_INNER_PADDING = 10; // Default for inner padding between cells/sections\nconst SECTION_HEADER_HEIGHT = 25;\n\n/**\n * Draws the treemap diagram\n */\nconst draw: DrawDefinition = (_text, id, _version, diagram: Diagram) => {\n const treemapDb = diagram.db as TreemapDB;\n const config = treemapDb.getConfig();\n const treemapInnerPadding = config.padding ?? DEFAULT_INNER_PADDING;\n const title = treemapDb.getDiagramTitle();\n const root = treemapDb.getRoot();\n const { themeVariables } = getConfig();\n if (!root) {\n return;\n }\n\n // Define dimensions\n const titleHeight = title ? 30 : 0;\n\n const svg = selectSvgElement(id);\n // Use config dimensions or defaults\n const width = config.nodeWidth ? config.nodeWidth * SECTION_INNER_PADDING : 960;\n const height = config.nodeHeight ? config.nodeHeight * SECTION_INNER_PADDING : 500;\n\n const svgWidth = width;\n const svgHeight = height + titleHeight;\n\n // Set the SVG size\n svg.attr('viewBox', `0 0 ${svgWidth} ${svgHeight}`);\n configureSvgSize(svg, svgHeight, svgWidth, config.useMaxWidth);\n\n // Format for displaying values\n let valueFormat;\n try {\n // Handle special format patterns\n const formatStr = config.valueFormat || ',';\n\n // Handle special cases that aren't directly supported by D3 format\n if (formatStr === '$0,0') {\n // Currency with thousands separator\n valueFormat = (value: number) => '$' + format(',')(value);\n } else if (formatStr.startsWith('$') && formatStr.includes(',')) {\n // Other dollar formats with commas\n const precision = /\\.\\d+/.exec(formatStr);\n const precisionStr = precision ? precision[0] : '';\n valueFormat = (value: number) => '$' + format(',' + precisionStr)(value);\n } else if (formatStr.startsWith('$')) {\n // Simple dollar sign prefix\n const restOfFormat = formatStr.substring(1);\n valueFormat = (value: number) => '$' + format(restOfFormat || '')(value);\n } else {\n // Standard D3 format\n valueFormat = format(formatStr);\n }\n } catch (error) {\n log.error('Error creating format function:', error);\n // Fallback to default format\n valueFormat = format(',');\n }\n\n // Create color scale\n const colorScale = scaleOrdinal().range([\n 'transparent',\n themeVariables.cScale0,\n themeVariables.cScale1,\n themeVariables.cScale2,\n themeVariables.cScale3,\n themeVariables.cScale4,\n themeVariables.cScale5,\n themeVariables.cScale6,\n themeVariables.cScale7,\n themeVariables.cScale8,\n themeVariables.cScale9,\n themeVariables.cScale10,\n themeVariables.cScale11,\n ]);\n const colorScalePeer = scaleOrdinal().range([\n 'transparent',\n themeVariables.cScalePeer0,\n themeVariables.cScalePeer1,\n themeVariables.cScalePeer2,\n themeVariables.cScalePeer3,\n themeVariables.cScalePeer4,\n themeVariables.cScalePeer5,\n themeVariables.cScalePeer6,\n themeVariables.cScalePeer7,\n themeVariables.cScalePeer8,\n themeVariables.cScalePeer9,\n themeVariables.cScalePeer10,\n themeVariables.cScalePeer11,\n ]);\n const colorScaleLabel = scaleOrdinal().range([\n themeVariables.cScaleLabel0,\n themeVariables.cScaleLabel1,\n themeVariables.cScaleLabel2,\n themeVariables.cScaleLabel3,\n themeVariables.cScaleLabel4,\n themeVariables.cScaleLabel5,\n themeVariables.cScaleLabel6,\n themeVariables.cScaleLabel7,\n themeVariables.cScaleLabel8,\n themeVariables.cScaleLabel9,\n themeVariables.cScaleLabel10,\n themeVariables.cScaleLabel11,\n ]);\n\n // Draw the title if it exists\n if (title) {\n svg\n .append('text')\n .attr('x', svgWidth / 2)\n .attr('y', titleHeight / 2)\n .attr('class', 'treemapTitle')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .text(title);\n }\n\n // Create a main container for the treemap, translated below the title\n const g = svg\n .append('g')\n .attr('transform', `translate(0, ${titleHeight})`)\n .attr('class', 'treemapContainer');\n\n // Create the hierarchical structure\n const hierarchyRoot = hierarchy(root)\n .sum((d) => d.value ?? 0)\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n // Create treemap layout\n const treemapLayout = treemap()\n .size([width, height])\n .paddingTop((d) =>\n d.children && d.children.length > 0 ? SECTION_HEADER_HEIGHT + SECTION_INNER_PADDING : 0\n )\n .paddingInner(treemapInnerPadding)\n .paddingLeft((d) => (d.children && d.children.length > 0 ? SECTION_INNER_PADDING : 0))\n .paddingRight((d) => (d.children && d.children.length > 0 ? SECTION_INNER_PADDING : 0))\n .paddingBottom((d) => (d.children && d.children.length > 0 ? SECTION_INNER_PADDING : 0))\n .round(true);\n\n // Apply the treemap layout to the hierarchy\n const treemapData = treemapLayout(hierarchyRoot);\n\n // Draw section nodes (branches - nodes with children)\n const branchNodes = treemapData.descendants().filter((d) => d.children && d.children.length > 0);\n const sections = g\n .selectAll('.treemapSection')\n .data(branchNodes)\n .enter()\n .append('g')\n .attr('class', 'treemapSection')\n .attr('transform', (d) => `translate(${d.x0},${d.y0})`);\n\n // Add section header background\n sections\n .append('rect')\n .attr('width', (d) => d.x1 - d.x0)\n .attr('height', SECTION_HEADER_HEIGHT)\n .attr('class', 'treemapSectionHeader')\n .attr('fill', 'none')\n .attr('fill-opacity', 0.6)\n .attr('stroke-width', 0.6)\n .attr('style', (d) => {\n // Hide the label for the root section\n if (d.depth === 0) {\n return 'display: none;';\n }\n return '';\n });\n\n // Add clip paths for section headers to prevent text overflow\n sections\n .append('clipPath')\n .attr('id', (_d, i) => `clip-section-${id}-${i}`)\n .append('rect')\n .attr('width', (d) => Math.max(0, d.x1 - d.x0 - 12)) // 6px padding on each side\n .attr('height', SECTION_HEADER_HEIGHT);\n\n sections\n .append('rect')\n .attr('width', (d) => d.x1 - d.x0)\n .attr('height', (d) => d.y1 - d.y0)\n .attr('class', (_d, i) => {\n return `treemapSection section${i}`;\n })\n .attr('fill', (d) => colorScale(d.data.name))\n .attr('fill-opacity', 0.6)\n .attr('stroke', (d) => colorScalePeer(d.data.name))\n .attr('stroke-width', 2.0)\n .attr('stroke-opacity', 0.4)\n .attr('style', (d) => {\n // Hide the label for the root section\n if (d.depth === 0) {\n return 'display: none;';\n }\n const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles } as Node);\n return styles.nodeStyles + ';' + styles.borderStyles.join(';');\n });\n // Add section labels\n sections\n .append('text')\n .attr('class', 'treemapSectionLabel')\n .attr('x', 6) // Keep original left padding\n .attr('y', SECTION_HEADER_HEIGHT / 2)\n .attr('dominant-baseline', 'middle')\n .text((d) => (d.depth === 0 ? '' : d.data.name)) // Skip label for root section\n .attr('font-weight', 'bold')\n .attr('style', (d) => {\n // Hide the label for the root section\n if (d.depth === 0) {\n return 'display: none;';\n }\n const labelStyles =\n 'dominant-baseline: middle; font-size: 12px; fill:' +\n colorScaleLabel(d.data.name) +\n '; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;';\n const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles } as Node);\n return labelStyles + styles.labelStyles.replace('color:', 'fill:');\n })\n .each(function (d) {\n // Skip processing for root section\n if (d.depth === 0) {\n return;\n }\n const self = select(this);\n const originalText = d.data.name;\n self.text(originalText);\n const totalHeaderWidth = d.x1 - d.x0;\n const labelXPosition = 6;\n let spaceForTextContent;\n if (config.showValues !== false && d.value) {\n const valueEndsAtXRelative = totalHeaderWidth - 10;\n const estimatedValueTextActualWidth = 30;\n const gapBetweenLabelAndValue = 10;\n const labelMustEndBeforeX =\n valueEndsAtXRelative - estimatedValueTextActualWidth - gapBetweenLabelAndValue;\n spaceForTextContent = labelMustEndBeforeX - labelXPosition;\n } else {\n const labelOwnRightPadding = 6;\n spaceForTextContent = totalHeaderWidth - labelXPosition - labelOwnRightPadding;\n }\n const minimumWidthToDisplay = 15;\n const actualAvailableWidth = Math.max(minimumWidthToDisplay, spaceForTextContent);\n const textNode = self.node()!;\n const currentTextContentLength = textNode.getComputedTextLength();\n if (currentTextContentLength > actualAvailableWidth) {\n const ellipsis = '...';\n let currentTruncatedText = originalText;\n while (currentTruncatedText.length > 0) {\n currentTruncatedText = originalText.substring(0, currentTruncatedText.length - 1);\n if (currentTruncatedText.length === 0) {\n self.text(ellipsis);\n if (textNode.getComputedTextLength() > actualAvailableWidth) {\n self.text('');\n }\n break;\n }\n self.text(currentTruncatedText + ellipsis);\n if (textNode.getComputedTextLength() <= actualAvailableWidth) {\n break;\n }\n }\n }\n });\n\n // Add section values if enabled\n if (config.showValues !== false) {\n sections\n .append('text')\n .attr('class', 'treemapSectionValue')\n .attr('x', (d) => d.x1 - d.x0 - 10)\n .attr('y', SECTION_HEADER_HEIGHT / 2)\n .attr('text-anchor', 'end')\n .attr('dominant-baseline', 'middle')\n .text((d) => (d.value ? valueFormat(d.value) : ''))\n .attr('font-style', 'italic')\n .attr('style', (d) => {\n // Hide the value for the root section\n if (d.depth === 0) {\n return 'display: none;';\n }\n const labelStyles =\n 'text-anchor: end; dominant-baseline: middle; font-size: 10px; fill:' +\n colorScaleLabel(d.data.name) +\n '; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;';\n const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles } as Node);\n return labelStyles + styles.labelStyles.replace('color:', 'fill:');\n });\n }\n\n // Draw the leaf nodes\n const leafNodes = treemapData.leaves();\n const cell = g\n .selectAll('.treemapLeafGroup')\n .data(leafNodes)\n .enter()\n .append('g')\n .attr('class', (d, i) => {\n return `treemapNode treemapLeafGroup leaf${i}${d.data.classSelector ? ` ${d.data.classSelector}` : ''}x`;\n })\n .attr('transform', (d) => `translate(${d.x0},${d.y0})`);\n\n // Add rectangle for each leaf node\n cell\n .append('rect')\n .attr('width', (d) => d.x1 - d.x0)\n .attr('height', (d) => d.y1 - d.y0)\n .attr('class', 'treemapLeaf')\n .attr('fill', (d) => {\n // Leaves inherit color from their immediate parent section's name.\n // If a leaf is the root itself (no parent), it uses its own name.\n return d.parent ? colorScale(d.parent.data.name) : colorScale(d.data.name);\n })\n .attr('style', (d) => {\n const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles } as Node);\n return styles.nodeStyles;\n })\n .attr('fill-opacity', 0.3)\n .attr('stroke', (d) => {\n // Leaves inherit color from their immediate parent section's name.\n // If a leaf is the root itself (no parent), it uses its own name.\n return d.parent ? colorScale(d.parent.data.name) : colorScale(d.data.name);\n })\n .attr('stroke-width', 3.0);\n\n // Add clip paths to prevent text from extending outside nodes\n cell\n .append('clipPath')\n .attr('id', (_d, i) => `clip-${id}-${i}`)\n .append('rect')\n .attr('width', (d) => Math.max(0, d.x1 - d.x0 - 4))\n .attr('height', (d) => Math.max(0, d.y1 - d.y0 - 4));\n\n // Add node labels with clipping\n const leafLabels = cell\n .append('text')\n .attr('class', 'treemapLabel')\n .attr('x', (d) => (d.x1 - d.x0) / 2)\n .attr('y', (d) => (d.y1 - d.y0) / 2)\n // .style('fill', (d) => colorScaleLabel(d.data.name))\n .attr('style', (d) => {\n const labelStyles =\n 'text-anchor: middle; dominant-baseline: middle; font-size: 38px;fill:' +\n colorScaleLabel(d.data.name) +\n ';';\n const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles } as Node);\n return labelStyles + styles.labelStyles.replace('color:', 'fill:');\n })\n .attr('clip-path', (_d, i) => `url(#clip-${id}-${i})`)\n .text((d) => d.data.name);\n\n leafLabels.each(function (d) {\n const self = select(this);\n const nodeWidth = d.x1 - d.x0;\n const nodeHeight = d.y1 - d.y0;\n const textNode = self.node()!;\n\n const padding = 4;\n const availableWidth = nodeWidth - 2 * padding;\n const availableHeight = nodeHeight - 2 * padding;\n\n if (availableWidth < 10 || availableHeight < 10) {\n self.style('display', 'none');\n return;\n }\n\n let currentLabelFontSize = parseInt(self.style('font-size'), 10);\n const minLabelFontSize = 8;\n const originalValueRelFontSize = 28; // Original font size of value, for max cap\n const valueScaleFactor = 0.6; // Value font size as a factor of label font size\n const minValueFontSize = 6;\n const spacingBetweenLabelAndValue = 2;\n\n // 1. Adjust label font size to fit width\n while (\n textNode.getComputedTextLength() > availableWidth &&\n currentLabelFontSize > minLabelFontSize\n ) {\n currentLabelFontSize--;\n self.style('font-size', `${currentLabelFontSize}px`);\n }\n\n // 2. Adjust both label and prospective value font size to fit combined height\n let prospectiveValueFontSize = Math.max(\n minValueFontSize,\n Math.min(originalValueRelFontSize, Math.round(currentLabelFontSize * valueScaleFactor))\n );\n let combinedHeight =\n currentLabelFontSize + spacingBetweenLabelAndValue + prospectiveValueFontSize;\n\n while (combinedHeight > availableHeight && currentLabelFontSize > minLabelFontSize) {\n currentLabelFontSize--;\n prospectiveValueFontSize = Math.max(\n minValueFontSize,\n Math.min(originalValueRelFontSize, Math.round(currentLabelFontSize * valueScaleFactor))\n );\n if (\n prospectiveValueFontSize < minValueFontSize &&\n currentLabelFontSize === minLabelFontSize\n ) {\n break;\n } // Avoid shrinking label if value is already at min\n self.style('font-size', `${currentLabelFontSize}px`);\n combinedHeight =\n currentLabelFontSize + spacingBetweenLabelAndValue + prospectiveValueFontSize;\n if (prospectiveValueFontSize <= minValueFontSize && combinedHeight > availableHeight) {\n // If value is at min and still doesn't fit, label might need to shrink more alone\n // This might lead to label being too small for its own text, checked next\n }\n }\n\n // Update label font size based on height adjustment\n self.style('font-size', `${currentLabelFontSize}px`);\n\n // 3. Final visibility check for the label\n if (\n textNode.getComputedTextLength() > availableWidth ||\n currentLabelFontSize < minLabelFontSize ||\n availableHeight < currentLabelFontSize\n ) {\n self.style('display', 'none');\n // If label is hidden, value will be hidden by its own .each() loop\n }\n });\n\n // Add node values with clipping\n if (config.showValues !== false) {\n const leafValues = cell\n .append('text')\n .attr('class', 'treemapValue')\n .attr('x', (d) => (d.x1 - d.x0) / 2)\n .attr('y', function (d) {\n // Y position calculated dynamically in leafValues.each based on final label metrics\n return (d.y1 - d.y0) / 2; // Placeholder, will be overwritten\n })\n .attr('style', (d) => {\n const labelStyles =\n 'text-anchor: middle; dominant-baseline: hanging; font-size: 28px;fill:' +\n colorScaleLabel(d.data.name) +\n ';';\n const styles = styles2String({ cssCompiledStyles: d.data.cssCompiledStyles } as Node);\n return labelStyles + styles.labelStyles.replace('color:', 'fill:');\n })\n\n .attr('clip-path', (_d, i) => `url(#clip-${id}-${i})`)\n .text((d) => (d.value ? valueFormat(d.value) : ''));\n\n leafValues.each(function (d) {\n const valueTextElement = select(this);\n const parentCellNode = this.parentNode as SVGGElement | null;\n\n if (!parentCellNode) {\n valueTextElement.style('display', 'none');\n return;\n }\n\n const labelElement = select(parentCellNode).select('.treemapLabel');\n\n if (labelElement.empty() || labelElement.style('display') === 'none') {\n valueTextElement.style('display', 'none');\n return;\n }\n\n const finalLabelFontSize = parseFloat(labelElement.style('font-size'));\n const originalValueFontSize = 28; // From initial style setting\n const valueScaleFactor = 0.6;\n const minValueFontSize = 6;\n const spacingBetweenLabelAndValue = 2;\n\n const actualValueFontSize = Math.max(\n minValueFontSize,\n Math.min(originalValueFontSize, Math.round(finalLabelFontSize * valueScaleFactor))\n );\n valueTextElement.style('font-size', `${actualValueFontSize}px`);\n\n const labelCenterY = (d.y1 - d.y0) / 2;\n const valueTopActualY = labelCenterY + finalLabelFontSize / 2 + spacingBetweenLabelAndValue;\n valueTextElement.attr('y', valueTopActualY);\n\n const nodeWidth = d.x1 - d.x0;\n const nodeTotalHeight = d.y1 - d.y0;\n const cellBottomPadding = 4;\n const maxValueBottomY = nodeTotalHeight - cellBottomPadding;\n const availableWidthForValue = nodeWidth - 2 * 4; // padding for value text\n\n if (\n valueTextElement.node()!.getComputedTextLength() > availableWidthForValue ||\n valueTopActualY + actualValueFontSize > maxValueBottomY ||\n actualValueFontSize < minValueFontSize\n ) {\n valueTextElement.style('display', 'none');\n } else {\n valueTextElement.style('display', null);\n }\n });\n }\n const diagramPadding = config.diagramPadding ?? 8;\n setupViewPortForSVG(svg, diagramPadding, 'flowchart', config?.useMaxWidth || false);\n};\n\nconst getClasses = function (\n _text: string,\n diagramObj: Pick\n): Map {\n return (diagramObj.db as TreemapDB).getClasses();\n};\nexport const renderer: DiagramRenderer = { draw, getClasses };\n", "import type { DiagramStylesProvider } from '../../diagram-api/types.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport type { TreemapStyleOptions } from './types.js';\n\nconst defaultTreemapStyleOptions: TreemapStyleOptions = {\n sectionStrokeColor: 'black',\n sectionStrokeWidth: '1',\n sectionFillColor: '#efefef',\n leafStrokeColor: 'black',\n leafStrokeWidth: '1',\n leafFillColor: '#efefef',\n labelColor: 'black',\n labelFontSize: '12px',\n valueFontSize: '10px',\n valueColor: 'black',\n titleColor: 'black',\n titleFontSize: '14px',\n};\n\nexport const getStyles: DiagramStylesProvider = ({\n treemap,\n}: { treemap?: TreemapStyleOptions } = {}) => {\n const options = cleanAndMerge(defaultTreemapStyleOptions, treemap);\n\n return `\n .treemapNode.section {\n stroke: ${options.sectionStrokeColor};\n stroke-width: ${options.sectionStrokeWidth};\n fill: ${options.sectionFillColor};\n }\n .treemapNode.leaf {\n stroke: ${options.leafStrokeColor};\n stroke-width: ${options.leafStrokeWidth};\n fill: ${options.leafFillColor};\n }\n .treemapLabel {\n fill: ${options.labelColor};\n font-size: ${options.labelFontSize};\n }\n .treemapValue {\n fill: ${options.valueColor};\n font-size: ${options.valueFontSize};\n }\n .treemapTitle {\n fill: ${options.titleColor};\n font-size: ${options.titleFontSize};\n }\n `;\n};\n\nexport default getStyles;\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { TreeMapDB } from './db.js';\nimport { parser } from './parser.js';\nimport { renderer } from './renderer.js';\nimport styles from './styles.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n get db() {\n return new TreeMapDB();\n },\n renderer,\n styles,\n};\n"], + "mappings": "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", + "names": ["diagram", "treemap"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-QEK2KX5R.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-QEK2KX5R.mjs new file mode 100644 index 0000000..5c7b4ab --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-QEK2KX5R.mjs @@ -0,0 +1,333 @@ +import { + selectSvgElement +} from "./chunk-EXTU4WIE.mjs"; +import { + populateCommonDb +} from "./chunk-4BX2VUAB.mjs"; +import { + cleanAndMerge +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + defaultConfig_default, + getAccDescription, + getAccTitle, + getConfig, + getDiagramTitle, + getThemeVariables, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/radar/db.ts +var defaultOptions = { + showLegend: true, + ticks: 5, + max: null, + min: 0, + graticule: "circle" +}; +var defaultRadarData = { + axes: [], + curves: [], + options: defaultOptions +}; +var data = structuredClone(defaultRadarData); +var DEFAULT_RADAR_CONFIG = defaultConfig_default.radar; +var getConfig2 = /* @__PURE__ */ __name(() => { + const config = cleanAndMerge({ + ...DEFAULT_RADAR_CONFIG, + ...getConfig().radar + }); + return config; +}, "getConfig"); +var getAxes = /* @__PURE__ */ __name(() => data.axes, "getAxes"); +var getCurves = /* @__PURE__ */ __name(() => data.curves, "getCurves"); +var getOptions = /* @__PURE__ */ __name(() => data.options, "getOptions"); +var setAxes = /* @__PURE__ */ __name((axes) => { + data.axes = axes.map((axis) => { + return { + name: axis.name, + label: axis.label ?? axis.name + }; + }); +}, "setAxes"); +var setCurves = /* @__PURE__ */ __name((curves) => { + data.curves = curves.map((curve) => { + return { + name: curve.name, + label: curve.label ?? curve.name, + entries: computeCurveEntries(curve.entries) + }; + }); +}, "setCurves"); +var computeCurveEntries = /* @__PURE__ */ __name((entries) => { + if (entries[0].axis == void 0) { + return entries.map((entry) => entry.value); + } + const axes = getAxes(); + if (axes.length === 0) { + throw new Error("Axes must be populated before curves for reference entries"); + } + return axes.map((axis) => { + const entry = entries.find((entry2) => entry2.axis?.$refText === axis.name); + if (entry === void 0) { + throw new Error("Missing entry for axis " + axis.label); + } + return entry.value; + }); +}, "computeCurveEntries"); +var setOptions = /* @__PURE__ */ __name((options) => { + const optionMap = options.reduce( + (acc, option) => { + acc[option.name] = option; + return acc; + }, + {} + ); + data.options = { + showLegend: optionMap.showLegend?.value ?? defaultOptions.showLegend, + ticks: optionMap.ticks?.value ?? defaultOptions.ticks, + max: optionMap.max?.value ?? defaultOptions.max, + min: optionMap.min?.value ?? defaultOptions.min, + graticule: optionMap.graticule?.value ?? defaultOptions.graticule + }; +}, "setOptions"); +var clear2 = /* @__PURE__ */ __name(() => { + clear(); + data = structuredClone(defaultRadarData); +}, "clear"); +var db = { + getAxes, + getCurves, + getOptions, + setAxes, + setCurves, + setOptions, + getConfig: getConfig2, + clear: clear2, + setAccTitle, + getAccTitle, + setDiagramTitle, + getDiagramTitle, + getAccDescription, + setAccDescription +}; + +// src/diagrams/radar/parser.ts +import { parse } from "@mermaid-js/parser"; +var populate = /* @__PURE__ */ __name((ast) => { + populateCommonDb(ast, db); + const { axes, curves, options } = ast; + db.setAxes(axes); + db.setCurves(curves); + db.setOptions(options); +}, "populate"); +var parser = { + parse: /* @__PURE__ */ __name(async (input) => { + const ast = await parse("radar", input); + log.debug(ast); + populate(ast); + }, "parse") +}; + +// src/diagrams/radar/renderer.ts +var draw = /* @__PURE__ */ __name((_text, id, _version, diagram2) => { + const db2 = diagram2.db; + const axes = db2.getAxes(); + const curves = db2.getCurves(); + const options = db2.getOptions(); + const config = db2.getConfig(); + const title = db2.getDiagramTitle(); + const svg = selectSvgElement(id); + const g = drawFrame(svg, config); + const maxValue = options.max ?? Math.max(...curves.map((curve) => Math.max(...curve.entries))); + const minValue = options.min; + const radius = Math.min(config.width, config.height) / 2; + drawGraticule(g, axes, radius, options.ticks, options.graticule); + drawAxes(g, axes, radius, config); + drawCurves(g, axes, curves, minValue, maxValue, options.graticule, config); + drawLegend(g, curves, options.showLegend, config); + g.append("text").attr("class", "radarTitle").text(title).attr("x", 0).attr("y", -config.height / 2 - config.marginTop); +}, "draw"); +var drawFrame = /* @__PURE__ */ __name((svg, config) => { + const totalWidth = config.width + config.marginLeft + config.marginRight; + const totalHeight = config.height + config.marginTop + config.marginBottom; + const center = { + x: config.marginLeft + config.width / 2, + y: config.marginTop + config.height / 2 + }; + svg.attr("viewbox", `0 0 ${totalWidth} ${totalHeight}`).attr("width", totalWidth).attr("height", totalHeight); + return svg.append("g").attr("transform", `translate(${center.x}, ${center.y})`); +}, "drawFrame"); +var drawGraticule = /* @__PURE__ */ __name((g, axes, radius, ticks, graticule) => { + if (graticule === "circle") { + for (let i = 0; i < ticks; i++) { + const r = radius * (i + 1) / ticks; + g.append("circle").attr("r", r).attr("class", "radarGraticule"); + } + } else if (graticule === "polygon") { + const numAxes = axes.length; + for (let i = 0; i < ticks; i++) { + const r = radius * (i + 1) / ticks; + const points = axes.map((_, j) => { + const angle = 2 * j * Math.PI / numAxes - Math.PI / 2; + const x = r * Math.cos(angle); + const y = r * Math.sin(angle); + return `${x},${y}`; + }).join(" "); + g.append("polygon").attr("points", points).attr("class", "radarGraticule"); + } + } +}, "drawGraticule"); +var drawAxes = /* @__PURE__ */ __name((g, axes, radius, config) => { + const numAxes = axes.length; + for (let i = 0; i < numAxes; i++) { + const label = axes[i].label; + const angle = 2 * i * Math.PI / numAxes - Math.PI / 2; + g.append("line").attr("x1", 0).attr("y1", 0).attr("x2", radius * config.axisScaleFactor * Math.cos(angle)).attr("y2", radius * config.axisScaleFactor * Math.sin(angle)).attr("class", "radarAxisLine"); + g.append("text").text(label).attr("x", radius * config.axisLabelFactor * Math.cos(angle)).attr("y", radius * config.axisLabelFactor * Math.sin(angle)).attr("class", "radarAxisLabel"); + } +}, "drawAxes"); +function drawCurves(g, axes, curves, minValue, maxValue, graticule, config) { + const numAxes = axes.length; + const radius = Math.min(config.width, config.height) / 2; + curves.forEach((curve, index) => { + if (curve.entries.length !== numAxes) { + return; + } + const points = curve.entries.map((entry, i) => { + const angle = 2 * Math.PI * i / numAxes - Math.PI / 2; + const r = relativeRadius(entry, minValue, maxValue, radius); + const x = r * Math.cos(angle); + const y = r * Math.sin(angle); + return { x, y }; + }); + if (graticule === "circle") { + g.append("path").attr("d", closedRoundCurve(points, config.curveTension)).attr("class", `radarCurve-${index}`); + } else if (graticule === "polygon") { + g.append("polygon").attr("points", points.map((p) => `${p.x},${p.y}`).join(" ")).attr("class", `radarCurve-${index}`); + } + }); +} +__name(drawCurves, "drawCurves"); +function relativeRadius(value, minValue, maxValue, radius) { + const clippedValue = Math.min(Math.max(value, minValue), maxValue); + return radius * (clippedValue - minValue) / (maxValue - minValue); +} +__name(relativeRadius, "relativeRadius"); +function closedRoundCurve(points, tension) { + const numPoints = points.length; + let d = `M${points[0].x},${points[0].y}`; + for (let i = 0; i < numPoints; i++) { + const p0 = points[(i - 1 + numPoints) % numPoints]; + const p1 = points[i]; + const p2 = points[(i + 1) % numPoints]; + const p3 = points[(i + 2) % numPoints]; + const cp1 = { + x: p1.x + (p2.x - p0.x) * tension, + y: p1.y + (p2.y - p0.y) * tension + }; + const cp2 = { + x: p2.x - (p3.x - p1.x) * tension, + y: p2.y - (p3.y - p1.y) * tension + }; + d += ` C${cp1.x},${cp1.y} ${cp2.x},${cp2.y} ${p2.x},${p2.y}`; + } + return `${d} Z`; +} +__name(closedRoundCurve, "closedRoundCurve"); +function drawLegend(g, curves, showLegend, config) { + if (!showLegend) { + return; + } + const legendX = (config.width / 2 + config.marginRight) * 3 / 4; + const legendY = -(config.height / 2 + config.marginTop) * 3 / 4; + const lineHeight = 20; + curves.forEach((curve, index) => { + const itemGroup = g.append("g").attr("transform", `translate(${legendX}, ${legendY + index * lineHeight})`); + itemGroup.append("rect").attr("width", 12).attr("height", 12).attr("class", `radarLegendBox-${index}`); + itemGroup.append("text").attr("x", 16).attr("y", 0).attr("class", "radarLegendText").text(curve.label); + }); +} +__name(drawLegend, "drawLegend"); +var renderer = { draw }; + +// src/diagrams/radar/styles.ts +var genIndexStyles = /* @__PURE__ */ __name((themeVariables, radarOptions) => { + let sections = ""; + for (let i = 0; i < themeVariables.THEME_COLOR_LIMIT; i++) { + const indexColor = themeVariables[`cScale${i}`]; + sections += ` + .radarCurve-${i} { + color: ${indexColor}; + fill: ${indexColor}; + fill-opacity: ${radarOptions.curveOpacity}; + stroke: ${indexColor}; + stroke-width: ${radarOptions.curveStrokeWidth}; + } + .radarLegendBox-${i} { + fill: ${indexColor}; + fill-opacity: ${radarOptions.curveOpacity}; + stroke: ${indexColor}; + } + `; + } + return sections; +}, "genIndexStyles"); +var buildRadarStyleOptions = /* @__PURE__ */ __name((radar) => { + const defaultThemeVariables = getThemeVariables(); + const currentConfig = getConfig(); + const themeVariables = cleanAndMerge(defaultThemeVariables, currentConfig.themeVariables); + const radarOptions = cleanAndMerge(themeVariables.radar, radar); + return { themeVariables, radarOptions }; +}, "buildRadarStyleOptions"); +var styles = /* @__PURE__ */ __name(({ radar } = {}) => { + const { themeVariables, radarOptions } = buildRadarStyleOptions(radar); + return ` + .radarTitle { + font-size: ${themeVariables.fontSize}; + color: ${themeVariables.titleColor}; + dominant-baseline: hanging; + text-anchor: middle; + } + .radarAxisLine { + stroke: ${radarOptions.axisColor}; + stroke-width: ${radarOptions.axisStrokeWidth}; + } + .radarAxisLabel { + dominant-baseline: middle; + text-anchor: middle; + font-size: ${radarOptions.axisLabelFontSize}px; + color: ${radarOptions.axisColor}; + } + .radarGraticule { + fill: ${radarOptions.graticuleColor}; + fill-opacity: ${radarOptions.graticuleOpacity}; + stroke: ${radarOptions.graticuleColor}; + stroke-width: ${radarOptions.graticuleStrokeWidth}; + } + .radarLegendText { + text-anchor: start; + font-size: ${radarOptions.legendFontSize}px; + dominant-baseline: hanging; + } + ${genIndexStyles(themeVariables, radarOptions)} + `; +}, "styles"); + +// src/diagrams/radar/diagram.ts +var diagram = { + parser, + db, + renderer, + styles +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-QEK2KX5R.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-QEK2KX5R.mjs.map new file mode 100644 index 0000000..8751920 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-QEK2KX5R.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/radar/db.ts", "../../../src/diagrams/radar/parser.ts", "../../../src/diagrams/radar/renderer.ts", "../../../src/diagrams/radar/styles.ts", "../../../src/diagrams/radar/diagram.ts"], + "sourcesContent": ["import { getConfig as commonGetConfig } from '../../config.js';\nimport type { RadarDiagramConfig } from '../../config.type.js';\nimport DEFAULT_CONFIG from '../../defaultConfig.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport {\n clear as commonClear,\n getAccDescription,\n getAccTitle,\n getDiagramTitle,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n} from '../common/commonDb.js';\nimport type {\n Axis,\n Curve,\n Option,\n Entry,\n} from '../../../../parser/dist/src/language/generated/ast.js';\nimport type { RadarAxis, RadarCurve, RadarOptions, RadarDB, RadarData } from './types.js';\n\nconst defaultOptions: RadarOptions = {\n showLegend: true,\n ticks: 5,\n max: null,\n min: 0,\n graticule: 'circle',\n};\n\nconst defaultRadarData: RadarData = {\n axes: [],\n curves: [],\n options: defaultOptions,\n};\n\nlet data: RadarData = structuredClone(defaultRadarData);\n\nconst DEFAULT_RADAR_CONFIG: Required = DEFAULT_CONFIG.radar;\n\nconst getConfig = (): Required => {\n const config = cleanAndMerge({\n ...DEFAULT_RADAR_CONFIG,\n ...commonGetConfig().radar,\n });\n return config;\n};\n\nconst getAxes = (): RadarAxis[] => data.axes;\nconst getCurves = (): RadarCurve[] => data.curves;\nconst getOptions = (): RadarOptions => data.options;\n\nconst setAxes = (axes: Axis[]) => {\n data.axes = axes.map((axis) => {\n return {\n name: axis.name,\n label: axis.label ?? axis.name,\n };\n });\n};\n\nconst setCurves = (curves: Curve[]) => {\n data.curves = curves.map((curve) => {\n return {\n name: curve.name,\n label: curve.label ?? curve.name,\n entries: computeCurveEntries(curve.entries),\n };\n });\n};\n\nconst computeCurveEntries = (entries: Entry[]): number[] => {\n // If entries have axis reference, we must order them according to the axes\n if (entries[0].axis == undefined) {\n return entries.map((entry) => entry.value);\n }\n const axes = getAxes();\n if (axes.length === 0) {\n throw new Error('Axes must be populated before curves for reference entries');\n }\n return axes.map((axis) => {\n const entry = entries.find((entry) => entry.axis?.$refText === axis.name);\n if (entry === undefined) {\n throw new Error('Missing entry for axis ' + axis.label);\n }\n return entry.value;\n });\n};\n\nconst setOptions = (options: Option[]) => {\n // Create a map from option names to option objects for quick lookup\n const optionMap = options.reduce(\n (acc, option) => {\n acc[option.name] = option;\n return acc;\n },\n {} as Record\n );\n\n data.options = {\n showLegend: (optionMap.showLegend?.value as boolean) ?? defaultOptions.showLegend,\n ticks: (optionMap.ticks?.value as number) ?? defaultOptions.ticks,\n max: (optionMap.max?.value as number) ?? defaultOptions.max,\n min: (optionMap.min?.value as number) ?? defaultOptions.min,\n graticule: (optionMap.graticule?.value as 'circle' | 'polygon') ?? defaultOptions.graticule,\n };\n};\n\nconst clear = () => {\n commonClear();\n data = structuredClone(defaultRadarData);\n};\n\nexport const db: RadarDB = {\n getAxes,\n getCurves,\n getOptions,\n setAxes,\n setCurves,\n setOptions,\n getConfig,\n clear,\n setAccTitle,\n getAccTitle,\n setDiagramTitle,\n getDiagramTitle,\n getAccDescription,\n setAccDescription,\n};\n", "import type { Radar } from '@mermaid-js/parser';\nimport { parse } from '@mermaid-js/parser';\nimport type { ParserDefinition } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { populateCommonDb } from '../common/populateCommonDb.js';\nimport { db } from './db.js';\n\nconst populate = (ast: Radar) => {\n populateCommonDb(ast, db);\n const { axes, curves, options } = ast;\n // Here we can add specific logic between the AST and the DB\n db.setAxes(axes);\n db.setCurves(curves);\n db.setOptions(options);\n};\n\nexport const parser: ParserDefinition = {\n parse: async (input: string): Promise => {\n const ast: Radar = await parse('radar', input);\n log.debug(ast);\n populate(ast);\n },\n};\n", "import type { Diagram } from '../../Diagram.js';\nimport type { RadarDiagramConfig } from '../../config.type.js';\nimport type { DiagramRenderer, DrawDefinition, SVG, SVGGroup } from '../../diagram-api/types.js';\nimport { selectSvgElement } from '../../rendering-util/selectSvgElement.js';\nimport type { RadarDB, RadarAxis, RadarCurve } from './types.js';\n\nconst draw: DrawDefinition = (_text, id, _version, diagram: Diagram) => {\n const db = diagram.db as RadarDB;\n const axes = db.getAxes();\n const curves = db.getCurves();\n const options = db.getOptions();\n const config = db.getConfig();\n const title = db.getDiagramTitle();\n\n const svg: SVG = selectSvgElement(id);\n\n // \uD83D\uDDBC\uFE0F Draw the main frame\n const g = drawFrame(svg, config);\n\n // The maximum value for the radar chart is the 'max' option if it exists,\n // otherwise it is the maximum value of the curves\n const maxValue: number =\n options.max ?? Math.max(...curves.map((curve) => Math.max(...curve.entries)));\n const minValue: number = options.min;\n const radius = Math.min(config.width, config.height) / 2;\n\n // \uD83D\uDD78\uFE0F Draw graticule\n drawGraticule(g, axes, radius, options.ticks, options.graticule);\n\n // \uD83E\uDE93 Draw the axes\n drawAxes(g, axes, radius, config);\n\n // \uD83D\uDCCA Draw the curves\n drawCurves(g, axes, curves, minValue, maxValue, options.graticule, config);\n\n // \uD83C\uDFF7 Draw Legend\n drawLegend(g, curves, options.showLegend, config);\n\n // \uD83C\uDFF7 Draw Title\n g.append('text')\n .attr('class', 'radarTitle')\n .text(title)\n .attr('x', 0)\n .attr('y', -config.height / 2 - config.marginTop);\n};\n\n// Returns a g element to center the radar chart\n// it is of type SVGElement\nconst drawFrame = (svg: SVG, config: Required): SVGGroup => {\n const totalWidth = config.width + config.marginLeft + config.marginRight;\n const totalHeight = config.height + config.marginTop + config.marginBottom;\n const center = {\n x: config.marginLeft + config.width / 2,\n y: config.marginTop + config.height / 2,\n };\n // Initialize the SVG\n svg\n .attr('viewbox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('width', totalWidth)\n .attr('height', totalHeight);\n // g element to center the radar chart\n return svg.append('g').attr('transform', `translate(${center.x}, ${center.y})`);\n};\n\nconst drawGraticule = (\n g: SVGGroup,\n axes: RadarAxis[],\n radius: number,\n ticks: number,\n graticule: string\n) => {\n if (graticule === 'circle') {\n // Draw a circle for each tick\n for (let i = 0; i < ticks; i++) {\n const r = (radius * (i + 1)) / ticks;\n g.append('circle').attr('r', r).attr('class', 'radarGraticule');\n }\n } else if (graticule === 'polygon') {\n // Draw a polygon\n const numAxes = axes.length;\n for (let i = 0; i < ticks; i++) {\n const r = (radius * (i + 1)) / ticks;\n const points = axes\n .map((_, j) => {\n const angle = (2 * j * Math.PI) / numAxes - Math.PI / 2;\n const x = r * Math.cos(angle);\n const y = r * Math.sin(angle);\n return `${x},${y}`;\n })\n .join(' ');\n g.append('polygon').attr('points', points).attr('class', 'radarGraticule');\n }\n }\n};\n\nconst drawAxes = (\n g: SVGGroup,\n axes: RadarAxis[],\n radius: number,\n config: Required\n) => {\n const numAxes = axes.length;\n\n for (let i = 0; i < numAxes; i++) {\n const label = axes[i].label;\n const angle = (2 * i * Math.PI) / numAxes - Math.PI / 2;\n g.append('line')\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', radius * config.axisScaleFactor * Math.cos(angle))\n .attr('y2', radius * config.axisScaleFactor * Math.sin(angle))\n .attr('class', 'radarAxisLine');\n g.append('text')\n .text(label)\n .attr('x', radius * config.axisLabelFactor * Math.cos(angle))\n .attr('y', radius * config.axisLabelFactor * Math.sin(angle))\n .attr('class', 'radarAxisLabel');\n }\n};\n\nfunction drawCurves(\n g: SVGGroup,\n axes: RadarAxis[],\n curves: RadarCurve[],\n minValue: number,\n maxValue: number,\n graticule: string,\n config: Required\n) {\n const numAxes = axes.length;\n const radius = Math.min(config.width, config.height) / 2;\n\n curves.forEach((curve, index) => {\n if (curve.entries.length !== numAxes) {\n // Skip curves that do not have an entry for each axis.\n return;\n }\n // Compute points for the curve.\n const points = curve.entries.map((entry, i) => {\n const angle = (2 * Math.PI * i) / numAxes - Math.PI / 2;\n const r = relativeRadius(entry, minValue, maxValue, radius);\n const x = r * Math.cos(angle);\n const y = r * Math.sin(angle);\n return { x, y };\n });\n\n if (graticule === 'circle') {\n // Draw a closed curve through the points.\n g.append('path')\n .attr('d', closedRoundCurve(points, config.curveTension))\n .attr('class', `radarCurve-${index}`);\n } else if (graticule === 'polygon') {\n // Draw a polygon for each curve.\n g.append('polygon')\n .attr('points', points.map((p) => `${p.x},${p.y}`).join(' '))\n .attr('class', `radarCurve-${index}`);\n }\n });\n}\n\nexport function relativeRadius(\n value: number,\n minValue: number,\n maxValue: number,\n radius: number\n): number {\n const clippedValue = Math.min(Math.max(value, minValue), maxValue);\n return (radius * (clippedValue - minValue)) / (maxValue - minValue);\n}\n\nexport function closedRoundCurve(points: { x: number; y: number }[], tension: number): string {\n // Catmull-Rom spline helper function\n const numPoints = points.length;\n let d = `M${points[0].x},${points[0].y}`;\n // For each segment from point i to point (i+1) mod n, compute control points.\n for (let i = 0; i < numPoints; i++) {\n const p0 = points[(i - 1 + numPoints) % numPoints];\n const p1 = points[i];\n const p2 = points[(i + 1) % numPoints];\n const p3 = points[(i + 2) % numPoints];\n // Calculate the control points for the cubic Bezier segment\n const cp1 = {\n x: p1.x + (p2.x - p0.x) * tension,\n y: p1.y + (p2.y - p0.y) * tension,\n };\n const cp2 = {\n x: p2.x - (p3.x - p1.x) * tension,\n y: p2.y - (p3.y - p1.y) * tension,\n };\n d += ` C${cp1.x},${cp1.y} ${cp2.x},${cp2.y} ${p2.x},${p2.y}`;\n }\n return `${d} Z`;\n}\n\nfunction drawLegend(\n g: SVGGroup,\n curves: RadarCurve[],\n showLegend: boolean,\n config: Required\n) {\n if (!showLegend) {\n return;\n }\n\n // Create a legend group and position it in the top-right corner of the chart.\n const legendX = ((config.width / 2 + config.marginRight) * 3) / 4;\n const legendY = (-(config.height / 2 + config.marginTop) * 3) / 4;\n const lineHeight = 20;\n\n curves.forEach((curve, index) => {\n const itemGroup = g\n .append('g')\n .attr('transform', `translate(${legendX}, ${legendY + index * lineHeight})`);\n\n // Draw a square marker for this curve.\n itemGroup\n .append('rect')\n .attr('width', 12)\n .attr('height', 12)\n .attr('class', `radarLegendBox-${index}`);\n\n // Draw the label text next to the marker.\n itemGroup\n .append('text')\n .attr('x', 16)\n .attr('y', 0)\n .attr('class', 'radarLegendText')\n .text(curve.label);\n });\n}\n\nexport const renderer: DiagramRenderer = { draw };\n", "import type { DiagramStylesProvider } from '../../diagram-api/types.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport type { RadarStyleOptions } from './types.js';\nimport { getThemeVariables } from '../../themes/theme-default.js';\nimport { getConfig as getConfigAPI } from '../../config.js';\n\nconst genIndexStyles = (\n themeVariables: ReturnType,\n radarOptions: RadarStyleOptions\n) => {\n let sections = '';\n for (let i = 0; i < themeVariables.THEME_COLOR_LIMIT; i++) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const indexColor = (themeVariables as any)[`cScale${i}`];\n sections += `\n\t\t.radarCurve-${i} {\n\t\t\tcolor: ${indexColor};\n\t\t\tfill: ${indexColor};\n\t\t\tfill-opacity: ${radarOptions.curveOpacity};\n\t\t\tstroke: ${indexColor};\n\t\t\tstroke-width: ${radarOptions.curveStrokeWidth};\n\t\t}\n\t\t.radarLegendBox-${i} {\n\t\t\tfill: ${indexColor};\n\t\t\tfill-opacity: ${radarOptions.curveOpacity};\n\t\t\tstroke: ${indexColor};\n\t\t}\n\t\t`;\n }\n return sections;\n};\n\nexport const buildRadarStyleOptions = (radar?: RadarStyleOptions) => {\n const defaultThemeVariables = getThemeVariables();\n const currentConfig = getConfigAPI();\n\n const themeVariables = cleanAndMerge(defaultThemeVariables, currentConfig.themeVariables);\n const radarOptions: RadarStyleOptions = cleanAndMerge(themeVariables.radar, radar);\n\n return { themeVariables, radarOptions };\n};\n\nexport const styles: DiagramStylesProvider = ({ radar }: { radar?: RadarStyleOptions } = {}) => {\n const { themeVariables, radarOptions } = buildRadarStyleOptions(radar);\n return `\n\t.radarTitle {\n\t\tfont-size: ${themeVariables.fontSize};\n\t\tcolor: ${themeVariables.titleColor};\n\t\tdominant-baseline: hanging;\n\t\ttext-anchor: middle;\n\t}\n\t.radarAxisLine {\n\t\tstroke: ${radarOptions.axisColor};\n\t\tstroke-width: ${radarOptions.axisStrokeWidth};\n\t}\n\t.radarAxisLabel {\n\t\tdominant-baseline: middle;\n\t\ttext-anchor: middle;\n\t\tfont-size: ${radarOptions.axisLabelFontSize}px;\n\t\tcolor: ${radarOptions.axisColor};\n\t}\n\t.radarGraticule {\n\t\tfill: ${radarOptions.graticuleColor};\n\t\tfill-opacity: ${radarOptions.graticuleOpacity};\n\t\tstroke: ${radarOptions.graticuleColor};\n\t\tstroke-width: ${radarOptions.graticuleStrokeWidth};\n\t}\n\t.radarLegendText {\n\t\ttext-anchor: start;\n\t\tfont-size: ${radarOptions.legendFontSize}px;\n\t\tdominant-baseline: hanging;\n\t}\n\t${genIndexStyles(themeVariables, radarOptions)}\n\t`;\n};\n\nexport default styles;\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { db } from './db.js';\nimport { parser } from './parser.js';\nimport { renderer } from './renderer.js';\nimport { styles } from './styles.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles,\n};\n"], + "mappings": "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", + "names": ["getConfig", "entry", "clear", "diagram", "db"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-S2PKOQOG.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-S2PKOQOG.mjs new file mode 100644 index 0000000..b93b61d --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-S2PKOQOG.mjs @@ -0,0 +1,245 @@ +import { + selectSvgElement +} from "./chunk-EXTU4WIE.mjs"; +import { + populateCommonDb +} from "./chunk-4BX2VUAB.mjs"; +import { + cleanAndMerge +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + configureSvgSize, + defaultConfig_default, + getAccDescription, + getAccTitle, + getConfig, + getDiagramTitle, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/packet/db.ts +var DEFAULT_PACKET_CONFIG = defaultConfig_default.packet; +var PacketDB = class { + constructor() { + this.packet = []; + this.setAccTitle = setAccTitle; + this.getAccTitle = getAccTitle; + this.setDiagramTitle = setDiagramTitle; + this.getDiagramTitle = getDiagramTitle; + this.getAccDescription = getAccDescription; + this.setAccDescription = setAccDescription; + } + static { + __name(this, "PacketDB"); + } + getConfig() { + const config = cleanAndMerge({ + ...DEFAULT_PACKET_CONFIG, + ...getConfig().packet + }); + if (config.showBits) { + config.paddingY += 10; + } + return config; + } + getPacket() { + return this.packet; + } + pushWord(word) { + if (word.length > 0) { + this.packet.push(word); + } + } + clear() { + clear(); + this.packet = []; + } +}; + +// src/diagrams/packet/parser.ts +import { parse } from "@mermaid-js/parser"; +var maxPacketSize = 1e4; +var populate = /* @__PURE__ */ __name((ast, db) => { + populateCommonDb(ast, db); + let lastBit = -1; + let word = []; + let row = 1; + const { bitsPerRow } = db.getConfig(); + for (let { start, end, bits, label } of ast.blocks) { + if (start !== void 0 && end !== void 0 && end < start) { + throw new Error(`Packet block ${start} - ${end} is invalid. End must be greater than start.`); + } + start ??= lastBit + 1; + if (start !== lastBit + 1) { + throw new Error( + `Packet block ${start} - ${end ?? start} is not contiguous. It should start from ${lastBit + 1}.` + ); + } + if (bits === 0) { + throw new Error(`Packet block ${start} is invalid. Cannot have a zero bit field.`); + } + end ??= start + (bits ?? 1) - 1; + bits ??= end - start + 1; + lastBit = end; + log.debug(`Packet block ${start} - ${lastBit} with label ${label}`); + while (word.length <= bitsPerRow + 1 && db.getPacket().length < maxPacketSize) { + const [block, nextBlock] = getNextFittingBlock({ start, end, bits, label }, row, bitsPerRow); + word.push(block); + if (block.end + 1 === row * bitsPerRow) { + db.pushWord(word); + word = []; + row++; + } + if (!nextBlock) { + break; + } + ({ start, end, bits, label } = nextBlock); + } + } + db.pushWord(word); +}, "populate"); +var getNextFittingBlock = /* @__PURE__ */ __name((block, row, bitsPerRow) => { + if (block.start === void 0) { + throw new Error("start should have been set during first phase"); + } + if (block.end === void 0) { + throw new Error("end should have been set during first phase"); + } + if (block.start > block.end) { + throw new Error(`Block start ${block.start} is greater than block end ${block.end}.`); + } + if (block.end + 1 <= row * bitsPerRow) { + return [block, void 0]; + } + const rowEnd = row * bitsPerRow - 1; + const rowStart = row * bitsPerRow; + return [ + { + start: block.start, + end: rowEnd, + label: block.label, + bits: rowEnd - block.start + }, + { + start: rowStart, + end: block.end, + label: block.label, + bits: block.end - rowStart + } + ]; +}, "getNextFittingBlock"); +var parser = { + // @ts-expect-error - PacketDB is not assignable to DiagramDB + parser: { yy: void 0 }, + parse: /* @__PURE__ */ __name(async (input) => { + const ast = await parse("packet", input); + const db = parser.parser?.yy; + if (!(db instanceof PacketDB)) { + throw new Error( + "parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues." + ); + } + log.debug(ast); + populate(ast, db); + }, "parse") +}; + +// src/diagrams/packet/renderer.ts +var draw = /* @__PURE__ */ __name((_text, id, _version, diagram2) => { + const db = diagram2.db; + const config = db.getConfig(); + const { rowHeight, paddingY, bitWidth, bitsPerRow } = config; + const words = db.getPacket(); + const title = db.getDiagramTitle(); + const totalRowHeight = rowHeight + paddingY; + const svgHeight = totalRowHeight * (words.length + 1) - (title ? 0 : rowHeight); + const svgWidth = bitWidth * bitsPerRow + 2; + const svg = selectSvgElement(id); + svg.attr("viewbox", `0 0 ${svgWidth} ${svgHeight}`); + configureSvgSize(svg, svgHeight, svgWidth, config.useMaxWidth); + for (const [word, packet] of words.entries()) { + drawWord(svg, packet, word, config); + } + svg.append("text").text(title).attr("x", svgWidth / 2).attr("y", svgHeight - totalRowHeight / 2).attr("dominant-baseline", "middle").attr("text-anchor", "middle").attr("class", "packetTitle"); +}, "draw"); +var drawWord = /* @__PURE__ */ __name((svg, word, rowNumber, { rowHeight, paddingX, paddingY, bitWidth, bitsPerRow, showBits }) => { + const group = svg.append("g"); + const wordY = rowNumber * (rowHeight + paddingY) + paddingY; + for (const block of word) { + const blockX = block.start % bitsPerRow * bitWidth + 1; + const width = (block.end - block.start + 1) * bitWidth - paddingX; + group.append("rect").attr("x", blockX).attr("y", wordY).attr("width", width).attr("height", rowHeight).attr("class", "packetBlock"); + group.append("text").attr("x", blockX + width / 2).attr("y", wordY + rowHeight / 2).attr("class", "packetLabel").attr("dominant-baseline", "middle").attr("text-anchor", "middle").text(block.label); + if (!showBits) { + continue; + } + const isSingleBlock = block.end === block.start; + const bitNumberY = wordY - 2; + group.append("text").attr("x", blockX + (isSingleBlock ? width / 2 : 0)).attr("y", bitNumberY).attr("class", "packetByte start").attr("dominant-baseline", "auto").attr("text-anchor", isSingleBlock ? "middle" : "start").text(block.start); + if (!isSingleBlock) { + group.append("text").attr("x", blockX + width).attr("y", bitNumberY).attr("class", "packetByte end").attr("dominant-baseline", "auto").attr("text-anchor", "end").text(block.end); + } + } +}, "drawWord"); +var renderer = { draw }; + +// src/diagrams/packet/styles.ts +var defaultPacketStyleOptions = { + byteFontSize: "10px", + startByteColor: "black", + endByteColor: "black", + labelColor: "black", + labelFontSize: "12px", + titleColor: "black", + titleFontSize: "14px", + blockStrokeColor: "black", + blockStrokeWidth: "1", + blockFillColor: "#efefef" +}; +var styles = /* @__PURE__ */ __name(({ packet } = {}) => { + const options = cleanAndMerge(defaultPacketStyleOptions, packet); + return ` + .packetByte { + font-size: ${options.byteFontSize}; + } + .packetByte.start { + fill: ${options.startByteColor}; + } + .packetByte.end { + fill: ${options.endByteColor}; + } + .packetLabel { + fill: ${options.labelColor}; + font-size: ${options.labelFontSize}; + } + .packetTitle { + fill: ${options.titleColor}; + font-size: ${options.titleFontSize}; + } + .packetBlock { + stroke: ${options.blockStrokeColor}; + stroke-width: ${options.blockStrokeWidth}; + fill: ${options.blockFillColor}; + } + `; +}, "styles"); + +// src/diagrams/packet/diagram.ts +var diagram = { + parser, + get db() { + return new PacketDB(); + }, + renderer, + styles +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-S2PKOQOG.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-S2PKOQOG.mjs.map new file mode 100644 index 0000000..47cb425 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/diagram-S2PKOQOG.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/packet/db.ts", "../../../src/diagrams/packet/parser.ts", "../../../src/diagrams/packet/renderer.ts", "../../../src/diagrams/packet/styles.ts", "../../../src/diagrams/packet/diagram.ts"], + "sourcesContent": ["import { getConfig as commonGetConfig } from '../../config.js';\nimport type { PacketDiagramConfig } from '../../config.type.js';\nimport DEFAULT_CONFIG from '../../defaultConfig.js';\nimport type { DiagramDB } from '../../diagram-api/types.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport {\n clear as commonClear,\n getAccDescription,\n getAccTitle,\n getDiagramTitle,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n} from '../common/commonDb.js';\nimport type { PacketWord } from './types.js';\nconst DEFAULT_PACKET_CONFIG: Required = DEFAULT_CONFIG.packet;\n\nexport class PacketDB implements DiagramDB {\n private packet: PacketWord[] = [];\n\n public getConfig() {\n const config = cleanAndMerge({\n ...DEFAULT_PACKET_CONFIG,\n ...commonGetConfig().packet,\n });\n if (config.showBits) {\n config.paddingY += 10;\n }\n return config;\n }\n\n public getPacket() {\n return this.packet;\n }\n\n public pushWord(word: PacketWord) {\n if (word.length > 0) {\n this.packet.push(word);\n }\n }\n\n public clear() {\n commonClear();\n this.packet = [];\n }\n\n public setAccTitle = setAccTitle;\n public getAccTitle = getAccTitle;\n public setDiagramTitle = setDiagramTitle;\n public getDiagramTitle = getDiagramTitle;\n public getAccDescription = getAccDescription;\n public setAccDescription = setAccDescription;\n}\n", "import type { Packet } from '@mermaid-js/parser';\nimport { parse } from '@mermaid-js/parser';\nimport type { ParserDefinition } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { populateCommonDb } from '../common/populateCommonDb.js';\nimport { PacketDB } from './db.js';\nimport type { PacketBlock, PacketWord } from './types.js';\n\nconst maxPacketSize = 10_000;\n\nconst populate = (ast: Packet, db: PacketDB) => {\n populateCommonDb(ast, db);\n let lastBit = -1;\n let word: PacketWord = [];\n let row = 1;\n const { bitsPerRow } = db.getConfig();\n\n for (let { start, end, bits, label } of ast.blocks) {\n if (start !== undefined && end !== undefined && end < start) {\n throw new Error(`Packet block ${start} - ${end} is invalid. End must be greater than start.`);\n }\n start ??= lastBit + 1;\n if (start !== lastBit + 1) {\n throw new Error(\n `Packet block ${start} - ${end ?? start} is not contiguous. It should start from ${\n lastBit + 1\n }.`\n );\n }\n if (bits === 0) {\n throw new Error(`Packet block ${start} is invalid. Cannot have a zero bit field.`);\n }\n end ??= start + (bits ?? 1) - 1;\n bits ??= end - start + 1;\n lastBit = end;\n log.debug(`Packet block ${start} - ${lastBit} with label ${label}`);\n\n while (word.length <= bitsPerRow + 1 && db.getPacket().length < maxPacketSize) {\n const [block, nextBlock] = getNextFittingBlock({ start, end, bits, label }, row, bitsPerRow);\n word.push(block);\n if (block.end + 1 === row * bitsPerRow) {\n db.pushWord(word);\n word = [];\n row++;\n }\n if (!nextBlock) {\n break;\n }\n ({ start, end, bits, label } = nextBlock);\n }\n }\n db.pushWord(word);\n};\n\nconst getNextFittingBlock = (\n block: PacketBlock,\n row: number,\n bitsPerRow: number\n): [Required, PacketBlock | undefined] => {\n if (block.start === undefined) {\n throw new Error('start should have been set during first phase');\n }\n if (block.end === undefined) {\n throw new Error('end should have been set during first phase');\n }\n\n if (block.start > block.end) {\n throw new Error(`Block start ${block.start} is greater than block end ${block.end}.`);\n }\n\n if (block.end + 1 <= row * bitsPerRow) {\n return [block as Required, undefined];\n }\n\n const rowEnd = row * bitsPerRow - 1;\n const rowStart = row * bitsPerRow;\n return [\n {\n start: block.start,\n end: rowEnd,\n label: block.label,\n bits: rowEnd - block.start,\n },\n {\n start: rowStart,\n end: block.end,\n label: block.label,\n bits: block.end - rowStart,\n },\n ];\n};\n\nexport const parser: ParserDefinition = {\n // @ts-expect-error - PacketDB is not assignable to DiagramDB\n parser: { yy: undefined },\n parse: async (input: string): Promise => {\n const ast: Packet = await parse('packet', input);\n const db = parser.parser?.yy;\n if (!(db instanceof PacketDB)) {\n throw new Error(\n 'parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.'\n );\n }\n log.debug(ast);\n populate(ast, db);\n },\n};\n", "import type { Diagram } from '../../Diagram.js';\nimport type { PacketDiagramConfig } from '../../config.type.js';\nimport type { DiagramRenderer, DrawDefinition, SVG, SVGGroup } from '../../diagram-api/types.js';\nimport { selectSvgElement } from '../../rendering-util/selectSvgElement.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\nimport type { PacketDB, PacketWord } from './types.js';\n\nconst draw: DrawDefinition = (_text, id, _version, diagram: Diagram) => {\n const db = diagram.db as PacketDB;\n const config = db.getConfig();\n const { rowHeight, paddingY, bitWidth, bitsPerRow } = config;\n const words = db.getPacket();\n const title = db.getDiagramTitle();\n const totalRowHeight = rowHeight + paddingY;\n const svgHeight = totalRowHeight * (words.length + 1) - (title ? 0 : rowHeight);\n const svgWidth = bitWidth * bitsPerRow + 2;\n const svg: SVG = selectSvgElement(id);\n\n svg.attr('viewbox', `0 0 ${svgWidth} ${svgHeight}`);\n configureSvgSize(svg, svgHeight, svgWidth, config.useMaxWidth);\n\n for (const [word, packet] of words.entries()) {\n drawWord(svg, packet, word, config);\n }\n\n svg\n .append('text')\n .text(title)\n .attr('x', svgWidth / 2)\n .attr('y', svgHeight - totalRowHeight / 2)\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'middle')\n .attr('class', 'packetTitle');\n};\n\nconst drawWord = (\n svg: SVG,\n word: PacketWord,\n rowNumber: number,\n { rowHeight, paddingX, paddingY, bitWidth, bitsPerRow, showBits }: Required\n) => {\n const group: SVGGroup = svg.append('g');\n const wordY = rowNumber * (rowHeight + paddingY) + paddingY;\n for (const block of word) {\n const blockX = (block.start % bitsPerRow) * bitWidth + 1;\n const width = (block.end - block.start + 1) * bitWidth - paddingX;\n // Block rectangle\n group\n .append('rect')\n .attr('x', blockX)\n .attr('y', wordY)\n .attr('width', width)\n .attr('height', rowHeight)\n .attr('class', 'packetBlock');\n\n // Block label\n group\n .append('text')\n .attr('x', blockX + width / 2)\n .attr('y', wordY + rowHeight / 2)\n .attr('class', 'packetLabel')\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'middle')\n .text(block.label);\n\n if (!showBits) {\n continue;\n }\n // Start byte count\n const isSingleBlock = block.end === block.start;\n const bitNumberY = wordY - 2;\n group\n .append('text')\n .attr('x', blockX + (isSingleBlock ? width / 2 : 0))\n .attr('y', bitNumberY)\n .attr('class', 'packetByte start')\n .attr('dominant-baseline', 'auto')\n .attr('text-anchor', isSingleBlock ? 'middle' : 'start')\n .text(block.start);\n\n // Draw end byte count if it is not the same as start byte count\n if (!isSingleBlock) {\n group\n .append('text')\n .attr('x', blockX + width)\n .attr('y', bitNumberY)\n .attr('class', 'packetByte end')\n .attr('dominant-baseline', 'auto')\n .attr('text-anchor', 'end')\n .text(block.end);\n }\n }\n};\nexport const renderer: DiagramRenderer = { draw };\n", "import type { DiagramStylesProvider } from '../../diagram-api/types.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport type { PacketStyleOptions } from './types.js';\n\nconst defaultPacketStyleOptions: PacketStyleOptions = {\n byteFontSize: '10px',\n startByteColor: 'black',\n endByteColor: 'black',\n labelColor: 'black',\n labelFontSize: '12px',\n titleColor: 'black',\n titleFontSize: '14px',\n blockStrokeColor: 'black',\n blockStrokeWidth: '1',\n blockFillColor: '#efefef',\n};\n\nexport const styles: DiagramStylesProvider = ({ packet }: { packet?: PacketStyleOptions } = {}) => {\n const options = cleanAndMerge(defaultPacketStyleOptions, packet);\n\n return `\n\t.packetByte {\n\t\tfont-size: ${options.byteFontSize};\n\t}\n\t.packetByte.start {\n\t\tfill: ${options.startByteColor};\n\t}\n\t.packetByte.end {\n\t\tfill: ${options.endByteColor};\n\t}\n\t.packetLabel {\n\t\tfill: ${options.labelColor};\n\t\tfont-size: ${options.labelFontSize};\n\t}\n\t.packetTitle {\n\t\tfill: ${options.titleColor};\n\t\tfont-size: ${options.titleFontSize};\n\t}\n\t.packetBlock {\n\t\tstroke: ${options.blockStrokeColor};\n\t\tstroke-width: ${options.blockStrokeWidth};\n\t\tfill: ${options.blockFillColor};\n\t}\n\t`;\n};\n\nexport default styles;\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { PacketDB } from './db.js';\nimport { parser } from './parser.js';\nimport { renderer } from './renderer.js';\nimport { styles } from './styles.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n get db() {\n return new PacketDB();\n },\n renderer,\n styles,\n};\n"], + "mappings": "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", + "names": ["diagram"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/erDiagram-Q2GNP2WA.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/erDiagram-Q2GNP2WA.mjs new file mode 100644 index 0000000..69645e0 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/erDiagram-Q2GNP2WA.mjs @@ -0,0 +1,1280 @@ +import { + getDiagramElement +} from "./chunk-55IACEB6.mjs"; +import { + setupViewPortForSVG +} from "./chunk-QN33PNHL.mjs"; +import { + getRegisteredLayoutAlgorithm, + render +} from "./chunk-N4CR4FBY.mjs"; +import "./chunk-QXUST7PY.mjs"; +import "./chunk-HN2XXSSU.mjs"; +import "./chunk-JZLCHNYA.mjs"; +import "./chunk-CVBHYZKI.mjs"; +import "./chunk-ATLVNIR6.mjs"; +import "./chunk-JA3XYJ7Z.mjs"; +import { + getEdgeId, + utils_default +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + getAccDescription, + getAccTitle, + getConfig2 as getConfig, + getDiagramTitle, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __export, + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/er/parser/erDiagram.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [6, 8, 10, 22, 24, 26, 28, 33, 34, 35, 36, 37, 40, 43, 44, 50], $V1 = [1, 10], $V2 = [1, 11], $V3 = [1, 12], $V4 = [1, 13], $V5 = [1, 20], $V6 = [1, 21], $V7 = [1, 22], $V8 = [1, 23], $V9 = [1, 24], $Va = [1, 19], $Vb = [1, 25], $Vc = [1, 26], $Vd = [1, 18], $Ve = [1, 33], $Vf = [1, 34], $Vg = [1, 35], $Vh = [1, 36], $Vi = [1, 37], $Vj = [6, 8, 10, 13, 15, 17, 20, 21, 22, 24, 26, 28, 33, 34, 35, 36, 37, 40, 43, 44, 50, 63, 64, 65, 66, 67], $Vk = [1, 42], $Vl = [1, 43], $Vm = [1, 52], $Vn = [40, 50, 68, 69], $Vo = [1, 63], $Vp = [1, 61], $Vq = [1, 58], $Vr = [1, 62], $Vs = [1, 64], $Vt = [6, 8, 10, 13, 17, 22, 24, 26, 28, 33, 34, 35, 36, 37, 40, 41, 42, 43, 44, 48, 49, 50, 63, 64, 65, 66, 67], $Vu = [63, 64, 65, 66, 67], $Vv = [1, 81], $Vw = [1, 80], $Vx = [1, 78], $Vy = [1, 79], $Vz = [6, 10, 42, 47], $VA = [6, 10, 13, 41, 42, 47, 48, 49], $VB = [1, 89], $VC = [1, 88], $VD = [1, 87], $VE = [19, 56], $VF = [1, 98], $VG = [1, 97], $VH = [19, 56, 58, 60]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "ER_DIAGRAM": 4, "document": 5, "EOF": 6, "line": 7, "SPACE": 8, "statement": 9, "NEWLINE": 10, "entityName": 11, "relSpec": 12, "COLON": 13, "role": 14, "STYLE_SEPARATOR": 15, "idList": 16, "BLOCK_START": 17, "attributes": 18, "BLOCK_STOP": 19, "SQS": 20, "SQE": 21, "title": 22, "title_value": 23, "acc_title": 24, "acc_title_value": 25, "acc_descr": 26, "acc_descr_value": 27, "acc_descr_multiline_value": 28, "direction": 29, "classDefStatement": 30, "classStatement": 31, "styleStatement": 32, "direction_tb": 33, "direction_bt": 34, "direction_rl": 35, "direction_lr": 36, "CLASSDEF": 37, "stylesOpt": 38, "separator": 39, "UNICODE_TEXT": 40, "STYLE_TEXT": 41, "COMMA": 42, "CLASS": 43, "STYLE": 44, "style": 45, "styleComponent": 46, "SEMI": 47, "NUM": 48, "BRKT": 49, "ENTITY_NAME": 50, "attribute": 51, "attributeType": 52, "attributeName": 53, "attributeKeyTypeList": 54, "attributeComment": 55, "ATTRIBUTE_WORD": 56, "attributeKeyType": 57, ",": 58, "ATTRIBUTE_KEY": 59, "COMMENT": 60, "cardinality": 61, "relType": 62, "ZERO_OR_ONE": 63, "ZERO_OR_MORE": 64, "ONE_OR_MORE": 65, "ONLY_ONE": 66, "MD_PARENT": 67, "NON_IDENTIFYING": 68, "IDENTIFYING": 69, "WORD": 70, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "ER_DIAGRAM", 6: "EOF", 8: "SPACE", 10: "NEWLINE", 13: "COLON", 15: "STYLE_SEPARATOR", 17: "BLOCK_START", 19: "BLOCK_STOP", 20: "SQS", 21: "SQE", 22: "title", 23: "title_value", 24: "acc_title", 25: "acc_title_value", 26: "acc_descr", 27: "acc_descr_value", 28: "acc_descr_multiline_value", 33: "direction_tb", 34: "direction_bt", 35: "direction_rl", 36: "direction_lr", 37: "CLASSDEF", 40: "UNICODE_TEXT", 41: "STYLE_TEXT", 42: "COMMA", 43: "CLASS", 44: "STYLE", 47: "SEMI", 48: "NUM", 49: "BRKT", 50: "ENTITY_NAME", 56: "ATTRIBUTE_WORD", 58: ",", 59: "ATTRIBUTE_KEY", 60: "COMMENT", 63: "ZERO_OR_ONE", 64: "ZERO_OR_MORE", 65: "ONE_OR_MORE", 66: "ONLY_ONE", 67: "MD_PARENT", 68: "NON_IDENTIFYING", 69: "IDENTIFYING", 70: "WORD" }, + productions_: [0, [3, 3], [5, 0], [5, 2], [7, 2], [7, 1], [7, 1], [7, 1], [9, 5], [9, 9], [9, 7], [9, 7], [9, 4], [9, 6], [9, 3], [9, 5], [9, 1], [9, 3], [9, 7], [9, 9], [9, 6], [9, 8], [9, 4], [9, 6], [9, 2], [9, 2], [9, 2], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [29, 1], [29, 1], [29, 1], [29, 1], [30, 4], [16, 1], [16, 1], [16, 3], [16, 3], [31, 3], [32, 4], [38, 1], [38, 3], [45, 1], [45, 2], [39, 1], [39, 1], [39, 1], [46, 1], [46, 1], [46, 1], [46, 1], [11, 1], [11, 1], [18, 1], [18, 2], [51, 2], [51, 3], [51, 3], [51, 4], [52, 1], [53, 1], [54, 1], [54, 3], [57, 1], [55, 1], [12, 3], [61, 1], [61, 1], [61, 1], [61, 1], [61, 1], [62, 1], [62, 1], [14, 1], [14, 1], [14, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 1: + break; + case 2: + this.$ = []; + break; + case 3: + $$[$0 - 1].push($$[$0]); + this.$ = $$[$0 - 1]; + break; + case 4: + case 5: + this.$ = $$[$0]; + break; + case 6: + case 7: + this.$ = []; + break; + case 8: + yy.addEntity($$[$0 - 4]); + yy.addEntity($$[$0 - 2]); + yy.addRelationship($$[$0 - 4], $$[$0], $$[$0 - 2], $$[$0 - 3]); + break; + case 9: + yy.addEntity($$[$0 - 8]); + yy.addEntity($$[$0 - 4]); + yy.addRelationship($$[$0 - 8], $$[$0], $$[$0 - 4], $$[$0 - 5]); + yy.setClass([$$[$0 - 8]], $$[$0 - 6]); + yy.setClass([$$[$0 - 4]], $$[$0 - 2]); + break; + case 10: + yy.addEntity($$[$0 - 6]); + yy.addEntity($$[$0 - 2]); + yy.addRelationship($$[$0 - 6], $$[$0], $$[$0 - 2], $$[$0 - 3]); + yy.setClass([$$[$0 - 6]], $$[$0 - 4]); + break; + case 11: + yy.addEntity($$[$0 - 6]); + yy.addEntity($$[$0 - 4]); + yy.addRelationship($$[$0 - 6], $$[$0], $$[$0 - 4], $$[$0 - 5]); + yy.setClass([$$[$0 - 4]], $$[$0 - 2]); + break; + case 12: + yy.addEntity($$[$0 - 3]); + yy.addAttributes($$[$0 - 3], $$[$0 - 1]); + break; + case 13: + yy.addEntity($$[$0 - 5]); + yy.addAttributes($$[$0 - 5], $$[$0 - 1]); + yy.setClass([$$[$0 - 5]], $$[$0 - 3]); + break; + case 14: + yy.addEntity($$[$0 - 2]); + break; + case 15: + yy.addEntity($$[$0 - 4]); + yy.setClass([$$[$0 - 4]], $$[$0 - 2]); + break; + case 16: + yy.addEntity($$[$0]); + break; + case 17: + yy.addEntity($$[$0 - 2]); + yy.setClass([$$[$0 - 2]], $$[$0]); + break; + case 18: + yy.addEntity($$[$0 - 6], $$[$0 - 4]); + yy.addAttributes($$[$0 - 6], $$[$0 - 1]); + break; + case 19: + yy.addEntity($$[$0 - 8], $$[$0 - 6]); + yy.addAttributes($$[$0 - 8], $$[$0 - 1]); + yy.setClass([$$[$0 - 8]], $$[$0 - 3]); + break; + case 20: + yy.addEntity($$[$0 - 5], $$[$0 - 3]); + break; + case 21: + yy.addEntity($$[$0 - 7], $$[$0 - 5]); + yy.setClass([$$[$0 - 7]], $$[$0 - 2]); + break; + case 22: + yy.addEntity($$[$0 - 3], $$[$0 - 1]); + break; + case 23: + yy.addEntity($$[$0 - 5], $$[$0 - 3]); + yy.setClass([$$[$0 - 5]], $$[$0]); + break; + case 24: + case 25: + this.$ = $$[$0].trim(); + yy.setAccTitle(this.$); + break; + case 26: + case 27: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 32: + yy.setDirection("TB"); + break; + case 33: + yy.setDirection("BT"); + break; + case 34: + yy.setDirection("RL"); + break; + case 35: + yy.setDirection("LR"); + break; + case 36: + this.$ = $$[$0 - 3]; + yy.addClass($$[$0 - 2], $$[$0 - 1]); + break; + case 37: + case 38: + case 56: + case 64: + this.$ = [$$[$0]]; + break; + case 39: + case 40: + this.$ = $$[$0 - 2].concat([$$[$0]]); + break; + case 41: + this.$ = $$[$0 - 2]; + yy.setClass($$[$0 - 1], $$[$0]); + break; + case 42: + ; + this.$ = $$[$0 - 3]; + yy.addCssStyles($$[$0 - 2], $$[$0 - 1]); + break; + case 43: + this.$ = [$$[$0]]; + break; + case 44: + $$[$0 - 2].push($$[$0]); + this.$ = $$[$0 - 2]; + break; + case 46: + this.$ = $$[$0 - 1] + $$[$0]; + break; + case 54: + case 76: + case 77: + this.$ = $$[$0].replace(/"/g, ""); + break; + case 55: + case 78: + this.$ = $$[$0]; + break; + case 57: + $$[$0].push($$[$0 - 1]); + this.$ = $$[$0]; + break; + case 58: + this.$ = { type: $$[$0 - 1], name: $$[$0] }; + break; + case 59: + this.$ = { type: $$[$0 - 2], name: $$[$0 - 1], keys: $$[$0] }; + break; + case 60: + this.$ = { type: $$[$0 - 2], name: $$[$0 - 1], comment: $$[$0] }; + break; + case 61: + this.$ = { type: $$[$0 - 3], name: $$[$0 - 2], keys: $$[$0 - 1], comment: $$[$0] }; + break; + case 62: + case 63: + case 66: + this.$ = $$[$0]; + break; + case 65: + $$[$0 - 2].push($$[$0]); + this.$ = $$[$0 - 2]; + break; + case 67: + this.$ = $$[$0].replace(/"/g, ""); + break; + case 68: + this.$ = { cardA: $$[$0], relType: $$[$0 - 1], cardB: $$[$0 - 2] }; + break; + case 69: + this.$ = yy.Cardinality.ZERO_OR_ONE; + break; + case 70: + this.$ = yy.Cardinality.ZERO_OR_MORE; + break; + case 71: + this.$ = yy.Cardinality.ONE_OR_MORE; + break; + case 72: + this.$ = yy.Cardinality.ONLY_ONE; + break; + case 73: + this.$ = yy.Cardinality.MD_PARENT; + break; + case 74: + this.$ = yy.Identification.NON_IDENTIFYING; + break; + case 75: + this.$ = yy.Identification.IDENTIFYING; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: [1, 2] }, { 1: [3] }, o($V0, [2, 2], { 5: 3 }), { 6: [1, 4], 7: 5, 8: [1, 6], 9: 7, 10: [1, 8], 11: 9, 22: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 14, 30: 15, 31: 16, 32: 17, 33: $V5, 34: $V6, 35: $V7, 36: $V8, 37: $V9, 40: $Va, 43: $Vb, 44: $Vc, 50: $Vd }, o($V0, [2, 7], { 1: [2, 1] }), o($V0, [2, 3]), { 9: 27, 11: 9, 22: $V1, 24: $V2, 26: $V3, 28: $V4, 29: 14, 30: 15, 31: 16, 32: 17, 33: $V5, 34: $V6, 35: $V7, 36: $V8, 37: $V9, 40: $Va, 43: $Vb, 44: $Vc, 50: $Vd }, o($V0, [2, 5]), o($V0, [2, 6]), o($V0, [2, 16], { 12: 28, 61: 32, 15: [1, 29], 17: [1, 30], 20: [1, 31], 63: $Ve, 64: $Vf, 65: $Vg, 66: $Vh, 67: $Vi }), { 23: [1, 38] }, { 25: [1, 39] }, { 27: [1, 40] }, o($V0, [2, 27]), o($V0, [2, 28]), o($V0, [2, 29]), o($V0, [2, 30]), o($V0, [2, 31]), o($Vj, [2, 54]), o($Vj, [2, 55]), o($V0, [2, 32]), o($V0, [2, 33]), o($V0, [2, 34]), o($V0, [2, 35]), { 16: 41, 40: $Vk, 41: $Vl }, { 16: 44, 40: $Vk, 41: $Vl }, { 16: 45, 40: $Vk, 41: $Vl }, o($V0, [2, 4]), { 11: 46, 40: $Va, 50: $Vd }, { 16: 47, 40: $Vk, 41: $Vl }, { 18: 48, 19: [1, 49], 51: 50, 52: 51, 56: $Vm }, { 11: 53, 40: $Va, 50: $Vd }, { 62: 54, 68: [1, 55], 69: [1, 56] }, o($Vn, [2, 69]), o($Vn, [2, 70]), o($Vn, [2, 71]), o($Vn, [2, 72]), o($Vn, [2, 73]), o($V0, [2, 24]), o($V0, [2, 25]), o($V0, [2, 26]), { 13: $Vo, 38: 57, 41: $Vp, 42: $Vq, 45: 59, 46: 60, 48: $Vr, 49: $Vs }, o($Vt, [2, 37]), o($Vt, [2, 38]), { 16: 65, 40: $Vk, 41: $Vl, 42: $Vq }, { 13: $Vo, 38: 66, 41: $Vp, 42: $Vq, 45: 59, 46: 60, 48: $Vr, 49: $Vs }, { 13: [1, 67], 15: [1, 68] }, o($V0, [2, 17], { 61: 32, 12: 69, 17: [1, 70], 42: $Vq, 63: $Ve, 64: $Vf, 65: $Vg, 66: $Vh, 67: $Vi }), { 19: [1, 71] }, o($V0, [2, 14]), { 18: 72, 19: [2, 56], 51: 50, 52: 51, 56: $Vm }, { 53: 73, 56: [1, 74] }, { 56: [2, 62] }, { 21: [1, 75] }, { 61: 76, 63: $Ve, 64: $Vf, 65: $Vg, 66: $Vh, 67: $Vi }, o($Vu, [2, 74]), o($Vu, [2, 75]), { 6: $Vv, 10: $Vw, 39: 77, 42: $Vx, 47: $Vy }, { 40: [1, 82], 41: [1, 83] }, o($Vz, [2, 43], { 46: 84, 13: $Vo, 41: $Vp, 48: $Vr, 49: $Vs }), o($VA, [2, 45]), o($VA, [2, 50]), o($VA, [2, 51]), o($VA, [2, 52]), o($VA, [2, 53]), o($V0, [2, 41], { 42: $Vq }), { 6: $Vv, 10: $Vw, 39: 85, 42: $Vx, 47: $Vy }, { 14: 86, 40: $VB, 50: $VC, 70: $VD }, { 16: 90, 40: $Vk, 41: $Vl }, { 11: 91, 40: $Va, 50: $Vd }, { 18: 92, 19: [1, 93], 51: 50, 52: 51, 56: $Vm }, o($V0, [2, 12]), { 19: [2, 57] }, o($VE, [2, 58], { 54: 94, 55: 95, 57: 96, 59: $VF, 60: $VG }), o([19, 56, 59, 60], [2, 63]), o($V0, [2, 22], { 15: [1, 100], 17: [1, 99] }), o([40, 50], [2, 68]), o($V0, [2, 36]), { 13: $Vo, 41: $Vp, 45: 101, 46: 60, 48: $Vr, 49: $Vs }, o($V0, [2, 47]), o($V0, [2, 48]), o($V0, [2, 49]), o($Vt, [2, 39]), o($Vt, [2, 40]), o($VA, [2, 46]), o($V0, [2, 42]), o($V0, [2, 8]), o($V0, [2, 76]), o($V0, [2, 77]), o($V0, [2, 78]), { 13: [1, 102], 42: $Vq }, { 13: [1, 104], 15: [1, 103] }, { 19: [1, 105] }, o($V0, [2, 15]), o($VE, [2, 59], { 55: 106, 58: [1, 107], 60: $VG }), o($VE, [2, 60]), o($VH, [2, 64]), o($VE, [2, 67]), o($VH, [2, 66]), { 18: 108, 19: [1, 109], 51: 50, 52: 51, 56: $Vm }, { 16: 110, 40: $Vk, 41: $Vl }, o($Vz, [2, 44], { 46: 84, 13: $Vo, 41: $Vp, 48: $Vr, 49: $Vs }), { 14: 111, 40: $VB, 50: $VC, 70: $VD }, { 16: 112, 40: $Vk, 41: $Vl }, { 14: 113, 40: $VB, 50: $VC, 70: $VD }, o($V0, [2, 13]), o($VE, [2, 61]), { 57: 114, 59: $VF }, { 19: [1, 115] }, o($V0, [2, 20]), o($V0, [2, 23], { 17: [1, 116], 42: $Vq }), o($V0, [2, 11]), { 13: [1, 117], 42: $Vq }, o($V0, [2, 10]), o($VH, [2, 65]), o($V0, [2, 18]), { 18: 118, 19: [1, 119], 51: 50, 52: 51, 56: $Vm }, { 14: 120, 40: $VB, 50: $VC, 70: $VD }, { 19: [1, 121] }, o($V0, [2, 21]), o($V0, [2, 9]), o($V0, [2, 19])], + defaultActions: { 52: [2, 62], 72: [2, 57] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + this.begin("acc_title"); + return 24; + break; + case 1: + this.popState(); + return "acc_title_value"; + break; + case 2: + this.begin("acc_descr"); + return 26; + break; + case 3: + this.popState(); + return "acc_descr_value"; + break; + case 4: + this.begin("acc_descr_multiline"); + break; + case 5: + this.popState(); + break; + case 6: + return "acc_descr_multiline_value"; + break; + case 7: + return 33; + break; + case 8: + return 34; + break; + case 9: + return 35; + break; + case 10: + return 36; + break; + case 11: + return 10; + break; + case 12: + break; + case 13: + return 8; + break; + case 14: + return 50; + break; + case 15: + return 70; + break; + case 16: + return 4; + break; + case 17: + this.begin("block"); + return 17; + break; + case 18: + return 49; + break; + case 19: + return 49; + break; + case 20: + return 42; + break; + case 21: + return 15; + break; + case 22: + return 13; + break; + case 23: + break; + case 24: + return 59; + break; + case 25: + return 56; + break; + case 26: + return 56; + break; + case 27: + return 60; + break; + case 28: + break; + case 29: + this.popState(); + return 19; + break; + case 30: + return yy_.yytext[0]; + break; + case 31: + return 20; + break; + case 32: + return 21; + break; + case 33: + this.begin("style"); + return 44; + break; + case 34: + this.popState(); + return 10; + break; + case 35: + break; + case 36: + return 13; + break; + case 37: + return 42; + break; + case 38: + return 49; + break; + case 39: + this.begin("style"); + return 37; + break; + case 40: + return 43; + break; + case 41: + return 63; + break; + case 42: + return 65; + break; + case 43: + return 65; + break; + case 44: + return 65; + break; + case 45: + return 63; + break; + case 46: + return 63; + break; + case 47: + return 64; + break; + case 48: + return 64; + break; + case 49: + return 64; + break; + case 50: + return 64; + break; + case 51: + return 64; + break; + case 52: + return 65; + break; + case 53: + return 64; + break; + case 54: + return 65; + break; + case 55: + return 66; + break; + case 56: + return 66; + break; + case 57: + return 66; + break; + case 58: + return 66; + break; + case 59: + return 63; + break; + case 60: + return 64; + break; + case 61: + return 65; + break; + case 62: + return 67; + break; + case 63: + return 68; + break; + case 64: + return 69; + break; + case 65: + return 69; + break; + case 66: + return 68; + break; + case 67: + return 68; + break; + case 68: + return 68; + break; + case 69: + return 41; + break; + case 70: + return 47; + break; + case 71: + return 40; + break; + case 72: + return 48; + break; + case 73: + return yy_.yytext[0]; + break; + case 74: + return 6; + break; + } + }, "anonymous"), + rules: [/^(?:accTitle\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*\{\s*)/i, /^(?:[\}])/i, /^(?:[^\}]*)/i, /^(?:.*direction\s+TB[^\n]*)/i, /^(?:.*direction\s+BT[^\n]*)/i, /^(?:.*direction\s+RL[^\n]*)/i, /^(?:.*direction\s+LR[^\n]*)/i, /^(?:[\n]+)/i, /^(?:\s+)/i, /^(?:[\s]+)/i, /^(?:"[^"%\r\n\v\b\\]+")/i, /^(?:"[^"]*")/i, /^(?:erDiagram\b)/i, /^(?:\{)/i, /^(?:#)/i, /^(?:#)/i, /^(?:,)/i, /^(?::::)/i, /^(?::)/i, /^(?:\s+)/i, /^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i, /^(?:([^\s]*)[~].*[~]([^\s]*))/i, /^(?:([\*A-Za-z_\u00C0-\uFFFF][A-Za-z0-9\-\_\[\]\(\)\u00C0-\uFFFF\*]*))/i, /^(?:"[^"]*")/i, /^(?:[\n]+)/i, /^(?:\})/i, /^(?:.)/i, /^(?:\[)/i, /^(?:\])/i, /^(?:style\b)/i, /^(?:[\n]+)/i, /^(?:\s+)/i, /^(?::)/i, /^(?:,)/i, /^(?:#)/i, /^(?:classDef\b)/i, /^(?:class\b)/i, /^(?:one or zero\b)/i, /^(?:one or more\b)/i, /^(?:one or many\b)/i, /^(?:1\+)/i, /^(?:\|o\b)/i, /^(?:zero or one\b)/i, /^(?:zero or more\b)/i, /^(?:zero or many\b)/i, /^(?:0\+)/i, /^(?:\}o\b)/i, /^(?:many\(0\))/i, /^(?:many\(1\))/i, /^(?:many\b)/i, /^(?:\}\|)/i, /^(?:one\b)/i, /^(?:only one\b)/i, /^(?:1\b)/i, /^(?:\|\|)/i, /^(?:o\|)/i, /^(?:o\{)/i, /^(?:\|\{)/i, /^(?:\s*u\b)/i, /^(?:\.\.)/i, /^(?:--)/i, /^(?:to\b)/i, /^(?:optionally to\b)/i, /^(?:\.-)/i, /^(?:-\.)/i, /^(?:([^\x00-\x7F]|\w|-|\*)+)/i, /^(?:;)/i, /^(?:([^\x00-\x7F]|\w|-|\*)+)/i, /^(?:[0-9])/i, /^(?:.)/i, /^(?:$)/i], + conditions: { "style": { "rules": [34, 35, 36, 37, 38, 69, 70], "inclusive": false }, "acc_descr_multiline": { "rules": [5, 6], "inclusive": false }, "acc_descr": { "rules": [3], "inclusive": false }, "acc_title": { "rules": [1], "inclusive": false }, "block": { "rules": [23, 24, 25, 26, 27, 28, 29, 30], "inclusive": false }, "INITIAL": { "rules": [0, 2, 4, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 31, 32, 33, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 74], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var erDiagram_default = parser; + +// src/diagrams/er/erDb.ts +var ErDB = class { + constructor() { + this.entities = /* @__PURE__ */ new Map(); + this.relationships = []; + this.classes = /* @__PURE__ */ new Map(); + this.direction = "TB"; + this.Cardinality = { + ZERO_OR_ONE: "ZERO_OR_ONE", + ZERO_OR_MORE: "ZERO_OR_MORE", + ONE_OR_MORE: "ONE_OR_MORE", + ONLY_ONE: "ONLY_ONE", + MD_PARENT: "MD_PARENT" + }; + this.Identification = { + NON_IDENTIFYING: "NON_IDENTIFYING", + IDENTIFYING: "IDENTIFYING" + }; + this.setAccTitle = setAccTitle; + this.getAccTitle = getAccTitle; + this.setAccDescription = setAccDescription; + this.getAccDescription = getAccDescription; + this.setDiagramTitle = setDiagramTitle; + this.getDiagramTitle = getDiagramTitle; + this.getConfig = /* @__PURE__ */ __name(() => getConfig().er, "getConfig"); + this.clear(); + this.addEntity = this.addEntity.bind(this); + this.addAttributes = this.addAttributes.bind(this); + this.addRelationship = this.addRelationship.bind(this); + this.setDirection = this.setDirection.bind(this); + this.addCssStyles = this.addCssStyles.bind(this); + this.addClass = this.addClass.bind(this); + this.setClass = this.setClass.bind(this); + this.setAccTitle = this.setAccTitle.bind(this); + this.setAccDescription = this.setAccDescription.bind(this); + } + static { + __name(this, "ErDB"); + } + /** + * Add entity + * @param name - The name of the entity + * @param alias - The alias of the entity + */ + addEntity(name, alias = "") { + if (!this.entities.has(name)) { + this.entities.set(name, { + id: `entity-${name}-${this.entities.size}`, + label: name, + attributes: [], + alias, + shape: "erBox", + look: getConfig().look ?? "default", + cssClasses: "default", + cssStyles: [] + }); + log.info("Added new entity :", name); + } else if (!this.entities.get(name)?.alias && alias) { + this.entities.get(name).alias = alias; + log.info(`Add alias '${alias}' to entity '${name}'`); + } + return this.entities.get(name); + } + getEntity(name) { + return this.entities.get(name); + } + getEntities() { + return this.entities; + } + getClasses() { + return this.classes; + } + addAttributes(entityName, attribs) { + const entity = this.addEntity(entityName); + let i; + for (i = attribs.length - 1; i >= 0; i--) { + if (!attribs[i].keys) { + attribs[i].keys = []; + } + if (!attribs[i].comment) { + attribs[i].comment = ""; + } + entity.attributes.push(attribs[i]); + log.debug("Added attribute ", attribs[i].name); + } + } + /** + * Add a relationship + * + * @param entA - The first entity in the relationship + * @param rolA - The role played by the first entity in relation to the second + * @param entB - The second entity in the relationship + * @param rSpec - The details of the relationship between the two entities + */ + addRelationship(entA, rolA, entB, rSpec) { + const entityA = this.entities.get(entA); + const entityB = this.entities.get(entB); + if (!entityA || !entityB) { + return; + } + const rel = { + entityA: entityA.id, + roleA: rolA, + entityB: entityB.id, + relSpec: rSpec + }; + this.relationships.push(rel); + log.debug("Added new relationship :", rel); + } + getRelationships() { + return this.relationships; + } + getDirection() { + return this.direction; + } + setDirection(dir) { + this.direction = dir; + } + getCompiledStyles(classDefs) { + let compiledStyles = []; + for (const customClass of classDefs) { + const cssClass = this.classes.get(customClass); + if (cssClass?.styles) { + compiledStyles = [...compiledStyles, ...cssClass.styles ?? []].map((s) => s.trim()); + } + if (cssClass?.textStyles) { + compiledStyles = [...compiledStyles, ...cssClass.textStyles ?? []].map((s) => s.trim()); + } + } + return compiledStyles; + } + addCssStyles(ids, styles) { + for (const id of ids) { + const entity = this.entities.get(id); + if (!styles || !entity) { + return; + } + for (const style of styles) { + entity.cssStyles.push(style); + } + } + } + addClass(ids, style) { + ids.forEach((id) => { + let classNode = this.classes.get(id); + if (classNode === void 0) { + classNode = { id, styles: [], textStyles: [] }; + this.classes.set(id, classNode); + } + if (style) { + style.forEach(function(s) { + if (/color/.exec(s)) { + const newStyle = s.replace("fill", "bgFill"); + classNode.textStyles.push(newStyle); + } + classNode.styles.push(s); + }); + } + }); + } + setClass(ids, classNames) { + for (const id of ids) { + const entity = this.entities.get(id); + if (entity) { + for (const className of classNames) { + entity.cssClasses += " " + className; + } + } + } + } + clear() { + this.entities = /* @__PURE__ */ new Map(); + this.classes = /* @__PURE__ */ new Map(); + this.relationships = []; + clear(); + } + getData() { + const nodes = []; + const edges = []; + const config = getConfig(); + for (const entityKey of this.entities.keys()) { + const entityNode = this.entities.get(entityKey); + if (entityNode) { + entityNode.cssCompiledStyles = this.getCompiledStyles(entityNode.cssClasses.split(" ")); + nodes.push(entityNode); + } + } + let count = 0; + for (const relationship of this.relationships) { + const edge = { + id: getEdgeId(relationship.entityA, relationship.entityB, { + prefix: "id", + counter: count++ + }), + type: "normal", + curve: "basis", + start: relationship.entityA, + end: relationship.entityB, + label: relationship.roleA, + labelpos: "c", + thickness: "normal", + classes: "relationshipLine", + arrowTypeStart: relationship.relSpec.cardB.toLowerCase(), + arrowTypeEnd: relationship.relSpec.cardA.toLowerCase(), + pattern: relationship.relSpec.relType == "IDENTIFYING" ? "solid" : "dashed", + look: config.look + }; + edges.push(edge); + } + return { nodes, edges, other: {}, config, direction: "TB" }; + } +}; + +// src/diagrams/er/erRenderer-unified.ts +var erRenderer_unified_exports = {}; +__export(erRenderer_unified_exports, { + draw: () => draw +}); +import { select } from "d3"; +var draw = /* @__PURE__ */ __name(async function(text, id, _version, diag) { + log.info("REF0:"); + log.info("Drawing er diagram (unified)", id); + const { securityLevel, er: conf, layout } = getConfig(); + const data4Layout = diag.db.getData(); + const svg = getDiagramElement(id, securityLevel); + data4Layout.type = diag.type; + data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(layout); + data4Layout.config.flowchart.nodeSpacing = conf?.nodeSpacing || 140; + data4Layout.config.flowchart.rankSpacing = conf?.rankSpacing || 80; + data4Layout.direction = diag.db.getDirection(); + data4Layout.markers = ["only_one", "zero_or_one", "one_or_more", "zero_or_more"]; + data4Layout.diagramId = id; + await render(data4Layout, svg); + if (data4Layout.layoutAlgorithm === "elk") { + svg.select(".edges").lower(); + } + const backgroundNodes = svg.selectAll('[id*="-background"]'); + if (Array.from(backgroundNodes).length > 0) { + backgroundNodes.each(function() { + const backgroundNode = select(this); + const backgroundId = backgroundNode.attr("id"); + const nonBackgroundId = backgroundId.replace("-background", ""); + const nonBackgroundNode = svg.select(`#${CSS.escape(nonBackgroundId)}`); + if (!nonBackgroundNode.empty()) { + const transform = nonBackgroundNode.attr("transform"); + backgroundNode.attr("transform", transform); + } + }); + } + const padding = 8; + utils_default.insertTitle( + svg, + "erDiagramTitleText", + conf?.titleTopMargin ?? 25, + diag.db.getDiagramTitle() + ); + setupViewPortForSVG(svg, padding, "erDiagram", conf?.useMaxWidth ?? true); +}, "draw"); + +// src/diagrams/er/styles.ts +import * as khroma from "khroma"; +var fade = /* @__PURE__ */ __name((color, opacity) => { + const channel2 = khroma.channel; + const r = channel2(color, "r"); + const g = channel2(color, "g"); + const b = channel2(color, "b"); + return khroma.rgba(r, g, b, opacity); +}, "fade"); +var getStyles = /* @__PURE__ */ __name((options) => ` + .entityBox { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; + } + + .relationshipLabelBox { + fill: ${options.tertiaryColor}; + opacity: 0.7; + background-color: ${options.tertiaryColor}; + rect { + opacity: 0.5; + } + } + + .labelBkg { + background-color: ${fade(options.tertiaryColor, 0.5)}; + } + + .edgeLabel .label { + fill: ${options.nodeBorder}; + font-size: 14px; + } + + .label { + font-family: ${options.fontFamily}; + color: ${options.nodeTextColor || options.textColor}; + } + + .edge-pattern-dashed { + stroke-dasharray: 8,8; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon + { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; + stroke-width: 1px; + } + + .relationshipLine { + stroke: ${options.lineColor}; + stroke-width: 1; + fill: none; + } + + .marker { + fill: none !important; + stroke: ${options.lineColor} !important; + stroke-width: 1; + } +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/er/erDiagram.ts +var diagram = { + parser: erDiagram_default, + get db() { + return new ErDB(); + }, + renderer: erRenderer_unified_exports, + styles: styles_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/erDiagram-Q2GNP2WA.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/erDiagram-Q2GNP2WA.mjs.map new file mode 100644 index 0000000..8bdfecb --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/erDiagram-Q2GNP2WA.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/er/parser/erDiagram.jison", "../../../src/diagrams/er/erDb.ts", "../../../src/diagrams/er/erRenderer-unified.ts", "../../../src/diagrams/er/styles.ts", "../../../src/diagrams/er/erDiagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,10,22,24,26,28,33,34,35,36,37,40,43,44,50],$V1=[1,10],$V2=[1,11],$V3=[1,12],$V4=[1,13],$V5=[1,20],$V6=[1,21],$V7=[1,22],$V8=[1,23],$V9=[1,24],$Va=[1,19],$Vb=[1,25],$Vc=[1,26],$Vd=[1,18],$Ve=[1,33],$Vf=[1,34],$Vg=[1,35],$Vh=[1,36],$Vi=[1,37],$Vj=[6,8,10,13,15,17,20,21,22,24,26,28,33,34,35,36,37,40,43,44,50,63,64,65,66,67],$Vk=[1,42],$Vl=[1,43],$Vm=[1,52],$Vn=[40,50,68,69],$Vo=[1,63],$Vp=[1,61],$Vq=[1,58],$Vr=[1,62],$Vs=[1,64],$Vt=[6,8,10,13,17,22,24,26,28,33,34,35,36,37,40,41,42,43,44,48,49,50,63,64,65,66,67],$Vu=[63,64,65,66,67],$Vv=[1,81],$Vw=[1,80],$Vx=[1,78],$Vy=[1,79],$Vz=[6,10,42,47],$VA=[6,10,13,41,42,47,48,49],$VB=[1,89],$VC=[1,88],$VD=[1,87],$VE=[19,56],$VF=[1,98],$VG=[1,97],$VH=[19,56,58,60];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"ER_DIAGRAM\":4,\"document\":5,\"EOF\":6,\"line\":7,\"SPACE\":8,\"statement\":9,\"NEWLINE\":10,\"entityName\":11,\"relSpec\":12,\"COLON\":13,\"role\":14,\"STYLE_SEPARATOR\":15,\"idList\":16,\"BLOCK_START\":17,\"attributes\":18,\"BLOCK_STOP\":19,\"SQS\":20,\"SQE\":21,\"title\":22,\"title_value\":23,\"acc_title\":24,\"acc_title_value\":25,\"acc_descr\":26,\"acc_descr_value\":27,\"acc_descr_multiline_value\":28,\"direction\":29,\"classDefStatement\":30,\"classStatement\":31,\"styleStatement\":32,\"direction_tb\":33,\"direction_bt\":34,\"direction_rl\":35,\"direction_lr\":36,\"CLASSDEF\":37,\"stylesOpt\":38,\"separator\":39,\"UNICODE_TEXT\":40,\"STYLE_TEXT\":41,\"COMMA\":42,\"CLASS\":43,\"STYLE\":44,\"style\":45,\"styleComponent\":46,\"SEMI\":47,\"NUM\":48,\"BRKT\":49,\"ENTITY_NAME\":50,\"attribute\":51,\"attributeType\":52,\"attributeName\":53,\"attributeKeyTypeList\":54,\"attributeComment\":55,\"ATTRIBUTE_WORD\":56,\"attributeKeyType\":57,\",\":58,\"ATTRIBUTE_KEY\":59,\"COMMENT\":60,\"cardinality\":61,\"relType\":62,\"ZERO_OR_ONE\":63,\"ZERO_OR_MORE\":64,\"ONE_OR_MORE\":65,\"ONLY_ONE\":66,\"MD_PARENT\":67,\"NON_IDENTIFYING\":68,\"IDENTIFYING\":69,\"WORD\":70,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"ER_DIAGRAM\",6:\"EOF\",8:\"SPACE\",10:\"NEWLINE\",13:\"COLON\",15:\"STYLE_SEPARATOR\",17:\"BLOCK_START\",19:\"BLOCK_STOP\",20:\"SQS\",21:\"SQE\",22:\"title\",23:\"title_value\",24:\"acc_title\",25:\"acc_title_value\",26:\"acc_descr\",27:\"acc_descr_value\",28:\"acc_descr_multiline_value\",33:\"direction_tb\",34:\"direction_bt\",35:\"direction_rl\",36:\"direction_lr\",37:\"CLASSDEF\",40:\"UNICODE_TEXT\",41:\"STYLE_TEXT\",42:\"COMMA\",43:\"CLASS\",44:\"STYLE\",47:\"SEMI\",48:\"NUM\",49:\"BRKT\",50:\"ENTITY_NAME\",56:\"ATTRIBUTE_WORD\",58:\",\",59:\"ATTRIBUTE_KEY\",60:\"COMMENT\",63:\"ZERO_OR_ONE\",64:\"ZERO_OR_MORE\",65:\"ONE_OR_MORE\",66:\"ONLY_ONE\",67:\"MD_PARENT\",68:\"NON_IDENTIFYING\",69:\"IDENTIFYING\",70:\"WORD\"},\nproductions_: [0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,9],[9,7],[9,7],[9,4],[9,6],[9,3],[9,5],[9,1],[9,3],[9,7],[9,9],[9,6],[9,8],[9,4],[9,6],[9,2],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[9,1],[29,1],[29,1],[29,1],[29,1],[30,4],[16,1],[16,1],[16,3],[16,3],[31,3],[32,4],[38,1],[38,3],[45,1],[45,2],[39,1],[39,1],[39,1],[46,1],[46,1],[46,1],[46,1],[11,1],[11,1],[18,1],[18,2],[51,2],[51,3],[51,3],[51,4],[52,1],[53,1],[54,1],[54,3],[57,1],[55,1],[12,3],[61,1],[61,1],[61,1],[61,1],[61,1],[62,1],[62,1],[14,1],[14,1],[14,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n /*console.log('finished parsing');*/ \nbreak;\ncase 2:\n this.$ = [] \nbreak;\ncase 3:\n$$[$0-1].push($$[$0]);this.$ = $$[$0-1]\nbreak;\ncase 4: case 5:\n this.$ = $$[$0] \nbreak;\ncase 6: case 7:\n this.$=[];\nbreak;\ncase 8:\n\n yy.addEntity($$[$0-4]);\n yy.addEntity($$[$0-2]);\n yy.addRelationship($$[$0-4], $$[$0], $$[$0-2], $$[$0-3]);\n \nbreak;\ncase 9:\n\n yy.addEntity($$[$0-8]);\n yy.addEntity($$[$0-4]);\n yy.addRelationship($$[$0-8], $$[$0], $$[$0-4], $$[$0-5]);\n yy.setClass([$$[$0-8]], $$[$0-6]);\n yy.setClass([$$[$0-4]], $$[$0-2]);\n \nbreak;\ncase 10:\n\n yy.addEntity($$[$0-6]);\n yy.addEntity($$[$0-2]);\n yy.addRelationship($$[$0-6], $$[$0], $$[$0-2], $$[$0-3]);\n yy.setClass([$$[$0-6]], $$[$0-4]);\n \nbreak;\ncase 11:\n\n yy.addEntity($$[$0-6]);\n yy.addEntity($$[$0-4]);\n yy.addRelationship($$[$0-6], $$[$0], $$[$0-4], $$[$0-5]);\n yy.setClass([$$[$0-4]], $$[$0-2]);\n \nbreak;\ncase 12:\n\n yy.addEntity($$[$0-3]);\n yy.addAttributes($$[$0-3], $$[$0-1]);\n \nbreak;\ncase 13:\n\n yy.addEntity($$[$0-5]);\n yy.addAttributes($$[$0-5], $$[$0-1]);\n yy.setClass([$$[$0-5]], $$[$0-3]);\n \nbreak;\ncase 14:\n yy.addEntity($$[$0-2]); \nbreak;\ncase 15:\n yy.addEntity($$[$0-4]); yy.setClass([$$[$0-4]], $$[$0-2]); \nbreak;\ncase 16:\n yy.addEntity($$[$0]); \nbreak;\ncase 17:\n yy.addEntity($$[$0-2]); yy.setClass([$$[$0-2]], $$[$0]); \nbreak;\ncase 18:\n\n yy.addEntity($$[$0-6], $$[$0-4]);\n yy.addAttributes($$[$0-6], $$[$0-1]);\n \nbreak;\ncase 19:\n\n yy.addEntity($$[$0-8], $$[$0-6]);\n yy.addAttributes($$[$0-8], $$[$0-1]);\n yy.setClass([$$[$0-8]], $$[$0-3]);\n\n \nbreak;\ncase 20:\n yy.addEntity($$[$0-5], $$[$0-3]); \nbreak;\ncase 21:\n yy.addEntity($$[$0-7], $$[$0-5]); yy.setClass([$$[$0-7]], $$[$0-2]); \nbreak;\ncase 22:\n yy.addEntity($$[$0-3], $$[$0-1]); \nbreak;\ncase 23:\n yy.addEntity($$[$0-5], $$[$0-3]); yy.setClass([$$[$0-5]], $$[$0]); \nbreak;\ncase 24: case 25:\n this.$=$$[$0].trim();yy.setAccTitle(this.$); \nbreak;\ncase 26: case 27:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 32:\n yy.setDirection('TB');\nbreak;\ncase 33:\n yy.setDirection('BT');\nbreak;\ncase 34:\n yy.setDirection('RL');\nbreak;\ncase 35:\n yy.setDirection('LR');\nbreak;\ncase 36:\nthis.$ = $$[$0-3];yy.addClass($$[$0-2],$$[$0-1]);\nbreak;\ncase 37: case 38: case 56: case 64:\n this.$ = [$$[$0]]; \nbreak;\ncase 39: case 40:\n this.$ = $$[$0-2].concat([$$[$0]]); \nbreak;\ncase 41:\nthis.$ = $$[$0-2];yy.setClass($$[$0-1], $$[$0]);\nbreak;\ncase 42:\n;this.$ = $$[$0-3];yy.addCssStyles($$[$0-2],$$[$0-1]);\nbreak;\ncase 43:\n this.$ = [$$[$0]] \nbreak;\ncase 44:\n$$[$0-2].push($$[$0]);this.$ = $$[$0-2];\nbreak;\ncase 46:\n this.$ = $$[$0-1] + $$[$0]; \nbreak;\ncase 54: case 76: case 77:\n this.$ = $$[$0].replace(/\"/g, ''); \nbreak;\ncase 55: case 78:\n this.$ = $$[$0]; \nbreak;\ncase 57:\n $$[$0].push($$[$0-1]); this.$=$$[$0]; \nbreak;\ncase 58:\n this.$ = { type: $$[$0-1], name: $$[$0] }; \nbreak;\ncase 59:\n this.$ = { type: $$[$0-2], name: $$[$0-1], keys: $$[$0] }; \nbreak;\ncase 60:\n this.$ = { type: $$[$0-2], name: $$[$0-1], comment: $$[$0] }; \nbreak;\ncase 61:\n this.$ = { type: $$[$0-3], name: $$[$0-2], keys: $$[$0-1], comment: $$[$0] }; \nbreak;\ncase 62: case 63: case 66:\n this.$=$$[$0]; \nbreak;\ncase 65:\n $$[$0-2].push($$[$0]); this.$ = $$[$0-2]; \nbreak;\ncase 67:\n this.$=$$[$0].replace(/\"/g, ''); \nbreak;\ncase 68:\n\n this.$ = { cardA: $$[$0], relType: $$[$0-1], cardB: $$[$0-2] };\n /*console.log('relSpec: ' + $$[$0] + $$[$0-1] + $$[$0-2]);*/\n \nbreak;\ncase 69:\n this.$ = yy.Cardinality.ZERO_OR_ONE; \nbreak;\ncase 70:\n this.$ = yy.Cardinality.ZERO_OR_MORE; \nbreak;\ncase 71:\n this.$ = yy.Cardinality.ONE_OR_MORE; \nbreak;\ncase 72:\n this.$ = yy.Cardinality.ONLY_ONE; \nbreak;\ncase 73:\n this.$ = yy.Cardinality.MD_PARENT; \nbreak;\ncase 74:\n this.$ = yy.Identification.NON_IDENTIFYING; \nbreak;\ncase 75:\n this.$ = yy.Identification.IDENTIFYING; \nbreak;\n}\n},\ntable: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,22:$V1,24:$V2,26:$V3,28:$V4,29:14,30:15,31:16,32:17,33:$V5,34:$V6,35:$V7,36:$V8,37:$V9,40:$Va,43:$Vb,44:$Vc,50:$Vd},o($V0,[2,7],{1:[2,1]}),o($V0,[2,3]),{9:27,11:9,22:$V1,24:$V2,26:$V3,28:$V4,29:14,30:15,31:16,32:17,33:$V5,34:$V6,35:$V7,36:$V8,37:$V9,40:$Va,43:$Vb,44:$Vc,50:$Vd},o($V0,[2,5]),o($V0,[2,6]),o($V0,[2,16],{12:28,61:32,15:[1,29],17:[1,30],20:[1,31],63:$Ve,64:$Vf,65:$Vg,66:$Vh,67:$Vi}),{23:[1,38]},{25:[1,39]},{27:[1,40]},o($V0,[2,27]),o($V0,[2,28]),o($V0,[2,29]),o($V0,[2,30]),o($V0,[2,31]),o($Vj,[2,54]),o($Vj,[2,55]),o($V0,[2,32]),o($V0,[2,33]),o($V0,[2,34]),o($V0,[2,35]),{16:41,40:$Vk,41:$Vl},{16:44,40:$Vk,41:$Vl},{16:45,40:$Vk,41:$Vl},o($V0,[2,4]),{11:46,40:$Va,50:$Vd},{16:47,40:$Vk,41:$Vl},{18:48,19:[1,49],51:50,52:51,56:$Vm},{11:53,40:$Va,50:$Vd},{62:54,68:[1,55],69:[1,56]},o($Vn,[2,69]),o($Vn,[2,70]),o($Vn,[2,71]),o($Vn,[2,72]),o($Vn,[2,73]),o($V0,[2,24]),o($V0,[2,25]),o($V0,[2,26]),{13:$Vo,38:57,41:$Vp,42:$Vq,45:59,46:60,48:$Vr,49:$Vs},o($Vt,[2,37]),o($Vt,[2,38]),{16:65,40:$Vk,41:$Vl,42:$Vq},{13:$Vo,38:66,41:$Vp,42:$Vq,45:59,46:60,48:$Vr,49:$Vs},{13:[1,67],15:[1,68]},o($V0,[2,17],{61:32,12:69,17:[1,70],42:$Vq,63:$Ve,64:$Vf,65:$Vg,66:$Vh,67:$Vi}),{19:[1,71]},o($V0,[2,14]),{18:72,19:[2,56],51:50,52:51,56:$Vm},{53:73,56:[1,74]},{56:[2,62]},{21:[1,75]},{61:76,63:$Ve,64:$Vf,65:$Vg,66:$Vh,67:$Vi},o($Vu,[2,74]),o($Vu,[2,75]),{6:$Vv,10:$Vw,39:77,42:$Vx,47:$Vy},{40:[1,82],41:[1,83]},o($Vz,[2,43],{46:84,13:$Vo,41:$Vp,48:$Vr,49:$Vs}),o($VA,[2,45]),o($VA,[2,50]),o($VA,[2,51]),o($VA,[2,52]),o($VA,[2,53]),o($V0,[2,41],{42:$Vq}),{6:$Vv,10:$Vw,39:85,42:$Vx,47:$Vy},{14:86,40:$VB,50:$VC,70:$VD},{16:90,40:$Vk,41:$Vl},{11:91,40:$Va,50:$Vd},{18:92,19:[1,93],51:50,52:51,56:$Vm},o($V0,[2,12]),{19:[2,57]},o($VE,[2,58],{54:94,55:95,57:96,59:$VF,60:$VG}),o([19,56,59,60],[2,63]),o($V0,[2,22],{15:[1,100],17:[1,99]}),o([40,50],[2,68]),o($V0,[2,36]),{13:$Vo,41:$Vp,45:101,46:60,48:$Vr,49:$Vs},o($V0,[2,47]),o($V0,[2,48]),o($V0,[2,49]),o($Vt,[2,39]),o($Vt,[2,40]),o($VA,[2,46]),o($V0,[2,42]),o($V0,[2,8]),o($V0,[2,76]),o($V0,[2,77]),o($V0,[2,78]),{13:[1,102],42:$Vq},{13:[1,104],15:[1,103]},{19:[1,105]},o($V0,[2,15]),o($VE,[2,59],{55:106,58:[1,107],60:$VG}),o($VE,[2,60]),o($VH,[2,64]),o($VE,[2,67]),o($VH,[2,66]),{18:108,19:[1,109],51:50,52:51,56:$Vm},{16:110,40:$Vk,41:$Vl},o($Vz,[2,44],{46:84,13:$Vo,41:$Vp,48:$Vr,49:$Vs}),{14:111,40:$VB,50:$VC,70:$VD},{16:112,40:$Vk,41:$Vl},{14:113,40:$VB,50:$VC,70:$VD},o($V0,[2,13]),o($VE,[2,61]),{57:114,59:$VF},{19:[1,115]},o($V0,[2,20]),o($V0,[2,23],{17:[1,116],42:$Vq}),o($V0,[2,11]),{13:[1,117],42:$Vq},o($V0,[2,10]),o($VH,[2,65]),o($V0,[2,18]),{18:118,19:[1,119],51:50,52:51,56:$Vm},{14:120,40:$VB,50:$VC,70:$VD},{19:[1,121]},o($V0,[2,21]),o($V0,[2,9]),o($V0,[2,19])],\ndefaultActions: {52:[2,62],72:[2,57]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin(\"acc_title\");return 24; \nbreak;\ncase 1: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 2: this.begin(\"acc_descr\");return 26; \nbreak;\ncase 3: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 4: this.begin(\"acc_descr_multiline\");\nbreak;\ncase 5: this.popState(); \nbreak;\ncase 6:return \"acc_descr_multiline_value\";\nbreak;\ncase 7:return 33;\nbreak;\ncase 8:return 34;\nbreak;\ncase 9:return 35;\nbreak;\ncase 10:return 36;\nbreak;\ncase 11:return 10;\nbreak;\ncase 12:/* skip whitespace */\nbreak;\ncase 13:return 8;\nbreak;\ncase 14:return 50;\nbreak;\ncase 15:return 70;\nbreak;\ncase 16:return 4;\nbreak;\ncase 17: this.begin(\"block\"); return 17; \nbreak;\ncase 18:return 49;\nbreak;\ncase 19:return 49;\nbreak;\ncase 20:return 42;\nbreak;\ncase 21:return 15;\nbreak;\ncase 22:return 13;\nbreak;\ncase 23:/* skip whitespace in block */\nbreak;\ncase 24:return 59\nbreak;\ncase 25:return 56;\nbreak;\ncase 26:return 56;\nbreak;\ncase 27:return 60;\nbreak;\ncase 28:/* nothing */\nbreak;\ncase 29: this.popState(); return 19; \nbreak;\ncase 30:return yy_.yytext[0];\nbreak;\ncase 31:return 20;\nbreak;\ncase 32:return 21;\nbreak;\ncase 33: this.begin(\"style\"); return 44; \nbreak;\ncase 34: this.popState(); return 10; \nbreak;\ncase 35:/* skip whitespace in block */\nbreak;\ncase 36:return 13;\nbreak;\ncase 37:return 42;\nbreak;\ncase 38:return 49;\nbreak;\ncase 39: this.begin(\"style\"); return 37; \nbreak;\ncase 40:return 43;\nbreak;\ncase 41:return 63;\nbreak;\ncase 42:return 65;\nbreak;\ncase 43:return 65;\nbreak;\ncase 44:return 65;\nbreak;\ncase 45:return 63;\nbreak;\ncase 46:return 63;\nbreak;\ncase 47:return 64;\nbreak;\ncase 48:return 64;\nbreak;\ncase 49:return 64;\nbreak;\ncase 50:return 64;\nbreak;\ncase 51:return 64;\nbreak;\ncase 52:return 65;\nbreak;\ncase 53:return 64;\nbreak;\ncase 54:return 65;\nbreak;\ncase 55:return 66;\nbreak;\ncase 56:return 66;\nbreak;\ncase 57:return 66;\nbreak;\ncase 58:return 66;\nbreak;\ncase 59:return 63;\nbreak;\ncase 60:return 64;\nbreak;\ncase 61:return 65;\nbreak;\ncase 62:return 67;\nbreak;\ncase 63:return 68;\nbreak;\ncase 64:return 69;\nbreak;\ncase 65:return 69;\nbreak;\ncase 66:return 68;\nbreak;\ncase 67:return 68;\nbreak;\ncase 68:return 68;\nbreak;\ncase 69:return 41;\nbreak;\ncase 70:return 47;\nbreak;\ncase 71:return 40;\nbreak;\ncase 72:return 48;\nbreak;\ncase 73:return yy_.yytext[0];\nbreak;\ncase 74:return 6;\nbreak;\n}\n},\nrules: [/^(?:accTitle\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*\\{\\s*)/i,/^(?:[\\}])/i,/^(?:[^\\}]*)/i,/^(?:.*direction\\s+TB[^\\n]*)/i,/^(?:.*direction\\s+BT[^\\n]*)/i,/^(?:.*direction\\s+RL[^\\n]*)/i,/^(?:.*direction\\s+LR[^\\n]*)/i,/^(?:[\\n]+)/i,/^(?:\\s+)/i,/^(?:[\\s]+)/i,/^(?:\"[^\"%\\r\\n\\v\\b\\\\]+\")/i,/^(?:\"[^\"]*\")/i,/^(?:erDiagram\\b)/i,/^(?:\\{)/i,/^(?:#)/i,/^(?:#)/i,/^(?:,)/i,/^(?::::)/i,/^(?::)/i,/^(?:\\s+)/i,/^(?:\\b((?:PK)|(?:FK)|(?:UK))\\b)/i,/^(?:([^\\s]*)[~].*[~]([^\\s]*))/i,/^(?:([\\*A-Za-z_\\u00C0-\\uFFFF][A-Za-z0-9\\-\\_\\[\\]\\(\\)\\u00C0-\\uFFFF\\*]*))/i,/^(?:\"[^\"]*\")/i,/^(?:[\\n]+)/i,/^(?:\\})/i,/^(?:.)/i,/^(?:\\[)/i,/^(?:\\])/i,/^(?:style\\b)/i,/^(?:[\\n]+)/i,/^(?:\\s+)/i,/^(?::)/i,/^(?:,)/i,/^(?:#)/i,/^(?:classDef\\b)/i,/^(?:class\\b)/i,/^(?:one or zero\\b)/i,/^(?:one or more\\b)/i,/^(?:one or many\\b)/i,/^(?:1\\+)/i,/^(?:\\|o\\b)/i,/^(?:zero or one\\b)/i,/^(?:zero or more\\b)/i,/^(?:zero or many\\b)/i,/^(?:0\\+)/i,/^(?:\\}o\\b)/i,/^(?:many\\(0\\))/i,/^(?:many\\(1\\))/i,/^(?:many\\b)/i,/^(?:\\}\\|)/i,/^(?:one\\b)/i,/^(?:only one\\b)/i,/^(?:1\\b)/i,/^(?:\\|\\|)/i,/^(?:o\\|)/i,/^(?:o\\{)/i,/^(?:\\|\\{)/i,/^(?:\\s*u\\b)/i,/^(?:\\.\\.)/i,/^(?:--)/i,/^(?:to\\b)/i,/^(?:optionally to\\b)/i,/^(?:\\.-)/i,/^(?:-\\.)/i,/^(?:([^\\x00-\\x7F]|\\w|-|\\*)+)/i,/^(?:;)/i,/^(?:([^\\x00-\\x7F]|\\w|-|\\*)+)/i,/^(?:[0-9])/i,/^(?:.)/i,/^(?:$)/i],\nconditions: {\"style\":{\"rules\":[34,35,36,37,38,69,70],\"inclusive\":false},\"acc_descr_multiline\":{\"rules\":[5,6],\"inclusive\":false},\"acc_descr\":{\"rules\":[3],\"inclusive\":false},\"acc_title\":{\"rules\":[1],\"inclusive\":false},\"block\":{\"rules\":[23,24,25,26,27,28,29,30],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,2,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,31,32,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,71,72,73,74],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { log } from '../../logger.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport type { Edge, Node } from '../../rendering-util/types.js';\nimport type { EntityNode, Attribute, Relationship, EntityClass, RelSpec } from './erTypes.js';\nimport {\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n clear as commonClear,\n setDiagramTitle,\n getDiagramTitle,\n} from '../common/commonDb.js';\nimport { getEdgeId } from '../../utils.js';\nimport type { DiagramDB } from '../../diagram-api/types.js';\n\nexport class ErDB implements DiagramDB {\n private entities = new Map();\n private relationships: Relationship[] = [];\n private classes = new Map();\n private direction = 'TB';\n\n private Cardinality = {\n ZERO_OR_ONE: 'ZERO_OR_ONE',\n ZERO_OR_MORE: 'ZERO_OR_MORE',\n ONE_OR_MORE: 'ONE_OR_MORE',\n ONLY_ONE: 'ONLY_ONE',\n MD_PARENT: 'MD_PARENT',\n };\n\n private Identification = {\n NON_IDENTIFYING: 'NON_IDENTIFYING',\n IDENTIFYING: 'IDENTIFYING',\n };\n\n constructor() {\n this.clear();\n this.addEntity = this.addEntity.bind(this);\n this.addAttributes = this.addAttributes.bind(this);\n this.addRelationship = this.addRelationship.bind(this);\n this.setDirection = this.setDirection.bind(this);\n this.addCssStyles = this.addCssStyles.bind(this);\n this.addClass = this.addClass.bind(this);\n this.setClass = this.setClass.bind(this);\n this.setAccTitle = this.setAccTitle.bind(this);\n this.setAccDescription = this.setAccDescription.bind(this);\n }\n\n /**\n * Add entity\n * @param name - The name of the entity\n * @param alias - The alias of the entity\n */\n public addEntity(name: string, alias = ''): EntityNode {\n if (!this.entities.has(name)) {\n this.entities.set(name, {\n id: `entity-${name}-${this.entities.size}`,\n label: name,\n attributes: [],\n alias,\n shape: 'erBox',\n look: getConfig().look ?? 'default',\n cssClasses: 'default',\n cssStyles: [],\n });\n log.info('Added new entity :', name);\n } else if (!this.entities.get(name)?.alias && alias) {\n this.entities.get(name)!.alias = alias;\n log.info(`Add alias '${alias}' to entity '${name}'`);\n }\n\n return this.entities.get(name)!;\n }\n\n public getEntity(name: string) {\n return this.entities.get(name);\n }\n\n public getEntities() {\n return this.entities;\n }\n\n public getClasses() {\n return this.classes;\n }\n\n public addAttributes(entityName: string, attribs: Attribute[]) {\n const entity = this.addEntity(entityName); // May do nothing (if entity has already been added)\n\n // Process attribs in reverse order due to effect of recursive construction (last attribute is first)\n let i;\n for (i = attribs.length - 1; i >= 0; i--) {\n if (!attribs[i].keys) {\n attribs[i].keys = [];\n }\n if (!attribs[i].comment) {\n attribs[i].comment = '';\n }\n entity.attributes.push(attribs[i]);\n log.debug('Added attribute ', attribs[i].name);\n }\n }\n\n /**\n * Add a relationship\n *\n * @param entA - The first entity in the relationship\n * @param rolA - The role played by the first entity in relation to the second\n * @param entB - The second entity in the relationship\n * @param rSpec - The details of the relationship between the two entities\n */\n public addRelationship(entA: string, rolA: string, entB: string, rSpec: RelSpec) {\n const entityA = this.entities.get(entA);\n const entityB = this.entities.get(entB);\n if (!entityA || !entityB) {\n return;\n }\n\n const rel = {\n entityA: entityA.id,\n roleA: rolA,\n entityB: entityB.id,\n relSpec: rSpec,\n };\n\n this.relationships.push(rel);\n log.debug('Added new relationship :', rel);\n }\n\n public getRelationships() {\n return this.relationships;\n }\n\n public getDirection() {\n return this.direction;\n }\n\n public setDirection(dir: string) {\n this.direction = dir;\n }\n\n private getCompiledStyles(classDefs: string[]) {\n let compiledStyles: string[] = [];\n for (const customClass of classDefs) {\n const cssClass = this.classes.get(customClass);\n if (cssClass?.styles) {\n compiledStyles = [...compiledStyles, ...(cssClass.styles ?? [])].map((s) => s.trim());\n }\n if (cssClass?.textStyles) {\n compiledStyles = [...compiledStyles, ...(cssClass.textStyles ?? [])].map((s) => s.trim());\n }\n }\n return compiledStyles;\n }\n\n public addCssStyles(ids: string[], styles: string[]) {\n for (const id of ids) {\n const entity = this.entities.get(id);\n if (!styles || !entity) {\n return;\n }\n for (const style of styles) {\n entity.cssStyles!.push(style);\n }\n }\n }\n\n public addClass(ids: string[], style: string[]) {\n ids.forEach((id) => {\n let classNode = this.classes.get(id);\n if (classNode === undefined) {\n classNode = { id, styles: [], textStyles: [] };\n this.classes.set(id, classNode);\n }\n\n if (style) {\n style.forEach(function (s) {\n if (/color/.exec(s)) {\n const newStyle = s.replace('fill', 'bgFill');\n classNode.textStyles.push(newStyle);\n }\n classNode.styles.push(s);\n });\n }\n });\n }\n\n public setClass(ids: string[], classNames: string[]) {\n for (const id of ids) {\n const entity = this.entities.get(id);\n if (entity) {\n for (const className of classNames) {\n entity.cssClasses += ' ' + className;\n }\n }\n }\n }\n\n public clear() {\n this.entities = new Map();\n this.classes = new Map();\n this.relationships = [];\n commonClear();\n }\n\n public getData() {\n const nodes: Node[] = [];\n const edges: Edge[] = [];\n const config = getConfig();\n\n for (const entityKey of this.entities.keys()) {\n const entityNode = this.entities.get(entityKey);\n if (entityNode) {\n entityNode.cssCompiledStyles = this.getCompiledStyles(entityNode.cssClasses!.split(' '));\n nodes.push(entityNode as unknown as Node);\n }\n }\n\n let count = 0;\n for (const relationship of this.relationships) {\n const edge: Edge = {\n id: getEdgeId(relationship.entityA, relationship.entityB, {\n prefix: 'id',\n counter: count++,\n }),\n type: 'normal',\n curve: 'basis',\n start: relationship.entityA,\n end: relationship.entityB,\n label: relationship.roleA,\n labelpos: 'c',\n thickness: 'normal',\n classes: 'relationshipLine',\n arrowTypeStart: relationship.relSpec.cardB.toLowerCase(),\n arrowTypeEnd: relationship.relSpec.cardA.toLowerCase(),\n pattern: relationship.relSpec.relType == 'IDENTIFYING' ? 'solid' : 'dashed',\n look: config.look,\n };\n edges.push(edge);\n }\n return { nodes, edges, other: {}, config, direction: 'TB' };\n }\n\n public setAccTitle = setAccTitle;\n public getAccTitle = getAccTitle;\n public setAccDescription = setAccDescription;\n public getAccDescription = getAccDescription;\n public setDiagramTitle = setDiagramTitle;\n public getDiagramTitle = getDiagramTitle;\n public getConfig = () => getConfig().er;\n}\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { log } from '../../logger.js';\nimport { getDiagramElement } from '../../rendering-util/insertElementsForSize.js';\nimport { getRegisteredLayoutAlgorithm, render } from '../../rendering-util/render.js';\nimport { setupViewPortForSVG } from '../../rendering-util/setupViewPortForSVG.js';\nimport type { LayoutData } from '../../rendering-util/types.js';\nimport utils from '../../utils.js';\nimport { select } from 'd3';\n\nexport const draw = async function (text: string, id: string, _version: string, diag: any) {\n log.info('REF0:');\n log.info('Drawing er diagram (unified)', id);\n const { securityLevel, er: conf, layout } = getConfig();\n\n // The getData method provided in all supported diagrams is used to extract the data from the parsed structure\n // into the Layout data format\n const data4Layout = diag.db.getData() as LayoutData;\n\n // Create the root SVG - the element is the div containing the SVG element\n const svg = getDiagramElement(id, securityLevel);\n\n data4Layout.type = diag.type;\n data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(layout);\n\n // Workaround as when rendering and setting up the graph it uses flowchart spacing before data4Layout spacing?\n data4Layout.config.flowchart!.nodeSpacing = conf?.nodeSpacing || 140;\n data4Layout.config.flowchart!.rankSpacing = conf?.rankSpacing || 80;\n data4Layout.direction = diag.db.getDirection();\n\n data4Layout.markers = ['only_one', 'zero_or_one', 'one_or_more', 'zero_or_more'];\n data4Layout.diagramId = id;\n await render(data4Layout, svg);\n // Elk layout algorithm displays markers above nodes, so move edges to top so they are \"painted\" over by the nodes.\n if (data4Layout.layoutAlgorithm === 'elk') {\n svg.select('.edges').lower();\n }\n\n // Sets the background nodes to the same position as their original counterparts.\n // Background nodes are created when the look is handDrawn so the ER diagram markers do not show underneath.\n const backgroundNodes = svg.selectAll('[id*=\"-background\"]');\n // eslint-disable-next-line unicorn/prefer-spread\n if (Array.from(backgroundNodes).length > 0) {\n backgroundNodes.each(function (this: SVGElement) {\n const backgroundNode = select(this);\n const backgroundId = backgroundNode.attr('id');\n\n const nonBackgroundId = backgroundId.replace('-background', '');\n const nonBackgroundNode = svg.select(`#${CSS.escape(nonBackgroundId)}`);\n\n if (!nonBackgroundNode.empty()) {\n const transform = nonBackgroundNode.attr('transform');\n backgroundNode.attr('transform', transform);\n }\n });\n }\n\n const padding = 8;\n utils.insertTitle(\n svg,\n 'erDiagramTitleText',\n conf?.titleTopMargin ?? 25,\n diag.db.getDiagramTitle()\n );\n\n setupViewPortForSVG(svg, padding, 'erDiagram', conf?.useMaxWidth ?? true);\n};\n", "import * as khroma from 'khroma';\nimport type { FlowChartStyleOptions } from '../flowchart/styles.js';\n\nconst fade = (color: string, opacity: number) => {\n // @ts-ignore TODO: incorrect types from khroma\n const channel = khroma.channel;\n\n const r = channel(color, 'r');\n const g = channel(color, 'g');\n const b = channel(color, 'b');\n\n // @ts-ignore incorrect types from khroma\n return khroma.rgba(r, g, b, opacity);\n};\n\nconst getStyles = (options: FlowChartStyleOptions) =>\n `\n .entityBox {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n }\n\n .relationshipLabelBox {\n fill: ${options.tertiaryColor};\n opacity: 0.7;\n background-color: ${options.tertiaryColor};\n rect {\n opacity: 0.5;\n }\n }\n\n .labelBkg {\n background-color: ${fade(options.tertiaryColor, 0.5)};\n }\n\n .edgeLabel .label {\n fill: ${options.nodeBorder};\n font-size: 14px;\n }\n\n .label {\n font-family: ${options.fontFamily};\n color: ${options.nodeTextColor || options.textColor};\n }\n\n .edge-pattern-dashed {\n stroke-dasharray: 8,8;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon\n {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n }\n\n .relationshipLine {\n stroke: ${options.lineColor};\n stroke-width: 1;\n fill: none;\n }\n\n .marker {\n fill: none !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n }\n`;\n\nexport default getStyles;\n", "// @ts-ignore: TODO: Fix ts errors\nimport erParser from './parser/erDiagram.jison';\nimport { ErDB } from './erDb.js';\nimport * as renderer from './erRenderer-unified.js';\nimport erStyles from './styles.js';\n\nexport const diagram = {\n parser: erParser,\n get db() {\n return new ErDB();\n },\n renderer,\n styles: erStyles,\n};\n"], + "mappings": "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AAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,CAAC,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,CAAC,IAAG,IAAG,IAAG,EAAE,GAAE,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAE,CAAC,IAAG,EAAE,GAAE,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,I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", + "names": ["o", "parser", "lexer", "channel"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/flowDiagram-NV44I4VS.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/flowDiagram-NV44I4VS.mjs new file mode 100644 index 0000000..647b664 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/flowDiagram-NV44I4VS.mjs @@ -0,0 +1,2505 @@ +import { + getIconStyles +} from "./chunk-FMBD7UC4.mjs"; +import { + JSON_SCHEMA, + load +} from "./chunk-MI3HLSF2.mjs"; +import { + getDiagramElement +} from "./chunk-55IACEB6.mjs"; +import { + setupViewPortForSVG +} from "./chunk-QN33PNHL.mjs"; +import { + getRegisteredLayoutAlgorithm, + render +} from "./chunk-N4CR4FBY.mjs"; +import "./chunk-QXUST7PY.mjs"; +import "./chunk-HN2XXSSU.mjs"; +import { + isValidShape +} from "./chunk-JZLCHNYA.mjs"; +import "./chunk-CVBHYZKI.mjs"; +import "./chunk-ATLVNIR6.mjs"; +import "./chunk-JA3XYJ7Z.mjs"; +import { + getEdgeId, + utils_default +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + common_default, + defaultConfig2 as defaultConfig, + getAccDescription, + getAccTitle, + getConfig2 as getConfig, + getDiagramTitle, + setAccDescription, + setAccTitle, + setConfig2 as setConfig, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/flowchart/flowDb.ts +import { select } from "d3"; +var MERMAID_DOM_ID_PREFIX = "flowchart-"; +var FlowDB = class { + // cspell:ignore funs + constructor() { + this.vertexCounter = 0; + this.config = getConfig(); + this.vertices = /* @__PURE__ */ new Map(); + this.edges = []; + this.classes = /* @__PURE__ */ new Map(); + this.subGraphs = []; + this.subGraphLookup = /* @__PURE__ */ new Map(); + this.tooltips = /* @__PURE__ */ new Map(); + this.subCount = 0; + this.firstGraphFlag = true; + // As in graph + this.secCount = -1; + this.posCrossRef = []; + // Functions to be run after graph rendering + this.funs = []; + this.setAccTitle = setAccTitle; + this.setAccDescription = setAccDescription; + this.setDiagramTitle = setDiagramTitle; + this.getAccTitle = getAccTitle; + this.getAccDescription = getAccDescription; + this.getDiagramTitle = getDiagramTitle; + this.funs.push(this.setupToolTips.bind(this)); + this.addVertex = this.addVertex.bind(this); + this.firstGraph = this.firstGraph.bind(this); + this.setDirection = this.setDirection.bind(this); + this.addSubGraph = this.addSubGraph.bind(this); + this.addLink = this.addLink.bind(this); + this.setLink = this.setLink.bind(this); + this.updateLink = this.updateLink.bind(this); + this.addClass = this.addClass.bind(this); + this.setClass = this.setClass.bind(this); + this.destructLink = this.destructLink.bind(this); + this.setClickEvent = this.setClickEvent.bind(this); + this.setTooltip = this.setTooltip.bind(this); + this.updateLinkInterpolate = this.updateLinkInterpolate.bind(this); + this.setClickFun = this.setClickFun.bind(this); + this.bindFunctions = this.bindFunctions.bind(this); + this.lex = { + firstGraph: this.firstGraph.bind(this) + }; + this.clear(); + this.setGen("gen-2"); + } + static { + __name(this, "FlowDB"); + } + sanitizeText(txt) { + return common_default.sanitizeText(txt, this.config); + } + /** + * Function to lookup domId from id in the graph definition. + * + * @param id - id of the node + */ + lookUpDomId(id) { + for (const vertex of this.vertices.values()) { + if (vertex.id === id) { + return vertex.domId; + } + } + return id; + } + /** + * Function called by parser when a node definition has been found + */ + addVertex(id, textObj, type, style, classes, dir, props = {}, metadata) { + if (!id || id.trim().length === 0) { + return; + } + let doc; + if (metadata !== void 0) { + let yamlData; + if (!metadata.includes("\n")) { + yamlData = "{\n" + metadata + "\n}"; + } else { + yamlData = metadata + "\n"; + } + doc = load(yamlData, { schema: JSON_SCHEMA }); + } + const edge = this.edges.find((e) => e.id === id); + if (edge) { + const edgeDoc = doc; + if (edgeDoc?.animate !== void 0) { + edge.animate = edgeDoc.animate; + } + if (edgeDoc?.animation !== void 0) { + edge.animation = edgeDoc.animation; + } + if (edgeDoc?.curve !== void 0) { + edge.interpolate = edgeDoc.curve; + } + return; + } + let txt; + let vertex = this.vertices.get(id); + if (vertex === void 0) { + vertex = { + id, + labelType: "text", + domId: MERMAID_DOM_ID_PREFIX + id + "-" + this.vertexCounter, + styles: [], + classes: [] + }; + this.vertices.set(id, vertex); + } + this.vertexCounter++; + if (textObj !== void 0) { + this.config = getConfig(); + txt = this.sanitizeText(textObj.text.trim()); + vertex.labelType = textObj.type; + if (txt.startsWith('"') && txt.endsWith('"')) { + txt = txt.substring(1, txt.length - 1); + } + vertex.text = txt; + } else { + if (vertex.text === void 0) { + vertex.text = id; + } + } + if (type !== void 0) { + vertex.type = type; + } + if (style !== void 0 && style !== null) { + style.forEach((s) => { + vertex.styles.push(s); + }); + } + if (classes !== void 0 && classes !== null) { + classes.forEach((s) => { + vertex.classes.push(s); + }); + } + if (dir !== void 0) { + vertex.dir = dir; + } + if (vertex.props === void 0) { + vertex.props = props; + } else if (props !== void 0) { + Object.assign(vertex.props, props); + } + if (doc !== void 0) { + if (doc.shape) { + if (doc.shape !== doc.shape.toLowerCase() || doc.shape.includes("_")) { + throw new Error(`No such shape: ${doc.shape}. Shape names should be lowercase.`); + } else if (!isValidShape(doc.shape)) { + throw new Error(`No such shape: ${doc.shape}.`); + } + vertex.type = doc?.shape; + } + if (doc?.label) { + vertex.text = doc?.label; + } + if (doc?.icon) { + vertex.icon = doc?.icon; + if (!doc.label?.trim() && vertex.text === id) { + vertex.text = ""; + } + } + if (doc?.form) { + vertex.form = doc?.form; + } + if (doc?.pos) { + vertex.pos = doc?.pos; + } + if (doc?.img) { + vertex.img = doc?.img; + if (!doc.label?.trim() && vertex.text === id) { + vertex.text = ""; + } + } + if (doc?.constraint) { + vertex.constraint = doc.constraint; + } + if (doc.w) { + vertex.assetWidth = Number(doc.w); + } + if (doc.h) { + vertex.assetHeight = Number(doc.h); + } + } + } + /** + * Function called by parser when a link/edge definition has been found + * + */ + addSingleLink(_start, _end, type, id) { + const start = _start; + const end = _end; + const edge = { + start, + end, + type: void 0, + text: "", + labelType: "text", + classes: [], + isUserDefinedId: false, + interpolate: this.edges.defaultInterpolate + }; + log.info("abc78 Got edge...", edge); + const linkTextObj = type.text; + if (linkTextObj !== void 0) { + edge.text = this.sanitizeText(linkTextObj.text.trim()); + if (edge.text.startsWith('"') && edge.text.endsWith('"')) { + edge.text = edge.text.substring(1, edge.text.length - 1); + } + edge.labelType = linkTextObj.type; + } + if (type !== void 0) { + edge.type = type.type; + edge.stroke = type.stroke; + edge.length = type.length > 10 ? 10 : type.length; + } + if (id && !this.edges.some((e) => e.id === id)) { + edge.id = id; + edge.isUserDefinedId = true; + } else { + const existingLinks = this.edges.filter((e) => e.start === edge.start && e.end === edge.end); + if (existingLinks.length === 0) { + edge.id = getEdgeId(edge.start, edge.end, { counter: 0, prefix: "L" }); + } else { + edge.id = getEdgeId(edge.start, edge.end, { + counter: existingLinks.length + 1, + prefix: "L" + }); + } + } + if (this.edges.length < (this.config.maxEdges ?? 500)) { + log.info("Pushing edge..."); + this.edges.push(edge); + } else { + throw new Error( + `Edge limit exceeded. ${this.edges.length} edges found, but the limit is ${this.config.maxEdges}. + +Initialize mermaid with maxEdges set to a higher number to allow more edges. +You cannot set this config via configuration inside the diagram as it is a secure config. +You have to call mermaid.initialize.` + ); + } + } + isLinkData(value) { + return value !== null && typeof value === "object" && "id" in value && typeof value.id === "string"; + } + addLink(_start, _end, linkData) { + const id = this.isLinkData(linkData) ? linkData.id.replace("@", "") : void 0; + log.info("addLink", _start, _end, id); + for (const start of _start) { + for (const end of _end) { + const isLastStart = start === _start[_start.length - 1]; + const isFirstEnd = end === _end[0]; + if (isLastStart && isFirstEnd) { + this.addSingleLink(start, end, linkData, id); + } else { + this.addSingleLink(start, end, linkData, void 0); + } + } + } + } + /** + * Updates a link's line interpolation algorithm + */ + updateLinkInterpolate(positions, interpolate) { + positions.forEach((pos) => { + if (pos === "default") { + this.edges.defaultInterpolate = interpolate; + } else { + this.edges[pos].interpolate = interpolate; + } + }); + } + /** + * Updates a link with a style + * + */ + updateLink(positions, style) { + positions.forEach((pos) => { + if (typeof pos === "number" && pos >= this.edges.length) { + throw new Error( + `The index ${pos} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${this.edges.length - 1}. (Help: Ensure that the index is within the range of existing edges.)` + ); + } + if (pos === "default") { + this.edges.defaultStyle = style; + } else { + this.edges[pos].style = style; + if ((this.edges[pos]?.style?.length ?? 0) > 0 && !this.edges[pos]?.style?.some((s) => s?.startsWith("fill"))) { + this.edges[pos]?.style?.push("fill:none"); + } + } + }); + } + addClass(ids, _style) { + const style = _style.join().replace(/\\,/g, "\xA7\xA7\xA7").replace(/,/g, ";").replace(/§§§/g, ",").split(";"); + ids.split(",").forEach((id) => { + let classNode = this.classes.get(id); + if (classNode === void 0) { + classNode = { id, styles: [], textStyles: [] }; + this.classes.set(id, classNode); + } + if (style !== void 0 && style !== null) { + style.forEach((s) => { + if (/color/.exec(s)) { + const newStyle = s.replace("fill", "bgFill"); + classNode.textStyles.push(newStyle); + } + classNode.styles.push(s); + }); + } + }); + } + /** + * Called by parser when a graph definition is found, stores the direction of the chart. + * + */ + setDirection(dir) { + this.direction = dir.trim(); + if (/.*/.exec(this.direction)) { + this.direction = "LR"; + } + if (/.*v/.exec(this.direction)) { + this.direction = "TB"; + } + if (this.direction === "TD") { + this.direction = "TB"; + } + } + /** + * Called by parser when a special node is found, e.g. a clickable element. + * + * @param ids - Comma separated list of ids + * @param className - Class to add + */ + setClass(ids, className) { + for (const id of ids.split(",")) { + const vertex = this.vertices.get(id); + if (vertex) { + vertex.classes.push(className); + } + const edge = this.edges.find((e) => e.id === id); + if (edge) { + edge.classes.push(className); + } + const subGraph = this.subGraphLookup.get(id); + if (subGraph) { + subGraph.classes.push(className); + } + } + } + setTooltip(ids, tooltip) { + if (tooltip === void 0) { + return; + } + tooltip = this.sanitizeText(tooltip); + for (const id of ids.split(",")) { + this.tooltips.set(this.version === "gen-1" ? this.lookUpDomId(id) : id, tooltip); + } + } + setClickFun(id, functionName, functionArgs) { + const domId = this.lookUpDomId(id); + if (getConfig().securityLevel !== "loose") { + return; + } + if (functionName === void 0) { + return; + } + let argList = []; + if (typeof functionArgs === "string") { + argList = functionArgs.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/); + for (let i = 0; i < argList.length; i++) { + let item = argList[i].trim(); + if (item.startsWith('"') && item.endsWith('"')) { + item = item.substr(1, item.length - 2); + } + argList[i] = item; + } + } + if (argList.length === 0) { + argList.push(id); + } + const vertex = this.vertices.get(id); + if (vertex) { + vertex.haveCallback = true; + this.funs.push(() => { + const elem = document.querySelector(`[id="${domId}"]`); + if (elem !== null) { + elem.addEventListener( + "click", + () => { + utils_default.runFunc(functionName, ...argList); + }, + false + ); + } + }); + } + } + /** + * Called by parser when a link is found. Adds the URL to the vertex data. + * + * @param ids - Comma separated list of ids + * @param linkStr - URL to create a link for + * @param target - Target attribute for the link + */ + setLink(ids, linkStr, target) { + ids.split(",").forEach((id) => { + const vertex = this.vertices.get(id); + if (vertex !== void 0) { + vertex.link = utils_default.formatUrl(linkStr, this.config); + vertex.linkTarget = target; + } + }); + this.setClass(ids, "clickable"); + } + getTooltip(id) { + return this.tooltips.get(id); + } + /** + * Called by parser when a click definition is found. Registers an event handler. + * + * @param ids - Comma separated list of ids + * @param functionName - Function to be called on click + * @param functionArgs - Arguments to be passed to the function + */ + setClickEvent(ids, functionName, functionArgs) { + ids.split(",").forEach((id) => { + this.setClickFun(id, functionName, functionArgs); + }); + this.setClass(ids, "clickable"); + } + bindFunctions(element) { + this.funs.forEach((fun) => { + fun(element); + }); + } + getDirection() { + return this.direction?.trim(); + } + /** + * Retrieval function for fetching the found nodes after parsing has completed. + * + */ + getVertices() { + return this.vertices; + } + /** + * Retrieval function for fetching the found links after parsing has completed. + * + */ + getEdges() { + return this.edges; + } + /** + * Retrieval function for fetching the found class definitions after parsing has completed. + * + */ + getClasses() { + return this.classes; + } + setupToolTips(element) { + let tooltipElem = select(".mermaidTooltip"); + if ((tooltipElem._groups || tooltipElem)[0][0] === null) { + tooltipElem = select("body").append("div").attr("class", "mermaidTooltip").style("opacity", 0); + } + const svg = select(element).select("svg"); + const nodes = svg.selectAll("g.node"); + nodes.on("mouseover", (e) => { + const el = select(e.currentTarget); + const title = el.attr("title"); + if (title === null) { + return; + } + const rect = e.currentTarget?.getBoundingClientRect(); + tooltipElem.transition().duration(200).style("opacity", ".9"); + tooltipElem.text(el.attr("title")).style("left", window.scrollX + rect.left + (rect.right - rect.left) / 2 + "px").style("top", window.scrollY + rect.bottom + "px"); + tooltipElem.html(tooltipElem.html().replace(/<br\/>/g, "
")); + el.classed("hover", true); + }).on("mouseout", (e) => { + tooltipElem.transition().duration(500).style("opacity", 0); + const el = select(e.currentTarget); + el.classed("hover", false); + }); + } + /** + * Clears the internal graph db so that a new graph can be parsed. + * + */ + clear(ver = "gen-2") { + this.vertices = /* @__PURE__ */ new Map(); + this.classes = /* @__PURE__ */ new Map(); + this.edges = []; + this.funs = [this.setupToolTips.bind(this)]; + this.subGraphs = []; + this.subGraphLookup = /* @__PURE__ */ new Map(); + this.subCount = 0; + this.tooltips = /* @__PURE__ */ new Map(); + this.firstGraphFlag = true; + this.version = ver; + this.config = getConfig(); + clear(); + } + setGen(ver) { + this.version = ver || "gen-2"; + } + defaultStyle() { + return "fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"; + } + addSubGraph(_id, list, _title) { + let id = _id.text.trim(); + let title = _title.text; + if (_id === _title && /\s/.exec(_title.text)) { + id = void 0; + } + const uniq = /* @__PURE__ */ __name((a) => { + const prims = { boolean: {}, number: {}, string: {} }; + const objs = []; + let dir2; + const nodeList2 = a.filter(function(item) { + const type = typeof item; + if (item.stmt && item.stmt === "dir") { + dir2 = item.value; + return false; + } + if (item.trim() === "") { + return false; + } + if (type in prims) { + return prims[type].hasOwnProperty(item) ? false : prims[type][item] = true; + } else { + return objs.includes(item) ? false : objs.push(item); + } + }); + return { nodeList: nodeList2, dir: dir2 }; + }, "uniq"); + const result = uniq(list.flat()); + const nodeList = result.nodeList; + let dir = result.dir; + const flowchartConfig = getConfig().flowchart ?? {}; + dir = dir ?? (flowchartConfig.inheritDir ? this.getDirection() ?? getConfig().direction ?? void 0 : void 0); + if (this.version === "gen-1") { + for (let i = 0; i < nodeList.length; i++) { + nodeList[i] = this.lookUpDomId(nodeList[i]); + } + } + id = id ?? "subGraph" + this.subCount; + title = title || ""; + title = this.sanitizeText(title); + this.subCount = this.subCount + 1; + const subGraph = { + id, + nodes: nodeList, + title: title.trim(), + classes: [], + dir, + labelType: _title.type + }; + log.info("Adding", subGraph.id, subGraph.nodes, subGraph.dir); + subGraph.nodes = this.makeUniq(subGraph, this.subGraphs).nodes; + this.subGraphs.push(subGraph); + this.subGraphLookup.set(id, subGraph); + return id; + } + getPosForId(id) { + for (const [i, subGraph] of this.subGraphs.entries()) { + if (subGraph.id === id) { + return i; + } + } + return -1; + } + indexNodes2(id, pos) { + const nodes = this.subGraphs[pos].nodes; + this.secCount = this.secCount + 1; + if (this.secCount > 2e3) { + return { + result: false, + count: 0 + }; + } + this.posCrossRef[this.secCount] = pos; + if (this.subGraphs[pos].id === id) { + return { + result: true, + count: 0 + }; + } + let count = 0; + let posCount = 1; + while (count < nodes.length) { + const childPos = this.getPosForId(nodes[count]); + if (childPos >= 0) { + const res = this.indexNodes2(id, childPos); + if (res.result) { + return { + result: true, + count: posCount + res.count + }; + } else { + posCount = posCount + res.count; + } + } + count = count + 1; + } + return { + result: false, + count: posCount + }; + } + getDepthFirstPos(pos) { + return this.posCrossRef[pos]; + } + indexNodes() { + this.secCount = -1; + if (this.subGraphs.length > 0) { + this.indexNodes2("none", this.subGraphs.length - 1); + } + } + getSubGraphs() { + return this.subGraphs; + } + firstGraph() { + if (this.firstGraphFlag) { + this.firstGraphFlag = false; + return true; + } + return false; + } + destructStartLink(_str) { + let str = _str.trim(); + let type = "arrow_open"; + switch (str[0]) { + case "<": + type = "arrow_point"; + str = str.slice(1); + break; + case "x": + type = "arrow_cross"; + str = str.slice(1); + break; + case "o": + type = "arrow_circle"; + str = str.slice(1); + break; + } + let stroke = "normal"; + if (str.includes("=")) { + stroke = "thick"; + } + if (str.includes(".")) { + stroke = "dotted"; + } + return { type, stroke }; + } + countChar(char, str) { + const length = str.length; + let count = 0; + for (let i = 0; i < length; ++i) { + if (str[i] === char) { + ++count; + } + } + return count; + } + destructEndLink(_str) { + const str = _str.trim(); + let line = str.slice(0, -1); + let type = "arrow_open"; + switch (str.slice(-1)) { + case "x": + type = "arrow_cross"; + if (str.startsWith("x")) { + type = "double_" + type; + line = line.slice(1); + } + break; + case ">": + type = "arrow_point"; + if (str.startsWith("<")) { + type = "double_" + type; + line = line.slice(1); + } + break; + case "o": + type = "arrow_circle"; + if (str.startsWith("o")) { + type = "double_" + type; + line = line.slice(1); + } + break; + } + let stroke = "normal"; + let length = line.length - 1; + if (line.startsWith("=")) { + stroke = "thick"; + } + if (line.startsWith("~")) { + stroke = "invisible"; + } + const dots = this.countChar(".", line); + if (dots) { + stroke = "dotted"; + length = dots; + } + return { type, stroke, length }; + } + destructLink(_str, _startStr) { + const info = this.destructEndLink(_str); + let startInfo; + if (_startStr) { + startInfo = this.destructStartLink(_startStr); + if (startInfo.stroke !== info.stroke) { + return { type: "INVALID", stroke: "INVALID" }; + } + if (startInfo.type === "arrow_open") { + startInfo.type = info.type; + } else { + if (startInfo.type !== info.type) { + return { type: "INVALID", stroke: "INVALID" }; + } + startInfo.type = "double_" + startInfo.type; + } + if (startInfo.type === "double_arrow") { + startInfo.type = "double_arrow_point"; + } + startInfo.length = info.length; + return startInfo; + } + return info; + } + // Todo optimizer this by caching existing nodes + exists(allSgs, _id) { + for (const sg of allSgs) { + if (sg.nodes.includes(_id)) { + return true; + } + } + return false; + } + /** + * Deletes an id from all subgraphs + * + */ + makeUniq(sg, allSubgraphs) { + const res = []; + sg.nodes.forEach((_id, pos) => { + if (!this.exists(allSubgraphs, _id)) { + res.push(sg.nodes[pos]); + } + }); + return { nodes: res }; + } + getTypeFromVertex(vertex) { + if (vertex.img) { + return "imageSquare"; + } + if (vertex.icon) { + if (vertex.form === "circle") { + return "iconCircle"; + } + if (vertex.form === "square") { + return "iconSquare"; + } + if (vertex.form === "rounded") { + return "iconRounded"; + } + return "icon"; + } + switch (vertex.type) { + case "square": + case void 0: + return "squareRect"; + case "round": + return "roundedRect"; + case "ellipse": + return "ellipse"; + default: + return vertex.type; + } + } + findNode(nodes, id) { + return nodes.find((node) => node.id === id); + } + destructEdgeType(type) { + let arrowTypeStart = "none"; + let arrowTypeEnd = "arrow_point"; + switch (type) { + case "arrow_point": + case "arrow_circle": + case "arrow_cross": + arrowTypeEnd = type; + break; + case "double_arrow_point": + case "double_arrow_circle": + case "double_arrow_cross": + arrowTypeStart = type.replace("double_", ""); + arrowTypeEnd = arrowTypeStart; + break; + } + return { arrowTypeStart, arrowTypeEnd }; + } + addNodeFromVertex(vertex, nodes, parentDB, subGraphDB, config, look) { + const parentId = parentDB.get(vertex.id); + const isGroup = subGraphDB.get(vertex.id) ?? false; + const node = this.findNode(nodes, vertex.id); + if (node) { + node.cssStyles = vertex.styles; + node.cssCompiledStyles = this.getCompiledStyles(vertex.classes); + node.cssClasses = vertex.classes.join(" "); + } else { + const baseNode = { + id: vertex.id, + label: vertex.text, + labelStyle: "", + parentId, + padding: config.flowchart?.padding || 8, + cssStyles: vertex.styles, + cssCompiledStyles: this.getCompiledStyles(["default", "node", ...vertex.classes]), + cssClasses: "default " + vertex.classes.join(" "), + dir: vertex.dir, + domId: vertex.domId, + look, + link: vertex.link, + linkTarget: vertex.linkTarget, + tooltip: this.getTooltip(vertex.id), + icon: vertex.icon, + pos: vertex.pos, + img: vertex.img, + assetWidth: vertex.assetWidth, + assetHeight: vertex.assetHeight, + constraint: vertex.constraint + }; + if (isGroup) { + nodes.push({ + ...baseNode, + isGroup: true, + shape: "rect" + }); + } else { + nodes.push({ + ...baseNode, + isGroup: false, + shape: this.getTypeFromVertex(vertex) + }); + } + } + } + getCompiledStyles(classDefs) { + let compiledStyles = []; + for (const customClass of classDefs) { + const cssClass = this.classes.get(customClass); + if (cssClass?.styles) { + compiledStyles = [...compiledStyles, ...cssClass.styles ?? []].map((s) => s.trim()); + } + if (cssClass?.textStyles) { + compiledStyles = [...compiledStyles, ...cssClass.textStyles ?? []].map((s) => s.trim()); + } + } + return compiledStyles; + } + getData() { + const config = getConfig(); + const nodes = []; + const edges = []; + const subGraphs = this.getSubGraphs(); + const parentDB = /* @__PURE__ */ new Map(); + const subGraphDB = /* @__PURE__ */ new Map(); + for (let i = subGraphs.length - 1; i >= 0; i--) { + const subGraph = subGraphs[i]; + if (subGraph.nodes.length > 0) { + subGraphDB.set(subGraph.id, true); + } + for (const id of subGraph.nodes) { + parentDB.set(id, subGraph.id); + } + } + for (let i = subGraphs.length - 1; i >= 0; i--) { + const subGraph = subGraphs[i]; + nodes.push({ + id: subGraph.id, + label: subGraph.title, + labelStyle: "", + parentId: parentDB.get(subGraph.id), + padding: 8, + cssCompiledStyles: this.getCompiledStyles(subGraph.classes), + cssClasses: subGraph.classes.join(" "), + shape: "rect", + dir: subGraph.dir, + isGroup: true, + look: config.look + }); + } + const n = this.getVertices(); + n.forEach((vertex) => { + this.addNodeFromVertex(vertex, nodes, parentDB, subGraphDB, config, config.look || "classic"); + }); + const e = this.getEdges(); + e.forEach((rawEdge, index) => { + const { arrowTypeStart, arrowTypeEnd } = this.destructEdgeType(rawEdge.type); + const styles = [...e.defaultStyle ?? []]; + if (rawEdge.style) { + styles.push(...rawEdge.style); + } + const edge = { + id: getEdgeId(rawEdge.start, rawEdge.end, { counter: index, prefix: "L" }, rawEdge.id), + isUserDefinedId: rawEdge.isUserDefinedId, + start: rawEdge.start, + end: rawEdge.end, + type: rawEdge.type ?? "normal", + label: rawEdge.text, + labelpos: "c", + thickness: rawEdge.stroke, + minlen: rawEdge.length, + classes: rawEdge?.stroke === "invisible" ? "" : "edge-thickness-normal edge-pattern-solid flowchart-link", + arrowTypeStart: rawEdge?.stroke === "invisible" || rawEdge?.type === "arrow_open" ? "none" : arrowTypeStart, + arrowTypeEnd: rawEdge?.stroke === "invisible" || rawEdge?.type === "arrow_open" ? "none" : arrowTypeEnd, + arrowheadStyle: "fill: #333", + cssCompiledStyles: this.getCompiledStyles(rawEdge.classes), + labelStyle: styles, + style: styles, + pattern: rawEdge.stroke, + look: config.look, + animate: rawEdge.animate, + animation: rawEdge.animation, + curve: rawEdge.interpolate || this.edges.defaultInterpolate || config.flowchart?.curve + }; + edges.push(edge); + }); + return { nodes, edges, other: {}, config }; + } + defaultConfig() { + return defaultConfig.flowchart; + } +}; + +// src/diagrams/flowchart/flowRenderer-v3-unified.ts +import { select as select2 } from "d3"; +var getClasses = /* @__PURE__ */ __name(function(text, diagramObj) { + return diagramObj.db.getClasses(); +}, "getClasses"); +var draw = /* @__PURE__ */ __name(async function(text, id, _version, diag) { + log.info("REF0:"); + log.info("Drawing state diagram (v2)", id); + const { securityLevel, flowchart: conf, layout } = getConfig(); + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = select2("#i" + id); + } + const doc = securityLevel === "sandbox" ? sandboxElement.nodes()[0].contentDocument : document; + log.debug("Before getData: "); + const data4Layout = diag.db.getData(); + log.debug("Data: ", data4Layout); + const svg = getDiagramElement(id, securityLevel); + const direction = diag.db.getDirection(); + data4Layout.type = diag.type; + data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(layout); + if (data4Layout.layoutAlgorithm === "dagre" && layout === "elk") { + log.warn( + "flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback." + ); + } + data4Layout.direction = direction; + data4Layout.nodeSpacing = conf?.nodeSpacing || 50; + data4Layout.rankSpacing = conf?.rankSpacing || 50; + data4Layout.markers = ["point", "circle", "cross"]; + data4Layout.diagramId = id; + log.debug("REF1:", data4Layout); + await render(data4Layout, svg); + const padding = data4Layout.config.flowchart?.diagramPadding ?? 8; + utils_default.insertTitle( + svg, + "flowchartTitleText", + conf?.titleTopMargin || 0, + diag.db.getDiagramTitle() + ); + setupViewPortForSVG(svg, padding, "flowchart", conf?.useMaxWidth || false); + for (const vertex of data4Layout.nodes) { + const node = select2(`#${id} [id="${vertex.id}"]`); + if (!node || !vertex.link) { + continue; + } + const link = doc.createElementNS("http://www.w3.org/2000/svg", "a"); + link.setAttributeNS("http://www.w3.org/2000/svg", "class", vertex.cssClasses); + link.setAttributeNS("http://www.w3.org/2000/svg", "rel", "noopener"); + if (securityLevel === "sandbox") { + link.setAttributeNS("http://www.w3.org/2000/svg", "target", "_top"); + } else if (vertex.linkTarget) { + link.setAttributeNS("http://www.w3.org/2000/svg", "target", vertex.linkTarget); + } + const linkNode = node.insert(function() { + return link; + }, ":first-child"); + const shape = node.select(".label-container"); + if (shape) { + linkNode.append(function() { + return shape.node(); + }); + } + const label = node.select(".label"); + if (label) { + linkNode.append(function() { + return label.node(); + }); + } + } +}, "draw"); +var flowRenderer_v3_unified_default = { + getClasses, + draw +}; + +// src/diagrams/flowchart/parser/flow.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 4], $V1 = [1, 3], $V2 = [1, 5], $V3 = [1, 8, 9, 10, 11, 27, 34, 36, 38, 44, 60, 84, 85, 86, 87, 88, 89, 102, 105, 106, 109, 111, 114, 115, 116, 121, 122, 123, 124], $V4 = [2, 2], $V5 = [1, 13], $V6 = [1, 14], $V7 = [1, 15], $V8 = [1, 16], $V9 = [1, 23], $Va = [1, 25], $Vb = [1, 26], $Vc = [1, 27], $Vd = [1, 49], $Ve = [1, 48], $Vf = [1, 29], $Vg = [1, 30], $Vh = [1, 31], $Vi = [1, 32], $Vj = [1, 33], $Vk = [1, 44], $Vl = [1, 46], $Vm = [1, 42], $Vn = [1, 47], $Vo = [1, 43], $Vp = [1, 50], $Vq = [1, 45], $Vr = [1, 51], $Vs = [1, 52], $Vt = [1, 34], $Vu = [1, 35], $Vv = [1, 36], $Vw = [1, 37], $Vx = [1, 57], $Vy = [1, 8, 9, 10, 11, 27, 32, 34, 36, 38, 44, 60, 84, 85, 86, 87, 88, 89, 102, 105, 106, 109, 111, 114, 115, 116, 121, 122, 123, 124], $Vz = [1, 61], $VA = [1, 60], $VB = [1, 62], $VC = [8, 9, 11, 75, 77, 78], $VD = [1, 78], $VE = [1, 91], $VF = [1, 96], $VG = [1, 95], $VH = [1, 92], $VI = [1, 88], $VJ = [1, 94], $VK = [1, 90], $VL = [1, 97], $VM = [1, 93], $VN = [1, 98], $VO = [1, 89], $VP = [8, 9, 10, 11, 40, 75, 77, 78], $VQ = [8, 9, 10, 11, 40, 46, 75, 77, 78], $VR = [8, 9, 10, 11, 29, 40, 44, 46, 48, 50, 52, 54, 56, 58, 60, 63, 65, 67, 68, 70, 75, 77, 78, 89, 102, 105, 106, 109, 111, 114, 115, 116], $VS = [8, 9, 11, 44, 60, 75, 77, 78, 89, 102, 105, 106, 109, 111, 114, 115, 116], $VT = [44, 60, 89, 102, 105, 106, 109, 111, 114, 115, 116], $VU = [1, 121], $VV = [1, 122], $VW = [1, 124], $VX = [1, 123], $VY = [44, 60, 62, 74, 89, 102, 105, 106, 109, 111, 114, 115, 116], $VZ = [1, 133], $V_ = [1, 147], $V$ = [1, 148], $V01 = [1, 149], $V11 = [1, 150], $V21 = [1, 135], $V31 = [1, 137], $V41 = [1, 141], $V51 = [1, 142], $V61 = [1, 143], $V71 = [1, 144], $V81 = [1, 145], $V91 = [1, 146], $Va1 = [1, 151], $Vb1 = [1, 152], $Vc1 = [1, 131], $Vd1 = [1, 132], $Ve1 = [1, 139], $Vf1 = [1, 134], $Vg1 = [1, 138], $Vh1 = [1, 136], $Vi1 = [8, 9, 10, 11, 27, 32, 34, 36, 38, 44, 60, 84, 85, 86, 87, 88, 89, 102, 105, 106, 109, 111, 114, 115, 116, 121, 122, 123, 124], $Vj1 = [1, 154], $Vk1 = [1, 156], $Vl1 = [8, 9, 11], $Vm1 = [8, 9, 10, 11, 14, 44, 60, 89, 105, 106, 109, 111, 114, 115, 116], $Vn1 = [1, 176], $Vo1 = [1, 172], $Vp1 = [1, 173], $Vq1 = [1, 177], $Vr1 = [1, 174], $Vs1 = [1, 175], $Vt1 = [77, 116, 119], $Vu1 = [8, 9, 10, 11, 12, 14, 27, 29, 32, 44, 60, 75, 84, 85, 86, 87, 88, 89, 90, 105, 109, 111, 114, 115, 116], $Vv1 = [10, 106], $Vw1 = [31, 49, 51, 53, 55, 57, 62, 64, 66, 67, 69, 71, 116, 117, 118], $Vx1 = [1, 247], $Vy1 = [1, 245], $Vz1 = [1, 249], $VA1 = [1, 243], $VB1 = [1, 244], $VC1 = [1, 246], $VD1 = [1, 248], $VE1 = [1, 250], $VF1 = [1, 268], $VG1 = [8, 9, 11, 106], $VH1 = [8, 9, 10, 11, 60, 84, 105, 106, 109, 110, 111, 112]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "graphConfig": 4, "document": 5, "line": 6, "statement": 7, "SEMI": 8, "NEWLINE": 9, "SPACE": 10, "EOF": 11, "GRAPH": 12, "NODIR": 13, "DIR": 14, "FirstStmtSeparator": 15, "ending": 16, "endToken": 17, "spaceList": 18, "spaceListNewline": 19, "vertexStatement": 20, "separator": 21, "styleStatement": 22, "linkStyleStatement": 23, "classDefStatement": 24, "classStatement": 25, "clickStatement": 26, "subgraph": 27, "textNoTags": 28, "SQS": 29, "text": 30, "SQE": 31, "end": 32, "direction": 33, "acc_title": 34, "acc_title_value": 35, "acc_descr": 36, "acc_descr_value": 37, "acc_descr_multiline_value": 38, "shapeData": 39, "SHAPE_DATA": 40, "link": 41, "node": 42, "styledVertex": 43, "AMP": 44, "vertex": 45, "STYLE_SEPARATOR": 46, "idString": 47, "DOUBLECIRCLESTART": 48, "DOUBLECIRCLEEND": 49, "PS": 50, "PE": 51, "(-": 52, "-)": 53, "STADIUMSTART": 54, "STADIUMEND": 55, "SUBROUTINESTART": 56, "SUBROUTINEEND": 57, "VERTEX_WITH_PROPS_START": 58, "NODE_STRING[field]": 59, "COLON": 60, "NODE_STRING[value]": 61, "PIPE": 62, "CYLINDERSTART": 63, "CYLINDEREND": 64, "DIAMOND_START": 65, "DIAMOND_STOP": 66, "TAGEND": 67, "TRAPSTART": 68, "TRAPEND": 69, "INVTRAPSTART": 70, "INVTRAPEND": 71, "linkStatement": 72, "arrowText": 73, "TESTSTR": 74, "START_LINK": 75, "edgeText": 76, "LINK": 77, "LINK_ID": 78, "edgeTextToken": 79, "STR": 80, "MD_STR": 81, "textToken": 82, "keywords": 83, "STYLE": 84, "LINKSTYLE": 85, "CLASSDEF": 86, "CLASS": 87, "CLICK": 88, "DOWN": 89, "UP": 90, "textNoTagsToken": 91, "stylesOpt": 92, "idString[vertex]": 93, "idString[class]": 94, "CALLBACKNAME": 95, "CALLBACKARGS": 96, "HREF": 97, "LINK_TARGET": 98, "STR[link]": 99, "STR[tooltip]": 100, "alphaNum": 101, "DEFAULT": 102, "numList": 103, "INTERPOLATE": 104, "NUM": 105, "COMMA": 106, "style": 107, "styleComponent": 108, "NODE_STRING": 109, "UNIT": 110, "BRKT": 111, "PCT": 112, "idStringToken": 113, "MINUS": 114, "MULT": 115, "UNICODE_TEXT": 116, "TEXT": 117, "TAGSTART": 118, "EDGE_TEXT": 119, "alphaNumToken": 120, "direction_tb": 121, "direction_bt": 122, "direction_rl": 123, "direction_lr": 124, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 8: "SEMI", 9: "NEWLINE", 10: "SPACE", 11: "EOF", 12: "GRAPH", 13: "NODIR", 14: "DIR", 27: "subgraph", 29: "SQS", 31: "SQE", 32: "end", 34: "acc_title", 35: "acc_title_value", 36: "acc_descr", 37: "acc_descr_value", 38: "acc_descr_multiline_value", 40: "SHAPE_DATA", 44: "AMP", 46: "STYLE_SEPARATOR", 48: "DOUBLECIRCLESTART", 49: "DOUBLECIRCLEEND", 50: "PS", 51: "PE", 52: "(-", 53: "-)", 54: "STADIUMSTART", 55: "STADIUMEND", 56: "SUBROUTINESTART", 57: "SUBROUTINEEND", 58: "VERTEX_WITH_PROPS_START", 59: "NODE_STRING[field]", 60: "COLON", 61: "NODE_STRING[value]", 62: "PIPE", 63: "CYLINDERSTART", 64: "CYLINDEREND", 65: "DIAMOND_START", 66: "DIAMOND_STOP", 67: "TAGEND", 68: "TRAPSTART", 69: "TRAPEND", 70: "INVTRAPSTART", 71: "INVTRAPEND", 74: "TESTSTR", 75: "START_LINK", 77: "LINK", 78: "LINK_ID", 80: "STR", 81: "MD_STR", 84: "STYLE", 85: "LINKSTYLE", 86: "CLASSDEF", 87: "CLASS", 88: "CLICK", 89: "DOWN", 90: "UP", 93: "idString[vertex]", 94: "idString[class]", 95: "CALLBACKNAME", 96: "CALLBACKARGS", 97: "HREF", 98: "LINK_TARGET", 99: "STR[link]", 100: "STR[tooltip]", 102: "DEFAULT", 104: "INTERPOLATE", 105: "NUM", 106: "COMMA", 109: "NODE_STRING", 110: "UNIT", 111: "BRKT", 112: "PCT", 114: "MINUS", 115: "MULT", 116: "UNICODE_TEXT", 117: "TEXT", 118: "TAGSTART", 119: "EDGE_TEXT", 121: "direction_tb", 122: "direction_bt", 123: "direction_rl", 124: "direction_lr" }, + productions_: [0, [3, 2], [5, 0], [5, 2], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [4, 2], [4, 2], [4, 2], [4, 3], [16, 2], [16, 1], [17, 1], [17, 1], [17, 1], [15, 1], [15, 1], [15, 2], [19, 2], [19, 2], [19, 1], [19, 1], [18, 2], [18, 1], [7, 2], [7, 2], [7, 2], [7, 2], [7, 2], [7, 2], [7, 9], [7, 6], [7, 4], [7, 1], [7, 2], [7, 2], [7, 1], [21, 1], [21, 1], [21, 1], [39, 2], [39, 1], [20, 4], [20, 3], [20, 4], [20, 2], [20, 2], [20, 1], [42, 1], [42, 6], [42, 5], [43, 1], [43, 3], [45, 4], [45, 4], [45, 6], [45, 4], [45, 4], [45, 4], [45, 8], [45, 4], [45, 4], [45, 4], [45, 6], [45, 4], [45, 4], [45, 4], [45, 4], [45, 4], [45, 1], [41, 2], [41, 3], [41, 3], [41, 1], [41, 3], [41, 4], [76, 1], [76, 2], [76, 1], [76, 1], [72, 1], [72, 2], [73, 3], [30, 1], [30, 2], [30, 1], [30, 1], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [28, 1], [28, 2], [28, 1], [28, 1], [24, 5], [25, 5], [26, 2], [26, 4], [26, 3], [26, 5], [26, 3], [26, 5], [26, 5], [26, 7], [26, 2], [26, 4], [26, 2], [26, 4], [26, 4], [26, 6], [22, 5], [23, 5], [23, 5], [23, 9], [23, 9], [23, 7], [23, 7], [103, 1], [103, 3], [92, 1], [92, 3], [107, 1], [107, 2], [108, 1], [108, 1], [108, 1], [108, 1], [108, 1], [108, 1], [108, 1], [108, 1], [113, 1], [113, 1], [113, 1], [113, 1], [113, 1], [113, 1], [113, 1], [113, 1], [113, 1], [113, 1], [113, 1], [82, 1], [82, 1], [82, 1], [82, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [79, 1], [79, 1], [120, 1], [120, 1], [120, 1], [120, 1], [120, 1], [120, 1], [120, 1], [120, 1], [120, 1], [120, 1], [120, 1], [47, 1], [47, 2], [101, 1], [101, 2], [33, 1], [33, 1], [33, 1], [33, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 2: + this.$ = []; + break; + case 3: + if (!Array.isArray($$[$0]) || $$[$0].length > 0) { + $$[$0 - 1].push($$[$0]); + } + this.$ = $$[$0 - 1]; + break; + case 4: + case 183: + this.$ = $$[$0]; + break; + case 11: + yy.setDirection("TB"); + this.$ = "TB"; + break; + case 12: + yy.setDirection($$[$0 - 1]); + this.$ = $$[$0 - 1]; + break; + case 27: + this.$ = $$[$0 - 1].nodes; + break; + case 28: + case 29: + case 30: + case 31: + case 32: + this.$ = []; + break; + case 33: + this.$ = yy.addSubGraph($$[$0 - 6], $$[$0 - 1], $$[$0 - 4]); + break; + case 34: + this.$ = yy.addSubGraph($$[$0 - 3], $$[$0 - 1], $$[$0 - 3]); + break; + case 35: + this.$ = yy.addSubGraph(void 0, $$[$0 - 1], void 0); + break; + case 37: + this.$ = $$[$0].trim(); + yy.setAccTitle(this.$); + break; + case 38: + case 39: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 43: + this.$ = $$[$0 - 1] + $$[$0]; + break; + case 44: + this.$ = $$[$0]; + break; + case 45: + yy.addVertex($$[$0 - 1][$$[$0 - 1].length - 1], void 0, void 0, void 0, void 0, void 0, void 0, $$[$0]); + yy.addLink($$[$0 - 3].stmt, $$[$0 - 1], $$[$0 - 2]); + this.$ = { stmt: $$[$0 - 1], nodes: $$[$0 - 1].concat($$[$0 - 3].nodes) }; + break; + case 46: + yy.addLink($$[$0 - 2].stmt, $$[$0], $$[$0 - 1]); + this.$ = { stmt: $$[$0], nodes: $$[$0].concat($$[$0 - 2].nodes) }; + break; + case 47: + yy.addLink($$[$0 - 3].stmt, $$[$0 - 1], $$[$0 - 2]); + this.$ = { stmt: $$[$0 - 1], nodes: $$[$0 - 1].concat($$[$0 - 3].nodes) }; + break; + case 48: + this.$ = { stmt: $$[$0 - 1], nodes: $$[$0 - 1] }; + break; + case 49: + yy.addVertex($$[$0 - 1][$$[$0 - 1].length - 1], void 0, void 0, void 0, void 0, void 0, void 0, $$[$0]); + this.$ = { stmt: $$[$0 - 1], nodes: $$[$0 - 1], shapeData: $$[$0] }; + break; + case 50: + this.$ = { stmt: $$[$0], nodes: $$[$0] }; + break; + case 51: + this.$ = [$$[$0]]; + break; + case 52: + yy.addVertex($$[$0 - 5][$$[$0 - 5].length - 1], void 0, void 0, void 0, void 0, void 0, void 0, $$[$0 - 4]); + this.$ = $$[$0 - 5].concat($$[$0]); + break; + case 53: + this.$ = $$[$0 - 4].concat($$[$0]); + break; + case 54: + this.$ = $$[$0]; + break; + case 55: + this.$ = $$[$0 - 2]; + yy.setClass($$[$0 - 2], $$[$0]); + break; + case 56: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "square"); + break; + case 57: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "doublecircle"); + break; + case 58: + this.$ = $$[$0 - 5]; + yy.addVertex($$[$0 - 5], $$[$0 - 2], "circle"); + break; + case 59: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "ellipse"); + break; + case 60: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "stadium"); + break; + case 61: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "subroutine"); + break; + case 62: + this.$ = $$[$0 - 7]; + yy.addVertex($$[$0 - 7], $$[$0 - 1], "rect", void 0, void 0, void 0, Object.fromEntries([[$$[$0 - 5], $$[$0 - 3]]])); + break; + case 63: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "cylinder"); + break; + case 64: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "round"); + break; + case 65: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "diamond"); + break; + case 66: + this.$ = $$[$0 - 5]; + yy.addVertex($$[$0 - 5], $$[$0 - 2], "hexagon"); + break; + case 67: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "odd"); + break; + case 68: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "trapezoid"); + break; + case 69: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "inv_trapezoid"); + break; + case 70: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "lean_right"); + break; + case 71: + this.$ = $$[$0 - 3]; + yy.addVertex($$[$0 - 3], $$[$0 - 1], "lean_left"); + break; + case 72: + this.$ = $$[$0]; + yy.addVertex($$[$0]); + break; + case 73: + $$[$0 - 1].text = $$[$0]; + this.$ = $$[$0 - 1]; + break; + case 74: + case 75: + $$[$0 - 2].text = $$[$0 - 1]; + this.$ = $$[$0 - 2]; + break; + case 76: + this.$ = $$[$0]; + break; + case 77: + var inf = yy.destructLink($$[$0], $$[$0 - 2]); + this.$ = { "type": inf.type, "stroke": inf.stroke, "length": inf.length, "text": $$[$0 - 1] }; + break; + case 78: + var inf = yy.destructLink($$[$0], $$[$0 - 2]); + this.$ = { "type": inf.type, "stroke": inf.stroke, "length": inf.length, "text": $$[$0 - 1], "id": $$[$0 - 3] }; + break; + case 79: + this.$ = { text: $$[$0], type: "text" }; + break; + case 80: + this.$ = { text: $$[$0 - 1].text + "" + $$[$0], type: $$[$0 - 1].type }; + break; + case 81: + this.$ = { text: $$[$0], type: "string" }; + break; + case 82: + this.$ = { text: $$[$0], type: "markdown" }; + break; + case 83: + var inf = yy.destructLink($$[$0]); + this.$ = { "type": inf.type, "stroke": inf.stroke, "length": inf.length }; + break; + case 84: + var inf = yy.destructLink($$[$0]); + this.$ = { "type": inf.type, "stroke": inf.stroke, "length": inf.length, "id": $$[$0 - 1] }; + break; + case 85: + this.$ = $$[$0 - 1]; + break; + case 86: + this.$ = { text: $$[$0], type: "text" }; + break; + case 87: + this.$ = { text: $$[$0 - 1].text + "" + $$[$0], type: $$[$0 - 1].type }; + break; + case 88: + this.$ = { text: $$[$0], type: "string" }; + break; + case 89: + case 104: + this.$ = { text: $$[$0], type: "markdown" }; + break; + case 101: + this.$ = { text: $$[$0], type: "text" }; + break; + case 102: + this.$ = { text: $$[$0 - 1].text + "" + $$[$0], type: $$[$0 - 1].type }; + break; + case 103: + this.$ = { text: $$[$0], type: "text" }; + break; + case 105: + this.$ = $$[$0 - 4]; + yy.addClass($$[$0 - 2], $$[$0]); + break; + case 106: + this.$ = $$[$0 - 4]; + yy.setClass($$[$0 - 2], $$[$0]); + break; + case 107: + case 115: + this.$ = $$[$0 - 1]; + yy.setClickEvent($$[$0 - 1], $$[$0]); + break; + case 108: + case 116: + this.$ = $$[$0 - 3]; + yy.setClickEvent($$[$0 - 3], $$[$0 - 2]); + yy.setTooltip($$[$0 - 3], $$[$0]); + break; + case 109: + this.$ = $$[$0 - 2]; + yy.setClickEvent($$[$0 - 2], $$[$0 - 1], $$[$0]); + break; + case 110: + this.$ = $$[$0 - 4]; + yy.setClickEvent($$[$0 - 4], $$[$0 - 3], $$[$0 - 2]); + yy.setTooltip($$[$0 - 4], $$[$0]); + break; + case 111: + this.$ = $$[$0 - 2]; + yy.setLink($$[$0 - 2], $$[$0]); + break; + case 112: + this.$ = $$[$0 - 4]; + yy.setLink($$[$0 - 4], $$[$0 - 2]); + yy.setTooltip($$[$0 - 4], $$[$0]); + break; + case 113: + this.$ = $$[$0 - 4]; + yy.setLink($$[$0 - 4], $$[$0 - 2], $$[$0]); + break; + case 114: + this.$ = $$[$0 - 6]; + yy.setLink($$[$0 - 6], $$[$0 - 4], $$[$0]); + yy.setTooltip($$[$0 - 6], $$[$0 - 2]); + break; + case 117: + this.$ = $$[$0 - 1]; + yy.setLink($$[$0 - 1], $$[$0]); + break; + case 118: + this.$ = $$[$0 - 3]; + yy.setLink($$[$0 - 3], $$[$0 - 2]); + yy.setTooltip($$[$0 - 3], $$[$0]); + break; + case 119: + this.$ = $$[$0 - 3]; + yy.setLink($$[$0 - 3], $$[$0 - 2], $$[$0]); + break; + case 120: + this.$ = $$[$0 - 5]; + yy.setLink($$[$0 - 5], $$[$0 - 4], $$[$0]); + yy.setTooltip($$[$0 - 5], $$[$0 - 2]); + break; + case 121: + this.$ = $$[$0 - 4]; + yy.addVertex($$[$0 - 2], void 0, void 0, $$[$0]); + break; + case 122: + this.$ = $$[$0 - 4]; + yy.updateLink([$$[$0 - 2]], $$[$0]); + break; + case 123: + this.$ = $$[$0 - 4]; + yy.updateLink($$[$0 - 2], $$[$0]); + break; + case 124: + this.$ = $$[$0 - 8]; + yy.updateLinkInterpolate([$$[$0 - 6]], $$[$0 - 2]); + yy.updateLink([$$[$0 - 6]], $$[$0]); + break; + case 125: + this.$ = $$[$0 - 8]; + yy.updateLinkInterpolate($$[$0 - 6], $$[$0 - 2]); + yy.updateLink($$[$0 - 6], $$[$0]); + break; + case 126: + this.$ = $$[$0 - 6]; + yy.updateLinkInterpolate([$$[$0 - 4]], $$[$0]); + break; + case 127: + this.$ = $$[$0 - 6]; + yy.updateLinkInterpolate($$[$0 - 4], $$[$0]); + break; + case 128: + case 130: + this.$ = [$$[$0]]; + break; + case 129: + case 131: + $$[$0 - 2].push($$[$0]); + this.$ = $$[$0 - 2]; + break; + case 133: + this.$ = $$[$0 - 1] + $$[$0]; + break; + case 181: + this.$ = $$[$0]; + break; + case 182: + this.$ = $$[$0 - 1] + "" + $$[$0]; + break; + case 184: + this.$ = $$[$0 - 1] + "" + $$[$0]; + break; + case 185: + this.$ = { stmt: "dir", value: "TB" }; + break; + case 186: + this.$ = { stmt: "dir", value: "BT" }; + break; + case 187: + this.$ = { stmt: "dir", value: "RL" }; + break; + case 188: + this.$ = { stmt: "dir", value: "LR" }; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: 2, 9: $V0, 10: $V1, 12: $V2 }, { 1: [3] }, o($V3, $V4, { 5: 6 }), { 4: 7, 9: $V0, 10: $V1, 12: $V2 }, { 4: 8, 9: $V0, 10: $V1, 12: $V2 }, { 13: [1, 9], 14: [1, 10] }, { 1: [2, 1], 6: 11, 7: 12, 8: $V5, 9: $V6, 10: $V7, 11: $V8, 20: 17, 22: 18, 23: 19, 24: 20, 25: 21, 26: 22, 27: $V9, 33: 24, 34: $Va, 36: $Vb, 38: $Vc, 42: 28, 43: 38, 44: $Vd, 45: 39, 47: 40, 60: $Ve, 84: $Vf, 85: $Vg, 86: $Vh, 87: $Vi, 88: $Vj, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs, 121: $Vt, 122: $Vu, 123: $Vv, 124: $Vw }, o($V3, [2, 9]), o($V3, [2, 10]), o($V3, [2, 11]), { 8: [1, 54], 9: [1, 55], 10: $Vx, 15: 53, 18: 56 }, o($Vy, [2, 3]), o($Vy, [2, 4]), o($Vy, [2, 5]), o($Vy, [2, 6]), o($Vy, [2, 7]), o($Vy, [2, 8]), { 8: $Vz, 9: $VA, 11: $VB, 21: 58, 41: 59, 72: 63, 75: [1, 64], 77: [1, 66], 78: [1, 65] }, { 8: $Vz, 9: $VA, 11: $VB, 21: 67 }, { 8: $Vz, 9: $VA, 11: $VB, 21: 68 }, { 8: $Vz, 9: $VA, 11: $VB, 21: 69 }, { 8: $Vz, 9: $VA, 11: $VB, 21: 70 }, { 8: $Vz, 9: $VA, 11: $VB, 21: 71 }, { 8: $Vz, 9: $VA, 10: [1, 72], 11: $VB, 21: 73 }, o($Vy, [2, 36]), { 35: [1, 74] }, { 37: [1, 75] }, o($Vy, [2, 39]), o($VC, [2, 50], { 18: 76, 39: 77, 10: $Vx, 40: $VD }), { 10: [1, 79] }, { 10: [1, 80] }, { 10: [1, 81] }, { 10: [1, 82] }, { 14: $VE, 44: $VF, 60: $VG, 80: [1, 86], 89: $VH, 95: [1, 83], 97: [1, 84], 101: 85, 105: $VI, 106: $VJ, 109: $VK, 111: $VL, 114: $VM, 115: $VN, 116: $VO, 120: 87 }, o($Vy, [2, 185]), o($Vy, [2, 186]), o($Vy, [2, 187]), o($Vy, [2, 188]), o($VP, [2, 51]), o($VP, [2, 54], { 46: [1, 99] }), o($VQ, [2, 72], { 113: 112, 29: [1, 100], 44: $Vd, 48: [1, 101], 50: [1, 102], 52: [1, 103], 54: [1, 104], 56: [1, 105], 58: [1, 106], 60: $Ve, 63: [1, 107], 65: [1, 108], 67: [1, 109], 68: [1, 110], 70: [1, 111], 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 114: $Vq, 115: $Vr, 116: $Vs }), o($VR, [2, 181]), o($VR, [2, 142]), o($VR, [2, 143]), o($VR, [2, 144]), o($VR, [2, 145]), o($VR, [2, 146]), o($VR, [2, 147]), o($VR, [2, 148]), o($VR, [2, 149]), o($VR, [2, 150]), o($VR, [2, 151]), o($VR, [2, 152]), o($V3, [2, 12]), o($V3, [2, 18]), o($V3, [2, 19]), { 9: [1, 113] }, o($VS, [2, 26], { 18: 114, 10: $Vx }), o($Vy, [2, 27]), { 42: 115, 43: 38, 44: $Vd, 45: 39, 47: 40, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs }, o($Vy, [2, 40]), o($Vy, [2, 41]), o($Vy, [2, 42]), o($VT, [2, 76], { 73: 116, 62: [1, 118], 74: [1, 117] }), { 76: 119, 79: 120, 80: $VU, 81: $VV, 116: $VW, 119: $VX }, { 75: [1, 125], 77: [1, 126] }, o($VY, [2, 83]), o($Vy, [2, 28]), o($Vy, [2, 29]), o($Vy, [2, 30]), o($Vy, [2, 31]), o($Vy, [2, 32]), { 10: $VZ, 12: $V_, 14: $V$, 27: $V01, 28: 127, 32: $V11, 44: $V21, 60: $V31, 75: $V41, 80: [1, 129], 81: [1, 130], 83: 140, 84: $V51, 85: $V61, 86: $V71, 87: $V81, 88: $V91, 89: $Va1, 90: $Vb1, 91: 128, 105: $Vc1, 109: $Vd1, 111: $Ve1, 114: $Vf1, 115: $Vg1, 116: $Vh1 }, o($Vi1, $V4, { 5: 153 }), o($Vy, [2, 37]), o($Vy, [2, 38]), o($VC, [2, 48], { 44: $Vj1 }), o($VC, [2, 49], { 18: 155, 10: $Vx, 40: $Vk1 }), o($VP, [2, 44]), { 44: $Vd, 47: 157, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs }, { 102: [1, 158], 103: 159, 105: [1, 160] }, { 44: $Vd, 47: 161, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs }, { 44: $Vd, 47: 162, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs }, o($Vl1, [2, 107], { 10: [1, 163], 96: [1, 164] }), { 80: [1, 165] }, o($Vl1, [2, 115], { 120: 167, 10: [1, 166], 14: $VE, 44: $VF, 60: $VG, 89: $VH, 105: $VI, 106: $VJ, 109: $VK, 111: $VL, 114: $VM, 115: $VN, 116: $VO }), o($Vl1, [2, 117], { 10: [1, 168] }), o($Vm1, [2, 183]), o($Vm1, [2, 170]), o($Vm1, [2, 171]), o($Vm1, [2, 172]), o($Vm1, [2, 173]), o($Vm1, [2, 174]), o($Vm1, [2, 175]), o($Vm1, [2, 176]), o($Vm1, [2, 177]), o($Vm1, [2, 178]), o($Vm1, [2, 179]), o($Vm1, [2, 180]), { 44: $Vd, 47: 169, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs }, { 30: 170, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 30: 178, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 30: 180, 50: [1, 179], 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 30: 181, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 30: 182, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 30: 183, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 109: [1, 184] }, { 30: 185, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 30: 186, 65: [1, 187], 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 30: 188, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 30: 189, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 30: 190, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, o($VR, [2, 182]), o($V3, [2, 20]), o($VS, [2, 25]), o($VC, [2, 46], { 39: 191, 18: 192, 10: $Vx, 40: $VD }), o($VT, [2, 73], { 10: [1, 193] }), { 10: [1, 194] }, { 30: 195, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 77: [1, 196], 79: 197, 116: $VW, 119: $VX }, o($Vt1, [2, 79]), o($Vt1, [2, 81]), o($Vt1, [2, 82]), o($Vt1, [2, 168]), o($Vt1, [2, 169]), { 76: 198, 79: 120, 80: $VU, 81: $VV, 116: $VW, 119: $VX }, o($VY, [2, 84]), { 8: $Vz, 9: $VA, 10: $VZ, 11: $VB, 12: $V_, 14: $V$, 21: 200, 27: $V01, 29: [1, 199], 32: $V11, 44: $V21, 60: $V31, 75: $V41, 83: 140, 84: $V51, 85: $V61, 86: $V71, 87: $V81, 88: $V91, 89: $Va1, 90: $Vb1, 91: 201, 105: $Vc1, 109: $Vd1, 111: $Ve1, 114: $Vf1, 115: $Vg1, 116: $Vh1 }, o($Vu1, [2, 101]), o($Vu1, [2, 103]), o($Vu1, [2, 104]), o($Vu1, [2, 157]), o($Vu1, [2, 158]), o($Vu1, [2, 159]), o($Vu1, [2, 160]), o($Vu1, [2, 161]), o($Vu1, [2, 162]), o($Vu1, [2, 163]), o($Vu1, [2, 164]), o($Vu1, [2, 165]), o($Vu1, [2, 166]), o($Vu1, [2, 167]), o($Vu1, [2, 90]), o($Vu1, [2, 91]), o($Vu1, [2, 92]), o($Vu1, [2, 93]), o($Vu1, [2, 94]), o($Vu1, [2, 95]), o($Vu1, [2, 96]), o($Vu1, [2, 97]), o($Vu1, [2, 98]), o($Vu1, [2, 99]), o($Vu1, [2, 100]), { 6: 11, 7: 12, 8: $V5, 9: $V6, 10: $V7, 11: $V8, 20: 17, 22: 18, 23: 19, 24: 20, 25: 21, 26: 22, 27: $V9, 32: [1, 202], 33: 24, 34: $Va, 36: $Vb, 38: $Vc, 42: 28, 43: 38, 44: $Vd, 45: 39, 47: 40, 60: $Ve, 84: $Vf, 85: $Vg, 86: $Vh, 87: $Vi, 88: $Vj, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs, 121: $Vt, 122: $Vu, 123: $Vv, 124: $Vw }, { 10: $Vx, 18: 203 }, { 44: [1, 204] }, o($VP, [2, 43]), { 10: [1, 205], 44: $Vd, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 112, 114: $Vq, 115: $Vr, 116: $Vs }, { 10: [1, 206] }, { 10: [1, 207], 106: [1, 208] }, o($Vv1, [2, 128]), { 10: [1, 209], 44: $Vd, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 112, 114: $Vq, 115: $Vr, 116: $Vs }, { 10: [1, 210], 44: $Vd, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 112, 114: $Vq, 115: $Vr, 116: $Vs }, { 80: [1, 211] }, o($Vl1, [2, 109], { 10: [1, 212] }), o($Vl1, [2, 111], { 10: [1, 213] }), { 80: [1, 214] }, o($Vm1, [2, 184]), { 80: [1, 215], 98: [1, 216] }, o($VP, [2, 55], { 113: 112, 44: $Vd, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 114: $Vq, 115: $Vr, 116: $Vs }), { 31: [1, 217], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, o($Vw1, [2, 86]), o($Vw1, [2, 88]), o($Vw1, [2, 89]), o($Vw1, [2, 153]), o($Vw1, [2, 154]), o($Vw1, [2, 155]), o($Vw1, [2, 156]), { 49: [1, 219], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 30: 220, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 51: [1, 221], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 53: [1, 222], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 55: [1, 223], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 57: [1, 224], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 60: [1, 225] }, { 64: [1, 226], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 66: [1, 227], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 30: 228, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 31: [1, 229], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 67: $Vn1, 69: [1, 230], 71: [1, 231], 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 67: $Vn1, 69: [1, 233], 71: [1, 232], 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, o($VC, [2, 45], { 18: 155, 10: $Vx, 40: $Vk1 }), o($VC, [2, 47], { 44: $Vj1 }), o($VT, [2, 75]), o($VT, [2, 74]), { 62: [1, 234], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, o($VT, [2, 77]), o($Vt1, [2, 80]), { 77: [1, 235], 79: 197, 116: $VW, 119: $VX }, { 30: 236, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, o($Vi1, $V4, { 5: 237 }), o($Vu1, [2, 102]), o($Vy, [2, 35]), { 43: 238, 44: $Vd, 45: 39, 47: 40, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs }, { 10: $Vx, 18: 239 }, { 10: $Vx1, 60: $Vy1, 84: $Vz1, 92: 240, 105: $VA1, 107: 241, 108: 242, 109: $VB1, 110: $VC1, 111: $VD1, 112: $VE1 }, { 10: $Vx1, 60: $Vy1, 84: $Vz1, 92: 251, 104: [1, 252], 105: $VA1, 107: 241, 108: 242, 109: $VB1, 110: $VC1, 111: $VD1, 112: $VE1 }, { 10: $Vx1, 60: $Vy1, 84: $Vz1, 92: 253, 104: [1, 254], 105: $VA1, 107: 241, 108: 242, 109: $VB1, 110: $VC1, 111: $VD1, 112: $VE1 }, { 105: [1, 255] }, { 10: $Vx1, 60: $Vy1, 84: $Vz1, 92: 256, 105: $VA1, 107: 241, 108: 242, 109: $VB1, 110: $VC1, 111: $VD1, 112: $VE1 }, { 44: $Vd, 47: 257, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs }, o($Vl1, [2, 108]), { 80: [1, 258] }, { 80: [1, 259], 98: [1, 260] }, o($Vl1, [2, 116]), o($Vl1, [2, 118], { 10: [1, 261] }), o($Vl1, [2, 119]), o($VQ, [2, 56]), o($Vw1, [2, 87]), o($VQ, [2, 57]), { 51: [1, 262], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, o($VQ, [2, 64]), o($VQ, [2, 59]), o($VQ, [2, 60]), o($VQ, [2, 61]), { 109: [1, 263] }, o($VQ, [2, 63]), o($VQ, [2, 65]), { 66: [1, 264], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, o($VQ, [2, 67]), o($VQ, [2, 68]), o($VQ, [2, 70]), o($VQ, [2, 69]), o($VQ, [2, 71]), o([10, 44, 60, 89, 102, 105, 106, 109, 111, 114, 115, 116], [2, 85]), o($VT, [2, 78]), { 31: [1, 265], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 6: 11, 7: 12, 8: $V5, 9: $V6, 10: $V7, 11: $V8, 20: 17, 22: 18, 23: 19, 24: 20, 25: 21, 26: 22, 27: $V9, 32: [1, 266], 33: 24, 34: $Va, 36: $Vb, 38: $Vc, 42: 28, 43: 38, 44: $Vd, 45: 39, 47: 40, 60: $Ve, 84: $Vf, 85: $Vg, 86: $Vh, 87: $Vi, 88: $Vj, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs, 121: $Vt, 122: $Vu, 123: $Vv, 124: $Vw }, o($VP, [2, 53]), { 43: 267, 44: $Vd, 45: 39, 47: 40, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs }, o($Vl1, [2, 121], { 106: $VF1 }), o($VG1, [2, 130], { 108: 269, 10: $Vx1, 60: $Vy1, 84: $Vz1, 105: $VA1, 109: $VB1, 110: $VC1, 111: $VD1, 112: $VE1 }), o($VH1, [2, 132]), o($VH1, [2, 134]), o($VH1, [2, 135]), o($VH1, [2, 136]), o($VH1, [2, 137]), o($VH1, [2, 138]), o($VH1, [2, 139]), o($VH1, [2, 140]), o($VH1, [2, 141]), o($Vl1, [2, 122], { 106: $VF1 }), { 10: [1, 270] }, o($Vl1, [2, 123], { 106: $VF1 }), { 10: [1, 271] }, o($Vv1, [2, 129]), o($Vl1, [2, 105], { 106: $VF1 }), o($Vl1, [2, 106], { 113: 112, 44: $Vd, 60: $Ve, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 114: $Vq, 115: $Vr, 116: $Vs }), o($Vl1, [2, 110]), o($Vl1, [2, 112], { 10: [1, 272] }), o($Vl1, [2, 113]), { 98: [1, 273] }, { 51: [1, 274] }, { 62: [1, 275] }, { 66: [1, 276] }, { 8: $Vz, 9: $VA, 11: $VB, 21: 277 }, o($Vy, [2, 34]), o($VP, [2, 52]), { 10: $Vx1, 60: $Vy1, 84: $Vz1, 105: $VA1, 107: 278, 108: 242, 109: $VB1, 110: $VC1, 111: $VD1, 112: $VE1 }, o($VH1, [2, 133]), { 14: $VE, 44: $VF, 60: $VG, 89: $VH, 101: 279, 105: $VI, 106: $VJ, 109: $VK, 111: $VL, 114: $VM, 115: $VN, 116: $VO, 120: 87 }, { 14: $VE, 44: $VF, 60: $VG, 89: $VH, 101: 280, 105: $VI, 106: $VJ, 109: $VK, 111: $VL, 114: $VM, 115: $VN, 116: $VO, 120: 87 }, { 98: [1, 281] }, o($Vl1, [2, 120]), o($VQ, [2, 58]), { 30: 282, 67: $Vn1, 80: $Vo1, 81: $Vp1, 82: 171, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, o($VQ, [2, 66]), o($Vi1, $V4, { 5: 283 }), o($VG1, [2, 131], { 108: 269, 10: $Vx1, 60: $Vy1, 84: $Vz1, 105: $VA1, 109: $VB1, 110: $VC1, 111: $VD1, 112: $VE1 }), o($Vl1, [2, 126], { 120: 167, 10: [1, 284], 14: $VE, 44: $VF, 60: $VG, 89: $VH, 105: $VI, 106: $VJ, 109: $VK, 111: $VL, 114: $VM, 115: $VN, 116: $VO }), o($Vl1, [2, 127], { 120: 167, 10: [1, 285], 14: $VE, 44: $VF, 60: $VG, 89: $VH, 105: $VI, 106: $VJ, 109: $VK, 111: $VL, 114: $VM, 115: $VN, 116: $VO }), o($Vl1, [2, 114]), { 31: [1, 286], 67: $Vn1, 82: 218, 116: $Vq1, 117: $Vr1, 118: $Vs1 }, { 6: 11, 7: 12, 8: $V5, 9: $V6, 10: $V7, 11: $V8, 20: 17, 22: 18, 23: 19, 24: 20, 25: 21, 26: 22, 27: $V9, 32: [1, 287], 33: 24, 34: $Va, 36: $Vb, 38: $Vc, 42: 28, 43: 38, 44: $Vd, 45: 39, 47: 40, 60: $Ve, 84: $Vf, 85: $Vg, 86: $Vh, 87: $Vi, 88: $Vj, 89: $Vk, 102: $Vl, 105: $Vm, 106: $Vn, 109: $Vo, 111: $Vp, 113: 41, 114: $Vq, 115: $Vr, 116: $Vs, 121: $Vt, 122: $Vu, 123: $Vv, 124: $Vw }, { 10: $Vx1, 60: $Vy1, 84: $Vz1, 92: 288, 105: $VA1, 107: 241, 108: 242, 109: $VB1, 110: $VC1, 111: $VD1, 112: $VE1 }, { 10: $Vx1, 60: $Vy1, 84: $Vz1, 92: 289, 105: $VA1, 107: 241, 108: 242, 109: $VB1, 110: $VC1, 111: $VD1, 112: $VE1 }, o($VQ, [2, 62]), o($Vy, [2, 33]), o($Vl1, [2, 124], { 106: $VF1 }), o($Vl1, [2, 125], { 106: $VF1 })], + defaultActions: {}, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: {}, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + this.begin("acc_title"); + return 34; + break; + case 1: + this.popState(); + return "acc_title_value"; + break; + case 2: + this.begin("acc_descr"); + return 36; + break; + case 3: + this.popState(); + return "acc_descr_value"; + break; + case 4: + this.begin("acc_descr_multiline"); + break; + case 5: + this.popState(); + break; + case 6: + return "acc_descr_multiline_value"; + break; + case 7: + this.pushState("shapeData"); + yy_.yytext = ""; + return 40; + break; + case 8: + this.pushState("shapeDataStr"); + return 40; + break; + case 9: + this.popState(); + return 40; + break; + case 10: + const re = /\n\s*/g; + yy_.yytext = yy_.yytext.replace(re, "
"); + return 40; + break; + case 11: + return 40; + break; + case 12: + this.popState(); + break; + case 13: + this.begin("callbackname"); + break; + case 14: + this.popState(); + break; + case 15: + this.popState(); + this.begin("callbackargs"); + break; + case 16: + return 95; + break; + case 17: + this.popState(); + break; + case 18: + return 96; + break; + case 19: + return "MD_STR"; + break; + case 20: + this.popState(); + break; + case 21: + this.begin("md_string"); + break; + case 22: + return "STR"; + break; + case 23: + this.popState(); + break; + case 24: + this.pushState("string"); + break; + case 25: + return 84; + break; + case 26: + return 102; + break; + case 27: + return 85; + break; + case 28: + return 104; + break; + case 29: + return 86; + break; + case 30: + return 87; + break; + case 31: + return 97; + break; + case 32: + this.begin("click"); + break; + case 33: + this.popState(); + break; + case 34: + return 88; + break; + case 35: + if (yy.lex.firstGraph()) { + this.begin("dir"); + } + return 12; + break; + case 36: + if (yy.lex.firstGraph()) { + this.begin("dir"); + } + return 12; + break; + case 37: + if (yy.lex.firstGraph()) { + this.begin("dir"); + } + return 12; + break; + case 38: + return 27; + break; + case 39: + return 32; + break; + case 40: + return 98; + break; + case 41: + return 98; + break; + case 42: + return 98; + break; + case 43: + return 98; + break; + case 44: + this.popState(); + return 13; + break; + case 45: + this.popState(); + return 14; + break; + case 46: + this.popState(); + return 14; + break; + case 47: + this.popState(); + return 14; + break; + case 48: + this.popState(); + return 14; + break; + case 49: + this.popState(); + return 14; + break; + case 50: + this.popState(); + return 14; + break; + case 51: + this.popState(); + return 14; + break; + case 52: + this.popState(); + return 14; + break; + case 53: + this.popState(); + return 14; + break; + case 54: + this.popState(); + return 14; + break; + case 55: + return 121; + break; + case 56: + return 122; + break; + case 57: + return 123; + break; + case 58: + return 124; + break; + case 59: + return 78; + break; + case 60: + return 105; + break; + case 61: + return 111; + break; + case 62: + return 46; + break; + case 63: + return 60; + break; + case 64: + return 44; + break; + case 65: + return 8; + break; + case 66: + return 106; + break; + case 67: + return 115; + break; + case 68: + this.popState(); + return 77; + break; + case 69: + this.pushState("edgeText"); + return 75; + break; + case 70: + return 119; + break; + case 71: + this.popState(); + return 77; + break; + case 72: + this.pushState("thickEdgeText"); + return 75; + break; + case 73: + return 119; + break; + case 74: + this.popState(); + return 77; + break; + case 75: + this.pushState("dottedEdgeText"); + return 75; + break; + case 76: + return 119; + break; + case 77: + return 77; + break; + case 78: + this.popState(); + return 53; + break; + case 79: + return "TEXT"; + break; + case 80: + this.pushState("ellipseText"); + return 52; + break; + case 81: + this.popState(); + return 55; + break; + case 82: + this.pushState("text"); + return 54; + break; + case 83: + this.popState(); + return 57; + break; + case 84: + this.pushState("text"); + return 56; + break; + case 85: + return 58; + break; + case 86: + this.pushState("text"); + return 67; + break; + case 87: + this.popState(); + return 64; + break; + case 88: + this.pushState("text"); + return 63; + break; + case 89: + this.popState(); + return 49; + break; + case 90: + this.pushState("text"); + return 48; + break; + case 91: + this.popState(); + return 69; + break; + case 92: + this.popState(); + return 71; + break; + case 93: + return 117; + break; + case 94: + this.pushState("trapText"); + return 68; + break; + case 95: + this.pushState("trapText"); + return 70; + break; + case 96: + return 118; + break; + case 97: + return 67; + break; + case 98: + return 90; + break; + case 99: + return "SEP"; + break; + case 100: + return 89; + break; + case 101: + return 115; + break; + case 102: + return 111; + break; + case 103: + return 44; + break; + case 104: + return 109; + break; + case 105: + return 114; + break; + case 106: + return 116; + break; + case 107: + this.popState(); + return 62; + break; + case 108: + this.pushState("text"); + return 62; + break; + case 109: + this.popState(); + return 51; + break; + case 110: + this.pushState("text"); + return 50; + break; + case 111: + this.popState(); + return 31; + break; + case 112: + this.pushState("text"); + return 29; + break; + case 113: + this.popState(); + return 66; + break; + case 114: + this.pushState("text"); + return 65; + break; + case 115: + return "TEXT"; + break; + case 116: + return "QUOTE"; + break; + case 117: + return 9; + break; + case 118: + return 10; + break; + case 119: + return 11; + break; + } + }, "anonymous"), + rules: [/^(?:accTitle\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*:\s*)/, /^(?:(?!\n||)*[^\n]*)/, /^(?:accDescr\s*\{\s*)/, /^(?:[\}])/, /^(?:[^\}]*)/, /^(?:@\{)/, /^(?:["])/, /^(?:["])/, /^(?:[^\"]+)/, /^(?:[^}^"]+)/, /^(?:\})/, /^(?:call[\s]+)/, /^(?:\([\s]*\))/, /^(?:\()/, /^(?:[^(]*)/, /^(?:\))/, /^(?:[^)]*)/, /^(?:[^`"]+)/, /^(?:[`]["])/, /^(?:["][`])/, /^(?:[^"]+)/, /^(?:["])/, /^(?:["])/, /^(?:style\b)/, /^(?:default\b)/, /^(?:linkStyle\b)/, /^(?:interpolate\b)/, /^(?:classDef\b)/, /^(?:class\b)/, /^(?:href[\s])/, /^(?:click[\s]+)/, /^(?:[\s\n])/, /^(?:[^\s\n]*)/, /^(?:flowchart-elk\b)/, /^(?:graph\b)/, /^(?:flowchart\b)/, /^(?:subgraph\b)/, /^(?:end\b\s*)/, /^(?:_self\b)/, /^(?:_blank\b)/, /^(?:_parent\b)/, /^(?:_top\b)/, /^(?:(\r?\n)*\s*\n)/, /^(?:\s*LR\b)/, /^(?:\s*RL\b)/, /^(?:\s*TB\b)/, /^(?:\s*BT\b)/, /^(?:\s*TD\b)/, /^(?:\s*BR\b)/, /^(?:\s*<)/, /^(?:\s*>)/, /^(?:\s*\^)/, /^(?:\s*v\b)/, /^(?:.*direction\s+TB[^\n]*)/, /^(?:.*direction\s+BT[^\n]*)/, /^(?:.*direction\s+RL[^\n]*)/, /^(?:.*direction\s+LR[^\n]*)/, /^(?:[^\s\"]+@(?=[^\{\"]))/, /^(?:[0-9]+)/, /^(?:#)/, /^(?::::)/, /^(?::)/, /^(?:&)/, /^(?:;)/, /^(?:,)/, /^(?:\*)/, /^(?:\s*[xo<]?--+[-xo>]\s*)/, /^(?:\s*[xo<]?--\s*)/, /^(?:[^-]|-(?!-)+)/, /^(?:\s*[xo<]?==+[=xo>]\s*)/, /^(?:\s*[xo<]?==\s*)/, /^(?:[^=]|=(?!))/, /^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/, /^(?:\s*[xo<]?-\.\s*)/, /^(?:[^\.]|\.(?!))/, /^(?:\s*~~[\~]+\s*)/, /^(?:[-/\)][\)])/, /^(?:[^\(\)\[\]\{\}]|!\)+)/, /^(?:\(-)/, /^(?:\]\))/, /^(?:\(\[)/, /^(?:\]\])/, /^(?:\[\[)/, /^(?:\[\|)/, /^(?:>)/, /^(?:\)\])/, /^(?:\[\()/, /^(?:\)\)\))/, /^(?:\(\(\()/, /^(?:[\\(?=\])][\]])/, /^(?:\/(?=\])\])/, /^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/, /^(?:\[\/)/, /^(?:\[\\)/, /^(?:<)/, /^(?:>)/, /^(?:\^)/, /^(?:\\\|)/, /^(?:v\b)/, /^(?:\*)/, /^(?:#)/, /^(?:&)/, /^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/, /^(?:-)/, /^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/, /^(?:\|)/, /^(?:\|)/, /^(?:\))/, /^(?:\()/, /^(?:\])/, /^(?:\[)/, /^(?:(\}))/, /^(?:\{)/, /^(?:[^\[\]\(\)\{\}\|\"]+)/, /^(?:")/, /^(?:(\r?\n)+)/, /^(?:\s)/, /^(?:$)/], + conditions: { "shapeDataEndBracket": { "rules": [21, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "shapeDataStr": { "rules": [9, 10, 21, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "shapeData": { "rules": [8, 11, 12, 21, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "callbackargs": { "rules": [17, 18, 21, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "callbackname": { "rules": [14, 15, 16, 21, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "href": { "rules": [21, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "click": { "rules": [21, 24, 33, 34, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "dottedEdgeText": { "rules": [21, 24, 74, 76, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "thickEdgeText": { "rules": [21, 24, 71, 73, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "edgeText": { "rules": [21, 24, 68, 70, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "trapText": { "rules": [21, 24, 77, 80, 82, 84, 88, 90, 91, 92, 93, 94, 95, 108, 110, 112, 114], "inclusive": false }, "ellipseText": { "rules": [21, 24, 77, 78, 79, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "text": { "rules": [21, 24, 77, 80, 81, 82, 83, 84, 87, 88, 89, 90, 94, 95, 107, 108, 109, 110, 111, 112, 113, 114, 115], "inclusive": false }, "vertex": { "rules": [21, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "dir": { "rules": [21, 24, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "acc_descr_multiline": { "rules": [5, 6, 21, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "acc_descr": { "rules": [3, 21, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "acc_title": { "rules": [1, 21, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "md_string": { "rules": [19, 20, 21, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "string": { "rules": [21, 22, 23, 24, 77, 80, 82, 84, 88, 90, 94, 95, 108, 110, 112, 114], "inclusive": false }, "INITIAL": { "rules": [0, 2, 4, 7, 13, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 39, 40, 41, 42, 43, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72, 74, 75, 77, 80, 82, 84, 85, 86, 88, 90, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 108, 110, 112, 114, 116, 117, 118, 119], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var flow_default = parser; + +// src/diagrams/flowchart/parser/flowParser.ts +var newParser = Object.assign({}, flow_default); +newParser.parse = (src) => { + const newSrc = src.replace(/}\s*\n/g, "}\n"); + return flow_default.parse(newSrc); +}; +var flowParser_default = newParser; + +// src/diagrams/flowchart/styles.ts +import * as khroma from "khroma"; +var fade = /* @__PURE__ */ __name((color, opacity) => { + const channel2 = khroma.channel; + const r = channel2(color, "r"); + const g = channel2(color, "g"); + const b = channel2(color, "b"); + return khroma.rgba(r, g, b, opacity); +}, "fade"); +var getStyles = /* @__PURE__ */ __name((options) => `.label { + font-family: ${options.fontFamily}; + color: ${options.nodeTextColor || options.textColor}; + } + .cluster-label text { + fill: ${options.titleColor}; + } + .cluster-label span { + color: ${options.titleColor}; + } + .cluster-label span p { + background-color: transparent; + } + + .label text,span { + fill: ${options.nodeTextColor || options.textColor}; + color: ${options.nodeTextColor || options.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; + stroke-width: 1px; + } + .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .katex path { + fill: #000; + stroke: #000; + stroke-width: 1px; + } + + .rough-node .label,.node .label, .image-shape .label, .icon-shape .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + + .root .anchor path { + fill: ${options.lineColor} !important; + stroke-width: 0; + stroke: ${options.lineColor}; + } + + .arrowheadPath { + fill: ${options.arrowheadColor}; + } + + .edgePath .path { + stroke: ${options.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${options.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${options.edgeLabelBackground}; + p { + background-color: ${options.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${options.edgeLabelBackground}; + fill: ${options.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${fade(options.edgeLabelBackground, 0.5)}; + // background-color: + } + + .cluster rect { + fill: ${options.clusterBkg}; + stroke: ${options.clusterBorder}; + stroke-width: 1px; + } + + .cluster text { + fill: ${options.titleColor}; + } + + .cluster span { + color: ${options.titleColor}; + } + /* .cluster div { + color: ${options.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${options.fontFamily}; + font-size: 12px; + background: ${options.tertiaryColor}; + border: 1px solid ${options.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${options.textColor}; + } + + rect.text { + fill: none; + stroke-width: 0; + } + + .icon-shape, .image-shape { + background-color: ${options.edgeLabelBackground}; + p { + background-color: ${options.edgeLabelBackground}; + padding: 2px; + } + rect { + opacity: 0.5; + background-color: ${options.edgeLabelBackground}; + fill: ${options.edgeLabelBackground}; + } + text-align: center; + } + ${getIconStyles()} +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/flowchart/flowDiagram.ts +var diagram = { + parser: flowParser_default, + get db() { + return new FlowDB(); + }, + renderer: flowRenderer_v3_unified_default, + styles: styles_default, + init: /* @__PURE__ */ __name((cnf) => { + if (!cnf.flowchart) { + cnf.flowchart = {}; + } + if (cnf.layout) { + setConfig({ layout: cnf.layout }); + } + cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; + setConfig({ flowchart: { arrowMarkerAbsolute: cnf.arrowMarkerAbsolute } }); + }, "init") +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/flowDiagram-NV44I4VS.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/flowDiagram-NV44I4VS.mjs.map new file mode 100644 index 0000000..5f110b7 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/flowDiagram-NV44I4VS.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/flowchart/flowDb.ts", "../../../src/diagrams/flowchart/flowRenderer-v3-unified.ts", "../../../src/diagrams/flowchart/parser/flow.jison", "../../../src/diagrams/flowchart/parser/flowParser.ts", "../../../src/diagrams/flowchart/styles.ts", "../../../src/diagrams/flowchart/flowDiagram.ts"], + "sourcesContent": ["import { select } from 'd3';\nimport * as yaml from 'js-yaml';\nimport { getConfig, defaultConfig } from '../../diagram-api/diagramAPI.js';\nimport type { DiagramDB } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { isValidShape, type ShapeID } from '../../rendering-util/rendering-elements/shapes.js';\nimport type { Edge, Node } from '../../rendering-util/types.js';\nimport type { EdgeMetaData, NodeMetaData } from '../../types.js';\nimport utils, { getEdgeId } from '../../utils.js';\nimport common from '../common/common.js';\nimport {\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n clear as commonClear,\n setDiagramTitle,\n getDiagramTitle,\n} from '../common/commonDb.js';\nimport type {\n FlowClass,\n FlowEdge,\n FlowLink,\n FlowSubGraph,\n FlowText,\n FlowVertex,\n FlowVertexTypeParam,\n} from './types.js';\n\ninterface LinkData {\n id: string;\n}\n\nconst MERMAID_DOM_ID_PREFIX = 'flowchart-';\n\n// We are using arrow functions assigned to class instance fields instead of methods as they are required by flow JISON\nexport class FlowDB implements DiagramDB {\n private vertexCounter = 0;\n private config = getConfig();\n private vertices = new Map();\n private edges: FlowEdge[] & { defaultInterpolate?: string; defaultStyle?: string[] } = [];\n private classes = new Map();\n private subGraphs: FlowSubGraph[] = [];\n private subGraphLookup = new Map();\n private tooltips = new Map();\n private subCount = 0;\n private firstGraphFlag = true;\n private direction: string | undefined;\n private version: string | undefined; // As in graph\n private secCount = -1;\n private posCrossRef: number[] = [];\n\n // Functions to be run after graph rendering\n private funs: ((element: Element) => void)[] = []; // cspell:ignore funs\n\n constructor() {\n this.funs.push(this.setupToolTips.bind(this));\n\n // Needed for JISON since it only supports direct properties\n this.addVertex = this.addVertex.bind(this);\n this.firstGraph = this.firstGraph.bind(this);\n this.setDirection = this.setDirection.bind(this);\n this.addSubGraph = this.addSubGraph.bind(this);\n this.addLink = this.addLink.bind(this);\n this.setLink = this.setLink.bind(this);\n this.updateLink = this.updateLink.bind(this);\n this.addClass = this.addClass.bind(this);\n this.setClass = this.setClass.bind(this);\n this.destructLink = this.destructLink.bind(this);\n this.setClickEvent = this.setClickEvent.bind(this);\n this.setTooltip = this.setTooltip.bind(this);\n this.updateLinkInterpolate = this.updateLinkInterpolate.bind(this);\n this.setClickFun = this.setClickFun.bind(this);\n this.bindFunctions = this.bindFunctions.bind(this);\n\n this.lex = {\n firstGraph: this.firstGraph.bind(this),\n };\n\n this.clear();\n this.setGen('gen-2');\n }\n\n private sanitizeText(txt: string) {\n return common.sanitizeText(txt, this.config);\n }\n\n /**\n * Function to lookup domId from id in the graph definition.\n *\n * @param id - id of the node\n */\n public lookUpDomId(id: string) {\n for (const vertex of this.vertices.values()) {\n if (vertex.id === id) {\n return vertex.domId;\n }\n }\n return id;\n }\n\n /**\n * Function called by parser when a node definition has been found\n */\n public addVertex(\n id: string,\n textObj: FlowText,\n type: FlowVertexTypeParam,\n style: string[],\n classes: string[],\n dir: string,\n props = {},\n metadata: any\n ) {\n if (!id || id.trim().length === 0) {\n return;\n }\n // Extract the metadata from the shapeData, the syntax for adding metadata for nodes and edges is the same\n // so at this point we don't know if it's a node or an edge, but we can still extract the metadata\n let doc;\n if (metadata !== undefined) {\n let yamlData;\n // detect if shapeData contains a newline character\n if (!metadata.includes('\\n')) {\n yamlData = '{\\n' + metadata + '\\n}';\n } else {\n yamlData = metadata + '\\n';\n }\n doc = yaml.load(yamlData, { schema: yaml.JSON_SCHEMA }) as NodeMetaData;\n }\n\n // Check if this is an edge\n const edge = this.edges.find((e) => e.id === id);\n if (edge) {\n const edgeDoc = doc as EdgeMetaData;\n if (edgeDoc?.animate !== undefined) {\n edge.animate = edgeDoc.animate;\n }\n if (edgeDoc?.animation !== undefined) {\n edge.animation = edgeDoc.animation;\n }\n if (edgeDoc?.curve !== undefined) {\n edge.interpolate = edgeDoc.curve;\n }\n return;\n }\n\n let txt;\n\n let vertex = this.vertices.get(id);\n if (vertex === undefined) {\n vertex = {\n id,\n labelType: 'text',\n domId: MERMAID_DOM_ID_PREFIX + id + '-' + this.vertexCounter,\n styles: [],\n classes: [],\n };\n this.vertices.set(id, vertex);\n }\n this.vertexCounter++;\n\n if (textObj !== undefined) {\n this.config = getConfig();\n txt = this.sanitizeText(textObj.text.trim());\n vertex.labelType = textObj.type;\n // strip quotes if string starts and ends with a quote\n if (txt.startsWith('\"') && txt.endsWith('\"')) {\n txt = txt.substring(1, txt.length - 1);\n }\n vertex.text = txt;\n } else {\n if (vertex.text === undefined) {\n vertex.text = id;\n }\n }\n if (type !== undefined) {\n vertex.type = type;\n }\n if (style !== undefined && style !== null) {\n style.forEach((s) => {\n vertex.styles.push(s);\n });\n }\n if (classes !== undefined && classes !== null) {\n classes.forEach((s) => {\n vertex.classes.push(s);\n });\n }\n if (dir !== undefined) {\n vertex.dir = dir;\n }\n if (vertex.props === undefined) {\n vertex.props = props;\n } else if (props !== undefined) {\n Object.assign(vertex.props, props);\n }\n\n if (doc !== undefined) {\n if (doc.shape) {\n if (doc.shape !== doc.shape.toLowerCase() || doc.shape.includes('_')) {\n throw new Error(`No such shape: ${doc.shape}. Shape names should be lowercase.`);\n } else if (!isValidShape(doc.shape)) {\n throw new Error(`No such shape: ${doc.shape}.`);\n }\n vertex.type = doc?.shape;\n }\n\n if (doc?.label) {\n vertex.text = doc?.label;\n }\n if (doc?.icon) {\n vertex.icon = doc?.icon;\n if (!doc.label?.trim() && vertex.text === id) {\n vertex.text = '';\n }\n }\n if (doc?.form) {\n vertex.form = doc?.form;\n }\n if (doc?.pos) {\n vertex.pos = doc?.pos;\n }\n if (doc?.img) {\n vertex.img = doc?.img;\n if (!doc.label?.trim() && vertex.text === id) {\n vertex.text = '';\n }\n }\n if (doc?.constraint) {\n vertex.constraint = doc.constraint;\n }\n if (doc.w) {\n vertex.assetWidth = Number(doc.w);\n }\n if (doc.h) {\n vertex.assetHeight = Number(doc.h);\n }\n }\n }\n\n /**\n * Function called by parser when a link/edge definition has been found\n *\n */\n public addSingleLink(_start: string, _end: string, type: any, id?: string) {\n const start = _start;\n const end = _end;\n\n const edge: FlowEdge = {\n start: start,\n end: end,\n type: undefined,\n text: '',\n labelType: 'text',\n classes: [],\n isUserDefinedId: false,\n interpolate: this.edges.defaultInterpolate,\n };\n log.info('abc78 Got edge...', edge);\n const linkTextObj = type.text;\n\n if (linkTextObj !== undefined) {\n edge.text = this.sanitizeText(linkTextObj.text.trim());\n\n // strip quotes if string starts and ends with a quote\n if (edge.text.startsWith('\"') && edge.text.endsWith('\"')) {\n edge.text = edge.text.substring(1, edge.text.length - 1);\n }\n edge.labelType = linkTextObj.type;\n }\n\n if (type !== undefined) {\n edge.type = type.type;\n edge.stroke = type.stroke;\n edge.length = type.length > 10 ? 10 : type.length;\n }\n if (id && !this.edges.some((e) => e.id === id)) {\n edge.id = id;\n edge.isUserDefinedId = true;\n } else {\n const existingLinks = this.edges.filter((e) => e.start === edge.start && e.end === edge.end);\n if (existingLinks.length === 0) {\n edge.id = getEdgeId(edge.start, edge.end, { counter: 0, prefix: 'L' });\n } else {\n edge.id = getEdgeId(edge.start, edge.end, {\n counter: existingLinks.length + 1,\n prefix: 'L',\n });\n }\n }\n\n if (this.edges.length < (this.config.maxEdges ?? 500)) {\n log.info('Pushing edge...');\n this.edges.push(edge);\n } else {\n throw new Error(\n `Edge limit exceeded. ${this.edges.length} edges found, but the limit is ${this.config.maxEdges}.\n\nInitialize mermaid with maxEdges set to a higher number to allow more edges.\nYou cannot set this config via configuration inside the diagram as it is a secure config.\nYou have to call mermaid.initialize.`\n );\n }\n }\n\n private isLinkData(value: unknown): value is LinkData {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'id' in value &&\n typeof (value as LinkData).id === 'string'\n );\n }\n\n public addLink(_start: string[], _end: string[], linkData: unknown) {\n const id = this.isLinkData(linkData) ? linkData.id.replace('@', '') : undefined;\n\n log.info('addLink', _start, _end, id);\n\n // for a group syntax like A e1@--> B & C, only the first edge should have a userDefined id\n // the rest of the edges should have auto generated ids\n for (const start of _start) {\n for (const end of _end) {\n //use the id only for last node in _start and first node in _end\n const isLastStart = start === _start[_start.length - 1];\n const isFirstEnd = end === _end[0];\n if (isLastStart && isFirstEnd) {\n this.addSingleLink(start, end, linkData, id);\n } else {\n this.addSingleLink(start, end, linkData, undefined);\n }\n }\n }\n }\n\n /**\n * Updates a link's line interpolation algorithm\n */\n public updateLinkInterpolate(positions: ('default' | number)[], interpolate: string) {\n positions.forEach((pos) => {\n if (pos === 'default') {\n this.edges.defaultInterpolate = interpolate;\n } else {\n this.edges[pos].interpolate = interpolate;\n }\n });\n }\n\n /**\n * Updates a link with a style\n *\n */\n public updateLink(positions: ('default' | number)[], style: string[]) {\n positions.forEach((pos) => {\n if (typeof pos === 'number' && pos >= this.edges.length) {\n throw new Error(\n `The index ${pos} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${\n this.edges.length - 1\n }. (Help: Ensure that the index is within the range of existing edges.)`\n );\n }\n if (pos === 'default') {\n this.edges.defaultStyle = style;\n } else {\n this.edges[pos].style = style;\n // if edges[pos].style does have fill not set, set it to none\n if (\n (this.edges[pos]?.style?.length ?? 0) > 0 &&\n !this.edges[pos]?.style?.some((s) => s?.startsWith('fill'))\n ) {\n this.edges[pos]?.style?.push('fill:none');\n }\n }\n });\n }\n\n public addClass(ids: string, _style: string[]) {\n const style = _style\n .join()\n .replace(/\\\\,/g, '\u00A7\u00A7\u00A7')\n .replace(/,/g, ';')\n .replace(/\u00A7\u00A7\u00A7/g, ',')\n .split(';');\n ids.split(',').forEach((id) => {\n let classNode = this.classes.get(id);\n if (classNode === undefined) {\n classNode = { id, styles: [], textStyles: [] };\n this.classes.set(id, classNode);\n }\n\n if (style !== undefined && style !== null) {\n style.forEach((s) => {\n if (/color/.exec(s)) {\n const newStyle = s.replace('fill', 'bgFill'); // .replace('color', 'fill');\n classNode.textStyles.push(newStyle);\n }\n classNode.styles.push(s);\n });\n }\n });\n }\n\n /**\n * Called by parser when a graph definition is found, stores the direction of the chart.\n *\n */\n public setDirection(dir: string) {\n this.direction = dir.trim();\n\n if (/.*/.exec(this.direction)) {\n this.direction = 'LR';\n }\n if (/.*v/.exec(this.direction)) {\n this.direction = 'TB';\n }\n if (this.direction === 'TD') {\n this.direction = 'TB';\n }\n }\n\n /**\n * Called by parser when a special node is found, e.g. a clickable element.\n *\n * @param ids - Comma separated list of ids\n * @param className - Class to add\n */\n public setClass(ids: string, className: string) {\n for (const id of ids.split(',')) {\n const vertex = this.vertices.get(id);\n if (vertex) {\n vertex.classes.push(className);\n }\n const edge = this.edges.find((e) => e.id === id);\n if (edge) {\n edge.classes.push(className);\n }\n const subGraph = this.subGraphLookup.get(id);\n if (subGraph) {\n subGraph.classes.push(className);\n }\n }\n }\n\n public setTooltip(ids: string, tooltip: string) {\n if (tooltip === undefined) {\n return;\n }\n tooltip = this.sanitizeText(tooltip);\n for (const id of ids.split(',')) {\n this.tooltips.set(this.version === 'gen-1' ? this.lookUpDomId(id) : id, tooltip);\n }\n }\n\n private setClickFun(id: string, functionName: string, functionArgs: string) {\n const domId = this.lookUpDomId(id);\n // if (_id[0].match(/\\d/)) id = MERMAID_DOM_ID_PREFIX + id;\n if (getConfig().securityLevel !== 'loose') {\n return;\n }\n if (functionName === undefined) {\n return;\n }\n let argList: string[] = [];\n if (typeof functionArgs === 'string') {\n /* Splits functionArgs by ',', ignoring all ',' in double quoted strings */\n argList = functionArgs.split(/,(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n for (let i = 0; i < argList.length; i++) {\n let item = argList[i].trim();\n /* Removes all double quotes at the start and end of an argument */\n /* This preserves all starting and ending whitespace inside */\n if (item.startsWith('\"') && item.endsWith('\"')) {\n item = item.substr(1, item.length - 2);\n }\n argList[i] = item;\n }\n }\n\n /* if no arguments passed into callback, default to passing in id */\n if (argList.length === 0) {\n argList.push(id);\n }\n\n const vertex = this.vertices.get(id);\n if (vertex) {\n vertex.haveCallback = true;\n this.funs.push(() => {\n const elem = document.querySelector(`[id=\"${domId}\"]`);\n if (elem !== null) {\n elem.addEventListener(\n 'click',\n () => {\n utils.runFunc(functionName, ...argList);\n },\n false\n );\n }\n });\n }\n }\n\n /**\n * Called by parser when a link is found. Adds the URL to the vertex data.\n *\n * @param ids - Comma separated list of ids\n * @param linkStr - URL to create a link for\n * @param target - Target attribute for the link\n */\n public setLink(ids: string, linkStr: string, target: string) {\n ids.split(',').forEach((id) => {\n const vertex = this.vertices.get(id);\n if (vertex !== undefined) {\n vertex.link = utils.formatUrl(linkStr, this.config);\n vertex.linkTarget = target;\n }\n });\n this.setClass(ids, 'clickable');\n }\n\n public getTooltip(id: string) {\n return this.tooltips.get(id);\n }\n\n /**\n * Called by parser when a click definition is found. Registers an event handler.\n *\n * @param ids - Comma separated list of ids\n * @param functionName - Function to be called on click\n * @param functionArgs - Arguments to be passed to the function\n */\n public setClickEvent(ids: string, functionName: string, functionArgs: string) {\n ids.split(',').forEach((id) => {\n this.setClickFun(id, functionName, functionArgs);\n });\n this.setClass(ids, 'clickable');\n }\n\n public bindFunctions(element: Element) {\n this.funs.forEach((fun) => {\n fun(element);\n });\n }\n public getDirection() {\n return this.direction?.trim();\n }\n /**\n * Retrieval function for fetching the found nodes after parsing has completed.\n *\n */\n public getVertices() {\n return this.vertices;\n }\n\n /**\n * Retrieval function for fetching the found links after parsing has completed.\n *\n */\n public getEdges() {\n return this.edges;\n }\n\n /**\n * Retrieval function for fetching the found class definitions after parsing has completed.\n *\n */\n public getClasses() {\n return this.classes;\n }\n\n private setupToolTips(element: Element) {\n let tooltipElem = select('.mermaidTooltip');\n // @ts-ignore TODO: fix this\n if ((tooltipElem._groups || tooltipElem)[0][0] === null) {\n // @ts-ignore TODO: fix this\n tooltipElem = select('body')\n .append('div')\n .attr('class', 'mermaidTooltip')\n .style('opacity', 0);\n }\n\n const svg = select(element).select('svg');\n\n const nodes = svg.selectAll('g.node');\n nodes\n .on('mouseover', (e: MouseEvent) => {\n const el = select(e.currentTarget as Element);\n const title = el.attr('title');\n\n // Don't try to draw a tooltip if no data is provided\n if (title === null) {\n return;\n }\n const rect = (e.currentTarget as Element)?.getBoundingClientRect();\n\n tooltipElem.transition().duration(200).style('opacity', '.9');\n tooltipElem\n .text(el.attr('title'))\n .style('left', window.scrollX + rect.left + (rect.right - rect.left) / 2 + 'px')\n .style('top', window.scrollY + rect.bottom + 'px');\n tooltipElem.html(tooltipElem.html().replace(/<br\\/>/g, '
'));\n el.classed('hover', true);\n })\n .on('mouseout', (e: MouseEvent) => {\n tooltipElem.transition().duration(500).style('opacity', 0);\n const el = select(e.currentTarget as Element);\n el.classed('hover', false);\n });\n }\n\n /**\n * Clears the internal graph db so that a new graph can be parsed.\n *\n */\n public clear(ver = 'gen-2') {\n this.vertices = new Map();\n this.classes = new Map();\n this.edges = [];\n this.funs = [this.setupToolTips.bind(this)];\n this.subGraphs = [];\n this.subGraphLookup = new Map();\n this.subCount = 0;\n this.tooltips = new Map();\n this.firstGraphFlag = true;\n this.version = ver;\n this.config = getConfig();\n commonClear();\n }\n\n public setGen(ver: string) {\n this.version = ver || 'gen-2';\n }\n\n public defaultStyle() {\n return 'fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;';\n }\n\n public addSubGraph(\n _id: { text: string },\n list: string[],\n _title: { text: string; type: string }\n ) {\n let id: string | undefined = _id.text.trim();\n let title = _title.text;\n if (_id === _title && /\\s/.exec(_title.text)) {\n id = undefined;\n }\n\n const uniq = (a: any[]) => {\n const prims: any = { boolean: {}, number: {}, string: {} };\n const objs: any[] = [];\n\n let dir: string | undefined;\n\n const nodeList = a.filter(function (item) {\n const type = typeof item;\n if (item.stmt && item.stmt === 'dir') {\n dir = item.value;\n return false;\n }\n if (item.trim() === '') {\n return false;\n }\n if (type in prims) {\n return prims[type].hasOwnProperty(item) ? false : (prims[type][item] = true);\n } else {\n return objs.includes(item) ? false : objs.push(item);\n }\n });\n return { nodeList, dir };\n };\n\n const result = uniq(list.flat());\n const nodeList = result.nodeList;\n let dir = result.dir;\n const flowchartConfig = getConfig().flowchart ?? {};\n dir =\n dir ??\n (flowchartConfig.inheritDir\n ? (this.getDirection() ?? (getConfig() as any).direction ?? undefined)\n : undefined);\n\n if (this.version === 'gen-1') {\n for (let i = 0; i < nodeList.length; i++) {\n nodeList[i] = this.lookUpDomId(nodeList[i]);\n }\n }\n\n id = id ?? 'subGraph' + this.subCount;\n title = title || '';\n title = this.sanitizeText(title);\n this.subCount = this.subCount + 1;\n\n const subGraph = {\n id: id,\n nodes: nodeList,\n title: title.trim(),\n classes: [],\n dir,\n labelType: _title.type,\n };\n\n log.info('Adding', subGraph.id, subGraph.nodes, subGraph.dir);\n\n // Remove the members in the new subgraph if they already belong to another subgraph\n subGraph.nodes = this.makeUniq(subGraph, this.subGraphs).nodes;\n this.subGraphs.push(subGraph);\n this.subGraphLookup.set(id, subGraph);\n return id;\n }\n\n private getPosForId(id: string) {\n for (const [i, subGraph] of this.subGraphs.entries()) {\n if (subGraph.id === id) {\n return i;\n }\n }\n return -1;\n }\n\n private indexNodes2(id: string, pos: number): { result: boolean; count: number } {\n const nodes = this.subGraphs[pos].nodes;\n this.secCount = this.secCount + 1;\n if (this.secCount > 2000) {\n return {\n result: false,\n count: 0,\n };\n }\n this.posCrossRef[this.secCount] = pos;\n // Check if match\n if (this.subGraphs[pos].id === id) {\n return {\n result: true,\n count: 0,\n };\n }\n\n let count = 0;\n let posCount = 1;\n while (count < nodes.length) {\n const childPos = this.getPosForId(nodes[count]);\n // Ignore regular nodes (pos will be -1)\n if (childPos >= 0) {\n const res = this.indexNodes2(id, childPos);\n if (res.result) {\n return {\n result: true,\n count: posCount + res.count,\n };\n } else {\n posCount = posCount + res.count;\n }\n }\n count = count + 1;\n }\n\n return {\n result: false,\n count: posCount,\n };\n }\n\n public getDepthFirstPos(pos: number) {\n return this.posCrossRef[pos];\n }\n public indexNodes() {\n this.secCount = -1;\n if (this.subGraphs.length > 0) {\n this.indexNodes2('none', this.subGraphs.length - 1);\n }\n }\n\n public getSubGraphs() {\n return this.subGraphs;\n }\n\n public firstGraph() {\n if (this.firstGraphFlag) {\n this.firstGraphFlag = false;\n return true;\n }\n return false;\n }\n\n private destructStartLink(_str: string): FlowLink {\n let str = _str.trim();\n let type = 'arrow_open';\n\n switch (str[0]) {\n case '<':\n type = 'arrow_point';\n str = str.slice(1);\n break;\n case 'x':\n type = 'arrow_cross';\n str = str.slice(1);\n break;\n case 'o':\n type = 'arrow_circle';\n str = str.slice(1);\n break;\n }\n\n let stroke = 'normal';\n\n if (str.includes('=')) {\n stroke = 'thick';\n }\n\n if (str.includes('.')) {\n stroke = 'dotted';\n }\n\n return { type, stroke };\n }\n\n private countChar(char: string, str: string) {\n const length = str.length;\n let count = 0;\n for (let i = 0; i < length; ++i) {\n if (str[i] === char) {\n ++count;\n }\n }\n return count;\n }\n\n private destructEndLink(_str: string) {\n const str = _str.trim();\n let line = str.slice(0, -1);\n let type = 'arrow_open';\n\n switch (str.slice(-1)) {\n case 'x':\n type = 'arrow_cross';\n if (str.startsWith('x')) {\n type = 'double_' + type;\n line = line.slice(1);\n }\n break;\n case '>':\n type = 'arrow_point';\n if (str.startsWith('<')) {\n type = 'double_' + type;\n line = line.slice(1);\n }\n break;\n case 'o':\n type = 'arrow_circle';\n if (str.startsWith('o')) {\n type = 'double_' + type;\n line = line.slice(1);\n }\n break;\n }\n\n let stroke = 'normal';\n let length = line.length - 1;\n\n if (line.startsWith('=')) {\n stroke = 'thick';\n }\n\n if (line.startsWith('~')) {\n stroke = 'invisible';\n }\n\n const dots = this.countChar('.', line);\n\n if (dots) {\n stroke = 'dotted';\n length = dots;\n }\n\n return { type, stroke, length };\n }\n\n public destructLink(_str: string, _startStr: string) {\n const info = this.destructEndLink(_str);\n let startInfo;\n if (_startStr) {\n startInfo = this.destructStartLink(_startStr);\n\n if (startInfo.stroke !== info.stroke) {\n return { type: 'INVALID', stroke: 'INVALID' };\n }\n\n if (startInfo.type === 'arrow_open') {\n // -- xyz --> - take arrow type from ending\n startInfo.type = info.type;\n } else {\n // x-- xyz --> - not supported\n if (startInfo.type !== info.type) {\n return { type: 'INVALID', stroke: 'INVALID' };\n }\n\n startInfo.type = 'double_' + startInfo.type;\n }\n\n if (startInfo.type === 'double_arrow') {\n startInfo.type = 'double_arrow_point';\n }\n\n startInfo.length = info.length;\n return startInfo;\n }\n\n return info;\n }\n\n // Todo optimizer this by caching existing nodes\n public exists(allSgs: FlowSubGraph[], _id: string) {\n for (const sg of allSgs) {\n if (sg.nodes.includes(_id)) {\n return true;\n }\n }\n return false;\n }\n /**\n * Deletes an id from all subgraphs\n *\n */\n public makeUniq(sg: FlowSubGraph, allSubgraphs: FlowSubGraph[]) {\n const res: string[] = [];\n sg.nodes.forEach((_id, pos) => {\n if (!this.exists(allSubgraphs, _id)) {\n res.push(sg.nodes[pos]);\n }\n });\n return { nodes: res };\n }\n\n public lex: { firstGraph: typeof FlowDB.prototype.firstGraph };\n\n private getTypeFromVertex(vertex: FlowVertex): ShapeID {\n if (vertex.img) {\n return 'imageSquare';\n }\n if (vertex.icon) {\n if (vertex.form === 'circle') {\n return 'iconCircle';\n }\n if (vertex.form === 'square') {\n return 'iconSquare';\n }\n if (vertex.form === 'rounded') {\n return 'iconRounded';\n }\n return 'icon';\n }\n switch (vertex.type) {\n case 'square':\n case undefined:\n return 'squareRect';\n case 'round':\n return 'roundedRect';\n case 'ellipse':\n // @ts-expect-error -- Ellipses are broken, see https://github.com/mermaid-js/mermaid/issues/5976\n return 'ellipse';\n default:\n return vertex.type;\n }\n }\n\n private findNode(nodes: Node[], id: string) {\n return nodes.find((node) => node.id === id);\n }\n private destructEdgeType(type: string | undefined) {\n let arrowTypeStart = 'none';\n let arrowTypeEnd = 'arrow_point';\n switch (type) {\n case 'arrow_point':\n case 'arrow_circle':\n case 'arrow_cross':\n arrowTypeEnd = type;\n break;\n\n case 'double_arrow_point':\n case 'double_arrow_circle':\n case 'double_arrow_cross':\n arrowTypeStart = type.replace('double_', '');\n arrowTypeEnd = arrowTypeStart;\n break;\n }\n return { arrowTypeStart, arrowTypeEnd };\n }\n\n private addNodeFromVertex(\n vertex: FlowVertex,\n nodes: Node[],\n parentDB: Map,\n subGraphDB: Map,\n config: any,\n look: string\n ) {\n const parentId = parentDB.get(vertex.id);\n const isGroup = subGraphDB.get(vertex.id) ?? false;\n\n const node = this.findNode(nodes, vertex.id);\n if (node) {\n node.cssStyles = vertex.styles;\n node.cssCompiledStyles = this.getCompiledStyles(vertex.classes);\n node.cssClasses = vertex.classes.join(' ');\n } else {\n const baseNode = {\n id: vertex.id,\n label: vertex.text,\n labelStyle: '',\n parentId,\n padding: config.flowchart?.padding || 8,\n cssStyles: vertex.styles,\n cssCompiledStyles: this.getCompiledStyles(['default', 'node', ...vertex.classes]),\n cssClasses: 'default ' + vertex.classes.join(' '),\n dir: vertex.dir,\n domId: vertex.domId,\n look,\n link: vertex.link,\n linkTarget: vertex.linkTarget,\n tooltip: this.getTooltip(vertex.id),\n icon: vertex.icon,\n pos: vertex.pos,\n img: vertex.img,\n assetWidth: vertex.assetWidth,\n assetHeight: vertex.assetHeight,\n constraint: vertex.constraint,\n };\n if (isGroup) {\n nodes.push({\n ...baseNode,\n isGroup: true,\n shape: 'rect',\n });\n } else {\n nodes.push({\n ...baseNode,\n isGroup: false,\n shape: this.getTypeFromVertex(vertex),\n });\n }\n }\n }\n\n private getCompiledStyles(classDefs: string[]) {\n let compiledStyles: string[] = [];\n for (const customClass of classDefs) {\n const cssClass = this.classes.get(customClass);\n if (cssClass?.styles) {\n compiledStyles = [...compiledStyles, ...(cssClass.styles ?? [])].map((s) => s.trim());\n }\n if (cssClass?.textStyles) {\n compiledStyles = [...compiledStyles, ...(cssClass.textStyles ?? [])].map((s) => s.trim());\n }\n }\n return compiledStyles;\n }\n\n public getData() {\n const config = getConfig();\n const nodes: Node[] = [];\n const edges: Edge[] = [];\n\n const subGraphs = this.getSubGraphs();\n const parentDB = new Map();\n const subGraphDB = new Map();\n\n // Setup the subgraph data for adding nodes\n for (let i = subGraphs.length - 1; i >= 0; i--) {\n const subGraph = subGraphs[i];\n if (subGraph.nodes.length > 0) {\n subGraphDB.set(subGraph.id, true);\n }\n for (const id of subGraph.nodes) {\n parentDB.set(id, subGraph.id);\n }\n }\n\n // Data is setup, add the nodes\n for (let i = subGraphs.length - 1; i >= 0; i--) {\n const subGraph = subGraphs[i];\n nodes.push({\n id: subGraph.id,\n label: subGraph.title,\n labelStyle: '',\n parentId: parentDB.get(subGraph.id),\n padding: 8,\n cssCompiledStyles: this.getCompiledStyles(subGraph.classes),\n cssClasses: subGraph.classes.join(' '),\n shape: 'rect',\n dir: subGraph.dir,\n isGroup: true,\n look: config.look,\n });\n }\n\n const n = this.getVertices();\n n.forEach((vertex) => {\n this.addNodeFromVertex(vertex, nodes, parentDB, subGraphDB, config, config.look || 'classic');\n });\n\n const e = this.getEdges();\n e.forEach((rawEdge, index) => {\n const { arrowTypeStart, arrowTypeEnd } = this.destructEdgeType(rawEdge.type);\n const styles = [...(e.defaultStyle ?? [])];\n\n if (rawEdge.style) {\n styles.push(...rawEdge.style);\n }\n const edge: Edge = {\n id: getEdgeId(rawEdge.start, rawEdge.end, { counter: index, prefix: 'L' }, rawEdge.id),\n isUserDefinedId: rawEdge.isUserDefinedId,\n start: rawEdge.start,\n end: rawEdge.end,\n type: rawEdge.type ?? 'normal',\n label: rawEdge.text,\n labelpos: 'c',\n thickness: rawEdge.stroke,\n minlen: rawEdge.length,\n classes:\n rawEdge?.stroke === 'invisible'\n ? ''\n : 'edge-thickness-normal edge-pattern-solid flowchart-link',\n arrowTypeStart:\n rawEdge?.stroke === 'invisible' || rawEdge?.type === 'arrow_open'\n ? 'none'\n : arrowTypeStart,\n arrowTypeEnd:\n rawEdge?.stroke === 'invisible' || rawEdge?.type === 'arrow_open' ? 'none' : arrowTypeEnd,\n arrowheadStyle: 'fill: #333',\n cssCompiledStyles: this.getCompiledStyles(rawEdge.classes),\n labelStyle: styles,\n style: styles,\n pattern: rawEdge.stroke,\n look: config.look,\n animate: rawEdge.animate,\n animation: rawEdge.animation,\n curve: rawEdge.interpolate || this.edges.defaultInterpolate || config.flowchart?.curve,\n };\n\n edges.push(edge);\n });\n\n return { nodes, edges, other: {}, config };\n }\n\n public defaultConfig() {\n return defaultConfig.flowchart;\n }\n public setAccTitle = setAccTitle;\n public setAccDescription = setAccDescription;\n public setDiagramTitle = setDiagramTitle;\n public getAccTitle = getAccTitle;\n public getAccDescription = getAccDescription;\n public getDiagramTitle = getDiagramTitle;\n}\n", "import { select } from 'd3';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport type { DiagramStyleClassDef } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { getDiagramElement } from '../../rendering-util/insertElementsForSize.js';\nimport { getRegisteredLayoutAlgorithm, render } from '../../rendering-util/render.js';\nimport { setupViewPortForSVG } from '../../rendering-util/setupViewPortForSVG.js';\nimport type { LayoutData } from '../../rendering-util/types.js';\nimport utils from '../../utils.js';\n\nexport const getClasses = function (\n text: string,\n diagramObj: any\n): Map {\n return diagramObj.db.getClasses();\n};\n\nexport const draw = async function (text: string, id: string, _version: string, diag: any) {\n log.info('REF0:');\n log.info('Drawing state diagram (v2)', id);\n const { securityLevel, flowchart: conf, layout } = getConfig();\n\n // Handle root and document for when rendering in sandbox mode\n let sandboxElement;\n if (securityLevel === 'sandbox') {\n sandboxElement = select('#i' + id);\n }\n\n // @ts-ignore - document is always available\n const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0].contentDocument : document;\n\n // The getData method provided in all supported diagrams is used to extract the data from the parsed structure\n // into the Layout data format\n log.debug('Before getData: ');\n const data4Layout = diag.db.getData() as LayoutData;\n log.debug('Data: ', data4Layout);\n // Create the root SVG\n const svg = getDiagramElement(id, securityLevel);\n const direction = diag.db.getDirection();\n\n data4Layout.type = diag.type;\n data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(layout);\n if (data4Layout.layoutAlgorithm === 'dagre' && layout === 'elk') {\n log.warn(\n 'flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback.'\n );\n }\n data4Layout.direction = direction;\n data4Layout.nodeSpacing = conf?.nodeSpacing || 50;\n data4Layout.rankSpacing = conf?.rankSpacing || 50;\n data4Layout.markers = ['point', 'circle', 'cross'];\n\n data4Layout.diagramId = id;\n log.debug('REF1:', data4Layout);\n await render(data4Layout, svg);\n const padding = data4Layout.config.flowchart?.diagramPadding ?? 8;\n utils.insertTitle(\n svg,\n 'flowchartTitleText',\n conf?.titleTopMargin || 0,\n diag.db.getDiagramTitle()\n );\n setupViewPortForSVG(svg, padding, 'flowchart', conf?.useMaxWidth || false);\n\n // If node has a link, wrap it in an anchor SVG object.\n for (const vertex of data4Layout.nodes) {\n const node = select(`#${id} [id=\"${vertex.id}\"]`);\n if (!node || !vertex.link) {\n continue;\n }\n const link = doc.createElementNS('http://www.w3.org/2000/svg', 'a');\n link.setAttributeNS('http://www.w3.org/2000/svg', 'class', vertex.cssClasses);\n link.setAttributeNS('http://www.w3.org/2000/svg', 'rel', 'noopener');\n if (securityLevel === 'sandbox') {\n link.setAttributeNS('http://www.w3.org/2000/svg', 'target', '_top');\n } else if (vertex.linkTarget) {\n link.setAttributeNS('http://www.w3.org/2000/svg', 'target', vertex.linkTarget);\n }\n\n const linkNode = node.insert(function () {\n return link;\n }, ':first-child');\n\n const shape = node.select('.label-container');\n if (shape) {\n linkNode.append(function () {\n return shape.node();\n });\n }\n\n const label = node.select('.label');\n if (label) {\n linkNode.append(function () {\n return label.node();\n });\n }\n }\n};\n\nexport default {\n getClasses,\n draw,\n};\n", "/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,4],$V1=[1,3],$V2=[1,5],$V3=[1,8,9,10,11,27,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],$V4=[2,2],$V5=[1,13],$V6=[1,14],$V7=[1,15],$V8=[1,16],$V9=[1,23],$Va=[1,25],$Vb=[1,26],$Vc=[1,27],$Vd=[1,49],$Ve=[1,48],$Vf=[1,29],$Vg=[1,30],$Vh=[1,31],$Vi=[1,32],$Vj=[1,33],$Vk=[1,44],$Vl=[1,46],$Vm=[1,42],$Vn=[1,47],$Vo=[1,43],$Vp=[1,50],$Vq=[1,45],$Vr=[1,51],$Vs=[1,52],$Vt=[1,34],$Vu=[1,35],$Vv=[1,36],$Vw=[1,37],$Vx=[1,57],$Vy=[1,8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],$Vz=[1,61],$VA=[1,60],$VB=[1,62],$VC=[8,9,11,75,77,78],$VD=[1,78],$VE=[1,91],$VF=[1,96],$VG=[1,95],$VH=[1,92],$VI=[1,88],$VJ=[1,94],$VK=[1,90],$VL=[1,97],$VM=[1,93],$VN=[1,98],$VO=[1,89],$VP=[8,9,10,11,40,75,77,78],$VQ=[8,9,10,11,40,46,75,77,78],$VR=[8,9,10,11,29,40,44,46,48,50,52,54,56,58,60,63,65,67,68,70,75,77,78,89,102,105,106,109,111,114,115,116],$VS=[8,9,11,44,60,75,77,78,89,102,105,106,109,111,114,115,116],$VT=[44,60,89,102,105,106,109,111,114,115,116],$VU=[1,121],$VV=[1,122],$VW=[1,124],$VX=[1,123],$VY=[44,60,62,74,89,102,105,106,109,111,114,115,116],$VZ=[1,133],$V_=[1,147],$V$=[1,148],$V01=[1,149],$V11=[1,150],$V21=[1,135],$V31=[1,137],$V41=[1,141],$V51=[1,142],$V61=[1,143],$V71=[1,144],$V81=[1,145],$V91=[1,146],$Va1=[1,151],$Vb1=[1,152],$Vc1=[1,131],$Vd1=[1,132],$Ve1=[1,139],$Vf1=[1,134],$Vg1=[1,138],$Vh1=[1,136],$Vi1=[8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],$Vj1=[1,154],$Vk1=[1,156],$Vl1=[8,9,11],$Vm1=[8,9,10,11,14,44,60,89,105,106,109,111,114,115,116],$Vn1=[1,176],$Vo1=[1,172],$Vp1=[1,173],$Vq1=[1,177],$Vr1=[1,174],$Vs1=[1,175],$Vt1=[77,116,119],$Vu1=[8,9,10,11,12,14,27,29,32,44,60,75,84,85,86,87,88,89,90,105,109,111,114,115,116],$Vv1=[10,106],$Vw1=[31,49,51,53,55,57,62,64,66,67,69,71,116,117,118],$Vx1=[1,247],$Vy1=[1,245],$Vz1=[1,249],$VA1=[1,243],$VB1=[1,244],$VC1=[1,246],$VD1=[1,248],$VE1=[1,250],$VF1=[1,268],$VG1=[8,9,11,106],$VH1=[8,9,10,11,60,84,105,106,109,110,111,112];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"graphConfig\":4,\"document\":5,\"line\":6,\"statement\":7,\"SEMI\":8,\"NEWLINE\":9,\"SPACE\":10,\"EOF\":11,\"GRAPH\":12,\"NODIR\":13,\"DIR\":14,\"FirstStmtSeparator\":15,\"ending\":16,\"endToken\":17,\"spaceList\":18,\"spaceListNewline\":19,\"vertexStatement\":20,\"separator\":21,\"styleStatement\":22,\"linkStyleStatement\":23,\"classDefStatement\":24,\"classStatement\":25,\"clickStatement\":26,\"subgraph\":27,\"textNoTags\":28,\"SQS\":29,\"text\":30,\"SQE\":31,\"end\":32,\"direction\":33,\"acc_title\":34,\"acc_title_value\":35,\"acc_descr\":36,\"acc_descr_value\":37,\"acc_descr_multiline_value\":38,\"shapeData\":39,\"SHAPE_DATA\":40,\"link\":41,\"node\":42,\"styledVertex\":43,\"AMP\":44,\"vertex\":45,\"STYLE_SEPARATOR\":46,\"idString\":47,\"DOUBLECIRCLESTART\":48,\"DOUBLECIRCLEEND\":49,\"PS\":50,\"PE\":51,\"(-\":52,\"-)\":53,\"STADIUMSTART\":54,\"STADIUMEND\":55,\"SUBROUTINESTART\":56,\"SUBROUTINEEND\":57,\"VERTEX_WITH_PROPS_START\":58,\"NODE_STRING[field]\":59,\"COLON\":60,\"NODE_STRING[value]\":61,\"PIPE\":62,\"CYLINDERSTART\":63,\"CYLINDEREND\":64,\"DIAMOND_START\":65,\"DIAMOND_STOP\":66,\"TAGEND\":67,\"TRAPSTART\":68,\"TRAPEND\":69,\"INVTRAPSTART\":70,\"INVTRAPEND\":71,\"linkStatement\":72,\"arrowText\":73,\"TESTSTR\":74,\"START_LINK\":75,\"edgeText\":76,\"LINK\":77,\"LINK_ID\":78,\"edgeTextToken\":79,\"STR\":80,\"MD_STR\":81,\"textToken\":82,\"keywords\":83,\"STYLE\":84,\"LINKSTYLE\":85,\"CLASSDEF\":86,\"CLASS\":87,\"CLICK\":88,\"DOWN\":89,\"UP\":90,\"textNoTagsToken\":91,\"stylesOpt\":92,\"idString[vertex]\":93,\"idString[class]\":94,\"CALLBACKNAME\":95,\"CALLBACKARGS\":96,\"HREF\":97,\"LINK_TARGET\":98,\"STR[link]\":99,\"STR[tooltip]\":100,\"alphaNum\":101,\"DEFAULT\":102,\"numList\":103,\"INTERPOLATE\":104,\"NUM\":105,\"COMMA\":106,\"style\":107,\"styleComponent\":108,\"NODE_STRING\":109,\"UNIT\":110,\"BRKT\":111,\"PCT\":112,\"idStringToken\":113,\"MINUS\":114,\"MULT\":115,\"UNICODE_TEXT\":116,\"TEXT\":117,\"TAGSTART\":118,\"EDGE_TEXT\":119,\"alphaNumToken\":120,\"direction_tb\":121,\"direction_bt\":122,\"direction_rl\":123,\"direction_lr\":124,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",8:\"SEMI\",9:\"NEWLINE\",10:\"SPACE\",11:\"EOF\",12:\"GRAPH\",13:\"NODIR\",14:\"DIR\",27:\"subgraph\",29:\"SQS\",31:\"SQE\",32:\"end\",34:\"acc_title\",35:\"acc_title_value\",36:\"acc_descr\",37:\"acc_descr_value\",38:\"acc_descr_multiline_value\",40:\"SHAPE_DATA\",44:\"AMP\",46:\"STYLE_SEPARATOR\",48:\"DOUBLECIRCLESTART\",49:\"DOUBLECIRCLEEND\",50:\"PS\",51:\"PE\",52:\"(-\",53:\"-)\",54:\"STADIUMSTART\",55:\"STADIUMEND\",56:\"SUBROUTINESTART\",57:\"SUBROUTINEEND\",58:\"VERTEX_WITH_PROPS_START\",59:\"NODE_STRING[field]\",60:\"COLON\",61:\"NODE_STRING[value]\",62:\"PIPE\",63:\"CYLINDERSTART\",64:\"CYLINDEREND\",65:\"DIAMOND_START\",66:\"DIAMOND_STOP\",67:\"TAGEND\",68:\"TRAPSTART\",69:\"TRAPEND\",70:\"INVTRAPSTART\",71:\"INVTRAPEND\",74:\"TESTSTR\",75:\"START_LINK\",77:\"LINK\",78:\"LINK_ID\",80:\"STR\",81:\"MD_STR\",84:\"STYLE\",85:\"LINKSTYLE\",86:\"CLASSDEF\",87:\"CLASS\",88:\"CLICK\",89:\"DOWN\",90:\"UP\",93:\"idString[vertex]\",94:\"idString[class]\",95:\"CALLBACKNAME\",96:\"CALLBACKARGS\",97:\"HREF\",98:\"LINK_TARGET\",99:\"STR[link]\",100:\"STR[tooltip]\",102:\"DEFAULT\",104:\"INTERPOLATE\",105:\"NUM\",106:\"COMMA\",109:\"NODE_STRING\",110:\"UNIT\",111:\"BRKT\",112:\"PCT\",114:\"MINUS\",115:\"MULT\",116:\"UNICODE_TEXT\",117:\"TEXT\",118:\"TAGSTART\",119:\"EDGE_TEXT\",121:\"direction_tb\",122:\"direction_bt\",123:\"direction_rl\",124:\"direction_lr\"},\nproductions_: [0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[39,2],[39,1],[20,4],[20,3],[20,4],[20,2],[20,2],[20,1],[42,1],[42,6],[42,5],[43,1],[43,3],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,8],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[41,2],[41,3],[41,3],[41,1],[41,3],[41,4],[76,1],[76,2],[76,1],[76,1],[72,1],[72,2],[73,3],[30,1],[30,2],[30,1],[30,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[103,1],[103,3],[92,1],[92,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[82,1],[82,1],[82,1],[82,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[79,1],[79,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[47,1],[47,2],[101,1],[101,2],[33,1],[33,1],[33,1],[33,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 2:\n this.$ = [];\nbreak;\ncase 3:\n\n\t if(!Array.isArray($$[$0]) || $$[$0].length > 0){\n\t $$[$0-1].push($$[$0]);\n\t }\n\t this.$=$$[$0-1];\nbreak;\ncase 4: case 183:\nthis.$=$$[$0];\nbreak;\ncase 11:\n yy.setDirection('TB');this.$ = 'TB';\nbreak;\ncase 12:\n yy.setDirection($$[$0-1]);this.$ = $$[$0-1];\nbreak;\ncase 27:\n this.$=$$[$0-1].nodes\nbreak;\ncase 28: case 29: case 30: case 31: case 32:\nthis.$=[];\nbreak;\ncase 33:\nthis.$=yy.addSubGraph($$[$0-6],$$[$0-1],$$[$0-4]);\nbreak;\ncase 34:\nthis.$=yy.addSubGraph($$[$0-3],$$[$0-1],$$[$0-3]);\nbreak;\ncase 35:\nthis.$=yy.addSubGraph(undefined,$$[$0-1],undefined);\nbreak;\ncase 37:\n this.$=$$[$0].trim();yy.setAccTitle(this.$); \nbreak;\ncase 38: case 39:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 43:\n this.$ = $$[$0-1] + $$[$0]; \nbreak;\ncase 44:\n this.$ = $$[$0]; \nbreak;\ncase 45:\n /* console.warn('vs shapeData',$$[$0-3].stmt,$$[$0-1], $$[$0]);*/ yy.addVertex($$[$0-1][$$[$0-1].length-1],undefined,undefined,undefined, undefined,undefined, undefined,$$[$0]); yy.addLink($$[$0-3].stmt,$$[$0-1],$$[$0-2]); this.$ = { stmt: $$[$0-1], nodes: $$[$0-1].concat($$[$0-3].nodes) } \nbreak;\ncase 46:\n /*console.warn('vs',$$[$0-2].stmt,$$[$0]);*/ yy.addLink($$[$0-2].stmt,$$[$0],$$[$0-1]); this.$ = { stmt: $$[$0], nodes: $$[$0].concat($$[$0-2].nodes) } \nbreak;\ncase 47:\n /* console.warn('vs',$$[$0-3].stmt,$$[$0-1]); */ yy.addLink($$[$0-3].stmt,$$[$0-1],$$[$0-2]); this.$ = { stmt: $$[$0-1], nodes: $$[$0-1].concat($$[$0-3].nodes) } \nbreak;\ncase 48:\n /*console.warn('vertexStatement: node spaceList', $$[$0-1]);*/ this.$ = {stmt: $$[$0-1], nodes:$$[$0-1] }\nbreak;\ncase 49:\n\n /*console.warn('vertexStatement: node shapeData', $$[$0-1][0], $$[$0]);*/\n yy.addVertex($$[$0-1][$$[$0-1].length-1],undefined,undefined,undefined, undefined,undefined, undefined,$$[$0]);\n this.$ = {stmt: $$[$0-1], nodes:$$[$0-1], shapeData: $$[$0]}\n \nbreak;\ncase 50:\n /* console.warn('vertexStatement: single node', $$[$0]); */ this.$ = {stmt: $$[$0], nodes:$$[$0] }\nbreak;\ncase 51:\n /*console.warn('nod', $$[$0]);*/ this.$ = [$$[$0]];\nbreak;\ncase 52:\n yy.addVertex($$[$0-5][$$[$0-5].length-1],undefined,undefined,undefined, undefined,undefined, undefined,$$[$0-4]); this.$ = $$[$0-5].concat($$[$0]); /*console.warn('pip2', $$[$0-5][0], $$[$0], this.$);*/ \nbreak;\ncase 53:\n this.$ = $$[$0-4].concat($$[$0]); /*console.warn('pip', $$[$0-4][0], $$[$0], this.$);*/ \nbreak;\ncase 54:\n /* console.warn('nodc', $$[$0]);*/ this.$ = $$[$0];\nbreak;\ncase 55:\nthis.$ = $$[$0-2];yy.setClass($$[$0-2],$$[$0])\nbreak;\ncase 56:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'square');\nbreak;\ncase 57:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'doublecircle');\nbreak;\ncase 58:\nthis.$ = $$[$0-5];yy.addVertex($$[$0-5],$$[$0-2],'circle');\nbreak;\ncase 59:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'ellipse');\nbreak;\ncase 60:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'stadium');\nbreak;\ncase 61:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'subroutine');\nbreak;\ncase 62:\nthis.$ = $$[$0-7];yy.addVertex($$[$0-7],$$[$0-1],'rect',undefined,undefined,undefined, Object.fromEntries([[$$[$0-5], $$[$0-3]]]));\nbreak;\ncase 63:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'cylinder');\nbreak;\ncase 64:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'round');\nbreak;\ncase 65:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'diamond');\nbreak;\ncase 66:\nthis.$ = $$[$0-5];yy.addVertex($$[$0-5],$$[$0-2],'hexagon');\nbreak;\ncase 67:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'odd');\nbreak;\ncase 68:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'trapezoid');\nbreak;\ncase 69:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'inv_trapezoid');\nbreak;\ncase 70:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'lean_right');\nbreak;\ncase 71:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'lean_left');\nbreak;\ncase 72:\n /*console.warn('h: ', $$[$0]);*/this.$ = $$[$0];yy.addVertex($$[$0]);\nbreak;\ncase 73:\n$$[$0-1].text = $$[$0];this.$ = $$[$0-1];\nbreak;\ncase 74: case 75:\n$$[$0-2].text = $$[$0-1];this.$ = $$[$0-2];\nbreak;\ncase 76:\nthis.$ = $$[$0];\nbreak;\ncase 77:\nvar inf = yy.destructLink($$[$0], $$[$0-2]); this.$ = {\"type\":inf.type,\"stroke\":inf.stroke,\"length\":inf.length,\"text\":$$[$0-1]};\nbreak;\ncase 78:\nvar inf = yy.destructLink($$[$0], $$[$0-2]); this.$ = {\"type\":inf.type,\"stroke\":inf.stroke,\"length\":inf.length,\"text\":$$[$0-1], \"id\": $$[$0-3]};\nbreak;\ncase 79:\nthis.$={text:$$[$0], type:'text'};\nbreak;\ncase 80:\nthis.$={text:$$[$0-1].text+''+$$[$0], type:$$[$0-1].type};\nbreak;\ncase 81:\nthis.$={text: $$[$0], type: 'string'};\nbreak;\ncase 82:\nthis.$={text:$$[$0], type:'markdown'};\nbreak;\ncase 83:\nvar inf = yy.destructLink($$[$0]);this.$ = {\"type\":inf.type,\"stroke\":inf.stroke,\"length\":inf.length};\nbreak;\ncase 84:\nvar inf = yy.destructLink($$[$0]);this.$ = {\"type\":inf.type,\"stroke\":inf.stroke,\"length\":inf.length, \"id\": $$[$0-1]};\nbreak;\ncase 85:\nthis.$ = $$[$0-1];\nbreak;\ncase 86:\n this.$={text:$$[$0], type: 'text'};\nbreak;\ncase 87:\n this.$={text:$$[$0-1].text+''+$$[$0], type: $$[$0-1].type};\nbreak;\ncase 88:\n this.$ = {text: $$[$0], type: 'string'};\nbreak;\ncase 89: case 104:\n this.$={text: $$[$0], type: 'markdown'};\nbreak;\ncase 101:\nthis.$={text:$$[$0], type: 'text'};\nbreak;\ncase 102:\nthis.$={text:$$[$0-1].text+''+$$[$0], type: $$[$0-1].type};\nbreak;\ncase 103:\n this.$={text: $$[$0], type: 'text'};\nbreak;\ncase 105:\nthis.$ = $$[$0-4];yy.addClass($$[$0-2],$$[$0]);\nbreak;\ncase 106:\nthis.$ = $$[$0-4];yy.setClass($$[$0-2], $$[$0]);\nbreak;\ncase 107: case 115:\nthis.$ = $$[$0-1];yy.setClickEvent($$[$0-1], $$[$0]);\nbreak;\ncase 108: case 116:\nthis.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-2]);yy.setTooltip($$[$0-3], $$[$0]);\nbreak;\ncase 109:\nthis.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]);\nbreak;\ncase 110:\nthis.$ = $$[$0-4];yy.setClickEvent($$[$0-4], $$[$0-3], $$[$0-2]);yy.setTooltip($$[$0-4], $$[$0]);\nbreak;\ncase 111:\nthis.$ = $$[$0-2];yy.setLink($$[$0-2], $$[$0]);\nbreak;\ncase 112:\nthis.$ = $$[$0-4];yy.setLink($$[$0-4], $$[$0-2]);yy.setTooltip($$[$0-4], $$[$0]);\nbreak;\ncase 113:\nthis.$ = $$[$0-4];yy.setLink($$[$0-4], $$[$0-2], $$[$0]);\nbreak;\ncase 114:\nthis.$ = $$[$0-6];yy.setLink($$[$0-6], $$[$0-4], $$[$0]);yy.setTooltip($$[$0-6], $$[$0-2]);\nbreak;\ncase 117:\nthis.$ = $$[$0-1];yy.setLink($$[$0-1], $$[$0]);\nbreak;\ncase 118:\nthis.$ = $$[$0-3];yy.setLink($$[$0-3], $$[$0-2]);yy.setTooltip($$[$0-3], $$[$0]);\nbreak;\ncase 119:\nthis.$ = $$[$0-3];yy.setLink($$[$0-3], $$[$0-2], $$[$0]);\nbreak;\ncase 120:\nthis.$ = $$[$0-5];yy.setLink($$[$0-5], $$[$0-4], $$[$0]);yy.setTooltip($$[$0-5], $$[$0-2]);\nbreak;\ncase 121:\nthis.$ = $$[$0-4];yy.addVertex($$[$0-2],undefined,undefined,$$[$0]);\nbreak;\ncase 122:\nthis.$ = $$[$0-4];yy.updateLink([$$[$0-2]],$$[$0]);\nbreak;\ncase 123:\nthis.$ = $$[$0-4];yy.updateLink($$[$0-2],$$[$0]);\nbreak;\ncase 124:\nthis.$ = $$[$0-8];yy.updateLinkInterpolate([$$[$0-6]],$$[$0-2]);yy.updateLink([$$[$0-6]],$$[$0]);\nbreak;\ncase 125:\nthis.$ = $$[$0-8];yy.updateLinkInterpolate($$[$0-6],$$[$0-2]);yy.updateLink($$[$0-6],$$[$0]);\nbreak;\ncase 126:\nthis.$ = $$[$0-6];yy.updateLinkInterpolate([$$[$0-4]],$$[$0]);\nbreak;\ncase 127:\nthis.$ = $$[$0-6];yy.updateLinkInterpolate($$[$0-4],$$[$0]);\nbreak;\ncase 128: case 130:\nthis.$ = [$$[$0]]\nbreak;\ncase 129: case 131:\n$$[$0-2].push($$[$0]);this.$ = $$[$0-2];\nbreak;\ncase 133:\nthis.$ = $$[$0-1] + $$[$0];\nbreak;\ncase 181:\nthis.$=$$[$0]\nbreak;\ncase 182:\nthis.$=$$[$0-1]+''+$$[$0]\nbreak;\ncase 184:\nthis.$=$$[$0-1]+''+$$[$0];\nbreak;\ncase 185:\n this.$={stmt:'dir', value:'TB'};\nbreak;\ncase 186:\n this.$={stmt:'dir', value:'BT'};\nbreak;\ncase 187:\n this.$={stmt:'dir', value:'RL'};\nbreak;\ncase 188:\n this.$={stmt:'dir', value:'LR'};\nbreak;\n}\n},\ntable: [{3:1,4:2,9:$V0,10:$V1,12:$V2},{1:[3]},o($V3,$V4,{5:6}),{4:7,9:$V0,10:$V1,12:$V2},{4:8,9:$V0,10:$V1,12:$V2},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:$V5,9:$V6,10:$V7,11:$V8,20:17,22:18,23:19,24:20,25:21,26:22,27:$V9,33:24,34:$Va,36:$Vb,38:$Vc,42:28,43:38,44:$Vd,45:39,47:40,60:$Ve,84:$Vf,85:$Vg,86:$Vh,87:$Vi,88:$Vj,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs,121:$Vt,122:$Vu,123:$Vv,124:$Vw},o($V3,[2,9]),o($V3,[2,10]),o($V3,[2,11]),{8:[1,54],9:[1,55],10:$Vx,15:53,18:56},o($Vy,[2,3]),o($Vy,[2,4]),o($Vy,[2,5]),o($Vy,[2,6]),o($Vy,[2,7]),o($Vy,[2,8]),{8:$Vz,9:$VA,11:$VB,21:58,41:59,72:63,75:[1,64],77:[1,66],78:[1,65]},{8:$Vz,9:$VA,11:$VB,21:67},{8:$Vz,9:$VA,11:$VB,21:68},{8:$Vz,9:$VA,11:$VB,21:69},{8:$Vz,9:$VA,11:$VB,21:70},{8:$Vz,9:$VA,11:$VB,21:71},{8:$Vz,9:$VA,10:[1,72],11:$VB,21:73},o($Vy,[2,36]),{35:[1,74]},{37:[1,75]},o($Vy,[2,39]),o($VC,[2,50],{18:76,39:77,10:$Vx,40:$VD}),{10:[1,79]},{10:[1,80]},{10:[1,81]},{10:[1,82]},{14:$VE,44:$VF,60:$VG,80:[1,86],89:$VH,95:[1,83],97:[1,84],101:85,105:$VI,106:$VJ,109:$VK,111:$VL,114:$VM,115:$VN,116:$VO,120:87},o($Vy,[2,185]),o($Vy,[2,186]),o($Vy,[2,187]),o($Vy,[2,188]),o($VP,[2,51]),o($VP,[2,54],{46:[1,99]}),o($VQ,[2,72],{113:112,29:[1,100],44:$Vd,48:[1,101],50:[1,102],52:[1,103],54:[1,104],56:[1,105],58:[1,106],60:$Ve,63:[1,107],65:[1,108],67:[1,109],68:[1,110],70:[1,111],89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,114:$Vq,115:$Vr,116:$Vs}),o($VR,[2,181]),o($VR,[2,142]),o($VR,[2,143]),o($VR,[2,144]),o($VR,[2,145]),o($VR,[2,146]),o($VR,[2,147]),o($VR,[2,148]),o($VR,[2,149]),o($VR,[2,150]),o($VR,[2,151]),o($VR,[2,152]),o($V3,[2,12]),o($V3,[2,18]),o($V3,[2,19]),{9:[1,113]},o($VS,[2,26],{18:114,10:$Vx}),o($Vy,[2,27]),{42:115,43:38,44:$Vd,45:39,47:40,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs},o($Vy,[2,40]),o($Vy,[2,41]),o($Vy,[2,42]),o($VT,[2,76],{73:116,62:[1,118],74:[1,117]}),{76:119,79:120,80:$VU,81:$VV,116:$VW,119:$VX},{75:[1,125],77:[1,126]},o($VY,[2,83]),o($Vy,[2,28]),o($Vy,[2,29]),o($Vy,[2,30]),o($Vy,[2,31]),o($Vy,[2,32]),{10:$VZ,12:$V_,14:$V$,27:$V01,28:127,32:$V11,44:$V21,60:$V31,75:$V41,80:[1,129],81:[1,130],83:140,84:$V51,85:$V61,86:$V71,87:$V81,88:$V91,89:$Va1,90:$Vb1,91:128,105:$Vc1,109:$Vd1,111:$Ve1,114:$Vf1,115:$Vg1,116:$Vh1},o($Vi1,$V4,{5:153}),o($Vy,[2,37]),o($Vy,[2,38]),o($VC,[2,48],{44:$Vj1}),o($VC,[2,49],{18:155,10:$Vx,40:$Vk1}),o($VP,[2,44]),{44:$Vd,47:157,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs},{102:[1,158],103:159,105:[1,160]},{44:$Vd,47:161,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs},{44:$Vd,47:162,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs},o($Vl1,[2,107],{10:[1,163],96:[1,164]}),{80:[1,165]},o($Vl1,[2,115],{120:167,10:[1,166],14:$VE,44:$VF,60:$VG,89:$VH,105:$VI,106:$VJ,109:$VK,111:$VL,114:$VM,115:$VN,116:$VO}),o($Vl1,[2,117],{10:[1,168]}),o($Vm1,[2,183]),o($Vm1,[2,170]),o($Vm1,[2,171]),o($Vm1,[2,172]),o($Vm1,[2,173]),o($Vm1,[2,174]),o($Vm1,[2,175]),o($Vm1,[2,176]),o($Vm1,[2,177]),o($Vm1,[2,178]),o($Vm1,[2,179]),o($Vm1,[2,180]),{44:$Vd,47:169,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs},{30:170,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{30:178,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{30:180,50:[1,179],67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{30:181,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{30:182,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{30:183,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{109:[1,184]},{30:185,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{30:186,65:[1,187],67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{30:188,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{30:189,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{30:190,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},o($VR,[2,182]),o($V3,[2,20]),o($VS,[2,25]),o($VC,[2,46],{39:191,18:192,10:$Vx,40:$VD}),o($VT,[2,73],{10:[1,193]}),{10:[1,194]},{30:195,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{77:[1,196],79:197,116:$VW,119:$VX},o($Vt1,[2,79]),o($Vt1,[2,81]),o($Vt1,[2,82]),o($Vt1,[2,168]),o($Vt1,[2,169]),{76:198,79:120,80:$VU,81:$VV,116:$VW,119:$VX},o($VY,[2,84]),{8:$Vz,9:$VA,10:$VZ,11:$VB,12:$V_,14:$V$,21:200,27:$V01,29:[1,199],32:$V11,44:$V21,60:$V31,75:$V41,83:140,84:$V51,85:$V61,86:$V71,87:$V81,88:$V91,89:$Va1,90:$Vb1,91:201,105:$Vc1,109:$Vd1,111:$Ve1,114:$Vf1,115:$Vg1,116:$Vh1},o($Vu1,[2,101]),o($Vu1,[2,103]),o($Vu1,[2,104]),o($Vu1,[2,157]),o($Vu1,[2,158]),o($Vu1,[2,159]),o($Vu1,[2,160]),o($Vu1,[2,161]),o($Vu1,[2,162]),o($Vu1,[2,163]),o($Vu1,[2,164]),o($Vu1,[2,165]),o($Vu1,[2,166]),o($Vu1,[2,167]),o($Vu1,[2,90]),o($Vu1,[2,91]),o($Vu1,[2,92]),o($Vu1,[2,93]),o($Vu1,[2,94]),o($Vu1,[2,95]),o($Vu1,[2,96]),o($Vu1,[2,97]),o($Vu1,[2,98]),o($Vu1,[2,99]),o($Vu1,[2,100]),{6:11,7:12,8:$V5,9:$V6,10:$V7,11:$V8,20:17,22:18,23:19,24:20,25:21,26:22,27:$V9,32:[1,202],33:24,34:$Va,36:$Vb,38:$Vc,42:28,43:38,44:$Vd,45:39,47:40,60:$Ve,84:$Vf,85:$Vg,86:$Vh,87:$Vi,88:$Vj,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs,121:$Vt,122:$Vu,123:$Vv,124:$Vw},{10:$Vx,18:203},{44:[1,204]},o($VP,[2,43]),{10:[1,205],44:$Vd,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:112,114:$Vq,115:$Vr,116:$Vs},{10:[1,206]},{10:[1,207],106:[1,208]},o($Vv1,[2,128]),{10:[1,209],44:$Vd,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:112,114:$Vq,115:$Vr,116:$Vs},{10:[1,210],44:$Vd,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:112,114:$Vq,115:$Vr,116:$Vs},{80:[1,211]},o($Vl1,[2,109],{10:[1,212]}),o($Vl1,[2,111],{10:[1,213]}),{80:[1,214]},o($Vm1,[2,184]),{80:[1,215],98:[1,216]},o($VP,[2,55],{113:112,44:$Vd,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,114:$Vq,115:$Vr,116:$Vs}),{31:[1,217],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},o($Vw1,[2,86]),o($Vw1,[2,88]),o($Vw1,[2,89]),o($Vw1,[2,153]),o($Vw1,[2,154]),o($Vw1,[2,155]),o($Vw1,[2,156]),{49:[1,219],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},{30:220,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{51:[1,221],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},{53:[1,222],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},{55:[1,223],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},{57:[1,224],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},{60:[1,225]},{64:[1,226],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},{66:[1,227],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},{30:228,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},{31:[1,229],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},{67:$Vn1,69:[1,230],71:[1,231],82:218,116:$Vq1,117:$Vr1,118:$Vs1},{67:$Vn1,69:[1,233],71:[1,232],82:218,116:$Vq1,117:$Vr1,118:$Vs1},o($VC,[2,45],{18:155,10:$Vx,40:$Vk1}),o($VC,[2,47],{44:$Vj1}),o($VT,[2,75]),o($VT,[2,74]),{62:[1,234],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},o($VT,[2,77]),o($Vt1,[2,80]),{77:[1,235],79:197,116:$VW,119:$VX},{30:236,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},o($Vi1,$V4,{5:237}),o($Vu1,[2,102]),o($Vy,[2,35]),{43:238,44:$Vd,45:39,47:40,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs},{10:$Vx,18:239},{10:$Vx1,60:$Vy1,84:$Vz1,92:240,105:$VA1,107:241,108:242,109:$VB1,110:$VC1,111:$VD1,112:$VE1},{10:$Vx1,60:$Vy1,84:$Vz1,92:251,104:[1,252],105:$VA1,107:241,108:242,109:$VB1,110:$VC1,111:$VD1,112:$VE1},{10:$Vx1,60:$Vy1,84:$Vz1,92:253,104:[1,254],105:$VA1,107:241,108:242,109:$VB1,110:$VC1,111:$VD1,112:$VE1},{105:[1,255]},{10:$Vx1,60:$Vy1,84:$Vz1,92:256,105:$VA1,107:241,108:242,109:$VB1,110:$VC1,111:$VD1,112:$VE1},{44:$Vd,47:257,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs},o($Vl1,[2,108]),{80:[1,258]},{80:[1,259],98:[1,260]},o($Vl1,[2,116]),o($Vl1,[2,118],{10:[1,261]}),o($Vl1,[2,119]),o($VQ,[2,56]),o($Vw1,[2,87]),o($VQ,[2,57]),{51:[1,262],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},o($VQ,[2,64]),o($VQ,[2,59]),o($VQ,[2,60]),o($VQ,[2,61]),{109:[1,263]},o($VQ,[2,63]),o($VQ,[2,65]),{66:[1,264],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},o($VQ,[2,67]),o($VQ,[2,68]),o($VQ,[2,70]),o($VQ,[2,69]),o($VQ,[2,71]),o([10,44,60,89,102,105,106,109,111,114,115,116],[2,85]),o($VT,[2,78]),{31:[1,265],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},{6:11,7:12,8:$V5,9:$V6,10:$V7,11:$V8,20:17,22:18,23:19,24:20,25:21,26:22,27:$V9,32:[1,266],33:24,34:$Va,36:$Vb,38:$Vc,42:28,43:38,44:$Vd,45:39,47:40,60:$Ve,84:$Vf,85:$Vg,86:$Vh,87:$Vi,88:$Vj,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs,121:$Vt,122:$Vu,123:$Vv,124:$Vw},o($VP,[2,53]),{43:267,44:$Vd,45:39,47:40,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs},o($Vl1,[2,121],{106:$VF1}),o($VG1,[2,130],{108:269,10:$Vx1,60:$Vy1,84:$Vz1,105:$VA1,109:$VB1,110:$VC1,111:$VD1,112:$VE1}),o($VH1,[2,132]),o($VH1,[2,134]),o($VH1,[2,135]),o($VH1,[2,136]),o($VH1,[2,137]),o($VH1,[2,138]),o($VH1,[2,139]),o($VH1,[2,140]),o($VH1,[2,141]),o($Vl1,[2,122],{106:$VF1}),{10:[1,270]},o($Vl1,[2,123],{106:$VF1}),{10:[1,271]},o($Vv1,[2,129]),o($Vl1,[2,105],{106:$VF1}),o($Vl1,[2,106],{113:112,44:$Vd,60:$Ve,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,114:$Vq,115:$Vr,116:$Vs}),o($Vl1,[2,110]),o($Vl1,[2,112],{10:[1,272]}),o($Vl1,[2,113]),{98:[1,273]},{51:[1,274]},{62:[1,275]},{66:[1,276]},{8:$Vz,9:$VA,11:$VB,21:277},o($Vy,[2,34]),o($VP,[2,52]),{10:$Vx1,60:$Vy1,84:$Vz1,105:$VA1,107:278,108:242,109:$VB1,110:$VC1,111:$VD1,112:$VE1},o($VH1,[2,133]),{14:$VE,44:$VF,60:$VG,89:$VH,101:279,105:$VI,106:$VJ,109:$VK,111:$VL,114:$VM,115:$VN,116:$VO,120:87},{14:$VE,44:$VF,60:$VG,89:$VH,101:280,105:$VI,106:$VJ,109:$VK,111:$VL,114:$VM,115:$VN,116:$VO,120:87},{98:[1,281]},o($Vl1,[2,120]),o($VQ,[2,58]),{30:282,67:$Vn1,80:$Vo1,81:$Vp1,82:171,116:$Vq1,117:$Vr1,118:$Vs1},o($VQ,[2,66]),o($Vi1,$V4,{5:283}),o($VG1,[2,131],{108:269,10:$Vx1,60:$Vy1,84:$Vz1,105:$VA1,109:$VB1,110:$VC1,111:$VD1,112:$VE1}),o($Vl1,[2,126],{120:167,10:[1,284],14:$VE,44:$VF,60:$VG,89:$VH,105:$VI,106:$VJ,109:$VK,111:$VL,114:$VM,115:$VN,116:$VO}),o($Vl1,[2,127],{120:167,10:[1,285],14:$VE,44:$VF,60:$VG,89:$VH,105:$VI,106:$VJ,109:$VK,111:$VL,114:$VM,115:$VN,116:$VO}),o($Vl1,[2,114]),{31:[1,286],67:$Vn1,82:218,116:$Vq1,117:$Vr1,118:$Vs1},{6:11,7:12,8:$V5,9:$V6,10:$V7,11:$V8,20:17,22:18,23:19,24:20,25:21,26:22,27:$V9,32:[1,287],33:24,34:$Va,36:$Vb,38:$Vc,42:28,43:38,44:$Vd,45:39,47:40,60:$Ve,84:$Vf,85:$Vg,86:$Vh,87:$Vi,88:$Vj,89:$Vk,102:$Vl,105:$Vm,106:$Vn,109:$Vo,111:$Vp,113:41,114:$Vq,115:$Vr,116:$Vs,121:$Vt,122:$Vu,123:$Vv,124:$Vw},{10:$Vx1,60:$Vy1,84:$Vz1,92:288,105:$VA1,107:241,108:242,109:$VB1,110:$VC1,111:$VD1,112:$VE1},{10:$Vx1,60:$Vy1,84:$Vz1,92:289,105:$VA1,107:241,108:242,109:$VB1,110:$VC1,111:$VD1,112:$VE1},o($VQ,[2,62]),o($Vy,[2,33]),o($Vl1,[2,124],{106:$VF1}),o($Vl1,[2,125],{106:$VF1})],\ndefaultActions: {},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin(\"acc_title\");return 34; \nbreak;\ncase 1: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 2: this.begin(\"acc_descr\");return 36; \nbreak;\ncase 3: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 4: this.begin(\"acc_descr_multiline\");\nbreak;\ncase 5: this.popState(); \nbreak;\ncase 6:return \"acc_descr_multiline_value\";\nbreak;\ncase 7:\n // console.log('=> shapeData', yy_.yytext);\n this.pushState(\"shapeData\"); yy_.yytext=\"\"; return 40 \nbreak;\ncase 8:\n // console.log('=> shapeDataStr', yy_.yytext);\n this.pushState(\"shapeDataStr\");\n return 40;\n \nbreak;\ncase 9:\n // console.log('shapeData <==', yy_.yytext);\n this.popState(); return 40\nbreak;\ncase 10:\n // console.log('shapeData', yy_.yytext);\n const re = /\\n\\s*/g;\n yy_.yytext = yy_.yytext.replace(re,\"
\");\n return 40\nbreak;\ncase 11:\n // console.log('shapeData', yy_.yytext);\n return 40;\n \nbreak;\ncase 12:\n // console.log('<== root', yy_.yytext)\n this.popState();\n \nbreak;\ncase 13:this.begin(\"callbackname\");\nbreak;\ncase 14:this.popState();\nbreak;\ncase 15:this.popState(); this.begin(\"callbackargs\");\nbreak;\ncase 16:return 95;\nbreak;\ncase 17:this.popState();\nbreak;\ncase 18:return 96;\nbreak;\ncase 19: return \"MD_STR\";\nbreak;\ncase 20: this.popState();\nbreak;\ncase 21: this.begin(\"md_string\");\nbreak;\ncase 22: return \"STR\"; \nbreak;\ncase 23:this.popState();\nbreak;\ncase 24:this.pushState(\"string\");\nbreak;\ncase 25:return 84;\nbreak;\ncase 26:return 102;\nbreak;\ncase 27:return 85;\nbreak;\ncase 28:return 104;\nbreak;\ncase 29:return 86;\nbreak;\ncase 30:return 87;\nbreak;\ncase 31:return 97;\nbreak;\ncase 32:this.begin(\"click\");\nbreak;\ncase 33:this.popState();\nbreak;\ncase 34:return 88;\nbreak;\ncase 35:if(yy.lex.firstGraph()){this.begin(\"dir\");} return 12;\nbreak;\ncase 36:if(yy.lex.firstGraph()){this.begin(\"dir\");} return 12;\nbreak;\ncase 37:if(yy.lex.firstGraph()){this.begin(\"dir\");} return 12;\nbreak;\ncase 38:return 27;\nbreak;\ncase 39:return 32;\nbreak;\ncase 40:return 98;\nbreak;\ncase 41:return 98;\nbreak;\ncase 42:return 98;\nbreak;\ncase 43:return 98;\nbreak;\ncase 44: this.popState(); return 13; \nbreak;\ncase 45: this.popState(); return 14; \nbreak;\ncase 46: this.popState(); return 14; \nbreak;\ncase 47: this.popState(); return 14; \nbreak;\ncase 48: this.popState(); return 14; \nbreak;\ncase 49: this.popState(); return 14; \nbreak;\ncase 50: this.popState(); return 14; \nbreak;\ncase 51: this.popState(); return 14; \nbreak;\ncase 52: this.popState(); return 14; \nbreak;\ncase 53: this.popState(); return 14; \nbreak;\ncase 54: this.popState(); return 14; \nbreak;\ncase 55:return 121;\nbreak;\ncase 56:return 122;\nbreak;\ncase 57:return 123;\nbreak;\ncase 58:return 124;\nbreak;\ncase 59: return 78; \nbreak;\ncase 60:return 105;\nbreak;\ncase 61:return 111;\nbreak;\ncase 62:return 46;\nbreak;\ncase 63:return 60;\nbreak;\ncase 64:return 44;\nbreak;\ncase 65:return 8;\nbreak;\ncase 66:return 106;\nbreak;\ncase 67:return 115;\nbreak;\ncase 68: this.popState(); return 77; \nbreak;\ncase 69: this.pushState(\"edgeText\"); return 75; \nbreak;\ncase 70:return 119;\nbreak;\ncase 71: this.popState(); return 77; \nbreak;\ncase 72: this.pushState(\"thickEdgeText\"); return 75; \nbreak;\ncase 73:return 119;\nbreak;\ncase 74: this.popState(); return 77; \nbreak;\ncase 75: this.pushState(\"dottedEdgeText\"); return 75; \nbreak;\ncase 76:return 119;\nbreak;\ncase 77:return 77;\nbreak;\ncase 78: this.popState(); return 53; \nbreak;\ncase 79:return \"TEXT\"\nbreak;\ncase 80: this.pushState(\"ellipseText\"); return 52; \nbreak;\ncase 81: this.popState(); return 55; \nbreak;\ncase 82: this.pushState(\"text\"); return 54; \nbreak;\ncase 83: this.popState(); return 57; \nbreak;\ncase 84: this.pushState(\"text\"); return 56; \nbreak;\ncase 85: return 58; \nbreak;\ncase 86: this.pushState(\"text\"); return 67; \nbreak;\ncase 87: this.popState(); return 64; \nbreak;\ncase 88: this.pushState(\"text\") ;return 63; \nbreak;\ncase 89: this.popState(); return 49; \nbreak;\ncase 90: this.pushState(\"text\"); return 48; \nbreak;\ncase 91: this.popState(); return 69; \nbreak;\ncase 92: this.popState(); return 71; \nbreak;\ncase 93:return 117;\nbreak;\ncase 94: this.pushState(\"trapText\"); return 68; \nbreak;\ncase 95: this.pushState(\"trapText\"); return 70; \nbreak;\ncase 96:return 118;\nbreak;\ncase 97:return 67;\nbreak;\ncase 98:return 90;\nbreak;\ncase 99:return 'SEP';\nbreak;\ncase 100:return 89;\nbreak;\ncase 101:return 115;\nbreak;\ncase 102:return 111;\nbreak;\ncase 103:return 44;\nbreak;\ncase 104:\n return 109;\n\nbreak;\ncase 105:return 114\nbreak;\ncase 106:return 116;\nbreak;\ncase 107: this.popState(); return 62; \nbreak;\ncase 108: this.pushState(\"text\"); return 62; \nbreak;\ncase 109: this.popState(); return 51; \nbreak;\ncase 110: this.pushState(\"text\"); return 50; \nbreak;\ncase 111: this.popState(); return 31; \nbreak;\ncase 112: this.pushState(\"text\"); return 29; \nbreak;\ncase 113: this.popState(); return 66 \nbreak;\ncase 114: this.pushState(\"text\"); return 65 \nbreak;\ncase 115:return \"TEXT\";\nbreak;\ncase 116:return 'QUOTE';\nbreak;\ncase 117:return 9;\nbreak;\ncase 118:return 10;\nbreak;\ncase 119:return 11;\nbreak;\n}\n},\nrules: [/^(?:accTitle\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*\\{\\s*)/,/^(?:[\\}])/,/^(?:[^\\}]*)/,/^(?:@\\{)/,/^(?:[\"])/,/^(?:[\"])/,/^(?:[^\\\"]+)/,/^(?:[^}^\"]+)/,/^(?:\\})/,/^(?:call[\\s]+)/,/^(?:\\([\\s]*\\))/,/^(?:\\()/,/^(?:[^(]*)/,/^(?:\\))/,/^(?:[^)]*)/,/^(?:[^`\"]+)/,/^(?:[`][\"])/,/^(?:[\"][`])/,/^(?:[^\"]+)/,/^(?:[\"])/,/^(?:[\"])/,/^(?:style\\b)/,/^(?:default\\b)/,/^(?:linkStyle\\b)/,/^(?:interpolate\\b)/,/^(?:classDef\\b)/,/^(?:class\\b)/,/^(?:href[\\s])/,/^(?:click[\\s]+)/,/^(?:[\\s\\n])/,/^(?:[^\\s\\n]*)/,/^(?:flowchart-elk\\b)/,/^(?:graph\\b)/,/^(?:flowchart\\b)/,/^(?:subgraph\\b)/,/^(?:end\\b\\s*)/,/^(?:_self\\b)/,/^(?:_blank\\b)/,/^(?:_parent\\b)/,/^(?:_top\\b)/,/^(?:(\\r?\\n)*\\s*\\n)/,/^(?:\\s*LR\\b)/,/^(?:\\s*RL\\b)/,/^(?:\\s*TB\\b)/,/^(?:\\s*BT\\b)/,/^(?:\\s*TD\\b)/,/^(?:\\s*BR\\b)/,/^(?:\\s*<)/,/^(?:\\s*>)/,/^(?:\\s*\\^)/,/^(?:\\s*v\\b)/,/^(?:.*direction\\s+TB[^\\n]*)/,/^(?:.*direction\\s+BT[^\\n]*)/,/^(?:.*direction\\s+RL[^\\n]*)/,/^(?:.*direction\\s+LR[^\\n]*)/,/^(?:[^\\s\\\"]+@(?=[^\\{\\\"]))/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\\*)/,/^(?:\\s*[xo<]?--+[-xo>]\\s*)/,/^(?:\\s*[xo<]?--\\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\\s*[xo<]?==+[=xo>]\\s*)/,/^(?:\\s*[xo<]?==\\s*)/,/^(?:[^=]|=(?!))/,/^(?:\\s*[xo<]?-?\\.+-[xo>]?\\s*)/,/^(?:\\s*[xo<]?-\\.\\s*)/,/^(?:[^\\.]|\\.(?!))/,/^(?:\\s*~~[\\~]+\\s*)/,/^(?:[-/\\)][\\)])/,/^(?:[^\\(\\)\\[\\]\\{\\}]|!\\)+)/,/^(?:\\(-)/,/^(?:\\]\\))/,/^(?:\\(\\[)/,/^(?:\\]\\])/,/^(?:\\[\\[)/,/^(?:\\[\\|)/,/^(?:>)/,/^(?:\\)\\])/,/^(?:\\[\\()/,/^(?:\\)\\)\\))/,/^(?:\\(\\(\\()/,/^(?:[\\\\(?=\\])][\\]])/,/^(?:\\/(?=\\])\\])/,/^(?:\\/(?!\\])|\\\\(?!\\])|[^\\\\\\[\\]\\(\\)\\{\\}\\/]+)/,/^(?:\\[\\/)/,/^(?:\\[\\\\)/,/^(?:<)/,/^(?:>)/,/^(?:\\^)/,/^(?:\\\\\\|)/,/^(?:v\\b)/,/^(?:\\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!\"\\#$%&'*+\\.`?\\\\_\\/]|-(?=[^\\>\\-\\.])|(?!))+)/,/^(?:-)/,/^(?:[\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6]|[\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377]|[\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5]|[\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA]|[\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE]|[\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA]|[\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0]|[\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977]|[\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2]|[\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A]|[\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39]|[\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8]|[\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C]|[\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C]|[\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99]|[\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0]|[\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D]|[\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3]|[\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10]|[\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1]|[\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81]|[\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3]|[\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6]|[\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A]|[\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081]|[\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D]|[\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0]|[\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310]|[\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C]|[\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711]|[\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7]|[\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C]|[\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16]|[\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF]|[\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC]|[\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D]|[\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D]|[\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3]|[\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F]|[\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128]|[\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184]|[\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3]|[\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6]|[\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE]|[\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C]|[\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D]|[\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC]|[\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B]|[\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788]|[\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805]|[\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB]|[\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28]|[\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5]|[\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4]|[\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E]|[\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D]|[\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36]|[\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D]|[\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC]|[\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF]|[\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC])/,/^(?:\\|)/,/^(?:\\|)/,/^(?:\\))/,/^(?:\\()/,/^(?:\\])/,/^(?:\\[)/,/^(?:(\\}))/,/^(?:\\{)/,/^(?:[^\\[\\]\\(\\)\\{\\}\\|\\\"]+)/,/^(?:\")/,/^(?:(\\r?\\n)+)/,/^(?:\\s)/,/^(?:$)/],\nconditions: {\"shapeDataEndBracket\":{\"rules\":[21,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"shapeDataStr\":{\"rules\":[9,10,21,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"shapeData\":{\"rules\":[8,11,12,21,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"callbackargs\":{\"rules\":[17,18,21,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"callbackname\":{\"rules\":[14,15,16,21,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"href\":{\"rules\":[21,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"click\":{\"rules\":[21,24,33,34,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"dottedEdgeText\":{\"rules\":[21,24,74,76,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"thickEdgeText\":{\"rules\":[21,24,71,73,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"edgeText\":{\"rules\":[21,24,68,70,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"trapText\":{\"rules\":[21,24,77,80,82,84,88,90,91,92,93,94,95,108,110,112,114],\"inclusive\":false},\"ellipseText\":{\"rules\":[21,24,77,78,79,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"text\":{\"rules\":[21,24,77,80,81,82,83,84,87,88,89,90,94,95,107,108,109,110,111,112,113,114,115],\"inclusive\":false},\"vertex\":{\"rules\":[21,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"dir\":{\"rules\":[21,24,44,45,46,47,48,49,50,51,52,53,54,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"acc_descr_multiline\":{\"rules\":[5,6,21,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"acc_descr\":{\"rules\":[3,21,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"acc_title\":{\"rules\":[1,21,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"md_string\":{\"rules\":[19,20,21,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"string\":{\"rules\":[21,22,23,24,77,80,82,84,88,90,94,95,108,110,112,114],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,2,4,7,13,21,24,25,26,27,28,29,30,31,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,71,72,74,75,77,80,82,84,85,86,88,90,94,95,96,97,98,99,100,101,102,103,104,105,106,108,110,112,114,116,117,118,119],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "// @ts-ignore: JISON doesn't support types\nimport flowJisonParser from './flow.jison';\n\nconst newParser = Object.assign({}, flowJisonParser);\n\nnewParser.parse = (src: string): unknown => {\n // remove the trailing whitespace after closing curly braces when ending a line break\n const newSrc = src.replace(/}\\s*\\n/g, '}\\n');\n return flowJisonParser.parse(newSrc);\n};\n\nexport default newParser;\n", "// import khroma from 'khroma';\nimport * as khroma from 'khroma';\nimport { getIconStyles } from '../globalStyles.js';\n\n/** Returns the styles given options */\nexport interface FlowChartStyleOptions {\n arrowheadColor: string;\n border2: string;\n clusterBkg: string;\n clusterBorder: string;\n edgeLabelBackground: string;\n fontFamily: string;\n lineColor: string;\n mainBkg: string;\n nodeBorder: string;\n nodeTextColor: string;\n tertiaryColor: string;\n textColor: string;\n titleColor: string;\n}\n\nconst fade = (color: string, opacity: number) => {\n // @ts-ignore TODO: incorrect types from khroma\n const channel = khroma.channel;\n\n const r = channel(color, 'r');\n const g = channel(color, 'g');\n const b = channel(color, 'b');\n\n // @ts-ignore incorrect types from khroma\n return khroma.rgba(r, g, b, opacity);\n};\n\nconst getStyles = (options: FlowChartStyleOptions) =>\n `.label {\n font-family: ${options.fontFamily};\n color: ${options.nodeTextColor || options.textColor};\n }\n .cluster-label text {\n fill: ${options.titleColor};\n }\n .cluster-label span {\n color: ${options.titleColor};\n }\n .cluster-label span p {\n background-color: transparent;\n }\n\n .label text,span {\n fill: ${options.nodeTextColor || options.textColor};\n color: ${options.nodeTextColor || options.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n }\n .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label {\n text-anchor: middle;\n }\n // .flowchart-label .text-outer-tspan {\n // text-anchor: middle;\n // }\n // .flowchart-label .text-inner-tspan {\n // text-anchor: start;\n // }\n\n .node .katex path {\n fill: #000;\n stroke: #000;\n stroke-width: 1px;\n }\n\n .rough-node .label,.node .label, .image-shape .label, .icon-shape .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n\n .root .anchor path {\n fill: ${options.lineColor} !important;\n stroke-width: 0;\n stroke: ${options.lineColor};\n }\n\n .arrowheadPath {\n fill: ${options.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${options.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${options.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${options.edgeLabelBackground};\n p {\n background-color: ${options.edgeLabelBackground};\n }\n rect {\n opacity: 0.5;\n background-color: ${options.edgeLabelBackground};\n fill: ${options.edgeLabelBackground};\n }\n text-align: center;\n }\n\n /* For html labels only */\n .labelBkg {\n background-color: ${fade(options.edgeLabelBackground, 0.5)};\n // background-color:\n }\n\n .cluster rect {\n fill: ${options.clusterBkg};\n stroke: ${options.clusterBorder};\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${options.titleColor};\n }\n\n .cluster span {\n color: ${options.titleColor};\n }\n /* .cluster div {\n color: ${options.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${options.fontFamily};\n font-size: 12px;\n background: ${options.tertiaryColor};\n border: 1px solid ${options.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .flowchartTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${options.textColor};\n }\n\n rect.text {\n fill: none;\n stroke-width: 0;\n }\n\n .icon-shape, .image-shape {\n background-color: ${options.edgeLabelBackground};\n p {\n background-color: ${options.edgeLabelBackground};\n padding: 2px;\n }\n rect {\n opacity: 0.5;\n background-color: ${options.edgeLabelBackground};\n fill: ${options.edgeLabelBackground};\n }\n text-align: center;\n }\n ${getIconStyles()}\n`;\n\nexport default getStyles;\n", "import type { MermaidConfig } from '../../config.type.js';\nimport { setConfig } from '../../diagram-api/diagramAPI.js';\nimport { FlowDB } from './flowDb.js';\nimport renderer from './flowRenderer-v3-unified.js';\n// @ts-ignore: JISON doesn't support types\n//import flowParser from './parser/flow.jison';\nimport flowParser from './parser/flowParser.ts';\nimport flowStyles from './styles.js';\n\nexport const diagram = {\n parser: flowParser,\n get db() {\n return new FlowDB();\n },\n renderer,\n styles: flowStyles,\n init: (cnf: MermaidConfig) => {\n if (!cnf.flowchart) {\n cnf.flowchart = {};\n }\n if (cnf.layout) {\n setConfig({ layout: cnf.layout });\n }\n cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n setConfig({ flowchart: { arrowMarkerAbsolute: cnf.arrowMarkerAbsolute } });\n },\n};\n"], + "mappings": "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I,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,GAAE,IAAG,IAAG,IAAG,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,MAAI,CAAC,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,MAAI,CAAC,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAG,GAAE,MAAI,CAAC,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAG,GAAE,MAAI,CAAC,IAAG,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAG,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAG,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAE,EAAE,GAAE,OAAK,CAAC,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,IAAG,KAAI,GAAG,GAAE,OAAK,CAAC,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,GAAG,GAAE,OAAK,CAAC,IAAG,GAAG,GAAE,OAAK,CAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,KAAI,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAG,GAAE,OAAK,CAAC,GAAE,GAAE,IAAG,GAAG,GAAE,OAAK,CAAC,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,GAAG;AACzjE,MAAIC,UAAS;AAAA,IAAC,OAAO,gCAAS,QAAS;AAAA,IAAE,GAApB;AAAA,IACrB,IAAI,CAAC;AAAA,IACL,UAAU,EAAC,SAAQ,GAAE,SAAQ,GAAE,eAAc,GAAE,YAAW,GAAE,QAAO,GAAE,aAAY,GAAE,QAAO,GAAE,WAAU,GAAE,SAAQ,IAAG,OAAM,IAAG,SAAQ,IAAG,SAAQ,IAAG,OAAM,IAAG,sBAAqB,IAAG,UAAS,IAAG,YAAW,IAAG,aAAY,IAAG,oBAAmB,IAAG,mBAAkB,IAAG,aAAY,IAAG,kBAAiB,IAAG,sBAAqB,IAAG,qBAAoB,IAAG,kBAAiB,IAAG,kBAAiB,IAAG,YAAW,IAAG,cAAa,IAAG,OAAM,IAAG,QAAO,IAAG,OAAM,IAAG,OAAM,IAAG,aAAY,IAAG,aAAY,IAAG,mBAAkB,IAAG,aAAY,IAAG,mBAAkB,IAAG,6BAA4B,IAAG,aAAY,IAAG,cAAa,IAAG,QAAO,IAAG,QAAO,IAAG,gBAAe,IAAG,OAAM,IAAG,UAAS,IAAG,mBAAkB,IAAG,YAAW,IAAG,qBAAoB,IAAG,mBAAkB,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,gBAAe,IAAG,cAAa,IAAG,mBAAkB,IAAG,iBAAgB,IAAG,2BAA0B,IAAG,sBAAqB,IAAG,SAAQ,IAAG,sBAAqB,IAAG,QAAO,IAAG,iBAAgB,IAAG,eAAc,IAAG,iBAAgB,IAAG,gBAAe,IAAG,UAAS,IAAG,aAAY,IAAG,WAAU,IAAG,gBAAe,IAAG,cAAa,IAAG,iBAAgB,IAAG,aAAY,IAAG,WAAU,IAAG,cAAa,IAAG,YAAW,IAAG,QAAO,IAAG,WAAU,IAAG,iBAAgB,IAAG,OAAM,IAAG,UAAS,IAAG,aAAY,IAAG,YAAW,IAAG,SAAQ,IAAG,aAAY,IAAG,YAAW,IAAG,SAAQ,IAAG,SAAQ,IAAG,QAAO,IAAG,MAAK,IAAG,mBAAkB,IAAG,aAAY,IAAG,oBAAmB,IAAG,mBAAkB,IAAG,gBAAe,IAAG,gBAAe,IAAG,QAAO,IAAG,eAAc,IAAG,aAAY,IAAG,gBAAe,KAAI,YAAW,KAAI,WAAU,KAAI,WAAU,KAAI,eAAc,KAAI,OAAM,KAAI,SAAQ,KAAI,SAAQ,KAAI,kBAAiB,KAAI,eAAc,KAAI,QAAO,KAAI,QAAO,KAAI,OAAM,KAAI,iBAAgB,KAAI,SAAQ,KAAI,QAAO,KAAI,gBAAe,KAAI,QAAO,KAAI,YAAW,KAAI,aAAY,KAAI,iBAAgB,KAAI,gBAAe,KAAI,gBAAe,KAAI,gBAAe,KAAI,gBAAe,KAAI,WAAU,GAAE,QAAO,EAAC;AAAA,IAC72D,YAAY,EAAC,GAAE,SAAQ,GAAE,QAAO,GAAE,WAAU,IAAG,SAAQ,IAAG,OAAM,IAAG,SAAQ,IAAG,SAAQ,IAAG,OAAM,IAAG,YAAW,IAAG,OAAM,IAAG,OAAM,IAAG,OAAM,IAAG,aAAY,IAAG,mBAAkB,IAAG,aAAY,IAAG,mBAAkB,IAAG,6BAA4B,IAAG,cAAa,IAAG,OAAM,IAAG,mBAAkB,IAAG,qBAAoB,IAAG,mBAAkB,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,gBAAe,IAAG,cAAa,IAAG,mBAAkB,IAAG,iBAAgB,IAAG,2BAA0B,IAAG,sBAAqB,IAAG,SAAQ,IAAG,sBAAqB,IAAG,QAAO,IAAG,iBAAgB,IAAG,eAAc,IAAG,iBAAgB,IAAG,gBAAe,IAAG,UAAS,IAAG,aAAY,IAAG,WAAU,IAAG,gBAAe,IAAG,cAAa,IAAG,WAAU,IAAG,cAAa,IAAG,QAAO,IAAG,WAAU,IAAG,OAAM,IAAG,UAAS,IAAG,SAAQ,IAAG,aAAY,IAAG,YAAW,IAAG,SAAQ,IAAG,SAAQ,IAAG,QAAO,IAAG,MAAK,IAAG,oBAAmB,IAAG,mBAAkB,IAAG,gBAAe,IAAG,gBAAe,IAAG,QAAO,IAAG,eAAc,IAAG,aAAY,KAAI,gBAAe,KAAI,WAAU,KAAI,eAAc,KAAI,OAAM,KAAI,SAAQ,KAAI,eAAc,KAAI,QAAO,KAAI,QAAO,KAAI,OAAM,KAAI,SAAQ,KAAI,QAAO,KAAI,gBAAe,KAAI,QAAO,KAAI,YAAW,KAAI,aAAY,KAAI,gBAAe,KAAI,gBAAe,KAAI,gBAAe,KAAI,eAAc;AAAA,IACptC,cAAc,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,KAAI,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAA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,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,GAAE,GAAE,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,IAAG,IAAG,GAAE,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,GAAE,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,GAAE,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,GAAE,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,GAAE,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,GAAE,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,GAAE,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,KAAI,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAE,MAAK,KAAI,EAAC,GAAE,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,KAAI,CAAC,GAAE,GAAG,GAAE,KAAI,KAAI,KAAI,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,KAAI,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,KAAI,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAE,KAAI,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAC,GAAE,IAAG,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,KAAI,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,KAAI,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,MAAK,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,MAAK,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAE,MAAK,KAAI,EAAC,GAAE,IAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,CAAC,GAAE,GAAG,GAAE,KAAI,MAAK,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,CAAC,GAAE,GAAG,GAAE,KAAI,MAAK,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,KAAI,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,KAAI,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,CAAC,IAAG,IAAG,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAG,GAAE,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAC,GAAE,IAAG,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,KAAI,KAAI,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,KAAI,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,KAAI,KAAI,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,KAAI,KAAI,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,KAAI,KAAI,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,KAAI,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,KAAI,MAAK,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,MAAK,KAAI,EAAC,GAAE,IAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,KAAI,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,KAAI,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,KAAI,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,CAAC,GAAE,EAAE,MAAK,CAAC,GAAE,GAAG,GAAE,EAAC,KAAI,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI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", + "names": ["dir", "nodeList", "select", "select", "o", "parser", "lexer", "channel"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/ganttDiagram-JELNMOA3.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/ganttDiagram-JELNMOA3.mjs new file mode 100644 index 0000000..31d7077 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/ganttDiagram-JELNMOA3.mjs @@ -0,0 +1,2276 @@ +import { + utils_default +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + common_default, + configureSvgSize, + getAccDescription, + getAccTitle, + getConfig2 as getConfig, + getDiagramTitle, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/gantt/parser/gantt.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [6, 8, 10, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 35, 36, 38, 40], $V1 = [1, 26], $V2 = [1, 27], $V3 = [1, 28], $V4 = [1, 29], $V5 = [1, 30], $V6 = [1, 31], $V7 = [1, 32], $V8 = [1, 33], $V9 = [1, 34], $Va = [1, 9], $Vb = [1, 10], $Vc = [1, 11], $Vd = [1, 12], $Ve = [1, 13], $Vf = [1, 14], $Vg = [1, 15], $Vh = [1, 16], $Vi = [1, 19], $Vj = [1, 20], $Vk = [1, 21], $Vl = [1, 22], $Vm = [1, 23], $Vn = [1, 25], $Vo = [1, 35]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "gantt": 4, "document": 5, "EOF": 6, "line": 7, "SPACE": 8, "statement": 9, "NL": 10, "weekday": 11, "weekday_monday": 12, "weekday_tuesday": 13, "weekday_wednesday": 14, "weekday_thursday": 15, "weekday_friday": 16, "weekday_saturday": 17, "weekday_sunday": 18, "weekend": 19, "weekend_friday": 20, "weekend_saturday": 21, "dateFormat": 22, "inclusiveEndDates": 23, "topAxis": 24, "axisFormat": 25, "tickInterval": 26, "excludes": 27, "includes": 28, "todayMarker": 29, "title": 30, "acc_title": 31, "acc_title_value": 32, "acc_descr": 33, "acc_descr_value": 34, "acc_descr_multiline_value": 35, "section": 36, "clickStatement": 37, "taskTxt": 38, "taskData": 39, "click": 40, "callbackname": 41, "callbackargs": 42, "href": 43, "clickStatementDebug": 44, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "gantt", 6: "EOF", 8: "SPACE", 10: "NL", 12: "weekday_monday", 13: "weekday_tuesday", 14: "weekday_wednesday", 15: "weekday_thursday", 16: "weekday_friday", 17: "weekday_saturday", 18: "weekday_sunday", 20: "weekend_friday", 21: "weekend_saturday", 22: "dateFormat", 23: "inclusiveEndDates", 24: "topAxis", 25: "axisFormat", 26: "tickInterval", 27: "excludes", 28: "includes", 29: "todayMarker", 30: "title", 31: "acc_title", 32: "acc_title_value", 33: "acc_descr", 34: "acc_descr_value", 35: "acc_descr_multiline_value", 36: "section", 38: "taskTxt", 39: "taskData", 40: "click", 41: "callbackname", 42: "callbackargs", 43: "href" }, + productions_: [0, [3, 3], [5, 0], [5, 2], [7, 2], [7, 1], [7, 1], [7, 1], [11, 1], [11, 1], [11, 1], [11, 1], [11, 1], [11, 1], [11, 1], [19, 1], [19, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 2], [9, 2], [9, 1], [9, 1], [9, 1], [9, 2], [37, 2], [37, 3], [37, 3], [37, 4], [37, 3], [37, 4], [37, 2], [44, 2], [44, 3], [44, 3], [44, 4], [44, 3], [44, 4], [44, 2]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 1: + return $$[$0 - 1]; + break; + case 2: + this.$ = []; + break; + case 3: + $$[$0 - 1].push($$[$0]); + this.$ = $$[$0 - 1]; + break; + case 4: + case 5: + this.$ = $$[$0]; + break; + case 6: + case 7: + this.$ = []; + break; + case 8: + yy.setWeekday("monday"); + break; + case 9: + yy.setWeekday("tuesday"); + break; + case 10: + yy.setWeekday("wednesday"); + break; + case 11: + yy.setWeekday("thursday"); + break; + case 12: + yy.setWeekday("friday"); + break; + case 13: + yy.setWeekday("saturday"); + break; + case 14: + yy.setWeekday("sunday"); + break; + case 15: + yy.setWeekend("friday"); + break; + case 16: + yy.setWeekend("saturday"); + break; + case 17: + yy.setDateFormat($$[$0].substr(11)); + this.$ = $$[$0].substr(11); + break; + case 18: + yy.enableInclusiveEndDates(); + this.$ = $$[$0].substr(18); + break; + case 19: + yy.TopAxis(); + this.$ = $$[$0].substr(8); + break; + case 20: + yy.setAxisFormat($$[$0].substr(11)); + this.$ = $$[$0].substr(11); + break; + case 21: + yy.setTickInterval($$[$0].substr(13)); + this.$ = $$[$0].substr(13); + break; + case 22: + yy.setExcludes($$[$0].substr(9)); + this.$ = $$[$0].substr(9); + break; + case 23: + yy.setIncludes($$[$0].substr(9)); + this.$ = $$[$0].substr(9); + break; + case 24: + yy.setTodayMarker($$[$0].substr(12)); + this.$ = $$[$0].substr(12); + break; + case 27: + yy.setDiagramTitle($$[$0].substr(6)); + this.$ = $$[$0].substr(6); + break; + case 28: + this.$ = $$[$0].trim(); + yy.setAccTitle(this.$); + break; + case 29: + case 30: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 31: + yy.addSection($$[$0].substr(8)); + this.$ = $$[$0].substr(8); + break; + case 33: + yy.addTask($$[$0 - 1], $$[$0]); + this.$ = "task"; + break; + case 34: + this.$ = $$[$0 - 1]; + yy.setClickEvent($$[$0 - 1], $$[$0], null); + break; + case 35: + this.$ = $$[$0 - 2]; + yy.setClickEvent($$[$0 - 2], $$[$0 - 1], $$[$0]); + break; + case 36: + this.$ = $$[$0 - 2]; + yy.setClickEvent($$[$0 - 2], $$[$0 - 1], null); + yy.setLink($$[$0 - 2], $$[$0]); + break; + case 37: + this.$ = $$[$0 - 3]; + yy.setClickEvent($$[$0 - 3], $$[$0 - 2], $$[$0 - 1]); + yy.setLink($$[$0 - 3], $$[$0]); + break; + case 38: + this.$ = $$[$0 - 2]; + yy.setClickEvent($$[$0 - 2], $$[$0], null); + yy.setLink($$[$0 - 2], $$[$0 - 1]); + break; + case 39: + this.$ = $$[$0 - 3]; + yy.setClickEvent($$[$0 - 3], $$[$0 - 1], $$[$0]); + yy.setLink($$[$0 - 3], $$[$0 - 2]); + break; + case 40: + this.$ = $$[$0 - 1]; + yy.setLink($$[$0 - 1], $$[$0]); + break; + case 41: + case 47: + this.$ = $$[$0 - 1] + " " + $$[$0]; + break; + case 42: + case 43: + case 45: + this.$ = $$[$0 - 2] + " " + $$[$0 - 1] + " " + $$[$0]; + break; + case 44: + case 46: + this.$ = $$[$0 - 3] + " " + $$[$0 - 2] + " " + $$[$0 - 1] + " " + $$[$0]; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: [1, 2] }, { 1: [3] }, o($V0, [2, 2], { 5: 3 }), { 6: [1, 4], 7: 5, 8: [1, 6], 9: 7, 10: [1, 8], 11: 17, 12: $V1, 13: $V2, 14: $V3, 15: $V4, 16: $V5, 17: $V6, 18: $V7, 19: 18, 20: $V8, 21: $V9, 22: $Va, 23: $Vb, 24: $Vc, 25: $Vd, 26: $Ve, 27: $Vf, 28: $Vg, 29: $Vh, 30: $Vi, 31: $Vj, 33: $Vk, 35: $Vl, 36: $Vm, 37: 24, 38: $Vn, 40: $Vo }, o($V0, [2, 7], { 1: [2, 1] }), o($V0, [2, 3]), { 9: 36, 11: 17, 12: $V1, 13: $V2, 14: $V3, 15: $V4, 16: $V5, 17: $V6, 18: $V7, 19: 18, 20: $V8, 21: $V9, 22: $Va, 23: $Vb, 24: $Vc, 25: $Vd, 26: $Ve, 27: $Vf, 28: $Vg, 29: $Vh, 30: $Vi, 31: $Vj, 33: $Vk, 35: $Vl, 36: $Vm, 37: 24, 38: $Vn, 40: $Vo }, o($V0, [2, 5]), o($V0, [2, 6]), o($V0, [2, 17]), o($V0, [2, 18]), o($V0, [2, 19]), o($V0, [2, 20]), o($V0, [2, 21]), o($V0, [2, 22]), o($V0, [2, 23]), o($V0, [2, 24]), o($V0, [2, 25]), o($V0, [2, 26]), o($V0, [2, 27]), { 32: [1, 37] }, { 34: [1, 38] }, o($V0, [2, 30]), o($V0, [2, 31]), o($V0, [2, 32]), { 39: [1, 39] }, o($V0, [2, 8]), o($V0, [2, 9]), o($V0, [2, 10]), o($V0, [2, 11]), o($V0, [2, 12]), o($V0, [2, 13]), o($V0, [2, 14]), o($V0, [2, 15]), o($V0, [2, 16]), { 41: [1, 40], 43: [1, 41] }, o($V0, [2, 4]), o($V0, [2, 28]), o($V0, [2, 29]), o($V0, [2, 33]), o($V0, [2, 34], { 42: [1, 42], 43: [1, 43] }), o($V0, [2, 40], { 41: [1, 44] }), o($V0, [2, 35], { 43: [1, 45] }), o($V0, [2, 36]), o($V0, [2, 38], { 42: [1, 46] }), o($V0, [2, 37]), o($V0, [2, 39])], + defaultActions: {}, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + this.begin("open_directive"); + return "open_directive"; + break; + case 1: + this.begin("acc_title"); + return 31; + break; + case 2: + this.popState(); + return "acc_title_value"; + break; + case 3: + this.begin("acc_descr"); + return 33; + break; + case 4: + this.popState(); + return "acc_descr_value"; + break; + case 5: + this.begin("acc_descr_multiline"); + break; + case 6: + this.popState(); + break; + case 7: + return "acc_descr_multiline_value"; + break; + case 8: + break; + case 9: + break; + case 10: + break; + case 11: + return 10; + break; + case 12: + break; + case 13: + break; + case 14: + this.begin("href"); + break; + case 15: + this.popState(); + break; + case 16: + return 43; + break; + case 17: + this.begin("callbackname"); + break; + case 18: + this.popState(); + break; + case 19: + this.popState(); + this.begin("callbackargs"); + break; + case 20: + return 41; + break; + case 21: + this.popState(); + break; + case 22: + return 42; + break; + case 23: + this.begin("click"); + break; + case 24: + this.popState(); + break; + case 25: + return 40; + break; + case 26: + return 4; + break; + case 27: + return 22; + break; + case 28: + return 23; + break; + case 29: + return 24; + break; + case 30: + return 25; + break; + case 31: + return 26; + break; + case 32: + return 28; + break; + case 33: + return 27; + break; + case 34: + return 29; + break; + case 35: + return 12; + break; + case 36: + return 13; + break; + case 37: + return 14; + break; + case 38: + return 15; + break; + case 39: + return 16; + break; + case 40: + return 17; + break; + case 41: + return 18; + break; + case 42: + return 20; + break; + case 43: + return 21; + break; + case 44: + return "date"; + break; + case 45: + return 30; + break; + case 46: + return "accDescription"; + break; + case 47: + return 36; + break; + case 48: + return 38; + break; + case 49: + return 39; + break; + case 50: + return ":"; + break; + case 51: + return 6; + break; + case 52: + return "INVALID"; + break; + } + }, "anonymous"), + rules: [/^(?:%%\{)/i, /^(?:accTitle\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*\{\s*)/i, /^(?:[\}])/i, /^(?:[^\}]*)/i, /^(?:%%(?!\{)*[^\n]*)/i, /^(?:[^\}]%%*[^\n]*)/i, /^(?:%%*[^\n]*[\n]*)/i, /^(?:[\n]+)/i, /^(?:\s+)/i, /^(?:%[^\n]*)/i, /^(?:href[\s]+["])/i, /^(?:["])/i, /^(?:[^"]*)/i, /^(?:call[\s]+)/i, /^(?:\([\s]*\))/i, /^(?:\()/i, /^(?:[^(]*)/i, /^(?:\))/i, /^(?:[^)]*)/i, /^(?:click[\s]+)/i, /^(?:[\s\n])/i, /^(?:[^\s\n]*)/i, /^(?:gantt\b)/i, /^(?:dateFormat\s[^#\n;]+)/i, /^(?:inclusiveEndDates\b)/i, /^(?:topAxis\b)/i, /^(?:axisFormat\s[^#\n;]+)/i, /^(?:tickInterval\s[^#\n;]+)/i, /^(?:includes\s[^#\n;]+)/i, /^(?:excludes\s[^#\n;]+)/i, /^(?:todayMarker\s[^\n;]+)/i, /^(?:weekday\s+monday\b)/i, /^(?:weekday\s+tuesday\b)/i, /^(?:weekday\s+wednesday\b)/i, /^(?:weekday\s+thursday\b)/i, /^(?:weekday\s+friday\b)/i, /^(?:weekday\s+saturday\b)/i, /^(?:weekday\s+sunday\b)/i, /^(?:weekend\s+friday\b)/i, /^(?:weekend\s+saturday\b)/i, /^(?:\d\d\d\d-\d\d-\d\d\b)/i, /^(?:title\s[^\n]+)/i, /^(?:accDescription\s[^#\n;]+)/i, /^(?:section\s[^\n]+)/i, /^(?:[^:\n]+)/i, /^(?::[^#\n;]+)/i, /^(?::)/i, /^(?:$)/i, /^(?:.)/i], + conditions: { "acc_descr_multiline": { "rules": [6, 7], "inclusive": false }, "acc_descr": { "rules": [4], "inclusive": false }, "acc_title": { "rules": [2], "inclusive": false }, "callbackargs": { "rules": [21, 22], "inclusive": false }, "callbackname": { "rules": [18, 19, 20], "inclusive": false }, "href": { "rules": [15, 16], "inclusive": false }, "click": { "rules": [24, 25], "inclusive": false }, "INITIAL": { "rules": [0, 1, 3, 5, 8, 9, 10, 11, 12, 13, 14, 17, 23, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var gantt_default = parser; + +// src/diagrams/gantt/ganttDb.js +import { sanitizeUrl } from "@braintree/sanitize-url"; +import dayjs from "dayjs"; +import dayjsIsoWeek from "dayjs/plugin/isoWeek.js"; +import dayjsCustomParseFormat from "dayjs/plugin/customParseFormat.js"; +import dayjsAdvancedFormat from "dayjs/plugin/advancedFormat.js"; +dayjs.extend(dayjsIsoWeek); +dayjs.extend(dayjsCustomParseFormat); +dayjs.extend(dayjsAdvancedFormat); +var WEEKEND_START_DAY = { friday: 5, saturday: 6 }; +var dateFormat = ""; +var axisFormat = ""; +var tickInterval = void 0; +var todayMarker = ""; +var includes = []; +var excludes = []; +var links = /* @__PURE__ */ new Map(); +var sections = []; +var tasks = []; +var currentSection = ""; +var displayMode = ""; +var tags = ["active", "done", "crit", "milestone", "vert"]; +var funs = []; +var inclusiveEndDates = false; +var topAxis = false; +var weekday = "sunday"; +var weekend = "saturday"; +var lastOrder = 0; +var clear2 = /* @__PURE__ */ __name(function() { + sections = []; + tasks = []; + currentSection = ""; + funs = []; + taskCnt = 0; + lastTask = void 0; + lastTaskID = void 0; + rawTasks = []; + dateFormat = ""; + axisFormat = ""; + displayMode = ""; + tickInterval = void 0; + todayMarker = ""; + includes = []; + excludes = []; + inclusiveEndDates = false; + topAxis = false; + lastOrder = 0; + links = /* @__PURE__ */ new Map(); + clear(); + weekday = "sunday"; + weekend = "saturday"; +}, "clear"); +var setAxisFormat = /* @__PURE__ */ __name(function(txt) { + axisFormat = txt; +}, "setAxisFormat"); +var getAxisFormat = /* @__PURE__ */ __name(function() { + return axisFormat; +}, "getAxisFormat"); +var setTickInterval = /* @__PURE__ */ __name(function(txt) { + tickInterval = txt; +}, "setTickInterval"); +var getTickInterval = /* @__PURE__ */ __name(function() { + return tickInterval; +}, "getTickInterval"); +var setTodayMarker = /* @__PURE__ */ __name(function(txt) { + todayMarker = txt; +}, "setTodayMarker"); +var getTodayMarker = /* @__PURE__ */ __name(function() { + return todayMarker; +}, "getTodayMarker"); +var setDateFormat = /* @__PURE__ */ __name(function(txt) { + dateFormat = txt; +}, "setDateFormat"); +var enableInclusiveEndDates = /* @__PURE__ */ __name(function() { + inclusiveEndDates = true; +}, "enableInclusiveEndDates"); +var endDatesAreInclusive = /* @__PURE__ */ __name(function() { + return inclusiveEndDates; +}, "endDatesAreInclusive"); +var enableTopAxis = /* @__PURE__ */ __name(function() { + topAxis = true; +}, "enableTopAxis"); +var topAxisEnabled = /* @__PURE__ */ __name(function() { + return topAxis; +}, "topAxisEnabled"); +var setDisplayMode = /* @__PURE__ */ __name(function(txt) { + displayMode = txt; +}, "setDisplayMode"); +var getDisplayMode = /* @__PURE__ */ __name(function() { + return displayMode; +}, "getDisplayMode"); +var getDateFormat = /* @__PURE__ */ __name(function() { + return dateFormat; +}, "getDateFormat"); +var setIncludes = /* @__PURE__ */ __name(function(txt) { + includes = txt.toLowerCase().split(/[\s,]+/); +}, "setIncludes"); +var getIncludes = /* @__PURE__ */ __name(function() { + return includes; +}, "getIncludes"); +var setExcludes = /* @__PURE__ */ __name(function(txt) { + excludes = txt.toLowerCase().split(/[\s,]+/); +}, "setExcludes"); +var getExcludes = /* @__PURE__ */ __name(function() { + return excludes; +}, "getExcludes"); +var getLinks = /* @__PURE__ */ __name(function() { + return links; +}, "getLinks"); +var addSection = /* @__PURE__ */ __name(function(txt) { + currentSection = txt; + sections.push(txt); +}, "addSection"); +var getSections = /* @__PURE__ */ __name(function() { + return sections; +}, "getSections"); +var getTasks = /* @__PURE__ */ __name(function() { + let allItemsProcessed = compileTasks(); + const maxDepth = 10; + let iterationCount = 0; + while (!allItemsProcessed && iterationCount < maxDepth) { + allItemsProcessed = compileTasks(); + iterationCount++; + } + tasks = rawTasks; + return tasks; +}, "getTasks"); +var isInvalidDate = /* @__PURE__ */ __name(function(date, dateFormat2, excludes2, includes2) { + const formattedDate = date.format(dateFormat2.trim()); + const dateOnly = date.format("YYYY-MM-DD"); + if (includes2.includes(formattedDate) || includes2.includes(dateOnly)) { + return false; + } + if (excludes2.includes("weekends") && (date.isoWeekday() === WEEKEND_START_DAY[weekend] || date.isoWeekday() === WEEKEND_START_DAY[weekend] + 1)) { + return true; + } + if (excludes2.includes(date.format("dddd").toLowerCase())) { + return true; + } + return excludes2.includes(formattedDate) || excludes2.includes(dateOnly); +}, "isInvalidDate"); +var setWeekday = /* @__PURE__ */ __name(function(txt) { + weekday = txt; +}, "setWeekday"); +var getWeekday = /* @__PURE__ */ __name(function() { + return weekday; +}, "getWeekday"); +var setWeekend = /* @__PURE__ */ __name(function(startDay) { + weekend = startDay; +}, "setWeekend"); +var checkTaskDates = /* @__PURE__ */ __name(function(task, dateFormat2, excludes2, includes2) { + if (!excludes2.length || task.manualEndTime) { + return; + } + let startTime; + if (task.startTime instanceof Date) { + startTime = dayjs(task.startTime); + } else { + startTime = dayjs(task.startTime, dateFormat2, true); + } + startTime = startTime.add(1, "d"); + let originalEndTime; + if (task.endTime instanceof Date) { + originalEndTime = dayjs(task.endTime); + } else { + originalEndTime = dayjs(task.endTime, dateFormat2, true); + } + const [fixedEndTime, renderEndTime] = fixTaskDates( + startTime, + originalEndTime, + dateFormat2, + excludes2, + includes2 + ); + task.endTime = fixedEndTime.toDate(); + task.renderEndTime = renderEndTime; +}, "checkTaskDates"); +var fixTaskDates = /* @__PURE__ */ __name(function(startTime, endTime, dateFormat2, excludes2, includes2) { + let invalid = false; + let renderEndTime = null; + while (startTime <= endTime) { + if (!invalid) { + renderEndTime = endTime.toDate(); + } + invalid = isInvalidDate(startTime, dateFormat2, excludes2, includes2); + if (invalid) { + endTime = endTime.add(1, "d"); + } + startTime = startTime.add(1, "d"); + } + return [endTime, renderEndTime]; +}, "fixTaskDates"); +var getStartDate = /* @__PURE__ */ __name(function(prevTime, dateFormat2, str) { + str = str.trim(); + const isTimestampFormat = /* @__PURE__ */ __name((format) => { + const trimmedFormat = format.trim(); + return trimmedFormat === "x" || trimmedFormat === "X"; + }, "isTimestampFormat"); + if (isTimestampFormat(dateFormat2) && /^\d+$/.test(str)) { + return new Date(Number(str)); + } + const afterRePattern = /^after\s+(?[\d\w- ]+)/; + const afterStatement = afterRePattern.exec(str); + if (afterStatement !== null) { + let latestTask = null; + for (const id of afterStatement.groups.ids.split(" ")) { + let task = findTaskById(id); + if (task !== void 0 && (!latestTask || task.endTime > latestTask.endTime)) { + latestTask = task; + } + } + if (latestTask) { + return latestTask.endTime; + } + const today = /* @__PURE__ */ new Date(); + today.setHours(0, 0, 0, 0); + return today; + } + let mDate = dayjs(str, dateFormat2.trim(), true); + if (mDate.isValid()) { + return mDate.toDate(); + } else { + log.debug("Invalid date:" + str); + log.debug("With date format:" + dateFormat2.trim()); + const d = new Date(str); + if (d === void 0 || isNaN(d.getTime()) || // WebKit browsers can mis-parse invalid dates to be ridiculously + // huge numbers, e.g. new Date('202304') gets parsed as January 1, 202304. + // This can cause virtually infinite loops while rendering, so for the + // purposes of Gantt charts we'll just treat any date beyond 10,000 AD/BC as + // invalid. + d.getFullYear() < -1e4 || d.getFullYear() > 1e4) { + throw new Error("Invalid date:" + str); + } + return d; + } +}, "getStartDate"); +var parseDuration = /* @__PURE__ */ __name(function(str) { + const statement = /^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(str.trim()); + if (statement !== null) { + return [Number.parseFloat(statement[1]), statement[2]]; + } + return [NaN, "ms"]; +}, "parseDuration"); +var getEndDate = /* @__PURE__ */ __name(function(prevTime, dateFormat2, str, inclusive = false) { + str = str.trim(); + const untilRePattern = /^until\s+(?[\d\w- ]+)/; + const untilStatement = untilRePattern.exec(str); + if (untilStatement !== null) { + let earliestTask = null; + for (const id of untilStatement.groups.ids.split(" ")) { + let task = findTaskById(id); + if (task !== void 0 && (!earliestTask || task.startTime < earliestTask.startTime)) { + earliestTask = task; + } + } + if (earliestTask) { + return earliestTask.startTime; + } + const today = /* @__PURE__ */ new Date(); + today.setHours(0, 0, 0, 0); + return today; + } + let parsedDate = dayjs(str, dateFormat2.trim(), true); + if (parsedDate.isValid()) { + if (inclusive) { + parsedDate = parsedDate.add(1, "d"); + } + return parsedDate.toDate(); + } + let endTime = dayjs(prevTime); + const [durationValue, durationUnit] = parseDuration(str); + if (!Number.isNaN(durationValue)) { + const newEndTime = endTime.add(durationValue, durationUnit); + if (newEndTime.isValid()) { + endTime = newEndTime; + } + } + return endTime.toDate(); +}, "getEndDate"); +var taskCnt = 0; +var parseId = /* @__PURE__ */ __name(function(idStr) { + if (idStr === void 0) { + taskCnt = taskCnt + 1; + return "task" + taskCnt; + } + return idStr; +}, "parseId"); +var compileData = /* @__PURE__ */ __name(function(prevTask, dataStr) { + let ds; + if (dataStr.substr(0, 1) === ":") { + ds = dataStr.substr(1, dataStr.length); + } else { + ds = dataStr; + } + const data = ds.split(","); + const task = {}; + getTaskTags(data, task, tags); + for (let i = 0; i < data.length; i++) { + data[i] = data[i].trim(); + } + let endTimeData = ""; + switch (data.length) { + case 1: + task.id = parseId(); + task.startTime = prevTask.endTime; + endTimeData = data[0]; + break; + case 2: + task.id = parseId(); + task.startTime = getStartDate(void 0, dateFormat, data[0]); + endTimeData = data[1]; + break; + case 3: + task.id = parseId(data[0]); + task.startTime = getStartDate(void 0, dateFormat, data[1]); + endTimeData = data[2]; + break; + default: + } + if (endTimeData) { + task.endTime = getEndDate(task.startTime, dateFormat, endTimeData, inclusiveEndDates); + task.manualEndTime = dayjs(endTimeData, "YYYY-MM-DD", true).isValid(); + checkTaskDates(task, dateFormat, excludes, includes); + } + return task; +}, "compileData"); +var parseData = /* @__PURE__ */ __name(function(prevTaskId, dataStr) { + let ds; + if (dataStr.substr(0, 1) === ":") { + ds = dataStr.substr(1, dataStr.length); + } else { + ds = dataStr; + } + const data = ds.split(","); + const task = {}; + getTaskTags(data, task, tags); + for (let i = 0; i < data.length; i++) { + data[i] = data[i].trim(); + } + switch (data.length) { + case 1: + task.id = parseId(); + task.startTime = { + type: "prevTaskEnd", + id: prevTaskId + }; + task.endTime = { + data: data[0] + }; + break; + case 2: + task.id = parseId(); + task.startTime = { + type: "getStartDate", + startData: data[0] + }; + task.endTime = { + data: data[1] + }; + break; + case 3: + task.id = parseId(data[0]); + task.startTime = { + type: "getStartDate", + startData: data[1] + }; + task.endTime = { + data: data[2] + }; + break; + default: + } + return task; +}, "parseData"); +var lastTask; +var lastTaskID; +var rawTasks = []; +var taskDb = {}; +var addTask = /* @__PURE__ */ __name(function(descr, data) { + const rawTask = { + section: currentSection, + type: currentSection, + processed: false, + manualEndTime: false, + renderEndTime: null, + raw: { data }, + task: descr, + classes: [] + }; + const taskInfo = parseData(lastTaskID, data); + rawTask.raw.startTime = taskInfo.startTime; + rawTask.raw.endTime = taskInfo.endTime; + rawTask.id = taskInfo.id; + rawTask.prevTaskId = lastTaskID; + rawTask.active = taskInfo.active; + rawTask.done = taskInfo.done; + rawTask.crit = taskInfo.crit; + rawTask.milestone = taskInfo.milestone; + rawTask.vert = taskInfo.vert; + rawTask.order = lastOrder; + lastOrder++; + const pos = rawTasks.push(rawTask); + lastTaskID = rawTask.id; + taskDb[rawTask.id] = pos - 1; +}, "addTask"); +var findTaskById = /* @__PURE__ */ __name(function(id) { + const pos = taskDb[id]; + return rawTasks[pos]; +}, "findTaskById"); +var addTaskOrg = /* @__PURE__ */ __name(function(descr, data) { + const newTask = { + section: currentSection, + type: currentSection, + description: descr, + task: descr, + classes: [] + }; + const taskInfo = compileData(lastTask, data); + newTask.startTime = taskInfo.startTime; + newTask.endTime = taskInfo.endTime; + newTask.id = taskInfo.id; + newTask.active = taskInfo.active; + newTask.done = taskInfo.done; + newTask.crit = taskInfo.crit; + newTask.milestone = taskInfo.milestone; + newTask.vert = taskInfo.vert; + lastTask = newTask; + tasks.push(newTask); +}, "addTaskOrg"); +var compileTasks = /* @__PURE__ */ __name(function() { + const compileTask = /* @__PURE__ */ __name(function(pos) { + const task = rawTasks[pos]; + let startTime = ""; + switch (rawTasks[pos].raw.startTime.type) { + case "prevTaskEnd": { + const prevTask = findTaskById(task.prevTaskId); + task.startTime = prevTask.endTime; + break; + } + case "getStartDate": + startTime = getStartDate(void 0, dateFormat, rawTasks[pos].raw.startTime.startData); + if (startTime) { + rawTasks[pos].startTime = startTime; + } + break; + } + if (rawTasks[pos].startTime) { + rawTasks[pos].endTime = getEndDate( + rawTasks[pos].startTime, + dateFormat, + rawTasks[pos].raw.endTime.data, + inclusiveEndDates + ); + if (rawTasks[pos].endTime) { + rawTasks[pos].processed = true; + rawTasks[pos].manualEndTime = dayjs( + rawTasks[pos].raw.endTime.data, + "YYYY-MM-DD", + true + ).isValid(); + checkTaskDates(rawTasks[pos], dateFormat, excludes, includes); + } + } + return rawTasks[pos].processed; + }, "compileTask"); + let allProcessed = true; + for (const [i, rawTask] of rawTasks.entries()) { + compileTask(i); + allProcessed = allProcessed && rawTask.processed; + } + return allProcessed; +}, "compileTasks"); +var setLink = /* @__PURE__ */ __name(function(ids, _linkStr) { + let linkStr = _linkStr; + if (getConfig().securityLevel !== "loose") { + linkStr = sanitizeUrl(_linkStr); + } + ids.split(",").forEach(function(id) { + let rawTask = findTaskById(id); + if (rawTask !== void 0) { + pushFun(id, () => { + window.open(linkStr, "_self"); + }); + links.set(id, linkStr); + } + }); + setClass(ids, "clickable"); +}, "setLink"); +var setClass = /* @__PURE__ */ __name(function(ids, className) { + ids.split(",").forEach(function(id) { + let rawTask = findTaskById(id); + if (rawTask !== void 0) { + rawTask.classes.push(className); + } + }); +}, "setClass"); +var setClickFun = /* @__PURE__ */ __name(function(id, functionName, functionArgs) { + if (getConfig().securityLevel !== "loose") { + return; + } + if (functionName === void 0) { + return; + } + let argList = []; + if (typeof functionArgs === "string") { + argList = functionArgs.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/); + for (let i = 0; i < argList.length; i++) { + let item = argList[i].trim(); + if (item.startsWith('"') && item.endsWith('"')) { + item = item.substr(1, item.length - 2); + } + argList[i] = item; + } + } + if (argList.length === 0) { + argList.push(id); + } + let rawTask = findTaskById(id); + if (rawTask !== void 0) { + pushFun(id, () => { + utils_default.runFunc(functionName, ...argList); + }); + } +}, "setClickFun"); +var pushFun = /* @__PURE__ */ __name(function(id, callbackFunction) { + funs.push( + function() { + const elem = document.querySelector(`[id="${id}"]`); + if (elem !== null) { + elem.addEventListener("click", function() { + callbackFunction(); + }); + } + }, + function() { + const elem = document.querySelector(`[id="${id}-text"]`); + if (elem !== null) { + elem.addEventListener("click", function() { + callbackFunction(); + }); + } + } + ); +}, "pushFun"); +var setClickEvent = /* @__PURE__ */ __name(function(ids, functionName, functionArgs) { + ids.split(",").forEach(function(id) { + setClickFun(id, functionName, functionArgs); + }); + setClass(ids, "clickable"); +}, "setClickEvent"); +var bindFunctions = /* @__PURE__ */ __name(function(element) { + funs.forEach(function(fun) { + fun(element); + }); +}, "bindFunctions"); +var ganttDb_default = { + getConfig: /* @__PURE__ */ __name(() => getConfig().gantt, "getConfig"), + clear: clear2, + setDateFormat, + getDateFormat, + enableInclusiveEndDates, + endDatesAreInclusive, + enableTopAxis, + topAxisEnabled, + setAxisFormat, + getAxisFormat, + setTickInterval, + getTickInterval, + setTodayMarker, + getTodayMarker, + setAccTitle, + getAccTitle, + setDiagramTitle, + getDiagramTitle, + setDisplayMode, + getDisplayMode, + setAccDescription, + getAccDescription, + addSection, + getSections, + getTasks, + addTask, + findTaskById, + addTaskOrg, + setIncludes, + getIncludes, + setExcludes, + getExcludes, + setClickEvent, + setLink, + getLinks, + bindFunctions, + parseDuration, + isInvalidDate, + setWeekday, + getWeekday, + setWeekend +}; +function getTaskTags(data, task, tags2) { + let matchFound = true; + while (matchFound) { + matchFound = false; + tags2.forEach(function(t) { + const pattern = "^\\s*" + t + "\\s*$"; + const regex = new RegExp(pattern); + if (data[0].match(regex)) { + task[t] = true; + data.shift(1); + matchFound = true; + } + }); + } +} +__name(getTaskTags, "getTaskTags"); + +// src/diagrams/gantt/ganttRenderer.js +import dayjs2 from "dayjs"; +import dayjsDuration from "dayjs/plugin/duration.js"; +import { + select, + scaleTime, + min, + max, + scaleLinear, + interpolateHcl, + axisBottom, + axisTop, + timeFormat, + timeMillisecond, + timeSecond, + timeMinute, + timeHour, + timeDay, + timeMonday, + timeTuesday, + timeWednesday, + timeThursday, + timeFriday, + timeSaturday, + timeSunday, + timeMonth +} from "d3"; +dayjs2.extend(dayjsDuration); +var setConf = /* @__PURE__ */ __name(function() { + log.debug("Something is calling, setConf, remove the call"); +}, "setConf"); +var mapWeekdayToTimeFunction = { + monday: timeMonday, + tuesday: timeTuesday, + wednesday: timeWednesday, + thursday: timeThursday, + friday: timeFriday, + saturday: timeSaturday, + sunday: timeSunday +}; +var getMaxIntersections = /* @__PURE__ */ __name((tasks2, orderOffset) => { + let timeline = [...tasks2].map(() => -Infinity); + let sorted = [...tasks2].sort((a, b) => a.startTime - b.startTime || a.order - b.order); + let maxIntersections = 0; + for (const element of sorted) { + for (let j = 0; j < timeline.length; j++) { + if (element.startTime >= timeline[j]) { + timeline[j] = element.endTime; + element.order = j + orderOffset; + if (j > maxIntersections) { + maxIntersections = j; + } + break; + } + } + } + return maxIntersections; +}, "getMaxIntersections"); +var w; +var MAX_TICK_COUNT = 1e4; +var draw = /* @__PURE__ */ __name(function(text, id, version, diagObj) { + const conf = getConfig().gantt; + const securityLevel = getConfig().securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = select("#i" + id); + } + const root = securityLevel === "sandbox" ? select(sandboxElement.nodes()[0].contentDocument.body) : select("body"); + const doc = securityLevel === "sandbox" ? sandboxElement.nodes()[0].contentDocument : document; + const elem = doc.getElementById(id); + w = elem.parentElement.offsetWidth; + if (w === void 0) { + w = 1200; + } + if (conf.useWidth !== void 0) { + w = conf.useWidth; + } + const taskArray = diagObj.db.getTasks(); + let categories = []; + for (const element of taskArray) { + categories.push(element.type); + } + categories = checkUnique(categories); + const categoryHeights = {}; + let h = 2 * conf.topPadding; + if (diagObj.db.getDisplayMode() === "compact" || conf.displayMode === "compact") { + const categoryElements = {}; + for (const element of taskArray) { + if (categoryElements[element.section] === void 0) { + categoryElements[element.section] = [element]; + } else { + categoryElements[element.section].push(element); + } + } + let intersections = 0; + for (const category of Object.keys(categoryElements)) { + const categoryHeight = getMaxIntersections(categoryElements[category], intersections) + 1; + intersections += categoryHeight; + h += categoryHeight * (conf.barHeight + conf.barGap); + categoryHeights[category] = categoryHeight; + } + } else { + h += taskArray.length * (conf.barHeight + conf.barGap); + for (const category of categories) { + categoryHeights[category] = taskArray.filter((task) => task.type === category).length; + } + } + elem.setAttribute("viewBox", "0 0 " + w + " " + h); + const svg = root.select(`[id="${id}"]`); + const timeScale = scaleTime().domain([ + min(taskArray, function(d) { + return d.startTime; + }), + max(taskArray, function(d) { + return d.endTime; + }) + ]).rangeRound([0, w - conf.leftPadding - conf.rightPadding]); + function taskCompare(a, b) { + const taskA = a.startTime; + const taskB = b.startTime; + let result = 0; + if (taskA > taskB) { + result = 1; + } else if (taskA < taskB) { + result = -1; + } + return result; + } + __name(taskCompare, "taskCompare"); + taskArray.sort(taskCompare); + makeGantt(taskArray, w, h); + configureSvgSize(svg, h, w, conf.useMaxWidth); + svg.append("text").text(diagObj.db.getDiagramTitle()).attr("x", w / 2).attr("y", conf.titleTopMargin).attr("class", "titleText"); + function makeGantt(tasks2, pageWidth, pageHeight) { + const barHeight = conf.barHeight; + const gap = barHeight + conf.barGap; + const topPadding = conf.topPadding; + const leftPadding = conf.leftPadding; + const colorScale = scaleLinear().domain([0, categories.length]).range(["#00B9FA", "#F95002"]).interpolate(interpolateHcl); + drawExcludeDays( + gap, + topPadding, + leftPadding, + pageWidth, + pageHeight, + tasks2, + diagObj.db.getExcludes(), + diagObj.db.getIncludes() + ); + makeGrid(leftPadding, topPadding, pageWidth, pageHeight); + drawRects(tasks2, gap, topPadding, leftPadding, barHeight, colorScale, pageWidth, pageHeight); + vertLabels(gap, topPadding, leftPadding, barHeight, colorScale); + drawToday(leftPadding, topPadding, pageWidth, pageHeight); + } + __name(makeGantt, "makeGantt"); + function drawRects(theArray, theGap, theTopPad, theSidePad, theBarHeight, theColorScale, w2) { + theArray.sort((a, b) => a.vert === b.vert ? 0 : a.vert ? 1 : -1); + const uniqueTaskOrderIds = [...new Set(theArray.map((item) => item.order))]; + const uniqueTasks = uniqueTaskOrderIds.map((id2) => theArray.find((item) => item.order === id2)); + svg.append("g").selectAll("rect").data(uniqueTasks).enter().append("rect").attr("x", 0).attr("y", function(d, i) { + i = d.order; + return i * theGap + theTopPad - 2; + }).attr("width", function() { + return w2 - conf.rightPadding / 2; + }).attr("height", theGap).attr("class", function(d) { + for (const [i, category] of categories.entries()) { + if (d.type === category) { + return "section section" + i % conf.numberSectionStyles; + } + } + return "section section0"; + }).enter(); + const rectangles = svg.append("g").selectAll("rect").data(theArray).enter(); + const links2 = diagObj.db.getLinks(); + rectangles.append("rect").attr("id", function(d) { + return d.id; + }).attr("rx", 3).attr("ry", 3).attr("x", function(d) { + if (d.milestone) { + return timeScale(d.startTime) + theSidePad + 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) - 0.5 * theBarHeight; + } + return timeScale(d.startTime) + theSidePad; + }).attr("y", function(d, i) { + i = d.order; + if (d.vert) { + return conf.gridLineStartPadding; + } + return i * theGap + theTopPad; + }).attr("width", function(d) { + if (d.milestone) { + return theBarHeight; + } + if (d.vert) { + return 0.08 * theBarHeight; + } + return timeScale(d.renderEndTime || d.endTime) - timeScale(d.startTime); + }).attr("height", function(d) { + if (d.vert) { + return taskArray.length * (conf.barHeight + conf.barGap) + conf.barHeight * 2; + } + return theBarHeight; + }).attr("transform-origin", function(d, i) { + i = d.order; + return (timeScale(d.startTime) + theSidePad + 0.5 * (timeScale(d.endTime) - timeScale(d.startTime))).toString() + "px " + (i * theGap + theTopPad + 0.5 * theBarHeight).toString() + "px"; + }).attr("class", function(d) { + const res = "task"; + let classStr = ""; + if (d.classes.length > 0) { + classStr = d.classes.join(" "); + } + let secNum = 0; + for (const [i, category] of categories.entries()) { + if (d.type === category) { + secNum = i % conf.numberSectionStyles; + } + } + let taskClass = ""; + if (d.active) { + if (d.crit) { + taskClass += " activeCrit"; + } else { + taskClass = " active"; + } + } else if (d.done) { + if (d.crit) { + taskClass = " doneCrit"; + } else { + taskClass = " done"; + } + } else { + if (d.crit) { + taskClass += " crit"; + } + } + if (taskClass.length === 0) { + taskClass = " task"; + } + if (d.milestone) { + taskClass = " milestone " + taskClass; + } + if (d.vert) { + taskClass = " vert " + taskClass; + } + taskClass += secNum; + taskClass += " " + classStr; + return res + taskClass; + }); + rectangles.append("text").attr("id", function(d) { + return d.id + "-text"; + }).text(function(d) { + return d.task; + }).attr("font-size", conf.fontSize).attr("x", function(d) { + let startX = timeScale(d.startTime); + let endX = timeScale(d.renderEndTime || d.endTime); + if (d.milestone) { + startX += 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) - 0.5 * theBarHeight; + endX = startX + theBarHeight; + } + if (d.vert) { + return timeScale(d.startTime) + theSidePad; + } + const textWidth = this.getBBox().width; + if (textWidth > endX - startX) { + if (endX + textWidth + 1.5 * conf.leftPadding > w2) { + return startX + theSidePad - 5; + } else { + return endX + theSidePad + 5; + } + } else { + return (endX - startX) / 2 + startX + theSidePad; + } + }).attr("y", function(d, i) { + if (d.vert) { + return conf.gridLineStartPadding + taskArray.length * (conf.barHeight + conf.barGap) + 60; + } + i = d.order; + return i * theGap + conf.barHeight / 2 + (conf.fontSize / 2 - 2) + theTopPad; + }).attr("text-height", theBarHeight).attr("class", function(d) { + const startX = timeScale(d.startTime); + let endX = timeScale(d.endTime); + if (d.milestone) { + endX = startX + theBarHeight; + } + const textWidth = this.getBBox().width; + let classStr = ""; + if (d.classes.length > 0) { + classStr = d.classes.join(" "); + } + let secNum = 0; + for (const [i, category] of categories.entries()) { + if (d.type === category) { + secNum = i % conf.numberSectionStyles; + } + } + let taskType = ""; + if (d.active) { + if (d.crit) { + taskType = "activeCritText" + secNum; + } else { + taskType = "activeText" + secNum; + } + } + if (d.done) { + if (d.crit) { + taskType = taskType + " doneCritText" + secNum; + } else { + taskType = taskType + " doneText" + secNum; + } + } else { + if (d.crit) { + taskType = taskType + " critText" + secNum; + } + } + if (d.milestone) { + taskType += " milestoneText"; + } + if (d.vert) { + taskType += " vertText"; + } + if (textWidth > endX - startX) { + if (endX + textWidth + 1.5 * conf.leftPadding > w2) { + return classStr + " taskTextOutsideLeft taskTextOutside" + secNum + " " + taskType; + } else { + return classStr + " taskTextOutsideRight taskTextOutside" + secNum + " " + taskType + " width-" + textWidth; + } + } else { + return classStr + " taskText taskText" + secNum + " " + taskType + " width-" + textWidth; + } + }); + const securityLevel2 = getConfig().securityLevel; + if (securityLevel2 === "sandbox") { + let sandboxElement2; + sandboxElement2 = select("#i" + id); + const doc2 = sandboxElement2.nodes()[0].contentDocument; + rectangles.filter(function(d) { + return links2.has(d.id); + }).each(function(o) { + var taskRect = doc2.querySelector("#" + o.id); + var taskText = doc2.querySelector("#" + o.id + "-text"); + const oldParent = taskRect.parentNode; + var Link = doc2.createElement("a"); + Link.setAttribute("xlink:href", links2.get(o.id)); + Link.setAttribute("target", "_top"); + oldParent.appendChild(Link); + Link.appendChild(taskRect); + Link.appendChild(taskText); + }); + } + } + __name(drawRects, "drawRects"); + function drawExcludeDays(theGap, theTopPad, theSidePad, w2, h2, tasks2, excludes2, includes2) { + if (excludes2.length === 0 && includes2.length === 0) { + return; + } + let minTime; + let maxTime; + for (const { startTime, endTime } of tasks2) { + if (minTime === void 0 || startTime < minTime) { + minTime = startTime; + } + if (maxTime === void 0 || endTime > maxTime) { + maxTime = endTime; + } + } + if (!minTime || !maxTime) { + return; + } + if (dayjs2(maxTime).diff(dayjs2(minTime), "year") > 5) { + log.warn( + "The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days." + ); + return; + } + const dateFormat2 = diagObj.db.getDateFormat(); + const excludeRanges = []; + let range = null; + let d = dayjs2(minTime); + while (d.valueOf() <= maxTime) { + if (diagObj.db.isInvalidDate(d, dateFormat2, excludes2, includes2)) { + if (!range) { + range = { + start: d, + end: d + }; + } else { + range.end = d; + } + } else { + if (range) { + excludeRanges.push(range); + range = null; + } + } + d = d.add(1, "d"); + } + const rectangles = svg.append("g").selectAll("rect").data(excludeRanges).enter(); + rectangles.append("rect").attr("id", (d2) => "exclude-" + d2.start.format("YYYY-MM-DD")).attr("x", (d2) => timeScale(d2.start.startOf("day")) + theSidePad).attr("y", conf.gridLineStartPadding).attr("width", (d2) => timeScale(d2.end.endOf("day")) - timeScale(d2.start.startOf("day"))).attr("height", h2 - theTopPad - conf.gridLineStartPadding).attr("transform-origin", function(d2, i) { + return (timeScale(d2.start) + theSidePad + 0.5 * (timeScale(d2.end) - timeScale(d2.start))).toString() + "px " + (i * theGap + 0.5 * h2).toString() + "px"; + }).attr("class", "exclude-range"); + } + __name(drawExcludeDays, "drawExcludeDays"); + function getEstimatedTickCount(minTime, maxTime, every, interval) { + if (every <= 0 || minTime > maxTime) { + return Infinity; + } + const timeDiffMs = maxTime - minTime; + const intervalMs = dayjs2.duration({ [interval ?? "day"]: every }).asMilliseconds(); + if (intervalMs <= 0) { + return Infinity; + } + return Math.ceil(timeDiffMs / intervalMs); + } + __name(getEstimatedTickCount, "getEstimatedTickCount"); + function makeGrid(theSidePad, theTopPad, w2, h2) { + const dateFormat2 = diagObj.db.getDateFormat(); + const userAxisFormat = diagObj.db.getAxisFormat(); + let axisFormat2; + if (userAxisFormat) { + axisFormat2 = userAxisFormat; + } else if (dateFormat2 === "D") { + axisFormat2 = "%d"; + } else { + axisFormat2 = conf.axisFormat ?? "%Y-%m-%d"; + } + let bottomXAxis = axisBottom(timeScale).tickSize(-h2 + theTopPad + conf.gridLineStartPadding).tickFormat(timeFormat(axisFormat2)); + const reTickInterval = /^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/; + const resultTickInterval = reTickInterval.exec( + diagObj.db.getTickInterval() || conf.tickInterval + ); + if (resultTickInterval !== null) { + const every = parseInt(resultTickInterval[1], 10); + if (isNaN(every) || every <= 0) { + log.warn( + `Invalid tick interval value: "${resultTickInterval[1]}". Skipping custom tick interval.` + ); + } else { + const interval = resultTickInterval[2]; + const weekday2 = diagObj.db.getWeekday() || conf.weekday; + const domain = timeScale.domain(); + const minTime = domain[0]; + const maxTime = domain[1]; + const estimatedTicks = getEstimatedTickCount(minTime, maxTime, every, interval); + if (estimatedTicks > MAX_TICK_COUNT) { + log.warn( + `The tick interval "${every}${interval}" would generate ${estimatedTicks} ticks, which exceeds the maximum allowed (${MAX_TICK_COUNT}). This may indicate an invalid date or time range. Skipping custom tick interval.` + ); + } else { + switch (interval) { + case "millisecond": + bottomXAxis.ticks(timeMillisecond.every(every)); + break; + case "second": + bottomXAxis.ticks(timeSecond.every(every)); + break; + case "minute": + bottomXAxis.ticks(timeMinute.every(every)); + break; + case "hour": + bottomXAxis.ticks(timeHour.every(every)); + break; + case "day": + bottomXAxis.ticks(timeDay.every(every)); + break; + case "week": + bottomXAxis.ticks(mapWeekdayToTimeFunction[weekday2].every(every)); + break; + case "month": + bottomXAxis.ticks(timeMonth.every(every)); + break; + } + } + } + } + svg.append("g").attr("class", "grid").attr("transform", "translate(" + theSidePad + ", " + (h2 - 50) + ")").call(bottomXAxis).selectAll("text").style("text-anchor", "middle").attr("fill", "#000").attr("stroke", "none").attr("font-size", 10).attr("dy", "1em"); + if (diagObj.db.topAxisEnabled() || conf.topAxis) { + let topXAxis = axisTop(timeScale).tickSize(-h2 + theTopPad + conf.gridLineStartPadding).tickFormat(timeFormat(axisFormat2)); + if (resultTickInterval !== null) { + const every = parseInt(resultTickInterval[1], 10); + if (isNaN(every) || every <= 0) { + log.warn( + `Invalid tick interval value: "${resultTickInterval[1]}". Skipping custom tick interval.` + ); + } else { + const interval = resultTickInterval[2]; + const weekday2 = diagObj.db.getWeekday() || conf.weekday; + const domain = timeScale.domain(); + const minTime = domain[0]; + const maxTime = domain[1]; + const estimatedTicks = getEstimatedTickCount(minTime, maxTime, every, interval); + if (estimatedTicks <= MAX_TICK_COUNT) { + switch (interval) { + case "millisecond": + topXAxis.ticks(timeMillisecond.every(every)); + break; + case "second": + topXAxis.ticks(timeSecond.every(every)); + break; + case "minute": + topXAxis.ticks(timeMinute.every(every)); + break; + case "hour": + topXAxis.ticks(timeHour.every(every)); + break; + case "day": + topXAxis.ticks(timeDay.every(every)); + break; + case "week": + topXAxis.ticks(mapWeekdayToTimeFunction[weekday2].every(every)); + break; + case "month": + topXAxis.ticks(timeMonth.every(every)); + break; + } + } + } + } + svg.append("g").attr("class", "grid").attr("transform", "translate(" + theSidePad + ", " + theTopPad + ")").call(topXAxis).selectAll("text").style("text-anchor", "middle").attr("fill", "#000").attr("stroke", "none").attr("font-size", 10); + } + } + __name(makeGrid, "makeGrid"); + function vertLabels(theGap, theTopPad) { + let prevGap = 0; + const numOccurrences = Object.keys(categoryHeights).map((d) => [d, categoryHeights[d]]); + svg.append("g").selectAll("text").data(numOccurrences).enter().append(function(d) { + const rows = d[0].split(common_default.lineBreakRegex); + const dy = -(rows.length - 1) / 2; + const svgLabel = doc.createElementNS("http://www.w3.org/2000/svg", "text"); + svgLabel.setAttribute("dy", dy + "em"); + for (const [j, row] of rows.entries()) { + const tspan = doc.createElementNS("http://www.w3.org/2000/svg", "tspan"); + tspan.setAttribute("alignment-baseline", "central"); + tspan.setAttribute("x", "10"); + if (j > 0) { + tspan.setAttribute("dy", "1em"); + } + tspan.textContent = row; + svgLabel.appendChild(tspan); + } + return svgLabel; + }).attr("x", 10).attr("y", function(d, i) { + if (i > 0) { + for (let j = 0; j < i; j++) { + prevGap += numOccurrences[i - 1][1]; + return d[1] * theGap / 2 + prevGap * theGap + theTopPad; + } + } else { + return d[1] * theGap / 2 + theTopPad; + } + }).attr("font-size", conf.sectionFontSize).attr("class", function(d) { + for (const [i, category] of categories.entries()) { + if (d[0] === category) { + return "sectionTitle sectionTitle" + i % conf.numberSectionStyles; + } + } + return "sectionTitle"; + }); + } + __name(vertLabels, "vertLabels"); + function drawToday(theSidePad, theTopPad, w2, h2) { + const todayMarker2 = diagObj.db.getTodayMarker(); + if (todayMarker2 === "off") { + return; + } + const todayG = svg.append("g").attr("class", "today"); + const today = /* @__PURE__ */ new Date(); + const todayLine = todayG.append("line"); + todayLine.attr("x1", timeScale(today) + theSidePad).attr("x2", timeScale(today) + theSidePad).attr("y1", conf.titleTopMargin).attr("y2", h2 - conf.titleTopMargin).attr("class", "today"); + if (todayMarker2 !== "") { + todayLine.attr("style", todayMarker2.replace(/,/g, ";")); + } + } + __name(drawToday, "drawToday"); + function checkUnique(arr) { + const hash = {}; + const result = []; + for (let i = 0, l = arr.length; i < l; ++i) { + if (!Object.prototype.hasOwnProperty.call(hash, arr[i])) { + hash[arr[i]] = true; + result.push(arr[i]); + } + } + return result; + } + __name(checkUnique, "checkUnique"); +}, "draw"); +var ganttRenderer_default = { + setConf, + draw +}; + +// src/diagrams/gantt/styles.js +var getStyles = /* @__PURE__ */ __name((options) => ` + .mermaid-main-font { + font-family: ${options.fontFamily}; + } + + .exclude-range { + fill: ${options.excludeBkgColor}; + } + + .section { + stroke: none; + opacity: 0.2; + } + + .section0 { + fill: ${options.sectionBkgColor}; + } + + .section2 { + fill: ${options.sectionBkgColor2}; + } + + .section1, + .section3 { + fill: ${options.altSectionBkgColor}; + opacity: 0.2; + } + + .sectionTitle0 { + fill: ${options.titleColor}; + } + + .sectionTitle1 { + fill: ${options.titleColor}; + } + + .sectionTitle2 { + fill: ${options.titleColor}; + } + + .sectionTitle3 { + fill: ${options.titleColor}; + } + + .sectionTitle { + text-anchor: start; + font-family: ${options.fontFamily}; + } + + + /* Grid and axis */ + + .grid .tick { + stroke: ${options.gridColor}; + opacity: 0.8; + shape-rendering: crispEdges; + } + + .grid .tick text { + font-family: ${options.fontFamily}; + fill: ${options.textColor}; + } + + .grid path { + stroke-width: 0; + } + + + /* Today line */ + + .today { + fill: none; + stroke: ${options.todayLineColor}; + stroke-width: 2px; + } + + + /* Task styling */ + + /* Default task */ + + .task { + stroke-width: 2; + } + + .taskText { + text-anchor: middle; + font-family: ${options.fontFamily}; + } + + .taskTextOutsideRight { + fill: ${options.taskTextDarkColor}; + text-anchor: start; + font-family: ${options.fontFamily}; + } + + .taskTextOutsideLeft { + fill: ${options.taskTextDarkColor}; + text-anchor: end; + } + + + /* Special case clickable */ + + .task.clickable { + cursor: pointer; + } + + .taskText.clickable { + cursor: pointer; + fill: ${options.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideLeft.clickable { + cursor: pointer; + fill: ${options.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideRight.clickable { + cursor: pointer; + fill: ${options.taskTextClickableColor} !important; + font-weight: bold; + } + + + /* Specific task settings for the sections*/ + + .taskText0, + .taskText1, + .taskText2, + .taskText3 { + fill: ${options.taskTextColor}; + } + + .task0, + .task1, + .task2, + .task3 { + fill: ${options.taskBkgColor}; + stroke: ${options.taskBorderColor}; + } + + .taskTextOutside0, + .taskTextOutside2 + { + fill: ${options.taskTextOutsideColor}; + } + + .taskTextOutside1, + .taskTextOutside3 { + fill: ${options.taskTextOutsideColor}; + } + + + /* Active task */ + + .active0, + .active1, + .active2, + .active3 { + fill: ${options.activeTaskBkgColor}; + stroke: ${options.activeTaskBorderColor}; + } + + .activeText0, + .activeText1, + .activeText2, + .activeText3 { + fill: ${options.taskTextDarkColor} !important; + } + + + /* Completed task */ + + .done0, + .done1, + .done2, + .done3 { + stroke: ${options.doneTaskBorderColor}; + fill: ${options.doneTaskBkgColor}; + stroke-width: 2; + } + + .doneText0, + .doneText1, + .doneText2, + .doneText3 { + fill: ${options.taskTextDarkColor} !important; + } + + + /* Tasks on the critical line */ + + .crit0, + .crit1, + .crit2, + .crit3 { + stroke: ${options.critBorderColor}; + fill: ${options.critBkgColor}; + stroke-width: 2; + } + + .activeCrit0, + .activeCrit1, + .activeCrit2, + .activeCrit3 { + stroke: ${options.critBorderColor}; + fill: ${options.activeTaskBkgColor}; + stroke-width: 2; + } + + .doneCrit0, + .doneCrit1, + .doneCrit2, + .doneCrit3 { + stroke: ${options.critBorderColor}; + fill: ${options.doneTaskBkgColor}; + stroke-width: 2; + cursor: pointer; + shape-rendering: crispEdges; + } + + .milestone { + transform: rotate(45deg) scale(0.8,0.8); + } + + .milestoneText { + font-style: italic; + } + .doneCritText0, + .doneCritText1, + .doneCritText2, + .doneCritText3 { + fill: ${options.taskTextDarkColor} !important; + } + + .vert { + stroke: ${options.vertLineColor}; + } + + .vertText { + font-size: 15px; + text-anchor: middle; + fill: ${options.vertLineColor} !important; + } + + .activeCritText0, + .activeCritText1, + .activeCritText2, + .activeCritText3 { + fill: ${options.taskTextDarkColor} !important; + } + + .titleText { + text-anchor: middle; + font-size: 18px; + fill: ${options.titleColor || options.textColor}; + font-family: ${options.fontFamily}; + } +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/gantt/ganttDiagram.ts +var diagram = { + parser: gantt_default, + db: ganttDb_default, + renderer: ganttRenderer_default, + styles: styles_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/ganttDiagram-JELNMOA3.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/ganttDiagram-JELNMOA3.mjs.map new file mode 100644 index 0000000..7bd072a --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/ganttDiagram-JELNMOA3.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/gantt/parser/gantt.jison", "../../../src/diagrams/gantt/ganttDb.js", "../../../src/diagrams/gantt/ganttRenderer.js", "../../../src/diagrams/gantt/styles.js", "../../../src/diagrams/gantt/ganttDiagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,10,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,38,40],$V1=[1,26],$V2=[1,27],$V3=[1,28],$V4=[1,29],$V5=[1,30],$V6=[1,31],$V7=[1,32],$V8=[1,33],$V9=[1,34],$Va=[1,9],$Vb=[1,10],$Vc=[1,11],$Vd=[1,12],$Ve=[1,13],$Vf=[1,14],$Vg=[1,15],$Vh=[1,16],$Vi=[1,19],$Vj=[1,20],$Vk=[1,21],$Vl=[1,22],$Vm=[1,23],$Vn=[1,25],$Vo=[1,35];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"gantt\":4,\"document\":5,\"EOF\":6,\"line\":7,\"SPACE\":8,\"statement\":9,\"NL\":10,\"weekday\":11,\"weekday_monday\":12,\"weekday_tuesday\":13,\"weekday_wednesday\":14,\"weekday_thursday\":15,\"weekday_friday\":16,\"weekday_saturday\":17,\"weekday_sunday\":18,\"weekend\":19,\"weekend_friday\":20,\"weekend_saturday\":21,\"dateFormat\":22,\"inclusiveEndDates\":23,\"topAxis\":24,\"axisFormat\":25,\"tickInterval\":26,\"excludes\":27,\"includes\":28,\"todayMarker\":29,\"title\":30,\"acc_title\":31,\"acc_title_value\":32,\"acc_descr\":33,\"acc_descr_value\":34,\"acc_descr_multiline_value\":35,\"section\":36,\"clickStatement\":37,\"taskTxt\":38,\"taskData\":39,\"click\":40,\"callbackname\":41,\"callbackargs\":42,\"href\":43,\"clickStatementDebug\":44,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"gantt\",6:\"EOF\",8:\"SPACE\",10:\"NL\",12:\"weekday_monday\",13:\"weekday_tuesday\",14:\"weekday_wednesday\",15:\"weekday_thursday\",16:\"weekday_friday\",17:\"weekday_saturday\",18:\"weekday_sunday\",20:\"weekend_friday\",21:\"weekend_saturday\",22:\"dateFormat\",23:\"inclusiveEndDates\",24:\"topAxis\",25:\"axisFormat\",26:\"tickInterval\",27:\"excludes\",28:\"includes\",29:\"todayMarker\",30:\"title\",31:\"acc_title\",32:\"acc_title_value\",33:\"acc_descr\",34:\"acc_descr_value\",35:\"acc_descr_multiline_value\",36:\"section\",38:\"taskTxt\",39:\"taskData\",40:\"click\",41:\"callbackname\",42:\"callbackargs\",43:\"href\"},\nproductions_: [0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[19,1],[19,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[37,2],[37,3],[37,3],[37,4],[37,3],[37,4],[37,2],[44,2],[44,3],[44,3],[44,4],[44,3],[44,4],[44,2]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n return $$[$0-1]; \nbreak;\ncase 2:\n this.$ = [] \nbreak;\ncase 3:\n$$[$0-1].push($$[$0]);this.$ = $$[$0-1]\nbreak;\ncase 4: case 5:\n this.$ = $$[$0] \nbreak;\ncase 6: case 7:\n this.$=[];\nbreak;\ncase 8:\n yy.setWeekday(\"monday\");\nbreak;\ncase 9:\n yy.setWeekday(\"tuesday\");\nbreak;\ncase 10:\n yy.setWeekday(\"wednesday\");\nbreak;\ncase 11:\n yy.setWeekday(\"thursday\");\nbreak;\ncase 12:\n yy.setWeekday(\"friday\");\nbreak;\ncase 13:\n yy.setWeekday(\"saturday\");\nbreak;\ncase 14:\n yy.setWeekday(\"sunday\");\nbreak;\ncase 15:\n yy.setWeekend(\"friday\");\nbreak;\ncase 16:\n yy.setWeekend(\"saturday\");\nbreak;\ncase 17:\nyy.setDateFormat($$[$0].substr(11));this.$=$$[$0].substr(11);\nbreak;\ncase 18:\nyy.enableInclusiveEndDates();this.$=$$[$0].substr(18);\nbreak;\ncase 19:\nyy.TopAxis();this.$=$$[$0].substr(8);\nbreak;\ncase 20:\nyy.setAxisFormat($$[$0].substr(11));this.$=$$[$0].substr(11);\nbreak;\ncase 21:\nyy.setTickInterval($$[$0].substr(13));this.$=$$[$0].substr(13);\nbreak;\ncase 22:\nyy.setExcludes($$[$0].substr(9));this.$=$$[$0].substr(9);\nbreak;\ncase 23:\nyy.setIncludes($$[$0].substr(9));this.$=$$[$0].substr(9);\nbreak;\ncase 24:\nyy.setTodayMarker($$[$0].substr(12));this.$=$$[$0].substr(12);\nbreak;\ncase 27:\nyy.setDiagramTitle($$[$0].substr(6));this.$=$$[$0].substr(6);\nbreak;\ncase 28:\n this.$=$$[$0].trim();yy.setAccTitle(this.$); \nbreak;\ncase 29: case 30:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 31:\n yy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8); \nbreak;\ncase 33:\nyy.addTask($$[$0-1],$$[$0]);this.$='task';\nbreak;\ncase 34:\nthis.$ = $$[$0-1];yy.setClickEvent($$[$0-1], $$[$0], null);\nbreak;\ncase 35:\nthis.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]);\nbreak;\ncase 36:\nthis.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], null);yy.setLink($$[$0-2],$$[$0]);\nbreak;\ncase 37:\nthis.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-2], $$[$0-1]);yy.setLink($$[$0-3],$$[$0]);\nbreak;\ncase 38:\nthis.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0], null);yy.setLink($$[$0-2],$$[$0-1]);\nbreak;\ncase 39:\nthis.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-1], $$[$0]);yy.setLink($$[$0-3],$$[$0-2]);\nbreak;\ncase 40:\nthis.$ = $$[$0-1];yy.setLink($$[$0-1], $$[$0]);\nbreak;\ncase 41: case 47:\nthis.$=$$[$0-1] + ' ' + $$[$0];\nbreak;\ncase 42: case 43: case 45:\nthis.$=$$[$0-2] + ' ' + $$[$0-1] + ' ' + $$[$0];\nbreak;\ncase 44: case 46:\nthis.$=$$[$0-3] + ' ' + $$[$0-2] + ' ' + $$[$0-1] + ' ' + $$[$0];\nbreak;\n}\n},\ntable: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:$V1,13:$V2,14:$V3,15:$V4,16:$V5,17:$V6,18:$V7,19:18,20:$V8,21:$V9,22:$Va,23:$Vb,24:$Vc,25:$Vd,26:$Ve,27:$Vf,28:$Vg,29:$Vh,30:$Vi,31:$Vj,33:$Vk,35:$Vl,36:$Vm,37:24,38:$Vn,40:$Vo},o($V0,[2,7],{1:[2,1]}),o($V0,[2,3]),{9:36,11:17,12:$V1,13:$V2,14:$V3,15:$V4,16:$V5,17:$V6,18:$V7,19:18,20:$V8,21:$V9,22:$Va,23:$Vb,24:$Vc,25:$Vd,26:$Ve,27:$Vf,28:$Vg,29:$Vh,30:$Vi,31:$Vj,33:$Vk,35:$Vl,36:$Vm,37:24,38:$Vn,40:$Vo},o($V0,[2,5]),o($V0,[2,6]),o($V0,[2,17]),o($V0,[2,18]),o($V0,[2,19]),o($V0,[2,20]),o($V0,[2,21]),o($V0,[2,22]),o($V0,[2,23]),o($V0,[2,24]),o($V0,[2,25]),o($V0,[2,26]),o($V0,[2,27]),{32:[1,37]},{34:[1,38]},o($V0,[2,30]),o($V0,[2,31]),o($V0,[2,32]),{39:[1,39]},o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),{41:[1,40],43:[1,41]},o($V0,[2,4]),o($V0,[2,28]),o($V0,[2,29]),o($V0,[2,33]),o($V0,[2,34],{42:[1,42],43:[1,43]}),o($V0,[2,40],{41:[1,44]}),o($V0,[2,35],{43:[1,45]}),o($V0,[2,36]),o($V0,[2,38],{42:[1,46]}),o($V0,[2,37]),o($V0,[2,39])],\ndefaultActions: {},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin('open_directive'); return 'open_directive'; \nbreak;\ncase 1: this.begin(\"acc_title\");return 31; \nbreak;\ncase 2: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 3: this.begin(\"acc_descr\");return 33; \nbreak;\ncase 4: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 5: this.begin(\"acc_descr_multiline\");\nbreak;\ncase 6: this.popState(); \nbreak;\ncase 7:return \"acc_descr_multiline_value\";\nbreak;\ncase 8:/* skip comments */\nbreak;\ncase 9:/* skip comments */\nbreak;\ncase 10:/* do nothing */\nbreak;\ncase 11:return 10;\nbreak;\ncase 12:/* skip whitespace */\nbreak;\ncase 13:/* skip comments */\nbreak;\ncase 14:this.begin(\"href\");\nbreak;\ncase 15:this.popState();\nbreak;\ncase 16:return 43;\nbreak;\ncase 17:this.begin(\"callbackname\");\nbreak;\ncase 18:this.popState();\nbreak;\ncase 19:this.popState(); this.begin(\"callbackargs\");\nbreak;\ncase 20:return 41;\nbreak;\ncase 21:this.popState();\nbreak;\ncase 22:return 42;\nbreak;\ncase 23:this.begin(\"click\");\nbreak;\ncase 24:this.popState();\nbreak;\ncase 25:return 40;\nbreak;\ncase 26:return 4;\nbreak;\ncase 27:return 22;\nbreak;\ncase 28:return 23;\nbreak;\ncase 29:return 24;\nbreak;\ncase 30:return 25;\nbreak;\ncase 31:return 26;\nbreak;\ncase 32:return 28;\nbreak;\ncase 33:return 27;\nbreak;\ncase 34:return 29;\nbreak;\ncase 35:return 12\nbreak;\ncase 36:return 13\nbreak;\ncase 37:return 14\nbreak;\ncase 38:return 15\nbreak;\ncase 39:return 16\nbreak;\ncase 40:return 17\nbreak;\ncase 41:return 18\nbreak;\ncase 42:return 20\nbreak;\ncase 43:return 21\nbreak;\ncase 44:return 'date';\nbreak;\ncase 45:return 30;\nbreak;\ncase 46:return 'accDescription'\nbreak;\ncase 47:return 36;\nbreak;\ncase 48:return 38;\nbreak;\ncase 49:return 39;\nbreak;\ncase 50:return ':';\nbreak;\ncase 51:return 6;\nbreak;\ncase 52:return 'INVALID';\nbreak;\n}\n},\nrules: [/^(?:%%\\{)/i,/^(?:accTitle\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*\\{\\s*)/i,/^(?:[\\}])/i,/^(?:[^\\}]*)/i,/^(?:%%(?!\\{)*[^\\n]*)/i,/^(?:[^\\}]%%*[^\\n]*)/i,/^(?:%%*[^\\n]*[\\n]*)/i,/^(?:[\\n]+)/i,/^(?:\\s+)/i,/^(?:%[^\\n]*)/i,/^(?:href[\\s]+[\"])/i,/^(?:[\"])/i,/^(?:[^\"]*)/i,/^(?:call[\\s]+)/i,/^(?:\\([\\s]*\\))/i,/^(?:\\()/i,/^(?:[^(]*)/i,/^(?:\\))/i,/^(?:[^)]*)/i,/^(?:click[\\s]+)/i,/^(?:[\\s\\n])/i,/^(?:[^\\s\\n]*)/i,/^(?:gantt\\b)/i,/^(?:dateFormat\\s[^#\\n;]+)/i,/^(?:inclusiveEndDates\\b)/i,/^(?:topAxis\\b)/i,/^(?:axisFormat\\s[^#\\n;]+)/i,/^(?:tickInterval\\s[^#\\n;]+)/i,/^(?:includes\\s[^#\\n;]+)/i,/^(?:excludes\\s[^#\\n;]+)/i,/^(?:todayMarker\\s[^\\n;]+)/i,/^(?:weekday\\s+monday\\b)/i,/^(?:weekday\\s+tuesday\\b)/i,/^(?:weekday\\s+wednesday\\b)/i,/^(?:weekday\\s+thursday\\b)/i,/^(?:weekday\\s+friday\\b)/i,/^(?:weekday\\s+saturday\\b)/i,/^(?:weekday\\s+sunday\\b)/i,/^(?:weekend\\s+friday\\b)/i,/^(?:weekend\\s+saturday\\b)/i,/^(?:\\d\\d\\d\\d-\\d\\d-\\d\\d\\b)/i,/^(?:title\\s[^\\n]+)/i,/^(?:accDescription\\s[^#\\n;]+)/i,/^(?:section\\s[^\\n]+)/i,/^(?:[^:\\n]+)/i,/^(?::[^#\\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],\nconditions: {\"acc_descr_multiline\":{\"rules\":[6,7],\"inclusive\":false},\"acc_descr\":{\"rules\":[4],\"inclusive\":false},\"acc_title\":{\"rules\":[2],\"inclusive\":false},\"callbackargs\":{\"rules\":[21,22],\"inclusive\":false},\"callbackname\":{\"rules\":[18,19,20],\"inclusive\":false},\"href\":{\"rules\":[15,16],\"inclusive\":false},\"click\":{\"rules\":[24,25],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,3,5,8,9,10,11,12,13,14,17,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { sanitizeUrl } from '@braintree/sanitize-url';\nimport dayjs from 'dayjs';\nimport dayjsIsoWeek from 'dayjs/plugin/isoWeek.js';\nimport dayjsCustomParseFormat from 'dayjs/plugin/customParseFormat.js';\nimport dayjsAdvancedFormat from 'dayjs/plugin/advancedFormat.js';\nimport { log } from '../../logger.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport utils from '../../utils.js';\n\nimport {\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n clear as commonClear,\n setDiagramTitle,\n getDiagramTitle,\n} from '../common/commonDb.js';\n\ndayjs.extend(dayjsIsoWeek);\ndayjs.extend(dayjsCustomParseFormat);\ndayjs.extend(dayjsAdvancedFormat);\n\nconst WEEKEND_START_DAY = { friday: 5, saturday: 6 };\nlet dateFormat = '';\nlet axisFormat = '';\nlet tickInterval = undefined;\nlet todayMarker = '';\nlet includes = [];\nlet excludes = [];\nlet links = new Map();\nlet sections = [];\nlet tasks = [];\nlet currentSection = '';\nlet displayMode = '';\nconst tags = ['active', 'done', 'crit', 'milestone', 'vert'];\nlet funs = [];\nlet inclusiveEndDates = false;\nlet topAxis = false;\nlet weekday = 'sunday';\nlet weekend = 'saturday';\n\n// The serial order of the task in the script\nlet lastOrder = 0;\n\nexport const clear = function () {\n sections = [];\n tasks = [];\n currentSection = '';\n funs = [];\n taskCnt = 0;\n lastTask = undefined;\n lastTaskID = undefined;\n rawTasks = [];\n dateFormat = '';\n axisFormat = '';\n displayMode = '';\n tickInterval = undefined;\n todayMarker = '';\n includes = [];\n excludes = [];\n inclusiveEndDates = false;\n topAxis = false;\n lastOrder = 0;\n links = new Map();\n commonClear();\n weekday = 'sunday';\n weekend = 'saturday';\n};\n\nexport const setAxisFormat = function (txt) {\n axisFormat = txt;\n};\n\nexport const getAxisFormat = function () {\n return axisFormat;\n};\n\nexport const setTickInterval = function (txt) {\n tickInterval = txt;\n};\n\nexport const getTickInterval = function () {\n return tickInterval;\n};\n\nexport const setTodayMarker = function (txt) {\n todayMarker = txt;\n};\n\nexport const getTodayMarker = function () {\n return todayMarker;\n};\n\nexport const setDateFormat = function (txt) {\n dateFormat = txt;\n};\n\nexport const enableInclusiveEndDates = function () {\n inclusiveEndDates = true;\n};\n\nexport const endDatesAreInclusive = function () {\n return inclusiveEndDates;\n};\n\nexport const enableTopAxis = function () {\n topAxis = true;\n};\n\nexport const topAxisEnabled = function () {\n return topAxis;\n};\n\nexport const setDisplayMode = function (txt) {\n displayMode = txt;\n};\n\nexport const getDisplayMode = function () {\n return displayMode;\n};\n\nexport const getDateFormat = function () {\n return dateFormat;\n};\n\nexport const setIncludes = function (txt) {\n includes = txt.toLowerCase().split(/[\\s,]+/);\n};\n\nexport const getIncludes = function () {\n return includes;\n};\nexport const setExcludes = function (txt) {\n excludes = txt.toLowerCase().split(/[\\s,]+/);\n};\n\nexport const getExcludes = function () {\n return excludes;\n};\n\nexport const getLinks = function () {\n return links;\n};\n\nexport const addSection = function (txt) {\n currentSection = txt;\n sections.push(txt);\n};\n\nexport const getSections = function () {\n return sections;\n};\n\nexport const getTasks = function () {\n let allItemsProcessed = compileTasks();\n const maxDepth = 10;\n let iterationCount = 0;\n while (!allItemsProcessed && iterationCount < maxDepth) {\n allItemsProcessed = compileTasks();\n iterationCount++;\n }\n\n tasks = rawTasks;\n\n return tasks;\n};\n\nexport const isInvalidDate = function (date, dateFormat, excludes, includes) {\n const formattedDate = date.format(dateFormat.trim());\n const dateOnly = date.format('YYYY-MM-DD');\n\n if (includes.includes(formattedDate) || includes.includes(dateOnly)) {\n return false;\n }\n if (\n excludes.includes('weekends') &&\n (date.isoWeekday() === WEEKEND_START_DAY[weekend] ||\n date.isoWeekday() === WEEKEND_START_DAY[weekend] + 1)\n ) {\n return true;\n }\n if (excludes.includes(date.format('dddd').toLowerCase())) {\n return true;\n }\n return excludes.includes(formattedDate) || excludes.includes(dateOnly);\n};\n\nexport const setWeekday = function (txt) {\n weekday = txt;\n};\n\nexport const getWeekday = function () {\n return weekday;\n};\n\nexport const setWeekend = function (startDay) {\n weekend = startDay;\n};\n\n/**\n * TODO: fully document what this function does and what types it accepts\n *\n * @param {object} task - The task to check.\n * @param {string | Date} task.startTime - Might be a `Date` or a `string`.\n * TODO: is this always a Date?\n * @param {string | Date} task.endTime - Might be a `Date` or a `string`.\n * TODO: is this always a Date?\n * @param {string} dateFormat - Dayjs date format string.\n * @param {*} excludes\n * @param {*} includes\n */\nconst checkTaskDates = function (task, dateFormat, excludes, includes) {\n if (!excludes.length || task.manualEndTime) {\n return;\n }\n let startTime;\n if (task.startTime instanceof Date) {\n startTime = dayjs(task.startTime);\n } else {\n startTime = dayjs(task.startTime, dateFormat, true);\n }\n startTime = startTime.add(1, 'd');\n\n let originalEndTime;\n if (task.endTime instanceof Date) {\n originalEndTime = dayjs(task.endTime);\n } else {\n originalEndTime = dayjs(task.endTime, dateFormat, true);\n }\n const [fixedEndTime, renderEndTime] = fixTaskDates(\n startTime,\n originalEndTime,\n dateFormat,\n excludes,\n includes\n );\n task.endTime = fixedEndTime.toDate();\n task.renderEndTime = renderEndTime;\n};\n\n/**\n * TODO: what does this function do?\n *\n * @param {dayjs.Dayjs} startTime - The start time.\n * @param {dayjs.Dayjs} endTime - The original end time (will return a different end time if it's invalid).\n * @param {string} dateFormat - Dayjs date format string.\n * @param {*} excludes\n * @param {*} includes\n * @returns {[endTime: dayjs.Dayjs, renderEndTime: Date | null]} The new `endTime`, and the end time to render.\n * `renderEndTime` may be `null` if `startTime` is newer than `endTime`.\n */\nconst fixTaskDates = function (startTime, endTime, dateFormat, excludes, includes) {\n let invalid = false;\n let renderEndTime = null;\n while (startTime <= endTime) {\n if (!invalid) {\n renderEndTime = endTime.toDate();\n }\n invalid = isInvalidDate(startTime, dateFormat, excludes, includes);\n if (invalid) {\n endTime = endTime.add(1, 'd');\n }\n startTime = startTime.add(1, 'd');\n }\n return [endTime, renderEndTime];\n};\n\nconst getStartDate = function (prevTime, dateFormat, str) {\n str = str.trim();\n\n // Helper function to check if format is a timestamp format (x or X)\n const isTimestampFormat = (format) => {\n const trimmedFormat = format.trim();\n return trimmedFormat === 'x' || trimmedFormat === 'X';\n };\n\n // Handle timestamp formats (x, X) with numeric strings\n if (isTimestampFormat(dateFormat) && /^\\d+$/.test(str)) {\n return new Date(Number(str));\n }\n // Test for after\n const afterRePattern = /^after\\s+(?[\\d\\w- ]+)/;\n const afterStatement = afterRePattern.exec(str);\n\n if (afterStatement !== null) {\n // check all after ids and take the latest\n let latestTask = null;\n for (const id of afterStatement.groups.ids.split(' ')) {\n let task = findTaskById(id);\n if (task !== undefined && (!latestTask || task.endTime > latestTask.endTime)) {\n latestTask = task;\n }\n }\n\n if (latestTask) {\n return latestTask.endTime;\n }\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return today;\n }\n\n // Check for actual date set using dayjs strict parsing\n let mDate = dayjs(str, dateFormat.trim(), true);\n if (mDate.isValid()) {\n return mDate.toDate();\n } else {\n log.debug('Invalid date:' + str);\n log.debug('With date format:' + dateFormat.trim());\n\n // Timestamp formats can fall back to new Date()\n const d = new Date(str);\n if (\n d === undefined ||\n isNaN(d.getTime()) ||\n // WebKit browsers can mis-parse invalid dates to be ridiculously\n // huge numbers, e.g. new Date('202304') gets parsed as January 1, 202304.\n // This can cause virtually infinite loops while rendering, so for the\n // purposes of Gantt charts we'll just treat any date beyond 10,000 AD/BC as\n // invalid.\n d.getFullYear() < -10000 ||\n d.getFullYear() > 10000\n ) {\n throw new Error('Invalid date:' + str);\n }\n return d;\n }\n};\n\n/**\n * Parse a string into the args for `dayjs.add()`.\n *\n * The string have to be compound by a value and a shorthand duration unit. For example `5d`\n * represents 5 days.\n *\n * Please be aware that 1 day may be 23 or 25 hours, if the user lives in an area\n * that has daylight savings time (or even 23.5/24.5 hours in Lord Howe Island!)\n *\n * Shorthand unit supported are:\n *\n * - `y` for years\n * - `M` for months\n * - `w` for weeks\n * - `d` for days\n * - `h` for hours\n * - `s` for seconds\n * - `ms` for milliseconds\n *\n * @param {string} str - A string representing the duration.\n * @returns {[value: number, unit: dayjs.ManipulateType]} Arguments to pass to `dayjs.add()`\n */\nconst parseDuration = function (str) {\n // cspell:disable-next-line\n const statement = /^(\\d+(?:\\.\\d+)?)([Mdhmswy]|ms)$/.exec(str.trim());\n if (statement !== null) {\n return [Number.parseFloat(statement[1]), statement[2]];\n }\n // NaN means an invalid duration\n return [NaN, 'ms'];\n};\n\nconst getEndDate = function (prevTime, dateFormat, str, inclusive = false) {\n str = str.trim();\n\n // test for until\n const untilRePattern = /^until\\s+(?[\\d\\w- ]+)/;\n const untilStatement = untilRePattern.exec(str);\n\n if (untilStatement !== null) {\n // check all until ids and take the earliest\n let earliestTask = null;\n for (const id of untilStatement.groups.ids.split(' ')) {\n let task = findTaskById(id);\n if (task !== undefined && (!earliestTask || task.startTime < earliestTask.startTime)) {\n earliestTask = task;\n }\n }\n\n if (earliestTask) {\n return earliestTask.startTime;\n }\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return today;\n }\n\n // check for actual date\n let parsedDate = dayjs(str, dateFormat.trim(), true);\n if (parsedDate.isValid()) {\n if (inclusive) {\n parsedDate = parsedDate.add(1, 'd');\n }\n return parsedDate.toDate();\n }\n\n let endTime = dayjs(prevTime);\n const [durationValue, durationUnit] = parseDuration(str);\n if (!Number.isNaN(durationValue)) {\n const newEndTime = endTime.add(durationValue, durationUnit);\n if (newEndTime.isValid()) {\n endTime = newEndTime;\n }\n }\n return endTime.toDate();\n};\n\nlet taskCnt = 0;\nconst parseId = function (idStr) {\n if (idStr === undefined) {\n taskCnt = taskCnt + 1;\n return 'task' + taskCnt;\n }\n return idStr;\n};\n// id, startDate, endDate\n// id, startDate, length\n// id, after x, endDate\n// id, after x, length\n// startDate, endDate\n// startDate, length\n// after x, endDate\n// after x, length\n// endDate\n// length\n\nconst compileData = function (prevTask, dataStr) {\n let ds;\n\n if (dataStr.substr(0, 1) === ':') {\n ds = dataStr.substr(1, dataStr.length);\n } else {\n ds = dataStr;\n }\n\n const data = ds.split(',');\n\n const task = {};\n\n // Get tags like active, done, crit, milestone, and vert\n getTaskTags(data, task, tags);\n\n for (let i = 0; i < data.length; i++) {\n data[i] = data[i].trim();\n }\n\n let endTimeData = '';\n switch (data.length) {\n case 1:\n task.id = parseId();\n task.startTime = prevTask.endTime;\n endTimeData = data[0];\n break;\n case 2:\n task.id = parseId();\n task.startTime = getStartDate(undefined, dateFormat, data[0]);\n endTimeData = data[1];\n break;\n case 3:\n task.id = parseId(data[0]);\n task.startTime = getStartDate(undefined, dateFormat, data[1]);\n endTimeData = data[2];\n break;\n default:\n }\n\n if (endTimeData) {\n task.endTime = getEndDate(task.startTime, dateFormat, endTimeData, inclusiveEndDates);\n task.manualEndTime = dayjs(endTimeData, 'YYYY-MM-DD', true).isValid();\n checkTaskDates(task, dateFormat, excludes, includes);\n }\n\n return task;\n};\n\nconst parseData = function (prevTaskId, dataStr) {\n let ds;\n if (dataStr.substr(0, 1) === ':') {\n ds = dataStr.substr(1, dataStr.length);\n } else {\n ds = dataStr;\n }\n\n const data = ds.split(',');\n\n const task = {};\n\n // Get tags like active, done, crit, milestone, and vert\n getTaskTags(data, task, tags);\n\n for (let i = 0; i < data.length; i++) {\n data[i] = data[i].trim();\n }\n\n switch (data.length) {\n case 1:\n task.id = parseId();\n task.startTime = {\n type: 'prevTaskEnd',\n id: prevTaskId,\n };\n task.endTime = {\n data: data[0],\n };\n break;\n case 2:\n task.id = parseId();\n task.startTime = {\n type: 'getStartDate',\n startData: data[0],\n };\n task.endTime = {\n data: data[1],\n };\n break;\n case 3:\n task.id = parseId(data[0]);\n task.startTime = {\n type: 'getStartDate',\n startData: data[1],\n };\n task.endTime = {\n data: data[2],\n };\n break;\n default:\n }\n\n return task;\n};\n\nlet lastTask;\nlet lastTaskID;\nlet rawTasks = [];\nconst taskDb = {};\nexport const addTask = function (descr, data) {\n const rawTask = {\n section: currentSection,\n type: currentSection,\n processed: false,\n manualEndTime: false,\n renderEndTime: null,\n raw: { data: data },\n task: descr,\n classes: [],\n };\n const taskInfo = parseData(lastTaskID, data);\n rawTask.raw.startTime = taskInfo.startTime;\n rawTask.raw.endTime = taskInfo.endTime;\n rawTask.id = taskInfo.id;\n rawTask.prevTaskId = lastTaskID;\n rawTask.active = taskInfo.active;\n rawTask.done = taskInfo.done;\n rawTask.crit = taskInfo.crit;\n rawTask.milestone = taskInfo.milestone;\n rawTask.vert = taskInfo.vert;\n rawTask.order = lastOrder;\n\n lastOrder++;\n\n const pos = rawTasks.push(rawTask);\n\n lastTaskID = rawTask.id;\n // Store cross ref\n taskDb[rawTask.id] = pos - 1;\n};\n\nexport const findTaskById = function (id) {\n const pos = taskDb[id];\n return rawTasks[pos];\n};\n\nexport const addTaskOrg = function (descr, data) {\n const newTask = {\n section: currentSection,\n type: currentSection,\n description: descr,\n task: descr,\n classes: [],\n };\n const taskInfo = compileData(lastTask, data);\n newTask.startTime = taskInfo.startTime;\n newTask.endTime = taskInfo.endTime;\n newTask.id = taskInfo.id;\n newTask.active = taskInfo.active;\n newTask.done = taskInfo.done;\n newTask.crit = taskInfo.crit;\n newTask.milestone = taskInfo.milestone;\n newTask.vert = taskInfo.vert;\n lastTask = newTask;\n tasks.push(newTask);\n};\n\nconst compileTasks = function () {\n const compileTask = function (pos) {\n const task = rawTasks[pos];\n let startTime = '';\n switch (rawTasks[pos].raw.startTime.type) {\n case 'prevTaskEnd': {\n const prevTask = findTaskById(task.prevTaskId);\n task.startTime = prevTask.endTime;\n break;\n }\n case 'getStartDate':\n startTime = getStartDate(undefined, dateFormat, rawTasks[pos].raw.startTime.startData);\n if (startTime) {\n rawTasks[pos].startTime = startTime;\n }\n break;\n }\n\n if (rawTasks[pos].startTime) {\n rawTasks[pos].endTime = getEndDate(\n rawTasks[pos].startTime,\n dateFormat,\n rawTasks[pos].raw.endTime.data,\n inclusiveEndDates\n );\n if (rawTasks[pos].endTime) {\n rawTasks[pos].processed = true;\n rawTasks[pos].manualEndTime = dayjs(\n rawTasks[pos].raw.endTime.data,\n 'YYYY-MM-DD',\n true\n ).isValid();\n checkTaskDates(rawTasks[pos], dateFormat, excludes, includes);\n }\n }\n\n return rawTasks[pos].processed;\n };\n\n let allProcessed = true;\n for (const [i, rawTask] of rawTasks.entries()) {\n compileTask(i);\n\n allProcessed = allProcessed && rawTask.processed;\n }\n return allProcessed;\n};\n\n/**\n * Called by parser when a link is found. Adds the URL to the vertex data.\n *\n * @param ids Comma separated list of ids\n * @param _linkStr URL to create a link for\n */\nexport const setLink = function (ids, _linkStr) {\n let linkStr = _linkStr;\n if (getConfig().securityLevel !== 'loose') {\n linkStr = sanitizeUrl(_linkStr);\n }\n ids.split(',').forEach(function (id) {\n let rawTask = findTaskById(id);\n if (rawTask !== undefined) {\n pushFun(id, () => {\n window.open(linkStr, '_self');\n });\n links.set(id, linkStr);\n }\n });\n setClass(ids, 'clickable');\n};\n\n/**\n * Called by parser when a special node is found, e.g. a clickable element.\n *\n * @param ids Comma separated list of ids\n * @param className Class to add\n */\nexport const setClass = function (ids, className) {\n ids.split(',').forEach(function (id) {\n let rawTask = findTaskById(id);\n if (rawTask !== undefined) {\n rawTask.classes.push(className);\n }\n });\n};\n\nconst setClickFun = function (id, functionName, functionArgs) {\n if (getConfig().securityLevel !== 'loose') {\n return;\n }\n if (functionName === undefined) {\n return;\n }\n\n let argList = [];\n if (typeof functionArgs === 'string') {\n /* Splits functionArgs by ',', ignoring all ',' in double quoted strings */\n argList = functionArgs.split(/,(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n for (let i = 0; i < argList.length; i++) {\n let item = argList[i].trim();\n /* Removes all double quotes at the start and end of an argument */\n /* This preserves all starting and ending whitespace inside */\n if (item.startsWith('\"') && item.endsWith('\"')) {\n item = item.substr(1, item.length - 2);\n }\n argList[i] = item;\n }\n }\n\n /* if no arguments passed into callback, default to passing in id */\n if (argList.length === 0) {\n argList.push(id);\n }\n\n let rawTask = findTaskById(id);\n if (rawTask !== undefined) {\n pushFun(id, () => {\n utils.runFunc(functionName, ...argList);\n });\n }\n};\n\n/**\n * The callbackFunction is executed in a click event bound to the task with the specified id or the\n * task's assigned text\n *\n * @param id The task's id\n * @param callbackFunction A function to be executed when clicked on the task or the task's text\n */\nconst pushFun = function (id, callbackFunction) {\n funs.push(\n function () {\n // const elem = d3.select(element).select(`[id=\"${id}\"]`)\n const elem = document.querySelector(`[id=\"${id}\"]`);\n if (elem !== null) {\n elem.addEventListener('click', function () {\n callbackFunction();\n });\n }\n },\n function () {\n // const elem = d3.select(element).select(`[id=\"${id}-text\"]`)\n const elem = document.querySelector(`[id=\"${id}-text\"]`);\n if (elem !== null) {\n elem.addEventListener('click', function () {\n callbackFunction();\n });\n }\n }\n );\n};\n\n/**\n * Called by parser when a click definition is found. Registers an event handler.\n *\n * @param ids Comma separated list of ids\n * @param functionName Function to be called on click\n * @param functionArgs Function args the function should be called with\n */\nexport const setClickEvent = function (ids, functionName, functionArgs) {\n ids.split(',').forEach(function (id) {\n setClickFun(id, functionName, functionArgs);\n });\n setClass(ids, 'clickable');\n};\n\n/**\n * Binds all functions previously added to fun (specified through click) to the element\n *\n * @param element\n */\nexport const bindFunctions = function (element) {\n funs.forEach(function (fun) {\n fun(element);\n });\n};\n\nexport default {\n getConfig: () => getConfig().gantt,\n clear,\n setDateFormat,\n getDateFormat,\n enableInclusiveEndDates,\n endDatesAreInclusive,\n enableTopAxis,\n topAxisEnabled,\n setAxisFormat,\n getAxisFormat,\n setTickInterval,\n getTickInterval,\n setTodayMarker,\n getTodayMarker,\n setAccTitle,\n getAccTitle,\n setDiagramTitle,\n getDiagramTitle,\n setDisplayMode,\n getDisplayMode,\n setAccDescription,\n getAccDescription,\n addSection,\n getSections,\n getTasks,\n addTask,\n findTaskById,\n addTaskOrg,\n setIncludes,\n getIncludes,\n setExcludes,\n getExcludes,\n setClickEvent,\n setLink,\n getLinks,\n bindFunctions,\n parseDuration,\n isInvalidDate,\n setWeekday,\n getWeekday,\n setWeekend,\n};\n\n/**\n * @param data\n * @param task\n * @param tags\n */\nfunction getTaskTags(data, task, tags) {\n let matchFound = true;\n while (matchFound) {\n matchFound = false;\n tags.forEach(function (t) {\n const pattern = '^\\\\s*' + t + '\\\\s*$';\n const regex = new RegExp(pattern);\n if (data[0].match(regex)) {\n task[t] = true;\n data.shift(1);\n matchFound = true;\n }\n });\n }\n}\n", "import dayjs from 'dayjs';\nimport dayjsDuration from 'dayjs/plugin/duration.js';\nimport { log } from '../../logger.js';\nimport {\n select,\n scaleTime,\n min,\n max,\n scaleLinear,\n interpolateHcl,\n axisBottom,\n axisTop,\n timeFormat,\n timeMillisecond,\n timeSecond,\n timeMinute,\n timeHour,\n timeDay,\n timeMonday,\n timeTuesday,\n timeWednesday,\n timeThursday,\n timeFriday,\n timeSaturday,\n timeSunday,\n timeMonth,\n} from 'd3';\nimport common from '../common/common.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\n\ndayjs.extend(dayjsDuration);\n\nexport const setConf = function () {\n log.debug('Something is calling, setConf, remove the call');\n};\n\n/**\n * This will map any day of the week that can be set in the `weekday` option to\n * the corresponding d3-time function that is used to calculate the ticks.\n */\nconst mapWeekdayToTimeFunction = {\n monday: timeMonday,\n tuesday: timeTuesday,\n wednesday: timeWednesday,\n thursday: timeThursday,\n friday: timeFriday,\n saturday: timeSaturday,\n sunday: timeSunday,\n};\n\n/**\n * For this issue:\n * https://github.com/mermaid-js/mermaid/issues/1618\n *\n * Finds the number of intersections between tasks that happen at any point in time.\n * Used to figure out how many rows are needed to display the tasks when the display\n * mode is set to 'compact'.\n *\n * @param tasks\n * @param orderOffset\n */\nconst getMaxIntersections = (tasks, orderOffset) => {\n let timeline = [...tasks].map(() => -Infinity);\n let sorted = [...tasks].sort((a, b) => a.startTime - b.startTime || a.order - b.order);\n let maxIntersections = 0;\n for (const element of sorted) {\n for (let j = 0; j < timeline.length; j++) {\n if (element.startTime >= timeline[j]) {\n timeline[j] = element.endTime;\n element.order = j + orderOffset;\n if (j > maxIntersections) {\n maxIntersections = j;\n }\n break;\n }\n }\n }\n\n return maxIntersections;\n};\n\nlet w;\nconst MAX_TICK_COUNT = 10000;\nexport const draw = function (text, id, version, diagObj) {\n const conf = getConfig().gantt;\n\n const securityLevel = getConfig().securityLevel;\n // Handle root and Document for when rendering in sandbox mode\n let sandboxElement;\n if (securityLevel === 'sandbox') {\n sandboxElement = select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? select(sandboxElement.nodes()[0].contentDocument.body)\n : select('body');\n const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0].contentDocument : document;\n\n const elem = doc.getElementById(id);\n w = elem.parentElement.offsetWidth;\n\n if (w === undefined) {\n w = 1200;\n }\n\n if (conf.useWidth !== undefined) {\n w = conf.useWidth;\n }\n\n const taskArray = diagObj.db.getTasks();\n\n // Set height based on number of tasks\n\n let categories = [];\n\n for (const element of taskArray) {\n categories.push(element.type);\n }\n\n categories = checkUnique(categories);\n const categoryHeights = {};\n\n let h = 2 * conf.topPadding;\n if (diagObj.db.getDisplayMode() === 'compact' || conf.displayMode === 'compact') {\n const categoryElements = {};\n for (const element of taskArray) {\n if (categoryElements[element.section] === undefined) {\n categoryElements[element.section] = [element];\n } else {\n categoryElements[element.section].push(element);\n }\n }\n\n let intersections = 0;\n for (const category of Object.keys(categoryElements)) {\n const categoryHeight = getMaxIntersections(categoryElements[category], intersections) + 1;\n intersections += categoryHeight;\n h += categoryHeight * (conf.barHeight + conf.barGap);\n categoryHeights[category] = categoryHeight;\n }\n } else {\n h += taskArray.length * (conf.barHeight + conf.barGap);\n for (const category of categories) {\n categoryHeights[category] = taskArray.filter((task) => task.type === category).length;\n }\n }\n\n // Set viewBox\n elem.setAttribute('viewBox', '0 0 ' + w + ' ' + h);\n const svg = root.select(`[id=\"${id}\"]`);\n\n // Set timescale\n const timeScale = scaleTime()\n .domain([\n min(taskArray, function (d) {\n return d.startTime;\n }),\n max(taskArray, function (d) {\n return d.endTime;\n }),\n ])\n .rangeRound([0, w - conf.leftPadding - conf.rightPadding]);\n\n /**\n * @param a\n * @param b\n */\n function taskCompare(a, b) {\n const taskA = a.startTime;\n const taskB = b.startTime;\n let result = 0;\n if (taskA > taskB) {\n result = 1;\n } else if (taskA < taskB) {\n result = -1;\n }\n return result;\n }\n\n // Sort the task array using the above taskCompare() so that\n // tasks are created based on their order of startTime\n taskArray.sort(taskCompare);\n\n makeGantt(taskArray, w, h);\n\n configureSvgSize(svg, h, w, conf.useMaxWidth);\n\n svg\n .append('text')\n .text(diagObj.db.getDiagramTitle())\n .attr('x', w / 2)\n .attr('y', conf.titleTopMargin)\n .attr('class', 'titleText');\n\n /**\n * @param tasks\n * @param pageWidth\n * @param pageHeight\n */\n function makeGantt(tasks, pageWidth, pageHeight) {\n const barHeight = conf.barHeight;\n const gap = barHeight + conf.barGap;\n const topPadding = conf.topPadding;\n const leftPadding = conf.leftPadding;\n\n const colorScale = scaleLinear()\n .domain([0, categories.length])\n .range(['#00B9FA', '#F95002'])\n .interpolate(interpolateHcl);\n\n drawExcludeDays(\n gap,\n topPadding,\n leftPadding,\n pageWidth,\n pageHeight,\n tasks,\n diagObj.db.getExcludes(),\n diagObj.db.getIncludes()\n );\n makeGrid(leftPadding, topPadding, pageWidth, pageHeight);\n drawRects(tasks, gap, topPadding, leftPadding, barHeight, colorScale, pageWidth, pageHeight);\n vertLabels(gap, topPadding, leftPadding, barHeight, colorScale);\n drawToday(leftPadding, topPadding, pageWidth, pageHeight);\n }\n\n /**\n * @param theArray\n * @param theGap\n * @param theTopPad\n * @param theSidePad\n * @param theBarHeight\n * @param theColorScale\n * @param w\n */\n function drawRects(theArray, theGap, theTopPad, theSidePad, theBarHeight, theColorScale, w) {\n // Sort theArray so that tasks with `vert` come last\n theArray.sort((a, b) => (a.vert === b.vert ? 0 : a.vert ? 1 : -1));\n // Get unique task orders. Required to draw the background rects when display mode is compact.\n const uniqueTaskOrderIds = [...new Set(theArray.map((item) => item.order))];\n const uniqueTasks = uniqueTaskOrderIds.map((id) => theArray.find((item) => item.order === id));\n // Draw background rects covering the entire width of the graph, these form the section rows.\n svg\n .append('g')\n .selectAll('rect')\n .data(uniqueTasks)\n .enter()\n .append('rect')\n .attr('x', 0)\n .attr('y', function (d, i) {\n // Ignore the incoming i value and use our order instead\n i = d.order;\n return i * theGap + theTopPad - 2;\n })\n .attr('width', function () {\n return w - conf.rightPadding / 2;\n })\n .attr('height', theGap)\n .attr('class', function (d) {\n for (const [i, category] of categories.entries()) {\n if (d.type === category) {\n return 'section section' + (i % conf.numberSectionStyles);\n }\n }\n return 'section section0';\n })\n .enter();\n\n // Draw the rects representing the tasks\n const rectangles = svg.append('g').selectAll('rect').data(theArray).enter();\n\n const links = diagObj.db.getLinks();\n\n // Render the tasks with links\n // Render the other tasks\n rectangles\n .append('rect')\n .attr('id', function (d) {\n return d.id;\n })\n .attr('rx', 3)\n .attr('ry', 3)\n .attr('x', function (d) {\n if (d.milestone) {\n return (\n timeScale(d.startTime) +\n theSidePad +\n 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) -\n 0.5 * theBarHeight\n );\n }\n return timeScale(d.startTime) + theSidePad;\n })\n .attr('y', function (d, i) {\n // Ignore the incoming i value and use our order instead\n i = d.order;\n if (d.vert) {\n return conf.gridLineStartPadding;\n }\n return i * theGap + theTopPad;\n })\n .attr('width', function (d) {\n if (d.milestone) {\n return theBarHeight;\n }\n if (d.vert) {\n return 0.08 * theBarHeight;\n }\n return timeScale(d.renderEndTime || d.endTime) - timeScale(d.startTime);\n })\n .attr('height', function (d) {\n if (d.vert) {\n return taskArray.length * (conf.barHeight + conf.barGap) + conf.barHeight * 2;\n }\n return theBarHeight;\n })\n .attr('transform-origin', function (d, i) {\n // Ignore the incoming i value and use our order instead\n i = d.order;\n\n return (\n (\n timeScale(d.startTime) +\n theSidePad +\n 0.5 * (timeScale(d.endTime) - timeScale(d.startTime))\n ).toString() +\n 'px ' +\n (i * theGap + theTopPad + 0.5 * theBarHeight).toString() +\n 'px'\n );\n })\n .attr('class', function (d) {\n const res = 'task';\n\n let classStr = '';\n if (d.classes.length > 0) {\n classStr = d.classes.join(' ');\n }\n\n let secNum = 0;\n for (const [i, category] of categories.entries()) {\n if (d.type === category) {\n secNum = i % conf.numberSectionStyles;\n }\n }\n\n let taskClass = '';\n if (d.active) {\n if (d.crit) {\n taskClass += ' activeCrit';\n } else {\n taskClass = ' active';\n }\n } else if (d.done) {\n if (d.crit) {\n taskClass = ' doneCrit';\n } else {\n taskClass = ' done';\n }\n } else {\n if (d.crit) {\n taskClass += ' crit';\n }\n }\n\n if (taskClass.length === 0) {\n taskClass = ' task';\n }\n\n if (d.milestone) {\n taskClass = ' milestone ' + taskClass;\n }\n if (d.vert) {\n taskClass = ' vert ' + taskClass;\n }\n\n taskClass += secNum;\n\n taskClass += ' ' + classStr;\n\n return res + taskClass;\n });\n\n // Append task labels\n rectangles\n .append('text')\n .attr('id', function (d) {\n return d.id + '-text';\n })\n .text(function (d) {\n return d.task;\n })\n .attr('font-size', conf.fontSize)\n .attr('x', function (d) {\n let startX = timeScale(d.startTime);\n let endX = timeScale(d.renderEndTime || d.endTime);\n if (d.milestone) {\n startX += 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) - 0.5 * theBarHeight;\n endX = startX + theBarHeight;\n }\n\n if (d.vert) {\n return timeScale(d.startTime) + theSidePad;\n }\n\n const textWidth = this.getBBox().width;\n\n // Check id text width > width of rectangle\n if (textWidth > endX - startX) {\n if (endX + textWidth + 1.5 * conf.leftPadding > w) {\n return startX + theSidePad - 5;\n } else {\n return endX + theSidePad + 5;\n }\n } else {\n return (endX - startX) / 2 + startX + theSidePad;\n }\n })\n .attr('y', function (d, i) {\n // Ignore the incoming i value and use our order instead\n if (d.vert) {\n return conf.gridLineStartPadding + taskArray.length * (conf.barHeight + conf.barGap) + 60;\n }\n i = d.order;\n return i * theGap + conf.barHeight / 2 + (conf.fontSize / 2 - 2) + theTopPad;\n })\n .attr('text-height', theBarHeight)\n .attr('class', function (d) {\n const startX = timeScale(d.startTime);\n let endX = timeScale(d.endTime);\n if (d.milestone) {\n endX = startX + theBarHeight;\n }\n\n const textWidth = this.getBBox().width;\n\n let classStr = '';\n if (d.classes.length > 0) {\n classStr = d.classes.join(' ');\n }\n\n let secNum = 0;\n for (const [i, category] of categories.entries()) {\n if (d.type === category) {\n secNum = i % conf.numberSectionStyles;\n }\n }\n\n let taskType = '';\n if (d.active) {\n if (d.crit) {\n taskType = 'activeCritText' + secNum;\n } else {\n taskType = 'activeText' + secNum;\n }\n }\n\n if (d.done) {\n if (d.crit) {\n taskType = taskType + ' doneCritText' + secNum;\n } else {\n taskType = taskType + ' doneText' + secNum;\n }\n } else {\n if (d.crit) {\n taskType = taskType + ' critText' + secNum;\n }\n }\n\n if (d.milestone) {\n taskType += ' milestoneText';\n }\n\n if (d.vert) {\n taskType += ' vertText';\n }\n\n // Check id text width > width of rectangle\n if (textWidth > endX - startX) {\n if (endX + textWidth + 1.5 * conf.leftPadding > w) {\n return classStr + ' taskTextOutsideLeft taskTextOutside' + secNum + ' ' + taskType;\n } else {\n return (\n classStr +\n ' taskTextOutsideRight taskTextOutside' +\n secNum +\n ' ' +\n taskType +\n ' width-' +\n textWidth\n );\n }\n } else {\n return classStr + ' taskText taskText' + secNum + ' ' + taskType + ' width-' + textWidth;\n }\n });\n\n const securityLevel = getConfig().securityLevel;\n\n // Wrap the tasks in a tag for working links without javascript\n if (securityLevel === 'sandbox') {\n let sandboxElement;\n sandboxElement = select('#i' + id);\n const doc = sandboxElement.nodes()[0].contentDocument;\n\n rectangles\n .filter(function (d) {\n return links.has(d.id);\n })\n .each(function (o) {\n var taskRect = doc.querySelector('#' + o.id);\n var taskText = doc.querySelector('#' + o.id + '-text');\n const oldParent = taskRect.parentNode;\n var Link = doc.createElement('a');\n Link.setAttribute('xlink:href', links.get(o.id));\n Link.setAttribute('target', '_top');\n oldParent.appendChild(Link);\n Link.appendChild(taskRect);\n Link.appendChild(taskText);\n });\n }\n }\n /**\n * @param theGap\n * @param theTopPad\n * @param theSidePad\n * @param w\n * @param h\n * @param tasks\n * @param {unknown[]} excludes\n * @param {unknown[]} includes\n */\n function drawExcludeDays(theGap, theTopPad, theSidePad, w, h, tasks, excludes, includes) {\n if (excludes.length === 0 && includes.length === 0) {\n return;\n }\n\n let minTime;\n let maxTime;\n for (const { startTime, endTime } of tasks) {\n if (minTime === undefined || startTime < minTime) {\n minTime = startTime;\n }\n if (maxTime === undefined || endTime > maxTime) {\n maxTime = endTime;\n }\n }\n\n if (!minTime || !maxTime) {\n return;\n }\n\n if (dayjs(maxTime).diff(dayjs(minTime), 'year') > 5) {\n log.warn(\n 'The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.'\n );\n return;\n }\n\n const dateFormat = diagObj.db.getDateFormat();\n const excludeRanges = [];\n let range = null;\n let d = dayjs(minTime);\n while (d.valueOf() <= maxTime) {\n if (diagObj.db.isInvalidDate(d, dateFormat, excludes, includes)) {\n if (!range) {\n range = {\n start: d,\n end: d,\n };\n } else {\n range.end = d;\n }\n } else {\n if (range) {\n excludeRanges.push(range);\n range = null;\n }\n }\n d = d.add(1, 'd');\n }\n\n const rectangles = svg.append('g').selectAll('rect').data(excludeRanges).enter();\n\n rectangles\n .append('rect')\n .attr('id', (d) => 'exclude-' + d.start.format('YYYY-MM-DD'))\n .attr('x', (d) => timeScale(d.start.startOf('day')) + theSidePad)\n .attr('y', conf.gridLineStartPadding)\n .attr('width', (d) => timeScale(d.end.endOf('day')) - timeScale(d.start.startOf('day')))\n\n .attr('height', h - theTopPad - conf.gridLineStartPadding)\n .attr('transform-origin', function (d, i) {\n return (\n (\n timeScale(d.start) +\n theSidePad +\n 0.5 * (timeScale(d.end) - timeScale(d.start))\n ).toString() +\n 'px ' +\n (i * theGap + 0.5 * h).toString() +\n 'px'\n );\n })\n .attr('class', 'exclude-range');\n }\n\n /**\n * Calculates the estimated number of ticks based on the time domain and tick interval.\n * Returns the estimated number of ticks as a number.\n * @param {Date} minTime - The minimum time in the domain\n * @param {Date} maxTime - The maximum time in the domain\n * @param {number} every - The interval count (e.g., 1 for \"1second\")\n * @param {string} interval - The interval unit (e.g., \"second\", \"day\")\n * @returns {number} The estimated number of ticks\n */\n function getEstimatedTickCount(minTime, maxTime, every, interval) {\n if (every <= 0 || minTime > maxTime) {\n return Infinity;\n }\n const timeDiffMs = maxTime - minTime;\n const intervalMs = dayjs.duration({ [interval ?? 'day']: every }).asMilliseconds();\n if (intervalMs <= 0) {\n return Infinity;\n }\n return Math.ceil(timeDiffMs / intervalMs);\n }\n\n /**\n * @param theSidePad\n * @param theTopPad\n * @param w\n * @param h\n */\n function makeGrid(theSidePad, theTopPad, w, h) {\n const dateFormat = diagObj.db.getDateFormat();\n const userAxisFormat = diagObj.db.getAxisFormat();\n let axisFormat;\n if (userAxisFormat) {\n axisFormat = userAxisFormat;\n } else if (dateFormat === 'D') {\n axisFormat = '%d';\n } else {\n axisFormat = conf.axisFormat ?? '%Y-%m-%d';\n }\n\n let bottomXAxis = axisBottom(timeScale)\n .tickSize(-h + theTopPad + conf.gridLineStartPadding)\n .tickFormat(timeFormat(axisFormat));\n\n const reTickInterval = /^([1-9]\\d*)(millisecond|second|minute|hour|day|week|month)$/;\n const resultTickInterval = reTickInterval.exec(\n diagObj.db.getTickInterval() || conf.tickInterval\n );\n\n if (resultTickInterval !== null) {\n const every = parseInt(resultTickInterval[1], 10);\n if (isNaN(every) || every <= 0) {\n log.warn(\n `Invalid tick interval value: \"${resultTickInterval[1]}\". Skipping custom tick interval.`\n );\n // Skip applying custom ticks\n } else {\n const interval = resultTickInterval[2];\n const weekday = diagObj.db.getWeekday() || conf.weekday;\n\n // Get the time domain to check tick count\n const domain = timeScale.domain();\n const minTime = domain[0];\n const maxTime = domain[1];\n const estimatedTicks = getEstimatedTickCount(minTime, maxTime, every, interval);\n\n if (estimatedTicks > MAX_TICK_COUNT) {\n log.warn(\n `The tick interval \"${every}${interval}\" would generate ${estimatedTicks} ticks, ` +\n `which exceeds the maximum allowed (${MAX_TICK_COUNT}). ` +\n `This may indicate an invalid date or time range. Skipping custom tick interval.`\n );\n // D3 will use its default automatic tick generation\n } else {\n switch (interval) {\n case 'millisecond':\n bottomXAxis.ticks(timeMillisecond.every(every));\n break;\n case 'second':\n bottomXAxis.ticks(timeSecond.every(every));\n break;\n case 'minute':\n bottomXAxis.ticks(timeMinute.every(every));\n break;\n case 'hour':\n bottomXAxis.ticks(timeHour.every(every));\n break;\n case 'day':\n bottomXAxis.ticks(timeDay.every(every));\n break;\n case 'week':\n bottomXAxis.ticks(mapWeekdayToTimeFunction[weekday].every(every));\n break;\n case 'month':\n bottomXAxis.ticks(timeMonth.every(every));\n break;\n }\n }\n }\n }\n\n svg\n .append('g')\n .attr('class', 'grid')\n .attr('transform', 'translate(' + theSidePad + ', ' + (h - 50) + ')')\n .call(bottomXAxis)\n .selectAll('text')\n .style('text-anchor', 'middle')\n .attr('fill', '#000')\n .attr('stroke', 'none')\n .attr('font-size', 10)\n .attr('dy', '1em');\n\n if (diagObj.db.topAxisEnabled() || conf.topAxis) {\n let topXAxis = axisTop(timeScale)\n .tickSize(-h + theTopPad + conf.gridLineStartPadding)\n .tickFormat(timeFormat(axisFormat));\n\n if (resultTickInterval !== null) {\n const every = parseInt(resultTickInterval[1], 10);\n if (isNaN(every) || every <= 0) {\n log.warn(\n `Invalid tick interval value: \"${resultTickInterval[1]}\". Skipping custom tick interval.`\n );\n // Skip applying custom ticks\n } else {\n const interval = resultTickInterval[2];\n const weekday = diagObj.db.getWeekday() || conf.weekday;\n\n // Get the time domain to check tick count\n const domain = timeScale.domain();\n const minTime = domain[0];\n const maxTime = domain[1];\n const estimatedTicks = getEstimatedTickCount(minTime, maxTime, every, interval);\n\n // Only apply custom ticks if the count is reasonable\n if (estimatedTicks <= MAX_TICK_COUNT) {\n switch (interval) {\n case 'millisecond':\n topXAxis.ticks(timeMillisecond.every(every));\n break;\n case 'second':\n topXAxis.ticks(timeSecond.every(every));\n break;\n case 'minute':\n topXAxis.ticks(timeMinute.every(every));\n break;\n case 'hour':\n topXAxis.ticks(timeHour.every(every));\n break;\n case 'day':\n topXAxis.ticks(timeDay.every(every));\n break;\n case 'week':\n topXAxis.ticks(mapWeekdayToTimeFunction[weekday].every(every));\n break;\n case 'month':\n topXAxis.ticks(timeMonth.every(every));\n break;\n }\n }\n }\n }\n\n svg\n .append('g')\n .attr('class', 'grid')\n .attr('transform', 'translate(' + theSidePad + ', ' + theTopPad + ')')\n .call(topXAxis)\n .selectAll('text')\n .style('text-anchor', 'middle')\n .attr('fill', '#000')\n .attr('stroke', 'none')\n .attr('font-size', 10);\n // .attr('dy', '1em');\n }\n }\n\n /**\n * @param theGap\n * @param theTopPad\n */\n function vertLabels(theGap, theTopPad) {\n let prevGap = 0;\n\n const numOccurrences = Object.keys(categoryHeights).map((d) => [d, categoryHeights[d]]);\n\n svg\n .append('g') // without doing this, impossible to put grid lines behind text\n .selectAll('text')\n .data(numOccurrences)\n .enter()\n .append(function (d) {\n const rows = d[0].split(common.lineBreakRegex);\n const dy = -(rows.length - 1) / 2;\n\n const svgLabel = doc.createElementNS('http://www.w3.org/2000/svg', 'text');\n svgLabel.setAttribute('dy', dy + 'em');\n\n for (const [j, row] of rows.entries()) {\n const tspan = doc.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n tspan.setAttribute('alignment-baseline', 'central');\n tspan.setAttribute('x', '10');\n if (j > 0) {\n tspan.setAttribute('dy', '1em');\n }\n tspan.textContent = row;\n svgLabel.appendChild(tspan);\n }\n return svgLabel;\n })\n .attr('x', 10)\n .attr('y', function (d, i) {\n if (i > 0) {\n for (let j = 0; j < i; j++) {\n prevGap += numOccurrences[i - 1][1];\n return (d[1] * theGap) / 2 + prevGap * theGap + theTopPad;\n }\n } else {\n return (d[1] * theGap) / 2 + theTopPad;\n }\n })\n .attr('font-size', conf.sectionFontSize)\n .attr('class', function (d) {\n for (const [i, category] of categories.entries()) {\n if (d[0] === category) {\n return 'sectionTitle sectionTitle' + (i % conf.numberSectionStyles);\n }\n }\n return 'sectionTitle';\n });\n }\n\n /**\n * @param theSidePad\n * @param theTopPad\n * @param w\n * @param h\n */\n function drawToday(theSidePad, theTopPad, w, h) {\n const todayMarker = diagObj.db.getTodayMarker();\n if (todayMarker === 'off') {\n return;\n }\n\n const todayG = svg.append('g').attr('class', 'today');\n const today = new Date();\n const todayLine = todayG.append('line');\n\n todayLine\n .attr('x1', timeScale(today) + theSidePad)\n .attr('x2', timeScale(today) + theSidePad)\n .attr('y1', conf.titleTopMargin)\n .attr('y2', h - conf.titleTopMargin)\n .attr('class', 'today');\n\n if (todayMarker !== '') {\n todayLine.attr('style', todayMarker.replace(/,/g, ';'));\n }\n }\n\n /**\n * From this stack exchange question:\n * http://stackoverflow.com/questions/1890203/unique-for-arrays-in-javascript\n *\n * @param arr\n */\n function checkUnique(arr) {\n const hash = {};\n const result = [];\n for (let i = 0, l = arr.length; i < l; ++i) {\n if (!Object.prototype.hasOwnProperty.call(hash, arr[i])) {\n // it works with objects! in FF, at least\n hash[arr[i]] = true;\n result.push(arr[i]);\n }\n }\n return result;\n }\n};\n\nexport default {\n setConf,\n draw,\n};\n", "const getStyles = (options) =>\n `\n .mermaid-main-font {\n font-family: ${options.fontFamily};\n }\n\n .exclude-range {\n fill: ${options.excludeBkgColor};\n }\n\n .section {\n stroke: none;\n opacity: 0.2;\n }\n\n .section0 {\n fill: ${options.sectionBkgColor};\n }\n\n .section2 {\n fill: ${options.sectionBkgColor2};\n }\n\n .section1,\n .section3 {\n fill: ${options.altSectionBkgColor};\n opacity: 0.2;\n }\n\n .sectionTitle0 {\n fill: ${options.titleColor};\n }\n\n .sectionTitle1 {\n fill: ${options.titleColor};\n }\n\n .sectionTitle2 {\n fill: ${options.titleColor};\n }\n\n .sectionTitle3 {\n fill: ${options.titleColor};\n }\n\n .sectionTitle {\n text-anchor: start;\n font-family: ${options.fontFamily};\n }\n\n\n /* Grid and axis */\n\n .grid .tick {\n stroke: ${options.gridColor};\n opacity: 0.8;\n shape-rendering: crispEdges;\n }\n\n .grid .tick text {\n font-family: ${options.fontFamily};\n fill: ${options.textColor};\n }\n\n .grid path {\n stroke-width: 0;\n }\n\n\n /* Today line */\n\n .today {\n fill: none;\n stroke: ${options.todayLineColor};\n stroke-width: 2px;\n }\n\n\n /* Task styling */\n\n /* Default task */\n\n .task {\n stroke-width: 2;\n }\n\n .taskText {\n text-anchor: middle;\n font-family: ${options.fontFamily};\n }\n\n .taskTextOutsideRight {\n fill: ${options.taskTextDarkColor};\n text-anchor: start;\n font-family: ${options.fontFamily};\n }\n\n .taskTextOutsideLeft {\n fill: ${options.taskTextDarkColor};\n text-anchor: end;\n }\n\n\n /* Special case clickable */\n\n .task.clickable {\n cursor: pointer;\n }\n\n .taskText.clickable {\n cursor: pointer;\n fill: ${options.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: ${options.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: ${options.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n\n /* Specific task settings for the sections*/\n\n .taskText0,\n .taskText1,\n .taskText2,\n .taskText3 {\n fill: ${options.taskTextColor};\n }\n\n .task0,\n .task1,\n .task2,\n .task3 {\n fill: ${options.taskBkgColor};\n stroke: ${options.taskBorderColor};\n }\n\n .taskTextOutside0,\n .taskTextOutside2\n {\n fill: ${options.taskTextOutsideColor};\n }\n\n .taskTextOutside1,\n .taskTextOutside3 {\n fill: ${options.taskTextOutsideColor};\n }\n\n\n /* Active task */\n\n .active0,\n .active1,\n .active2,\n .active3 {\n fill: ${options.activeTaskBkgColor};\n stroke: ${options.activeTaskBorderColor};\n }\n\n .activeText0,\n .activeText1,\n .activeText2,\n .activeText3 {\n fill: ${options.taskTextDarkColor} !important;\n }\n\n\n /* Completed task */\n\n .done0,\n .done1,\n .done2,\n .done3 {\n stroke: ${options.doneTaskBorderColor};\n fill: ${options.doneTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneText0,\n .doneText1,\n .doneText2,\n .doneText3 {\n fill: ${options.taskTextDarkColor} !important;\n }\n\n\n /* Tasks on the critical line */\n\n .crit0,\n .crit1,\n .crit2,\n .crit3 {\n stroke: ${options.critBorderColor};\n fill: ${options.critBkgColor};\n stroke-width: 2;\n }\n\n .activeCrit0,\n .activeCrit1,\n .activeCrit2,\n .activeCrit3 {\n stroke: ${options.critBorderColor};\n fill: ${options.activeTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneCrit0,\n .doneCrit1,\n .doneCrit2,\n .doneCrit3 {\n stroke: ${options.critBorderColor};\n fill: ${options.doneTaskBkgColor};\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges;\n }\n\n .milestone {\n transform: rotate(45deg) scale(0.8,0.8);\n }\n\n .milestoneText {\n font-style: italic;\n }\n .doneCritText0,\n .doneCritText1,\n .doneCritText2,\n .doneCritText3 {\n fill: ${options.taskTextDarkColor} !important;\n }\n\n .vert {\n stroke: ${options.vertLineColor};\n }\n\n .vertText {\n font-size: 15px;\n text-anchor: middle;\n fill: ${options.vertLineColor} !important;\n }\n\n .activeCritText0,\n .activeCritText1,\n .activeCritText2,\n .activeCritText3 {\n fill: ${options.taskTextDarkColor} !important;\n }\n\n .titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${options.titleColor || options.textColor};\n font-family: ${options.fontFamily};\n }\n`;\n\nexport default getStyles;\n", "// @ts-ignore: JISON doesn't support types\nimport ganttParser from './parser/gantt.jison';\nimport ganttDb from './ganttDb.js';\nimport ganttRenderer from './ganttRenderer.js';\nimport ganttStyles from './styles.js';\nimport type { DiagramDefinition } from '../../diagram-api/types.js';\n\nexport const diagram: DiagramDefinition = {\n parser: ganttParser,\n db: ganttDb,\n renderer: ganttRenderer,\n styles: ganttStyles,\n};\n"], + "mappings": "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KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,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", + "names": ["o", "parser", "lexer", "clear", "dateFormat", "excludes", "includes", "tags", "dayjs", "dayjs", "tasks", "w", "id", "links", "securityLevel", "sandboxElement", "doc", "h", "excludes", "includes", "dateFormat", "d", "axisFormat", "weekday", "todayMarker"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/gitGraphDiagram-NY62KEGX.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/gitGraphDiagram-NY62KEGX.mjs new file mode 100644 index 0000000..2cf6813 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/gitGraphDiagram-NY62KEGX.mjs @@ -0,0 +1,1766 @@ +import { + populateCommonDb +} from "./chunk-4BX2VUAB.mjs"; +import { + ImperativeState +} from "./chunk-QZHKN3VN.mjs"; +import { + cleanAndMerge, + random, + utils_default +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + common_default, + defaultConfig_default, + getAccDescription, + getAccTitle, + getConfig, + getConfig2, + getDiagramTitle, + setAccDescription, + setAccTitle, + setDiagramTitle, + setupGraphViewbox2 as setupGraphViewbox +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/git/gitGraphParser.ts +import { parse } from "@mermaid-js/parser"; + +// src/diagrams/git/gitGraphTypes.ts +var commitType = { + NORMAL: 0, + REVERSE: 1, + HIGHLIGHT: 2, + MERGE: 3, + CHERRY_PICK: 4 +}; + +// src/diagrams/git/gitGraphAst.ts +var DEFAULT_GITGRAPH_CONFIG = defaultConfig_default.gitGraph; +var getConfig3 = /* @__PURE__ */ __name(() => { + const config = cleanAndMerge({ + ...DEFAULT_GITGRAPH_CONFIG, + ...getConfig().gitGraph + }); + return config; +}, "getConfig"); +var state = new ImperativeState(() => { + const config = getConfig3(); + const mainBranchName = config.mainBranchName; + const mainBranchOrder = config.mainBranchOrder; + return { + mainBranchName, + commits: /* @__PURE__ */ new Map(), + head: null, + branchConfig: /* @__PURE__ */ new Map([[mainBranchName, { name: mainBranchName, order: mainBranchOrder }]]), + branches: /* @__PURE__ */ new Map([[mainBranchName, null]]), + currBranch: mainBranchName, + direction: "LR", + seq: 0, + options: {} + }; +}); +function getID() { + return random({ length: 7 }); +} +__name(getID, "getID"); +function uniqBy(list, fn) { + const recordMap = /* @__PURE__ */ Object.create(null); + return list.reduce((out, item) => { + const key = fn(item); + if (!recordMap[key]) { + recordMap[key] = true; + out.push(item); + } + return out; + }, []); +} +__name(uniqBy, "uniqBy"); +var setDirection = /* @__PURE__ */ __name(function(dir2) { + state.records.direction = dir2; +}, "setDirection"); +var setOptions = /* @__PURE__ */ __name(function(rawOptString) { + log.debug("options str", rawOptString); + rawOptString = rawOptString?.trim(); + rawOptString = rawOptString || "{}"; + try { + state.records.options = JSON.parse(rawOptString); + } catch (e) { + log.error("error while parsing gitGraph options", e.message); + } +}, "setOptions"); +var getOptions = /* @__PURE__ */ __name(function() { + return state.records.options; +}, "getOptions"); +var commit = /* @__PURE__ */ __name(function(commitDB) { + let msg = commitDB.msg; + let id = commitDB.id; + const type = commitDB.type; + let tags = commitDB.tags; + log.info("commit", msg, id, type, tags); + log.debug("Entering commit:", msg, id, type, tags); + const config = getConfig3(); + id = common_default.sanitizeText(id, config); + msg = common_default.sanitizeText(msg, config); + tags = tags?.map((tag) => common_default.sanitizeText(tag, config)); + const newCommit = { + id: id ? id : state.records.seq + "-" + getID(), + message: msg, + seq: state.records.seq++, + type: type ?? commitType.NORMAL, + tags: tags ?? [], + parents: state.records.head == null ? [] : [state.records.head.id], + branch: state.records.currBranch + }; + state.records.head = newCommit; + log.info("main branch", config.mainBranchName); + if (state.records.commits.has(newCommit.id)) { + log.warn(`Commit ID ${newCommit.id} already exists`); + } + state.records.commits.set(newCommit.id, newCommit); + state.records.branches.set(state.records.currBranch, newCommit.id); + log.debug("in pushCommit " + newCommit.id); +}, "commit"); +var branch = /* @__PURE__ */ __name(function(branchDB) { + let name = branchDB.name; + const order = branchDB.order; + name = common_default.sanitizeText(name, getConfig3()); + if (state.records.branches.has(name)) { + throw new Error( + `Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${name}")` + ); + } + state.records.branches.set(name, state.records.head != null ? state.records.head.id : null); + state.records.branchConfig.set(name, { name, order }); + checkout(name); + log.debug("in createBranch"); +}, "branch"); +var merge = /* @__PURE__ */ __name((mergeDB) => { + let otherBranch = mergeDB.branch; + let customId = mergeDB.id; + const overrideType = mergeDB.type; + const customTags = mergeDB.tags; + const config = getConfig3(); + otherBranch = common_default.sanitizeText(otherBranch, config); + if (customId) { + customId = common_default.sanitizeText(customId, config); + } + const currentBranchCheck = state.records.branches.get(state.records.currBranch); + const otherBranchCheck = state.records.branches.get(otherBranch); + const currentCommit = currentBranchCheck ? state.records.commits.get(currentBranchCheck) : void 0; + const otherCommit = otherBranchCheck ? state.records.commits.get(otherBranchCheck) : void 0; + if (currentCommit && otherCommit && currentCommit.branch === otherBranch) { + throw new Error(`Cannot merge branch '${otherBranch}' into itself.`); + } + if (state.records.currBranch === otherBranch) { + const error = new Error('Incorrect usage of "merge". Cannot merge a branch to itself'); + error.hash = { + text: `merge ${otherBranch}`, + token: `merge ${otherBranch}`, + expected: ["branch abc"] + }; + throw error; + } + if (currentCommit === void 0 || !currentCommit) { + const error = new Error( + `Incorrect usage of "merge". Current branch (${state.records.currBranch})has no commits` + ); + error.hash = { + text: `merge ${otherBranch}`, + token: `merge ${otherBranch}`, + expected: ["commit"] + }; + throw error; + } + if (!state.records.branches.has(otherBranch)) { + const error = new Error( + 'Incorrect usage of "merge". Branch to be merged (' + otherBranch + ") does not exist" + ); + error.hash = { + text: `merge ${otherBranch}`, + token: `merge ${otherBranch}`, + expected: [`branch ${otherBranch}`] + }; + throw error; + } + if (otherCommit === void 0 || !otherCommit) { + const error = new Error( + 'Incorrect usage of "merge". Branch to be merged (' + otherBranch + ") has no commits" + ); + error.hash = { + text: `merge ${otherBranch}`, + token: `merge ${otherBranch}`, + expected: ['"commit"'] + }; + throw error; + } + if (currentCommit === otherCommit) { + const error = new Error('Incorrect usage of "merge". Both branches have same head'); + error.hash = { + text: `merge ${otherBranch}`, + token: `merge ${otherBranch}`, + expected: ["branch abc"] + }; + throw error; + } + if (customId && state.records.commits.has(customId)) { + const error = new Error( + 'Incorrect usage of "merge". Commit with id:' + customId + " already exists, use different custom id" + ); + error.hash = { + text: `merge ${otherBranch} ${customId} ${overrideType} ${customTags?.join(" ")}`, + token: `merge ${otherBranch} ${customId} ${overrideType} ${customTags?.join(" ")}`, + expected: [ + `merge ${otherBranch} ${customId}_UNIQUE ${overrideType} ${customTags?.join(" ")}` + ] + }; + throw error; + } + const verifiedBranch = otherBranchCheck ? otherBranchCheck : ""; + const commit2 = { + id: customId || `${state.records.seq}-${getID()}`, + message: `merged branch ${otherBranch} into ${state.records.currBranch}`, + seq: state.records.seq++, + parents: state.records.head == null ? [] : [state.records.head.id, verifiedBranch], + branch: state.records.currBranch, + type: commitType.MERGE, + customType: overrideType, + customId: customId ? true : false, + tags: customTags ?? [] + }; + state.records.head = commit2; + state.records.commits.set(commit2.id, commit2); + state.records.branches.set(state.records.currBranch, commit2.id); + log.debug(state.records.branches); + log.debug("in mergeBranch"); +}, "merge"); +var cherryPick = /* @__PURE__ */ __name(function(cherryPickDB) { + let sourceId = cherryPickDB.id; + let targetId = cherryPickDB.targetId; + let tags = cherryPickDB.tags; + let parentCommitId = cherryPickDB.parent; + log.debug("Entering cherryPick:", sourceId, targetId, tags); + const config = getConfig3(); + sourceId = common_default.sanitizeText(sourceId, config); + targetId = common_default.sanitizeText(targetId, config); + tags = tags?.map((tag) => common_default.sanitizeText(tag, config)); + parentCommitId = common_default.sanitizeText(parentCommitId, config); + if (!sourceId || !state.records.commits.has(sourceId)) { + const error = new Error( + 'Incorrect usage of "cherryPick". Source commit id should exist and provided' + ); + error.hash = { + text: `cherryPick ${sourceId} ${targetId}`, + token: `cherryPick ${sourceId} ${targetId}`, + expected: ["cherry-pick abc"] + }; + throw error; + } + const sourceCommit = state.records.commits.get(sourceId); + if (sourceCommit === void 0 || !sourceCommit) { + throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided'); + } + if (parentCommitId && !(Array.isArray(sourceCommit.parents) && sourceCommit.parents.includes(parentCommitId))) { + const error = new Error( + "Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit." + ); + throw error; + } + const sourceCommitBranch = sourceCommit.branch; + if (sourceCommit.type === commitType.MERGE && !parentCommitId) { + const error = new Error( + "Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified." + ); + throw error; + } + if (!targetId || !state.records.commits.has(targetId)) { + if (sourceCommitBranch === state.records.currBranch) { + const error = new Error( + 'Incorrect usage of "cherryPick". Source commit is already on current branch' + ); + error.hash = { + text: `cherryPick ${sourceId} ${targetId}`, + token: `cherryPick ${sourceId} ${targetId}`, + expected: ["cherry-pick abc"] + }; + throw error; + } + const currentCommitId = state.records.branches.get(state.records.currBranch); + if (currentCommitId === void 0 || !currentCommitId) { + const error = new Error( + `Incorrect usage of "cherry-pick". Current branch (${state.records.currBranch})has no commits` + ); + error.hash = { + text: `cherryPick ${sourceId} ${targetId}`, + token: `cherryPick ${sourceId} ${targetId}`, + expected: ["cherry-pick abc"] + }; + throw error; + } + const currentCommit = state.records.commits.get(currentCommitId); + if (currentCommit === void 0 || !currentCommit) { + const error = new Error( + `Incorrect usage of "cherry-pick". Current branch (${state.records.currBranch})has no commits` + ); + error.hash = { + text: `cherryPick ${sourceId} ${targetId}`, + token: `cherryPick ${sourceId} ${targetId}`, + expected: ["cherry-pick abc"] + }; + throw error; + } + const commit2 = { + id: state.records.seq + "-" + getID(), + message: `cherry-picked ${sourceCommit?.message} into ${state.records.currBranch}`, + seq: state.records.seq++, + parents: state.records.head == null ? [] : [state.records.head.id, sourceCommit.id], + branch: state.records.currBranch, + type: commitType.CHERRY_PICK, + tags: tags ? tags.filter(Boolean) : [ + `cherry-pick:${sourceCommit.id}${sourceCommit.type === commitType.MERGE ? `|parent:${parentCommitId}` : ""}` + ] + }; + state.records.head = commit2; + state.records.commits.set(commit2.id, commit2); + state.records.branches.set(state.records.currBranch, commit2.id); + log.debug(state.records.branches); + log.debug("in cherryPick"); + } +}, "cherryPick"); +var checkout = /* @__PURE__ */ __name(function(branch2) { + branch2 = common_default.sanitizeText(branch2, getConfig3()); + if (!state.records.branches.has(branch2)) { + const error = new Error( + `Trying to checkout branch which is not yet created. (Help try using "branch ${branch2}")` + ); + error.hash = { + text: `checkout ${branch2}`, + token: `checkout ${branch2}`, + expected: [`branch ${branch2}`] + }; + throw error; + } else { + state.records.currBranch = branch2; + const id = state.records.branches.get(state.records.currBranch); + if (id === void 0 || !id) { + state.records.head = null; + } else { + state.records.head = state.records.commits.get(id) ?? null; + } + } +}, "checkout"); +function upsert(arr, key, newVal) { + const index = arr.indexOf(key); + if (index === -1) { + arr.push(newVal); + } else { + arr.splice(index, 1, newVal); + } +} +__name(upsert, "upsert"); +function prettyPrintCommitHistory(commitArr) { + const commit2 = commitArr.reduce((out, commit3) => { + if (out.seq > commit3.seq) { + return out; + } + return commit3; + }, commitArr[0]); + let line = ""; + commitArr.forEach(function(c) { + if (c === commit2) { + line += " *"; + } else { + line += " |"; + } + }); + const label = [line, commit2.id, commit2.seq]; + for (const branch2 in state.records.branches) { + if (state.records.branches.get(branch2) === commit2.id) { + label.push(branch2); + } + } + log.debug(label.join(" ")); + if (commit2.parents && commit2.parents.length == 2 && commit2.parents[0] && commit2.parents[1]) { + const newCommit = state.records.commits.get(commit2.parents[0]); + upsert(commitArr, commit2, newCommit); + if (commit2.parents[1]) { + commitArr.push(state.records.commits.get(commit2.parents[1])); + } + } else if (commit2.parents.length == 0) { + return; + } else { + if (commit2.parents[0]) { + const newCommit = state.records.commits.get(commit2.parents[0]); + upsert(commitArr, commit2, newCommit); + } + } + commitArr = uniqBy(commitArr, (c) => c.id); + prettyPrintCommitHistory(commitArr); +} +__name(prettyPrintCommitHistory, "prettyPrintCommitHistory"); +var prettyPrint = /* @__PURE__ */ __name(function() { + log.debug(state.records.commits); + const node = getCommitsArray()[0]; + prettyPrintCommitHistory([node]); +}, "prettyPrint"); +var clear2 = /* @__PURE__ */ __name(function() { + state.reset(); + clear(); +}, "clear"); +var getBranchesAsObjArray = /* @__PURE__ */ __name(function() { + const branchesArray = [...state.records.branchConfig.values()].map((branchConfig, i) => { + if (branchConfig.order !== null && branchConfig.order !== void 0) { + return branchConfig; + } + return { + ...branchConfig, + order: parseFloat(`0.${i}`) + }; + }).sort((a, b) => (a.order ?? 0) - (b.order ?? 0)).map(({ name }) => ({ name })); + return branchesArray; +}, "getBranchesAsObjArray"); +var getBranches = /* @__PURE__ */ __name(function() { + return state.records.branches; +}, "getBranches"); +var getCommits = /* @__PURE__ */ __name(function() { + return state.records.commits; +}, "getCommits"); +var getCommitsArray = /* @__PURE__ */ __name(function() { + const commitArr = [...state.records.commits.values()]; + commitArr.forEach(function(o) { + log.debug(o.id); + }); + commitArr.sort((a, b) => a.seq - b.seq); + return commitArr; +}, "getCommitsArray"); +var getCurrentBranch = /* @__PURE__ */ __name(function() { + return state.records.currBranch; +}, "getCurrentBranch"); +var getDirection = /* @__PURE__ */ __name(function() { + return state.records.direction; +}, "getDirection"); +var getHead = /* @__PURE__ */ __name(function() { + return state.records.head; +}, "getHead"); +var db = { + commitType, + getConfig: getConfig3, + setDirection, + setOptions, + getOptions, + commit, + branch, + merge, + cherryPick, + checkout, + //reset, + prettyPrint, + clear: clear2, + getBranchesAsObjArray, + getBranches, + getCommits, + getCommitsArray, + getCurrentBranch, + getDirection, + getHead, + setAccTitle, + getAccTitle, + getAccDescription, + setAccDescription, + setDiagramTitle, + getDiagramTitle +}; + +// src/diagrams/git/gitGraphParser.ts +var populate = /* @__PURE__ */ __name((ast, db2) => { + populateCommonDb(ast, db2); + if (ast.dir) { + db2.setDirection(ast.dir); + } + for (const statement of ast.statements) { + parseStatement(statement, db2); + } +}, "populate"); +var parseStatement = /* @__PURE__ */ __name((statement, db2) => { + const parsers = { + Commit: /* @__PURE__ */ __name((stmt) => db2.commit(parseCommit(stmt)), "Commit"), + Branch: /* @__PURE__ */ __name((stmt) => db2.branch(parseBranch(stmt)), "Branch"), + Merge: /* @__PURE__ */ __name((stmt) => db2.merge(parseMerge(stmt)), "Merge"), + Checkout: /* @__PURE__ */ __name((stmt) => db2.checkout(parseCheckout(stmt)), "Checkout"), + CherryPicking: /* @__PURE__ */ __name((stmt) => db2.cherryPick(parseCherryPicking(stmt)), "CherryPicking") + }; + const parser2 = parsers[statement.$type]; + if (parser2) { + parser2(statement); + } else { + log.error(`Unknown statement type: ${statement.$type}`); + } +}, "parseStatement"); +var parseCommit = /* @__PURE__ */ __name((commit2) => { + const commitDB = { + id: commit2.id, + msg: commit2.message ?? "", + type: commit2.type !== void 0 ? commitType[commit2.type] : commitType.NORMAL, + tags: commit2.tags ?? void 0 + }; + return commitDB; +}, "parseCommit"); +var parseBranch = /* @__PURE__ */ __name((branch2) => { + const branchDB = { + name: branch2.name, + order: branch2.order ?? 0 + }; + return branchDB; +}, "parseBranch"); +var parseMerge = /* @__PURE__ */ __name((merge2) => { + const mergeDB = { + branch: merge2.branch, + id: merge2.id ?? "", + type: merge2.type !== void 0 ? commitType[merge2.type] : void 0, + tags: merge2.tags ?? void 0 + }; + return mergeDB; +}, "parseMerge"); +var parseCheckout = /* @__PURE__ */ __name((checkout2) => { + const branch2 = checkout2.branch; + return branch2; +}, "parseCheckout"); +var parseCherryPicking = /* @__PURE__ */ __name((cherryPicking) => { + const cherryPickDB = { + id: cherryPicking.id, + targetId: "", + tags: cherryPicking.tags?.length === 0 ? void 0 : cherryPicking.tags, + parent: cherryPicking.parent + }; + return cherryPickDB; +}, "parseCherryPicking"); +var parser = { + parse: /* @__PURE__ */ __name(async (input) => { + const ast = await parse("gitGraph", input); + log.debug(ast); + populate(ast, db); + }, "parse") +}; +if (void 0) { + const { it, expect, describe } = void 0; + const mockDB = { + commitType, + setDirection: vi.fn(), + commit: vi.fn(), + branch: vi.fn(), + merge: vi.fn(), + cherryPick: vi.fn(), + checkout: vi.fn() + }; + describe("GitGraph Parser", () => { + it("should parse a commit statement", () => { + const commit2 = { + $type: "Commit", + id: "1", + message: "test", + tags: ["tag1", "tag2"], + type: "NORMAL" + }; + parseStatement(commit2, mockDB); + expect(mockDB.commit).toHaveBeenCalledWith({ + id: "1", + msg: "test", + tags: ["tag1", "tag2"], + type: 0 + }); + }); + it("should parse a branch statement", () => { + const branch2 = { + $type: "Branch", + name: "newBranch", + order: 1 + }; + parseStatement(branch2, mockDB); + expect(mockDB.branch).toHaveBeenCalledWith({ name: "newBranch", order: 1 }); + }); + it("should parse a checkout statement", () => { + const checkout2 = { + $type: "Checkout", + branch: "newBranch" + }; + parseStatement(checkout2, mockDB); + expect(mockDB.checkout).toHaveBeenCalledWith("newBranch"); + }); + it("should parse a merge statement", () => { + const merge2 = { + $type: "Merge", + branch: "newBranch", + id: "1", + tags: ["tag1", "tag2"], + type: "NORMAL" + }; + parseStatement(merge2, mockDB); + expect(mockDB.merge).toHaveBeenCalledWith({ + branch: "newBranch", + id: "1", + tags: ["tag1", "tag2"], + type: 0 + }); + }); + it("should parse a cherry picking statement", () => { + const cherryPick2 = { + $type: "CherryPicking", + id: "1", + tags: ["tag1", "tag2"], + parent: "2" + }; + parseStatement(cherryPick2, mockDB); + expect(mockDB.cherryPick).toHaveBeenCalledWith({ + id: "1", + targetId: "", + parent: "2", + tags: ["tag1", "tag2"] + }); + }); + it("should parse a langium generated gitGraph ast", () => { + const dummy = { + $type: "GitGraph", + statements: [] + }; + const gitGraphAst = { + $type: "GitGraph", + statements: [ + { + $container: dummy, + $type: "Commit", + id: "1", + message: "test", + tags: ["tag1", "tag2"], + type: "NORMAL" + }, + { + $container: dummy, + $type: "Branch", + name: "newBranch", + order: 1 + }, + { + $container: dummy, + $type: "Merge", + branch: "newBranch", + id: "1", + tags: ["tag1", "tag2"], + type: "NORMAL" + }, + { + $container: dummy, + $type: "Checkout", + branch: "newBranch" + }, + { + $container: dummy, + $type: "CherryPicking", + id: "1", + tags: ["tag1", "tag2"], + parent: "2" + } + ] + }; + populate(gitGraphAst, mockDB); + expect(mockDB.commit).toHaveBeenCalledWith({ + id: "1", + msg: "test", + tags: ["tag1", "tag2"], + type: 0 + }); + expect(mockDB.branch).toHaveBeenCalledWith({ name: "newBranch", order: 1 }); + expect(mockDB.merge).toHaveBeenCalledWith({ + branch: "newBranch", + id: "1", + tags: ["tag1", "tag2"], + type: 0 + }); + expect(mockDB.checkout).toHaveBeenCalledWith("newBranch"); + }); + }); +} + +// src/diagrams/git/gitGraphRenderer.ts +import { select } from "d3"; +var DEFAULT_CONFIG = getConfig2(); +var DEFAULT_GITGRAPH_CONFIG2 = DEFAULT_CONFIG?.gitGraph; +var LAYOUT_OFFSET = 10; +var COMMIT_STEP = 40; +var PX = 4; +var PY = 2; +var THEME_COLOR_LIMIT = 8; +var branchPos = /* @__PURE__ */ new Map(); +var commitPos = /* @__PURE__ */ new Map(); +var defaultPos = 30; +var allCommitsDict = /* @__PURE__ */ new Map(); +var lanes = []; +var maxPos = 0; +var dir = "LR"; +var clear3 = /* @__PURE__ */ __name(() => { + branchPos.clear(); + commitPos.clear(); + allCommitsDict.clear(); + maxPos = 0; + lanes = []; + dir = "LR"; +}, "clear"); +var drawText = /* @__PURE__ */ __name((txt) => { + const svgLabel = document.createElementNS("http://www.w3.org/2000/svg", "text"); + const rows = typeof txt === "string" ? txt.split(/\\n|\n|/gi) : txt; + rows.forEach((row) => { + const tspan = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + tspan.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve"); + tspan.setAttribute("dy", "1em"); + tspan.setAttribute("x", "0"); + tspan.setAttribute("class", "row"); + tspan.textContent = row.trim(); + svgLabel.appendChild(tspan); + }); + return svgLabel; +}, "drawText"); +var findClosestParent = /* @__PURE__ */ __name((parents) => { + let closestParent; + let comparisonFunc; + let targetPosition; + if (dir === "BT") { + comparisonFunc = /* @__PURE__ */ __name((a, b) => a <= b, "comparisonFunc"); + targetPosition = Infinity; + } else { + comparisonFunc = /* @__PURE__ */ __name((a, b) => a >= b, "comparisonFunc"); + targetPosition = 0; + } + parents.forEach((parent) => { + const parentPosition = dir === "TB" || dir == "BT" ? commitPos.get(parent)?.y : commitPos.get(parent)?.x; + if (parentPosition !== void 0 && comparisonFunc(parentPosition, targetPosition)) { + closestParent = parent; + targetPosition = parentPosition; + } + }); + return closestParent; +}, "findClosestParent"); +var findClosestParentBT = /* @__PURE__ */ __name((parents) => { + let closestParent = ""; + let maxPosition = Infinity; + parents.forEach((parent) => { + const parentPosition = commitPos.get(parent).y; + if (parentPosition <= maxPosition) { + closestParent = parent; + maxPosition = parentPosition; + } + }); + return closestParent || void 0; +}, "findClosestParentBT"); +var setParallelBTPos = /* @__PURE__ */ __name((sortedKeys, commits, defaultPos2) => { + let curPos = defaultPos2; + let maxPosition = defaultPos2; + const roots = []; + sortedKeys.forEach((key) => { + const commit2 = commits.get(key); + if (!commit2) { + throw new Error(`Commit not found for key ${key}`); + } + if (commit2.parents.length) { + curPos = calculateCommitPosition(commit2); + maxPosition = Math.max(curPos, maxPosition); + } else { + roots.push(commit2); + } + setCommitPosition(commit2, curPos); + }); + curPos = maxPosition; + roots.forEach((commit2) => { + setRootPosition(commit2, curPos, defaultPos2); + }); + sortedKeys.forEach((key) => { + const commit2 = commits.get(key); + if (commit2?.parents.length) { + const closestParent = findClosestParentBT(commit2.parents); + curPos = commitPos.get(closestParent).y - COMMIT_STEP; + if (curPos <= maxPosition) { + maxPosition = curPos; + } + const x = branchPos.get(commit2.branch).pos; + const y = curPos - LAYOUT_OFFSET; + commitPos.set(commit2.id, { x, y }); + } + }); +}, "setParallelBTPos"); +var findClosestParentPos = /* @__PURE__ */ __name((commit2) => { + const closestParent = findClosestParent(commit2.parents.filter((p) => p !== null)); + if (!closestParent) { + throw new Error(`Closest parent not found for commit ${commit2.id}`); + } + const closestParentPos = commitPos.get(closestParent)?.y; + if (closestParentPos === void 0) { + throw new Error(`Closest parent position not found for commit ${commit2.id}`); + } + return closestParentPos; +}, "findClosestParentPos"); +var calculateCommitPosition = /* @__PURE__ */ __name((commit2) => { + const closestParentPos = findClosestParentPos(commit2); + return closestParentPos + COMMIT_STEP; +}, "calculateCommitPosition"); +var setCommitPosition = /* @__PURE__ */ __name((commit2, curPos) => { + const branch2 = branchPos.get(commit2.branch); + if (!branch2) { + throw new Error(`Branch not found for commit ${commit2.id}`); + } + const x = branch2.pos; + const y = curPos + LAYOUT_OFFSET; + commitPos.set(commit2.id, { x, y }); + return { x, y }; +}, "setCommitPosition"); +var setRootPosition = /* @__PURE__ */ __name((commit2, curPos, defaultPos2) => { + const branch2 = branchPos.get(commit2.branch); + if (!branch2) { + throw new Error(`Branch not found for commit ${commit2.id}`); + } + const y = curPos + defaultPos2; + const x = branch2.pos; + commitPos.set(commit2.id, { x, y }); +}, "setRootPosition"); +var drawCommitBullet = /* @__PURE__ */ __name((gBullets, commit2, commitPosition, typeClass, branchIndex, commitSymbolType) => { + if (commitSymbolType === commitType.HIGHLIGHT) { + gBullets.append("rect").attr("x", commitPosition.x - 10).attr("y", commitPosition.y - 10).attr("width", 20).attr("height", 20).attr( + "class", + `commit ${commit2.id} commit-highlight${branchIndex % THEME_COLOR_LIMIT} ${typeClass}-outer` + ); + gBullets.append("rect").attr("x", commitPosition.x - 6).attr("y", commitPosition.y - 6).attr("width", 12).attr("height", 12).attr( + "class", + `commit ${commit2.id} commit${branchIndex % THEME_COLOR_LIMIT} ${typeClass}-inner` + ); + } else if (commitSymbolType === commitType.CHERRY_PICK) { + gBullets.append("circle").attr("cx", commitPosition.x).attr("cy", commitPosition.y).attr("r", 10).attr("class", `commit ${commit2.id} ${typeClass}`); + gBullets.append("circle").attr("cx", commitPosition.x - 3).attr("cy", commitPosition.y + 2).attr("r", 2.75).attr("fill", "#fff").attr("class", `commit ${commit2.id} ${typeClass}`); + gBullets.append("circle").attr("cx", commitPosition.x + 3).attr("cy", commitPosition.y + 2).attr("r", 2.75).attr("fill", "#fff").attr("class", `commit ${commit2.id} ${typeClass}`); + gBullets.append("line").attr("x1", commitPosition.x + 3).attr("y1", commitPosition.y + 1).attr("x2", commitPosition.x).attr("y2", commitPosition.y - 5).attr("stroke", "#fff").attr("class", `commit ${commit2.id} ${typeClass}`); + gBullets.append("line").attr("x1", commitPosition.x - 3).attr("y1", commitPosition.y + 1).attr("x2", commitPosition.x).attr("y2", commitPosition.y - 5).attr("stroke", "#fff").attr("class", `commit ${commit2.id} ${typeClass}`); + } else { + const circle = gBullets.append("circle"); + circle.attr("cx", commitPosition.x); + circle.attr("cy", commitPosition.y); + circle.attr("r", commit2.type === commitType.MERGE ? 9 : 10); + circle.attr("class", `commit ${commit2.id} commit${branchIndex % THEME_COLOR_LIMIT}`); + if (commitSymbolType === commitType.MERGE) { + const circle2 = gBullets.append("circle"); + circle2.attr("cx", commitPosition.x); + circle2.attr("cy", commitPosition.y); + circle2.attr("r", 6); + circle2.attr( + "class", + `commit ${typeClass} ${commit2.id} commit${branchIndex % THEME_COLOR_LIMIT}` + ); + } + if (commitSymbolType === commitType.REVERSE) { + const cross = gBullets.append("path"); + cross.attr( + "d", + `M ${commitPosition.x - 5},${commitPosition.y - 5}L${commitPosition.x + 5},${commitPosition.y + 5}M${commitPosition.x - 5},${commitPosition.y + 5}L${commitPosition.x + 5},${commitPosition.y - 5}` + ).attr("class", `commit ${typeClass} ${commit2.id} commit${branchIndex % THEME_COLOR_LIMIT}`); + } + } +}, "drawCommitBullet"); +var drawCommitLabel = /* @__PURE__ */ __name((gLabels, commit2, commitPosition, pos) => { + if (commit2.type !== commitType.CHERRY_PICK && (commit2.customId && commit2.type === commitType.MERGE || commit2.type !== commitType.MERGE) && DEFAULT_GITGRAPH_CONFIG2?.showCommitLabel) { + const wrapper = gLabels.append("g"); + const labelBkg = wrapper.insert("rect").attr("class", "commit-label-bkg"); + const text = wrapper.append("text").attr("x", pos).attr("y", commitPosition.y + 25).attr("class", "commit-label").text(commit2.id); + const bbox = text.node()?.getBBox(); + if (bbox) { + labelBkg.attr("x", commitPosition.posWithOffset - bbox.width / 2 - PY).attr("y", commitPosition.y + 13.5).attr("width", bbox.width + 2 * PY).attr("height", bbox.height + 2 * PY); + if (dir === "TB" || dir === "BT") { + labelBkg.attr("x", commitPosition.x - (bbox.width + 4 * PX + 5)).attr("y", commitPosition.y - 12); + text.attr("x", commitPosition.x - (bbox.width + 4 * PX)).attr("y", commitPosition.y + bbox.height - 12); + } else { + text.attr("x", commitPosition.posWithOffset - bbox.width / 2); + } + if (DEFAULT_GITGRAPH_CONFIG2.rotateCommitLabel) { + if (dir === "TB" || dir === "BT") { + text.attr( + "transform", + "rotate(-45, " + commitPosition.x + ", " + commitPosition.y + ")" + ); + labelBkg.attr( + "transform", + "rotate(-45, " + commitPosition.x + ", " + commitPosition.y + ")" + ); + } else { + const r_x = -7.5 - (bbox.width + 10) / 25 * 9.5; + const r_y = 10 + bbox.width / 25 * 8.5; + wrapper.attr( + "transform", + "translate(" + r_x + ", " + r_y + ") rotate(-45, " + pos + ", " + commitPosition.y + ")" + ); + } + } + } + } +}, "drawCommitLabel"); +var drawCommitTags = /* @__PURE__ */ __name((gLabels, commit2, commitPosition, pos) => { + if (commit2.tags.length > 0) { + let yOffset = 0; + let maxTagBboxWidth = 0; + let maxTagBboxHeight = 0; + const tagElements = []; + for (const tagValue of commit2.tags.reverse()) { + const rect = gLabels.insert("polygon"); + const hole = gLabels.append("circle"); + const tag = gLabels.append("text").attr("y", commitPosition.y - 16 - yOffset).attr("class", "tag-label").text(tagValue); + const tagBbox = tag.node()?.getBBox(); + if (!tagBbox) { + throw new Error("Tag bbox not found"); + } + maxTagBboxWidth = Math.max(maxTagBboxWidth, tagBbox.width); + maxTagBboxHeight = Math.max(maxTagBboxHeight, tagBbox.height); + tag.attr("x", commitPosition.posWithOffset - tagBbox.width / 2); + tagElements.push({ + tag, + hole, + rect, + yOffset + }); + yOffset += 20; + } + for (const { tag, hole, rect, yOffset: yOffset2 } of tagElements) { + const h2 = maxTagBboxHeight / 2; + const ly = commitPosition.y - 19.2 - yOffset2; + rect.attr("class", "tag-label-bkg").attr( + "points", + ` + ${pos - maxTagBboxWidth / 2 - PX / 2},${ly + PY} + ${pos - maxTagBboxWidth / 2 - PX / 2},${ly - PY} + ${commitPosition.posWithOffset - maxTagBboxWidth / 2 - PX},${ly - h2 - PY} + ${commitPosition.posWithOffset + maxTagBboxWidth / 2 + PX},${ly - h2 - PY} + ${commitPosition.posWithOffset + maxTagBboxWidth / 2 + PX},${ly + h2 + PY} + ${commitPosition.posWithOffset - maxTagBboxWidth / 2 - PX},${ly + h2 + PY}` + ); + hole.attr("cy", ly).attr("cx", pos - maxTagBboxWidth / 2 + PX / 2).attr("r", 1.5).attr("class", "tag-hole"); + if (dir === "TB" || dir === "BT") { + const yOrigin = pos + yOffset2; + rect.attr("class", "tag-label-bkg").attr( + "points", + ` + ${commitPosition.x},${yOrigin + 2} + ${commitPosition.x},${yOrigin - 2} + ${commitPosition.x + LAYOUT_OFFSET},${yOrigin - h2 - 2} + ${commitPosition.x + LAYOUT_OFFSET + maxTagBboxWidth + 4},${yOrigin - h2 - 2} + ${commitPosition.x + LAYOUT_OFFSET + maxTagBboxWidth + 4},${yOrigin + h2 + 2} + ${commitPosition.x + LAYOUT_OFFSET},${yOrigin + h2 + 2}` + ).attr("transform", "translate(12,12) rotate(45, " + commitPosition.x + "," + pos + ")"); + hole.attr("cx", commitPosition.x + PX / 2).attr("cy", yOrigin).attr("transform", "translate(12,12) rotate(45, " + commitPosition.x + "," + pos + ")"); + tag.attr("x", commitPosition.x + 5).attr("y", yOrigin + 3).attr("transform", "translate(14,14) rotate(45, " + commitPosition.x + "," + pos + ")"); + } + } + } +}, "drawCommitTags"); +var getCommitClassType = /* @__PURE__ */ __name((commit2) => { + const commitSymbolType = commit2.customType ?? commit2.type; + switch (commitSymbolType) { + case commitType.NORMAL: + return "commit-normal"; + case commitType.REVERSE: + return "commit-reverse"; + case commitType.HIGHLIGHT: + return "commit-highlight"; + case commitType.MERGE: + return "commit-merge"; + case commitType.CHERRY_PICK: + return "commit-cherry-pick"; + default: + return "commit-normal"; + } +}, "getCommitClassType"); +var calculatePosition = /* @__PURE__ */ __name((commit2, dir2, pos, commitPos2) => { + const defaultCommitPosition = { x: 0, y: 0 }; + if (commit2.parents.length > 0) { + const closestParent = findClosestParent(commit2.parents); + if (closestParent) { + const parentPosition = commitPos2.get(closestParent) ?? defaultCommitPosition; + if (dir2 === "TB") { + return parentPosition.y + COMMIT_STEP; + } else if (dir2 === "BT") { + const currentPosition = commitPos2.get(commit2.id) ?? defaultCommitPosition; + return currentPosition.y - COMMIT_STEP; + } else { + return parentPosition.x + COMMIT_STEP; + } + } + } else { + if (dir2 === "TB") { + return defaultPos; + } else if (dir2 === "BT") { + const currentPosition = commitPos2.get(commit2.id) ?? defaultCommitPosition; + return currentPosition.y - COMMIT_STEP; + } else { + return 0; + } + } + return 0; +}, "calculatePosition"); +var getCommitPosition = /* @__PURE__ */ __name((commit2, pos, isParallelCommits) => { + const posWithOffset = dir === "BT" && isParallelCommits ? pos : pos + LAYOUT_OFFSET; + const y = dir === "TB" || dir === "BT" ? posWithOffset : branchPos.get(commit2.branch)?.pos; + const x = dir === "TB" || dir === "BT" ? branchPos.get(commit2.branch)?.pos : posWithOffset; + if (x === void 0 || y === void 0) { + throw new Error(`Position were undefined for commit ${commit2.id}`); + } + return { x, y, posWithOffset }; +}, "getCommitPosition"); +var drawCommits = /* @__PURE__ */ __name((svg, commits, modifyGraph) => { + if (!DEFAULT_GITGRAPH_CONFIG2) { + throw new Error("GitGraph config not found"); + } + const gBullets = svg.append("g").attr("class", "commit-bullets"); + const gLabels = svg.append("g").attr("class", "commit-labels"); + let pos = dir === "TB" || dir === "BT" ? defaultPos : 0; + const keys = [...commits.keys()]; + const isParallelCommits = DEFAULT_GITGRAPH_CONFIG2?.parallelCommits ?? false; + const sortKeys = /* @__PURE__ */ __name((a, b) => { + const seqA = commits.get(a)?.seq; + const seqB = commits.get(b)?.seq; + return seqA !== void 0 && seqB !== void 0 ? seqA - seqB : 0; + }, "sortKeys"); + let sortedKeys = keys.sort(sortKeys); + if (dir === "BT") { + if (isParallelCommits) { + setParallelBTPos(sortedKeys, commits, pos); + } + sortedKeys = sortedKeys.reverse(); + } + sortedKeys.forEach((key) => { + const commit2 = commits.get(key); + if (!commit2) { + throw new Error(`Commit not found for key ${key}`); + } + if (isParallelCommits) { + pos = calculatePosition(commit2, dir, pos, commitPos); + } + const commitPosition = getCommitPosition(commit2, pos, isParallelCommits); + if (modifyGraph) { + const typeClass = getCommitClassType(commit2); + const commitSymbolType = commit2.customType ?? commit2.type; + const branchIndex = branchPos.get(commit2.branch)?.index ?? 0; + drawCommitBullet(gBullets, commit2, commitPosition, typeClass, branchIndex, commitSymbolType); + drawCommitLabel(gLabels, commit2, commitPosition, pos); + drawCommitTags(gLabels, commit2, commitPosition, pos); + } + if (dir === "TB" || dir === "BT") { + commitPos.set(commit2.id, { x: commitPosition.x, y: commitPosition.posWithOffset }); + } else { + commitPos.set(commit2.id, { x: commitPosition.posWithOffset, y: commitPosition.y }); + } + pos = dir === "BT" && isParallelCommits ? pos + COMMIT_STEP : pos + COMMIT_STEP + LAYOUT_OFFSET; + if (pos > maxPos) { + maxPos = pos; + } + }); +}, "drawCommits"); +var shouldRerouteArrow = /* @__PURE__ */ __name((commitA, commitB, p1, p2, allCommits) => { + const commitBIsFurthest = dir === "TB" || dir === "BT" ? p1.x < p2.x : p1.y < p2.y; + const branchToGetCurve = commitBIsFurthest ? commitB.branch : commitA.branch; + const isOnBranchToGetCurve = /* @__PURE__ */ __name((x) => x.branch === branchToGetCurve, "isOnBranchToGetCurve"); + const isBetweenCommits = /* @__PURE__ */ __name((x) => x.seq > commitA.seq && x.seq < commitB.seq, "isBetweenCommits"); + return [...allCommits.values()].some((commitX) => { + return isBetweenCommits(commitX) && isOnBranchToGetCurve(commitX); + }); +}, "shouldRerouteArrow"); +var findLane = /* @__PURE__ */ __name((y1, y2, depth = 0) => { + const candidate = y1 + Math.abs(y1 - y2) / 2; + if (depth > 5) { + return candidate; + } + const ok = lanes.every((lane) => Math.abs(lane - candidate) >= 10); + if (ok) { + lanes.push(candidate); + return candidate; + } + const diff = Math.abs(y1 - y2); + return findLane(y1, y2 - diff / 5, depth + 1); +}, "findLane"); +var drawArrow = /* @__PURE__ */ __name((svg, commitA, commitB, allCommits) => { + const p1 = commitPos.get(commitA.id); + const p2 = commitPos.get(commitB.id); + if (p1 === void 0 || p2 === void 0) { + throw new Error(`Commit positions not found for commits ${commitA.id} and ${commitB.id}`); + } + const arrowNeedsRerouting = shouldRerouteArrow(commitA, commitB, p1, p2, allCommits); + let arc = ""; + let arc2 = ""; + let radius = 0; + let offset = 0; + let colorClassNum = branchPos.get(commitB.branch)?.index; + if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) { + colorClassNum = branchPos.get(commitA.branch)?.index; + } + let lineDef; + if (arrowNeedsRerouting) { + arc = "A 10 10, 0, 0, 0,"; + arc2 = "A 10 10, 0, 0, 1,"; + radius = 10; + offset = 10; + const lineY = p1.y < p2.y ? findLane(p1.y, p2.y) : findLane(p2.y, p1.y); + const lineX = p1.x < p2.x ? findLane(p1.x, p2.x) : findLane(p2.x, p1.x); + if (dir === "TB") { + if (p1.x < p2.x) { + lineDef = `M ${p1.x} ${p1.y} L ${lineX - radius} ${p1.y} ${arc2} ${lineX} ${p1.y + offset} L ${lineX} ${p2.y - radius} ${arc} ${lineX + offset} ${p2.y} L ${p2.x} ${p2.y}`; + } else { + colorClassNum = branchPos.get(commitA.branch)?.index; + lineDef = `M ${p1.x} ${p1.y} L ${lineX + radius} ${p1.y} ${arc} ${lineX} ${p1.y + offset} L ${lineX} ${p2.y - radius} ${arc2} ${lineX - offset} ${p2.y} L ${p2.x} ${p2.y}`; + } + } else if (dir === "BT") { + if (p1.x < p2.x) { + lineDef = `M ${p1.x} ${p1.y} L ${lineX - radius} ${p1.y} ${arc} ${lineX} ${p1.y - offset} L ${lineX} ${p2.y + radius} ${arc2} ${lineX + offset} ${p2.y} L ${p2.x} ${p2.y}`; + } else { + colorClassNum = branchPos.get(commitA.branch)?.index; + lineDef = `M ${p1.x} ${p1.y} L ${lineX + radius} ${p1.y} ${arc2} ${lineX} ${p1.y - offset} L ${lineX} ${p2.y + radius} ${arc} ${lineX - offset} ${p2.y} L ${p2.x} ${p2.y}`; + } + } else { + if (p1.y < p2.y) { + lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${lineY - radius} ${arc} ${p1.x + offset} ${lineY} L ${p2.x - radius} ${lineY} ${arc2} ${p2.x} ${lineY + offset} L ${p2.x} ${p2.y}`; + } else { + colorClassNum = branchPos.get(commitA.branch)?.index; + lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${lineY + radius} ${arc2} ${p1.x + offset} ${lineY} L ${p2.x - radius} ${lineY} ${arc} ${p2.x} ${lineY - offset} L ${p2.x} ${p2.y}`; + } + } + } else { + arc = "A 20 20, 0, 0, 0,"; + arc2 = "A 20 20, 0, 0, 1,"; + radius = 20; + offset = 20; + if (dir === "TB") { + if (p1.x < p2.x) { + if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) { + lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - radius} ${arc} ${p1.x + offset} ${p2.y} L ${p2.x} ${p2.y}`; + } else { + lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc2} ${p2.x} ${p1.y + offset} L ${p2.x} ${p2.y}`; + } + } + if (p1.x > p2.x) { + arc = "A 20 20, 0, 0, 0,"; + arc2 = "A 20 20, 0, 0, 1,"; + radius = 20; + offset = 20; + if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) { + lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - radius} ${arc2} ${p1.x - offset} ${p2.y} L ${p2.x} ${p2.y}`; + } else { + lineDef = `M ${p1.x} ${p1.y} L ${p2.x + radius} ${p1.y} ${arc} ${p2.x} ${p1.y + offset} L ${p2.x} ${p2.y}`; + } + } + if (p1.x === p2.x) { + lineDef = `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`; + } + } else if (dir === "BT") { + if (p1.x < p2.x) { + if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) { + lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + radius} ${arc2} ${p1.x + offset} ${p2.y} L ${p2.x} ${p2.y}`; + } else { + lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc} ${p2.x} ${p1.y - offset} L ${p2.x} ${p2.y}`; + } + } + if (p1.x > p2.x) { + arc = "A 20 20, 0, 0, 0,"; + arc2 = "A 20 20, 0, 0, 1,"; + radius = 20; + offset = 20; + if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) { + lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + radius} ${arc} ${p1.x - offset} ${p2.y} L ${p2.x} ${p2.y}`; + } else { + lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc} ${p2.x} ${p1.y - offset} L ${p2.x} ${p2.y}`; + } + } + if (p1.x === p2.x) { + lineDef = `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`; + } + } else { + if (p1.y < p2.y) { + if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) { + lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc2} ${p2.x} ${p1.y + offset} L ${p2.x} ${p2.y}`; + } else { + lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - radius} ${arc} ${p1.x + offset} ${p2.y} L ${p2.x} ${p2.y}`; + } + } + if (p1.y > p2.y) { + if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) { + lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc} ${p2.x} ${p1.y - offset} L ${p2.x} ${p2.y}`; + } else { + lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + radius} ${arc2} ${p1.x + offset} ${p2.y} L ${p2.x} ${p2.y}`; + } + } + if (p1.y === p2.y) { + lineDef = `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`; + } + } + } + if (lineDef === void 0) { + throw new Error("Line definition not found"); + } + svg.append("path").attr("d", lineDef).attr("class", "arrow arrow" + colorClassNum % THEME_COLOR_LIMIT); +}, "drawArrow"); +var drawArrows = /* @__PURE__ */ __name((svg, commits) => { + const gArrows = svg.append("g").attr("class", "commit-arrows"); + [...commits.keys()].forEach((key) => { + const commit2 = commits.get(key); + if (commit2.parents && commit2.parents.length > 0) { + commit2.parents.forEach((parent) => { + drawArrow(gArrows, commits.get(parent), commit2, commits); + }); + } + }); +}, "drawArrows"); +var drawBranches = /* @__PURE__ */ __name((svg, branches) => { + const g = svg.append("g"); + branches.forEach((branch2, index) => { + const adjustIndexForTheme = index % THEME_COLOR_LIMIT; + const pos = branchPos.get(branch2.name)?.pos; + if (pos === void 0) { + throw new Error(`Position not found for branch ${branch2.name}`); + } + const line = g.append("line"); + line.attr("x1", 0); + line.attr("y1", pos); + line.attr("x2", maxPos); + line.attr("y2", pos); + line.attr("class", "branch branch" + adjustIndexForTheme); + if (dir === "TB") { + line.attr("y1", defaultPos); + line.attr("x1", pos); + line.attr("y2", maxPos); + line.attr("x2", pos); + } else if (dir === "BT") { + line.attr("y1", maxPos); + line.attr("x1", pos); + line.attr("y2", defaultPos); + line.attr("x2", pos); + } + lanes.push(pos); + const name = branch2.name; + const labelElement = drawText(name); + const bkg = g.insert("rect"); + const branchLabel = g.insert("g").attr("class", "branchLabel"); + const label = branchLabel.insert("g").attr("class", "label branch-label" + adjustIndexForTheme); + label.node().appendChild(labelElement); + const bbox = labelElement.getBBox(); + bkg.attr("class", "branchLabelBkg label" + adjustIndexForTheme).attr("rx", 4).attr("ry", 4).attr("x", -bbox.width - 4 - (DEFAULT_GITGRAPH_CONFIG2?.rotateCommitLabel === true ? 30 : 0)).attr("y", -bbox.height / 2 + 8).attr("width", bbox.width + 18).attr("height", bbox.height + 4); + label.attr( + "transform", + "translate(" + (-bbox.width - 14 - (DEFAULT_GITGRAPH_CONFIG2?.rotateCommitLabel === true ? 30 : 0)) + ", " + (pos - bbox.height / 2 - 1) + ")" + ); + if (dir === "TB") { + bkg.attr("x", pos - bbox.width / 2 - 10).attr("y", 0); + label.attr("transform", "translate(" + (pos - bbox.width / 2 - 5) + ", 0)"); + } else if (dir === "BT") { + bkg.attr("x", pos - bbox.width / 2 - 10).attr("y", maxPos); + label.attr("transform", "translate(" + (pos - bbox.width / 2 - 5) + ", " + maxPos + ")"); + } else { + bkg.attr("transform", "translate(-19, " + (pos - bbox.height / 2) + ")"); + } + }); +}, "drawBranches"); +var setBranchPosition = /* @__PURE__ */ __name(function(name, pos, index, bbox, rotateCommitLabel) { + branchPos.set(name, { pos, index }); + pos += 50 + (rotateCommitLabel ? 40 : 0) + (dir === "TB" || dir === "BT" ? bbox.width / 2 : 0); + return pos; +}, "setBranchPosition"); +var draw = /* @__PURE__ */ __name(function(txt, id, ver, diagObj) { + clear3(); + log.debug("in gitgraph renderer", txt + "\n", "id:", id, ver); + if (!DEFAULT_GITGRAPH_CONFIG2) { + throw new Error("GitGraph config not found"); + } + const rotateCommitLabel = DEFAULT_GITGRAPH_CONFIG2.rotateCommitLabel ?? false; + const db2 = diagObj.db; + allCommitsDict = db2.getCommits(); + const branches = db2.getBranchesAsObjArray(); + dir = db2.getDirection(); + const diagram2 = select(`[id="${id}"]`); + let pos = 0; + branches.forEach((branch2, index) => { + const labelElement = drawText(branch2.name); + const g = diagram2.append("g"); + const branchLabel = g.insert("g").attr("class", "branchLabel"); + const label = branchLabel.insert("g").attr("class", "label branch-label"); + label.node()?.appendChild(labelElement); + const bbox = labelElement.getBBox(); + pos = setBranchPosition(branch2.name, pos, index, bbox, rotateCommitLabel); + label.remove(); + branchLabel.remove(); + g.remove(); + }); + drawCommits(diagram2, allCommitsDict, false); + if (DEFAULT_GITGRAPH_CONFIG2.showBranches) { + drawBranches(diagram2, branches); + } + drawArrows(diagram2, allCommitsDict); + drawCommits(diagram2, allCommitsDict, true); + utils_default.insertTitle( + diagram2, + "gitTitleText", + DEFAULT_GITGRAPH_CONFIG2.titleTopMargin ?? 0, + db2.getDiagramTitle() + ); + setupGraphViewbox( + void 0, + diagram2, + DEFAULT_GITGRAPH_CONFIG2.diagramPadding, + DEFAULT_GITGRAPH_CONFIG2.useMaxWidth + ); +}, "draw"); +var gitGraphRenderer_default = { + draw +}; +if (void 0) { + const { it, expect, describe } = void 0; + describe("drawText", () => { + it("should drawText", () => { + const svgLabel = drawText("main"); + expect(svgLabel).toBeDefined(); + expect(svgLabel.children[0].innerHTML).toBe("main"); + }); + }); + describe("branchPosition", () => { + const bbox = { + x: 0, + y: 0, + width: 10, + height: 10, + top: 0, + right: 0, + bottom: 0, + left: 0, + toJSON: /* @__PURE__ */ __name(() => "", "toJSON") + }; + it("should setBranchPositions LR with two branches", () => { + dir = "LR"; + const pos = setBranchPosition("main", 0, 0, bbox, true); + expect(pos).toBe(90); + expect(branchPos.get("main")).toEqual({ pos: 0, index: 0 }); + const posNext = setBranchPosition("develop", pos, 1, bbox, true); + expect(posNext).toBe(180); + expect(branchPos.get("develop")).toEqual({ pos, index: 1 }); + }); + it("should setBranchPositions TB with two branches", () => { + dir = "TB"; + bbox.width = 34.9921875; + const pos = setBranchPosition("main", 0, 0, bbox, true); + expect(pos).toBe(107.49609375); + expect(branchPos.get("main")).toEqual({ pos: 0, index: 0 }); + bbox.width = 56.421875; + const posNext = setBranchPosition("develop", pos, 1, bbox, true); + expect(posNext).toBe(225.70703125); + expect(branchPos.get("develop")).toEqual({ pos, index: 1 }); + }); + }); + describe("commitPosition", () => { + const commits = /* @__PURE__ */ new Map([ + [ + "commitZero", + { + id: "ZERO", + message: "", + seq: 0, + type: commitType.NORMAL, + tags: [], + parents: [], + branch: "main" + } + ], + [ + "commitA", + { + id: "A", + message: "", + seq: 1, + type: commitType.NORMAL, + tags: [], + parents: ["ZERO"], + branch: "feature" + } + ], + [ + "commitB", + { + id: "B", + message: "", + seq: 2, + type: commitType.NORMAL, + tags: [], + parents: ["A"], + branch: "feature" + } + ], + [ + "commitM", + { + id: "M", + message: "merged branch feature into main", + seq: 3, + type: commitType.MERGE, + tags: [], + parents: ["ZERO", "B"], + branch: "main", + customId: true + } + ], + [ + "commitC", + { + id: "C", + message: "", + seq: 4, + type: commitType.NORMAL, + tags: [], + parents: ["ZERO"], + branch: "release" + } + ], + [ + "commit5_8928ea0", + { + id: "5-8928ea0", + message: "cherry-picked [object Object] into release", + seq: 5, + type: commitType.CHERRY_PICK, + tags: [], + parents: ["C", "M"], + branch: "release" + } + ], + [ + "commitD", + { + id: "D", + message: "", + seq: 6, + type: commitType.NORMAL, + tags: [], + parents: ["5-8928ea0"], + branch: "release" + } + ], + [ + "commit7_ed848ba", + { + id: "7-ed848ba", + message: "cherry-picked [object Object] into release", + seq: 7, + type: commitType.CHERRY_PICK, + tags: [], + parents: ["D", "M"], + branch: "release" + } + ] + ]); + let pos = 0; + branchPos.set("main", { pos: 0, index: 0 }); + branchPos.set("feature", { pos: 107.49609375, index: 1 }); + branchPos.set("release", { pos: 224.03515625, index: 2 }); + describe("TB", () => { + pos = 30; + dir = "TB"; + const expectedCommitPositionTB = /* @__PURE__ */ new Map([ + ["commitZero", { x: 0, y: 40, posWithOffset: 40 }], + ["commitA", { x: 107.49609375, y: 90, posWithOffset: 90 }], + ["commitB", { x: 107.49609375, y: 140, posWithOffset: 140 }], + ["commitM", { x: 0, y: 190, posWithOffset: 190 }], + ["commitC", { x: 224.03515625, y: 240, posWithOffset: 240 }], + ["commit5_8928ea0", { x: 224.03515625, y: 290, posWithOffset: 290 }], + ["commitD", { x: 224.03515625, y: 340, posWithOffset: 340 }], + ["commit7_ed848ba", { x: 224.03515625, y: 390, posWithOffset: 390 }] + ]); + commits.forEach((commit2, key) => { + it(`should give the correct position for commit ${key}`, () => { + const position = getCommitPosition(commit2, pos, false); + expect(position).toEqual(expectedCommitPositionTB.get(key)); + pos += 50; + }); + }); + }); + describe("LR", () => { + let pos2 = 30; + dir = "LR"; + const expectedCommitPositionLR = /* @__PURE__ */ new Map([ + ["commitZero", { x: 0, y: 40, posWithOffset: 40 }], + ["commitA", { x: 107.49609375, y: 90, posWithOffset: 90 }], + ["commitB", { x: 107.49609375, y: 140, posWithOffset: 140 }], + ["commitM", { x: 0, y: 190, posWithOffset: 190 }], + ["commitC", { x: 224.03515625, y: 240, posWithOffset: 240 }], + ["commit5_8928ea0", { x: 224.03515625, y: 290, posWithOffset: 290 }], + ["commitD", { x: 224.03515625, y: 340, posWithOffset: 340 }], + ["commit7_ed848ba", { x: 224.03515625, y: 390, posWithOffset: 390 }] + ]); + commits.forEach((commit2, key) => { + it(`should give the correct position for commit ${key}`, () => { + const position = getCommitPosition(commit2, pos2, false); + expect(position).toEqual(expectedCommitPositionLR.get(key)); + pos2 += 50; + }); + }); + }); + describe("getCommitClassType", () => { + const expectedCommitClassType = /* @__PURE__ */ new Map([ + ["commitZero", "commit-normal"], + ["commitA", "commit-normal"], + ["commitB", "commit-normal"], + ["commitM", "commit-merge"], + ["commitC", "commit-normal"], + ["commit5_8928ea0", "commit-cherry-pick"], + ["commitD", "commit-normal"], + ["commit7_ed848ba", "commit-cherry-pick"] + ]); + commits.forEach((commit2, key) => { + it(`should give the correct class type for commit ${key}`, () => { + const classType = getCommitClassType(commit2); + expect(classType).toBe(expectedCommitClassType.get(key)); + }); + }); + }); + }); + describe("building BT parallel commit diagram", () => { + const commits = /* @__PURE__ */ new Map([ + [ + "1-abcdefg", + { + id: "1-abcdefg", + message: "", + seq: 0, + type: 0, + tags: [], + parents: [], + branch: "main" + } + ], + [ + "2-abcdefg", + { + id: "2-abcdefg", + message: "", + seq: 1, + type: 0, + tags: [], + parents: ["1-abcdefg"], + branch: "main" + } + ], + [ + "3-abcdefg", + { + id: "3-abcdefg", + message: "", + seq: 2, + type: 0, + tags: [], + parents: ["2-abcdefg"], + branch: "develop" + } + ], + [ + "4-abcdefg", + { + id: "4-abcdefg", + message: "", + seq: 3, + type: 0, + tags: [], + parents: ["3-abcdefg"], + branch: "develop" + } + ], + [ + "5-abcdefg", + { + id: "5-abcdefg", + message: "", + seq: 4, + type: 0, + tags: [], + parents: ["2-abcdefg"], + branch: "feature" + } + ], + [ + "6-abcdefg", + { + id: "6-abcdefg", + message: "", + seq: 5, + type: 0, + tags: [], + parents: ["5-abcdefg"], + branch: "feature" + } + ], + [ + "7-abcdefg", + { + id: "7-abcdefg", + message: "", + seq: 6, + type: 0, + tags: [], + parents: ["2-abcdefg"], + branch: "main" + } + ], + [ + "8-abcdefg", + { + id: "8-abcdefg", + message: "", + seq: 7, + type: 0, + tags: [], + parents: ["7-abcdefg"], + branch: "main" + } + ] + ]); + const expectedCommitPosition = /* @__PURE__ */ new Map([ + ["1-abcdefg", { x: 0, y: 40 }], + ["2-abcdefg", { x: 0, y: 90 }], + ["3-abcdefg", { x: 107.49609375, y: 140 }], + ["4-abcdefg", { x: 107.49609375, y: 190 }], + ["5-abcdefg", { x: 225.70703125, y: 140 }], + ["6-abcdefg", { x: 225.70703125, y: 190 }], + ["7-abcdefg", { x: 0, y: 140 }], + ["8-abcdefg", { x: 0, y: 190 }] + ]); + const expectedCommitPositionAfterParallel = /* @__PURE__ */ new Map([ + ["1-abcdefg", { x: 0, y: 210 }], + ["2-abcdefg", { x: 0, y: 160 }], + ["3-abcdefg", { x: 107.49609375, y: 110 }], + ["4-abcdefg", { x: 107.49609375, y: 60 }], + ["5-abcdefg", { x: 225.70703125, y: 110 }], + ["6-abcdefg", { x: 225.70703125, y: 60 }], + ["7-abcdefg", { x: 0, y: 110 }], + ["8-abcdefg", { x: 0, y: 60 }] + ]); + const expectedCommitCurrentPosition = /* @__PURE__ */ new Map([ + ["1-abcdefg", 30], + ["2-abcdefg", 80], + ["3-abcdefg", 130], + ["4-abcdefg", 180], + ["5-abcdefg", 130], + ["6-abcdefg", 180], + ["7-abcdefg", 130], + ["8-abcdefg", 180] + ]); + const sortedKeys = [...expectedCommitPosition.keys()]; + it("should get the correct commit position and current position", () => { + dir = "BT"; + let curPos = 30; + commitPos.clear(); + branchPos.clear(); + branchPos.set("main", { pos: 0, index: 0 }); + branchPos.set("develop", { pos: 107.49609375, index: 1 }); + branchPos.set("feature", { pos: 225.70703125, index: 2 }); + DEFAULT_GITGRAPH_CONFIG2.parallelCommits = true; + commits.forEach((commit2, key) => { + if (commit2.parents.length > 0) { + curPos = calculateCommitPosition(commit2); + } + const position = setCommitPosition(commit2, curPos); + expect(position).toEqual(expectedCommitPosition.get(key)); + expect(curPos).toEqual(expectedCommitCurrentPosition.get(key)); + }); + }); + it("should get the correct commit position after parallel commits", () => { + commitPos.clear(); + branchPos.clear(); + dir = "BT"; + const curPos = 30; + commitPos.clear(); + branchPos.clear(); + branchPos.set("main", { pos: 0, index: 0 }); + branchPos.set("develop", { pos: 107.49609375, index: 1 }); + branchPos.set("feature", { pos: 225.70703125, index: 2 }); + setParallelBTPos(sortedKeys, commits, curPos); + sortedKeys.forEach((commit2) => { + const position = commitPos.get(commit2); + expect(position).toEqual(expectedCommitPositionAfterParallel.get(commit2)); + }); + }); + }); + DEFAULT_GITGRAPH_CONFIG2.parallelCommits = false; + it("add", () => { + commitPos.set("parent1", { x: 1, y: 1 }); + commitPos.set("parent2", { x: 2, y: 2 }); + commitPos.set("parent3", { x: 3, y: 3 }); + dir = "LR"; + const parents = ["parent1", "parent2", "parent3"]; + const closestParent = findClosestParent(parents); + expect(closestParent).toBe("parent3"); + commitPos.clear(); + }); +} + +// src/diagrams/git/styles.js +var getStyles = /* @__PURE__ */ __name((options) => ` + .commit-id, + .commit-msg, + .branch-label { + fill: lightgrey; + color: lightgrey; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + } + ${[0, 1, 2, 3, 4, 5, 6, 7].map( + (i) => ` + .branch-label${i} { fill: ${options["gitBranchLabel" + i]}; } + .commit${i} { stroke: ${options["git" + i]}; fill: ${options["git" + i]}; } + .commit-highlight${i} { stroke: ${options["gitInv" + i]}; fill: ${options["gitInv" + i]}; } + .label${i} { fill: ${options["git" + i]}; } + .arrow${i} { stroke: ${options["git" + i]}; } + ` +).join("\n")} + + .branch { + stroke-width: 1; + stroke: ${options.lineColor}; + stroke-dasharray: 2; + } + .commit-label { font-size: ${options.commitLabelFontSize}; fill: ${options.commitLabelColor};} + .commit-label-bkg { font-size: ${options.commitLabelFontSize}; fill: ${options.commitLabelBackground}; opacity: 0.5; } + .tag-label { font-size: ${options.tagLabelFontSize}; fill: ${options.tagLabelColor};} + .tag-label-bkg { fill: ${options.tagLabelBackground}; stroke: ${options.tagLabelBorder}; } + .tag-hole { fill: ${options.textColor}; } + + .commit-merge { + stroke: ${options.primaryColor}; + fill: ${options.primaryColor}; + } + .commit-reverse { + stroke: ${options.primaryColor}; + fill: ${options.primaryColor}; + stroke-width: 3; + } + .commit-highlight-outer { + } + .commit-highlight-inner { + stroke: ${options.primaryColor}; + fill: ${options.primaryColor}; + } + + .arrow { stroke-width: 8; stroke-linecap: round; fill: none} + .gitTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${options.textColor}; + } +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/git/gitGraphDiagram.ts +var diagram = { + parser, + db, + renderer: gitGraphRenderer_default, + styles: styles_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/gitGraphDiagram-NY62KEGX.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/gitGraphDiagram-NY62KEGX.mjs.map new file mode 100644 index 0000000..5eaa820 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/gitGraphDiagram-NY62KEGX.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/git/gitGraphParser.ts", "../../../src/diagrams/git/gitGraphTypes.ts", "../../../src/diagrams/git/gitGraphAst.ts", "../../../src/diagrams/git/gitGraphRenderer.ts", "../../../src/diagrams/git/styles.js", "../../../src/diagrams/git/gitGraphDiagram.ts"], + "sourcesContent": ["import type { GitGraph } from '@mermaid-js/parser';\nimport { parse } from '@mermaid-js/parser';\nimport type { ParserDefinition } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { populateCommonDb } from '../common/populateCommonDb.js';\nimport { db } from './gitGraphAst.js';\nimport { commitType } from './gitGraphTypes.js';\nimport type {\n CheckoutAst,\n CherryPickingAst,\n MergeAst,\n CommitAst,\n BranchAst,\n GitGraphDBParseProvider,\n CommitDB,\n BranchDB,\n MergeDB,\n CherryPickDB,\n} from './gitGraphTypes.js';\n\nconst populate = (ast: GitGraph, db: GitGraphDBParseProvider) => {\n populateCommonDb(ast, db);\n // @ts-ignore: this wont exist if the direction is not specified\n if (ast.dir) {\n // @ts-ignore: this wont exist if the direction is not specified\n db.setDirection(ast.dir);\n }\n for (const statement of ast.statements) {\n parseStatement(statement, db);\n }\n};\n\nconst parseStatement = (statement: any, db: GitGraphDBParseProvider) => {\n const parsers: Record void> = {\n Commit: (stmt) => db.commit(parseCommit(stmt)),\n Branch: (stmt) => db.branch(parseBranch(stmt)),\n Merge: (stmt) => db.merge(parseMerge(stmt)),\n Checkout: (stmt) => db.checkout(parseCheckout(stmt)),\n CherryPicking: (stmt) => db.cherryPick(parseCherryPicking(stmt)),\n };\n\n const parser = parsers[statement.$type];\n if (parser) {\n parser(statement);\n } else {\n log.error(`Unknown statement type: ${statement.$type}`);\n }\n};\n\nconst parseCommit = (commit: CommitAst): CommitDB => {\n const commitDB: CommitDB = {\n id: commit.id,\n msg: commit.message ?? '',\n type: commit.type !== undefined ? commitType[commit.type] : commitType.NORMAL,\n tags: commit.tags ?? undefined,\n };\n return commitDB;\n};\n\nconst parseBranch = (branch: BranchAst): BranchDB => {\n const branchDB: BranchDB = {\n name: branch.name,\n order: branch.order ?? 0,\n };\n return branchDB;\n};\n\nconst parseMerge = (merge: MergeAst): MergeDB => {\n const mergeDB: MergeDB = {\n branch: merge.branch,\n id: merge.id ?? '',\n type: merge.type !== undefined ? commitType[merge.type] : undefined,\n tags: merge.tags ?? undefined,\n };\n return mergeDB;\n};\n\nconst parseCheckout = (checkout: CheckoutAst): string => {\n const branch = checkout.branch;\n return branch;\n};\n\nconst parseCherryPicking = (cherryPicking: CherryPickingAst): CherryPickDB => {\n const cherryPickDB: CherryPickDB = {\n id: cherryPicking.id,\n targetId: '',\n tags: cherryPicking.tags?.length === 0 ? undefined : cherryPicking.tags,\n parent: cherryPicking.parent,\n };\n return cherryPickDB;\n};\n\nexport const parser: ParserDefinition = {\n parse: async (input: string): Promise => {\n const ast: GitGraph = await parse('gitGraph', input);\n log.debug(ast);\n populate(ast, db);\n },\n};\n\nif (import.meta.vitest) {\n const { it, expect, describe } = import.meta.vitest;\n\n const mockDB: GitGraphDBParseProvider = {\n commitType: commitType,\n setDirection: vi.fn(),\n commit: vi.fn(),\n branch: vi.fn(),\n merge: vi.fn(),\n cherryPick: vi.fn(),\n checkout: vi.fn(),\n };\n\n describe('GitGraph Parser', () => {\n it('should parse a commit statement', () => {\n const commit = {\n $type: 'Commit',\n id: '1',\n message: 'test',\n tags: ['tag1', 'tag2'],\n type: 'NORMAL',\n };\n parseStatement(commit, mockDB);\n expect(mockDB.commit).toHaveBeenCalledWith({\n id: '1',\n msg: 'test',\n tags: ['tag1', 'tag2'],\n type: 0,\n });\n });\n it('should parse a branch statement', () => {\n const branch = {\n $type: 'Branch',\n name: 'newBranch',\n order: 1,\n };\n parseStatement(branch, mockDB);\n expect(mockDB.branch).toHaveBeenCalledWith({ name: 'newBranch', order: 1 });\n });\n it('should parse a checkout statement', () => {\n const checkout = {\n $type: 'Checkout',\n branch: 'newBranch',\n };\n parseStatement(checkout, mockDB);\n expect(mockDB.checkout).toHaveBeenCalledWith('newBranch');\n });\n it('should parse a merge statement', () => {\n const merge = {\n $type: 'Merge',\n branch: 'newBranch',\n id: '1',\n tags: ['tag1', 'tag2'],\n type: 'NORMAL',\n };\n parseStatement(merge, mockDB);\n expect(mockDB.merge).toHaveBeenCalledWith({\n branch: 'newBranch',\n id: '1',\n tags: ['tag1', 'tag2'],\n type: 0,\n });\n });\n it('should parse a cherry picking statement', () => {\n const cherryPick = {\n $type: 'CherryPicking',\n id: '1',\n tags: ['tag1', 'tag2'],\n parent: '2',\n };\n parseStatement(cherryPick, mockDB);\n expect(mockDB.cherryPick).toHaveBeenCalledWith({\n id: '1',\n targetId: '',\n parent: '2',\n tags: ['tag1', 'tag2'],\n });\n });\n\n it('should parse a langium generated gitGraph ast', () => {\n const dummy: GitGraph = {\n $type: 'GitGraph',\n statements: [],\n };\n const gitGraphAst: GitGraph = {\n $type: 'GitGraph',\n statements: [\n {\n $container: dummy,\n $type: 'Commit',\n id: '1',\n message: 'test',\n tags: ['tag1', 'tag2'],\n type: 'NORMAL',\n },\n {\n $container: dummy,\n $type: 'Branch',\n name: 'newBranch',\n order: 1,\n },\n {\n $container: dummy,\n $type: 'Merge',\n branch: 'newBranch',\n id: '1',\n tags: ['tag1', 'tag2'],\n type: 'NORMAL',\n },\n {\n $container: dummy,\n $type: 'Checkout',\n branch: 'newBranch',\n },\n {\n $container: dummy,\n $type: 'CherryPicking',\n id: '1',\n tags: ['tag1', 'tag2'],\n parent: '2',\n },\n ],\n };\n\n populate(gitGraphAst, mockDB);\n\n expect(mockDB.commit).toHaveBeenCalledWith({\n id: '1',\n msg: 'test',\n tags: ['tag1', 'tag2'],\n type: 0,\n });\n expect(mockDB.branch).toHaveBeenCalledWith({ name: 'newBranch', order: 1 });\n expect(mockDB.merge).toHaveBeenCalledWith({\n branch: 'newBranch',\n id: '1',\n tags: ['tag1', 'tag2'],\n type: 0,\n });\n expect(mockDB.checkout).toHaveBeenCalledWith('newBranch');\n });\n });\n}\n", "import type { GitGraphDiagramConfig } from '../../config.type.js';\nimport type { DiagramDBBase } from '../../diagram-api/types.js';\n\nexport const commitType = {\n NORMAL: 0,\n REVERSE: 1,\n HIGHLIGHT: 2,\n MERGE: 3,\n CHERRY_PICK: 4,\n} as const;\n\nexport interface CommitDB {\n msg: string;\n id: string;\n type: number;\n tags?: string[];\n}\n\nexport interface BranchDB {\n name: string;\n order: number;\n}\n\nexport interface MergeDB {\n branch: string;\n id: string;\n type?: number;\n tags?: string[];\n}\n\nexport interface CherryPickDB {\n id: string;\n targetId: string;\n parent: string;\n tags?: string[];\n}\n\nexport interface Commit {\n id: string;\n message: string;\n seq: number;\n type: number;\n tags: string[];\n parents: string[];\n branch: string;\n customType?: number;\n customId?: boolean;\n}\n\nexport interface GitGraph {\n statements: Statement[];\n}\n\nexport type Statement = CommitAst | BranchAst | MergeAst | CheckoutAst | CherryPickingAst;\n\nexport interface CommitAst {\n $type: 'Commit';\n id: string;\n message?: string;\n tags?: string[];\n type?: 'NORMAL' | 'REVERSE' | 'HIGHLIGHT';\n}\n\nexport interface BranchAst {\n $type: 'Branch';\n name: string;\n order?: number;\n}\n\nexport interface MergeAst {\n $type: 'Merge';\n branch: string;\n id?: string;\n tags?: string[];\n type?: 'NORMAL' | 'REVERSE' | 'HIGHLIGHT';\n}\n\nexport interface CheckoutAst {\n $type: 'Checkout';\n branch: string;\n}\n\nexport interface CherryPickingAst {\n $type: 'CherryPicking';\n id: string;\n parent: string;\n tags?: string[];\n}\n\nexport interface GitGraphDB extends DiagramDBBase {\n commitType: typeof commitType;\n setDirection: (dir: DiagramOrientation) => void;\n setOptions: (rawOptString: string) => void;\n getOptions: () => any;\n commit: (commitDB: CommitDB) => void;\n branch: (branchDB: BranchDB) => void;\n merge: (mergeDB: MergeDB) => void;\n cherryPick: (cherryPickDB: CherryPickDB) => void;\n checkout: (branch: string) => void;\n prettyPrint: () => void;\n clear: () => void;\n getBranchesAsObjArray: () => { name: string }[];\n getBranches: () => Map;\n getCommits: () => Map;\n getCommitsArray: () => Commit[];\n getCurrentBranch: () => string;\n getDirection: () => DiagramOrientation;\n getHead: () => Commit | null;\n}\n\nexport interface GitGraphDBParseProvider extends Partial {\n commitType: typeof commitType;\n setDirection: (dir: DiagramOrientation) => void;\n commit: (commitDB: CommitDB) => void;\n branch: (branchDB: BranchDB) => void;\n merge: (mergeDB: MergeDB) => void;\n cherryPick: (cherryPickDB: CherryPickDB) => void;\n checkout: (branch: string) => void;\n}\n\nexport interface GitGraphDBRenderProvider extends Partial {\n prettyPrint: () => void;\n clear: () => void;\n getBranchesAsObjArray: () => { name: string }[];\n getBranches: () => Map;\n getCommits: () => Map;\n getCommitsArray: () => Commit[];\n getCurrentBranch: () => string;\n getDirection: () => DiagramOrientation;\n getHead: () => Commit | null;\n getDiagramTitle: () => string;\n}\n\nexport type DiagramOrientation = 'LR' | 'TB' | 'BT';\n", "import { log } from '../../logger.js';\nimport { cleanAndMerge, random } from '../../utils.js';\nimport { getConfig as commonGetConfig } from '../../config.js';\nimport common from '../common/common.js';\nimport {\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n clear as commonClear,\n setDiagramTitle,\n getDiagramTitle,\n} from '../common/commonDb.js';\nimport type {\n DiagramOrientation,\n Commit,\n GitGraphDB,\n CommitDB,\n MergeDB,\n BranchDB,\n CherryPickDB,\n} from './gitGraphTypes.js';\nimport { commitType } from './gitGraphTypes.js';\nimport { ImperativeState } from '../../utils/imperativeState.js';\n\nimport DEFAULT_CONFIG from '../../defaultConfig.js';\n\nimport type { GitGraphDiagramConfig } from '../../config.type.js';\ninterface GitGraphState {\n commits: Map;\n head: Commit | null;\n branchConfig: Map;\n branches: Map;\n currBranch: string;\n direction: DiagramOrientation;\n seq: number;\n options: any;\n}\n\nconst DEFAULT_GITGRAPH_CONFIG: Required = DEFAULT_CONFIG.gitGraph;\nconst getConfig = (): Required => {\n const config = cleanAndMerge({\n ...DEFAULT_GITGRAPH_CONFIG,\n ...commonGetConfig().gitGraph,\n });\n return config;\n};\n\nconst state = new ImperativeState(() => {\n const config = getConfig();\n const mainBranchName = config.mainBranchName;\n const mainBranchOrder = config.mainBranchOrder;\n return {\n mainBranchName,\n commits: new Map(),\n head: null,\n branchConfig: new Map([[mainBranchName, { name: mainBranchName, order: mainBranchOrder }]]),\n branches: new Map([[mainBranchName, null]]),\n currBranch: mainBranchName,\n direction: 'LR',\n seq: 0,\n options: {},\n };\n});\n\nfunction getID() {\n return random({ length: 7 });\n}\n\n/**\n * @param list - list of items\n * @param fn - function to get the key\n */\nfunction uniqBy(list: any[], fn: (item: any) => any) {\n const recordMap = Object.create(null);\n return list.reduce((out, item) => {\n const key = fn(item);\n if (!recordMap[key]) {\n recordMap[key] = true;\n out.push(item);\n }\n return out;\n }, []);\n}\n\nexport const setDirection = function (dir: DiagramOrientation) {\n state.records.direction = dir;\n};\n\nexport const setOptions = function (rawOptString: string) {\n log.debug('options str', rawOptString);\n rawOptString = rawOptString?.trim();\n rawOptString = rawOptString || '{}';\n try {\n state.records.options = JSON.parse(rawOptString);\n } catch (e: any) {\n log.error('error while parsing gitGraph options', e.message);\n }\n};\n\nexport const getOptions = function () {\n return state.records.options;\n};\n\nexport const commit = function (commitDB: CommitDB) {\n let msg = commitDB.msg;\n let id = commitDB.id;\n const type = commitDB.type;\n let tags = commitDB.tags;\n\n log.info('commit', msg, id, type, tags);\n log.debug('Entering commit:', msg, id, type, tags);\n const config = getConfig();\n id = common.sanitizeText(id, config);\n msg = common.sanitizeText(msg, config);\n tags = tags?.map((tag) => common.sanitizeText(tag, config));\n const newCommit: Commit = {\n id: id ? id : state.records.seq + '-' + getID(),\n message: msg,\n seq: state.records.seq++,\n type: type ?? commitType.NORMAL,\n tags: tags ?? [],\n parents: state.records.head == null ? [] : [state.records.head.id],\n branch: state.records.currBranch,\n };\n state.records.head = newCommit;\n log.info('main branch', config.mainBranchName);\n if (state.records.commits.has(newCommit.id)) {\n log.warn(`Commit ID ${newCommit.id} already exists`);\n }\n state.records.commits.set(newCommit.id, newCommit);\n state.records.branches.set(state.records.currBranch, newCommit.id);\n log.debug('in pushCommit ' + newCommit.id);\n};\n\nexport const branch = function (branchDB: BranchDB) {\n let name = branchDB.name;\n const order = branchDB.order;\n name = common.sanitizeText(name, getConfig());\n if (state.records.branches.has(name)) {\n throw new Error(\n `Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using \"checkout ${name}\")`\n );\n }\n\n state.records.branches.set(name, state.records.head != null ? state.records.head.id : null);\n state.records.branchConfig.set(name, { name, order });\n checkout(name);\n log.debug('in createBranch');\n};\n\nexport const merge = (mergeDB: MergeDB): void => {\n let otherBranch = mergeDB.branch;\n let customId = mergeDB.id;\n const overrideType = mergeDB.type;\n const customTags = mergeDB.tags;\n const config = getConfig();\n otherBranch = common.sanitizeText(otherBranch, config);\n if (customId) {\n customId = common.sanitizeText(customId, config);\n }\n const currentBranchCheck = state.records.branches.get(state.records.currBranch);\n const otherBranchCheck = state.records.branches.get(otherBranch);\n const currentCommit = currentBranchCheck\n ? state.records.commits.get(currentBranchCheck)\n : undefined;\n const otherCommit: Commit | undefined = otherBranchCheck\n ? state.records.commits.get(otherBranchCheck)\n : undefined;\n if (currentCommit && otherCommit && currentCommit.branch === otherBranch) {\n throw new Error(`Cannot merge branch '${otherBranch}' into itself.`);\n }\n if (state.records.currBranch === otherBranch) {\n const error: any = new Error('Incorrect usage of \"merge\". Cannot merge a branch to itself');\n error.hash = {\n text: `merge ${otherBranch}`,\n token: `merge ${otherBranch}`,\n expected: ['branch abc'],\n };\n throw error;\n }\n if (currentCommit === undefined || !currentCommit) {\n const error: any = new Error(\n `Incorrect usage of \"merge\". Current branch (${state.records.currBranch})has no commits`\n );\n error.hash = {\n text: `merge ${otherBranch}`,\n token: `merge ${otherBranch}`,\n expected: ['commit'],\n };\n throw error;\n }\n if (!state.records.branches.has(otherBranch)) {\n const error: any = new Error(\n 'Incorrect usage of \"merge\". Branch to be merged (' + otherBranch + ') does not exist'\n );\n error.hash = {\n text: `merge ${otherBranch}`,\n token: `merge ${otherBranch}`,\n expected: [`branch ${otherBranch}`],\n };\n throw error;\n }\n if (otherCommit === undefined || !otherCommit) {\n const error: any = new Error(\n 'Incorrect usage of \"merge\". Branch to be merged (' + otherBranch + ') has no commits'\n );\n error.hash = {\n text: `merge ${otherBranch}`,\n token: `merge ${otherBranch}`,\n expected: ['\"commit\"'],\n };\n throw error;\n }\n if (currentCommit === otherCommit) {\n const error: any = new Error('Incorrect usage of \"merge\". Both branches have same head');\n error.hash = {\n text: `merge ${otherBranch}`,\n token: `merge ${otherBranch}`,\n expected: ['branch abc'],\n };\n throw error;\n }\n if (customId && state.records.commits.has(customId)) {\n const error: any = new Error(\n 'Incorrect usage of \"merge\". Commit with id:' +\n customId +\n ' already exists, use different custom id'\n );\n error.hash = {\n text: `merge ${otherBranch} ${customId} ${overrideType} ${customTags?.join(' ')}`,\n token: `merge ${otherBranch} ${customId} ${overrideType} ${customTags?.join(' ')}`,\n expected: [\n `merge ${otherBranch} ${customId}_UNIQUE ${overrideType} ${customTags?.join(' ')}`,\n ],\n };\n\n throw error;\n }\n\n const verifiedBranch: string = otherBranchCheck ? otherBranchCheck : ''; //figure out a cleaner way to do this\n\n const commit = {\n id: customId || `${state.records.seq}-${getID()}`,\n message: `merged branch ${otherBranch} into ${state.records.currBranch}`,\n seq: state.records.seq++,\n parents: state.records.head == null ? [] : [state.records.head.id, verifiedBranch],\n branch: state.records.currBranch,\n type: commitType.MERGE,\n customType: overrideType,\n customId: customId ? true : false,\n tags: customTags ?? [],\n } satisfies Commit;\n state.records.head = commit;\n state.records.commits.set(commit.id, commit);\n state.records.branches.set(state.records.currBranch, commit.id);\n log.debug(state.records.branches);\n log.debug('in mergeBranch');\n};\n\nexport const cherryPick = function (cherryPickDB: CherryPickDB) {\n let sourceId = cherryPickDB.id;\n let targetId = cherryPickDB.targetId;\n let tags = cherryPickDB.tags;\n let parentCommitId = cherryPickDB.parent;\n log.debug('Entering cherryPick:', sourceId, targetId, tags);\n const config = getConfig();\n sourceId = common.sanitizeText(sourceId, config);\n targetId = common.sanitizeText(targetId, config);\n\n tags = tags?.map((tag) => common.sanitizeText(tag, config));\n\n parentCommitId = common.sanitizeText(parentCommitId, config);\n\n if (!sourceId || !state.records.commits.has(sourceId)) {\n const error: any = new Error(\n 'Incorrect usage of \"cherryPick\". Source commit id should exist and provided'\n );\n error.hash = {\n text: `cherryPick ${sourceId} ${targetId}`,\n token: `cherryPick ${sourceId} ${targetId}`,\n expected: ['cherry-pick abc'],\n };\n throw error;\n }\n\n const sourceCommit = state.records.commits.get(sourceId);\n if (sourceCommit === undefined || !sourceCommit) {\n throw new Error('Incorrect usage of \"cherryPick\". Source commit id should exist and provided');\n }\n if (\n parentCommitId &&\n !(Array.isArray(sourceCommit.parents) && sourceCommit.parents.includes(parentCommitId))\n ) {\n const error = new Error(\n 'Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.'\n );\n throw error;\n }\n const sourceCommitBranch = sourceCommit.branch;\n if (sourceCommit.type === commitType.MERGE && !parentCommitId) {\n const error = new Error(\n 'Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.'\n );\n throw error;\n }\n if (!targetId || !state.records.commits.has(targetId)) {\n // cherry-pick source commit to current branch\n\n if (sourceCommitBranch === state.records.currBranch) {\n const error: any = new Error(\n 'Incorrect usage of \"cherryPick\". Source commit is already on current branch'\n );\n error.hash = {\n text: `cherryPick ${sourceId} ${targetId}`,\n token: `cherryPick ${sourceId} ${targetId}`,\n expected: ['cherry-pick abc'],\n };\n throw error;\n }\n const currentCommitId = state.records.branches.get(state.records.currBranch);\n if (currentCommitId === undefined || !currentCommitId) {\n const error: any = new Error(\n `Incorrect usage of \"cherry-pick\". Current branch (${state.records.currBranch})has no commits`\n );\n error.hash = {\n text: `cherryPick ${sourceId} ${targetId}`,\n token: `cherryPick ${sourceId} ${targetId}`,\n expected: ['cherry-pick abc'],\n };\n throw error;\n }\n\n const currentCommit = state.records.commits.get(currentCommitId);\n if (currentCommit === undefined || !currentCommit) {\n const error: any = new Error(\n `Incorrect usage of \"cherry-pick\". Current branch (${state.records.currBranch})has no commits`\n );\n error.hash = {\n text: `cherryPick ${sourceId} ${targetId}`,\n token: `cherryPick ${sourceId} ${targetId}`,\n expected: ['cherry-pick abc'],\n };\n throw error;\n }\n const commit = {\n id: state.records.seq + '-' + getID(),\n message: `cherry-picked ${sourceCommit?.message} into ${state.records.currBranch}`,\n seq: state.records.seq++,\n parents: state.records.head == null ? [] : [state.records.head.id, sourceCommit.id],\n branch: state.records.currBranch,\n type: commitType.CHERRY_PICK,\n tags: tags\n ? tags.filter(Boolean)\n : [\n `cherry-pick:${sourceCommit.id}${\n sourceCommit.type === commitType.MERGE ? `|parent:${parentCommitId}` : ''\n }`,\n ],\n };\n\n state.records.head = commit;\n state.records.commits.set(commit.id, commit);\n state.records.branches.set(state.records.currBranch, commit.id);\n log.debug(state.records.branches);\n log.debug('in cherryPick');\n }\n};\nexport const checkout = function (branch: string) {\n branch = common.sanitizeText(branch, getConfig());\n if (!state.records.branches.has(branch)) {\n const error: any = new Error(\n `Trying to checkout branch which is not yet created. (Help try using \"branch ${branch}\")`\n );\n error.hash = {\n text: `checkout ${branch}`,\n token: `checkout ${branch}`,\n expected: [`branch ${branch}`],\n };\n throw error;\n } else {\n state.records.currBranch = branch;\n const id = state.records.branches.get(state.records.currBranch);\n if (id === undefined || !id) {\n state.records.head = null;\n } else {\n state.records.head = state.records.commits.get(id) ?? null;\n }\n }\n};\n\n/**\n * @param arr - array\n * @param key - key\n * @param newVal - new value\n */\nfunction upsert(arr: any[], key: any, newVal: any) {\n const index = arr.indexOf(key);\n if (index === -1) {\n arr.push(newVal);\n } else {\n arr.splice(index, 1, newVal);\n }\n}\n\nfunction prettyPrintCommitHistory(commitArr: Commit[]) {\n const commit = commitArr.reduce((out, commit) => {\n if (out.seq > commit.seq) {\n return out;\n }\n return commit;\n }, commitArr[0]);\n let line = '';\n commitArr.forEach(function (c) {\n if (c === commit) {\n line += '\\t*';\n } else {\n line += '\\t|';\n }\n });\n const label = [line, commit.id, commit.seq];\n for (const branch in state.records.branches) {\n if (state.records.branches.get(branch) === commit.id) {\n label.push(branch);\n }\n }\n log.debug(label.join(' '));\n if (commit.parents && commit.parents.length == 2 && commit.parents[0] && commit.parents[1]) {\n const newCommit = state.records.commits.get(commit.parents[0]);\n upsert(commitArr, commit, newCommit);\n if (commit.parents[1]) {\n commitArr.push(state.records.commits.get(commit.parents[1])!);\n }\n } else if (commit.parents.length == 0) {\n return;\n } else {\n if (commit.parents[0]) {\n const newCommit = state.records.commits.get(commit.parents[0]);\n upsert(commitArr, commit, newCommit);\n }\n }\n commitArr = uniqBy(commitArr, (c) => c.id);\n prettyPrintCommitHistory(commitArr);\n}\n\nexport const prettyPrint = function () {\n log.debug(state.records.commits);\n const node = getCommitsArray()[0];\n prettyPrintCommitHistory([node]);\n};\n\nexport const clear = function () {\n state.reset();\n commonClear();\n};\n\nexport const getBranchesAsObjArray = function () {\n const branchesArray = [...state.records.branchConfig.values()]\n .map((branchConfig, i) => {\n if (branchConfig.order !== null && branchConfig.order !== undefined) {\n return branchConfig;\n }\n return {\n ...branchConfig,\n order: parseFloat(`0.${i}`),\n };\n })\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n .map(({ name }) => ({ name }));\n\n return branchesArray;\n};\n\nexport const getBranches = function () {\n return state.records.branches;\n};\nexport const getCommits = function () {\n return state.records.commits;\n};\nexport const getCommitsArray = function () {\n const commitArr = [...state.records.commits.values()];\n commitArr.forEach(function (o) {\n log.debug(o.id);\n });\n commitArr.sort((a, b) => a.seq - b.seq);\n return commitArr;\n};\nexport const getCurrentBranch = function () {\n return state.records.currBranch;\n};\nexport const getDirection = function () {\n return state.records.direction;\n};\nexport const getHead = function () {\n return state.records.head;\n};\n\nexport const db: GitGraphDB = {\n commitType,\n getConfig,\n setDirection,\n setOptions,\n getOptions,\n commit,\n branch,\n merge,\n cherryPick,\n checkout,\n //reset,\n prettyPrint,\n clear,\n getBranchesAsObjArray,\n getBranches,\n getCommits,\n getCommitsArray,\n getCurrentBranch,\n getDirection,\n getHead,\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n setDiagramTitle,\n getDiagramTitle,\n};\n", "import { select } from 'd3';\nimport { getConfig, setupGraphViewbox } from '../../diagram-api/diagramAPI.js';\nimport { log } from '../../logger.js';\nimport utils from '../../utils.js';\nimport type { DrawDefinition } from '../../diagram-api/types.js';\nimport type d3 from 'd3';\nimport type { Commit, GitGraphDBRenderProvider, DiagramOrientation } from './gitGraphTypes.js';\nimport { commitType } from './gitGraphTypes.js';\n\ninterface BranchPosition {\n pos: number;\n index: number;\n}\n\ninterface CommitPosition {\n x: number;\n y: number;\n}\n\ninterface CommitPositionOffset extends CommitPosition {\n posWithOffset: number;\n}\n\nconst DEFAULT_CONFIG = getConfig();\nconst DEFAULT_GITGRAPH_CONFIG = DEFAULT_CONFIG?.gitGraph;\nconst LAYOUT_OFFSET = 10;\nconst COMMIT_STEP = 40;\nconst PX = 4;\nconst PY = 2;\n\nconst THEME_COLOR_LIMIT = 8;\nconst branchPos = new Map();\nconst commitPos = new Map();\nconst defaultPos = 30;\n\nlet allCommitsDict = new Map();\nlet lanes: number[] = [];\nlet maxPos = 0;\nlet dir: DiagramOrientation = 'LR';\n\nconst clear = () => {\n branchPos.clear();\n commitPos.clear();\n allCommitsDict.clear();\n maxPos = 0;\n lanes = [];\n dir = 'LR';\n};\n\nconst drawText = (txt: string | string[]) => {\n const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n const rows = typeof txt === 'string' ? txt.split(/\\\\n|\\n|/gi) : txt;\n\n rows.forEach((row) => {\n const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n tspan.setAttribute('dy', '1em');\n tspan.setAttribute('x', '0');\n tspan.setAttribute('class', 'row');\n tspan.textContent = row.trim();\n svgLabel.appendChild(tspan);\n });\n\n return svgLabel;\n};\n\nconst findClosestParent = (parents: string[]): string | undefined => {\n let closestParent: string | undefined;\n let comparisonFunc;\n let targetPosition: number;\n if (dir === 'BT') {\n comparisonFunc = (a: number, b: number) => a <= b;\n targetPosition = Infinity;\n } else {\n comparisonFunc = (a: number, b: number) => a >= b;\n targetPosition = 0;\n }\n\n parents.forEach((parent) => {\n const parentPosition =\n dir === 'TB' || dir == 'BT' ? commitPos.get(parent)?.y : commitPos.get(parent)?.x;\n\n if (parentPosition !== undefined && comparisonFunc(parentPosition, targetPosition)) {\n closestParent = parent;\n targetPosition = parentPosition;\n }\n });\n\n return closestParent;\n};\n\nconst findClosestParentBT = (parents: string[]) => {\n let closestParent = '';\n let maxPosition = Infinity;\n\n parents.forEach((parent) => {\n const parentPosition = commitPos.get(parent)!.y;\n if (parentPosition <= maxPosition) {\n closestParent = parent;\n maxPosition = parentPosition;\n }\n });\n return closestParent || undefined;\n};\n\nconst setParallelBTPos = (\n sortedKeys: string[],\n commits: Map,\n defaultPos: number\n) => {\n let curPos = defaultPos;\n let maxPosition = defaultPos;\n const roots: Commit[] = [];\n\n sortedKeys.forEach((key) => {\n const commit = commits.get(key);\n if (!commit) {\n throw new Error(`Commit not found for key ${key}`);\n }\n\n if (commit.parents.length) {\n curPos = calculateCommitPosition(commit);\n maxPosition = Math.max(curPos, maxPosition);\n } else {\n roots.push(commit);\n }\n setCommitPosition(commit, curPos);\n });\n\n curPos = maxPosition;\n roots.forEach((commit) => {\n setRootPosition(commit, curPos, defaultPos);\n });\n sortedKeys.forEach((key) => {\n const commit = commits.get(key);\n\n if (commit?.parents.length) {\n const closestParent = findClosestParentBT(commit.parents)!;\n curPos = commitPos.get(closestParent)!.y - COMMIT_STEP;\n if (curPos <= maxPosition) {\n maxPosition = curPos;\n }\n const x = branchPos.get(commit.branch)!.pos;\n const y = curPos - LAYOUT_OFFSET;\n commitPos.set(commit.id, { x: x, y: y });\n }\n });\n};\n\nconst findClosestParentPos = (commit: Commit): number => {\n const closestParent = findClosestParent(commit.parents.filter((p) => p !== null));\n if (!closestParent) {\n throw new Error(`Closest parent not found for commit ${commit.id}`);\n }\n\n const closestParentPos = commitPos.get(closestParent)?.y;\n if (closestParentPos === undefined) {\n throw new Error(`Closest parent position not found for commit ${commit.id}`);\n }\n return closestParentPos;\n};\n\nconst calculateCommitPosition = (commit: Commit): number => {\n const closestParentPos = findClosestParentPos(commit);\n return closestParentPos + COMMIT_STEP;\n};\n\nconst setCommitPosition = (commit: Commit, curPos: number): CommitPosition => {\n const branch = branchPos.get(commit.branch);\n\n if (!branch) {\n throw new Error(`Branch not found for commit ${commit.id}`);\n }\n\n const x = branch.pos;\n const y = curPos + LAYOUT_OFFSET;\n commitPos.set(commit.id, { x, y });\n return { x, y };\n};\n\nconst setRootPosition = (commit: Commit, curPos: number, defaultPos: number) => {\n const branch = branchPos.get(commit.branch);\n if (!branch) {\n throw new Error(`Branch not found for commit ${commit.id}`);\n }\n\n const y = curPos + defaultPos;\n const x = branch.pos;\n commitPos.set(commit.id, { x, y });\n};\n\nconst drawCommitBullet = (\n gBullets: d3.Selection,\n commit: Commit,\n commitPosition: CommitPositionOffset,\n typeClass: string,\n branchIndex: number,\n commitSymbolType: number\n) => {\n if (commitSymbolType === commitType.HIGHLIGHT) {\n gBullets\n .append('rect')\n .attr('x', commitPosition.x - 10)\n .attr('y', commitPosition.y - 10)\n .attr('width', 20)\n .attr('height', 20)\n .attr(\n 'class',\n `commit ${commit.id} commit-highlight${branchIndex % THEME_COLOR_LIMIT} ${typeClass}-outer`\n );\n gBullets\n .append('rect')\n .attr('x', commitPosition.x - 6)\n .attr('y', commitPosition.y - 6)\n .attr('width', 12)\n .attr('height', 12)\n .attr(\n 'class',\n `commit ${commit.id} commit${branchIndex % THEME_COLOR_LIMIT} ${typeClass}-inner`\n );\n } else if (commitSymbolType === commitType.CHERRY_PICK) {\n gBullets\n .append('circle')\n .attr('cx', commitPosition.x)\n .attr('cy', commitPosition.y)\n .attr('r', 10)\n .attr('class', `commit ${commit.id} ${typeClass}`);\n gBullets\n .append('circle')\n .attr('cx', commitPosition.x - 3)\n .attr('cy', commitPosition.y + 2)\n .attr('r', 2.75)\n .attr('fill', '#fff')\n .attr('class', `commit ${commit.id} ${typeClass}`);\n gBullets\n .append('circle')\n .attr('cx', commitPosition.x + 3)\n .attr('cy', commitPosition.y + 2)\n .attr('r', 2.75)\n .attr('fill', '#fff')\n .attr('class', `commit ${commit.id} ${typeClass}`);\n gBullets\n .append('line')\n .attr('x1', commitPosition.x + 3)\n .attr('y1', commitPosition.y + 1)\n .attr('x2', commitPosition.x)\n .attr('y2', commitPosition.y - 5)\n .attr('stroke', '#fff')\n .attr('class', `commit ${commit.id} ${typeClass}`);\n gBullets\n .append('line')\n .attr('x1', commitPosition.x - 3)\n .attr('y1', commitPosition.y + 1)\n .attr('x2', commitPosition.x)\n .attr('y2', commitPosition.y - 5)\n .attr('stroke', '#fff')\n .attr('class', `commit ${commit.id} ${typeClass}`);\n } else {\n const circle = gBullets.append('circle');\n circle.attr('cx', commitPosition.x);\n circle.attr('cy', commitPosition.y);\n circle.attr('r', commit.type === commitType.MERGE ? 9 : 10);\n circle.attr('class', `commit ${commit.id} commit${branchIndex % THEME_COLOR_LIMIT}`);\n if (commitSymbolType === commitType.MERGE) {\n const circle2 = gBullets.append('circle');\n circle2.attr('cx', commitPosition.x);\n circle2.attr('cy', commitPosition.y);\n circle2.attr('r', 6);\n circle2.attr(\n 'class',\n `commit ${typeClass} ${commit.id} commit${branchIndex % THEME_COLOR_LIMIT}`\n );\n }\n if (commitSymbolType === commitType.REVERSE) {\n const cross = gBullets.append('path');\n cross\n .attr(\n 'd',\n `M ${commitPosition.x - 5},${commitPosition.y - 5}L${commitPosition.x + 5},${commitPosition.y + 5}M${commitPosition.x - 5},${commitPosition.y + 5}L${commitPosition.x + 5},${commitPosition.y - 5}`\n )\n .attr('class', `commit ${typeClass} ${commit.id} commit${branchIndex % THEME_COLOR_LIMIT}`);\n }\n }\n};\n\nconst drawCommitLabel = (\n gLabels: d3.Selection,\n commit: Commit,\n commitPosition: CommitPositionOffset,\n pos: number\n) => {\n if (\n commit.type !== commitType.CHERRY_PICK &&\n ((commit.customId && commit.type === commitType.MERGE) || commit.type !== commitType.MERGE) &&\n DEFAULT_GITGRAPH_CONFIG?.showCommitLabel\n ) {\n const wrapper = gLabels.append('g');\n const labelBkg = wrapper.insert('rect').attr('class', 'commit-label-bkg');\n const text = wrapper\n .append('text')\n .attr('x', pos)\n .attr('y', commitPosition.y + 25)\n .attr('class', 'commit-label')\n .text(commit.id);\n const bbox = text.node()?.getBBox();\n\n if (bbox) {\n labelBkg\n .attr('x', commitPosition.posWithOffset - bbox.width / 2 - PY)\n .attr('y', commitPosition.y + 13.5)\n .attr('width', bbox.width + 2 * PY)\n .attr('height', bbox.height + 2 * PY);\n\n if (dir === 'TB' || dir === 'BT') {\n labelBkg\n .attr('x', commitPosition.x - (bbox.width + 4 * PX + 5))\n .attr('y', commitPosition.y - 12);\n text\n .attr('x', commitPosition.x - (bbox.width + 4 * PX))\n .attr('y', commitPosition.y + bbox.height - 12);\n } else {\n text.attr('x', commitPosition.posWithOffset - bbox.width / 2);\n }\n\n if (DEFAULT_GITGRAPH_CONFIG.rotateCommitLabel) {\n if (dir === 'TB' || dir === 'BT') {\n text.attr(\n 'transform',\n 'rotate(' + -45 + ', ' + commitPosition.x + ', ' + commitPosition.y + ')'\n );\n labelBkg.attr(\n 'transform',\n 'rotate(' + -45 + ', ' + commitPosition.x + ', ' + commitPosition.y + ')'\n );\n } else {\n const r_x = -7.5 - ((bbox.width + 10) / 25) * 9.5;\n const r_y = 10 + (bbox.width / 25) * 8.5;\n wrapper.attr(\n 'transform',\n 'translate(' +\n r_x +\n ', ' +\n r_y +\n ') rotate(' +\n -45 +\n ', ' +\n pos +\n ', ' +\n commitPosition.y +\n ')'\n );\n }\n }\n }\n }\n};\n\nconst drawCommitTags = (\n gLabels: d3.Selection,\n commit: Commit,\n commitPosition: CommitPositionOffset,\n pos: number\n) => {\n if (commit.tags.length > 0) {\n let yOffset = 0;\n let maxTagBboxWidth = 0;\n let maxTagBboxHeight = 0;\n const tagElements = [];\n\n for (const tagValue of commit.tags.reverse()) {\n const rect = gLabels.insert('polygon');\n const hole = gLabels.append('circle');\n const tag = gLabels\n .append('text')\n .attr('y', commitPosition.y - 16 - yOffset)\n .attr('class', 'tag-label')\n .text(tagValue);\n const tagBbox = tag.node()?.getBBox();\n if (!tagBbox) {\n throw new Error('Tag bbox not found');\n }\n\n maxTagBboxWidth = Math.max(maxTagBboxWidth, tagBbox.width);\n maxTagBboxHeight = Math.max(maxTagBboxHeight, tagBbox.height);\n\n tag.attr('x', commitPosition.posWithOffset - tagBbox.width / 2);\n\n tagElements.push({\n tag,\n hole,\n rect,\n yOffset,\n });\n\n yOffset += 20;\n }\n\n for (const { tag, hole, rect, yOffset } of tagElements) {\n const h2 = maxTagBboxHeight / 2;\n const ly = commitPosition.y - 19.2 - yOffset;\n rect.attr('class', 'tag-label-bkg').attr(\n 'points',\n `\n ${pos - maxTagBboxWidth / 2 - PX / 2},${ly + PY} \n ${pos - maxTagBboxWidth / 2 - PX / 2},${ly - PY}\n ${commitPosition.posWithOffset - maxTagBboxWidth / 2 - PX},${ly - h2 - PY}\n ${commitPosition.posWithOffset + maxTagBboxWidth / 2 + PX},${ly - h2 - PY}\n ${commitPosition.posWithOffset + maxTagBboxWidth / 2 + PX},${ly + h2 + PY}\n ${commitPosition.posWithOffset - maxTagBboxWidth / 2 - PX},${ly + h2 + PY}`\n );\n\n hole\n .attr('cy', ly)\n .attr('cx', pos - maxTagBboxWidth / 2 + PX / 2)\n .attr('r', 1.5)\n .attr('class', 'tag-hole');\n\n if (dir === 'TB' || dir === 'BT') {\n const yOrigin = pos + yOffset;\n\n rect\n .attr('class', 'tag-label-bkg')\n .attr(\n 'points',\n `\n ${commitPosition.x},${yOrigin + 2}\n ${commitPosition.x},${yOrigin - 2}\n ${commitPosition.x + LAYOUT_OFFSET},${yOrigin - h2 - 2}\n ${commitPosition.x + LAYOUT_OFFSET + maxTagBboxWidth + 4},${yOrigin - h2 - 2}\n ${commitPosition.x + LAYOUT_OFFSET + maxTagBboxWidth + 4},${yOrigin + h2 + 2}\n ${commitPosition.x + LAYOUT_OFFSET},${yOrigin + h2 + 2}`\n )\n .attr('transform', 'translate(12,12) rotate(45, ' + commitPosition.x + ',' + pos + ')');\n hole\n .attr('cx', commitPosition.x + PX / 2)\n .attr('cy', yOrigin)\n .attr('transform', 'translate(12,12) rotate(45, ' + commitPosition.x + ',' + pos + ')');\n tag\n .attr('x', commitPosition.x + 5)\n .attr('y', yOrigin + 3)\n .attr('transform', 'translate(14,14) rotate(45, ' + commitPosition.x + ',' + pos + ')');\n }\n }\n }\n};\n\nconst getCommitClassType = (commit: Commit): string => {\n const commitSymbolType = commit.customType ?? commit.type;\n switch (commitSymbolType) {\n case commitType.NORMAL:\n return 'commit-normal';\n case commitType.REVERSE:\n return 'commit-reverse';\n case commitType.HIGHLIGHT:\n return 'commit-highlight';\n case commitType.MERGE:\n return 'commit-merge';\n case commitType.CHERRY_PICK:\n return 'commit-cherry-pick';\n default:\n return 'commit-normal';\n }\n};\n\nconst calculatePosition = (\n commit: Commit,\n dir: string,\n pos: number,\n commitPos: Map\n): number => {\n const defaultCommitPosition = { x: 0, y: 0 }; // Default position if commit is not found\n\n if (commit.parents.length > 0) {\n const closestParent = findClosestParent(commit.parents);\n if (closestParent) {\n const parentPosition = commitPos.get(closestParent) ?? defaultCommitPosition;\n\n if (dir === 'TB') {\n return parentPosition.y + COMMIT_STEP;\n } else if (dir === 'BT') {\n const currentPosition = commitPos.get(commit.id) ?? defaultCommitPosition;\n return currentPosition.y - COMMIT_STEP;\n } else {\n return parentPosition.x + COMMIT_STEP;\n }\n }\n } else {\n if (dir === 'TB') {\n return defaultPos;\n } else if (dir === 'BT') {\n const currentPosition = commitPos.get(commit.id) ?? defaultCommitPosition;\n return currentPosition.y - COMMIT_STEP;\n } else {\n return 0;\n }\n }\n return 0;\n};\n\nconst getCommitPosition = (\n commit: Commit,\n pos: number,\n isParallelCommits: boolean\n): CommitPositionOffset => {\n const posWithOffset = dir === 'BT' && isParallelCommits ? pos : pos + LAYOUT_OFFSET;\n const y = dir === 'TB' || dir === 'BT' ? posWithOffset : branchPos.get(commit.branch)?.pos;\n const x = dir === 'TB' || dir === 'BT' ? branchPos.get(commit.branch)?.pos : posWithOffset;\n if (x === undefined || y === undefined) {\n throw new Error(`Position were undefined for commit ${commit.id}`);\n }\n return { x, y, posWithOffset };\n};\n\nconst drawCommits = (\n svg: d3.Selection,\n commits: Map,\n modifyGraph: boolean\n) => {\n if (!DEFAULT_GITGRAPH_CONFIG) {\n throw new Error('GitGraph config not found');\n }\n const gBullets = svg.append('g').attr('class', 'commit-bullets');\n const gLabels = svg.append('g').attr('class', 'commit-labels');\n let pos = dir === 'TB' || dir === 'BT' ? defaultPos : 0;\n const keys = [...commits.keys()];\n const isParallelCommits = DEFAULT_GITGRAPH_CONFIG?.parallelCommits ?? false;\n\n const sortKeys = (a: string, b: string) => {\n const seqA = commits.get(a)?.seq;\n const seqB = commits.get(b)?.seq;\n return seqA !== undefined && seqB !== undefined ? seqA - seqB : 0;\n };\n\n let sortedKeys = keys.sort(sortKeys);\n if (dir === 'BT') {\n if (isParallelCommits) {\n setParallelBTPos(sortedKeys, commits, pos);\n }\n sortedKeys = sortedKeys.reverse();\n }\n\n sortedKeys.forEach((key) => {\n const commit = commits.get(key);\n if (!commit) {\n throw new Error(`Commit not found for key ${key}`);\n }\n if (isParallelCommits) {\n pos = calculatePosition(commit, dir, pos, commitPos);\n }\n\n const commitPosition = getCommitPosition(commit, pos, isParallelCommits);\n // Don't draw the commits now but calculate the positioning which is used by the branch lines etc.\n if (modifyGraph) {\n const typeClass = getCommitClassType(commit);\n const commitSymbolType = commit.customType ?? commit.type;\n const branchIndex = branchPos.get(commit.branch)?.index ?? 0;\n drawCommitBullet(gBullets, commit, commitPosition, typeClass, branchIndex, commitSymbolType);\n drawCommitLabel(gLabels, commit, commitPosition, pos);\n drawCommitTags(gLabels, commit, commitPosition, pos);\n }\n if (dir === 'TB' || dir === 'BT') {\n commitPos.set(commit.id, { x: commitPosition.x, y: commitPosition.posWithOffset });\n } else {\n commitPos.set(commit.id, { x: commitPosition.posWithOffset, y: commitPosition.y });\n }\n pos = dir === 'BT' && isParallelCommits ? pos + COMMIT_STEP : pos + COMMIT_STEP + LAYOUT_OFFSET;\n if (pos > maxPos) {\n maxPos = pos;\n }\n });\n};\n\nconst shouldRerouteArrow = (\n commitA: Commit,\n commitB: Commit,\n p1: CommitPosition,\n p2: CommitPosition,\n allCommits: Map\n) => {\n const commitBIsFurthest = dir === 'TB' || dir === 'BT' ? p1.x < p2.x : p1.y < p2.y;\n const branchToGetCurve = commitBIsFurthest ? commitB.branch : commitA.branch;\n const isOnBranchToGetCurve = (x: Commit) => x.branch === branchToGetCurve;\n const isBetweenCommits = (x: Commit) => x.seq > commitA.seq && x.seq < commitB.seq;\n return [...allCommits.values()].some((commitX) => {\n return isBetweenCommits(commitX) && isOnBranchToGetCurve(commitX);\n });\n};\n\nconst findLane = (y1: number, y2: number, depth = 0): number => {\n const candidate = y1 + Math.abs(y1 - y2) / 2;\n if (depth > 5) {\n return candidate;\n }\n\n const ok = lanes.every((lane) => Math.abs(lane - candidate) >= 10);\n if (ok) {\n lanes.push(candidate);\n return candidate;\n }\n const diff = Math.abs(y1 - y2);\n return findLane(y1, y2 - diff / 5, depth + 1);\n};\n\nconst drawArrow = (\n svg: d3.Selection,\n commitA: Commit,\n commitB: Commit,\n allCommits: Map\n) => {\n const p1 = commitPos.get(commitA.id); // arrowStart\n const p2 = commitPos.get(commitB.id); // arrowEnd\n if (p1 === undefined || p2 === undefined) {\n throw new Error(`Commit positions not found for commits ${commitA.id} and ${commitB.id}`);\n }\n const arrowNeedsRerouting = shouldRerouteArrow(commitA, commitB, p1, p2, allCommits);\n // log.debug('drawArrow', p1, p2, arrowNeedsRerouting, commitA.id, commitB.id);\n\n // Lower-right quadrant logic; top-left is 0,0\n\n let arc = '';\n let arc2 = '';\n let radius = 0;\n let offset = 0;\n\n let colorClassNum = branchPos.get(commitB.branch)?.index;\n if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n colorClassNum = branchPos.get(commitA.branch)?.index;\n }\n\n let lineDef;\n if (arrowNeedsRerouting) {\n arc = 'A 10 10, 0, 0, 0,';\n arc2 = 'A 10 10, 0, 0, 1,';\n radius = 10;\n offset = 10;\n\n const lineY = p1.y < p2.y ? findLane(p1.y, p2.y) : findLane(p2.y, p1.y);\n\n const lineX = p1.x < p2.x ? findLane(p1.x, p2.x) : findLane(p2.x, p1.x);\n\n if (dir === 'TB') {\n if (p1.x < p2.x) {\n // Source commit is on branch position left of destination commit\n // so render arrow rightward with colour of destination branch\n\n lineDef = `M ${p1.x} ${p1.y} L ${lineX - radius} ${p1.y} ${arc2} ${lineX} ${\n p1.y + offset\n } L ${lineX} ${p2.y - radius} ${arc} ${lineX + offset} ${p2.y} L ${p2.x} ${p2.y}`;\n } else {\n // Source commit is on branch position right of destination commit\n // so render arrow leftward with colour of source branch\n\n colorClassNum = branchPos.get(commitA.branch)?.index;\n\n lineDef = `M ${p1.x} ${p1.y} L ${lineX + radius} ${p1.y} ${arc} ${lineX} ${p1.y + offset} L ${lineX} ${p2.y - radius} ${arc2} ${lineX - offset} ${p2.y} L ${p2.x} ${p2.y}`;\n }\n } else if (dir === 'BT') {\n if (p1.x < p2.x) {\n // Source commit is on branch position left of destination commit\n // so render arrow rightward with colour of destination branch\n\n lineDef = `M ${p1.x} ${p1.y} L ${lineX - radius} ${p1.y} ${arc} ${lineX} ${p1.y - offset} L ${lineX} ${p2.y + radius} ${arc2} ${lineX + offset} ${p2.y} L ${p2.x} ${p2.y}`;\n } else {\n // Source commit is on branch position right of destination commit\n // so render arrow leftward with colour of source branch\n\n colorClassNum = branchPos.get(commitA.branch)?.index;\n\n lineDef = `M ${p1.x} ${p1.y} L ${lineX + radius} ${p1.y} ${arc2} ${lineX} ${p1.y - offset} L ${lineX} ${p2.y + radius} ${arc} ${lineX - offset} ${p2.y} L ${p2.x} ${p2.y}`;\n }\n } else {\n if (p1.y < p2.y) {\n // Source commit is on branch positioned above destination commit\n // so render arrow downward with colour of destination branch\n\n lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${lineY - radius} ${arc} ${\n p1.x + offset\n } ${lineY} L ${p2.x - radius} ${lineY} ${arc2} ${p2.x} ${lineY + offset} L ${p2.x} ${p2.y}`;\n } else {\n // Source commit is on branch positioned below destination commit\n // so render arrow upward with colour of source branch\n\n colorClassNum = branchPos.get(commitA.branch)?.index;\n\n lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${lineY + radius} ${arc2} ${\n p1.x + offset\n } ${lineY} L ${p2.x - radius} ${lineY} ${arc} ${p2.x} ${lineY - offset} L ${p2.x} ${p2.y}`;\n }\n }\n } else {\n arc = 'A 20 20, 0, 0, 0,';\n arc2 = 'A 20 20, 0, 0, 1,';\n radius = 20;\n offset = 20;\n\n if (dir === 'TB') {\n if (p1.x < p2.x) {\n if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - radius} ${arc} ${p1.x + offset} ${\n p2.y\n } L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc2} ${p2.x} ${\n p1.y + offset\n } L ${p2.x} ${p2.y}`;\n }\n }\n\n if (p1.x > p2.x) {\n arc = 'A 20 20, 0, 0, 0,';\n arc2 = 'A 20 20, 0, 0, 1,';\n radius = 20;\n offset = 20;\n if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - radius} ${arc2} ${p1.x - offset} ${\n p2.y\n } L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x + radius} ${p1.y} ${arc} ${p2.x} ${\n p1.y + offset\n } L ${p2.x} ${p2.y}`;\n }\n }\n if (p1.x === p2.x) {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`;\n }\n } else if (dir === 'BT') {\n if (p1.x < p2.x) {\n if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + radius} ${arc2} ${p1.x + offset} ${\n p2.y\n } L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc} ${p2.x} ${\n p1.y - offset\n } L ${p2.x} ${p2.y}`;\n }\n }\n if (p1.x > p2.x) {\n arc = 'A 20 20, 0, 0, 0,';\n arc2 = 'A 20 20, 0, 0, 1,';\n radius = 20;\n offset = 20;\n\n if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + radius} ${arc} ${p1.x - offset} ${\n p2.y\n } L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc} ${p2.x} ${\n p1.y - offset\n } L ${p2.x} ${p2.y}`;\n }\n }\n\n if (p1.x === p2.x) {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`;\n }\n } else {\n if (p1.y < p2.y) {\n if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc2} ${p2.x} ${\n p1.y + offset\n } L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - radius} ${arc} ${p1.x + offset} ${\n p2.y\n } L ${p2.x} ${p2.y}`;\n }\n }\n if (p1.y > p2.y) {\n if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc} ${p2.x} ${\n p1.y - offset\n } L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + radius} ${arc2} ${p1.x + offset} ${\n p2.y\n } L ${p2.x} ${p2.y}`;\n }\n }\n\n if (p1.y === p2.y) {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`;\n }\n }\n }\n if (lineDef === undefined) {\n throw new Error('Line definition not found');\n }\n svg\n .append('path')\n .attr('d', lineDef)\n .attr('class', 'arrow arrow' + (colorClassNum! % THEME_COLOR_LIMIT));\n};\n\nconst drawArrows = (\n svg: d3.Selection,\n commits: Map\n) => {\n const gArrows = svg.append('g').attr('class', 'commit-arrows');\n [...commits.keys()].forEach((key) => {\n const commit = commits.get(key);\n\n if (commit!.parents && commit!.parents.length > 0) {\n commit!.parents.forEach((parent) => {\n drawArrow(gArrows, commits.get(parent)!, commit!, commits);\n });\n }\n });\n};\n\nconst drawBranches = (\n svg: d3.Selection,\n branches: { name: string }[]\n) => {\n const g = svg.append('g');\n branches.forEach((branch, index) => {\n const adjustIndexForTheme = index % THEME_COLOR_LIMIT;\n\n const pos = branchPos.get(branch.name)?.pos;\n if (pos === undefined) {\n throw new Error(`Position not found for branch ${branch.name}`);\n }\n const line = g.append('line');\n line.attr('x1', 0);\n line.attr('y1', pos);\n line.attr('x2', maxPos);\n line.attr('y2', pos);\n line.attr('class', 'branch branch' + adjustIndexForTheme);\n\n if (dir === 'TB') {\n line.attr('y1', defaultPos);\n line.attr('x1', pos);\n line.attr('y2', maxPos);\n line.attr('x2', pos);\n } else if (dir === 'BT') {\n line.attr('y1', maxPos);\n line.attr('x1', pos);\n line.attr('y2', defaultPos);\n line.attr('x2', pos);\n }\n lanes.push(pos);\n\n const name = branch.name;\n\n // Create the actual text element\n const labelElement = drawText(name);\n // Create outer g, edgeLabel, this will be positioned after graph layout\n const bkg = g.insert('rect');\n const branchLabel = g.insert('g').attr('class', 'branchLabel');\n\n // Create inner g, label, this will be positioned now for centering the text\n const label = branchLabel.insert('g').attr('class', 'label branch-label' + adjustIndexForTheme);\n\n label.node()!.appendChild(labelElement);\n const bbox = labelElement.getBBox();\n bkg\n .attr('class', 'branchLabelBkg label' + adjustIndexForTheme)\n .attr('rx', 4)\n .attr('ry', 4)\n .attr('x', -bbox.width - 4 - (DEFAULT_GITGRAPH_CONFIG?.rotateCommitLabel === true ? 30 : 0))\n .attr('y', -bbox.height / 2 + 8)\n .attr('width', bbox.width + 18)\n .attr('height', bbox.height + 4);\n label.attr(\n 'transform',\n 'translate(' +\n (-bbox.width - 14 - (DEFAULT_GITGRAPH_CONFIG?.rotateCommitLabel === true ? 30 : 0)) +\n ', ' +\n (pos - bbox.height / 2 - 1) +\n ')'\n );\n if (dir === 'TB') {\n bkg.attr('x', pos - bbox.width / 2 - 10).attr('y', 0);\n label.attr('transform', 'translate(' + (pos - bbox.width / 2 - 5) + ', ' + 0 + ')');\n } else if (dir === 'BT') {\n bkg.attr('x', pos - bbox.width / 2 - 10).attr('y', maxPos);\n label.attr('transform', 'translate(' + (pos - bbox.width / 2 - 5) + ', ' + maxPos + ')');\n } else {\n bkg.attr('transform', 'translate(' + -19 + ', ' + (pos - bbox.height / 2) + ')');\n }\n });\n};\n\nconst setBranchPosition = function (\n name: string,\n pos: number,\n index: number,\n bbox: DOMRect,\n rotateCommitLabel: boolean\n): number {\n branchPos.set(name, { pos, index });\n pos += 50 + (rotateCommitLabel ? 40 : 0) + (dir === 'TB' || dir === 'BT' ? bbox.width / 2 : 0);\n return pos;\n};\n\nexport const draw: DrawDefinition = function (txt, id, ver, diagObj) {\n clear();\n\n log.debug('in gitgraph renderer', txt + '\\n', 'id:', id, ver);\n if (!DEFAULT_GITGRAPH_CONFIG) {\n throw new Error('GitGraph config not found');\n }\n const rotateCommitLabel = DEFAULT_GITGRAPH_CONFIG.rotateCommitLabel ?? false;\n const db = diagObj.db as GitGraphDBRenderProvider;\n allCommitsDict = db.getCommits();\n const branches = db.getBranchesAsObjArray();\n dir = db.getDirection();\n const diagram = select(`[id=\"${id}\"]`);\n let pos = 0;\n\n branches.forEach((branch, index) => {\n const labelElement = drawText(branch.name);\n const g = diagram.append('g');\n const branchLabel = g.insert('g').attr('class', 'branchLabel');\n const label = branchLabel.insert('g').attr('class', 'label branch-label');\n label.node()?.appendChild(labelElement);\n const bbox = labelElement.getBBox();\n\n pos = setBranchPosition(branch.name, pos, index, bbox, rotateCommitLabel);\n label.remove();\n branchLabel.remove();\n g.remove();\n });\n\n drawCommits(diagram, allCommitsDict, false);\n if (DEFAULT_GITGRAPH_CONFIG.showBranches) {\n drawBranches(diagram, branches);\n }\n drawArrows(diagram, allCommitsDict);\n drawCommits(diagram, allCommitsDict, true);\n\n utils.insertTitle(\n diagram,\n 'gitTitleText',\n DEFAULT_GITGRAPH_CONFIG.titleTopMargin ?? 0,\n db.getDiagramTitle()\n );\n\n // Setup the view box and size of the svg element\n setupGraphViewbox(\n undefined,\n diagram,\n DEFAULT_GITGRAPH_CONFIG.diagramPadding,\n DEFAULT_GITGRAPH_CONFIG.useMaxWidth\n );\n};\n\nexport default {\n draw,\n};\n\nif (import.meta.vitest) {\n const { it, expect, describe } = import.meta.vitest;\n\n describe('drawText', () => {\n it('should drawText', () => {\n const svgLabel = drawText('main');\n expect(svgLabel).toBeDefined();\n expect(svgLabel.children[0].innerHTML).toBe('main');\n });\n });\n\n describe('branchPosition', () => {\n const bbox: DOMRect = {\n x: 0,\n y: 0,\n width: 10,\n height: 10,\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n toJSON: () => '',\n };\n\n it('should setBranchPositions LR with two branches', () => {\n dir = 'LR';\n\n const pos = setBranchPosition('main', 0, 0, bbox, true);\n expect(pos).toBe(90);\n expect(branchPos.get('main')).toEqual({ pos: 0, index: 0 });\n const posNext = setBranchPosition('develop', pos, 1, bbox, true);\n expect(posNext).toBe(180);\n expect(branchPos.get('develop')).toEqual({ pos: pos, index: 1 });\n });\n\n it('should setBranchPositions TB with two branches', () => {\n dir = 'TB';\n bbox.width = 34.9921875;\n\n const pos = setBranchPosition('main', 0, 0, bbox, true);\n expect(pos).toBe(107.49609375);\n expect(branchPos.get('main')).toEqual({ pos: 0, index: 0 });\n\n bbox.width = 56.421875;\n const posNext = setBranchPosition('develop', pos, 1, bbox, true);\n expect(posNext).toBe(225.70703125);\n expect(branchPos.get('develop')).toEqual({ pos: pos, index: 1 });\n });\n });\n\n describe('commitPosition', () => {\n const commits = new Map([\n [\n 'commitZero',\n {\n id: 'ZERO',\n message: '',\n seq: 0,\n type: commitType.NORMAL,\n tags: [],\n parents: [],\n branch: 'main',\n },\n ],\n [\n 'commitA',\n {\n id: 'A',\n message: '',\n seq: 1,\n type: commitType.NORMAL,\n tags: [],\n parents: ['ZERO'],\n branch: 'feature',\n },\n ],\n [\n 'commitB',\n {\n id: 'B',\n message: '',\n seq: 2,\n type: commitType.NORMAL,\n tags: [],\n parents: ['A'],\n branch: 'feature',\n },\n ],\n [\n 'commitM',\n {\n id: 'M',\n message: 'merged branch feature into main',\n seq: 3,\n type: commitType.MERGE,\n tags: [],\n parents: ['ZERO', 'B'],\n branch: 'main',\n customId: true,\n },\n ],\n [\n 'commitC',\n {\n id: 'C',\n message: '',\n seq: 4,\n type: commitType.NORMAL,\n tags: [],\n parents: ['ZERO'],\n branch: 'release',\n },\n ],\n [\n 'commit5_8928ea0',\n {\n id: '5-8928ea0',\n message: 'cherry-picked [object Object] into release',\n seq: 5,\n type: commitType.CHERRY_PICK,\n tags: [],\n parents: ['C', 'M'],\n branch: 'release',\n },\n ],\n [\n 'commitD',\n {\n id: 'D',\n message: '',\n seq: 6,\n type: commitType.NORMAL,\n tags: [],\n parents: ['5-8928ea0'],\n branch: 'release',\n },\n ],\n [\n 'commit7_ed848ba',\n {\n id: '7-ed848ba',\n message: 'cherry-picked [object Object] into release',\n seq: 7,\n type: commitType.CHERRY_PICK,\n tags: [],\n parents: ['D', 'M'],\n branch: 'release',\n },\n ],\n ]);\n let pos = 0;\n branchPos.set('main', { pos: 0, index: 0 });\n branchPos.set('feature', { pos: 107.49609375, index: 1 });\n branchPos.set('release', { pos: 224.03515625, index: 2 });\n\n describe('TB', () => {\n pos = 30;\n dir = 'TB';\n const expectedCommitPositionTB = new Map([\n ['commitZero', { x: 0, y: 40, posWithOffset: 40 }],\n ['commitA', { x: 107.49609375, y: 90, posWithOffset: 90 }],\n ['commitB', { x: 107.49609375, y: 140, posWithOffset: 140 }],\n ['commitM', { x: 0, y: 190, posWithOffset: 190 }],\n ['commitC', { x: 224.03515625, y: 240, posWithOffset: 240 }],\n ['commit5_8928ea0', { x: 224.03515625, y: 290, posWithOffset: 290 }],\n ['commitD', { x: 224.03515625, y: 340, posWithOffset: 340 }],\n ['commit7_ed848ba', { x: 224.03515625, y: 390, posWithOffset: 390 }],\n ]);\n commits.forEach((commit, key) => {\n it(`should give the correct position for commit ${key}`, () => {\n const position = getCommitPosition(commit, pos, false);\n expect(position).toEqual(expectedCommitPositionTB.get(key));\n pos += 50;\n });\n });\n });\n describe('LR', () => {\n let pos = 30;\n dir = 'LR';\n const expectedCommitPositionLR = new Map([\n ['commitZero', { x: 0, y: 40, posWithOffset: 40 }],\n ['commitA', { x: 107.49609375, y: 90, posWithOffset: 90 }],\n ['commitB', { x: 107.49609375, y: 140, posWithOffset: 140 }],\n ['commitM', { x: 0, y: 190, posWithOffset: 190 }],\n ['commitC', { x: 224.03515625, y: 240, posWithOffset: 240 }],\n ['commit5_8928ea0', { x: 224.03515625, y: 290, posWithOffset: 290 }],\n ['commitD', { x: 224.03515625, y: 340, posWithOffset: 340 }],\n ['commit7_ed848ba', { x: 224.03515625, y: 390, posWithOffset: 390 }],\n ]);\n commits.forEach((commit, key) => {\n it(`should give the correct position for commit ${key}`, () => {\n const position = getCommitPosition(commit, pos, false);\n expect(position).toEqual(expectedCommitPositionLR.get(key));\n pos += 50;\n });\n });\n });\n describe('getCommitClassType', () => {\n const expectedCommitClassType = new Map([\n ['commitZero', 'commit-normal'],\n ['commitA', 'commit-normal'],\n ['commitB', 'commit-normal'],\n ['commitM', 'commit-merge'],\n ['commitC', 'commit-normal'],\n ['commit5_8928ea0', 'commit-cherry-pick'],\n ['commitD', 'commit-normal'],\n ['commit7_ed848ba', 'commit-cherry-pick'],\n ]);\n commits.forEach((commit, key) => {\n it(`should give the correct class type for commit ${key}`, () => {\n const classType = getCommitClassType(commit);\n expect(classType).toBe(expectedCommitClassType.get(key));\n });\n });\n });\n });\n describe('building BT parallel commit diagram', () => {\n const commits = new Map([\n [\n '1-abcdefg',\n {\n id: '1-abcdefg',\n message: '',\n seq: 0,\n type: 0,\n tags: [],\n parents: [],\n branch: 'main',\n },\n ],\n [\n '2-abcdefg',\n {\n id: '2-abcdefg',\n message: '',\n seq: 1,\n type: 0,\n tags: [],\n parents: ['1-abcdefg'],\n branch: 'main',\n },\n ],\n [\n '3-abcdefg',\n {\n id: '3-abcdefg',\n message: '',\n seq: 2,\n type: 0,\n tags: [],\n parents: ['2-abcdefg'],\n branch: 'develop',\n },\n ],\n [\n '4-abcdefg',\n {\n id: '4-abcdefg',\n message: '',\n seq: 3,\n type: 0,\n tags: [],\n parents: ['3-abcdefg'],\n branch: 'develop',\n },\n ],\n [\n '5-abcdefg',\n {\n id: '5-abcdefg',\n message: '',\n seq: 4,\n type: 0,\n tags: [],\n parents: ['2-abcdefg'],\n branch: 'feature',\n },\n ],\n [\n '6-abcdefg',\n {\n id: '6-abcdefg',\n message: '',\n seq: 5,\n type: 0,\n tags: [],\n parents: ['5-abcdefg'],\n branch: 'feature',\n },\n ],\n [\n '7-abcdefg',\n {\n id: '7-abcdefg',\n message: '',\n seq: 6,\n type: 0,\n tags: [],\n parents: ['2-abcdefg'],\n branch: 'main',\n },\n ],\n [\n '8-abcdefg',\n {\n id: '8-abcdefg',\n message: '',\n seq: 7,\n type: 0,\n tags: [],\n parents: ['7-abcdefg'],\n branch: 'main',\n },\n ],\n ]);\n const expectedCommitPosition = new Map([\n ['1-abcdefg', { x: 0, y: 40 }],\n ['2-abcdefg', { x: 0, y: 90 }],\n ['3-abcdefg', { x: 107.49609375, y: 140 }],\n ['4-abcdefg', { x: 107.49609375, y: 190 }],\n ['5-abcdefg', { x: 225.70703125, y: 140 }],\n ['6-abcdefg', { x: 225.70703125, y: 190 }],\n ['7-abcdefg', { x: 0, y: 140 }],\n ['8-abcdefg', { x: 0, y: 190 }],\n ]);\n\n const expectedCommitPositionAfterParallel = new Map([\n ['1-abcdefg', { x: 0, y: 210 }],\n ['2-abcdefg', { x: 0, y: 160 }],\n ['3-abcdefg', { x: 107.49609375, y: 110 }],\n ['4-abcdefg', { x: 107.49609375, y: 60 }],\n ['5-abcdefg', { x: 225.70703125, y: 110 }],\n ['6-abcdefg', { x: 225.70703125, y: 60 }],\n ['7-abcdefg', { x: 0, y: 110 }],\n ['8-abcdefg', { x: 0, y: 60 }],\n ]);\n\n const expectedCommitCurrentPosition = new Map([\n ['1-abcdefg', 30],\n ['2-abcdefg', 80],\n ['3-abcdefg', 130],\n ['4-abcdefg', 180],\n ['5-abcdefg', 130],\n ['6-abcdefg', 180],\n ['7-abcdefg', 130],\n ['8-abcdefg', 180],\n ]);\n const sortedKeys = [...expectedCommitPosition.keys()];\n it('should get the correct commit position and current position', () => {\n dir = 'BT';\n let curPos = 30;\n commitPos.clear();\n branchPos.clear();\n branchPos.set('main', { pos: 0, index: 0 });\n branchPos.set('develop', { pos: 107.49609375, index: 1 });\n branchPos.set('feature', { pos: 225.70703125, index: 2 });\n DEFAULT_GITGRAPH_CONFIG!.parallelCommits = true;\n commits.forEach((commit, key) => {\n if (commit.parents.length > 0) {\n curPos = calculateCommitPosition(commit);\n }\n const position = setCommitPosition(commit, curPos);\n expect(position).toEqual(expectedCommitPosition.get(key));\n expect(curPos).toEqual(expectedCommitCurrentPosition.get(key));\n });\n });\n\n it('should get the correct commit position after parallel commits', () => {\n commitPos.clear();\n branchPos.clear();\n dir = 'BT';\n const curPos = 30;\n commitPos.clear();\n branchPos.clear();\n branchPos.set('main', { pos: 0, index: 0 });\n branchPos.set('develop', { pos: 107.49609375, index: 1 });\n branchPos.set('feature', { pos: 225.70703125, index: 2 });\n setParallelBTPos(sortedKeys, commits, curPos);\n sortedKeys.forEach((commit) => {\n const position = commitPos.get(commit);\n expect(position).toEqual(expectedCommitPositionAfterParallel.get(commit));\n });\n });\n });\n DEFAULT_GITGRAPH_CONFIG!.parallelCommits = false;\n it('add', () => {\n commitPos.set('parent1', { x: 1, y: 1 });\n commitPos.set('parent2', { x: 2, y: 2 });\n commitPos.set('parent3', { x: 3, y: 3 });\n dir = 'LR';\n const parents = ['parent1', 'parent2', 'parent3'];\n const closestParent = findClosestParent(parents);\n\n expect(closestParent).toBe('parent3');\n commitPos.clear();\n });\n}\n", "const getStyles = (options) =>\n `\n .commit-id,\n .commit-msg,\n .branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n ${[0, 1, 2, 3, 4, 5, 6, 7]\n .map(\n (i) =>\n `\n .branch-label${i} { fill: ${options['gitBranchLabel' + i]}; }\n .commit${i} { stroke: ${options['git' + i]}; fill: ${options['git' + i]}; }\n .commit-highlight${i} { stroke: ${options['gitInv' + i]}; fill: ${options['gitInv' + i]}; }\n .label${i} { fill: ${options['git' + i]}; }\n .arrow${i} { stroke: ${options['git' + i]}; }\n `\n )\n .join('\\n')}\n\n .branch {\n stroke-width: 1;\n stroke: ${options.lineColor};\n stroke-dasharray: 2;\n }\n .commit-label { font-size: ${options.commitLabelFontSize}; fill: ${options.commitLabelColor};}\n .commit-label-bkg { font-size: ${options.commitLabelFontSize}; fill: ${\n options.commitLabelBackground\n }; opacity: 0.5; }\n .tag-label { font-size: ${options.tagLabelFontSize}; fill: ${options.tagLabelColor};}\n .tag-label-bkg { fill: ${options.tagLabelBackground}; stroke: ${options.tagLabelBorder}; }\n .tag-hole { fill: ${options.textColor}; }\n\n .commit-merge {\n stroke: ${options.primaryColor};\n fill: ${options.primaryColor};\n }\n .commit-reverse {\n stroke: ${options.primaryColor};\n fill: ${options.primaryColor};\n stroke-width: 3;\n }\n .commit-highlight-outer {\n }\n .commit-highlight-inner {\n stroke: ${options.primaryColor};\n fill: ${options.primaryColor};\n }\n\n .arrow { stroke-width: 8; stroke-linecap: round; fill: none}\n .gitTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${options.textColor};\n }\n`;\n\nexport default getStyles;\n", "// @ts-ignore: JISON doesn't support types\nimport { parser } from './gitGraphParser.js';\nimport { db } from './gitGraphAst.js';\nimport gitGraphRenderer from './gitGraphRenderer.js';\nimport gitGraphStyles from './styles.js';\nimport type { DiagramDefinition } from '../../diagram-api/types.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer: gitGraphRenderer,\n styles: gitGraphStyles,\n};\n"], + "mappings": "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", + "names": ["getConfig", "dir", "commit", "branch", "clear", "db", "parser", "commit", "branch", "merge", "checkout", "cherryPick", "getConfig", "DEFAULT_GITGRAPH_CONFIG", "clear", "defaultPos", "commit", "branch", "yOffset", "dir", "commitPos", "db", "diagram", "pos"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/infoDiagram-WHAUD3N6.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/infoDiagram-WHAUD3N6.mjs new file mode 100644 index 0000000..82cdfb9 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/infoDiagram-WHAUD3N6.mjs @@ -0,0 +1,51 @@ +import { + package_default +} from "./chunk-XAJISQIX.mjs"; +import { + selectSvgElement +} from "./chunk-EXTU4WIE.mjs"; +import { + configureSvgSize +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/info/infoParser.ts +import { parse } from "@mermaid-js/parser"; +var parser = { + parse: /* @__PURE__ */ __name(async (input) => { + const ast = await parse("info", input); + log.debug(ast); + }, "parse") +}; + +// src/diagrams/info/infoDb.ts +var DEFAULT_INFO_DB = { + version: package_default.version + (true ? "" : "-tiny") +}; +var getVersion = /* @__PURE__ */ __name(() => DEFAULT_INFO_DB.version, "getVersion"); +var db = { + getVersion +}; + +// src/diagrams/info/infoRenderer.ts +var draw = /* @__PURE__ */ __name((text, id, version) => { + log.debug("rendering info diagram\n" + text); + const svg = selectSvgElement(id); + configureSvgSize(svg, 100, 400, true); + const group = svg.append("g"); + group.append("text").attr("x", 100).attr("y", 40).attr("class", "version").attr("font-size", 32).style("text-anchor", "middle").text(`v${version}`); +}, "draw"); +var renderer = { draw }; + +// src/diagrams/info/infoDiagram.ts +var diagram = { + parser, + db, + renderer +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/infoDiagram-WHAUD3N6.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/infoDiagram-WHAUD3N6.mjs.map new file mode 100644 index 0000000..be2cc79 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/infoDiagram-WHAUD3N6.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/info/infoParser.ts", "../../../src/diagrams/info/infoDb.ts", "../../../src/diagrams/info/infoRenderer.ts", "../../../src/diagrams/info/infoDiagram.ts"], + "sourcesContent": ["import type { Info } from '@mermaid-js/parser';\nimport { parse } from '@mermaid-js/parser';\nimport type { ParserDefinition } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\n\nexport const parser: ParserDefinition = {\n parse: async (input: string): Promise => {\n const ast: Info = await parse('info', input);\n log.debug(ast);\n },\n};\n", "import type { InfoFields, InfoDB } from './infoTypes.js';\nimport packageJson from '../../../package.json' assert { type: 'json' };\n\nexport const DEFAULT_INFO_DB: InfoFields = {\n version: packageJson.version + (includeLargeFeatures ? '' : '-tiny'),\n} as const;\n\nexport const getVersion = (): string => DEFAULT_INFO_DB.version;\n\nexport const db: InfoDB = {\n getVersion,\n};\n", "import type { DrawDefinition, SVG, SVGGroup } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { selectSvgElement } from '../../rendering-util/selectSvgElement.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\n\n/**\n * Draws an info picture in the tag with id: id based on the graph definition in text.\n *\n * @param text - The text of the diagram.\n * @param id - The id of the diagram which will be used as a DOM element id.\n * @param version - MermaidJS version.\n */\nconst draw: DrawDefinition = (text, id, version) => {\n log.debug('rendering info diagram\\n' + text);\n\n const svg: SVG = selectSvgElement(id);\n configureSvgSize(svg, 100, 400, true);\n\n const group: SVGGroup = svg.append('g');\n group\n .append('text')\n .attr('x', 100)\n .attr('y', 40)\n .attr('class', 'version')\n .attr('font-size', 32)\n .style('text-anchor', 'middle')\n .text(`v${version}`);\n};\n\nexport const renderer = { draw };\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { parser } from './infoParser.js';\nimport { db } from './infoDb.js';\nimport { renderer } from './infoRenderer.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n};\n"], + "mappings": ";;;;;;;;;;;;;;;AACA,SAAS,aAAa;AAIf,IAAM,SAA2B;AAAA,EACtC,OAAO,8BAAO,UAAiC;AAC7C,UAAM,MAAY,MAAM,MAAM,QAAQ,KAAK;AAC3C,QAAI,MAAM,GAAG;AAAA,EACf,GAHO;AAIT;;;ACPO,IAAM,kBAA8B;AAAA,EACzC,SAAS,gBAAY,WAAW,OAAuB,KAAK;AAC9D;AAEO,IAAM,aAAa,6BAAc,gBAAgB,SAA9B;AAEnB,IAAM,KAAa;AAAA,EACxB;AACF;;;ACCA,IAAM,OAAuB,wBAAC,MAAM,IAAI,YAAY;AAClD,MAAI,MAAM,6BAA6B,IAAI;AAE3C,QAAM,MAAW,iBAAiB,EAAE;AACpC,mBAAiB,KAAK,KAAK,KAAK,IAAI;AAEpC,QAAM,QAAkB,IAAI,OAAO,GAAG;AACtC,QACG,OAAO,MAAM,EACb,KAAK,KAAK,GAAG,EACb,KAAK,KAAK,EAAE,EACZ,KAAK,SAAS,SAAS,EACvB,KAAK,aAAa,EAAE,EACpB,MAAM,eAAe,QAAQ,EAC7B,KAAK,IAAI,OAAO,EAAE;AACvB,GAf6B;AAiBtB,IAAM,WAAW,EAAE,KAAK;;;ACxBxB,IAAM,UAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/journeyDiagram-XKPGCS4Q.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/journeyDiagram-XKPGCS4Q.mjs new file mode 100644 index 0000000..9052a94 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/journeyDiagram-XKPGCS4Q.mjs @@ -0,0 +1,1311 @@ +import { + drawBackgroundRect, + drawRect, + drawText, + getNoteRect +} from "./chunk-TZMSLE5B.mjs"; +import { + getIconStyles +} from "./chunk-FMBD7UC4.mjs"; +import { + clear, + configureSvgSize, + getAccDescription, + getAccTitle, + getConfig2 as getConfig, + getDiagramTitle, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/user-journey/parser/journey.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [6, 8, 10, 11, 12, 14, 16, 17, 18], $V1 = [1, 9], $V2 = [1, 10], $V3 = [1, 11], $V4 = [1, 12], $V5 = [1, 13], $V6 = [1, 14]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "journey": 4, "document": 5, "EOF": 6, "line": 7, "SPACE": 8, "statement": 9, "NEWLINE": 10, "title": 11, "acc_title": 12, "acc_title_value": 13, "acc_descr": 14, "acc_descr_value": 15, "acc_descr_multiline_value": 16, "section": 17, "taskName": 18, "taskData": 19, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "journey", 6: "EOF", 8: "SPACE", 10: "NEWLINE", 11: "title", 12: "acc_title", 13: "acc_title_value", 14: "acc_descr", 15: "acc_descr_value", 16: "acc_descr_multiline_value", 17: "section", 18: "taskName", 19: "taskData" }, + productions_: [0, [3, 3], [5, 0], [5, 2], [7, 2], [7, 1], [7, 1], [7, 1], [9, 1], [9, 2], [9, 2], [9, 1], [9, 1], [9, 2]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 1: + return $$[$0 - 1]; + break; + case 2: + this.$ = []; + break; + case 3: + $$[$0 - 1].push($$[$0]); + this.$ = $$[$0 - 1]; + break; + case 4: + case 5: + this.$ = $$[$0]; + break; + case 6: + case 7: + this.$ = []; + break; + case 8: + yy.setDiagramTitle($$[$0].substr(6)); + this.$ = $$[$0].substr(6); + break; + case 9: + this.$ = $$[$0].trim(); + yy.setAccTitle(this.$); + break; + case 10: + case 11: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 12: + yy.addSection($$[$0].substr(8)); + this.$ = $$[$0].substr(8); + break; + case 13: + yy.addTask($$[$0 - 1], $$[$0]); + this.$ = "task"; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: [1, 2] }, { 1: [3] }, o($V0, [2, 2], { 5: 3 }), { 6: [1, 4], 7: 5, 8: [1, 6], 9: 7, 10: [1, 8], 11: $V1, 12: $V2, 14: $V3, 16: $V4, 17: $V5, 18: $V6 }, o($V0, [2, 7], { 1: [2, 1] }), o($V0, [2, 3]), { 9: 15, 11: $V1, 12: $V2, 14: $V3, 16: $V4, 17: $V5, 18: $V6 }, o($V0, [2, 5]), o($V0, [2, 6]), o($V0, [2, 8]), { 13: [1, 16] }, { 15: [1, 17] }, o($V0, [2, 11]), o($V0, [2, 12]), { 19: [1, 18] }, o($V0, [2, 4]), o($V0, [2, 9]), o($V0, [2, 10]), o($V0, [2, 13])], + defaultActions: {}, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + break; + case 1: + break; + case 2: + return 10; + break; + case 3: + break; + case 4: + break; + case 5: + return 4; + break; + case 6: + return 11; + break; + case 7: + this.begin("acc_title"); + return 12; + break; + case 8: + this.popState(); + return "acc_title_value"; + break; + case 9: + this.begin("acc_descr"); + return 14; + break; + case 10: + this.popState(); + return "acc_descr_value"; + break; + case 11: + this.begin("acc_descr_multiline"); + break; + case 12: + this.popState(); + break; + case 13: + return "acc_descr_multiline_value"; + break; + case 14: + return 17; + break; + case 15: + return 18; + break; + case 16: + return 19; + break; + case 17: + return ":"; + break; + case 18: + return 6; + break; + case 19: + return "INVALID"; + break; + } + }, "anonymous"), + rules: [/^(?:%(?!\{)[^\n]*)/i, /^(?:[^\}]%%[^\n]*)/i, /^(?:[\n]+)/i, /^(?:\s+)/i, /^(?:#[^\n]*)/i, /^(?:journey\b)/i, /^(?:title\s[^#\n;]+)/i, /^(?:accTitle\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*\{\s*)/i, /^(?:[\}])/i, /^(?:[^\}]*)/i, /^(?:section\s[^#:\n;]+)/i, /^(?:[^#:\n;]+)/i, /^(?::[^#\n;]+)/i, /^(?::)/i, /^(?:$)/i, /^(?:.)/i], + conditions: { "acc_descr_multiline": { "rules": [12, 13], "inclusive": false }, "acc_descr": { "rules": [10], "inclusive": false }, "acc_title": { "rules": [8], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 18, 19], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var journey_default = parser; + +// src/diagrams/user-journey/journeyDb.js +var currentSection = ""; +var sections = []; +var tasks = []; +var rawTasks = []; +var clear2 = /* @__PURE__ */ __name(function() { + sections.length = 0; + tasks.length = 0; + currentSection = ""; + rawTasks.length = 0; + clear(); +}, "clear"); +var addSection = /* @__PURE__ */ __name(function(txt) { + currentSection = txt; + sections.push(txt); +}, "addSection"); +var getSections = /* @__PURE__ */ __name(function() { + return sections; +}, "getSections"); +var getTasks = /* @__PURE__ */ __name(function() { + let allItemsProcessed = compileTasks(); + const maxDepth = 100; + let iterationCount = 0; + while (!allItemsProcessed && iterationCount < maxDepth) { + allItemsProcessed = compileTasks(); + iterationCount++; + } + tasks.push(...rawTasks); + return tasks; +}, "getTasks"); +var updateActors = /* @__PURE__ */ __name(function() { + const tempActors = []; + tasks.forEach((task) => { + if (task.people) { + tempActors.push(...task.people); + } + }); + const unique = new Set(tempActors); + return [...unique].sort(); +}, "updateActors"); +var addTask = /* @__PURE__ */ __name(function(descr, taskData) { + const pieces = taskData.substr(1).split(":"); + let score = 0; + let peeps = []; + if (pieces.length === 1) { + score = Number(pieces[0]); + peeps = []; + } else { + score = Number(pieces[0]); + peeps = pieces[1].split(","); + } + const peopleList = peeps.map((s) => s.trim()); + const rawTask = { + section: currentSection, + type: currentSection, + people: peopleList, + task: descr, + score + }; + rawTasks.push(rawTask); +}, "addTask"); +var addTaskOrg = /* @__PURE__ */ __name(function(descr) { + const newTask = { + section: currentSection, + type: currentSection, + description: descr, + task: descr, + classes: [] + }; + tasks.push(newTask); +}, "addTaskOrg"); +var compileTasks = /* @__PURE__ */ __name(function() { + const compileTask = /* @__PURE__ */ __name(function(pos) { + return rawTasks[pos].processed; + }, "compileTask"); + let allProcessed = true; + for (const [i, rawTask] of rawTasks.entries()) { + compileTask(i); + allProcessed = allProcessed && rawTask.processed; + } + return allProcessed; +}, "compileTasks"); +var getActors = /* @__PURE__ */ __name(function() { + return updateActors(); +}, "getActors"); +var journeyDb_default = { + getConfig: /* @__PURE__ */ __name(() => getConfig().journey, "getConfig"), + clear: clear2, + setDiagramTitle, + getDiagramTitle, + setAccTitle, + getAccTitle, + setAccDescription, + getAccDescription, + addSection, + getSections, + getTasks, + addTask, + addTaskOrg, + getActors +}; + +// src/diagrams/user-journey/styles.js +var getStyles = /* @__PURE__ */ __name((options) => `.label { + font-family: ${options.fontFamily}; + color: ${options.textColor}; + } + .mouth { + stroke: #666; + } + + line { + stroke: ${options.textColor} + } + + .legend { + fill: ${options.textColor}; + font-family: ${options.fontFamily}; + } + + .label text { + fill: #333; + } + .label { + color: ${options.textColor} + } + + .face { + ${options.faceColor ? `fill: ${options.faceColor}` : "fill: #FFF8DC"}; + stroke: #999; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; + stroke-width: 1px; + } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${options.arrowheadColor}; + } + + .edgePath .path { + stroke: ${options.lineColor}; + stroke-width: 1.5px; + } + + .flowchart-link { + stroke: ${options.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${options.edgeLabelBackground}; + rect { + opacity: 0.5; + } + text-align: center; + } + + .cluster rect { + } + + .cluster text { + fill: ${options.titleColor}; + } + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${options.fontFamily}; + font-size: 12px; + background: ${options.tertiaryColor}; + border: 1px solid ${options.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .task-type-0, .section-type-0 { + ${options.fillType0 ? `fill: ${options.fillType0}` : ""}; + } + .task-type-1, .section-type-1 { + ${options.fillType0 ? `fill: ${options.fillType1}` : ""}; + } + .task-type-2, .section-type-2 { + ${options.fillType0 ? `fill: ${options.fillType2}` : ""}; + } + .task-type-3, .section-type-3 { + ${options.fillType0 ? `fill: ${options.fillType3}` : ""}; + } + .task-type-4, .section-type-4 { + ${options.fillType0 ? `fill: ${options.fillType4}` : ""}; + } + .task-type-5, .section-type-5 { + ${options.fillType0 ? `fill: ${options.fillType5}` : ""}; + } + .task-type-6, .section-type-6 { + ${options.fillType0 ? `fill: ${options.fillType6}` : ""}; + } + .task-type-7, .section-type-7 { + ${options.fillType0 ? `fill: ${options.fillType7}` : ""}; + } + + .actor-0 { + ${options.actor0 ? `fill: ${options.actor0}` : ""}; + } + .actor-1 { + ${options.actor1 ? `fill: ${options.actor1}` : ""}; + } + .actor-2 { + ${options.actor2 ? `fill: ${options.actor2}` : ""}; + } + .actor-3 { + ${options.actor3 ? `fill: ${options.actor3}` : ""}; + } + .actor-4 { + ${options.actor4 ? `fill: ${options.actor4}` : ""}; + } + .actor-5 { + ${options.actor5 ? `fill: ${options.actor5}` : ""}; + } + ${getIconStyles()} +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/user-journey/journeyRenderer.ts +import { select } from "d3"; + +// src/diagrams/user-journey/svgDraw.js +import { arc as d3arc } from "d3"; +var drawRect2 = /* @__PURE__ */ __name(function(elem, rectData) { + return drawRect(elem, rectData); +}, "drawRect"); +var drawFace = /* @__PURE__ */ __name(function(element, faceData) { + const radius = 15; + const circleElement = element.append("circle").attr("cx", faceData.cx).attr("cy", faceData.cy).attr("class", "face").attr("r", radius).attr("stroke-width", 2).attr("overflow", "visible"); + const face = element.append("g"); + face.append("circle").attr("cx", faceData.cx - radius / 3).attr("cy", faceData.cy - radius / 3).attr("r", 1.5).attr("stroke-width", 2).attr("fill", "#666").attr("stroke", "#666"); + face.append("circle").attr("cx", faceData.cx + radius / 3).attr("cy", faceData.cy - radius / 3).attr("r", 1.5).attr("stroke-width", 2).attr("fill", "#666").attr("stroke", "#666"); + function smile(face2) { + const arc = d3arc().startAngle(Math.PI / 2).endAngle(3 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); + face2.append("path").attr("class", "mouth").attr("d", arc).attr("transform", "translate(" + faceData.cx + "," + (faceData.cy + 2) + ")"); + } + __name(smile, "smile"); + function sad(face2) { + const arc = d3arc().startAngle(3 * Math.PI / 2).endAngle(5 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); + face2.append("path").attr("class", "mouth").attr("d", arc).attr("transform", "translate(" + faceData.cx + "," + (faceData.cy + 7) + ")"); + } + __name(sad, "sad"); + function ambivalent(face2) { + face2.append("line").attr("class", "mouth").attr("stroke", 2).attr("x1", faceData.cx - 5).attr("y1", faceData.cy + 7).attr("x2", faceData.cx + 5).attr("y2", faceData.cy + 7).attr("class", "mouth").attr("stroke-width", "1px").attr("stroke", "#666"); + } + __name(ambivalent, "ambivalent"); + if (faceData.score > 3) { + smile(face); + } else if (faceData.score < 3) { + sad(face); + } else { + ambivalent(face); + } + return circleElement; +}, "drawFace"); +var drawCircle = /* @__PURE__ */ __name(function(element, circleData) { + const circleElement = element.append("circle"); + circleElement.attr("cx", circleData.cx); + circleElement.attr("cy", circleData.cy); + circleElement.attr("class", "actor-" + circleData.pos); + circleElement.attr("fill", circleData.fill); + circleElement.attr("stroke", circleData.stroke); + circleElement.attr("r", circleData.r); + if (circleElement.class !== void 0) { + circleElement.attr("class", circleElement.class); + } + if (circleData.title !== void 0) { + circleElement.append("title").text(circleData.title); + } + return circleElement; +}, "drawCircle"); +var drawText2 = /* @__PURE__ */ __name(function(elem, textData) { + return drawText(elem, textData); +}, "drawText"); +var drawLabel = /* @__PURE__ */ __name(function(elem, txtObject) { + function genPoints(x, y, width, height, cut) { + return x + "," + y + " " + (x + width) + "," + y + " " + (x + width) + "," + (y + height - cut) + " " + (x + width - cut * 1.2) + "," + (y + height) + " " + x + "," + (y + height); + } + __name(genPoints, "genPoints"); + const polygon = elem.append("polygon"); + polygon.attr("points", genPoints(txtObject.x, txtObject.y, 50, 20, 7)); + polygon.attr("class", "labelBox"); + txtObject.y = txtObject.y + txtObject.labelMargin; + txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin; + drawText2(elem, txtObject); +}, "drawLabel"); +var drawSection = /* @__PURE__ */ __name(function(elem, section, conf2) { + const g = elem.append("g"); + const rect = getNoteRect(); + rect.x = section.x; + rect.y = section.y; + rect.fill = section.fill; + rect.width = conf2.width * section.taskCount + // width of the tasks + conf2.diagramMarginX * (section.taskCount - 1); + rect.height = conf2.height; + rect.class = "journey-section section-type-" + section.num; + rect.rx = 3; + rect.ry = 3; + drawRect2(g, rect); + _drawTextCandidateFunc(conf2)( + section.text, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: "journey-section section-type-" + section.num }, + conf2, + section.colour + ); +}, "drawSection"); +var taskCount = -1; +var drawTask = /* @__PURE__ */ __name(function(elem, task, conf2) { + const center = task.x + conf2.width / 2; + const g = elem.append("g"); + taskCount++; + const maxHeight = 300 + 5 * 30; + g.append("line").attr("id", "task" + taskCount).attr("x1", center).attr("y1", task.y).attr("x2", center).attr("y2", maxHeight).attr("class", "task-line").attr("stroke-width", "1px").attr("stroke-dasharray", "4 2").attr("stroke", "#666"); + drawFace(g, { + cx: center, + cy: 300 + (5 - task.score) * 30, + score: task.score + }); + const rect = getNoteRect(); + rect.x = task.x; + rect.y = task.y; + rect.fill = task.fill; + rect.width = conf2.width; + rect.height = conf2.height; + rect.class = "task task-type-" + task.num; + rect.rx = 3; + rect.ry = 3; + drawRect2(g, rect); + let xPos = task.x + 14; + task.people.forEach((person) => { + const colour = task.actors[person].color; + const circle = { + cx: xPos, + cy: task.y, + r: 7, + fill: colour, + stroke: "#000", + title: person, + pos: task.actors[person].position + }; + drawCircle(g, circle); + xPos += 10; + }); + _drawTextCandidateFunc(conf2)( + task.task, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: "task" }, + conf2, + task.colour + ); +}, "drawTask"); +var drawBackgroundRect2 = /* @__PURE__ */ __name(function(elem, bounds2) { + drawBackgroundRect(elem, bounds2); +}, "drawBackgroundRect"); +var _drawTextCandidateFunc = /* @__PURE__ */ (function() { + function byText(content, g, x, y, width, height, textAttrs, colour) { + const text = g.append("text").attr("x", x + width / 2).attr("y", y + height / 2 + 5).style("font-color", colour).style("text-anchor", "middle").text(content); + _setTextAttrs(text, textAttrs); + } + __name(byText, "byText"); + function byTspan(content, g, x, y, width, height, textAttrs, conf2, colour) { + const { taskFontSize, taskFontFamily } = conf2; + const lines = content.split(//gi); + for (let i = 0; i < lines.length; i++) { + const dy = i * taskFontSize - taskFontSize * (lines.length - 1) / 2; + const text = g.append("text").attr("x", x + width / 2).attr("y", y).attr("fill", colour).style("text-anchor", "middle").style("font-size", taskFontSize).style("font-family", taskFontFamily); + text.append("tspan").attr("x", x + width / 2).attr("dy", dy).text(lines[i]); + text.attr("y", y + height / 2).attr("dominant-baseline", "central").attr("alignment-baseline", "central"); + _setTextAttrs(text, textAttrs); + } + } + __name(byTspan, "byTspan"); + function byFo(content, g, x, y, width, height, textAttrs, conf2) { + const body = g.append("switch"); + const f = body.append("foreignObject").attr("x", x).attr("y", y).attr("width", width).attr("height", height).attr("position", "fixed"); + const text = f.append("xhtml:div").style("display", "table").style("height", "100%").style("width", "100%"); + text.append("div").attr("class", "label").style("display", "table-cell").style("text-align", "center").style("vertical-align", "middle").text(content); + byTspan(content, body, x, y, width, height, textAttrs, conf2); + _setTextAttrs(text, textAttrs); + } + __name(byFo, "byFo"); + function _setTextAttrs(toText, fromTextAttrsDict) { + for (const key in fromTextAttrsDict) { + if (key in fromTextAttrsDict) { + toText.attr(key, fromTextAttrsDict[key]); + } + } + } + __name(_setTextAttrs, "_setTextAttrs"); + return function(conf2) { + return conf2.textPlacement === "fo" ? byFo : conf2.textPlacement === "old" ? byText : byTspan; + }; +})(); +var initGraphics = /* @__PURE__ */ __name(function(graphics) { + graphics.append("defs").append("marker").attr("id", "arrowhead").attr("refX", 5).attr("refY", 2).attr("markerWidth", 6).attr("markerHeight", 4).attr("orient", "auto").append("path").attr("d", "M 0,0 V 4 L6,2 Z"); +}, "initGraphics"); +var svgDraw_default = { + drawRect: drawRect2, + drawCircle, + drawSection, + drawText: drawText2, + drawLabel, + drawTask, + drawBackgroundRect: drawBackgroundRect2, + initGraphics +}; + +// src/diagrams/user-journey/journeyRenderer.ts +var setConf = /* @__PURE__ */ __name(function(cnf) { + const keys = Object.keys(cnf); + keys.forEach(function(key) { + conf[key] = cnf[key]; + }); +}, "setConf"); +var actors = {}; +var maxWidth = 0; +function drawActorLegend(diagram2) { + const conf2 = getConfig().journey; + const maxLabelWidth = conf2.maxLabelWidth; + maxWidth = 0; + let yPos = 60; + Object.keys(actors).forEach((person) => { + const colour = actors[person].color; + const circleData = { + cx: 20, + cy: yPos, + r: 7, + fill: colour, + stroke: "#000", + pos: actors[person].position + }; + svgDraw_default.drawCircle(diagram2, circleData); + let measureText = diagram2.append("text").attr("visibility", "hidden").text(person); + const fullTextWidth = measureText.node().getBoundingClientRect().width; + measureText.remove(); + let lines = []; + if (fullTextWidth <= maxLabelWidth) { + lines = [person]; + } else { + const words = person.split(" "); + let currentLine = ""; + measureText = diagram2.append("text").attr("visibility", "hidden"); + words.forEach((word) => { + const testLine = currentLine ? `${currentLine} ${word}` : word; + measureText.text(testLine); + const textWidth = measureText.node().getBoundingClientRect().width; + if (textWidth > maxLabelWidth) { + if (currentLine) { + lines.push(currentLine); + } + currentLine = word; + measureText.text(word); + if (measureText.node().getBoundingClientRect().width > maxLabelWidth) { + let brokenWord = ""; + for (const char of word) { + brokenWord += char; + measureText.text(brokenWord + "-"); + if (measureText.node().getBoundingClientRect().width > maxLabelWidth) { + lines.push(brokenWord.slice(0, -1) + "-"); + brokenWord = char; + } + } + currentLine = brokenWord; + } + } else { + currentLine = testLine; + } + }); + if (currentLine) { + lines.push(currentLine); + } + measureText.remove(); + } + lines.forEach((line, index) => { + const labelData = { + x: 40, + y: yPos + 7 + index * 20, + fill: "#666", + text: line, + textMargin: conf2.boxTextMargin ?? 5 + }; + const textElement = svgDraw_default.drawText(diagram2, labelData); + const lineWidth = textElement.node().getBoundingClientRect().width; + if (lineWidth > maxWidth && lineWidth > conf2.leftMargin - lineWidth) { + maxWidth = lineWidth; + } + }); + yPos += Math.max(20, lines.length * 20); + }); +} +__name(drawActorLegend, "drawActorLegend"); +var conf = getConfig().journey; +var leftMargin = 0; +var draw = /* @__PURE__ */ __name(function(text, id, version, diagObj) { + const configObject = getConfig(); + const titleColor = configObject.journey.titleColor; + const titleFontSize = configObject.journey.titleFontSize; + const titleFontFamily = configObject.journey.titleFontFamily; + const securityLevel = configObject.securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = select("#i" + id); + } + const root = securityLevel === "sandbox" ? select(sandboxElement.nodes()[0].contentDocument.body) : select("body"); + bounds.init(); + const diagram2 = root.select("#" + id); + svgDraw_default.initGraphics(diagram2); + const tasks2 = diagObj.db.getTasks(); + const title = diagObj.db.getDiagramTitle(); + const actorNames = diagObj.db.getActors(); + for (const member in actors) { + delete actors[member]; + } + let actorPos = 0; + actorNames.forEach((actorName) => { + actors[actorName] = { + color: conf.actorColours[actorPos % conf.actorColours.length], + position: actorPos + }; + actorPos++; + }); + drawActorLegend(diagram2); + leftMargin = conf.leftMargin + maxWidth; + bounds.insert(0, 0, leftMargin, Object.keys(actors).length * 50); + drawTasks(diagram2, tasks2, 0); + const box = bounds.getBounds(); + if (title) { + diagram2.append("text").text(title).attr("x", leftMargin).attr("font-size", titleFontSize).attr("font-weight", "bold").attr("y", 25).attr("fill", titleColor).attr("font-family", titleFontFamily); + } + const height = box.stopy - box.starty + 2 * conf.diagramMarginY; + const width = leftMargin + box.stopx + 2 * conf.diagramMarginX; + configureSvgSize(diagram2, height, width, conf.useMaxWidth); + diagram2.append("line").attr("x1", leftMargin).attr("y1", conf.height * 4).attr("x2", width - leftMargin - 4).attr("y2", conf.height * 4).attr("stroke-width", 4).attr("stroke", "black").attr("marker-end", "url(#arrowhead)"); + const extraVertForTitle = title ? 70 : 0; + diagram2.attr("viewBox", `${box.startx} -25 ${width} ${height + extraVertForTitle}`); + diagram2.attr("preserveAspectRatio", "xMinYMin meet"); + diagram2.attr("height", height + extraVertForTitle + 25); +}, "draw"); +var bounds = { + data: { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0 + }, + verticalPos: 0, + sequenceItems: [], + init: /* @__PURE__ */ __name(function() { + this.sequenceItems = []; + this.data = { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0 + }; + this.verticalPos = 0; + }, "init"), + updateVal: /* @__PURE__ */ __name(function(obj, key, val, fun) { + if (obj[key] === void 0) { + obj[key] = val; + } else { + obj[key] = fun(val, obj[key]); + } + }, "updateVal"), + updateBounds: /* @__PURE__ */ __name(function(startx, starty, stopx, stopy) { + const conf2 = getConfig().journey; + const _self = this; + let cnt = 0; + function updateFn(type) { + return /* @__PURE__ */ __name(function updateItemBounds(item) { + cnt++; + const n = _self.sequenceItems.length - cnt + 1; + _self.updateVal(item, "starty", starty - n * conf2.boxMargin, Math.min); + _self.updateVal(item, "stopy", stopy + n * conf2.boxMargin, Math.max); + _self.updateVal(bounds.data, "startx", startx - n * conf2.boxMargin, Math.min); + _self.updateVal(bounds.data, "stopx", stopx + n * conf2.boxMargin, Math.max); + if (!(type === "activation")) { + _self.updateVal(item, "startx", startx - n * conf2.boxMargin, Math.min); + _self.updateVal(item, "stopx", stopx + n * conf2.boxMargin, Math.max); + _self.updateVal(bounds.data, "starty", starty - n * conf2.boxMargin, Math.min); + _self.updateVal(bounds.data, "stopy", stopy + n * conf2.boxMargin, Math.max); + } + }, "updateItemBounds"); + } + __name(updateFn, "updateFn"); + this.sequenceItems.forEach(updateFn()); + }, "updateBounds"), + insert: /* @__PURE__ */ __name(function(startx, starty, stopx, stopy) { + const _startx = Math.min(startx, stopx); + const _stopx = Math.max(startx, stopx); + const _starty = Math.min(starty, stopy); + const _stopy = Math.max(starty, stopy); + this.updateVal(bounds.data, "startx", _startx, Math.min); + this.updateVal(bounds.data, "starty", _starty, Math.min); + this.updateVal(bounds.data, "stopx", _stopx, Math.max); + this.updateVal(bounds.data, "stopy", _stopy, Math.max); + this.updateBounds(_startx, _starty, _stopx, _stopy); + }, "insert"), + bumpVerticalPos: /* @__PURE__ */ __name(function(bump) { + this.verticalPos = this.verticalPos + bump; + this.data.stopy = this.verticalPos; + }, "bumpVerticalPos"), + getVerticalPos: /* @__PURE__ */ __name(function() { + return this.verticalPos; + }, "getVerticalPos"), + getBounds: /* @__PURE__ */ __name(function() { + return this.data; + }, "getBounds") +}; +var fills = conf.sectionFills; +var textColours = conf.sectionColours; +var drawTasks = /* @__PURE__ */ __name(function(diagram2, tasks2, verticalPos) { + const conf2 = getConfig().journey; + let lastSection = ""; + const sectionVHeight = conf2.height * 2 + conf2.diagramMarginY; + const taskPos = verticalPos + sectionVHeight; + let sectionNumber = 0; + let fill = "#CCC"; + let colour = "black"; + let num = 0; + for (const [i, task] of tasks2.entries()) { + if (lastSection !== task.section) { + fill = fills[sectionNumber % fills.length]; + num = sectionNumber % fills.length; + colour = textColours[sectionNumber % textColours.length]; + let taskInSectionCount = 0; + const currentSection2 = task.section; + for (let taskIndex = i; taskIndex < tasks2.length; taskIndex++) { + if (tasks2[taskIndex].section == currentSection2) { + taskInSectionCount = taskInSectionCount + 1; + } else { + break; + } + } + const section = { + x: i * conf2.taskMargin + i * conf2.width + leftMargin, + y: 50, + text: task.section, + fill, + num, + colour, + taskCount: taskInSectionCount + }; + svgDraw_default.drawSection(diagram2, section, conf2); + lastSection = task.section; + sectionNumber++; + } + const taskActors = task.people.reduce((acc, actorName) => { + if (actors[actorName]) { + acc[actorName] = actors[actorName]; + } + return acc; + }, {}); + task.x = i * conf2.taskMargin + i * conf2.width + leftMargin; + task.y = taskPos; + task.width = conf2.diagramMarginX; + task.height = conf2.diagramMarginY; + task.colour = colour; + task.fill = fill; + task.num = num; + task.actors = taskActors; + svgDraw_default.drawTask(diagram2, task, conf2); + bounds.insert(task.x, task.y, task.x + task.width + conf2.taskMargin, 300 + 5 * 30); + } +}, "drawTasks"); +var journeyRenderer_default = { + setConf, + draw +}; + +// src/diagrams/user-journey/journeyDiagram.ts +var diagram = { + parser: journey_default, + db: journeyDb_default, + renderer: journeyRenderer_default, + styles: styles_default, + init: /* @__PURE__ */ __name((cnf) => { + journeyRenderer_default.setConf(cnf.journey); + journeyDb_default.clear(); + }, "init") +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/journeyDiagram-XKPGCS4Q.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/journeyDiagram-XKPGCS4Q.mjs.map new file mode 100644 index 0000000..14052ed --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/journeyDiagram-XKPGCS4Q.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/user-journey/parser/journey.jison", "../../../src/diagrams/user-journey/journeyDb.js", "../../../src/diagrams/user-journey/styles.js", "../../../src/diagrams/user-journey/journeyRenderer.ts", "../../../src/diagrams/user-journey/svgDraw.js", "../../../src/diagrams/user-journey/journeyDiagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,10,11,12,14,16,17,18],$V1=[1,9],$V2=[1,10],$V3=[1,11],$V4=[1,12],$V5=[1,13],$V6=[1,14];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"journey\":4,\"document\":5,\"EOF\":6,\"line\":7,\"SPACE\":8,\"statement\":9,\"NEWLINE\":10,\"title\":11,\"acc_title\":12,\"acc_title_value\":13,\"acc_descr\":14,\"acc_descr_value\":15,\"acc_descr_multiline_value\":16,\"section\":17,\"taskName\":18,\"taskData\":19,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"journey\",6:\"EOF\",8:\"SPACE\",10:\"NEWLINE\",11:\"title\",12:\"acc_title\",13:\"acc_title_value\",14:\"acc_descr\",15:\"acc_descr_value\",16:\"acc_descr_multiline_value\",17:\"section\",18:\"taskName\",19:\"taskData\"},\nproductions_: [0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n return $$[$0-1]; \nbreak;\ncase 2:\n this.$ = [] \nbreak;\ncase 3:\n$$[$0-1].push($$[$0]);this.$ = $$[$0-1]\nbreak;\ncase 4: case 5:\n this.$ = $$[$0] \nbreak;\ncase 6: case 7:\n this.$=[];\nbreak;\ncase 8:\nyy.setDiagramTitle($$[$0].substr(6));this.$=$$[$0].substr(6);\nbreak;\ncase 9:\n this.$=$$[$0].trim();yy.setAccTitle(this.$); \nbreak;\ncase 10: case 11:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 12:\nyy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8);\nbreak;\ncase 13:\nyy.addTask($$[$0-1], $$[$0]);this.$='task';\nbreak;\n}\n},\ntable: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:$V1,12:$V2,14:$V3,16:$V4,17:$V5,18:$V6},o($V0,[2,7],{1:[2,1]}),o($V0,[2,3]),{9:15,11:$V1,12:$V2,14:$V3,16:$V4,17:$V5,18:$V6},o($V0,[2,5]),o($V0,[2,6]),o($V0,[2,8]),{13:[1,16]},{15:[1,17]},o($V0,[2,11]),o($V0,[2,12]),{19:[1,18]},o($V0,[2,4]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,13])],\ndefaultActions: {},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:/* skip comments */\nbreak;\ncase 1:/* skip comments */\nbreak;\ncase 2:return 10;\nbreak;\ncase 3:/* skip whitespace */\nbreak;\ncase 4:/* skip comments */\nbreak;\ncase 5:return 4;\nbreak;\ncase 6:return 11;\nbreak;\ncase 7: this.begin(\"acc_title\");return 12; \nbreak;\ncase 8: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 9: this.begin(\"acc_descr\");return 14; \nbreak;\ncase 10: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 11: this.begin(\"acc_descr_multiline\");\nbreak;\ncase 12: this.popState(); \nbreak;\ncase 13:return \"acc_descr_multiline_value\";\nbreak;\ncase 14:return 17;\nbreak;\ncase 15:return 18;\nbreak;\ncase 16:return 19;\nbreak;\ncase 17:return ':';\nbreak;\ncase 18:return 6;\nbreak;\ncase 19:return 'INVALID';\nbreak;\n}\n},\nrules: [/^(?:%(?!\\{)[^\\n]*)/i,/^(?:[^\\}]%%[^\\n]*)/i,/^(?:[\\n]+)/i,/^(?:\\s+)/i,/^(?:#[^\\n]*)/i,/^(?:journey\\b)/i,/^(?:title\\s[^#\\n;]+)/i,/^(?:accTitle\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*\\{\\s*)/i,/^(?:[\\}])/i,/^(?:[^\\}]*)/i,/^(?:section\\s[^#:\\n;]+)/i,/^(?:[^#:\\n;]+)/i,/^(?::[^#\\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],\nconditions: {\"acc_descr_multiline\":{\"rules\":[12,13],\"inclusive\":false},\"acc_descr\":{\"rules\":[10],\"inclusive\":false},\"acc_title\":{\"rules\":[8],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport {\n setAccTitle,\n getAccTitle,\n setDiagramTitle,\n getDiagramTitle,\n getAccDescription,\n setAccDescription,\n clear as commonClear,\n} from '../common/commonDb.js';\n\nlet currentSection = '';\n\nconst sections = [];\nconst tasks = [];\nconst rawTasks = [];\n\nexport const clear = function () {\n sections.length = 0;\n tasks.length = 0;\n currentSection = '';\n rawTasks.length = 0;\n commonClear();\n};\n\nexport const addSection = function (txt) {\n currentSection = txt;\n sections.push(txt);\n};\n\nexport const getSections = function () {\n return sections;\n};\n\nexport const getTasks = function () {\n let allItemsProcessed = compileTasks();\n const maxDepth = 100;\n let iterationCount = 0;\n while (!allItemsProcessed && iterationCount < maxDepth) {\n allItemsProcessed = compileTasks();\n iterationCount++;\n }\n\n tasks.push(...rawTasks);\n\n return tasks;\n};\n\nconst updateActors = function () {\n const tempActors = [];\n tasks.forEach((task) => {\n if (task.people) {\n tempActors.push(...task.people);\n }\n });\n\n const unique = new Set(tempActors);\n return [...unique].sort();\n};\n\nexport const addTask = function (descr, taskData) {\n const pieces = taskData.substr(1).split(':');\n\n let score = 0;\n let peeps = [];\n if (pieces.length === 1) {\n score = Number(pieces[0]);\n peeps = [];\n } else {\n score = Number(pieces[0]);\n peeps = pieces[1].split(',');\n }\n const peopleList = peeps.map((s) => s.trim());\n\n const rawTask = {\n section: currentSection,\n type: currentSection,\n people: peopleList,\n task: descr,\n score,\n };\n\n rawTasks.push(rawTask);\n};\n\nexport const addTaskOrg = function (descr) {\n const newTask = {\n section: currentSection,\n type: currentSection,\n description: descr,\n task: descr,\n classes: [],\n };\n tasks.push(newTask);\n};\n\nconst compileTasks = function () {\n const compileTask = function (pos) {\n return rawTasks[pos].processed;\n };\n\n let allProcessed = true;\n for (const [i, rawTask] of rawTasks.entries()) {\n compileTask(i);\n\n allProcessed = allProcessed && rawTask.processed;\n }\n return allProcessed;\n};\n\nconst getActors = function () {\n return updateActors();\n};\n\nexport default {\n getConfig: () => getConfig().journey,\n clear,\n setDiagramTitle,\n getDiagramTitle,\n setAccTitle,\n getAccTitle,\n setAccDescription,\n getAccDescription,\n addSection,\n getSections,\n getTasks,\n addTask,\n addTaskOrg,\n getActors,\n};\n", "import { getIconStyles } from '../globalStyles.js';\n\nconst getStyles = (options) =>\n `.label {\n font-family: ${options.fontFamily};\n color: ${options.textColor};\n }\n .mouth {\n stroke: #666;\n }\n\n line {\n stroke: ${options.textColor}\n }\n\n .legend {\n fill: ${options.textColor};\n font-family: ${options.fontFamily};\n }\n\n .label text {\n fill: #333;\n }\n .label {\n color: ${options.textColor}\n }\n\n .face {\n ${options.faceColor ? `fill: ${options.faceColor}` : 'fill: #FFF8DC'};\n stroke: #999;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${options.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${options.lineColor};\n stroke-width: 1.5px;\n }\n\n .flowchart-link {\n stroke: ${options.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${options.edgeLabelBackground};\n rect {\n opacity: 0.5;\n }\n text-align: center;\n }\n\n .cluster rect {\n }\n\n .cluster text {\n fill: ${options.titleColor};\n }\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${options.fontFamily};\n font-size: 12px;\n background: ${options.tertiaryColor};\n border: 1px solid ${options.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .task-type-0, .section-type-0 {\n ${options.fillType0 ? `fill: ${options.fillType0}` : ''};\n }\n .task-type-1, .section-type-1 {\n ${options.fillType0 ? `fill: ${options.fillType1}` : ''};\n }\n .task-type-2, .section-type-2 {\n ${options.fillType0 ? `fill: ${options.fillType2}` : ''};\n }\n .task-type-3, .section-type-3 {\n ${options.fillType0 ? `fill: ${options.fillType3}` : ''};\n }\n .task-type-4, .section-type-4 {\n ${options.fillType0 ? `fill: ${options.fillType4}` : ''};\n }\n .task-type-5, .section-type-5 {\n ${options.fillType0 ? `fill: ${options.fillType5}` : ''};\n }\n .task-type-6, .section-type-6 {\n ${options.fillType0 ? `fill: ${options.fillType6}` : ''};\n }\n .task-type-7, .section-type-7 {\n ${options.fillType0 ? `fill: ${options.fillType7}` : ''};\n }\n\n .actor-0 {\n ${options.actor0 ? `fill: ${options.actor0}` : ''};\n }\n .actor-1 {\n ${options.actor1 ? `fill: ${options.actor1}` : ''};\n }\n .actor-2 {\n ${options.actor2 ? `fill: ${options.actor2}` : ''};\n }\n .actor-3 {\n ${options.actor3 ? `fill: ${options.actor3}` : ''};\n }\n .actor-4 {\n ${options.actor4 ? `fill: ${options.actor4}` : ''};\n }\n .actor-5 {\n ${options.actor5 ? `fill: ${options.actor5}` : ''};\n }\n ${getIconStyles()}\n`;\n\nexport default getStyles;\n", "// @ts-nocheck TODO: fix file\nimport { select } from 'd3';\nimport svgDraw from './svgDraw.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\n\nexport const setConf = function (cnf) {\n const keys = Object.keys(cnf);\n\n keys.forEach(function (key) {\n conf[key] = cnf[key];\n });\n};\n\nconst actors = {};\nlet maxWidth = 0;\n\n/** @param diagram - The diagram to draw to. */\nfunction drawActorLegend(diagram) {\n const conf = getConfig().journey;\n const maxLabelWidth = conf.maxLabelWidth;\n maxWidth = 0;\n let yPos = 60;\n\n Object.keys(actors).forEach((person) => {\n const colour = actors[person].color;\n const circleData = {\n cx: 20,\n cy: yPos,\n r: 7,\n fill: colour,\n stroke: '#000',\n pos: actors[person].position,\n };\n svgDraw.drawCircle(diagram, circleData);\n\n // First, measure the full text width without wrapping.\n let measureText = diagram.append('text').attr('visibility', 'hidden').text(person);\n const fullTextWidth = measureText.node().getBoundingClientRect().width;\n measureText.remove();\n\n let lines = [];\n\n // If the text is naturally within the max width, use it as a single line.\n if (fullTextWidth <= maxLabelWidth) {\n lines = [person];\n } else {\n // Otherwise, wrap the text using the knuth-plass algorithm.\n const words = person.split(' '); // Split the text into words.\n let currentLine = '';\n measureText = diagram.append('text').attr('visibility', 'hidden');\n\n words.forEach((word) => {\n // check the width of the line with the new word.\n const testLine = currentLine ? `${currentLine} ${word}` : word;\n measureText.text(testLine);\n const textWidth = measureText.node().getBoundingClientRect().width;\n\n if (textWidth > maxLabelWidth) {\n // If adding the new word exceeds max width, push the current line.\n if (currentLine) {\n lines.push(currentLine);\n }\n currentLine = word; // Start a new line with the current word.\n\n // If the word itself is too long, break it with a hyphen.\n measureText.text(word);\n if (measureText.node().getBoundingClientRect().width > maxLabelWidth) {\n let brokenWord = '';\n for (const char of word) {\n brokenWord += char;\n measureText.text(brokenWord + '-');\n if (measureText.node().getBoundingClientRect().width > maxLabelWidth) {\n // Push the broken part with a hyphen.\n lines.push(brokenWord.slice(0, -1) + '-');\n brokenWord = char;\n }\n }\n currentLine = brokenWord;\n }\n } else {\n // If the line with the new word fits, add the new word to the current line.\n currentLine = testLine;\n }\n });\n\n // Push the last line.\n if (currentLine) {\n lines.push(currentLine);\n }\n measureText.remove(); // Remove the text element used for measuring.\n }\n\n lines.forEach((line, index) => {\n const labelData = {\n x: 40,\n y: yPos + 7 + index * 20,\n fill: '#666',\n text: line,\n textMargin: conf.boxTextMargin ?? 5,\n };\n\n // Draw the text and measure the width.\n const textElement = svgDraw.drawText(diagram, labelData);\n const lineWidth = textElement.node().getBoundingClientRect().width;\n\n // Use conf.leftMargin as the initial spacing baseline,\n // but expand maxWidth if the line is wider.\n if (lineWidth > maxWidth && lineWidth > conf.leftMargin - lineWidth) {\n maxWidth = lineWidth;\n }\n });\n\n yPos += Math.max(20, lines.length * 20);\n });\n}\n\n// TODO: Cleanup?\nconst conf = getConfig().journey;\nlet leftMargin = 0;\nexport const draw = function (text, id, version, diagObj) {\n const configObject = getConfig();\n const titleColor = configObject.journey.titleColor;\n const titleFontSize = configObject.journey.titleFontSize;\n const titleFontFamily = configObject.journey.titleFontFamily;\n\n const securityLevel = configObject.securityLevel;\n // Handle root and Document for when rendering in sandbox mode\n let sandboxElement;\n if (securityLevel === 'sandbox') {\n sandboxElement = select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? select(sandboxElement.nodes()[0].contentDocument.body)\n : select('body');\n // const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0].contentDocument : document;\n\n bounds.init();\n const diagram = root.select('#' + id);\n\n svgDraw.initGraphics(diagram);\n\n const tasks = diagObj.db.getTasks();\n const title = diagObj.db.getDiagramTitle();\n\n const actorNames = diagObj.db.getActors();\n for (const member in actors) {\n delete actors[member];\n }\n let actorPos = 0;\n actorNames.forEach((actorName) => {\n actors[actorName] = {\n color: conf.actorColours[actorPos % conf.actorColours.length],\n position: actorPos,\n };\n actorPos++;\n });\n\n drawActorLegend(diagram);\n leftMargin = conf.leftMargin + maxWidth;\n bounds.insert(0, 0, leftMargin, Object.keys(actors).length * 50);\n drawTasks(diagram, tasks, 0);\n\n const box = bounds.getBounds();\n if (title) {\n diagram\n .append('text')\n .text(title)\n .attr('x', leftMargin)\n .attr('font-size', titleFontSize)\n .attr('font-weight', 'bold')\n .attr('y', 25)\n .attr('fill', titleColor)\n .attr('font-family', titleFontFamily);\n }\n\n const height = box.stopy - box.starty + 2 * conf.diagramMarginY;\n const width = leftMargin + box.stopx + 2 * conf.diagramMarginX;\n\n configureSvgSize(diagram, height, width, conf.useMaxWidth);\n\n // Draw activity line\n diagram\n .append('line')\n .attr('x1', leftMargin)\n .attr('y1', conf.height * 4) // One section head + one task + margins\n .attr('x2', width - leftMargin - 4) // Subtract stroke width so arrow point is retained\n .attr('y2', conf.height * 4)\n .attr('stroke-width', 4)\n .attr('stroke', 'black')\n .attr('marker-end', 'url(#arrowhead)');\n\n const extraVertForTitle = title ? 70 : 0;\n diagram.attr('viewBox', `${box.startx} -25 ${width} ${height + extraVertForTitle}`);\n diagram.attr('preserveAspectRatio', 'xMinYMin meet');\n diagram.attr('height', height + extraVertForTitle + 25);\n};\n\nexport const bounds = {\n data: {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined,\n },\n verticalPos: 0,\n\n sequenceItems: [],\n init: function () {\n this.sequenceItems = [];\n this.data = {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined,\n };\n this.verticalPos = 0;\n },\n updateVal: function (obj, key, val, fun) {\n if (obj[key] === undefined) {\n obj[key] = val;\n } else {\n obj[key] = fun(val, obj[key]);\n }\n },\n updateBounds: function (startx, starty, stopx, stopy) {\n const conf = getConfig().journey;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _self = this;\n let cnt = 0;\n /** @param type - Set to `activation` if activation */\n function updateFn(type?: 'activation') {\n return function updateItemBounds(item) {\n cnt++;\n // The loop sequenceItems is a stack so the biggest margins in the beginning of the sequenceItems\n const n = _self.sequenceItems.length - cnt + 1;\n _self.updateVal(item, 'starty', starty - n * conf.boxMargin, Math.min);\n _self.updateVal(item, 'stopy', stopy + n * conf.boxMargin, Math.max);\n\n _self.updateVal(bounds.data, 'startx', startx - n * conf.boxMargin, Math.min);\n _self.updateVal(bounds.data, 'stopx', stopx + n * conf.boxMargin, Math.max);\n\n if (!(type === 'activation')) {\n _self.updateVal(item, 'startx', startx - n * conf.boxMargin, Math.min);\n _self.updateVal(item, 'stopx', stopx + n * conf.boxMargin, Math.max);\n\n _self.updateVal(bounds.data, 'starty', starty - n * conf.boxMargin, Math.min);\n _self.updateVal(bounds.data, 'stopy', stopy + n * conf.boxMargin, Math.max);\n }\n };\n }\n\n this.sequenceItems.forEach(updateFn());\n },\n insert: function (startx, starty, stopx, stopy) {\n const _startx = Math.min(startx, stopx);\n const _stopx = Math.max(startx, stopx);\n const _starty = Math.min(starty, stopy);\n const _stopy = Math.max(starty, stopy);\n\n this.updateVal(bounds.data, 'startx', _startx, Math.min);\n this.updateVal(bounds.data, 'starty', _starty, Math.min);\n this.updateVal(bounds.data, 'stopx', _stopx, Math.max);\n this.updateVal(bounds.data, 'stopy', _stopy, Math.max);\n\n this.updateBounds(_startx, _starty, _stopx, _stopy);\n },\n bumpVerticalPos: function (bump) {\n this.verticalPos = this.verticalPos + bump;\n this.data.stopy = this.verticalPos;\n },\n getVerticalPos: function () {\n return this.verticalPos;\n },\n getBounds: function () {\n return this.data;\n },\n};\n\nconst fills = conf.sectionFills;\nconst textColours = conf.sectionColours;\n\nexport const drawTasks = function (diagram, tasks, verticalPos) {\n const conf = getConfig().journey;\n let lastSection = '';\n const sectionVHeight = conf.height * 2 + conf.diagramMarginY;\n const taskPos = verticalPos + sectionVHeight;\n\n let sectionNumber = 0;\n let fill = '#CCC';\n let colour = 'black';\n let num = 0;\n\n // Draw the tasks\n for (const [i, task] of tasks.entries()) {\n if (lastSection !== task.section) {\n fill = fills[sectionNumber % fills.length];\n num = sectionNumber % fills.length;\n colour = textColours[sectionNumber % textColours.length];\n\n // count how many consecutive tasks have the same section\n let taskInSectionCount = 0;\n const currentSection = task.section;\n for (let taskIndex = i; taskIndex < tasks.length; taskIndex++) {\n if (tasks[taskIndex].section == currentSection) {\n taskInSectionCount = taskInSectionCount + 1;\n } else {\n break;\n }\n }\n\n const section = {\n x: i * conf.taskMargin + i * conf.width + leftMargin,\n y: 50,\n text: task.section,\n fill,\n num,\n colour,\n taskCount: taskInSectionCount,\n };\n\n svgDraw.drawSection(diagram, section, conf);\n lastSection = task.section;\n sectionNumber++;\n }\n\n // Collect the actors involved in the task\n const taskActors = task.people.reduce((acc, actorName) => {\n if (actors[actorName]) {\n acc[actorName] = actors[actorName];\n }\n\n return acc;\n }, {});\n\n // Add some rendering data to the object\n task.x = i * conf.taskMargin + i * conf.width + leftMargin;\n task.y = taskPos;\n task.width = conf.diagramMarginX;\n task.height = conf.diagramMarginY;\n task.colour = colour;\n task.fill = fill;\n task.num = num;\n task.actors = taskActors;\n\n // Draw the box with the attached line\n svgDraw.drawTask(diagram, task, conf);\n bounds.insert(task.x, task.y, task.x + task.width + conf.taskMargin, 300 + 5 * 30); // stopY is the length of the descenders.\n }\n};\n\nexport default {\n setConf,\n draw,\n};\n", "import { arc as d3arc } from 'd3';\nimport * as svgDrawCommon from '../common/svgDrawCommon.js';\n\nexport const drawRect = function (elem, rectData) {\n return svgDrawCommon.drawRect(elem, rectData);\n};\n\nexport const drawFace = function (element, faceData) {\n const radius = 15;\n const circleElement = element\n .append('circle')\n .attr('cx', faceData.cx)\n .attr('cy', faceData.cy)\n .attr('class', 'face')\n .attr('r', radius)\n .attr('stroke-width', 2)\n .attr('overflow', 'visible');\n\n const face = element.append('g');\n\n //left eye\n face\n .append('circle')\n .attr('cx', faceData.cx - radius / 3)\n .attr('cy', faceData.cy - radius / 3)\n .attr('r', 1.5)\n .attr('stroke-width', 2)\n .attr('fill', '#666')\n .attr('stroke', '#666');\n\n //right eye\n face\n .append('circle')\n .attr('cx', faceData.cx + radius / 3)\n .attr('cy', faceData.cy - radius / 3)\n .attr('r', 1.5)\n .attr('stroke-width', 2)\n .attr('fill', '#666')\n .attr('stroke', '#666');\n\n /** @param {any} face */\n function smile(face) {\n const arc = d3arc()\n .startAngle(Math.PI / 2)\n .endAngle(3 * (Math.PI / 2))\n .innerRadius(radius / 2)\n .outerRadius(radius / 2.2);\n //mouth\n face\n .append('path')\n .attr('class', 'mouth')\n .attr('d', arc)\n .attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 2) + ')');\n }\n\n /** @param {any} face */\n function sad(face) {\n const arc = d3arc()\n .startAngle((3 * Math.PI) / 2)\n .endAngle(5 * (Math.PI / 2))\n .innerRadius(radius / 2)\n .outerRadius(radius / 2.2);\n //mouth\n face\n .append('path')\n .attr('class', 'mouth')\n .attr('d', arc)\n .attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 7) + ')');\n }\n\n /** @param {any} face */\n function ambivalent(face) {\n face\n .append('line')\n .attr('class', 'mouth')\n .attr('stroke', 2)\n .attr('x1', faceData.cx - 5)\n .attr('y1', faceData.cy + 7)\n .attr('x2', faceData.cx + 5)\n .attr('y2', faceData.cy + 7)\n .attr('class', 'mouth')\n .attr('stroke-width', '1px')\n .attr('stroke', '#666');\n }\n\n if (faceData.score > 3) {\n smile(face);\n } else if (faceData.score < 3) {\n sad(face);\n } else {\n ambivalent(face);\n }\n\n return circleElement;\n};\n\nexport const drawCircle = function (element, circleData) {\n const circleElement = element.append('circle');\n circleElement.attr('cx', circleData.cx);\n circleElement.attr('cy', circleData.cy);\n circleElement.attr('class', 'actor-' + circleData.pos);\n circleElement.attr('fill', circleData.fill);\n circleElement.attr('stroke', circleData.stroke);\n circleElement.attr('r', circleData.r);\n\n if (circleElement.class !== undefined) {\n circleElement.attr('class', circleElement.class);\n }\n\n if (circleData.title !== undefined) {\n circleElement.append('title').text(circleData.title);\n }\n\n return circleElement;\n};\n\nexport const drawText = function (elem, textData) {\n return svgDrawCommon.drawText(elem, textData);\n};\n\nexport const drawLabel = function (elem, txtObject) {\n /**\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} cut\n */\n function genPoints(x, y, width, height, cut) {\n return (\n x +\n ',' +\n y +\n ' ' +\n (x + width) +\n ',' +\n y +\n ' ' +\n (x + width) +\n ',' +\n (y + height - cut) +\n ' ' +\n (x + width - cut * 1.2) +\n ',' +\n (y + height) +\n ' ' +\n x +\n ',' +\n (y + height)\n );\n }\n const polygon = elem.append('polygon');\n polygon.attr('points', genPoints(txtObject.x, txtObject.y, 50, 20, 7));\n polygon.attr('class', 'labelBox');\n\n txtObject.y = txtObject.y + txtObject.labelMargin;\n txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin;\n drawText(elem, txtObject);\n};\n\nexport const drawSection = function (elem, section, conf) {\n const g = elem.append('g');\n\n const rect = svgDrawCommon.getNoteRect();\n rect.x = section.x;\n rect.y = section.y;\n rect.fill = section.fill;\n // section width covers all nested tasks\n rect.width =\n conf.width * section.taskCount + // width of the tasks\n conf.diagramMarginX * (section.taskCount - 1); // width of space between tasks\n rect.height = conf.height;\n rect.class = 'journey-section section-type-' + section.num;\n rect.rx = 3;\n rect.ry = 3;\n drawRect(g, rect);\n\n _drawTextCandidateFunc(conf)(\n section.text,\n g,\n rect.x,\n rect.y,\n rect.width,\n rect.height,\n { class: 'journey-section section-type-' + section.num },\n conf,\n section.colour\n );\n};\n\nlet taskCount = -1;\n/**\n * Draws an actor in the diagram with the attached line\n *\n * @param {any} elem The HTML element\n * @param {any} task The task to render\n * @param {any} conf The global configuration\n */\nexport const drawTask = function (elem, task, conf) {\n const center = task.x + conf.width / 2;\n const g = elem.append('g');\n taskCount++;\n const maxHeight = 300 + 5 * 30;\n g.append('line')\n .attr('id', 'task' + taskCount)\n .attr('x1', center)\n .attr('y1', task.y)\n .attr('x2', center)\n .attr('y2', maxHeight)\n .attr('class', 'task-line')\n .attr('stroke-width', '1px')\n .attr('stroke-dasharray', '4 2')\n .attr('stroke', '#666');\n\n drawFace(g, {\n cx: center,\n cy: 300 + (5 - task.score) * 30,\n score: task.score,\n });\n\n const rect = svgDrawCommon.getNoteRect();\n rect.x = task.x;\n rect.y = task.y;\n rect.fill = task.fill;\n rect.width = conf.width;\n rect.height = conf.height;\n rect.class = 'task task-type-' + task.num;\n rect.rx = 3;\n rect.ry = 3;\n drawRect(g, rect);\n\n let xPos = task.x + 14;\n task.people.forEach((person) => {\n const colour = task.actors[person].color;\n\n const circle = {\n cx: xPos,\n cy: task.y,\n r: 7,\n fill: colour,\n stroke: '#000',\n title: person,\n pos: task.actors[person].position,\n };\n\n drawCircle(g, circle);\n xPos += 10;\n });\n\n _drawTextCandidateFunc(conf)(\n task.task,\n g,\n rect.x,\n rect.y,\n rect.width,\n rect.height,\n { class: 'task' },\n conf,\n task.colour\n );\n};\n\n/**\n * Draws a background rectangle\n *\n * @param {any} elem The html element\n * @param {any} bounds The bounds of the drawing\n */\nexport const drawBackgroundRect = function (elem, bounds) {\n svgDrawCommon.drawBackgroundRect(elem, bounds);\n};\n\nconst _drawTextCandidateFunc = (function () {\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} colour\n */\n function byText(content, g, x, y, width, height, textAttrs, colour) {\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y + height / 2 + 5)\n .style('font-color', colour)\n .style('text-anchor', 'middle')\n .text(content);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n * @param {any} colour\n */\n function byTspan(content, g, x, y, width, height, textAttrs, conf, colour) {\n const { taskFontSize, taskFontFamily } = conf;\n\n const lines = content.split(//gi);\n for (let i = 0; i < lines.length; i++) {\n const dy = i * taskFontSize - (taskFontSize * (lines.length - 1)) / 2;\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y)\n .attr('fill', colour)\n .style('text-anchor', 'middle')\n .style('font-size', taskFontSize)\n .style('font-family', taskFontFamily);\n text\n .append('tspan')\n .attr('x', x + width / 2)\n .attr('dy', dy)\n .text(lines[i]);\n\n text\n .attr('y', y + height / 2.0)\n .attr('dominant-baseline', 'central')\n .attr('alignment-baseline', 'central');\n\n _setTextAttrs(text, textAttrs);\n }\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n */\n function byFo(content, g, x, y, width, height, textAttrs, conf) {\n const body = g.append('switch');\n const f = body\n .append('foreignObject')\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height)\n .attr('position', 'fixed');\n\n const text = f\n .append('xhtml:div')\n .style('display', 'table')\n .style('height', '100%')\n .style('width', '100%');\n\n text\n .append('div')\n .attr('class', 'label')\n .style('display', 'table-cell')\n .style('text-align', 'center')\n .style('vertical-align', 'middle')\n .text(content);\n\n byTspan(content, body, x, y, width, height, textAttrs, conf);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} toText\n * @param {any} fromTextAttrsDict\n */\n function _setTextAttrs(toText, fromTextAttrsDict) {\n for (const key in fromTextAttrsDict) {\n if (key in fromTextAttrsDict) {\n // noinspection JSUnfilteredForInLoop\n toText.attr(key, fromTextAttrsDict[key]);\n }\n }\n }\n\n return function (conf) {\n return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;\n };\n})();\n\nconst initGraphics = function (graphics) {\n graphics\n .append('defs')\n .append('marker')\n .attr('id', 'arrowhead')\n .attr('refX', 5)\n .attr('refY', 2)\n .attr('markerWidth', 6)\n .attr('markerHeight', 4)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0,0 V 4 L6,2 Z'); // this is actual shape for arrowhead\n};\n\nexport default {\n drawRect,\n drawCircle,\n drawSection,\n drawText,\n drawLabel,\n drawTask,\n drawBackgroundRect,\n initGraphics,\n};\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: JISON doesn't support types\nimport parser from './parser/journey.jison';\nimport db from './journeyDb.js';\nimport styles from './styles.js';\nimport renderer from './journeyRenderer.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles,\n init: (cnf) => {\n renderer.setConf(cnf.journey);\n db.clear();\n },\n};\n"], + "mappings": "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", + "names": ["o", "parser", "lexer", "clear", "drawRect", "face", "drawText", "conf", "drawBackgroundRect", "bounds", "diagram", "conf", "tasks", "currentSection"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/kanban-definition-3W4ZIXB7.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/kanban-definition-3W4ZIXB7.mjs new file mode 100644 index 0000000..ca3b005 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/kanban-definition-3W4ZIXB7.mjs @@ -0,0 +1,1127 @@ +import { + selectSvgElement +} from "./chunk-EXTU4WIE.mjs"; +import { + getIconStyles +} from "./chunk-FMBD7UC4.mjs"; +import { + JSON_SCHEMA, + load +} from "./chunk-MI3HLSF2.mjs"; +import { + insertCluster, + insertNode, + positionNode +} from "./chunk-JZLCHNYA.mjs"; +import "./chunk-CVBHYZKI.mjs"; +import "./chunk-ATLVNIR6.mjs"; +import "./chunk-JA3XYJ7Z.mjs"; +import "./chunk-S3R3BYOJ.mjs"; +import { + defaultConfig_default, + getConfig2 as getConfig, + sanitizeText, + setupGraphViewbox +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/kanban/parser/kanban.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 4], $V1 = [1, 13], $V2 = [1, 12], $V3 = [1, 15], $V4 = [1, 16], $V5 = [1, 20], $V6 = [1, 19], $V7 = [6, 7, 8], $V8 = [1, 26], $V9 = [1, 24], $Va = [1, 25], $Vb = [6, 7, 11], $Vc = [1, 31], $Vd = [6, 7, 11, 24], $Ve = [1, 6, 13, 16, 17, 20, 23], $Vf = [1, 35], $Vg = [1, 36], $Vh = [1, 6, 7, 11, 13, 16, 17, 20, 23], $Vi = [1, 38]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "mindMap": 4, "spaceLines": 5, "SPACELINE": 6, "NL": 7, "KANBAN": 8, "document": 9, "stop": 10, "EOF": 11, "statement": 12, "SPACELIST": 13, "node": 14, "shapeData": 15, "ICON": 16, "CLASS": 17, "nodeWithId": 18, "nodeWithoutId": 19, "NODE_DSTART": 20, "NODE_DESCR": 21, "NODE_DEND": 22, "NODE_ID": 23, "SHAPE_DATA": 24, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 6: "SPACELINE", 7: "NL", 8: "KANBAN", 11: "EOF", 13: "SPACELIST", 16: "ICON", 17: "CLASS", 20: "NODE_DSTART", 21: "NODE_DESCR", 22: "NODE_DEND", 23: "NODE_ID", 24: "SHAPE_DATA" }, + productions_: [0, [3, 1], [3, 2], [5, 1], [5, 2], [5, 2], [4, 2], [4, 3], [10, 1], [10, 1], [10, 1], [10, 2], [10, 2], [9, 3], [9, 2], [12, 3], [12, 2], [12, 2], [12, 2], [12, 1], [12, 2], [12, 1], [12, 1], [12, 1], [12, 1], [14, 1], [14, 1], [19, 3], [18, 1], [18, 4], [15, 2], [15, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 6: + case 7: + return yy; + break; + case 8: + yy.getLogger().trace("Stop NL "); + break; + case 9: + yy.getLogger().trace("Stop EOF "); + break; + case 11: + yy.getLogger().trace("Stop NL2 "); + break; + case 12: + yy.getLogger().trace("Stop EOF2 "); + break; + case 15: + yy.getLogger().info("Node: ", $$[$0 - 1].id); + yy.addNode($$[$0 - 2].length, $$[$0 - 1].id, $$[$0 - 1].descr, $$[$0 - 1].type, $$[$0]); + break; + case 16: + yy.getLogger().info("Node: ", $$[$0].id); + yy.addNode($$[$0 - 1].length, $$[$0].id, $$[$0].descr, $$[$0].type); + break; + case 17: + yy.getLogger().trace("Icon: ", $$[$0]); + yy.decorateNode({ icon: $$[$0] }); + break; + case 18: + case 23: + yy.decorateNode({ class: $$[$0] }); + break; + case 19: + yy.getLogger().trace("SPACELIST"); + break; + case 20: + yy.getLogger().trace("Node: ", $$[$0 - 1].id); + yy.addNode(0, $$[$0 - 1].id, $$[$0 - 1].descr, $$[$0 - 1].type, $$[$0]); + break; + case 21: + yy.getLogger().trace("Node: ", $$[$0].id); + yy.addNode(0, $$[$0].id, $$[$0].descr, $$[$0].type); + break; + case 22: + yy.decorateNode({ icon: $$[$0] }); + break; + case 27: + yy.getLogger().trace("node found ..", $$[$0 - 2]); + this.$ = { id: $$[$0 - 1], descr: $$[$0 - 1], type: yy.getType($$[$0 - 2], $$[$0]) }; + break; + case 28: + this.$ = { id: $$[$0], descr: $$[$0], type: 0 }; + break; + case 29: + yy.getLogger().trace("node found ..", $$[$0 - 3]); + this.$ = { id: $$[$0 - 3], descr: $$[$0 - 1], type: yy.getType($$[$0 - 2], $$[$0]) }; + break; + case 30: + this.$ = $$[$0 - 1] + $$[$0]; + break; + case 31: + this.$ = $$[$0]; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: 2, 5: 3, 6: [1, 5], 8: $V0 }, { 1: [3] }, { 1: [2, 1] }, { 4: 6, 6: [1, 7], 7: [1, 8], 8: $V0 }, { 6: $V1, 7: [1, 10], 9: 9, 12: 11, 13: $V2, 14: 14, 16: $V3, 17: $V4, 18: 17, 19: 18, 20: $V5, 23: $V6 }, o($V7, [2, 3]), { 1: [2, 2] }, o($V7, [2, 4]), o($V7, [2, 5]), { 1: [2, 6], 6: $V1, 12: 21, 13: $V2, 14: 14, 16: $V3, 17: $V4, 18: 17, 19: 18, 20: $V5, 23: $V6 }, { 6: $V1, 9: 22, 12: 11, 13: $V2, 14: 14, 16: $V3, 17: $V4, 18: 17, 19: 18, 20: $V5, 23: $V6 }, { 6: $V8, 7: $V9, 10: 23, 11: $Va }, o($Vb, [2, 24], { 18: 17, 19: 18, 14: 27, 16: [1, 28], 17: [1, 29], 20: $V5, 23: $V6 }), o($Vb, [2, 19]), o($Vb, [2, 21], { 15: 30, 24: $Vc }), o($Vb, [2, 22]), o($Vb, [2, 23]), o($Vd, [2, 25]), o($Vd, [2, 26]), o($Vd, [2, 28], { 20: [1, 32] }), { 21: [1, 33] }, { 6: $V8, 7: $V9, 10: 34, 11: $Va }, { 1: [2, 7], 6: $V1, 12: 21, 13: $V2, 14: 14, 16: $V3, 17: $V4, 18: 17, 19: 18, 20: $V5, 23: $V6 }, o($Ve, [2, 14], { 7: $Vf, 11: $Vg }), o($Vh, [2, 8]), o($Vh, [2, 9]), o($Vh, [2, 10]), o($Vb, [2, 16], { 15: 37, 24: $Vc }), o($Vb, [2, 17]), o($Vb, [2, 18]), o($Vb, [2, 20], { 24: $Vi }), o($Vd, [2, 31]), { 21: [1, 39] }, { 22: [1, 40] }, o($Ve, [2, 13], { 7: $Vf, 11: $Vg }), o($Vh, [2, 11]), o($Vh, [2, 12]), o($Vb, [2, 15], { 24: $Vi }), o($Vd, [2, 30]), { 22: [1, 41] }, o($Vd, [2, 27]), o($Vd, [2, 29])], + defaultActions: { 2: [2, 1], 6: [2, 2] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + this.pushState("shapeData"); + yy_.yytext = ""; + return 24; + break; + case 1: + this.pushState("shapeDataStr"); + return 24; + break; + case 2: + this.popState(); + return 24; + break; + case 3: + const re = /\n\s*/g; + yy_.yytext = yy_.yytext.replace(re, "
"); + return 24; + break; + case 4: + return 24; + break; + case 5: + this.popState(); + break; + case 6: + yy.getLogger().trace("Found comment", yy_.yytext); + return 6; + break; + case 7: + return 8; + break; + case 8: + this.begin("CLASS"); + break; + case 9: + this.popState(); + return 17; + break; + case 10: + this.popState(); + break; + case 11: + yy.getLogger().trace("Begin icon"); + this.begin("ICON"); + break; + case 12: + yy.getLogger().trace("SPACELINE"); + return 6; + break; + case 13: + return 7; + break; + case 14: + return 16; + break; + case 15: + yy.getLogger().trace("end icon"); + this.popState(); + break; + case 16: + yy.getLogger().trace("Exploding node"); + this.begin("NODE"); + return 20; + break; + case 17: + yy.getLogger().trace("Cloud"); + this.begin("NODE"); + return 20; + break; + case 18: + yy.getLogger().trace("Explosion Bang"); + this.begin("NODE"); + return 20; + break; + case 19: + yy.getLogger().trace("Cloud Bang"); + this.begin("NODE"); + return 20; + break; + case 20: + this.begin("NODE"); + return 20; + break; + case 21: + this.begin("NODE"); + return 20; + break; + case 22: + this.begin("NODE"); + return 20; + break; + case 23: + this.begin("NODE"); + return 20; + break; + case 24: + return 13; + break; + case 25: + return 23; + break; + case 26: + return 11; + break; + case 27: + this.begin("NSTR2"); + break; + case 28: + return "NODE_DESCR"; + break; + case 29: + this.popState(); + break; + case 30: + yy.getLogger().trace("Starting NSTR"); + this.begin("NSTR"); + break; + case 31: + yy.getLogger().trace("description:", yy_.yytext); + return "NODE_DESCR"; + break; + case 32: + this.popState(); + break; + case 33: + this.popState(); + yy.getLogger().trace("node end ))"); + return "NODE_DEND"; + break; + case 34: + this.popState(); + yy.getLogger().trace("node end )"); + return "NODE_DEND"; + break; + case 35: + this.popState(); + yy.getLogger().trace("node end ...", yy_.yytext); + return "NODE_DEND"; + break; + case 36: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + break; + case 37: + this.popState(); + yy.getLogger().trace("node end (-"); + return "NODE_DEND"; + break; + case 38: + this.popState(); + yy.getLogger().trace("node end (-"); + return "NODE_DEND"; + break; + case 39: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + break; + case 40: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + break; + case 41: + yy.getLogger().trace("Long description:", yy_.yytext); + return 21; + break; + case 42: + yy.getLogger().trace("Long description:", yy_.yytext); + return 21; + break; + } + }, "anonymous"), + rules: [/^(?:@\{)/i, /^(?:["])/i, /^(?:["])/i, /^(?:[^\"]+)/i, /^(?:[^}^"]+)/i, /^(?:\})/i, /^(?:\s*%%.*)/i, /^(?:kanban\b)/i, /^(?::::)/i, /^(?:.+)/i, /^(?:\n)/i, /^(?:::icon\()/i, /^(?:[\s]+[\n])/i, /^(?:[\n]+)/i, /^(?:[^\)]+)/i, /^(?:\))/i, /^(?:-\))/i, /^(?:\(-)/i, /^(?:\)\))/i, /^(?:\))/i, /^(?:\(\()/i, /^(?:\{\{)/i, /^(?:\()/i, /^(?:\[)/i, /^(?:[\s]+)/i, /^(?:[^\(\[\n\)\{\}@]+)/i, /^(?:$)/i, /^(?:["][`])/i, /^(?:[^`"]+)/i, /^(?:[`]["])/i, /^(?:["])/i, /^(?:[^"]+)/i, /^(?:["])/i, /^(?:[\)]\))/i, /^(?:[\)])/i, /^(?:[\]])/i, /^(?:\}\})/i, /^(?:\(-)/i, /^(?:-\))/i, /^(?:\(\()/i, /^(?:\()/i, /^(?:[^\)\]\(\}]+)/i, /^(?:.+(?!\(\())/i], + conditions: { "shapeDataEndBracket": { "rules": [], "inclusive": false }, "shapeDataStr": { "rules": [2, 3], "inclusive": false }, "shapeData": { "rules": [1, 4, 5], "inclusive": false }, "CLASS": { "rules": [9, 10], "inclusive": false }, "ICON": { "rules": [14, 15], "inclusive": false }, "NSTR2": { "rules": [28, 29], "inclusive": false }, "NSTR": { "rules": [31, 32], "inclusive": false }, "NODE": { "rules": [27, 30, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "inclusive": false }, "INITIAL": { "rules": [0, 6, 7, 8, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var kanban_default = parser; + +// src/diagrams/kanban/kanbanDb.ts +var nodes = []; +var sections = []; +var cnt = 0; +var elements = {}; +var clear = /* @__PURE__ */ __name(() => { + nodes = []; + sections = []; + cnt = 0; + elements = {}; +}, "clear"); +var getSection = /* @__PURE__ */ __name((level) => { + if (nodes.length === 0) { + return null; + } + const sectionLevel = nodes[0].level; + let lastSection = null; + for (let i = nodes.length - 1; i >= 0; i--) { + if (nodes[i].level === sectionLevel && !lastSection) { + lastSection = nodes[i]; + } + if (nodes[i].level < sectionLevel) { + throw new Error('Items without section detected, found section ("' + nodes[i].label + '")'); + } + } + if (level === lastSection?.level) { + return null; + } + return lastSection; +}, "getSection"); +var getSections = /* @__PURE__ */ __name(function() { + return sections; +}, "getSections"); +var getData = /* @__PURE__ */ __name(function() { + const edges = []; + const _nodes = []; + const sections2 = getSections(); + const conf = getConfig(); + for (const section of sections2) { + const node = { + id: section.id, + label: sanitizeText(section.label ?? "", conf), + isGroup: true, + ticket: section.ticket, + shape: "kanbanSection", + level: section.level, + look: conf.look + }; + _nodes.push(node); + const children = nodes.filter((n) => n.parentId === section.id); + for (const item of children) { + const childNode = { + id: item.id, + parentId: section.id, + label: sanitizeText(item.label ?? "", conf), + isGroup: false, + ticket: item?.ticket, + priority: item?.priority, + assigned: item?.assigned, + icon: item?.icon, + shape: "kanbanItem", + level: item.level, + rx: 5, + ry: 5, + cssStyles: ["text-align: left"] + }; + _nodes.push(childNode); + } + } + return { nodes: _nodes, edges, other: {}, config: getConfig() }; +}, "getData"); +var addNode = /* @__PURE__ */ __name((level, id, descr, type, shapeData) => { + const conf = getConfig(); + let padding = conf.mindmap?.padding ?? defaultConfig_default.mindmap.padding; + switch (type) { + case nodeType.ROUNDED_RECT: + case nodeType.RECT: + case nodeType.HEXAGON: + padding *= 2; + } + const node = { + id: sanitizeText(id, conf) || "kbn" + cnt++, + level, + label: sanitizeText(descr, conf), + width: conf.mindmap?.maxNodeWidth ?? defaultConfig_default.mindmap.maxNodeWidth, + padding, + isGroup: false + }; + if (shapeData !== void 0) { + let yamlData; + if (!shapeData.includes("\n")) { + yamlData = "{\n" + shapeData + "\n}"; + } else { + yamlData = shapeData + "\n"; + } + const doc = load(yamlData, { schema: JSON_SCHEMA }); + if (doc.shape && (doc.shape !== doc.shape.toLowerCase() || doc.shape.includes("_"))) { + throw new Error(`No such shape: ${doc.shape}. Shape names should be lowercase.`); + } + if (doc?.shape && doc.shape === "kanbanItem") { + node.shape = doc?.shape; + } + if (doc?.label) { + node.label = doc?.label; + } + if (doc?.icon) { + node.icon = doc?.icon.toString(); + } + if (doc?.assigned) { + node.assigned = doc?.assigned.toString(); + } + if (doc?.ticket) { + node.ticket = doc?.ticket.toString(); + } + if (doc?.priority) { + node.priority = doc?.priority; + } + } + const section = getSection(level); + if (section) { + node.parentId = section.id || "kbn" + cnt++; + } else { + sections.push(node); + } + nodes.push(node); +}, "addNode"); +var nodeType = { + DEFAULT: 0, + NO_BORDER: 0, + ROUNDED_RECT: 1, + RECT: 2, + CIRCLE: 3, + CLOUD: 4, + BANG: 5, + HEXAGON: 6 +}; +var getType = /* @__PURE__ */ __name((startStr, endStr) => { + log.debug("In get type", startStr, endStr); + switch (startStr) { + case "[": + return nodeType.RECT; + case "(": + return endStr === ")" ? nodeType.ROUNDED_RECT : nodeType.CLOUD; + case "((": + return nodeType.CIRCLE; + case ")": + return nodeType.CLOUD; + case "))": + return nodeType.BANG; + case "{{": + return nodeType.HEXAGON; + default: + return nodeType.DEFAULT; + } +}, "getType"); +var setElementForId = /* @__PURE__ */ __name((id, element) => { + elements[id] = element; +}, "setElementForId"); +var decorateNode = /* @__PURE__ */ __name((decoration) => { + if (!decoration) { + return; + } + const config = getConfig(); + const node = nodes[nodes.length - 1]; + if (decoration.icon) { + node.icon = sanitizeText(decoration.icon, config); + } + if (decoration.class) { + node.cssClasses = sanitizeText(decoration.class, config); + } +}, "decorateNode"); +var type2Str = /* @__PURE__ */ __name((type) => { + switch (type) { + case nodeType.DEFAULT: + return "no-border"; + case nodeType.RECT: + return "rect"; + case nodeType.ROUNDED_RECT: + return "rounded-rect"; + case nodeType.CIRCLE: + return "circle"; + case nodeType.CLOUD: + return "cloud"; + case nodeType.BANG: + return "bang"; + case nodeType.HEXAGON: + return "hexgon"; + // cspell: disable-line + default: + return "no-border"; + } +}, "type2Str"); +var getLogger = /* @__PURE__ */ __name(() => log, "getLogger"); +var getElementById = /* @__PURE__ */ __name((id) => elements[id], "getElementById"); +var db = { + clear, + addNode, + getSections, + getData, + nodeType, + getType, + setElementForId, + decorateNode, + type2Str, + getLogger, + getElementById +}; +var kanbanDb_default = db; + +// src/diagrams/kanban/kanbanRenderer.ts +var draw = /* @__PURE__ */ __name(async (text, id, _version, diagObj) => { + log.debug("Rendering kanban diagram\n" + text); + const db2 = diagObj.db; + const data4Layout = db2.getData(); + const conf = getConfig(); + conf.htmlLabels = false; + const svg = selectSvgElement(id); + const sectionsElem = svg.append("g"); + sectionsElem.attr("class", "sections"); + const nodesElem = svg.append("g"); + nodesElem.attr("class", "items"); + const sections2 = data4Layout.nodes.filter( + // TODO: TypeScript 5.5 will infer this predicate automatically + (node) => node.isGroup + ); + let cnt2 = 0; + const padding = 10; + const sectionObjects = []; + let maxLabelHeight = 25; + for (const section of sections2) { + const WIDTH = conf?.kanban?.sectionWidth || 200; + cnt2 = cnt2 + 1; + section.x = WIDTH * cnt2 + (cnt2 - 1) * padding / 2; + section.width = WIDTH; + section.y = 0; + section.height = WIDTH * 3; + section.rx = 5; + section.ry = 5; + section.cssClasses = section.cssClasses + " section-" + cnt2; + const sectionObj = await insertCluster(sectionsElem, section); + maxLabelHeight = Math.max(maxLabelHeight, sectionObj?.labelBBox?.height); + sectionObjects.push(sectionObj); + } + let i = 0; + for (const section of sections2) { + const sectionObj = sectionObjects[i]; + i = i + 1; + const WIDTH = conf?.kanban?.sectionWidth || 200; + const top = -WIDTH * 3 / 2 + maxLabelHeight; + let y = top; + const sectionItems = data4Layout.nodes.filter((node) => node.parentId === section.id); + for (const item of sectionItems) { + if (item.isGroup) { + throw new Error("Groups within groups are not allowed in Kanban diagrams"); + } + item.x = section.x; + item.width = WIDTH - 1.5 * padding; + const nodeEl = await insertNode(nodesElem, item, { config: conf }); + const bbox = nodeEl.node().getBBox(); + item.y = y + bbox.height / 2; + await positionNode(item); + y = item.y + bbox.height / 2 + padding / 2; + } + const rect = sectionObj.cluster.select("rect"); + const height = Math.max(y - top + 3 * padding, 50) + (maxLabelHeight - 25); + rect.attr("height", height); + } + setupGraphViewbox( + void 0, + svg, + conf.mindmap?.padding ?? defaultConfig_default.kanban.padding, + conf.mindmap?.useMaxWidth ?? defaultConfig_default.kanban.useMaxWidth + ); +}, "draw"); +var kanbanRenderer_default = { + draw +}; + +// src/diagrams/kanban/styles.ts +import { darken, lighten, isDark } from "khroma"; +var genSections = /* @__PURE__ */ __name((options) => { + let sections2 = ""; + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + options["lineColor" + i] = options["lineColor" + i] || options["cScaleInv" + i]; + if (isDark(options["lineColor" + i])) { + options["lineColor" + i] = lighten(options["lineColor" + i], 20); + } else { + options["lineColor" + i] = darken(options["lineColor" + i], 20); + } + } + const adjuster = /* @__PURE__ */ __name((color, level) => options.darkMode ? darken(color, level) : lighten(color, level), "adjuster"); + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + const sw = "" + (17 - 3 * i); + sections2 += ` + .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${i - 1} polygon, .section-${i - 1} path { + fill: ${adjuster(options["cScale" + i], 10)}; + stroke: ${adjuster(options["cScale" + i], 10)}; + + } + .section-${i - 1} text { + fill: ${options["cScaleLabel" + i]}; + } + .node-icon-${i - 1} { + font-size: 40px; + color: ${options["cScaleLabel" + i]}; + } + .section-edge-${i - 1}{ + stroke: ${options["cScale" + i]}; + } + .edge-depth-${i - 1}{ + stroke-width: ${sw}; + } + .section-${i - 1} line { + stroke: ${options["cScaleInv" + i]} ; + stroke-width: 3; + } + + .disabled, .disabled circle, .disabled text { + fill: lightgray; + } + .disabled text { + fill: #efefef; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${options.background}; + stroke: ${options.nodeBorder}; + stroke-width: 1px; + } + + .kanban-ticket-link { + fill: ${options.background}; + stroke: ${options.nodeBorder}; + text-decoration: underline; + } + `; + } + return sections2; +}, "genSections"); +var getStyles = /* @__PURE__ */ __name((options) => ` + .edge { + stroke-width: 3; + } + ${genSections(options)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${options.git0}; + } + .section-root text { + fill: ${options.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .cluster-label, .label { + color: ${options.textColor}; + fill: ${options.textColor}; + } + .kanban-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } + ${getIconStyles()} +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/kanban/kanban-definition.ts +var diagram = { + db: kanbanDb_default, + renderer: kanbanRenderer_default, + parser: kanban_default, + styles: styles_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/kanban-definition-3W4ZIXB7.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/kanban-definition-3W4ZIXB7.mjs.map new file mode 100644 index 0000000..2666433 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/kanban-definition-3W4ZIXB7.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/kanban/parser/kanban.jison", "../../../src/diagrams/kanban/kanbanDb.ts", "../../../src/diagrams/kanban/kanbanRenderer.ts", "../../../src/diagrams/kanban/styles.ts", "../../../src/diagrams/kanban/kanban-definition.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,4],$V1=[1,13],$V2=[1,12],$V3=[1,15],$V4=[1,16],$V5=[1,20],$V6=[1,19],$V7=[6,7,8],$V8=[1,26],$V9=[1,24],$Va=[1,25],$Vb=[6,7,11],$Vc=[1,31],$Vd=[6,7,11,24],$Ve=[1,6,13,16,17,20,23],$Vf=[1,35],$Vg=[1,36],$Vh=[1,6,7,11,13,16,17,20,23],$Vi=[1,38];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"mindMap\":4,\"spaceLines\":5,\"SPACELINE\":6,\"NL\":7,\"KANBAN\":8,\"document\":9,\"stop\":10,\"EOF\":11,\"statement\":12,\"SPACELIST\":13,\"node\":14,\"shapeData\":15,\"ICON\":16,\"CLASS\":17,\"nodeWithId\":18,\"nodeWithoutId\":19,\"NODE_DSTART\":20,\"NODE_DESCR\":21,\"NODE_DEND\":22,\"NODE_ID\":23,\"SHAPE_DATA\":24,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",6:\"SPACELINE\",7:\"NL\",8:\"KANBAN\",11:\"EOF\",13:\"SPACELIST\",16:\"ICON\",17:\"CLASS\",20:\"NODE_DSTART\",21:\"NODE_DESCR\",22:\"NODE_DEND\",23:\"NODE_ID\",24:\"SHAPE_DATA\"},\nproductions_: [0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 6: case 7:\n return yy; \nbreak;\ncase 8:\nyy.getLogger().trace('Stop NL ');\nbreak;\ncase 9:\nyy.getLogger().trace('Stop EOF ');\nbreak;\ncase 11:\nyy.getLogger().trace('Stop NL2 ');\nbreak;\ncase 12:\nyy.getLogger().trace('Stop EOF2 ');\nbreak;\ncase 15:\n yy.getLogger().info('Node: ',$$[$0-1].id);yy.addNode($$[$0-2].length, $$[$0-1].id, $$[$0-1].descr, $$[$0-1].type, $$[$0]); \nbreak;\ncase 16:\n yy.getLogger().info('Node: ',$$[$0].id);yy.addNode($$[$0-1].length, $$[$0].id, $$[$0].descr, $$[$0].type); \nbreak;\ncase 17:\n yy.getLogger().trace('Icon: ',$$[$0]);yy.decorateNode({icon: $$[$0]}); \nbreak;\ncase 18: case 23:\n yy.decorateNode({class: $$[$0]}); \nbreak;\ncase 19:\n yy.getLogger().trace('SPACELIST');\nbreak;\ncase 20:\n yy.getLogger().trace('Node: ',$$[$0-1].id);yy.addNode(0, $$[$0-1].id, $$[$0-1].descr, $$[$0-1].type, $$[$0]); \nbreak;\ncase 21:\n yy.getLogger().trace('Node: ',$$[$0].id);yy.addNode(0, $$[$0].id, $$[$0].descr, $$[$0].type); \nbreak;\ncase 22:\n yy.decorateNode({icon: $$[$0]}); \nbreak;\ncase 27:\n yy.getLogger().trace(\"node found ..\", $$[$0-2]); this.$ = { id: $$[$0-1], descr: $$[$0-1], type: yy.getType($$[$0-2], $$[$0]) }; \nbreak;\ncase 28:\n this.$ = { id: $$[$0], descr: $$[$0], type: 0 }; \nbreak;\ncase 29:\n yy.getLogger().trace(\"node found ..\", $$[$0-3]); this.$ = { id: $$[$0-3], descr: $$[$0-1], type: yy.getType($$[$0-2], $$[$0]) }; \nbreak;\ncase 30:\n this.$ = $$[$0-1] + $$[$0]; \nbreak;\ncase 31:\n this.$ = $$[$0]; \nbreak;\n}\n},\ntable: [{3:1,4:2,5:3,6:[1,5],8:$V0},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:$V0},{6:$V1,7:[1,10],9:9,12:11,13:$V2,14:14,16:$V3,17:$V4,18:17,19:18,20:$V5,23:$V6},o($V7,[2,3]),{1:[2,2]},o($V7,[2,4]),o($V7,[2,5]),{1:[2,6],6:$V1,12:21,13:$V2,14:14,16:$V3,17:$V4,18:17,19:18,20:$V5,23:$V6},{6:$V1,9:22,12:11,13:$V2,14:14,16:$V3,17:$V4,18:17,19:18,20:$V5,23:$V6},{6:$V8,7:$V9,10:23,11:$Va},o($Vb,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:$V5,23:$V6}),o($Vb,[2,19]),o($Vb,[2,21],{15:30,24:$Vc}),o($Vb,[2,22]),o($Vb,[2,23]),o($Vd,[2,25]),o($Vd,[2,26]),o($Vd,[2,28],{20:[1,32]}),{21:[1,33]},{6:$V8,7:$V9,10:34,11:$Va},{1:[2,7],6:$V1,12:21,13:$V2,14:14,16:$V3,17:$V4,18:17,19:18,20:$V5,23:$V6},o($Ve,[2,14],{7:$Vf,11:$Vg}),o($Vh,[2,8]),o($Vh,[2,9]),o($Vh,[2,10]),o($Vb,[2,16],{15:37,24:$Vc}),o($Vb,[2,17]),o($Vb,[2,18]),o($Vb,[2,20],{24:$Vi}),o($Vd,[2,31]),{21:[1,39]},{22:[1,40]},o($Ve,[2,13],{7:$Vf,11:$Vg}),o($Vh,[2,11]),o($Vh,[2,12]),o($Vb,[2,15],{24:$Vi}),o($Vd,[2,30]),{22:[1,41]},o($Vd,[2,27]),o($Vd,[2,29])],\ndefaultActions: {2:[2,1],6:[2,2]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\n\t// Pre-lexer code can go here\n\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:\n // console.log('=> shapeData', yy_.yytext);\n this.pushState(\"shapeData\"); yy_.yytext=\"\"; return 24 \nbreak;\ncase 1:\n // console.log('=> shapeDataStr', yy_.yytext);\n this.pushState(\"shapeDataStr\");\n return 24;\n \nbreak;\ncase 2:\n // console.log('shapeData <==', yy_.yytext);\n this.popState(); return 24\nbreak;\ncase 3:\n // console.log('shapeData', yy_.yytext);\n const re = /\\n\\s*/g;\n yy_.yytext = yy_.yytext.replace(re,\"
\");\n return 24\nbreak;\ncase 4:\n // console.log('shapeData', yy_.yytext);\n return 24;\n \nbreak;\ncase 5:\n // console.log('<== root', yy_.yytext)\n this.popState();\n \nbreak;\ncase 6:yy.getLogger().trace('Found comment',yy_.yytext); return 6;\nbreak;\ncase 7:return 8;\nbreak;\ncase 8: this.begin('CLASS'); \nbreak;\ncase 9: this.popState();return 17; \nbreak;\ncase 10: this.popState();\nbreak;\ncase 11: yy.getLogger().trace('Begin icon');this.begin('ICON'); \nbreak;\ncase 12:yy.getLogger().trace('SPACELINE');return 6 /* skip all whitespace */ ;\nbreak;\ncase 13:return 7;\nbreak;\ncase 14: return 16; \nbreak;\ncase 15:yy.getLogger().trace('end icon');this.popState();\nbreak;\ncase 16: yy.getLogger().trace('Exploding node'); this.begin('NODE');return 20; \nbreak;\ncase 17: yy.getLogger().trace('Cloud'); this.begin('NODE');return 20; \nbreak;\ncase 18: yy.getLogger().trace('Explosion Bang'); this.begin('NODE');return 20; \nbreak;\ncase 19: yy.getLogger().trace('Cloud Bang'); this.begin('NODE');return 20; \nbreak;\ncase 20: this.begin('NODE');return 20; \nbreak;\ncase 21: this.begin('NODE');return 20; \nbreak;\ncase 22: this.begin('NODE');return 20; \nbreak;\ncase 23: this.begin('NODE');return 20; \nbreak;\ncase 24:return 13 /* skip all whitespace */ ;\nbreak;\ncase 25:return 23;\nbreak;\ncase 26:return 11;\nbreak;\ncase 27: this.begin(\"NSTR2\");\nbreak;\ncase 28: return \"NODE_DESCR\";\nbreak;\ncase 29: this.popState();\nbreak;\ncase 30: yy.getLogger().trace('Starting NSTR');this.begin(\"NSTR\");\nbreak;\ncase 31: yy.getLogger().trace('description:', yy_.yytext); return \"NODE_DESCR\";\nbreak;\ncase 32:this.popState();\nbreak;\ncase 33:this.popState();yy.getLogger().trace('node end ))');return \"NODE_DEND\";\nbreak;\ncase 34:this.popState();yy.getLogger().trace('node end )');return \"NODE_DEND\";\nbreak;\ncase 35:this.popState();yy.getLogger().trace('node end ...',yy_.yytext);return \"NODE_DEND\";\nbreak;\ncase 36:this.popState();yy.getLogger().trace('node end ((');return \"NODE_DEND\";\nbreak;\ncase 37:this.popState();yy.getLogger().trace('node end (-');return \"NODE_DEND\";\nbreak;\ncase 38:this.popState();yy.getLogger().trace('node end (-');return \"NODE_DEND\";\nbreak;\ncase 39:this.popState();yy.getLogger().trace('node end ((');return \"NODE_DEND\";\nbreak;\ncase 40:this.popState();yy.getLogger().trace('node end ((');return \"NODE_DEND\";\nbreak;\ncase 41: yy.getLogger().trace('Long description:', yy_.yytext); return 21;\nbreak;\ncase 42: yy.getLogger().trace('Long description:', yy_.yytext); return 21;\nbreak;\n}\n},\nrules: [/^(?:@\\{)/i,/^(?:[\"])/i,/^(?:[\"])/i,/^(?:[^\\\"]+)/i,/^(?:[^}^\"]+)/i,/^(?:\\})/i,/^(?:\\s*%%.*)/i,/^(?:kanban\\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\\n)/i,/^(?:::icon\\()/i,/^(?:[\\s]+[\\n])/i,/^(?:[\\n]+)/i,/^(?:[^\\)]+)/i,/^(?:\\))/i,/^(?:-\\))/i,/^(?:\\(-)/i,/^(?:\\)\\))/i,/^(?:\\))/i,/^(?:\\(\\()/i,/^(?:\\{\\{)/i,/^(?:\\()/i,/^(?:\\[)/i,/^(?:[\\s]+)/i,/^(?:[^\\(\\[\\n\\)\\{\\}@]+)/i,/^(?:$)/i,/^(?:[\"][`])/i,/^(?:[^`\"]+)/i,/^(?:[`][\"])/i,/^(?:[\"])/i,/^(?:[^\"]+)/i,/^(?:[\"])/i,/^(?:[\\)]\\))/i,/^(?:[\\)])/i,/^(?:[\\]])/i,/^(?:\\}\\})/i,/^(?:\\(-)/i,/^(?:-\\))/i,/^(?:\\(\\()/i,/^(?:\\()/i,/^(?:[^\\)\\]\\(\\}]+)/i,/^(?:.+(?!\\(\\())/i],\nconditions: {\"shapeDataEndBracket\":{\"rules\":[],\"inclusive\":false},\"shapeDataStr\":{\"rules\":[2,3],\"inclusive\":false},\"shapeData\":{\"rules\":[1,4,5],\"inclusive\":false},\"CLASS\":{\"rules\":[9,10],\"inclusive\":false},\"ICON\":{\"rules\":[14,15],\"inclusive\":false},\"NSTR2\":{\"rules\":[28,29],\"inclusive\":false},\"NSTR\":{\"rules\":[31,32],\"inclusive\":false},\"NODE\":{\"rules\":[27,30,33,34,35,36,37,38,39,40,41,42],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,6,7,8,11,12,13,16,17,18,19,20,21,22,23,24,25,26],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport type { D3Element } from '../../types.js';\nimport { sanitizeText } from '../../diagrams/common/common.js';\nimport { log } from '../../logger.js';\nimport type { Edge, KanbanNode } from '../../rendering-util/types.js';\nimport defaultConfig from '../../defaultConfig.js';\nimport type { NodeMetaData } from '../../types.js';\nimport * as yaml from 'js-yaml';\n\nlet nodes: KanbanNode[] = [];\nlet sections: KanbanNode[] = [];\nlet cnt = 0;\nlet elements: Record = {};\n\nconst clear = () => {\n nodes = [];\n sections = [];\n cnt = 0;\n elements = {};\n};\n/*\n * if your level is the section level return null - then you do not belong to a level\n * otherwise return the current section\n */\nconst getSection = (level: number) => {\n if (nodes.length === 0) {\n // console.log('No nodes');\n return null;\n }\n const sectionLevel = nodes[0].level;\n let lastSection = null;\n for (let i = nodes.length - 1; i >= 0; i--) {\n if (nodes[i].level === sectionLevel && !lastSection) {\n lastSection = nodes[i];\n // console.log('lastSection found', lastSection);\n }\n // console.log('HERE', nodes[i].id, level, nodes[i].level, sectionLevel);\n if (nodes[i].level < sectionLevel) {\n throw new Error('Items without section detected, found section (\"' + nodes[i].label + '\")');\n }\n }\n if (level === lastSection?.level) {\n return null;\n }\n\n // No found\n return lastSection;\n};\n\nconst getSections = function () {\n return sections;\n};\n\nconst getData = function () {\n const edges = [] as Edge[];\n const _nodes: KanbanNode[] = [];\n\n const sections = getSections();\n const conf = getConfig();\n\n for (const section of sections) {\n const node = {\n id: section.id,\n label: sanitizeText(section.label ?? '', conf),\n isGroup: true,\n ticket: section.ticket,\n shape: 'kanbanSection',\n level: section.level,\n look: conf.look,\n } satisfies KanbanNode;\n _nodes.push(node);\n const children = nodes.filter((n) => n.parentId === section.id);\n\n for (const item of children) {\n const childNode = {\n id: item.id,\n parentId: section.id,\n label: sanitizeText(item.label ?? '', conf),\n isGroup: false,\n ticket: item?.ticket,\n priority: item?.priority,\n assigned: item?.assigned,\n icon: item?.icon,\n shape: 'kanbanItem',\n level: item.level,\n rx: 5,\n ry: 5,\n cssStyles: ['text-align: left'],\n } satisfies KanbanNode;\n _nodes.push(childNode);\n }\n }\n\n return { nodes: _nodes, edges, other: {}, config: getConfig() };\n};\n\nconst addNode = (level: number, id: string, descr: string, type: number, shapeData: string) => {\n const conf = getConfig();\n let padding: number = conf.mindmap?.padding ?? defaultConfig.mindmap.padding;\n switch (type) {\n case nodeType.ROUNDED_RECT:\n case nodeType.RECT:\n case nodeType.HEXAGON:\n padding *= 2;\n }\n\n const node: KanbanNode = {\n id: sanitizeText(id, conf) || 'kbn' + cnt++,\n level,\n label: sanitizeText(descr, conf),\n width: conf.mindmap?.maxNodeWidth ?? defaultConfig.mindmap.maxNodeWidth,\n padding,\n isGroup: false,\n } satisfies KanbanNode;\n\n if (shapeData !== undefined) {\n let yamlData;\n // detect if shapeData contains a newline character\n // console.log('shapeData', shapeData);\n if (!shapeData.includes('\\n')) {\n // console.log('yamlData shapeData has no new lines', shapeData);\n yamlData = '{\\n' + shapeData + '\\n}';\n } else {\n // console.log('yamlData shapeData has new lines', shapeData);\n yamlData = shapeData + '\\n';\n }\n const doc = yaml.load(yamlData, { schema: yaml.JSON_SCHEMA }) as NodeMetaData;\n // console.log('yamlData', doc);\n if (doc.shape && (doc.shape !== doc.shape.toLowerCase() || doc.shape.includes('_'))) {\n throw new Error(`No such shape: ${doc.shape}. Shape names should be lowercase.`);\n }\n\n // if shape is defined in the yaml data, use it if it is a valid shape kanbanItem\n if (doc?.shape && doc.shape === 'kanbanItem') {\n node.shape = doc?.shape;\n }\n if (doc?.label) {\n node.label = doc?.label;\n }\n if (doc?.icon) {\n node.icon = doc?.icon.toString();\n }\n if (doc?.assigned) {\n node.assigned = doc?.assigned.toString();\n }\n if (doc?.ticket) {\n node.ticket = doc?.ticket.toString();\n }\n\n if (doc?.priority) {\n node.priority = doc?.priority;\n }\n }\n\n const section = getSection(level);\n if (section) {\n // @ts-ignore false positive for section.id\n node.parentId = section.id || 'kbn' + cnt++;\n } else {\n sections.push(node);\n }\n nodes.push(node);\n};\n\nconst nodeType = {\n DEFAULT: 0,\n NO_BORDER: 0,\n ROUNDED_RECT: 1,\n RECT: 2,\n CIRCLE: 3,\n CLOUD: 4,\n BANG: 5,\n HEXAGON: 6,\n};\n\nconst getType = (startStr: string, endStr: string): number => {\n log.debug('In get type', startStr, endStr);\n switch (startStr) {\n case '[':\n return nodeType.RECT;\n case '(':\n return endStr === ')' ? nodeType.ROUNDED_RECT : nodeType.CLOUD;\n case '((':\n return nodeType.CIRCLE;\n case ')':\n return nodeType.CLOUD;\n case '))':\n return nodeType.BANG;\n case '{{':\n return nodeType.HEXAGON;\n default:\n return nodeType.DEFAULT;\n }\n};\n\nconst setElementForId = (id: number, element: D3Element) => {\n elements[id] = element;\n};\n\nconst decorateNode = (decoration?: { class?: string; icon?: string }) => {\n if (!decoration) {\n return;\n }\n const config = getConfig();\n const node = nodes[nodes.length - 1];\n if (decoration.icon) {\n node.icon = sanitizeText(decoration.icon, config);\n }\n if (decoration.class) {\n node.cssClasses = sanitizeText(decoration.class, config);\n }\n};\n\nconst type2Str = (type: number) => {\n switch (type) {\n case nodeType.DEFAULT:\n return 'no-border';\n case nodeType.RECT:\n return 'rect';\n case nodeType.ROUNDED_RECT:\n return 'rounded-rect';\n case nodeType.CIRCLE:\n return 'circle';\n case nodeType.CLOUD:\n return 'cloud';\n case nodeType.BANG:\n return 'bang';\n case nodeType.HEXAGON:\n return 'hexgon'; // cspell: disable-line\n default:\n return 'no-border';\n }\n};\n\n// Expose logger to grammar\nconst getLogger = () => log;\nconst getElementById = (id: number) => elements[id];\n\nconst db = {\n clear,\n addNode,\n getSections,\n getData,\n nodeType,\n getType,\n setElementForId,\n decorateNode,\n type2Str,\n getLogger,\n getElementById,\n} as const;\n\nexport default db;\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport type { DrawDefinition } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { selectSvgElement } from '../../rendering-util/selectSvgElement.js';\nimport { setupGraphViewbox } from '../../setupGraphViewbox.js';\nimport type { KanbanDB } from './kanbanTypes.js';\nimport defaultConfig from '../../defaultConfig.js';\nimport { insertCluster } from '../../rendering-util/rendering-elements/clusters.js';\nimport { insertNode, positionNode } from '../../rendering-util/rendering-elements/nodes.js';\nimport type { ClusterNode } from '../../rendering-util/types.js';\n\nexport const draw: DrawDefinition = async (text, id, _version, diagObj) => {\n log.debug('Rendering kanban diagram\\n' + text);\n\n const db = diagObj.db as KanbanDB;\n const data4Layout = db.getData();\n\n const conf = getConfig();\n conf.htmlLabels = false;\n\n const svg = selectSvgElement(id);\n\n // Draw the graph and start with drawing the nodes without proper position\n // this gives us the size of the nodes and we can set the positions later\n\n const sectionsElem = svg.append('g');\n sectionsElem.attr('class', 'sections');\n const nodesElem = svg.append('g');\n nodesElem.attr('class', 'items');\n const sections = data4Layout.nodes.filter(\n // TODO: TypeScript 5.5 will infer this predicate automatically\n (node): node is typeof node & ClusterNode => node.isGroup\n );\n let cnt = 0;\n // TODO set padding\n const padding = 10;\n\n const sectionObjects = [];\n let maxLabelHeight = 25;\n for (const section of sections) {\n const WIDTH = conf?.kanban?.sectionWidth || 200;\n // const top = (-WIDTH * 3) / 2 + 25;\n // let y = top;\n cnt = cnt + 1;\n section.x = WIDTH * cnt + ((cnt - 1) * padding) / 2;\n section.width = WIDTH;\n section.y = 0;\n section.height = WIDTH * 3;\n section.rx = 5;\n section.ry = 5;\n\n // Todo, use theme variable THEME_COLOR_LIMIT instead of 10\n section.cssClasses = section.cssClasses + ' section-' + cnt;\n const sectionObj = await insertCluster(sectionsElem, section);\n maxLabelHeight = Math.max(maxLabelHeight, sectionObj?.labelBBox?.height);\n sectionObjects.push(sectionObj);\n }\n let i = 0;\n for (const section of sections) {\n const sectionObj = sectionObjects[i];\n i = i + 1;\n const WIDTH = conf?.kanban?.sectionWidth || 200;\n const top = (-WIDTH * 3) / 2 + maxLabelHeight;\n let y = top;\n const sectionItems = data4Layout.nodes.filter((node) => node.parentId === section.id);\n for (const item of sectionItems) {\n if (item.isGroup) {\n // Kanban diagrams should not have groups within groups\n // this should never happen\n throw new Error('Groups within groups are not allowed in Kanban diagrams');\n }\n item.x = section.x;\n item.width = WIDTH - 1.5 * padding;\n const nodeEl = await insertNode(nodesElem, item, { config: conf });\n const bbox = nodeEl.node()!.getBBox();\n item.y = y + bbox.height / 2;\n await positionNode(item);\n y = item.y + bbox.height / 2 + padding / 2;\n }\n const rect = sectionObj.cluster.select('rect');\n const height = Math.max(y - top + 3 * padding, 50) + (maxLabelHeight - 25);\n rect.attr('height', height);\n }\n\n // Setup the view box and size of the svg element\n setupGraphViewbox(\n undefined,\n svg,\n conf.mindmap?.padding ?? defaultConfig.kanban.padding,\n conf.mindmap?.useMaxWidth ?? defaultConfig.kanban.useMaxWidth\n );\n};\n\nexport default {\n draw,\n};\n", "// @ts-expect-error Incorrect khroma types\nimport { darken, lighten, isDark } from 'khroma';\nimport type { DiagramStylesProvider } from '../../diagram-api/types.js';\nimport { getIconStyles } from '../globalStyles.js';\n\nconst genSections: DiagramStylesProvider = (options) => {\n let sections = '';\n\n for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) {\n options['lineColor' + i] = options['lineColor' + i] || options['cScaleInv' + i];\n if (isDark(options['lineColor' + i])) {\n options['lineColor' + i] = lighten(options['lineColor' + i], 20);\n } else {\n options['lineColor' + i] = darken(options['lineColor' + i], 20);\n }\n }\n\n const adjuster = (color: string, level: number) =>\n options.darkMode ? darken(color, level) : lighten(color, level);\n\n for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) {\n const sw = '' + (17 - 3 * i);\n sections += `\n .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${\n i - 1\n } polygon, .section-${i - 1} path {\n fill: ${adjuster(options['cScale' + i], 10)};\n stroke: ${adjuster(options['cScale' + i], 10)};\n\n }\n .section-${i - 1} text {\n fill: ${options['cScaleLabel' + i]};\n }\n .node-icon-${i - 1} {\n font-size: 40px;\n color: ${options['cScaleLabel' + i]};\n }\n .section-edge-${i - 1}{\n stroke: ${options['cScale' + i]};\n }\n .edge-depth-${i - 1}{\n stroke-width: ${sw};\n }\n .section-${i - 1} line {\n stroke: ${options['cScaleInv' + i]} ;\n stroke-width: 3;\n }\n\n .disabled, .disabled circle, .disabled text {\n fill: lightgray;\n }\n .disabled text {\n fill: #efefef;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${options.background};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n }\n\n .kanban-ticket-link {\n fill: ${options.background};\n stroke: ${options.nodeBorder};\n text-decoration: underline;\n }\n `;\n }\n return sections;\n};\n\n// TODO: These options seem incorrect.\nconst getStyles: DiagramStylesProvider = (options) =>\n `\n .edge {\n stroke-width: 3;\n }\n ${genSections(options)}\n .section-root rect, .section-root path, .section-root circle, .section-root polygon {\n fill: ${options.git0};\n }\n .section-root text {\n fill: ${options.gitBranchLabel0};\n }\n .icon-container {\n height:100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n .edge {\n fill: none;\n }\n .cluster-label, .label {\n color: ${options.textColor};\n fill: ${options.textColor};\n }\n .kanban-label {\n dy: 1em;\n alignment-baseline: middle;\n text-anchor: middle;\n dominant-baseline: middle;\n text-align: center;\n }\n ${getIconStyles()}\n`;\nexport default getStyles;\n", "// @ts-ignore: JISON doesn't support types\nimport parser from './parser/kanban.jison';\nimport db from './kanbanDb.js';\nimport renderer from './kanbanRenderer.js';\nimport styles from './styles.js';\nimport type { DiagramDefinition } from '../../diagram-api/types.js';\n\nexport const diagram: DiagramDefinition = {\n db,\n renderer,\n parser,\n styles,\n};\n"], + "mappings": "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,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,GAAE,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,GAAE,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC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", + "names": ["o", "parser", "lexer", "sections", "db", "sections", "cnt", "sections"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/mindmap-definition-VGOIOE7T.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/mindmap-definition-VGOIOE7T.mjs new file mode 100644 index 0000000..5fd152f --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/mindmap-definition-VGOIOE7T.mjs @@ -0,0 +1,1168 @@ +import { + getDiagramElement +} from "./chunk-55IACEB6.mjs"; +import { + setupViewPortForSVG +} from "./chunk-QN33PNHL.mjs"; +import { + getRegisteredLayoutAlgorithm, + render +} from "./chunk-N4CR4FBY.mjs"; +import "./chunk-QXUST7PY.mjs"; +import "./chunk-HN2XXSSU.mjs"; +import "./chunk-JZLCHNYA.mjs"; +import "./chunk-CVBHYZKI.mjs"; +import "./chunk-ATLVNIR6.mjs"; +import "./chunk-JA3XYJ7Z.mjs"; +import "./chunk-S3R3BYOJ.mjs"; +import { + defaultConfig_default, + getConfig2 as getConfig, + getUserDefinedConfig, + sanitizeText +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/mindmap/parser/mindmap.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 4], $V1 = [1, 13], $V2 = [1, 12], $V3 = [1, 15], $V4 = [1, 16], $V5 = [1, 20], $V6 = [1, 19], $V7 = [6, 7, 8], $V8 = [1, 26], $V9 = [1, 24], $Va = [1, 25], $Vb = [6, 7, 11], $Vc = [1, 6, 13, 15, 16, 19, 22], $Vd = [1, 33], $Ve = [1, 34], $Vf = [1, 6, 7, 11, 13, 15, 16, 19, 22]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "mindMap": 4, "spaceLines": 5, "SPACELINE": 6, "NL": 7, "MINDMAP": 8, "document": 9, "stop": 10, "EOF": 11, "statement": 12, "SPACELIST": 13, "node": 14, "ICON": 15, "CLASS": 16, "nodeWithId": 17, "nodeWithoutId": 18, "NODE_DSTART": 19, "NODE_DESCR": 20, "NODE_DEND": 21, "NODE_ID": 22, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 6: "SPACELINE", 7: "NL", 8: "MINDMAP", 11: "EOF", 13: "SPACELIST", 15: "ICON", 16: "CLASS", 19: "NODE_DSTART", 20: "NODE_DESCR", 21: "NODE_DEND", 22: "NODE_ID" }, + productions_: [0, [3, 1], [3, 2], [5, 1], [5, 2], [5, 2], [4, 2], [4, 3], [10, 1], [10, 1], [10, 1], [10, 2], [10, 2], [9, 3], [9, 2], [12, 2], [12, 2], [12, 2], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [14, 1], [14, 1], [18, 3], [17, 1], [17, 4]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 6: + case 7: + return yy; + break; + case 8: + yy.getLogger().trace("Stop NL "); + break; + case 9: + yy.getLogger().trace("Stop EOF "); + break; + case 11: + yy.getLogger().trace("Stop NL2 "); + break; + case 12: + yy.getLogger().trace("Stop EOF2 "); + break; + case 15: + yy.getLogger().info("Node: ", $$[$0].id); + yy.addNode($$[$0 - 1].length, $$[$0].id, $$[$0].descr, $$[$0].type); + break; + case 16: + yy.getLogger().trace("Icon: ", $$[$0]); + yy.decorateNode({ icon: $$[$0] }); + break; + case 17: + case 21: + yy.decorateNode({ class: $$[$0] }); + break; + case 18: + yy.getLogger().trace("SPACELIST"); + break; + case 19: + yy.getLogger().trace("Node: ", $$[$0].id); + yy.addNode(0, $$[$0].id, $$[$0].descr, $$[$0].type); + break; + case 20: + yy.decorateNode({ icon: $$[$0] }); + break; + case 25: + yy.getLogger().trace("node found ..", $$[$0 - 2]); + this.$ = { id: $$[$0 - 1], descr: $$[$0 - 1], type: yy.getType($$[$0 - 2], $$[$0]) }; + break; + case 26: + this.$ = { id: $$[$0], descr: $$[$0], type: yy.nodeType.DEFAULT }; + break; + case 27: + yy.getLogger().trace("node found ..", $$[$0 - 3]); + this.$ = { id: $$[$0 - 3], descr: $$[$0 - 1], type: yy.getType($$[$0 - 2], $$[$0]) }; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: 2, 5: 3, 6: [1, 5], 8: $V0 }, { 1: [3] }, { 1: [2, 1] }, { 4: 6, 6: [1, 7], 7: [1, 8], 8: $V0 }, { 6: $V1, 7: [1, 10], 9: 9, 12: 11, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, o($V7, [2, 3]), { 1: [2, 2] }, o($V7, [2, 4]), o($V7, [2, 5]), { 1: [2, 6], 6: $V1, 12: 21, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, { 6: $V1, 9: 22, 12: 11, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, { 6: $V8, 7: $V9, 10: 23, 11: $Va }, o($Vb, [2, 22], { 17: 17, 18: 18, 14: 27, 15: [1, 28], 16: [1, 29], 19: $V5, 22: $V6 }), o($Vb, [2, 18]), o($Vb, [2, 19]), o($Vb, [2, 20]), o($Vb, [2, 21]), o($Vb, [2, 23]), o($Vb, [2, 24]), o($Vb, [2, 26], { 19: [1, 30] }), { 20: [1, 31] }, { 6: $V8, 7: $V9, 10: 32, 11: $Va }, { 1: [2, 7], 6: $V1, 12: 21, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, o($Vc, [2, 14], { 7: $Vd, 11: $Ve }), o($Vf, [2, 8]), o($Vf, [2, 9]), o($Vf, [2, 10]), o($Vb, [2, 15]), o($Vb, [2, 16]), o($Vb, [2, 17]), { 20: [1, 35] }, { 21: [1, 36] }, o($Vc, [2, 13], { 7: $Vd, 11: $Ve }), o($Vf, [2, 11]), o($Vf, [2, 12]), { 21: [1, 37] }, o($Vb, [2, 25]), o($Vb, [2, 27])], + defaultActions: { 2: [2, 1], 6: [2, 2] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + yy.getLogger().trace("Found comment", yy_.yytext); + return 6; + break; + case 1: + return 8; + break; + case 2: + this.begin("CLASS"); + break; + case 3: + this.popState(); + return 16; + break; + case 4: + this.popState(); + break; + case 5: + yy.getLogger().trace("Begin icon"); + this.begin("ICON"); + break; + case 6: + yy.getLogger().trace("SPACELINE"); + return 6; + break; + case 7: + return 7; + break; + case 8: + return 15; + break; + case 9: + yy.getLogger().trace("end icon"); + this.popState(); + break; + case 10: + yy.getLogger().trace("Exploding node"); + this.begin("NODE"); + return 19; + break; + case 11: + yy.getLogger().trace("Cloud"); + this.begin("NODE"); + return 19; + break; + case 12: + yy.getLogger().trace("Explosion Bang"); + this.begin("NODE"); + return 19; + break; + case 13: + yy.getLogger().trace("Cloud Bang"); + this.begin("NODE"); + return 19; + break; + case 14: + this.begin("NODE"); + return 19; + break; + case 15: + this.begin("NODE"); + return 19; + break; + case 16: + this.begin("NODE"); + return 19; + break; + case 17: + this.begin("NODE"); + return 19; + break; + case 18: + return 13; + break; + case 19: + return 22; + break; + case 20: + return 11; + break; + case 21: + this.begin("NSTR2"); + break; + case 22: + return "NODE_DESCR"; + break; + case 23: + this.popState(); + break; + case 24: + yy.getLogger().trace("Starting NSTR"); + this.begin("NSTR"); + break; + case 25: + yy.getLogger().trace("description:", yy_.yytext); + return "NODE_DESCR"; + break; + case 26: + this.popState(); + break; + case 27: + this.popState(); + yy.getLogger().trace("node end ))"); + return "NODE_DEND"; + break; + case 28: + this.popState(); + yy.getLogger().trace("node end )"); + return "NODE_DEND"; + break; + case 29: + this.popState(); + yy.getLogger().trace("node end ...", yy_.yytext); + return "NODE_DEND"; + break; + case 30: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + break; + case 31: + this.popState(); + yy.getLogger().trace("node end (-"); + return "NODE_DEND"; + break; + case 32: + this.popState(); + yy.getLogger().trace("node end (-"); + return "NODE_DEND"; + break; + case 33: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + break; + case 34: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + break; + case 35: + yy.getLogger().trace("Long description:", yy_.yytext); + return 20; + break; + case 36: + yy.getLogger().trace("Long description:", yy_.yytext); + return 20; + break; + } + }, "anonymous"), + rules: [/^(?:\s*%%.*)/i, /^(?:mindmap\b)/i, /^(?::::)/i, /^(?:.+)/i, /^(?:\n)/i, /^(?:::icon\()/i, /^(?:[\s]+[\n])/i, /^(?:[\n]+)/i, /^(?:[^\)]+)/i, /^(?:\))/i, /^(?:-\))/i, /^(?:\(-)/i, /^(?:\)\))/i, /^(?:\))/i, /^(?:\(\()/i, /^(?:\{\{)/i, /^(?:\()/i, /^(?:\[)/i, /^(?:[\s]+)/i, /^(?:[^\(\[\n\)\{\}]+)/i, /^(?:$)/i, /^(?:["][`])/i, /^(?:[^`"]+)/i, /^(?:[`]["])/i, /^(?:["])/i, /^(?:[^"]+)/i, /^(?:["])/i, /^(?:[\)]\))/i, /^(?:[\)])/i, /^(?:[\]])/i, /^(?:\}\})/i, /^(?:\(-)/i, /^(?:-\))/i, /^(?:\(\()/i, /^(?:\()/i, /^(?:[^\)\]\(\}]+)/i, /^(?:.+(?!\(\())/i], + conditions: { "CLASS": { "rules": [3, 4], "inclusive": false }, "ICON": { "rules": [8, 9], "inclusive": false }, "NSTR2": { "rules": [22, 23], "inclusive": false }, "NSTR": { "rules": [25, 26], "inclusive": false }, "NODE": { "rules": [21, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var mindmap_default = parser; + +// src/diagrams/mindmap/mindmapDb.ts +import { v4 } from "uuid"; +var nodeType = { + DEFAULT: 0, + NO_BORDER: 0, + ROUNDED_RECT: 1, + RECT: 2, + CIRCLE: 3, + CLOUD: 4, + BANG: 5, + HEXAGON: 6 +}; +var MindmapDB = class { + constructor() { + this.nodes = []; + this.count = 0; + this.elements = {}; + this.getLogger = this.getLogger.bind(this); + this.nodeType = nodeType; + this.clear(); + this.getType = this.getType.bind(this); + this.getElementById = this.getElementById.bind(this); + this.getParent = this.getParent.bind(this); + this.getMindmap = this.getMindmap.bind(this); + this.addNode = this.addNode.bind(this); + this.decorateNode = this.decorateNode.bind(this); + } + static { + __name(this, "MindmapDB"); + } + clear() { + this.nodes = []; + this.count = 0; + this.elements = {}; + this.baseLevel = void 0; + } + getParent(level) { + for (let i = this.nodes.length - 1; i >= 0; i--) { + if (this.nodes[i].level < level) { + return this.nodes[i]; + } + } + return null; + } + getMindmap() { + return this.nodes.length > 0 ? this.nodes[0] : null; + } + addNode(level, id, descr, type) { + log.info("addNode", level, id, descr, type); + let isRoot = false; + if (this.nodes.length === 0) { + this.baseLevel = level; + level = 0; + isRoot = true; + } else if (this.baseLevel !== void 0) { + level = level - this.baseLevel; + isRoot = false; + } + const conf = getConfig(); + let padding = conf.mindmap?.padding ?? defaultConfig_default.mindmap.padding; + switch (type) { + case this.nodeType.ROUNDED_RECT: + case this.nodeType.RECT: + case this.nodeType.HEXAGON: + padding *= 2; + break; + } + const node = { + id: this.count++, + nodeId: sanitizeText(id, conf), + level, + descr: sanitizeText(descr, conf), + type, + children: [], + width: conf.mindmap?.maxNodeWidth ?? defaultConfig_default.mindmap.maxNodeWidth, + padding, + isRoot + }; + const parent = this.getParent(level); + if (parent) { + parent.children.push(node); + this.nodes.push(node); + } else { + if (isRoot) { + this.nodes.push(node); + } else { + throw new Error( + `There can be only one root. No parent could be found for ("${node.descr}")` + ); + } + } + } + getType(startStr, endStr) { + log.debug("In get type", startStr, endStr); + switch (startStr) { + case "[": + return this.nodeType.RECT; + case "(": + return endStr === ")" ? this.nodeType.ROUNDED_RECT : this.nodeType.CLOUD; + case "((": + return this.nodeType.CIRCLE; + case ")": + return this.nodeType.CLOUD; + case "))": + return this.nodeType.BANG; + case "{{": + return this.nodeType.HEXAGON; + default: + return this.nodeType.DEFAULT; + } + } + setElementForId(id, element) { + this.elements[id] = element; + } + getElementById(id) { + return this.elements[id]; + } + decorateNode(decoration) { + if (!decoration) { + return; + } + const config = getConfig(); + const node = this.nodes[this.nodes.length - 1]; + if (decoration.icon) { + node.icon = sanitizeText(decoration.icon, config); + } + if (decoration.class) { + node.class = sanitizeText(decoration.class, config); + } + } + type2Str(type) { + switch (type) { + case this.nodeType.DEFAULT: + return "no-border"; + case this.nodeType.RECT: + return "rect"; + case this.nodeType.ROUNDED_RECT: + return "rounded-rect"; + case this.nodeType.CIRCLE: + return "circle"; + case this.nodeType.CLOUD: + return "cloud"; + case this.nodeType.BANG: + return "bang"; + case this.nodeType.HEXAGON: + return "hexgon"; + // cspell: disable-line + default: + return "no-border"; + } + } + /** + * Assign section numbers to nodes based on their position relative to root + * @param node - The mindmap node to process + * @param sectionNumber - The section number to assign (undefined for root) + */ + assignSections(node, sectionNumber) { + if (node.level === 0) { + node.section = void 0; + } else { + node.section = sectionNumber; + } + if (node.children) { + for (const [index, child] of node.children.entries()) { + const childSectionNumber = node.level === 0 ? index : sectionNumber; + this.assignSections(child, childSectionNumber); + } + } + } + /** + * Convert mindmap tree structure to flat array of nodes + * @param node - The mindmap node to process + * @param processedNodes - Array to collect processed nodes + */ + flattenNodes(node, processedNodes) { + const cssClasses = ["mindmap-node"]; + if (node.isRoot === true) { + cssClasses.push("section-root", "section--1"); + } else if (node.section !== void 0) { + cssClasses.push(`section-${node.section}`); + } + if (node.class) { + cssClasses.push(node.class); + } + const classes = cssClasses.join(" "); + const getShapeFromType = /* @__PURE__ */ __name((type) => { + switch (type) { + case nodeType.CIRCLE: + return "mindmapCircle"; + case nodeType.RECT: + return "rect"; + case nodeType.ROUNDED_RECT: + return "rounded"; + case nodeType.CLOUD: + return "cloud"; + case nodeType.BANG: + return "bang"; + case nodeType.HEXAGON: + return "hexagon"; + case nodeType.DEFAULT: + return "defaultMindmapNode"; + case nodeType.NO_BORDER: + default: + return "rect"; + } + }, "getShapeFromType"); + const processedNode = { + id: node.id.toString(), + domId: "node_" + node.id.toString(), + label: node.descr, + isGroup: false, + shape: getShapeFromType(node.type), + width: node.width, + height: node.height ?? 0, + padding: node.padding, + cssClasses: classes, + cssStyles: [], + look: "default", + icon: node.icon, + x: node.x, + y: node.y, + // Mindmap-specific properties + level: node.level, + nodeId: node.nodeId, + type: node.type, + section: node.section + }; + processedNodes.push(processedNode); + if (node.children) { + for (const child of node.children) { + this.flattenNodes(child, processedNodes); + } + } + } + /** + * Generate edges from parent-child relationships in mindmap tree + * @param node - The mindmap node to process + * @param edges - Array to collect edges + */ + generateEdges(node, edges) { + if (!node.children) { + return; + } + for (const child of node.children) { + let edgeClasses = "edge"; + if (child.section !== void 0) { + edgeClasses += ` section-edge-${child.section}`; + } + const edgeDepth = node.level + 1; + edgeClasses += ` edge-depth-${edgeDepth}`; + const edge = { + id: `edge_${node.id}_${child.id}`, + start: node.id.toString(), + end: child.id.toString(), + type: "normal", + curve: "basis", + thickness: "normal", + look: "default", + classes: edgeClasses, + // Store mindmap-specific data + depth: node.level, + section: child.section + }; + edges.push(edge); + this.generateEdges(child, edges); + } + } + /** + * Get structured data for layout algorithms + * Following the pattern established by ER diagrams + * @returns Structured data containing nodes, edges, and config + */ + getData() { + const mindmapRoot = this.getMindmap(); + const config = getConfig(); + const userDefinedConfig = getUserDefinedConfig(); + const hasUserDefinedLayout = userDefinedConfig.layout !== void 0; + const finalConfig = config; + if (!hasUserDefinedLayout) { + finalConfig.layout = "cose-bilkent"; + } + if (!mindmapRoot) { + return { + nodes: [], + edges: [], + config: finalConfig + }; + } + log.debug("getData: mindmapRoot", mindmapRoot, config); + this.assignSections(mindmapRoot); + const processedNodes = []; + const processedEdges = []; + this.flattenNodes(mindmapRoot, processedNodes); + this.generateEdges(mindmapRoot, processedEdges); + log.debug( + `getData: processed ${processedNodes.length} nodes and ${processedEdges.length} edges` + ); + const shapes = /* @__PURE__ */ new Map(); + for (const node of processedNodes) { + shapes.set(node.id, { + shape: node.shape, + width: node.width, + height: node.height, + padding: node.padding + }); + } + return { + nodes: processedNodes, + edges: processedEdges, + config: finalConfig, + // Store the root node for mindmap-specific layout algorithms + rootNode: mindmapRoot, + // Properties required by dagre layout algorithm + markers: ["point"], + // Mindmaps don't use markers + direction: "TB", + // Top-to-bottom direction for mindmaps + nodeSpacing: 50, + // Default spacing between nodes + rankSpacing: 50, + // Default spacing between ranks + // Add shapes for ELK compatibility + shapes: Object.fromEntries(shapes), + // Additional properties that layout algorithms might expect + type: "mindmap", + diagramId: "mindmap-" + v4() + }; + } + // Expose logger to grammar + getLogger() { + return log; + } +}; + +// src/diagrams/mindmap/mindmapRenderer.ts +var draw = /* @__PURE__ */ __name(async (text, id, _version, diagObj) => { + log.debug("Rendering mindmap diagram\n" + text); + const db = diagObj.db; + const data4Layout = db.getData(); + const svg = getDiagramElement(id, data4Layout.config.securityLevel); + data4Layout.type = diagObj.type; + data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(data4Layout.config.layout, { + fallback: "cose-bilkent" + }); + data4Layout.diagramId = id; + const mm = db.getMindmap(); + if (!mm) { + return; + } + data4Layout.nodes.forEach((node) => { + if (node.shape === "rounded") { + node.radius = 15; + node.taper = 15; + node.stroke = "none"; + node.width = 0; + node.padding = 15; + } else if (node.shape === "circle") { + node.padding = 10; + } else if (node.shape === "rect") { + node.width = 0; + node.padding = 10; + } + }); + await render(data4Layout, svg); + setupViewPortForSVG( + svg, + data4Layout.config.mindmap?.padding ?? defaultConfig_default.mindmap.padding, + "mindmapDiagram", + data4Layout.config.mindmap?.useMaxWidth ?? defaultConfig_default.mindmap.useMaxWidth + ); +}, "draw"); +var mindmapRenderer_default = { + draw +}; + +// src/diagrams/mindmap/styles.ts +import { darken, lighten, isDark } from "khroma"; +var genSections = /* @__PURE__ */ __name((options) => { + let sections = ""; + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + options["lineColor" + i] = options["lineColor" + i] || options["cScaleInv" + i]; + if (isDark(options["lineColor" + i])) { + options["lineColor" + i] = lighten(options["lineColor" + i], 20); + } else { + options["lineColor" + i] = darken(options["lineColor" + i], 20); + } + } + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + const sw = "" + (17 - 3 * i); + sections += ` + .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${i - 1} polygon, .section-${i - 1} path { + fill: ${options["cScale" + i]}; + } + .section-${i - 1} text { + fill: ${options["cScaleLabel" + i]}; + } + .node-icon-${i - 1} { + font-size: 40px; + color: ${options["cScaleLabel" + i]}; + } + .section-edge-${i - 1}{ + stroke: ${options["cScale" + i]}; + } + .edge-depth-${i - 1}{ + stroke-width: ${sw}; + } + .section-${i - 1} line { + stroke: ${options["cScaleInv" + i]} ; + stroke-width: 3; + } + + .disabled, .disabled circle, .disabled text { + fill: lightgray; + } + .disabled text { + fill: #efefef; + } + `; + } + return sections; +}, "genSections"); +var getStyles = /* @__PURE__ */ __name((options) => ` + .edge { + stroke-width: 3; + } + ${genSections(options)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${options.git0}; + } + .section-root text { + fill: ${options.gitBranchLabel0}; + } + .section-root span { + color: ${options.gitBranchLabel0}; + } + .section-2 span { + color: ${options.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .mindmap-node-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/mindmap/mindmap-definition.ts +var diagram = { + get db() { + return new MindmapDB(); + }, + renderer: mindmapRenderer_default, + parser: mindmap_default, + styles: styles_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/mindmap-definition-VGOIOE7T.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/mindmap-definition-VGOIOE7T.mjs.map new file mode 100644 index 0000000..bf24ed0 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/mindmap-definition-VGOIOE7T.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/mindmap/parser/mindmap.jison", "../../../src/diagrams/mindmap/mindmapDb.ts", "../../../src/diagrams/mindmap/mindmapRenderer.ts", "../../../src/diagrams/mindmap/styles.ts", "../../../src/diagrams/mindmap/mindmap-definition.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,4],$V1=[1,13],$V2=[1,12],$V3=[1,15],$V4=[1,16],$V5=[1,20],$V6=[1,19],$V7=[6,7,8],$V8=[1,26],$V9=[1,24],$Va=[1,25],$Vb=[6,7,11],$Vc=[1,6,13,15,16,19,22],$Vd=[1,33],$Ve=[1,34],$Vf=[1,6,7,11,13,15,16,19,22];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"mindMap\":4,\"spaceLines\":5,\"SPACELINE\":6,\"NL\":7,\"MINDMAP\":8,\"document\":9,\"stop\":10,\"EOF\":11,\"statement\":12,\"SPACELIST\":13,\"node\":14,\"ICON\":15,\"CLASS\":16,\"nodeWithId\":17,\"nodeWithoutId\":18,\"NODE_DSTART\":19,\"NODE_DESCR\":20,\"NODE_DEND\":21,\"NODE_ID\":22,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",6:\"SPACELINE\",7:\"NL\",8:\"MINDMAP\",11:\"EOF\",13:\"SPACELIST\",15:\"ICON\",16:\"CLASS\",19:\"NODE_DSTART\",20:\"NODE_DESCR\",21:\"NODE_DEND\",22:\"NODE_ID\"},\nproductions_: [0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 6: case 7:\n return yy; \nbreak;\ncase 8:\nyy.getLogger().trace('Stop NL ');\nbreak;\ncase 9:\nyy.getLogger().trace('Stop EOF ');\nbreak;\ncase 11:\nyy.getLogger().trace('Stop NL2 ');\nbreak;\ncase 12:\nyy.getLogger().trace('Stop EOF2 ');\nbreak;\ncase 15:\n yy.getLogger().info('Node: ',$$[$0].id);yy.addNode($$[$0-1].length, $$[$0].id, $$[$0].descr, $$[$0].type); \nbreak;\ncase 16:\n yy.getLogger().trace('Icon: ',$$[$0]);yy.decorateNode({icon: $$[$0]}); \nbreak;\ncase 17: case 21:\n yy.decorateNode({class: $$[$0]}); \nbreak;\ncase 18:\n yy.getLogger().trace('SPACELIST');\nbreak;\ncase 19:\n yy.getLogger().trace('Node: ',$$[$0].id);yy.addNode(0, $$[$0].id, $$[$0].descr, $$[$0].type); \nbreak;\ncase 20:\n yy.decorateNode({icon: $$[$0]}); \nbreak;\ncase 25:\n yy.getLogger().trace(\"node found ..\", $$[$0-2]); this.$ = { id: $$[$0-1], descr: $$[$0-1], type: yy.getType($$[$0-2], $$[$0]) }; \nbreak;\ncase 26:\n this.$ = { id: $$[$0], descr: $$[$0], type: yy.nodeType.DEFAULT }; \nbreak;\ncase 27:\n yy.getLogger().trace(\"node found ..\", $$[$0-3]); this.$ = { id: $$[$0-3], descr: $$[$0-1], type: yy.getType($$[$0-2], $$[$0]) }; \nbreak;\n}\n},\ntable: [{3:1,4:2,5:3,6:[1,5],8:$V0},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:$V0},{6:$V1,7:[1,10],9:9,12:11,13:$V2,14:14,15:$V3,16:$V4,17:17,18:18,19:$V5,22:$V6},o($V7,[2,3]),{1:[2,2]},o($V7,[2,4]),o($V7,[2,5]),{1:[2,6],6:$V1,12:21,13:$V2,14:14,15:$V3,16:$V4,17:17,18:18,19:$V5,22:$V6},{6:$V1,9:22,12:11,13:$V2,14:14,15:$V3,16:$V4,17:17,18:18,19:$V5,22:$V6},{6:$V8,7:$V9,10:23,11:$Va},o($Vb,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:$V5,22:$V6}),o($Vb,[2,18]),o($Vb,[2,19]),o($Vb,[2,20]),o($Vb,[2,21]),o($Vb,[2,23]),o($Vb,[2,24]),o($Vb,[2,26],{19:[1,30]}),{20:[1,31]},{6:$V8,7:$V9,10:32,11:$Va},{1:[2,7],6:$V1,12:21,13:$V2,14:14,15:$V3,16:$V4,17:17,18:18,19:$V5,22:$V6},o($Vc,[2,14],{7:$Vd,11:$Ve}),o($Vf,[2,8]),o($Vf,[2,9]),o($Vf,[2,10]),o($Vb,[2,15]),o($Vb,[2,16]),o($Vb,[2,17]),{20:[1,35]},{21:[1,36]},o($Vc,[2,13],{7:$Vd,11:$Ve}),o($Vf,[2,11]),o($Vf,[2,12]),{21:[1,37]},o($Vb,[2,25]),o($Vb,[2,27])],\ndefaultActions: {2:[2,1],6:[2,2]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\n\t// Pre-lexer code can go here\n\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:yy.getLogger().trace('Found comment',yy_.yytext); return 6;\nbreak;\ncase 1:return 8;\nbreak;\ncase 2: this.begin('CLASS'); \nbreak;\ncase 3: this.popState();return 16; \nbreak;\ncase 4: this.popState();\nbreak;\ncase 5: yy.getLogger().trace('Begin icon');this.begin('ICON'); \nbreak;\ncase 6:yy.getLogger().trace('SPACELINE');return 6 /* skip all whitespace */ ;\nbreak;\ncase 7:return 7;\nbreak;\ncase 8: return 15; \nbreak;\ncase 9:yy.getLogger().trace('end icon');this.popState();\nbreak;\ncase 10: yy.getLogger().trace('Exploding node'); this.begin('NODE');return 19; \nbreak;\ncase 11: yy.getLogger().trace('Cloud'); this.begin('NODE');return 19; \nbreak;\ncase 12: yy.getLogger().trace('Explosion Bang'); this.begin('NODE');return 19; \nbreak;\ncase 13: yy.getLogger().trace('Cloud Bang'); this.begin('NODE');return 19; \nbreak;\ncase 14: this.begin('NODE');return 19; \nbreak;\ncase 15: this.begin('NODE');return 19; \nbreak;\ncase 16: this.begin('NODE');return 19; \nbreak;\ncase 17: this.begin('NODE');return 19; \nbreak;\ncase 18:return 13 /* skip all whitespace */ ;\nbreak;\ncase 19:return 22;\nbreak;\ncase 20:return 11;\nbreak;\ncase 21: this.begin(\"NSTR2\");\nbreak;\ncase 22: return \"NODE_DESCR\";\nbreak;\ncase 23: this.popState();\nbreak;\ncase 24: yy.getLogger().trace('Starting NSTR');this.begin(\"NSTR\");\nbreak;\ncase 25: yy.getLogger().trace('description:', yy_.yytext); return \"NODE_DESCR\";\nbreak;\ncase 26:this.popState();\nbreak;\ncase 27:this.popState();yy.getLogger().trace('node end ))');return \"NODE_DEND\";\nbreak;\ncase 28:this.popState();yy.getLogger().trace('node end )');return \"NODE_DEND\";\nbreak;\ncase 29:this.popState();yy.getLogger().trace('node end ...',yy_.yytext);return \"NODE_DEND\";\nbreak;\ncase 30:this.popState();yy.getLogger().trace('node end ((');return \"NODE_DEND\";\nbreak;\ncase 31:this.popState();yy.getLogger().trace('node end (-');return \"NODE_DEND\";\nbreak;\ncase 32:this.popState();yy.getLogger().trace('node end (-');return \"NODE_DEND\";\nbreak;\ncase 33:this.popState();yy.getLogger().trace('node end ((');return \"NODE_DEND\";\nbreak;\ncase 34:this.popState();yy.getLogger().trace('node end ((');return \"NODE_DEND\";\nbreak;\ncase 35: yy.getLogger().trace('Long description:', yy_.yytext); return 20;\nbreak;\ncase 36: yy.getLogger().trace('Long description:', yy_.yytext); return 20;\nbreak;\n}\n},\nrules: [/^(?:\\s*%%.*)/i,/^(?:mindmap\\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\\n)/i,/^(?:::icon\\()/i,/^(?:[\\s]+[\\n])/i,/^(?:[\\n]+)/i,/^(?:[^\\)]+)/i,/^(?:\\))/i,/^(?:-\\))/i,/^(?:\\(-)/i,/^(?:\\)\\))/i,/^(?:\\))/i,/^(?:\\(\\()/i,/^(?:\\{\\{)/i,/^(?:\\()/i,/^(?:\\[)/i,/^(?:[\\s]+)/i,/^(?:[^\\(\\[\\n\\)\\{\\}]+)/i,/^(?:$)/i,/^(?:[\"][`])/i,/^(?:[^`\"]+)/i,/^(?:[`][\"])/i,/^(?:[\"])/i,/^(?:[^\"]+)/i,/^(?:[\"])/i,/^(?:[\\)]\\))/i,/^(?:[\\)])/i,/^(?:[\\]])/i,/^(?:\\}\\})/i,/^(?:\\(-)/i,/^(?:-\\))/i,/^(?:\\(\\()/i,/^(?:\\()/i,/^(?:[^\\)\\]\\(\\}]+)/i,/^(?:.+(?!\\(\\())/i],\nconditions: {\"CLASS\":{\"rules\":[3,4],\"inclusive\":false},\"ICON\":{\"rules\":[8,9],\"inclusive\":false},\"NSTR2\":{\"rules\":[22,23],\"inclusive\":false},\"NSTR\":{\"rules\":[25,26],\"inclusive\":false},\"NODE\":{\"rules\":[21,24,27,28,29,30,31,32,33,34,35,36],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { v4 } from 'uuid';\nimport type { D3Element } from '../../types.js';\nimport { sanitizeText } from '../../diagrams/common/common.js';\nimport { log } from '../../logger.js';\nimport type { MindmapNode } from './mindmapTypes.js';\nimport defaultConfig from '../../defaultConfig.js';\nimport type { LayoutData, Node, Edge } from '../../rendering-util/types.js';\nimport { getUserDefinedConfig } from '../../config.js';\n\n// Extend Node type for mindmap-specific properties\nexport type MindmapLayoutNode = Node & {\n level: number;\n nodeId: string;\n type: number;\n section?: number;\n};\n\n// Extend Edge type for mindmap-specific properties\nexport type MindmapLayoutEdge = Edge & {\n depth: number;\n section?: number;\n};\n\nconst nodeType = {\n DEFAULT: 0,\n NO_BORDER: 0,\n ROUNDED_RECT: 1,\n RECT: 2,\n CIRCLE: 3,\n CLOUD: 4,\n BANG: 5,\n HEXAGON: 6,\n} as const;\n\nexport class MindmapDB {\n private nodes: MindmapNode[] = [];\n private count = 0;\n private elements: Record = {};\n private baseLevel?: number;\n public readonly nodeType: typeof nodeType;\n\n constructor() {\n this.getLogger = this.getLogger.bind(this);\n this.nodeType = nodeType;\n this.clear();\n this.getType = this.getType.bind(this);\n this.getElementById = this.getElementById.bind(this);\n this.getParent = this.getParent.bind(this);\n this.getMindmap = this.getMindmap.bind(this);\n this.addNode = this.addNode.bind(this);\n this.decorateNode = this.decorateNode.bind(this);\n }\n public clear() {\n this.nodes = [];\n this.count = 0;\n this.elements = {};\n this.baseLevel = undefined;\n }\n\n public getParent(level: number): MindmapNode | null {\n for (let i = this.nodes.length - 1; i >= 0; i--) {\n if (this.nodes[i].level < level) {\n return this.nodes[i];\n }\n }\n return null;\n }\n\n public getMindmap(): MindmapNode | null {\n return this.nodes.length > 0 ? this.nodes[0] : null;\n }\n\n public addNode(level: number, id: string, descr: string, type: number): void {\n log.info('addNode', level, id, descr, type);\n\n let isRoot = false;\n\n if (this.nodes.length === 0) {\n this.baseLevel = level;\n level = 0;\n isRoot = true;\n } else if (this.baseLevel !== undefined) {\n level = level - this.baseLevel;\n isRoot = false;\n }\n\n const conf = getConfig();\n let padding = conf.mindmap?.padding ?? defaultConfig.mindmap.padding;\n\n switch (type) {\n case this.nodeType.ROUNDED_RECT:\n case this.nodeType.RECT:\n case this.nodeType.HEXAGON:\n padding *= 2;\n break;\n }\n\n const node: MindmapNode = {\n id: this.count++,\n nodeId: sanitizeText(id, conf),\n level,\n descr: sanitizeText(descr, conf),\n type,\n children: [],\n width: conf.mindmap?.maxNodeWidth ?? defaultConfig.mindmap.maxNodeWidth,\n padding,\n isRoot,\n };\n\n const parent = this.getParent(level);\n if (parent) {\n parent.children.push(node);\n this.nodes.push(node);\n } else {\n if (isRoot) {\n this.nodes.push(node);\n } else {\n throw new Error(\n `There can be only one root. No parent could be found for (\"${node.descr}\")`\n );\n }\n }\n }\n\n public getType(startStr: string, endStr: string) {\n log.debug('In get type', startStr, endStr);\n switch (startStr) {\n case '[':\n return this.nodeType.RECT;\n case '(':\n return endStr === ')' ? this.nodeType.ROUNDED_RECT : this.nodeType.CLOUD;\n case '((':\n return this.nodeType.CIRCLE;\n case ')':\n return this.nodeType.CLOUD;\n case '))':\n return this.nodeType.BANG;\n case '{{':\n return this.nodeType.HEXAGON;\n default:\n return this.nodeType.DEFAULT;\n }\n }\n\n public setElementForId(id: number, element: D3Element): void {\n this.elements[id] = element;\n }\n public getElementById(id: number) {\n return this.elements[id];\n }\n\n public decorateNode(decoration?: { class?: string; icon?: string }): void {\n if (!decoration) {\n return;\n }\n\n const config = getConfig();\n const node = this.nodes[this.nodes.length - 1];\n if (decoration.icon) {\n node.icon = sanitizeText(decoration.icon, config);\n }\n if (decoration.class) {\n node.class = sanitizeText(decoration.class, config);\n }\n }\n\n type2Str(type: number): string {\n switch (type) {\n case this.nodeType.DEFAULT:\n return 'no-border';\n case this.nodeType.RECT:\n return 'rect';\n case this.nodeType.ROUNDED_RECT:\n return 'rounded-rect';\n case this.nodeType.CIRCLE:\n return 'circle';\n case this.nodeType.CLOUD:\n return 'cloud';\n case this.nodeType.BANG:\n return 'bang';\n case this.nodeType.HEXAGON:\n return 'hexgon'; // cspell: disable-line\n default:\n return 'no-border';\n }\n }\n\n /**\n * Assign section numbers to nodes based on their position relative to root\n * @param node - The mindmap node to process\n * @param sectionNumber - The section number to assign (undefined for root)\n */\n public assignSections(node: MindmapNode, sectionNumber?: number): void {\n // For root node, section should be undefined (not -1)\n if (node.level === 0) {\n node.section = undefined;\n } else {\n // For non-root nodes, assign the section number\n node.section = sectionNumber;\n }\n // For root node's children, assign section numbers based on their index\n // For other nodes, inherit parent's section number\n if (node.children) {\n for (const [index, child] of node.children.entries()) {\n const childSectionNumber = node.level === 0 ? index : sectionNumber;\n this.assignSections(child, childSectionNumber);\n }\n }\n }\n\n /**\n * Convert mindmap tree structure to flat array of nodes\n * @param node - The mindmap node to process\n * @param processedNodes - Array to collect processed nodes\n */\n public flattenNodes(node: MindmapNode, processedNodes: MindmapLayoutNode[]): void {\n // Build CSS classes for the node\n const cssClasses = ['mindmap-node'];\n\n if (node.isRoot === true) {\n // Root node gets special classes\n cssClasses.push('section-root', 'section--1');\n } else if (node.section !== undefined) {\n // Child nodes get section class based on their section number\n cssClasses.push(`section-${node.section}`);\n }\n\n // Add any custom classes from the node\n if (node.class) {\n cssClasses.push(node.class);\n }\n\n const classes = cssClasses.join(' ');\n\n // Map mindmap node type to valid shape name\n const getShapeFromType = (type: number) => {\n switch (type) {\n case nodeType.CIRCLE:\n return 'mindmapCircle';\n case nodeType.RECT:\n return 'rect';\n case nodeType.ROUNDED_RECT:\n return 'rounded';\n case nodeType.CLOUD:\n return 'cloud';\n case nodeType.BANG:\n return 'bang';\n case nodeType.HEXAGON:\n return 'hexagon';\n case nodeType.DEFAULT:\n return 'defaultMindmapNode';\n case nodeType.NO_BORDER:\n default:\n return 'rect';\n }\n };\n\n const processedNode: MindmapLayoutNode = {\n id: node.id.toString(),\n domId: 'node_' + node.id.toString(),\n label: node.descr,\n isGroup: false,\n shape: getShapeFromType(node.type),\n width: node.width,\n height: node.height ?? 0,\n padding: node.padding,\n cssClasses: classes,\n cssStyles: [],\n look: 'default',\n icon: node.icon,\n x: node.x,\n y: node.y,\n // Mindmap-specific properties\n level: node.level,\n nodeId: node.nodeId,\n type: node.type,\n section: node.section,\n };\n\n processedNodes.push(processedNode);\n\n // Recursively process children\n if (node.children) {\n for (const child of node.children) {\n this.flattenNodes(child, processedNodes);\n }\n }\n }\n\n /**\n * Generate edges from parent-child relationships in mindmap tree\n * @param node - The mindmap node to process\n * @param edges - Array to collect edges\n */\n public generateEdges(node: MindmapNode, edges: MindmapLayoutEdge[]): void {\n if (!node.children) {\n return;\n }\n for (const child of node.children) {\n // Build CSS classes for the edge\n let edgeClasses = 'edge';\n\n // Add section-specific classes based on the child's section\n if (child.section !== undefined) {\n edgeClasses += ` section-edge-${child.section}`;\n }\n\n // Add depth class based on the parent's level + 1 (depth of the edge)\n const edgeDepth = node.level + 1;\n edgeClasses += ` edge-depth-${edgeDepth}`;\n\n const edge: MindmapLayoutEdge = {\n id: `edge_${node.id}_${child.id}`,\n start: node.id.toString(),\n end: child.id.toString(),\n type: 'normal',\n curve: 'basis',\n thickness: 'normal',\n look: 'default',\n classes: edgeClasses,\n // Store mindmap-specific data\n depth: node.level,\n section: child.section,\n };\n\n edges.push(edge);\n\n // Recursively process child edges\n this.generateEdges(child, edges);\n }\n }\n\n /**\n * Get structured data for layout algorithms\n * Following the pattern established by ER diagrams\n * @returns Structured data containing nodes, edges, and config\n */\n public getData(): LayoutData {\n const mindmapRoot = this.getMindmap();\n const config = getConfig();\n\n const userDefinedConfig = getUserDefinedConfig();\n const hasUserDefinedLayout = userDefinedConfig.layout !== undefined;\n\n const finalConfig = config;\n if (!hasUserDefinedLayout) {\n finalConfig.layout = 'cose-bilkent';\n }\n\n if (!mindmapRoot) {\n return {\n nodes: [],\n edges: [],\n config: finalConfig,\n };\n }\n log.debug('getData: mindmapRoot', mindmapRoot, config);\n\n // Assign section numbers to all nodes based on their position relative to root\n this.assignSections(mindmapRoot);\n\n // Convert tree structure to flat arrays\n const processedNodes: MindmapLayoutNode[] = [];\n const processedEdges: MindmapLayoutEdge[] = [];\n\n this.flattenNodes(mindmapRoot, processedNodes);\n this.generateEdges(mindmapRoot, processedEdges);\n\n log.debug(\n `getData: processed ${processedNodes.length} nodes and ${processedEdges.length} edges`\n );\n\n // Create shapes map for ELK compatibility\n const shapes = new Map();\n for (const node of processedNodes) {\n shapes.set(node.id, {\n shape: node.shape,\n width: node.width,\n height: node.height,\n padding: node.padding,\n });\n }\n\n return {\n nodes: processedNodes,\n edges: processedEdges,\n config: finalConfig,\n // Store the root node for mindmap-specific layout algorithms\n rootNode: mindmapRoot,\n // Properties required by dagre layout algorithm\n markers: ['point'], // Mindmaps don't use markers\n direction: 'TB', // Top-to-bottom direction for mindmaps\n nodeSpacing: 50, // Default spacing between nodes\n rankSpacing: 50, // Default spacing between ranks\n // Add shapes for ELK compatibility\n shapes: Object.fromEntries(shapes),\n // Additional properties that layout algorithms might expect\n type: 'mindmap',\n diagramId: 'mindmap-' + v4(),\n };\n }\n\n // Expose logger to grammar\n public getLogger() {\n return log;\n }\n}\n", "import type { DrawDefinition } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { getDiagramElement } from '../../rendering-util/insertElementsForSize.js';\nimport { getRegisteredLayoutAlgorithm, render } from '../../rendering-util/render.js';\nimport { setupViewPortForSVG } from '../../rendering-util/setupViewPortForSVG.js';\nimport type { LayoutData } from '../../rendering-util/types.js';\nimport type { FilledMindMapNode } from './mindmapTypes.js';\nimport defaultConfig from '../../defaultConfig.js';\nimport type { MindmapDB } from './mindmapDb.js';\n\n/**\n * Update the layout data with actual node dimensions after drawing\n */\nfunction _updateNodeDimensions(data4Layout: LayoutData, mindmapRoot: FilledMindMapNode) {\n const updateNode = (node: FilledMindMapNode) => {\n // Find the corresponding node in the layout data\n const layoutNode = data4Layout.nodes.find((n) => n.id === node.id.toString());\n if (layoutNode) {\n // Update with the actual dimensions calculated by drawNode\n layoutNode.width = node.width;\n layoutNode.height = node.height;\n log.debug('Updated node dimensions:', node.id, 'width:', node.width, 'height:', node.height);\n }\n\n // Recursively update children\n node.children?.forEach(updateNode);\n };\n\n updateNode(mindmapRoot);\n}\n\nexport const draw: DrawDefinition = async (text, id, _version, diagObj) => {\n log.debug('Rendering mindmap diagram\\n' + text);\n\n // Draw the nodes first to get their dimensions, then update the layout data\n const db = diagObj.db as MindmapDB;\n\n // The getData method provided in all supported diagrams is used to extract the data from the parsed structure\n // into the Layout data format\n const data4Layout = db.getData();\n\n // Create the root SVG - the element is the div containing the SVG element\n const svg = getDiagramElement(id, data4Layout.config.securityLevel);\n\n data4Layout.type = diagObj.type;\n data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(data4Layout.config.layout, {\n fallback: 'cose-bilkent',\n });\n\n data4Layout.diagramId = id;\n\n const mm = db.getMindmap();\n if (!mm) {\n return;\n }\n\n data4Layout.nodes.forEach((node) => {\n if (node.shape === 'rounded') {\n node.radius = 15;\n node.taper = 15;\n node.stroke = 'none';\n node.width = 0;\n node.padding = 15;\n } else if (node.shape === 'circle') {\n node.padding = 10;\n } else if (node.shape === 'rect') {\n node.width = 0;\n node.padding = 10;\n }\n });\n\n // Use the unified rendering system\n await render(data4Layout, svg);\n\n // Setup the view box and size of the svg element using config from data4Layout\n setupViewPortForSVG(\n svg,\n data4Layout.config.mindmap?.padding ?? defaultConfig.mindmap.padding,\n 'mindmapDiagram',\n data4Layout.config.mindmap?.useMaxWidth ?? defaultConfig.mindmap.useMaxWidth\n );\n};\n\nexport default {\n draw,\n};\n", "// @ts-expect-error Incorrect khroma types\nimport { darken, lighten, isDark } from 'khroma';\nimport type { DiagramStylesProvider } from '../../diagram-api/types.js';\n\nconst genSections: DiagramStylesProvider = (options) => {\n let sections = '';\n\n for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) {\n options['lineColor' + i] = options['lineColor' + i] || options['cScaleInv' + i];\n if (isDark(options['lineColor' + i])) {\n options['lineColor' + i] = lighten(options['lineColor' + i], 20);\n } else {\n options['lineColor' + i] = darken(options['lineColor' + i], 20);\n }\n }\n\n for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) {\n const sw = '' + (17 - 3 * i);\n sections += `\n .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${\n i - 1\n } polygon, .section-${i - 1} path {\n fill: ${options['cScale' + i]};\n }\n .section-${i - 1} text {\n fill: ${options['cScaleLabel' + i]};\n }\n .node-icon-${i - 1} {\n font-size: 40px;\n color: ${options['cScaleLabel' + i]};\n }\n .section-edge-${i - 1}{\n stroke: ${options['cScale' + i]};\n }\n .edge-depth-${i - 1}{\n stroke-width: ${sw};\n }\n .section-${i - 1} line {\n stroke: ${options['cScaleInv' + i]} ;\n stroke-width: 3;\n }\n\n .disabled, .disabled circle, .disabled text {\n fill: lightgray;\n }\n .disabled text {\n fill: #efefef;\n }\n `;\n }\n return sections;\n};\n\n// TODO: These options seem incorrect.\nconst getStyles: DiagramStylesProvider = (options) =>\n `\n .edge {\n stroke-width: 3;\n }\n ${genSections(options)}\n .section-root rect, .section-root path, .section-root circle, .section-root polygon {\n fill: ${options.git0};\n }\n .section-root text {\n fill: ${options.gitBranchLabel0};\n }\n .section-root span {\n color: ${options.gitBranchLabel0};\n }\n .section-2 span {\n color: ${options.gitBranchLabel0};\n }\n .icon-container {\n height:100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n .edge {\n fill: none;\n }\n .mindmap-node-label {\n dy: 1em;\n alignment-baseline: middle;\n text-anchor: middle;\n dominant-baseline: middle;\n text-align: center;\n }\n`;\nexport default getStyles;\n", "// @ts-ignore: JISON doesn't support types\nimport parser from './parser/mindmap.jison';\nimport { MindmapDB } from './mindmapDb.js';\nimport renderer from './mindmapRenderer.js';\nimport styles from './styles.js';\nimport type { DiagramDefinition } from '../../diagram-api/types.js';\n\nexport const diagram: DiagramDefinition = {\n get db() {\n return new MindmapDB();\n },\n renderer,\n parser,\n styles,\n};\n"], + "mappings": "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,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,GAAE,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,GAAE,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE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", + "names": ["o", "parser", "lexer"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/pieDiagram-ADFJNKIX.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/pieDiagram-ADFJNKIX.mjs new file mode 100644 index 0000000..3b09fa2 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/pieDiagram-ADFJNKIX.mjs @@ -0,0 +1,220 @@ +import { + selectSvgElement +} from "./chunk-EXTU4WIE.mjs"; +import { + populateCommonDb +} from "./chunk-4BX2VUAB.mjs"; +import { + cleanAndMerge, + parseFontSize +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + configureSvgSize, + defaultConfig_default, + getAccDescription, + getAccTitle, + getConfig2 as getConfig, + getDiagramTitle, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/pie/pieParser.ts +import { parse } from "@mermaid-js/parser"; + +// src/diagrams/pie/pieDb.ts +var DEFAULT_PIE_CONFIG = defaultConfig_default.pie; +var DEFAULT_PIE_DB = { + sections: /* @__PURE__ */ new Map(), + showData: false, + config: DEFAULT_PIE_CONFIG +}; +var sections = DEFAULT_PIE_DB.sections; +var showData = DEFAULT_PIE_DB.showData; +var config = structuredClone(DEFAULT_PIE_CONFIG); +var getConfig2 = /* @__PURE__ */ __name(() => structuredClone(config), "getConfig"); +var clear2 = /* @__PURE__ */ __name(() => { + sections = /* @__PURE__ */ new Map(); + showData = DEFAULT_PIE_DB.showData; + clear(); +}, "clear"); +var addSection = /* @__PURE__ */ __name(({ label, value }) => { + if (value < 0) { + throw new Error( + `"${label}" has invalid value: ${value}. Negative values are not allowed in pie charts. All slice values must be >= 0.` + ); + } + if (!sections.has(label)) { + sections.set(label, value); + log.debug(`added new section: ${label}, with value: ${value}`); + } +}, "addSection"); +var getSections = /* @__PURE__ */ __name(() => sections, "getSections"); +var setShowData = /* @__PURE__ */ __name((toggle) => { + showData = toggle; +}, "setShowData"); +var getShowData = /* @__PURE__ */ __name(() => showData, "getShowData"); +var db = { + getConfig: getConfig2, + clear: clear2, + setDiagramTitle, + getDiagramTitle, + setAccTitle, + getAccTitle, + setAccDescription, + getAccDescription, + addSection, + getSections, + setShowData, + getShowData +}; + +// src/diagrams/pie/pieParser.ts +var populateDb = /* @__PURE__ */ __name((ast, db2) => { + populateCommonDb(ast, db2); + db2.setShowData(ast.showData); + ast.sections.map(db2.addSection); +}, "populateDb"); +var parser = { + parse: /* @__PURE__ */ __name(async (input) => { + const ast = await parse("pie", input); + log.debug(ast); + populateDb(ast, db); + }, "parse") +}; + +// src/diagrams/pie/pieStyles.ts +var getStyles = /* @__PURE__ */ __name((options) => ` + .pieCircle{ + stroke: ${options.pieStrokeColor}; + stroke-width : ${options.pieStrokeWidth}; + opacity : ${options.pieOpacity}; + } + .pieOuterCircle{ + stroke: ${options.pieOuterStrokeColor}; + stroke-width: ${options.pieOuterStrokeWidth}; + fill: none; + } + .pieTitleText { + text-anchor: middle; + font-size: ${options.pieTitleTextSize}; + fill: ${options.pieTitleTextColor}; + font-family: ${options.fontFamily}; + } + .slice { + font-family: ${options.fontFamily}; + fill: ${options.pieSectionTextColor}; + font-size:${options.pieSectionTextSize}; + // fill: white; + } + .legend text { + fill: ${options.pieLegendTextColor}; + font-family: ${options.fontFamily}; + font-size: ${options.pieLegendTextSize}; + } +`, "getStyles"); +var pieStyles_default = getStyles; + +// src/diagrams/pie/pieRenderer.ts +import { arc, pie as d3pie, scaleOrdinal } from "d3"; +var createPieArcs = /* @__PURE__ */ __name((sections2) => { + const sum = [...sections2.values()].reduce((acc, val) => acc + val, 0); + const pieData = [...sections2.entries()].map(([label, value]) => ({ label, value })).filter((d) => d.value / sum * 100 >= 1).sort((a, b) => b.value - a.value); + const pie = d3pie().value((d) => d.value); + return pie(pieData); +}, "createPieArcs"); +var draw = /* @__PURE__ */ __name((text, id, _version, diagObj) => { + log.debug("rendering pie chart\n" + text); + const db2 = diagObj.db; + const globalConfig = getConfig(); + const pieConfig = cleanAndMerge(db2.getConfig(), globalConfig.pie); + const MARGIN = 40; + const LEGEND_RECT_SIZE = 18; + const LEGEND_SPACING = 4; + const height = 450; + const pieWidth = height; + const svg = selectSvgElement(id); + const group = svg.append("g"); + group.attr("transform", "translate(" + pieWidth / 2 + "," + height / 2 + ")"); + const { themeVariables } = globalConfig; + let [outerStrokeWidth] = parseFontSize(themeVariables.pieOuterStrokeWidth); + outerStrokeWidth ??= 2; + const textPosition = pieConfig.textPosition; + const radius = Math.min(pieWidth, height) / 2 - MARGIN; + const arcGenerator = arc().innerRadius(0).outerRadius(radius); + const labelArcGenerator = arc().innerRadius(radius * textPosition).outerRadius(radius * textPosition); + group.append("circle").attr("cx", 0).attr("cy", 0).attr("r", radius + outerStrokeWidth / 2).attr("class", "pieOuterCircle"); + const sections2 = db2.getSections(); + const arcs = createPieArcs(sections2); + const myGeneratedColors = [ + themeVariables.pie1, + themeVariables.pie2, + themeVariables.pie3, + themeVariables.pie4, + themeVariables.pie5, + themeVariables.pie6, + themeVariables.pie7, + themeVariables.pie8, + themeVariables.pie9, + themeVariables.pie10, + themeVariables.pie11, + themeVariables.pie12 + ]; + let sum = 0; + sections2.forEach((section) => { + sum += section; + }); + const filteredArcs = arcs.filter((datum) => (datum.data.value / sum * 100).toFixed(0) !== "0"); + const color = scaleOrdinal(myGeneratedColors); + group.selectAll("mySlices").data(filteredArcs).enter().append("path").attr("d", arcGenerator).attr("fill", (datum) => { + return color(datum.data.label); + }).attr("class", "pieCircle"); + group.selectAll("mySlices").data(filteredArcs).enter().append("text").text((datum) => { + return (datum.data.value / sum * 100).toFixed(0) + "%"; + }).attr("transform", (datum) => { + return "translate(" + labelArcGenerator.centroid(datum) + ")"; + }).style("text-anchor", "middle").attr("class", "slice"); + group.append("text").text(db2.getDiagramTitle()).attr("x", 0).attr("y", -(height - 50) / 2).attr("class", "pieTitleText"); + const allSectionData = [...sections2.entries()].map(([label, value]) => ({ + label, + value + })); + const legend = group.selectAll(".legend").data(allSectionData).enter().append("g").attr("class", "legend").attr("transform", (_datum, index) => { + const height2 = LEGEND_RECT_SIZE + LEGEND_SPACING; + const offset = height2 * allSectionData.length / 2; + const horizontal = 12 * LEGEND_RECT_SIZE; + const vertical = index * height2 - offset; + return "translate(" + horizontal + "," + vertical + ")"; + }); + legend.append("rect").attr("width", LEGEND_RECT_SIZE).attr("height", LEGEND_RECT_SIZE).style("fill", (d) => color(d.label)).style("stroke", (d) => color(d.label)); + legend.append("text").attr("x", LEGEND_RECT_SIZE + LEGEND_SPACING).attr("y", LEGEND_RECT_SIZE - LEGEND_SPACING).text((d) => { + if (db2.getShowData()) { + return `${d.label} [${d.value}]`; + } + return d.label; + }); + const longestTextWidth = Math.max( + ...legend.selectAll("text").nodes().map((node) => node?.getBoundingClientRect().width ?? 0) + ); + const totalWidth = pieWidth + MARGIN + LEGEND_RECT_SIZE + LEGEND_SPACING + longestTextWidth; + svg.attr("viewBox", `0 0 ${totalWidth} ${height}`); + configureSvgSize(svg, height, totalWidth, pieConfig.useMaxWidth); +}, "draw"); +var renderer = { draw }; + +// src/diagrams/pie/pieDiagram.ts +var diagram = { + parser, + db, + renderer, + styles: pieStyles_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/pieDiagram-ADFJNKIX.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/pieDiagram-ADFJNKIX.mjs.map new file mode 100644 index 0000000..2cafecb --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/pieDiagram-ADFJNKIX.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/pie/pieParser.ts", "../../../src/diagrams/pie/pieDb.ts", "../../../src/diagrams/pie/pieStyles.ts", "../../../src/diagrams/pie/pieRenderer.ts", "../../../src/diagrams/pie/pieDiagram.ts"], + "sourcesContent": ["import type { Pie } from '@mermaid-js/parser';\nimport { parse } from '@mermaid-js/parser';\nimport { log } from '../../logger.js';\nimport type { ParserDefinition } from '../../diagram-api/types.js';\nimport { populateCommonDb } from '../common/populateCommonDb.js';\nimport type { PieDB } from './pieTypes.js';\nimport { db } from './pieDb.js';\n\nconst populateDb = (ast: Pie, db: PieDB) => {\n populateCommonDb(ast, db);\n db.setShowData(ast.showData);\n ast.sections.map(db.addSection);\n};\n\nexport const parser: ParserDefinition = {\n parse: async (input: string): Promise => {\n const ast: Pie = await parse('pie', input);\n log.debug(ast);\n populateDb(ast, db);\n },\n};\n", "import { log } from '../../logger.js';\nimport {\n setAccTitle,\n getAccTitle,\n setDiagramTitle,\n getDiagramTitle,\n getAccDescription,\n setAccDescription,\n clear as commonClear,\n} from '../common/commonDb.js';\nimport type { PieFields, PieDB, Sections, D3Section } from './pieTypes.js';\nimport type { RequiredDeep } from 'type-fest';\nimport type { PieDiagramConfig } from '../../config.type.js';\nimport DEFAULT_CONFIG from '../../defaultConfig.js';\n\nexport const DEFAULT_PIE_CONFIG: Required = DEFAULT_CONFIG.pie;\n\nexport const DEFAULT_PIE_DB: RequiredDeep = {\n sections: new Map(),\n showData: false,\n config: DEFAULT_PIE_CONFIG,\n} as const;\n\nlet sections: Sections = DEFAULT_PIE_DB.sections;\nlet showData: boolean = DEFAULT_PIE_DB.showData;\nconst config: Required = structuredClone(DEFAULT_PIE_CONFIG);\n\nconst getConfig = (): Required => structuredClone(config);\n\nconst clear = (): void => {\n sections = new Map();\n showData = DEFAULT_PIE_DB.showData;\n commonClear();\n};\n\nconst addSection = ({ label, value }: D3Section): void => {\n if (value < 0) {\n throw new Error(\n `\"${label}\" has invalid value: ${value}. Negative values are not allowed in pie charts. All slice values must be >= 0.`\n );\n }\n if (!sections.has(label)) {\n sections.set(label, value);\n log.debug(`added new section: ${label}, with value: ${value}`);\n }\n};\n\nconst getSections = (): Sections => sections;\n\nconst setShowData = (toggle: boolean): void => {\n showData = toggle;\n};\n\nconst getShowData = (): boolean => showData;\n\nexport const db: PieDB = {\n getConfig,\n\n clear,\n setDiagramTitle,\n getDiagramTitle,\n setAccTitle,\n getAccTitle,\n setAccDescription,\n getAccDescription,\n\n addSection,\n getSections,\n setShowData,\n getShowData,\n};\n", "import type { DiagramStylesProvider } from '../../diagram-api/types.js';\nimport type { PieStyleOptions } from './pieTypes.js';\n\nconst getStyles: DiagramStylesProvider = (options: PieStyleOptions) =>\n `\n .pieCircle{\n stroke: ${options.pieStrokeColor};\n stroke-width : ${options.pieStrokeWidth};\n opacity : ${options.pieOpacity};\n }\n .pieOuterCircle{\n stroke: ${options.pieOuterStrokeColor};\n stroke-width: ${options.pieOuterStrokeWidth};\n fill: none;\n }\n .pieTitleText {\n text-anchor: middle;\n font-size: ${options.pieTitleTextSize};\n fill: ${options.pieTitleTextColor};\n font-family: ${options.fontFamily};\n }\n .slice {\n font-family: ${options.fontFamily};\n fill: ${options.pieSectionTextColor};\n font-size:${options.pieSectionTextSize};\n // fill: white;\n }\n .legend text {\n fill: ${options.pieLegendTextColor};\n font-family: ${options.fontFamily};\n font-size: ${options.pieLegendTextSize};\n }\n`;\n\nexport default getStyles;\n", "import type d3 from 'd3';\nimport { arc, pie as d3pie, scaleOrdinal } from 'd3';\nimport type { MermaidConfig, PieDiagramConfig } from '../../config.type.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport type { DrawDefinition, SVG, SVGGroup } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { selectSvgElement } from '../../rendering-util/selectSvgElement.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\nimport { cleanAndMerge, parseFontSize } from '../../utils.js';\nimport type { D3Section, PieDB, Sections } from './pieTypes.js';\n\nconst createPieArcs = (sections: Sections): d3.PieArcDatum[] => {\n const sum = [...sections.values()].reduce((acc, val) => acc + val, 0);\n\n const pieData: D3Section[] = [...sections.entries()]\n .map(([label, value]) => ({ label, value }))\n .filter((d) => (d.value / sum) * 100 >= 1) // Remove values < 1%\n .sort((a, b) => b.value - a.value);\n\n const pie: d3.Pie = d3pie().value((d) => d.value);\n return pie(pieData);\n};\n\n/**\n * Draws a Pie Chart with the data given in text.\n *\n * @param text - pie chart code\n * @param id - diagram id\n * @param _version - MermaidJS version from package.json.\n * @param diagObj - A standard diagram containing the DB and the text and type etc of the diagram.\n */\nexport const draw: DrawDefinition = (text, id, _version, diagObj) => {\n log.debug('rendering pie chart\\n' + text);\n const db = diagObj.db as PieDB;\n const globalConfig: MermaidConfig = getConfig();\n const pieConfig: Required = cleanAndMerge(db.getConfig(), globalConfig.pie);\n const MARGIN = 40;\n const LEGEND_RECT_SIZE = 18;\n const LEGEND_SPACING = 4;\n const height = 450;\n const pieWidth: number = height;\n const svg: SVG = selectSvgElement(id);\n const group: SVGGroup = svg.append('g');\n group.attr('transform', 'translate(' + pieWidth / 2 + ',' + height / 2 + ')');\n\n const { themeVariables } = globalConfig;\n let [outerStrokeWidth] = parseFontSize(themeVariables.pieOuterStrokeWidth);\n outerStrokeWidth ??= 2;\n\n const textPosition: number = pieConfig.textPosition;\n const radius: number = Math.min(pieWidth, height) / 2 - MARGIN;\n // Shape helper to build arcs:\n const arcGenerator: d3.Arc> = arc>()\n .innerRadius(0)\n .outerRadius(radius);\n const labelArcGenerator: d3.Arc> = arc<\n d3.PieArcDatum\n >()\n .innerRadius(radius * textPosition)\n .outerRadius(radius * textPosition);\n\n group\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius + outerStrokeWidth / 2)\n .attr('class', 'pieOuterCircle');\n\n const sections: Sections = db.getSections();\n const arcs: d3.PieArcDatum[] = createPieArcs(sections);\n\n const myGeneratedColors = [\n themeVariables.pie1,\n themeVariables.pie2,\n themeVariables.pie3,\n themeVariables.pie4,\n themeVariables.pie5,\n themeVariables.pie6,\n themeVariables.pie7,\n themeVariables.pie8,\n themeVariables.pie9,\n themeVariables.pie10,\n themeVariables.pie11,\n themeVariables.pie12,\n ];\n let sum = 0;\n sections.forEach((section) => {\n sum += section;\n });\n\n // Filter out arcs that would render as 0%\n const filteredArcs = arcs.filter((datum) => ((datum.data.value / sum) * 100).toFixed(0) !== '0');\n\n // Set the color scale\n const color: d3.ScaleOrdinal = scaleOrdinal(myGeneratedColors);\n\n // Build the pie chart: each part of the pie is a path that we build using the arc function.\n group\n .selectAll('mySlices')\n .data(filteredArcs)\n .enter()\n .append('path')\n .attr('d', arcGenerator)\n .attr('fill', (datum: d3.PieArcDatum) => {\n return color(datum.data.label);\n })\n .attr('class', 'pieCircle');\n\n // Now add the percentage.\n // Use the centroid method to get the best coordinates.\n group\n .selectAll('mySlices')\n .data(filteredArcs)\n .enter()\n .append('text')\n .text((datum: d3.PieArcDatum): string => {\n return ((datum.data.value / sum) * 100).toFixed(0) + '%';\n })\n .attr('transform', (datum: d3.PieArcDatum): string => {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n return 'translate(' + labelArcGenerator.centroid(datum) + ')';\n })\n .style('text-anchor', 'middle')\n .attr('class', 'slice');\n\n group\n .append('text')\n .text(db.getDiagramTitle())\n .attr('x', 0)\n .attr('y', -(height - 50) / 2)\n .attr('class', 'pieTitleText');\n\n // Add the legends/annotations for each section\n const allSectionData: D3Section[] = [...sections.entries()].map(([label, value]) => ({\n label,\n value,\n }));\n\n const legend = group\n .selectAll('.legend')\n .data(allSectionData)\n .enter()\n .append('g')\n .attr('class', 'legend')\n .attr('transform', (_datum, index: number): string => {\n const height = LEGEND_RECT_SIZE + LEGEND_SPACING;\n const offset = (height * allSectionData.length) / 2;\n const horizontal = 12 * LEGEND_RECT_SIZE;\n const vertical = index * height - offset;\n return 'translate(' + horizontal + ',' + vertical + ')';\n });\n\n legend\n .append('rect')\n .attr('width', LEGEND_RECT_SIZE)\n .attr('height', LEGEND_RECT_SIZE)\n .style('fill', (d) => color(d.label))\n .style('stroke', (d) => color(d.label));\n\n legend\n .append('text')\n .attr('x', LEGEND_RECT_SIZE + LEGEND_SPACING)\n .attr('y', LEGEND_RECT_SIZE - LEGEND_SPACING)\n .text((d) => {\n if (db.getShowData()) {\n return `${d.label} [${d.value}]`;\n }\n return d.label;\n });\n\n const longestTextWidth = Math.max(\n ...legend\n .selectAll('text')\n .nodes()\n .map((node) => (node as Element)?.getBoundingClientRect().width ?? 0)\n );\n\n const totalWidth = pieWidth + MARGIN + LEGEND_RECT_SIZE + LEGEND_SPACING + longestTextWidth;\n\n // Set viewBox\n svg.attr('viewBox', `0 0 ${totalWidth} ${height}`);\n configureSvgSize(svg, height, totalWidth, pieConfig.useMaxWidth);\n};\n\nexport const renderer = { draw };\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { parser } from './pieParser.js';\nimport { db } from './pieDb.js';\nimport styles from './pieStyles.js';\nimport { renderer } from './pieRenderer.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles,\n};\n"], + "mappings": "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", + "names": ["getConfig", "clear", "db", "sections", "db", "height"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/quadrantDiagram-AYHSOK5B.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/quadrantDiagram-AYHSOK5B.mjs new file mode 100644 index 0000000..c9c707c --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/quadrantDiagram-AYHSOK5B.mjs @@ -0,0 +1,1417 @@ +import { + clear, + configureSvgSize, + defaultConfig_default, + getAccDescription, + getAccTitle, + getConfig2 as getConfig, + getDiagramTitle, + getThemeVariables, + sanitizeText, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/quadrant-chart/parser/quadrant.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 3], $V1 = [1, 4], $V2 = [1, 5], $V3 = [1, 6], $V4 = [1, 7], $V5 = [1, 4, 5, 10, 12, 13, 14, 18, 25, 35, 37, 39, 41, 42, 48, 50, 51, 52, 53, 54, 55, 56, 57, 60, 61, 63, 64, 65, 66, 67], $V6 = [1, 4, 5, 10, 12, 13, 14, 18, 25, 28, 35, 37, 39, 41, 42, 48, 50, 51, 52, 53, 54, 55, 56, 57, 60, 61, 63, 64, 65, 66, 67], $V7 = [55, 56, 57], $V8 = [2, 36], $V9 = [1, 37], $Va = [1, 36], $Vb = [1, 38], $Vc = [1, 35], $Vd = [1, 43], $Ve = [1, 41], $Vf = [1, 14], $Vg = [1, 23], $Vh = [1, 18], $Vi = [1, 19], $Vj = [1, 20], $Vk = [1, 21], $Vl = [1, 22], $Vm = [1, 24], $Vn = [1, 25], $Vo = [1, 26], $Vp = [1, 27], $Vq = [1, 28], $Vr = [1, 29], $Vs = [1, 32], $Vt = [1, 33], $Vu = [1, 34], $Vv = [1, 39], $Vw = [1, 40], $Vx = [1, 42], $Vy = [1, 44], $Vz = [1, 62], $VA = [1, 61], $VB = [4, 5, 8, 10, 12, 13, 14, 18, 44, 47, 49, 55, 56, 57, 63, 64, 65, 66, 67], $VC = [1, 65], $VD = [1, 66], $VE = [1, 67], $VF = [1, 68], $VG = [1, 69], $VH = [1, 70], $VI = [1, 71], $VJ = [1, 72], $VK = [1, 73], $VL = [1, 74], $VM = [1, 75], $VN = [1, 76], $VO = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18], $VP = [1, 90], $VQ = [1, 91], $VR = [1, 92], $VS = [1, 99], $VT = [1, 93], $VU = [1, 96], $VV = [1, 94], $VW = [1, 95], $VX = [1, 97], $VY = [1, 98], $VZ = [1, 102], $V_ = [10, 55, 56, 57], $V$ = [4, 5, 6, 8, 10, 11, 13, 17, 18, 19, 20, 55, 56, 57]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "idStringToken": 3, "ALPHA": 4, "NUM": 5, "NODE_STRING": 6, "DOWN": 7, "MINUS": 8, "DEFAULT": 9, "COMMA": 10, "COLON": 11, "AMP": 12, "BRKT": 13, "MULT": 14, "UNICODE_TEXT": 15, "styleComponent": 16, "UNIT": 17, "SPACE": 18, "STYLE": 19, "PCT": 20, "idString": 21, "style": 22, "stylesOpt": 23, "classDefStatement": 24, "CLASSDEF": 25, "start": 26, "eol": 27, "QUADRANT": 28, "document": 29, "line": 30, "statement": 31, "axisDetails": 32, "quadrantDetails": 33, "points": 34, "title": 35, "title_value": 36, "acc_title": 37, "acc_title_value": 38, "acc_descr": 39, "acc_descr_value": 40, "acc_descr_multiline_value": 41, "section": 42, "text": 43, "point_start": 44, "point_x": 45, "point_y": 46, "class_name": 47, "X-AXIS": 48, "AXIS-TEXT-DELIMITER": 49, "Y-AXIS": 50, "QUADRANT_1": 51, "QUADRANT_2": 52, "QUADRANT_3": 53, "QUADRANT_4": 54, "NEWLINE": 55, "SEMI": 56, "EOF": 57, "alphaNumToken": 58, "textNoTagsToken": 59, "STR": 60, "MD_STR": 61, "alphaNum": 62, "PUNCTUATION": 63, "PLUS": 64, "EQUALS": 65, "DOT": 66, "UNDERSCORE": 67, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "ALPHA", 5: "NUM", 6: "NODE_STRING", 7: "DOWN", 8: "MINUS", 9: "DEFAULT", 10: "COMMA", 11: "COLON", 12: "AMP", 13: "BRKT", 14: "MULT", 15: "UNICODE_TEXT", 17: "UNIT", 18: "SPACE", 19: "STYLE", 20: "PCT", 25: "CLASSDEF", 28: "QUADRANT", 35: "title", 36: "title_value", 37: "acc_title", 38: "acc_title_value", 39: "acc_descr", 40: "acc_descr_value", 41: "acc_descr_multiline_value", 42: "section", 44: "point_start", 45: "point_x", 46: "point_y", 47: "class_name", 48: "X-AXIS", 49: "AXIS-TEXT-DELIMITER", 50: "Y-AXIS", 51: "QUADRANT_1", 52: "QUADRANT_2", 53: "QUADRANT_3", 54: "QUADRANT_4", 55: "NEWLINE", 56: "SEMI", 57: "EOF", 60: "STR", 61: "MD_STR", 63: "PUNCTUATION", 64: "PLUS", 65: "EQUALS", 66: "DOT", 67: "UNDERSCORE" }, + productions_: [0, [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [16, 1], [16, 1], [16, 1], [16, 1], [16, 1], [16, 1], [16, 1], [16, 1], [16, 1], [16, 1], [21, 1], [21, 2], [22, 1], [22, 2], [23, 1], [23, 3], [24, 5], [26, 2], [26, 2], [26, 2], [29, 0], [29, 2], [30, 2], [31, 0], [31, 1], [31, 2], [31, 1], [31, 1], [31, 1], [31, 2], [31, 2], [31, 2], [31, 1], [31, 1], [34, 4], [34, 5], [34, 5], [34, 6], [32, 4], [32, 3], [32, 2], [32, 4], [32, 3], [32, 2], [33, 2], [33, 2], [33, 2], [33, 2], [27, 1], [27, 1], [27, 1], [43, 1], [43, 2], [43, 1], [43, 1], [62, 1], [62, 2], [58, 1], [58, 1], [58, 1], [58, 1], [58, 1], [58, 1], [58, 1], [58, 1], [58, 1], [58, 1], [58, 1], [59, 1], [59, 1], [59, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 23: + this.$ = $$[$0]; + break; + case 24: + this.$ = $$[$0 - 1] + "" + $$[$0]; + break; + case 26: + this.$ = $$[$0 - 1] + $$[$0]; + break; + case 27: + this.$ = [$$[$0].trim()]; + break; + case 28: + $$[$0 - 2].push($$[$0].trim()); + this.$ = $$[$0 - 2]; + break; + case 29: + this.$ = $$[$0 - 4]; + yy.addClass($$[$0 - 2], $$[$0]); + break; + case 37: + this.$ = []; + break; + case 42: + this.$ = $$[$0].trim(); + yy.setDiagramTitle(this.$); + break; + case 43: + this.$ = $$[$0].trim(); + yy.setAccTitle(this.$); + break; + case 44: + case 45: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 46: + yy.addSection($$[$0].substr(8)); + this.$ = $$[$0].substr(8); + break; + case 47: + yy.addPoint($$[$0 - 3], "", $$[$0 - 1], $$[$0], []); + break; + case 48: + yy.addPoint($$[$0 - 4], $$[$0 - 3], $$[$0 - 1], $$[$0], []); + break; + case 49: + yy.addPoint($$[$0 - 4], "", $$[$0 - 2], $$[$0 - 1], $$[$0]); + break; + case 50: + yy.addPoint($$[$0 - 5], $$[$0 - 4], $$[$0 - 2], $$[$0 - 1], $$[$0]); + break; + case 51: + yy.setXAxisLeftText($$[$0 - 2]); + yy.setXAxisRightText($$[$0]); + break; + case 52: + $$[$0 - 1].text += " \u27F6 "; + yy.setXAxisLeftText($$[$0 - 1]); + break; + case 53: + yy.setXAxisLeftText($$[$0]); + break; + case 54: + yy.setYAxisBottomText($$[$0 - 2]); + yy.setYAxisTopText($$[$0]); + break; + case 55: + $$[$0 - 1].text += " \u27F6 "; + yy.setYAxisBottomText($$[$0 - 1]); + break; + case 56: + yy.setYAxisBottomText($$[$0]); + break; + case 57: + yy.setQuadrant1Text($$[$0]); + break; + case 58: + yy.setQuadrant2Text($$[$0]); + break; + case 59: + yy.setQuadrant3Text($$[$0]); + break; + case 60: + yy.setQuadrant4Text($$[$0]); + break; + case 64: + this.$ = { text: $$[$0], type: "text" }; + break; + case 65: + this.$ = { text: $$[$0 - 1].text + "" + $$[$0], type: $$[$0 - 1].type }; + break; + case 66: + this.$ = { text: $$[$0], type: "text" }; + break; + case 67: + this.$ = { text: $$[$0], type: "markdown" }; + break; + case 68: + this.$ = $$[$0]; + break; + case 69: + this.$ = $$[$0 - 1] + "" + $$[$0]; + break; + } + }, "anonymous"), + table: [{ 18: $V0, 26: 1, 27: 2, 28: $V1, 55: $V2, 56: $V3, 57: $V4 }, { 1: [3] }, { 18: $V0, 26: 8, 27: 2, 28: $V1, 55: $V2, 56: $V3, 57: $V4 }, { 18: $V0, 26: 9, 27: 2, 28: $V1, 55: $V2, 56: $V3, 57: $V4 }, o($V5, [2, 33], { 29: 10 }), o($V6, [2, 61]), o($V6, [2, 62]), o($V6, [2, 63]), { 1: [2, 30] }, { 1: [2, 31] }, o($V7, $V8, { 30: 11, 31: 12, 24: 13, 32: 15, 33: 16, 34: 17, 43: 30, 58: 31, 1: [2, 32], 4: $V9, 5: $Va, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 18: $Vf, 25: $Vg, 35: $Vh, 37: $Vi, 39: $Vj, 41: $Vk, 42: $Vl, 48: $Vm, 50: $Vn, 51: $Vo, 52: $Vp, 53: $Vq, 54: $Vr, 60: $Vs, 61: $Vt, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), o($V5, [2, 34]), { 27: 45, 55: $V2, 56: $V3, 57: $V4 }, o($V7, [2, 37]), o($V7, $V8, { 24: 13, 32: 15, 33: 16, 34: 17, 43: 30, 58: 31, 31: 46, 4: $V9, 5: $Va, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 18: $Vf, 25: $Vg, 35: $Vh, 37: $Vi, 39: $Vj, 41: $Vk, 42: $Vl, 48: $Vm, 50: $Vn, 51: $Vo, 52: $Vp, 53: $Vq, 54: $Vr, 60: $Vs, 61: $Vt, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), o($V7, [2, 39]), o($V7, [2, 40]), o($V7, [2, 41]), { 36: [1, 47] }, { 38: [1, 48] }, { 40: [1, 49] }, o($V7, [2, 45]), o($V7, [2, 46]), { 18: [1, 50] }, { 4: $V9, 5: $Va, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 43: 51, 58: 31, 60: $Vs, 61: $Vt, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }, { 4: $V9, 5: $Va, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 43: 52, 58: 31, 60: $Vs, 61: $Vt, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }, { 4: $V9, 5: $Va, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 43: 53, 58: 31, 60: $Vs, 61: $Vt, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }, { 4: $V9, 5: $Va, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 43: 54, 58: 31, 60: $Vs, 61: $Vt, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }, { 4: $V9, 5: $Va, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 43: 55, 58: 31, 60: $Vs, 61: $Vt, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }, { 4: $V9, 5: $Va, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 43: 56, 58: 31, 60: $Vs, 61: $Vt, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }, { 4: $V9, 5: $Va, 8: $Vz, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 18: $VA, 44: [1, 57], 47: [1, 58], 58: 60, 59: 59, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }, o($VB, [2, 64]), o($VB, [2, 66]), o($VB, [2, 67]), o($VB, [2, 70]), o($VB, [2, 71]), o($VB, [2, 72]), o($VB, [2, 73]), o($VB, [2, 74]), o($VB, [2, 75]), o($VB, [2, 76]), o($VB, [2, 77]), o($VB, [2, 78]), o($VB, [2, 79]), o($VB, [2, 80]), o($V5, [2, 35]), o($V7, [2, 38]), o($V7, [2, 42]), o($V7, [2, 43]), o($V7, [2, 44]), { 3: 64, 4: $VC, 5: $VD, 6: $VE, 7: $VF, 8: $VG, 9: $VH, 10: $VI, 11: $VJ, 12: $VK, 13: $VL, 14: $VM, 15: $VN, 21: 63 }, o($V7, [2, 53], { 59: 59, 58: 60, 4: $V9, 5: $Va, 8: $Vz, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 18: $VA, 49: [1, 77], 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), o($V7, [2, 56], { 59: 59, 58: 60, 4: $V9, 5: $Va, 8: $Vz, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 18: $VA, 49: [1, 78], 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), o($V7, [2, 57], { 59: 59, 58: 60, 4: $V9, 5: $Va, 8: $Vz, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 18: $VA, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), o($V7, [2, 58], { 59: 59, 58: 60, 4: $V9, 5: $Va, 8: $Vz, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 18: $VA, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), o($V7, [2, 59], { 59: 59, 58: 60, 4: $V9, 5: $Va, 8: $Vz, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 18: $VA, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), o($V7, [2, 60], { 59: 59, 58: 60, 4: $V9, 5: $Va, 8: $Vz, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 18: $VA, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), { 45: [1, 79] }, { 44: [1, 80] }, o($VB, [2, 65]), o($VB, [2, 81]), o($VB, [2, 82]), o($VB, [2, 83]), { 3: 82, 4: $VC, 5: $VD, 6: $VE, 7: $VF, 8: $VG, 9: $VH, 10: $VI, 11: $VJ, 12: $VK, 13: $VL, 14: $VM, 15: $VN, 18: [1, 81] }, o($VO, [2, 23]), o($VO, [2, 1]), o($VO, [2, 2]), o($VO, [2, 3]), o($VO, [2, 4]), o($VO, [2, 5]), o($VO, [2, 6]), o($VO, [2, 7]), o($VO, [2, 8]), o($VO, [2, 9]), o($VO, [2, 10]), o($VO, [2, 11]), o($VO, [2, 12]), o($V7, [2, 52], { 58: 31, 43: 83, 4: $V9, 5: $Va, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 60: $Vs, 61: $Vt, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), o($V7, [2, 55], { 58: 31, 43: 84, 4: $V9, 5: $Va, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 60: $Vs, 61: $Vt, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), { 46: [1, 85] }, { 45: [1, 86] }, { 4: $VP, 5: $VQ, 6: $VR, 8: $VS, 11: $VT, 13: $VU, 16: 89, 17: $VV, 18: $VW, 19: $VX, 20: $VY, 22: 88, 23: 87 }, o($VO, [2, 24]), o($V7, [2, 51], { 59: 59, 58: 60, 4: $V9, 5: $Va, 8: $Vz, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 18: $VA, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), o($V7, [2, 54], { 59: 59, 58: 60, 4: $V9, 5: $Va, 8: $Vz, 10: $Vb, 12: $Vc, 13: $Vd, 14: $Ve, 18: $VA, 63: $Vu, 64: $Vv, 65: $Vw, 66: $Vx, 67: $Vy }), o($V7, [2, 47], { 22: 88, 16: 89, 23: 100, 4: $VP, 5: $VQ, 6: $VR, 8: $VS, 11: $VT, 13: $VU, 17: $VV, 18: $VW, 19: $VX, 20: $VY }), { 46: [1, 101] }, o($V7, [2, 29], { 10: $VZ }), o($V_, [2, 27], { 16: 103, 4: $VP, 5: $VQ, 6: $VR, 8: $VS, 11: $VT, 13: $VU, 17: $VV, 18: $VW, 19: $VX, 20: $VY }), o($V$, [2, 25]), o($V$, [2, 13]), o($V$, [2, 14]), o($V$, [2, 15]), o($V$, [2, 16]), o($V$, [2, 17]), o($V$, [2, 18]), o($V$, [2, 19]), o($V$, [2, 20]), o($V$, [2, 21]), o($V$, [2, 22]), o($V7, [2, 49], { 10: $VZ }), o($V7, [2, 48], { 22: 88, 16: 89, 23: 104, 4: $VP, 5: $VQ, 6: $VR, 8: $VS, 11: $VT, 13: $VU, 17: $VV, 18: $VW, 19: $VX, 20: $VY }), { 4: $VP, 5: $VQ, 6: $VR, 8: $VS, 11: $VT, 13: $VU, 16: 89, 17: $VV, 18: $VW, 19: $VX, 20: $VY, 22: 105 }, o($V$, [2, 26]), o($V7, [2, 50], { 10: $VZ }), o($V_, [2, 28], { 16: 103, 4: $VP, 5: $VQ, 6: $VR, 8: $VS, 11: $VT, 13: $VU, 17: $VV, 18: $VW, 19: $VX, 20: $VY })], + defaultActions: { 8: [2, 30], 9: [2, 31] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + break; + case 1: + break; + case 2: + return 55; + break; + case 3: + break; + case 4: + this.begin("title"); + return 35; + break; + case 5: + this.popState(); + return "title_value"; + break; + case 6: + this.begin("acc_title"); + return 37; + break; + case 7: + this.popState(); + return "acc_title_value"; + break; + case 8: + this.begin("acc_descr"); + return 39; + break; + case 9: + this.popState(); + return "acc_descr_value"; + break; + case 10: + this.begin("acc_descr_multiline"); + break; + case 11: + this.popState(); + break; + case 12: + return "acc_descr_multiline_value"; + break; + case 13: + return 48; + break; + case 14: + return 50; + break; + case 15: + return 49; + break; + case 16: + return 51; + break; + case 17: + return 52; + break; + case 18: + return 53; + break; + case 19: + return 54; + break; + case 20: + return 25; + break; + case 21: + this.begin("md_string"); + break; + case 22: + return "MD_STR"; + break; + case 23: + this.popState(); + break; + case 24: + this.begin("string"); + break; + case 25: + this.popState(); + break; + case 26: + return "STR"; + break; + case 27: + this.begin("class_name"); + break; + case 28: + this.popState(); + return 47; + break; + case 29: + this.begin("point_start"); + return 44; + break; + case 30: + this.begin("point_x"); + return 45; + break; + case 31: + this.popState(); + break; + case 32: + this.popState(); + this.begin("point_y"); + break; + case 33: + this.popState(); + return 46; + break; + case 34: + return 28; + break; + case 35: + return 4; + break; + case 36: + return 11; + break; + case 37: + return 64; + break; + case 38: + return 10; + break; + case 39: + return 65; + break; + case 40: + return 65; + break; + case 41: + return 14; + break; + case 42: + return 13; + break; + case 43: + return 67; + break; + case 44: + return 66; + break; + case 45: + return 12; + break; + case 46: + return 8; + break; + case 47: + return 5; + break; + case 48: + return 18; + break; + case 49: + return 56; + break; + case 50: + return 63; + break; + case 51: + return 57; + break; + } + }, "anonymous"), + rules: [/^(?:%%(?!\{)[^\n]*)/i, /^(?:[^\}]%%[^\n]*)/i, /^(?:[\n\r]+)/i, /^(?:%%[^\n]*)/i, /^(?:title\b)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accTitle\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*\{\s*)/i, /^(?:[\}])/i, /^(?:[^\}]*)/i, /^(?: *x-axis *)/i, /^(?: *y-axis *)/i, /^(?: *--+> *)/i, /^(?: *quadrant-1 *)/i, /^(?: *quadrant-2 *)/i, /^(?: *quadrant-3 *)/i, /^(?: *quadrant-4 *)/i, /^(?:classDef\b)/i, /^(?:["][`])/i, /^(?:[^`"]+)/i, /^(?:[`]["])/i, /^(?:["])/i, /^(?:["])/i, /^(?:[^"]*)/i, /^(?::::)/i, /^(?:^\w+)/i, /^(?:\s*:\s*\[\s*)/i, /^(?:(1)|(0(.\d+)?))/i, /^(?:\s*\] *)/i, /^(?:\s*,\s*)/i, /^(?:(1)|(0(.\d+)?))/i, /^(?: *quadrantChart *)/i, /^(?:[A-Za-z]+)/i, /^(?::)/i, /^(?:\+)/i, /^(?:,)/i, /^(?:=)/i, /^(?:=)/i, /^(?:\*)/i, /^(?:#)/i, /^(?:[\_])/i, /^(?:\.)/i, /^(?:&)/i, /^(?:-)/i, /^(?:[0-9]+)/i, /^(?:\s)/i, /^(?:;)/i, /^(?:[!"#$%&'*+,-.`?\\_/])/i, /^(?:$)/i], + conditions: { "class_name": { "rules": [28], "inclusive": false }, "point_y": { "rules": [33], "inclusive": false }, "point_x": { "rules": [32], "inclusive": false }, "point_start": { "rules": [30, 31], "inclusive": false }, "acc_descr_multiline": { "rules": [11, 12], "inclusive": false }, "acc_descr": { "rules": [9], "inclusive": false }, "acc_title": { "rules": [7], "inclusive": false }, "title": { "rules": [5], "inclusive": false }, "md_string": { "rules": [22, 23], "inclusive": false }, "string": { "rules": [25, 26], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 6, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 27, 29, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var quadrant_default = parser; + +// src/diagrams/quadrant-chart/quadrantBuilder.ts +import { scaleLinear } from "d3"; +var defaultThemeVariables = getThemeVariables(); +var QuadrantBuilder = class { + constructor() { + this.classes = /* @__PURE__ */ new Map(); + this.config = this.getDefaultConfig(); + this.themeConfig = this.getDefaultThemeConfig(); + this.data = this.getDefaultData(); + } + static { + __name(this, "QuadrantBuilder"); + } + getDefaultData() { + return { + titleText: "", + quadrant1Text: "", + quadrant2Text: "", + quadrant3Text: "", + quadrant4Text: "", + xAxisLeftText: "", + xAxisRightText: "", + yAxisBottomText: "", + yAxisTopText: "", + points: [] + }; + } + getDefaultConfig() { + return { + showXAxis: true, + showYAxis: true, + showTitle: true, + chartHeight: defaultConfig_default.quadrantChart?.chartWidth || 500, + chartWidth: defaultConfig_default.quadrantChart?.chartHeight || 500, + titlePadding: defaultConfig_default.quadrantChart?.titlePadding || 10, + titleFontSize: defaultConfig_default.quadrantChart?.titleFontSize || 20, + quadrantPadding: defaultConfig_default.quadrantChart?.quadrantPadding || 5, + xAxisLabelPadding: defaultConfig_default.quadrantChart?.xAxisLabelPadding || 5, + yAxisLabelPadding: defaultConfig_default.quadrantChart?.yAxisLabelPadding || 5, + xAxisLabelFontSize: defaultConfig_default.quadrantChart?.xAxisLabelFontSize || 16, + yAxisLabelFontSize: defaultConfig_default.quadrantChart?.yAxisLabelFontSize || 16, + quadrantLabelFontSize: defaultConfig_default.quadrantChart?.quadrantLabelFontSize || 16, + quadrantTextTopPadding: defaultConfig_default.quadrantChart?.quadrantTextTopPadding || 5, + pointTextPadding: defaultConfig_default.quadrantChart?.pointTextPadding || 5, + pointLabelFontSize: defaultConfig_default.quadrantChart?.pointLabelFontSize || 12, + pointRadius: defaultConfig_default.quadrantChart?.pointRadius || 5, + xAxisPosition: defaultConfig_default.quadrantChart?.xAxisPosition || "top", + yAxisPosition: defaultConfig_default.quadrantChart?.yAxisPosition || "left", + quadrantInternalBorderStrokeWidth: defaultConfig_default.quadrantChart?.quadrantInternalBorderStrokeWidth || 1, + quadrantExternalBorderStrokeWidth: defaultConfig_default.quadrantChart?.quadrantExternalBorderStrokeWidth || 2 + }; + } + getDefaultThemeConfig() { + return { + quadrant1Fill: defaultThemeVariables.quadrant1Fill, + quadrant2Fill: defaultThemeVariables.quadrant2Fill, + quadrant3Fill: defaultThemeVariables.quadrant3Fill, + quadrant4Fill: defaultThemeVariables.quadrant4Fill, + quadrant1TextFill: defaultThemeVariables.quadrant1TextFill, + quadrant2TextFill: defaultThemeVariables.quadrant2TextFill, + quadrant3TextFill: defaultThemeVariables.quadrant3TextFill, + quadrant4TextFill: defaultThemeVariables.quadrant4TextFill, + quadrantPointFill: defaultThemeVariables.quadrantPointFill, + quadrantPointTextFill: defaultThemeVariables.quadrantPointTextFill, + quadrantXAxisTextFill: defaultThemeVariables.quadrantXAxisTextFill, + quadrantYAxisTextFill: defaultThemeVariables.quadrantYAxisTextFill, + quadrantTitleFill: defaultThemeVariables.quadrantTitleFill, + quadrantInternalBorderStrokeFill: defaultThemeVariables.quadrantInternalBorderStrokeFill, + quadrantExternalBorderStrokeFill: defaultThemeVariables.quadrantExternalBorderStrokeFill + }; + } + clear() { + this.config = this.getDefaultConfig(); + this.themeConfig = this.getDefaultThemeConfig(); + this.data = this.getDefaultData(); + this.classes = /* @__PURE__ */ new Map(); + log.info("clear called"); + } + setData(data) { + this.data = { ...this.data, ...data }; + } + addPoints(points) { + this.data.points = [...points, ...this.data.points]; + } + addClass(className, styles) { + this.classes.set(className, styles); + } + setConfig(config2) { + log.trace("setConfig called with: ", config2); + this.config = { ...this.config, ...config2 }; + } + setThemeConfig(themeConfig) { + log.trace("setThemeConfig called with: ", themeConfig); + this.themeConfig = { ...this.themeConfig, ...themeConfig }; + } + calculateSpace(xAxisPosition, showXAxis, showYAxis, showTitle) { + const xAxisSpaceCalculation = this.config.xAxisLabelPadding * 2 + this.config.xAxisLabelFontSize; + const xAxisSpace = { + top: xAxisPosition === "top" && showXAxis ? xAxisSpaceCalculation : 0, + bottom: xAxisPosition === "bottom" && showXAxis ? xAxisSpaceCalculation : 0 + }; + const yAxisSpaceCalculation = this.config.yAxisLabelPadding * 2 + this.config.yAxisLabelFontSize; + const yAxisSpace = { + left: this.config.yAxisPosition === "left" && showYAxis ? yAxisSpaceCalculation : 0, + right: this.config.yAxisPosition === "right" && showYAxis ? yAxisSpaceCalculation : 0 + }; + const titleSpaceCalculation = this.config.titleFontSize + this.config.titlePadding * 2; + const titleSpace = { + top: showTitle ? titleSpaceCalculation : 0 + }; + const quadrantLeft = this.config.quadrantPadding + yAxisSpace.left; + const quadrantTop = this.config.quadrantPadding + xAxisSpace.top + titleSpace.top; + const quadrantWidth = this.config.chartWidth - this.config.quadrantPadding * 2 - yAxisSpace.left - yAxisSpace.right; + const quadrantHeight = this.config.chartHeight - this.config.quadrantPadding * 2 - xAxisSpace.top - xAxisSpace.bottom - titleSpace.top; + const quadrantHalfWidth = quadrantWidth / 2; + const quadrantHalfHeight = quadrantHeight / 2; + const quadrantSpace = { + quadrantLeft, + quadrantTop, + quadrantWidth, + quadrantHalfWidth, + quadrantHeight, + quadrantHalfHeight + }; + return { + xAxisSpace, + yAxisSpace, + titleSpace, + quadrantSpace + }; + } + getAxisLabels(xAxisPosition, showXAxis, showYAxis, spaceData) { + const { quadrantSpace, titleSpace } = spaceData; + const { + quadrantHalfHeight, + quadrantHeight, + quadrantLeft, + quadrantHalfWidth, + quadrantTop, + quadrantWidth + } = quadrantSpace; + const drawXAxisLabelsInMiddle = Boolean(this.data.xAxisRightText); + const drawYAxisLabelsInMiddle = Boolean(this.data.yAxisTopText); + const axisLabels = []; + if (this.data.xAxisLeftText && showXAxis) { + axisLabels.push({ + text: this.data.xAxisLeftText, + fill: this.themeConfig.quadrantXAxisTextFill, + x: quadrantLeft + (drawXAxisLabelsInMiddle ? quadrantHalfWidth / 2 : 0), + y: xAxisPosition === "top" ? this.config.xAxisLabelPadding + titleSpace.top : this.config.xAxisLabelPadding + quadrantTop + quadrantHeight + this.config.quadrantPadding, + fontSize: this.config.xAxisLabelFontSize, + verticalPos: drawXAxisLabelsInMiddle ? "center" : "left", + horizontalPos: "top", + rotation: 0 + }); + } + if (this.data.xAxisRightText && showXAxis) { + axisLabels.push({ + text: this.data.xAxisRightText, + fill: this.themeConfig.quadrantXAxisTextFill, + x: quadrantLeft + quadrantHalfWidth + (drawXAxisLabelsInMiddle ? quadrantHalfWidth / 2 : 0), + y: xAxisPosition === "top" ? this.config.xAxisLabelPadding + titleSpace.top : this.config.xAxisLabelPadding + quadrantTop + quadrantHeight + this.config.quadrantPadding, + fontSize: this.config.xAxisLabelFontSize, + verticalPos: drawXAxisLabelsInMiddle ? "center" : "left", + horizontalPos: "top", + rotation: 0 + }); + } + if (this.data.yAxisBottomText && showYAxis) { + axisLabels.push({ + text: this.data.yAxisBottomText, + fill: this.themeConfig.quadrantYAxisTextFill, + x: this.config.yAxisPosition === "left" ? this.config.yAxisLabelPadding : this.config.yAxisLabelPadding + quadrantLeft + quadrantWidth + this.config.quadrantPadding, + y: quadrantTop + quadrantHeight - (drawYAxisLabelsInMiddle ? quadrantHalfHeight / 2 : 0), + fontSize: this.config.yAxisLabelFontSize, + verticalPos: drawYAxisLabelsInMiddle ? "center" : "left", + horizontalPos: "top", + rotation: -90 + }); + } + if (this.data.yAxisTopText && showYAxis) { + axisLabels.push({ + text: this.data.yAxisTopText, + fill: this.themeConfig.quadrantYAxisTextFill, + x: this.config.yAxisPosition === "left" ? this.config.yAxisLabelPadding : this.config.yAxisLabelPadding + quadrantLeft + quadrantWidth + this.config.quadrantPadding, + y: quadrantTop + quadrantHalfHeight - (drawYAxisLabelsInMiddle ? quadrantHalfHeight / 2 : 0), + fontSize: this.config.yAxisLabelFontSize, + verticalPos: drawYAxisLabelsInMiddle ? "center" : "left", + horizontalPos: "top", + rotation: -90 + }); + } + return axisLabels; + } + getQuadrants(spaceData) { + const { quadrantSpace } = spaceData; + const { quadrantHalfHeight, quadrantLeft, quadrantHalfWidth, quadrantTop } = quadrantSpace; + const quadrants = [ + { + text: { + text: this.data.quadrant1Text, + fill: this.themeConfig.quadrant1TextFill, + x: 0, + y: 0, + fontSize: this.config.quadrantLabelFontSize, + verticalPos: "center", + horizontalPos: "middle", + rotation: 0 + }, + x: quadrantLeft + quadrantHalfWidth, + y: quadrantTop, + width: quadrantHalfWidth, + height: quadrantHalfHeight, + fill: this.themeConfig.quadrant1Fill + }, + { + text: { + text: this.data.quadrant2Text, + fill: this.themeConfig.quadrant2TextFill, + x: 0, + y: 0, + fontSize: this.config.quadrantLabelFontSize, + verticalPos: "center", + horizontalPos: "middle", + rotation: 0 + }, + x: quadrantLeft, + y: quadrantTop, + width: quadrantHalfWidth, + height: quadrantHalfHeight, + fill: this.themeConfig.quadrant2Fill + }, + { + text: { + text: this.data.quadrant3Text, + fill: this.themeConfig.quadrant3TextFill, + x: 0, + y: 0, + fontSize: this.config.quadrantLabelFontSize, + verticalPos: "center", + horizontalPos: "middle", + rotation: 0 + }, + x: quadrantLeft, + y: quadrantTop + quadrantHalfHeight, + width: quadrantHalfWidth, + height: quadrantHalfHeight, + fill: this.themeConfig.quadrant3Fill + }, + { + text: { + text: this.data.quadrant4Text, + fill: this.themeConfig.quadrant4TextFill, + x: 0, + y: 0, + fontSize: this.config.quadrantLabelFontSize, + verticalPos: "center", + horizontalPos: "middle", + rotation: 0 + }, + x: quadrantLeft + quadrantHalfWidth, + y: quadrantTop + quadrantHalfHeight, + width: quadrantHalfWidth, + height: quadrantHalfHeight, + fill: this.themeConfig.quadrant4Fill + } + ]; + for (const quadrant of quadrants) { + quadrant.text.x = quadrant.x + quadrant.width / 2; + if (this.data.points.length === 0) { + quadrant.text.y = quadrant.y + quadrant.height / 2; + quadrant.text.horizontalPos = "middle"; + } else { + quadrant.text.y = quadrant.y + this.config.quadrantTextTopPadding; + quadrant.text.horizontalPos = "top"; + } + } + return quadrants; + } + getQuadrantPoints(spaceData) { + const { quadrantSpace } = spaceData; + const { quadrantHeight, quadrantLeft, quadrantTop, quadrantWidth } = quadrantSpace; + const xAxis = scaleLinear().domain([0, 1]).range([quadrantLeft, quadrantWidth + quadrantLeft]); + const yAxis = scaleLinear().domain([0, 1]).range([quadrantHeight + quadrantTop, quadrantTop]); + const points = this.data.points.map((point) => { + const classStyles = this.classes.get(point.className); + if (classStyles) { + point = { ...classStyles, ...point }; + } + const props = { + x: xAxis(point.x), + y: yAxis(point.y), + fill: point.color ?? this.themeConfig.quadrantPointFill, + radius: point.radius ?? this.config.pointRadius, + text: { + text: point.text, + fill: this.themeConfig.quadrantPointTextFill, + x: xAxis(point.x), + y: yAxis(point.y) + this.config.pointTextPadding, + verticalPos: "center", + horizontalPos: "top", + fontSize: this.config.pointLabelFontSize, + rotation: 0 + }, + strokeColor: point.strokeColor ?? this.themeConfig.quadrantPointFill, + strokeWidth: point.strokeWidth ?? "0px" + }; + return props; + }); + return points; + } + getBorders(spaceData) { + const halfExternalBorderWidth = this.config.quadrantExternalBorderStrokeWidth / 2; + const { quadrantSpace } = spaceData; + const { + quadrantHalfHeight, + quadrantHeight, + quadrantLeft, + quadrantHalfWidth, + quadrantTop, + quadrantWidth + } = quadrantSpace; + const borderLines = [ + // top border + { + strokeFill: this.themeConfig.quadrantExternalBorderStrokeFill, + strokeWidth: this.config.quadrantExternalBorderStrokeWidth, + x1: quadrantLeft - halfExternalBorderWidth, + y1: quadrantTop, + x2: quadrantLeft + quadrantWidth + halfExternalBorderWidth, + y2: quadrantTop + }, + // right border + { + strokeFill: this.themeConfig.quadrantExternalBorderStrokeFill, + strokeWidth: this.config.quadrantExternalBorderStrokeWidth, + x1: quadrantLeft + quadrantWidth, + y1: quadrantTop + halfExternalBorderWidth, + x2: quadrantLeft + quadrantWidth, + y2: quadrantTop + quadrantHeight - halfExternalBorderWidth + }, + // bottom border + { + strokeFill: this.themeConfig.quadrantExternalBorderStrokeFill, + strokeWidth: this.config.quadrantExternalBorderStrokeWidth, + x1: quadrantLeft - halfExternalBorderWidth, + y1: quadrantTop + quadrantHeight, + x2: quadrantLeft + quadrantWidth + halfExternalBorderWidth, + y2: quadrantTop + quadrantHeight + }, + // left border + { + strokeFill: this.themeConfig.quadrantExternalBorderStrokeFill, + strokeWidth: this.config.quadrantExternalBorderStrokeWidth, + x1: quadrantLeft, + y1: quadrantTop + halfExternalBorderWidth, + x2: quadrantLeft, + y2: quadrantTop + quadrantHeight - halfExternalBorderWidth + }, + // vertical inner border + { + strokeFill: this.themeConfig.quadrantInternalBorderStrokeFill, + strokeWidth: this.config.quadrantInternalBorderStrokeWidth, + x1: quadrantLeft + quadrantHalfWidth, + y1: quadrantTop + halfExternalBorderWidth, + x2: quadrantLeft + quadrantHalfWidth, + y2: quadrantTop + quadrantHeight - halfExternalBorderWidth + }, + // horizontal inner border + { + strokeFill: this.themeConfig.quadrantInternalBorderStrokeFill, + strokeWidth: this.config.quadrantInternalBorderStrokeWidth, + x1: quadrantLeft + halfExternalBorderWidth, + y1: quadrantTop + quadrantHalfHeight, + x2: quadrantLeft + quadrantWidth - halfExternalBorderWidth, + y2: quadrantTop + quadrantHalfHeight + } + ]; + return borderLines; + } + getTitle(showTitle) { + if (showTitle) { + return { + text: this.data.titleText, + fill: this.themeConfig.quadrantTitleFill, + fontSize: this.config.titleFontSize, + horizontalPos: "top", + verticalPos: "center", + rotation: 0, + y: this.config.titlePadding, + x: this.config.chartWidth / 2 + }; + } + return; + } + build() { + const showXAxis = this.config.showXAxis && !!(this.data.xAxisLeftText || this.data.xAxisRightText); + const showYAxis = this.config.showYAxis && !!(this.data.yAxisTopText || this.data.yAxisBottomText); + const showTitle = this.config.showTitle && !!this.data.titleText; + const xAxisPosition = this.data.points.length > 0 ? "bottom" : this.config.xAxisPosition; + const calculatedSpace = this.calculateSpace(xAxisPosition, showXAxis, showYAxis, showTitle); + return { + points: this.getQuadrantPoints(calculatedSpace), + quadrants: this.getQuadrants(calculatedSpace), + axisLabels: this.getAxisLabels(xAxisPosition, showXAxis, showYAxis, calculatedSpace), + borderLines: this.getBorders(calculatedSpace), + title: this.getTitle(showTitle) + }; + } +}; + +// src/diagrams/quadrant-chart/utils.ts +var InvalidStyleError = class extends Error { + static { + __name(this, "InvalidStyleError"); + } + constructor(style, value, type) { + super(`value for ${style} ${value} is invalid, please use a valid ${type}`); + this.name = "InvalidStyleError"; + } +}; +function validateHexCode(value) { + return !/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(value); +} +__name(validateHexCode, "validateHexCode"); +function validateNumber(value) { + return !/^\d+$/.test(value); +} +__name(validateNumber, "validateNumber"); +function validateSizeInPixels(value) { + return !/^\d+px$/.test(value); +} +__name(validateSizeInPixels, "validateSizeInPixels"); + +// src/diagrams/quadrant-chart/quadrantDb.ts +var config = getConfig(); +function textSanitizer(text) { + return sanitizeText(text.trim(), config); +} +__name(textSanitizer, "textSanitizer"); +var quadrantBuilder = new QuadrantBuilder(); +function setQuadrant1Text(textObj) { + quadrantBuilder.setData({ quadrant1Text: textSanitizer(textObj.text) }); +} +__name(setQuadrant1Text, "setQuadrant1Text"); +function setQuadrant2Text(textObj) { + quadrantBuilder.setData({ quadrant2Text: textSanitizer(textObj.text) }); +} +__name(setQuadrant2Text, "setQuadrant2Text"); +function setQuadrant3Text(textObj) { + quadrantBuilder.setData({ quadrant3Text: textSanitizer(textObj.text) }); +} +__name(setQuadrant3Text, "setQuadrant3Text"); +function setQuadrant4Text(textObj) { + quadrantBuilder.setData({ quadrant4Text: textSanitizer(textObj.text) }); +} +__name(setQuadrant4Text, "setQuadrant4Text"); +function setXAxisLeftText(textObj) { + quadrantBuilder.setData({ xAxisLeftText: textSanitizer(textObj.text) }); +} +__name(setXAxisLeftText, "setXAxisLeftText"); +function setXAxisRightText(textObj) { + quadrantBuilder.setData({ xAxisRightText: textSanitizer(textObj.text) }); +} +__name(setXAxisRightText, "setXAxisRightText"); +function setYAxisTopText(textObj) { + quadrantBuilder.setData({ yAxisTopText: textSanitizer(textObj.text) }); +} +__name(setYAxisTopText, "setYAxisTopText"); +function setYAxisBottomText(textObj) { + quadrantBuilder.setData({ yAxisBottomText: textSanitizer(textObj.text) }); +} +__name(setYAxisBottomText, "setYAxisBottomText"); +function parseStyles(styles) { + const stylesObject = {}; + for (const style of styles) { + const [key, value] = style.trim().split(/\s*:\s*/); + if (key === "radius") { + if (validateNumber(value)) { + throw new InvalidStyleError(key, value, "number"); + } + stylesObject.radius = parseInt(value); + } else if (key === "color") { + if (validateHexCode(value)) { + throw new InvalidStyleError(key, value, "hex code"); + } + stylesObject.color = value; + } else if (key === "stroke-color") { + if (validateHexCode(value)) { + throw new InvalidStyleError(key, value, "hex code"); + } + stylesObject.strokeColor = value; + } else if (key === "stroke-width") { + if (validateSizeInPixels(value)) { + throw new InvalidStyleError(key, value, "number of pixels (eg. 10px)"); + } + stylesObject.strokeWidth = value; + } else { + throw new Error(`style named ${key} is not supported.`); + } + } + return stylesObject; +} +__name(parseStyles, "parseStyles"); +function addPoint(textObj, className, x, y, styles) { + const stylesObject = parseStyles(styles); + quadrantBuilder.addPoints([ + { + x, + y, + text: textSanitizer(textObj.text), + className, + ...stylesObject + } + ]); +} +__name(addPoint, "addPoint"); +function addClass(className, styles) { + quadrantBuilder.addClass(className, parseStyles(styles)); +} +__name(addClass, "addClass"); +function setWidth(width) { + quadrantBuilder.setConfig({ chartWidth: width }); +} +__name(setWidth, "setWidth"); +function setHeight(height) { + quadrantBuilder.setConfig({ chartHeight: height }); +} +__name(setHeight, "setHeight"); +function getQuadrantData() { + const config2 = getConfig(); + const { themeVariables, quadrantChart: quadrantChartConfig } = config2; + if (quadrantChartConfig) { + quadrantBuilder.setConfig(quadrantChartConfig); + } + quadrantBuilder.setThemeConfig({ + quadrant1Fill: themeVariables.quadrant1Fill, + quadrant2Fill: themeVariables.quadrant2Fill, + quadrant3Fill: themeVariables.quadrant3Fill, + quadrant4Fill: themeVariables.quadrant4Fill, + quadrant1TextFill: themeVariables.quadrant1TextFill, + quadrant2TextFill: themeVariables.quadrant2TextFill, + quadrant3TextFill: themeVariables.quadrant3TextFill, + quadrant4TextFill: themeVariables.quadrant4TextFill, + quadrantPointFill: themeVariables.quadrantPointFill, + quadrantPointTextFill: themeVariables.quadrantPointTextFill, + quadrantXAxisTextFill: themeVariables.quadrantXAxisTextFill, + quadrantYAxisTextFill: themeVariables.quadrantYAxisTextFill, + quadrantExternalBorderStrokeFill: themeVariables.quadrantExternalBorderStrokeFill, + quadrantInternalBorderStrokeFill: themeVariables.quadrantInternalBorderStrokeFill, + quadrantTitleFill: themeVariables.quadrantTitleFill + }); + quadrantBuilder.setData({ titleText: getDiagramTitle() }); + return quadrantBuilder.build(); +} +__name(getQuadrantData, "getQuadrantData"); +var clear2 = /* @__PURE__ */ __name(function() { + quadrantBuilder.clear(); + clear(); +}, "clear"); +var quadrantDb_default = { + setWidth, + setHeight, + setQuadrant1Text, + setQuadrant2Text, + setQuadrant3Text, + setQuadrant4Text, + setXAxisLeftText, + setXAxisRightText, + setYAxisTopText, + setYAxisBottomText, + parseStyles, + addPoint, + addClass, + getQuadrantData, + clear: clear2, + setAccTitle, + getAccTitle, + setDiagramTitle, + getDiagramTitle, + getAccDescription, + setAccDescription +}; + +// src/diagrams/quadrant-chart/quadrantRenderer.ts +import { select } from "d3"; +var draw = /* @__PURE__ */ __name((txt, id, _version, diagObj) => { + function getDominantBaseLine(horizontalPos) { + return horizontalPos === "top" ? "hanging" : "middle"; + } + __name(getDominantBaseLine, "getDominantBaseLine"); + function getTextAnchor(verticalPos) { + return verticalPos === "left" ? "start" : "middle"; + } + __name(getTextAnchor, "getTextAnchor"); + function getTransformation(data) { + return `translate(${data.x}, ${data.y}) rotate(${data.rotation || 0})`; + } + __name(getTransformation, "getTransformation"); + const conf = getConfig(); + log.debug("Rendering quadrant chart\n" + txt); + const securityLevel = conf.securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = select("#i" + id); + } + const root = securityLevel === "sandbox" ? select(sandboxElement.nodes()[0].contentDocument.body) : select("body"); + const svg = root.select(`[id="${id}"]`); + const group = svg.append("g").attr("class", "main"); + const width = conf.quadrantChart?.chartWidth ?? 500; + const height = conf.quadrantChart?.chartHeight ?? 500; + configureSvgSize(svg, height, width, conf.quadrantChart?.useMaxWidth ?? true); + svg.attr("viewBox", "0 0 " + width + " " + height); + diagObj.db.setHeight(height); + diagObj.db.setWidth(width); + const quadrantData = diagObj.db.getQuadrantData(); + const quadrantsGroup = group.append("g").attr("class", "quadrants"); + const borderGroup = group.append("g").attr("class", "border"); + const dataPointGroup = group.append("g").attr("class", "data-points"); + const labelGroup = group.append("g").attr("class", "labels"); + const titleGroup = group.append("g").attr("class", "title"); + if (quadrantData.title) { + titleGroup.append("text").attr("x", 0).attr("y", 0).attr("fill", quadrantData.title.fill).attr("font-size", quadrantData.title.fontSize).attr("dominant-baseline", getDominantBaseLine(quadrantData.title.horizontalPos)).attr("text-anchor", getTextAnchor(quadrantData.title.verticalPos)).attr("transform", getTransformation(quadrantData.title)).text(quadrantData.title.text); + } + if (quadrantData.borderLines) { + borderGroup.selectAll("line").data(quadrantData.borderLines).enter().append("line").attr("x1", (data) => data.x1).attr("y1", (data) => data.y1).attr("x2", (data) => data.x2).attr("y2", (data) => data.y2).style("stroke", (data) => data.strokeFill).style("stroke-width", (data) => data.strokeWidth); + } + const quadrants = quadrantsGroup.selectAll("g.quadrant").data(quadrantData.quadrants).enter().append("g").attr("class", "quadrant"); + quadrants.append("rect").attr("x", (data) => data.x).attr("y", (data) => data.y).attr("width", (data) => data.width).attr("height", (data) => data.height).attr("fill", (data) => data.fill); + quadrants.append("text").attr("x", 0).attr("y", 0).attr("fill", (data) => data.text.fill).attr("font-size", (data) => data.text.fontSize).attr( + "dominant-baseline", + (data) => getDominantBaseLine(data.text.horizontalPos) + ).attr("text-anchor", (data) => getTextAnchor(data.text.verticalPos)).attr("transform", (data) => getTransformation(data.text)).text((data) => data.text.text); + const labels = labelGroup.selectAll("g.label").data(quadrantData.axisLabels).enter().append("g").attr("class", "label"); + labels.append("text").attr("x", 0).attr("y", 0).text((data) => data.text).attr("fill", (data) => data.fill).attr("font-size", (data) => data.fontSize).attr("dominant-baseline", (data) => getDominantBaseLine(data.horizontalPos)).attr("text-anchor", (data) => getTextAnchor(data.verticalPos)).attr("transform", (data) => getTransformation(data)); + const dataPoints = dataPointGroup.selectAll("g.data-point").data(quadrantData.points).enter().append("g").attr("class", "data-point"); + dataPoints.append("circle").attr("cx", (data) => data.x).attr("cy", (data) => data.y).attr("r", (data) => data.radius).attr("fill", (data) => data.fill).attr("stroke", (data) => data.strokeColor).attr("stroke-width", (data) => data.strokeWidth); + dataPoints.append("text").attr("x", 0).attr("y", 0).text((data) => data.text.text).attr("fill", (data) => data.text.fill).attr("font-size", (data) => data.text.fontSize).attr( + "dominant-baseline", + (data) => getDominantBaseLine(data.text.horizontalPos) + ).attr("text-anchor", (data) => getTextAnchor(data.text.verticalPos)).attr("transform", (data) => getTransformation(data.text)); +}, "draw"); +var quadrantRenderer_default = { + draw +}; + +// src/diagrams/quadrant-chart/quadrantDiagram.ts +var diagram = { + parser: quadrant_default, + db: quadrantDb_default, + renderer: quadrantRenderer_default, + styles: /* @__PURE__ */ __name(() => "", "styles") +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/quadrantDiagram-AYHSOK5B.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/quadrantDiagram-AYHSOK5B.mjs.map new file mode 100644 index 0000000..4b371e3 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/quadrantDiagram-AYHSOK5B.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/quadrant-chart/parser/quadrant.jison", "../../../src/diagrams/quadrant-chart/quadrantBuilder.ts", "../../../src/diagrams/quadrant-chart/utils.ts", "../../../src/diagrams/quadrant-chart/quadrantDb.ts", "../../../src/diagrams/quadrant-chart/quadrantRenderer.ts", "../../../src/diagrams/quadrant-chart/quadrantDiagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,3],$V1=[1,4],$V2=[1,5],$V3=[1,6],$V4=[1,7],$V5=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],$V6=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],$V7=[55,56,57],$V8=[2,36],$V9=[1,37],$Va=[1,36],$Vb=[1,38],$Vc=[1,35],$Vd=[1,43],$Ve=[1,41],$Vf=[1,14],$Vg=[1,23],$Vh=[1,18],$Vi=[1,19],$Vj=[1,20],$Vk=[1,21],$Vl=[1,22],$Vm=[1,24],$Vn=[1,25],$Vo=[1,26],$Vp=[1,27],$Vq=[1,28],$Vr=[1,29],$Vs=[1,32],$Vt=[1,33],$Vu=[1,34],$Vv=[1,39],$Vw=[1,40],$Vx=[1,42],$Vy=[1,44],$Vz=[1,62],$VA=[1,61],$VB=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],$VC=[1,65],$VD=[1,66],$VE=[1,67],$VF=[1,68],$VG=[1,69],$VH=[1,70],$VI=[1,71],$VJ=[1,72],$VK=[1,73],$VL=[1,74],$VM=[1,75],$VN=[1,76],$VO=[4,5,6,7,8,9,10,11,12,13,14,15,18],$VP=[1,90],$VQ=[1,91],$VR=[1,92],$VS=[1,99],$VT=[1,93],$VU=[1,96],$VV=[1,94],$VW=[1,95],$VX=[1,97],$VY=[1,98],$VZ=[1,102],$V_=[10,55,56,57],$V$=[4,5,6,8,10,11,13,17,18,19,20,55,56,57];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"idStringToken\":3,\"ALPHA\":4,\"NUM\":5,\"NODE_STRING\":6,\"DOWN\":7,\"MINUS\":8,\"DEFAULT\":9,\"COMMA\":10,\"COLON\":11,\"AMP\":12,\"BRKT\":13,\"MULT\":14,\"UNICODE_TEXT\":15,\"styleComponent\":16,\"UNIT\":17,\"SPACE\":18,\"STYLE\":19,\"PCT\":20,\"idString\":21,\"style\":22,\"stylesOpt\":23,\"classDefStatement\":24,\"CLASSDEF\":25,\"start\":26,\"eol\":27,\"QUADRANT\":28,\"document\":29,\"line\":30,\"statement\":31,\"axisDetails\":32,\"quadrantDetails\":33,\"points\":34,\"title\":35,\"title_value\":36,\"acc_title\":37,\"acc_title_value\":38,\"acc_descr\":39,\"acc_descr_value\":40,\"acc_descr_multiline_value\":41,\"section\":42,\"text\":43,\"point_start\":44,\"point_x\":45,\"point_y\":46,\"class_name\":47,\"X-AXIS\":48,\"AXIS-TEXT-DELIMITER\":49,\"Y-AXIS\":50,\"QUADRANT_1\":51,\"QUADRANT_2\":52,\"QUADRANT_3\":53,\"QUADRANT_4\":54,\"NEWLINE\":55,\"SEMI\":56,\"EOF\":57,\"alphaNumToken\":58,\"textNoTagsToken\":59,\"STR\":60,\"MD_STR\":61,\"alphaNum\":62,\"PUNCTUATION\":63,\"PLUS\":64,\"EQUALS\":65,\"DOT\":66,\"UNDERSCORE\":67,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"ALPHA\",5:\"NUM\",6:\"NODE_STRING\",7:\"DOWN\",8:\"MINUS\",9:\"DEFAULT\",10:\"COMMA\",11:\"COLON\",12:\"AMP\",13:\"BRKT\",14:\"MULT\",15:\"UNICODE_TEXT\",17:\"UNIT\",18:\"SPACE\",19:\"STYLE\",20:\"PCT\",25:\"CLASSDEF\",28:\"QUADRANT\",35:\"title\",36:\"title_value\",37:\"acc_title\",38:\"acc_title_value\",39:\"acc_descr\",40:\"acc_descr_value\",41:\"acc_descr_multiline_value\",42:\"section\",44:\"point_start\",45:\"point_x\",46:\"point_y\",47:\"class_name\",48:\"X-AXIS\",49:\"AXIS-TEXT-DELIMITER\",50:\"Y-AXIS\",51:\"QUADRANT_1\",52:\"QUADRANT_2\",53:\"QUADRANT_3\",54:\"QUADRANT_4\",55:\"NEWLINE\",56:\"SEMI\",57:\"EOF\",60:\"STR\",61:\"MD_STR\",63:\"PUNCTUATION\",64:\"PLUS\",65:\"EQUALS\",66:\"DOT\",67:\"UNDERSCORE\"},\nproductions_: [0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 23:\nthis.$=$$[$0]\nbreak;\ncase 24:\nthis.$=$$[$0-1]+''+$$[$0]\nbreak;\ncase 26:\nthis.$ = $$[$0-1] + $$[$0];\nbreak;\ncase 27:\nthis.$ = [$$[$0].trim()]\nbreak;\ncase 28:\n$$[$0-2].push($$[$0].trim());this.$ = $$[$0-2];\nbreak;\ncase 29:\nthis.$ = $$[$0-4];yy.addClass($$[$0-2],$$[$0]);\nbreak;\ncase 37:\nthis.$=[];\nbreak;\ncase 42:\n this.$=$$[$0].trim();yy.setDiagramTitle(this.$); \nbreak;\ncase 43:\n this.$=$$[$0].trim();yy.setAccTitle(this.$); \nbreak;\ncase 44: case 45:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 46:\nyy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8);\nbreak;\ncase 47:\nyy.addPoint($$[$0-3], \"\", $$[$0-1], $$[$0], []);\nbreak;\ncase 48:\nyy.addPoint($$[$0-4], $$[$0-3], $$[$0-1], $$[$0], []);\nbreak;\ncase 49:\nyy.addPoint($$[$0-4], \"\", $$[$0-2], $$[$0-1], $$[$0]);\nbreak;\ncase 50:\nyy.addPoint($$[$0-5], $$[$0-4], $$[$0-2], $$[$0-1], $$[$0]);\nbreak;\ncase 51:\nyy.setXAxisLeftText($$[$0-2]); yy.setXAxisRightText($$[$0]);\nbreak;\ncase 52:\n$$[$0-1].text += \" \u27F6 \"; yy.setXAxisLeftText($$[$0-1]);\nbreak;\ncase 53:\nyy.setXAxisLeftText($$[$0]);\nbreak;\ncase 54:\nyy.setYAxisBottomText($$[$0-2]); yy.setYAxisTopText($$[$0]);\nbreak;\ncase 55:\n$$[$0-1].text += \" \u27F6 \"; yy.setYAxisBottomText($$[$0-1]);\nbreak;\ncase 56:\nyy.setYAxisBottomText($$[$0]);\nbreak;\ncase 57:\nyy.setQuadrant1Text($$[$0])\nbreak;\ncase 58:\nyy.setQuadrant2Text($$[$0])\nbreak;\ncase 59:\nyy.setQuadrant3Text($$[$0])\nbreak;\ncase 60:\nyy.setQuadrant4Text($$[$0])\nbreak;\ncase 64:\n this.$={text:$$[$0], type: 'text'};\nbreak;\ncase 65:\n this.$={text:$$[$0-1].text+''+$$[$0], type: $$[$0-1].type};\nbreak;\ncase 66:\n this.$={text: $$[$0], type: 'text'};\nbreak;\ncase 67:\n this.$={text: $$[$0], type: 'markdown'};\nbreak;\ncase 68:\nthis.$=$$[$0];\nbreak;\ncase 69:\nthis.$=$$[$0-1]+''+$$[$0];\nbreak;\n}\n},\ntable: [{18:$V0,26:1,27:2,28:$V1,55:$V2,56:$V3,57:$V4},{1:[3]},{18:$V0,26:8,27:2,28:$V1,55:$V2,56:$V3,57:$V4},{18:$V0,26:9,27:2,28:$V1,55:$V2,56:$V3,57:$V4},o($V5,[2,33],{29:10}),o($V6,[2,61]),o($V6,[2,62]),o($V6,[2,63]),{1:[2,30]},{1:[2,31]},o($V7,$V8,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:$V9,5:$Va,10:$Vb,12:$Vc,13:$Vd,14:$Ve,18:$Vf,25:$Vg,35:$Vh,37:$Vi,39:$Vj,41:$Vk,42:$Vl,48:$Vm,50:$Vn,51:$Vo,52:$Vp,53:$Vq,54:$Vr,60:$Vs,61:$Vt,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),o($V5,[2,34]),{27:45,55:$V2,56:$V3,57:$V4},o($V7,[2,37]),o($V7,$V8,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:$V9,5:$Va,10:$Vb,12:$Vc,13:$Vd,14:$Ve,18:$Vf,25:$Vg,35:$Vh,37:$Vi,39:$Vj,41:$Vk,42:$Vl,48:$Vm,50:$Vn,51:$Vo,52:$Vp,53:$Vq,54:$Vr,60:$Vs,61:$Vt,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),o($V7,[2,39]),o($V7,[2,40]),o($V7,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},o($V7,[2,45]),o($V7,[2,46]),{18:[1,50]},{4:$V9,5:$Va,10:$Vb,12:$Vc,13:$Vd,14:$Ve,43:51,58:31,60:$Vs,61:$Vt,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy},{4:$V9,5:$Va,10:$Vb,12:$Vc,13:$Vd,14:$Ve,43:52,58:31,60:$Vs,61:$Vt,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy},{4:$V9,5:$Va,10:$Vb,12:$Vc,13:$Vd,14:$Ve,43:53,58:31,60:$Vs,61:$Vt,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy},{4:$V9,5:$Va,10:$Vb,12:$Vc,13:$Vd,14:$Ve,43:54,58:31,60:$Vs,61:$Vt,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy},{4:$V9,5:$Va,10:$Vb,12:$Vc,13:$Vd,14:$Ve,43:55,58:31,60:$Vs,61:$Vt,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy},{4:$V9,5:$Va,10:$Vb,12:$Vc,13:$Vd,14:$Ve,43:56,58:31,60:$Vs,61:$Vt,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy},{4:$V9,5:$Va,8:$Vz,10:$Vb,12:$Vc,13:$Vd,14:$Ve,18:$VA,44:[1,57],47:[1,58],58:60,59:59,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy},o($VB,[2,64]),o($VB,[2,66]),o($VB,[2,67]),o($VB,[2,70]),o($VB,[2,71]),o($VB,[2,72]),o($VB,[2,73]),o($VB,[2,74]),o($VB,[2,75]),o($VB,[2,76]),o($VB,[2,77]),o($VB,[2,78]),o($VB,[2,79]),o($VB,[2,80]),o($V5,[2,35]),o($V7,[2,38]),o($V7,[2,42]),o($V7,[2,43]),o($V7,[2,44]),{3:64,4:$VC,5:$VD,6:$VE,7:$VF,8:$VG,9:$VH,10:$VI,11:$VJ,12:$VK,13:$VL,14:$VM,15:$VN,21:63},o($V7,[2,53],{59:59,58:60,4:$V9,5:$Va,8:$Vz,10:$Vb,12:$Vc,13:$Vd,14:$Ve,18:$VA,49:[1,77],63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),o($V7,[2,56],{59:59,58:60,4:$V9,5:$Va,8:$Vz,10:$Vb,12:$Vc,13:$Vd,14:$Ve,18:$VA,49:[1,78],63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),o($V7,[2,57],{59:59,58:60,4:$V9,5:$Va,8:$Vz,10:$Vb,12:$Vc,13:$Vd,14:$Ve,18:$VA,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),o($V7,[2,58],{59:59,58:60,4:$V9,5:$Va,8:$Vz,10:$Vb,12:$Vc,13:$Vd,14:$Ve,18:$VA,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),o($V7,[2,59],{59:59,58:60,4:$V9,5:$Va,8:$Vz,10:$Vb,12:$Vc,13:$Vd,14:$Ve,18:$VA,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),o($V7,[2,60],{59:59,58:60,4:$V9,5:$Va,8:$Vz,10:$Vb,12:$Vc,13:$Vd,14:$Ve,18:$VA,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),{45:[1,79]},{44:[1,80]},o($VB,[2,65]),o($VB,[2,81]),o($VB,[2,82]),o($VB,[2,83]),{3:82,4:$VC,5:$VD,6:$VE,7:$VF,8:$VG,9:$VH,10:$VI,11:$VJ,12:$VK,13:$VL,14:$VM,15:$VN,18:[1,81]},o($VO,[2,23]),o($VO,[2,1]),o($VO,[2,2]),o($VO,[2,3]),o($VO,[2,4]),o($VO,[2,5]),o($VO,[2,6]),o($VO,[2,7]),o($VO,[2,8]),o($VO,[2,9]),o($VO,[2,10]),o($VO,[2,11]),o($VO,[2,12]),o($V7,[2,52],{58:31,43:83,4:$V9,5:$Va,10:$Vb,12:$Vc,13:$Vd,14:$Ve,60:$Vs,61:$Vt,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),o($V7,[2,55],{58:31,43:84,4:$V9,5:$Va,10:$Vb,12:$Vc,13:$Vd,14:$Ve,60:$Vs,61:$Vt,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),{46:[1,85]},{45:[1,86]},{4:$VP,5:$VQ,6:$VR,8:$VS,11:$VT,13:$VU,16:89,17:$VV,18:$VW,19:$VX,20:$VY,22:88,23:87},o($VO,[2,24]),o($V7,[2,51],{59:59,58:60,4:$V9,5:$Va,8:$Vz,10:$Vb,12:$Vc,13:$Vd,14:$Ve,18:$VA,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),o($V7,[2,54],{59:59,58:60,4:$V9,5:$Va,8:$Vz,10:$Vb,12:$Vc,13:$Vd,14:$Ve,18:$VA,63:$Vu,64:$Vv,65:$Vw,66:$Vx,67:$Vy}),o($V7,[2,47],{22:88,16:89,23:100,4:$VP,5:$VQ,6:$VR,8:$VS,11:$VT,13:$VU,17:$VV,18:$VW,19:$VX,20:$VY}),{46:[1,101]},o($V7,[2,29],{10:$VZ}),o($V_,[2,27],{16:103,4:$VP,5:$VQ,6:$VR,8:$VS,11:$VT,13:$VU,17:$VV,18:$VW,19:$VX,20:$VY}),o($V$,[2,25]),o($V$,[2,13]),o($V$,[2,14]),o($V$,[2,15]),o($V$,[2,16]),o($V$,[2,17]),o($V$,[2,18]),o($V$,[2,19]),o($V$,[2,20]),o($V$,[2,21]),o($V$,[2,22]),o($V7,[2,49],{10:$VZ}),o($V7,[2,48],{22:88,16:89,23:104,4:$VP,5:$VQ,6:$VR,8:$VS,11:$VT,13:$VU,17:$VV,18:$VW,19:$VX,20:$VY}),{4:$VP,5:$VQ,6:$VR,8:$VS,11:$VT,13:$VU,16:89,17:$VV,18:$VW,19:$VX,20:$VY,22:105},o($V$,[2,26]),o($V7,[2,50],{10:$VZ}),o($V_,[2,28],{16:103,4:$VP,5:$VQ,6:$VR,8:$VS,11:$VT,13:$VU,17:$VV,18:$VW,19:$VX,20:$VY})],\ndefaultActions: {8:[2,30],9:[2,31]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:/* skip comments */\nbreak;\ncase 1:/* skip comments */\nbreak;\ncase 2:return 55;\nbreak;\ncase 3:/* do nothing */\nbreak;\ncase 4: this.begin(\"title\");return 35; \nbreak;\ncase 5: this.popState(); return \"title_value\"; \nbreak;\ncase 6: this.begin(\"acc_title\");return 37; \nbreak;\ncase 7: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 8: this.begin(\"acc_descr\");return 39; \nbreak;\ncase 9: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 10: this.begin(\"acc_descr_multiline\");\nbreak;\ncase 11: this.popState(); \nbreak;\ncase 12:return \"acc_descr_multiline_value\";\nbreak;\ncase 13:return 48;\nbreak;\ncase 14:return 50;\nbreak;\ncase 15:return 49\nbreak;\ncase 16:return 51;\nbreak;\ncase 17:return 52;\nbreak;\ncase 18:return 53;\nbreak;\ncase 19:return 54;\nbreak;\ncase 20:return 25;\nbreak;\ncase 21: this.begin(\"md_string\");\nbreak;\ncase 22: return \"MD_STR\";\nbreak;\ncase 23: this.popState();\nbreak;\ncase 24:this.begin(\"string\");\nbreak;\ncase 25:this.popState();\nbreak;\ncase 26:return \"STR\";\nbreak;\ncase 27:this.begin('class_name')\nbreak;\ncase 28:this.popState(); return 47;\nbreak;\ncase 29:this.begin(\"point_start\"); return 44;\nbreak;\ncase 30:this.begin('point_x'); return 45;\nbreak;\ncase 31:this.popState();\nbreak;\ncase 32:this.popState(); this.begin('point_y');\nbreak;\ncase 33:this.popState(); return 46;\nbreak;\ncase 34:return 28;\nbreak;\ncase 35:return 4;\nbreak;\ncase 36:return 11;\nbreak;\ncase 37:return 64;\nbreak;\ncase 38:return 10;\nbreak;\ncase 39:return 65;\nbreak;\ncase 40:return 65;\nbreak;\ncase 41:return 14;\nbreak;\ncase 42:return 13;\nbreak;\ncase 43:return 67;\nbreak;\ncase 44:return 66;\nbreak;\ncase 45:return 12;\nbreak;\ncase 46:return 8;\nbreak;\ncase 47:return 5;\nbreak;\ncase 48:return 18;\nbreak;\ncase 49:return 56;\nbreak;\ncase 50:return 63;\nbreak;\ncase 51:return 57;\nbreak;\n}\n},\nrules: [/^(?:%%(?!\\{)[^\\n]*)/i,/^(?:[^\\}]%%[^\\n]*)/i,/^(?:[\\n\\r]+)/i,/^(?:%%[^\\n]*)/i,/^(?:title\\b)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accTitle\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*\\{\\s*)/i,/^(?:[\\}])/i,/^(?:[^\\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\\b)/i,/^(?:[\"][`])/i,/^(?:[^`\"]+)/i,/^(?:[`][\"])/i,/^(?:[\"])/i,/^(?:[\"])/i,/^(?:[^\"]*)/i,/^(?::::)/i,/^(?:^\\w+)/i,/^(?:\\s*:\\s*\\[\\s*)/i,/^(?:(1)|(0(.\\d+)?))/i,/^(?:\\s*\\] *)/i,/^(?:\\s*,\\s*)/i,/^(?:(1)|(0(.\\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\\*)/i,/^(?:#)/i,/^(?:[\\_])/i,/^(?:\\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\\s)/i,/^(?:;)/i,/^(?:[!\"#$%&'*+,-.`?\\\\_/])/i,/^(?:$)/i],\nconditions: {\"class_name\":{\"rules\":[28],\"inclusive\":false},\"point_y\":{\"rules\":[33],\"inclusive\":false},\"point_x\":{\"rules\":[32],\"inclusive\":false},\"point_start\":{\"rules\":[30,31],\"inclusive\":false},\"acc_descr_multiline\":{\"rules\":[11,12],\"inclusive\":false},\"acc_descr\":{\"rules\":[9],\"inclusive\":false},\"acc_title\":{\"rules\":[7],\"inclusive\":false},\"title\":{\"rules\":[5],\"inclusive\":false},\"md_string\":{\"rules\":[22,23],\"inclusive\":false},\"string\":{\"rules\":[25,26],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { scaleLinear } from 'd3';\nimport type { BaseDiagramConfig, QuadrantChartConfig } from '../../config.type.js';\nimport defaultConfig from '../../defaultConfig.js';\nimport { log } from '../../logger.js';\nimport { getThemeVariables } from '../../themes/theme-default.js';\nimport type { Point } from '../../types.js';\n\nconst defaultThemeVariables = getThemeVariables();\n\nexport type TextVerticalPos = 'left' | 'center' | 'right';\nexport type TextHorizontalPos = 'top' | 'middle' | 'bottom';\n\nexport interface StylesObject {\n className?: string;\n radius?: number;\n color?: string;\n strokeColor?: string;\n strokeWidth?: string;\n}\n\nexport interface QuadrantPointInputType extends Point, StylesObject {\n text: string;\n}\n\nexport interface QuadrantTextType extends Point {\n text: string;\n fill: string;\n verticalPos: TextVerticalPos;\n horizontalPos: TextHorizontalPos;\n fontSize: number;\n rotation: number;\n}\n\nexport interface QuadrantPointType\n extends Point,\n Pick {\n fill: string;\n radius: number;\n text: QuadrantTextType;\n}\n\nexport interface QuadrantQuadrantsType extends Point {\n text: QuadrantTextType;\n width: number;\n height: number;\n fill: string;\n}\n\nexport interface QuadrantLineType {\n strokeWidth: number;\n strokeFill: string;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n}\n\nexport interface QuadrantBuildType {\n points: QuadrantPointType[];\n quadrants: QuadrantQuadrantsType[];\n axisLabels: QuadrantTextType[];\n title?: QuadrantTextType;\n borderLines?: QuadrantLineType[];\n}\n\nexport interface QuadrantBuilderData {\n titleText: string;\n quadrant1Text: string;\n quadrant2Text: string;\n quadrant3Text: string;\n quadrant4Text: string;\n xAxisLeftText: string;\n xAxisRightText: string;\n yAxisBottomText: string;\n yAxisTopText: string;\n points: QuadrantPointInputType[];\n}\n\nexport interface QuadrantBuilderConfig\n extends Required> {\n showXAxis: boolean;\n showYAxis: boolean;\n showTitle: boolean;\n}\n\nexport interface QuadrantBuilderThemeConfig {\n quadrantTitleFill: string;\n quadrant1Fill: string;\n quadrant2Fill: string;\n quadrant3Fill: string;\n quadrant4Fill: string;\n quadrant1TextFill: string;\n quadrant2TextFill: string;\n quadrant3TextFill: string;\n quadrant4TextFill: string;\n quadrantPointFill: string;\n quadrantPointTextFill: string;\n quadrantXAxisTextFill: string;\n quadrantYAxisTextFill: string;\n quadrantInternalBorderStrokeFill: string;\n quadrantExternalBorderStrokeFill: string;\n}\n\ninterface CalculateSpaceData {\n xAxisSpace: {\n top: number;\n bottom: number;\n };\n yAxisSpace: {\n left: number;\n right: number;\n };\n titleSpace: {\n top: number;\n };\n quadrantSpace: {\n quadrantLeft: number;\n quadrantTop: number;\n quadrantWidth: number;\n quadrantHalfWidth: number;\n quadrantHeight: number;\n quadrantHalfHeight: number;\n };\n}\n\nexport class QuadrantBuilder {\n private config: QuadrantBuilderConfig;\n private themeConfig: QuadrantBuilderThemeConfig;\n private data: QuadrantBuilderData;\n private classes = new Map();\n\n constructor() {\n this.config = this.getDefaultConfig();\n this.themeConfig = this.getDefaultThemeConfig();\n this.data = this.getDefaultData();\n }\n\n getDefaultData(): QuadrantBuilderData {\n return {\n titleText: '',\n quadrant1Text: '',\n quadrant2Text: '',\n quadrant3Text: '',\n quadrant4Text: '',\n xAxisLeftText: '',\n xAxisRightText: '',\n yAxisBottomText: '',\n yAxisTopText: '',\n points: [],\n };\n }\n\n getDefaultConfig(): QuadrantBuilderConfig {\n return {\n showXAxis: true,\n showYAxis: true,\n showTitle: true,\n chartHeight: defaultConfig.quadrantChart?.chartWidth || 500,\n chartWidth: defaultConfig.quadrantChart?.chartHeight || 500,\n titlePadding: defaultConfig.quadrantChart?.titlePadding || 10,\n titleFontSize: defaultConfig.quadrantChart?.titleFontSize || 20,\n quadrantPadding: defaultConfig.quadrantChart?.quadrantPadding || 5,\n xAxisLabelPadding: defaultConfig.quadrantChart?.xAxisLabelPadding || 5,\n yAxisLabelPadding: defaultConfig.quadrantChart?.yAxisLabelPadding || 5,\n xAxisLabelFontSize: defaultConfig.quadrantChart?.xAxisLabelFontSize || 16,\n yAxisLabelFontSize: defaultConfig.quadrantChart?.yAxisLabelFontSize || 16,\n quadrantLabelFontSize: defaultConfig.quadrantChart?.quadrantLabelFontSize || 16,\n quadrantTextTopPadding: defaultConfig.quadrantChart?.quadrantTextTopPadding || 5,\n pointTextPadding: defaultConfig.quadrantChart?.pointTextPadding || 5,\n pointLabelFontSize: defaultConfig.quadrantChart?.pointLabelFontSize || 12,\n pointRadius: defaultConfig.quadrantChart?.pointRadius || 5,\n xAxisPosition: defaultConfig.quadrantChart?.xAxisPosition || 'top',\n yAxisPosition: defaultConfig.quadrantChart?.yAxisPosition || 'left',\n quadrantInternalBorderStrokeWidth:\n defaultConfig.quadrantChart?.quadrantInternalBorderStrokeWidth || 1,\n quadrantExternalBorderStrokeWidth:\n defaultConfig.quadrantChart?.quadrantExternalBorderStrokeWidth || 2,\n };\n }\n\n getDefaultThemeConfig(): QuadrantBuilderThemeConfig {\n return {\n quadrant1Fill: defaultThemeVariables.quadrant1Fill,\n quadrant2Fill: defaultThemeVariables.quadrant2Fill,\n quadrant3Fill: defaultThemeVariables.quadrant3Fill,\n quadrant4Fill: defaultThemeVariables.quadrant4Fill,\n quadrant1TextFill: defaultThemeVariables.quadrant1TextFill,\n quadrant2TextFill: defaultThemeVariables.quadrant2TextFill,\n quadrant3TextFill: defaultThemeVariables.quadrant3TextFill,\n quadrant4TextFill: defaultThemeVariables.quadrant4TextFill,\n quadrantPointFill: defaultThemeVariables.quadrantPointFill,\n quadrantPointTextFill: defaultThemeVariables.quadrantPointTextFill,\n quadrantXAxisTextFill: defaultThemeVariables.quadrantXAxisTextFill,\n quadrantYAxisTextFill: defaultThemeVariables.quadrantYAxisTextFill,\n quadrantTitleFill: defaultThemeVariables.quadrantTitleFill,\n quadrantInternalBorderStrokeFill: defaultThemeVariables.quadrantInternalBorderStrokeFill,\n quadrantExternalBorderStrokeFill: defaultThemeVariables.quadrantExternalBorderStrokeFill,\n };\n }\n\n clear() {\n this.config = this.getDefaultConfig();\n this.themeConfig = this.getDefaultThemeConfig();\n this.data = this.getDefaultData();\n this.classes = new Map();\n log.info('clear called');\n }\n\n setData(data: Partial) {\n this.data = { ...this.data, ...data };\n }\n\n addPoints(points: QuadrantPointInputType[]) {\n this.data.points = [...points, ...this.data.points];\n }\n\n addClass(className: string, styles: StylesObject) {\n this.classes.set(className, styles);\n }\n\n setConfig(config: Partial) {\n log.trace('setConfig called with: ', config);\n this.config = { ...this.config, ...config };\n }\n\n setThemeConfig(themeConfig: Partial) {\n log.trace('setThemeConfig called with: ', themeConfig);\n this.themeConfig = { ...this.themeConfig, ...themeConfig };\n }\n\n calculateSpace(\n xAxisPosition: typeof this.config.xAxisPosition,\n showXAxis: boolean,\n showYAxis: boolean,\n showTitle: boolean\n ): CalculateSpaceData {\n const xAxisSpaceCalculation =\n this.config.xAxisLabelPadding * 2 + this.config.xAxisLabelFontSize;\n const xAxisSpace = {\n top: xAxisPosition === 'top' && showXAxis ? xAxisSpaceCalculation : 0,\n bottom: xAxisPosition === 'bottom' && showXAxis ? xAxisSpaceCalculation : 0,\n };\n\n const yAxisSpaceCalculation =\n this.config.yAxisLabelPadding * 2 + this.config.yAxisLabelFontSize;\n const yAxisSpace = {\n left: this.config.yAxisPosition === 'left' && showYAxis ? yAxisSpaceCalculation : 0,\n right: this.config.yAxisPosition === 'right' && showYAxis ? yAxisSpaceCalculation : 0,\n };\n\n const titleSpaceCalculation = this.config.titleFontSize + this.config.titlePadding * 2;\n const titleSpace = {\n top: showTitle ? titleSpaceCalculation : 0,\n };\n\n const quadrantLeft = this.config.quadrantPadding + yAxisSpace.left;\n const quadrantTop = this.config.quadrantPadding + xAxisSpace.top + titleSpace.top;\n const quadrantWidth =\n this.config.chartWidth - this.config.quadrantPadding * 2 - yAxisSpace.left - yAxisSpace.right;\n const quadrantHeight =\n this.config.chartHeight -\n this.config.quadrantPadding * 2 -\n xAxisSpace.top -\n xAxisSpace.bottom -\n titleSpace.top;\n\n const quadrantHalfWidth = quadrantWidth / 2;\n const quadrantHalfHeight = quadrantHeight / 2;\n const quadrantSpace = {\n quadrantLeft,\n quadrantTop,\n quadrantWidth,\n quadrantHalfWidth,\n quadrantHeight,\n quadrantHalfHeight,\n };\n\n return {\n xAxisSpace,\n yAxisSpace,\n titleSpace,\n quadrantSpace,\n };\n }\n\n getAxisLabels(\n xAxisPosition: typeof this.config.xAxisPosition,\n showXAxis: boolean,\n showYAxis: boolean,\n spaceData: CalculateSpaceData\n ): QuadrantTextType[] {\n const { quadrantSpace, titleSpace } = spaceData;\n const {\n quadrantHalfHeight,\n quadrantHeight,\n quadrantLeft,\n quadrantHalfWidth,\n quadrantTop,\n quadrantWidth,\n } = quadrantSpace;\n\n const drawXAxisLabelsInMiddle = Boolean(this.data.xAxisRightText);\n const drawYAxisLabelsInMiddle = Boolean(this.data.yAxisTopText);\n\n const axisLabels: QuadrantTextType[] = [];\n\n if (this.data.xAxisLeftText && showXAxis) {\n axisLabels.push({\n text: this.data.xAxisLeftText,\n fill: this.themeConfig.quadrantXAxisTextFill,\n x: quadrantLeft + (drawXAxisLabelsInMiddle ? quadrantHalfWidth / 2 : 0),\n y:\n xAxisPosition === 'top'\n ? this.config.xAxisLabelPadding + titleSpace.top\n : this.config.xAxisLabelPadding +\n quadrantTop +\n quadrantHeight +\n this.config.quadrantPadding,\n fontSize: this.config.xAxisLabelFontSize,\n verticalPos: drawXAxisLabelsInMiddle ? 'center' : 'left',\n horizontalPos: 'top',\n rotation: 0,\n });\n }\n if (this.data.xAxisRightText && showXAxis) {\n axisLabels.push({\n text: this.data.xAxisRightText,\n fill: this.themeConfig.quadrantXAxisTextFill,\n x: quadrantLeft + quadrantHalfWidth + (drawXAxisLabelsInMiddle ? quadrantHalfWidth / 2 : 0),\n y:\n xAxisPosition === 'top'\n ? this.config.xAxisLabelPadding + titleSpace.top\n : this.config.xAxisLabelPadding +\n quadrantTop +\n quadrantHeight +\n this.config.quadrantPadding,\n fontSize: this.config.xAxisLabelFontSize,\n verticalPos: drawXAxisLabelsInMiddle ? 'center' : 'left',\n horizontalPos: 'top',\n rotation: 0,\n });\n }\n\n if (this.data.yAxisBottomText && showYAxis) {\n axisLabels.push({\n text: this.data.yAxisBottomText,\n fill: this.themeConfig.quadrantYAxisTextFill,\n x:\n this.config.yAxisPosition === 'left'\n ? this.config.yAxisLabelPadding\n : this.config.yAxisLabelPadding +\n quadrantLeft +\n quadrantWidth +\n this.config.quadrantPadding,\n y: quadrantTop + quadrantHeight - (drawYAxisLabelsInMiddle ? quadrantHalfHeight / 2 : 0),\n fontSize: this.config.yAxisLabelFontSize,\n verticalPos: drawYAxisLabelsInMiddle ? 'center' : 'left',\n horizontalPos: 'top',\n rotation: -90,\n });\n }\n if (this.data.yAxisTopText && showYAxis) {\n axisLabels.push({\n text: this.data.yAxisTopText,\n fill: this.themeConfig.quadrantYAxisTextFill,\n x:\n this.config.yAxisPosition === 'left'\n ? this.config.yAxisLabelPadding\n : this.config.yAxisLabelPadding +\n quadrantLeft +\n quadrantWidth +\n this.config.quadrantPadding,\n y:\n quadrantTop + quadrantHalfHeight - (drawYAxisLabelsInMiddle ? quadrantHalfHeight / 2 : 0),\n fontSize: this.config.yAxisLabelFontSize,\n verticalPos: drawYAxisLabelsInMiddle ? 'center' : 'left',\n horizontalPos: 'top',\n rotation: -90,\n });\n }\n return axisLabels;\n }\n\n getQuadrants(spaceData: CalculateSpaceData): QuadrantQuadrantsType[] {\n const { quadrantSpace } = spaceData;\n\n const { quadrantHalfHeight, quadrantLeft, quadrantHalfWidth, quadrantTop } = quadrantSpace;\n\n const quadrants: QuadrantQuadrantsType[] = [\n {\n text: {\n text: this.data.quadrant1Text,\n fill: this.themeConfig.quadrant1TextFill,\n x: 0,\n y: 0,\n fontSize: this.config.quadrantLabelFontSize,\n verticalPos: 'center',\n horizontalPos: 'middle',\n rotation: 0,\n },\n x: quadrantLeft + quadrantHalfWidth,\n y: quadrantTop,\n width: quadrantHalfWidth,\n height: quadrantHalfHeight,\n fill: this.themeConfig.quadrant1Fill,\n },\n {\n text: {\n text: this.data.quadrant2Text,\n fill: this.themeConfig.quadrant2TextFill,\n x: 0,\n y: 0,\n fontSize: this.config.quadrantLabelFontSize,\n verticalPos: 'center',\n horizontalPos: 'middle',\n rotation: 0,\n },\n x: quadrantLeft,\n y: quadrantTop,\n width: quadrantHalfWidth,\n height: quadrantHalfHeight,\n fill: this.themeConfig.quadrant2Fill,\n },\n {\n text: {\n text: this.data.quadrant3Text,\n fill: this.themeConfig.quadrant3TextFill,\n x: 0,\n y: 0,\n fontSize: this.config.quadrantLabelFontSize,\n verticalPos: 'center',\n horizontalPos: 'middle',\n rotation: 0,\n },\n x: quadrantLeft,\n y: quadrantTop + quadrantHalfHeight,\n width: quadrantHalfWidth,\n height: quadrantHalfHeight,\n fill: this.themeConfig.quadrant3Fill,\n },\n {\n text: {\n text: this.data.quadrant4Text,\n fill: this.themeConfig.quadrant4TextFill,\n x: 0,\n y: 0,\n fontSize: this.config.quadrantLabelFontSize,\n verticalPos: 'center',\n horizontalPos: 'middle',\n rotation: 0,\n },\n x: quadrantLeft + quadrantHalfWidth,\n y: quadrantTop + quadrantHalfHeight,\n width: quadrantHalfWidth,\n height: quadrantHalfHeight,\n fill: this.themeConfig.quadrant4Fill,\n },\n ];\n for (const quadrant of quadrants) {\n quadrant.text.x = quadrant.x + quadrant.width / 2;\n // place the text in the center of the box\n if (this.data.points.length === 0) {\n quadrant.text.y = quadrant.y + quadrant.height / 2;\n quadrant.text.horizontalPos = 'middle';\n // place the text top of the quadrant square\n } else {\n quadrant.text.y = quadrant.y + this.config.quadrantTextTopPadding;\n quadrant.text.horizontalPos = 'top';\n }\n }\n\n return quadrants;\n }\n\n getQuadrantPoints(spaceData: CalculateSpaceData): QuadrantPointType[] {\n const { quadrantSpace } = spaceData;\n\n const { quadrantHeight, quadrantLeft, quadrantTop, quadrantWidth } = quadrantSpace;\n\n const xAxis = scaleLinear()\n .domain([0, 1])\n .range([quadrantLeft, quadrantWidth + quadrantLeft]);\n\n const yAxis = scaleLinear()\n .domain([0, 1])\n .range([quadrantHeight + quadrantTop, quadrantTop]);\n\n const points: QuadrantPointType[] = this.data.points.map((point) => {\n const classStyles = this.classes.get(point.className!);\n if (classStyles) {\n point = { ...classStyles, ...point };\n }\n const props: QuadrantPointType = {\n x: xAxis(point.x),\n y: yAxis(point.y),\n fill: point.color ?? this.themeConfig.quadrantPointFill,\n radius: point.radius ?? this.config.pointRadius,\n text: {\n text: point.text,\n fill: this.themeConfig.quadrantPointTextFill,\n x: xAxis(point.x),\n y: yAxis(point.y) + this.config.pointTextPadding,\n verticalPos: 'center',\n horizontalPos: 'top',\n fontSize: this.config.pointLabelFontSize,\n rotation: 0,\n },\n strokeColor: point.strokeColor ?? this.themeConfig.quadrantPointFill,\n strokeWidth: point.strokeWidth ?? '0px',\n };\n return props;\n });\n return points;\n }\n\n getBorders(spaceData: CalculateSpaceData): QuadrantLineType[] {\n const halfExternalBorderWidth = this.config.quadrantExternalBorderStrokeWidth / 2;\n const { quadrantSpace } = spaceData;\n\n const {\n quadrantHalfHeight,\n quadrantHeight,\n quadrantLeft,\n quadrantHalfWidth,\n quadrantTop,\n quadrantWidth,\n } = quadrantSpace;\n\n const borderLines: QuadrantLineType[] = [\n // top border\n {\n strokeFill: this.themeConfig.quadrantExternalBorderStrokeFill,\n strokeWidth: this.config.quadrantExternalBorderStrokeWidth,\n x1: quadrantLeft - halfExternalBorderWidth,\n y1: quadrantTop,\n x2: quadrantLeft + quadrantWidth + halfExternalBorderWidth,\n y2: quadrantTop,\n },\n // right border\n {\n strokeFill: this.themeConfig.quadrantExternalBorderStrokeFill,\n strokeWidth: this.config.quadrantExternalBorderStrokeWidth,\n x1: quadrantLeft + quadrantWidth,\n y1: quadrantTop + halfExternalBorderWidth,\n x2: quadrantLeft + quadrantWidth,\n y2: quadrantTop + quadrantHeight - halfExternalBorderWidth,\n },\n // bottom border\n {\n strokeFill: this.themeConfig.quadrantExternalBorderStrokeFill,\n strokeWidth: this.config.quadrantExternalBorderStrokeWidth,\n x1: quadrantLeft - halfExternalBorderWidth,\n y1: quadrantTop + quadrantHeight,\n x2: quadrantLeft + quadrantWidth + halfExternalBorderWidth,\n y2: quadrantTop + quadrantHeight,\n },\n // left border\n {\n strokeFill: this.themeConfig.quadrantExternalBorderStrokeFill,\n strokeWidth: this.config.quadrantExternalBorderStrokeWidth,\n x1: quadrantLeft,\n y1: quadrantTop + halfExternalBorderWidth,\n x2: quadrantLeft,\n y2: quadrantTop + quadrantHeight - halfExternalBorderWidth,\n },\n // vertical inner border\n {\n strokeFill: this.themeConfig.quadrantInternalBorderStrokeFill,\n strokeWidth: this.config.quadrantInternalBorderStrokeWidth,\n x1: quadrantLeft + quadrantHalfWidth,\n y1: quadrantTop + halfExternalBorderWidth,\n x2: quadrantLeft + quadrantHalfWidth,\n y2: quadrantTop + quadrantHeight - halfExternalBorderWidth,\n },\n // horizontal inner border\n {\n strokeFill: this.themeConfig.quadrantInternalBorderStrokeFill,\n strokeWidth: this.config.quadrantInternalBorderStrokeWidth,\n x1: quadrantLeft + halfExternalBorderWidth,\n y1: quadrantTop + quadrantHalfHeight,\n x2: quadrantLeft + quadrantWidth - halfExternalBorderWidth,\n y2: quadrantTop + quadrantHalfHeight,\n },\n ];\n return borderLines;\n }\n\n getTitle(showTitle: boolean): QuadrantTextType | undefined {\n if (showTitle) {\n return {\n text: this.data.titleText,\n fill: this.themeConfig.quadrantTitleFill,\n fontSize: this.config.titleFontSize,\n horizontalPos: 'top',\n verticalPos: 'center',\n rotation: 0,\n y: this.config.titlePadding,\n x: this.config.chartWidth / 2,\n };\n }\n return;\n }\n\n build(): QuadrantBuildType {\n const showXAxis =\n this.config.showXAxis && !!(this.data.xAxisLeftText || this.data.xAxisRightText);\n const showYAxis =\n this.config.showYAxis && !!(this.data.yAxisTopText || this.data.yAxisBottomText);\n const showTitle = this.config.showTitle && !!this.data.titleText;\n\n const xAxisPosition = this.data.points.length > 0 ? 'bottom' : this.config.xAxisPosition;\n\n const calculatedSpace = this.calculateSpace(xAxisPosition, showXAxis, showYAxis, showTitle);\n\n return {\n points: this.getQuadrantPoints(calculatedSpace),\n quadrants: this.getQuadrants(calculatedSpace),\n axisLabels: this.getAxisLabels(xAxisPosition, showXAxis, showYAxis, calculatedSpace),\n borderLines: this.getBorders(calculatedSpace),\n title: this.getTitle(showTitle),\n };\n }\n}\n", "class InvalidStyleError extends Error {\n constructor(style: string, value: string, type: string) {\n super(`value for ${style} ${value} is invalid, please use a valid ${type}`);\n this.name = 'InvalidStyleError';\n }\n}\n\nfunction validateHexCode(value: string): boolean {\n return !/^#?([\\dA-Fa-f]{6}|[\\dA-Fa-f]{3})$/.test(value);\n}\n\nfunction validateNumber(value: string): boolean {\n return !/^\\d+$/.test(value);\n}\n\nfunction validateSizeInPixels(value: string): boolean {\n return !/^\\d+px$/.test(value);\n}\n\nexport { validateHexCode, validateNumber, validateSizeInPixels, InvalidStyleError };\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { sanitizeText } from '../common/common.js';\nimport {\n setAccTitle,\n getAccTitle,\n setDiagramTitle,\n getDiagramTitle,\n getAccDescription,\n setAccDescription,\n clear as commonClear,\n} from '../common/commonDb.js';\nimport type { StylesObject } from './quadrantBuilder.js';\nimport { QuadrantBuilder } from './quadrantBuilder.js';\nimport {\n validateHexCode,\n validateSizeInPixels,\n validateNumber,\n InvalidStyleError,\n} from './utils.js';\n\nconst config = getConfig();\n\nfunction textSanitizer(text: string) {\n return sanitizeText(text.trim(), config);\n}\n\ninterface LexTextObj {\n text: string;\n type: 'text' | 'markdown';\n}\n\nconst quadrantBuilder = new QuadrantBuilder();\n\nfunction setQuadrant1Text(textObj: LexTextObj) {\n quadrantBuilder.setData({ quadrant1Text: textSanitizer(textObj.text) });\n}\n\nfunction setQuadrant2Text(textObj: LexTextObj) {\n quadrantBuilder.setData({ quadrant2Text: textSanitizer(textObj.text) });\n}\n\nfunction setQuadrant3Text(textObj: LexTextObj) {\n quadrantBuilder.setData({ quadrant3Text: textSanitizer(textObj.text) });\n}\n\nfunction setQuadrant4Text(textObj: LexTextObj) {\n quadrantBuilder.setData({ quadrant4Text: textSanitizer(textObj.text) });\n}\n\nfunction setXAxisLeftText(textObj: LexTextObj) {\n quadrantBuilder.setData({ xAxisLeftText: textSanitizer(textObj.text) });\n}\n\nfunction setXAxisRightText(textObj: LexTextObj) {\n quadrantBuilder.setData({ xAxisRightText: textSanitizer(textObj.text) });\n}\n\nfunction setYAxisTopText(textObj: LexTextObj) {\n quadrantBuilder.setData({ yAxisTopText: textSanitizer(textObj.text) });\n}\n\nfunction setYAxisBottomText(textObj: LexTextObj) {\n quadrantBuilder.setData({ yAxisBottomText: textSanitizer(textObj.text) });\n}\n\nfunction parseStyles(styles: string[]): StylesObject {\n const stylesObject: StylesObject = {};\n for (const style of styles) {\n const [key, value] = style.trim().split(/\\s*:\\s*/);\n if (key === 'radius') {\n if (validateNumber(value)) {\n throw new InvalidStyleError(key, value, 'number');\n }\n stylesObject.radius = parseInt(value);\n } else if (key === 'color') {\n if (validateHexCode(value)) {\n throw new InvalidStyleError(key, value, 'hex code');\n }\n stylesObject.color = value;\n } else if (key === 'stroke-color') {\n if (validateHexCode(value)) {\n throw new InvalidStyleError(key, value, 'hex code');\n }\n stylesObject.strokeColor = value;\n } else if (key === 'stroke-width') {\n if (validateSizeInPixels(value)) {\n throw new InvalidStyleError(key, value, 'number of pixels (eg. 10px)');\n }\n stylesObject.strokeWidth = value;\n } else {\n throw new Error(`style named ${key} is not supported.`);\n }\n }\n return stylesObject;\n}\n\nfunction addPoint(textObj: LexTextObj, className: string, x: number, y: number, styles: string[]) {\n const stylesObject = parseStyles(styles);\n quadrantBuilder.addPoints([\n {\n x,\n y,\n text: textSanitizer(textObj.text),\n className,\n ...stylesObject,\n },\n ]);\n}\n\nfunction addClass(className: string, styles: string[]) {\n quadrantBuilder.addClass(className, parseStyles(styles));\n}\n\nfunction setWidth(width: number) {\n quadrantBuilder.setConfig({ chartWidth: width });\n}\n\nfunction setHeight(height: number) {\n quadrantBuilder.setConfig({ chartHeight: height });\n}\n\nfunction getQuadrantData() {\n const config = getConfig();\n const { themeVariables, quadrantChart: quadrantChartConfig } = config;\n if (quadrantChartConfig) {\n quadrantBuilder.setConfig(quadrantChartConfig);\n }\n quadrantBuilder.setThemeConfig({\n quadrant1Fill: themeVariables.quadrant1Fill,\n quadrant2Fill: themeVariables.quadrant2Fill,\n quadrant3Fill: themeVariables.quadrant3Fill,\n quadrant4Fill: themeVariables.quadrant4Fill,\n quadrant1TextFill: themeVariables.quadrant1TextFill,\n quadrant2TextFill: themeVariables.quadrant2TextFill,\n quadrant3TextFill: themeVariables.quadrant3TextFill,\n quadrant4TextFill: themeVariables.quadrant4TextFill,\n quadrantPointFill: themeVariables.quadrantPointFill,\n quadrantPointTextFill: themeVariables.quadrantPointTextFill,\n quadrantXAxisTextFill: themeVariables.quadrantXAxisTextFill,\n quadrantYAxisTextFill: themeVariables.quadrantYAxisTextFill,\n quadrantExternalBorderStrokeFill: themeVariables.quadrantExternalBorderStrokeFill,\n quadrantInternalBorderStrokeFill: themeVariables.quadrantInternalBorderStrokeFill,\n quadrantTitleFill: themeVariables.quadrantTitleFill,\n });\n quadrantBuilder.setData({ titleText: getDiagramTitle() });\n return quadrantBuilder.build();\n}\n\nconst clear = function () {\n quadrantBuilder.clear();\n commonClear();\n};\n\nexport default {\n setWidth,\n setHeight,\n setQuadrant1Text,\n setQuadrant2Text,\n setQuadrant3Text,\n setQuadrant4Text,\n setXAxisLeftText,\n setXAxisRightText,\n setYAxisTopText,\n setYAxisBottomText,\n parseStyles,\n addPoint,\n addClass,\n getQuadrantData,\n clear,\n setAccTitle,\n getAccTitle,\n setDiagramTitle,\n getDiagramTitle,\n getAccDescription,\n setAccDescription,\n};\n", "// @ts-nocheck - don't check until handle it\nimport { select } from 'd3';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { log } from '../../logger.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\nimport type { Diagram } from '../../Diagram.js';\nimport type {\n QuadrantBuildType,\n QuadrantLineType,\n QuadrantPointType,\n QuadrantQuadrantsType,\n QuadrantTextType,\n TextHorizontalPos,\n TextVerticalPos,\n} from './quadrantBuilder.js';\n\nexport const draw = (txt: string, id: string, _version: string, diagObj: Diagram) => {\n function getDominantBaseLine(horizontalPos: TextHorizontalPos) {\n return horizontalPos === 'top' ? 'hanging' : 'middle';\n }\n\n function getTextAnchor(verticalPos: TextVerticalPos) {\n return verticalPos === 'left' ? 'start' : 'middle';\n }\n\n function getTransformation(data: { x: number; y: number; rotation: number }) {\n return `translate(${data.x}, ${data.y}) rotate(${data.rotation || 0})`;\n }\n\n const conf = getConfig();\n\n log.debug('Rendering quadrant chart\\n' + txt);\n\n const securityLevel = conf.securityLevel;\n // Handle root and Document for when rendering in sandbox mode\n let sandboxElement;\n if (securityLevel === 'sandbox') {\n sandboxElement = select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? select(sandboxElement.nodes()[0].contentDocument.body)\n : select('body');\n\n const svg = root.select(`[id=\"${id}\"]`);\n\n const group = svg.append('g').attr('class', 'main');\n\n const width = conf.quadrantChart?.chartWidth ?? 500;\n const height = conf.quadrantChart?.chartHeight ?? 500;\n\n configureSvgSize(svg, height, width, conf.quadrantChart?.useMaxWidth ?? true);\n\n svg.attr('viewBox', '0 0 ' + width + ' ' + height);\n\n // @ts-ignore: TODO Fix ts errors\n diagObj.db.setHeight(height);\n // @ts-ignore: TODO Fix ts errors\n diagObj.db.setWidth(width);\n\n // @ts-ignore: TODO Fix ts errors\n const quadrantData: QuadrantBuildType = diagObj.db.getQuadrantData();\n\n const quadrantsGroup = group.append('g').attr('class', 'quadrants');\n const borderGroup = group.append('g').attr('class', 'border');\n const dataPointGroup = group.append('g').attr('class', 'data-points');\n const labelGroup = group.append('g').attr('class', 'labels');\n const titleGroup = group.append('g').attr('class', 'title');\n\n if (quadrantData.title) {\n titleGroup\n .append('text')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', quadrantData.title.fill)\n .attr('font-size', quadrantData.title.fontSize)\n .attr('dominant-baseline', getDominantBaseLine(quadrantData.title.horizontalPos))\n .attr('text-anchor', getTextAnchor(quadrantData.title.verticalPos))\n .attr('transform', getTransformation(quadrantData.title))\n .text(quadrantData.title.text);\n }\n\n if (quadrantData.borderLines) {\n borderGroup\n .selectAll('line')\n .data(quadrantData.borderLines)\n .enter()\n .append('line')\n .attr('x1', (data: QuadrantLineType) => data.x1)\n .attr('y1', (data: QuadrantLineType) => data.y1)\n .attr('x2', (data: QuadrantLineType) => data.x2)\n .attr('y2', (data: QuadrantLineType) => data.y2)\n .style('stroke', (data: QuadrantLineType) => data.strokeFill)\n .style('stroke-width', (data: QuadrantLineType) => data.strokeWidth);\n }\n\n const quadrants = quadrantsGroup\n .selectAll('g.quadrant')\n .data(quadrantData.quadrants)\n .enter()\n .append('g')\n .attr('class', 'quadrant');\n\n quadrants\n .append('rect')\n .attr('x', (data: QuadrantQuadrantsType) => data.x)\n .attr('y', (data: QuadrantQuadrantsType) => data.y)\n .attr('width', (data: QuadrantQuadrantsType) => data.width)\n .attr('height', (data: QuadrantQuadrantsType) => data.height)\n .attr('fill', (data: QuadrantQuadrantsType) => data.fill);\n\n quadrants\n .append('text')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', (data: QuadrantQuadrantsType) => data.text.fill)\n .attr('font-size', (data: QuadrantQuadrantsType) => data.text.fontSize)\n .attr('dominant-baseline', (data: QuadrantQuadrantsType) =>\n getDominantBaseLine(data.text.horizontalPos)\n )\n .attr('text-anchor', (data: QuadrantQuadrantsType) => getTextAnchor(data.text.verticalPos))\n .attr('transform', (data: QuadrantQuadrantsType) => getTransformation(data.text))\n .text((data: QuadrantQuadrantsType) => data.text.text);\n\n const labels = labelGroup\n .selectAll('g.label')\n .data(quadrantData.axisLabels)\n .enter()\n .append('g')\n .attr('class', 'label');\n\n labels\n .append('text')\n .attr('x', 0)\n .attr('y', 0)\n .text((data: QuadrantTextType) => data.text)\n .attr('fill', (data: QuadrantTextType) => data.fill)\n .attr('font-size', (data: QuadrantTextType) => data.fontSize)\n .attr('dominant-baseline', (data: QuadrantTextType) => getDominantBaseLine(data.horizontalPos))\n .attr('text-anchor', (data: QuadrantTextType) => getTextAnchor(data.verticalPos))\n .attr('transform', (data: QuadrantTextType) => getTransformation(data));\n\n const dataPoints = dataPointGroup\n .selectAll('g.data-point')\n .data(quadrantData.points)\n .enter()\n .append('g')\n .attr('class', 'data-point');\n\n dataPoints\n .append('circle')\n .attr('cx', (data: QuadrantPointType) => data.x)\n .attr('cy', (data: QuadrantPointType) => data.y)\n .attr('r', (data: QuadrantPointType) => data.radius)\n .attr('fill', (data: QuadrantPointType) => data.fill)\n .attr('stroke', (data: QuadrantPointType) => data.strokeColor)\n .attr('stroke-width', (data: QuadrantPointType) => data.strokeWidth);\n\n dataPoints\n .append('text')\n .attr('x', 0)\n .attr('y', 0)\n .text((data: QuadrantPointType) => data.text.text)\n .attr('fill', (data: QuadrantPointType) => data.text.fill)\n .attr('font-size', (data: QuadrantPointType) => data.text.fontSize)\n .attr('dominant-baseline', (data: QuadrantPointType) =>\n getDominantBaseLine(data.text.horizontalPos)\n )\n .attr('text-anchor', (data: QuadrantPointType) => getTextAnchor(data.text.verticalPos))\n .attr('transform', (data: QuadrantPointType) => getTransformation(data.text));\n};\n\nexport default {\n draw,\n};\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: JISON doesn't support types\nimport parser from './parser/quadrant.jison';\nimport db from './quadrantDb.js';\nimport renderer from './quadrantRenderer.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles: () => '',\n};\n"], + "mappings": "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AG,aAAY;AAAA,IAClpB,cAAc,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,CAAC;AAAA,IACzkB,eAAe,gCAAS,UAAU,QAAQ,QAAQ,UAAU,IAAI,SAAyB,IAAiB,IAAiB;AAG3H,UAAI,KAAK,GAAG,SAAS;AACrB,cAAQ,SAAS;AAAA,QACjB,KAAK;AACL,eAAK,IAAE,GAAG,EAAE;AACZ;AAAA,QACA,KAAK;AACL,eAAK,IAAE,GAAG,KAAG,CAAC,IAAE,KAAG,GAAG,EAAE;AACxB;AAAA,QACA,KAAK;AACL,eAAK,IAAI,GAAG,KAAG,CAAC,IAAI,GAAG,EAAE;AACzB;AAAA,QACA,KAAK;AACL,eAAK,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC;AACvB;AAAA,QACA,KAAK;AACL,aAAG,KAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,CAAC;AAAE,eAAK,IAAI,GAAG,KAAG,CAAC;AAC7C;AAAA,QACA,KAAK;AACL,eAAK,IAAI,GAAG,KAAG,CAAC;AAAE,aAAG,SAAS,GAAG,KAAG,CAAC,GAAE,GAAG,EAAE,CAAC;AAC7C;AAAA,QACA,KAAK;AACL,eAAK,IAAE,CAAC;AACR;AAAA,QACA,KAAK;AACJ,eAAK,IAAE,GAAG,EAAE,EAAE,KAAK;AAAE,aAAG,gBAAgB,KAAK,CAAC;AAC/C;AAAA,QACA,KAAK;AACJ,eAAK,IAAE,GAAG,EAAE,EAAE,KAAK;AAAE,aAAG,YAAY,KAAK,CAAC;AAC3C;AAAA,QACA,KAAK;AAAA,QAAI,KAAK;AACb,eAAK,IAAE,GAAG,EAAE,EAAE,KAAK;AAAE,aAAG,kBAAkB,KAAK,CAAC;AACjD;AAAA,QACA,KAAK;AACL,aAAG,WAAW,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;AAAE,eAAK,IAAE,GAAG,EAAE,EAAE,OAAO,CAAC;AACtD;AAAA,QACA,KAAK;AACL,aAAG,SAAS,GAAG,KAAG,CAAC,GAAG,IAAI,GAAG,KAAG,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;AAC9C;AAAA,QACA,KAAK;AACL,aAAG,SAAS,GAAG,KAAG,CAAC,GAAG,GAAG,KAAG,CAAC,GAAG,GAAG,KAAG,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;AACpD;AAAA,QACA,KAAK;AACL,aAAG,SAAS,GAAG,KAAG,CAAC,GAAG,IAAI,GAAG,KAAG,CAAC,GAAG,GAAG,KAAG,CAAC,GAAG,GAAG,EAAE,CAAC;AACpD;AAAA,QACA,KAAK;AACL,aAAG,SAAS,GAAG,KAAG,CAAC,GAAG,GAAG,KAAG,CAAC,GAAG,GAAG,KAAG,CAAC,GAAG,GAAG,KAAG,CAAC,GAAG,GAAG,EAAE,CAAC;AAC1D;AAAA,QACA,KAAK;AACL,aAAG,iBAAiB,GAAG,KAAG,CAAC,CAAC;AAAG,aAAG,kBAAkB,GAAG,EAAE,CAAC;AAC1D;AAAA,QACA,KAAK;AACL,aAAG,KAAG,CAAC,EAAE,QAAQ;AAAO,aAAG,iBAAiB,GAAG,KAAG,CAAC,CAAC;AACpD;AAAA,QACA,KAAK;AACL,aAAG,iBAAiB,GAAG,EAAE,CAAC;AAC1B;AAAA,QACA,KAAK;AACL,aAAG,mBAAmB,GAAG,KAAG,CAAC,CAAC;AAAG,aAAG,gBAAgB,GAAG,EAAE,CAAC;AAC1D;AAAA,QACA,KAAK;AACL,aAAG,KAAG,CAAC,EAAE,QAAQ;AAAO,aAAG,mBAAmB,GAAG,KAAG,CAAC,CAAC;AACtD;AAAA,QACA,KAAK;AACL,aAAG,mBAAmB,GAAG,EAAE,CAAC;AAC5B;AAAA,QACA,KAAK;AACL,aAAG,iBAAiB,GAAG,EAAE,CAAC;AAC1B;AAAA,QACA,KAAK;AACL,aAAG,iBAAiB,GAAG,EAAE,CAAC;AAC1B;AAAA,QACA,KAAK;AACL,aAAG,iBAAiB,GAAG,EAAE,CAAC;AAC1B;AAAA,QACA,KAAK;AACL,aAAG,iBAAiB,GAAG,EAAE,CAAC;AAC1B;AAAA,QACA,KAAK;AACJ,eAAK,IAAE,EAAC,MAAK,GAAG,EAAE,GAAG,MAAM,OAAM;AAClC;AAAA,QACA,KAAK;AACJ,eAAK,IAAE,EAAC,MAAK,GAAG,KAAG,CAAC,EAAE,OAAK,KAAG,GAAG,EAAE,GAAG,MAAM,GAAG,KAAG,CAAC,EAAE,KAAI;AAC1D;AAAA,QACA,KAAK;AACJ,eAAK,IAAE,EAAC,MAAM,GAAG,EAAE,GAAG,MAAM,OAAM;AACnC;AAAA,QACA,KAAK;AACJ,eAAK,IAAE,EAAC,MAAM,GAAG,EAAE,GAAG,MAAM,WAAU;AACvC;AAAA,QACA,KAAK;AACL,eAAK,IAAE,GAAG,EAAE;AACZ;AAAA,QACA,KAAK;AACL,eAAK,IAAE,GAAG,KAAG,CAAC,IAAE,KAAG,GAAG,EAAE;AACxB;AAAA,MACA;AAAA,IACA,GAnGe;AAAA,IAoGf,OAAO,CAAC,EAAC,IAAG,KAAI,IAAG,GAAE,IAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,CAAC,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,GAAE,IAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,GAAE,IAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,GAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,KAAI,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,CAAC,GAAE,EAAE,GAAE,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,KAAI,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,GAAE,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,GAAE,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,GAAE,KAAI,GAA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", + "names": ["o", "parser", "lexer", "config", "config", "clear"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/requirementDiagram-UZGBJVZJ.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/requirementDiagram-UZGBJVZJ.mjs new file mode 100644 index 0000000..9097b4a --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/requirementDiagram-UZGBJVZJ.mjs @@ -0,0 +1,1272 @@ +import { + getDiagramElement +} from "./chunk-55IACEB6.mjs"; +import { + setupViewPortForSVG +} from "./chunk-QN33PNHL.mjs"; +import { + getRegisteredLayoutAlgorithm, + render +} from "./chunk-N4CR4FBY.mjs"; +import "./chunk-QXUST7PY.mjs"; +import "./chunk-HN2XXSSU.mjs"; +import "./chunk-JZLCHNYA.mjs"; +import "./chunk-CVBHYZKI.mjs"; +import "./chunk-ATLVNIR6.mjs"; +import "./chunk-JA3XYJ7Z.mjs"; +import { + utils_default +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + getAccDescription, + getAccTitle, + getConfig2 as getConfig, + getDiagramTitle, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __export, + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/requirement/parser/requirementDiagram.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 3], $V1 = [1, 4], $V2 = [1, 5], $V3 = [1, 6], $V4 = [5, 6, 8, 9, 11, 13, 21, 22, 23, 24, 41, 42, 43, 44, 45, 46, 54, 72, 74, 77, 89, 90], $V5 = [1, 22], $V6 = [2, 7], $V7 = [1, 26], $V8 = [1, 27], $V9 = [1, 28], $Va = [1, 29], $Vb = [1, 33], $Vc = [1, 34], $Vd = [1, 35], $Ve = [1, 36], $Vf = [1, 37], $Vg = [1, 38], $Vh = [1, 24], $Vi = [1, 31], $Vj = [1, 32], $Vk = [1, 30], $Vl = [1, 39], $Vm = [1, 40], $Vn = [5, 8, 9, 11, 13, 21, 22, 23, 24, 41, 42, 43, 44, 45, 46, 54, 72, 74, 77, 89, 90], $Vo = [1, 61], $Vp = [89, 90], $Vq = [5, 8, 9, 11, 13, 21, 22, 23, 24, 27, 29, 41, 42, 43, 44, 45, 46, 54, 61, 63, 72, 74, 75, 76, 77, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90], $Vr = [27, 29], $Vs = [1, 70], $Vt = [1, 71], $Vu = [1, 72], $Vv = [1, 73], $Vw = [1, 74], $Vx = [1, 75], $Vy = [1, 76], $Vz = [1, 83], $VA = [1, 80], $VB = [1, 84], $VC = [1, 85], $VD = [1, 86], $VE = [1, 87], $VF = [1, 88], $VG = [1, 89], $VH = [1, 90], $VI = [1, 91], $VJ = [1, 92], $VK = [5, 8, 9, 11, 13, 21, 22, 23, 24, 27, 41, 42, 43, 44, 45, 46, 54, 72, 74, 75, 76, 77, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90], $VL = [63, 64], $VM = [1, 101], $VN = [5, 8, 9, 11, 13, 21, 22, 23, 24, 41, 42, 43, 44, 45, 46, 54, 72, 74, 76, 77, 89, 90], $VO = [5, 8, 9, 11, 13, 21, 22, 23, 24, 41, 42, 43, 44, 45, 46, 54, 72, 74, 75, 76, 77, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90], $VP = [1, 110], $VQ = [1, 106], $VR = [1, 107], $VS = [1, 108], $VT = [1, 109], $VU = [1, 111], $VV = [1, 116], $VW = [1, 117], $VX = [1, 114], $VY = [1, 115]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "directive": 4, "NEWLINE": 5, "RD": 6, "diagram": 7, "EOF": 8, "acc_title": 9, "acc_title_value": 10, "acc_descr": 11, "acc_descr_value": 12, "acc_descr_multiline_value": 13, "requirementDef": 14, "elementDef": 15, "relationshipDef": 16, "direction": 17, "styleStatement": 18, "classDefStatement": 19, "classStatement": 20, "direction_tb": 21, "direction_bt": 22, "direction_rl": 23, "direction_lr": 24, "requirementType": 25, "requirementName": 26, "STRUCT_START": 27, "requirementBody": 28, "STYLE_SEPARATOR": 29, "idList": 30, "ID": 31, "COLONSEP": 32, "id": 33, "TEXT": 34, "text": 35, "RISK": 36, "riskLevel": 37, "VERIFYMTHD": 38, "verifyType": 39, "STRUCT_STOP": 40, "REQUIREMENT": 41, "FUNCTIONAL_REQUIREMENT": 42, "INTERFACE_REQUIREMENT": 43, "PERFORMANCE_REQUIREMENT": 44, "PHYSICAL_REQUIREMENT": 45, "DESIGN_CONSTRAINT": 46, "LOW_RISK": 47, "MED_RISK": 48, "HIGH_RISK": 49, "VERIFY_ANALYSIS": 50, "VERIFY_DEMONSTRATION": 51, "VERIFY_INSPECTION": 52, "VERIFY_TEST": 53, "ELEMENT": 54, "elementName": 55, "elementBody": 56, "TYPE": 57, "type": 58, "DOCREF": 59, "ref": 60, "END_ARROW_L": 61, "relationship": 62, "LINE": 63, "END_ARROW_R": 64, "CONTAINS": 65, "COPIES": 66, "DERIVES": 67, "SATISFIES": 68, "VERIFIES": 69, "REFINES": 70, "TRACES": 71, "CLASSDEF": 72, "stylesOpt": 73, "CLASS": 74, "ALPHA": 75, "COMMA": 76, "STYLE": 77, "style": 78, "styleComponent": 79, "NUM": 80, "COLON": 81, "UNIT": 82, "SPACE": 83, "BRKT": 84, "PCT": 85, "MINUS": 86, "LABEL": 87, "SEMICOLON": 88, "unqString": 89, "qString": 90, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 5: "NEWLINE", 6: "RD", 8: "EOF", 9: "acc_title", 10: "acc_title_value", 11: "acc_descr", 12: "acc_descr_value", 13: "acc_descr_multiline_value", 21: "direction_tb", 22: "direction_bt", 23: "direction_rl", 24: "direction_lr", 27: "STRUCT_START", 29: "STYLE_SEPARATOR", 31: "ID", 32: "COLONSEP", 34: "TEXT", 36: "RISK", 38: "VERIFYMTHD", 40: "STRUCT_STOP", 41: "REQUIREMENT", 42: "FUNCTIONAL_REQUIREMENT", 43: "INTERFACE_REQUIREMENT", 44: "PERFORMANCE_REQUIREMENT", 45: "PHYSICAL_REQUIREMENT", 46: "DESIGN_CONSTRAINT", 47: "LOW_RISK", 48: "MED_RISK", 49: "HIGH_RISK", 50: "VERIFY_ANALYSIS", 51: "VERIFY_DEMONSTRATION", 52: "VERIFY_INSPECTION", 53: "VERIFY_TEST", 54: "ELEMENT", 57: "TYPE", 59: "DOCREF", 61: "END_ARROW_L", 63: "LINE", 64: "END_ARROW_R", 65: "CONTAINS", 66: "COPIES", 67: "DERIVES", 68: "SATISFIES", 69: "VERIFIES", 70: "REFINES", 71: "TRACES", 72: "CLASSDEF", 74: "CLASS", 75: "ALPHA", 76: "COMMA", 77: "STYLE", 80: "NUM", 81: "COLON", 82: "UNIT", 83: "SPACE", 84: "BRKT", 85: "PCT", 86: "MINUS", 87: "LABEL", 88: "SEMICOLON", 89: "unqString", 90: "qString" }, + productions_: [0, [3, 3], [3, 2], [3, 4], [4, 2], [4, 2], [4, 1], [7, 0], [7, 2], [7, 2], [7, 2], [7, 2], [7, 2], [7, 2], [7, 2], [7, 2], [7, 2], [17, 1], [17, 1], [17, 1], [17, 1], [14, 5], [14, 7], [28, 5], [28, 5], [28, 5], [28, 5], [28, 2], [28, 1], [25, 1], [25, 1], [25, 1], [25, 1], [25, 1], [25, 1], [37, 1], [37, 1], [37, 1], [39, 1], [39, 1], [39, 1], [39, 1], [15, 5], [15, 7], [56, 5], [56, 5], [56, 2], [56, 1], [16, 5], [16, 5], [62, 1], [62, 1], [62, 1], [62, 1], [62, 1], [62, 1], [62, 1], [19, 3], [20, 3], [20, 3], [30, 1], [30, 3], [30, 1], [30, 3], [18, 3], [73, 1], [73, 3], [78, 1], [78, 2], [79, 1], [79, 1], [79, 1], [79, 1], [79, 1], [79, 1], [79, 1], [79, 1], [79, 1], [79, 1], [26, 1], [26, 1], [33, 1], [33, 1], [35, 1], [35, 1], [55, 1], [55, 1], [58, 1], [58, 1], [60, 1], [60, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 4: + this.$ = $$[$0].trim(); + yy.setAccTitle(this.$); + break; + case 5: + case 6: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 7: + this.$ = []; + break; + case 17: + yy.setDirection("TB"); + break; + case 18: + yy.setDirection("BT"); + break; + case 19: + yy.setDirection("RL"); + break; + case 20: + yy.setDirection("LR"); + break; + case 21: + yy.addRequirement($$[$0 - 3], $$[$0 - 4]); + break; + case 22: + yy.addRequirement($$[$0 - 5], $$[$0 - 6]); + yy.setClass([$$[$0 - 5]], $$[$0 - 3]); + break; + case 23: + yy.setNewReqId($$[$0 - 2]); + break; + case 24: + yy.setNewReqText($$[$0 - 2]); + break; + case 25: + yy.setNewReqRisk($$[$0 - 2]); + break; + case 26: + yy.setNewReqVerifyMethod($$[$0 - 2]); + break; + case 29: + this.$ = yy.RequirementType.REQUIREMENT; + break; + case 30: + this.$ = yy.RequirementType.FUNCTIONAL_REQUIREMENT; + break; + case 31: + this.$ = yy.RequirementType.INTERFACE_REQUIREMENT; + break; + case 32: + this.$ = yy.RequirementType.PERFORMANCE_REQUIREMENT; + break; + case 33: + this.$ = yy.RequirementType.PHYSICAL_REQUIREMENT; + break; + case 34: + this.$ = yy.RequirementType.DESIGN_CONSTRAINT; + break; + case 35: + this.$ = yy.RiskLevel.LOW_RISK; + break; + case 36: + this.$ = yy.RiskLevel.MED_RISK; + break; + case 37: + this.$ = yy.RiskLevel.HIGH_RISK; + break; + case 38: + this.$ = yy.VerifyType.VERIFY_ANALYSIS; + break; + case 39: + this.$ = yy.VerifyType.VERIFY_DEMONSTRATION; + break; + case 40: + this.$ = yy.VerifyType.VERIFY_INSPECTION; + break; + case 41: + this.$ = yy.VerifyType.VERIFY_TEST; + break; + case 42: + yy.addElement($$[$0 - 3]); + break; + case 43: + yy.addElement($$[$0 - 5]); + yy.setClass([$$[$0 - 5]], $$[$0 - 3]); + break; + case 44: + yy.setNewElementType($$[$0 - 2]); + break; + case 45: + yy.setNewElementDocRef($$[$0 - 2]); + break; + case 48: + yy.addRelationship($$[$0 - 2], $$[$0], $$[$0 - 4]); + break; + case 49: + yy.addRelationship($$[$0 - 2], $$[$0 - 4], $$[$0]); + break; + case 50: + this.$ = yy.Relationships.CONTAINS; + break; + case 51: + this.$ = yy.Relationships.COPIES; + break; + case 52: + this.$ = yy.Relationships.DERIVES; + break; + case 53: + this.$ = yy.Relationships.SATISFIES; + break; + case 54: + this.$ = yy.Relationships.VERIFIES; + break; + case 55: + this.$ = yy.Relationships.REFINES; + break; + case 56: + this.$ = yy.Relationships.TRACES; + break; + case 57: + this.$ = $$[$0 - 2]; + yy.defineClass($$[$0 - 1], $$[$0]); + break; + case 58: + yy.setClass($$[$0 - 1], $$[$0]); + break; + case 59: + yy.setClass([$$[$0 - 2]], $$[$0]); + break; + case 60: + case 62: + this.$ = [$$[$0]]; + break; + case 61: + case 63: + this.$ = $$[$0 - 2].concat([$$[$0]]); + break; + case 64: + this.$ = $$[$0 - 2]; + yy.setCssStyle($$[$0 - 1], $$[$0]); + break; + case 65: + this.$ = [$$[$0]]; + break; + case 66: + $$[$0 - 2].push($$[$0]); + this.$ = $$[$0 - 2]; + break; + case 68: + this.$ = $$[$0 - 1] + $$[$0]; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: 2, 6: $V0, 9: $V1, 11: $V2, 13: $V3 }, { 1: [3] }, { 3: 8, 4: 2, 5: [1, 7], 6: $V0, 9: $V1, 11: $V2, 13: $V3 }, { 5: [1, 9] }, { 10: [1, 10] }, { 12: [1, 11] }, o($V4, [2, 6]), { 3: 12, 4: 2, 6: $V0, 9: $V1, 11: $V2, 13: $V3 }, { 1: [2, 2] }, { 4: 17, 5: $V5, 7: 13, 8: $V6, 9: $V1, 11: $V2, 13: $V3, 14: 14, 15: 15, 16: 16, 17: 18, 18: 19, 19: 20, 20: 21, 21: $V7, 22: $V8, 23: $V9, 24: $Va, 25: 23, 33: 25, 41: $Vb, 42: $Vc, 43: $Vd, 44: $Ve, 45: $Vf, 46: $Vg, 54: $Vh, 72: $Vi, 74: $Vj, 77: $Vk, 89: $Vl, 90: $Vm }, o($V4, [2, 4]), o($V4, [2, 5]), { 1: [2, 1] }, { 8: [1, 41] }, { 4: 17, 5: $V5, 7: 42, 8: $V6, 9: $V1, 11: $V2, 13: $V3, 14: 14, 15: 15, 16: 16, 17: 18, 18: 19, 19: 20, 20: 21, 21: $V7, 22: $V8, 23: $V9, 24: $Va, 25: 23, 33: 25, 41: $Vb, 42: $Vc, 43: $Vd, 44: $Ve, 45: $Vf, 46: $Vg, 54: $Vh, 72: $Vi, 74: $Vj, 77: $Vk, 89: $Vl, 90: $Vm }, { 4: 17, 5: $V5, 7: 43, 8: $V6, 9: $V1, 11: $V2, 13: $V3, 14: 14, 15: 15, 16: 16, 17: 18, 18: 19, 19: 20, 20: 21, 21: $V7, 22: $V8, 23: $V9, 24: $Va, 25: 23, 33: 25, 41: $Vb, 42: $Vc, 43: $Vd, 44: $Ve, 45: $Vf, 46: $Vg, 54: $Vh, 72: $Vi, 74: $Vj, 77: $Vk, 89: $Vl, 90: $Vm }, { 4: 17, 5: $V5, 7: 44, 8: $V6, 9: $V1, 11: $V2, 13: $V3, 14: 14, 15: 15, 16: 16, 17: 18, 18: 19, 19: 20, 20: 21, 21: $V7, 22: $V8, 23: $V9, 24: $Va, 25: 23, 33: 25, 41: $Vb, 42: $Vc, 43: $Vd, 44: $Ve, 45: $Vf, 46: $Vg, 54: $Vh, 72: $Vi, 74: $Vj, 77: $Vk, 89: $Vl, 90: $Vm }, { 4: 17, 5: $V5, 7: 45, 8: $V6, 9: $V1, 11: $V2, 13: $V3, 14: 14, 15: 15, 16: 16, 17: 18, 18: 19, 19: 20, 20: 21, 21: $V7, 22: $V8, 23: $V9, 24: $Va, 25: 23, 33: 25, 41: $Vb, 42: $Vc, 43: $Vd, 44: $Ve, 45: $Vf, 46: $Vg, 54: $Vh, 72: $Vi, 74: $Vj, 77: $Vk, 89: $Vl, 90: $Vm }, { 4: 17, 5: $V5, 7: 46, 8: $V6, 9: $V1, 11: $V2, 13: $V3, 14: 14, 15: 15, 16: 16, 17: 18, 18: 19, 19: 20, 20: 21, 21: $V7, 22: $V8, 23: $V9, 24: $Va, 25: 23, 33: 25, 41: $Vb, 42: $Vc, 43: $Vd, 44: $Ve, 45: $Vf, 46: $Vg, 54: $Vh, 72: $Vi, 74: $Vj, 77: $Vk, 89: $Vl, 90: $Vm }, { 4: 17, 5: $V5, 7: 47, 8: $V6, 9: $V1, 11: $V2, 13: $V3, 14: 14, 15: 15, 16: 16, 17: 18, 18: 19, 19: 20, 20: 21, 21: $V7, 22: $V8, 23: $V9, 24: $Va, 25: 23, 33: 25, 41: $Vb, 42: $Vc, 43: $Vd, 44: $Ve, 45: $Vf, 46: $Vg, 54: $Vh, 72: $Vi, 74: $Vj, 77: $Vk, 89: $Vl, 90: $Vm }, { 4: 17, 5: $V5, 7: 48, 8: $V6, 9: $V1, 11: $V2, 13: $V3, 14: 14, 15: 15, 16: 16, 17: 18, 18: 19, 19: 20, 20: 21, 21: $V7, 22: $V8, 23: $V9, 24: $Va, 25: 23, 33: 25, 41: $Vb, 42: $Vc, 43: $Vd, 44: $Ve, 45: $Vf, 46: $Vg, 54: $Vh, 72: $Vi, 74: $Vj, 77: $Vk, 89: $Vl, 90: $Vm }, { 4: 17, 5: $V5, 7: 49, 8: $V6, 9: $V1, 11: $V2, 13: $V3, 14: 14, 15: 15, 16: 16, 17: 18, 18: 19, 19: 20, 20: 21, 21: $V7, 22: $V8, 23: $V9, 24: $Va, 25: 23, 33: 25, 41: $Vb, 42: $Vc, 43: $Vd, 44: $Ve, 45: $Vf, 46: $Vg, 54: $Vh, 72: $Vi, 74: $Vj, 77: $Vk, 89: $Vl, 90: $Vm }, { 4: 17, 5: $V5, 7: 50, 8: $V6, 9: $V1, 11: $V2, 13: $V3, 14: 14, 15: 15, 16: 16, 17: 18, 18: 19, 19: 20, 20: 21, 21: $V7, 22: $V8, 23: $V9, 24: $Va, 25: 23, 33: 25, 41: $Vb, 42: $Vc, 43: $Vd, 44: $Ve, 45: $Vf, 46: $Vg, 54: $Vh, 72: $Vi, 74: $Vj, 77: $Vk, 89: $Vl, 90: $Vm }, { 26: 51, 89: [1, 52], 90: [1, 53] }, { 55: 54, 89: [1, 55], 90: [1, 56] }, { 29: [1, 59], 61: [1, 57], 63: [1, 58] }, o($Vn, [2, 17]), o($Vn, [2, 18]), o($Vn, [2, 19]), o($Vn, [2, 20]), { 30: 60, 33: 62, 75: $Vo, 89: $Vl, 90: $Vm }, { 30: 63, 33: 62, 75: $Vo, 89: $Vl, 90: $Vm }, { 30: 64, 33: 62, 75: $Vo, 89: $Vl, 90: $Vm }, o($Vp, [2, 29]), o($Vp, [2, 30]), o($Vp, [2, 31]), o($Vp, [2, 32]), o($Vp, [2, 33]), o($Vp, [2, 34]), o($Vq, [2, 81]), o($Vq, [2, 82]), { 1: [2, 3] }, { 8: [2, 8] }, { 8: [2, 9] }, { 8: [2, 10] }, { 8: [2, 11] }, { 8: [2, 12] }, { 8: [2, 13] }, { 8: [2, 14] }, { 8: [2, 15] }, { 8: [2, 16] }, { 27: [1, 65], 29: [1, 66] }, o($Vr, [2, 79]), o($Vr, [2, 80]), { 27: [1, 67], 29: [1, 68] }, o($Vr, [2, 85]), o($Vr, [2, 86]), { 62: 69, 65: $Vs, 66: $Vt, 67: $Vu, 68: $Vv, 69: $Vw, 70: $Vx, 71: $Vy }, { 62: 77, 65: $Vs, 66: $Vt, 67: $Vu, 68: $Vv, 69: $Vw, 70: $Vx, 71: $Vy }, { 30: 78, 33: 62, 75: $Vo, 89: $Vl, 90: $Vm }, { 73: 79, 75: $Vz, 76: $VA, 78: 81, 79: 82, 80: $VB, 81: $VC, 82: $VD, 83: $VE, 84: $VF, 85: $VG, 86: $VH, 87: $VI, 88: $VJ }, o($VK, [2, 60]), o($VK, [2, 62]), { 73: 93, 75: $Vz, 76: $VA, 78: 81, 79: 82, 80: $VB, 81: $VC, 82: $VD, 83: $VE, 84: $VF, 85: $VG, 86: $VH, 87: $VI, 88: $VJ }, { 30: 94, 33: 62, 75: $Vo, 76: $VA, 89: $Vl, 90: $Vm }, { 5: [1, 95] }, { 30: 96, 33: 62, 75: $Vo, 89: $Vl, 90: $Vm }, { 5: [1, 97] }, { 30: 98, 33: 62, 75: $Vo, 89: $Vl, 90: $Vm }, { 63: [1, 99] }, o($VL, [2, 50]), o($VL, [2, 51]), o($VL, [2, 52]), o($VL, [2, 53]), o($VL, [2, 54]), o($VL, [2, 55]), o($VL, [2, 56]), { 64: [1, 100] }, o($Vn, [2, 59], { 76: $VA }), o($Vn, [2, 64], { 76: $VM }), { 33: 103, 75: [1, 102], 89: $Vl, 90: $Vm }, o($VN, [2, 65], { 79: 104, 75: $Vz, 80: $VB, 81: $VC, 82: $VD, 83: $VE, 84: $VF, 85: $VG, 86: $VH, 87: $VI, 88: $VJ }), o($VO, [2, 67]), o($VO, [2, 69]), o($VO, [2, 70]), o($VO, [2, 71]), o($VO, [2, 72]), o($VO, [2, 73]), o($VO, [2, 74]), o($VO, [2, 75]), o($VO, [2, 76]), o($VO, [2, 77]), o($VO, [2, 78]), o($Vn, [2, 57], { 76: $VM }), o($Vn, [2, 58], { 76: $VA }), { 5: $VP, 28: 105, 31: $VQ, 34: $VR, 36: $VS, 38: $VT, 40: $VU }, { 27: [1, 112], 76: $VA }, { 5: $VV, 40: $VW, 56: 113, 57: $VX, 59: $VY }, { 27: [1, 118], 76: $VA }, { 33: 119, 89: $Vl, 90: $Vm }, { 33: 120, 89: $Vl, 90: $Vm }, { 75: $Vz, 78: 121, 79: 82, 80: $VB, 81: $VC, 82: $VD, 83: $VE, 84: $VF, 85: $VG, 86: $VH, 87: $VI, 88: $VJ }, o($VK, [2, 61]), o($VK, [2, 63]), o($VO, [2, 68]), o($Vn, [2, 21]), { 32: [1, 122] }, { 32: [1, 123] }, { 32: [1, 124] }, { 32: [1, 125] }, { 5: $VP, 28: 126, 31: $VQ, 34: $VR, 36: $VS, 38: $VT, 40: $VU }, o($Vn, [2, 28]), { 5: [1, 127] }, o($Vn, [2, 42]), { 32: [1, 128] }, { 32: [1, 129] }, { 5: $VV, 40: $VW, 56: 130, 57: $VX, 59: $VY }, o($Vn, [2, 47]), { 5: [1, 131] }, o($Vn, [2, 48]), o($Vn, [2, 49]), o($VN, [2, 66], { 79: 104, 75: $Vz, 80: $VB, 81: $VC, 82: $VD, 83: $VE, 84: $VF, 85: $VG, 86: $VH, 87: $VI, 88: $VJ }), { 33: 132, 89: $Vl, 90: $Vm }, { 35: 133, 89: [1, 134], 90: [1, 135] }, { 37: 136, 47: [1, 137], 48: [1, 138], 49: [1, 139] }, { 39: 140, 50: [1, 141], 51: [1, 142], 52: [1, 143], 53: [1, 144] }, o($Vn, [2, 27]), { 5: $VP, 28: 145, 31: $VQ, 34: $VR, 36: $VS, 38: $VT, 40: $VU }, { 58: 146, 89: [1, 147], 90: [1, 148] }, { 60: 149, 89: [1, 150], 90: [1, 151] }, o($Vn, [2, 46]), { 5: $VV, 40: $VW, 56: 152, 57: $VX, 59: $VY }, { 5: [1, 153] }, { 5: [1, 154] }, { 5: [2, 83] }, { 5: [2, 84] }, { 5: [1, 155] }, { 5: [2, 35] }, { 5: [2, 36] }, { 5: [2, 37] }, { 5: [1, 156] }, { 5: [2, 38] }, { 5: [2, 39] }, { 5: [2, 40] }, { 5: [2, 41] }, o($Vn, [2, 22]), { 5: [1, 157] }, { 5: [2, 87] }, { 5: [2, 88] }, { 5: [1, 158] }, { 5: [2, 89] }, { 5: [2, 90] }, o($Vn, [2, 43]), { 5: $VP, 28: 159, 31: $VQ, 34: $VR, 36: $VS, 38: $VT, 40: $VU }, { 5: $VP, 28: 160, 31: $VQ, 34: $VR, 36: $VS, 38: $VT, 40: $VU }, { 5: $VP, 28: 161, 31: $VQ, 34: $VR, 36: $VS, 38: $VT, 40: $VU }, { 5: $VP, 28: 162, 31: $VQ, 34: $VR, 36: $VS, 38: $VT, 40: $VU }, { 5: $VV, 40: $VW, 56: 163, 57: $VX, 59: $VY }, { 5: $VV, 40: $VW, 56: 164, 57: $VX, 59: $VY }, o($Vn, [2, 23]), o($Vn, [2, 24]), o($Vn, [2, 25]), o($Vn, [2, 26]), o($Vn, [2, 44]), o($Vn, [2, 45])], + defaultActions: { 8: [2, 2], 12: [2, 1], 41: [2, 3], 42: [2, 8], 43: [2, 9], 44: [2, 10], 45: [2, 11], 46: [2, 12], 47: [2, 13], 48: [2, 14], 49: [2, 15], 50: [2, 16], 134: [2, 83], 135: [2, 84], 137: [2, 35], 138: [2, 36], 139: [2, 37], 141: [2, 38], 142: [2, 39], 143: [2, 40], 144: [2, 41], 147: [2, 87], 148: [2, 88], 150: [2, 89], 151: [2, 90] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + return "title"; + break; + case 1: + this.begin("acc_title"); + return 9; + break; + case 2: + this.popState(); + return "acc_title_value"; + break; + case 3: + this.begin("acc_descr"); + return 11; + break; + case 4: + this.popState(); + return "acc_descr_value"; + break; + case 5: + this.begin("acc_descr_multiline"); + break; + case 6: + this.popState(); + break; + case 7: + return "acc_descr_multiline_value"; + break; + case 8: + return 21; + break; + case 9: + return 22; + break; + case 10: + return 23; + break; + case 11: + return 24; + break; + case 12: + return 5; + break; + case 13: + break; + case 14: + break; + case 15: + break; + case 16: + return 8; + break; + case 17: + return 6; + break; + case 18: + return 27; + break; + case 19: + return 40; + break; + case 20: + return 29; + break; + case 21: + return 32; + break; + case 22: + return 31; + break; + case 23: + return 34; + break; + case 24: + return 36; + break; + case 25: + return 38; + break; + case 26: + return 41; + break; + case 27: + return 42; + break; + case 28: + return 43; + break; + case 29: + return 44; + break; + case 30: + return 45; + break; + case 31: + return 46; + break; + case 32: + return 47; + break; + case 33: + return 48; + break; + case 34: + return 49; + break; + case 35: + return 50; + break; + case 36: + return 51; + break; + case 37: + return 52; + break; + case 38: + return 53; + break; + case 39: + return 54; + break; + case 40: + return 65; + break; + case 41: + return 66; + break; + case 42: + return 67; + break; + case 43: + return 68; + break; + case 44: + return 69; + break; + case 45: + return 70; + break; + case 46: + return 71; + break; + case 47: + return 57; + break; + case 48: + return 59; + break; + case 49: + this.begin("style"); + return 77; + break; + case 50: + return 75; + break; + case 51: + return 81; + break; + case 52: + return 88; + break; + case 53: + return "PERCENT"; + break; + case 54: + return 86; + break; + case 55: + return 84; + break; + case 56: + break; + case 57: + this.begin("string"); + break; + case 58: + this.popState(); + break; + case 59: + this.begin("style"); + return 72; + break; + case 60: + this.begin("style"); + return 74; + break; + case 61: + return 61; + break; + case 62: + return 64; + break; + case 63: + return 63; + break; + case 64: + this.begin("string"); + break; + case 65: + this.popState(); + break; + case 66: + return "qString"; + break; + case 67: + yy_.yytext = yy_.yytext.trim(); + return 89; + break; + case 68: + return 75; + break; + case 69: + return 80; + break; + case 70: + return 76; + break; + } + }, "anonymous"), + rules: [/^(?:title\s[^#\n;]+)/i, /^(?:accTitle\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*\{\s*)/i, /^(?:[\}])/i, /^(?:[^\}]*)/i, /^(?:.*direction\s+TB[^\n]*)/i, /^(?:.*direction\s+BT[^\n]*)/i, /^(?:.*direction\s+RL[^\n]*)/i, /^(?:.*direction\s+LR[^\n]*)/i, /^(?:(\r?\n)+)/i, /^(?:\s+)/i, /^(?:#[^\n]*)/i, /^(?:%[^\n]*)/i, /^(?:$)/i, /^(?:requirementDiagram\b)/i, /^(?:\{)/i, /^(?:\})/i, /^(?::{3})/i, /^(?::)/i, /^(?:id\b)/i, /^(?:text\b)/i, /^(?:risk\b)/i, /^(?:verifyMethod\b)/i, /^(?:requirement\b)/i, /^(?:functionalRequirement\b)/i, /^(?:interfaceRequirement\b)/i, /^(?:performanceRequirement\b)/i, /^(?:physicalRequirement\b)/i, /^(?:designConstraint\b)/i, /^(?:low\b)/i, /^(?:medium\b)/i, /^(?:high\b)/i, /^(?:analysis\b)/i, /^(?:demonstration\b)/i, /^(?:inspection\b)/i, /^(?:test\b)/i, /^(?:element\b)/i, /^(?:contains\b)/i, /^(?:copies\b)/i, /^(?:derives\b)/i, /^(?:satisfies\b)/i, /^(?:verifies\b)/i, /^(?:refines\b)/i, /^(?:traces\b)/i, /^(?:type\b)/i, /^(?:docref\b)/i, /^(?:style\b)/i, /^(?:\w+)/i, /^(?::)/i, /^(?:;)/i, /^(?:%)/i, /^(?:-)/i, /^(?:#)/i, /^(?: )/i, /^(?:["])/i, /^(?:\n)/i, /^(?:classDef\b)/i, /^(?:class\b)/i, /^(?:<-)/i, /^(?:->)/i, /^(?:-)/i, /^(?:["])/i, /^(?:["])/i, /^(?:[^"]*)/i, /^(?:[\w][^:,\r\n\{\<\>\-\=]*)/i, /^(?:\w+)/i, /^(?:[0-9]+)/i, /^(?:,)/i], + conditions: { "acc_descr_multiline": { "rules": [6, 7, 68, 69, 70], "inclusive": false }, "acc_descr": { "rules": [4, 68, 69, 70], "inclusive": false }, "acc_title": { "rules": [2, 68, 69, 70], "inclusive": false }, "style": { "rules": [50, 51, 52, 53, 54, 55, 56, 57, 58, 68, 69, 70], "inclusive": false }, "unqString": { "rules": [68, 69, 70], "inclusive": false }, "token": { "rules": [68, 69, 70], "inclusive": false }, "string": { "rules": [65, 66, 68, 69, 70], "inclusive": false }, "INITIAL": { "rules": [0, 1, 3, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 59, 60, 61, 62, 63, 64, 67, 68, 69, 70], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var requirementDiagram_default = parser; + +// src/diagrams/requirement/requirementDb.ts +var RequirementDB = class { + constructor() { + this.relations = []; + this.latestRequirement = this.getInitialRequirement(); + this.requirements = /* @__PURE__ */ new Map(); + this.latestElement = this.getInitialElement(); + this.elements = /* @__PURE__ */ new Map(); + this.classes = /* @__PURE__ */ new Map(); + this.direction = "TB"; + this.RequirementType = { + REQUIREMENT: "Requirement", + FUNCTIONAL_REQUIREMENT: "Functional Requirement", + INTERFACE_REQUIREMENT: "Interface Requirement", + PERFORMANCE_REQUIREMENT: "Performance Requirement", + PHYSICAL_REQUIREMENT: "Physical Requirement", + DESIGN_CONSTRAINT: "Design Constraint" + }; + this.RiskLevel = { + LOW_RISK: "Low", + MED_RISK: "Medium", + HIGH_RISK: "High" + }; + this.VerifyType = { + VERIFY_ANALYSIS: "Analysis", + VERIFY_DEMONSTRATION: "Demonstration", + VERIFY_INSPECTION: "Inspection", + VERIFY_TEST: "Test" + }; + this.Relationships = { + CONTAINS: "contains", + COPIES: "copies", + DERIVES: "derives", + SATISFIES: "satisfies", + VERIFIES: "verifies", + REFINES: "refines", + TRACES: "traces" + }; + this.setAccTitle = setAccTitle; + this.getAccTitle = getAccTitle; + this.setAccDescription = setAccDescription; + this.getAccDescription = getAccDescription; + this.setDiagramTitle = setDiagramTitle; + this.getDiagramTitle = getDiagramTitle; + this.getConfig = /* @__PURE__ */ __name(() => getConfig().requirement, "getConfig"); + this.clear(); + this.setDirection = this.setDirection.bind(this); + this.addRequirement = this.addRequirement.bind(this); + this.setNewReqId = this.setNewReqId.bind(this); + this.setNewReqRisk = this.setNewReqRisk.bind(this); + this.setNewReqText = this.setNewReqText.bind(this); + this.setNewReqVerifyMethod = this.setNewReqVerifyMethod.bind(this); + this.addElement = this.addElement.bind(this); + this.setNewElementType = this.setNewElementType.bind(this); + this.setNewElementDocRef = this.setNewElementDocRef.bind(this); + this.addRelationship = this.addRelationship.bind(this); + this.setCssStyle = this.setCssStyle.bind(this); + this.setClass = this.setClass.bind(this); + this.defineClass = this.defineClass.bind(this); + this.setAccTitle = this.setAccTitle.bind(this); + this.setAccDescription = this.setAccDescription.bind(this); + } + static { + __name(this, "RequirementDB"); + } + getDirection() { + return this.direction; + } + setDirection(dir) { + this.direction = dir; + } + resetLatestRequirement() { + this.latestRequirement = this.getInitialRequirement(); + } + resetLatestElement() { + this.latestElement = this.getInitialElement(); + } + getInitialRequirement() { + return { + requirementId: "", + text: "", + risk: "", + verifyMethod: "", + name: "", + type: "", + cssStyles: [], + classes: ["default"] + }; + } + getInitialElement() { + return { + name: "", + type: "", + docRef: "", + cssStyles: [], + classes: ["default"] + }; + } + addRequirement(name, type) { + if (!this.requirements.has(name)) { + this.requirements.set(name, { + name, + type, + requirementId: this.latestRequirement.requirementId, + text: this.latestRequirement.text, + risk: this.latestRequirement.risk, + verifyMethod: this.latestRequirement.verifyMethod, + cssStyles: [], + classes: ["default"] + }); + } + this.resetLatestRequirement(); + return this.requirements.get(name); + } + getRequirements() { + return this.requirements; + } + setNewReqId(id) { + if (this.latestRequirement !== void 0) { + this.latestRequirement.requirementId = id; + } + } + setNewReqText(text) { + if (this.latestRequirement !== void 0) { + this.latestRequirement.text = text; + } + } + setNewReqRisk(risk) { + if (this.latestRequirement !== void 0) { + this.latestRequirement.risk = risk; + } + } + setNewReqVerifyMethod(verifyMethod) { + if (this.latestRequirement !== void 0) { + this.latestRequirement.verifyMethod = verifyMethod; + } + } + addElement(name) { + if (!this.elements.has(name)) { + this.elements.set(name, { + name, + type: this.latestElement.type, + docRef: this.latestElement.docRef, + cssStyles: [], + classes: ["default"] + }); + log.info("Added new element: ", name); + } + this.resetLatestElement(); + return this.elements.get(name); + } + getElements() { + return this.elements; + } + setNewElementType(type) { + if (this.latestElement !== void 0) { + this.latestElement.type = type; + } + } + setNewElementDocRef(docRef) { + if (this.latestElement !== void 0) { + this.latestElement.docRef = docRef; + } + } + addRelationship(type, src, dst) { + this.relations.push({ + type, + src, + dst + }); + } + getRelationships() { + return this.relations; + } + clear() { + this.relations = []; + this.resetLatestRequirement(); + this.requirements = /* @__PURE__ */ new Map(); + this.resetLatestElement(); + this.elements = /* @__PURE__ */ new Map(); + this.classes = /* @__PURE__ */ new Map(); + clear(); + } + setCssStyle(ids, styles) { + for (const id of ids) { + const node = this.requirements.get(id) ?? this.elements.get(id); + if (!styles || !node) { + return; + } + for (const s of styles) { + if (s.includes(",")) { + node.cssStyles.push(...s.split(",")); + } else { + node.cssStyles.push(s); + } + } + } + } + setClass(ids, classNames) { + for (const id of ids) { + const node = this.requirements.get(id) ?? this.elements.get(id); + if (node) { + for (const _class of classNames) { + node.classes.push(_class); + const styles = this.classes.get(_class)?.styles; + if (styles) { + node.cssStyles.push(...styles); + } + } + } + } + } + defineClass(ids, style) { + for (const id of ids) { + let styleClass = this.classes.get(id); + if (styleClass === void 0) { + styleClass = { id, styles: [], textStyles: [] }; + this.classes.set(id, styleClass); + } + if (style) { + style.forEach(function(s) { + if (/color/.exec(s)) { + const newStyle = s.replace("fill", "bgFill"); + styleClass.textStyles.push(newStyle); + } + styleClass.styles.push(s); + }); + } + this.requirements.forEach((value) => { + if (value.classes.includes(id)) { + value.cssStyles.push(...style.flatMap((s) => s.split(","))); + } + }); + this.elements.forEach((value) => { + if (value.classes.includes(id)) { + value.cssStyles.push(...style.flatMap((s) => s.split(","))); + } + }); + } + } + getClasses() { + return this.classes; + } + getData() { + const config = getConfig(); + const nodes = []; + const edges = []; + for (const requirement of this.requirements.values()) { + const node = requirement; + node.id = requirement.name; + node.cssStyles = requirement.cssStyles; + node.cssClasses = requirement.classes.join(" "); + node.shape = "requirementBox"; + node.look = config.look; + nodes.push(node); + } + for (const element of this.elements.values()) { + const node = element; + node.shape = "requirementBox"; + node.look = config.look; + node.id = element.name; + node.cssStyles = element.cssStyles; + node.cssClasses = element.classes.join(" "); + nodes.push(node); + } + for (const relation of this.relations) { + let counter = 0; + const isContains = relation.type === this.Relationships.CONTAINS; + const edge = { + id: `${relation.src}-${relation.dst}-${counter}`, + start: this.requirements.get(relation.src)?.name ?? this.elements.get(relation.src)?.name, + end: this.requirements.get(relation.dst)?.name ?? this.elements.get(relation.dst)?.name, + label: `<<${relation.type}>>`, + classes: "relationshipLine", + style: ["fill:none", isContains ? "" : "stroke-dasharray: 10,7"], + labelpos: "c", + thickness: "normal", + type: "normal", + pattern: isContains ? "normal" : "dashed", + arrowTypeStart: isContains ? "requirement_contains" : "", + arrowTypeEnd: isContains ? "" : "requirement_arrow", + look: config.look + }; + edges.push(edge); + counter++; + } + return { nodes, edges, other: {}, config, direction: this.getDirection() }; + } +}; + +// src/diagrams/requirement/styles.js +var getStyles = /* @__PURE__ */ __name((options) => ` + + marker { + fill: ${options.relationColor}; + stroke: ${options.relationColor}; + } + + marker.cross { + stroke: ${options.lineColor}; + } + + svg { + font-family: ${options.fontFamily}; + font-size: ${options.fontSize}; + } + + .reqBox { + fill: ${options.requirementBackground}; + fill-opacity: 1.0; + stroke: ${options.requirementBorderColor}; + stroke-width: ${options.requirementBorderSize}; + } + + .reqTitle, .reqLabel{ + fill: ${options.requirementTextColor}; + } + .reqLabelBox { + fill: ${options.relationLabelBackground}; + fill-opacity: 1.0; + } + + .req-title-line { + stroke: ${options.requirementBorderColor}; + stroke-width: ${options.requirementBorderSize}; + } + .relationshipLine { + stroke: ${options.relationColor}; + stroke-width: 1; + } + .relationshipLabel { + fill: ${options.relationLabelColor}; + } + .divider { + stroke: ${options.nodeBorder}; + stroke-width: 1; + } + .label { + font-family: ${options.fontFamily}; + color: ${options.nodeTextColor || options.textColor}; + } + .label text,span { + fill: ${options.nodeTextColor || options.textColor}; + color: ${options.nodeTextColor || options.textColor}; + } + .labelBkg { + background-color: ${options.edgeLabelBackground}; + } + +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/requirement/requirementRenderer.ts +var requirementRenderer_exports = {}; +__export(requirementRenderer_exports, { + draw: () => draw +}); +var draw = /* @__PURE__ */ __name(async function(text, id, _version, diag) { + log.info("REF0:"); + log.info("Drawing requirement diagram (unified)", id); + const { securityLevel, state: conf, layout } = getConfig(); + const data4Layout = diag.db.getData(); + const svg = getDiagramElement(id, securityLevel); + data4Layout.type = diag.type; + data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(layout); + data4Layout.nodeSpacing = conf?.nodeSpacing ?? 50; + data4Layout.rankSpacing = conf?.rankSpacing ?? 50; + data4Layout.markers = ["requirement_contains", "requirement_arrow"]; + data4Layout.diagramId = id; + await render(data4Layout, svg); + const padding = 8; + utils_default.insertTitle( + svg, + "requirementDiagramTitleText", + conf?.titleTopMargin ?? 25, + diag.db.getDiagramTitle() + ); + setupViewPortForSVG(svg, padding, "requirementDiagram", conf?.useMaxWidth ?? true); +}, "draw"); + +// src/diagrams/requirement/requirementDiagram.ts +var diagram = { + parser: requirementDiagram_default, + get db() { + return new RequirementDB(); + }, + renderer: requirementRenderer_exports, + styles: styles_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/requirementDiagram-UZGBJVZJ.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/requirementDiagram-UZGBJVZJ.mjs.map new file mode 100644 index 0000000..afd5316 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/requirementDiagram-UZGBJVZJ.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/requirement/parser/requirementDiagram.jison", "../../../src/diagrams/requirement/requirementDb.ts", "../../../src/diagrams/requirement/styles.js", "../../../src/diagrams/requirement/requirementRenderer.ts", "../../../src/diagrams/requirement/requirementDiagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,3],$V1=[1,4],$V2=[1,5],$V3=[1,6],$V4=[5,6,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],$V5=[1,22],$V6=[2,7],$V7=[1,26],$V8=[1,27],$V9=[1,28],$Va=[1,29],$Vb=[1,33],$Vc=[1,34],$Vd=[1,35],$Ve=[1,36],$Vf=[1,37],$Vg=[1,38],$Vh=[1,24],$Vi=[1,31],$Vj=[1,32],$Vk=[1,30],$Vl=[1,39],$Vm=[1,40],$Vn=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],$Vo=[1,61],$Vp=[89,90],$Vq=[5,8,9,11,13,21,22,23,24,27,29,41,42,43,44,45,46,54,61,63,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],$Vr=[27,29],$Vs=[1,70],$Vt=[1,71],$Vu=[1,72],$Vv=[1,73],$Vw=[1,74],$Vx=[1,75],$Vy=[1,76],$Vz=[1,83],$VA=[1,80],$VB=[1,84],$VC=[1,85],$VD=[1,86],$VE=[1,87],$VF=[1,88],$VG=[1,89],$VH=[1,90],$VI=[1,91],$VJ=[1,92],$VK=[5,8,9,11,13,21,22,23,24,27,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],$VL=[63,64],$VM=[1,101],$VN=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,76,77,89,90],$VO=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],$VP=[1,110],$VQ=[1,106],$VR=[1,107],$VS=[1,108],$VT=[1,109],$VU=[1,111],$VV=[1,116],$VW=[1,117],$VX=[1,114],$VY=[1,115];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"directive\":4,\"NEWLINE\":5,\"RD\":6,\"diagram\":7,\"EOF\":8,\"acc_title\":9,\"acc_title_value\":10,\"acc_descr\":11,\"acc_descr_value\":12,\"acc_descr_multiline_value\":13,\"requirementDef\":14,\"elementDef\":15,\"relationshipDef\":16,\"direction\":17,\"styleStatement\":18,\"classDefStatement\":19,\"classStatement\":20,\"direction_tb\":21,\"direction_bt\":22,\"direction_rl\":23,\"direction_lr\":24,\"requirementType\":25,\"requirementName\":26,\"STRUCT_START\":27,\"requirementBody\":28,\"STYLE_SEPARATOR\":29,\"idList\":30,\"ID\":31,\"COLONSEP\":32,\"id\":33,\"TEXT\":34,\"text\":35,\"RISK\":36,\"riskLevel\":37,\"VERIFYMTHD\":38,\"verifyType\":39,\"STRUCT_STOP\":40,\"REQUIREMENT\":41,\"FUNCTIONAL_REQUIREMENT\":42,\"INTERFACE_REQUIREMENT\":43,\"PERFORMANCE_REQUIREMENT\":44,\"PHYSICAL_REQUIREMENT\":45,\"DESIGN_CONSTRAINT\":46,\"LOW_RISK\":47,\"MED_RISK\":48,\"HIGH_RISK\":49,\"VERIFY_ANALYSIS\":50,\"VERIFY_DEMONSTRATION\":51,\"VERIFY_INSPECTION\":52,\"VERIFY_TEST\":53,\"ELEMENT\":54,\"elementName\":55,\"elementBody\":56,\"TYPE\":57,\"type\":58,\"DOCREF\":59,\"ref\":60,\"END_ARROW_L\":61,\"relationship\":62,\"LINE\":63,\"END_ARROW_R\":64,\"CONTAINS\":65,\"COPIES\":66,\"DERIVES\":67,\"SATISFIES\":68,\"VERIFIES\":69,\"REFINES\":70,\"TRACES\":71,\"CLASSDEF\":72,\"stylesOpt\":73,\"CLASS\":74,\"ALPHA\":75,\"COMMA\":76,\"STYLE\":77,\"style\":78,\"styleComponent\":79,\"NUM\":80,\"COLON\":81,\"UNIT\":82,\"SPACE\":83,\"BRKT\":84,\"PCT\":85,\"MINUS\":86,\"LABEL\":87,\"SEMICOLON\":88,\"unqString\":89,\"qString\":90,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",5:\"NEWLINE\",6:\"RD\",8:\"EOF\",9:\"acc_title\",10:\"acc_title_value\",11:\"acc_descr\",12:\"acc_descr_value\",13:\"acc_descr_multiline_value\",21:\"direction_tb\",22:\"direction_bt\",23:\"direction_rl\",24:\"direction_lr\",27:\"STRUCT_START\",29:\"STYLE_SEPARATOR\",31:\"ID\",32:\"COLONSEP\",34:\"TEXT\",36:\"RISK\",38:\"VERIFYMTHD\",40:\"STRUCT_STOP\",41:\"REQUIREMENT\",42:\"FUNCTIONAL_REQUIREMENT\",43:\"INTERFACE_REQUIREMENT\",44:\"PERFORMANCE_REQUIREMENT\",45:\"PHYSICAL_REQUIREMENT\",46:\"DESIGN_CONSTRAINT\",47:\"LOW_RISK\",48:\"MED_RISK\",49:\"HIGH_RISK\",50:\"VERIFY_ANALYSIS\",51:\"VERIFY_DEMONSTRATION\",52:\"VERIFY_INSPECTION\",53:\"VERIFY_TEST\",54:\"ELEMENT\",57:\"TYPE\",59:\"DOCREF\",61:\"END_ARROW_L\",63:\"LINE\",64:\"END_ARROW_R\",65:\"CONTAINS\",66:\"COPIES\",67:\"DERIVES\",68:\"SATISFIES\",69:\"VERIFIES\",70:\"REFINES\",71:\"TRACES\",72:\"CLASSDEF\",74:\"CLASS\",75:\"ALPHA\",76:\"COMMA\",77:\"STYLE\",80:\"NUM\",81:\"COLON\",82:\"UNIT\",83:\"SPACE\",84:\"BRKT\",85:\"PCT\",86:\"MINUS\",87:\"LABEL\",88:\"SEMICOLON\",89:\"unqString\",90:\"qString\"},\nproductions_: [0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[17,1],[17,1],[17,1],[17,1],[14,5],[14,7],[28,5],[28,5],[28,5],[28,5],[28,2],[28,1],[25,1],[25,1],[25,1],[25,1],[25,1],[25,1],[37,1],[37,1],[37,1],[39,1],[39,1],[39,1],[39,1],[15,5],[15,7],[56,5],[56,5],[56,2],[56,1],[16,5],[16,5],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[19,3],[20,3],[20,3],[30,1],[30,3],[30,1],[30,3],[18,3],[73,1],[73,3],[78,1],[78,2],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[26,1],[26,1],[33,1],[33,1],[35,1],[35,1],[55,1],[55,1],[58,1],[58,1],[60,1],[60,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 4:\n this.$=$$[$0].trim();yy.setAccTitle(this.$); \nbreak;\ncase 5: case 6:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 7:\n this.$ = [] \nbreak;\ncase 17:\n yy.setDirection('TB');\nbreak;\ncase 18:\n yy.setDirection('BT');\nbreak;\ncase 19:\n yy.setDirection('RL');\nbreak;\ncase 20:\n yy.setDirection('LR');\nbreak;\ncase 21:\n yy.addRequirement($$[$0-3], $$[$0-4]) \nbreak;\ncase 22:\n yy.addRequirement($$[$0-5], $$[$0-6]); yy.setClass([$$[$0-5]], $$[$0-3]); \nbreak;\ncase 23:\n yy.setNewReqId($$[$0-2]); \nbreak;\ncase 24:\n yy.setNewReqText($$[$0-2]); \nbreak;\ncase 25:\n yy.setNewReqRisk($$[$0-2]); \nbreak;\ncase 26:\n yy.setNewReqVerifyMethod($$[$0-2]); \nbreak;\ncase 29:\n this.$=yy.RequirementType.REQUIREMENT;\nbreak;\ncase 30:\n this.$=yy.RequirementType.FUNCTIONAL_REQUIREMENT;\nbreak;\ncase 31:\n this.$=yy.RequirementType.INTERFACE_REQUIREMENT;\nbreak;\ncase 32:\n this.$=yy.RequirementType.PERFORMANCE_REQUIREMENT;\nbreak;\ncase 33:\n this.$=yy.RequirementType.PHYSICAL_REQUIREMENT;\nbreak;\ncase 34:\n this.$=yy.RequirementType.DESIGN_CONSTRAINT;\nbreak;\ncase 35:\n this.$=yy.RiskLevel.LOW_RISK;\nbreak;\ncase 36:\n this.$=yy.RiskLevel.MED_RISK;\nbreak;\ncase 37:\n this.$=yy.RiskLevel.HIGH_RISK;\nbreak;\ncase 38:\n this.$=yy.VerifyType.VERIFY_ANALYSIS;\nbreak;\ncase 39:\n this.$=yy.VerifyType.VERIFY_DEMONSTRATION;\nbreak;\ncase 40:\n this.$=yy.VerifyType.VERIFY_INSPECTION;\nbreak;\ncase 41:\n this.$=yy.VerifyType.VERIFY_TEST;\nbreak;\ncase 42:\n yy.addElement($$[$0-3]) \nbreak;\ncase 43:\n yy.addElement($$[$0-5]); yy.setClass([$$[$0-5]], $$[$0-3]); \nbreak;\ncase 44:\n yy.setNewElementType($$[$0-2]); \nbreak;\ncase 45:\n yy.setNewElementDocRef($$[$0-2]); \nbreak;\ncase 48:\n yy.addRelationship($$[$0-2], $$[$0], $$[$0-4]) \nbreak;\ncase 49:\n yy.addRelationship($$[$0-2], $$[$0-4], $$[$0]) \nbreak;\ncase 50:\n this.$=yy.Relationships.CONTAINS;\nbreak;\ncase 51:\n this.$=yy.Relationships.COPIES;\nbreak;\ncase 52:\n this.$=yy.Relationships.DERIVES;\nbreak;\ncase 53:\n this.$=yy.Relationships.SATISFIES;\nbreak;\ncase 54:\n this.$=yy.Relationships.VERIFIES;\nbreak;\ncase 55:\n this.$=yy.Relationships.REFINES;\nbreak;\ncase 56:\n this.$=yy.Relationships.TRACES;\nbreak;\ncase 57:\nthis.$ = $$[$0-2];yy.defineClass($$[$0-1],$$[$0]);\nbreak;\ncase 58:\nyy.setClass($$[$0-1], $$[$0]);\nbreak;\ncase 59:\nyy.setClass([$$[$0-2]], $$[$0]);\nbreak;\ncase 60: case 62:\n this.$ = [$$[$0]]; \nbreak;\ncase 61: case 63:\n this.$ = $$[$0-2].concat([$$[$0]]); \nbreak;\ncase 64:\nthis.$ = $$[$0-2];yy.setCssStyle($$[$0-1],$$[$0]);\nbreak;\ncase 65:\nthis.$ = [$$[$0]]\nbreak;\ncase 66:\n$$[$0-2].push($$[$0]);this.$ = $$[$0-2];\nbreak;\ncase 68:\nthis.$ = $$[$0-1] + $$[$0];\nbreak;\n}\n},\ntable: [{3:1,4:2,6:$V0,9:$V1,11:$V2,13:$V3},{1:[3]},{3:8,4:2,5:[1,7],6:$V0,9:$V1,11:$V2,13:$V3},{5:[1,9]},{10:[1,10]},{12:[1,11]},o($V4,[2,6]),{3:12,4:2,6:$V0,9:$V1,11:$V2,13:$V3},{1:[2,2]},{4:17,5:$V5,7:13,8:$V6,9:$V1,11:$V2,13:$V3,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:$V7,22:$V8,23:$V9,24:$Va,25:23,33:25,41:$Vb,42:$Vc,43:$Vd,44:$Ve,45:$Vf,46:$Vg,54:$Vh,72:$Vi,74:$Vj,77:$Vk,89:$Vl,90:$Vm},o($V4,[2,4]),o($V4,[2,5]),{1:[2,1]},{8:[1,41]},{4:17,5:$V5,7:42,8:$V6,9:$V1,11:$V2,13:$V3,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:$V7,22:$V8,23:$V9,24:$Va,25:23,33:25,41:$Vb,42:$Vc,43:$Vd,44:$Ve,45:$Vf,46:$Vg,54:$Vh,72:$Vi,74:$Vj,77:$Vk,89:$Vl,90:$Vm},{4:17,5:$V5,7:43,8:$V6,9:$V1,11:$V2,13:$V3,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:$V7,22:$V8,23:$V9,24:$Va,25:23,33:25,41:$Vb,42:$Vc,43:$Vd,44:$Ve,45:$Vf,46:$Vg,54:$Vh,72:$Vi,74:$Vj,77:$Vk,89:$Vl,90:$Vm},{4:17,5:$V5,7:44,8:$V6,9:$V1,11:$V2,13:$V3,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:$V7,22:$V8,23:$V9,24:$Va,25:23,33:25,41:$Vb,42:$Vc,43:$Vd,44:$Ve,45:$Vf,46:$Vg,54:$Vh,72:$Vi,74:$Vj,77:$Vk,89:$Vl,90:$Vm},{4:17,5:$V5,7:45,8:$V6,9:$V1,11:$V2,13:$V3,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:$V7,22:$V8,23:$V9,24:$Va,25:23,33:25,41:$Vb,42:$Vc,43:$Vd,44:$Ve,45:$Vf,46:$Vg,54:$Vh,72:$Vi,74:$Vj,77:$Vk,89:$Vl,90:$Vm},{4:17,5:$V5,7:46,8:$V6,9:$V1,11:$V2,13:$V3,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:$V7,22:$V8,23:$V9,24:$Va,25:23,33:25,41:$Vb,42:$Vc,43:$Vd,44:$Ve,45:$Vf,46:$Vg,54:$Vh,72:$Vi,74:$Vj,77:$Vk,89:$Vl,90:$Vm},{4:17,5:$V5,7:47,8:$V6,9:$V1,11:$V2,13:$V3,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:$V7,22:$V8,23:$V9,24:$Va,25:23,33:25,41:$Vb,42:$Vc,43:$Vd,44:$Ve,45:$Vf,46:$Vg,54:$Vh,72:$Vi,74:$Vj,77:$Vk,89:$Vl,90:$Vm},{4:17,5:$V5,7:48,8:$V6,9:$V1,11:$V2,13:$V3,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:$V7,22:$V8,23:$V9,24:$Va,25:23,33:25,41:$Vb,42:$Vc,43:$Vd,44:$Ve,45:$Vf,46:$Vg,54:$Vh,72:$Vi,74:$Vj,77:$Vk,89:$Vl,90:$Vm},{4:17,5:$V5,7:49,8:$V6,9:$V1,11:$V2,13:$V3,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:$V7,22:$V8,23:$V9,24:$Va,25:23,33:25,41:$Vb,42:$Vc,43:$Vd,44:$Ve,45:$Vf,46:$Vg,54:$Vh,72:$Vi,74:$Vj,77:$Vk,89:$Vl,90:$Vm},{4:17,5:$V5,7:50,8:$V6,9:$V1,11:$V2,13:$V3,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:$V7,22:$V8,23:$V9,24:$Va,25:23,33:25,41:$Vb,42:$Vc,43:$Vd,44:$Ve,45:$Vf,46:$Vg,54:$Vh,72:$Vi,74:$Vj,77:$Vk,89:$Vl,90:$Vm},{26:51,89:[1,52],90:[1,53]},{55:54,89:[1,55],90:[1,56]},{29:[1,59],61:[1,57],63:[1,58]},o($Vn,[2,17]),o($Vn,[2,18]),o($Vn,[2,19]),o($Vn,[2,20]),{30:60,33:62,75:$Vo,89:$Vl,90:$Vm},{30:63,33:62,75:$Vo,89:$Vl,90:$Vm},{30:64,33:62,75:$Vo,89:$Vl,90:$Vm},o($Vp,[2,29]),o($Vp,[2,30]),o($Vp,[2,31]),o($Vp,[2,32]),o($Vp,[2,33]),o($Vp,[2,34]),o($Vq,[2,81]),o($Vq,[2,82]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{8:[2,13]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{27:[1,65],29:[1,66]},o($Vr,[2,79]),o($Vr,[2,80]),{27:[1,67],29:[1,68]},o($Vr,[2,85]),o($Vr,[2,86]),{62:69,65:$Vs,66:$Vt,67:$Vu,68:$Vv,69:$Vw,70:$Vx,71:$Vy},{62:77,65:$Vs,66:$Vt,67:$Vu,68:$Vv,69:$Vw,70:$Vx,71:$Vy},{30:78,33:62,75:$Vo,89:$Vl,90:$Vm},{73:79,75:$Vz,76:$VA,78:81,79:82,80:$VB,81:$VC,82:$VD,83:$VE,84:$VF,85:$VG,86:$VH,87:$VI,88:$VJ},o($VK,[2,60]),o($VK,[2,62]),{73:93,75:$Vz,76:$VA,78:81,79:82,80:$VB,81:$VC,82:$VD,83:$VE,84:$VF,85:$VG,86:$VH,87:$VI,88:$VJ},{30:94,33:62,75:$Vo,76:$VA,89:$Vl,90:$Vm},{5:[1,95]},{30:96,33:62,75:$Vo,89:$Vl,90:$Vm},{5:[1,97]},{30:98,33:62,75:$Vo,89:$Vl,90:$Vm},{63:[1,99]},o($VL,[2,50]),o($VL,[2,51]),o($VL,[2,52]),o($VL,[2,53]),o($VL,[2,54]),o($VL,[2,55]),o($VL,[2,56]),{64:[1,100]},o($Vn,[2,59],{76:$VA}),o($Vn,[2,64],{76:$VM}),{33:103,75:[1,102],89:$Vl,90:$Vm},o($VN,[2,65],{79:104,75:$Vz,80:$VB,81:$VC,82:$VD,83:$VE,84:$VF,85:$VG,86:$VH,87:$VI,88:$VJ}),o($VO,[2,67]),o($VO,[2,69]),o($VO,[2,70]),o($VO,[2,71]),o($VO,[2,72]),o($VO,[2,73]),o($VO,[2,74]),o($VO,[2,75]),o($VO,[2,76]),o($VO,[2,77]),o($VO,[2,78]),o($Vn,[2,57],{76:$VM}),o($Vn,[2,58],{76:$VA}),{5:$VP,28:105,31:$VQ,34:$VR,36:$VS,38:$VT,40:$VU},{27:[1,112],76:$VA},{5:$VV,40:$VW,56:113,57:$VX,59:$VY},{27:[1,118],76:$VA},{33:119,89:$Vl,90:$Vm},{33:120,89:$Vl,90:$Vm},{75:$Vz,78:121,79:82,80:$VB,81:$VC,82:$VD,83:$VE,84:$VF,85:$VG,86:$VH,87:$VI,88:$VJ},o($VK,[2,61]),o($VK,[2,63]),o($VO,[2,68]),o($Vn,[2,21]),{32:[1,122]},{32:[1,123]},{32:[1,124]},{32:[1,125]},{5:$VP,28:126,31:$VQ,34:$VR,36:$VS,38:$VT,40:$VU},o($Vn,[2,28]),{5:[1,127]},o($Vn,[2,42]),{32:[1,128]},{32:[1,129]},{5:$VV,40:$VW,56:130,57:$VX,59:$VY},o($Vn,[2,47]),{5:[1,131]},o($Vn,[2,48]),o($Vn,[2,49]),o($VN,[2,66],{79:104,75:$Vz,80:$VB,81:$VC,82:$VD,83:$VE,84:$VF,85:$VG,86:$VH,87:$VI,88:$VJ}),{33:132,89:$Vl,90:$Vm},{35:133,89:[1,134],90:[1,135]},{37:136,47:[1,137],48:[1,138],49:[1,139]},{39:140,50:[1,141],51:[1,142],52:[1,143],53:[1,144]},o($Vn,[2,27]),{5:$VP,28:145,31:$VQ,34:$VR,36:$VS,38:$VT,40:$VU},{58:146,89:[1,147],90:[1,148]},{60:149,89:[1,150],90:[1,151]},o($Vn,[2,46]),{5:$VV,40:$VW,56:152,57:$VX,59:$VY},{5:[1,153]},{5:[1,154]},{5:[2,83]},{5:[2,84]},{5:[1,155]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[1,156]},{5:[2,38]},{5:[2,39]},{5:[2,40]},{5:[2,41]},o($Vn,[2,22]),{5:[1,157]},{5:[2,87]},{5:[2,88]},{5:[1,158]},{5:[2,89]},{5:[2,90]},o($Vn,[2,43]),{5:$VP,28:159,31:$VQ,34:$VR,36:$VS,38:$VT,40:$VU},{5:$VP,28:160,31:$VQ,34:$VR,36:$VS,38:$VT,40:$VU},{5:$VP,28:161,31:$VQ,34:$VR,36:$VS,38:$VT,40:$VU},{5:$VP,28:162,31:$VQ,34:$VR,36:$VS,38:$VT,40:$VU},{5:$VV,40:$VW,56:163,57:$VX,59:$VY},{5:$VV,40:$VW,56:164,57:$VX,59:$VY},o($Vn,[2,23]),o($Vn,[2,24]),o($Vn,[2,25]),o($Vn,[2,26]),o($Vn,[2,44]),o($Vn,[2,45])],\ndefaultActions: {8:[2,2],12:[2,1],41:[2,3],42:[2,8],43:[2,9],44:[2,10],45:[2,11],46:[2,12],47:[2,13],48:[2,14],49:[2,15],50:[2,16],134:[2,83],135:[2,84],137:[2,35],138:[2,36],139:[2,37],141:[2,38],142:[2,39],143:[2,40],144:[2,41],147:[2,87],148:[2,88],150:[2,89],151:[2,90]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 'title';\nbreak;\ncase 1: this.begin(\"acc_title\");return 9; \nbreak;\ncase 2: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 3: this.begin(\"acc_descr\");return 11; \nbreak;\ncase 4: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 5: this.begin(\"acc_descr_multiline\");\nbreak;\ncase 6: this.popState(); \nbreak;\ncase 7:return \"acc_descr_multiline_value\";\nbreak;\ncase 8:return 21;\nbreak;\ncase 9:return 22;\nbreak;\ncase 10:return 23;\nbreak;\ncase 11:return 24;\nbreak;\ncase 12:return 5;\nbreak;\ncase 13:/* skip all whitespace */\nbreak;\ncase 14:/* skip comments */\nbreak;\ncase 15:/* skip comments */\nbreak;\ncase 16:return 8;\nbreak;\ncase 17:return 6;\nbreak;\ncase 18:return 27;\nbreak;\ncase 19:return 40;\nbreak;\ncase 20:return 29;\nbreak;\ncase 21:return 32;\nbreak;\ncase 22:return 31;\nbreak;\ncase 23:return 34;\nbreak;\ncase 24:return 36;\nbreak;\ncase 25:return 38;\nbreak;\ncase 26:return 41;\nbreak;\ncase 27:return 42;\nbreak;\ncase 28:return 43;\nbreak;\ncase 29:return 44;\nbreak;\ncase 30:return 45;\nbreak;\ncase 31:return 46;\nbreak;\ncase 32:return 47;\nbreak;\ncase 33:return 48;\nbreak;\ncase 34:return 49;\nbreak;\ncase 35:return 50;\nbreak;\ncase 36:return 51;\nbreak;\ncase 37:return 52;\nbreak;\ncase 38:return 53;\nbreak;\ncase 39:return 54;\nbreak;\ncase 40:return 65;\nbreak;\ncase 41:return 66;\nbreak;\ncase 42:return 67;\nbreak;\ncase 43:return 68;\nbreak;\ncase 44:return 69;\nbreak;\ncase 45:return 70;\nbreak;\ncase 46:return 71;\nbreak;\ncase 47:return 57;\nbreak;\ncase 48:return 59;\nbreak;\ncase 49: this.begin(\"style\"); return 77; \nbreak;\ncase 50:return 75;\nbreak;\ncase 51:return 81;\nbreak;\ncase 52:return 88;\nbreak;\ncase 53:return 'PERCENT';\nbreak;\ncase 54:return 86;\nbreak;\ncase 55:return 84;\nbreak;\ncase 56:/* skip spaces */\nbreak;\ncase 57: this.begin(\"string\"); \nbreak;\ncase 58: this.popState(); \nbreak;\ncase 59: this.begin(\"style\"); return 72; \nbreak;\ncase 60: this.begin(\"style\"); return 74; \nbreak;\ncase 61:return 61;\nbreak;\ncase 62:return 64;\nbreak;\ncase 63:return 63;\nbreak;\ncase 64: this.begin(\"string\"); \nbreak;\ncase 65: this.popState(); \nbreak;\ncase 66: return \"qString\"; \nbreak;\ncase 67: yy_.yytext = yy_.yytext.trim(); return 89;\nbreak;\ncase 68:return 75;\nbreak;\ncase 69:return 80;\nbreak;\ncase 70:return 76;\nbreak;\n}\n},\nrules: [/^(?:title\\s[^#\\n;]+)/i,/^(?:accTitle\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*\\{\\s*)/i,/^(?:[\\}])/i,/^(?:[^\\}]*)/i,/^(?:.*direction\\s+TB[^\\n]*)/i,/^(?:.*direction\\s+BT[^\\n]*)/i,/^(?:.*direction\\s+RL[^\\n]*)/i,/^(?:.*direction\\s+LR[^\\n]*)/i,/^(?:(\\r?\\n)+)/i,/^(?:\\s+)/i,/^(?:#[^\\n]*)/i,/^(?:%[^\\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\\b)/i,/^(?:\\{)/i,/^(?:\\})/i,/^(?::{3})/i,/^(?::)/i,/^(?:id\\b)/i,/^(?:text\\b)/i,/^(?:risk\\b)/i,/^(?:verifyMethod\\b)/i,/^(?:requirement\\b)/i,/^(?:functionalRequirement\\b)/i,/^(?:interfaceRequirement\\b)/i,/^(?:performanceRequirement\\b)/i,/^(?:physicalRequirement\\b)/i,/^(?:designConstraint\\b)/i,/^(?:low\\b)/i,/^(?:medium\\b)/i,/^(?:high\\b)/i,/^(?:analysis\\b)/i,/^(?:demonstration\\b)/i,/^(?:inspection\\b)/i,/^(?:test\\b)/i,/^(?:element\\b)/i,/^(?:contains\\b)/i,/^(?:copies\\b)/i,/^(?:derives\\b)/i,/^(?:satisfies\\b)/i,/^(?:verifies\\b)/i,/^(?:refines\\b)/i,/^(?:traces\\b)/i,/^(?:type\\b)/i,/^(?:docref\\b)/i,/^(?:style\\b)/i,/^(?:\\w+)/i,/^(?::)/i,/^(?:;)/i,/^(?:%)/i,/^(?:-)/i,/^(?:#)/i,/^(?: )/i,/^(?:[\"])/i,/^(?:\\n)/i,/^(?:classDef\\b)/i,/^(?:class\\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:[\"])/i,/^(?:[\"])/i,/^(?:[^\"]*)/i,/^(?:[\\w][^:,\\r\\n\\{\\<\\>\\-\\=]*)/i,/^(?:\\w+)/i,/^(?:[0-9]+)/i,/^(?:,)/i],\nconditions: {\"acc_descr_multiline\":{\"rules\":[6,7,68,69,70],\"inclusive\":false},\"acc_descr\":{\"rules\":[4,68,69,70],\"inclusive\":false},\"acc_title\":{\"rules\":[2,68,69,70],\"inclusive\":false},\"style\":{\"rules\":[50,51,52,53,54,55,56,57,58,68,69,70],\"inclusive\":false},\"unqString\":{\"rules\":[68,69,70],\"inclusive\":false},\"token\":{\"rules\":[68,69,70],\"inclusive\":false},\"string\":{\"rules\":[65,66,68,69,70],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,59,60,61,62,63,64,67,68,69,70],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport type { DiagramDB } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport type { Node, Edge } from '../../rendering-util/types.js';\n\nimport {\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n clear as commonClear,\n setDiagramTitle,\n getDiagramTitle,\n} from '../common/commonDb.js';\nimport type {\n Element,\n Relation,\n RelationshipType,\n Requirement,\n RequirementClass,\n RequirementType,\n RiskLevel,\n VerifyType,\n} from './types.js';\n\nexport class RequirementDB implements DiagramDB {\n private relations: Relation[] = [];\n private latestRequirement: Requirement = this.getInitialRequirement();\n private requirements = new Map();\n private latestElement: Element = this.getInitialElement();\n private elements = new Map();\n private classes = new Map();\n private direction = 'TB';\n\n private RequirementType = {\n REQUIREMENT: 'Requirement',\n FUNCTIONAL_REQUIREMENT: 'Functional Requirement',\n INTERFACE_REQUIREMENT: 'Interface Requirement',\n PERFORMANCE_REQUIREMENT: 'Performance Requirement',\n PHYSICAL_REQUIREMENT: 'Physical Requirement',\n DESIGN_CONSTRAINT: 'Design Constraint',\n };\n\n private RiskLevel = {\n LOW_RISK: 'Low',\n MED_RISK: 'Medium',\n HIGH_RISK: 'High',\n };\n\n private VerifyType = {\n VERIFY_ANALYSIS: 'Analysis',\n VERIFY_DEMONSTRATION: 'Demonstration',\n VERIFY_INSPECTION: 'Inspection',\n VERIFY_TEST: 'Test',\n };\n\n private Relationships = {\n CONTAINS: 'contains',\n COPIES: 'copies',\n DERIVES: 'derives',\n SATISFIES: 'satisfies',\n VERIFIES: 'verifies',\n REFINES: 'refines',\n TRACES: 'traces',\n };\n\n constructor() {\n this.clear();\n\n // Needed for JISON since it only supports direct properties\n this.setDirection = this.setDirection.bind(this);\n this.addRequirement = this.addRequirement.bind(this);\n this.setNewReqId = this.setNewReqId.bind(this);\n this.setNewReqRisk = this.setNewReqRisk.bind(this);\n this.setNewReqText = this.setNewReqText.bind(this);\n this.setNewReqVerifyMethod = this.setNewReqVerifyMethod.bind(this);\n this.addElement = this.addElement.bind(this);\n this.setNewElementType = this.setNewElementType.bind(this);\n this.setNewElementDocRef = this.setNewElementDocRef.bind(this);\n this.addRelationship = this.addRelationship.bind(this);\n this.setCssStyle = this.setCssStyle.bind(this);\n this.setClass = this.setClass.bind(this);\n this.defineClass = this.defineClass.bind(this);\n this.setAccTitle = this.setAccTitle.bind(this);\n this.setAccDescription = this.setAccDescription.bind(this);\n }\n\n public getDirection() {\n return this.direction;\n }\n public setDirection(dir: string) {\n this.direction = dir;\n }\n\n private resetLatestRequirement() {\n this.latestRequirement = this.getInitialRequirement();\n }\n\n private resetLatestElement() {\n this.latestElement = this.getInitialElement();\n }\n\n private getInitialRequirement(): Requirement {\n return {\n requirementId: '',\n text: '',\n risk: '' as RiskLevel,\n verifyMethod: '' as VerifyType,\n name: '',\n type: '' as RequirementType,\n cssStyles: [],\n classes: ['default'],\n };\n }\n\n private getInitialElement(): Element {\n return {\n name: '',\n type: '',\n docRef: '',\n cssStyles: [],\n classes: ['default'],\n };\n }\n\n public addRequirement(name: string, type: RequirementType) {\n if (!this.requirements.has(name)) {\n this.requirements.set(name, {\n name,\n type,\n requirementId: this.latestRequirement.requirementId,\n text: this.latestRequirement.text,\n risk: this.latestRequirement.risk,\n verifyMethod: this.latestRequirement.verifyMethod,\n cssStyles: [],\n classes: ['default'],\n });\n }\n this.resetLatestRequirement();\n\n return this.requirements.get(name);\n }\n\n public getRequirements() {\n return this.requirements;\n }\n\n public setNewReqId(id: string) {\n if (this.latestRequirement !== undefined) {\n this.latestRequirement.requirementId = id;\n }\n }\n\n public setNewReqText(text: string) {\n if (this.latestRequirement !== undefined) {\n this.latestRequirement.text = text;\n }\n }\n\n public setNewReqRisk(risk: RiskLevel) {\n if (this.latestRequirement !== undefined) {\n this.latestRequirement.risk = risk;\n }\n }\n\n public setNewReqVerifyMethod(verifyMethod: VerifyType) {\n if (this.latestRequirement !== undefined) {\n this.latestRequirement.verifyMethod = verifyMethod;\n }\n }\n\n public addElement(name: string) {\n if (!this.elements.has(name)) {\n this.elements.set(name, {\n name,\n type: this.latestElement.type,\n docRef: this.latestElement.docRef,\n cssStyles: [],\n classes: ['default'],\n });\n log.info('Added new element: ', name);\n }\n this.resetLatestElement();\n\n return this.elements.get(name);\n }\n\n public getElements() {\n return this.elements;\n }\n\n public setNewElementType(type: string) {\n if (this.latestElement !== undefined) {\n this.latestElement.type = type;\n }\n }\n\n public setNewElementDocRef(docRef: string) {\n if (this.latestElement !== undefined) {\n this.latestElement.docRef = docRef;\n }\n }\n\n public addRelationship(type: RelationshipType, src: string, dst: string) {\n this.relations.push({\n type,\n src,\n dst,\n });\n }\n\n public getRelationships() {\n return this.relations;\n }\n\n public clear() {\n this.relations = [];\n this.resetLatestRequirement();\n this.requirements = new Map();\n this.resetLatestElement();\n this.elements = new Map();\n this.classes = new Map();\n commonClear();\n }\n\n public setCssStyle(ids: string[], styles: string[]) {\n for (const id of ids) {\n const node = this.requirements.get(id) ?? this.elements.get(id);\n if (!styles || !node) {\n return;\n }\n for (const s of styles) {\n if (s.includes(',')) {\n node.cssStyles.push(...s.split(','));\n } else {\n node.cssStyles.push(s);\n }\n }\n }\n }\n\n public setClass(ids: string[], classNames: string[]) {\n for (const id of ids) {\n const node = this.requirements.get(id) ?? this.elements.get(id);\n if (node) {\n for (const _class of classNames) {\n node.classes.push(_class);\n const styles = this.classes.get(_class)?.styles;\n if (styles) {\n node.cssStyles.push(...styles);\n }\n }\n }\n }\n }\n\n public defineClass(ids: string[], style: string[]) {\n for (const id of ids) {\n let styleClass = this.classes.get(id);\n if (styleClass === undefined) {\n styleClass = { id, styles: [], textStyles: [] };\n this.classes.set(id, styleClass);\n }\n\n if (style) {\n style.forEach(function (s) {\n if (/color/.exec(s)) {\n const newStyle = s.replace('fill', 'bgFill'); // .replace('color', 'fill');\n styleClass.textStyles.push(newStyle);\n }\n styleClass.styles.push(s);\n });\n }\n\n this.requirements.forEach((value) => {\n if (value.classes.includes(id)) {\n value.cssStyles.push(...style.flatMap((s) => s.split(',')));\n }\n });\n this.elements.forEach((value) => {\n if (value.classes.includes(id)) {\n value.cssStyles.push(...style.flatMap((s) => s.split(',')));\n }\n });\n }\n }\n\n public getClasses() {\n return this.classes;\n }\n\n public getData() {\n const config = getConfig();\n const nodes: Node[] = [];\n const edges: Edge[] = [];\n for (const requirement of this.requirements.values()) {\n const node = requirement as unknown as Node;\n node.id = requirement.name;\n node.cssStyles = requirement.cssStyles;\n node.cssClasses = requirement.classes.join(' ');\n node.shape = 'requirementBox';\n node.look = config.look;\n nodes.push(node);\n }\n\n for (const element of this.elements.values()) {\n const node = element as unknown as Node;\n node.shape = 'requirementBox';\n node.look = config.look;\n node.id = element.name;\n node.cssStyles = element.cssStyles;\n node.cssClasses = element.classes.join(' ');\n\n nodes.push(node);\n }\n\n for (const relation of this.relations) {\n let counter = 0;\n const isContains = relation.type === this.Relationships.CONTAINS;\n const edge: Edge = {\n id: `${relation.src}-${relation.dst}-${counter}`,\n start: this.requirements.get(relation.src)?.name ?? this.elements.get(relation.src)?.name,\n end: this.requirements.get(relation.dst)?.name ?? this.elements.get(relation.dst)?.name,\n label: `<<${relation.type}>>`,\n classes: 'relationshipLine',\n style: ['fill:none', isContains ? '' : 'stroke-dasharray: 10,7'],\n labelpos: 'c',\n thickness: 'normal',\n type: 'normal',\n pattern: isContains ? 'normal' : 'dashed',\n arrowTypeStart: isContains ? 'requirement_contains' : '',\n arrowTypeEnd: isContains ? '' : 'requirement_arrow',\n look: config.look,\n };\n\n edges.push(edge);\n counter++;\n }\n\n return { nodes, edges, other: {}, config, direction: this.getDirection() };\n }\n\n public setAccTitle = setAccTitle;\n public getAccTitle = getAccTitle;\n public setAccDescription = setAccDescription;\n public getAccDescription = getAccDescription;\n public setDiagramTitle = setDiagramTitle;\n public getDiagramTitle = getDiagramTitle;\n public getConfig = () => getConfig().requirement;\n}\n", "const getStyles = (options) => `\n\n marker {\n fill: ${options.relationColor};\n stroke: ${options.relationColor};\n }\n\n marker.cross {\n stroke: ${options.lineColor};\n }\n\n svg {\n font-family: ${options.fontFamily};\n font-size: ${options.fontSize};\n }\n\n .reqBox {\n fill: ${options.requirementBackground};\n fill-opacity: 1.0;\n stroke: ${options.requirementBorderColor};\n stroke-width: ${options.requirementBorderSize};\n }\n \n .reqTitle, .reqLabel{\n fill: ${options.requirementTextColor};\n }\n .reqLabelBox {\n fill: ${options.relationLabelBackground};\n fill-opacity: 1.0;\n }\n\n .req-title-line {\n stroke: ${options.requirementBorderColor};\n stroke-width: ${options.requirementBorderSize};\n }\n .relationshipLine {\n stroke: ${options.relationColor};\n stroke-width: 1;\n }\n .relationshipLabel {\n fill: ${options.relationLabelColor};\n }\n .divider {\n stroke: ${options.nodeBorder};\n stroke-width: 1;\n }\n .label {\n font-family: ${options.fontFamily};\n color: ${options.nodeTextColor || options.textColor};\n }\n .label text,span {\n fill: ${options.nodeTextColor || options.textColor};\n color: ${options.nodeTextColor || options.textColor};\n }\n .labelBkg {\n background-color: ${options.edgeLabelBackground};\n }\n\n`;\n// fill', conf.rect_fill)\nexport default getStyles;\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { log } from '../../logger.js';\nimport { getDiagramElement } from '../../rendering-util/insertElementsForSize.js';\nimport { getRegisteredLayoutAlgorithm, render } from '../../rendering-util/render.js';\nimport { setupViewPortForSVG } from '../../rendering-util/setupViewPortForSVG.js';\nimport type { LayoutData } from '../../rendering-util/types.js';\nimport utils from '../../utils.js';\n\nexport const draw = async function (text: string, id: string, _version: string, diag: any) {\n log.info('REF0:');\n log.info('Drawing requirement diagram (unified)', id);\n const { securityLevel, state: conf, layout } = getConfig();\n\n const data4Layout = diag.db.getData() as LayoutData;\n\n // Create the root SVG - the element is the div containing the SVG element\n const svg = getDiagramElement(id, securityLevel);\n\n data4Layout.type = diag.type;\n data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(layout);\n\n data4Layout.nodeSpacing = conf?.nodeSpacing ?? 50;\n data4Layout.rankSpacing = conf?.rankSpacing ?? 50;\n data4Layout.markers = ['requirement_contains', 'requirement_arrow'];\n data4Layout.diagramId = id;\n await render(data4Layout, svg);\n const padding = 8;\n utils.insertTitle(\n svg,\n 'requirementDiagramTitleText',\n conf?.titleTopMargin ?? 25,\n diag.db.getDiagramTitle()\n );\n\n setupViewPortForSVG(svg, padding, 'requirementDiagram', conf?.useMaxWidth ?? true);\n};\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: JISON doesn't support types\nimport parser from './parser/requirementDiagram.jison';\nimport { RequirementDB } from './requirementDb.js';\nimport styles from './styles.js';\nimport * as renderer from './requirementRenderer.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n get db() {\n return new RequirementDB();\n },\n renderer,\n styles,\n};\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyEA,IAAI,UAAU,WAAU;AACxB,MAAI,IAAE,gCAAS,GAAE,GAAEA,IAAE,GAAE;AAAC,SAAIA,KAAEA,MAAG,CAAC,GAAE,IAAE,EAAE,QAAO,KAAIA,GAAE,EAAE,CAAC,CAAC,IAAE,EAAE;AAAC,WAAOA;AAAA,EAAC,GAAhE,MAAkE,MAAI,CAAC,GAAE,CAAC,GAAE,MAAI,CAAC,GAAE,CAAC,GAAE,MAAI,CAAC,GAAE,CAAC,GAAE,MAAI,CAAC,GAAE,CAAC,GAAE,MAAI,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,CAAC,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,IAAG,EAAE,GAAE,MAAI,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,MAAI,CAAC,IAAG,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,MAAI,CAAC,IAAG,EAAE,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,MAAI,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,GAAE,GAAG,GAAE,MAAI,CAAC,GAAE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AG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IA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IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,IAAG,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,CAAC,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,CAAC;AAAA,IACr3K,gBAAgB,EAAC,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,KAAI,CAAC,GAAE,EAAE,GAAE,KAAI,CAAC,GAAE,EAAE,GAAE,KAAI,CAAC,GAAE,EAAE,GAAE,KAAI,CAAC,GAAE,EAAE,GAAE,KAAI,CAAC,GAAE,EAAE,GAAE,KAAI,CAAC,GAAE,EAAE,GAAE,K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", + "names": ["o", "parser", "lexer"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/sankeyDiagram-TZEHDZUN.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/sankeyDiagram-TZEHDZUN.mjs new file mode 100644 index 0000000..801bc49 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/sankeyDiagram-TZEHDZUN.mjs @@ -0,0 +1,736 @@ +import { + clear, + common_default, + defaultConfig2 as defaultConfig, + getAccDescription, + getAccTitle, + getConfig2 as getConfig, + getDiagramTitle, + setAccDescription, + setAccTitle, + setDiagramTitle, + setupGraphViewbox +} from "./chunk-ABZYJK2D.mjs"; +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/sankey/parser/sankey.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 9], $V1 = [1, 10], $V2 = [1, 5, 10, 12]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "SANKEY": 4, "NEWLINE": 5, "csv": 6, "opt_eof": 7, "record": 8, "csv_tail": 9, "EOF": 10, "field[source]": 11, "COMMA": 12, "field[target]": 13, "field[value]": 14, "field": 15, "escaped": 16, "non_escaped": 17, "DQUOTE": 18, "ESCAPED_TEXT": 19, "NON_ESCAPED_TEXT": 20, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "SANKEY", 5: "NEWLINE", 10: "EOF", 11: "field[source]", 12: "COMMA", 13: "field[target]", 14: "field[value]", 18: "DQUOTE", 19: "ESCAPED_TEXT", 20: "NON_ESCAPED_TEXT" }, + productions_: [0, [3, 4], [6, 2], [9, 2], [9, 0], [7, 1], [7, 0], [8, 5], [15, 1], [15, 1], [16, 3], [17, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 7: + const source = yy.findOrCreateNode($$[$0 - 4].trim().replaceAll('""', '"')); + const target = yy.findOrCreateNode($$[$0 - 2].trim().replaceAll('""', '"')); + const value = parseFloat($$[$0].trim()); + yy.addLink(source, target, value); + break; + case 8: + case 9: + case 11: + this.$ = $$[$0]; + break; + case 10: + this.$ = $$[$0 - 1]; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: [1, 2] }, { 1: [3] }, { 5: [1, 3] }, { 6: 4, 8: 5, 15: 6, 16: 7, 17: 8, 18: $V0, 20: $V1 }, { 1: [2, 6], 7: 11, 10: [1, 12] }, o($V1, [2, 4], { 9: 13, 5: [1, 14] }), { 12: [1, 15] }, o($V2, [2, 8]), o($V2, [2, 9]), { 19: [1, 16] }, o($V2, [2, 11]), { 1: [2, 1] }, { 1: [2, 5] }, o($V1, [2, 2]), { 6: 17, 8: 5, 15: 6, 16: 7, 17: 8, 18: $V0, 20: $V1 }, { 15: 18, 16: 7, 17: 8, 18: $V0, 20: $V1 }, { 18: [1, 19] }, o($V1, [2, 3]), { 12: [1, 20] }, o($V2, [2, 10]), { 15: 21, 16: 7, 17: 8, 18: $V0, 20: $V1 }, o([1, 5, 10], [2, 7])], + defaultActions: { 11: [2, 1], 12: [2, 5] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + this.pushState("csv"); + return 4; + break; + case 1: + this.pushState("csv"); + return 4; + break; + case 2: + return 10; + break; + case 3: + return 5; + break; + case 4: + return 12; + break; + case 5: + this.pushState("escaped_text"); + return 18; + break; + case 6: + return 20; + break; + case 7: + this.popState("escaped_text"); + return 18; + break; + case 8: + return 19; + break; + } + }, "anonymous"), + rules: [/^(?:sankey-beta\b)/i, /^(?:sankey\b)/i, /^(?:$)/i, /^(?:((\u000D\u000A)|(\u000A)))/i, /^(?:(\u002C))/i, /^(?:(\u0022))/i, /^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/i, /^(?:(\u0022)(?!(\u0022)))/i, /^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/i], + conditions: { "csv": { "rules": [2, 3, 4, 5, 6, 7, 8], "inclusive": false }, "escaped_text": { "rules": [7, 8], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var sankey_default = parser; + +// src/diagrams/sankey/sankeyDB.ts +var links = []; +var nodes = []; +var nodesMap = /* @__PURE__ */ new Map(); +var clear2 = /* @__PURE__ */ __name(() => { + links = []; + nodes = []; + nodesMap = /* @__PURE__ */ new Map(); + clear(); +}, "clear"); +var SankeyLink = class { + constructor(source, target, value = 0) { + this.source = source; + this.target = target; + this.value = value; + } + static { + __name(this, "SankeyLink"); + } +}; +var addLink = /* @__PURE__ */ __name((source, target, value) => { + links.push(new SankeyLink(source, target, value)); +}, "addLink"); +var SankeyNode = class { + constructor(ID) { + this.ID = ID; + } + static { + __name(this, "SankeyNode"); + } +}; +var findOrCreateNode = /* @__PURE__ */ __name((ID) => { + ID = common_default.sanitizeText(ID, getConfig()); + let node = nodesMap.get(ID); + if (node === void 0) { + node = new SankeyNode(ID); + nodesMap.set(ID, node); + nodes.push(node); + } + return node; +}, "findOrCreateNode"); +var getNodes = /* @__PURE__ */ __name(() => nodes, "getNodes"); +var getLinks = /* @__PURE__ */ __name(() => links, "getLinks"); +var getGraph = /* @__PURE__ */ __name(() => ({ + nodes: nodes.map((node) => ({ id: node.ID })), + links: links.map((link) => ({ + source: link.source.ID, + target: link.target.ID, + value: link.value + })) +}), "getGraph"); +var sankeyDB_default = { + nodesMap, + getConfig: /* @__PURE__ */ __name(() => getConfig().sankey, "getConfig"), + getNodes, + getLinks, + getGraph, + addLink, + findOrCreateNode, + getAccTitle, + setAccTitle, + getAccDescription, + setAccDescription, + getDiagramTitle, + setDiagramTitle, + clear: clear2 +}; + +// src/diagrams/sankey/sankeyRenderer.ts +import { + select as d3select, + scaleOrdinal as d3scaleOrdinal, + schemeTableau10 as d3schemeTableau10 +} from "d3"; +import { + sankey as d3Sankey, + sankeyLinkHorizontal as d3SankeyLinkHorizontal, + sankeyLeft as d3SankeyLeft, + sankeyRight as d3SankeyRight, + sankeyCenter as d3SankeyCenter, + sankeyJustify as d3SankeyJustify +} from "d3-sankey"; + +// src/rendering-util/uid.ts +var Uid = class _Uid { + static { + __name(this, "Uid"); + } + static { + this.count = 0; + } + static next(name) { + return new _Uid(name + ++_Uid.count); + } + constructor(id) { + this.id = id; + this.href = `#${id}`; + } + toString() { + return "url(" + this.href + ")"; + } +}; + +// src/diagrams/sankey/sankeyRenderer.ts +var alignmentsMap = { + left: d3SankeyLeft, + right: d3SankeyRight, + center: d3SankeyCenter, + justify: d3SankeyJustify +}; +var draw = /* @__PURE__ */ __name(function(text, id, _version, diagObj) { + const { securityLevel, sankey: conf } = getConfig(); + const defaultSankeyConfig = defaultConfig.sankey; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = d3select("#i" + id); + } + const root = securityLevel === "sandbox" ? d3select(sandboxElement.nodes()[0].contentDocument.body) : d3select("body"); + const svg = securityLevel === "sandbox" ? root.select(`[id="${id}"]`) : d3select(`[id="${id}"]`); + const width = conf?.width ?? defaultSankeyConfig.width; + const height = conf?.height ?? defaultSankeyConfig.width; + const useMaxWidth = conf?.useMaxWidth ?? defaultSankeyConfig.useMaxWidth; + const nodeAlignment = conf?.nodeAlignment ?? defaultSankeyConfig.nodeAlignment; + const prefix = conf?.prefix ?? defaultSankeyConfig.prefix; + const suffix = conf?.suffix ?? defaultSankeyConfig.suffix; + const showValues = conf?.showValues ?? defaultSankeyConfig.showValues; + const graph = diagObj.db.getGraph(); + const nodeAlign = alignmentsMap[nodeAlignment]; + const nodeWidth = 10; + const sankey = d3Sankey().nodeId((d) => d.id).nodeWidth(nodeWidth).nodePadding(10 + (showValues ? 15 : 0)).nodeAlign(nodeAlign).extent([ + [0, 0], + [width, height] + ]); + sankey(graph); + const colorScheme = d3scaleOrdinal(d3schemeTableau10); + svg.append("g").attr("class", "nodes").selectAll(".node").data(graph.nodes).join("g").attr("class", "node").attr("id", (d) => (d.uid = Uid.next("node-")).id).attr("transform", function(d) { + return "translate(" + d.x0 + "," + d.y0 + ")"; + }).attr("x", (d) => d.x0).attr("y", (d) => d.y0).append("rect").attr("height", (d) => { + return d.y1 - d.y0; + }).attr("width", (d) => d.x1 - d.x0).attr("fill", (d) => colorScheme(d.id)); + const getText = /* @__PURE__ */ __name(({ id: id2, value }) => { + if (!showValues) { + return id2; + } + return `${id2} +${prefix}${Math.round(value * 100) / 100}${suffix}`; + }, "getText"); + svg.append("g").attr("class", "node-labels").attr("font-size", 14).selectAll("text").data(graph.nodes).join("text").attr("x", (d) => d.x0 < width / 2 ? d.x1 + 6 : d.x0 - 6).attr("y", (d) => (d.y1 + d.y0) / 2).attr("dy", `${showValues ? "0" : "0.35"}em`).attr("text-anchor", (d) => d.x0 < width / 2 ? "start" : "end").text(getText); + const link = svg.append("g").attr("class", "links").attr("fill", "none").attr("stroke-opacity", 0.5).selectAll(".link").data(graph.links).join("g").attr("class", "link").style("mix-blend-mode", "multiply"); + const linkColor = conf?.linkColor ?? "gradient"; + if (linkColor === "gradient") { + const gradient = link.append("linearGradient").attr("id", (d) => (d.uid = Uid.next("linearGradient-")).id).attr("gradientUnits", "userSpaceOnUse").attr("x1", (d) => d.source.x1).attr("x2", (d) => d.target.x0); + gradient.append("stop").attr("offset", "0%").attr("stop-color", (d) => colorScheme(d.source.id)); + gradient.append("stop").attr("offset", "100%").attr("stop-color", (d) => colorScheme(d.target.id)); + } + let coloring; + switch (linkColor) { + case "gradient": + coloring = /* @__PURE__ */ __name((d) => d.uid, "coloring"); + break; + case "source": + coloring = /* @__PURE__ */ __name((d) => colorScheme(d.source.id), "coloring"); + break; + case "target": + coloring = /* @__PURE__ */ __name((d) => colorScheme(d.target.id), "coloring"); + break; + default: + coloring = linkColor; + } + link.append("path").attr("d", d3SankeyLinkHorizontal()).attr("stroke", coloring).attr("stroke-width", (d) => Math.max(1, d.width)); + setupGraphViewbox(void 0, svg, 0, useMaxWidth); +}, "draw"); +var sankeyRenderer_default = { + draw +}; + +// src/diagrams/sankey/sankeyUtils.ts +var prepareTextForParsing = /* @__PURE__ */ __name((text) => { + const textToParse = text.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g, "").replaceAll(/([\n\r])+/g, "\n").trim(); + return textToParse; +}, "prepareTextForParsing"); + +// src/diagrams/sankey/styles.js +var getStyles = /* @__PURE__ */ __name((options) => `.label { + font-family: ${options.fontFamily}; + }`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/sankey/sankeyDiagram.ts +var originalParse = sankey_default.parse.bind(sankey_default); +sankey_default.parse = (text) => originalParse(prepareTextForParsing(text)); +var diagram = { + styles: styles_default, + parser: sankey_default, + db: sankeyDB_default, + renderer: sankeyRenderer_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/sankeyDiagram-TZEHDZUN.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/sankeyDiagram-TZEHDZUN.mjs.map new file mode 100644 index 0000000..93ec6d2 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/sankeyDiagram-TZEHDZUN.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/sankey/parser/sankey.jison", "../../../src/diagrams/sankey/sankeyDB.ts", "../../../src/diagrams/sankey/sankeyRenderer.ts", "../../../src/rendering-util/uid.ts", "../../../src/diagrams/sankey/sankeyUtils.ts", "../../../src/diagrams/sankey/styles.js", "../../../src/diagrams/sankey/sankeyDiagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,9],$V1=[1,10],$V2=[1,5,10,12];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"SANKEY\":4,\"NEWLINE\":5,\"csv\":6,\"opt_eof\":7,\"record\":8,\"csv_tail\":9,\"EOF\":10,\"field[source]\":11,\"COMMA\":12,\"field[target]\":13,\"field[value]\":14,\"field\":15,\"escaped\":16,\"non_escaped\":17,\"DQUOTE\":18,\"ESCAPED_TEXT\":19,\"NON_ESCAPED_TEXT\":20,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"SANKEY\",5:\"NEWLINE\",10:\"EOF\",11:\"field[source]\",12:\"COMMA\",13:\"field[target]\",14:\"field[value]\",18:\"DQUOTE\",19:\"ESCAPED_TEXT\",20:\"NON_ESCAPED_TEXT\"},\nproductions_: [0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 7:\n\n const source = yy.findOrCreateNode($$[$0-4].trim().replaceAll('\"\"', '\"'));\n const target = yy.findOrCreateNode($$[$0-2].trim().replaceAll('\"\"', '\"'));\n const value = parseFloat($$[$0].trim());\n yy.addLink(source,target,value);\n \nbreak;\ncase 8: case 9: case 11:\n this.$=$$[$0]; \nbreak;\ncase 10:\n this.$=$$[$0-1]; \nbreak;\n}\n},\ntable: [{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:$V0,20:$V1},{1:[2,6],7:11,10:[1,12]},o($V1,[2,4],{9:13,5:[1,14]}),{12:[1,15]},o($V2,[2,8]),o($V2,[2,9]),{19:[1,16]},o($V2,[2,11]),{1:[2,1]},{1:[2,5]},o($V1,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:$V0,20:$V1},{15:18,16:7,17:8,18:$V0,20:$V1},{18:[1,19]},o($V1,[2,3]),{12:[1,20]},o($V2,[2,10]),{15:21,16:7,17:8,18:$V0,20:$V1},o([1,5,10],[2,7])],\ndefaultActions: {11:[2,1],12:[2,5]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.pushState('csv'); return 4; \nbreak;\ncase 1: this.pushState('csv'); return 4; \nbreak;\ncase 2: return 10 \nbreak;\ncase 3: return 5 \nbreak;\ncase 4: return 12 \nbreak;\ncase 5: this.pushState('escaped_text'); return 18; \nbreak;\ncase 6: return 20 \nbreak;\ncase 7:this.popState('escaped_text'); return 18; \nbreak;\ncase 8: return 19; \nbreak;\n}\n},\nrules: [/^(?:sankey-beta\\b)/i,/^(?:sankey\\b)/i,/^(?:$)/i,/^(?:((\\u000D\\u000A)|(\\u000A)))/i,/^(?:(\\u002C))/i,/^(?:(\\u0022))/i,/^(?:([\\u0020-\\u0021\\u0023-\\u002B\\u002D-\\u007E])*)/i,/^(?:(\\u0022)(?!(\\u0022)))/i,/^(?:(([\\u0020-\\u0021\\u0023-\\u002B\\u002D-\\u007E])|(\\u002C)|(\\u000D)|(\\u000A)|(\\u0022)(\\u0022))*)/i],\nconditions: {\"csv\":{\"rules\":[2,3,4,5,6,7,8],\"inclusive\":false},\"escaped_text\":{\"rules\":[7,8],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport common from '../common/common.js';\nimport {\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n setDiagramTitle,\n getDiagramTitle,\n clear as commonClear,\n} from '../common/commonDb.js';\n\n// Sankey diagram represented by nodes and links between those nodes\nlet links: SankeyLink[] = [];\n// Array of nodes guarantees their order\nlet nodes: SankeyNode[] = [];\n// We also have to track nodes uniqueness (by ID)\nlet nodesMap = new Map();\n\nconst clear = (): void => {\n links = [];\n nodes = [];\n nodesMap = new Map();\n commonClear();\n};\n\nclass SankeyLink {\n constructor(\n public source: SankeyNode,\n public target: SankeyNode,\n public value = 0\n ) {}\n}\n\n/**\n * @param source - Node where the link starts\n * @param target - Node where the link ends\n * @param value - Describes the amount to be passed\n */\nconst addLink = (source: SankeyNode, target: SankeyNode, value: number): void => {\n links.push(new SankeyLink(source, target, value));\n};\n\nclass SankeyNode {\n constructor(public ID: string) {}\n}\n\nconst findOrCreateNode = (ID: string): SankeyNode => {\n ID = common.sanitizeText(ID, getConfig());\n\n let node = nodesMap.get(ID);\n if (node === undefined) {\n node = new SankeyNode(ID);\n nodesMap.set(ID, node);\n nodes.push(node);\n }\n return node;\n};\n\nconst getNodes = () => nodes;\nconst getLinks = () => links;\n\nconst getGraph = () => ({\n nodes: nodes.map((node) => ({ id: node.ID })),\n links: links.map((link) => ({\n source: link.source.ID,\n target: link.target.ID,\n value: link.value,\n })),\n});\n\nexport default {\n nodesMap,\n getConfig: () => getConfig().sankey,\n getNodes,\n getLinks,\n getGraph,\n addLink,\n findOrCreateNode,\n getAccTitle,\n setAccTitle,\n getAccDescription,\n setAccDescription,\n getDiagramTitle,\n setDiagramTitle,\n clear,\n};\n", "import type { Diagram } from '../../Diagram.js';\nimport { getConfig, defaultConfig } from '../../diagram-api/diagramAPI.js';\nimport {\n select as d3select,\n scaleOrdinal as d3scaleOrdinal,\n schemeTableau10 as d3schemeTableau10,\n} from 'd3';\nimport type { SankeyNode as d3SankeyNode } from 'd3-sankey';\nimport {\n sankey as d3Sankey,\n sankeyLinkHorizontal as d3SankeyLinkHorizontal,\n sankeyLeft as d3SankeyLeft,\n sankeyRight as d3SankeyRight,\n sankeyCenter as d3SankeyCenter,\n sankeyJustify as d3SankeyJustify,\n} from 'd3-sankey';\nimport { setupGraphViewbox } from '../../setupGraphViewbox.js';\nimport { Uid } from '../../rendering-util/uid.js';\nimport type { SankeyNodeAlignment } from '../../config.type.js';\n\n// Map config options to alignment functions\nconst alignmentsMap: Record<\n SankeyNodeAlignment,\n (node: d3SankeyNode, n: number) => number\n> = {\n left: d3SankeyLeft,\n right: d3SankeyRight,\n center: d3SankeyCenter,\n justify: d3SankeyJustify,\n};\n\n/**\n * Draws Sankey diagram.\n *\n * @param text - The text of the diagram\n * @param id - The id of the diagram which will be used as a DOM element id\u00A8\n * @param _version - Mermaid version from package.json\n * @param diagObj - A standard diagram containing the db and the text and type etc of the diagram\n */\nexport const draw = function (text: string, id: string, _version: string, diagObj: Diagram): void {\n // Get Sankey config\n const { securityLevel, sankey: conf } = getConfig();\n const defaultSankeyConfig = defaultConfig.sankey!;\n\n // TODO:\n // This code repeats for every diagram\n // Figure out what is happening there, probably it should be separated\n // The main thing is svg object that is a d3 wrapper for svg operations\n //\n let sandboxElement: any;\n if (securityLevel === 'sandbox') {\n sandboxElement = d3select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? d3select(sandboxElement.nodes()[0].contentDocument.body)\n : d3select('body');\n // @ts-ignore TODO root.select is not callable\n const svg = securityLevel === 'sandbox' ? root.select(`[id=\"${id}\"]`) : d3select(`[id=\"${id}\"]`);\n\n // Establish svg dimensions and get width and height\n //\n const width = conf?.width ?? defaultSankeyConfig.width!;\n const height = conf?.height ?? defaultSankeyConfig.width!;\n const useMaxWidth = conf?.useMaxWidth ?? defaultSankeyConfig.useMaxWidth!;\n const nodeAlignment = conf?.nodeAlignment ?? defaultSankeyConfig.nodeAlignment!;\n const prefix = conf?.prefix ?? defaultSankeyConfig.prefix!;\n const suffix = conf?.suffix ?? defaultSankeyConfig.suffix!;\n const showValues = conf?.showValues ?? defaultSankeyConfig.showValues!;\n\n // Prepare data for construction based on diagObj.db\n // This must be a mutable object with `nodes` and `links` properties:\n //\n // {\n // \"nodes\": [ { \"id\": \"Alice\" }, { \"id\": \"Bob\" }, { \"id\": \"Carol\" } ],\n // \"links\": [ { \"source\": \"Alice\", \"target\": \"Bob\", \"value\": 23 }, { \"source\": \"Bob\", \"target\": \"Carol\", \"value\": 43 } ]\n // }\n //\n // @ts-ignore TODO: db should be coerced to sankey DB type\n const graph = diagObj.db.getGraph();\n\n // Get alignment function\n const nodeAlign = alignmentsMap[nodeAlignment];\n\n // Construct and configure a Sankey generator\n // That will be a function that calculates nodes and links dimensions\n //\n const nodeWidth = 10;\n const sankey = d3Sankey()\n .nodeId((d: any) => d.id) // we use 'id' property to identify node\n .nodeWidth(nodeWidth)\n .nodePadding(10 + (showValues ? 15 : 0))\n .nodeAlign(nodeAlign)\n .extent([\n [0, 0],\n [width, height],\n ]);\n\n // Compute the Sankey layout: calculate nodes and links positions\n // Our `graph` object will be mutated by this and enriched with other properties\n //\n sankey(graph);\n\n // Get color scheme for the graph\n const colorScheme = d3scaleOrdinal(d3schemeTableau10);\n\n // Create rectangles for nodes\n svg\n .append('g')\n .attr('class', 'nodes')\n .selectAll('.node')\n .data(graph.nodes)\n .join('g')\n .attr('class', 'node')\n .attr('id', (d: any) => (d.uid = Uid.next('node-')).id)\n .attr('transform', function (d: any) {\n return 'translate(' + d.x0 + ',' + d.y0 + ')';\n })\n .attr('x', (d: any) => d.x0)\n .attr('y', (d: any) => d.y0)\n .append('rect')\n .attr('height', (d: any) => {\n return d.y1 - d.y0;\n })\n .attr('width', (d: any) => d.x1 - d.x0)\n .attr('fill', (d: any) => colorScheme(d.id));\n\n const getText = ({ id, value }: { id: string; value: number }) => {\n if (!showValues) {\n return id;\n }\n return `${id}\\n${prefix}${Math.round(value * 100) / 100}${suffix}`;\n };\n\n // Create labels for nodes\n svg\n .append('g')\n .attr('class', 'node-labels')\n .attr('font-size', 14)\n .selectAll('text')\n .data(graph.nodes)\n .join('text')\n .attr('x', (d: any) => (d.x0 < width / 2 ? d.x1 + 6 : d.x0 - 6))\n .attr('y', (d: any) => (d.y1 + d.y0) / 2)\n .attr('dy', `${showValues ? '0' : '0.35'}em`)\n .attr('text-anchor', (d: any) => (d.x0 < width / 2 ? 'start' : 'end'))\n .text(getText);\n\n // Creates the paths that represent the links.\n const link = svg\n .append('g')\n .attr('class', 'links')\n .attr('fill', 'none')\n .attr('stroke-opacity', 0.5)\n .selectAll('.link')\n .data(graph.links)\n .join('g')\n .attr('class', 'link')\n .style('mix-blend-mode', 'multiply');\n\n const linkColor = conf?.linkColor ?? 'gradient';\n\n if (linkColor === 'gradient') {\n const gradient = link\n .append('linearGradient')\n .attr('id', (d: any) => (d.uid = Uid.next('linearGradient-')).id)\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', (d: any) => d.source.x1)\n .attr('x2', (d: any) => d.target.x0);\n\n gradient\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', (d: any) => colorScheme(d.source.id));\n\n gradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', (d: any) => colorScheme(d.target.id));\n }\n\n let coloring: any;\n switch (linkColor) {\n case 'gradient':\n coloring = (d: any) => d.uid;\n break;\n case 'source':\n coloring = (d: any) => colorScheme(d.source.id);\n break;\n case 'target':\n coloring = (d: any) => colorScheme(d.target.id);\n break;\n default:\n coloring = linkColor;\n }\n\n link\n .append('path')\n .attr('d', d3SankeyLinkHorizontal())\n .attr('stroke', coloring)\n .attr('stroke-width', (d: any) => Math.max(1, d.width));\n\n setupGraphViewbox(undefined, svg, 0, useMaxWidth);\n};\n\nexport default {\n draw,\n};\n", "export class Uid {\n private static count = 0;\n id: string;\n href: string;\n\n public static next(name: string): Uid {\n return new Uid(name + ++Uid.count);\n }\n\n constructor(id: string) {\n this.id = id;\n this.href = `#${id}`;\n }\n\n toString(): string {\n return 'url(' + this.href + ')';\n }\n}\n", "export const prepareTextForParsing = (text: string): string => {\n const textToParse = text\n .replaceAll(/^[^\\S\\n\\r]+|[^\\S\\n\\r]+$/g, '') // remove all trailing spaces for each row\n .replaceAll(/([\\n\\r])+/g, '\\n') // remove empty lines duplicated\n .trim();\n\n return textToParse;\n};\n", "const getStyles = (options) =>\n `.label {\n font-family: ${options.fontFamily};\n }`;\n\nexport default getStyles;\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: jison doesn't export types\nimport parser from './parser/sankey.jison';\nimport db from './sankeyDB.js';\nimport renderer from './sankeyRenderer.js';\nimport { prepareTextForParsing } from './sankeyUtils.js';\nimport sankeyStyles from './styles.js';\n\nconst originalParse = parser.parse.bind(parser);\nparser.parse = (text: string) => originalParse(prepareTextForParsing(text));\n\nexport const diagram: DiagramDefinition = {\n styles: sankeyStyles,\n parser,\n db,\n renderer,\n};\n"], + "mappings": ";;;;;;;;;;;;;;;;;;AAyEA,IAAI,UAAU,WAAU;AACxB,MAAI,IAAE,gCAAS,GAAE,GAAEA,IAAE,GAAE;AAAC,SAAIA,KAAEA,MAAG,CAAC,GAAE,IAAE,EAAE,QAAO,KAAIA,GAAE,EAAE,CAAC,CAAC,IAAE,EAAE;AAAC,WAAOA;AAAA,EAAC,GAAhE,MAAkE,MAAI,CAAC,GAAE,CAAC,GAAE,MAAI,CAAC,GAAE,EAAE,GAAE,MAAI,CAAC,GAAE,GAAE,IAAG,EAAE;AAC3G,MAAIC,UAAS;AAAA,IAAC,OAAO,gCAAS,QAAS;AAAA,IAAE,GAApB;AAAA,IACrB,IAAI,CAAC;AAAA,IACL,UAAU,EAAC,SAAQ,GAAE,SAAQ,GAAE,UAAS,GAAE,WAAU,GAAE,OAAM,GAAE,WAAU,GAAE,UAAS,GAAE,YAAW,GAAE,OAAM,IAAG,iBAAgB,IAAG,SAAQ,IAAG,iBAAgB,IAAG,gBAAe,IAAG,SAAQ,IAAG,WAAU,IAAG,eAAc,IAAG,UAAS,IAAG,gBAAe,IAAG,oBAAmB,IAAG,WAAU,GAAE,QAAO,EAAC;AAAA,IAC/R,YAAY,EAAC,GAAE,SAAQ,GAAE,UAAS,GAAE,WAAU,IAAG,OAAM,IAAG,iBAAgB,IAAG,SAAQ,IAAG,iBAAgB,IAAG,gBAAe,IAAG,UAAS,IAAG,gBAAe,IAAG,mBAAkB;AAAA,IAC7K,cAAc,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,GAAE,CAAC,IAAG,CAAC,CAAC;AAAA,IACtF,eAAe,gCAAS,UAAU,QAAQ,QAAQ,UAAU,IAAI,SAAyB,IAAiB,IAAiB;AAG3H,UAAI,KAAK,GAAG,SAAS;AACrB,cAAQ,SAAS;AAAA,QACjB,KAAK;AAEC,gBAAM,SAAS,GAAG,iBAAiB,GAAG,KAAG,CAAC,EAAE,KAAK,EAAE,WAAW,MAAM,GAAG,CAAC;AACxE,gBAAM,SAAS,GAAG,iBAAiB,GAAG,KAAG,CAAC,EAAE,KAAK,EAAE,WAAW,MAAM,GAAG,CAAC;AACxE,gBAAM,QAAQ,WAAW,GAAG,EAAE,EAAE,KAAK,CAAC;AACtC,aAAG,QAAQ,QAAO,QAAO,KAAK;AAEpC;AAAA,QACA,KAAK;AAAA,QAAG,KAAK;AAAA,QAAG,KAAK;AACpB,eAAK,IAAE,GAAG,EAAE;AACb;AAAA,QACA,KAAK;AACJ,eAAK,IAAE,GAAG,KAAG,CAAC;AACf;AAAA,MACA;AAAA,IACA,GApBe;AAAA,IAqBf,OAAO,CAAC,EAAC,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,CAAC,CAAC,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,IAAG,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,GAAE,EAAC,GAAE,IAAG,GAAE,CAAC,GAAE,EAAE,EAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAC,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,CAAC,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,CAAC,CAAC,CAAC;AAAA,IAClZ,gBAAgB,EAAC,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,CAAC,GAAE,CAAC,EAAC;AAAA,IAClC,YAAY,gCAAS,WAAY,KAAK,MAAM;AACxC,UAAI,KAAK,aAAa;AAClB,aAAK,MAAM,GAAG;AAAA,MAClB,OAAO;AACH,YAAI,QAAQ,IAAI,MAAM,GAAG;AACzB,cAAM,OAAO;AACb,cAAM;AAAA,MACV;AAAA,IACJ,GARY;AAAA,IASZ,OAAO,gCAAS,MAAM,OAAO;AACzB,UAAI,OAAO,MAAM,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,QAAQ,KAAK,OAAO,SAAS,IAAI,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM;AACtK,UAAI,OAAO,OAAO,MAAM,KAAK,WAAW,CAAC;AACzC,UAAIC,SAAQ,OAAO,OAAO,KAAK,KAAK;AACpC,UAAI,cAAc,EAAE,IAAI,CAAC,EAAE;AAC3B,eAAS,KAAK,KAAK,IAAI;AACnB,YAAI,OAAO,UAAU,eAAe,KAAK,KAAK,IAAI,CAAC,GAAG;AAClD,sBAAY,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA,QACjC;AAAA,MACJ;AACA,MAAAA,OAAM,SAAS,OAAO,YAAY,EAAE;AACpC,kBAAY,GAAG,QAAQA;AACvB,kBAAY,GAAG,SAAS;AACxB,UAAI,OAAOA,OAAM,UAAU,aAAa;AACpC,QAAAA,OAAM,SAAS,CAAC;AAAA,MACpB;AACA,UAAI,QAAQA,OAAM;AAClB,aAAO,KAAK,KAAK;AACjB,UAAI,SAASA,OAAM,WAAWA,OAAM,QAAQ;AAC5C,UAAI,OAAO,YAAY,GAAG,eAAe,YAAY;AACjD,aAAK,aAAa,YAAY,GAAG;AAAA,MACrC,OAAO;AACH,aAAK,aAAa,OAAO,eAAe,IAAI,EAAE;AAAA,MAClD;AACA,eAAS,SAAS,GAAG;AACjB,cAAM,SAAS,MAAM,SAAS,IAAI;AAClC,eAAO,SAAS,OAAO,SAAS;AAChC,eAAO,SAAS,OAAO,SAAS;AAAA,MACpC;AAJS;AAKD,eAAS,MAAM;AACf,YAAI;AACJ,gBAAQ,OAAO,IAAI,KAAKA,OAAM,IAAI,KAAK;AACvC,YAAI,OAAO,UAAU,UAAU;AAC3B,cAAI,iBAAiB,OAAO;AACxB,qBAAS;AACT,oBAAQ,OAAO,IAAI;AAAA,UACvB;AACA,kBAAQ,KAAK,SAAS,KAAK,KAAK;AAAA,QACpC;AACA,eAAO;AAAA,MACX;AAXa;AAYjB,UAAI,QAAQ,gBAAgB,OAAO,QAAQ,GAAG,GAAG,QAAQ,CAAC,GAAG,GAAG,KAAK,UAAU;AAC/E,aAAO,MAAM;AACT,gBAAQ,MAAM,MAAM,SAAS,CAAC;AAC9B,YAAI,KAAK,eAAe,KAAK,GAAG;AAC5B,mBAAS,KAAK,eAAe,KAAK;AAAA,QACtC,OAAO;AACH,cAAI,WAAW,QAAQ,OAAO,UAAU,aAAa;AACjD,qBAAS,IAAI;AAAA,UACjB;AACA,mBAAS,MAAM,KAAK,KAAK,MAAM,KAAK,EAAE,MAAM;AAAA,QAChD;AACA,YAAI,OAAO,WAAW,eAAe,CAAC,OAAO,UAAU,CAAC,OAAO,CAAC,GAAG;AAC/D,cAAI,SAAS;AACb,qBAAW,CAAC;AACZ,eAAK,KAAK,MAAM,KAAK,GAAG;AACpB,gBAAI,KAAK,WAAW,CAAC,KAAK,IAAI,QAAQ;AAClC,uBAAS,KAAK,MAAO,KAAK,WAAW,CAAC,IAAI,GAAI;AAAA,YAClD;AAAA,UACJ;AACA,cAAIA,OAAM,cAAc;AACpB,qBAAS,0BAA0B,WAAW,KAAK,QAAQA,OAAM,aAAa,IAAI,iBAAiB,SAAS,KAAK,IAAI,IAAI,aAAc,KAAK,WAAW,MAAM,KAAK,UAAU;AAAA,UAChL,OAAO;AACH,qBAAS,0BAA0B,WAAW,KAAK,mBAAmB,UAAU,MAAM,iBAAiB,OAAQ,KAAK,WAAW,MAAM,KAAK,UAAU;AAAA,UACxJ;AACA,eAAK,WAAW,QAAQ;AAAA,YACpB,MAAMA,OAAM;AAAA,YACZ,OAAO,KAAK,WAAW,MAAM,KAAK;AAAA,YAClC,MAAMA,OAAM;AAAA,YACZ,KAAK;AAAA,YACL;AAAA,UACJ,CAAC;AAAA,QACL;AACA,YAAI,OAAO,CAAC,aAAa,SAAS,OAAO,SAAS,GAAG;AACjD,gBAAM,IAAI,MAAM,sDAAsD,QAAQ,cAAc,MAAM;AAAA,QACtG;AACA,gBAAQ,OAAO,CAAC,GAAG;AAAA,UACnB,KAAK;AACD,kBAAM,KAAK,MAAM;AACjB,mBAAO,KAAKA,OAAM,MAAM;AACxB,mBAAO,KAAKA,OAAM,MAAM;AACxB,kBAAM,KAAK,OAAO,CAAC,CAAC;AACpB,qBAAS;AACT,gBAAI,CAAC,gBAAgB;AACjB,uBAASA,OAAM;AACf,uBAASA,OAAM;AACf,yBAAWA,OAAM;AACjB,sBAAQA,OAAM;AACd,kBAAI,aAAa,GAAG;AAChB;AAAA,cACJ;AAAA,YACJ,OAAO;AACH,uBAAS;AACT,+BAAiB;AAAA,YACrB;AACA;AAAA,UACJ,KAAK;AACD,kBAAM,KAAK,aAAa,OAAO,CAAC,CAAC,EAAE,CAAC;AACpC,kBAAM,IAAI,OAAO,OAAO,SAAS,GAAG;AACpC,kBAAM,KAAK;AAAA,cACP,YAAY,OAAO,OAAO,UAAU,OAAO,EAAE,EAAE;AAAA,cAC/C,WAAW,OAAO,OAAO,SAAS,CAAC,EAAE;AAAA,cACrC,cAAc,OAAO,OAAO,UAAU,OAAO,EAAE,EAAE;AAAA,cACjD,aAAa,OAAO,OAAO,SAAS,CAAC,EAAE;AAAA,YAC3C;AACA,gBAAI,QAAQ;AACR,oBAAM,GAAG,QAAQ;AAAA,gBACb,OAAO,OAAO,UAAU,OAAO,EAAE,EAAE,MAAM,CAAC;AAAA,gBAC1C,OAAO,OAAO,SAAS,CAAC,EAAE,MAAM,CAAC;AAAA,cACrC;AAAA,YACJ;AACA,gBAAI,KAAK,cAAc,MAAM,OAAO;AAAA,cAChC;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY;AAAA,cACZ,OAAO,CAAC;AAAA,cACR;AAAA,cACA;AAAA,YACJ,EAAE,OAAO,IAAI,CAAC;AACd,gBAAI,OAAO,MAAM,aAAa;AAC1B,qBAAO;AAAA,YACX;AACA,gBAAI,KAAK;AACL,sBAAQ,MAAM,MAAM,GAAG,KAAK,MAAM,CAAC;AACnC,uBAAS,OAAO,MAAM,GAAG,KAAK,GAAG;AACjC,uBAAS,OAAO,MAAM,GAAG,KAAK,GAAG;AAAA,YACrC;AACA,kBAAM,KAAK,KAAK,aAAa,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1C,mBAAO,KAAK,MAAM,CAAC;AACnB,mBAAO,KAAK,MAAM,EAAE;AACpB,uBAAW,MAAM,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,MAAM,MAAM,SAAS,CAAC,CAAC;AACjE,kBAAM,KAAK,QAAQ;AACnB;AAAA,UACJ,KAAK;AACD,mBAAO;AAAA,QACX;AAAA,MACJ;AACA,aAAO;AAAA,IACX,GA3IO;AAAA,EA2IN;AAED,MAAI,QAAS,4BAAU;AACvB,QAAIA,SAAS;AAAA,MAEb,KAAI;AAAA,MAEJ,YAAW,gCAAS,WAAW,KAAK,MAAM;AAClC,YAAI,KAAK,GAAG,QAAQ;AAChB,eAAK,GAAG,OAAO,WAAW,KAAK,IAAI;AAAA,QACvC,OAAO;AACH,gBAAM,IAAI,MAAM,GAAG;AAAA,QACvB;AAAA,MACJ,GANO;AAAA;AAAA,MASX,UAAS,gCAAU,OAAO,IAAI;AACtB,aAAK,KAAK,MAAM,KAAK,MAAM,CAAC;AAC5B,aAAK,SAAS;AACd,aAAK,QAAQ,KAAK,aAAa,KAAK,OAAO;AAC3C,aAAK,WAAW,KAAK,SAAS;AAC9B,aAAK,SAAS,KAAK,UAAU,KAAK,QAAQ;AAC1C,aAAK,iBAAiB,CAAC,SAAS;AAChC,aAAK,SAAS;AAAA,UACV,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,WAAW;AAAA,UACX,aAAa;AAAA,QACjB;AACA,YAAI,KAAK,QAAQ,QAAQ;AACrB,eAAK,OAAO,QAAQ,CAAC,GAAE,CAAC;AAAA,QAC5B;AACA,aAAK,SAAS;AACd,eAAO;AAAA,MACX,GAlBK;AAAA;AAAA,MAqBT,OAAM,kCAAY;AACV,YAAI,KAAK,KAAK,OAAO,CAAC;AACtB,aAAK,UAAU;AACf,aAAK;AACL,aAAK;AACL,aAAK,SAAS;AACd,aAAK,WAAW;AAChB,YAAI,QAAQ,GAAG,MAAM,iBAAiB;AACtC,YAAI,OAAO;AACP,eAAK;AACL,eAAK,OAAO;AAAA,QAChB,OAAO;AACH,eAAK,OAAO;AAAA,QAChB;AACA,YAAI,KAAK,QAAQ,QAAQ;AACrB,eAAK,OAAO,MAAM,CAAC;AAAA,QACvB;AAEA,aAAK,SAAS,KAAK,OAAO,MAAM,CAAC;AACjC,eAAO;AAAA,MACX,GApBE;AAAA;AAAA,MAuBN,OAAM,gCAAU,IAAI;AACZ,YAAI,MAAM,GAAG;AACb,YAAI,QAAQ,GAAG,MAAM,eAAe;AAEpC,aAAK,SAAS,KAAK,KAAK;AACxB,aAAK,SAAS,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,SAAS,GAAG;AAE5D,aAAK,UAAU;AACf,YAAI,WAAW,KAAK,MAAM,MAAM,eAAe;AAC/C,aAAK,QAAQ,KAAK,MAAM,OAAO,GAAG,KAAK,MAAM,SAAS,CAAC;AACvD,aAAK,UAAU,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,SAAS,CAAC;AAE7D,YAAI,MAAM,SAAS,GAAG;AAClB,eAAK,YAAY,MAAM,SAAS;AAAA,QACpC;AACA,YAAI,IAAI,KAAK,OAAO;AAEpB,aAAK,SAAS;AAAA,UACV,YAAY,KAAK,OAAO;AAAA,UACxB,WAAW,KAAK,WAAW;AAAA,UAC3B,cAAc,KAAK,OAAO;AAAA,UAC1B,aAAa,SACR,MAAM,WAAW,SAAS,SAAS,KAAK,OAAO,eAAe,KAC5D,SAAS,SAAS,SAAS,MAAM,MAAM,EAAE,SAAS,MAAM,CAAC,EAAE,SAChE,KAAK,OAAO,eAAe;AAAA,QACjC;AAEA,YAAI,KAAK,QAAQ,QAAQ;AACrB,eAAK,OAAO,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,SAAS,GAAG;AAAA,QACvD;AACA,aAAK,SAAS,KAAK,OAAO;AAC1B,eAAO;AAAA,MACX,GAhCE;AAAA;AAAA,MAmCN,MAAK,kCAAY;AACT,aAAK,QAAQ;AACb,eAAO;AAAA,MACX,GAHC;AAAA;AAAA,MAML,QAAO,kCAAY;AACX,YAAI,KAAK,QAAQ,iBAAiB;AAC9B,eAAK,aAAa;AAAA,QACtB,OAAO;AACH,iBAAO,KAAK,WAAW,4BAA4B,KAAK,WAAW,KAAK,qIAAqI,KAAK,aAAa,GAAG;AAAA,YAC9N,MAAM;AAAA,YACN,OAAO;AAAA,YACP,MAAM,KAAK;AAAA,UACf,CAAC;AAAA,QAEL;AACA,eAAO;AAAA,MACX,GAZG;AAAA;AAAA,MAeP,MAAK,gCAAU,GAAG;AACV,aAAK,MAAM,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,MAClC,GAFC;AAAA;AAAA,MAKL,WAAU,kCAAY;AACd,YAAI,OAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,SAAS,KAAK,MAAM,MAAM;AACzE,gBAAQ,KAAK,SAAS,KAAK,QAAM,MAAM,KAAK,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE;AAAA,MAC7E,GAHM;AAAA;AAAA,MAMV,eAAc,kCAAY;AAClB,YAAI,OAAO,KAAK;AAChB,YAAI,KAAK,SAAS,IAAI;AAClB,kBAAQ,KAAK,OAAO,OAAO,GAAG,KAAG,KAAK,MAAM;AAAA,QAChD;AACA,gBAAQ,KAAK,OAAO,GAAE,EAAE,KAAK,KAAK,SAAS,KAAK,QAAQ,KAAK,QAAQ,OAAO,EAAE;AAAA,MAClF,GANU;AAAA;AAAA,MASd,cAAa,kCAAY;AACjB,YAAI,MAAM,KAAK,UAAU;AACzB,YAAI,IAAI,IAAI,MAAM,IAAI,SAAS,CAAC,EAAE,KAAK,GAAG;AAC1C,eAAO,MAAM,KAAK,cAAc,IAAI,OAAO,IAAI;AAAA,MACnD,GAJS;AAAA;AAAA,MAOb,YAAW,gCAAS,OAAO,cAAc;AACjC,YAAI,OACA,OACA;AAEJ,YAAI,KAAK,QAAQ,iBAAiB;AAE9B,mBAAS;AAAA,YACL,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,cACJ,YAAY,KAAK,OAAO;AAAA,cACxB,WAAW,KAAK;AAAA,cAChB,cAAc,KAAK,OAAO;AAAA,cAC1B,aAAa,KAAK,OAAO;AAAA,YAC7B;AAAA,YACA,QAAQ,KAAK;AAAA,YACb,OAAO,KAAK;AAAA,YACZ,SAAS,KAAK;AAAA,YACd,SAAS,KAAK;AAAA,YACd,QAAQ,KAAK;AAAA,YACb,QAAQ,KAAK;AAAA,YACb,OAAO,KAAK;AAAA,YACZ,QAAQ,KAAK;AAAA,YACb,IAAI,KAAK;AAAA,YACT,gBAAgB,KAAK,eAAe,MAAM,CAAC;AAAA,YAC3C,MAAM,KAAK;AAAA,UACf;AACA,cAAI,KAAK,QAAQ,QAAQ;AACrB,mBAAO,OAAO,QAAQ,KAAK,OAAO,MAAM,MAAM,CAAC;AAAA,UACnD;AAAA,QACJ;AAEA,gBAAQ,MAAM,CAAC,EAAE,MAAM,iBAAiB;AACxC,YAAI,OAAO;AACP,eAAK,YAAY,MAAM;AAAA,QAC3B;AACA,aAAK,SAAS;AAAA,UACV,YAAY,KAAK,OAAO;AAAA,UACxB,WAAW,KAAK,WAAW;AAAA,UAC3B,cAAc,KAAK,OAAO;AAAA,UAC1B,aAAa,QACA,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,MAAM,MAAM,SAAS,CAAC,EAAE,MAAM,QAAQ,EAAE,CAAC,EAAE,SAC5E,KAAK,OAAO,cAAc,MAAM,CAAC,EAAE;AAAA,QACpD;AACA,aAAK,UAAU,MAAM,CAAC;AACtB,aAAK,SAAS,MAAM,CAAC;AACrB,aAAK,UAAU;AACf,aAAK,SAAS,KAAK,OAAO;AAC1B,YAAI,KAAK,QAAQ,QAAQ;AACrB,eAAK,OAAO,QAAQ,CAAC,KAAK,QAAQ,KAAK,UAAU,KAAK,MAAM;AAAA,QAChE;AACA,aAAK,QAAQ;AACb,aAAK,aAAa;AAClB,aAAK,SAAS,KAAK,OAAO,MAAM,MAAM,CAAC,EAAE,MAAM;AAC/C,aAAK,WAAW,MAAM,CAAC;AACvB,gBAAQ,KAAK,cAAc,KAAK,MAAM,KAAK,IAAI,MAAM,cAAc,KAAK,eAAe,KAAK,eAAe,SAAS,CAAC,CAAC;AACtH,YAAI,KAAK,QAAQ,KAAK,QAAQ;AAC1B,eAAK,OAAO;AAAA,QAChB;AACA,YAAI,OAAO;AACP,iBAAO;AAAA,QACX,WAAW,KAAK,YAAY;AAExB,mBAAS,KAAK,QAAQ;AAClB,iBAAK,CAAC,IAAI,OAAO,CAAC;AAAA,UACtB;AACA,iBAAO;AAAA,QACX;AACA,eAAO;AAAA,MACX,GArEO;AAAA;AAAA,MAwEX,MAAK,kCAAY;AACT,YAAI,KAAK,MAAM;AACX,iBAAO,KAAK;AAAA,QAChB;AACA,YAAI,CAAC,KAAK,QAAQ;AACd,eAAK,OAAO;AAAA,QAChB;AAEA,YAAI,OACA,OACA,WACA;AACJ,YAAI,CAAC,KAAK,OAAO;AACb,eAAK,SAAS;AACd,eAAK,QAAQ;AAAA,QACjB;AACA,YAAI,QAAQ,KAAK,cAAc;AAC/B,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,sBAAY,KAAK,OAAO,MAAM,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC;AAClD,cAAI,cAAc,CAAC,SAAS,UAAU,CAAC,EAAE,SAAS,MAAM,CAAC,EAAE,SAAS;AAChE,oBAAQ;AACR,oBAAQ;AACR,gBAAI,KAAK,QAAQ,iBAAiB;AAC9B,sBAAQ,KAAK,WAAW,WAAW,MAAM,CAAC,CAAC;AAC3C,kBAAI,UAAU,OAAO;AACjB,uBAAO;AAAA,cACX,WAAW,KAAK,YAAY;AACxB,wBAAQ;AACR;AAAA,cACJ,OAAO;AAEH,uBAAO;AAAA,cACX;AAAA,YACJ,WAAW,CAAC,KAAK,QAAQ,MAAM;AAC3B;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AACA,YAAI,OAAO;AACP,kBAAQ,KAAK,WAAW,OAAO,MAAM,KAAK,CAAC;AAC3C,cAAI,UAAU,OAAO;AACjB,mBAAO;AAAA,UACX;AAEA,iBAAO;AAAA,QACX;AACA,YAAI,KAAK,WAAW,IAAI;AACpB,iBAAO,KAAK;AAAA,QAChB,OAAO;AACH,iBAAO,KAAK,WAAW,4BAA4B,KAAK,WAAW,KAAK,2BAA2B,KAAK,aAAa,GAAG;AAAA,YACpH,MAAM;AAAA,YACN,OAAO;AAAA,YACP,MAAM,KAAK;AAAA,UACf,CAAC;AAAA,QACL;AAAA,MACJ,GAvDC;AAAA;AAAA,MA0DL,KAAI,gCAAS,MAAO;AACZ,YAAI,IAAI,KAAK,KAAK;AAClB,YAAI,GAAG;AACH,iBAAO;AAAA,QACX,OAAO;AACH,iBAAO,KAAK,IAAI;AAAA,QACpB;AAAA,MACJ,GAPA;AAAA;AAAA,MAUJ,OAAM,gCAAS,MAAO,WAAW;AACzB,aAAK,eAAe,KAAK,SAAS;AAAA,MACtC,GAFE;AAAA;AAAA,MAKN,UAAS,gCAAS,WAAY;AACtB,YAAI,IAAI,KAAK,eAAe,SAAS;AACrC,YAAI,IAAI,GAAG;AACP,iBAAO,KAAK,eAAe,IAAI;AAAA,QACnC,OAAO;AACH,iBAAO,KAAK,eAAe,CAAC;AAAA,QAChC;AAAA,MACJ,GAPK;AAAA;AAAA,MAUT,eAAc,gCAAS,gBAAiB;AAChC,YAAI,KAAK,eAAe,UAAU,KAAK,eAAe,KAAK,eAAe,SAAS,CAAC,GAAG;AACnF,iBAAO,KAAK,WAAW,KAAK,eAAe,KAAK,eAAe,SAAS,CAAC,CAAC,EAAE;AAAA,QAChF,OAAO;AACH,iBAAO,KAAK,WAAW,SAAS,EAAE;AAAA,QACtC;AAAA,MACJ,GANU;AAAA;AAAA,MASd,UAAS,gCAAS,SAAU,GAAG;AACvB,YAAI,KAAK,eAAe,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC;AACpD,YAAI,KAAK,GAAG;AACR,iBAAO,KAAK,eAAe,CAAC;AAAA,QAChC,OAAO;AACH,iBAAO;AAAA,QACX;AAAA,MACJ,GAPK;AAAA;AAAA,MAUT,WAAU,gCAAS,UAAW,WAAW;AACjC,aAAK,MAAM,SAAS;AAAA,MACxB,GAFM;AAAA;AAAA,MAKV,gBAAe,gCAAS,iBAAiB;AACjC,eAAO,KAAK,eAAe;AAAA,MAC/B,GAFW;AAAA,MAGf,SAAS,EAAC,oBAAmB,KAAI;AAAA,MACjC,eAAe,gCAAS,UAAU,IAAG,KAAI,2BAA0B,UAAU;AAC7E,YAAI,UAAQ;AACZ,gBAAO,2BAA2B;AAAA,UAClC,KAAK;AAAG,iBAAK,UAAU,KAAK;AAAG,mBAAO;AACtC;AAAA,UACA,KAAK;AAAG,iBAAK,UAAU,KAAK;AAAG,mBAAO;AACtC;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,iBAAK,UAAU,cAAc;AAAG,mBAAO;AAC/C;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAE,iBAAK,SAAS,cAAc;AAAG,mBAAO;AAC7C;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,QACA;AAAA,MACA,GAtBe;AAAA,MAuBf,OAAO,CAAC,uBAAsB,kBAAiB,WAAU,mCAAkC,kBAAiB,kBAAiB,sDAAqD,8BAA6B,kGAAkG;AAAA,MACjT,YAAY,EAAC,OAAM,EAAC,SAAQ,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,aAAY,MAAK,GAAE,gBAAe,EAAC,SAAQ,CAAC,GAAE,CAAC,GAAE,aAAY,MAAK,GAAE,WAAU,EAAC,SAAQ,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,aAAY,KAAI,EAAC;AAAA,IACxK;AACA,WAAOA;AAAA,EACP,GAAG;AACH,EAAAD,QAAO,QAAQ;AACf,WAAS,SAAU;AACjB,SAAK,KAAK,CAAC;AAAA,EACb;AAFS;AAGT,SAAO,YAAYA;AAAO,EAAAA,QAAO,SAAS;AAC1C,SAAO,IAAI;AACX,GAAG;AACF,OAAO,SAAS;AAEhB,IAAO,iBAAQ;;;ACzlBhB,IAAI,QAAsB,CAAC;AAE3B,IAAI,QAAsB,CAAC;AAE3B,IAAI,WAAW,oBAAI,IAAwB;AAE3C,IAAME,SAAQ,6BAAY;AACxB,UAAQ,CAAC;AACT,UAAQ,CAAC;AACT,aAAW,oBAAI,IAAI;AACnB,QAAY;AACd,GALc;AAOd,IAAM,aAAN,MAAiB;AAAA,EACf,YACS,QACA,QACA,QAAQ,GACf;AAHO;AACA;AACA;AAAA,EACN;AAAA,EA/BL,OA0BiB;AAAA;AAAA;AAMjB;AAOA,IAAM,UAAU,wBAAC,QAAoB,QAAoB,UAAwB;AAC/E,QAAM,KAAK,IAAI,WAAW,QAAQ,QAAQ,KAAK,CAAC;AAClD,GAFgB;AAIhB,IAAM,aAAN,MAAiB;AAAA,EACf,YAAmB,IAAY;AAAZ;AAAA,EAAa;AAAA,EA5ClC,OA2CiB;AAAA;AAAA;AAEjB;AAEA,IAAM,mBAAmB,wBAAC,OAA2B;AACnD,OAAK,eAAO,aAAa,IAAI,UAAU,CAAC;AAExC,MAAI,OAAO,SAAS,IAAI,EAAE;AAC1B,MAAI,SAAS,QAAW;AACtB,WAAO,IAAI,WAAW,EAAE;AACxB,aAAS,IAAI,IAAI,IAAI;AACrB,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO;AACT,GAVyB;AAYzB,IAAM,WAAW,6BAAM,OAAN;AACjB,IAAM,WAAW,6BAAM,OAAN;AAEjB,IAAM,WAAW,8BAAO;AAAA,EACtB,OAAO,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,GAAG,EAAE;AAAA,EAC5C,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,QAAQ,KAAK,OAAO;AAAA,IACpB,QAAQ,KAAK,OAAO;AAAA,IACpB,OAAO,KAAK;AAAA,EACd,EAAE;AACJ,IAPiB;AASjB,IAAO,mBAAQ;AAAA,EACb;AAAA,EACA,WAAW,6BAAM,UAAU,EAAE,QAAlB;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAAA;AACF;;;ACpFA;AAAA,EACE,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,OACd;AAEP;AAAA,EACE,UAAU;AAAA,EACV,wBAAwB;AAAA,EACxB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,OACZ;;;ACfA,IAAM,MAAN,MAAM,KAAI;AAAA,EAAjB,OAAiB;AAAA;AAAA;AAAA,EACf;AAAA,SAAe,QAAQ;AAAA;AAAA,EAIvB,OAAc,KAAK,MAAmB;AACpC,WAAO,IAAI,KAAI,OAAO,EAAE,KAAI,KAAK;AAAA,EACnC;AAAA,EAEA,YAAY,IAAY;AACtB,SAAK,KAAK;AACV,SAAK,OAAO,IAAI,EAAE;AAAA,EACpB;AAAA,EAEA,WAAmB;AACjB,WAAO,SAAS,KAAK,OAAO;AAAA,EAC9B;AACF;;;ADIA,IAAM,gBAGF;AAAA,EACF,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AACX;AAUO,IAAM,OAAO,gCAAU,MAAc,IAAY,UAAkB,SAAwB;AAEhG,QAAM,EAAE,eAAe,QAAQ,KAAK,IAAI,UAAU;AAClD,QAAM,sBAAsB,cAAc;AAO1C,MAAI;AACJ,MAAI,kBAAkB,WAAW;AAC/B,qBAAiB,SAAS,OAAO,EAAE;AAAA,EACrC;AACA,QAAM,OACJ,kBAAkB,YACd,SAAS,eAAe,MAAM,EAAE,CAAC,EAAE,gBAAgB,IAAI,IACvD,SAAS,MAAM;AAErB,QAAM,MAAM,kBAAkB,YAAY,KAAK,OAAO,QAAQ,EAAE,IAAI,IAAI,SAAS,QAAQ,EAAE,IAAI;AAI/F,QAAM,QAAQ,MAAM,SAAS,oBAAoB;AACjD,QAAM,SAAS,MAAM,UAAU,oBAAoB;AACnD,QAAM,cAAc,MAAM,eAAe,oBAAoB;AAC7D,QAAM,gBAAgB,MAAM,iBAAiB,oBAAoB;AACjE,QAAM,SAAS,MAAM,UAAU,oBAAoB;AACnD,QAAM,SAAS,MAAM,UAAU,oBAAoB;AACnD,QAAM,aAAa,MAAM,cAAc,oBAAoB;AAW3D,QAAM,QAAQ,QAAQ,GAAG,SAAS;AAGlC,QAAM,YAAY,cAAc,aAAa;AAK7C,QAAM,YAAY;AAClB,QAAM,SAAS,SAAS,EACrB,OAAO,CAAC,MAAW,EAAE,EAAE,EACvB,UAAU,SAAS,EACnB,YAAY,MAAM,aAAa,KAAK,EAAE,EACtC,UAAU,SAAS,EACnB,OAAO;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,OAAO,MAAM;AAAA,EAChB,CAAC;AAKH,SAAO,KAAK;AAGZ,QAAM,cAAc,eAAe,iBAAiB;AAGpD,MACG,OAAO,GAAG,EACV,KAAK,SAAS,OAAO,EACrB,UAAU,OAAO,EACjB,KAAK,MAAM,KAAK,EAChB,KAAK,GAAG,EACR,KAAK,SAAS,MAAM,EACpB,KAAK,MAAM,CAAC,OAAY,EAAE,MAAM,IAAI,KAAK,OAAO,GAAG,EAAE,EACrD,KAAK,aAAa,SAAU,GAAQ;AACnC,WAAO,eAAe,EAAE,KAAK,MAAM,EAAE,KAAK;AAAA,EAC5C,CAAC,EACA,KAAK,KAAK,CAAC,MAAW,EAAE,EAAE,EAC1B,KAAK,KAAK,CAAC,MAAW,EAAE,EAAE,EAC1B,OAAO,MAAM,EACb,KAAK,UAAU,CAAC,MAAW;AAC1B,WAAO,EAAE,KAAK,EAAE;AAAA,EAClB,CAAC,EACA,KAAK,SAAS,CAAC,MAAW,EAAE,KAAK,EAAE,EAAE,EACrC,KAAK,QAAQ,CAAC,MAAW,YAAY,EAAE,EAAE,CAAC;AAE7C,QAAM,UAAU,wBAAC,EAAE,IAAAC,KAAI,MAAM,MAAqC;AAChE,QAAI,CAAC,YAAY;AACf,aAAOA;AAAA,IACT;AACA,WAAO,GAAGA,GAAE;AAAA,EAAK,MAAM,GAAG,KAAK,MAAM,QAAQ,GAAG,IAAI,GAAG,GAAG,MAAM;AAAA,EAClE,GALgB;AAQhB,MACG,OAAO,GAAG,EACV,KAAK,SAAS,aAAa,EAC3B,KAAK,aAAa,EAAE,EACpB,UAAU,MAAM,EAChB,KAAK,MAAM,KAAK,EAChB,KAAK,MAAM,EACX,KAAK,KAAK,CAAC,MAAY,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,CAAE,EAC9D,KAAK,KAAK,CAAC,OAAY,EAAE,KAAK,EAAE,MAAM,CAAC,EACvC,KAAK,MAAM,GAAG,aAAa,MAAM,MAAM,IAAI,EAC3C,KAAK,eAAe,CAAC,MAAY,EAAE,KAAK,QAAQ,IAAI,UAAU,KAAM,EACpE,KAAK,OAAO;AAGf,QAAM,OAAO,IACV,OAAO,GAAG,EACV,KAAK,SAAS,OAAO,EACrB,KAAK,QAAQ,MAAM,EACnB,KAAK,kBAAkB,GAAG,EAC1B,UAAU,OAAO,EACjB,KAAK,MAAM,KAAK,EAChB,KAAK,GAAG,EACR,KAAK,SAAS,MAAM,EACpB,MAAM,kBAAkB,UAAU;AAErC,QAAM,YAAY,MAAM,aAAa;AAErC,MAAI,cAAc,YAAY;AAC5B,UAAM,WAAW,KACd,OAAO,gBAAgB,EACvB,KAAK,MAAM,CAAC,OAAY,EAAE,MAAM,IAAI,KAAK,iBAAiB,GAAG,EAAE,EAC/D,KAAK,iBAAiB,gBAAgB,EACtC,KAAK,MAAM,CAAC,MAAW,EAAE,OAAO,EAAE,EAClC,KAAK,MAAM,CAAC,MAAW,EAAE,OAAO,EAAE;AAErC,aACG,OAAO,MAAM,EACb,KAAK,UAAU,IAAI,EACnB,KAAK,cAAc,CAAC,MAAW,YAAY,EAAE,OAAO,EAAE,CAAC;AAE1D,aACG,OAAO,MAAM,EACb,KAAK,UAAU,MAAM,EACrB,KAAK,cAAc,CAAC,MAAW,YAAY,EAAE,OAAO,EAAE,CAAC;AAAA,EAC5D;AAEA,MAAI;AACJ,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,iBAAW,wBAAC,MAAW,EAAE,KAAd;AACX;AAAA,IACF,KAAK;AACH,iBAAW,wBAAC,MAAW,YAAY,EAAE,OAAO,EAAE,GAAnC;AACX;AAAA,IACF,KAAK;AACH,iBAAW,wBAAC,MAAW,YAAY,EAAE,OAAO,EAAE,GAAnC;AACX;AAAA,IACF;AACE,iBAAW;AAAA,EACf;AAEA,OACG,OAAO,MAAM,EACb,KAAK,KAAK,uBAAuB,CAAC,EAClC,KAAK,UAAU,QAAQ,EACvB,KAAK,gBAAgB,CAAC,MAAW,KAAK,IAAI,GAAG,EAAE,KAAK,CAAC;AAExD,oBAAkB,QAAW,KAAK,GAAG,WAAW;AAClD,GApKoB;AAsKpB,IAAO,yBAAQ;AAAA,EACb;AACF;;;AE/MO,IAAM,wBAAwB,wBAAC,SAAyB;AAC7D,QAAM,cAAc,KACjB,WAAW,4BAA4B,EAAE,EACzC,WAAW,cAAc,IAAI,EAC7B,KAAK;AAER,SAAO;AACT,GAPqC;;;ACArC,IAAM,YAAY,wBAAC,YACjB;AAAA,qBACmB,QAAQ,UAAU;AAAA,QAFrB;AAKlB,IAAO,iBAAQ;;;ACGf,IAAM,gBAAgB,eAAO,MAAM,KAAK,cAAM;AAC9C,eAAO,QAAQ,CAAC,SAAiB,cAAc,sBAAsB,IAAI,CAAC;AAEnE,IAAM,UAA6B;AAAA,EACxC,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AACF;", + "names": ["o", "parser", "lexer", "clear", "id"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/sequenceDiagram-WL72ISMW.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/sequenceDiagram-WL72ISMW.mjs new file mode 100644 index 0000000..6922a2d --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/sequenceDiagram-WL72ISMW.mjs @@ -0,0 +1,4012 @@ +import { + drawBackgroundRect, + drawEmbeddedImage, + drawImage, + drawRect, + getNoteRect, + getTextObj +} from "./chunk-TZMSLE5B.mjs"; +import { + JSON_SCHEMA, + load +} from "./chunk-MI3HLSF2.mjs"; +import { + ImperativeState +} from "./chunk-QZHKN3VN.mjs"; +import { + ZERO_WIDTH_SPACE, + parseFontSize, + utils_default +} from "./chunk-S3R3BYOJ.mjs"; +import { + assignWithDepth_default, + calculateMathMLDimensions, + clear, + common_default, + configureSvgSize, + getAccDescription, + getAccTitle, + getConfig, + getConfig2, + getDiagramTitle, + getUrl, + hasKatex, + renderKatexSanitized, + sanitizeText, + setAccDescription, + setAccTitle, + setConfig2 as setConfig, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/sequence/parser/sequenceDiagram.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 2], $V1 = [1, 3], $V2 = [1, 4], $V3 = [2, 4], $V4 = [1, 9], $V5 = [1, 11], $V6 = [1, 13], $V7 = [1, 14], $V8 = [1, 16], $V9 = [1, 17], $Va = [1, 18], $Vb = [1, 24], $Vc = [1, 25], $Vd = [1, 26], $Ve = [1, 27], $Vf = [1, 28], $Vg = [1, 29], $Vh = [1, 30], $Vi = [1, 31], $Vj = [1, 32], $Vk = [1, 33], $Vl = [1, 34], $Vm = [1, 35], $Vn = [1, 36], $Vo = [1, 37], $Vp = [1, 38], $Vq = [1, 39], $Vr = [1, 41], $Vs = [1, 42], $Vt = [1, 43], $Vu = [1, 44], $Vv = [1, 45], $Vw = [1, 46], $Vx = [1, 4, 5, 13, 14, 16, 18, 21, 23, 29, 30, 31, 33, 35, 36, 37, 38, 39, 41, 43, 44, 46, 47, 48, 49, 50, 52, 53, 55, 60, 61, 62, 63, 71], $Vy = [2, 71], $Vz = [4, 5, 16, 50, 52, 53], $VA = [4, 5, 13, 14, 16, 18, 21, 23, 29, 30, 31, 33, 35, 36, 37, 38, 39, 41, 43, 44, 46, 50, 52, 53, 55, 60, 61, 62, 63, 71], $VB = [4, 5, 13, 14, 16, 18, 21, 23, 29, 30, 31, 33, 35, 36, 37, 38, 39, 41, 43, 44, 46, 49, 50, 52, 53, 55, 60, 61, 62, 63, 71], $VC = [4, 5, 13, 14, 16, 18, 21, 23, 29, 30, 31, 33, 35, 36, 37, 38, 39, 41, 43, 44, 46, 48, 50, 52, 53, 55, 60, 61, 62, 63, 71], $VD = [4, 5, 13, 14, 16, 18, 21, 23, 29, 30, 31, 33, 35, 36, 37, 38, 39, 41, 43, 44, 46, 47, 50, 52, 53, 55, 60, 61, 62, 63, 71], $VE = [69, 70, 71], $VF = [1, 127]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "SPACE": 4, "NEWLINE": 5, "SD": 6, "document": 7, "line": 8, "statement": 9, "box_section": 10, "box_line": 11, "participant_statement": 12, "create": 13, "box": 14, "restOfLine": 15, "end": 16, "signal": 17, "autonumber": 18, "NUM": 19, "off": 20, "activate": 21, "actor": 22, "deactivate": 23, "note_statement": 24, "links_statement": 25, "link_statement": 26, "properties_statement": 27, "details_statement": 28, "title": 29, "legacy_title": 30, "acc_title": 31, "acc_title_value": 32, "acc_descr": 33, "acc_descr_value": 34, "acc_descr_multiline_value": 35, "loop": 36, "rect": 37, "opt": 38, "alt": 39, "else_sections": 40, "par": 41, "par_sections": 42, "par_over": 43, "critical": 44, "option_sections": 45, "break": 46, "option": 47, "and": 48, "else": 49, "participant": 50, "AS": 51, "participant_actor": 52, "destroy": 53, "actor_with_config": 54, "note": 55, "placement": 56, "text2": 57, "over": 58, "actor_pair": 59, "links": 60, "link": 61, "properties": 62, "details": 63, "spaceList": 64, ",": 65, "left_of": 66, "right_of": 67, "signaltype": 68, "+": 69, "-": 70, "ACTOR": 71, "config_object": 72, "CONFIG_START": 73, "CONFIG_CONTENT": 74, "CONFIG_END": 75, "SOLID_OPEN_ARROW": 76, "DOTTED_OPEN_ARROW": 77, "SOLID_ARROW": 78, "BIDIRECTIONAL_SOLID_ARROW": 79, "DOTTED_ARROW": 80, "BIDIRECTIONAL_DOTTED_ARROW": 81, "SOLID_CROSS": 82, "DOTTED_CROSS": 83, "SOLID_POINT": 84, "DOTTED_POINT": 85, "TXT": 86, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "SPACE", 5: "NEWLINE", 6: "SD", 13: "create", 14: "box", 15: "restOfLine", 16: "end", 18: "autonumber", 19: "NUM", 20: "off", 21: "activate", 23: "deactivate", 29: "title", 30: "legacy_title", 31: "acc_title", 32: "acc_title_value", 33: "acc_descr", 34: "acc_descr_value", 35: "acc_descr_multiline_value", 36: "loop", 37: "rect", 38: "opt", 39: "alt", 41: "par", 43: "par_over", 44: "critical", 46: "break", 47: "option", 48: "and", 49: "else", 50: "participant", 51: "AS", 52: "participant_actor", 53: "destroy", 55: "note", 58: "over", 60: "links", 61: "link", 62: "properties", 63: "details", 65: ",", 66: "left_of", 67: "right_of", 69: "+", 70: "-", 71: "ACTOR", 73: "CONFIG_START", 74: "CONFIG_CONTENT", 75: "CONFIG_END", 76: "SOLID_OPEN_ARROW", 77: "DOTTED_OPEN_ARROW", 78: "SOLID_ARROW", 79: "BIDIRECTIONAL_SOLID_ARROW", 80: "DOTTED_ARROW", 81: "BIDIRECTIONAL_DOTTED_ARROW", 82: "SOLID_CROSS", 83: "DOTTED_CROSS", 84: "SOLID_POINT", 85: "DOTTED_POINT", 86: "TXT" }, + productions_: [0, [3, 2], [3, 2], [3, 2], [7, 0], [7, 2], [8, 2], [8, 1], [8, 1], [10, 0], [10, 2], [11, 2], [11, 1], [11, 1], [9, 1], [9, 2], [9, 4], [9, 2], [9, 4], [9, 3], [9, 3], [9, 2], [9, 3], [9, 3], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 1], [9, 1], [9, 2], [9, 2], [9, 1], [9, 4], [9, 4], [9, 4], [9, 4], [9, 4], [9, 4], [9, 4], [9, 4], [45, 1], [45, 4], [42, 1], [42, 4], [40, 1], [40, 4], [12, 5], [12, 3], [12, 5], [12, 3], [12, 3], [12, 3], [24, 4], [24, 4], [25, 3], [26, 3], [27, 3], [28, 3], [64, 2], [64, 1], [59, 3], [59, 1], [56, 1], [56, 1], [17, 5], [17, 5], [17, 4], [54, 2], [72, 3], [22, 1], [68, 1], [68, 1], [68, 1], [68, 1], [68, 1], [68, 1], [68, 1], [68, 1], [68, 1], [68, 1], [57, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 3: + yy.apply($$[$0]); + return $$[$0]; + break; + case 4: + case 9: + this.$ = []; + break; + case 5: + case 10: + $$[$0 - 1].push($$[$0]); + this.$ = $$[$0 - 1]; + break; + case 6: + case 7: + case 11: + case 12: + this.$ = $$[$0]; + break; + case 8: + case 13: + this.$ = []; + break; + case 15: + $$[$0].type = "createParticipant"; + this.$ = $$[$0]; + break; + case 16: + $$[$0 - 1].unshift({ type: "boxStart", boxData: yy.parseBoxData($$[$0 - 2]) }); + $$[$0 - 1].push({ type: "boxEnd", boxText: $$[$0 - 2] }); + this.$ = $$[$0 - 1]; + break; + case 18: + this.$ = { type: "sequenceIndex", sequenceIndex: Number($$[$0 - 2]), sequenceIndexStep: Number($$[$0 - 1]), sequenceVisible: true, signalType: yy.LINETYPE.AUTONUMBER }; + break; + case 19: + this.$ = { type: "sequenceIndex", sequenceIndex: Number($$[$0 - 1]), sequenceIndexStep: 1, sequenceVisible: true, signalType: yy.LINETYPE.AUTONUMBER }; + break; + case 20: + this.$ = { type: "sequenceIndex", sequenceVisible: false, signalType: yy.LINETYPE.AUTONUMBER }; + break; + case 21: + this.$ = { type: "sequenceIndex", sequenceVisible: true, signalType: yy.LINETYPE.AUTONUMBER }; + break; + case 22: + this.$ = { type: "activeStart", signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0 - 1].actor }; + break; + case 23: + this.$ = { type: "activeEnd", signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0 - 1].actor }; + break; + case 29: + yy.setDiagramTitle($$[$0].substring(6)); + this.$ = $$[$0].substring(6); + break; + case 30: + yy.setDiagramTitle($$[$0].substring(7)); + this.$ = $$[$0].substring(7); + break; + case 31: + this.$ = $$[$0].trim(); + yy.setAccTitle(this.$); + break; + case 32: + case 33: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 34: + $$[$0 - 1].unshift({ type: "loopStart", loopText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.LOOP_START }); + $$[$0 - 1].push({ type: "loopEnd", loopText: $$[$0 - 2], signalType: yy.LINETYPE.LOOP_END }); + this.$ = $$[$0 - 1]; + break; + case 35: + $$[$0 - 1].unshift({ type: "rectStart", color: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.RECT_START }); + $$[$0 - 1].push({ type: "rectEnd", color: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.RECT_END }); + this.$ = $$[$0 - 1]; + break; + case 36: + $$[$0 - 1].unshift({ type: "optStart", optText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.OPT_START }); + $$[$0 - 1].push({ type: "optEnd", optText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.OPT_END }); + this.$ = $$[$0 - 1]; + break; + case 37: + $$[$0 - 1].unshift({ type: "altStart", altText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.ALT_START }); + $$[$0 - 1].push({ type: "altEnd", signalType: yy.LINETYPE.ALT_END }); + this.$ = $$[$0 - 1]; + break; + case 38: + $$[$0 - 1].unshift({ type: "parStart", parText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.PAR_START }); + $$[$0 - 1].push({ type: "parEnd", signalType: yy.LINETYPE.PAR_END }); + this.$ = $$[$0 - 1]; + break; + case 39: + $$[$0 - 1].unshift({ type: "parStart", parText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.PAR_OVER_START }); + $$[$0 - 1].push({ type: "parEnd", signalType: yy.LINETYPE.PAR_END }); + this.$ = $$[$0 - 1]; + break; + case 40: + $$[$0 - 1].unshift({ type: "criticalStart", criticalText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.CRITICAL_START }); + $$[$0 - 1].push({ type: "criticalEnd", signalType: yy.LINETYPE.CRITICAL_END }); + this.$ = $$[$0 - 1]; + break; + case 41: + $$[$0 - 1].unshift({ type: "breakStart", breakText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.BREAK_START }); + $$[$0 - 1].push({ type: "breakEnd", optText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.BREAK_END }); + this.$ = $$[$0 - 1]; + break; + case 43: + this.$ = $$[$0 - 3].concat([{ type: "option", optionText: yy.parseMessage($$[$0 - 1]), signalType: yy.LINETYPE.CRITICAL_OPTION }, $$[$0]]); + break; + case 45: + this.$ = $$[$0 - 3].concat([{ type: "and", parText: yy.parseMessage($$[$0 - 1]), signalType: yy.LINETYPE.PAR_AND }, $$[$0]]); + break; + case 47: + this.$ = $$[$0 - 3].concat([{ type: "else", altText: yy.parseMessage($$[$0 - 1]), signalType: yy.LINETYPE.ALT_ELSE }, $$[$0]]); + break; + case 48: + $$[$0 - 3].draw = "participant"; + $$[$0 - 3].type = "addParticipant"; + $$[$0 - 3].description = yy.parseMessage($$[$0 - 1]); + this.$ = $$[$0 - 3]; + break; + case 49: + $$[$0 - 1].draw = "participant"; + $$[$0 - 1].type = "addParticipant"; + this.$ = $$[$0 - 1]; + break; + case 50: + $$[$0 - 3].draw = "actor"; + $$[$0 - 3].type = "addParticipant"; + $$[$0 - 3].description = yy.parseMessage($$[$0 - 1]); + this.$ = $$[$0 - 3]; + break; + case 51: + $$[$0 - 1].draw = "actor"; + $$[$0 - 1].type = "addParticipant"; + this.$ = $$[$0 - 1]; + break; + case 52: + $$[$0 - 1].type = "destroyParticipant"; + this.$ = $$[$0 - 1]; + break; + case 53: + $$[$0 - 1].draw = "participant"; + $$[$0 - 1].type = "addParticipant"; + this.$ = $$[$0 - 1]; + break; + case 54: + this.$ = [$$[$0 - 1], { type: "addNote", placement: $$[$0 - 2], actor: $$[$0 - 1].actor, text: $$[$0] }]; + break; + case 55: + $$[$0 - 2] = [].concat($$[$0 - 1], $$[$0 - 1]).slice(0, 2); + $$[$0 - 2][0] = $$[$0 - 2][0].actor; + $$[$0 - 2][1] = $$[$0 - 2][1].actor; + this.$ = [$$[$0 - 1], { type: "addNote", placement: yy.PLACEMENT.OVER, actor: $$[$0 - 2].slice(0, 2), text: $$[$0] }]; + break; + case 56: + this.$ = [$$[$0 - 1], { type: "addLinks", actor: $$[$0 - 1].actor, text: $$[$0] }]; + break; + case 57: + this.$ = [$$[$0 - 1], { type: "addALink", actor: $$[$0 - 1].actor, text: $$[$0] }]; + break; + case 58: + this.$ = [$$[$0 - 1], { type: "addProperties", actor: $$[$0 - 1].actor, text: $$[$0] }]; + break; + case 59: + this.$ = [$$[$0 - 1], { type: "addDetails", actor: $$[$0 - 1].actor, text: $$[$0] }]; + break; + case 62: + this.$ = [$$[$0 - 2], $$[$0]]; + break; + case 63: + this.$ = $$[$0]; + break; + case 64: + this.$ = yy.PLACEMENT.LEFTOF; + break; + case 65: + this.$ = yy.PLACEMENT.RIGHTOF; + break; + case 66: + this.$ = [ + $$[$0 - 4], + $$[$0 - 1], + { type: "addMessage", from: $$[$0 - 4].actor, to: $$[$0 - 1].actor, signalType: $$[$0 - 3], msg: $$[$0], activate: true }, + { type: "activeStart", signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0 - 1].actor } + ]; + break; + case 67: + this.$ = [ + $$[$0 - 4], + $$[$0 - 1], + { type: "addMessage", from: $$[$0 - 4].actor, to: $$[$0 - 1].actor, signalType: $$[$0 - 3], msg: $$[$0] }, + { type: "activeEnd", signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0 - 4].actor } + ]; + break; + case 68: + this.$ = [$$[$0 - 3], $$[$0 - 1], { type: "addMessage", from: $$[$0 - 3].actor, to: $$[$0 - 1].actor, signalType: $$[$0 - 2], msg: $$[$0] }]; + break; + case 69: + this.$ = { + type: "addParticipant", + actor: $$[$0 - 1], + config: $$[$0] + }; + break; + case 70: + this.$ = $$[$0 - 1].trim(); + break; + case 71: + this.$ = { type: "addParticipant", actor: $$[$0] }; + break; + case 72: + this.$ = yy.LINETYPE.SOLID_OPEN; + break; + case 73: + this.$ = yy.LINETYPE.DOTTED_OPEN; + break; + case 74: + this.$ = yy.LINETYPE.SOLID; + break; + case 75: + this.$ = yy.LINETYPE.BIDIRECTIONAL_SOLID; + break; + case 76: + this.$ = yy.LINETYPE.DOTTED; + break; + case 77: + this.$ = yy.LINETYPE.BIDIRECTIONAL_DOTTED; + break; + case 78: + this.$ = yy.LINETYPE.SOLID_CROSS; + break; + case 79: + this.$ = yy.LINETYPE.DOTTED_CROSS; + break; + case 80: + this.$ = yy.LINETYPE.SOLID_POINT; + break; + case 81: + this.$ = yy.LINETYPE.DOTTED_POINT; + break; + case 82: + this.$ = yy.parseMessage($$[$0].trim().substring(1)); + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: $V0, 5: $V1, 6: $V2 }, { 1: [3] }, { 3: 5, 4: $V0, 5: $V1, 6: $V2 }, { 3: 6, 4: $V0, 5: $V1, 6: $V2 }, o([1, 4, 5, 13, 14, 18, 21, 23, 29, 30, 31, 33, 35, 36, 37, 38, 39, 41, 43, 44, 46, 50, 52, 53, 55, 60, 61, 62, 63, 71], $V3, { 7: 7 }), { 1: [2, 1] }, { 1: [2, 2] }, { 1: [2, 3], 4: $V4, 5: $V5, 8: 8, 9: 10, 12: 12, 13: $V6, 14: $V7, 17: 15, 18: $V8, 21: $V9, 22: 40, 23: $Va, 24: 19, 25: 20, 26: 21, 27: 22, 28: 23, 29: $Vb, 30: $Vc, 31: $Vd, 33: $Ve, 35: $Vf, 36: $Vg, 37: $Vh, 38: $Vi, 39: $Vj, 41: $Vk, 43: $Vl, 44: $Vm, 46: $Vn, 50: $Vo, 52: $Vp, 53: $Vq, 55: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 71: $Vw }, o($Vx, [2, 5]), { 9: 47, 12: 12, 13: $V6, 14: $V7, 17: 15, 18: $V8, 21: $V9, 22: 40, 23: $Va, 24: 19, 25: 20, 26: 21, 27: 22, 28: 23, 29: $Vb, 30: $Vc, 31: $Vd, 33: $Ve, 35: $Vf, 36: $Vg, 37: $Vh, 38: $Vi, 39: $Vj, 41: $Vk, 43: $Vl, 44: $Vm, 46: $Vn, 50: $Vo, 52: $Vp, 53: $Vq, 55: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 71: $Vw }, o($Vx, [2, 7]), o($Vx, [2, 8]), o($Vx, [2, 14]), { 12: 48, 50: $Vo, 52: $Vp, 53: $Vq }, { 15: [1, 49] }, { 5: [1, 50] }, { 5: [1, 53], 19: [1, 51], 20: [1, 52] }, { 22: 54, 71: $Vw }, { 22: 55, 71: $Vw }, { 5: [1, 56] }, { 5: [1, 57] }, { 5: [1, 58] }, { 5: [1, 59] }, { 5: [1, 60] }, o($Vx, [2, 29]), o($Vx, [2, 30]), { 32: [1, 61] }, { 34: [1, 62] }, o($Vx, [2, 33]), { 15: [1, 63] }, { 15: [1, 64] }, { 15: [1, 65] }, { 15: [1, 66] }, { 15: [1, 67] }, { 15: [1, 68] }, { 15: [1, 69] }, { 15: [1, 70] }, { 22: 71, 54: 72, 71: [1, 73] }, { 22: 74, 71: $Vw }, { 22: 75, 71: $Vw }, { 68: 76, 76: [1, 77], 77: [1, 78], 78: [1, 79], 79: [1, 80], 80: [1, 81], 81: [1, 82], 82: [1, 83], 83: [1, 84], 84: [1, 85], 85: [1, 86] }, { 56: 87, 58: [1, 88], 66: [1, 89], 67: [1, 90] }, { 22: 91, 71: $Vw }, { 22: 92, 71: $Vw }, { 22: 93, 71: $Vw }, { 22: 94, 71: $Vw }, o([5, 51, 65, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86], $Vy), o($Vx, [2, 6]), o($Vx, [2, 15]), o($Vz, [2, 9], { 10: 95 }), o($Vx, [2, 17]), { 5: [1, 97], 19: [1, 96] }, { 5: [1, 98] }, o($Vx, [2, 21]), { 5: [1, 99] }, { 5: [1, 100] }, o($Vx, [2, 24]), o($Vx, [2, 25]), o($Vx, [2, 26]), o($Vx, [2, 27]), o($Vx, [2, 28]), o($Vx, [2, 31]), o($Vx, [2, 32]), o($VA, $V3, { 7: 101 }), o($VA, $V3, { 7: 102 }), o($VA, $V3, { 7: 103 }), o($VB, $V3, { 40: 104, 7: 105 }), o($VC, $V3, { 42: 106, 7: 107 }), o($VC, $V3, { 7: 107, 42: 108 }), o($VD, $V3, { 45: 109, 7: 110 }), o($VA, $V3, { 7: 111 }), { 5: [1, 113], 51: [1, 112] }, { 5: [1, 114] }, o([5, 51], $Vy, { 72: 115, 73: [1, 116] }), { 5: [1, 118], 51: [1, 117] }, { 5: [1, 119] }, { 22: 122, 69: [1, 120], 70: [1, 121], 71: $Vw }, o($VE, [2, 72]), o($VE, [2, 73]), o($VE, [2, 74]), o($VE, [2, 75]), o($VE, [2, 76]), o($VE, [2, 77]), o($VE, [2, 78]), o($VE, [2, 79]), o($VE, [2, 80]), o($VE, [2, 81]), { 22: 123, 71: $Vw }, { 22: 125, 59: 124, 71: $Vw }, { 71: [2, 64] }, { 71: [2, 65] }, { 57: 126, 86: $VF }, { 57: 128, 86: $VF }, { 57: 129, 86: $VF }, { 57: 130, 86: $VF }, { 4: [1, 133], 5: [1, 135], 11: 132, 12: 134, 16: [1, 131], 50: $Vo, 52: $Vp, 53: $Vq }, { 5: [1, 136] }, o($Vx, [2, 19]), o($Vx, [2, 20]), o($Vx, [2, 22]), o($Vx, [2, 23]), { 4: $V4, 5: $V5, 8: 8, 9: 10, 12: 12, 13: $V6, 14: $V7, 16: [1, 137], 17: 15, 18: $V8, 21: $V9, 22: 40, 23: $Va, 24: 19, 25: 20, 26: 21, 27: 22, 28: 23, 29: $Vb, 30: $Vc, 31: $Vd, 33: $Ve, 35: $Vf, 36: $Vg, 37: $Vh, 38: $Vi, 39: $Vj, 41: $Vk, 43: $Vl, 44: $Vm, 46: $Vn, 50: $Vo, 52: $Vp, 53: $Vq, 55: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 71: $Vw }, { 4: $V4, 5: $V5, 8: 8, 9: 10, 12: 12, 13: $V6, 14: $V7, 16: [1, 138], 17: 15, 18: $V8, 21: $V9, 22: 40, 23: $Va, 24: 19, 25: 20, 26: 21, 27: 22, 28: 23, 29: $Vb, 30: $Vc, 31: $Vd, 33: $Ve, 35: $Vf, 36: $Vg, 37: $Vh, 38: $Vi, 39: $Vj, 41: $Vk, 43: $Vl, 44: $Vm, 46: $Vn, 50: $Vo, 52: $Vp, 53: $Vq, 55: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 71: $Vw }, { 4: $V4, 5: $V5, 8: 8, 9: 10, 12: 12, 13: $V6, 14: $V7, 16: [1, 139], 17: 15, 18: $V8, 21: $V9, 22: 40, 23: $Va, 24: 19, 25: 20, 26: 21, 27: 22, 28: 23, 29: $Vb, 30: $Vc, 31: $Vd, 33: $Ve, 35: $Vf, 36: $Vg, 37: $Vh, 38: $Vi, 39: $Vj, 41: $Vk, 43: $Vl, 44: $Vm, 46: $Vn, 50: $Vo, 52: $Vp, 53: $Vq, 55: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 71: $Vw }, { 16: [1, 140] }, { 4: $V4, 5: $V5, 8: 8, 9: 10, 12: 12, 13: $V6, 14: $V7, 16: [2, 46], 17: 15, 18: $V8, 21: $V9, 22: 40, 23: $Va, 24: 19, 25: 20, 26: 21, 27: 22, 28: 23, 29: $Vb, 30: $Vc, 31: $Vd, 33: $Ve, 35: $Vf, 36: $Vg, 37: $Vh, 38: $Vi, 39: $Vj, 41: $Vk, 43: $Vl, 44: $Vm, 46: $Vn, 49: [1, 141], 50: $Vo, 52: $Vp, 53: $Vq, 55: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 71: $Vw }, { 16: [1, 142] }, { 4: $V4, 5: $V5, 8: 8, 9: 10, 12: 12, 13: $V6, 14: $V7, 16: [2, 44], 17: 15, 18: $V8, 21: $V9, 22: 40, 23: $Va, 24: 19, 25: 20, 26: 21, 27: 22, 28: 23, 29: $Vb, 30: $Vc, 31: $Vd, 33: $Ve, 35: $Vf, 36: $Vg, 37: $Vh, 38: $Vi, 39: $Vj, 41: $Vk, 43: $Vl, 44: $Vm, 46: $Vn, 48: [1, 143], 50: $Vo, 52: $Vp, 53: $Vq, 55: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 71: $Vw }, { 16: [1, 144] }, { 16: [1, 145] }, { 4: $V4, 5: $V5, 8: 8, 9: 10, 12: 12, 13: $V6, 14: $V7, 16: [2, 42], 17: 15, 18: $V8, 21: $V9, 22: 40, 23: $Va, 24: 19, 25: 20, 26: 21, 27: 22, 28: 23, 29: $Vb, 30: $Vc, 31: $Vd, 33: $Ve, 35: $Vf, 36: $Vg, 37: $Vh, 38: $Vi, 39: $Vj, 41: $Vk, 43: $Vl, 44: $Vm, 46: $Vn, 47: [1, 146], 50: $Vo, 52: $Vp, 53: $Vq, 55: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 71: $Vw }, { 4: $V4, 5: $V5, 8: 8, 9: 10, 12: 12, 13: $V6, 14: $V7, 16: [1, 147], 17: 15, 18: $V8, 21: $V9, 22: 40, 23: $Va, 24: 19, 25: 20, 26: 21, 27: 22, 28: 23, 29: $Vb, 30: $Vc, 31: $Vd, 33: $Ve, 35: $Vf, 36: $Vg, 37: $Vh, 38: $Vi, 39: $Vj, 41: $Vk, 43: $Vl, 44: $Vm, 46: $Vn, 50: $Vo, 52: $Vp, 53: $Vq, 55: $Vr, 60: $Vs, 61: $Vt, 62: $Vu, 63: $Vv, 71: $Vw }, { 15: [1, 148] }, o($Vx, [2, 49]), o($Vx, [2, 53]), { 5: [2, 69] }, { 74: [1, 149] }, { 15: [1, 150] }, o($Vx, [2, 51]), o($Vx, [2, 52]), { 22: 151, 71: $Vw }, { 22: 152, 71: $Vw }, { 57: 153, 86: $VF }, { 57: 154, 86: $VF }, { 57: 155, 86: $VF }, { 65: [1, 156], 86: [2, 63] }, { 5: [2, 56] }, { 5: [2, 82] }, { 5: [2, 57] }, { 5: [2, 58] }, { 5: [2, 59] }, o($Vx, [2, 16]), o($Vz, [2, 10]), { 12: 157, 50: $Vo, 52: $Vp, 53: $Vq }, o($Vz, [2, 12]), o($Vz, [2, 13]), o($Vx, [2, 18]), o($Vx, [2, 34]), o($Vx, [2, 35]), o($Vx, [2, 36]), o($Vx, [2, 37]), { 15: [1, 158] }, o($Vx, [2, 38]), { 15: [1, 159] }, o($Vx, [2, 39]), o($Vx, [2, 40]), { 15: [1, 160] }, o($Vx, [2, 41]), { 5: [1, 161] }, { 75: [1, 162] }, { 5: [1, 163] }, { 57: 164, 86: $VF }, { 57: 165, 86: $VF }, { 5: [2, 68] }, { 5: [2, 54] }, { 5: [2, 55] }, { 22: 166, 71: $Vw }, o($Vz, [2, 11]), o($VB, $V3, { 7: 105, 40: 167 }), o($VC, $V3, { 7: 107, 42: 168 }), o($VD, $V3, { 7: 110, 45: 169 }), o($Vx, [2, 48]), { 5: [2, 70] }, o($Vx, [2, 50]), { 5: [2, 66] }, { 5: [2, 67] }, { 86: [2, 62] }, { 16: [2, 47] }, { 16: [2, 45] }, { 16: [2, 43] }], + defaultActions: { 5: [2, 1], 6: [2, 2], 89: [2, 64], 90: [2, 65], 115: [2, 69], 126: [2, 56], 127: [2, 82], 128: [2, 57], 129: [2, 58], 130: [2, 59], 153: [2, 68], 154: [2, 54], 155: [2, 55], 162: [2, 70], 164: [2, 66], 165: [2, 67], 166: [2, 62], 167: [2, 47], 168: [2, 45], 169: [2, 43] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + return 5; + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + break; + case 6: + return 19; + break; + case 7: + this.begin("CONFIG"); + return 73; + break; + case 8: + return 74; + break; + case 9: + this.popState(); + this.popState(); + return 75; + break; + case 10: + yy_.yytext = yy_.yytext.trim(); + return 71; + break; + case 11: + yy_.yytext = yy_.yytext.trim(); + this.begin("ALIAS"); + return 71; + break; + case 12: + this.begin("LINE"); + return 14; + break; + case 13: + this.begin("ID"); + return 50; + break; + case 14: + this.begin("ID"); + return 52; + break; + case 15: + return 13; + break; + case 16: + this.begin("ID"); + return 53; + break; + case 17: + yy_.yytext = yy_.yytext.trim(); + this.begin("ALIAS"); + return 71; + break; + case 18: + this.popState(); + this.popState(); + this.begin("LINE"); + return 51; + break; + case 19: + this.popState(); + this.popState(); + return 5; + break; + case 20: + this.begin("LINE"); + return 36; + break; + case 21: + this.begin("LINE"); + return 37; + break; + case 22: + this.begin("LINE"); + return 38; + break; + case 23: + this.begin("LINE"); + return 39; + break; + case 24: + this.begin("LINE"); + return 49; + break; + case 25: + this.begin("LINE"); + return 41; + break; + case 26: + this.begin("LINE"); + return 43; + break; + case 27: + this.begin("LINE"); + return 48; + break; + case 28: + this.begin("LINE"); + return 44; + break; + case 29: + this.begin("LINE"); + return 47; + break; + case 30: + this.begin("LINE"); + return 46; + break; + case 31: + this.popState(); + return 15; + break; + case 32: + return 16; + break; + case 33: + return 66; + break; + case 34: + return 67; + break; + case 35: + return 60; + break; + case 36: + return 61; + break; + case 37: + return 62; + break; + case 38: + return 63; + break; + case 39: + return 58; + break; + case 40: + return 55; + break; + case 41: + this.begin("ID"); + return 21; + break; + case 42: + this.begin("ID"); + return 23; + break; + case 43: + return 29; + break; + case 44: + return 30; + break; + case 45: + this.begin("acc_title"); + return 31; + break; + case 46: + this.popState(); + return "acc_title_value"; + break; + case 47: + this.begin("acc_descr"); + return 33; + break; + case 48: + this.popState(); + return "acc_descr_value"; + break; + case 49: + this.begin("acc_descr_multiline"); + break; + case 50: + this.popState(); + break; + case 51: + return "acc_descr_multiline_value"; + break; + case 52: + return 6; + break; + case 53: + return 18; + break; + case 54: + return 20; + break; + case 55: + return 65; + break; + case 56: + return 5; + break; + case 57: + yy_.yytext = yy_.yytext.trim(); + return 71; + break; + case 58: + return 78; + break; + case 59: + return 79; + break; + case 60: + return 80; + break; + case 61: + return 81; + break; + case 62: + return 76; + break; + case 63: + return 77; + break; + case 64: + return 82; + break; + case 65: + return 83; + break; + case 66: + return 84; + break; + case 67: + return 85; + break; + case 68: + return 86; + break; + case 69: + return 86; + break; + case 70: + return 69; + break; + case 71: + return 70; + break; + case 72: + return 5; + break; + case 73: + return "INVALID"; + break; + } + }, "anonymous"), + rules: [/^(?:[\n]+)/i, /^(?:\s+)/i, /^(?:((?!\n)\s)+)/i, /^(?:#[^\n]*)/i, /^(?:%(?!\{)[^\n]*)/i, /^(?:[^\}]%%[^\n]*)/i, /^(?:[0-9]+(?=[ \n]+))/i, /^(?:@\{)/i, /^(?:[^\}]+)/i, /^(?:\})/i, /^(?:[^\<->\->:\n,;@\s]+(?=@\{))/i, /^(?:[^\<->\->:\n,;@]+?([\-]*[^\<->\->:\n,;@]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i, /^(?:box\b)/i, /^(?:participant\b)/i, /^(?:actor\b)/i, /^(?:create\b)/i, /^(?:destroy\b)/i, /^(?:[^<\->\->:\n,;]+?([\-]*[^<\->\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i, /^(?:as\b)/i, /^(?:(?:))/i, /^(?:loop\b)/i, /^(?:rect\b)/i, /^(?:opt\b)/i, /^(?:alt\b)/i, /^(?:else\b)/i, /^(?:par\b)/i, /^(?:par_over\b)/i, /^(?:and\b)/i, /^(?:critical\b)/i, /^(?:option\b)/i, /^(?:break\b)/i, /^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i, /^(?:end\b)/i, /^(?:left of\b)/i, /^(?:right of\b)/i, /^(?:links\b)/i, /^(?:link\b)/i, /^(?:properties\b)/i, /^(?:details\b)/i, /^(?:over\b)/i, /^(?:note\b)/i, /^(?:activate\b)/i, /^(?:deactivate\b)/i, /^(?:title\s[^#\n;]+)/i, /^(?:title:\s[^#\n;]+)/i, /^(?:accTitle\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*\{\s*)/i, /^(?:[\}])/i, /^(?:[^\}]*)/i, /^(?:sequenceDiagram\b)/i, /^(?:autonumber\b)/i, /^(?:off\b)/i, /^(?:,)/i, /^(?:;)/i, /^(?:[^+<\->\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+<\->\->:\n,;]+)*)/i, /^(?:->>)/i, /^(?:<<->>)/i, /^(?:-->>)/i, /^(?:<<-->>)/i, /^(?:->)/i, /^(?:-->)/i, /^(?:-[x])/i, /^(?:--[x])/i, /^(?:-[\)])/i, /^(?:--[\)])/i, /^(?::(?:(?:no)?wrap)?[^#\n;]*)/i, /^(?::)/i, /^(?:\+)/i, /^(?:-)/i, /^(?:$)/i, /^(?:.)/i], + conditions: { "acc_descr_multiline": { "rules": [50, 51], "inclusive": false }, "acc_descr": { "rules": [48], "inclusive": false }, "acc_title": { "rules": [46], "inclusive": false }, "ID": { "rules": [2, 3, 7, 10, 11, 17], "inclusive": false }, "ALIAS": { "rules": [2, 3, 18, 19], "inclusive": false }, "LINE": { "rules": [2, 3, 31], "inclusive": false }, "CONFIG": { "rules": [8, 9], "inclusive": false }, "CONFIG_DATA": { "rules": [], "inclusive": false }, "INITIAL": { "rules": [0, 1, 3, 4, 5, 6, 12, 13, 14, 15, 16, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 49, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var sequenceDiagram_default = parser; + +// src/diagrams/sequence/sequenceDb.ts +var LINETYPE = { + SOLID: 0, + DOTTED: 1, + NOTE: 2, + SOLID_CROSS: 3, + DOTTED_CROSS: 4, + SOLID_OPEN: 5, + DOTTED_OPEN: 6, + LOOP_START: 10, + LOOP_END: 11, + ALT_START: 12, + ALT_ELSE: 13, + ALT_END: 14, + OPT_START: 15, + OPT_END: 16, + ACTIVE_START: 17, + ACTIVE_END: 18, + PAR_START: 19, + PAR_AND: 20, + PAR_END: 21, + RECT_START: 22, + RECT_END: 23, + SOLID_POINT: 24, + DOTTED_POINT: 25, + AUTONUMBER: 26, + CRITICAL_START: 27, + CRITICAL_OPTION: 28, + CRITICAL_END: 29, + BREAK_START: 30, + BREAK_END: 31, + PAR_OVER_START: 32, + BIDIRECTIONAL_SOLID: 33, + BIDIRECTIONAL_DOTTED: 34 +}; +var ARROWTYPE = { + FILLED: 0, + OPEN: 1 +}; +var PLACEMENT = { + LEFTOF: 0, + RIGHTOF: 1, + OVER: 2 +}; +var PARTICIPANT_TYPE = { + ACTOR: "actor", + BOUNDARY: "boundary", + COLLECTIONS: "collections", + CONTROL: "control", + DATABASE: "database", + ENTITY: "entity", + PARTICIPANT: "participant", + QUEUE: "queue" +}; +var SequenceDB = class { + constructor() { + this.state = new ImperativeState(() => ({ + prevActor: void 0, + actors: /* @__PURE__ */ new Map(), + createdActors: /* @__PURE__ */ new Map(), + destroyedActors: /* @__PURE__ */ new Map(), + boxes: [], + messages: [], + notes: [], + sequenceNumbersEnabled: false, + wrapEnabled: void 0, + currentBox: void 0, + lastCreated: void 0, + lastDestroyed: void 0 + })); + this.setAccTitle = setAccTitle; + this.setAccDescription = setAccDescription; + this.setDiagramTitle = setDiagramTitle; + this.getAccTitle = getAccTitle; + this.getAccDescription = getAccDescription; + this.getDiagramTitle = getDiagramTitle; + this.apply = this.apply.bind(this); + this.parseBoxData = this.parseBoxData.bind(this); + this.parseMessage = this.parseMessage.bind(this); + this.clear(); + this.setWrap(getConfig2().wrap); + this.LINETYPE = LINETYPE; + this.ARROWTYPE = ARROWTYPE; + this.PLACEMENT = PLACEMENT; + } + static { + __name(this, "SequenceDB"); + } + addBox(data) { + this.state.records.boxes.push({ + name: data.text, + wrap: data.wrap ?? this.autoWrap(), + fill: data.color, + actorKeys: [] + }); + this.state.records.currentBox = this.state.records.boxes.slice(-1)[0]; + } + addActor(id, name, description, type, metadata) { + let assignedBox = this.state.records.currentBox; + let doc; + if (metadata !== void 0) { + let yamlData; + if (!metadata.includes("\n")) { + yamlData = "{\n" + metadata + "\n}"; + } else { + yamlData = metadata + "\n"; + } + doc = load(yamlData, { schema: JSON_SCHEMA }); + } + type = doc?.type ?? type; + const old = this.state.records.actors.get(id); + if (old) { + if (this.state.records.currentBox && old.box && this.state.records.currentBox !== old.box) { + throw new Error( + `A same participant should only be defined in one Box: ${old.name} can't be in '${old.box.name}' and in '${this.state.records.currentBox.name}' at the same time.` + ); + } + assignedBox = old.box ? old.box : this.state.records.currentBox; + old.box = assignedBox; + if (old && name === old.name && description == null) { + return; + } + } + if (description?.text == null) { + description = { text: name, type }; + } + if (type == null || description.text == null) { + description = { text: name, type }; + } + this.state.records.actors.set(id, { + box: assignedBox, + name, + description: description.text, + wrap: description.wrap ?? this.autoWrap(), + prevActor: this.state.records.prevActor, + links: {}, + properties: {}, + actorCnt: null, + rectData: null, + type: type ?? "participant" + }); + if (this.state.records.prevActor) { + const prevActorInRecords = this.state.records.actors.get(this.state.records.prevActor); + if (prevActorInRecords) { + prevActorInRecords.nextActor = id; + } + } + if (this.state.records.currentBox) { + this.state.records.currentBox.actorKeys.push(id); + } + this.state.records.prevActor = id; + } + activationCount(part) { + let i; + let count = 0; + if (!part) { + return 0; + } + for (i = 0; i < this.state.records.messages.length; i++) { + if (this.state.records.messages[i].type === this.LINETYPE.ACTIVE_START && this.state.records.messages[i].from === part) { + count++; + } + if (this.state.records.messages[i].type === this.LINETYPE.ACTIVE_END && this.state.records.messages[i].from === part) { + count--; + } + } + return count; + } + addMessage(idFrom, idTo, message, answer) { + this.state.records.messages.push({ + id: this.state.records.messages.length.toString(), + from: idFrom, + to: idTo, + message: message.text, + wrap: message.wrap ?? this.autoWrap(), + answer + }); + } + addSignal(idFrom, idTo, message, messageType, activate = false) { + if (messageType === this.LINETYPE.ACTIVE_END) { + const cnt = this.activationCount(idFrom ?? ""); + if (cnt < 1) { + const error = new Error("Trying to inactivate an inactive participant (" + idFrom + ")"); + error.hash = { + text: "->>-", + token: "->>-", + line: "1", + loc: { first_line: 1, last_line: 1, first_column: 1, last_column: 1 }, + expected: ["'ACTIVE_PARTICIPANT'"] + }; + throw error; + } + } + this.state.records.messages.push({ + id: this.state.records.messages.length.toString(), + from: idFrom, + to: idTo, + message: message?.text ?? "", + wrap: message?.wrap ?? this.autoWrap(), + type: messageType, + activate + }); + return true; + } + hasAtLeastOneBox() { + return this.state.records.boxes.length > 0; + } + hasAtLeastOneBoxWithTitle() { + return this.state.records.boxes.some((b) => b.name); + } + getMessages() { + return this.state.records.messages; + } + getBoxes() { + return this.state.records.boxes; + } + getActors() { + return this.state.records.actors; + } + getCreatedActors() { + return this.state.records.createdActors; + } + getDestroyedActors() { + return this.state.records.destroyedActors; + } + getActor(id) { + return this.state.records.actors.get(id); + } + getActorKeys() { + return [...this.state.records.actors.keys()]; + } + enableSequenceNumbers() { + this.state.records.sequenceNumbersEnabled = true; + } + disableSequenceNumbers() { + this.state.records.sequenceNumbersEnabled = false; + } + showSequenceNumbers() { + return this.state.records.sequenceNumbersEnabled; + } + setWrap(wrapSetting) { + this.state.records.wrapEnabled = wrapSetting; + } + extractWrap(text) { + if (text === void 0) { + return {}; + } + text = text.trim(); + const wrap = /^:?wrap:/.exec(text) !== null ? true : /^:?nowrap:/.exec(text) !== null ? false : void 0; + const cleanedText = (wrap === void 0 ? text : text.replace(/^:?(?:no)?wrap:/, "")).trim(); + return { cleanedText, wrap }; + } + autoWrap() { + if (this.state.records.wrapEnabled !== void 0) { + return this.state.records.wrapEnabled; + } + return getConfig2().sequence?.wrap ?? false; + } + clear() { + this.state.reset(); + clear(); + } + parseMessage(str) { + const trimmedStr = str.trim(); + const { wrap, cleanedText } = this.extractWrap(trimmedStr); + const message = { + text: cleanedText, + wrap + }; + log.debug(`parseMessage: ${JSON.stringify(message)}`); + return message; + } + // We expect the box statement to be color first then description + // The color can be rgb,rgba,hsl,hsla, or css code names #hex codes are not supported for now because of the way the char # is handled + // We extract first segment as color, the rest of the line is considered as text + parseBoxData(str) { + const match = /^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(str); + let color = match?.[1] ? match[1].trim() : "transparent"; + let title = match?.[2] ? match[2].trim() : void 0; + if (window?.CSS) { + if (!window.CSS.supports("color", color)) { + color = "transparent"; + title = str.trim(); + } + } else { + const style = new Option().style; + style.color = color; + if (style.color !== color) { + color = "transparent"; + title = str.trim(); + } + } + const { wrap, cleanedText } = this.extractWrap(title); + return { + text: cleanedText ? sanitizeText(cleanedText, getConfig2()) : void 0, + color, + wrap + }; + } + addNote(actor, placement, message) { + const note = { + actor, + placement, + message: message.text, + wrap: message.wrap ?? this.autoWrap() + }; + const actors = [].concat(actor, actor); + this.state.records.notes.push(note); + this.state.records.messages.push({ + id: this.state.records.messages.length.toString(), + from: actors[0], + to: actors[1], + message: message.text, + wrap: message.wrap ?? this.autoWrap(), + type: this.LINETYPE.NOTE, + placement + }); + } + addLinks(actorId, text) { + const actor = this.getActor(actorId); + try { + let sanitizedText = sanitizeText(text.text, getConfig2()); + sanitizedText = sanitizedText.replace(/=/g, "="); + sanitizedText = sanitizedText.replace(/&/g, "&"); + const links = JSON.parse(sanitizedText); + this.insertLinks(actor, links); + } catch (e) { + log.error("error while parsing actor link text", e); + } + } + addALink(actorId, text) { + const actor = this.getActor(actorId); + try { + const links = {}; + let sanitizedText = sanitizeText(text.text, getConfig2()); + const sep = sanitizedText.indexOf("@"); + sanitizedText = sanitizedText.replace(/=/g, "="); + sanitizedText = sanitizedText.replace(/&/g, "&"); + const label = sanitizedText.slice(0, sep - 1).trim(); + const link = sanitizedText.slice(sep + 1).trim(); + links[label] = link; + this.insertLinks(actor, links); + } catch (e) { + log.error("error while parsing actor link text", e); + } + } + insertLinks(actor, links) { + if (actor.links == null) { + actor.links = links; + } else { + for (const key in links) { + actor.links[key] = links[key]; + } + } + } + addProperties(actorId, text) { + const actor = this.getActor(actorId); + try { + const sanitizedText = sanitizeText(text.text, getConfig2()); + const properties = JSON.parse(sanitizedText); + this.insertProperties(actor, properties); + } catch (e) { + log.error("error while parsing actor properties text", e); + } + } + insertProperties(actor, properties) { + if (actor.properties == null) { + actor.properties = properties; + } else { + for (const key in properties) { + actor.properties[key] = properties[key]; + } + } + } + boxEnd() { + this.state.records.currentBox = void 0; + } + addDetails(actorId, text) { + const actor = this.getActor(actorId); + const elem = document.getElementById(text.text); + try { + const text2 = elem.innerHTML; + const details = JSON.parse(text2); + if (details.properties) { + this.insertProperties(actor, details.properties); + } + if (details.links) { + this.insertLinks(actor, details.links); + } + } catch (e) { + log.error("error while parsing actor details text", e); + } + } + getActorProperty(actor, key) { + if (actor?.properties !== void 0) { + return actor.properties[key]; + } + return void 0; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-redundant-type-constituents + apply(param) { + if (Array.isArray(param)) { + param.forEach((item) => { + this.apply(item); + }); + } else { + switch (param.type) { + case "sequenceIndex": + this.state.records.messages.push({ + id: this.state.records.messages.length.toString(), + from: void 0, + to: void 0, + message: { + start: param.sequenceIndex, + step: param.sequenceIndexStep, + visible: param.sequenceVisible + }, + wrap: false, + type: param.signalType + }); + break; + case "addParticipant": + this.addActor(param.actor, param.actor, param.description, param.draw, param.config); + break; + case "createParticipant": + if (this.state.records.actors.has(param.actor)) { + throw new Error( + "It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior" + ); + } + this.state.records.lastCreated = param.actor; + this.addActor(param.actor, param.actor, param.description, param.draw, param.config); + this.state.records.createdActors.set(param.actor, this.state.records.messages.length); + break; + case "destroyParticipant": + this.state.records.lastDestroyed = param.actor; + this.state.records.destroyedActors.set(param.actor, this.state.records.messages.length); + break; + case "activeStart": + this.addSignal(param.actor, void 0, void 0, param.signalType); + break; + case "activeEnd": + this.addSignal(param.actor, void 0, void 0, param.signalType); + break; + case "addNote": + this.addNote(param.actor, param.placement, param.text); + break; + case "addLinks": + this.addLinks(param.actor, param.text); + break; + case "addALink": + this.addALink(param.actor, param.text); + break; + case "addProperties": + this.addProperties(param.actor, param.text); + break; + case "addDetails": + this.addDetails(param.actor, param.text); + break; + case "addMessage": + if (this.state.records.lastCreated) { + if (param.to !== this.state.records.lastCreated) { + throw new Error( + "The created participant " + this.state.records.lastCreated.name + " does not have an associated creating message after its declaration. Please check the sequence diagram." + ); + } else { + this.state.records.lastCreated = void 0; + } + } else if (this.state.records.lastDestroyed) { + if (param.to !== this.state.records.lastDestroyed && param.from !== this.state.records.lastDestroyed) { + throw new Error( + "The destroyed participant " + this.state.records.lastDestroyed.name + " does not have an associated destroying message after its declaration. Please check the sequence diagram." + ); + } else { + this.state.records.lastDestroyed = void 0; + } + } + this.addSignal(param.from, param.to, param.msg, param.signalType, param.activate); + break; + case "boxStart": + this.addBox(param.boxData); + break; + case "boxEnd": + this.boxEnd(); + break; + case "loopStart": + this.addSignal(void 0, void 0, param.loopText, param.signalType); + break; + case "loopEnd": + this.addSignal(void 0, void 0, void 0, param.signalType); + break; + case "rectStart": + this.addSignal(void 0, void 0, param.color, param.signalType); + break; + case "rectEnd": + this.addSignal(void 0, void 0, void 0, param.signalType); + break; + case "optStart": + this.addSignal(void 0, void 0, param.optText, param.signalType); + break; + case "optEnd": + this.addSignal(void 0, void 0, void 0, param.signalType); + break; + case "altStart": + this.addSignal(void 0, void 0, param.altText, param.signalType); + break; + case "else": + this.addSignal(void 0, void 0, param.altText, param.signalType); + break; + case "altEnd": + this.addSignal(void 0, void 0, void 0, param.signalType); + break; + case "setAccTitle": + setAccTitle(param.text); + break; + case "parStart": + this.addSignal(void 0, void 0, param.parText, param.signalType); + break; + case "and": + this.addSignal(void 0, void 0, param.parText, param.signalType); + break; + case "parEnd": + this.addSignal(void 0, void 0, void 0, param.signalType); + break; + case "criticalStart": + this.addSignal(void 0, void 0, param.criticalText, param.signalType); + break; + case "option": + this.addSignal(void 0, void 0, param.optionText, param.signalType); + break; + case "criticalEnd": + this.addSignal(void 0, void 0, void 0, param.signalType); + break; + case "breakStart": + this.addSignal(void 0, void 0, param.breakText, param.signalType); + break; + case "breakEnd": + this.addSignal(void 0, void 0, void 0, param.signalType); + break; + } + } + } + getConfig() { + return getConfig2().sequence; + } +}; + +// src/diagrams/sequence/styles.js +var getStyles = /* @__PURE__ */ __name((options) => `.actor { + stroke: ${options.actorBorder}; + fill: ${options.actorBkg}; + } + + text.actor > tspan { + fill: ${options.actorTextColor}; + stroke: none; + } + + .actor-line { + stroke: ${options.actorLineColor}; + } + + .innerArc { + stroke-width: 1.5; + stroke-dasharray: none; + } + + .messageLine0 { + stroke-width: 1.5; + stroke-dasharray: none; + stroke: ${options.signalColor}; + } + + .messageLine1 { + stroke-width: 1.5; + stroke-dasharray: 2, 2; + stroke: ${options.signalColor}; + } + + #arrowhead path { + fill: ${options.signalColor}; + stroke: ${options.signalColor}; + } + + .sequenceNumber { + fill: ${options.sequenceNumberColor}; + } + + #sequencenumber { + fill: ${options.signalColor}; + } + + #crosshead path { + fill: ${options.signalColor}; + stroke: ${options.signalColor}; + } + + .messageText { + fill: ${options.signalTextColor}; + stroke: none; + } + + .labelBox { + stroke: ${options.labelBoxBorderColor}; + fill: ${options.labelBoxBkgColor}; + } + + .labelText, .labelText > tspan { + fill: ${options.labelTextColor}; + stroke: none; + } + + .loopText, .loopText > tspan { + fill: ${options.loopTextColor}; + stroke: none; + } + + .loopLine { + stroke-width: 2px; + stroke-dasharray: 2, 2; + stroke: ${options.labelBoxBorderColor}; + fill: ${options.labelBoxBorderColor}; + } + + .note { + //stroke: #decc93; + stroke: ${options.noteBorderColor}; + fill: ${options.noteBkgColor}; + } + + .noteText, .noteText > tspan { + fill: ${options.noteTextColor}; + stroke: none; + } + + .activation0 { + fill: ${options.activationBkgColor}; + stroke: ${options.activationBorderColor}; + } + + .activation1 { + fill: ${options.activationBkgColor}; + stroke: ${options.activationBorderColor}; + } + + .activation2 { + fill: ${options.activationBkgColor}; + stroke: ${options.activationBorderColor}; + } + + .actorPopupMenu { + position: absolute; + } + + .actorPopupMenuPanel { + position: absolute; + fill: ${options.actorBkg}; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4)); +} + .actor-man line { + stroke: ${options.actorBorder}; + fill: ${options.actorBkg}; + } + .actor-man circle, line { + stroke: ${options.actorBorder}; + fill: ${options.actorBkg}; + stroke-width: 2px; + } + +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/sequence/sequenceRenderer.ts +import { select } from "d3"; + +// src/diagrams/sequence/svgDraw.js +import { sanitizeUrl } from "@braintree/sanitize-url"; +var ACTOR_TYPE_WIDTH = 18 * 2; +var TOP_ACTOR_CLASS = "actor-top"; +var BOTTOM_ACTOR_CLASS = "actor-bottom"; +var ACTOR_BOX_CLASS = "actor-box"; +var ACTOR_MAN_FIGURE_CLASS = "actor-man"; +var drawRect2 = /* @__PURE__ */ __name(function(elem, rectData) { + return drawRect(elem, rectData); +}, "drawRect"); +var drawPopup = /* @__PURE__ */ __name(function(elem, actor, minMenuWidth, textAttrs, forceMenus) { + if (actor.links === void 0 || actor.links === null || Object.keys(actor.links).length === 0) { + return { height: 0, width: 0 }; + } + const links = actor.links; + const actorCnt2 = actor.actorCnt; + const rectData = actor.rectData; + var displayValue = "none"; + if (forceMenus) { + displayValue = "block !important"; + } + const g = elem.append("g"); + g.attr("id", "actor" + actorCnt2 + "_popup"); + g.attr("class", "actorPopupMenu"); + g.attr("display", displayValue); + var actorClass = ""; + if (rectData.class !== void 0) { + actorClass = " " + rectData.class; + } + let menuWidth = rectData.width > minMenuWidth ? rectData.width : minMenuWidth; + const rectElem = g.append("rect"); + rectElem.attr("class", "actorPopupMenuPanel" + actorClass); + rectElem.attr("x", rectData.x); + rectElem.attr("y", rectData.height); + rectElem.attr("fill", rectData.fill); + rectElem.attr("stroke", rectData.stroke); + rectElem.attr("width", menuWidth); + rectElem.attr("height", rectData.height); + rectElem.attr("rx", rectData.rx); + rectElem.attr("ry", rectData.ry); + if (links != null) { + var linkY = 20; + for (let key in links) { + var linkElem = g.append("a"); + var sanitizedLink = sanitizeUrl(links[key]); + linkElem.attr("xlink:href", sanitizedLink); + linkElem.attr("target", "_blank"); + _drawMenuItemTextCandidateFunc(textAttrs)( + key, + linkElem, + rectData.x + 10, + rectData.height + linkY, + menuWidth, + 20, + { class: "actor" }, + textAttrs + ); + linkY += 30; + } + } + rectElem.attr("height", linkY); + return { height: rectData.height + linkY, width: menuWidth }; +}, "drawPopup"); +var popupMenuToggle = /* @__PURE__ */ __name(function(popId) { + return "var pu = document.getElementById('" + popId + "'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"; +}, "popupMenuToggle"); +var drawKatex = /* @__PURE__ */ __name(async function(elem, textData, msgModel = null) { + let textElem = elem.append("foreignObject"); + const linesSanitized = await renderKatexSanitized(textData.text, getConfig()); + const divElem = textElem.append("xhtml:div").attr("style", "width: fit-content;").attr("xmlns", "http://www.w3.org/1999/xhtml").html(linesSanitized); + const dim = divElem.node().getBoundingClientRect(); + textElem.attr("height", Math.round(dim.height)).attr("width", Math.round(dim.width)); + if (textData.class === "noteText") { + const rectElem = elem.node().firstChild; + rectElem.setAttribute("height", dim.height + 2 * textData.textMargin); + const rectDim = rectElem.getBBox(); + textElem.attr("x", Math.round(rectDim.x + rectDim.width / 2 - dim.width / 2)).attr("y", Math.round(rectDim.y + rectDim.height / 2 - dim.height / 2)); + } else if (msgModel) { + let { startx, stopx, starty } = msgModel; + if (startx > stopx) { + const temp = startx; + startx = stopx; + stopx = temp; + } + textElem.attr("x", Math.round(startx + Math.abs(startx - stopx) / 2 - dim.width / 2)); + if (textData.class === "loopText") { + textElem.attr("y", Math.round(starty)); + } else { + textElem.attr("y", Math.round(starty - dim.height)); + } + } + return [textElem]; +}, "drawKatex"); +var drawText = /* @__PURE__ */ __name(function(elem, textData) { + let prevTextHeight = 0; + let textHeight = 0; + const lines = textData.text.split(common_default.lineBreakRegex); + const [_textFontSize, _textFontSizePx] = parseFontSize(textData.fontSize); + let textElems = []; + let dy = 0; + let yfunc = /* @__PURE__ */ __name(() => textData.y, "yfunc"); + if (textData.valign !== void 0 && textData.textMargin !== void 0 && textData.textMargin > 0) { + switch (textData.valign) { + case "top": + case "start": + yfunc = /* @__PURE__ */ __name(() => Math.round(textData.y + textData.textMargin), "yfunc"); + break; + case "middle": + case "center": + yfunc = /* @__PURE__ */ __name(() => Math.round(textData.y + (prevTextHeight + textHeight + textData.textMargin) / 2), "yfunc"); + break; + case "bottom": + case "end": + yfunc = /* @__PURE__ */ __name(() => Math.round( + textData.y + (prevTextHeight + textHeight + 2 * textData.textMargin) - textData.textMargin + ), "yfunc"); + break; + } + } + if (textData.anchor !== void 0 && textData.textMargin !== void 0 && textData.width !== void 0) { + switch (textData.anchor) { + case "left": + case "start": + textData.x = Math.round(textData.x + textData.textMargin); + textData.anchor = "start"; + textData.dominantBaseline = "middle"; + textData.alignmentBaseline = "middle"; + break; + case "middle": + case "center": + textData.x = Math.round(textData.x + textData.width / 2); + textData.anchor = "middle"; + textData.dominantBaseline = "middle"; + textData.alignmentBaseline = "middle"; + break; + case "right": + case "end": + textData.x = Math.round(textData.x + textData.width - textData.textMargin); + textData.anchor = "end"; + textData.dominantBaseline = "middle"; + textData.alignmentBaseline = "middle"; + break; + } + } + for (let [i, line] of lines.entries()) { + if (textData.textMargin !== void 0 && textData.textMargin === 0 && _textFontSize !== void 0) { + dy = i * _textFontSize; + } + const textElem = elem.append("text"); + textElem.attr("x", textData.x); + textElem.attr("y", yfunc()); + if (textData.anchor !== void 0) { + textElem.attr("text-anchor", textData.anchor).attr("dominant-baseline", textData.dominantBaseline).attr("alignment-baseline", textData.alignmentBaseline); + } + if (textData.fontFamily !== void 0) { + textElem.style("font-family", textData.fontFamily); + } + if (_textFontSizePx !== void 0) { + textElem.style("font-size", _textFontSizePx); + } + if (textData.fontWeight !== void 0) { + textElem.style("font-weight", textData.fontWeight); + } + if (textData.fill !== void 0) { + textElem.attr("fill", textData.fill); + } + if (textData.class !== void 0) { + textElem.attr("class", textData.class); + } + if (textData.dy !== void 0) { + textElem.attr("dy", textData.dy); + } else if (dy !== 0) { + textElem.attr("dy", dy); + } + const text = line || ZERO_WIDTH_SPACE; + if (textData.tspan) { + const span = textElem.append("tspan"); + span.attr("x", textData.x); + if (textData.fill !== void 0) { + span.attr("fill", textData.fill); + } + span.text(text); + } else { + textElem.text(text); + } + if (textData.valign !== void 0 && textData.textMargin !== void 0 && textData.textMargin > 0) { + textHeight += (textElem._groups || textElem)[0][0].getBBox().height; + prevTextHeight = textHeight; + } + textElems.push(textElem); + } + return textElems; +}, "drawText"); +var drawLabel = /* @__PURE__ */ __name(function(elem, txtObject) { + function genPoints(x, y, width, height, cut) { + return x + "," + y + " " + (x + width) + "," + y + " " + (x + width) + "," + (y + height - cut) + " " + (x + width - cut * 1.2) + "," + (y + height) + " " + x + "," + (y + height); + } + __name(genPoints, "genPoints"); + const polygon = elem.append("polygon"); + polygon.attr("points", genPoints(txtObject.x, txtObject.y, txtObject.width, txtObject.height, 7)); + polygon.attr("class", "labelBox"); + txtObject.y = txtObject.y + txtObject.height / 2; + drawText(elem, txtObject); + return polygon; +}, "drawLabel"); +var actorCnt = -1; +var fixLifeLineHeights = /* @__PURE__ */ __name((diagram2, actors, actorKeys, conf2) => { + if (!diagram2.select) { + return; + } + actorKeys.forEach((actorKey) => { + const actor = actors.get(actorKey); + const actorDOM = diagram2.select("#actor" + actor.actorCnt); + if (!conf2.mirrorActors && actor.stopy) { + actorDOM.attr("y2", actor.stopy + actor.height / 2); + } else if (conf2.mirrorActors) { + actorDOM.attr("y2", actor.stopy); + } + }); +}, "fixLifeLineHeights"); +var drawActorTypeParticipant = /* @__PURE__ */ __name(function(elem, actor, conf2, isFooter) { + const actorY = isFooter ? actor.stopy : actor.starty; + const center = actor.x + actor.width / 2; + const centerY = actorY + actor.height; + const boxplusLineGroup = elem.append("g").lower(); + var g = boxplusLineGroup; + if (!isFooter) { + actorCnt++; + if (Object.keys(actor.links || {}).length && !conf2.forceMenus) { + g.attr("onclick", popupMenuToggle(`actor${actorCnt}_popup`)).attr("cursor", "pointer"); + } + g.append("line").attr("id", "actor" + actorCnt).attr("x1", center).attr("y1", centerY).attr("x2", center).attr("y2", 2e3).attr("class", "actor-line 200").attr("stroke-width", "0.5px").attr("stroke", "#999").attr("name", actor.name); + g = boxplusLineGroup.append("g"); + actor.actorCnt = actorCnt; + if (actor.links != null) { + g.attr("id", "root-" + actorCnt); + } + } + const rect = getNoteRect(); + var cssclass = "actor"; + if (actor.properties?.class) { + cssclass = actor.properties.class; + } else { + rect.fill = "#eaeaea"; + } + if (isFooter) { + cssclass += ` ${BOTTOM_ACTOR_CLASS}`; + } else { + cssclass += ` ${TOP_ACTOR_CLASS}`; + } + rect.x = actor.x; + rect.y = actorY; + rect.width = actor.width; + rect.height = actor.height; + rect.class = cssclass; + rect.rx = 3; + rect.ry = 3; + rect.name = actor.name; + const rectElem = drawRect2(g, rect); + actor.rectData = rect; + if (actor.properties?.icon) { + const iconSrc = actor.properties.icon.trim(); + if (iconSrc.charAt(0) === "@") { + drawEmbeddedImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc.substr(1)); + } else { + drawImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc); + } + } + _drawTextCandidateFunc(conf2, hasKatex(actor.description))( + actor.description, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: `actor ${ACTOR_BOX_CLASS}` }, + conf2 + ); + let height = actor.height; + if (rectElem.node) { + const bounds2 = rectElem.node().getBBox(); + actor.height = bounds2.height; + height = bounds2.height; + } + return height; +}, "drawActorTypeParticipant"); +var drawActorTypeCollections = /* @__PURE__ */ __name(function(elem, actor, conf2, isFooter) { + const actorY = isFooter ? actor.stopy : actor.starty; + const center = actor.x + actor.width / 2; + const centerY = actorY + actor.height; + const boxplusLineGroup = elem.append("g").lower(); + var g = boxplusLineGroup; + if (!isFooter) { + actorCnt++; + if (Object.keys(actor.links || {}).length && !conf2.forceMenus) { + g.attr("onclick", popupMenuToggle(`actor${actorCnt}_popup`)).attr("cursor", "pointer"); + } + g.append("line").attr("id", "actor" + actorCnt).attr("x1", center).attr("y1", centerY).attr("x2", center).attr("y2", 2e3).attr("class", "actor-line 200").attr("stroke-width", "0.5px").attr("stroke", "#999").attr("name", actor.name); + g = boxplusLineGroup.append("g"); + actor.actorCnt = actorCnt; + if (actor.links != null) { + g.attr("id", "root-" + actorCnt); + } + } + const rect = getNoteRect(); + var cssclass = "actor"; + if (actor.properties?.class) { + cssclass = actor.properties.class; + } else { + rect.fill = "#eaeaea"; + } + if (isFooter) { + cssclass += ` ${BOTTOM_ACTOR_CLASS}`; + } else { + cssclass += ` ${TOP_ACTOR_CLASS}`; + } + rect.x = actor.x; + rect.y = actorY; + rect.width = actor.width; + rect.height = actor.height; + rect.class = cssclass; + rect.name = actor.name; + const offset = 6; + const shadowRect = { + ...rect, + x: rect.x + (isFooter ? -offset : -offset), + y: rect.y + (isFooter ? +offset : +offset), + class: "actor" + }; + const rectElem = drawRect2(g, rect); + drawRect2(g, shadowRect); + actor.rectData = rect; + if (actor.properties?.icon) { + const iconSrc = actor.properties.icon.trim(); + if (iconSrc.charAt(0) === "@") { + drawEmbeddedImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc.substr(1)); + } else { + drawImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc); + } + } + _drawTextCandidateFunc(conf2, hasKatex(actor.description))( + actor.description, + g, + rect.x - offset, + rect.y + offset, + rect.width, + rect.height, + { class: `actor ${ACTOR_BOX_CLASS}` }, + conf2 + ); + let height = actor.height; + if (rectElem.node) { + const bounds2 = rectElem.node().getBBox(); + actor.height = bounds2.height; + height = bounds2.height; + } + return height; +}, "drawActorTypeCollections"); +var drawActorTypeQueue = /* @__PURE__ */ __name(function(elem, actor, conf2, isFooter) { + const actorY = isFooter ? actor.stopy : actor.starty; + const center = actor.x + actor.width / 2; + const centerY = actorY + actor.height; + const boxplusLineGroup = elem.append("g").lower(); + let g = boxplusLineGroup; + if (!isFooter) { + actorCnt++; + if (Object.keys(actor.links || {}).length && !conf2.forceMenus) { + g.attr("onclick", popupMenuToggle(`actor${actorCnt}_popup`)).attr("cursor", "pointer"); + } + g.append("line").attr("id", "actor" + actorCnt).attr("x1", center).attr("y1", centerY).attr("x2", center).attr("y2", 2e3).attr("class", "actor-line 200").attr("stroke-width", "0.5px").attr("stroke", "#999").attr("name", actor.name); + g = boxplusLineGroup.append("g"); + actor.actorCnt = actorCnt; + if (actor.links != null) { + g.attr("id", "root-" + actorCnt); + } + } + const rect = getNoteRect(); + let cssclass = "actor"; + if (actor.properties?.class) { + cssclass = actor.properties.class; + } else { + rect.fill = "#eaeaea"; + } + if (isFooter) { + cssclass += ` ${BOTTOM_ACTOR_CLASS}`; + } else { + cssclass += ` ${TOP_ACTOR_CLASS}`; + } + rect.x = actor.x; + rect.y = actorY; + rect.width = actor.width; + rect.height = actor.height; + rect.class = cssclass; + rect.name = actor.name; + const ry = rect.height / 2; + const rx = ry / (2.5 + rect.height / 50); + const cylinderGroup = g.append("g"); + const cylinderArc = g.append("g"); + cylinderGroup.append("path").attr( + "d", + `M ${rect.x},${rect.y + ry} + a ${rx},${ry} 0 0 0 0,${rect.height} + h ${rect.width - 2 * rx} + a ${rx},${ry} 0 0 0 0,-${rect.height} + Z + ` + ).attr("class", cssclass); + cylinderArc.append("path").attr( + "d", + `M ${rect.x},${rect.y + ry} + a ${rx},${ry} 0 0 0 0,${rect.height}` + ).attr("stroke", "#666").attr("stroke-width", "1px").attr("class", cssclass); + cylinderGroup.attr("transform", `translate(${rx}, ${-(rect.height / 2)})`); + cylinderArc.attr("transform", `translate(${rect.width - rx}, ${-rect.height / 2})`); + actor.rectData = rect; + if (actor.properties?.icon) { + const iconSrc = actor.properties.icon.trim(); + const iconX = rect.x + rect.width - 20; + const iconY = rect.y + 10; + if (iconSrc.charAt(0) === "@") { + drawEmbeddedImage(g, iconX, iconY, iconSrc.substr(1)); + } else { + drawImage(g, iconX, iconY, iconSrc); + } + } + _drawTextCandidateFunc(conf2, hasKatex(actor.description))( + actor.description, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: `actor ${ACTOR_BOX_CLASS}` }, + conf2 + ); + let height = actor.height; + const lastPath = cylinderGroup.select("path:last-child"); + if (lastPath.node()) { + const bounds2 = lastPath.node().getBBox(); + actor.height = bounds2.height; + height = bounds2.height; + } + return height; +}, "drawActorTypeQueue"); +var drawActorTypeControl = /* @__PURE__ */ __name(function(elem, actor, conf2, isFooter) { + const actorY = isFooter ? actor.stopy : actor.starty; + const center = actor.x + actor.width / 2; + const centerY = actorY + 75; + const line = elem.append("g").lower(); + if (!isFooter) { + actorCnt++; + line.append("line").attr("id", "actor" + actorCnt).attr("x1", center).attr("y1", centerY).attr("x2", center).attr("y2", 2e3).attr("class", "actor-line 200").attr("stroke-width", "0.5px").attr("stroke", "#999").attr("name", actor.name); + actor.actorCnt = actorCnt; + } + const actElem = elem.append("g"); + let cssClass = ACTOR_MAN_FIGURE_CLASS; + if (isFooter) { + cssClass += ` ${BOTTOM_ACTOR_CLASS}`; + } else { + cssClass += ` ${TOP_ACTOR_CLASS}`; + } + actElem.attr("class", cssClass); + actElem.attr("name", actor.name); + const rect = getNoteRect(); + rect.x = actor.x; + rect.y = actorY; + rect.fill = "#eaeaea"; + rect.width = actor.width; + rect.height = actor.height; + rect.class = "actor"; + const cx = actor.x + actor.width / 2; + const cy = actorY + 30; + const r = 18; + actElem.append("defs").append("marker").attr("id", "filled-head-control").attr("refX", 11).attr("refY", 5.8).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "172.5").append("path").attr("d", "M 14.4 5.6 L 7.2 10.4 L 8.8 5.6 L 7.2 0.8 Z"); + actElem.append("circle").attr("cx", cx).attr("cy", cy).attr("r", r).attr("fill", "#eaeaf7").attr("stroke", "#666").attr("stroke-width", 1.2); + actElem.append("line").attr("marker-end", "url(#filled-head-control)").attr("transform", `translate(${cx}, ${cy - r})`); + const bounds2 = actElem.node().getBBox(); + actor.height = bounds2.height + 2 * (conf2?.sequence?.labelBoxHeight ?? 0); + _drawTextCandidateFunc(conf2, hasKatex(actor.description))( + actor.description, + actElem, + rect.x, + rect.y + r + (isFooter ? 5 : 10), + rect.width, + rect.height, + { class: `actor ${ACTOR_MAN_FIGURE_CLASS}` }, + conf2 + ); + return actor.height; +}, "drawActorTypeControl"); +var drawActorTypeEntity = /* @__PURE__ */ __name(function(elem, actor, conf2, isFooter) { + const actorY = isFooter ? actor.stopy : actor.starty; + const center = actor.x + actor.width / 2; + const centerY = actorY + 75; + const line = elem.append("g").lower(); + const actElem = elem.append("g"); + let cssClass = ACTOR_MAN_FIGURE_CLASS; + if (isFooter) { + cssClass += ` ${BOTTOM_ACTOR_CLASS}`; + } else { + cssClass += ` ${TOP_ACTOR_CLASS}`; + } + actElem.attr("class", cssClass); + actElem.attr("name", actor.name); + const rect = getNoteRect(); + rect.x = actor.x; + rect.y = actorY; + rect.fill = "#eaeaea"; + rect.width = actor.width; + rect.height = actor.height; + rect.class = "actor"; + const cx = actor.x + actor.width / 2; + const cy = actorY + (!isFooter ? 25 : 10); + const r = 18; + actElem.append("circle").attr("cx", cx).attr("cy", cy).attr("r", r).attr("width", actor.width).attr("height", actor.height); + actElem.append("line").attr("x1", cx - r).attr("x2", cx + r).attr("y1", cy + r).attr("y2", cy + r).attr("stroke", "#333").attr("stroke-width", 2); + const bounds2 = actElem.node().getBBox(); + actor.height = bounds2.height + (conf2?.sequence?.labelBoxHeight ?? 0); + if (!isFooter) { + actorCnt++; + line.append("line").attr("id", "actor" + actorCnt).attr("x1", center).attr("y1", centerY).attr("x2", center).attr("y2", 2e3).attr("class", "actor-line 200").attr("stroke-width", "0.5px").attr("stroke", "#999").attr("name", actor.name); + actor.actorCnt = actorCnt; + } + _drawTextCandidateFunc(conf2, hasKatex(actor.description))( + actor.description, + actElem, + rect.x, + rect.y + (!isFooter ? (cy + r - actorY) / 2 : (cy - actorY + r - 5) / 2), + rect.width, + rect.height, + { class: `actor ${ACTOR_MAN_FIGURE_CLASS}` }, + conf2 + ); + if (!isFooter) { + actElem.attr("transform", `translate(${0}, ${r / 2})`); + } else { + actElem.attr("transform", `translate(${0}, ${r / 2})`); + } + return actor.height; +}, "drawActorTypeEntity"); +var drawActorTypeDatabase = /* @__PURE__ */ __name(function(elem, actor, conf2, isFooter) { + const actorY = isFooter ? actor.stopy : actor.starty; + const center = actor.x + actor.width / 2; + const centerY = actorY + actor.height + 2 * conf2.boxTextMargin; + const boxplusLineGroup = elem.append("g").lower(); + let g = boxplusLineGroup; + if (!isFooter) { + actorCnt++; + if (Object.keys(actor.links || {}).length && !conf2.forceMenus) { + g.attr("onclick", popupMenuToggle(`actor${actorCnt}_popup`)).attr("cursor", "pointer"); + } + g.append("line").attr("id", "actor" + actorCnt).attr("x1", center).attr("y1", centerY).attr("x2", center).attr("y2", 2e3).attr("class", "actor-line 200").attr("stroke-width", "0.5px").attr("stroke", "#999").attr("name", actor.name); + g = boxplusLineGroup.append("g"); + actor.actorCnt = actorCnt; + if (actor.links != null) { + g.attr("id", "root-" + actorCnt); + } + } + const rect = getNoteRect(); + let cssclass = "actor"; + if (actor.properties?.class) { + cssclass = actor.properties.class; + } else { + rect.fill = "#eaeaea"; + } + if (isFooter) { + cssclass += ` ${BOTTOM_ACTOR_CLASS}`; + } else { + cssclass += ` ${TOP_ACTOR_CLASS}`; + } + rect.x = actor.x; + rect.y = actorY; + rect.width = actor.width; + rect.height = actor.height; + rect.class = cssclass; + rect.name = actor.name; + rect.x = actor.x; + rect.y = actorY; + const w = rect.width / 4; + const h = rect.width / 4; + const rx = w / 2; + const ry = rx / (2.5 + w / 50); + const cylinderGroup = g.append("g"); + const d = ` + M ${rect.x},${rect.y + ry} + a ${rx},${ry} 0 0 0 ${w},0 + a ${rx},${ry} 0 0 0 -${w},0 + l 0,${h - 2 * ry} + a ${rx},${ry} 0 0 0 ${w},0 + l 0,-${h - 2 * ry} +`; + cylinderGroup.append("path").attr("d", d).attr("fill", "#eaeaea").attr("stroke", "#000").attr("stroke-width", 1).attr("class", cssclass); + if (!isFooter) { + cylinderGroup.attr("transform", `translate(${w * 1.5}, ${(rect.height + ry) / 4})`); + } else { + cylinderGroup.attr("transform", `translate(${w * 1.5}, ${rect.height / 4 - 2 * ry})`); + } + actor.rectData = rect; + _drawTextCandidateFunc(conf2, hasKatex(actor.description))( + actor.description, + g, + rect.x, + rect.y + (!isFooter ? (rect.height + ry) / 2 : (rect.height + h) / 4), + rect.width, + rect.height, + { class: `actor ${ACTOR_BOX_CLASS}` }, + conf2 + ); + const lastPath = cylinderGroup.select("path:last-child"); + if (lastPath.node()) { + const bounds2 = lastPath.node().getBBox(); + actor.height = bounds2.height + (conf2.sequence.labelBoxHeight ?? 0); + } + return actor.height; +}, "drawActorTypeDatabase"); +var drawActorTypeBoundary = /* @__PURE__ */ __name(function(elem, actor, conf2, isFooter) { + const actorY = isFooter ? actor.stopy : actor.starty; + const center = actor.x + actor.width / 2; + const centerY = actorY + 80; + const radius = 30; + const line = elem.append("g").lower(); + if (!isFooter) { + actorCnt++; + line.append("line").attr("id", "actor" + actorCnt).attr("x1", center).attr("y1", centerY).attr("x2", center).attr("y2", 2e3).attr("class", "actor-line 200").attr("stroke-width", "0.5px").attr("stroke", "#999").attr("name", actor.name); + actor.actorCnt = actorCnt; + } + const actElem = elem.append("g"); + let cssClass = ACTOR_MAN_FIGURE_CLASS; + if (isFooter) { + cssClass += ` ${BOTTOM_ACTOR_CLASS}`; + } else { + cssClass += ` ${TOP_ACTOR_CLASS}`; + } + actElem.attr("class", cssClass); + actElem.attr("name", actor.name); + const rect = getNoteRect(); + rect.x = actor.x; + rect.y = actorY; + rect.fill = "#eaeaea"; + rect.width = actor.width; + rect.height = actor.height; + rect.class = "actor"; + actElem.append("line").attr("id", "actor-man-torso" + actorCnt).attr("x1", actor.x + actor.width / 2 - radius * 2.5).attr("y1", actorY + 10).attr("x2", actor.x + actor.width / 2 - 15).attr("y2", actorY + 10); + actElem.append("line").attr("id", "actor-man-arms" + actorCnt).attr("x1", actor.x + actor.width / 2 - radius * 2.5).attr("y1", actorY + 0).attr("x2", actor.x + actor.width / 2 - radius * 2.5).attr("y2", actorY + 20); + actElem.append("circle").attr("cx", actor.x + actor.width / 2).attr("cy", actorY + 10).attr("r", radius); + const bounds2 = actElem.node().getBBox(); + actor.height = bounds2.height + (conf2.sequence.labelBoxHeight ?? 0); + _drawTextCandidateFunc(conf2, hasKatex(actor.description))( + actor.description, + actElem, + rect.x, + rect.y + (!isFooter ? radius / 2 + 3 : radius / 2 - 4), + rect.width, + rect.height, + { class: `actor ${ACTOR_MAN_FIGURE_CLASS}` }, + conf2 + ); + if (!isFooter) { + actElem.attr("transform", `translate(0,${radius / 2 + 7})`); + } else { + actElem.attr("transform", `translate(0,${radius / 2 + 7})`); + } + return actor.height; +}, "drawActorTypeBoundary"); +var drawActorTypeActor = /* @__PURE__ */ __name(function(elem, actor, conf2, isFooter) { + const actorY = isFooter ? actor.stopy : actor.starty; + const center = actor.x + actor.width / 2; + const centerY = actorY + 80; + const line = elem.append("g").lower(); + if (!isFooter) { + actorCnt++; + line.append("line").attr("id", "actor" + actorCnt).attr("x1", center).attr("y1", centerY).attr("x2", center).attr("y2", 2e3).attr("class", "actor-line 200").attr("stroke-width", "0.5px").attr("stroke", "#999").attr("name", actor.name); + actor.actorCnt = actorCnt; + } + const actElem = elem.append("g"); + let cssClass = ACTOR_MAN_FIGURE_CLASS; + if (isFooter) { + cssClass += ` ${BOTTOM_ACTOR_CLASS}`; + } else { + cssClass += ` ${TOP_ACTOR_CLASS}`; + } + actElem.attr("class", cssClass); + actElem.attr("name", actor.name); + const rect = getNoteRect(); + rect.x = actor.x; + rect.y = actorY; + rect.fill = "#eaeaea"; + rect.width = actor.width; + rect.height = actor.height; + rect.class = "actor"; + rect.rx = 3; + rect.ry = 3; + actElem.append("line").attr("id", "actor-man-torso" + actorCnt).attr("x1", center).attr("y1", actorY + 25).attr("x2", center).attr("y2", actorY + 45); + actElem.append("line").attr("id", "actor-man-arms" + actorCnt).attr("x1", center - ACTOR_TYPE_WIDTH / 2).attr("y1", actorY + 33).attr("x2", center + ACTOR_TYPE_WIDTH / 2).attr("y2", actorY + 33); + actElem.append("line").attr("x1", center - ACTOR_TYPE_WIDTH / 2).attr("y1", actorY + 60).attr("x2", center).attr("y2", actorY + 45); + actElem.append("line").attr("x1", center).attr("y1", actorY + 45).attr("x2", center + ACTOR_TYPE_WIDTH / 2 - 2).attr("y2", actorY + 60); + const circle = actElem.append("circle"); + circle.attr("cx", actor.x + actor.width / 2); + circle.attr("cy", actorY + 10); + circle.attr("r", 15); + circle.attr("width", actor.width); + circle.attr("height", actor.height); + const bounds2 = actElem.node().getBBox(); + actor.height = bounds2.height; + _drawTextCandidateFunc(conf2, hasKatex(actor.description))( + actor.description, + actElem, + rect.x, + rect.y + 35, + rect.width, + rect.height, + { class: `actor ${ACTOR_MAN_FIGURE_CLASS}` }, + conf2 + ); + return actor.height; +}, "drawActorTypeActor"); +var drawActor = /* @__PURE__ */ __name(async function(elem, actor, conf2, isFooter) { + switch (actor.type) { + case "actor": + return await drawActorTypeActor(elem, actor, conf2, isFooter); + case "participant": + return await drawActorTypeParticipant(elem, actor, conf2, isFooter); + case "boundary": + return await drawActorTypeBoundary(elem, actor, conf2, isFooter); + case "control": + return await drawActorTypeControl(elem, actor, conf2, isFooter); + case "entity": + return await drawActorTypeEntity(elem, actor, conf2, isFooter); + case "database": + return await drawActorTypeDatabase(elem, actor, conf2, isFooter); + case "collections": + return await drawActorTypeCollections(elem, actor, conf2, isFooter); + case "queue": + return await drawActorTypeQueue(elem, actor, conf2, isFooter); + } +}, "drawActor"); +var drawBox = /* @__PURE__ */ __name(function(elem, box, conf2) { + const boxplusTextGroup = elem.append("g"); + const g = boxplusTextGroup; + drawBackgroundRect2(g, box); + if (box.name) { + _drawTextCandidateFunc(conf2)( + box.name, + g, + box.x, + box.y + conf2.boxTextMargin + (box.textMaxHeight || 0) / 2, + box.width, + 0, + { class: "text" }, + conf2 + ); + } + g.lower(); +}, "drawBox"); +var anchorElement = /* @__PURE__ */ __name(function(elem) { + return elem.append("g"); +}, "anchorElement"); +var drawActivation = /* @__PURE__ */ __name(function(elem, bounds2, verticalPos, conf2, actorActivations2) { + const rect = getNoteRect(); + const g = bounds2.anchored; + rect.x = bounds2.startx; + rect.y = bounds2.starty; + rect.class = "activation" + actorActivations2 % 3; + rect.width = bounds2.stopx - bounds2.startx; + rect.height = verticalPos - bounds2.starty; + drawRect2(g, rect); +}, "drawActivation"); +var drawLoop = /* @__PURE__ */ __name(async function(elem, loopModel, labelText, conf2) { + const { + boxMargin, + boxTextMargin, + labelBoxHeight, + labelBoxWidth, + messageFontFamily: fontFamily, + messageFontSize: fontSize, + messageFontWeight: fontWeight + } = conf2; + const g = elem.append("g"); + const drawLoopLine = /* @__PURE__ */ __name(function(startx, starty, stopx, stopy) { + return g.append("line").attr("x1", startx).attr("y1", starty).attr("x2", stopx).attr("y2", stopy).attr("class", "loopLine"); + }, "drawLoopLine"); + drawLoopLine(loopModel.startx, loopModel.starty, loopModel.stopx, loopModel.starty); + drawLoopLine(loopModel.stopx, loopModel.starty, loopModel.stopx, loopModel.stopy); + drawLoopLine(loopModel.startx, loopModel.stopy, loopModel.stopx, loopModel.stopy); + drawLoopLine(loopModel.startx, loopModel.starty, loopModel.startx, loopModel.stopy); + if (loopModel.sections !== void 0) { + loopModel.sections.forEach(function(item) { + drawLoopLine(loopModel.startx, item.y, loopModel.stopx, item.y).style( + "stroke-dasharray", + "3, 3" + ); + }); + } + let txt = getTextObj(); + txt.text = labelText; + txt.x = loopModel.startx; + txt.y = loopModel.starty; + txt.fontFamily = fontFamily; + txt.fontSize = fontSize; + txt.fontWeight = fontWeight; + txt.anchor = "middle"; + txt.valign = "middle"; + txt.tspan = false; + txt.width = labelBoxWidth || 50; + txt.height = labelBoxHeight || 20; + txt.textMargin = boxTextMargin; + txt.class = "labelText"; + drawLabel(g, txt); + txt = getTextObj2(); + txt.text = loopModel.title; + txt.x = loopModel.startx + labelBoxWidth / 2 + (loopModel.stopx - loopModel.startx) / 2; + txt.y = loopModel.starty + boxMargin + boxTextMargin; + txt.anchor = "middle"; + txt.valign = "middle"; + txt.textMargin = boxTextMargin; + txt.class = "loopText"; + txt.fontFamily = fontFamily; + txt.fontSize = fontSize; + txt.fontWeight = fontWeight; + txt.wrap = true; + let textElem = hasKatex(txt.text) ? await drawKatex(g, txt, loopModel) : drawText(g, txt); + if (loopModel.sectionTitles !== void 0) { + for (const [idx, item] of Object.entries(loopModel.sectionTitles)) { + if (item.message) { + txt.text = item.message; + txt.x = loopModel.startx + (loopModel.stopx - loopModel.startx) / 2; + txt.y = loopModel.sections[idx].y + boxMargin + boxTextMargin; + txt.class = "loopText"; + txt.anchor = "middle"; + txt.valign = "middle"; + txt.tspan = false; + txt.fontFamily = fontFamily; + txt.fontSize = fontSize; + txt.fontWeight = fontWeight; + txt.wrap = loopModel.wrap; + if (hasKatex(txt.text)) { + loopModel.starty = loopModel.sections[idx].y; + await drawKatex(g, txt, loopModel); + } else { + drawText(g, txt); + } + let sectionHeight = Math.round( + textElem.map((te) => (te._groups || te)[0][0].getBBox().height).reduce((acc, curr) => acc + curr) + ); + loopModel.sections[idx].height += sectionHeight - (boxMargin + boxTextMargin); + } + } + } + loopModel.height = Math.round(loopModel.stopy - loopModel.starty); + return g; +}, "drawLoop"); +var drawBackgroundRect2 = /* @__PURE__ */ __name(function(elem, bounds2) { + drawBackgroundRect(elem, bounds2); +}, "drawBackgroundRect"); +var insertDatabaseIcon = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("symbol").attr("id", "database").attr("fill-rule", "evenodd").attr("clip-rule", "evenodd").append("path").attr("transform", "scale(.5)").attr( + "d", + "M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z" + ); +}, "insertDatabaseIcon"); +var insertComputerIcon = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("symbol").attr("id", "computer").attr("width", "24").attr("height", "24").append("path").attr("transform", "scale(.5)").attr( + "d", + "M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z" + ); +}, "insertComputerIcon"); +var insertClockIcon = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("symbol").attr("id", "clock").attr("width", "24").attr("height", "24").append("path").attr("transform", "scale(.5)").attr( + "d", + "M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z" + ); +}, "insertClockIcon"); +var insertArrowHead = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("marker").attr("id", "arrowhead").attr("refX", 7.9).attr("refY", 5).attr("markerUnits", "userSpaceOnUse").attr("markerWidth", 12).attr("markerHeight", 12).attr("orient", "auto-start-reverse").append("path").attr("d", "M -1 0 L 10 5 L 0 10 z"); +}, "insertArrowHead"); +var insertArrowFilledHead = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("marker").attr("id", "filled-head").attr("refX", 15.5).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 18,7 L9,13 L14,7 L9,1 Z"); +}, "insertArrowFilledHead"); +var insertSequenceNumber = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("marker").attr("id", "sequencenumber").attr("refX", 15).attr("refY", 15).attr("markerWidth", 60).attr("markerHeight", 40).attr("orient", "auto").append("circle").attr("cx", 15).attr("cy", 15).attr("r", 6); +}, "insertSequenceNumber"); +var insertArrowCrossHead = /* @__PURE__ */ __name(function(elem) { + const defs = elem.append("defs"); + const marker = defs.append("marker").attr("id", "crosshead").attr("markerWidth", 15).attr("markerHeight", 8).attr("orient", "auto").attr("refX", 4).attr("refY", 4.5); + marker.append("path").attr("fill", "none").attr("stroke", "#000000").style("stroke-dasharray", "0, 0").attr("stroke-width", "1pt").attr("d", "M 1,2 L 6,7 M 6,2 L 1,7"); +}, "insertArrowCrossHead"); +var getTextObj2 = /* @__PURE__ */ __name(function() { + return { + x: 0, + y: 0, + fill: void 0, + anchor: void 0, + style: "#666", + width: void 0, + height: void 0, + textMargin: 0, + rx: 0, + ry: 0, + tspan: true, + valign: void 0 + }; +}, "getTextObj"); +var getNoteRect2 = /* @__PURE__ */ __name(function() { + return { + x: 0, + y: 0, + fill: "#EDF2AE", + stroke: "#666", + width: 100, + anchor: "start", + height: 100, + rx: 0, + ry: 0 + }; +}, "getNoteRect"); +var _drawTextCandidateFunc = /* @__PURE__ */ (function() { + function byText(content, g, x, y, width, height, textAttrs) { + const text = g.append("text").attr("x", x + width / 2).attr("y", y + height / 2 + 5).style("text-anchor", "middle").text(content); + _setTextAttrs(text, textAttrs); + } + __name(byText, "byText"); + function byTspan(content, g, x, y, width, height, textAttrs, conf2) { + const { actorFontSize, actorFontFamily, actorFontWeight } = conf2; + const [_actorFontSize, _actorFontSizePx] = parseFontSize(actorFontSize); + const lines = content.split(common_default.lineBreakRegex); + for (let i = 0; i < lines.length; i++) { + const dy = i * _actorFontSize - _actorFontSize * (lines.length - 1) / 2; + const text = g.append("text").attr("x", x + width / 2).attr("y", y).style("text-anchor", "middle").style("font-size", _actorFontSizePx).style("font-weight", actorFontWeight).style("font-family", actorFontFamily); + text.append("tspan").attr("x", x + width / 2).attr("dy", dy).text(lines[i]); + text.attr("y", y + height / 2).attr("dominant-baseline", "central").attr("alignment-baseline", "central"); + _setTextAttrs(text, textAttrs); + } + } + __name(byTspan, "byTspan"); + function byFo(content, g, x, y, width, height, textAttrs, conf2) { + const s = g.append("switch"); + const f = s.append("foreignObject").attr("x", x).attr("y", y).attr("width", width).attr("height", height); + const text = f.append("xhtml:div").style("display", "table").style("height", "100%").style("width", "100%"); + text.append("div").style("display", "table-cell").style("text-align", "center").style("vertical-align", "middle").text(content); + byTspan(content, s, x, y, width, height, textAttrs, conf2); + _setTextAttrs(text, textAttrs); + } + __name(byFo, "byFo"); + async function byKatex(content, g, x, y, width, height, textAttrs, conf2) { + const dim = await calculateMathMLDimensions(content, getConfig()); + const s = g.append("switch"); + const f = s.append("foreignObject").attr("x", x + width / 2 - dim.width / 2).attr("y", y + height / 2 - dim.height / 2).attr("width", dim.width).attr("height", dim.height); + const text = f.append("xhtml:div").style("height", "100%").style("width", "100%"); + text.append("div").style("text-align", "center").style("vertical-align", "middle").html(await renderKatexSanitized(content, getConfig())); + byTspan(content, s, x, y, width, height, textAttrs, conf2); + _setTextAttrs(text, textAttrs); + } + __name(byKatex, "byKatex"); + function _setTextAttrs(toText, fromTextAttrsDict) { + for (const key in fromTextAttrsDict) { + if (fromTextAttrsDict.hasOwnProperty(key)) { + toText.attr(key, fromTextAttrsDict[key]); + } + } + } + __name(_setTextAttrs, "_setTextAttrs"); + return function(conf2, hasKatex2 = false) { + if (hasKatex2) { + return byKatex; + } + return conf2.textPlacement === "fo" ? byFo : conf2.textPlacement === "old" ? byText : byTspan; + }; +})(); +var _drawMenuItemTextCandidateFunc = /* @__PURE__ */ (function() { + function byText(content, g, x, y, width, height, textAttrs) { + const text = g.append("text").attr("x", x).attr("y", y).style("text-anchor", "start").text(content); + _setTextAttrs(text, textAttrs); + } + __name(byText, "byText"); + function byTspan(content, g, x, y, width, height, textAttrs, conf2) { + const { actorFontSize, actorFontFamily, actorFontWeight } = conf2; + const lines = content.split(common_default.lineBreakRegex); + for (let i = 0; i < lines.length; i++) { + const dy = i * actorFontSize - actorFontSize * (lines.length - 1) / 2; + const text = g.append("text").attr("x", x).attr("y", y).style("text-anchor", "start").style("font-size", actorFontSize).style("font-weight", actorFontWeight).style("font-family", actorFontFamily); + text.append("tspan").attr("x", x).attr("dy", dy).text(lines[i]); + text.attr("y", y + height / 2).attr("dominant-baseline", "central").attr("alignment-baseline", "central"); + _setTextAttrs(text, textAttrs); + } + } + __name(byTspan, "byTspan"); + function byFo(content, g, x, y, width, height, textAttrs, conf2) { + const s = g.append("switch"); + const f = s.append("foreignObject").attr("x", x).attr("y", y).attr("width", width).attr("height", height); + const text = f.append("xhtml:div").style("display", "table").style("height", "100%").style("width", "100%"); + text.append("div").style("display", "table-cell").style("text-align", "center").style("vertical-align", "middle").text(content); + byTspan(content, s, x, y, width, height, textAttrs, conf2); + _setTextAttrs(text, textAttrs); + } + __name(byFo, "byFo"); + function _setTextAttrs(toText, fromTextAttrsDict) { + for (const key in fromTextAttrsDict) { + if (fromTextAttrsDict.hasOwnProperty(key)) { + toText.attr(key, fromTextAttrsDict[key]); + } + } + } + __name(_setTextAttrs, "_setTextAttrs"); + return function(conf2) { + return conf2.textPlacement === "fo" ? byFo : conf2.textPlacement === "old" ? byText : byTspan; + }; +})(); +var svgDraw_default = { + drawRect: drawRect2, + drawText, + drawLabel, + drawActor, + drawBox, + drawPopup, + anchorElement, + drawActivation, + drawLoop, + drawBackgroundRect: drawBackgroundRect2, + insertArrowHead, + insertArrowFilledHead, + insertSequenceNumber, + insertArrowCrossHead, + insertDatabaseIcon, + insertComputerIcon, + insertClockIcon, + getTextObj: getTextObj2, + getNoteRect: getNoteRect2, + fixLifeLineHeights, + sanitizeUrl +}; + +// src/diagrams/sequence/sequenceRenderer.ts +var conf = {}; +var bounds = { + data: { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0 + }, + verticalPos: 0, + sequenceItems: [], + activations: [], + models: { + getHeight: /* @__PURE__ */ __name(function() { + return Math.max.apply( + null, + this.actors.length === 0 ? [0] : this.actors.map((actor) => actor.height || 0) + ) + (this.loops.length === 0 ? 0 : this.loops.map((it) => it.height || 0).reduce((acc, h) => acc + h)) + (this.messages.length === 0 ? 0 : this.messages.map((it) => it.height || 0).reduce((acc, h) => acc + h)) + (this.notes.length === 0 ? 0 : this.notes.map((it) => it.height || 0).reduce((acc, h) => acc + h)); + }, "getHeight"), + clear: /* @__PURE__ */ __name(function() { + this.actors = []; + this.boxes = []; + this.loops = []; + this.messages = []; + this.notes = []; + }, "clear"), + addBox: /* @__PURE__ */ __name(function(boxModel) { + this.boxes.push(boxModel); + }, "addBox"), + addActor: /* @__PURE__ */ __name(function(actorModel) { + this.actors.push(actorModel); + }, "addActor"), + addLoop: /* @__PURE__ */ __name(function(loopModel) { + this.loops.push(loopModel); + }, "addLoop"), + addMessage: /* @__PURE__ */ __name(function(msgModel) { + this.messages.push(msgModel); + }, "addMessage"), + addNote: /* @__PURE__ */ __name(function(noteModel) { + this.notes.push(noteModel); + }, "addNote"), + lastActor: /* @__PURE__ */ __name(function() { + return this.actors[this.actors.length - 1]; + }, "lastActor"), + lastLoop: /* @__PURE__ */ __name(function() { + return this.loops[this.loops.length - 1]; + }, "lastLoop"), + lastMessage: /* @__PURE__ */ __name(function() { + return this.messages[this.messages.length - 1]; + }, "lastMessage"), + lastNote: /* @__PURE__ */ __name(function() { + return this.notes[this.notes.length - 1]; + }, "lastNote"), + actors: [], + boxes: [], + loops: [], + messages: [], + notes: [] + }, + init: /* @__PURE__ */ __name(function() { + this.sequenceItems = []; + this.activations = []; + this.models.clear(); + this.data = { + startx: void 0, + stopx: void 0, + starty: void 0, + stopy: void 0 + }; + this.verticalPos = 0; + setConf(getConfig2()); + }, "init"), + updateVal: /* @__PURE__ */ __name(function(obj, key, val, fun) { + if (obj[key] === void 0) { + obj[key] = val; + } else { + obj[key] = fun(val, obj[key]); + } + }, "updateVal"), + updateBounds: /* @__PURE__ */ __name(function(startx, starty, stopx, stopy) { + const _self = this; + let cnt = 0; + function updateFn(type) { + return /* @__PURE__ */ __name(function updateItemBounds(item) { + cnt++; + const n = _self.sequenceItems.length - cnt + 1; + _self.updateVal(item, "starty", starty - n * conf.boxMargin, Math.min); + _self.updateVal(item, "stopy", stopy + n * conf.boxMargin, Math.max); + _self.updateVal(bounds.data, "startx", startx - n * conf.boxMargin, Math.min); + _self.updateVal(bounds.data, "stopx", stopx + n * conf.boxMargin, Math.max); + if (!(type === "activation")) { + _self.updateVal(item, "startx", startx - n * conf.boxMargin, Math.min); + _self.updateVal(item, "stopx", stopx + n * conf.boxMargin, Math.max); + _self.updateVal(bounds.data, "starty", starty - n * conf.boxMargin, Math.min); + _self.updateVal(bounds.data, "stopy", stopy + n * conf.boxMargin, Math.max); + } + }, "updateItemBounds"); + } + __name(updateFn, "updateFn"); + this.sequenceItems.forEach(updateFn()); + this.activations.forEach(updateFn("activation")); + }, "updateBounds"), + insert: /* @__PURE__ */ __name(function(startx, starty, stopx, stopy) { + const _startx = common_default.getMin(startx, stopx); + const _stopx = common_default.getMax(startx, stopx); + const _starty = common_default.getMin(starty, stopy); + const _stopy = common_default.getMax(starty, stopy); + this.updateVal(bounds.data, "startx", _startx, Math.min); + this.updateVal(bounds.data, "starty", _starty, Math.min); + this.updateVal(bounds.data, "stopx", _stopx, Math.max); + this.updateVal(bounds.data, "stopy", _stopy, Math.max); + this.updateBounds(_startx, _starty, _stopx, _stopy); + }, "insert"), + newActivation: /* @__PURE__ */ __name(function(message, diagram2, actors) { + const actorRect = actors.get(message.from); + const stackedSize = actorActivations(message.from).length || 0; + const x = actorRect.x + actorRect.width / 2 + (stackedSize - 1) * conf.activationWidth / 2; + this.activations.push({ + startx: x, + starty: this.verticalPos + 2, + stopx: x + conf.activationWidth, + stopy: void 0, + actor: message.from, + anchored: svgDraw_default.anchorElement(diagram2) + }); + }, "newActivation"), + endActivation: /* @__PURE__ */ __name(function(message) { + const lastActorActivationIdx = this.activations.map(function(activation) { + return activation.actor; + }).lastIndexOf(message.from); + return this.activations.splice(lastActorActivationIdx, 1)[0]; + }, "endActivation"), + createLoop: /* @__PURE__ */ __name(function(title = { message: void 0, wrap: false, width: void 0 }, fill) { + return { + startx: void 0, + starty: this.verticalPos, + stopx: void 0, + stopy: void 0, + title: title.message, + wrap: title.wrap, + width: title.width, + height: 0, + fill + }; + }, "createLoop"), + newLoop: /* @__PURE__ */ __name(function(title = { message: void 0, wrap: false, width: void 0 }, fill) { + this.sequenceItems.push(this.createLoop(title, fill)); + }, "newLoop"), + endLoop: /* @__PURE__ */ __name(function() { + return this.sequenceItems.pop(); + }, "endLoop"), + isLoopOverlap: /* @__PURE__ */ __name(function() { + return this.sequenceItems.length ? this.sequenceItems[this.sequenceItems.length - 1].overlap : false; + }, "isLoopOverlap"), + addSectionToLoop: /* @__PURE__ */ __name(function(message) { + const loop = this.sequenceItems.pop(); + loop.sections = loop.sections || []; + loop.sectionTitles = loop.sectionTitles || []; + loop.sections.push({ y: bounds.getVerticalPos(), height: 0 }); + loop.sectionTitles.push(message); + this.sequenceItems.push(loop); + }, "addSectionToLoop"), + saveVerticalPos: /* @__PURE__ */ __name(function() { + if (this.isLoopOverlap()) { + this.savedVerticalPos = this.verticalPos; + } + }, "saveVerticalPos"), + resetVerticalPos: /* @__PURE__ */ __name(function() { + if (this.isLoopOverlap()) { + this.verticalPos = this.savedVerticalPos; + } + }, "resetVerticalPos"), + bumpVerticalPos: /* @__PURE__ */ __name(function(bump) { + this.verticalPos = this.verticalPos + bump; + this.data.stopy = common_default.getMax(this.data.stopy, this.verticalPos); + }, "bumpVerticalPos"), + getVerticalPos: /* @__PURE__ */ __name(function() { + return this.verticalPos; + }, "getVerticalPos"), + getBounds: /* @__PURE__ */ __name(function() { + return { bounds: this.data, models: this.models }; + }, "getBounds") +}; +var drawNote = /* @__PURE__ */ __name(async function(elem, noteModel) { + bounds.bumpVerticalPos(conf.boxMargin); + noteModel.height = conf.boxMargin; + noteModel.starty = bounds.getVerticalPos(); + const rect = getNoteRect(); + rect.x = noteModel.startx; + rect.y = noteModel.starty; + rect.width = noteModel.width || conf.width; + rect.class = "note"; + const g = elem.append("g"); + const rectElem = svgDraw_default.drawRect(g, rect); + const textObj = getTextObj(); + textObj.x = noteModel.startx; + textObj.y = noteModel.starty; + textObj.width = rect.width; + textObj.dy = "1em"; + textObj.text = noteModel.message; + textObj.class = "noteText"; + textObj.fontFamily = conf.noteFontFamily; + textObj.fontSize = conf.noteFontSize; + textObj.fontWeight = conf.noteFontWeight; + textObj.anchor = conf.noteAlign; + textObj.textMargin = conf.noteMargin; + textObj.valign = "center"; + const textElem = hasKatex(textObj.text) ? await drawKatex(g, textObj) : drawText(g, textObj); + const textHeight = Math.round( + textElem.map((te) => (te._groups || te)[0][0].getBBox().height).reduce((acc, curr) => acc + curr) + ); + rectElem.attr("height", textHeight + 2 * conf.noteMargin); + noteModel.height += textHeight + 2 * conf.noteMargin; + bounds.bumpVerticalPos(textHeight + 2 * conf.noteMargin); + noteModel.stopy = noteModel.starty + textHeight + 2 * conf.noteMargin; + noteModel.stopx = noteModel.startx + rect.width; + bounds.insert(noteModel.startx, noteModel.starty, noteModel.stopx, noteModel.stopy); + bounds.models.addNote(noteModel); +}, "drawNote"); +var messageFont = /* @__PURE__ */ __name((cnf) => { + return { + fontFamily: cnf.messageFontFamily, + fontSize: cnf.messageFontSize, + fontWeight: cnf.messageFontWeight + }; +}, "messageFont"); +var noteFont = /* @__PURE__ */ __name((cnf) => { + return { + fontFamily: cnf.noteFontFamily, + fontSize: cnf.noteFontSize, + fontWeight: cnf.noteFontWeight + }; +}, "noteFont"); +var actorFont = /* @__PURE__ */ __name((cnf) => { + return { + fontFamily: cnf.actorFontFamily, + fontSize: cnf.actorFontSize, + fontWeight: cnf.actorFontWeight + }; +}, "actorFont"); +async function boundMessage(_diagram, msgModel) { + bounds.bumpVerticalPos(10); + const { startx, stopx, message } = msgModel; + const lines = common_default.splitBreaks(message).length; + const isKatexMsg = hasKatex(message); + const textDims = isKatexMsg ? await calculateMathMLDimensions(message, getConfig2()) : utils_default.calculateTextDimensions(message, messageFont(conf)); + if (!isKatexMsg) { + const lineHeight = textDims.height / lines; + msgModel.height += lineHeight; + bounds.bumpVerticalPos(lineHeight); + } + let lineStartY; + let totalOffset = textDims.height - 10; + const textWidth = textDims.width; + if (startx === stopx) { + lineStartY = bounds.getVerticalPos() + totalOffset; + if (!conf.rightAngles) { + totalOffset += conf.boxMargin; + lineStartY = bounds.getVerticalPos() + totalOffset; + } + totalOffset += 30; + const dx = common_default.getMax(textWidth / 2, conf.width / 2); + bounds.insert( + startx - dx, + bounds.getVerticalPos() - 10 + totalOffset, + stopx + dx, + bounds.getVerticalPos() + 30 + totalOffset + ); + } else { + totalOffset += conf.boxMargin; + lineStartY = bounds.getVerticalPos() + totalOffset; + bounds.insert(startx, lineStartY - 10, stopx, lineStartY); + } + bounds.bumpVerticalPos(totalOffset); + msgModel.height += totalOffset; + msgModel.stopy = msgModel.starty + msgModel.height; + bounds.insert(msgModel.fromBounds, msgModel.starty, msgModel.toBounds, msgModel.stopy); + return lineStartY; +} +__name(boundMessage, "boundMessage"); +var drawMessage = /* @__PURE__ */ __name(async function(diagram2, msgModel, lineStartY, diagObj) { + const { startx, stopx, starty, message, type, sequenceIndex, sequenceVisible } = msgModel; + const textDims = utils_default.calculateTextDimensions(message, messageFont(conf)); + const textObj = getTextObj(); + textObj.x = startx; + textObj.y = starty + 10; + textObj.width = stopx - startx; + textObj.class = "messageText"; + textObj.dy = "1em"; + textObj.text = message; + textObj.fontFamily = conf.messageFontFamily; + textObj.fontSize = conf.messageFontSize; + textObj.fontWeight = conf.messageFontWeight; + textObj.anchor = conf.messageAlign; + textObj.valign = "center"; + textObj.textMargin = conf.wrapPadding; + textObj.tspan = false; + if (hasKatex(textObj.text)) { + await drawKatex(diagram2, textObj, { startx, stopx, starty: lineStartY }); + } else { + drawText(diagram2, textObj); + } + const textWidth = textDims.width; + let line; + if (startx === stopx) { + if (conf.rightAngles) { + line = diagram2.append("path").attr( + "d", + `M ${startx},${lineStartY} H ${startx + common_default.getMax(conf.width / 2, textWidth / 2)} V ${lineStartY + 25} H ${startx}` + ); + } else { + line = diagram2.append("path").attr( + "d", + "M " + startx + "," + lineStartY + " C " + (startx + 60) + "," + (lineStartY - 10) + " " + (startx + 60) + "," + (lineStartY + 30) + " " + startx + "," + (lineStartY + 20) + ); + } + } else { + line = diagram2.append("line"); + line.attr("x1", startx); + line.attr("y1", lineStartY); + line.attr("x2", stopx); + line.attr("y2", lineStartY); + } + if (type === diagObj.db.LINETYPE.DOTTED || type === diagObj.db.LINETYPE.DOTTED_CROSS || type === diagObj.db.LINETYPE.DOTTED_POINT || type === diagObj.db.LINETYPE.DOTTED_OPEN || type === diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED) { + line.style("stroke-dasharray", "3, 3"); + line.attr("class", "messageLine1"); + } else { + line.attr("class", "messageLine0"); + } + let url = ""; + if (conf.arrowMarkerAbsolute) { + url = getUrl(true); + } + line.attr("stroke-width", 2); + line.attr("stroke", "none"); + line.style("fill", "none"); + if (type === diagObj.db.LINETYPE.SOLID || type === diagObj.db.LINETYPE.DOTTED) { + line.attr("marker-end", "url(" + url + "#arrowhead)"); + } + if (type === diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID || type === diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED) { + line.attr("marker-start", "url(" + url + "#arrowhead)"); + line.attr("marker-end", "url(" + url + "#arrowhead)"); + } + if (type === diagObj.db.LINETYPE.SOLID_POINT || type === diagObj.db.LINETYPE.DOTTED_POINT) { + line.attr("marker-end", "url(" + url + "#filled-head)"); + } + if (type === diagObj.db.LINETYPE.SOLID_CROSS || type === diagObj.db.LINETYPE.DOTTED_CROSS) { + line.attr("marker-end", "url(" + url + "#crosshead)"); + } + if (sequenceVisible || conf.showSequenceNumbers) { + const isBidirectional = type === diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID || type === diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED; + if (isBidirectional) { + const SEQUENCE_NUMBER_RADIUS = 6; + if (startx < stopx) { + line.attr("x1", startx + 2 * SEQUENCE_NUMBER_RADIUS); + } else { + line.attr("x1", startx + SEQUENCE_NUMBER_RADIUS); + } + } + diagram2.append("line").attr("x1", startx).attr("y1", lineStartY).attr("x2", startx).attr("y2", lineStartY).attr("stroke-width", 0).attr("marker-start", "url(" + url + "#sequencenumber)"); + diagram2.append("text").attr("x", startx).attr("y", lineStartY + 4).attr("font-family", "sans-serif").attr("font-size", "12px").attr("text-anchor", "middle").attr("class", "sequenceNumber").text(sequenceIndex); + } +}, "drawMessage"); +var addActorRenderingData = /* @__PURE__ */ __name(function(diagram2, actors, createdActors, actorKeys, verticalPos, messages, isFooter) { + let prevWidth = 0; + let prevMargin = 0; + let prevBox = void 0; + let maxHeight = 0; + for (const actorKey of actorKeys) { + const actor = actors.get(actorKey); + const box = actor.box; + if (prevBox && prevBox != box) { + if (!isFooter) { + bounds.models.addBox(prevBox); + } + prevMargin += conf.boxMargin + prevBox.margin; + } + if (box && box != prevBox) { + if (!isFooter) { + box.x = prevWidth + prevMargin; + box.y = verticalPos; + } + prevMargin += box.margin; + } + actor.width = actor.width || conf.width; + actor.height = common_default.getMax(actor.height || conf.height, conf.height); + actor.margin = actor.margin || conf.actorMargin; + maxHeight = common_default.getMax(maxHeight, actor.height); + if (createdActors.get(actor.name)) { + prevMargin += actor.width / 2; + } + actor.x = prevWidth + prevMargin; + actor.starty = bounds.getVerticalPos(); + bounds.insert(actor.x, verticalPos, actor.x + actor.width, actor.height); + prevWidth += actor.width + prevMargin; + if (actor.box) { + actor.box.width = prevWidth + box.margin - actor.box.x; + } + prevMargin = actor.margin; + prevBox = actor.box; + bounds.models.addActor(actor); + } + if (prevBox && !isFooter) { + bounds.models.addBox(prevBox); + } + bounds.bumpVerticalPos(maxHeight); +}, "addActorRenderingData"); +var drawActors = /* @__PURE__ */ __name(async function(diagram2, actors, actorKeys, isFooter) { + if (!isFooter) { + for (const actorKey of actorKeys) { + const actor = actors.get(actorKey); + await svgDraw_default.drawActor(diagram2, actor, conf, false); + } + } else { + let maxHeight = 0; + bounds.bumpVerticalPos(conf.boxMargin * 2); + for (const actorKey of actorKeys) { + const actor = actors.get(actorKey); + if (!actor.stopy) { + actor.stopy = bounds.getVerticalPos(); + } + const height = await svgDraw_default.drawActor(diagram2, actor, conf, true); + maxHeight = common_default.getMax(maxHeight, height); + } + bounds.bumpVerticalPos(maxHeight + conf.boxMargin); + } +}, "drawActors"); +var drawActorsPopup = /* @__PURE__ */ __name(function(diagram2, actors, actorKeys, doc) { + let maxHeight = 0; + let maxWidth = 0; + for (const actorKey of actorKeys) { + const actor = actors.get(actorKey); + const minMenuWidth = getRequiredPopupWidth(actor); + const menuDimensions = svgDraw_default.drawPopup( + diagram2, + actor, + minMenuWidth, + conf, + conf.forceMenus, + doc + ); + if (menuDimensions.height > maxHeight) { + maxHeight = menuDimensions.height; + } + if (menuDimensions.width + actor.x > maxWidth) { + maxWidth = menuDimensions.width + actor.x; + } + } + return { maxHeight, maxWidth }; +}, "drawActorsPopup"); +var setConf = /* @__PURE__ */ __name(function(cnf) { + assignWithDepth_default(conf, cnf); + if (cnf.fontFamily) { + conf.actorFontFamily = conf.noteFontFamily = conf.messageFontFamily = cnf.fontFamily; + } + if (cnf.fontSize) { + conf.actorFontSize = conf.noteFontSize = conf.messageFontSize = cnf.fontSize; + } + if (cnf.fontWeight) { + conf.actorFontWeight = conf.noteFontWeight = conf.messageFontWeight = cnf.fontWeight; + } +}, "setConf"); +var actorActivations = /* @__PURE__ */ __name(function(actor) { + return bounds.activations.filter(function(activation) { + return activation.actor === actor; + }); +}, "actorActivations"); +var activationBounds = /* @__PURE__ */ __name(function(actor, actors) { + const actorObj = actors.get(actor); + const activations = actorActivations(actor); + const left = activations.reduce( + function(acc, activation) { + return common_default.getMin(acc, activation.startx); + }, + actorObj.x + actorObj.width / 2 - 1 + ); + const right = activations.reduce( + function(acc, activation) { + return common_default.getMax(acc, activation.stopx); + }, + actorObj.x + actorObj.width / 2 + 1 + ); + return [left, right]; +}, "activationBounds"); +function adjustLoopHeightForWrap(loopWidths, msg, preMargin, postMargin, addLoopFn) { + bounds.bumpVerticalPos(preMargin); + let heightAdjust = postMargin; + if (msg.id && msg.message && loopWidths[msg.id]) { + const loopWidth = loopWidths[msg.id].width; + const textConf = messageFont(conf); + msg.message = utils_default.wrapLabel(`[${msg.message}]`, loopWidth - 2 * conf.wrapPadding, textConf); + msg.width = loopWidth; + msg.wrap = true; + const textDims = utils_default.calculateTextDimensions(msg.message, textConf); + const totalOffset = common_default.getMax(textDims.height, conf.labelBoxHeight); + heightAdjust = postMargin + totalOffset; + log.debug(`${totalOffset} - ${msg.message}`); + } + addLoopFn(msg); + bounds.bumpVerticalPos(heightAdjust); +} +__name(adjustLoopHeightForWrap, "adjustLoopHeightForWrap"); +function adjustCreatedDestroyedData(msg, msgModel, lineStartY, index, actors, createdActors, destroyedActors) { + function receiverAdjustment(actor, adjustment) { + if (actor.x < actors.get(msg.from).x) { + bounds.insert( + msgModel.stopx - adjustment, + msgModel.starty, + msgModel.startx, + msgModel.stopy + actor.height / 2 + conf.noteMargin + ); + msgModel.stopx = msgModel.stopx + adjustment; + } else { + bounds.insert( + msgModel.startx, + msgModel.starty, + msgModel.stopx + adjustment, + msgModel.stopy + actor.height / 2 + conf.noteMargin + ); + msgModel.stopx = msgModel.stopx - adjustment; + } + } + __name(receiverAdjustment, "receiverAdjustment"); + function senderAdjustment(actor, adjustment) { + if (actor.x < actors.get(msg.to).x) { + bounds.insert( + msgModel.startx - adjustment, + msgModel.starty, + msgModel.stopx, + msgModel.stopy + actor.height / 2 + conf.noteMargin + ); + msgModel.startx = msgModel.startx + adjustment; + } else { + bounds.insert( + msgModel.stopx, + msgModel.starty, + msgModel.startx + adjustment, + msgModel.stopy + actor.height / 2 + conf.noteMargin + ); + msgModel.startx = msgModel.startx - adjustment; + } + } + __name(senderAdjustment, "senderAdjustment"); + const actorArray = [ + PARTICIPANT_TYPE.ACTOR, + PARTICIPANT_TYPE.CONTROL, + PARTICIPANT_TYPE.ENTITY, + PARTICIPANT_TYPE.DATABASE + ]; + if (createdActors.get(msg.to) == index) { + const actor = actors.get(msg.to); + const adjustment = actorArray.includes(actor.type) ? ACTOR_TYPE_WIDTH / 2 + 3 : actor.width / 2 + 3; + receiverAdjustment(actor, adjustment); + actor.starty = lineStartY - actor.height / 2; + bounds.bumpVerticalPos(actor.height / 2); + } else if (destroyedActors.get(msg.from) == index) { + const actor = actors.get(msg.from); + if (conf.mirrorActors) { + const adjustment = actorArray.includes(actor.type) ? ACTOR_TYPE_WIDTH / 2 : actor.width / 2; + senderAdjustment(actor, adjustment); + } + actor.stopy = lineStartY - actor.height / 2; + bounds.bumpVerticalPos(actor.height / 2); + } else if (destroyedActors.get(msg.to) == index) { + const actor = actors.get(msg.to); + if (conf.mirrorActors) { + const adjustment = actorArray.includes(actor.type) ? ACTOR_TYPE_WIDTH / 2 + 3 : actor.width / 2 + 3; + receiverAdjustment(actor, adjustment); + } + actor.stopy = lineStartY - actor.height / 2; + bounds.bumpVerticalPos(actor.height / 2); + } +} +__name(adjustCreatedDestroyedData, "adjustCreatedDestroyedData"); +var draw = /* @__PURE__ */ __name(async function(_text, id, _version, diagObj) { + const { securityLevel, sequence } = getConfig2(); + conf = sequence; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = select("#i" + id); + } + const root = securityLevel === "sandbox" ? select(sandboxElement.nodes()[0].contentDocument.body) : select("body"); + const doc = securityLevel === "sandbox" ? sandboxElement.nodes()[0].contentDocument : document; + bounds.init(); + log.debug(diagObj.db); + const diagram2 = securityLevel === "sandbox" ? root.select(`[id="${id}"]`) : select(`[id="${id}"]`); + const actors = diagObj.db.getActors(); + const createdActors = diagObj.db.getCreatedActors(); + const destroyedActors = diagObj.db.getDestroyedActors(); + const boxes = diagObj.db.getBoxes(); + let actorKeys = diagObj.db.getActorKeys(); + const messages = diagObj.db.getMessages(); + const title = diagObj.db.getDiagramTitle(); + const hasBoxes = diagObj.db.hasAtLeastOneBox(); + const hasBoxTitles = diagObj.db.hasAtLeastOneBoxWithTitle(); + const maxMessageWidthPerActor = await getMaxMessageWidthPerActor(actors, messages, diagObj); + conf.height = await calculateActorMargins(actors, maxMessageWidthPerActor, boxes); + svgDraw_default.insertComputerIcon(diagram2); + svgDraw_default.insertDatabaseIcon(diagram2); + svgDraw_default.insertClockIcon(diagram2); + if (hasBoxes) { + bounds.bumpVerticalPos(conf.boxMargin); + if (hasBoxTitles) { + bounds.bumpVerticalPos(boxes[0].textMaxHeight); + } + } + if (conf.hideUnusedParticipants === true) { + const newActors = /* @__PURE__ */ new Set(); + messages.forEach((message) => { + newActors.add(message.from); + newActors.add(message.to); + }); + actorKeys = actorKeys.filter((actorKey) => newActors.has(actorKey)); + } + addActorRenderingData(diagram2, actors, createdActors, actorKeys, 0, messages, false); + const loopWidths = await calculateLoopBounds(messages, actors, maxMessageWidthPerActor, diagObj); + svgDraw_default.insertArrowHead(diagram2); + svgDraw_default.insertArrowCrossHead(diagram2); + svgDraw_default.insertArrowFilledHead(diagram2); + svgDraw_default.insertSequenceNumber(diagram2); + function activeEnd(msg, verticalPos) { + const activationData = bounds.endActivation(msg); + if (activationData.starty + 18 > verticalPos) { + activationData.starty = verticalPos - 6; + verticalPos += 12; + } + svgDraw_default.drawActivation( + diagram2, + activationData, + verticalPos, + conf, + actorActivations(msg.from).length + ); + bounds.insert(activationData.startx, verticalPos - 10, activationData.stopx, verticalPos); + } + __name(activeEnd, "activeEnd"); + let sequenceIndex = 1; + let sequenceIndexStep = 1; + const messagesToDraw = []; + const backgrounds = []; + let index = 0; + for (const msg of messages) { + let loopModel, noteModel, msgModel; + switch (msg.type) { + case diagObj.db.LINETYPE.NOTE: + bounds.resetVerticalPos(); + noteModel = msg.noteModel; + await drawNote(diagram2, noteModel); + break; + case diagObj.db.LINETYPE.ACTIVE_START: + bounds.newActivation(msg, diagram2, actors); + break; + case diagObj.db.LINETYPE.ACTIVE_END: + activeEnd(msg, bounds.getVerticalPos()); + break; + case diagObj.db.LINETYPE.LOOP_START: + adjustLoopHeightForWrap( + loopWidths, + msg, + conf.boxMargin, + conf.boxMargin + conf.boxTextMargin, + (message) => bounds.newLoop(message) + ); + break; + case diagObj.db.LINETYPE.LOOP_END: + loopModel = bounds.endLoop(); + await svgDraw_default.drawLoop(diagram2, loopModel, "loop", conf); + bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos()); + bounds.models.addLoop(loopModel); + break; + case diagObj.db.LINETYPE.RECT_START: + adjustLoopHeightForWrap( + loopWidths, + msg, + conf.boxMargin, + conf.boxMargin, + (message) => bounds.newLoop(void 0, message.message) + ); + break; + case diagObj.db.LINETYPE.RECT_END: + loopModel = bounds.endLoop(); + backgrounds.push(loopModel); + bounds.models.addLoop(loopModel); + bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos()); + break; + case diagObj.db.LINETYPE.OPT_START: + adjustLoopHeightForWrap( + loopWidths, + msg, + conf.boxMargin, + conf.boxMargin + conf.boxTextMargin, + (message) => bounds.newLoop(message) + ); + break; + case diagObj.db.LINETYPE.OPT_END: + loopModel = bounds.endLoop(); + await svgDraw_default.drawLoop(diagram2, loopModel, "opt", conf); + bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos()); + bounds.models.addLoop(loopModel); + break; + case diagObj.db.LINETYPE.ALT_START: + adjustLoopHeightForWrap( + loopWidths, + msg, + conf.boxMargin, + conf.boxMargin + conf.boxTextMargin, + (message) => bounds.newLoop(message) + ); + break; + case diagObj.db.LINETYPE.ALT_ELSE: + adjustLoopHeightForWrap( + loopWidths, + msg, + conf.boxMargin + conf.boxTextMargin, + conf.boxMargin, + (message) => bounds.addSectionToLoop(message) + ); + break; + case diagObj.db.LINETYPE.ALT_END: + loopModel = bounds.endLoop(); + await svgDraw_default.drawLoop(diagram2, loopModel, "alt", conf); + bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos()); + bounds.models.addLoop(loopModel); + break; + case diagObj.db.LINETYPE.PAR_START: + case diagObj.db.LINETYPE.PAR_OVER_START: + adjustLoopHeightForWrap( + loopWidths, + msg, + conf.boxMargin, + conf.boxMargin + conf.boxTextMargin, + (message) => bounds.newLoop(message) + ); + bounds.saveVerticalPos(); + break; + case diagObj.db.LINETYPE.PAR_AND: + adjustLoopHeightForWrap( + loopWidths, + msg, + conf.boxMargin + conf.boxTextMargin, + conf.boxMargin, + (message) => bounds.addSectionToLoop(message) + ); + break; + case diagObj.db.LINETYPE.PAR_END: + loopModel = bounds.endLoop(); + await svgDraw_default.drawLoop(diagram2, loopModel, "par", conf); + bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos()); + bounds.models.addLoop(loopModel); + break; + case diagObj.db.LINETYPE.AUTONUMBER: + sequenceIndex = msg.message.start || sequenceIndex; + sequenceIndexStep = msg.message.step || sequenceIndexStep; + if (msg.message.visible) { + diagObj.db.enableSequenceNumbers(); + } else { + diagObj.db.disableSequenceNumbers(); + } + break; + case diagObj.db.LINETYPE.CRITICAL_START: + adjustLoopHeightForWrap( + loopWidths, + msg, + conf.boxMargin, + conf.boxMargin + conf.boxTextMargin, + (message) => bounds.newLoop(message) + ); + break; + case diagObj.db.LINETYPE.CRITICAL_OPTION: + adjustLoopHeightForWrap( + loopWidths, + msg, + conf.boxMargin + conf.boxTextMargin, + conf.boxMargin, + (message) => bounds.addSectionToLoop(message) + ); + break; + case diagObj.db.LINETYPE.CRITICAL_END: + loopModel = bounds.endLoop(); + await svgDraw_default.drawLoop(diagram2, loopModel, "critical", conf); + bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos()); + bounds.models.addLoop(loopModel); + break; + case diagObj.db.LINETYPE.BREAK_START: + adjustLoopHeightForWrap( + loopWidths, + msg, + conf.boxMargin, + conf.boxMargin + conf.boxTextMargin, + (message) => bounds.newLoop(message) + ); + break; + case diagObj.db.LINETYPE.BREAK_END: + loopModel = bounds.endLoop(); + await svgDraw_default.drawLoop(diagram2, loopModel, "break", conf); + bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos()); + bounds.models.addLoop(loopModel); + break; + default: + try { + msgModel = msg.msgModel; + msgModel.starty = bounds.getVerticalPos(); + msgModel.sequenceIndex = sequenceIndex; + msgModel.sequenceVisible = diagObj.db.showSequenceNumbers(); + const lineStartY = await boundMessage(diagram2, msgModel); + adjustCreatedDestroyedData( + msg, + msgModel, + lineStartY, + index, + actors, + createdActors, + destroyedActors + ); + messagesToDraw.push({ messageModel: msgModel, lineStartY }); + bounds.models.addMessage(msgModel); + } catch (e) { + log.error("error while drawing message", e); + } + } + if ([ + diagObj.db.LINETYPE.SOLID_OPEN, + diagObj.db.LINETYPE.DOTTED_OPEN, + diagObj.db.LINETYPE.SOLID, + diagObj.db.LINETYPE.DOTTED, + diagObj.db.LINETYPE.SOLID_CROSS, + diagObj.db.LINETYPE.DOTTED_CROSS, + diagObj.db.LINETYPE.SOLID_POINT, + diagObj.db.LINETYPE.DOTTED_POINT, + diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID, + diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED + ].includes(msg.type)) { + sequenceIndex = sequenceIndex + sequenceIndexStep; + } + index++; + } + log.debug("createdActors", createdActors); + log.debug("destroyedActors", destroyedActors); + await drawActors(diagram2, actors, actorKeys, false); + for (const e of messagesToDraw) { + await drawMessage(diagram2, e.messageModel, e.lineStartY, diagObj); + } + if (conf.mirrorActors) { + await drawActors(diagram2, actors, actorKeys, true); + } + backgrounds.forEach((e) => svgDraw_default.drawBackgroundRect(diagram2, e)); + fixLifeLineHeights(diagram2, actors, actorKeys, conf); + for (const box2 of bounds.models.boxes) { + box2.height = bounds.getVerticalPos() - box2.y; + bounds.insert(box2.x, box2.y, box2.x + box2.width, box2.height); + const boxPadding = conf.boxMargin * 2; + box2.startx = box2.x - boxPadding; + box2.starty = box2.y - boxPadding * 0.25; + box2.stopx = box2.startx + box2.width + 2 * boxPadding; + box2.stopy = box2.starty + box2.height + boxPadding * 0.75; + box2.stroke = "rgb(0,0,0, 0.5)"; + svgDraw_default.drawBox(diagram2, box2, conf); + } + if (hasBoxes) { + bounds.bumpVerticalPos(conf.boxMargin); + } + const requiredBoxSize = drawActorsPopup(diagram2, actors, actorKeys, doc); + const { bounds: box } = bounds.getBounds(); + if (box.startx === void 0) { + box.startx = 0; + } + if (box.starty === void 0) { + box.starty = 0; + } + if (box.stopx === void 0) { + box.stopx = 0; + } + if (box.stopy === void 0) { + box.stopy = 0; + } + let boxHeight = box.stopy - box.starty; + if (boxHeight < requiredBoxSize.maxHeight) { + boxHeight = requiredBoxSize.maxHeight; + } + let height = boxHeight + 2 * conf.diagramMarginY; + if (conf.mirrorActors) { + height = height - conf.boxMargin + conf.bottomMarginAdj; + } + let boxWidth = box.stopx - box.startx; + if (boxWidth < requiredBoxSize.maxWidth) { + boxWidth = requiredBoxSize.maxWidth; + } + const width = boxWidth + 2 * conf.diagramMarginX; + if (title) { + diagram2.append("text").text(title).attr("x", (box.stopx - box.startx) / 2 - 2 * conf.diagramMarginX).attr("y", -25); + } + configureSvgSize(diagram2, height, width, conf.useMaxWidth); + const extraVertForTitle = title ? 40 : 0; + diagram2.attr( + "viewBox", + box.startx - conf.diagramMarginX + " -" + (conf.diagramMarginY + extraVertForTitle) + " " + width + " " + (height + extraVertForTitle) + ); + log.debug(`models:`, bounds.models); +}, "draw"); +async function getMaxMessageWidthPerActor(actors, messages, diagObj) { + const maxMessageWidthPerActor = {}; + for (const msg of messages) { + if (actors.get(msg.to) && actors.get(msg.from)) { + const actor = actors.get(msg.to); + if (msg.placement === diagObj.db.PLACEMENT.LEFTOF && !actor.prevActor) { + continue; + } + if (msg.placement === diagObj.db.PLACEMENT.RIGHTOF && !actor.nextActor) { + continue; + } + const isNote = msg.placement !== void 0; + const isMessage = !isNote; + const textFont = isNote ? noteFont(conf) : messageFont(conf); + const wrappedMessage = msg.wrap ? utils_default.wrapLabel(msg.message, conf.width - 2 * conf.wrapPadding, textFont) : msg.message; + const messageDimensions = hasKatex(wrappedMessage) ? await calculateMathMLDimensions(msg.message, getConfig2()) : utils_default.calculateTextDimensions(wrappedMessage, textFont); + const messageWidth = messageDimensions.width + 2 * conf.wrapPadding; + if (isMessage && msg.from === actor.nextActor) { + maxMessageWidthPerActor[msg.to] = common_default.getMax( + maxMessageWidthPerActor[msg.to] || 0, + messageWidth + ); + } else if (isMessage && msg.from === actor.prevActor) { + maxMessageWidthPerActor[msg.from] = common_default.getMax( + maxMessageWidthPerActor[msg.from] || 0, + messageWidth + ); + } else if (isMessage && msg.from === msg.to) { + maxMessageWidthPerActor[msg.from] = common_default.getMax( + maxMessageWidthPerActor[msg.from] || 0, + messageWidth / 2 + ); + maxMessageWidthPerActor[msg.to] = common_default.getMax( + maxMessageWidthPerActor[msg.to] || 0, + messageWidth / 2 + ); + } else if (msg.placement === diagObj.db.PLACEMENT.RIGHTOF) { + maxMessageWidthPerActor[msg.from] = common_default.getMax( + maxMessageWidthPerActor[msg.from] || 0, + messageWidth + ); + } else if (msg.placement === diagObj.db.PLACEMENT.LEFTOF) { + maxMessageWidthPerActor[actor.prevActor] = common_default.getMax( + maxMessageWidthPerActor[actor.prevActor] || 0, + messageWidth + ); + } else if (msg.placement === diagObj.db.PLACEMENT.OVER) { + if (actor.prevActor) { + maxMessageWidthPerActor[actor.prevActor] = common_default.getMax( + maxMessageWidthPerActor[actor.prevActor] || 0, + messageWidth / 2 + ); + } + if (actor.nextActor) { + maxMessageWidthPerActor[msg.from] = common_default.getMax( + maxMessageWidthPerActor[msg.from] || 0, + messageWidth / 2 + ); + } + } + } + } + log.debug("maxMessageWidthPerActor:", maxMessageWidthPerActor); + return maxMessageWidthPerActor; +} +__name(getMaxMessageWidthPerActor, "getMaxMessageWidthPerActor"); +var getRequiredPopupWidth = /* @__PURE__ */ __name(function(actor) { + let requiredPopupWidth = 0; + const textFont = actorFont(conf); + for (const key in actor.links) { + const labelDimensions = utils_default.calculateTextDimensions(key, textFont); + const labelWidth = labelDimensions.width + 2 * conf.wrapPadding + 2 * conf.boxMargin; + if (requiredPopupWidth < labelWidth) { + requiredPopupWidth = labelWidth; + } + } + return requiredPopupWidth; +}, "getRequiredPopupWidth"); +async function calculateActorMargins(actors, actorToMessageWidth, boxes) { + let maxHeight = 0; + for (const prop of actors.keys()) { + const actor = actors.get(prop); + if (actor.wrap) { + actor.description = utils_default.wrapLabel( + actor.description, + conf.width - 2 * conf.wrapPadding, + actorFont(conf) + ); + } + const actDims = hasKatex(actor.description) ? await calculateMathMLDimensions(actor.description, getConfig2()) : utils_default.calculateTextDimensions(actor.description, actorFont(conf)); + actor.width = actor.wrap ? conf.width : common_default.getMax(conf.width, actDims.width + 2 * conf.wrapPadding); + actor.height = actor.wrap ? common_default.getMax(actDims.height, conf.height) : conf.height; + maxHeight = common_default.getMax(maxHeight, actor.height); + } + for (const actorKey in actorToMessageWidth) { + const actor = actors.get(actorKey); + if (!actor) { + continue; + } + const nextActor = actors.get(actor.nextActor); + if (!nextActor) { + const messageWidth2 = actorToMessageWidth[actorKey]; + const actorWidth2 = messageWidth2 + conf.actorMargin - actor.width / 2; + actor.margin = common_default.getMax(actorWidth2, conf.actorMargin); + continue; + } + const messageWidth = actorToMessageWidth[actorKey]; + const actorWidth = messageWidth + conf.actorMargin - actor.width / 2 - nextActor.width / 2; + actor.margin = common_default.getMax(actorWidth, conf.actorMargin); + } + let maxBoxHeight = 0; + boxes.forEach((box) => { + const textFont = messageFont(conf); + let totalWidth = box.actorKeys.reduce((total, aKey) => { + return total += actors.get(aKey).width + (actors.get(aKey).margin || 0); + }, 0); + const standardBoxPadding = conf.boxMargin * 8; + totalWidth += standardBoxPadding; + totalWidth -= 2 * conf.boxTextMargin; + if (box.wrap) { + box.name = utils_default.wrapLabel(box.name, totalWidth - 2 * conf.wrapPadding, textFont); + } + const boxMsgDimensions = utils_default.calculateTextDimensions(box.name, textFont); + maxBoxHeight = common_default.getMax(boxMsgDimensions.height, maxBoxHeight); + const minWidth = common_default.getMax(totalWidth, boxMsgDimensions.width + 2 * conf.wrapPadding); + box.margin = conf.boxTextMargin; + if (totalWidth < minWidth) { + const missing = (minWidth - totalWidth) / 2; + box.margin += missing; + } + }); + boxes.forEach((box) => box.textMaxHeight = maxBoxHeight); + return common_default.getMax(maxHeight, conf.height); +} +__name(calculateActorMargins, "calculateActorMargins"); +var buildNoteModel = /* @__PURE__ */ __name(async function(msg, actors, diagObj) { + const fromActor = actors.get(msg.from); + const toActor = actors.get(msg.to); + const startx = fromActor.x; + const stopx = toActor.x; + const shouldWrap = msg.wrap && msg.message; + let textDimensions = hasKatex(msg.message) ? await calculateMathMLDimensions(msg.message, getConfig2()) : utils_default.calculateTextDimensions( + shouldWrap ? utils_default.wrapLabel(msg.message, conf.width, noteFont(conf)) : msg.message, + noteFont(conf) + ); + const noteModel = { + width: shouldWrap ? conf.width : common_default.getMax(conf.width, textDimensions.width + 2 * conf.noteMargin), + height: 0, + startx: fromActor.x, + stopx: 0, + starty: 0, + stopy: 0, + message: msg.message + }; + if (msg.placement === diagObj.db.PLACEMENT.RIGHTOF) { + noteModel.width = shouldWrap ? common_default.getMax(conf.width, textDimensions.width) : common_default.getMax( + fromActor.width / 2 + toActor.width / 2, + textDimensions.width + 2 * conf.noteMargin + ); + noteModel.startx = startx + (fromActor.width + conf.actorMargin) / 2; + } else if (msg.placement === diagObj.db.PLACEMENT.LEFTOF) { + noteModel.width = shouldWrap ? common_default.getMax(conf.width, textDimensions.width + 2 * conf.noteMargin) : common_default.getMax( + fromActor.width / 2 + toActor.width / 2, + textDimensions.width + 2 * conf.noteMargin + ); + noteModel.startx = startx - noteModel.width + (fromActor.width - conf.actorMargin) / 2; + } else if (msg.to === msg.from) { + textDimensions = utils_default.calculateTextDimensions( + shouldWrap ? utils_default.wrapLabel(msg.message, common_default.getMax(conf.width, fromActor.width), noteFont(conf)) : msg.message, + noteFont(conf) + ); + noteModel.width = shouldWrap ? common_default.getMax(conf.width, fromActor.width) : common_default.getMax(fromActor.width, conf.width, textDimensions.width + 2 * conf.noteMargin); + noteModel.startx = startx + (fromActor.width - noteModel.width) / 2; + } else { + noteModel.width = Math.abs(startx + fromActor.width / 2 - (stopx + toActor.width / 2)) + conf.actorMargin; + noteModel.startx = startx < stopx ? startx + fromActor.width / 2 - conf.actorMargin / 2 : stopx + toActor.width / 2 - conf.actorMargin / 2; + } + if (shouldWrap) { + noteModel.message = utils_default.wrapLabel( + msg.message, + noteModel.width - 2 * conf.wrapPadding, + noteFont(conf) + ); + } + log.debug( + `NM:[${noteModel.startx},${noteModel.stopx},${noteModel.starty},${noteModel.stopy}:${noteModel.width},${noteModel.height}=${msg.message}]` + ); + return noteModel; +}, "buildNoteModel"); +var buildMessageModel = /* @__PURE__ */ __name(function(msg, actors, diagObj) { + if (![ + diagObj.db.LINETYPE.SOLID_OPEN, + diagObj.db.LINETYPE.DOTTED_OPEN, + diagObj.db.LINETYPE.SOLID, + diagObj.db.LINETYPE.DOTTED, + diagObj.db.LINETYPE.SOLID_CROSS, + diagObj.db.LINETYPE.DOTTED_CROSS, + diagObj.db.LINETYPE.SOLID_POINT, + diagObj.db.LINETYPE.DOTTED_POINT, + diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID, + diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED + ].includes(msg.type)) { + return {}; + } + const [fromLeft, fromRight] = activationBounds(msg.from, actors); + const [toLeft, toRight] = activationBounds(msg.to, actors); + const isArrowToRight = fromLeft <= toLeft; + let startx = isArrowToRight ? fromRight : fromLeft; + let stopx = isArrowToRight ? toLeft : toRight; + const isArrowToActivation = Math.abs(toLeft - toRight) > 2; + const adjustValue = /* @__PURE__ */ __name((value) => { + return isArrowToRight ? -value : value; + }, "adjustValue"); + if (msg.from === msg.to) { + stopx = startx; + } else { + if (msg.activate && !isArrowToActivation) { + stopx += adjustValue(conf.activationWidth / 2 - 1); + } + if (![diagObj.db.LINETYPE.SOLID_OPEN, diagObj.db.LINETYPE.DOTTED_OPEN].includes(msg.type)) { + stopx += adjustValue(3); + } + if ([diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID, diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes( + msg.type + )) { + startx -= adjustValue(3); + } + } + const allBounds = [fromLeft, fromRight, toLeft, toRight]; + const boundedWidth = Math.abs(startx - stopx); + if (msg.wrap && msg.message) { + msg.message = utils_default.wrapLabel( + msg.message, + common_default.getMax(boundedWidth + 2 * conf.wrapPadding, conf.width), + messageFont(conf) + ); + } + const msgDims = utils_default.calculateTextDimensions(msg.message, messageFont(conf)); + return { + width: common_default.getMax( + msg.wrap ? 0 : msgDims.width + 2 * conf.wrapPadding, + boundedWidth + 2 * conf.wrapPadding, + conf.width + ), + height: 0, + startx, + stopx, + starty: 0, + stopy: 0, + message: msg.message, + type: msg.type, + wrap: msg.wrap, + fromBounds: Math.min.apply(null, allBounds), + toBounds: Math.max.apply(null, allBounds) + }; +}, "buildMessageModel"); +var calculateLoopBounds = /* @__PURE__ */ __name(async function(messages, actors, _maxWidthPerActor, diagObj) { + const loops = {}; + const stack = []; + let current, noteModel, msgModel; + for (const msg of messages) { + switch (msg.type) { + case diagObj.db.LINETYPE.LOOP_START: + case diagObj.db.LINETYPE.ALT_START: + case diagObj.db.LINETYPE.OPT_START: + case diagObj.db.LINETYPE.PAR_START: + case diagObj.db.LINETYPE.PAR_OVER_START: + case diagObj.db.LINETYPE.CRITICAL_START: + case diagObj.db.LINETYPE.BREAK_START: + stack.push({ + id: msg.id, + msg: msg.message, + from: Number.MAX_SAFE_INTEGER, + to: Number.MIN_SAFE_INTEGER, + width: 0 + }); + break; + case diagObj.db.LINETYPE.ALT_ELSE: + case diagObj.db.LINETYPE.PAR_AND: + case diagObj.db.LINETYPE.CRITICAL_OPTION: + if (msg.message) { + current = stack.pop(); + loops[current.id] = current; + loops[msg.id] = current; + stack.push(current); + } + break; + case diagObj.db.LINETYPE.LOOP_END: + case diagObj.db.LINETYPE.ALT_END: + case diagObj.db.LINETYPE.OPT_END: + case diagObj.db.LINETYPE.PAR_END: + case diagObj.db.LINETYPE.CRITICAL_END: + case diagObj.db.LINETYPE.BREAK_END: + current = stack.pop(); + loops[current.id] = current; + break; + case diagObj.db.LINETYPE.ACTIVE_START: + { + const actorRect = actors.get(msg.from ? msg.from : msg.to.actor); + const stackedSize = actorActivations(msg.from ? msg.from : msg.to.actor).length; + const x = actorRect.x + actorRect.width / 2 + (stackedSize - 1) * conf.activationWidth / 2; + const toAdd = { + startx: x, + stopx: x + conf.activationWidth, + actor: msg.from, + enabled: true + }; + bounds.activations.push(toAdd); + } + break; + case diagObj.db.LINETYPE.ACTIVE_END: + { + const lastActorActivationIdx = bounds.activations.map((a) => a.actor).lastIndexOf(msg.from); + bounds.activations.splice(lastActorActivationIdx, 1).splice(0, 1); + } + break; + } + const isNote = msg.placement !== void 0; + if (isNote) { + noteModel = await buildNoteModel(msg, actors, diagObj); + msg.noteModel = noteModel; + stack.forEach((stk) => { + current = stk; + current.from = common_default.getMin(current.from, noteModel.startx); + current.to = common_default.getMax(current.to, noteModel.startx + noteModel.width); + current.width = common_default.getMax(current.width, Math.abs(current.from - current.to)) - conf.labelBoxWidth; + }); + } else { + msgModel = buildMessageModel(msg, actors, diagObj); + msg.msgModel = msgModel; + if (msgModel.startx && msgModel.stopx && stack.length > 0) { + stack.forEach((stk) => { + current = stk; + if (msgModel.startx === msgModel.stopx) { + const from = actors.get(msg.from); + const to = actors.get(msg.to); + current.from = common_default.getMin( + from.x - msgModel.width / 2, + from.x - from.width / 2, + current.from + ); + current.to = common_default.getMax( + to.x + msgModel.width / 2, + to.x + from.width / 2, + current.to + ); + current.width = common_default.getMax(current.width, Math.abs(current.to - current.from)) - conf.labelBoxWidth; + } else { + current.from = common_default.getMin(msgModel.startx, current.from); + current.to = common_default.getMax(msgModel.stopx, current.to); + current.width = common_default.getMax(current.width, msgModel.width) - conf.labelBoxWidth; + } + }); + } + } + } + bounds.activations = []; + log.debug("Loop type widths:", loops); + return loops; +}, "calculateLoopBounds"); +var sequenceRenderer_default = { + bounds, + drawActors, + drawActorsPopup, + setConf, + draw +}; + +// src/diagrams/sequence/sequenceDiagram.ts +var diagram = { + parser: sequenceDiagram_default, + get db() { + return new SequenceDB(); + }, + renderer: sequenceRenderer_default, + styles: styles_default, + init: /* @__PURE__ */ __name((cnf) => { + if (!cnf.sequence) { + cnf.sequence = {}; + } + if (cnf.wrap) { + cnf.sequence.wrap = cnf.wrap; + setConfig({ sequence: { wrap: cnf.wrap } }); + } + }, "init") +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/sequenceDiagram-WL72ISMW.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/sequenceDiagram-WL72ISMW.mjs.map new file mode 100644 index 0000000..19b244e --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/sequenceDiagram-WL72ISMW.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/sequence/parser/sequenceDiagram.jison", "../../../src/diagrams/sequence/sequenceDb.ts", "../../../src/diagrams/sequence/styles.js", "../../../src/diagrams/sequence/sequenceRenderer.ts", "../../../src/diagrams/sequence/svgDraw.js", "../../../src/diagrams/sequence/sequenceDiagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,3],$V2=[1,4],$V3=[2,4],$V4=[1,9],$V5=[1,11],$V6=[1,13],$V7=[1,14],$V8=[1,16],$V9=[1,17],$Va=[1,18],$Vb=[1,24],$Vc=[1,25],$Vd=[1,26],$Ve=[1,27],$Vf=[1,28],$Vg=[1,29],$Vh=[1,30],$Vi=[1,31],$Vj=[1,32],$Vk=[1,33],$Vl=[1,34],$Vm=[1,35],$Vn=[1,36],$Vo=[1,37],$Vp=[1,38],$Vq=[1,39],$Vr=[1,41],$Vs=[1,42],$Vt=[1,43],$Vu=[1,44],$Vv=[1,45],$Vw=[1,46],$Vx=[1,4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,48,49,50,52,53,55,60,61,62,63,71],$Vy=[2,71],$Vz=[4,5,16,50,52,53],$VA=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,55,60,61,62,63,71],$VB=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,49,50,52,53,55,60,61,62,63,71],$VC=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,48,50,52,53,55,60,61,62,63,71],$VD=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,50,52,53,55,60,61,62,63,71],$VE=[69,70,71],$VF=[1,127];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"SPACE\":4,\"NEWLINE\":5,\"SD\":6,\"document\":7,\"line\":8,\"statement\":9,\"box_section\":10,\"box_line\":11,\"participant_statement\":12,\"create\":13,\"box\":14,\"restOfLine\":15,\"end\":16,\"signal\":17,\"autonumber\":18,\"NUM\":19,\"off\":20,\"activate\":21,\"actor\":22,\"deactivate\":23,\"note_statement\":24,\"links_statement\":25,\"link_statement\":26,\"properties_statement\":27,\"details_statement\":28,\"title\":29,\"legacy_title\":30,\"acc_title\":31,\"acc_title_value\":32,\"acc_descr\":33,\"acc_descr_value\":34,\"acc_descr_multiline_value\":35,\"loop\":36,\"rect\":37,\"opt\":38,\"alt\":39,\"else_sections\":40,\"par\":41,\"par_sections\":42,\"par_over\":43,\"critical\":44,\"option_sections\":45,\"break\":46,\"option\":47,\"and\":48,\"else\":49,\"participant\":50,\"AS\":51,\"participant_actor\":52,\"destroy\":53,\"actor_with_config\":54,\"note\":55,\"placement\":56,\"text2\":57,\"over\":58,\"actor_pair\":59,\"links\":60,\"link\":61,\"properties\":62,\"details\":63,\"spaceList\":64,\",\":65,\"left_of\":66,\"right_of\":67,\"signaltype\":68,\"+\":69,\"-\":70,\"ACTOR\":71,\"config_object\":72,\"CONFIG_START\":73,\"CONFIG_CONTENT\":74,\"CONFIG_END\":75,\"SOLID_OPEN_ARROW\":76,\"DOTTED_OPEN_ARROW\":77,\"SOLID_ARROW\":78,\"BIDIRECTIONAL_SOLID_ARROW\":79,\"DOTTED_ARROW\":80,\"BIDIRECTIONAL_DOTTED_ARROW\":81,\"SOLID_CROSS\":82,\"DOTTED_CROSS\":83,\"SOLID_POINT\":84,\"DOTTED_POINT\":85,\"TXT\":86,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"SPACE\",5:\"NEWLINE\",6:\"SD\",13:\"create\",14:\"box\",15:\"restOfLine\",16:\"end\",18:\"autonumber\",19:\"NUM\",20:\"off\",21:\"activate\",23:\"deactivate\",29:\"title\",30:\"legacy_title\",31:\"acc_title\",32:\"acc_title_value\",33:\"acc_descr\",34:\"acc_descr_value\",35:\"acc_descr_multiline_value\",36:\"loop\",37:\"rect\",38:\"opt\",39:\"alt\",41:\"par\",43:\"par_over\",44:\"critical\",46:\"break\",47:\"option\",48:\"and\",49:\"else\",50:\"participant\",51:\"AS\",52:\"participant_actor\",53:\"destroy\",55:\"note\",58:\"over\",60:\"links\",61:\"link\",62:\"properties\",63:\"details\",65:\",\",66:\"left_of\",67:\"right_of\",69:\"+\",70:\"-\",71:\"ACTOR\",73:\"CONFIG_START\",74:\"CONFIG_CONTENT\",75:\"CONFIG_END\",76:\"SOLID_OPEN_ARROW\",77:\"DOTTED_OPEN_ARROW\",78:\"SOLID_ARROW\",79:\"BIDIRECTIONAL_SOLID_ARROW\",80:\"DOTTED_ARROW\",81:\"BIDIRECTIONAL_DOTTED_ARROW\",82:\"SOLID_CROSS\",83:\"DOTTED_CROSS\",84:\"SOLID_POINT\",85:\"DOTTED_POINT\",86:\"TXT\"},\nproductions_: [0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[10,0],[10,2],[11,2],[11,1],[11,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[45,1],[45,4],[42,1],[42,4],[40,1],[40,4],[12,5],[12,3],[12,5],[12,3],[12,3],[12,3],[24,4],[24,4],[25,3],[26,3],[27,3],[28,3],[64,2],[64,1],[59,3],[59,1],[56,1],[56,1],[17,5],[17,5],[17,4],[54,2],[72,3],[22,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[57,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 3:\n yy.apply($$[$0]);return $$[$0]; \nbreak;\ncase 4: case 9:\n this.$ = [] \nbreak;\ncase 5: case 10:\n$$[$0-1].push($$[$0]);this.$ = $$[$0-1]\nbreak;\ncase 6: case 7: case 11: case 12:\n this.$ = $$[$0] \nbreak;\ncase 8: case 13:\n this.$=[]; \nbreak;\ncase 15:\n$$[$0].type='createParticipant'; this.$=$$[$0];\nbreak;\ncase 16:\n\n\t\t$$[$0-1].unshift({type: 'boxStart', boxData:yy.parseBoxData($$[$0-2]) });\n\t\t$$[$0-1].push({type: 'boxEnd', boxText:$$[$0-2]});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 18:\n this.$= {type:'sequenceIndex',sequenceIndex: Number($$[$0-2]), sequenceIndexStep:Number($$[$0-1]), sequenceVisible:true, signalType:yy.LINETYPE.AUTONUMBER};\nbreak;\ncase 19:\n this.$ = {type:'sequenceIndex',sequenceIndex: Number($$[$0-1]), sequenceIndexStep:1, sequenceVisible:true, signalType:yy.LINETYPE.AUTONUMBER};\nbreak;\ncase 20:\n this.$ = {type:'sequenceIndex', sequenceVisible:false, signalType:yy.LINETYPE.AUTONUMBER};\nbreak;\ncase 21:\nthis.$ = {type:'sequenceIndex', sequenceVisible:true, signalType:yy.LINETYPE.AUTONUMBER}; \nbreak;\ncase 22:\nthis.$={type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1].actor};\nbreak;\ncase 23:\nthis.$={type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-1].actor};\nbreak;\ncase 29:\nyy.setDiagramTitle($$[$0].substring(6));this.$=$$[$0].substring(6);\nbreak;\ncase 30:\nyy.setDiagramTitle($$[$0].substring(7));this.$=$$[$0].substring(7);\nbreak;\ncase 31:\n this.$=$$[$0].trim();yy.setAccTitle(this.$); \nbreak;\ncase 32: case 33:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 34:\n\n\t\t$$[$0-1].unshift({type: 'loopStart', loopText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.LOOP_START});\n\t\t$$[$0-1].push({type: 'loopEnd', loopText:$$[$0-2], signalType: yy.LINETYPE.LOOP_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 35:\n\n\t\t$$[$0-1].unshift({type: 'rectStart', color:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.RECT_START });\n\t\t$$[$0-1].push({type: 'rectEnd', color:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.RECT_END });\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 36:\n\n\t\t$$[$0-1].unshift({type: 'optStart', optText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.OPT_START});\n\t\t$$[$0-1].push({type: 'optEnd', optText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.OPT_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 37:\n\n\t\t// Alt start\n\t\t$$[$0-1].unshift({type: 'altStart', altText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.ALT_START});\n\t\t// Content in alt is already in $$[$0-1]\n\t\t// End\n\t\t$$[$0-1].push({type: 'altEnd', signalType: yy.LINETYPE.ALT_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 38:\n\n\t\t// Parallel start\n\t\t$$[$0-1].unshift({type: 'parStart', parText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.PAR_START});\n\t\t// Content in par is already in $$[$0-1]\n\t\t// End\n\t\t$$[$0-1].push({type: 'parEnd', signalType: yy.LINETYPE.PAR_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 39:\n\n\t\t// Parallel (overlapped) start\n\t\t$$[$0-1].unshift({type: 'parStart', parText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.PAR_OVER_START});\n\t\t// Content in par is already in $$[$0-1]\n\t\t// End\n\t\t$$[$0-1].push({type: 'parEnd', signalType: yy.LINETYPE.PAR_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 40:\n\n\t\t// critical start\n\t\t$$[$0-1].unshift({type: 'criticalStart', criticalText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.CRITICAL_START});\n\t\t// Content in critical is already in $$[$0-1]\n\t\t// critical end\n\t\t$$[$0-1].push({type: 'criticalEnd', signalType: yy.LINETYPE.CRITICAL_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 41:\n\n\t\t$$[$0-1].unshift({type: 'breakStart', breakText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.BREAK_START});\n\t\t$$[$0-1].push({type: 'breakEnd', optText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.BREAK_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 43:\n this.$ = $$[$0-3].concat([{type: 'option', optionText:yy.parseMessage($$[$0-1]), signalType: yy.LINETYPE.CRITICAL_OPTION}, $$[$0]]); \nbreak;\ncase 45:\n this.$ = $$[$0-3].concat([{type: 'and', parText:yy.parseMessage($$[$0-1]), signalType: yy.LINETYPE.PAR_AND}, $$[$0]]); \nbreak;\ncase 47:\n this.$ = $$[$0-3].concat([{type: 'else', altText:yy.parseMessage($$[$0-1]), signalType: yy.LINETYPE.ALT_ELSE}, $$[$0]]); \nbreak;\ncase 48:\n$$[$0-3].draw='participant'; $$[$0-3].type='addParticipant';$$[$0-3].description=yy.parseMessage($$[$0-1]); this.$=$$[$0-3];\nbreak;\ncase 49:\n$$[$0-1].draw='participant'; $$[$0-1].type='addParticipant';this.$=$$[$0-1];\nbreak;\ncase 50:\n$$[$0-3].draw='actor'; $$[$0-3].type='addParticipant';$$[$0-3].description=yy.parseMessage($$[$0-1]); this.$=$$[$0-3];\nbreak;\ncase 51:\n$$[$0-1].draw='actor'; $$[$0-1].type='addParticipant'; this.$=$$[$0-1];\nbreak;\ncase 52:\n$$[$0-1].type='destroyParticipant'; this.$=$$[$0-1];\nbreak;\ncase 53:\n$$[$0-1].draw='participant'; $$[$0-1].type='addParticipant'; this.$=$$[$0-1];\nbreak;\ncase 54:\n\n\t\tthis.$ = [$$[$0-1], {type:'addNote', placement:$$[$0-2], actor:$$[$0-1].actor, text:$$[$0]}];\nbreak;\ncase 55:\n\n\t\t// Coerce actor_pair into a [to, from, ...] array\n\t\t$$[$0-2] = [].concat($$[$0-1], $$[$0-1]).slice(0, 2);\n\t\t$$[$0-2][0] = $$[$0-2][0].actor;\n\t\t$$[$0-2][1] = $$[$0-2][1].actor;\n\t\tthis.$ = [$$[$0-1], {type:'addNote', placement:yy.PLACEMENT.OVER, actor:$$[$0-2].slice(0, 2), text:$$[$0]}];\nbreak;\ncase 56:\n\n\t\tthis.$ = [$$[$0-1], {type:'addLinks', actor:$$[$0-1].actor, text:$$[$0]}];\n \nbreak;\ncase 57:\n\n\t\tthis.$ = [$$[$0-1], {type:'addALink', actor:$$[$0-1].actor, text:$$[$0]}];\n \nbreak;\ncase 58:\n\n\t\tthis.$ = [$$[$0-1], {type:'addProperties', actor:$$[$0-1].actor, text:$$[$0]}];\n \nbreak;\ncase 59:\n\n\t\tthis.$ = [$$[$0-1], {type:'addDetails', actor:$$[$0-1].actor, text:$$[$0]}];\n \nbreak;\ncase 62:\n this.$ = [$$[$0-2], $$[$0]]; \nbreak;\ncase 63:\n this.$ = $$[$0]; \nbreak;\ncase 64:\n this.$ = yy.PLACEMENT.LEFTOF; \nbreak;\ncase 65:\n this.$ = yy.PLACEMENT.RIGHTOF; \nbreak;\ncase 66:\n this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0], activate: true},\n\t {type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1].actor}\n\t ]\nbreak;\ncase 67:\n this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},\n\t {type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-4].actor}\n\t ]\nbreak;\ncase 68:\n this.$ = [$$[$0-3],$$[$0-1],{type: 'addMessage', from:$$[$0-3].actor, to:$$[$0-1].actor, signalType:$$[$0-2], msg:$$[$0]}]\nbreak;\ncase 69:\n\n this.$ = {\n type: 'addParticipant',\n actor: $$[$0-1],\n config: $$[$0]\n };\n \nbreak;\ncase 70:\n\n this.$ = $$[$0-1].trim();\n \nbreak;\ncase 71:\nthis.$={ type: 'addParticipant', actor:$$[$0]}\nbreak;\ncase 72:\n this.$ = yy.LINETYPE.SOLID_OPEN; \nbreak;\ncase 73:\n this.$ = yy.LINETYPE.DOTTED_OPEN; \nbreak;\ncase 74:\n this.$ = yy.LINETYPE.SOLID; \nbreak;\ncase 75:\n this.$ = yy.LINETYPE.BIDIRECTIONAL_SOLID; \nbreak;\ncase 76:\n this.$ = yy.LINETYPE.DOTTED; \nbreak;\ncase 77:\n this.$ = yy.LINETYPE.BIDIRECTIONAL_DOTTED; \nbreak;\ncase 78:\n this.$ = yy.LINETYPE.SOLID_CROSS; \nbreak;\ncase 79:\n this.$ = yy.LINETYPE.DOTTED_CROSS; \nbreak;\ncase 80:\n this.$ = yy.LINETYPE.SOLID_POINT; \nbreak;\ncase 81:\n this.$ = yy.LINETYPE.DOTTED_POINT; \nbreak;\ncase 82:\nthis.$ = yy.parseMessage($$[$0].trim().substring(1)) \nbreak;\n}\n},\ntable: [{3:1,4:$V0,5:$V1,6:$V2},{1:[3]},{3:5,4:$V0,5:$V1,6:$V2},{3:6,4:$V0,5:$V1,6:$V2},o([1,4,5,13,14,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,55,60,61,62,63,71],$V3,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:$V4,5:$V5,8:8,9:10,12:12,13:$V6,14:$V7,17:15,18:$V8,21:$V9,22:40,23:$Va,24:19,25:20,26:21,27:22,28:23,29:$Vb,30:$Vc,31:$Vd,33:$Ve,35:$Vf,36:$Vg,37:$Vh,38:$Vi,39:$Vj,41:$Vk,43:$Vl,44:$Vm,46:$Vn,50:$Vo,52:$Vp,53:$Vq,55:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,71:$Vw},o($Vx,[2,5]),{9:47,12:12,13:$V6,14:$V7,17:15,18:$V8,21:$V9,22:40,23:$Va,24:19,25:20,26:21,27:22,28:23,29:$Vb,30:$Vc,31:$Vd,33:$Ve,35:$Vf,36:$Vg,37:$Vh,38:$Vi,39:$Vj,41:$Vk,43:$Vl,44:$Vm,46:$Vn,50:$Vo,52:$Vp,53:$Vq,55:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,71:$Vw},o($Vx,[2,7]),o($Vx,[2,8]),o($Vx,[2,14]),{12:48,50:$Vo,52:$Vp,53:$Vq},{15:[1,49]},{5:[1,50]},{5:[1,53],19:[1,51],20:[1,52]},{22:54,71:$Vw},{22:55,71:$Vw},{5:[1,56]},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},o($Vx,[2,29]),o($Vx,[2,30]),{32:[1,61]},{34:[1,62]},o($Vx,[2,33]),{15:[1,63]},{15:[1,64]},{15:[1,65]},{15:[1,66]},{15:[1,67]},{15:[1,68]},{15:[1,69]},{15:[1,70]},{22:71,54:72,71:[1,73]},{22:74,71:$Vw},{22:75,71:$Vw},{68:76,76:[1,77],77:[1,78],78:[1,79],79:[1,80],80:[1,81],81:[1,82],82:[1,83],83:[1,84],84:[1,85],85:[1,86]},{56:87,58:[1,88],66:[1,89],67:[1,90]},{22:91,71:$Vw},{22:92,71:$Vw},{22:93,71:$Vw},{22:94,71:$Vw},o([5,51,65,76,77,78,79,80,81,82,83,84,85,86],$Vy),o($Vx,[2,6]),o($Vx,[2,15]),o($Vz,[2,9],{10:95}),o($Vx,[2,17]),{5:[1,97],19:[1,96]},{5:[1,98]},o($Vx,[2,21]),{5:[1,99]},{5:[1,100]},o($Vx,[2,24]),o($Vx,[2,25]),o($Vx,[2,26]),o($Vx,[2,27]),o($Vx,[2,28]),o($Vx,[2,31]),o($Vx,[2,32]),o($VA,$V3,{7:101}),o($VA,$V3,{7:102}),o($VA,$V3,{7:103}),o($VB,$V3,{40:104,7:105}),o($VC,$V3,{42:106,7:107}),o($VC,$V3,{7:107,42:108}),o($VD,$V3,{45:109,7:110}),o($VA,$V3,{7:111}),{5:[1,113],51:[1,112]},{5:[1,114]},o([5,51],$Vy,{72:115,73:[1,116]}),{5:[1,118],51:[1,117]},{5:[1,119]},{22:122,69:[1,120],70:[1,121],71:$Vw},o($VE,[2,72]),o($VE,[2,73]),o($VE,[2,74]),o($VE,[2,75]),o($VE,[2,76]),o($VE,[2,77]),o($VE,[2,78]),o($VE,[2,79]),o($VE,[2,80]),o($VE,[2,81]),{22:123,71:$Vw},{22:125,59:124,71:$Vw},{71:[2,64]},{71:[2,65]},{57:126,86:$VF},{57:128,86:$VF},{57:129,86:$VF},{57:130,86:$VF},{4:[1,133],5:[1,135],11:132,12:134,16:[1,131],50:$Vo,52:$Vp,53:$Vq},{5:[1,136]},o($Vx,[2,19]),o($Vx,[2,20]),o($Vx,[2,22]),o($Vx,[2,23]),{4:$V4,5:$V5,8:8,9:10,12:12,13:$V6,14:$V7,16:[1,137],17:15,18:$V8,21:$V9,22:40,23:$Va,24:19,25:20,26:21,27:22,28:23,29:$Vb,30:$Vc,31:$Vd,33:$Ve,35:$Vf,36:$Vg,37:$Vh,38:$Vi,39:$Vj,41:$Vk,43:$Vl,44:$Vm,46:$Vn,50:$Vo,52:$Vp,53:$Vq,55:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,71:$Vw},{4:$V4,5:$V5,8:8,9:10,12:12,13:$V6,14:$V7,16:[1,138],17:15,18:$V8,21:$V9,22:40,23:$Va,24:19,25:20,26:21,27:22,28:23,29:$Vb,30:$Vc,31:$Vd,33:$Ve,35:$Vf,36:$Vg,37:$Vh,38:$Vi,39:$Vj,41:$Vk,43:$Vl,44:$Vm,46:$Vn,50:$Vo,52:$Vp,53:$Vq,55:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,71:$Vw},{4:$V4,5:$V5,8:8,9:10,12:12,13:$V6,14:$V7,16:[1,139],17:15,18:$V8,21:$V9,22:40,23:$Va,24:19,25:20,26:21,27:22,28:23,29:$Vb,30:$Vc,31:$Vd,33:$Ve,35:$Vf,36:$Vg,37:$Vh,38:$Vi,39:$Vj,41:$Vk,43:$Vl,44:$Vm,46:$Vn,50:$Vo,52:$Vp,53:$Vq,55:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,71:$Vw},{16:[1,140]},{4:$V4,5:$V5,8:8,9:10,12:12,13:$V6,14:$V7,16:[2,46],17:15,18:$V8,21:$V9,22:40,23:$Va,24:19,25:20,26:21,27:22,28:23,29:$Vb,30:$Vc,31:$Vd,33:$Ve,35:$Vf,36:$Vg,37:$Vh,38:$Vi,39:$Vj,41:$Vk,43:$Vl,44:$Vm,46:$Vn,49:[1,141],50:$Vo,52:$Vp,53:$Vq,55:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,71:$Vw},{16:[1,142]},{4:$V4,5:$V5,8:8,9:10,12:12,13:$V6,14:$V7,16:[2,44],17:15,18:$V8,21:$V9,22:40,23:$Va,24:19,25:20,26:21,27:22,28:23,29:$Vb,30:$Vc,31:$Vd,33:$Ve,35:$Vf,36:$Vg,37:$Vh,38:$Vi,39:$Vj,41:$Vk,43:$Vl,44:$Vm,46:$Vn,48:[1,143],50:$Vo,52:$Vp,53:$Vq,55:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,71:$Vw},{16:[1,144]},{16:[1,145]},{4:$V4,5:$V5,8:8,9:10,12:12,13:$V6,14:$V7,16:[2,42],17:15,18:$V8,21:$V9,22:40,23:$Va,24:19,25:20,26:21,27:22,28:23,29:$Vb,30:$Vc,31:$Vd,33:$Ve,35:$Vf,36:$Vg,37:$Vh,38:$Vi,39:$Vj,41:$Vk,43:$Vl,44:$Vm,46:$Vn,47:[1,146],50:$Vo,52:$Vp,53:$Vq,55:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,71:$Vw},{4:$V4,5:$V5,8:8,9:10,12:12,13:$V6,14:$V7,16:[1,147],17:15,18:$V8,21:$V9,22:40,23:$Va,24:19,25:20,26:21,27:22,28:23,29:$Vb,30:$Vc,31:$Vd,33:$Ve,35:$Vf,36:$Vg,37:$Vh,38:$Vi,39:$Vj,41:$Vk,43:$Vl,44:$Vm,46:$Vn,50:$Vo,52:$Vp,53:$Vq,55:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,71:$Vw},{15:[1,148]},o($Vx,[2,49]),o($Vx,[2,53]),{5:[2,69]},{74:[1,149]},{15:[1,150]},o($Vx,[2,51]),o($Vx,[2,52]),{22:151,71:$Vw},{22:152,71:$Vw},{57:153,86:$VF},{57:154,86:$VF},{57:155,86:$VF},{65:[1,156],86:[2,63]},{5:[2,56]},{5:[2,82]},{5:[2,57]},{5:[2,58]},{5:[2,59]},o($Vx,[2,16]),o($Vz,[2,10]),{12:157,50:$Vo,52:$Vp,53:$Vq},o($Vz,[2,12]),o($Vz,[2,13]),o($Vx,[2,18]),o($Vx,[2,34]),o($Vx,[2,35]),o($Vx,[2,36]),o($Vx,[2,37]),{15:[1,158]},o($Vx,[2,38]),{15:[1,159]},o($Vx,[2,39]),o($Vx,[2,40]),{15:[1,160]},o($Vx,[2,41]),{5:[1,161]},{75:[1,162]},{5:[1,163]},{57:164,86:$VF},{57:165,86:$VF},{5:[2,68]},{5:[2,54]},{5:[2,55]},{22:166,71:$Vw},o($Vz,[2,11]),o($VB,$V3,{7:105,40:167}),o($VC,$V3,{7:107,42:168}),o($VD,$V3,{7:110,45:169}),o($Vx,[2,48]),{5:[2,70]},o($Vx,[2,50]),{5:[2,66]},{5:[2,67]},{86:[2,62]},{16:[2,47]},{16:[2,45]},{16:[2,43]}],\ndefaultActions: {5:[2,1],6:[2,2],89:[2,64],90:[2,65],115:[2,69],126:[2,56],127:[2,82],128:[2,57],129:[2,58],130:[2,59],153:[2,68],154:[2,54],155:[2,55],162:[2,70],164:[2,66],165:[2,67],166:[2,62],167:[2,47],168:[2,45],169:[2,43]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 5;\nbreak;\ncase 1:/* skip all whitespace */\nbreak;\ncase 2:/* skip same-line whitespace */\nbreak;\ncase 3:/* skip comments */\nbreak;\ncase 4:/* skip comments */\nbreak;\ncase 5:/* skip comments */\nbreak;\ncase 6:return 19;\nbreak;\ncase 7: this.begin('CONFIG'); return 73; \nbreak;\ncase 8: return 74; \nbreak;\ncase 9: this.popState(); this.popState(); return 75; \nbreak;\ncase 10: yy_.yytext = yy_.yytext.trim(); return 71; \nbreak;\ncase 11: yy_.yytext = yy_.yytext.trim(); this.begin('ALIAS'); return 71; \nbreak;\ncase 12: this.begin('LINE'); return 14; \nbreak;\ncase 13: this.begin('ID'); return 50; \nbreak;\ncase 14: this.begin('ID'); return 52; \nbreak;\ncase 15:return 13;\nbreak;\ncase 16: this.begin('ID'); return 53; \nbreak;\ncase 17: yy_.yytext = yy_.yytext.trim(); this.begin('ALIAS'); return 71; \nbreak;\ncase 18: this.popState(); this.popState(); this.begin('LINE'); return 51; \nbreak;\ncase 19: this.popState(); this.popState(); return 5; \nbreak;\ncase 20: this.begin('LINE'); return 36; \nbreak;\ncase 21: this.begin('LINE'); return 37; \nbreak;\ncase 22: this.begin('LINE'); return 38; \nbreak;\ncase 23: this.begin('LINE'); return 39; \nbreak;\ncase 24: this.begin('LINE'); return 49; \nbreak;\ncase 25: this.begin('LINE'); return 41; \nbreak;\ncase 26: this.begin('LINE'); return 43; \nbreak;\ncase 27: this.begin('LINE'); return 48; \nbreak;\ncase 28: this.begin('LINE'); return 44; \nbreak;\ncase 29: this.begin('LINE'); return 47; \nbreak;\ncase 30: this.begin('LINE'); return 46; \nbreak;\ncase 31: this.popState(); return 15; \nbreak;\ncase 32:return 16;\nbreak;\ncase 33:return 66;\nbreak;\ncase 34:return 67;\nbreak;\ncase 35:return 60;\nbreak;\ncase 36:return 61;\nbreak;\ncase 37:return 62;\nbreak;\ncase 38:return 63;\nbreak;\ncase 39:return 58;\nbreak;\ncase 40:return 55;\nbreak;\ncase 41: this.begin('ID'); return 21; \nbreak;\ncase 42: this.begin('ID'); return 23; \nbreak;\ncase 43:return 29;\nbreak;\ncase 44:return 30;\nbreak;\ncase 45: this.begin(\"acc_title\");return 31; \nbreak;\ncase 46: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 47: this.begin(\"acc_descr\");return 33; \nbreak;\ncase 48: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 49: this.begin(\"acc_descr_multiline\");\nbreak;\ncase 50: this.popState(); \nbreak;\ncase 51:return \"acc_descr_multiline_value\";\nbreak;\ncase 52:return 6;\nbreak;\ncase 53:return 18;\nbreak;\ncase 54:return 20;\nbreak;\ncase 55:return 65;\nbreak;\ncase 56:return 5;\nbreak;\ncase 57: yy_.yytext = yy_.yytext.trim(); return 71; \nbreak;\ncase 58:return 78;\nbreak;\ncase 59:return 79;\nbreak;\ncase 60:return 80;\nbreak;\ncase 61:return 81;\nbreak;\ncase 62:return 76;\nbreak;\ncase 63:return 77;\nbreak;\ncase 64:return 82;\nbreak;\ncase 65:return 83;\nbreak;\ncase 66:return 84;\nbreak;\ncase 67:return 85;\nbreak;\ncase 68:return 86;\nbreak;\ncase 69:return 86;\nbreak;\ncase 70:return 69;\nbreak;\ncase 71:return 70;\nbreak;\ncase 72:return 5;\nbreak;\ncase 73:return 'INVALID';\nbreak;\n}\n},\nrules: [/^(?:[\\n]+)/i,/^(?:\\s+)/i,/^(?:((?!\\n)\\s)+)/i,/^(?:#[^\\n]*)/i,/^(?:%(?!\\{)[^\\n]*)/i,/^(?:[^\\}]%%[^\\n]*)/i,/^(?:[0-9]+(?=[ \\n]+))/i,/^(?:@\\{)/i,/^(?:[^\\}]+)/i,/^(?:\\})/i,/^(?:[^\\<->\\->:\\n,;@\\s]+(?=@\\{))/i,/^(?:[^\\<->\\->:\\n,;@]+?([\\-]*[^\\<->\\->:\\n,;@]+?)*?(?=((?!\\n)\\s)+as(?!\\n)\\s|[#\\n;]|$))/i,/^(?:box\\b)/i,/^(?:participant\\b)/i,/^(?:actor\\b)/i,/^(?:create\\b)/i,/^(?:destroy\\b)/i,/^(?:[^<\\->\\->:\\n,;]+?([\\-]*[^<\\->\\->:\\n,;]+?)*?(?=((?!\\n)\\s)+as(?!\\n)\\s|[#\\n;]|$))/i,/^(?:as\\b)/i,/^(?:(?:))/i,/^(?:loop\\b)/i,/^(?:rect\\b)/i,/^(?:opt\\b)/i,/^(?:alt\\b)/i,/^(?:else\\b)/i,/^(?:par\\b)/i,/^(?:par_over\\b)/i,/^(?:and\\b)/i,/^(?:critical\\b)/i,/^(?:option\\b)/i,/^(?:break\\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\\n;]*)/i,/^(?:end\\b)/i,/^(?:left of\\b)/i,/^(?:right of\\b)/i,/^(?:links\\b)/i,/^(?:link\\b)/i,/^(?:properties\\b)/i,/^(?:details\\b)/i,/^(?:over\\b)/i,/^(?:note\\b)/i,/^(?:activate\\b)/i,/^(?:deactivate\\b)/i,/^(?:title\\s[^#\\n;]+)/i,/^(?:title:\\s[^#\\n;]+)/i,/^(?:accTitle\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*\\{\\s*)/i,/^(?:[\\}])/i,/^(?:[^\\}]*)/i,/^(?:sequenceDiagram\\b)/i,/^(?:autonumber\\b)/i,/^(?:off\\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^+<\\->\\->:\\n,;]+((?!(-x|--x|-\\)|--\\)))[\\-]*[^\\+<\\->\\->:\\n,;]+)*)/i,/^(?:->>)/i,/^(?:<<->>)/i,/^(?:-->>)/i,/^(?:<<-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\\)])/i,/^(?:--[\\)])/i,/^(?::(?:(?:no)?wrap)?[^#\\n;]*)/i,/^(?::)/i,/^(?:\\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],\nconditions: {\"acc_descr_multiline\":{\"rules\":[50,51],\"inclusive\":false},\"acc_descr\":{\"rules\":[48],\"inclusive\":false},\"acc_title\":{\"rules\":[46],\"inclusive\":false},\"ID\":{\"rules\":[2,3,7,10,11,17],\"inclusive\":false},\"ALIAS\":{\"rules\":[2,3,18,19],\"inclusive\":false},\"LINE\":{\"rules\":[2,3,31],\"inclusive\":false},\"CONFIG\":{\"rules\":[8,9],\"inclusive\":false},\"CONFIG_DATA\":{\"rules\":[],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,3,4,5,6,12,13,14,15,16,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,47,49,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport * as yaml from 'js-yaml';\nimport type { DiagramDB } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { ImperativeState } from '../../utils/imperativeState.js';\nimport { sanitizeText } from '../common/common.js';\nimport {\n clear as commonClear,\n getAccDescription,\n getAccTitle,\n getDiagramTitle,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n} from '../common/commonDb.js';\nimport type { Actor, AddMessageParams, Box, Message, Note } from './types.js';\nimport type { ParticipantMetaData } from '../../types.js';\n\ninterface SequenceState {\n prevActor?: string;\n actors: Map;\n createdActors: Map;\n destroyedActors: Map;\n boxes: Box[];\n messages: Message[];\n notes: Note[];\n sequenceNumbersEnabled: boolean;\n wrapEnabled?: boolean;\n currentBox?: Box;\n lastCreated?: Actor;\n lastDestroyed?: Actor;\n}\n\nconst LINETYPE = {\n SOLID: 0,\n DOTTED: 1,\n NOTE: 2,\n SOLID_CROSS: 3,\n DOTTED_CROSS: 4,\n SOLID_OPEN: 5,\n DOTTED_OPEN: 6,\n LOOP_START: 10,\n LOOP_END: 11,\n ALT_START: 12,\n ALT_ELSE: 13,\n ALT_END: 14,\n OPT_START: 15,\n OPT_END: 16,\n ACTIVE_START: 17,\n ACTIVE_END: 18,\n PAR_START: 19,\n PAR_AND: 20,\n PAR_END: 21,\n RECT_START: 22,\n RECT_END: 23,\n SOLID_POINT: 24,\n DOTTED_POINT: 25,\n AUTONUMBER: 26,\n CRITICAL_START: 27,\n CRITICAL_OPTION: 28,\n CRITICAL_END: 29,\n BREAK_START: 30,\n BREAK_END: 31,\n PAR_OVER_START: 32,\n BIDIRECTIONAL_SOLID: 33,\n BIDIRECTIONAL_DOTTED: 34,\n} as const;\n\nconst ARROWTYPE = {\n FILLED: 0,\n OPEN: 1,\n} as const;\n\nconst PLACEMENT = {\n LEFTOF: 0,\n RIGHTOF: 1,\n OVER: 2,\n} as const;\n\nexport const PARTICIPANT_TYPE = {\n ACTOR: 'actor',\n BOUNDARY: 'boundary',\n COLLECTIONS: 'collections',\n CONTROL: 'control',\n DATABASE: 'database',\n ENTITY: 'entity',\n PARTICIPANT: 'participant',\n QUEUE: 'queue',\n} as const;\n\nexport class SequenceDB implements DiagramDB {\n private readonly state = new ImperativeState(() => ({\n prevActor: undefined,\n actors: new Map(),\n createdActors: new Map(),\n destroyedActors: new Map(),\n boxes: [],\n messages: [],\n notes: [],\n sequenceNumbersEnabled: false,\n wrapEnabled: undefined,\n currentBox: undefined,\n lastCreated: undefined,\n lastDestroyed: undefined,\n }));\n\n constructor() {\n // Needed for JISON since it only supports direct properties\n this.apply = this.apply.bind(this);\n this.parseBoxData = this.parseBoxData.bind(this);\n this.parseMessage = this.parseMessage.bind(this);\n\n this.clear();\n\n this.setWrap(getConfig().wrap);\n this.LINETYPE = LINETYPE;\n this.ARROWTYPE = ARROWTYPE;\n this.PLACEMENT = PLACEMENT;\n }\n\n public addBox(data: { text: string; color: string; wrap: boolean }) {\n this.state.records.boxes.push({\n name: data.text,\n wrap: data.wrap ?? this.autoWrap(),\n fill: data.color,\n actorKeys: [],\n });\n this.state.records.currentBox = this.state.records.boxes.slice(-1)[0];\n }\n\n public addActor(\n id: string,\n name: string,\n description: { text: string; wrap?: boolean | null; type: string },\n type: string,\n metadata?: any\n ) {\n let assignedBox = this.state.records.currentBox;\n let doc;\n if (metadata !== undefined) {\n let yamlData;\n // detect if shapeData contains a newline character\n if (!metadata.includes('\\n')) {\n yamlData = '{\\n' + metadata + '\\n}';\n } else {\n yamlData = metadata + '\\n';\n }\n doc = yaml.load(yamlData, { schema: yaml.JSON_SCHEMA }) as ParticipantMetaData;\n }\n type = doc?.type ?? type;\n const old = this.state.records.actors.get(id);\n if (old) {\n // If already set and trying to set to a new one throw error\n if (this.state.records.currentBox && old.box && this.state.records.currentBox !== old.box) {\n throw new Error(\n `A same participant should only be defined in one Box: ${old.name} can't be in '${old.box.name}' and in '${this.state.records.currentBox.name}' at the same time.`\n );\n }\n\n // Don't change the box if already\n assignedBox = old.box ? old.box : this.state.records.currentBox;\n old.box = assignedBox;\n\n // Don't allow description nulling\n if (old && name === old.name && description == null) {\n return;\n }\n }\n\n // Don't allow null descriptions, either\n if (description?.text == null) {\n description = { text: name, type };\n }\n if (type == null || description.text == null) {\n description = { text: name, type };\n }\n\n this.state.records.actors.set(id, {\n box: assignedBox,\n name: name,\n description: description.text,\n wrap: description.wrap ?? this.autoWrap(),\n prevActor: this.state.records.prevActor,\n links: {},\n properties: {},\n actorCnt: null,\n rectData: null,\n type: type ?? 'participant',\n });\n if (this.state.records.prevActor) {\n const prevActorInRecords = this.state.records.actors.get(this.state.records.prevActor);\n if (prevActorInRecords) {\n prevActorInRecords.nextActor = id;\n }\n }\n\n if (this.state.records.currentBox) {\n this.state.records.currentBox.actorKeys.push(id);\n }\n this.state.records.prevActor = id;\n }\n\n private activationCount(part: string) {\n let i;\n let count = 0;\n if (!part) {\n return 0;\n }\n for (i = 0; i < this.state.records.messages.length; i++) {\n if (\n this.state.records.messages[i].type === this.LINETYPE.ACTIVE_START &&\n this.state.records.messages[i].from === part\n ) {\n count++;\n }\n if (\n this.state.records.messages[i].type === this.LINETYPE.ACTIVE_END &&\n this.state.records.messages[i].from === part\n ) {\n count--;\n }\n }\n return count;\n }\n\n public addMessage(\n idFrom: Message['from'],\n idTo: Message['to'],\n message: { text: string; wrap?: boolean },\n answer: Message['answer']\n ) {\n this.state.records.messages.push({\n id: this.state.records.messages.length.toString(),\n from: idFrom,\n to: idTo,\n message: message.text,\n wrap: message.wrap ?? this.autoWrap(),\n answer: answer,\n });\n }\n\n public addSignal(\n idFrom?: Message['from'],\n idTo?: Message['to'],\n message?: { text: string; wrap: boolean },\n messageType?: number,\n activate = false\n ) {\n if (messageType === this.LINETYPE.ACTIVE_END) {\n const cnt = this.activationCount(idFrom ?? '');\n if (cnt < 1) {\n // Bail out as there is an activation signal from an inactive participant\n const error = new Error('Trying to inactivate an inactive participant (' + idFrom + ')');\n\n // @ts-ignore: we are passing hash param to the error object, however we should define our own custom error class to make it type safe\n error.hash = {\n text: '->>-',\n token: '->>-',\n line: '1',\n loc: { first_line: 1, last_line: 1, first_column: 1, last_column: 1 },\n expected: [\"'ACTIVE_PARTICIPANT'\"],\n };\n throw error;\n }\n }\n this.state.records.messages.push({\n id: this.state.records.messages.length.toString(),\n from: idFrom,\n to: idTo,\n message: message?.text ?? '',\n wrap: message?.wrap ?? this.autoWrap(),\n type: messageType,\n activate,\n });\n return true;\n }\n\n public hasAtLeastOneBox() {\n return this.state.records.boxes.length > 0;\n }\n\n public hasAtLeastOneBoxWithTitle() {\n return this.state.records.boxes.some((b) => b.name);\n }\n\n public getMessages() {\n return this.state.records.messages;\n }\n\n public getBoxes() {\n return this.state.records.boxes;\n }\n public getActors() {\n return this.state.records.actors;\n }\n public getCreatedActors() {\n return this.state.records.createdActors;\n }\n public getDestroyedActors() {\n return this.state.records.destroyedActors;\n }\n public getActor(id: string) {\n // TODO: do we ever use this function in a way that it might return undefined?\n return this.state.records.actors.get(id)!;\n }\n public getActorKeys() {\n return [...this.state.records.actors.keys()];\n }\n public enableSequenceNumbers() {\n this.state.records.sequenceNumbersEnabled = true;\n }\n public disableSequenceNumbers() {\n this.state.records.sequenceNumbersEnabled = false;\n }\n public showSequenceNumbers() {\n return this.state.records.sequenceNumbersEnabled;\n }\n\n public setWrap(wrapSetting?: boolean) {\n this.state.records.wrapEnabled = wrapSetting;\n }\n\n private extractWrap(text?: string): { cleanedText?: string; wrap?: boolean } {\n if (text === undefined) {\n return {};\n }\n text = text.trim();\n const wrap =\n /^:?wrap:/.exec(text) !== null ? true : /^:?nowrap:/.exec(text) !== null ? false : undefined;\n const cleanedText = (wrap === undefined ? text : text.replace(/^:?(?:no)?wrap:/, '')).trim();\n return { cleanedText, wrap };\n }\n\n public autoWrap() {\n // if setWrap has been called, use that value, otherwise use the value from the config\n // TODO: refactor, always use the config value let setWrap update the config value\n if (this.state.records.wrapEnabled !== undefined) {\n return this.state.records.wrapEnabled;\n }\n return getConfig().sequence?.wrap ?? false;\n }\n\n public clear() {\n this.state.reset();\n commonClear();\n }\n\n public parseMessage(str: string) {\n const trimmedStr = str.trim();\n const { wrap, cleanedText } = this.extractWrap(trimmedStr);\n const message = {\n text: cleanedText,\n wrap,\n };\n log.debug(`parseMessage: ${JSON.stringify(message)}`);\n return message;\n }\n\n // We expect the box statement to be color first then description\n // The color can be rgb,rgba,hsl,hsla, or css code names #hex codes are not supported for now because of the way the char # is handled\n // We extract first segment as color, the rest of the line is considered as text\n public parseBoxData(str: string) {\n const match = /^((?:rgba?|hsla?)\\s*\\(.*\\)|\\w*)(.*)$/.exec(str);\n let color = match?.[1] ? match[1].trim() : 'transparent';\n let title = match?.[2] ? match[2].trim() : undefined;\n\n // check that the string is a color\n if (window?.CSS) {\n if (!window.CSS.supports('color', color)) {\n color = 'transparent';\n title = str.trim();\n }\n } else {\n const style = new Option().style;\n style.color = color;\n if (style.color !== color) {\n color = 'transparent';\n title = str.trim();\n }\n }\n const { wrap, cleanedText } = this.extractWrap(title);\n return {\n text: cleanedText ? sanitizeText(cleanedText, getConfig()) : undefined,\n color,\n wrap,\n };\n }\n\n public readonly LINETYPE: typeof LINETYPE;\n public readonly ARROWTYPE: typeof ARROWTYPE;\n public readonly PLACEMENT: typeof PLACEMENT;\n\n public addNote(\n actor: { actor: string },\n placement: Message['placement'],\n message: { text: string; wrap?: boolean }\n ) {\n const note: Note = {\n actor: actor,\n placement: placement,\n message: message.text,\n wrap: message.wrap ?? this.autoWrap(),\n };\n\n //@ts-ignore: Coerce actor into a [to, from, ...] array\n // eslint-disable-next-line unicorn/prefer-spread\n const actors = [].concat(actor, actor);\n this.state.records.notes.push(note);\n this.state.records.messages.push({\n id: this.state.records.messages.length.toString(),\n from: actors[0],\n to: actors[1],\n message: message.text,\n wrap: message.wrap ?? this.autoWrap(),\n type: this.LINETYPE.NOTE,\n placement: placement,\n });\n }\n\n public addLinks(actorId: string, text: { text: string }) {\n // find the actor\n const actor = this.getActor(actorId);\n // JSON.parse the text\n try {\n let sanitizedText = sanitizeText(text.text, getConfig());\n sanitizedText = sanitizedText.replace(/=/g, '=');\n sanitizedText = sanitizedText.replace(/&/g, '&');\n const links = JSON.parse(sanitizedText);\n // add the deserialized text to the actor's links field.\n this.insertLinks(actor, links);\n } catch (e) {\n log.error('error while parsing actor link text', e);\n }\n }\n\n public addALink(actorId: string, text: { text: string }) {\n // find the actor\n const actor = this.getActor(actorId);\n try {\n const links: Record = {};\n let sanitizedText = sanitizeText(text.text, getConfig());\n const sep = sanitizedText.indexOf('@');\n sanitizedText = sanitizedText.replace(/=/g, '=');\n sanitizedText = sanitizedText.replace(/&/g, '&');\n const label = sanitizedText.slice(0, sep - 1).trim();\n const link = sanitizedText.slice(sep + 1).trim();\n\n links[label] = link;\n // add the deserialized text to the actor's links field.\n this.insertLinks(actor, links);\n } catch (e) {\n log.error('error while parsing actor link text', e);\n }\n }\n\n private insertLinks(actor: Actor, links: Record) {\n if (actor.links == null) {\n actor.links = links;\n } else {\n for (const key in links) {\n actor.links[key] = links[key];\n }\n }\n }\n\n public addProperties(actorId: string, text: { text: string }) {\n // find the actor\n const actor = this.getActor(actorId);\n // JSON.parse the text\n try {\n const sanitizedText = sanitizeText(text.text, getConfig());\n const properties: Record = JSON.parse(sanitizedText);\n // add the deserialized text to the actor's property field.\n this.insertProperties(actor, properties);\n } catch (e) {\n log.error('error while parsing actor properties text', e);\n }\n }\n\n private insertProperties(actor: Actor, properties: Record) {\n if (actor.properties == null) {\n actor.properties = properties;\n } else {\n for (const key in properties) {\n actor.properties[key] = properties[key];\n }\n }\n }\n\n private boxEnd() {\n this.state.records.currentBox = undefined;\n }\n\n public addDetails(actorId: string, text: { text: string }) {\n // find the actor\n const actor = this.getActor(actorId);\n const elem = document.getElementById(text.text)!;\n\n // JSON.parse the text\n try {\n const text = elem.innerHTML;\n const details = JSON.parse(text);\n // add the deserialized text to the actor's property field.\n if (details.properties) {\n this.insertProperties(actor, details.properties);\n }\n\n if (details.links) {\n this.insertLinks(actor, details.links);\n }\n } catch (e) {\n log.error('error while parsing actor details text', e);\n }\n }\n\n public getActorProperty(actor: Actor, key: string) {\n if (actor?.properties !== undefined) {\n return actor.properties[key];\n }\n\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-redundant-type-constituents\n public apply(param: any | AddMessageParams | AddMessageParams[]) {\n if (Array.isArray(param)) {\n param.forEach((item) => {\n this.apply(item);\n });\n } else {\n switch (param.type) {\n case 'sequenceIndex':\n this.state.records.messages.push({\n id: this.state.records.messages.length.toString(),\n from: undefined,\n to: undefined,\n message: {\n start: param.sequenceIndex,\n step: param.sequenceIndexStep,\n visible: param.sequenceVisible,\n },\n wrap: false,\n type: param.signalType,\n });\n break;\n case 'addParticipant':\n this.addActor(param.actor, param.actor, param.description, param.draw, param.config);\n break;\n case 'createParticipant':\n if (this.state.records.actors.has(param.actor)) {\n throw new Error(\n \"It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior\"\n );\n }\n this.state.records.lastCreated = param.actor;\n this.addActor(param.actor, param.actor, param.description, param.draw, param.config);\n this.state.records.createdActors.set(param.actor, this.state.records.messages.length);\n break;\n case 'destroyParticipant':\n this.state.records.lastDestroyed = param.actor;\n this.state.records.destroyedActors.set(param.actor, this.state.records.messages.length);\n break;\n case 'activeStart':\n this.addSignal(param.actor, undefined, undefined, param.signalType);\n break;\n case 'activeEnd':\n this.addSignal(param.actor, undefined, undefined, param.signalType);\n break;\n case 'addNote':\n this.addNote(param.actor, param.placement, param.text);\n break;\n case 'addLinks':\n this.addLinks(param.actor, param.text);\n break;\n case 'addALink':\n this.addALink(param.actor, param.text);\n break;\n case 'addProperties':\n this.addProperties(param.actor, param.text);\n break;\n case 'addDetails':\n this.addDetails(param.actor, param.text);\n break;\n case 'addMessage':\n if (this.state.records.lastCreated) {\n if (param.to !== this.state.records.lastCreated) {\n throw new Error(\n 'The created participant ' +\n this.state.records.lastCreated.name +\n ' does not have an associated creating message after its declaration. Please check the sequence diagram.'\n );\n } else {\n this.state.records.lastCreated = undefined;\n }\n } else if (this.state.records.lastDestroyed) {\n if (\n param.to !== this.state.records.lastDestroyed &&\n param.from !== this.state.records.lastDestroyed\n ) {\n throw new Error(\n 'The destroyed participant ' +\n this.state.records.lastDestroyed.name +\n ' does not have an associated destroying message after its declaration. Please check the sequence diagram.'\n );\n } else {\n this.state.records.lastDestroyed = undefined;\n }\n }\n this.addSignal(param.from, param.to, param.msg, param.signalType, param.activate);\n break;\n case 'boxStart':\n this.addBox(param.boxData);\n break;\n case 'boxEnd':\n this.boxEnd();\n break;\n case 'loopStart':\n this.addSignal(undefined, undefined, param.loopText, param.signalType);\n break;\n case 'loopEnd':\n this.addSignal(undefined, undefined, undefined, param.signalType);\n break;\n case 'rectStart':\n this.addSignal(undefined, undefined, param.color, param.signalType);\n break;\n case 'rectEnd':\n this.addSignal(undefined, undefined, undefined, param.signalType);\n break;\n case 'optStart':\n this.addSignal(undefined, undefined, param.optText, param.signalType);\n break;\n case 'optEnd':\n this.addSignal(undefined, undefined, undefined, param.signalType);\n break;\n case 'altStart':\n this.addSignal(undefined, undefined, param.altText, param.signalType);\n break;\n case 'else':\n this.addSignal(undefined, undefined, param.altText, param.signalType);\n break;\n case 'altEnd':\n this.addSignal(undefined, undefined, undefined, param.signalType);\n break;\n case 'setAccTitle':\n setAccTitle(param.text);\n break;\n case 'parStart':\n this.addSignal(undefined, undefined, param.parText, param.signalType);\n break;\n case 'and':\n this.addSignal(undefined, undefined, param.parText, param.signalType);\n break;\n case 'parEnd':\n this.addSignal(undefined, undefined, undefined, param.signalType);\n break;\n case 'criticalStart':\n this.addSignal(undefined, undefined, param.criticalText, param.signalType);\n break;\n case 'option':\n this.addSignal(undefined, undefined, param.optionText, param.signalType);\n break;\n case 'criticalEnd':\n this.addSignal(undefined, undefined, undefined, param.signalType);\n break;\n case 'breakStart':\n this.addSignal(undefined, undefined, param.breakText, param.signalType);\n break;\n case 'breakEnd':\n this.addSignal(undefined, undefined, undefined, param.signalType);\n break;\n }\n }\n }\n\n public setAccTitle = setAccTitle;\n public setAccDescription = setAccDescription;\n public setDiagramTitle = setDiagramTitle;\n public getAccTitle = getAccTitle;\n public getAccDescription = getAccDescription;\n public getDiagramTitle = getDiagramTitle;\n public getConfig() {\n return getConfig().sequence;\n }\n}\n", "const getStyles = (options) =>\n `.actor {\n stroke: ${options.actorBorder};\n fill: ${options.actorBkg};\n }\n\n text.actor > tspan {\n fill: ${options.actorTextColor};\n stroke: none;\n }\n\n .actor-line {\n stroke: ${options.actorLineColor};\n }\n \n .innerArc {\n stroke-width: 1.5;\n stroke-dasharray: none;\n }\n\n .messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: none;\n stroke: ${options.signalColor};\n }\n\n .messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: 2, 2;\n stroke: ${options.signalColor};\n }\n\n #arrowhead path {\n fill: ${options.signalColor};\n stroke: ${options.signalColor};\n }\n\n .sequenceNumber {\n fill: ${options.sequenceNumberColor};\n }\n\n #sequencenumber {\n fill: ${options.signalColor};\n }\n\n #crosshead path {\n fill: ${options.signalColor};\n stroke: ${options.signalColor};\n }\n\n .messageText {\n fill: ${options.signalTextColor};\n stroke: none;\n }\n\n .labelBox {\n stroke: ${options.labelBoxBorderColor};\n fill: ${options.labelBoxBkgColor};\n }\n\n .labelText, .labelText > tspan {\n fill: ${options.labelTextColor};\n stroke: none;\n }\n\n .loopText, .loopText > tspan {\n fill: ${options.loopTextColor};\n stroke: none;\n }\n\n .loopLine {\n stroke-width: 2px;\n stroke-dasharray: 2, 2;\n stroke: ${options.labelBoxBorderColor};\n fill: ${options.labelBoxBorderColor};\n }\n\n .note {\n //stroke: #decc93;\n stroke: ${options.noteBorderColor};\n fill: ${options.noteBkgColor};\n }\n\n .noteText, .noteText > tspan {\n fill: ${options.noteTextColor};\n stroke: none;\n }\n\n .activation0 {\n fill: ${options.activationBkgColor};\n stroke: ${options.activationBorderColor};\n }\n\n .activation1 {\n fill: ${options.activationBkgColor};\n stroke: ${options.activationBorderColor};\n }\n\n .activation2 {\n fill: ${options.activationBkgColor};\n stroke: ${options.activationBorderColor};\n }\n\n .actorPopupMenu {\n position: absolute;\n }\n\n .actorPopupMenuPanel {\n position: absolute;\n fill: ${options.actorBkg};\n box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));\n}\n .actor-man line {\n stroke: ${options.actorBorder};\n fill: ${options.actorBkg};\n }\n .actor-man circle, line {\n stroke: ${options.actorBorder};\n fill: ${options.actorBkg};\n stroke-width: 2px;\n }\n\n`;\n\nexport default getStyles;\n", "// @ts-nocheck TODO: fix file\nimport { select } from 'd3';\nimport svgDraw, { drawKatex, ACTOR_TYPE_WIDTH, drawText, fixLifeLineHeights } from './svgDraw.js';\nimport { log } from '../../logger.js';\nimport common, { calculateMathMLDimensions, hasKatex } from '../common/common.js';\nimport { getUrl } from '../common/common.js';\nimport * as svgDrawCommon from '../common/svgDrawCommon.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport assignWithDepth from '../../assignWithDepth.js';\nimport utils from '../../utils.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\nimport type { Diagram } from '../../Diagram.js';\nimport { PARTICIPANT_TYPE } from './sequenceDb.js';\n\nlet conf = {};\n\nexport const bounds = {\n data: {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined,\n },\n verticalPos: 0,\n sequenceItems: [],\n activations: [],\n models: {\n getHeight: function () {\n return (\n Math.max.apply(\n null,\n this.actors.length === 0 ? [0] : this.actors.map((actor) => actor.height || 0)\n ) +\n (this.loops.length === 0\n ? 0\n : this.loops.map((it) => it.height || 0).reduce((acc, h) => acc + h)) +\n (this.messages.length === 0\n ? 0\n : this.messages.map((it) => it.height || 0).reduce((acc, h) => acc + h)) +\n (this.notes.length === 0\n ? 0\n : this.notes.map((it) => it.height || 0).reduce((acc, h) => acc + h))\n );\n },\n clear: function () {\n this.actors = [];\n this.boxes = [];\n this.loops = [];\n this.messages = [];\n this.notes = [];\n },\n addBox: function (boxModel) {\n this.boxes.push(boxModel);\n },\n addActor: function (actorModel) {\n this.actors.push(actorModel);\n },\n addLoop: function (loopModel) {\n this.loops.push(loopModel);\n },\n addMessage: function (msgModel) {\n this.messages.push(msgModel);\n },\n addNote: function (noteModel) {\n this.notes.push(noteModel);\n },\n lastActor: function () {\n return this.actors[this.actors.length - 1];\n },\n lastLoop: function () {\n return this.loops[this.loops.length - 1];\n },\n lastMessage: function () {\n return this.messages[this.messages.length - 1];\n },\n lastNote: function () {\n return this.notes[this.notes.length - 1];\n },\n actors: [],\n boxes: [],\n loops: [],\n messages: [],\n notes: [],\n },\n init: function () {\n this.sequenceItems = [];\n this.activations = [];\n this.models.clear();\n this.data = {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined,\n };\n this.verticalPos = 0;\n setConf(getConfig());\n },\n updateVal: function (obj, key, val, fun) {\n if (obj[key] === undefined) {\n obj[key] = val;\n } else {\n obj[key] = fun(val, obj[key]);\n }\n },\n updateBounds: function (startx, starty, stopx, stopy) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _self = this;\n let cnt = 0;\n /** @param type - Either `activation` or `undefined` */\n function updateFn(type?: 'activation') {\n return function updateItemBounds(item) {\n cnt++;\n // The loop sequenceItems is a stack so the biggest margins in the beginning of the sequenceItems\n const n = _self.sequenceItems.length - cnt + 1;\n\n _self.updateVal(item, 'starty', starty - n * conf.boxMargin, Math.min);\n _self.updateVal(item, 'stopy', stopy + n * conf.boxMargin, Math.max);\n\n _self.updateVal(bounds.data, 'startx', startx - n * conf.boxMargin, Math.min);\n _self.updateVal(bounds.data, 'stopx', stopx + n * conf.boxMargin, Math.max);\n\n if (!(type === 'activation')) {\n _self.updateVal(item, 'startx', startx - n * conf.boxMargin, Math.min);\n _self.updateVal(item, 'stopx', stopx + n * conf.boxMargin, Math.max);\n\n _self.updateVal(bounds.data, 'starty', starty - n * conf.boxMargin, Math.min);\n _self.updateVal(bounds.data, 'stopy', stopy + n * conf.boxMargin, Math.max);\n }\n };\n }\n\n this.sequenceItems.forEach(updateFn());\n this.activations.forEach(updateFn('activation'));\n },\n insert: function (startx, starty, stopx, stopy) {\n const _startx = common.getMin(startx, stopx);\n const _stopx = common.getMax(startx, stopx);\n const _starty = common.getMin(starty, stopy);\n const _stopy = common.getMax(starty, stopy);\n\n this.updateVal(bounds.data, 'startx', _startx, Math.min);\n this.updateVal(bounds.data, 'starty', _starty, Math.min);\n this.updateVal(bounds.data, 'stopx', _stopx, Math.max);\n this.updateVal(bounds.data, 'stopy', _stopy, Math.max);\n\n this.updateBounds(_startx, _starty, _stopx, _stopy);\n },\n newActivation: function (message, diagram, actors) {\n const actorRect = actors.get(message.from);\n const stackedSize = actorActivations(message.from).length || 0;\n const x = actorRect.x + actorRect.width / 2 + ((stackedSize - 1) * conf.activationWidth) / 2;\n this.activations.push({\n startx: x,\n starty: this.verticalPos + 2,\n stopx: x + conf.activationWidth,\n stopy: undefined,\n actor: message.from,\n anchored: svgDraw.anchorElement(diagram),\n });\n },\n endActivation: function (message) {\n // find most recent activation for given actor\n const lastActorActivationIdx = this.activations\n .map(function (activation) {\n return activation.actor;\n })\n .lastIndexOf(message.from);\n return this.activations.splice(lastActorActivationIdx, 1)[0];\n },\n createLoop: function (title = { message: undefined, wrap: false, width: undefined }, fill) {\n return {\n startx: undefined,\n starty: this.verticalPos,\n stopx: undefined,\n stopy: undefined,\n title: title.message,\n wrap: title.wrap,\n width: title.width,\n height: 0,\n fill: fill,\n };\n },\n newLoop: function (title = { message: undefined, wrap: false, width: undefined }, fill) {\n this.sequenceItems.push(this.createLoop(title, fill));\n },\n endLoop: function () {\n return this.sequenceItems.pop();\n },\n isLoopOverlap: function () {\n return this.sequenceItems.length\n ? this.sequenceItems[this.sequenceItems.length - 1].overlap\n : false;\n },\n addSectionToLoop: function (message) {\n const loop = this.sequenceItems.pop();\n loop.sections = loop.sections || [];\n loop.sectionTitles = loop.sectionTitles || [];\n loop.sections.push({ y: bounds.getVerticalPos(), height: 0 });\n loop.sectionTitles.push(message);\n this.sequenceItems.push(loop);\n },\n saveVerticalPos: function () {\n if (this.isLoopOverlap()) {\n this.savedVerticalPos = this.verticalPos;\n }\n },\n resetVerticalPos: function () {\n if (this.isLoopOverlap()) {\n this.verticalPos = this.savedVerticalPos;\n }\n },\n bumpVerticalPos: function (bump) {\n this.verticalPos = this.verticalPos + bump;\n this.data.stopy = common.getMax(this.data.stopy, this.verticalPos);\n },\n getVerticalPos: function () {\n return this.verticalPos;\n },\n getBounds: function () {\n return { bounds: this.data, models: this.models };\n },\n};\n\n/** Options for drawing a note in {@link drawNote} */\ninterface NoteModel {\n /** x axis start position */\n startx: number;\n /** y axis position */\n starty: number;\n /** the message to be shown */\n message: string;\n /** Set this with a custom width to override the default configured width. */\n width: number;\n}\n\n/**\n * Draws a note in the diagram with the attached line\n *\n * @param elem - The diagram to draw to.\n * @param noteModel - Note model options.\n */\nconst drawNote = async function (elem: any, noteModel: NoteModel) {\n bounds.bumpVerticalPos(conf.boxMargin);\n noteModel.height = conf.boxMargin;\n noteModel.starty = bounds.getVerticalPos();\n const rect = svgDrawCommon.getNoteRect();\n rect.x = noteModel.startx;\n rect.y = noteModel.starty;\n rect.width = noteModel.width || conf.width;\n rect.class = 'note';\n\n const g = elem.append('g');\n const rectElem = svgDraw.drawRect(g, rect);\n const textObj = svgDrawCommon.getTextObj();\n textObj.x = noteModel.startx;\n textObj.y = noteModel.starty;\n textObj.width = rect.width;\n textObj.dy = '1em';\n textObj.text = noteModel.message;\n textObj.class = 'noteText';\n textObj.fontFamily = conf.noteFontFamily;\n textObj.fontSize = conf.noteFontSize;\n textObj.fontWeight = conf.noteFontWeight;\n textObj.anchor = conf.noteAlign;\n textObj.textMargin = conf.noteMargin;\n textObj.valign = 'center';\n\n const textElem = hasKatex(textObj.text) ? await drawKatex(g, textObj) : drawText(g, textObj);\n\n const textHeight = Math.round(\n textElem\n .map((te) => (te._groups || te)[0][0].getBBox().height)\n .reduce((acc, curr) => acc + curr)\n );\n\n rectElem.attr('height', textHeight + 2 * conf.noteMargin);\n noteModel.height += textHeight + 2 * conf.noteMargin;\n bounds.bumpVerticalPos(textHeight + 2 * conf.noteMargin);\n noteModel.stopy = noteModel.starty + textHeight + 2 * conf.noteMargin;\n noteModel.stopx = noteModel.startx + rect.width;\n bounds.insert(noteModel.startx, noteModel.starty, noteModel.stopx, noteModel.stopy);\n bounds.models.addNote(noteModel);\n};\n\nconst messageFont = (cnf) => {\n return {\n fontFamily: cnf.messageFontFamily,\n fontSize: cnf.messageFontSize,\n fontWeight: cnf.messageFontWeight,\n };\n};\nconst noteFont = (cnf) => {\n return {\n fontFamily: cnf.noteFontFamily,\n fontSize: cnf.noteFontSize,\n fontWeight: cnf.noteFontWeight,\n };\n};\nconst actorFont = (cnf) => {\n return {\n fontFamily: cnf.actorFontFamily,\n fontSize: cnf.actorFontSize,\n fontWeight: cnf.actorFontWeight,\n };\n};\n\n/**\n * Process a message by adding its dimensions to the bound. It returns the Y coordinate of the\n * message so it can be drawn later. We do not draw the message at this point so the arrowhead can\n * be on top of the activation box.\n *\n * @param _diagram - The parent of the message element.\n * @param msgModel - The model containing fields describing a message\n * @returns `lineStartY` - The Y coordinate at which the message line starts\n */\nasync function boundMessage(_diagram, msgModel): Promise {\n bounds.bumpVerticalPos(10);\n const { startx, stopx, message } = msgModel;\n const lines = common.splitBreaks(message).length;\n const isKatexMsg = hasKatex(message);\n const textDims = isKatexMsg\n ? await calculateMathMLDimensions(message, getConfig())\n : utils.calculateTextDimensions(message, messageFont(conf));\n\n if (!isKatexMsg) {\n const lineHeight = textDims.height / lines;\n msgModel.height += lineHeight;\n bounds.bumpVerticalPos(lineHeight);\n }\n\n let lineStartY;\n let totalOffset = textDims.height - 10;\n const textWidth = textDims.width;\n\n if (startx === stopx) {\n lineStartY = bounds.getVerticalPos() + totalOffset;\n if (!conf.rightAngles) {\n totalOffset += conf.boxMargin;\n lineStartY = bounds.getVerticalPos() + totalOffset;\n }\n totalOffset += 30;\n const dx = common.getMax(textWidth / 2, conf.width / 2);\n bounds.insert(\n startx - dx,\n bounds.getVerticalPos() - 10 + totalOffset,\n stopx + dx,\n bounds.getVerticalPos() + 30 + totalOffset\n );\n } else {\n totalOffset += conf.boxMargin;\n lineStartY = bounds.getVerticalPos() + totalOffset;\n bounds.insert(startx, lineStartY - 10, stopx, lineStartY);\n }\n bounds.bumpVerticalPos(totalOffset);\n msgModel.height += totalOffset;\n msgModel.stopy = msgModel.starty + msgModel.height;\n bounds.insert(msgModel.fromBounds, msgModel.starty, msgModel.toBounds, msgModel.stopy);\n\n return lineStartY;\n}\n\n/**\n * Draws a message. Note that the bounds have previously been updated by boundMessage.\n *\n * @param diagram - The parent of the message element\n * @param msgModel - The model containing fields describing a message\n * @param lineStartY - The Y coordinate at which the message line starts\n * @param diagObj - The diagram object.\n */\nconst drawMessage = async function (diagram, msgModel, lineStartY: number, diagObj: Diagram) {\n const { startx, stopx, starty, message, type, sequenceIndex, sequenceVisible } = msgModel;\n const textDims = utils.calculateTextDimensions(message, messageFont(conf));\n const textObj = svgDrawCommon.getTextObj();\n textObj.x = startx;\n textObj.y = starty + 10;\n textObj.width = stopx - startx;\n textObj.class = 'messageText';\n textObj.dy = '1em';\n textObj.text = message;\n textObj.fontFamily = conf.messageFontFamily;\n textObj.fontSize = conf.messageFontSize;\n textObj.fontWeight = conf.messageFontWeight;\n textObj.anchor = conf.messageAlign;\n textObj.valign = 'center';\n textObj.textMargin = conf.wrapPadding;\n textObj.tspan = false;\n\n if (hasKatex(textObj.text)) {\n await drawKatex(diagram, textObj, { startx, stopx, starty: lineStartY });\n } else {\n drawText(diagram, textObj);\n }\n\n const textWidth = textDims.width;\n\n let line;\n if (startx === stopx) {\n if (conf.rightAngles) {\n line = diagram\n .append('path')\n .attr(\n 'd',\n `M ${startx},${lineStartY} H ${\n startx + common.getMax(conf.width / 2, textWidth / 2)\n } V ${lineStartY + 25} H ${startx}`\n );\n } else {\n line = diagram\n .append('path')\n .attr(\n 'd',\n 'M ' +\n startx +\n ',' +\n lineStartY +\n ' C ' +\n (startx + 60) +\n ',' +\n (lineStartY - 10) +\n ' ' +\n (startx + 60) +\n ',' +\n (lineStartY + 30) +\n ' ' +\n startx +\n ',' +\n (lineStartY + 20)\n );\n }\n } else {\n line = diagram.append('line');\n line.attr('x1', startx);\n line.attr('y1', lineStartY);\n line.attr('x2', stopx);\n line.attr('y2', lineStartY);\n }\n // Make an SVG Container\n // Draw the line\n if (\n type === diagObj.db.LINETYPE.DOTTED ||\n type === diagObj.db.LINETYPE.DOTTED_CROSS ||\n type === diagObj.db.LINETYPE.DOTTED_POINT ||\n type === diagObj.db.LINETYPE.DOTTED_OPEN ||\n type === diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED\n ) {\n line.style('stroke-dasharray', '3, 3');\n line.attr('class', 'messageLine1');\n } else {\n line.attr('class', 'messageLine0');\n }\n\n let url = '';\n if (conf.arrowMarkerAbsolute) {\n url = getUrl(true);\n }\n\n line.attr('stroke-width', 2);\n line.attr('stroke', 'none'); // handled by theme/css anyway\n line.style('fill', 'none'); // remove any fill colour\n if (type === diagObj.db.LINETYPE.SOLID || type === diagObj.db.LINETYPE.DOTTED) {\n line.attr('marker-end', 'url(' + url + '#arrowhead)');\n }\n if (\n type === diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID ||\n type === diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED\n ) {\n line.attr('marker-start', 'url(' + url + '#arrowhead)');\n line.attr('marker-end', 'url(' + url + '#arrowhead)');\n }\n if (type === diagObj.db.LINETYPE.SOLID_POINT || type === diagObj.db.LINETYPE.DOTTED_POINT) {\n line.attr('marker-end', 'url(' + url + '#filled-head)');\n }\n\n if (type === diagObj.db.LINETYPE.SOLID_CROSS || type === diagObj.db.LINETYPE.DOTTED_CROSS) {\n line.attr('marker-end', 'url(' + url + '#crosshead)');\n }\n\n // add node number\n if (sequenceVisible || conf.showSequenceNumbers) {\n const isBidirectional =\n type === diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID ||\n type === diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED;\n\n if (isBidirectional) {\n const SEQUENCE_NUMBER_RADIUS = 6;\n\n if (startx < stopx) {\n line.attr('x1', startx + 2 * SEQUENCE_NUMBER_RADIUS);\n } else {\n line.attr('x1', startx + SEQUENCE_NUMBER_RADIUS);\n }\n }\n\n diagram\n .append('line')\n .attr('x1', startx)\n .attr('y1', lineStartY)\n .attr('x2', startx)\n .attr('y2', lineStartY)\n .attr('stroke-width', 0)\n .attr('marker-start', 'url(' + url + '#sequencenumber)');\n\n diagram\n .append('text')\n .attr('x', startx)\n .attr('y', lineStartY + 4)\n .attr('font-family', 'sans-serif')\n .attr('font-size', '12px')\n .attr('text-anchor', 'middle')\n .attr('class', 'sequenceNumber')\n .text(sequenceIndex);\n }\n};\n\nconst addActorRenderingData = function (\n diagram,\n actors,\n createdActors: Map,\n actorKeys,\n verticalPos,\n messages,\n isFooter\n) {\n let prevWidth = 0;\n let prevMargin = 0;\n let prevBox = undefined;\n let maxHeight = 0;\n\n for (const actorKey of actorKeys) {\n const actor = actors.get(actorKey);\n const box = actor.box;\n\n // end of box\n if (prevBox && prevBox != box) {\n if (!isFooter) {\n bounds.models.addBox(prevBox);\n }\n prevMargin += conf.boxMargin + prevBox.margin;\n }\n\n // new box\n if (box && box != prevBox) {\n if (!isFooter) {\n box.x = prevWidth + prevMargin;\n box.y = verticalPos;\n }\n prevMargin += box.margin;\n }\n\n // Add some rendering data to the object\n actor.width = actor.width || conf.width;\n actor.height = common.getMax(actor.height || conf.height, conf.height);\n actor.margin = actor.margin || conf.actorMargin;\n\n maxHeight = common.getMax(maxHeight, actor.height);\n\n // if the actor is created by a message, widen margin\n if (createdActors.get(actor.name)) {\n prevMargin += actor.width / 2;\n }\n\n actor.x = prevWidth + prevMargin;\n actor.starty = bounds.getVerticalPos();\n\n bounds.insert(actor.x, verticalPos, actor.x + actor.width, actor.height);\n\n prevWidth += actor.width + prevMargin;\n if (actor.box) {\n actor.box.width = prevWidth + box.margin - actor.box.x;\n }\n prevMargin = actor.margin;\n prevBox = actor.box;\n bounds.models.addActor(actor);\n }\n\n // end of box\n if (prevBox && !isFooter) {\n bounds.models.addBox(prevBox);\n }\n\n // Add a margin between the actor boxes and the first arrow\n bounds.bumpVerticalPos(maxHeight);\n};\n\nexport const drawActors = async function (diagram, actors, actorKeys, isFooter) {\n if (!isFooter) {\n for (const actorKey of actorKeys) {\n const actor = actors.get(actorKey);\n // Draw the box with the attached line\n await svgDraw.drawActor(diagram, actor, conf, false);\n }\n } else {\n let maxHeight = 0;\n bounds.bumpVerticalPos(conf.boxMargin * 2);\n for (const actorKey of actorKeys) {\n const actor = actors.get(actorKey);\n if (!actor.stopy) {\n actor.stopy = bounds.getVerticalPos();\n }\n const height = await svgDraw.drawActor(diagram, actor, conf, true);\n maxHeight = common.getMax(maxHeight, height);\n }\n bounds.bumpVerticalPos(maxHeight + conf.boxMargin);\n }\n};\n\nexport const drawActorsPopup = function (diagram, actors, actorKeys, doc) {\n let maxHeight = 0;\n let maxWidth = 0;\n for (const actorKey of actorKeys) {\n const actor = actors.get(actorKey);\n const minMenuWidth = getRequiredPopupWidth(actor);\n const menuDimensions = svgDraw.drawPopup(\n diagram,\n actor,\n minMenuWidth,\n conf,\n conf.forceMenus,\n doc\n );\n if (menuDimensions.height > maxHeight) {\n maxHeight = menuDimensions.height;\n }\n if (menuDimensions.width + actor.x > maxWidth) {\n maxWidth = menuDimensions.width + actor.x;\n }\n }\n\n return { maxHeight: maxHeight, maxWidth: maxWidth };\n};\n\nexport const setConf = function (cnf) {\n assignWithDepth(conf, cnf);\n\n if (cnf.fontFamily) {\n conf.actorFontFamily = conf.noteFontFamily = conf.messageFontFamily = cnf.fontFamily;\n }\n if (cnf.fontSize) {\n conf.actorFontSize = conf.noteFontSize = conf.messageFontSize = cnf.fontSize;\n }\n if (cnf.fontWeight) {\n conf.actorFontWeight = conf.noteFontWeight = conf.messageFontWeight = cnf.fontWeight;\n }\n};\n\nconst actorActivations = function (actor) {\n return bounds.activations.filter(function (activation) {\n return activation.actor === actor;\n });\n};\n\nconst activationBounds = function (actor, actors) {\n // handle multiple stacked activations for same actor\n const actorObj = actors.get(actor);\n const activations = actorActivations(actor);\n\n const left = activations.reduce(\n function (acc, activation) {\n return common.getMin(acc, activation.startx);\n },\n actorObj.x + actorObj.width / 2 - 1\n );\n const right = activations.reduce(\n function (acc, activation) {\n return common.getMax(acc, activation.stopx);\n },\n actorObj.x + actorObj.width / 2 + 1\n );\n return [left, right];\n};\n\nfunction adjustLoopHeightForWrap(loopWidths, msg, preMargin, postMargin, addLoopFn) {\n bounds.bumpVerticalPos(preMargin);\n let heightAdjust = postMargin;\n if (msg.id && msg.message && loopWidths[msg.id]) {\n const loopWidth = loopWidths[msg.id].width;\n const textConf = messageFont(conf);\n msg.message = utils.wrapLabel(`[${msg.message}]`, loopWidth - 2 * conf.wrapPadding, textConf);\n msg.width = loopWidth;\n msg.wrap = true;\n\n // const lines = common.splitBreaks(msg.message).length;\n const textDims = utils.calculateTextDimensions(msg.message, textConf);\n const totalOffset = common.getMax(textDims.height, conf.labelBoxHeight);\n heightAdjust = postMargin + totalOffset;\n log.debug(`${totalOffset} - ${msg.message}`);\n }\n addLoopFn(msg);\n bounds.bumpVerticalPos(heightAdjust);\n}\n\n/**\n * Adjust the msgModel and the actor for the rendering in case the latter is created or destroyed by the msg\n * @param msg - the potentially creating or destroying message\n * @param msgModel - the model associated with the message\n * @param lineStartY - the y position of the message line\n * @param index - the index of the current actor under consideration\n * @param actors - the array of all actors\n * @param createdActors - the array of actors created in the diagram\n * @param destroyedActors - the array of actors destroyed in the diagram\n */\nfunction adjustCreatedDestroyedData(\n msg,\n msgModel,\n lineStartY,\n index,\n actors,\n createdActors,\n destroyedActors\n) {\n function receiverAdjustment(actor, adjustment) {\n if (actor.x < actors.get(msg.from).x) {\n bounds.insert(\n msgModel.stopx - adjustment,\n msgModel.starty,\n msgModel.startx,\n msgModel.stopy + actor.height / 2 + conf.noteMargin\n );\n msgModel.stopx = msgModel.stopx + adjustment;\n } else {\n bounds.insert(\n msgModel.startx,\n msgModel.starty,\n msgModel.stopx + adjustment,\n msgModel.stopy + actor.height / 2 + conf.noteMargin\n );\n msgModel.stopx = msgModel.stopx - adjustment;\n }\n }\n\n function senderAdjustment(actor, adjustment) {\n if (actor.x < actors.get(msg.to).x) {\n bounds.insert(\n msgModel.startx - adjustment,\n msgModel.starty,\n msgModel.stopx,\n msgModel.stopy + actor.height / 2 + conf.noteMargin\n );\n msgModel.startx = msgModel.startx + adjustment;\n } else {\n bounds.insert(\n msgModel.stopx,\n msgModel.starty,\n msgModel.startx + adjustment,\n msgModel.stopy + actor.height / 2 + conf.noteMargin\n );\n msgModel.startx = msgModel.startx - adjustment;\n }\n }\n const actorArray = [\n PARTICIPANT_TYPE.ACTOR,\n PARTICIPANT_TYPE.CONTROL,\n PARTICIPANT_TYPE.ENTITY,\n PARTICIPANT_TYPE.DATABASE,\n ];\n\n // if it is a create message\n if (createdActors.get(msg.to) == index) {\n const actor = actors.get(msg.to);\n const adjustment = actorArray.includes(actor.type)\n ? ACTOR_TYPE_WIDTH / 2 + 3\n : actor.width / 2 + 3;\n receiverAdjustment(actor, adjustment);\n actor.starty = lineStartY - actor.height / 2;\n bounds.bumpVerticalPos(actor.height / 2);\n }\n // if it is a destroy sender message\n else if (destroyedActors.get(msg.from) == index) {\n const actor = actors.get(msg.from);\n if (conf.mirrorActors) {\n const adjustment = actorArray.includes(actor.type) ? ACTOR_TYPE_WIDTH / 2 : actor.width / 2;\n senderAdjustment(actor, adjustment);\n }\n actor.stopy = lineStartY - actor.height / 2;\n bounds.bumpVerticalPos(actor.height / 2);\n }\n // if it is a destroy receiver message\n else if (destroyedActors.get(msg.to) == index) {\n const actor = actors.get(msg.to);\n if (conf.mirrorActors) {\n const adjustment = actorArray.includes(actor.type)\n ? ACTOR_TYPE_WIDTH / 2 + 3\n : actor.width / 2 + 3;\n receiverAdjustment(actor, adjustment);\n }\n actor.stopy = lineStartY - actor.height / 2;\n bounds.bumpVerticalPos(actor.height / 2);\n }\n}\n\n/**\n * Draws a sequenceDiagram in the tag with id: id based on the graph definition in text.\n *\n * @param _text - The text of the diagram\n * @param id - The id of the diagram which will be used as a DOM element id\u00A8\n * @param _version - Mermaid version from package.json\n * @param diagObj - A standard diagram containing the db and the text and type etc of the diagram\n */\nexport const draw = async function (_text: string, id: string, _version: string, diagObj: Diagram) {\n const { securityLevel, sequence } = getConfig();\n conf = sequence;\n // Handle root and Document for when rendering in sandbox mode\n let sandboxElement;\n if (securityLevel === 'sandbox') {\n sandboxElement = select('#i' + id);\n }\n\n const root =\n securityLevel === 'sandbox'\n ? select(sandboxElement.nodes()[0].contentDocument.body)\n : select('body');\n const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0].contentDocument : document;\n bounds.init();\n log.debug(diagObj.db);\n\n const diagram =\n securityLevel === 'sandbox' ? root.select(`[id=\"${id}\"]`) : select(`[id=\"${id}\"]`);\n\n // Fetch data from the parsing\n const actors = diagObj.db.getActors();\n const createdActors = diagObj.db.getCreatedActors();\n const destroyedActors = diagObj.db.getDestroyedActors();\n const boxes = diagObj.db.getBoxes();\n let actorKeys = diagObj.db.getActorKeys();\n const messages = diagObj.db.getMessages();\n const title = diagObj.db.getDiagramTitle();\n const hasBoxes = diagObj.db.hasAtLeastOneBox();\n const hasBoxTitles = diagObj.db.hasAtLeastOneBoxWithTitle();\n const maxMessageWidthPerActor = await getMaxMessageWidthPerActor(actors, messages, diagObj);\n conf.height = await calculateActorMargins(actors, maxMessageWidthPerActor, boxes);\n\n svgDraw.insertComputerIcon(diagram);\n svgDraw.insertDatabaseIcon(diagram);\n svgDraw.insertClockIcon(diagram);\n\n if (hasBoxes) {\n bounds.bumpVerticalPos(conf.boxMargin);\n if (hasBoxTitles) {\n bounds.bumpVerticalPos(boxes[0].textMaxHeight);\n }\n }\n\n if (conf.hideUnusedParticipants === true) {\n const newActors = new Set();\n messages.forEach((message) => {\n newActors.add(message.from);\n newActors.add(message.to);\n });\n actorKeys = actorKeys.filter((actorKey) => newActors.has(actorKey));\n }\n\n addActorRenderingData(diagram, actors, createdActors, actorKeys, 0, messages, false);\n const loopWidths = await calculateLoopBounds(messages, actors, maxMessageWidthPerActor, diagObj);\n\n // The arrow head definition is attached to the svg once\n svgDraw.insertArrowHead(diagram);\n svgDraw.insertArrowCrossHead(diagram);\n svgDraw.insertArrowFilledHead(diagram);\n svgDraw.insertSequenceNumber(diagram);\n\n /**\n * @param msg - The message to draw.\n * @param verticalPos - The vertical position of the message.\n */\n function activeEnd(msg: any, verticalPos: number) {\n const activationData = bounds.endActivation(msg);\n if (activationData.starty + 18 > verticalPos) {\n activationData.starty = verticalPos - 6;\n verticalPos += 12;\n }\n svgDraw.drawActivation(\n diagram,\n activationData,\n verticalPos,\n conf,\n actorActivations(msg.from).length\n );\n\n bounds.insert(activationData.startx, verticalPos - 10, activationData.stopx, verticalPos);\n }\n\n // Draw the messages/signals\n let sequenceIndex = 1;\n let sequenceIndexStep = 1;\n const messagesToDraw = [];\n const backgrounds = [];\n let index = 0;\n for (const msg of messages) {\n let loopModel, noteModel, msgModel;\n\n switch (msg.type) {\n case diagObj.db.LINETYPE.NOTE:\n bounds.resetVerticalPos();\n noteModel = msg.noteModel;\n await drawNote(diagram, noteModel);\n break;\n case diagObj.db.LINETYPE.ACTIVE_START:\n bounds.newActivation(msg, diagram, actors);\n break;\n case diagObj.db.LINETYPE.ACTIVE_END:\n activeEnd(msg, bounds.getVerticalPos());\n break;\n case diagObj.db.LINETYPE.LOOP_START:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin,\n conf.boxMargin + conf.boxTextMargin,\n (message) => bounds.newLoop(message)\n );\n break;\n case diagObj.db.LINETYPE.LOOP_END:\n loopModel = bounds.endLoop();\n await svgDraw.drawLoop(diagram, loopModel, 'loop', conf);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n bounds.models.addLoop(loopModel);\n break;\n case diagObj.db.LINETYPE.RECT_START:\n adjustLoopHeightForWrap(loopWidths, msg, conf.boxMargin, conf.boxMargin, (message) =>\n bounds.newLoop(undefined, message.message)\n );\n break;\n case diagObj.db.LINETYPE.RECT_END:\n loopModel = bounds.endLoop();\n backgrounds.push(loopModel);\n bounds.models.addLoop(loopModel);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n break;\n case diagObj.db.LINETYPE.OPT_START:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin,\n conf.boxMargin + conf.boxTextMargin,\n (message) => bounds.newLoop(message)\n );\n break;\n case diagObj.db.LINETYPE.OPT_END:\n loopModel = bounds.endLoop();\n await svgDraw.drawLoop(diagram, loopModel, 'opt', conf);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n bounds.models.addLoop(loopModel);\n break;\n case diagObj.db.LINETYPE.ALT_START:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin,\n conf.boxMargin + conf.boxTextMargin,\n (message) => bounds.newLoop(message)\n );\n break;\n case diagObj.db.LINETYPE.ALT_ELSE:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin + conf.boxTextMargin,\n conf.boxMargin,\n (message) => bounds.addSectionToLoop(message)\n );\n break;\n case diagObj.db.LINETYPE.ALT_END:\n loopModel = bounds.endLoop();\n await svgDraw.drawLoop(diagram, loopModel, 'alt', conf);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n bounds.models.addLoop(loopModel);\n break;\n case diagObj.db.LINETYPE.PAR_START:\n case diagObj.db.LINETYPE.PAR_OVER_START:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin,\n conf.boxMargin + conf.boxTextMargin,\n (message) => bounds.newLoop(message)\n );\n bounds.saveVerticalPos();\n break;\n case diagObj.db.LINETYPE.PAR_AND:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin + conf.boxTextMargin,\n conf.boxMargin,\n (message) => bounds.addSectionToLoop(message)\n );\n break;\n case diagObj.db.LINETYPE.PAR_END:\n loopModel = bounds.endLoop();\n await svgDraw.drawLoop(diagram, loopModel, 'par', conf);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n bounds.models.addLoop(loopModel);\n break;\n case diagObj.db.LINETYPE.AUTONUMBER:\n sequenceIndex = msg.message.start || sequenceIndex;\n sequenceIndexStep = msg.message.step || sequenceIndexStep;\n if (msg.message.visible) {\n diagObj.db.enableSequenceNumbers();\n } else {\n diagObj.db.disableSequenceNumbers();\n }\n break;\n case diagObj.db.LINETYPE.CRITICAL_START:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin,\n conf.boxMargin + conf.boxTextMargin,\n (message) => bounds.newLoop(message)\n );\n break;\n case diagObj.db.LINETYPE.CRITICAL_OPTION:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin + conf.boxTextMargin,\n conf.boxMargin,\n (message) => bounds.addSectionToLoop(message)\n );\n break;\n case diagObj.db.LINETYPE.CRITICAL_END:\n loopModel = bounds.endLoop();\n await svgDraw.drawLoop(diagram, loopModel, 'critical', conf);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n bounds.models.addLoop(loopModel);\n break;\n case diagObj.db.LINETYPE.BREAK_START:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin,\n conf.boxMargin + conf.boxTextMargin,\n (message) => bounds.newLoop(message)\n );\n break;\n case diagObj.db.LINETYPE.BREAK_END:\n loopModel = bounds.endLoop();\n await svgDraw.drawLoop(diagram, loopModel, 'break', conf);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n bounds.models.addLoop(loopModel);\n break;\n default:\n try {\n msgModel = msg.msgModel;\n msgModel.starty = bounds.getVerticalPos();\n msgModel.sequenceIndex = sequenceIndex;\n msgModel.sequenceVisible = diagObj.db.showSequenceNumbers();\n const lineStartY = await boundMessage(diagram, msgModel);\n adjustCreatedDestroyedData(\n msg,\n msgModel,\n lineStartY,\n index,\n actors,\n createdActors,\n destroyedActors\n );\n messagesToDraw.push({ messageModel: msgModel, lineStartY: lineStartY });\n bounds.models.addMessage(msgModel);\n } catch (e) {\n log.error('error while drawing message', e);\n }\n }\n\n // Increment sequence counter if msg.type is a line (and not another event like activation or note, etc)\n if (\n [\n diagObj.db.LINETYPE.SOLID_OPEN,\n diagObj.db.LINETYPE.DOTTED_OPEN,\n diagObj.db.LINETYPE.SOLID,\n diagObj.db.LINETYPE.DOTTED,\n diagObj.db.LINETYPE.SOLID_CROSS,\n diagObj.db.LINETYPE.DOTTED_CROSS,\n diagObj.db.LINETYPE.SOLID_POINT,\n diagObj.db.LINETYPE.DOTTED_POINT,\n diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID,\n diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED,\n ].includes(msg.type)\n ) {\n sequenceIndex = sequenceIndex + sequenceIndexStep;\n }\n index++;\n }\n\n log.debug('createdActors', createdActors);\n log.debug('destroyedActors', destroyedActors);\n await drawActors(diagram, actors, actorKeys, false);\n\n for (const e of messagesToDraw) {\n await drawMessage(diagram, e.messageModel, e.lineStartY, diagObj);\n }\n if (conf.mirrorActors) {\n await drawActors(diagram, actors, actorKeys, true);\n }\n backgrounds.forEach((e) => svgDraw.drawBackgroundRect(diagram, e));\n fixLifeLineHeights(diagram, actors, actorKeys, conf);\n\n for (const box of bounds.models.boxes) {\n box.height = bounds.getVerticalPos() - box.y;\n bounds.insert(box.x, box.y, box.x + box.width, box.height);\n const boxPadding = conf.boxMargin * 2;\n box.startx = box.x - boxPadding;\n box.starty = box.y - boxPadding * 0.25;\n box.stopx = box.startx + box.width + 2 * boxPadding;\n box.stopy = box.starty + box.height + boxPadding * 0.75;\n box.stroke = 'rgb(0,0,0, 0.5)';\n svgDraw.drawBox(diagram, box, conf);\n }\n\n if (hasBoxes) {\n bounds.bumpVerticalPos(conf.boxMargin);\n }\n\n // only draw popups for the top row of actors.\n const requiredBoxSize = drawActorsPopup(diagram, actors, actorKeys, doc);\n\n const { bounds: box } = bounds.getBounds();\n\n if (box.startx === undefined) {\n box.startx = 0;\n }\n if (box.starty === undefined) {\n box.starty = 0;\n }\n if (box.stopx === undefined) {\n box.stopx = 0;\n }\n if (box.stopy === undefined) {\n box.stopy = 0;\n }\n\n // Make sure the height of the diagram supports long menus.\n let boxHeight = box.stopy - box.starty;\n if (boxHeight < requiredBoxSize.maxHeight) {\n boxHeight = requiredBoxSize.maxHeight;\n }\n\n let height = boxHeight + 2 * conf.diagramMarginY;\n if (conf.mirrorActors) {\n height = height - conf.boxMargin + conf.bottomMarginAdj;\n }\n\n // Make sure the width of the diagram supports wide menus.\n let boxWidth = box.stopx - box.startx;\n if (boxWidth < requiredBoxSize.maxWidth) {\n boxWidth = requiredBoxSize.maxWidth;\n }\n const width = boxWidth + 2 * conf.diagramMarginX;\n\n if (title) {\n diagram\n .append('text')\n .text(title)\n .attr('x', (box.stopx - box.startx) / 2 - 2 * conf.diagramMarginX)\n .attr('y', -25);\n }\n\n configureSvgSize(diagram, height, width, conf.useMaxWidth);\n\n const extraVertForTitle = title ? 40 : 0;\n diagram.attr(\n 'viewBox',\n box.startx -\n conf.diagramMarginX +\n ' -' +\n (conf.diagramMarginY + extraVertForTitle) +\n ' ' +\n width +\n ' ' +\n (height + extraVertForTitle)\n );\n\n log.debug(`models:`, bounds.models);\n};\n\n/**\n * Retrieves the max message width of each actor, supports signals (messages, loops) and notes.\n *\n * It will enumerate each given message, and will determine its text width, in relation to the actor\n * it originates from, and destined to.\n *\n * @param actors - The actors map\n * @param messages - A list of message objects to iterate\n * @param diagObj - The diagram object.\n * @returns The max message width of each actor.\n */\nasync function getMaxMessageWidthPerActor(\n actors: Map,\n messages: any[],\n diagObj: Diagram\n): Promise> {\n const maxMessageWidthPerActor = {};\n\n for (const msg of messages) {\n if (actors.get(msg.to) && actors.get(msg.from)) {\n const actor = actors.get(msg.to);\n\n // If this is the first actor, and the message is left of it, no need to calculate the margin\n if (msg.placement === diagObj.db.PLACEMENT.LEFTOF && !actor.prevActor) {\n continue;\n }\n\n // If this is the last actor, and the message is right of it, no need to calculate the margin\n if (msg.placement === diagObj.db.PLACEMENT.RIGHTOF && !actor.nextActor) {\n continue;\n }\n\n const isNote = msg.placement !== undefined;\n const isMessage = !isNote;\n\n const textFont = isNote ? noteFont(conf) : messageFont(conf);\n const wrappedMessage = msg.wrap\n ? utils.wrapLabel(msg.message, conf.width - 2 * conf.wrapPadding, textFont)\n : msg.message;\n const messageDimensions = hasKatex(wrappedMessage)\n ? await calculateMathMLDimensions(msg.message, getConfig())\n : utils.calculateTextDimensions(wrappedMessage, textFont);\n const messageWidth = messageDimensions.width + 2 * conf.wrapPadding;\n\n /*\n * The following scenarios should be supported:\n *\n * - There's a message (non-note) between fromActor and toActor\n * - If fromActor is on the right and toActor is on the left, we should\n * define the toActor's margin\n * - If fromActor is on the left and toActor is on the right, we should\n * define the fromActor's margin\n * - There's a note, in which case fromActor == toActor\n * - If the note is to the left of the actor, we should define the previous actor\n * margin\n * - If the note is on the actor, we should define both the previous and next actor\n * margins, each being the half of the note size\n * - If the note is on the right of the actor, we should define the current actor\n * margin\n */\n if (isMessage && msg.from === actor.nextActor) {\n maxMessageWidthPerActor[msg.to] = common.getMax(\n maxMessageWidthPerActor[msg.to] || 0,\n messageWidth\n );\n } else if (isMessage && msg.from === actor.prevActor) {\n maxMessageWidthPerActor[msg.from] = common.getMax(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth\n );\n } else if (isMessage && msg.from === msg.to) {\n maxMessageWidthPerActor[msg.from] = common.getMax(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth / 2\n );\n\n maxMessageWidthPerActor[msg.to] = common.getMax(\n maxMessageWidthPerActor[msg.to] || 0,\n messageWidth / 2\n );\n } else if (msg.placement === diagObj.db.PLACEMENT.RIGHTOF) {\n maxMessageWidthPerActor[msg.from] = common.getMax(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth\n );\n } else if (msg.placement === diagObj.db.PLACEMENT.LEFTOF) {\n maxMessageWidthPerActor[actor.prevActor] = common.getMax(\n maxMessageWidthPerActor[actor.prevActor] || 0,\n messageWidth\n );\n } else if (msg.placement === diagObj.db.PLACEMENT.OVER) {\n if (actor.prevActor) {\n maxMessageWidthPerActor[actor.prevActor] = common.getMax(\n maxMessageWidthPerActor[actor.prevActor] || 0,\n messageWidth / 2\n );\n }\n\n if (actor.nextActor) {\n maxMessageWidthPerActor[msg.from] = common.getMax(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth / 2\n );\n }\n }\n }\n }\n\n log.debug('maxMessageWidthPerActor:', maxMessageWidthPerActor);\n return maxMessageWidthPerActor;\n}\n\nconst getRequiredPopupWidth = function (actor) {\n let requiredPopupWidth = 0;\n const textFont = actorFont(conf);\n for (const key in actor.links) {\n const labelDimensions = utils.calculateTextDimensions(key, textFont);\n const labelWidth = labelDimensions.width + 2 * conf.wrapPadding + 2 * conf.boxMargin;\n if (requiredPopupWidth < labelWidth) {\n requiredPopupWidth = labelWidth;\n }\n }\n\n return requiredPopupWidth;\n};\n\n/**\n * This will calculate the optimal margin for each given actor,\n * for a given actor \u2192 messageWidth map.\n *\n * An actor's margin is determined by the width of the actor, the width of the largest message that\n * originates from it, and the configured conf.actorMargin.\n *\n * @param actors - The actors map to calculate margins for\n * @param actorToMessageWidth - A map of actor key \u2192 max message width it holds\n * @param boxes - The boxes around the actors if any\n */\nasync function calculateActorMargins(\n actors: Map,\n actorToMessageWidth: Awaited>,\n boxes\n) {\n let maxHeight = 0;\n for (const prop of actors.keys()) {\n const actor = actors.get(prop);\n if (actor.wrap) {\n actor.description = utils.wrapLabel(\n actor.description,\n conf.width - 2 * conf.wrapPadding,\n actorFont(conf)\n );\n }\n const actDims = hasKatex(actor.description)\n ? await calculateMathMLDimensions(actor.description, getConfig())\n : utils.calculateTextDimensions(actor.description, actorFont(conf));\n\n actor.width = actor.wrap\n ? conf.width\n : common.getMax(conf.width, actDims.width + 2 * conf.wrapPadding);\n\n actor.height = actor.wrap ? common.getMax(actDims.height, conf.height) : conf.height;\n maxHeight = common.getMax(maxHeight, actor.height);\n }\n\n for (const actorKey in actorToMessageWidth) {\n const actor = actors.get(actorKey);\n\n if (!actor) {\n continue;\n }\n\n const nextActor = actors.get(actor.nextActor);\n\n // No need to space out an actor that doesn't have a next link\n if (!nextActor) {\n const messageWidth = actorToMessageWidth[actorKey];\n const actorWidth = messageWidth + conf.actorMargin - actor.width / 2;\n actor.margin = common.getMax(actorWidth, conf.actorMargin);\n continue;\n }\n\n const messageWidth = actorToMessageWidth[actorKey];\n const actorWidth = messageWidth + conf.actorMargin - actor.width / 2 - nextActor.width / 2;\n\n actor.margin = common.getMax(actorWidth, conf.actorMargin);\n }\n\n let maxBoxHeight = 0;\n boxes.forEach((box) => {\n const textFont = messageFont(conf);\n let totalWidth = box.actorKeys.reduce((total, aKey) => {\n return (total += actors.get(aKey).width + (actors.get(aKey).margin || 0));\n }, 0);\n\n const standardBoxPadding = conf.boxMargin * 8;\n totalWidth += standardBoxPadding;\n\n totalWidth -= 2 * conf.boxTextMargin;\n if (box.wrap) {\n box.name = utils.wrapLabel(box.name, totalWidth - 2 * conf.wrapPadding, textFont);\n }\n\n const boxMsgDimensions = utils.calculateTextDimensions(box.name, textFont);\n maxBoxHeight = common.getMax(boxMsgDimensions.height, maxBoxHeight);\n const minWidth = common.getMax(totalWidth, boxMsgDimensions.width + 2 * conf.wrapPadding);\n box.margin = conf.boxTextMargin;\n if (totalWidth < minWidth) {\n const missing = (minWidth - totalWidth) / 2;\n box.margin += missing;\n }\n });\n boxes.forEach((box) => (box.textMaxHeight = maxBoxHeight));\n\n return common.getMax(maxHeight, conf.height);\n}\n\nconst buildNoteModel = async function (msg, actors, diagObj) {\n const fromActor = actors.get(msg.from);\n const toActor = actors.get(msg.to);\n const startx = fromActor.x;\n const stopx = toActor.x;\n const shouldWrap = msg.wrap && msg.message;\n\n let textDimensions: { width: number; height: number; lineHeight?: number } = hasKatex(msg.message)\n ? await calculateMathMLDimensions(msg.message, getConfig())\n : utils.calculateTextDimensions(\n shouldWrap ? utils.wrapLabel(msg.message, conf.width, noteFont(conf)) : msg.message,\n noteFont(conf)\n );\n const noteModel = {\n width: shouldWrap\n ? conf.width\n : common.getMax(conf.width, textDimensions.width + 2 * conf.noteMargin),\n height: 0,\n startx: fromActor.x,\n stopx: 0,\n starty: 0,\n stopy: 0,\n message: msg.message,\n };\n if (msg.placement === diagObj.db.PLACEMENT.RIGHTOF) {\n noteModel.width = shouldWrap\n ? common.getMax(conf.width, textDimensions.width)\n : common.getMax(\n fromActor.width / 2 + toActor.width / 2,\n textDimensions.width + 2 * conf.noteMargin\n );\n noteModel.startx = startx + (fromActor.width + conf.actorMargin) / 2;\n } else if (msg.placement === diagObj.db.PLACEMENT.LEFTOF) {\n noteModel.width = shouldWrap\n ? common.getMax(conf.width, textDimensions.width + 2 * conf.noteMargin)\n : common.getMax(\n fromActor.width / 2 + toActor.width / 2,\n textDimensions.width + 2 * conf.noteMargin\n );\n noteModel.startx = startx - noteModel.width + (fromActor.width - conf.actorMargin) / 2;\n } else if (msg.to === msg.from) {\n textDimensions = utils.calculateTextDimensions(\n shouldWrap\n ? utils.wrapLabel(msg.message, common.getMax(conf.width, fromActor.width), noteFont(conf))\n : msg.message,\n noteFont(conf)\n );\n noteModel.width = shouldWrap\n ? common.getMax(conf.width, fromActor.width)\n : common.getMax(fromActor.width, conf.width, textDimensions.width + 2 * conf.noteMargin);\n noteModel.startx = startx + (fromActor.width - noteModel.width) / 2;\n } else {\n noteModel.width =\n Math.abs(startx + fromActor.width / 2 - (stopx + toActor.width / 2)) + conf.actorMargin;\n noteModel.startx =\n startx < stopx\n ? startx + fromActor.width / 2 - conf.actorMargin / 2\n : stopx + toActor.width / 2 - conf.actorMargin / 2;\n }\n if (shouldWrap) {\n noteModel.message = utils.wrapLabel(\n msg.message,\n noteModel.width - 2 * conf.wrapPadding,\n noteFont(conf)\n );\n }\n log.debug(\n `NM:[${noteModel.startx},${noteModel.stopx},${noteModel.starty},${noteModel.stopy}:${noteModel.width},${noteModel.height}=${msg.message}]`\n );\n return noteModel;\n};\n\nconst buildMessageModel = function (msg, actors, diagObj) {\n if (\n ![\n diagObj.db.LINETYPE.SOLID_OPEN,\n diagObj.db.LINETYPE.DOTTED_OPEN,\n diagObj.db.LINETYPE.SOLID,\n diagObj.db.LINETYPE.DOTTED,\n diagObj.db.LINETYPE.SOLID_CROSS,\n diagObj.db.LINETYPE.DOTTED_CROSS,\n diagObj.db.LINETYPE.SOLID_POINT,\n diagObj.db.LINETYPE.DOTTED_POINT,\n diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID,\n diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED,\n ].includes(msg.type)\n ) {\n return {};\n }\n const [fromLeft, fromRight] = activationBounds(msg.from, actors);\n const [toLeft, toRight] = activationBounds(msg.to, actors);\n const isArrowToRight = fromLeft <= toLeft;\n let startx = isArrowToRight ? fromRight : fromLeft;\n let stopx = isArrowToRight ? toLeft : toRight;\n\n // As the line width is considered, the left and right values will be off by 2.\n const isArrowToActivation = Math.abs(toLeft - toRight) > 2;\n\n /**\n * Adjust the value based on the arrow direction\n * @param value - The value to adjust\n * @returns The adjustment with correct sign to be added to the actual value.\n */\n const adjustValue = (value: number) => {\n return isArrowToRight ? -value : value;\n };\n\n if (msg.from === msg.to) {\n // This is a self reference, so we need to make sure the arrow is drawn correctly\n // There are many checks in the downstream rendering that checks for equality.\n // The lines on loops will be off by few pixels, but that's fine for now.\n stopx = startx;\n } else {\n /**\n * This is an edge case for the first activation.\n * Proper fix would require significant changes.\n * So, we set an activate flag in the message, and cross check that with isToActivation\n * In cases where the message is to an activation that was properly detected, we don't want to move the arrow head\n * The activation will not be detected on the first message, so we need to move the arrow head\n */\n if (msg.activate && !isArrowToActivation) {\n stopx += adjustValue(conf.activationWidth / 2 - 1);\n }\n\n /**\n * Shorten the length of arrow at the end and move the marker forward (using refX) to have a clean arrowhead\n * This is not required for open arrows that don't have arrowheads\n */\n if (![diagObj.db.LINETYPE.SOLID_OPEN, diagObj.db.LINETYPE.DOTTED_OPEN].includes(msg.type)) {\n stopx += adjustValue(3);\n }\n\n /**\n * Shorten start position of bidirectional arrow to accommodate for second arrowhead\n */\n if (\n [diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID, diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(\n msg.type\n )\n ) {\n startx -= adjustValue(3);\n }\n }\n\n const allBounds = [fromLeft, fromRight, toLeft, toRight];\n const boundedWidth = Math.abs(startx - stopx);\n if (msg.wrap && msg.message) {\n msg.message = utils.wrapLabel(\n msg.message,\n common.getMax(boundedWidth + 2 * conf.wrapPadding, conf.width),\n messageFont(conf)\n );\n }\n const msgDims = utils.calculateTextDimensions(msg.message, messageFont(conf));\n\n return {\n width: common.getMax(\n msg.wrap ? 0 : msgDims.width + 2 * conf.wrapPadding,\n boundedWidth + 2 * conf.wrapPadding,\n conf.width\n ),\n height: 0,\n startx,\n stopx,\n starty: 0,\n stopy: 0,\n message: msg.message,\n type: msg.type,\n wrap: msg.wrap,\n fromBounds: Math.min.apply(null, allBounds),\n toBounds: Math.max.apply(null, allBounds),\n };\n};\n\nconst calculateLoopBounds = async function (messages, actors, _maxWidthPerActor, diagObj) {\n const loops = {};\n const stack = [];\n let current, noteModel, msgModel;\n\n for (const msg of messages) {\n switch (msg.type) {\n case diagObj.db.LINETYPE.LOOP_START:\n case diagObj.db.LINETYPE.ALT_START:\n case diagObj.db.LINETYPE.OPT_START:\n case diagObj.db.LINETYPE.PAR_START:\n case diagObj.db.LINETYPE.PAR_OVER_START:\n case diagObj.db.LINETYPE.CRITICAL_START:\n case diagObj.db.LINETYPE.BREAK_START:\n stack.push({\n id: msg.id,\n msg: msg.message,\n from: Number.MAX_SAFE_INTEGER,\n to: Number.MIN_SAFE_INTEGER,\n width: 0,\n });\n break;\n case diagObj.db.LINETYPE.ALT_ELSE:\n case diagObj.db.LINETYPE.PAR_AND:\n case diagObj.db.LINETYPE.CRITICAL_OPTION:\n if (msg.message) {\n current = stack.pop();\n loops[current.id] = current;\n loops[msg.id] = current;\n stack.push(current);\n }\n break;\n case diagObj.db.LINETYPE.LOOP_END:\n case diagObj.db.LINETYPE.ALT_END:\n case diagObj.db.LINETYPE.OPT_END:\n case diagObj.db.LINETYPE.PAR_END:\n case diagObj.db.LINETYPE.CRITICAL_END:\n case diagObj.db.LINETYPE.BREAK_END:\n current = stack.pop();\n loops[current.id] = current;\n break;\n case diagObj.db.LINETYPE.ACTIVE_START:\n {\n const actorRect = actors.get(msg.from ? msg.from : msg.to.actor);\n const stackedSize = actorActivations(msg.from ? msg.from : msg.to.actor).length;\n const x =\n actorRect.x + actorRect.width / 2 + ((stackedSize - 1) * conf.activationWidth) / 2;\n const toAdd = {\n startx: x,\n stopx: x + conf.activationWidth,\n actor: msg.from,\n enabled: true,\n };\n bounds.activations.push(toAdd);\n }\n break;\n case diagObj.db.LINETYPE.ACTIVE_END:\n {\n const lastActorActivationIdx = bounds.activations\n .map((a) => a.actor)\n .lastIndexOf(msg.from);\n bounds.activations.splice(lastActorActivationIdx, 1).splice(0, 1);\n }\n break;\n }\n const isNote = msg.placement !== undefined;\n if (isNote) {\n noteModel = await buildNoteModel(msg, actors, diagObj);\n msg.noteModel = noteModel;\n stack.forEach((stk) => {\n current = stk;\n current.from = common.getMin(current.from, noteModel.startx);\n current.to = common.getMax(current.to, noteModel.startx + noteModel.width);\n current.width =\n common.getMax(current.width, Math.abs(current.from - current.to)) - conf.labelBoxWidth;\n });\n } else {\n msgModel = buildMessageModel(msg, actors, diagObj);\n msg.msgModel = msgModel;\n if (msgModel.startx && msgModel.stopx && stack.length > 0) {\n stack.forEach((stk) => {\n current = stk;\n if (msgModel.startx === msgModel.stopx) {\n const from = actors.get(msg.from);\n const to = actors.get(msg.to);\n current.from = common.getMin(\n from.x - msgModel.width / 2,\n from.x - from.width / 2,\n current.from\n );\n current.to = common.getMax(\n to.x + msgModel.width / 2,\n to.x + from.width / 2,\n current.to\n );\n current.width =\n common.getMax(current.width, Math.abs(current.to - current.from)) -\n conf.labelBoxWidth;\n } else {\n current.from = common.getMin(msgModel.startx, current.from);\n current.to = common.getMax(msgModel.stopx, current.to);\n current.width = common.getMax(current.width, msgModel.width) - conf.labelBoxWidth;\n }\n });\n }\n }\n }\n bounds.activations = [];\n log.debug('Loop type widths:', loops);\n return loops;\n};\n\nexport default {\n bounds,\n drawActors,\n drawActorsPopup,\n setConf,\n draw,\n};\n", "import { sanitizeUrl } from '@braintree/sanitize-url';\nimport * as configApi from '../../config.js';\nimport { ZERO_WIDTH_SPACE, parseFontSize } from '../../utils.js';\nimport common, {\n calculateMathMLDimensions,\n hasKatex,\n renderKatexSanitized,\n} from '../common/common.js';\nimport * as svgDrawCommon from '../common/svgDrawCommon.js';\n\nexport const ACTOR_TYPE_WIDTH = 18 * 2;\nconst TOP_ACTOR_CLASS = 'actor-top';\nconst BOTTOM_ACTOR_CLASS = 'actor-bottom';\nconst ACTOR_BOX_CLASS = 'actor-box';\nconst ACTOR_MAN_FIGURE_CLASS = 'actor-man';\n\nexport const drawRect = function (elem, rectData) {\n return svgDrawCommon.drawRect(elem, rectData);\n};\n\nexport const drawPopup = function (elem, actor, minMenuWidth, textAttrs, forceMenus) {\n if (actor.links === undefined || actor.links === null || Object.keys(actor.links).length === 0) {\n return { height: 0, width: 0 };\n }\n\n const links = actor.links;\n const actorCnt = actor.actorCnt;\n const rectData = actor.rectData;\n\n var displayValue = 'none';\n if (forceMenus) {\n displayValue = 'block !important';\n }\n\n const g = elem.append('g');\n g.attr('id', 'actor' + actorCnt + '_popup');\n g.attr('class', 'actorPopupMenu');\n g.attr('display', displayValue);\n var actorClass = '';\n if (rectData.class !== undefined) {\n actorClass = ' ' + rectData.class;\n }\n\n let menuWidth = rectData.width > minMenuWidth ? rectData.width : minMenuWidth;\n\n const rectElem = g.append('rect');\n rectElem.attr('class', 'actorPopupMenuPanel' + actorClass);\n rectElem.attr('x', rectData.x);\n rectElem.attr('y', rectData.height);\n rectElem.attr('fill', rectData.fill);\n rectElem.attr('stroke', rectData.stroke);\n rectElem.attr('width', menuWidth);\n rectElem.attr('height', rectData.height);\n rectElem.attr('rx', rectData.rx);\n rectElem.attr('ry', rectData.ry);\n if (links != null) {\n var linkY = 20;\n for (let key in links) {\n var linkElem = g.append('a');\n var sanitizedLink = sanitizeUrl(links[key]);\n linkElem.attr('xlink:href', sanitizedLink);\n linkElem.attr('target', '_blank');\n\n _drawMenuItemTextCandidateFunc(textAttrs)(\n key,\n linkElem,\n rectData.x + 10,\n rectData.height + linkY,\n menuWidth,\n 20,\n { class: 'actor' },\n textAttrs\n );\n\n linkY += 30;\n }\n }\n\n rectElem.attr('height', linkY);\n\n return { height: rectData.height + linkY, width: menuWidth };\n};\n\nconst popupMenuToggle = function (popId) {\n return (\n \"var pu = document.getElementById('\" +\n popId +\n \"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }\"\n );\n};\n\nexport const drawKatex = async function (elem, textData, msgModel = null) {\n let textElem = elem.append('foreignObject');\n const linesSanitized = await renderKatexSanitized(textData.text, configApi.getConfig());\n\n const divElem = textElem\n .append('xhtml:div')\n .attr('style', 'width: fit-content;')\n .attr('xmlns', 'http://www.w3.org/1999/xhtml')\n .html(linesSanitized);\n const dim = divElem.node().getBoundingClientRect();\n\n textElem.attr('height', Math.round(dim.height)).attr('width', Math.round(dim.width));\n\n if (textData.class === 'noteText') {\n const rectElem = elem.node().firstChild;\n\n rectElem.setAttribute('height', dim.height + 2 * textData.textMargin);\n const rectDim = rectElem.getBBox();\n\n textElem\n .attr('x', Math.round(rectDim.x + rectDim.width / 2 - dim.width / 2))\n .attr('y', Math.round(rectDim.y + rectDim.height / 2 - dim.height / 2));\n } else if (msgModel) {\n let { startx, stopx, starty } = msgModel;\n if (startx > stopx) {\n const temp = startx;\n startx = stopx;\n stopx = temp;\n }\n\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n textElem.attr('x', Math.round(startx + Math.abs(startx - stopx) / 2 - dim.width / 2));\n if (textData.class === 'loopText') {\n textElem.attr('y', Math.round(starty));\n } else {\n textElem.attr('y', Math.round(starty - dim.height));\n }\n }\n\n return [textElem];\n};\n\nexport const drawText = function (elem, textData) {\n let prevTextHeight = 0;\n let textHeight = 0;\n const lines = textData.text.split(common.lineBreakRegex);\n\n const [_textFontSize, _textFontSizePx] = parseFontSize(textData.fontSize);\n\n let textElems = [];\n let dy = 0;\n let yfunc = () => textData.y;\n if (\n textData.valign !== undefined &&\n textData.textMargin !== undefined &&\n textData.textMargin > 0\n ) {\n switch (textData.valign) {\n case 'top':\n case 'start':\n yfunc = () => Math.round(textData.y + textData.textMargin);\n break;\n case 'middle':\n case 'center':\n yfunc = () =>\n Math.round(textData.y + (prevTextHeight + textHeight + textData.textMargin) / 2);\n break;\n case 'bottom':\n case 'end':\n yfunc = () =>\n Math.round(\n textData.y +\n (prevTextHeight + textHeight + 2 * textData.textMargin) -\n textData.textMargin\n );\n break;\n }\n }\n\n if (\n textData.anchor !== undefined &&\n textData.textMargin !== undefined &&\n textData.width !== undefined\n ) {\n switch (textData.anchor) {\n case 'left':\n case 'start':\n textData.x = Math.round(textData.x + textData.textMargin);\n textData.anchor = 'start';\n textData.dominantBaseline = 'middle';\n textData.alignmentBaseline = 'middle';\n break;\n case 'middle':\n case 'center':\n textData.x = Math.round(textData.x + textData.width / 2);\n textData.anchor = 'middle';\n textData.dominantBaseline = 'middle';\n textData.alignmentBaseline = 'middle';\n break;\n case 'right':\n case 'end':\n textData.x = Math.round(textData.x + textData.width - textData.textMargin);\n textData.anchor = 'end';\n textData.dominantBaseline = 'middle';\n textData.alignmentBaseline = 'middle';\n break;\n }\n }\n\n for (let [i, line] of lines.entries()) {\n if (\n textData.textMargin !== undefined &&\n textData.textMargin === 0 &&\n _textFontSize !== undefined\n ) {\n dy = i * _textFontSize;\n }\n\n const textElem = elem.append('text');\n textElem.attr('x', textData.x);\n textElem.attr('y', yfunc());\n if (textData.anchor !== undefined) {\n textElem\n .attr('text-anchor', textData.anchor)\n .attr('dominant-baseline', textData.dominantBaseline)\n .attr('alignment-baseline', textData.alignmentBaseline);\n }\n if (textData.fontFamily !== undefined) {\n textElem.style('font-family', textData.fontFamily);\n }\n if (_textFontSizePx !== undefined) {\n textElem.style('font-size', _textFontSizePx);\n }\n if (textData.fontWeight !== undefined) {\n textElem.style('font-weight', textData.fontWeight);\n }\n if (textData.fill !== undefined) {\n textElem.attr('fill', textData.fill);\n }\n if (textData.class !== undefined) {\n textElem.attr('class', textData.class);\n }\n if (textData.dy !== undefined) {\n textElem.attr('dy', textData.dy);\n } else if (dy !== 0) {\n textElem.attr('dy', dy);\n }\n\n const text = line || ZERO_WIDTH_SPACE;\n if (textData.tspan) {\n const span = textElem.append('tspan');\n span.attr('x', textData.x);\n if (textData.fill !== undefined) {\n span.attr('fill', textData.fill);\n }\n span.text(text);\n } else {\n textElem.text(text);\n }\n if (\n textData.valign !== undefined &&\n textData.textMargin !== undefined &&\n textData.textMargin > 0\n ) {\n textHeight += (textElem._groups || textElem)[0][0].getBBox().height;\n prevTextHeight = textHeight;\n }\n\n textElems.push(textElem);\n }\n\n return textElems;\n};\n\nexport const drawLabel = function (elem, txtObject) {\n /**\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} cut\n * @returns {any}\n */\n function genPoints(x, y, width, height, cut) {\n return (\n x +\n ',' +\n y +\n ' ' +\n (x + width) +\n ',' +\n y +\n ' ' +\n (x + width) +\n ',' +\n (y + height - cut) +\n ' ' +\n (x + width - cut * 1.2) +\n ',' +\n (y + height) +\n ' ' +\n x +\n ',' +\n (y + height)\n );\n }\n const polygon = elem.append('polygon');\n polygon.attr('points', genPoints(txtObject.x, txtObject.y, txtObject.width, txtObject.height, 7));\n polygon.attr('class', 'labelBox');\n\n txtObject.y = txtObject.y + txtObject.height / 2;\n\n drawText(elem, txtObject);\n return polygon;\n};\n\nlet actorCnt = -1;\n\nexport const fixLifeLineHeights = (diagram, actors, actorKeys, conf) => {\n if (!diagram.select) {\n return;\n }\n actorKeys.forEach((actorKey) => {\n const actor = actors.get(actorKey);\n const actorDOM = diagram.select('#actor' + actor.actorCnt);\n if (!conf.mirrorActors && actor.stopy) {\n actorDOM.attr('y2', actor.stopy + actor.height / 2);\n } else if (conf.mirrorActors) {\n actorDOM.attr('y2', actor.stopy);\n }\n });\n};\n\n/**\n * Draws an actor in the diagram with the attached line\n *\n * @param {any} elem - The diagram we'll draw to.\n * @param {any} actor - The actor to draw.\n * @param {any} conf - DrawText implementation discriminator object\n * @param {boolean} isFooter - If the actor is the footer one\n */\nconst drawActorTypeParticipant = function (elem, actor, conf, isFooter) {\n const actorY = isFooter ? actor.stopy : actor.starty;\n const center = actor.x + actor.width / 2;\n const centerY = actorY + actor.height;\n\n const boxplusLineGroup = elem.append('g').lower();\n var g = boxplusLineGroup;\n\n if (!isFooter) {\n actorCnt++;\n if (Object.keys(actor.links || {}).length && !conf.forceMenus) {\n g.attr('onclick', popupMenuToggle(`actor${actorCnt}_popup`)).attr('cursor', 'pointer');\n }\n g.append('line')\n .attr('id', 'actor' + actorCnt)\n .attr('x1', center)\n .attr('y1', centerY)\n .attr('x2', center)\n .attr('y2', 2000)\n .attr('class', 'actor-line 200')\n .attr('stroke-width', '0.5px')\n .attr('stroke', '#999')\n .attr('name', actor.name);\n\n g = boxplusLineGroup.append('g');\n actor.actorCnt = actorCnt;\n\n if (actor.links != null) {\n g.attr('id', 'root-' + actorCnt);\n }\n }\n\n const rect = svgDrawCommon.getNoteRect();\n var cssclass = 'actor';\n if (actor.properties?.class) {\n cssclass = actor.properties.class;\n } else {\n rect.fill = '#eaeaea';\n }\n if (isFooter) {\n cssclass += ` ${BOTTOM_ACTOR_CLASS}`;\n } else {\n cssclass += ` ${TOP_ACTOR_CLASS}`;\n }\n rect.x = actor.x;\n rect.y = actorY;\n rect.width = actor.width;\n rect.height = actor.height;\n rect.class = cssclass;\n rect.rx = 3;\n rect.ry = 3;\n rect.name = actor.name;\n const rectElem = drawRect(g, rect);\n actor.rectData = rect;\n\n if (actor.properties?.icon) {\n const iconSrc = actor.properties.icon.trim();\n if (iconSrc.charAt(0) === '@') {\n svgDrawCommon.drawEmbeddedImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc.substr(1));\n } else {\n svgDrawCommon.drawImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc);\n }\n }\n\n _drawTextCandidateFunc(conf, hasKatex(actor.description))(\n actor.description,\n g,\n rect.x,\n rect.y,\n rect.width,\n rect.height,\n { class: `actor ${ACTOR_BOX_CLASS}` },\n conf\n );\n\n let height = actor.height;\n if (rectElem.node) {\n const bounds = rectElem.node().getBBox();\n actor.height = bounds.height;\n height = bounds.height;\n }\n\n return height;\n};\n\n/**\n * Draws an actor in the diagram with the attached line\n *\n * @param {any} elem - The diagram we'll draw to.\n * @param {any} actor - The actor to draw.\n * @param {any} conf - DrawText implementation discriminator object\n * @param {boolean} isFooter - If the actor is the footer one\n */\nconst drawActorTypeCollections = function (elem, actor, conf, isFooter) {\n const actorY = isFooter ? actor.stopy : actor.starty;\n const center = actor.x + actor.width / 2;\n const centerY = actorY + actor.height;\n\n const boxplusLineGroup = elem.append('g').lower();\n var g = boxplusLineGroup;\n\n if (!isFooter) {\n actorCnt++;\n if (Object.keys(actor.links || {}).length && !conf.forceMenus) {\n g.attr('onclick', popupMenuToggle(`actor${actorCnt}_popup`)).attr('cursor', 'pointer');\n }\n g.append('line')\n .attr('id', 'actor' + actorCnt)\n .attr('x1', center)\n .attr('y1', centerY)\n .attr('x2', center)\n .attr('y2', 2000)\n .attr('class', 'actor-line 200')\n .attr('stroke-width', '0.5px')\n .attr('stroke', '#999')\n .attr('name', actor.name);\n\n g = boxplusLineGroup.append('g');\n actor.actorCnt = actorCnt;\n\n if (actor.links != null) {\n g.attr('id', 'root-' + actorCnt);\n }\n }\n\n const rect = svgDrawCommon.getNoteRect();\n var cssclass = 'actor';\n if (actor.properties?.class) {\n cssclass = actor.properties.class;\n } else {\n rect.fill = '#eaeaea';\n }\n if (isFooter) {\n cssclass += ` ${BOTTOM_ACTOR_CLASS}`;\n } else {\n cssclass += ` ${TOP_ACTOR_CLASS}`;\n }\n rect.x = actor.x;\n rect.y = actorY;\n rect.width = actor.width;\n rect.height = actor.height;\n rect.class = cssclass;\n rect.name = actor.name;\n\n // DRAW STACKED RECTANGLES\n const offset = 6;\n const shadowRect = {\n ...rect,\n x: rect.x + (isFooter ? -offset : -offset),\n y: rect.y + (isFooter ? +offset : +offset),\n class: 'actor',\n };\n const rectElem = drawRect(g, rect); // draw main rectangle on top\n drawRect(g, shadowRect);\n actor.rectData = rect;\n\n if (actor.properties?.icon) {\n const iconSrc = actor.properties.icon.trim();\n if (iconSrc.charAt(0) === '@') {\n svgDrawCommon.drawEmbeddedImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc.substr(1));\n } else {\n svgDrawCommon.drawImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc);\n }\n }\n\n _drawTextCandidateFunc(conf, hasKatex(actor.description))(\n actor.description,\n g,\n rect.x - offset,\n rect.y + offset,\n rect.width,\n rect.height,\n { class: `actor ${ACTOR_BOX_CLASS}` },\n conf\n );\n\n let height = actor.height;\n if (rectElem.node) {\n const bounds = rectElem.node().getBBox();\n actor.height = bounds.height;\n height = bounds.height;\n }\n\n return height;\n};\n\nconst drawActorTypeQueue = function (elem, actor, conf, isFooter) {\n const actorY = isFooter ? actor.stopy : actor.starty;\n const center = actor.x + actor.width / 2;\n const centerY = actorY + actor.height;\n\n const boxplusLineGroup = elem.append('g').lower();\n let g = boxplusLineGroup;\n\n if (!isFooter) {\n actorCnt++;\n if (Object.keys(actor.links || {}).length && !conf.forceMenus) {\n g.attr('onclick', popupMenuToggle(`actor${actorCnt}_popup`)).attr('cursor', 'pointer');\n }\n g.append('line')\n .attr('id', 'actor' + actorCnt)\n .attr('x1', center)\n .attr('y1', centerY)\n .attr('x2', center)\n .attr('y2', 2000)\n .attr('class', 'actor-line 200')\n .attr('stroke-width', '0.5px')\n .attr('stroke', '#999')\n .attr('name', actor.name);\n\n g = boxplusLineGroup.append('g');\n actor.actorCnt = actorCnt;\n\n if (actor.links != null) {\n g.attr('id', 'root-' + actorCnt);\n }\n }\n\n const rect = svgDrawCommon.getNoteRect();\n let cssclass = 'actor';\n if (actor.properties?.class) {\n cssclass = actor.properties.class;\n } else {\n rect.fill = '#eaeaea';\n }\n\n if (isFooter) {\n cssclass += ` ${BOTTOM_ACTOR_CLASS}`;\n } else {\n cssclass += ` ${TOP_ACTOR_CLASS}`;\n }\n\n rect.x = actor.x;\n rect.y = actorY;\n rect.width = actor.width;\n rect.height = actor.height;\n rect.class = cssclass;\n rect.name = actor.name;\n\n // Cylinder dimensions\n const ry = rect.height / 2;\n const rx = ry / (2.5 + rect.height / 50);\n\n // Cylinder base group\n const cylinderGroup = g.append('g');\n const cylinderArc = g.append('g');\n\n // Main cylinder body\n cylinderGroup\n .append('path')\n .attr(\n 'd',\n `M ${rect.x},${rect.y + ry}\n a ${rx},${ry} 0 0 0 0,${rect.height}\n h ${rect.width - 2 * rx}\n a ${rx},${ry} 0 0 0 0,-${rect.height}\n Z\n `\n )\n .attr('class', cssclass);\n cylinderArc\n .append('path')\n .attr(\n 'd',\n `M ${rect.x},${rect.y + ry}\n a ${rx},${ry} 0 0 0 0,${rect.height}`\n )\n .attr('stroke', '#666')\n .attr('stroke-width', '1px')\n .attr('class', cssclass);\n\n cylinderGroup.attr('transform', `translate(${rx}, ${-(rect.height / 2)})`);\n cylinderArc.attr('transform', `translate(${rect.width - rx}, ${-rect.height / 2})`);\n\n actor.rectData = rect;\n\n if (actor.properties?.icon) {\n const iconSrc = actor.properties.icon.trim();\n const iconX = rect.x + rect.width - 20;\n const iconY = rect.y + 10;\n if (iconSrc.charAt(0) === '@') {\n svgDrawCommon.drawEmbeddedImage(g, iconX, iconY, iconSrc.substr(1));\n } else {\n svgDrawCommon.drawImage(g, iconX, iconY, iconSrc);\n }\n }\n\n _drawTextCandidateFunc(conf, hasKatex(actor.description))(\n actor.description,\n g,\n rect.x,\n rect.y,\n rect.width,\n rect.height,\n { class: `actor ${ACTOR_BOX_CLASS}` },\n conf\n );\n\n let height = actor.height;\n const lastPath = cylinderGroup.select('path:last-child');\n if (lastPath.node()) {\n const bounds = lastPath.node().getBBox();\n actor.height = bounds.height;\n height = bounds.height;\n }\n\n return height;\n};\n\nconst drawActorTypeControl = function (elem, actor, conf, isFooter) {\n const actorY = isFooter ? actor.stopy : actor.starty;\n const center = actor.x + actor.width / 2;\n const centerY = actorY + 75;\n\n const line = elem.append('g').lower();\n\n if (!isFooter) {\n actorCnt++;\n line\n .append('line')\n .attr('id', 'actor' + actorCnt)\n .attr('x1', center)\n .attr('y1', centerY)\n .attr('x2', center)\n .attr('y2', 2000)\n .attr('class', 'actor-line 200')\n .attr('stroke-width', '0.5px')\n .attr('stroke', '#999')\n .attr('name', actor.name);\n\n actor.actorCnt = actorCnt;\n }\n const actElem = elem.append('g');\n let cssClass = ACTOR_MAN_FIGURE_CLASS;\n if (isFooter) {\n cssClass += ` ${BOTTOM_ACTOR_CLASS}`;\n } else {\n cssClass += ` ${TOP_ACTOR_CLASS}`;\n }\n actElem.attr('class', cssClass);\n actElem.attr('name', actor.name);\n\n const rect = svgDrawCommon.getNoteRect();\n rect.x = actor.x;\n rect.y = actorY;\n rect.fill = '#eaeaea';\n rect.width = actor.width;\n rect.height = actor.height;\n rect.class = 'actor';\n\n const cx = actor.x + actor.width / 2;\n const cy = actorY + 30;\n const r = 18;\n\n actElem\n .append('defs')\n .append('marker')\n .attr('id', 'filled-head-control')\n .attr('refX', 11)\n .attr('refY', 5.8)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', '172.5')\n .append('path')\n .attr('d', 'M 14.4 5.6 L 7.2 10.4 L 8.8 5.6 L 7.2 0.8 Z');\n\n // Draw the base circle\n actElem\n .append('circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', r)\n .attr('fill', '#eaeaf7')\n .attr('stroke', '#666')\n .attr('stroke-width', 1.2);\n\n // Draw looping arrow as arc path\n actElem\n .append('line')\n .attr('marker-end', 'url(#filled-head-control)')\n .attr('transform', `translate(${cx}, ${cy - r})`);\n\n const bounds = actElem.node().getBBox();\n actor.height = bounds.height + 2 * (conf?.sequence?.labelBoxHeight ?? 0);\n\n _drawTextCandidateFunc(conf, hasKatex(actor.description))(\n actor.description,\n actElem,\n rect.x,\n rect.y + r + (isFooter ? 5 : 10),\n rect.width,\n rect.height,\n { class: `actor ${ACTOR_MAN_FIGURE_CLASS}` },\n conf\n );\n\n return actor.height;\n};\n\nconst drawActorTypeEntity = function (elem, actor, conf, isFooter) {\n const actorY = isFooter ? actor.stopy : actor.starty;\n const center = actor.x + actor.width / 2;\n const centerY = actorY + 75;\n\n const line = elem.append('g').lower();\n\n const actElem = elem.append('g');\n let cssClass = ACTOR_MAN_FIGURE_CLASS;\n if (isFooter) {\n cssClass += ` ${BOTTOM_ACTOR_CLASS}`;\n } else {\n cssClass += ` ${TOP_ACTOR_CLASS}`;\n }\n actElem.attr('class', cssClass);\n actElem.attr('name', actor.name);\n\n const rect = svgDrawCommon.getNoteRect();\n rect.x = actor.x;\n rect.y = actorY;\n rect.fill = '#eaeaea';\n rect.width = actor.width;\n rect.height = actor.height;\n rect.class = 'actor';\n\n const cx = actor.x + actor.width / 2;\n const cy = actorY + (!isFooter ? 25 : 10);\n const r = 18;\n\n actElem\n .append('circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', r)\n .attr('width', actor.width)\n .attr('height', actor.height);\n\n actElem\n .append('line')\n .attr('x1', cx - r)\n .attr('x2', cx + r)\n .attr('y1', cy + r)\n .attr('y2', cy + r)\n .attr('stroke', '#333')\n .attr('stroke-width', 2);\n\n const bounds = actElem.node().getBBox();\n actor.height = bounds.height + (conf?.sequence?.labelBoxHeight ?? 0);\n\n if (!isFooter) {\n actorCnt++;\n line\n .append('line')\n .attr('id', 'actor' + actorCnt)\n .attr('x1', center)\n .attr('y1', centerY)\n .attr('x2', center)\n .attr('y2', 2000)\n .attr('class', 'actor-line 200')\n .attr('stroke-width', '0.5px')\n .attr('stroke', '#999')\n .attr('name', actor.name);\n\n actor.actorCnt = actorCnt;\n }\n\n _drawTextCandidateFunc(conf, hasKatex(actor.description))(\n actor.description,\n actElem,\n rect.x,\n rect.y + (!isFooter ? (cy + r - actorY) / 2 : (cy - actorY + r - 5) / 2),\n rect.width,\n rect.height,\n { class: `actor ${ACTOR_MAN_FIGURE_CLASS}` },\n conf\n );\n\n if (!isFooter) {\n actElem.attr('transform', `translate(${0}, ${r / 2})`);\n } else {\n actElem.attr('transform', `translate(${0}, ${r / 2})`);\n }\n\n return actor.height;\n};\n\nconst drawActorTypeDatabase = function (elem, actor, conf, isFooter) {\n const actorY = isFooter ? actor.stopy : actor.starty;\n const center = actor.x + actor.width / 2;\n const centerY = actorY + actor.height + 2 * conf.boxTextMargin;\n\n const boxplusLineGroup = elem.append('g').lower();\n let g = boxplusLineGroup;\n\n if (!isFooter) {\n actorCnt++;\n if (Object.keys(actor.links || {}).length && !conf.forceMenus) {\n g.attr('onclick', popupMenuToggle(`actor${actorCnt}_popup`)).attr('cursor', 'pointer');\n }\n g.append('line')\n .attr('id', 'actor' + actorCnt)\n .attr('x1', center)\n .attr('y1', centerY)\n .attr('x2', center)\n .attr('y2', 2000)\n .attr('class', 'actor-line 200')\n .attr('stroke-width', '0.5px')\n .attr('stroke', '#999')\n .attr('name', actor.name);\n\n g = boxplusLineGroup.append('g');\n actor.actorCnt = actorCnt;\n\n if (actor.links != null) {\n g.attr('id', 'root-' + actorCnt);\n }\n }\n\n const rect = svgDrawCommon.getNoteRect();\n\n let cssclass = 'actor';\n if (actor.properties?.class) {\n cssclass = actor.properties.class;\n } else {\n rect.fill = '#eaeaea';\n }\n\n if (isFooter) {\n cssclass += ` ${BOTTOM_ACTOR_CLASS}`;\n } else {\n cssclass += ` ${TOP_ACTOR_CLASS}`;\n }\n\n rect.x = actor.x;\n rect.y = actorY;\n rect.width = actor.width;\n rect.height = actor.height;\n rect.class = cssclass;\n rect.name = actor.name;\n\n // Cylinder dimensions\n rect.x = actor.x;\n rect.y = actorY;\n const w = rect.width / 4;\n const h = rect.width / 4;\n const rx = w / 2;\n const ry = rx / (2.5 + w / 50);\n\n // Cylinder base group\n const cylinderGroup = g.append('g');\n\n const d = `\n M ${rect.x},${rect.y + ry}\n a ${rx},${ry} 0 0 0 ${w},0\n a ${rx},${ry} 0 0 0 -${w},0\n l 0,${h - 2 * ry}\n a ${rx},${ry} 0 0 0 ${w},0\n l 0,-${h - 2 * ry}\n`;\n // Draw the main cylinder body\n cylinderGroup\n .append('path')\n .attr('d', d)\n .attr('fill', '#eaeaea')\n .attr('stroke', '#000')\n .attr('stroke-width', 1)\n .attr('class', cssclass);\n\n if (!isFooter) {\n cylinderGroup.attr('transform', `translate(${w * 1.5}, ${(rect.height + ry) / 4})`);\n } else {\n cylinderGroup.attr('transform', `translate(${w * 1.5}, ${rect.height / 4 - 2 * ry})`);\n }\n actor.rectData = rect;\n _drawTextCandidateFunc(conf, hasKatex(actor.description))(\n actor.description,\n g,\n rect.x,\n rect.y + (!isFooter ? (rect.height + ry) / 2 : (rect.height + h) / 4),\n rect.width,\n rect.height,\n { class: `actor ${ACTOR_BOX_CLASS}` },\n conf\n );\n\n const lastPath = cylinderGroup.select('path:last-child');\n if (lastPath.node()) {\n const bounds = lastPath.node().getBBox();\n actor.height = bounds.height + (conf.sequence.labelBoxHeight ?? 0);\n }\n\n return actor.height;\n};\n\nconst drawActorTypeBoundary = function (elem, actor, conf, isFooter) {\n const actorY = isFooter ? actor.stopy : actor.starty;\n const center = actor.x + actor.width / 2;\n const centerY = actorY + 80;\n const radius = 30;\n const line = elem.append('g').lower();\n\n if (!isFooter) {\n actorCnt++;\n line\n .append('line')\n .attr('id', 'actor' + actorCnt)\n .attr('x1', center)\n .attr('y1', centerY)\n .attr('x2', center)\n .attr('y2', 2000)\n .attr('class', 'actor-line 200')\n .attr('stroke-width', '0.5px')\n .attr('stroke', '#999')\n .attr('name', actor.name);\n\n actor.actorCnt = actorCnt;\n }\n const actElem = elem.append('g');\n let cssClass = ACTOR_MAN_FIGURE_CLASS;\n if (isFooter) {\n cssClass += ` ${BOTTOM_ACTOR_CLASS}`;\n } else {\n cssClass += ` ${TOP_ACTOR_CLASS}`;\n }\n actElem.attr('class', cssClass);\n actElem.attr('name', actor.name);\n\n const rect = svgDrawCommon.getNoteRect();\n rect.x = actor.x;\n rect.y = actorY;\n rect.fill = '#eaeaea';\n rect.width = actor.width;\n rect.height = actor.height;\n rect.class = 'actor';\n\n actElem\n .append('line')\n .attr('id', 'actor-man-torso' + actorCnt)\n .attr('x1', actor.x + actor.width / 2 - radius * 2.5)\n .attr('y1', actorY + 10)\n .attr('x2', actor.x + actor.width / 2 - 15)\n .attr('y2', actorY + 10);\n\n actElem\n .append('line')\n .attr('id', 'actor-man-arms' + actorCnt)\n .attr('x1', actor.x + actor.width / 2 - radius * 2.5)\n .attr('y1', actorY + 0) // starting Y\n .attr('x2', actor.x + actor.width / 2 - radius * 2.5)\n .attr('y2', actorY + 20); // ending Y (26px long, adjust as needed)\n\n actElem\n .append('circle')\n .attr('cx', actor.x + actor.width / 2)\n .attr('cy', actorY + 10)\n .attr('r', radius);\n\n const bounds = actElem.node().getBBox();\n actor.height = bounds.height + (conf.sequence.labelBoxHeight ?? 0);\n\n _drawTextCandidateFunc(conf, hasKatex(actor.description))(\n actor.description,\n actElem,\n rect.x,\n rect.y + (!isFooter ? radius / 2 + 3 : radius / 2 - 4),\n rect.width,\n rect.height,\n { class: `actor ${ACTOR_MAN_FIGURE_CLASS}` },\n conf\n );\n\n if (!isFooter) {\n actElem.attr('transform', `translate(0,${radius / 2 + 7})`);\n } else {\n actElem.attr('transform', `translate(0,${radius / 2 + 7})`);\n }\n\n return actor.height;\n};\n\nconst drawActorTypeActor = function (elem, actor, conf, isFooter) {\n const actorY = isFooter ? actor.stopy : actor.starty;\n const center = actor.x + actor.width / 2;\n const centerY = actorY + 80;\n\n const line = elem.append('g').lower();\n\n if (!isFooter) {\n actorCnt++;\n line\n .append('line')\n .attr('id', 'actor' + actorCnt)\n .attr('x1', center)\n .attr('y1', centerY)\n .attr('x2', center)\n .attr('y2', 2000)\n .attr('class', 'actor-line 200')\n .attr('stroke-width', '0.5px')\n .attr('stroke', '#999')\n .attr('name', actor.name);\n\n actor.actorCnt = actorCnt;\n }\n const actElem = elem.append('g');\n let cssClass = ACTOR_MAN_FIGURE_CLASS;\n if (isFooter) {\n cssClass += ` ${BOTTOM_ACTOR_CLASS}`;\n } else {\n cssClass += ` ${TOP_ACTOR_CLASS}`;\n }\n actElem.attr('class', cssClass);\n actElem.attr('name', actor.name);\n\n const rect = svgDrawCommon.getNoteRect();\n rect.x = actor.x;\n rect.y = actorY;\n rect.fill = '#eaeaea';\n rect.width = actor.width;\n rect.height = actor.height;\n rect.class = 'actor';\n rect.rx = 3;\n rect.ry = 3;\n\n actElem\n .append('line')\n .attr('id', 'actor-man-torso' + actorCnt)\n .attr('x1', center)\n .attr('y1', actorY + 25)\n .attr('x2', center)\n .attr('y2', actorY + 45);\n\n actElem\n .append('line')\n .attr('id', 'actor-man-arms' + actorCnt)\n .attr('x1', center - ACTOR_TYPE_WIDTH / 2)\n .attr('y1', actorY + 33)\n .attr('x2', center + ACTOR_TYPE_WIDTH / 2)\n .attr('y2', actorY + 33);\n actElem\n .append('line')\n .attr('x1', center - ACTOR_TYPE_WIDTH / 2)\n .attr('y1', actorY + 60)\n .attr('x2', center)\n .attr('y2', actorY + 45);\n actElem\n .append('line')\n .attr('x1', center)\n .attr('y1', actorY + 45)\n .attr('x2', center + ACTOR_TYPE_WIDTH / 2 - 2)\n .attr('y2', actorY + 60);\n\n const circle = actElem.append('circle');\n circle.attr('cx', actor.x + actor.width / 2);\n circle.attr('cy', actorY + 10);\n circle.attr('r', 15);\n circle.attr('width', actor.width);\n circle.attr('height', actor.height);\n\n const bounds = actElem.node().getBBox();\n actor.height = bounds.height;\n\n _drawTextCandidateFunc(conf, hasKatex(actor.description))(\n actor.description,\n actElem,\n rect.x,\n rect.y + 35,\n rect.width,\n rect.height,\n { class: `actor ${ACTOR_MAN_FIGURE_CLASS}` },\n conf\n );\n\n return actor.height;\n};\n\nexport const drawActor = async function (elem, actor, conf, isFooter) {\n switch (actor.type) {\n case 'actor':\n return await drawActorTypeActor(elem, actor, conf, isFooter);\n case 'participant':\n return await drawActorTypeParticipant(elem, actor, conf, isFooter);\n case 'boundary':\n return await drawActorTypeBoundary(elem, actor, conf, isFooter);\n case 'control':\n return await drawActorTypeControl(elem, actor, conf, isFooter);\n case 'entity':\n return await drawActorTypeEntity(elem, actor, conf, isFooter);\n case 'database':\n return await drawActorTypeDatabase(elem, actor, conf, isFooter);\n case 'collections':\n return await drawActorTypeCollections(elem, actor, conf, isFooter);\n case 'queue':\n return await drawActorTypeQueue(elem, actor, conf, isFooter);\n }\n};\n\nexport const drawBox = function (elem, box, conf) {\n const boxplusTextGroup = elem.append('g');\n const g = boxplusTextGroup;\n drawBackgroundRect(g, box);\n if (box.name) {\n _drawTextCandidateFunc(conf)(\n box.name,\n g,\n box.x,\n box.y + conf.boxTextMargin + (box.textMaxHeight || 0) / 2,\n box.width,\n 0,\n { class: 'text' },\n conf\n );\n }\n g.lower();\n};\n\nexport const anchorElement = function (elem) {\n return elem.append('g');\n};\n\n/**\n * Draws an activation in the diagram\n *\n * @param {any} elem - Element to append activation rect.\n * @param {any} bounds - Activation box bounds.\n * @param {any} verticalPos - Precise y coordinate of bottom activation box edge.\n * @param {any} conf - Sequence diagram config object.\n * @param {any} actorActivations - Number of activations on the actor.\n */\nexport const drawActivation = function (elem, bounds, verticalPos, conf, actorActivations) {\n const rect = svgDrawCommon.getNoteRect();\n const g = bounds.anchored;\n rect.x = bounds.startx;\n rect.y = bounds.starty;\n rect.class = 'activation' + (actorActivations % 3); // Will evaluate to 0, 1 or 2\n rect.width = bounds.stopx - bounds.startx;\n rect.height = verticalPos - bounds.starty;\n drawRect(g, rect);\n};\n\n/**\n * Draws a loop in the diagram\n *\n * @param {any} elem - Element to append the loop to.\n * @param {any} loopModel - LoopModel of the given loop.\n * @param {any} labelText - Text within the loop.\n * @param {any} conf - Diagram configuration\n * @returns {any}\n */\nexport const drawLoop = async function (elem, loopModel, labelText, conf) {\n const {\n boxMargin,\n boxTextMargin,\n labelBoxHeight,\n labelBoxWidth,\n messageFontFamily: fontFamily,\n messageFontSize: fontSize,\n messageFontWeight: fontWeight,\n } = conf;\n const g = elem.append('g');\n const drawLoopLine = function (startx, starty, stopx, stopy) {\n return g\n .append('line')\n .attr('x1', startx)\n .attr('y1', starty)\n .attr('x2', stopx)\n .attr('y2', stopy)\n .attr('class', 'loopLine');\n };\n drawLoopLine(loopModel.startx, loopModel.starty, loopModel.stopx, loopModel.starty);\n drawLoopLine(loopModel.stopx, loopModel.starty, loopModel.stopx, loopModel.stopy);\n drawLoopLine(loopModel.startx, loopModel.stopy, loopModel.stopx, loopModel.stopy);\n drawLoopLine(loopModel.startx, loopModel.starty, loopModel.startx, loopModel.stopy);\n if (loopModel.sections !== undefined) {\n loopModel.sections.forEach(function (item) {\n drawLoopLine(loopModel.startx, item.y, loopModel.stopx, item.y).style(\n 'stroke-dasharray',\n '3, 3'\n );\n });\n }\n\n let txt = svgDrawCommon.getTextObj();\n txt.text = labelText;\n txt.x = loopModel.startx;\n txt.y = loopModel.starty;\n txt.fontFamily = fontFamily;\n txt.fontSize = fontSize;\n txt.fontWeight = fontWeight;\n txt.anchor = 'middle';\n txt.valign = 'middle';\n txt.tspan = false;\n txt.width = labelBoxWidth || 50;\n txt.height = labelBoxHeight || 20;\n txt.textMargin = boxTextMargin;\n txt.class = 'labelText';\n\n drawLabel(g, txt);\n txt = getTextObj();\n txt.text = loopModel.title;\n txt.x = loopModel.startx + labelBoxWidth / 2 + (loopModel.stopx - loopModel.startx) / 2;\n txt.y = loopModel.starty + boxMargin + boxTextMargin;\n txt.anchor = 'middle';\n txt.valign = 'middle';\n txt.textMargin = boxTextMargin;\n txt.class = 'loopText';\n txt.fontFamily = fontFamily;\n txt.fontSize = fontSize;\n txt.fontWeight = fontWeight;\n txt.wrap = true;\n\n let textElem = hasKatex(txt.text) ? await drawKatex(g, txt, loopModel) : drawText(g, txt);\n\n if (loopModel.sectionTitles !== undefined) {\n for (const [idx, item] of Object.entries(loopModel.sectionTitles)) {\n if (item.message) {\n txt.text = item.message;\n txt.x = loopModel.startx + (loopModel.stopx - loopModel.startx) / 2;\n txt.y = loopModel.sections[idx].y + boxMargin + boxTextMargin;\n txt.class = 'loopText';\n txt.anchor = 'middle';\n txt.valign = 'middle';\n txt.tspan = false;\n txt.fontFamily = fontFamily;\n txt.fontSize = fontSize;\n txt.fontWeight = fontWeight;\n txt.wrap = loopModel.wrap;\n\n if (hasKatex(txt.text)) {\n loopModel.starty = loopModel.sections[idx].y;\n await drawKatex(g, txt, loopModel);\n } else {\n drawText(g, txt);\n }\n let sectionHeight = Math.round(\n textElem\n .map((te) => (te._groups || te)[0][0].getBBox().height)\n .reduce((acc, curr) => acc + curr)\n );\n loopModel.sections[idx].height += sectionHeight - (boxMargin + boxTextMargin);\n }\n }\n }\n\n loopModel.height = Math.round(loopModel.stopy - loopModel.starty);\n return g;\n};\n\n/**\n * Draws a background rectangle\n *\n * @param {any} elem Diagram (reference for bounds)\n * @param {any} bounds Shape of the rectangle\n */\nexport const drawBackgroundRect = function (elem, bounds) {\n svgDrawCommon.drawBackgroundRect(elem, bounds);\n};\n\nexport const insertDatabaseIcon = function (elem) {\n elem\n .append('defs')\n .append('symbol')\n .attr('id', 'database')\n .attr('fill-rule', 'evenodd')\n .attr('clip-rule', 'evenodd')\n .append('path')\n .attr('transform', 'scale(.5)')\n .attr(\n 'd',\n 'M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z'\n );\n};\n\nexport const insertComputerIcon = function (elem) {\n elem\n .append('defs')\n .append('symbol')\n .attr('id', 'computer')\n .attr('width', '24')\n .attr('height', '24')\n .append('path')\n .attr('transform', 'scale(.5)')\n .attr(\n 'd',\n 'M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z'\n );\n};\n\nexport const insertClockIcon = function (elem) {\n elem\n .append('defs')\n .append('symbol')\n .attr('id', 'clock')\n .attr('width', '24')\n .attr('height', '24')\n .append('path')\n .attr('transform', 'scale(.5)')\n .attr(\n 'd',\n 'M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z'\n );\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n *\n * @param elem\n */\nexport const insertArrowHead = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'arrowhead')\n .attr('refX', 7.9)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto-start-reverse')\n .append('path')\n .attr('d', 'M -1 0 L 10 5 L 0 10 z'); // this is actual shape for arrowhead\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n *\n * @param {any} elem\n */\nexport const insertArrowFilledHead = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'filled-head')\n .attr('refX', 15.5)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\n\n/**\n * Setup node number. The result is appended to the svg.\n *\n * @param {any} elem\n */\nexport const insertSequenceNumber = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'sequencenumber')\n .attr('refX', 15)\n .attr('refY', 15)\n .attr('markerWidth', 60)\n .attr('markerHeight', 40)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', 15)\n .attr('cy', 15)\n .attr('r', 6);\n // .style(\"fill\", '#f00');\n};\n\n/**\n * Setup cross head and define the marker. The result is appended to the svg.\n *\n * @param {any} elem\n */\nexport const insertArrowCrossHead = function (elem) {\n const defs = elem.append('defs');\n const marker = defs\n .append('marker')\n .attr('id', 'crosshead')\n .attr('markerWidth', 15)\n .attr('markerHeight', 8)\n .attr('orient', 'auto')\n .attr('refX', 4)\n .attr('refY', 4.5);\n // The cross\n marker\n .append('path')\n .attr('fill', 'none')\n .attr('stroke', '#000000')\n .style('stroke-dasharray', '0, 0')\n .attr('stroke-width', '1pt')\n .attr('d', 'M 1,2 L 6,7 M 6,2 L 1,7');\n // this is actual shape for arrowhead\n};\n\nexport const getTextObj = function () {\n return {\n x: 0,\n y: 0,\n fill: undefined,\n anchor: undefined,\n style: '#666',\n width: undefined,\n height: undefined,\n textMargin: 0,\n rx: 0,\n ry: 0,\n tspan: true,\n valign: undefined,\n };\n};\n\nexport const getNoteRect = function () {\n return {\n x: 0,\n y: 0,\n fill: '#EDF2AE',\n stroke: '#666',\n width: 100,\n anchor: 'start',\n height: 100,\n rx: 0,\n ry: 0,\n };\n};\n\nconst _drawTextCandidateFunc = (function () {\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n */\n function byText(content, g, x, y, width, height, textAttrs) {\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y + height / 2 + 5)\n .style('text-anchor', 'middle')\n .text(content);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n */\n function byTspan(content, g, x, y, width, height, textAttrs, conf) {\n const { actorFontSize, actorFontFamily, actorFontWeight } = conf;\n\n const [_actorFontSize, _actorFontSizePx] = parseFontSize(actorFontSize);\n\n const lines = content.split(common.lineBreakRegex);\n for (let i = 0; i < lines.length; i++) {\n const dy = i * _actorFontSize - (_actorFontSize * (lines.length - 1)) / 2;\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y)\n .style('text-anchor', 'middle')\n .style('font-size', _actorFontSizePx)\n .style('font-weight', actorFontWeight)\n .style('font-family', actorFontFamily);\n text\n .append('tspan')\n .attr('x', x + width / 2)\n .attr('dy', dy)\n .text(lines[i]);\n\n text\n .attr('y', y + height / 2.0)\n .attr('dominant-baseline', 'central')\n .attr('alignment-baseline', 'central');\n\n _setTextAttrs(text, textAttrs);\n }\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n */\n function byFo(content, g, x, y, width, height, textAttrs, conf) {\n const s = g.append('switch');\n const f = s\n .append('foreignObject')\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height);\n\n const text = f\n .append('xhtml:div')\n .style('display', 'table')\n .style('height', '100%')\n .style('width', '100%');\n\n text\n .append('div')\n .style('display', 'table-cell')\n .style('text-align', 'center')\n .style('vertical-align', 'middle')\n .text(content);\n\n byTspan(content, s, x, y, width, height, textAttrs, conf);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n *\n * @param content\n * @param g\n * @param x\n * @param y\n * @param width\n * @param height\n * @param textAttrs\n * @param conf\n */\n async function byKatex(content, g, x, y, width, height, textAttrs, conf) {\n // TODO duplicate render calls, optimize\n\n const dim = await calculateMathMLDimensions(content, configApi.getConfig());\n const s = g.append('switch');\n const f = s\n .append('foreignObject')\n .attr('x', x + width / 2 - dim.width / 2)\n .attr('y', y + height / 2 - dim.height / 2)\n .attr('width', dim.width)\n .attr('height', dim.height);\n\n const text = f.append('xhtml:div').style('height', '100%').style('width', '100%');\n\n text\n .append('div')\n .style('text-align', 'center')\n .style('vertical-align', 'middle')\n .html(await renderKatexSanitized(content, configApi.getConfig()));\n\n byTspan(content, s, x, y, width, height, textAttrs, conf);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} toText\n * @param {any} fromTextAttrsDict\n */\n function _setTextAttrs(toText, fromTextAttrsDict) {\n for (const key in fromTextAttrsDict) {\n if (fromTextAttrsDict.hasOwnProperty(key)) {\n toText.attr(key, fromTextAttrsDict[key]);\n }\n }\n }\n\n return function (conf, hasKatex = false) {\n if (hasKatex) {\n return byKatex;\n }\n return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;\n };\n})();\n\nconst _drawMenuItemTextCandidateFunc = (function () {\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n */\n function byText(content, g, x, y, width, height, textAttrs) {\n const text = g\n .append('text')\n .attr('x', x)\n .attr('y', y)\n .style('text-anchor', 'start')\n .text(content);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n */\n function byTspan(content, g, x, y, width, height, textAttrs, conf) {\n const { actorFontSize, actorFontFamily, actorFontWeight } = conf;\n\n const lines = content.split(common.lineBreakRegex);\n for (let i = 0; i < lines.length; i++) {\n const dy = i * actorFontSize - (actorFontSize * (lines.length - 1)) / 2;\n const text = g\n .append('text')\n .attr('x', x)\n .attr('y', y)\n .style('text-anchor', 'start')\n .style('font-size', actorFontSize)\n .style('font-weight', actorFontWeight)\n .style('font-family', actorFontFamily);\n text.append('tspan').attr('x', x).attr('dy', dy).text(lines[i]);\n\n text\n .attr('y', y + height / 2.0)\n .attr('dominant-baseline', 'central')\n .attr('alignment-baseline', 'central');\n\n _setTextAttrs(text, textAttrs);\n }\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n */\n function byFo(content, g, x, y, width, height, textAttrs, conf) {\n const s = g.append('switch');\n const f = s\n .append('foreignObject')\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height);\n\n const text = f\n .append('xhtml:div')\n .style('display', 'table')\n .style('height', '100%')\n .style('width', '100%');\n\n text\n .append('div')\n .style('display', 'table-cell')\n .style('text-align', 'center')\n .style('vertical-align', 'middle')\n .text(content);\n\n byTspan(content, s, x, y, width, height, textAttrs, conf);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} toText\n * @param {any} fromTextAttrsDict\n */\n function _setTextAttrs(toText, fromTextAttrsDict) {\n for (const key in fromTextAttrsDict) {\n if (fromTextAttrsDict.hasOwnProperty(key)) {\n toText.attr(key, fromTextAttrsDict[key]);\n }\n }\n }\n\n return function (conf) {\n return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;\n };\n})();\n\nexport default {\n drawRect,\n drawText,\n drawLabel,\n drawActor,\n drawBox,\n drawPopup,\n anchorElement,\n drawActivation,\n drawLoop,\n drawBackgroundRect,\n insertArrowHead,\n insertArrowFilledHead,\n insertSequenceNumber,\n insertArrowCrossHead,\n insertDatabaseIcon,\n insertComputerIcon,\n insertClockIcon,\n getTextObj,\n getNoteRect,\n fixLifeLineHeights,\n sanitizeUrl,\n};\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: JISON doesn't support types\nimport parser from './parser/sequenceDiagram.jison';\nimport { SequenceDB } from './sequenceDb.js';\nimport styles from './styles.js';\nimport { setConfig } from '../../diagram-api/diagramAPI.js';\nimport renderer from './sequenceRenderer.js';\nimport type { MermaidConfig } from '../../config.type.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n get db() {\n return new SequenceDB();\n },\n renderer,\n styles,\n init: (cnf: MermaidConfig) => {\n if (!cnf.sequence) {\n cnf.sequence = {};\n }\n if (cnf.wrap) {\n cnf.sequence.wrap = cnf.wrap;\n setConfig({ sequence: { wrap: cnf.wrap } });\n }\n },\n};\n"], + "mappings": "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KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAE,CAAC,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,GAAG,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,GAAE,EAAC,IAAG,GAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,KAAI,EAAC,GAAE,IAAG,CAAC,GAAE,EAAE,KAAI,KAAI,EAAC,GAAE,IAAG,CAAC,GAAE,EAAE,KAAI,KAAI,EAAC,GAAE,IAAG,CAAC,GAAE,EAAE,KAAI,KAAI,EAAC,IAAG,KAAI,GAAE,IAAG,CAAC,GAAE,EAAE,KAAI,KAAI,EAAC,IAAG,KAAI,GAAE,IAAG,CAAC,GAAE,EAAE,KAAI,KAAI,EAAC,GAAE,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,KAAI,EAAC,IAAG,KAAI,GAAE,IAAG,CAAC,GAAE,EAAE,KAAI,KAAI,EAAC,GAAE,IAAG,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,CAAC,GAAE,EAAE,GAAE,KAAI,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,EAAC,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,GAAE,GAAE,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,GAAG,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,GAAE,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,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", + "names": ["o", "parser", "lexer", "getConfig", "text", "drawRect", "actorCnt", "diagram", "conf", "bounds", "drawBackgroundRect", "actorActivations", "getTextObj", "getNoteRect", "hasKatex", "getConfig", "diagram", "box", "messageWidth", "actorWidth"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-FKZM4ZOC.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-FKZM4ZOC.mjs new file mode 100644 index 0000000..a841a6e --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-FKZM4ZOC.mjs @@ -0,0 +1,488 @@ +import { + StateDB, + stateDiagram_default, + styles_default +} from "./chunk-DI55MBZ5.mjs"; +import "./chunk-55IACEB6.mjs"; +import "./chunk-QN33PNHL.mjs"; +import "./chunk-N4CR4FBY.mjs"; +import "./chunk-QXUST7PY.mjs"; +import "./chunk-HN2XXSSU.mjs"; +import "./chunk-JZLCHNYA.mjs"; +import "./chunk-CVBHYZKI.mjs"; +import "./chunk-ATLVNIR6.mjs"; +import "./chunk-JA3XYJ7Z.mjs"; +import { + utils_default +} from "./chunk-S3R3BYOJ.mjs"; +import { + common_default, + configureSvgSize, + getConfig2 as getConfig, + getUrl +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/state/stateRenderer.js +import { select } from "d3"; +import { layout as dagreLayout } from "dagre-d3-es/src/dagre/index.js"; +import * as graphlib from "dagre-d3-es/src/graphlib/index.js"; + +// src/diagrams/state/shapes.js +import { line, curveBasis } from "d3"; +var drawStartState = /* @__PURE__ */ __name((g) => g.append("circle").attr("class", "start-state").attr("r", getConfig().state.sizeUnit).attr("cx", getConfig().state.padding + getConfig().state.sizeUnit).attr("cy", getConfig().state.padding + getConfig().state.sizeUnit), "drawStartState"); +var drawDivider = /* @__PURE__ */ __name((g) => g.append("line").style("stroke", "grey").style("stroke-dasharray", "3").attr("x1", getConfig().state.textHeight).attr("class", "divider").attr("x2", getConfig().state.textHeight * 2).attr("y1", 0).attr("y2", 0), "drawDivider"); +var drawSimpleState = /* @__PURE__ */ __name((g, stateDef) => { + const state = g.append("text").attr("x", 2 * getConfig().state.padding).attr("y", getConfig().state.textHeight + 2 * getConfig().state.padding).attr("font-size", getConfig().state.fontSize).attr("class", "state-title").text(stateDef.id); + const classBox = state.node().getBBox(); + g.insert("rect", ":first-child").attr("x", getConfig().state.padding).attr("y", getConfig().state.padding).attr("width", classBox.width + 2 * getConfig().state.padding).attr("height", classBox.height + 2 * getConfig().state.padding).attr("rx", getConfig().state.radius); + return state; +}, "drawSimpleState"); +var drawDescrState = /* @__PURE__ */ __name((g, stateDef) => { + const addTspan = /* @__PURE__ */ __name(function(textEl, txt, isFirst2) { + const tSpan = textEl.append("tspan").attr("x", 2 * getConfig().state.padding).text(txt); + if (!isFirst2) { + tSpan.attr("dy", getConfig().state.textHeight); + } + }, "addTspan"); + const title = g.append("text").attr("x", 2 * getConfig().state.padding).attr("y", getConfig().state.textHeight + 1.3 * getConfig().state.padding).attr("font-size", getConfig().state.fontSize).attr("class", "state-title").text(stateDef.descriptions[0]); + const titleBox = title.node().getBBox(); + const titleHeight = titleBox.height; + const description = g.append("text").attr("x", getConfig().state.padding).attr( + "y", + titleHeight + getConfig().state.padding * 0.4 + getConfig().state.dividerMargin + getConfig().state.textHeight + ).attr("class", "state-description"); + let isFirst = true; + let isSecond = true; + stateDef.descriptions.forEach(function(descr) { + if (!isFirst) { + addTspan(description, descr, isSecond); + isSecond = false; + } + isFirst = false; + }); + const descrLine = g.append("line").attr("x1", getConfig().state.padding).attr("y1", getConfig().state.padding + titleHeight + getConfig().state.dividerMargin / 2).attr("y2", getConfig().state.padding + titleHeight + getConfig().state.dividerMargin / 2).attr("class", "descr-divider"); + const descrBox = description.node().getBBox(); + const width = Math.max(descrBox.width, titleBox.width); + descrLine.attr("x2", width + 3 * getConfig().state.padding); + g.insert("rect", ":first-child").attr("x", getConfig().state.padding).attr("y", getConfig().state.padding).attr("width", width + 2 * getConfig().state.padding).attr("height", descrBox.height + titleHeight + 2 * getConfig().state.padding).attr("rx", getConfig().state.radius); + return g; +}, "drawDescrState"); +var addTitleAndBox = /* @__PURE__ */ __name((g, stateDef, altBkg) => { + const pad = getConfig().state.padding; + const dblPad = 2 * getConfig().state.padding; + const orgBox = g.node().getBBox(); + const orgWidth = orgBox.width; + const orgX = orgBox.x; + const title = g.append("text").attr("x", 0).attr("y", getConfig().state.titleShift).attr("font-size", getConfig().state.fontSize).attr("class", "state-title").text(stateDef.id); + const titleBox = title.node().getBBox(); + const titleWidth = titleBox.width + dblPad; + let width = Math.max(titleWidth, orgWidth); + if (width === orgWidth) { + width = width + dblPad; + } + let startX; + const graphBox = g.node().getBBox(); + if (stateDef.doc) { + } + startX = orgX - pad; + if (titleWidth > orgWidth) { + startX = (orgWidth - width) / 2 + pad; + } + if (Math.abs(orgX - graphBox.x) < pad && titleWidth > orgWidth) { + startX = orgX - (titleWidth - orgWidth) / 2; + } + const lineY = 1 - getConfig().state.textHeight; + g.insert("rect", ":first-child").attr("x", startX).attr("y", lineY).attr("class", altBkg ? "alt-composit" : "composit").attr("width", width).attr( + "height", + graphBox.height + getConfig().state.textHeight + getConfig().state.titleShift + 1 + ).attr("rx", "0"); + title.attr("x", startX + pad); + if (titleWidth <= orgWidth) { + title.attr("x", orgX + (width - dblPad) / 2 - titleWidth / 2 + pad); + } + g.insert("rect", ":first-child").attr("x", startX).attr( + "y", + getConfig().state.titleShift - getConfig().state.textHeight - getConfig().state.padding + ).attr("width", width).attr("height", getConfig().state.textHeight * 3).attr("rx", getConfig().state.radius); + g.insert("rect", ":first-child").attr("x", startX).attr( + "y", + getConfig().state.titleShift - getConfig().state.textHeight - getConfig().state.padding + ).attr("width", width).attr("height", graphBox.height + 3 + 2 * getConfig().state.textHeight).attr("rx", getConfig().state.radius); + return g; +}, "addTitleAndBox"); +var drawEndState = /* @__PURE__ */ __name((g) => { + g.append("circle").attr("class", "end-state-outer").attr("r", getConfig().state.sizeUnit + getConfig().state.miniPadding).attr( + "cx", + getConfig().state.padding + getConfig().state.sizeUnit + getConfig().state.miniPadding + ).attr( + "cy", + getConfig().state.padding + getConfig().state.sizeUnit + getConfig().state.miniPadding + ); + return g.append("circle").attr("class", "end-state-inner").attr("r", getConfig().state.sizeUnit).attr("cx", getConfig().state.padding + getConfig().state.sizeUnit + 2).attr("cy", getConfig().state.padding + getConfig().state.sizeUnit + 2); +}, "drawEndState"); +var drawForkJoinState = /* @__PURE__ */ __name((g, stateDef) => { + let width = getConfig().state.forkWidth; + let height = getConfig().state.forkHeight; + if (stateDef.parentId) { + let tmp = width; + width = height; + height = tmp; + } + return g.append("rect").style("stroke", "black").style("fill", "black").attr("width", width).attr("height", height).attr("x", getConfig().state.padding).attr("y", getConfig().state.padding); +}, "drawForkJoinState"); +var _drawLongText = /* @__PURE__ */ __name((_text, x, y, g) => { + let textHeight = 0; + const textElem = g.append("text"); + textElem.style("text-anchor", "start"); + textElem.attr("class", "noteText"); + let text = _text.replace(/\r\n/g, "
"); + text = text.replace(/\n/g, "
"); + const lines = text.split(common_default.lineBreakRegex); + let tHeight = 1.25 * getConfig().state.noteMargin; + for (const line2 of lines) { + const txt = line2.trim(); + if (txt.length > 0) { + const span = textElem.append("tspan"); + span.text(txt); + if (tHeight === 0) { + const textBounds = span.node().getBBox(); + tHeight += textBounds.height; + } + textHeight += tHeight; + span.attr("x", x + getConfig().state.noteMargin); + span.attr("y", y + textHeight + 1.25 * getConfig().state.noteMargin); + } + } + return { textWidth: textElem.node().getBBox().width, textHeight }; +}, "_drawLongText"); +var drawNote = /* @__PURE__ */ __name((text, g) => { + g.attr("class", "state-note"); + const note = g.append("rect").attr("x", 0).attr("y", getConfig().state.padding); + const rectElem = g.append("g"); + const { textWidth, textHeight } = _drawLongText(text, 0, 0, rectElem); + note.attr("height", textHeight + 2 * getConfig().state.noteMargin); + note.attr("width", textWidth + getConfig().state.noteMargin * 2); + return note; +}, "drawNote"); +var drawState = /* @__PURE__ */ __name(function(elem, stateDef) { + const id = stateDef.id; + const stateInfo = { + id, + label: stateDef.id, + width: 0, + height: 0 + }; + const g = elem.append("g").attr("id", id).attr("class", "stateGroup"); + if (stateDef.type === "start") { + drawStartState(g); + } + if (stateDef.type === "end") { + drawEndState(g); + } + if (stateDef.type === "fork" || stateDef.type === "join") { + drawForkJoinState(g, stateDef); + } + if (stateDef.type === "note") { + drawNote(stateDef.note.text, g); + } + if (stateDef.type === "divider") { + drawDivider(g); + } + if (stateDef.type === "default" && stateDef.descriptions.length === 0) { + drawSimpleState(g, stateDef); + } + if (stateDef.type === "default" && stateDef.descriptions.length > 0) { + drawDescrState(g, stateDef); + } + const stateBox = g.node().getBBox(); + stateInfo.width = stateBox.width + 2 * getConfig().state.padding; + stateInfo.height = stateBox.height + 2 * getConfig().state.padding; + return stateInfo; +}, "drawState"); +var edgeCount = 0; +var drawEdge = /* @__PURE__ */ __name(function(elem, path, relation) { + const getRelationType = /* @__PURE__ */ __name(function(type) { + switch (type) { + case StateDB.relationType.AGGREGATION: + return "aggregation"; + case StateDB.relationType.EXTENSION: + return "extension"; + case StateDB.relationType.COMPOSITION: + return "composition"; + case StateDB.relationType.DEPENDENCY: + return "dependency"; + } + }, "getRelationType"); + path.points = path.points.filter((p) => !Number.isNaN(p.y)); + const lineData = path.points; + const lineFunction = line().x(function(d) { + return d.x; + }).y(function(d) { + return d.y; + }).curve(curveBasis); + const svgPath = elem.append("path").attr("d", lineFunction(lineData)).attr("id", "edge" + edgeCount).attr("class", "transition"); + let url = ""; + if (getConfig().state.arrowMarkerAbsolute) { + url = getUrl(true); + } + svgPath.attr( + "marker-end", + "url(" + url + "#" + getRelationType(StateDB.relationType.DEPENDENCY) + "End)" + ); + if (relation.title !== void 0) { + const label = elem.append("g").attr("class", "stateLabel"); + const { x, y } = utils_default.calcLabelPosition(path.points); + const rows = common_default.getRows(relation.title); + let titleHeight = 0; + const titleRows = []; + let maxWidth = 0; + let minX = 0; + for (let i = 0; i <= rows.length; i++) { + const title = label.append("text").attr("text-anchor", "middle").text(rows[i]).attr("x", x).attr("y", y + titleHeight); + const boundsTmp = title.node().getBBox(); + maxWidth = Math.max(maxWidth, boundsTmp.width); + minX = Math.min(minX, boundsTmp.x); + log.info(boundsTmp.x, x, y + titleHeight); + if (titleHeight === 0) { + const titleBox = title.node().getBBox(); + titleHeight = titleBox.height; + log.info("Title height", titleHeight, y); + } + titleRows.push(title); + } + let boxHeight = titleHeight * rows.length; + if (rows.length > 1) { + const heightAdj = (rows.length - 1) * titleHeight * 0.5; + titleRows.forEach((title, i) => title.attr("y", y + i * titleHeight - heightAdj)); + boxHeight = titleHeight * rows.length; + } + const bounds = label.node().getBBox(); + label.insert("rect", ":first-child").attr("class", "box").attr("x", x - maxWidth / 2 - getConfig().state.padding / 2).attr("y", y - boxHeight / 2 - getConfig().state.padding / 2 - 3.5).attr("width", maxWidth + getConfig().state.padding).attr("height", boxHeight + getConfig().state.padding); + log.info(bounds); + } + edgeCount++; +}, "drawEdge"); + +// src/diagrams/state/stateRenderer.js +var conf; +var transformationLog = {}; +var setConf = /* @__PURE__ */ __name(function() { +}, "setConf"); +var insertMarkers = /* @__PURE__ */ __name(function(elem) { + elem.append("defs").append("marker").attr("id", "dependencyEnd").attr("refX", 19).attr("refY", 7).attr("markerWidth", 20).attr("markerHeight", 28).attr("orient", "auto").append("path").attr("d", "M 19,7 L9,13 L14,7 L9,1 Z"); +}, "insertMarkers"); +var draw = /* @__PURE__ */ __name(function(text, id, _version, diagObj) { + conf = getConfig().state; + const securityLevel = getConfig().securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = select("#i" + id); + } + const root = securityLevel === "sandbox" ? select(sandboxElement.nodes()[0].contentDocument.body) : select("body"); + const doc = securityLevel === "sandbox" ? sandboxElement.nodes()[0].contentDocument : document; + log.debug("Rendering diagram " + text); + const diagram2 = root.select(`[id='${id}']`); + insertMarkers(diagram2); + const rootDoc = diagObj.db.getRootDoc(); + renderDoc(rootDoc, diagram2, void 0, false, root, doc, diagObj); + const padding = conf.padding; + const bounds = diagram2.node().getBBox(); + const width = bounds.width + padding * 2; + const height = bounds.height + padding * 2; + const svgWidth = width * 1.75; + configureSvgSize(diagram2, height, svgWidth, conf.useMaxWidth); + diagram2.attr( + "viewBox", + `${bounds.x - conf.padding} ${bounds.y - conf.padding} ` + width + " " + height + ); +}, "draw"); +var getLabelWidth = /* @__PURE__ */ __name((text) => { + return text ? text.length * conf.fontSizeFactor : 1; +}, "getLabelWidth"); +var renderDoc = /* @__PURE__ */ __name((doc, diagram2, parentId, altBkg, root, domDocument, diagObj) => { + const graph = new graphlib.Graph({ + compound: true, + multigraph: true + }); + let i; + let edgeFreeDoc = true; + for (i = 0; i < doc.length; i++) { + if (doc[i].stmt === "relation") { + edgeFreeDoc = false; + break; + } + } + if (parentId) { + graph.setGraph({ + rankdir: "LR", + multigraph: true, + compound: true, + // acyclicer: 'greedy', + ranker: "tight-tree", + ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor, + nodeSep: edgeFreeDoc ? 1 : 50, + isMultiGraph: true + // ranksep: 5, + // nodesep: 1 + }); + } else { + graph.setGraph({ + rankdir: "TB", + multigraph: true, + compound: true, + // isCompound: true, + // acyclicer: 'greedy', + // ranker: 'longest-path' + ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor, + nodeSep: edgeFreeDoc ? 1 : 50, + ranker: "tight-tree", + // ranker: 'network-simplex' + isMultiGraph: true + }); + } + graph.setDefaultEdgeLabel(function() { + return {}; + }); + const states = diagObj.db.getStates(); + const relations = diagObj.db.getRelations(); + const keys = Object.keys(states); + let first = true; + for (const key of keys) { + const stateDef = states[key]; + if (parentId) { + stateDef.parentId = parentId; + } + let node; + if (stateDef.doc) { + let sub = diagram2.append("g").attr("id", stateDef.id).attr("class", "stateGroup"); + node = renderDoc(stateDef.doc, sub, stateDef.id, !altBkg, root, domDocument, diagObj); + if (first) { + sub = addTitleAndBox(sub, stateDef, altBkg); + let boxBounds = sub.node().getBBox(); + node.width = boxBounds.width; + node.height = boxBounds.height + conf.padding / 2; + transformationLog[stateDef.id] = { y: conf.compositTitleSize }; + } else { + let boxBounds = sub.node().getBBox(); + node.width = boxBounds.width; + node.height = boxBounds.height; + } + } else { + node = drawState(diagram2, stateDef, graph); + } + if (stateDef.note) { + const noteDef = { + descriptions: [], + id: stateDef.id + "-note", + note: stateDef.note, + type: "note" + }; + const note = drawState(diagram2, noteDef, graph); + if (stateDef.note.position === "left of") { + graph.setNode(node.id + "-note", note); + graph.setNode(node.id, node); + } else { + graph.setNode(node.id, node); + graph.setNode(node.id + "-note", note); + } + graph.setParent(node.id, node.id + "-group"); + graph.setParent(node.id + "-note", node.id + "-group"); + } else { + graph.setNode(node.id, node); + } + } + log.debug("Count=", graph.nodeCount(), graph); + let cnt = 0; + relations.forEach(function(relation) { + cnt++; + log.debug("Setting edge", relation); + graph.setEdge( + relation.id1, + relation.id2, + { + relation, + width: getLabelWidth(relation.title), + height: conf.labelHeight * common_default.getRows(relation.title).length, + labelpos: "c" + }, + "id" + cnt + ); + }); + dagreLayout(graph); + log.debug("Graph after layout", graph.nodes()); + const svgElem = diagram2.node(); + graph.nodes().forEach(function(v) { + if (v !== void 0 && graph.node(v) !== void 0) { + log.warn("Node " + v + ": " + JSON.stringify(graph.node(v))); + root.select("#" + svgElem.id + " #" + v).attr( + "transform", + "translate(" + (graph.node(v).x - graph.node(v).width / 2) + "," + (graph.node(v).y + (transformationLog[v] ? transformationLog[v].y : 0) - graph.node(v).height / 2) + " )" + ); + root.select("#" + svgElem.id + " #" + v).attr("data-x-shift", graph.node(v).x - graph.node(v).width / 2); + const dividers = domDocument.querySelectorAll("#" + svgElem.id + " #" + v + " .divider"); + dividers.forEach((divider) => { + const parent = divider.parentElement; + let pWidth = 0; + let pShift = 0; + if (parent) { + if (parent.parentElement) { + pWidth = parent.parentElement.getBBox().width; + } + pShift = parseInt(parent.getAttribute("data-x-shift"), 10); + if (Number.isNaN(pShift)) { + pShift = 0; + } + } + divider.setAttribute("x1", 0 - pShift + 8); + divider.setAttribute("x2", pWidth - pShift - 8); + }); + } else { + log.debug("No Node " + v + ": " + JSON.stringify(graph.node(v))); + } + }); + let stateBox = svgElem.getBBox(); + graph.edges().forEach(function(e) { + if (e !== void 0 && graph.edge(e) !== void 0) { + log.debug("Edge " + e.v + " -> " + e.w + ": " + JSON.stringify(graph.edge(e))); + drawEdge(diagram2, graph.edge(e), graph.edge(e).relation); + } + }); + stateBox = svgElem.getBBox(); + const stateInfo = { + id: parentId ? parentId : "root", + label: parentId ? parentId : "root", + width: 0, + height: 0 + }; + stateInfo.width = stateBox.width + 2 * conf.padding; + stateInfo.height = stateBox.height + 2 * conf.padding; + log.debug("Doc rendered", stateInfo, graph); + return stateInfo; +}, "renderDoc"); +var stateRenderer_default = { + setConf, + draw +}; + +// src/diagrams/state/stateDiagram.ts +var diagram = { + parser: stateDiagram_default, + get db() { + return new StateDB(1); + }, + renderer: stateRenderer_default, + styles: styles_default, + init: /* @__PURE__ */ __name((cnf) => { + if (!cnf.state) { + cnf.state = {}; + } + cnf.state.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; + }, "init") +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-FKZM4ZOC.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-FKZM4ZOC.mjs.map new file mode 100644 index 0000000..4c3569a --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-FKZM4ZOC.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/state/stateRenderer.js", "../../../src/diagrams/state/shapes.js", "../../../src/diagrams/state/stateDiagram.ts"], + "sourcesContent": ["import { select } from 'd3';\nimport { layout as dagreLayout } from 'dagre-d3-es/src/dagre/index.js';\nimport * as graphlib from 'dagre-d3-es/src/graphlib/index.js';\nimport { log } from '../../logger.js';\nimport common from '../common/common.js';\nimport { drawState, addTitleAndBox, drawEdge } from './shapes.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\n\n// TODO Move conf object to main conf in mermaidAPI\nlet conf;\n\nconst transformationLog = {};\n\nexport const setConf = function () {\n //no-op\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n *\n * @param {any} elem\n */\nconst insertMarkers = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'dependencyEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');\n};\n\n/**\n * Draws a flowchart in the tag with id: id based on the graph definition in text.\n *\n * @param {any} text\n * @param {any} id\n * @param _version\n * @param diagObj\n */\nexport const draw = function (text, id, _version, diagObj) {\n conf = getConfig().state;\n const securityLevel = getConfig().securityLevel;\n // Handle root and Document for when rendering in sandbox mode\n let sandboxElement;\n if (securityLevel === 'sandbox') {\n sandboxElement = select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? select(sandboxElement.nodes()[0].contentDocument.body)\n : select('body');\n const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0].contentDocument : document;\n\n log.debug('Rendering diagram ' + text);\n\n // Fetch the default direction, use TD if none was found\n const diagram = root.select(`[id='${id}']`);\n insertMarkers(diagram);\n\n const rootDoc = diagObj.db.getRootDoc();\n renderDoc(rootDoc, diagram, undefined, false, root, doc, diagObj);\n\n const padding = conf.padding;\n const bounds = diagram.node().getBBox();\n\n const width = bounds.width + padding * 2;\n const height = bounds.height + padding * 2;\n\n // zoom in a bit\n const svgWidth = width * 1.75;\n configureSvgSize(diagram, height, svgWidth, conf.useMaxWidth);\n\n diagram.attr(\n 'viewBox',\n `${bounds.x - conf.padding} ${bounds.y - conf.padding} ` + width + ' ' + height\n );\n};\nconst getLabelWidth = (text) => {\n return text ? text.length * conf.fontSizeFactor : 1;\n};\n\nconst renderDoc = (doc, diagram, parentId, altBkg, root, domDocument, diagObj) => {\n // Layout graph, Create a new directed graph\n const graph = new graphlib.Graph({\n compound: true,\n multigraph: true,\n });\n\n let i;\n let edgeFreeDoc = true;\n for (i = 0; i < doc.length; i++) {\n if (doc[i].stmt === 'relation') {\n edgeFreeDoc = false;\n break;\n }\n }\n\n // Set an object for the graph label\n if (parentId) {\n graph.setGraph({\n rankdir: 'LR',\n multigraph: true,\n compound: true,\n // acyclicer: 'greedy',\n ranker: 'tight-tree',\n ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor,\n nodeSep: edgeFreeDoc ? 1 : 50,\n isMultiGraph: true,\n // ranksep: 5,\n // nodesep: 1\n });\n } else {\n graph.setGraph({\n rankdir: 'TB',\n multigraph: true,\n compound: true,\n // isCompound: true,\n // acyclicer: 'greedy',\n // ranker: 'longest-path'\n ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor,\n nodeSep: edgeFreeDoc ? 1 : 50,\n ranker: 'tight-tree',\n // ranker: 'network-simplex'\n isMultiGraph: true,\n });\n }\n\n // Default to assigning a new object as a label for each new edge.\n graph.setDefaultEdgeLabel(function () {\n return {};\n });\n\n const states = diagObj.db.getStates();\n const relations = diagObj.db.getRelations();\n\n const keys = Object.keys(states);\n\n let first = true;\n\n for (const key of keys) {\n const stateDef = states[key];\n\n if (parentId) {\n stateDef.parentId = parentId;\n }\n\n let node;\n if (stateDef.doc) {\n let sub = diagram.append('g').attr('id', stateDef.id).attr('class', 'stateGroup');\n node = renderDoc(stateDef.doc, sub, stateDef.id, !altBkg, root, domDocument, diagObj);\n\n if (first) {\n // first = false;\n sub = addTitleAndBox(sub, stateDef, altBkg);\n let boxBounds = sub.node().getBBox();\n node.width = boxBounds.width;\n node.height = boxBounds.height + conf.padding / 2;\n transformationLog[stateDef.id] = { y: conf.compositTitleSize };\n } else {\n // sub = addIdAndBox(sub, stateDef);\n let boxBounds = sub.node().getBBox();\n node.width = boxBounds.width;\n node.height = boxBounds.height;\n // transformationLog[stateDef.id] = { y: conf.compositTitleSize };\n }\n } else {\n node = drawState(diagram, stateDef, graph);\n }\n\n if (stateDef.note) {\n // Draw note note\n const noteDef = {\n descriptions: [],\n id: stateDef.id + '-note',\n note: stateDef.note,\n type: 'note',\n };\n const note = drawState(diagram, noteDef, graph);\n\n // graph.setNode(node.id, node);\n if (stateDef.note.position === 'left of') {\n graph.setNode(node.id + '-note', note);\n graph.setNode(node.id, node);\n } else {\n graph.setNode(node.id, node);\n graph.setNode(node.id + '-note', note);\n }\n // graph.setNode(node.id);\n graph.setParent(node.id, node.id + '-group');\n graph.setParent(node.id + '-note', node.id + '-group');\n } else {\n // Add nodes to the graph. The first argument is the node id. The second is\n // metadata about the node. In this case we're going to add labels to each of\n // our nodes.\n graph.setNode(node.id, node);\n }\n }\n\n log.debug('Count=', graph.nodeCount(), graph);\n let cnt = 0;\n relations.forEach(function (relation) {\n cnt++;\n log.debug('Setting edge', relation);\n graph.setEdge(\n relation.id1,\n relation.id2,\n {\n relation: relation,\n width: getLabelWidth(relation.title),\n height: conf.labelHeight * common.getRows(relation.title).length,\n labelpos: 'c',\n },\n 'id' + cnt\n );\n });\n\n dagreLayout(graph);\n\n log.debug('Graph after layout', graph.nodes());\n const svgElem = diagram.node();\n\n graph.nodes().forEach(function (v) {\n if (v !== undefined && graph.node(v) !== undefined) {\n log.warn('Node ' + v + ': ' + JSON.stringify(graph.node(v)));\n root\n .select('#' + svgElem.id + ' #' + v)\n .attr(\n 'transform',\n 'translate(' +\n (graph.node(v).x - graph.node(v).width / 2) +\n ',' +\n (graph.node(v).y +\n (transformationLog[v] ? transformationLog[v].y : 0) -\n graph.node(v).height / 2) +\n ' )'\n );\n root\n .select('#' + svgElem.id + ' #' + v)\n .attr('data-x-shift', graph.node(v).x - graph.node(v).width / 2);\n const dividers = domDocument.querySelectorAll('#' + svgElem.id + ' #' + v + ' .divider');\n dividers.forEach((divider) => {\n const parent = divider.parentElement;\n let pWidth = 0;\n let pShift = 0;\n if (parent) {\n if (parent.parentElement) {\n pWidth = parent.parentElement.getBBox().width;\n }\n pShift = parseInt(parent.getAttribute('data-x-shift'), 10);\n if (Number.isNaN(pShift)) {\n pShift = 0;\n }\n }\n divider.setAttribute('x1', 0 - pShift + 8);\n divider.setAttribute('x2', pWidth - pShift - 8);\n });\n } else {\n log.debug('No Node ' + v + ': ' + JSON.stringify(graph.node(v)));\n }\n });\n\n let stateBox = svgElem.getBBox();\n\n graph.edges().forEach(function (e) {\n if (e !== undefined && graph.edge(e) !== undefined) {\n log.debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(graph.edge(e)));\n drawEdge(diagram, graph.edge(e), graph.edge(e).relation);\n }\n });\n\n stateBox = svgElem.getBBox();\n\n const stateInfo = {\n id: parentId ? parentId : 'root',\n label: parentId ? parentId : 'root',\n width: 0,\n height: 0,\n };\n\n stateInfo.width = stateBox.width + 2 * conf.padding;\n stateInfo.height = stateBox.height + 2 * conf.padding;\n\n log.debug('Doc rendered', stateInfo, graph);\n return stateInfo;\n};\n\nexport default {\n setConf,\n draw,\n};\n", "import { line, curveBasis } from 'd3';\nimport { StateDB } from './stateDb.js';\nimport utils from '../../utils.js';\nimport common, { getUrl } from '../common/common.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { log } from '../../logger.js';\n\n/**\n * Draws a start state as a black circle\n *\n * @param {any} g\n */\nexport const drawStartState = (g) =>\n g\n .append('circle')\n // .style('stroke', 'black')\n // .style('fill', 'black')\n .attr('class', 'start-state')\n .attr('r', getConfig().state.sizeUnit)\n .attr('cx', getConfig().state.padding + getConfig().state.sizeUnit)\n .attr('cy', getConfig().state.padding + getConfig().state.sizeUnit);\n\n/**\n * Draws a start state as a black circle\n *\n * @param {any} g\n */\nexport const drawDivider = (g) =>\n g\n .append('line')\n .style('stroke', 'grey')\n .style('stroke-dasharray', '3')\n .attr('x1', getConfig().state.textHeight)\n .attr('class', 'divider')\n .attr('x2', getConfig().state.textHeight * 2)\n .attr('y1', 0)\n .attr('y2', 0);\n\n/**\n * Draws an end state as a black circle\n *\n * @param {any} g\n * @param {any} stateDef\n */\nexport const drawSimpleState = (g, stateDef) => {\n const state = g\n .append('text')\n .attr('x', 2 * getConfig().state.padding)\n .attr('y', getConfig().state.textHeight + 2 * getConfig().state.padding)\n .attr('font-size', getConfig().state.fontSize)\n .attr('class', 'state-title')\n .text(stateDef.id);\n\n const classBox = state.node().getBBox();\n g.insert('rect', ':first-child')\n .attr('x', getConfig().state.padding)\n .attr('y', getConfig().state.padding)\n .attr('width', classBox.width + 2 * getConfig().state.padding)\n .attr('height', classBox.height + 2 * getConfig().state.padding)\n .attr('rx', getConfig().state.radius);\n\n return state;\n};\n\n/**\n * Draws a state with descriptions\n *\n * @param {any} g The d3 svg object to add the state to\n * @param {any} stateDef\n * @returns {any} The d3 svg state\n */\nexport const drawDescrState = (g, stateDef) => {\n const addTspan = function (textEl, txt, isFirst) {\n const tSpan = textEl\n .append('tspan')\n .attr('x', 2 * getConfig().state.padding)\n .text(txt);\n if (!isFirst) {\n tSpan.attr('dy', getConfig().state.textHeight);\n }\n };\n const title = g\n .append('text')\n .attr('x', 2 * getConfig().state.padding)\n .attr('y', getConfig().state.textHeight + 1.3 * getConfig().state.padding)\n .attr('font-size', getConfig().state.fontSize)\n .attr('class', 'state-title')\n .text(stateDef.descriptions[0]);\n\n const titleBox = title.node().getBBox();\n const titleHeight = titleBox.height;\n\n const description = g\n .append('text') // text label for the x axis\n .attr('x', getConfig().state.padding)\n .attr(\n 'y',\n titleHeight +\n getConfig().state.padding * 0.4 +\n getConfig().state.dividerMargin +\n getConfig().state.textHeight\n )\n .attr('class', 'state-description');\n\n let isFirst = true;\n let isSecond = true;\n stateDef.descriptions.forEach(function (descr) {\n if (!isFirst) {\n addTspan(description, descr, isSecond);\n isSecond = false;\n }\n isFirst = false;\n });\n\n const descrLine = g\n .append('line') // text label for the x axis\n .attr('x1', getConfig().state.padding)\n .attr('y1', getConfig().state.padding + titleHeight + getConfig().state.dividerMargin / 2)\n .attr('y2', getConfig().state.padding + titleHeight + getConfig().state.dividerMargin / 2)\n .attr('class', 'descr-divider');\n const descrBox = description.node().getBBox();\n const width = Math.max(descrBox.width, titleBox.width);\n\n descrLine.attr('x2', width + 3 * getConfig().state.padding);\n // const classBox = title.node().getBBox();\n\n g.insert('rect', ':first-child')\n .attr('x', getConfig().state.padding)\n .attr('y', getConfig().state.padding)\n .attr('width', width + 2 * getConfig().state.padding)\n .attr('height', descrBox.height + titleHeight + 2 * getConfig().state.padding)\n .attr('rx', getConfig().state.radius);\n\n return g;\n};\n\n/** Adds the creates a box around the existing content and adds a panel for the id on top of the content. */\n/**\n * Function that creates a title row and a frame around a substate for a composite state diagram.\n * The function returns a new d3 svg object with updated width and height properties;\n *\n * @param {any} g The d3 svg object for the substate to framed\n * @param {any} stateDef The info about the\n * @param {any} altBkg\n */\nexport const addTitleAndBox = (g, stateDef, altBkg) => {\n const pad = getConfig().state.padding;\n const dblPad = 2 * getConfig().state.padding;\n const orgBox = g.node().getBBox();\n const orgWidth = orgBox.width;\n const orgX = orgBox.x;\n\n const title = g\n .append('text')\n .attr('x', 0)\n .attr('y', getConfig().state.titleShift)\n .attr('font-size', getConfig().state.fontSize)\n .attr('class', 'state-title')\n .text(stateDef.id);\n\n const titleBox = title.node().getBBox();\n const titleWidth = titleBox.width + dblPad;\n let width = Math.max(titleWidth, orgWidth); // + dblPad;\n if (width === orgWidth) {\n width = width + dblPad;\n }\n let startX;\n // const lineY = 1 - getConfig().state.textHeight;\n // const descrLine = g\n // .append('line') // text label for the x axis\n // .attr('x1', 0)\n // .attr('y1', lineY)\n // .attr('y2', lineY)\n // .attr('class', 'descr-divider');\n\n const graphBox = g.node().getBBox();\n // descrLine.attr('x2', graphBox.width + getConfig().state.padding);\n\n if (stateDef.doc) {\n // console.warn(\n // stateDef.id,\n // 'orgX: ',\n // orgX,\n // 'width: ',\n // width,\n // 'titleWidth: ',\n // titleWidth,\n // 'orgWidth: ',\n // orgWidth,\n // 'width',\n // width\n // );\n }\n\n startX = orgX - pad;\n if (titleWidth > orgWidth) {\n startX = (orgWidth - width) / 2 + pad;\n }\n if (Math.abs(orgX - graphBox.x) < pad && titleWidth > orgWidth) {\n startX = orgX - (titleWidth - orgWidth) / 2;\n }\n\n const lineY = 1 - getConfig().state.textHeight;\n // White color\n g.insert('rect', ':first-child')\n .attr('x', startX)\n .attr('y', lineY)\n .attr('class', altBkg ? 'alt-composit' : 'composit') // cspell:disable-line\n .attr('width', width)\n .attr(\n 'height',\n graphBox.height + getConfig().state.textHeight + getConfig().state.titleShift + 1\n )\n .attr('rx', '0');\n\n title.attr('x', startX + pad);\n if (titleWidth <= orgWidth) {\n title.attr('x', orgX + (width - dblPad) / 2 - titleWidth / 2 + pad);\n }\n\n // Title background\n g.insert('rect', ':first-child')\n .attr('x', startX)\n .attr(\n 'y',\n getConfig().state.titleShift - getConfig().state.textHeight - getConfig().state.padding\n )\n .attr('width', width)\n // Just needs to be higher then the descr line, will be clipped by the white color box\n .attr('height', getConfig().state.textHeight * 3)\n .attr('rx', getConfig().state.radius);\n\n // Full background\n g.insert('rect', ':first-child')\n .attr('x', startX)\n .attr(\n 'y',\n getConfig().state.titleShift - getConfig().state.textHeight - getConfig().state.padding\n )\n .attr('width', width)\n .attr('height', graphBox.height + 3 + 2 * getConfig().state.textHeight)\n .attr('rx', getConfig().state.radius);\n\n return g;\n};\n\nconst drawEndState = (g) => {\n g.append('circle')\n // .style('stroke', 'black')\n // .style('fill', 'white')\n .attr('class', 'end-state-outer')\n .attr('r', getConfig().state.sizeUnit + getConfig().state.miniPadding)\n .attr(\n 'cx',\n getConfig().state.padding + getConfig().state.sizeUnit + getConfig().state.miniPadding\n )\n .attr(\n 'cy',\n getConfig().state.padding + getConfig().state.sizeUnit + getConfig().state.miniPadding\n );\n\n return (\n g\n .append('circle')\n // .style('stroke', 'black')\n // .style('fill', 'black')\n .attr('class', 'end-state-inner')\n .attr('r', getConfig().state.sizeUnit)\n .attr('cx', getConfig().state.padding + getConfig().state.sizeUnit + 2)\n .attr('cy', getConfig().state.padding + getConfig().state.sizeUnit + 2)\n );\n};\nconst drawForkJoinState = (g, stateDef) => {\n let width = getConfig().state.forkWidth;\n let height = getConfig().state.forkHeight;\n\n if (stateDef.parentId) {\n let tmp = width;\n width = height;\n height = tmp;\n }\n return g\n .append('rect')\n .style('stroke', 'black')\n .style('fill', 'black')\n .attr('width', width)\n .attr('height', height)\n .attr('x', getConfig().state.padding)\n .attr('y', getConfig().state.padding);\n};\n\nexport const drawText = function (elem, textData) {\n // Remove and ignore br:s\n const nText = textData.text.replace(common.lineBreakRegex, ' ');\n\n const textElem = elem.append('text');\n textElem.attr('x', textData.x);\n textElem.attr('y', textData.y);\n textElem.style('text-anchor', textData.anchor);\n textElem.attr('fill', textData.fill);\n if (textData.class !== undefined) {\n textElem.attr('class', textData.class);\n }\n\n const span = textElem.append('tspan');\n span.attr('x', textData.x + textData.textMargin * 2);\n span.attr('fill', textData.fill);\n span.text(nText);\n\n return textElem;\n};\n\nconst _drawLongText = (_text, x, y, g) => {\n let textHeight = 0;\n\n const textElem = g.append('text');\n textElem.style('text-anchor', 'start');\n textElem.attr('class', 'noteText');\n\n let text = _text.replace(/\\r\\n/g, '
');\n text = text.replace(/\\n/g, '
');\n const lines = text.split(common.lineBreakRegex);\n\n let tHeight = 1.25 * getConfig().state.noteMargin;\n for (const line of lines) {\n const txt = line.trim();\n\n if (txt.length > 0) {\n const span = textElem.append('tspan');\n span.text(txt);\n if (tHeight === 0) {\n const textBounds = span.node().getBBox();\n tHeight += textBounds.height;\n }\n textHeight += tHeight;\n span.attr('x', x + getConfig().state.noteMargin);\n span.attr('y', y + textHeight + 1.25 * getConfig().state.noteMargin);\n }\n }\n return { textWidth: textElem.node().getBBox().width, textHeight };\n};\n\n/**\n * Draws a note to the diagram\n *\n * @param text - The text of the given note.\n * @param g - The element the note is attached to.\n */\n\nexport const drawNote = (text, g) => {\n g.attr('class', 'state-note');\n const note = g.append('rect').attr('x', 0).attr('y', getConfig().state.padding);\n const rectElem = g.append('g');\n\n const { textWidth, textHeight } = _drawLongText(text, 0, 0, rectElem);\n note.attr('height', textHeight + 2 * getConfig().state.noteMargin);\n note.attr('width', textWidth + getConfig().state.noteMargin * 2);\n\n return note;\n};\n\n/**\n * Starting point for drawing a state. The function finds out the specifics about the state and\n * renders with appropriate function.\n *\n * @param {any} elem\n * @param {any} stateDef\n */\n\nexport const drawState = function (elem, stateDef) {\n const id = stateDef.id;\n const stateInfo = {\n id: id,\n label: stateDef.id,\n width: 0,\n height: 0,\n };\n\n const g = elem.append('g').attr('id', id).attr('class', 'stateGroup');\n\n if (stateDef.type === 'start') {\n drawStartState(g);\n }\n if (stateDef.type === 'end') {\n drawEndState(g);\n }\n if (stateDef.type === 'fork' || stateDef.type === 'join') {\n drawForkJoinState(g, stateDef);\n }\n if (stateDef.type === 'note') {\n drawNote(stateDef.note.text, g);\n }\n if (stateDef.type === 'divider') {\n drawDivider(g);\n }\n if (stateDef.type === 'default' && stateDef.descriptions.length === 0) {\n drawSimpleState(g, stateDef);\n }\n if (stateDef.type === 'default' && stateDef.descriptions.length > 0) {\n drawDescrState(g, stateDef);\n }\n\n const stateBox = g.node().getBBox();\n stateInfo.width = stateBox.width + 2 * getConfig().state.padding;\n stateInfo.height = stateBox.height + 2 * getConfig().state.padding;\n\n return stateInfo;\n};\n\nlet edgeCount = 0;\nexport const drawEdge = function (elem, path, relation) {\n const getRelationType = function (type) {\n switch (type) {\n case StateDB.relationType.AGGREGATION:\n return 'aggregation';\n case StateDB.relationType.EXTENSION:\n return 'extension';\n case StateDB.relationType.COMPOSITION:\n return 'composition';\n case StateDB.relationType.DEPENDENCY:\n return 'dependency';\n }\n };\n\n path.points = path.points.filter((p) => !Number.isNaN(p.y));\n\n // The data for our line\n const lineData = path.points;\n\n // This is the accessor function we talked about above\n const lineFunction = line()\n .x(function (d) {\n return d.x;\n })\n .y(function (d) {\n return d.y;\n })\n .curve(curveBasis);\n\n const svgPath = elem\n .append('path')\n .attr('d', lineFunction(lineData))\n .attr('id', 'edge' + edgeCount)\n .attr('class', 'transition');\n let url = '';\n if (getConfig().state.arrowMarkerAbsolute) {\n url = getUrl(true);\n }\n\n svgPath.attr(\n 'marker-end',\n 'url(' + url + '#' + getRelationType(StateDB.relationType.DEPENDENCY) + 'End' + ')'\n );\n\n if (relation.title !== undefined) {\n const label = elem.append('g').attr('class', 'stateLabel');\n\n const { x, y } = utils.calcLabelPosition(path.points);\n\n const rows = common.getRows(relation.title);\n\n let titleHeight = 0;\n const titleRows = [];\n let maxWidth = 0;\n let minX = 0;\n\n for (let i = 0; i <= rows.length; i++) {\n const title = label\n .append('text')\n .attr('text-anchor', 'middle')\n .text(rows[i])\n .attr('x', x)\n .attr('y', y + titleHeight);\n\n const boundsTmp = title.node().getBBox();\n maxWidth = Math.max(maxWidth, boundsTmp.width);\n minX = Math.min(minX, boundsTmp.x);\n\n log.info(boundsTmp.x, x, y + titleHeight);\n\n if (titleHeight === 0) {\n const titleBox = title.node().getBBox();\n titleHeight = titleBox.height;\n log.info('Title height', titleHeight, y);\n }\n titleRows.push(title);\n }\n\n let boxHeight = titleHeight * rows.length;\n if (rows.length > 1) {\n const heightAdj = (rows.length - 1) * titleHeight * 0.5;\n\n titleRows.forEach((title, i) => title.attr('y', y + i * titleHeight - heightAdj));\n boxHeight = titleHeight * rows.length;\n }\n\n const bounds = label.node().getBBox();\n\n label\n .insert('rect', ':first-child')\n .attr('class', 'box')\n .attr('x', x - maxWidth / 2 - getConfig().state.padding / 2)\n .attr('y', y - boxHeight / 2 - getConfig().state.padding / 2 - 3.5)\n .attr('width', maxWidth + getConfig().state.padding)\n .attr('height', boxHeight + getConfig().state.padding);\n\n log.info(bounds);\n\n //label.attr('transform', '0 -' + (bounds.y / 2));\n\n // Debug points\n // path.points.forEach(point => {\n // g.append('circle')\n // .style('stroke', 'red')\n // .style('fill', 'red')\n // .attr('r', 1)\n // .attr('cx', point.x)\n // .attr('cy', point.y);\n // });\n // g.append('circle')\n // .style('stroke', 'blue')\n // .style('fill', 'blue')\n // .attr('r', 1)\n // .attr('cx', x)\n // .attr('cy', y);\n }\n\n edgeCount++;\n};\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: JISON doesn't support types\nimport parser from './parser/stateDiagram.jison';\nimport { StateDB } from './stateDb.js';\nimport styles from './styles.js';\nimport renderer from './stateRenderer.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n get db() {\n return new StateDB(1);\n },\n renderer,\n styles,\n init: (cnf) => {\n if (!cnf.state) {\n cnf.state = {};\n }\n cnf.state.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n },\n};\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,UAAU,mBAAmB;AACtC,YAAY,cAAc;;;ACF1B,SAAS,MAAM,kBAAkB;AAY1B,IAAM,iBAAiB,wBAAC,MAC7B,EACG,OAAO,QAAQ,EAGf,KAAK,SAAS,aAAa,EAC3B,KAAK,KAAK,UAAU,EAAE,MAAM,QAAQ,EACpC,KAAK,MAAM,UAAU,EAAE,MAAM,UAAU,UAAU,EAAE,MAAM,QAAQ,EACjE,KAAK,MAAM,UAAU,EAAE,MAAM,UAAU,UAAU,EAAE,MAAM,QAAQ,GARxC;AAevB,IAAM,cAAc,wBAAC,MAC1B,EACG,OAAO,MAAM,EACb,MAAM,UAAU,MAAM,EACtB,MAAM,oBAAoB,GAAG,EAC7B,KAAK,MAAM,UAAU,EAAE,MAAM,UAAU,EACvC,KAAK,SAAS,SAAS,EACvB,KAAK,MAAM,UAAU,EAAE,MAAM,aAAa,CAAC,EAC3C,KAAK,MAAM,CAAC,EACZ,KAAK,MAAM,CAAC,GATU;AAiBpB,IAAM,kBAAkB,wBAAC,GAAG,aAAa;AAC9C,QAAM,QAAQ,EACX,OAAO,MAAM,EACb,KAAK,KAAK,IAAI,UAAU,EAAE,MAAM,OAAO,EACvC,KAAK,KAAK,UAAU,EAAE,MAAM,aAAa,IAAI,UAAU,EAAE,MAAM,OAAO,EACtE,KAAK,aAAa,UAAU,EAAE,MAAM,QAAQ,EAC5C,KAAK,SAAS,aAAa,EAC3B,KAAK,SAAS,EAAE;AAEnB,QAAM,WAAW,MAAM,KAAK,EAAE,QAAQ;AACtC,IAAE,OAAO,QAAQ,cAAc,EAC5B,KAAK,KAAK,UAAU,EAAE,MAAM,OAAO,EACnC,KAAK,KAAK,UAAU,EAAE,MAAM,OAAO,EACnC,KAAK,SAAS,SAAS,QAAQ,IAAI,UAAU,EAAE,MAAM,OAAO,EAC5D,KAAK,UAAU,SAAS,SAAS,IAAI,UAAU,EAAE,MAAM,OAAO,EAC9D,KAAK,MAAM,UAAU,EAAE,MAAM,MAAM;AAEtC,SAAO;AACT,GAlB+B;AA2BxB,IAAM,iBAAiB,wBAAC,GAAG,aAAa;AAC7C,QAAM,WAAW,gCAAU,QAAQ,KAAKA,UAAS;AAC/C,UAAM,QAAQ,OACX,OAAO,OAAO,EACd,KAAK,KAAK,IAAI,UAAU,EAAE,MAAM,OAAO,EACvC,KAAK,GAAG;AACX,QAAI,CAACA,UAAS;AACZ,YAAM,KAAK,MAAM,UAAU,EAAE,MAAM,UAAU;AAAA,IAC/C;AAAA,EACF,GARiB;AASjB,QAAM,QAAQ,EACX,OAAO,MAAM,EACb,KAAK,KAAK,IAAI,UAAU,EAAE,MAAM,OAAO,EACvC,KAAK,KAAK,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,EAAE,MAAM,OAAO,EACxE,KAAK,aAAa,UAAU,EAAE,MAAM,QAAQ,EAC5C,KAAK,SAAS,aAAa,EAC3B,KAAK,SAAS,aAAa,CAAC,CAAC;AAEhC,QAAM,WAAW,MAAM,KAAK,EAAE,QAAQ;AACtC,QAAM,cAAc,SAAS;AAE7B,QAAM,cAAc,EACjB,OAAO,MAAM,EACb,KAAK,KAAK,UAAU,EAAE,MAAM,OAAO,EACnC;AAAA,IACC;AAAA,IACA,cACE,UAAU,EAAE,MAAM,UAAU,MAC5B,UAAU,EAAE,MAAM,gBAClB,UAAU,EAAE,MAAM;AAAA,EACtB,EACC,KAAK,SAAS,mBAAmB;AAEpC,MAAI,UAAU;AACd,MAAI,WAAW;AACf,WAAS,aAAa,QAAQ,SAAU,OAAO;AAC7C,QAAI,CAAC,SAAS;AACZ,eAAS,aAAa,OAAO,QAAQ;AACrC,iBAAW;AAAA,IACb;AACA,cAAU;AAAA,EACZ,CAAC;AAED,QAAM,YAAY,EACf,OAAO,MAAM,EACb,KAAK,MAAM,UAAU,EAAE,MAAM,OAAO,EACpC,KAAK,MAAM,UAAU,EAAE,MAAM,UAAU,cAAc,UAAU,EAAE,MAAM,gBAAgB,CAAC,EACxF,KAAK,MAAM,UAAU,EAAE,MAAM,UAAU,cAAc,UAAU,EAAE,MAAM,gBAAgB,CAAC,EACxF,KAAK,SAAS,eAAe;AAChC,QAAM,WAAW,YAAY,KAAK,EAAE,QAAQ;AAC5C,QAAM,QAAQ,KAAK,IAAI,SAAS,OAAO,SAAS,KAAK;AAErD,YAAU,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,MAAM,OAAO;AAG1D,IAAE,OAAO,QAAQ,cAAc,EAC5B,KAAK,KAAK,UAAU,EAAE,MAAM,OAAO,EACnC,KAAK,KAAK,UAAU,EAAE,MAAM,OAAO,EACnC,KAAK,SAAS,QAAQ,IAAI,UAAU,EAAE,MAAM,OAAO,EACnD,KAAK,UAAU,SAAS,SAAS,cAAc,IAAI,UAAU,EAAE,MAAM,OAAO,EAC5E,KAAK,MAAM,UAAU,EAAE,MAAM,MAAM;AAEtC,SAAO;AACT,GA/D8B;AA0EvB,IAAM,iBAAiB,wBAAC,GAAG,UAAU,WAAW;AACrD,QAAM,MAAM,UAAU,EAAE,MAAM;AAC9B,QAAM,SAAS,IAAI,UAAU,EAAE,MAAM;AACrC,QAAM,SAAS,EAAE,KAAK,EAAE,QAAQ;AAChC,QAAM,WAAW,OAAO;AACxB,QAAM,OAAO,OAAO;AAEpB,QAAM,QAAQ,EACX,OAAO,MAAM,EACb,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,UAAU,EAAE,MAAM,UAAU,EACtC,KAAK,aAAa,UAAU,EAAE,MAAM,QAAQ,EAC5C,KAAK,SAAS,aAAa,EAC3B,KAAK,SAAS,EAAE;AAEnB,QAAM,WAAW,MAAM,KAAK,EAAE,QAAQ;AACtC,QAAM,aAAa,SAAS,QAAQ;AACpC,MAAI,QAAQ,KAAK,IAAI,YAAY,QAAQ;AACzC,MAAI,UAAU,UAAU;AACtB,YAAQ,QAAQ;AAAA,EAClB;AACA,MAAI;AASJ,QAAM,WAAW,EAAE,KAAK,EAAE,QAAQ;AAGlC,MAAI,SAAS,KAAK;AAAA,EAclB;AAEA,WAAS,OAAO;AAChB,MAAI,aAAa,UAAU;AACzB,cAAU,WAAW,SAAS,IAAI;AAAA,EACpC;AACA,MAAI,KAAK,IAAI,OAAO,SAAS,CAAC,IAAI,OAAO,aAAa,UAAU;AAC9D,aAAS,QAAQ,aAAa,YAAY;AAAA,EAC5C;AAEA,QAAM,QAAQ,IAAI,UAAU,EAAE,MAAM;AAEpC,IAAE,OAAO,QAAQ,cAAc,EAC5B,KAAK,KAAK,MAAM,EAChB,KAAK,KAAK,KAAK,EACf,KAAK,SAAS,SAAS,iBAAiB,UAAU,EAClD,KAAK,SAAS,KAAK,EACnB;AAAA,IACC;AAAA,IACA,SAAS,SAAS,UAAU,EAAE,MAAM,aAAa,UAAU,EAAE,MAAM,aAAa;AAAA,EAClF,EACC,KAAK,MAAM,GAAG;AAEjB,QAAM,KAAK,KAAK,SAAS,GAAG;AAC5B,MAAI,cAAc,UAAU;AAC1B,UAAM,KAAK,KAAK,QAAQ,QAAQ,UAAU,IAAI,aAAa,IAAI,GAAG;AAAA,EACpE;AAGA,IAAE,OAAO,QAAQ,cAAc,EAC5B,KAAK,KAAK,MAAM,EAChB;AAAA,IACC;AAAA,IACA,UAAU,EAAE,MAAM,aAAa,UAAU,EAAE,MAAM,aAAa,UAAU,EAAE,MAAM;AAAA,EAClF,EACC,KAAK,SAAS,KAAK,EAEnB,KAAK,UAAU,UAAU,EAAE,MAAM,aAAa,CAAC,EAC/C,KAAK,MAAM,UAAU,EAAE,MAAM,MAAM;AAGtC,IAAE,OAAO,QAAQ,cAAc,EAC5B,KAAK,KAAK,MAAM,EAChB;AAAA,IACC;AAAA,IACA,UAAU,EAAE,MAAM,aAAa,UAAU,EAAE,MAAM,aAAa,UAAU,EAAE,MAAM;AAAA,EAClF,EACC,KAAK,SAAS,KAAK,EACnB,KAAK,UAAU,SAAS,SAAS,IAAI,IAAI,UAAU,EAAE,MAAM,UAAU,EACrE,KAAK,MAAM,UAAU,EAAE,MAAM,MAAM;AAEtC,SAAO;AACT,GAnG8B;AAqG9B,IAAM,eAAe,wBAAC,MAAM;AAC1B,IAAE,OAAO,QAAQ,EAGd,KAAK,SAAS,iBAAiB,EAC/B,KAAK,KAAK,UAAU,EAAE,MAAM,WAAW,UAAU,EAAE,MAAM,WAAW,EACpE;AAAA,IACC;AAAA,IACA,UAAU,EAAE,MAAM,UAAU,UAAU,EAAE,MAAM,WAAW,UAAU,EAAE,MAAM;AAAA,EAC7E,EACC;AAAA,IACC;AAAA,IACA,UAAU,EAAE,MAAM,UAAU,UAAU,EAAE,MAAM,WAAW,UAAU,EAAE,MAAM;AAAA,EAC7E;AAEF,SACE,EACG,OAAO,QAAQ,EAGf,KAAK,SAAS,iBAAiB,EAC/B,KAAK,KAAK,UAAU,EAAE,MAAM,QAAQ,EACpC,KAAK,MAAM,UAAU,EAAE,MAAM,UAAU,UAAU,EAAE,MAAM,WAAW,CAAC,EACrE,KAAK,MAAM,UAAU,EAAE,MAAM,UAAU,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5E,GAzBqB;AA0BrB,IAAM,oBAAoB,wBAAC,GAAG,aAAa;AACzC,MAAI,QAAQ,UAAU,EAAE,MAAM;AAC9B,MAAI,SAAS,UAAU,EAAE,MAAM;AAE/B,MAAI,SAAS,UAAU;AACrB,QAAI,MAAM;AACV,YAAQ;AACR,aAAS;AAAA,EACX;AACA,SAAO,EACJ,OAAO,MAAM,EACb,MAAM,UAAU,OAAO,EACvB,MAAM,QAAQ,OAAO,EACrB,KAAK,SAAS,KAAK,EACnB,KAAK,UAAU,MAAM,EACrB,KAAK,KAAK,UAAU,EAAE,MAAM,OAAO,EACnC,KAAK,KAAK,UAAU,EAAE,MAAM,OAAO;AACxC,GAjB0B;AAwC1B,IAAM,gBAAgB,wBAAC,OAAO,GAAG,GAAG,MAAM;AACxC,MAAI,aAAa;AAEjB,QAAM,WAAW,EAAE,OAAO,MAAM;AAChC,WAAS,MAAM,eAAe,OAAO;AACrC,WAAS,KAAK,SAAS,UAAU;AAEjC,MAAI,OAAO,MAAM,QAAQ,SAAS,OAAO;AACzC,SAAO,KAAK,QAAQ,OAAO,OAAO;AAClC,QAAM,QAAQ,KAAK,MAAM,eAAO,cAAc;AAE9C,MAAI,UAAU,OAAO,UAAU,EAAE,MAAM;AACvC,aAAWC,SAAQ,OAAO;AACxB,UAAM,MAAMA,MAAK,KAAK;AAEtB,QAAI,IAAI,SAAS,GAAG;AAClB,YAAM,OAAO,SAAS,OAAO,OAAO;AACpC,WAAK,KAAK,GAAG;AACb,UAAI,YAAY,GAAG;AACjB,cAAM,aAAa,KAAK,KAAK,EAAE,QAAQ;AACvC,mBAAW,WAAW;AAAA,MACxB;AACA,oBAAc;AACd,WAAK,KAAK,KAAK,IAAI,UAAU,EAAE,MAAM,UAAU;AAC/C,WAAK,KAAK,KAAK,IAAI,aAAa,OAAO,UAAU,EAAE,MAAM,UAAU;AAAA,IACrE;AAAA,EACF;AACA,SAAO,EAAE,WAAW,SAAS,KAAK,EAAE,QAAQ,EAAE,OAAO,WAAW;AAClE,GA5BsB;AAqCf,IAAM,WAAW,wBAAC,MAAM,MAAM;AACnC,IAAE,KAAK,SAAS,YAAY;AAC5B,QAAM,OAAO,EAAE,OAAO,MAAM,EAAE,KAAK,KAAK,CAAC,EAAE,KAAK,KAAK,UAAU,EAAE,MAAM,OAAO;AAC9E,QAAM,WAAW,EAAE,OAAO,GAAG;AAE7B,QAAM,EAAE,WAAW,WAAW,IAAI,cAAc,MAAM,GAAG,GAAG,QAAQ;AACpE,OAAK,KAAK,UAAU,aAAa,IAAI,UAAU,EAAE,MAAM,UAAU;AACjE,OAAK,KAAK,SAAS,YAAY,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/D,SAAO;AACT,GAVwB;AAoBjB,IAAM,YAAY,gCAAU,MAAM,UAAU;AACjD,QAAM,KAAK,SAAS;AACpB,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,OAAO,SAAS;AAAA,IAChB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAEA,QAAM,IAAI,KAAK,OAAO,GAAG,EAAE,KAAK,MAAM,EAAE,EAAE,KAAK,SAAS,YAAY;AAEpE,MAAI,SAAS,SAAS,SAAS;AAC7B,mBAAe,CAAC;AAAA,EAClB;AACA,MAAI,SAAS,SAAS,OAAO;AAC3B,iBAAa,CAAC;AAAA,EAChB;AACA,MAAI,SAAS,SAAS,UAAU,SAAS,SAAS,QAAQ;AACxD,sBAAkB,GAAG,QAAQ;AAAA,EAC/B;AACA,MAAI,SAAS,SAAS,QAAQ;AAC5B,aAAS,SAAS,KAAK,MAAM,CAAC;AAAA,EAChC;AACA,MAAI,SAAS,SAAS,WAAW;AAC/B,gBAAY,CAAC;AAAA,EACf;AACA,MAAI,SAAS,SAAS,aAAa,SAAS,aAAa,WAAW,GAAG;AACrE,oBAAgB,GAAG,QAAQ;AAAA,EAC7B;AACA,MAAI,SAAS,SAAS,aAAa,SAAS,aAAa,SAAS,GAAG;AACnE,mBAAe,GAAG,QAAQ;AAAA,EAC5B;AAEA,QAAM,WAAW,EAAE,KAAK,EAAE,QAAQ;AAClC,YAAU,QAAQ,SAAS,QAAQ,IAAI,UAAU,EAAE,MAAM;AACzD,YAAU,SAAS,SAAS,SAAS,IAAI,UAAU,EAAE,MAAM;AAE3D,SAAO;AACT,GAtCyB;AAwCzB,IAAI,YAAY;AACT,IAAM,WAAW,gCAAU,MAAM,MAAM,UAAU;AACtD,QAAM,kBAAkB,gCAAU,MAAM;AACtC,YAAQ,MAAM;AAAA,MACZ,KAAK,QAAQ,aAAa;AACxB,eAAO;AAAA,MACT,KAAK,QAAQ,aAAa;AACxB,eAAO;AAAA,MACT,KAAK,QAAQ,aAAa;AACxB,eAAO;AAAA,MACT,KAAK,QAAQ,aAAa;AACxB,eAAO;AAAA,IACX;AAAA,EACF,GAXwB;AAaxB,OAAK,SAAS,KAAK,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;AAG1D,QAAM,WAAW,KAAK;AAGtB,QAAM,eAAe,KAAK,EACvB,EAAE,SAAU,GAAG;AACd,WAAO,EAAE;AAAA,EACX,CAAC,EACA,EAAE,SAAU,GAAG;AACd,WAAO,EAAE;AAAA,EACX,CAAC,EACA,MAAM,UAAU;AAEnB,QAAM,UAAU,KACb,OAAO,MAAM,EACb,KAAK,KAAK,aAAa,QAAQ,CAAC,EAChC,KAAK,MAAM,SAAS,SAAS,EAC7B,KAAK,SAAS,YAAY;AAC7B,MAAI,MAAM;AACV,MAAI,UAAU,EAAE,MAAM,qBAAqB;AACzC,UAAM,OAAO,IAAI;AAAA,EACnB;AAEA,UAAQ;AAAA,IACN;AAAA,IACA,SAAS,MAAM,MAAM,gBAAgB,QAAQ,aAAa,UAAU,IAAI;AAAA,EAC1E;AAEA,MAAI,SAAS,UAAU,QAAW;AAChC,UAAM,QAAQ,KAAK,OAAO,GAAG,EAAE,KAAK,SAAS,YAAY;AAEzD,UAAM,EAAE,GAAG,EAAE,IAAI,cAAM,kBAAkB,KAAK,MAAM;AAEpD,UAAM,OAAO,eAAO,QAAQ,SAAS,KAAK;AAE1C,QAAI,cAAc;AAClB,UAAM,YAAY,CAAC;AACnB,QAAI,WAAW;AACf,QAAI,OAAO;AAEX,aAAS,IAAI,GAAG,KAAK,KAAK,QAAQ,KAAK;AACrC,YAAM,QAAQ,MACX,OAAO,MAAM,EACb,KAAK,eAAe,QAAQ,EAC5B,KAAK,KAAK,CAAC,CAAC,EACZ,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,IAAI,WAAW;AAE5B,YAAM,YAAY,MAAM,KAAK,EAAE,QAAQ;AACvC,iBAAW,KAAK,IAAI,UAAU,UAAU,KAAK;AAC7C,aAAO,KAAK,IAAI,MAAM,UAAU,CAAC;AAEjC,UAAI,KAAK,UAAU,GAAG,GAAG,IAAI,WAAW;AAExC,UAAI,gBAAgB,GAAG;AACrB,cAAM,WAAW,MAAM,KAAK,EAAE,QAAQ;AACtC,sBAAc,SAAS;AACvB,YAAI,KAAK,gBAAgB,aAAa,CAAC;AAAA,MACzC;AACA,gBAAU,KAAK,KAAK;AAAA,IACtB;AAEA,QAAI,YAAY,cAAc,KAAK;AACnC,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,aAAa,KAAK,SAAS,KAAK,cAAc;AAEpD,gBAAU,QAAQ,CAAC,OAAO,MAAM,MAAM,KAAK,KAAK,IAAI,IAAI,cAAc,SAAS,CAAC;AAChF,kBAAY,cAAc,KAAK;AAAA,IACjC;AAEA,UAAM,SAAS,MAAM,KAAK,EAAE,QAAQ;AAEpC,UACG,OAAO,QAAQ,cAAc,EAC7B,KAAK,SAAS,KAAK,EACnB,KAAK,KAAK,IAAI,WAAW,IAAI,UAAU,EAAE,MAAM,UAAU,CAAC,EAC1D,KAAK,KAAK,IAAI,YAAY,IAAI,UAAU,EAAE,MAAM,UAAU,IAAI,GAAG,EACjE,KAAK,SAAS,WAAW,UAAU,EAAE,MAAM,OAAO,EAClD,KAAK,UAAU,YAAY,UAAU,EAAE,MAAM,OAAO;AAEvD,QAAI,KAAK,MAAM;AAAA,EAmBjB;AAEA;AACF,GAtHwB;;;ADhZxB,IAAI;AAEJ,IAAM,oBAAoB,CAAC;AAEpB,IAAM,UAAU,kCAAY;AAEnC,GAFuB;AASvB,IAAM,gBAAgB,gCAAU,MAAM;AACpC,OACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,MAAM,eAAe,EAC1B,KAAK,QAAQ,EAAE,EACf,KAAK,QAAQ,CAAC,EACd,KAAK,eAAe,EAAE,EACtB,KAAK,gBAAgB,EAAE,EACvB,KAAK,UAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,KAAK,2BAA2B;AAC1C,GAZsB;AAsBf,IAAM,OAAO,gCAAU,MAAM,IAAI,UAAU,SAAS;AACzD,SAAO,UAAU,EAAE;AACnB,QAAM,gBAAgB,UAAU,EAAE;AAElC,MAAI;AACJ,MAAI,kBAAkB,WAAW;AAC/B,qBAAiB,OAAO,OAAO,EAAE;AAAA,EACnC;AACA,QAAM,OACJ,kBAAkB,YACd,OAAO,eAAe,MAAM,EAAE,CAAC,EAAE,gBAAgB,IAAI,IACrD,OAAO,MAAM;AACnB,QAAM,MAAM,kBAAkB,YAAY,eAAe,MAAM,EAAE,CAAC,EAAE,kBAAkB;AAEtF,MAAI,MAAM,uBAAuB,IAAI;AAGrC,QAAMC,WAAU,KAAK,OAAO,QAAQ,EAAE,IAAI;AAC1C,gBAAcA,QAAO;AAErB,QAAM,UAAU,QAAQ,GAAG,WAAW;AACtC,YAAU,SAASA,UAAS,QAAW,OAAO,MAAM,KAAK,OAAO;AAEhE,QAAM,UAAU,KAAK;AACrB,QAAM,SAASA,SAAQ,KAAK,EAAE,QAAQ;AAEtC,QAAM,QAAQ,OAAO,QAAQ,UAAU;AACvC,QAAM,SAAS,OAAO,SAAS,UAAU;AAGzC,QAAM,WAAW,QAAQ;AACzB,mBAAiBA,UAAS,QAAQ,UAAU,KAAK,WAAW;AAE5D,EAAAA,SAAQ;AAAA,IACN;AAAA,IACA,GAAG,OAAO,IAAI,KAAK,OAAO,KAAK,OAAO,IAAI,KAAK,OAAO,MAAM,QAAQ,MAAM;AAAA,EAC5E;AACF,GArCoB;AAsCpB,IAAM,gBAAgB,wBAAC,SAAS;AAC9B,SAAO,OAAO,KAAK,SAAS,KAAK,iBAAiB;AACpD,GAFsB;AAItB,IAAM,YAAY,wBAAC,KAAKA,UAAS,UAAU,QAAQ,MAAM,aAAa,YAAY;AAEhF,QAAM,QAAQ,IAAa,eAAM;AAAA,IAC/B,UAAU;AAAA,IACV,YAAY;AAAA,EACd,CAAC;AAED,MAAI;AACJ,MAAI,cAAc;AAClB,OAAK,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AAC/B,QAAI,IAAI,CAAC,EAAE,SAAS,YAAY;AAC9B,oBAAc;AACd;AAAA,IACF;AAAA,EACF;AAGA,MAAI,UAAU;AACZ,UAAM,SAAS;AAAA,MACb,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA;AAAA,MAEV,QAAQ;AAAA,MACR,SAAS,cAAc,IAAI,KAAK;AAAA,MAChC,SAAS,cAAc,IAAI;AAAA,MAC3B,cAAc;AAAA;AAAA;AAAA,IAGhB,CAAC;AAAA,EACH,OAAO;AACL,UAAM,SAAS;AAAA,MACb,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA;AAAA;AAAA;AAAA,MAIV,SAAS,cAAc,IAAI,KAAK;AAAA,MAChC,SAAS,cAAc,IAAI;AAAA,MAC3B,QAAQ;AAAA;AAAA,MAER,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAGA,QAAM,oBAAoB,WAAY;AACpC,WAAO,CAAC;AAAA,EACV,CAAC;AAED,QAAM,SAAS,QAAQ,GAAG,UAAU;AACpC,QAAM,YAAY,QAAQ,GAAG,aAAa;AAE1C,QAAM,OAAO,OAAO,KAAK,MAAM;AAE/B,MAAI,QAAQ;AAEZ,aAAW,OAAO,MAAM;AACtB,UAAM,WAAW,OAAO,GAAG;AAE3B,QAAI,UAAU;AACZ,eAAS,WAAW;AAAA,IACtB;AAEA,QAAI;AACJ,QAAI,SAAS,KAAK;AAChB,UAAI,MAAMA,SAAQ,OAAO,GAAG,EAAE,KAAK,MAAM,SAAS,EAAE,EAAE,KAAK,SAAS,YAAY;AAChF,aAAO,UAAU,SAAS,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ,MAAM,aAAa,OAAO;AAEpF,UAAI,OAAO;AAET,cAAM,eAAe,KAAK,UAAU,MAAM;AAC1C,YAAI,YAAY,IAAI,KAAK,EAAE,QAAQ;AACnC,aAAK,QAAQ,UAAU;AACvB,aAAK,SAAS,UAAU,SAAS,KAAK,UAAU;AAChD,0BAAkB,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,kBAAkB;AAAA,MAC/D,OAAO;AAEL,YAAI,YAAY,IAAI,KAAK,EAAE,QAAQ;AACnC,aAAK,QAAQ,UAAU;AACvB,aAAK,SAAS,UAAU;AAAA,MAE1B;AAAA,IACF,OAAO;AACL,aAAO,UAAUA,UAAS,UAAU,KAAK;AAAA,IAC3C;AAEA,QAAI,SAAS,MAAM;AAEjB,YAAM,UAAU;AAAA,QACd,cAAc,CAAC;AAAA,QACf,IAAI,SAAS,KAAK;AAAA,QAClB,MAAM,SAAS;AAAA,QACf,MAAM;AAAA,MACR;AACA,YAAM,OAAO,UAAUA,UAAS,SAAS,KAAK;AAG9C,UAAI,SAAS,KAAK,aAAa,WAAW;AACxC,cAAM,QAAQ,KAAK,KAAK,SAAS,IAAI;AACrC,cAAM,QAAQ,KAAK,IAAI,IAAI;AAAA,MAC7B,OAAO;AACL,cAAM,QAAQ,KAAK,IAAI,IAAI;AAC3B,cAAM,QAAQ,KAAK,KAAK,SAAS,IAAI;AAAA,MACvC;AAEA,YAAM,UAAU,KAAK,IAAI,KAAK,KAAK,QAAQ;AAC3C,YAAM,UAAU,KAAK,KAAK,SAAS,KAAK,KAAK,QAAQ;AAAA,IACvD,OAAO;AAIL,YAAM,QAAQ,KAAK,IAAI,IAAI;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,MAAM,UAAU,MAAM,UAAU,GAAG,KAAK;AAC5C,MAAI,MAAM;AACV,YAAU,QAAQ,SAAU,UAAU;AACpC;AACA,QAAI,MAAM,gBAAgB,QAAQ;AAClC,UAAM;AAAA,MACJ,SAAS;AAAA,MACT,SAAS;AAAA,MACT;AAAA,QACE;AAAA,QACA,OAAO,cAAc,SAAS,KAAK;AAAA,QACnC,QAAQ,KAAK,cAAc,eAAO,QAAQ,SAAS,KAAK,EAAE;AAAA,QAC1D,UAAU;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,cAAY,KAAK;AAEjB,MAAI,MAAM,sBAAsB,MAAM,MAAM,CAAC;AAC7C,QAAM,UAAUA,SAAQ,KAAK;AAE7B,QAAM,MAAM,EAAE,QAAQ,SAAU,GAAG;AACjC,QAAI,MAAM,UAAa,MAAM,KAAK,CAAC,MAAM,QAAW;AAClD,UAAI,KAAK,UAAU,IAAI,OAAO,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,CAAC;AAC3D,WACG,OAAO,MAAM,QAAQ,KAAK,OAAO,CAAC,EAClC;AAAA,QACC;AAAA,QACA,gBACG,MAAM,KAAK,CAAC,EAAE,IAAI,MAAM,KAAK,CAAC,EAAE,QAAQ,KACzC,OACC,MAAM,KAAK,CAAC,EAAE,KACZ,kBAAkB,CAAC,IAAI,kBAAkB,CAAC,EAAE,IAAI,KACjD,MAAM,KAAK,CAAC,EAAE,SAAS,KACzB;AAAA,MACJ;AACF,WACG,OAAO,MAAM,QAAQ,KAAK,OAAO,CAAC,EAClC,KAAK,gBAAgB,MAAM,KAAK,CAAC,EAAE,IAAI,MAAM,KAAK,CAAC,EAAE,QAAQ,CAAC;AACjE,YAAM,WAAW,YAAY,iBAAiB,MAAM,QAAQ,KAAK,OAAO,IAAI,WAAW;AACvF,eAAS,QAAQ,CAAC,YAAY;AAC5B,cAAM,SAAS,QAAQ;AACvB,YAAI,SAAS;AACb,YAAI,SAAS;AACb,YAAI,QAAQ;AACV,cAAI,OAAO,eAAe;AACxB,qBAAS,OAAO,cAAc,QAAQ,EAAE;AAAA,UAC1C;AACA,mBAAS,SAAS,OAAO,aAAa,cAAc,GAAG,EAAE;AACzD,cAAI,OAAO,MAAM,MAAM,GAAG;AACxB,qBAAS;AAAA,UACX;AAAA,QACF;AACA,gBAAQ,aAAa,MAAM,IAAI,SAAS,CAAC;AACzC,gBAAQ,aAAa,MAAM,SAAS,SAAS,CAAC;AAAA,MAChD,CAAC;AAAA,IACH,OAAO;AACL,UAAI,MAAM,aAAa,IAAI,OAAO,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,IACjE;AAAA,EACF,CAAC;AAED,MAAI,WAAW,QAAQ,QAAQ;AAE/B,QAAM,MAAM,EAAE,QAAQ,SAAU,GAAG;AACjC,QAAI,MAAM,UAAa,MAAM,KAAK,CAAC,MAAM,QAAW;AAClD,UAAI,MAAM,UAAU,EAAE,IAAI,SAAS,EAAE,IAAI,OAAO,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,CAAC;AAC7E,eAASA,UAAS,MAAM,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,QAAQ;AAAA,IACzD;AAAA,EACF,CAAC;AAED,aAAW,QAAQ,QAAQ;AAE3B,QAAM,YAAY;AAAA,IAChB,IAAI,WAAW,WAAW;AAAA,IAC1B,OAAO,WAAW,WAAW;AAAA,IAC7B,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAEA,YAAU,QAAQ,SAAS,QAAQ,IAAI,KAAK;AAC5C,YAAU,SAAS,SAAS,SAAS,IAAI,KAAK;AAE9C,MAAI,MAAM,gBAAgB,WAAW,KAAK;AAC1C,SAAO;AACT,GA3MkB;AA6MlB,IAAO,wBAAQ;AAAA,EACb;AAAA,EACA;AACF;;;AEhSO,IAAM,UAA6B;AAAA,EACxC;AAAA,EACA,IAAI,KAAK;AACP,WAAO,IAAI,QAAQ,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM,wBAAC,QAAQ;AACb,QAAI,CAAC,IAAI,OAAO;AACd,UAAI,QAAQ,CAAC;AAAA,IACf;AACA,QAAI,MAAM,sBAAsB,IAAI;AAAA,EACtC,GALM;AAMR;", + "names": ["isFirst", "line", "diagram"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-v2-4FDKWEC3.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-v2-4FDKWEC3.mjs new file mode 100644 index 0000000..b659e24 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-v2-4FDKWEC3.mjs @@ -0,0 +1,39 @@ +import { + StateDB, + stateDiagram_default, + stateRenderer_v3_unified_default, + styles_default +} from "./chunk-DI55MBZ5.mjs"; +import "./chunk-55IACEB6.mjs"; +import "./chunk-QN33PNHL.mjs"; +import "./chunk-N4CR4FBY.mjs"; +import "./chunk-QXUST7PY.mjs"; +import "./chunk-HN2XXSSU.mjs"; +import "./chunk-JZLCHNYA.mjs"; +import "./chunk-CVBHYZKI.mjs"; +import "./chunk-ATLVNIR6.mjs"; +import "./chunk-JA3XYJ7Z.mjs"; +import "./chunk-S3R3BYOJ.mjs"; +import "./chunk-ABZYJK2D.mjs"; +import { + __name +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/state/stateDiagram-v2.ts +var diagram = { + parser: stateDiagram_default, + get db() { + return new StateDB(2); + }, + renderer: stateRenderer_v3_unified_default, + styles: styles_default, + init: /* @__PURE__ */ __name((cnf) => { + if (!cnf.state) { + cnf.state = {}; + } + cnf.state.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; + }, "init") +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-v2-4FDKWEC3.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-v2-4FDKWEC3.mjs.map new file mode 100644 index 0000000..10ccc84 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/stateDiagram-v2-4FDKWEC3.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/state/stateDiagram-v2.ts"], + "sourcesContent": ["import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: JISON doesn't support types\nimport parser from './parser/stateDiagram.jison';\nimport { StateDB } from './stateDb.js';\nimport styles from './styles.js';\nimport renderer from './stateRenderer-v3-unified.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n get db() {\n return new StateDB(2);\n },\n renderer,\n styles,\n init: (cnf) => {\n if (!cnf.state) {\n cnf.state = {};\n }\n cnf.state.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n },\n};\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAOO,IAAM,UAA6B;AAAA,EACxC;AAAA,EACA,IAAI,KAAK;AACP,WAAO,IAAI,QAAQ,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM,wBAAC,QAAQ;AACb,QAAI,CAAC,IAAI,OAAO;AACd,UAAI,QAAQ,CAAC;AAAA,IACf;AACA,QAAI,MAAM,sBAAsB,IAAI;AAAA,EACtC,GALM;AAMR;", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/timeline-definition-IT6M3QCI.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/timeline-definition-IT6M3QCI.mjs new file mode 100644 index 0000000..0c6b293 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/timeline-definition-IT6M3QCI.mjs @@ -0,0 +1,1269 @@ +import { + clear, + commonDb_exports, + getConfig2 as getConfig, + setupGraphViewbox +} from "./chunk-ABZYJK2D.mjs"; +import { + __export, + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/timeline/parser/timeline.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [6, 8, 10, 11, 12, 14, 16, 17, 20, 21], $V1 = [1, 9], $V2 = [1, 10], $V3 = [1, 11], $V4 = [1, 12], $V5 = [1, 13], $V6 = [1, 16], $V7 = [1, 17]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "timeline": 4, "document": 5, "EOF": 6, "line": 7, "SPACE": 8, "statement": 9, "NEWLINE": 10, "title": 11, "acc_title": 12, "acc_title_value": 13, "acc_descr": 14, "acc_descr_value": 15, "acc_descr_multiline_value": 16, "section": 17, "period_statement": 18, "event_statement": 19, "period": 20, "event": 21, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "timeline", 6: "EOF", 8: "SPACE", 10: "NEWLINE", 11: "title", 12: "acc_title", 13: "acc_title_value", 14: "acc_descr", 15: "acc_descr_value", 16: "acc_descr_multiline_value", 17: "section", 20: "period", 21: "event" }, + productions_: [0, [3, 3], [5, 0], [5, 2], [7, 2], [7, 1], [7, 1], [7, 1], [9, 1], [9, 2], [9, 2], [9, 1], [9, 1], [9, 1], [9, 1], [18, 1], [19, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 1: + return $$[$0 - 1]; + break; + case 2: + this.$ = []; + break; + case 3: + $$[$0 - 1].push($$[$0]); + this.$ = $$[$0 - 1]; + break; + case 4: + case 5: + this.$ = $$[$0]; + break; + case 6: + case 7: + this.$ = []; + break; + case 8: + yy.getCommonDb().setDiagramTitle($$[$0].substr(6)); + this.$ = $$[$0].substr(6); + break; + case 9: + this.$ = $$[$0].trim(); + yy.getCommonDb().setAccTitle(this.$); + break; + case 10: + case 11: + this.$ = $$[$0].trim(); + yy.getCommonDb().setAccDescription(this.$); + break; + case 12: + yy.addSection($$[$0].substr(8)); + this.$ = $$[$0].substr(8); + break; + case 15: + yy.addTask($$[$0], 0, ""); + this.$ = $$[$0]; + break; + case 16: + yy.addEvent($$[$0].substr(2)); + this.$ = $$[$0]; + break; + } + }, "anonymous"), + table: [{ 3: 1, 4: [1, 2] }, { 1: [3] }, o($V0, [2, 2], { 5: 3 }), { 6: [1, 4], 7: 5, 8: [1, 6], 9: 7, 10: [1, 8], 11: $V1, 12: $V2, 14: $V3, 16: $V4, 17: $V5, 18: 14, 19: 15, 20: $V6, 21: $V7 }, o($V0, [2, 7], { 1: [2, 1] }), o($V0, [2, 3]), { 9: 18, 11: $V1, 12: $V2, 14: $V3, 16: $V4, 17: $V5, 18: 14, 19: 15, 20: $V6, 21: $V7 }, o($V0, [2, 5]), o($V0, [2, 6]), o($V0, [2, 8]), { 13: [1, 19] }, { 15: [1, 20] }, o($V0, [2, 11]), o($V0, [2, 12]), o($V0, [2, 13]), o($V0, [2, 14]), o($V0, [2, 15]), o($V0, [2, 16]), o($V0, [2, 4]), o($V0, [2, 9]), o($V0, [2, 10])], + defaultActions: {}, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + break; + case 1: + break; + case 2: + return 10; + break; + case 3: + break; + case 4: + break; + case 5: + return 4; + break; + case 6: + return 11; + break; + case 7: + this.begin("acc_title"); + return 12; + break; + case 8: + this.popState(); + return "acc_title_value"; + break; + case 9: + this.begin("acc_descr"); + return 14; + break; + case 10: + this.popState(); + return "acc_descr_value"; + break; + case 11: + this.begin("acc_descr_multiline"); + break; + case 12: + this.popState(); + break; + case 13: + return "acc_descr_multiline_value"; + break; + case 14: + return 17; + break; + case 15: + return 21; + break; + case 16: + return 20; + break; + case 17: + return 6; + break; + case 18: + return "INVALID"; + break; + } + }, "anonymous"), + rules: [/^(?:%(?!\{)[^\n]*)/i, /^(?:[^\}]%%[^\n]*)/i, /^(?:[\n]+)/i, /^(?:\s+)/i, /^(?:#[^\n]*)/i, /^(?:timeline\b)/i, /^(?:title\s[^\n]+)/i, /^(?:accTitle\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*\{\s*)/i, /^(?:[\}])/i, /^(?:[^\}]*)/i, /^(?:section\s[^:\n]+)/i, /^(?::\s(?:[^:\n]|:(?!\s))+)/i, /^(?:[^#:\n]+)/i, /^(?:$)/i, /^(?:.)/i], + conditions: { "acc_descr_multiline": { "rules": [12, 13], "inclusive": false }, "acc_descr": { "rules": [10], "inclusive": false }, "acc_title": { "rules": [8], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 18], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var timeline_default = parser; + +// src/diagrams/timeline/timelineDb.js +var timelineDb_exports = {}; +__export(timelineDb_exports, { + addEvent: () => addEvent, + addSection: () => addSection, + addTask: () => addTask, + addTaskOrg: () => addTaskOrg, + clear: () => clear2, + default: () => timelineDb_default, + getCommonDb: () => getCommonDb, + getSections: () => getSections, + getTasks: () => getTasks +}); +var currentSection = ""; +var currentTaskId = 0; +var sections = []; +var tasks = []; +var rawTasks = []; +var getCommonDb = /* @__PURE__ */ __name(() => commonDb_exports, "getCommonDb"); +var clear2 = /* @__PURE__ */ __name(function() { + sections.length = 0; + tasks.length = 0; + currentSection = ""; + rawTasks.length = 0; + clear(); +}, "clear"); +var addSection = /* @__PURE__ */ __name(function(txt) { + currentSection = txt; + sections.push(txt); +}, "addSection"); +var getSections = /* @__PURE__ */ __name(function() { + return sections; +}, "getSections"); +var getTasks = /* @__PURE__ */ __name(function() { + let allItemsProcessed = compileTasks(); + const maxDepth = 100; + let iterationCount = 0; + while (!allItemsProcessed && iterationCount < maxDepth) { + allItemsProcessed = compileTasks(); + iterationCount++; + } + tasks.push(...rawTasks); + return tasks; +}, "getTasks"); +var addTask = /* @__PURE__ */ __name(function(period, length, event) { + const rawTask = { + id: currentTaskId++, + section: currentSection, + type: currentSection, + task: period, + score: length ? length : 0, + //if event is defined, then add it the events array + events: event ? [event] : [] + }; + rawTasks.push(rawTask); +}, "addTask"); +var addEvent = /* @__PURE__ */ __name(function(event) { + const currentTask = rawTasks.find((task) => task.id === currentTaskId - 1); + currentTask.events.push(event); +}, "addEvent"); +var addTaskOrg = /* @__PURE__ */ __name(function(descr) { + const newTask = { + section: currentSection, + type: currentSection, + description: descr, + task: descr, + classes: [] + }; + tasks.push(newTask); +}, "addTaskOrg"); +var compileTasks = /* @__PURE__ */ __name(function() { + const compileTask = /* @__PURE__ */ __name(function(pos) { + return rawTasks[pos].processed; + }, "compileTask"); + let allProcessed = true; + for (const [i, rawTask] of rawTasks.entries()) { + compileTask(i); + allProcessed = allProcessed && rawTask.processed; + } + return allProcessed; +}, "compileTasks"); +var timelineDb_default = { + clear: clear2, + getCommonDb, + addSection, + getSections, + getTasks, + addTask, + addTaskOrg, + addEvent +}; + +// src/diagrams/timeline/timelineRenderer.ts +import { select as select2 } from "d3"; + +// src/diagrams/timeline/svgDraw.js +import { arc as d3arc, select } from "d3"; +var MAX_SECTIONS = 12; +var drawRect = /* @__PURE__ */ __name(function(elem, rectData) { + const rectElem = elem.append("rect"); + rectElem.attr("x", rectData.x); + rectElem.attr("y", rectData.y); + rectElem.attr("fill", rectData.fill); + rectElem.attr("stroke", rectData.stroke); + rectElem.attr("width", rectData.width); + rectElem.attr("height", rectData.height); + rectElem.attr("rx", rectData.rx); + rectElem.attr("ry", rectData.ry); + if (rectData.class !== void 0) { + rectElem.attr("class", rectData.class); + } + return rectElem; +}, "drawRect"); +var drawFace = /* @__PURE__ */ __name(function(element, faceData) { + const radius = 15; + const circleElement = element.append("circle").attr("cx", faceData.cx).attr("cy", faceData.cy).attr("class", "face").attr("r", radius).attr("stroke-width", 2).attr("overflow", "visible"); + const face = element.append("g"); + face.append("circle").attr("cx", faceData.cx - radius / 3).attr("cy", faceData.cy - radius / 3).attr("r", 1.5).attr("stroke-width", 2).attr("fill", "#666").attr("stroke", "#666"); + face.append("circle").attr("cx", faceData.cx + radius / 3).attr("cy", faceData.cy - radius / 3).attr("r", 1.5).attr("stroke-width", 2).attr("fill", "#666").attr("stroke", "#666"); + function smile(face2) { + const arc = d3arc().startAngle(Math.PI / 2).endAngle(3 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); + face2.append("path").attr("class", "mouth").attr("d", arc).attr("transform", "translate(" + faceData.cx + "," + (faceData.cy + 2) + ")"); + } + __name(smile, "smile"); + function sad(face2) { + const arc = d3arc().startAngle(3 * Math.PI / 2).endAngle(5 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); + face2.append("path").attr("class", "mouth").attr("d", arc).attr("transform", "translate(" + faceData.cx + "," + (faceData.cy + 7) + ")"); + } + __name(sad, "sad"); + function ambivalent(face2) { + face2.append("line").attr("class", "mouth").attr("stroke", 2).attr("x1", faceData.cx - 5).attr("y1", faceData.cy + 7).attr("x2", faceData.cx + 5).attr("y2", faceData.cy + 7).attr("class", "mouth").attr("stroke-width", "1px").attr("stroke", "#666"); + } + __name(ambivalent, "ambivalent"); + if (faceData.score > 3) { + smile(face); + } else if (faceData.score < 3) { + sad(face); + } else { + ambivalent(face); + } + return circleElement; +}, "drawFace"); +var drawCircle = /* @__PURE__ */ __name(function(element, circleData) { + const circleElement = element.append("circle"); + circleElement.attr("cx", circleData.cx); + circleElement.attr("cy", circleData.cy); + circleElement.attr("class", "actor-" + circleData.pos); + circleElement.attr("fill", circleData.fill); + circleElement.attr("stroke", circleData.stroke); + circleElement.attr("r", circleData.r); + if (circleElement.class !== void 0) { + circleElement.attr("class", circleElement.class); + } + if (circleData.title !== void 0) { + circleElement.append("title").text(circleData.title); + } + return circleElement; +}, "drawCircle"); +var drawText = /* @__PURE__ */ __name(function(elem, textData) { + const nText = textData.text.replace(//gi, " "); + const textElem = elem.append("text"); + textElem.attr("x", textData.x); + textElem.attr("y", textData.y); + textElem.attr("class", "legend"); + textElem.style("text-anchor", textData.anchor); + if (textData.class !== void 0) { + textElem.attr("class", textData.class); + } + const span = textElem.append("tspan"); + span.attr("x", textData.x + textData.textMargin * 2); + span.text(nText); + return textElem; +}, "drawText"); +var drawLabel = /* @__PURE__ */ __name(function(elem, txtObject) { + function genPoints(x, y, width, height, cut) { + return x + "," + y + " " + (x + width) + "," + y + " " + (x + width) + "," + (y + height - cut) + " " + (x + width - cut * 1.2) + "," + (y + height) + " " + x + "," + (y + height); + } + __name(genPoints, "genPoints"); + const polygon = elem.append("polygon"); + polygon.attr("points", genPoints(txtObject.x, txtObject.y, 50, 20, 7)); + polygon.attr("class", "labelBox"); + txtObject.y = txtObject.y + txtObject.labelMargin; + txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin; + drawText(elem, txtObject); +}, "drawLabel"); +var drawSection = /* @__PURE__ */ __name(function(elem, section, conf) { + const g = elem.append("g"); + const rect = getNoteRect(); + rect.x = section.x; + rect.y = section.y; + rect.fill = section.fill; + rect.width = conf.width; + rect.height = conf.height; + rect.class = "journey-section section-type-" + section.num; + rect.rx = 3; + rect.ry = 3; + drawRect(g, rect); + _drawTextCandidateFunc(conf)( + section.text, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: "journey-section section-type-" + section.num }, + conf, + section.colour + ); +}, "drawSection"); +var taskCount = -1; +var drawTask = /* @__PURE__ */ __name(function(elem, task, conf) { + const center = task.x + conf.width / 2; + const g = elem.append("g"); + taskCount++; + const maxHeight = 300 + 5 * 30; + g.append("line").attr("id", "task" + taskCount).attr("x1", center).attr("y1", task.y).attr("x2", center).attr("y2", maxHeight).attr("class", "task-line").attr("stroke-width", "1px").attr("stroke-dasharray", "4 2").attr("stroke", "#666"); + drawFace(g, { + cx: center, + cy: 300 + (5 - task.score) * 30, + score: task.score + }); + const rect = getNoteRect(); + rect.x = task.x; + rect.y = task.y; + rect.fill = task.fill; + rect.width = conf.width; + rect.height = conf.height; + rect.class = "task task-type-" + task.num; + rect.rx = 3; + rect.ry = 3; + drawRect(g, rect); + _drawTextCandidateFunc(conf)( + task.task, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: "task" }, + conf, + task.colour + ); +}, "drawTask"); +var drawBackgroundRect = /* @__PURE__ */ __name(function(elem, bounds) { + const rectElem = drawRect(elem, { + x: bounds.startx, + y: bounds.starty, + width: bounds.stopx - bounds.startx, + height: bounds.stopy - bounds.starty, + fill: bounds.fill, + class: "rect" + }); + rectElem.lower(); +}, "drawBackgroundRect"); +var getTextObj = /* @__PURE__ */ __name(function() { + return { + x: 0, + y: 0, + fill: void 0, + "text-anchor": "start", + width: 100, + height: 100, + textMargin: 0, + rx: 0, + ry: 0 + }; +}, "getTextObj"); +var getNoteRect = /* @__PURE__ */ __name(function() { + return { + x: 0, + y: 0, + width: 100, + anchor: "start", + height: 100, + rx: 0, + ry: 0 + }; +}, "getNoteRect"); +var _drawTextCandidateFunc = /* @__PURE__ */ (function() { + function byText(content, g, x, y, width, height, textAttrs, colour) { + const text = g.append("text").attr("x", x + width / 2).attr("y", y + height / 2 + 5).style("font-color", colour).style("text-anchor", "middle").text(content); + _setTextAttrs(text, textAttrs); + } + __name(byText, "byText"); + function byTspan(content, g, x, y, width, height, textAttrs, conf, colour) { + const { taskFontSize, taskFontFamily } = conf; + const lines = content.split(//gi); + for (let i = 0; i < lines.length; i++) { + const dy = i * taskFontSize - taskFontSize * (lines.length - 1) / 2; + const text = g.append("text").attr("x", x + width / 2).attr("y", y).attr("fill", colour).style("text-anchor", "middle").style("font-size", taskFontSize).style("font-family", taskFontFamily); + text.append("tspan").attr("x", x + width / 2).attr("dy", dy).text(lines[i]); + text.attr("y", y + height / 2).attr("dominant-baseline", "central").attr("alignment-baseline", "central"); + _setTextAttrs(text, textAttrs); + } + } + __name(byTspan, "byTspan"); + function byFo(content, g, x, y, width, height, textAttrs, conf) { + const body = g.append("switch"); + const f = body.append("foreignObject").attr("x", x).attr("y", y).attr("width", width).attr("height", height).attr("position", "fixed"); + const text = f.append("xhtml:div").style("display", "table").style("height", "100%").style("width", "100%"); + text.append("div").attr("class", "label").style("display", "table-cell").style("text-align", "center").style("vertical-align", "middle").text(content); + byTspan(content, body, x, y, width, height, textAttrs, conf); + _setTextAttrs(text, textAttrs); + } + __name(byFo, "byFo"); + function _setTextAttrs(toText, fromTextAttrsDict) { + for (const key in fromTextAttrsDict) { + if (key in fromTextAttrsDict) { + toText.attr(key, fromTextAttrsDict[key]); + } + } + } + __name(_setTextAttrs, "_setTextAttrs"); + return function(conf) { + return conf.textPlacement === "fo" ? byFo : conf.textPlacement === "old" ? byText : byTspan; + }; +})(); +var initGraphics = /* @__PURE__ */ __name(function(graphics) { + graphics.append("defs").append("marker").attr("id", "arrowhead").attr("refX", 5).attr("refY", 2).attr("markerWidth", 6).attr("markerHeight", 4).attr("orient", "auto").append("path").attr("d", "M 0,0 V 4 L6,2 Z"); +}, "initGraphics"); +function wrap(text, width) { + text.each(function() { + var text2 = select(this), words = text2.text().split(/(\s+|
)/).reverse(), word, line = [], lineHeight = 1.1, y = text2.attr("y"), dy = parseFloat(text2.attr("dy")), tspan = text2.text(null).append("tspan").attr("x", 0).attr("y", y).attr("dy", dy + "em"); + for (let j = 0; j < words.length; j++) { + word = words[words.length - 1 - j]; + line.push(word); + tspan.text(line.join(" ").trim()); + if (tspan.node().getComputedTextLength() > width || word === "
") { + line.pop(); + tspan.text(line.join(" ").trim()); + if (word === "
") { + line = [""]; + } else { + line = [word]; + } + tspan = text2.append("tspan").attr("x", 0).attr("y", y).attr("dy", lineHeight + "em").text(word); + } + } + }); +} +__name(wrap, "wrap"); +var drawNode = /* @__PURE__ */ __name(function(elem, node, fullSection, conf) { + const section = fullSection % MAX_SECTIONS - 1; + const nodeElem = elem.append("g"); + node.section = section; + nodeElem.attr( + "class", + (node.class ? node.class + " " : "") + "timeline-node " + ("section-" + section) + ); + const bkgElem = nodeElem.append("g"); + const textElem = nodeElem.append("g"); + const txt = textElem.append("text").text(node.descr).attr("dy", "1em").attr("alignment-baseline", "middle").attr("dominant-baseline", "middle").attr("text-anchor", "middle").call(wrap, node.width); + const bbox = txt.node().getBBox(); + const fontSize = conf.fontSize?.replace ? conf.fontSize.replace("px", "") : conf.fontSize; + node.height = bbox.height + fontSize * 1.1 * 0.5 + node.padding; + node.height = Math.max(node.height, node.maxHeight); + node.width = node.width + 2 * node.padding; + textElem.attr("transform", "translate(" + node.width / 2 + ", " + node.padding / 2 + ")"); + defaultBkg(bkgElem, node, section, conf); + return node; +}, "drawNode"); +var getVirtualNodeHeight = /* @__PURE__ */ __name(function(elem, node, conf) { + const textElem = elem.append("g"); + const txt = textElem.append("text").text(node.descr).attr("dy", "1em").attr("alignment-baseline", "middle").attr("dominant-baseline", "middle").attr("text-anchor", "middle").call(wrap, node.width); + const bbox = txt.node().getBBox(); + const fontSize = conf.fontSize?.replace ? conf.fontSize.replace("px", "") : conf.fontSize; + textElem.remove(); + return bbox.height + fontSize * 1.1 * 0.5 + node.padding; +}, "getVirtualNodeHeight"); +var defaultBkg = /* @__PURE__ */ __name(function(elem, node, section) { + const rd = 5; + elem.append("path").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + node.type).attr( + "d", + `M0 ${node.height - rd} v${-node.height + 2 * rd} q0,-5 5,-5 h${node.width - 2 * rd} q5,0 5,5 v${node.height - rd} H0 Z` + ); + elem.append("line").attr("class", "node-line-" + section).attr("x1", 0).attr("y1", node.height).attr("x2", node.width).attr("y2", node.height); +}, "defaultBkg"); +var svgDraw_default = { + drawRect, + drawCircle, + drawSection, + drawText, + drawLabel, + drawTask, + drawBackgroundRect, + getTextObj, + getNoteRect, + initGraphics, + drawNode, + getVirtualNodeHeight +}; + +// src/diagrams/timeline/timelineRenderer.ts +var draw = /* @__PURE__ */ __name(function(text, id, version, diagObj) { + const conf = getConfig(); + const LEFT_MARGIN = conf.timeline?.leftMargin ?? 50; + log.debug("timeline", diagObj.db); + const securityLevel = conf.securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = select2("#i" + id); + } + const root = securityLevel === "sandbox" ? select2(sandboxElement.nodes()[0].contentDocument.body) : select2("body"); + const svg = root.select("#" + id); + svg.append("g"); + const tasks2 = diagObj.db.getTasks(); + const title = diagObj.db.getCommonDb().getDiagramTitle(); + log.debug("task", tasks2); + svgDraw_default.initGraphics(svg); + const sections2 = diagObj.db.getSections(); + log.debug("sections", sections2); + let maxSectionHeight = 0; + let maxTaskHeight = 0; + let depthY = 0; + let sectionBeginY = 0; + let masterX = 50 + LEFT_MARGIN; + let masterY = 50; + sectionBeginY = 50; + let sectionNumber = 0; + let hasSections = true; + sections2.forEach(function(section) { + const sectionNode = { + number: sectionNumber, + descr: section, + section: sectionNumber, + width: 150, + padding: 20, + maxHeight: maxSectionHeight + }; + const sectionHeight = svgDraw_default.getVirtualNodeHeight(svg, sectionNode, conf); + log.debug("sectionHeight before draw", sectionHeight); + maxSectionHeight = Math.max(maxSectionHeight, sectionHeight + 20); + }); + let maxEventCount = 0; + let maxEventLineLength = 0; + log.debug("tasks.length", tasks2.length); + for (const [i, task] of tasks2.entries()) { + const taskNode = { + number: i, + descr: task, + section: task.section, + width: 150, + padding: 20, + maxHeight: maxTaskHeight + }; + const taskHeight = svgDraw_default.getVirtualNodeHeight(svg, taskNode, conf); + log.debug("taskHeight before draw", taskHeight); + maxTaskHeight = Math.max(maxTaskHeight, taskHeight + 20); + maxEventCount = Math.max(maxEventCount, task.events.length); + let maxEventLineLengthTemp = 0; + for (const event of task.events) { + const eventNode = { + descr: event, + section: task.section, + number: task.section, + width: 150, + padding: 20, + maxHeight: 50 + }; + maxEventLineLengthTemp += svgDraw_default.getVirtualNodeHeight(svg, eventNode, conf); + } + if (task.events.length > 0) { + maxEventLineLengthTemp += (task.events.length - 1) * 10; + } + maxEventLineLength = Math.max(maxEventLineLength, maxEventLineLengthTemp); + } + log.debug("maxSectionHeight before draw", maxSectionHeight); + log.debug("maxTaskHeight before draw", maxTaskHeight); + if (sections2 && sections2.length > 0) { + sections2.forEach((section) => { + const tasksForSection = tasks2.filter((task) => task.section === section); + const sectionNode = { + number: sectionNumber, + descr: section, + section: sectionNumber, + width: 200 * Math.max(tasksForSection.length, 1) - 50, + padding: 20, + maxHeight: maxSectionHeight + }; + log.debug("sectionNode", sectionNode); + const sectionNodeWrapper = svg.append("g"); + const node = svgDraw_default.drawNode(sectionNodeWrapper, sectionNode, sectionNumber, conf); + log.debug("sectionNode output", node); + sectionNodeWrapper.attr("transform", `translate(${masterX}, ${sectionBeginY})`); + masterY += maxSectionHeight + 50; + if (tasksForSection.length > 0) { + drawTasks( + svg, + tasksForSection, + sectionNumber, + masterX, + masterY, + maxTaskHeight, + conf, + maxEventCount, + maxEventLineLength, + maxSectionHeight, + false + ); + } + masterX += 200 * Math.max(tasksForSection.length, 1); + masterY = sectionBeginY; + sectionNumber++; + }); + } else { + hasSections = false; + drawTasks( + svg, + tasks2, + sectionNumber, + masterX, + masterY, + maxTaskHeight, + conf, + maxEventCount, + maxEventLineLength, + maxSectionHeight, + true + ); + } + const box = svg.node().getBBox(); + log.debug("bounds", box); + if (title) { + svg.append("text").text(title).attr("x", box.width / 2 - LEFT_MARGIN).attr("font-size", "4ex").attr("font-weight", "bold").attr("y", 20); + } + depthY = hasSections ? maxSectionHeight + maxTaskHeight + 150 : maxTaskHeight + 100; + const lineWrapper = svg.append("g").attr("class", "lineWrapper"); + lineWrapper.append("line").attr("x1", LEFT_MARGIN).attr("y1", depthY).attr("x2", box.width + 3 * LEFT_MARGIN).attr("y2", depthY).attr("stroke-width", 4).attr("stroke", "black").attr("marker-end", "url(#arrowhead)"); + setupGraphViewbox( + void 0, + svg, + conf.timeline?.padding ?? 50, + conf.timeline?.useMaxWidth ?? false + ); +}, "draw"); +var drawTasks = /* @__PURE__ */ __name(function(diagram2, tasks2, sectionColor, masterX, masterY, maxTaskHeight, conf, maxEventCount, maxEventLineLength, maxSectionHeight, isWithoutSections) { + for (const task of tasks2) { + const taskNode = { + descr: task.task, + section: sectionColor, + number: sectionColor, + width: 150, + padding: 20, + maxHeight: maxTaskHeight + }; + log.debug("taskNode", taskNode); + const taskWrapper = diagram2.append("g").attr("class", "taskWrapper"); + const node = svgDraw_default.drawNode(taskWrapper, taskNode, sectionColor, conf); + const taskHeight = node.height; + log.debug("taskHeight after draw", taskHeight); + taskWrapper.attr("transform", `translate(${masterX}, ${masterY})`); + maxTaskHeight = Math.max(maxTaskHeight, taskHeight); + if (task.events) { + const lineWrapper = diagram2.append("g").attr("class", "lineWrapper"); + let lineLength = maxTaskHeight; + masterY += 100; + lineLength = lineLength + drawEvents(diagram2, task.events, sectionColor, masterX, masterY, conf); + masterY -= 100; + lineWrapper.append("line").attr("x1", masterX + 190 / 2).attr("y1", masterY + maxTaskHeight).attr("x2", masterX + 190 / 2).attr("y2", masterY + maxTaskHeight + 100 + maxEventLineLength + 100).attr("stroke-width", 2).attr("stroke", "black").attr("marker-end", "url(#arrowhead)").attr("stroke-dasharray", "5,5"); + } + masterX = masterX + 200; + if (isWithoutSections && !conf.timeline?.disableMulticolor) { + sectionColor++; + } + } + masterY = masterY - 10; +}, "drawTasks"); +var drawEvents = /* @__PURE__ */ __name(function(diagram2, events, sectionColor, masterX, masterY, conf) { + let maxEventHeight = 0; + const eventBeginY = masterY; + masterY = masterY + 100; + for (const event of events) { + const eventNode = { + descr: event, + section: sectionColor, + number: sectionColor, + width: 150, + padding: 20, + maxHeight: 50 + }; + log.debug("eventNode", eventNode); + const eventWrapper = diagram2.append("g").attr("class", "eventWrapper"); + const node = svgDraw_default.drawNode(eventWrapper, eventNode, sectionColor, conf); + const eventHeight = node.height; + maxEventHeight = maxEventHeight + eventHeight; + eventWrapper.attr("transform", `translate(${masterX}, ${masterY})`); + masterY = masterY + 10 + eventHeight; + } + masterY = eventBeginY; + return maxEventHeight; +}, "drawEvents"); +var timelineRenderer_default = { + setConf: /* @__PURE__ */ __name(() => { + }, "setConf"), + draw +}; + +// src/diagrams/timeline/styles.js +import { darken, lighten, isDark } from "khroma"; +var genSections = /* @__PURE__ */ __name((options) => { + let sections2 = ""; + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + options["lineColor" + i] = options["lineColor" + i] || options["cScaleInv" + i]; + if (isDark(options["lineColor" + i])) { + options["lineColor" + i] = lighten(options["lineColor" + i], 20); + } else { + options["lineColor" + i] = darken(options["lineColor" + i], 20); + } + } + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + const sw = "" + (17 - 3 * i); + sections2 += ` + .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${i - 1} path { + fill: ${options["cScale" + i]}; + } + .section-${i - 1} text { + fill: ${options["cScaleLabel" + i]}; + } + .node-icon-${i - 1} { + font-size: 40px; + color: ${options["cScaleLabel" + i]}; + } + .section-edge-${i - 1}{ + stroke: ${options["cScale" + i]}; + } + .edge-depth-${i - 1}{ + stroke-width: ${sw}; + } + .section-${i - 1} line { + stroke: ${options["cScaleInv" + i]} ; + stroke-width: 3; + } + + .lineWrapper line{ + stroke: ${options["cScaleLabel" + i]} ; + } + + .disabled, .disabled circle, .disabled text { + fill: lightgray; + } + .disabled text { + fill: #efefef; + } + `; + } + return sections2; +}, "genSections"); +var getStyles = /* @__PURE__ */ __name((options) => ` + .edge { + stroke-width: 3; + } + ${genSections(options)} + .section-root rect, .section-root path, .section-root circle { + fill: ${options.git0}; + } + .section-root text { + fill: ${options.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .eventWrapper { + filter: brightness(120%); + } +`, "getStyles"); +var styles_default = getStyles; + +// src/diagrams/timeline/timeline-definition.ts +var diagram = { + db: timelineDb_exports, + renderer: timelineRenderer_default, + parser: timeline_default, + styles: styles_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/timeline-definition-IT6M3QCI.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/timeline-definition-IT6M3QCI.mjs.map new file mode 100644 index 0000000..ac8a9eb --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/timeline-definition-IT6M3QCI.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/timeline/parser/timeline.jison", "../../../src/diagrams/timeline/timelineDb.js", "../../../src/diagrams/timeline/timelineRenderer.ts", "../../../src/diagrams/timeline/svgDraw.js", "../../../src/diagrams/timeline/styles.js", "../../../src/diagrams/timeline/timeline-definition.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,10,11,12,14,16,17,20,21],$V1=[1,9],$V2=[1,10],$V3=[1,11],$V4=[1,12],$V5=[1,13],$V6=[1,16],$V7=[1,17];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"timeline\":4,\"document\":5,\"EOF\":6,\"line\":7,\"SPACE\":8,\"statement\":9,\"NEWLINE\":10,\"title\":11,\"acc_title\":12,\"acc_title_value\":13,\"acc_descr\":14,\"acc_descr_value\":15,\"acc_descr_multiline_value\":16,\"section\":17,\"period_statement\":18,\"event_statement\":19,\"period\":20,\"event\":21,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"timeline\",6:\"EOF\",8:\"SPACE\",10:\"NEWLINE\",11:\"title\",12:\"acc_title\",13:\"acc_title_value\",14:\"acc_descr\",15:\"acc_descr_value\",16:\"acc_descr_multiline_value\",17:\"section\",20:\"period\",21:\"event\"},\nproductions_: [0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[18,1],[19,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n return $$[$0-1]; \nbreak;\ncase 2:\n this.$ = [] \nbreak;\ncase 3:\n$$[$0-1].push($$[$0]);this.$ = $$[$0-1]\nbreak;\ncase 4: case 5:\n this.$ = $$[$0] \nbreak;\ncase 6: case 7:\n this.$=[];\nbreak;\ncase 8:\nyy.getCommonDb().setDiagramTitle($$[$0].substr(6));this.$=$$[$0].substr(6);\nbreak;\ncase 9:\n this.$=$$[$0].trim();yy.getCommonDb().setAccTitle(this.$); \nbreak;\ncase 10: case 11:\n this.$=$$[$0].trim();yy.getCommonDb().setAccDescription(this.$); \nbreak;\ncase 12:\nyy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8);\nbreak;\ncase 15:\nyy.addTask($$[$0],0,'');this.$=$$[$0];\nbreak;\ncase 16:\nyy.addEvent($$[$0].substr(2));this.$=$$[$0];\nbreak;\n}\n},\ntable: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:$V1,12:$V2,14:$V3,16:$V4,17:$V5,18:14,19:15,20:$V6,21:$V7},o($V0,[2,7],{1:[2,1]}),o($V0,[2,3]),{9:18,11:$V1,12:$V2,14:$V3,16:$V4,17:$V5,18:14,19:15,20:$V6,21:$V7},o($V0,[2,5]),o($V0,[2,6]),o($V0,[2,8]),{13:[1,19]},{15:[1,20]},o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),o($V0,[2,16]),o($V0,[2,4]),o($V0,[2,9]),o($V0,[2,10])],\ndefaultActions: {},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:/* skip comments */\nbreak;\ncase 1:/* skip comments */\nbreak;\ncase 2:return 10;\nbreak;\ncase 3:/* skip whitespace */\nbreak;\ncase 4:/* skip comments */\nbreak;\ncase 5:return 4;\nbreak;\ncase 6:return 11;\nbreak;\ncase 7: this.begin(\"acc_title\");return 12; \nbreak;\ncase 8: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 9: this.begin(\"acc_descr\");return 14; \nbreak;\ncase 10: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 11: this.begin(\"acc_descr_multiline\");\nbreak;\ncase 12: this.popState(); \nbreak;\ncase 13:return \"acc_descr_multiline_value\";\nbreak;\ncase 14:return 17;\nbreak;\ncase 15:return 21;\nbreak;\ncase 16:return 20;\nbreak;\ncase 17:return 6;\nbreak;\ncase 18:return 'INVALID';\nbreak;\n}\n},\nrules: [/^(?:%(?!\\{)[^\\n]*)/i,/^(?:[^\\}]%%[^\\n]*)/i,/^(?:[\\n]+)/i,/^(?:\\s+)/i,/^(?:#[^\\n]*)/i,/^(?:timeline\\b)/i,/^(?:title\\s[^\\n]+)/i,/^(?:accTitle\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*\\{\\s*)/i,/^(?:[\\}])/i,/^(?:[^\\}]*)/i,/^(?:section\\s[^:\\n]+)/i,/^(?::\\s(?:[^:\\n]|:(?!\\s))+)/i,/^(?:[^#:\\n]+)/i,/^(?:$)/i,/^(?:.)/i],\nconditions: {\"acc_descr_multiline\":{\"rules\":[12,13],\"inclusive\":false},\"acc_descr\":{\"rules\":[10],\"inclusive\":false},\"acc_title\":{\"rules\":[8],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import * as commonDb from '../common/commonDb.js';\nlet currentSection = '';\nlet currentTaskId = 0;\n\nconst sections = [];\nconst tasks = [];\nconst rawTasks = [];\n\nexport const getCommonDb = () => commonDb;\n\nexport const clear = function () {\n sections.length = 0;\n tasks.length = 0;\n currentSection = '';\n rawTasks.length = 0;\n commonDb.clear();\n};\n\nexport const addSection = function (txt) {\n currentSection = txt;\n sections.push(txt);\n};\n\nexport const getSections = function () {\n return sections;\n};\n\nexport const getTasks = function () {\n let allItemsProcessed = compileTasks();\n const maxDepth = 100;\n let iterationCount = 0;\n while (!allItemsProcessed && iterationCount < maxDepth) {\n allItemsProcessed = compileTasks();\n iterationCount++;\n }\n\n tasks.push(...rawTasks);\n\n return tasks;\n};\n\nexport const addTask = function (period, length, event) {\n const rawTask = {\n id: currentTaskId++,\n section: currentSection,\n type: currentSection,\n task: period,\n score: length ? length : 0,\n //if event is defined, then add it the events array\n events: event ? [event] : [],\n };\n rawTasks.push(rawTask);\n};\n\nexport const addEvent = function (event) {\n // fetch current task with currentTaskId\n const currentTask = rawTasks.find((task) => task.id === currentTaskId - 1);\n //add event to the events array\n currentTask.events.push(event);\n};\n\nexport const addTaskOrg = function (descr) {\n const newTask = {\n section: currentSection,\n type: currentSection,\n description: descr,\n task: descr,\n classes: [],\n };\n tasks.push(newTask);\n};\n\n/**\n * Compiles the raw tasks into a list of tasks with events\n * @returns {boolean} true if all items are processed\n * @private\n * @memberof timelineDb\n */\nconst compileTasks = function () {\n const compileTask = function (pos) {\n return rawTasks[pos].processed;\n };\n\n let allProcessed = true;\n for (const [i, rawTask] of rawTasks.entries()) {\n compileTask(i);\n\n allProcessed = allProcessed && rawTask.processed;\n }\n return allProcessed;\n};\n\nexport default {\n clear,\n getCommonDb,\n addSection,\n getSections,\n getTasks,\n addTask,\n addTaskOrg,\n addEvent,\n};\n", "// @ts-nocheck - don't check until handle it\nimport type { Selection } from 'd3';\nimport { select } from 'd3';\nimport svgDraw from './svgDraw.js';\nimport { log } from '../../logger.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { setupGraphViewbox } from '../../setupGraphViewbox.js';\nimport type { Diagram } from '../../Diagram.js';\nimport type { MermaidConfig } from '../../config.type.js';\n\ninterface Block {\n number: number;\n descr: TDesc;\n section: TSection;\n width: number;\n padding: number;\n maxHeight: number;\n}\n\ninterface TimelineTask {\n id: number;\n section: string;\n type: string;\n task: string;\n score: number;\n events: string[];\n}\nexport const draw = function (text: string, id: string, version: string, diagObj: Diagram) {\n //1. Fetch the configuration\n const conf = getConfig();\n const LEFT_MARGIN = conf.timeline?.leftMargin ?? 50;\n\n log.debug('timeline', diagObj.db);\n\n const securityLevel = conf.securityLevel;\n // Handle root and Document for when rendering in sandbox mode\n let sandboxElement;\n if (securityLevel === 'sandbox') {\n sandboxElement = select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? select(sandboxElement.nodes()[0].contentDocument.body)\n : select('body');\n\n const svg = root.select('#' + id);\n\n svg.append('g');\n\n //4. Fetch the diagram data\n // @ts-expect-error - db not typed yet\n const tasks: TimelineTask[] = diagObj.db.getTasks();\n // @ts-expect-error - db not typed yet\n const title = diagObj.db.getCommonDb().getDiagramTitle();\n log.debug('task', tasks);\n\n //5. Initialize the diagram\n svgDraw.initGraphics(svg);\n\n // fetch Sections\n // @ts-expect-error - db not typed yet\n const sections: string[] = diagObj.db.getSections();\n log.debug('sections', sections);\n\n let maxSectionHeight = 0;\n let maxTaskHeight = 0;\n //let sectionBeginX = 0;\n let depthY = 0;\n let sectionBeginY = 0;\n let masterX = 50 + LEFT_MARGIN;\n //sectionBeginX = masterX;\n let masterY = 50;\n sectionBeginY = 50;\n //draw sections\n let sectionNumber = 0;\n let hasSections = true;\n\n //Calculate the max height of the sections\n sections.forEach(function (section: string) {\n const sectionNode: Block = {\n number: sectionNumber,\n descr: section,\n section: sectionNumber,\n width: 150,\n padding: 20,\n maxHeight: maxSectionHeight,\n };\n const sectionHeight = svgDraw.getVirtualNodeHeight(svg, sectionNode, conf);\n log.debug('sectionHeight before draw', sectionHeight);\n maxSectionHeight = Math.max(maxSectionHeight, sectionHeight + 20);\n });\n\n //tasks length and maxEventCount\n let maxEventCount = 0;\n let maxEventLineLength = 0;\n log.debug('tasks.length', tasks.length);\n //calculate max task height\n // for loop till tasks.length\n\n for (const [i, task] of tasks.entries()) {\n const taskNode: Block = {\n number: i,\n descr: task,\n section: task.section,\n width: 150,\n padding: 20,\n maxHeight: maxTaskHeight,\n };\n const taskHeight = svgDraw.getVirtualNodeHeight(svg, taskNode, conf);\n log.debug('taskHeight before draw', taskHeight);\n maxTaskHeight = Math.max(maxTaskHeight, taskHeight + 20);\n\n //calculate maxEventCount\n maxEventCount = Math.max(maxEventCount, task.events.length);\n //calculate maxEventLineLength\n let maxEventLineLengthTemp = 0;\n for (const event of task.events) {\n const eventNode = {\n descr: event,\n section: task.section,\n number: task.section,\n width: 150,\n padding: 20,\n maxHeight: 50,\n };\n maxEventLineLengthTemp += svgDraw.getVirtualNodeHeight(svg, eventNode, conf);\n }\n // Add spacing between events (10px per event except the last one)\n if (task.events.length > 0) {\n maxEventLineLengthTemp += (task.events.length - 1) * 10;\n }\n maxEventLineLength = Math.max(maxEventLineLength, maxEventLineLengthTemp);\n }\n\n log.debug('maxSectionHeight before draw', maxSectionHeight);\n log.debug('maxTaskHeight before draw', maxTaskHeight);\n\n if (sections && sections.length > 0) {\n sections.forEach((section) => {\n //filter task where tasks.section == section\n const tasksForSection = tasks.filter((task) => task.section === section);\n\n const sectionNode: Block = {\n number: sectionNumber,\n descr: section,\n section: sectionNumber,\n width: 200 * Math.max(tasksForSection.length, 1) - 50,\n padding: 20,\n maxHeight: maxSectionHeight,\n };\n log.debug('sectionNode', sectionNode);\n const sectionNodeWrapper = svg.append('g');\n const node = svgDraw.drawNode(sectionNodeWrapper, sectionNode, sectionNumber, conf);\n log.debug('sectionNode output', node);\n\n sectionNodeWrapper.attr('transform', `translate(${masterX}, ${sectionBeginY})`);\n\n masterY += maxSectionHeight + 50;\n\n //draw tasks for this section\n if (tasksForSection.length > 0) {\n drawTasks(\n svg,\n tasksForSection,\n sectionNumber,\n masterX,\n masterY,\n maxTaskHeight,\n conf,\n maxEventCount,\n maxEventLineLength,\n maxSectionHeight,\n false\n );\n }\n // todo replace with total width of section and its tasks\n masterX += 200 * Math.max(tasksForSection.length, 1);\n\n masterY = sectionBeginY;\n sectionNumber++;\n });\n } else {\n //draw tasks\n hasSections = false;\n drawTasks(\n svg,\n tasks,\n sectionNumber,\n masterX,\n masterY,\n maxTaskHeight,\n conf,\n maxEventCount,\n maxEventLineLength,\n maxSectionHeight,\n true\n );\n }\n\n // Get BBox of the diagram\n const box = svg.node().getBBox();\n log.debug('bounds', box);\n\n if (title) {\n svg\n .append('text')\n .text(title)\n .attr('x', box.width / 2 - LEFT_MARGIN)\n .attr('font-size', '4ex')\n .attr('font-weight', 'bold')\n .attr('y', 20);\n }\n //5. Draw the diagram\n depthY = hasSections ? maxSectionHeight + maxTaskHeight + 150 : maxTaskHeight + 100;\n\n const lineWrapper = svg.append('g').attr('class', 'lineWrapper');\n // Draw activity line\n lineWrapper\n .append('line')\n .attr('x1', LEFT_MARGIN)\n .attr('y1', depthY) // One section head + one task + margins\n .attr('x2', box.width + 3 * LEFT_MARGIN) // Subtract stroke width so arrow point is retained\n .attr('y2', depthY)\n .attr('stroke-width', 4)\n .attr('stroke', 'black')\n .attr('marker-end', 'url(#arrowhead)');\n\n // Setup the view box and size of the svg element\n setupGraphViewbox(\n undefined,\n svg,\n conf.timeline?.padding ?? 50,\n conf.timeline?.useMaxWidth ?? false\n );\n\n // addSVGAccessibilityFields(diagObj.db, diagram, id);\n};\n\nexport const drawTasks = function (\n diagram: Selection,\n tasks: TimelineTask[],\n sectionColor: number,\n masterX: number,\n masterY: number,\n maxTaskHeight: number,\n conf: MermaidConfig,\n maxEventCount: number,\n maxEventLineLength: number,\n maxSectionHeight: number,\n isWithoutSections: boolean\n) {\n // Draw the tasks\n for (const task of tasks) {\n // create node from task\n const taskNode = {\n descr: task.task,\n section: sectionColor,\n number: sectionColor,\n width: 150,\n padding: 20,\n maxHeight: maxTaskHeight,\n };\n\n log.debug('taskNode', taskNode);\n // create task wrapper\n\n const taskWrapper = diagram.append('g').attr('class', 'taskWrapper');\n const node = svgDraw.drawNode(taskWrapper, taskNode, sectionColor, conf);\n const taskHeight = node.height;\n //log task height\n log.debug('taskHeight after draw', taskHeight);\n taskWrapper.attr('transform', `translate(${masterX}, ${masterY})`);\n\n // update max task height\n maxTaskHeight = Math.max(maxTaskHeight, taskHeight);\n\n // if task has events, draw them\n if (task.events) {\n // draw a line between the task and the events\n const lineWrapper = diagram.append('g').attr('class', 'lineWrapper');\n let lineLength = maxTaskHeight;\n //add margin to task\n masterY += 100;\n lineLength =\n lineLength + drawEvents(diagram, task.events, sectionColor, masterX, masterY, conf);\n masterY -= 100;\n\n lineWrapper\n .append('line')\n .attr('x1', masterX + 190 / 2)\n .attr('y1', masterY + maxTaskHeight) // Start from bottom of task box\n .attr('x2', masterX + 190 / 2) // Same x coordinate for vertical line\n .attr('y2', masterY + maxTaskHeight + 100 + maxEventLineLength + 100) // End at consistent depth with ample padding for visible dashed lines and arrowheads\n .attr('stroke-width', 2)\n .attr('stroke', 'black')\n .attr('marker-end', 'url(#arrowhead)')\n .attr('stroke-dasharray', '5,5');\n }\n\n masterX = masterX + 200;\n if (isWithoutSections && !conf.timeline?.disableMulticolor) {\n sectionColor++;\n }\n }\n\n // reset Y coordinate for next section\n masterY = masterY - 10;\n};\n\nexport const drawEvents = function (\n diagram: Selection,\n events: string[],\n sectionColor: number,\n masterX: number,\n masterY: number,\n conf: MermaidConfig\n) {\n let maxEventHeight = 0;\n const eventBeginY = masterY;\n masterY = masterY + 100;\n // Draw the events\n for (const event of events) {\n // create node from event\n const eventNode: Block = {\n descr: event,\n section: sectionColor,\n number: sectionColor,\n width: 150,\n padding: 20,\n maxHeight: 50,\n };\n\n //log task node\n log.debug('eventNode', eventNode);\n // create event wrapper\n const eventWrapper = diagram.append('g').attr('class', 'eventWrapper');\n const node = svgDraw.drawNode(eventWrapper, eventNode, sectionColor, conf);\n const eventHeight = node.height;\n maxEventHeight = maxEventHeight + eventHeight;\n eventWrapper.attr('transform', `translate(${masterX}, ${masterY})`);\n masterY = masterY + 10 + eventHeight;\n }\n // set masterY back to eventBeginY\n masterY = eventBeginY;\n return maxEventHeight;\n};\n\nexport default {\n setConf: () => {\n // no-op\n },\n draw,\n};\n", "import { arc as d3arc, select } from 'd3';\nconst MAX_SECTIONS = 12;\n\nexport const drawRect = function (elem, rectData) {\n const rectElem = elem.append('rect');\n rectElem.attr('x', rectData.x);\n rectElem.attr('y', rectData.y);\n rectElem.attr('fill', rectData.fill);\n rectElem.attr('stroke', rectData.stroke);\n rectElem.attr('width', rectData.width);\n rectElem.attr('height', rectData.height);\n rectElem.attr('rx', rectData.rx);\n rectElem.attr('ry', rectData.ry);\n\n if (rectData.class !== undefined) {\n rectElem.attr('class', rectData.class);\n }\n\n return rectElem;\n};\n\nexport const drawFace = function (element, faceData) {\n const radius = 15;\n const circleElement = element\n .append('circle')\n .attr('cx', faceData.cx)\n .attr('cy', faceData.cy)\n .attr('class', 'face')\n .attr('r', radius)\n .attr('stroke-width', 2)\n .attr('overflow', 'visible');\n\n const face = element.append('g');\n\n //left eye\n face\n .append('circle')\n .attr('cx', faceData.cx - radius / 3)\n .attr('cy', faceData.cy - radius / 3)\n .attr('r', 1.5)\n .attr('stroke-width', 2)\n .attr('fill', '#666')\n .attr('stroke', '#666');\n\n //right eye\n face\n .append('circle')\n .attr('cx', faceData.cx + radius / 3)\n .attr('cy', faceData.cy - radius / 3)\n .attr('r', 1.5)\n .attr('stroke-width', 2)\n .attr('fill', '#666')\n .attr('stroke', '#666');\n\n /** @param {any} face */\n function smile(face) {\n const arc = d3arc()\n .startAngle(Math.PI / 2)\n .endAngle(3 * (Math.PI / 2))\n .innerRadius(radius / 2)\n .outerRadius(radius / 2.2);\n //mouth\n face\n .append('path')\n .attr('class', 'mouth')\n .attr('d', arc)\n .attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 2) + ')');\n }\n\n /** @param {any} face */\n function sad(face) {\n const arc = d3arc()\n .startAngle((3 * Math.PI) / 2)\n .endAngle(5 * (Math.PI / 2))\n .innerRadius(radius / 2)\n .outerRadius(radius / 2.2);\n //mouth\n face\n .append('path')\n .attr('class', 'mouth')\n .attr('d', arc)\n .attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 7) + ')');\n }\n\n /** @param {any} face */\n function ambivalent(face) {\n face\n .append('line')\n .attr('class', 'mouth')\n .attr('stroke', 2)\n .attr('x1', faceData.cx - 5)\n .attr('y1', faceData.cy + 7)\n .attr('x2', faceData.cx + 5)\n .attr('y2', faceData.cy + 7)\n .attr('class', 'mouth')\n .attr('stroke-width', '1px')\n .attr('stroke', '#666');\n }\n\n if (faceData.score > 3) {\n smile(face);\n } else if (faceData.score < 3) {\n sad(face);\n } else {\n ambivalent(face);\n }\n\n return circleElement;\n};\n\nexport const drawCircle = function (element, circleData) {\n const circleElement = element.append('circle');\n circleElement.attr('cx', circleData.cx);\n circleElement.attr('cy', circleData.cy);\n circleElement.attr('class', 'actor-' + circleData.pos);\n circleElement.attr('fill', circleData.fill);\n circleElement.attr('stroke', circleData.stroke);\n circleElement.attr('r', circleData.r);\n\n if (circleElement.class !== undefined) {\n circleElement.attr('class', circleElement.class);\n }\n\n if (circleData.title !== undefined) {\n circleElement.append('title').text(circleData.title);\n }\n\n return circleElement;\n};\n\nexport const drawText = function (elem, textData) {\n // Remove and ignore br:s\n const nText = textData.text.replace(//gi, ' ');\n\n const textElem = elem.append('text');\n textElem.attr('x', textData.x);\n textElem.attr('y', textData.y);\n textElem.attr('class', 'legend');\n\n textElem.style('text-anchor', textData.anchor);\n\n if (textData.class !== undefined) {\n textElem.attr('class', textData.class);\n }\n\n const span = textElem.append('tspan');\n span.attr('x', textData.x + textData.textMargin * 2);\n span.text(nText);\n\n return textElem;\n};\n\nexport const drawLabel = function (elem, txtObject) {\n /**\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} cut\n */\n function genPoints(x, y, width, height, cut) {\n return (\n x +\n ',' +\n y +\n ' ' +\n (x + width) +\n ',' +\n y +\n ' ' +\n (x + width) +\n ',' +\n (y + height - cut) +\n ' ' +\n (x + width - cut * 1.2) +\n ',' +\n (y + height) +\n ' ' +\n x +\n ',' +\n (y + height)\n );\n }\n const polygon = elem.append('polygon');\n polygon.attr('points', genPoints(txtObject.x, txtObject.y, 50, 20, 7));\n polygon.attr('class', 'labelBox');\n\n txtObject.y = txtObject.y + txtObject.labelMargin;\n txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin;\n drawText(elem, txtObject);\n};\n\nexport const drawSection = function (elem, section, conf) {\n const g = elem.append('g');\n\n const rect = getNoteRect();\n rect.x = section.x;\n rect.y = section.y;\n rect.fill = section.fill;\n rect.width = conf.width;\n rect.height = conf.height;\n rect.class = 'journey-section section-type-' + section.num;\n rect.rx = 3;\n rect.ry = 3;\n drawRect(g, rect);\n\n _drawTextCandidateFunc(conf)(\n section.text,\n g,\n rect.x,\n rect.y,\n rect.width,\n rect.height,\n { class: 'journey-section section-type-' + section.num },\n conf,\n section.colour\n );\n};\n\nlet taskCount = -1;\n/**\n * Draws an actor in the diagram with the attached line\n *\n * @param {any} elem The HTML element\n * @param {any} task The task to render\n * @param {any} conf The global configuration\n */\nexport const drawTask = function (elem, task, conf) {\n const center = task.x + conf.width / 2;\n const g = elem.append('g');\n taskCount++;\n const maxHeight = 300 + 5 * 30;\n g.append('line')\n .attr('id', 'task' + taskCount)\n .attr('x1', center)\n .attr('y1', task.y)\n .attr('x2', center)\n .attr('y2', maxHeight)\n .attr('class', 'task-line')\n .attr('stroke-width', '1px')\n .attr('stroke-dasharray', '4 2')\n .attr('stroke', '#666');\n\n drawFace(g, {\n cx: center,\n cy: 300 + (5 - task.score) * 30,\n score: task.score,\n });\n\n const rect = getNoteRect();\n rect.x = task.x;\n rect.y = task.y;\n rect.fill = task.fill;\n rect.width = conf.width;\n rect.height = conf.height;\n rect.class = 'task task-type-' + task.num;\n rect.rx = 3;\n rect.ry = 3;\n drawRect(g, rect);\n\n _drawTextCandidateFunc(conf)(\n task.task,\n g,\n rect.x,\n rect.y,\n rect.width,\n rect.height,\n { class: 'task' },\n conf,\n task.colour\n );\n};\n\n/**\n * Draws a background rectangle\n *\n * @param {any} elem The html element\n * @param {any} bounds The bounds of the drawing\n */\nexport const drawBackgroundRect = function (elem, bounds) {\n const rectElem = drawRect(elem, {\n x: bounds.startx,\n y: bounds.starty,\n width: bounds.stopx - bounds.startx,\n height: bounds.stopy - bounds.starty,\n fill: bounds.fill,\n class: 'rect',\n });\n rectElem.lower();\n};\n\nexport const getTextObj = function () {\n return {\n x: 0,\n y: 0,\n fill: undefined,\n 'text-anchor': 'start',\n width: 100,\n height: 100,\n textMargin: 0,\n rx: 0,\n ry: 0,\n };\n};\n\nexport const getNoteRect = function () {\n return {\n x: 0,\n y: 0,\n width: 100,\n anchor: 'start',\n height: 100,\n rx: 0,\n ry: 0,\n };\n};\n\nconst _drawTextCandidateFunc = (function () {\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} colour\n */\n function byText(content, g, x, y, width, height, textAttrs, colour) {\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y + height / 2 + 5)\n .style('font-color', colour)\n .style('text-anchor', 'middle')\n .text(content);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n * @param {any} colour\n */\n function byTspan(content, g, x, y, width, height, textAttrs, conf, colour) {\n const { taskFontSize, taskFontFamily } = conf;\n\n const lines = content.split(//gi);\n for (let i = 0; i < lines.length; i++) {\n const dy = i * taskFontSize - (taskFontSize * (lines.length - 1)) / 2;\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y)\n .attr('fill', colour)\n .style('text-anchor', 'middle')\n .style('font-size', taskFontSize)\n .style('font-family', taskFontFamily);\n text\n .append('tspan')\n .attr('x', x + width / 2)\n .attr('dy', dy)\n .text(lines[i]);\n\n text\n .attr('y', y + height / 2.0)\n .attr('dominant-baseline', 'central')\n .attr('alignment-baseline', 'central');\n\n _setTextAttrs(text, textAttrs);\n }\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n */\n function byFo(content, g, x, y, width, height, textAttrs, conf) {\n const body = g.append('switch');\n const f = body\n .append('foreignObject')\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height)\n .attr('position', 'fixed');\n\n const text = f\n .append('xhtml:div')\n .style('display', 'table')\n .style('height', '100%')\n .style('width', '100%');\n\n text\n .append('div')\n .attr('class', 'label')\n .style('display', 'table-cell')\n .style('text-align', 'center')\n .style('vertical-align', 'middle')\n .text(content);\n\n byTspan(content, body, x, y, width, height, textAttrs, conf);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} toText\n * @param {any} fromTextAttrsDict\n */\n function _setTextAttrs(toText, fromTextAttrsDict) {\n for (const key in fromTextAttrsDict) {\n if (key in fromTextAttrsDict) {\n // noinspection JSUnfilteredForInLoop\n toText.attr(key, fromTextAttrsDict[key]);\n }\n }\n }\n\n return function (conf) {\n return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;\n };\n})();\n\nconst initGraphics = function (graphics) {\n graphics\n .append('defs')\n .append('marker')\n .attr('id', 'arrowhead')\n .attr('refX', 5)\n .attr('refY', 2)\n .attr('markerWidth', 6)\n .attr('markerHeight', 4)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0,0 V 4 L6,2 Z'); // this is actual shape for arrowhead\n};\n\n/**\n * @param {string} text The text to be wrapped\n * @param {number} width The max width of the text\n */\nfunction wrap(text, width) {\n text.each(function () {\n var text = select(this),\n words = text\n .text()\n .split(/(\\s+|
)/)\n .reverse(),\n word,\n line = [],\n lineHeight = 1.1, // ems\n y = text.attr('y'),\n dy = parseFloat(text.attr('dy')),\n tspan = text\n .text(null)\n .append('tspan')\n .attr('x', 0)\n .attr('y', y)\n .attr('dy', dy + 'em');\n for (let j = 0; j < words.length; j++) {\n word = words[words.length - 1 - j];\n line.push(word);\n tspan.text(line.join(' ').trim());\n if (tspan.node().getComputedTextLength() > width || word === '
') {\n line.pop();\n tspan.text(line.join(' ').trim());\n if (word === '
') {\n line = [''];\n } else {\n line = [word];\n }\n\n tspan = text\n .append('tspan')\n .attr('x', 0)\n .attr('y', y)\n .attr('dy', lineHeight + 'em')\n .text(word);\n }\n }\n });\n}\n\nexport const drawNode = function (elem, node, fullSection, conf) {\n const section = (fullSection % MAX_SECTIONS) - 1;\n const nodeElem = elem.append('g');\n node.section = section;\n nodeElem.attr(\n 'class',\n (node.class ? node.class + ' ' : '') + 'timeline-node ' + ('section-' + section)\n );\n const bkgElem = nodeElem.append('g');\n\n // Create the wrapped text element\n const textElem = nodeElem.append('g');\n\n const txt = textElem\n .append('text')\n .text(node.descr)\n .attr('dy', '1em')\n .attr('alignment-baseline', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'middle')\n .call(wrap, node.width);\n const bbox = txt.node().getBBox();\n const fontSize = conf.fontSize?.replace ? conf.fontSize.replace('px', '') : conf.fontSize;\n node.height = bbox.height + fontSize * 1.1 * 0.5 + node.padding;\n node.height = Math.max(node.height, node.maxHeight);\n node.width = node.width + 2 * node.padding;\n\n textElem.attr('transform', 'translate(' + node.width / 2 + ', ' + node.padding / 2 + ')');\n\n // Create the background element\n defaultBkg(bkgElem, node, section, conf);\n\n return node;\n};\n\nexport const getVirtualNodeHeight = function (elem, node, conf) {\n const textElem = elem.append('g');\n const txt = textElem\n .append('text')\n .text(node.descr)\n .attr('dy', '1em')\n .attr('alignment-baseline', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'middle')\n .call(wrap, node.width);\n const bbox = txt.node().getBBox();\n const fontSize = conf.fontSize?.replace ? conf.fontSize.replace('px', '') : conf.fontSize;\n textElem.remove();\n return bbox.height + fontSize * 1.1 * 0.5 + node.padding;\n};\n\nconst defaultBkg = function (elem, node, section) {\n const rd = 5;\n elem\n .append('path')\n .attr('id', 'node-' + node.id)\n .attr('class', 'node-bkg node-' + node.type)\n .attr(\n 'd',\n `M0 ${node.height - rd} v${-node.height + 2 * rd} q0,-5 5,-5 h${\n node.width - 2 * rd\n } q5,0 5,5 v${node.height - rd} H0 Z`\n );\n\n elem\n .append('line')\n .attr('class', 'node-line-' + section)\n .attr('x1', 0)\n .attr('y1', node.height)\n .attr('x2', node.width)\n .attr('y2', node.height);\n};\n\nexport default {\n drawRect,\n drawCircle,\n drawSection,\n drawText,\n drawLabel,\n drawTask,\n drawBackgroundRect,\n getTextObj,\n getNoteRect,\n initGraphics,\n drawNode,\n getVirtualNodeHeight,\n};\n", "import { darken, lighten, isDark } from 'khroma';\n\nconst genSections = (options) => {\n let sections = '';\n\n for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) {\n options['lineColor' + i] = options['lineColor' + i] || options['cScaleInv' + i];\n if (isDark(options['lineColor' + i])) {\n options['lineColor' + i] = lighten(options['lineColor' + i], 20);\n } else {\n options['lineColor' + i] = darken(options['lineColor' + i], 20);\n }\n }\n\n for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) {\n const sw = '' + (17 - 3 * i);\n sections += `\n .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${\n i - 1\n } path {\n fill: ${options['cScale' + i]};\n }\n .section-${i - 1} text {\n fill: ${options['cScaleLabel' + i]};\n }\n .node-icon-${i - 1} {\n font-size: 40px;\n color: ${options['cScaleLabel' + i]};\n }\n .section-edge-${i - 1}{\n stroke: ${options['cScale' + i]};\n }\n .edge-depth-${i - 1}{\n stroke-width: ${sw};\n }\n .section-${i - 1} line {\n stroke: ${options['cScaleInv' + i]} ;\n stroke-width: 3;\n }\n\n .lineWrapper line{\n stroke: ${options['cScaleLabel' + i]} ;\n }\n\n .disabled, .disabled circle, .disabled text {\n fill: lightgray;\n }\n .disabled text {\n fill: #efefef;\n }\n `;\n }\n return sections;\n};\n\nconst getStyles = (options) =>\n `\n .edge {\n stroke-width: 3;\n }\n ${genSections(options)}\n .section-root rect, .section-root path, .section-root circle {\n fill: ${options.git0};\n }\n .section-root text {\n fill: ${options.gitBranchLabel0};\n }\n .icon-container {\n height:100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n .edge {\n fill: none;\n }\n .eventWrapper {\n filter: brightness(120%);\n }\n`;\nexport default getStyles;\n", "// @ts-ignore: JISON doesn't support types\nimport parser from './parser/timeline.jison';\nimport * as db from './timelineDb.js';\nimport renderer from './timelineRenderer.js';\nimport styles from './styles.js';\n\nexport const diagram = {\n db,\n renderer,\n parser,\n styles,\n};\n"], + "mappings": "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", + "names": ["o", "parser", "lexer", "clear", "clear", "select", "face", "text", "select", "tasks", "sections", "diagram", "sections"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/xychartDiagram-PRI3JC2R.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.core/xychartDiagram-PRI3JC2R.mjs new file mode 100644 index 0000000..37381b0 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/xychartDiagram-PRI3JC2R.mjs @@ -0,0 +1,1964 @@ +import { + selectSvgElement +} from "./chunk-EXTU4WIE.mjs"; +import { + computeDimensionOfText +} from "./chunk-JA3XYJ7Z.mjs"; +import { + cleanAndMerge +} from "./chunk-S3R3BYOJ.mjs"; +import { + clear, + configureSvgSize, + defaultConfig_default, + getAccDescription, + getAccTitle, + getConfig, + getDiagramTitle, + getThemeVariables, + sanitizeText, + setAccDescription, + setAccTitle, + setDiagramTitle +} from "./chunk-ABZYJK2D.mjs"; +import { + __name, + log +} from "./chunk-AGHRB4JF.mjs"; + +// src/diagrams/xychart/parser/xychart.jison +var parser = (function() { + var o = /* @__PURE__ */ __name(function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ; + return o2; + }, "o"), $V0 = [1, 10, 12, 14, 16, 18, 19, 21, 23], $V1 = [2, 6], $V2 = [1, 3], $V3 = [1, 5], $V4 = [1, 6], $V5 = [1, 7], $V6 = [1, 5, 10, 12, 14, 16, 18, 19, 21, 23, 34, 35, 36], $V7 = [1, 25], $V8 = [1, 26], $V9 = [1, 28], $Va = [1, 29], $Vb = [1, 30], $Vc = [1, 31], $Vd = [1, 32], $Ve = [1, 33], $Vf = [1, 34], $Vg = [1, 35], $Vh = [1, 36], $Vi = [1, 37], $Vj = [1, 43], $Vk = [1, 42], $Vl = [1, 47], $Vm = [1, 50], $Vn = [1, 10, 12, 14, 16, 18, 19, 21, 23, 34, 35, 36], $Vo = [1, 10, 12, 14, 16, 18, 19, 21, 23, 24, 26, 27, 28, 34, 35, 36], $Vp = [1, 10, 12, 14, 16, 18, 19, 21, 23, 24, 26, 27, 28, 34, 35, 36, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50], $Vq = [1, 64]; + var parser2 = { + trace: /* @__PURE__ */ __name(function trace() { + }, "trace"), + yy: {}, + symbols_: { "error": 2, "start": 3, "eol": 4, "XYCHART": 5, "chartConfig": 6, "document": 7, "CHART_ORIENTATION": 8, "statement": 9, "title": 10, "text": 11, "X_AXIS": 12, "parseXAxis": 13, "Y_AXIS": 14, "parseYAxis": 15, "LINE": 16, "plotData": 17, "BAR": 18, "acc_title": 19, "acc_title_value": 20, "acc_descr": 21, "acc_descr_value": 22, "acc_descr_multiline_value": 23, "SQUARE_BRACES_START": 24, "commaSeparatedNumbers": 25, "SQUARE_BRACES_END": 26, "NUMBER_WITH_DECIMAL": 27, "COMMA": 28, "xAxisData": 29, "bandData": 30, "ARROW_DELIMITER": 31, "commaSeparatedTexts": 32, "yAxisData": 33, "NEWLINE": 34, "SEMI": 35, "EOF": 36, "alphaNum": 37, "STR": 38, "MD_STR": 39, "alphaNumToken": 40, "AMP": 41, "NUM": 42, "ALPHA": 43, "PLUS": 44, "EQUALS": 45, "MULT": 46, "DOT": 47, "BRKT": 48, "MINUS": 49, "UNDERSCORE": 50, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 5: "XYCHART", 8: "CHART_ORIENTATION", 10: "title", 12: "X_AXIS", 14: "Y_AXIS", 16: "LINE", 18: "BAR", 19: "acc_title", 20: "acc_title_value", 21: "acc_descr", 22: "acc_descr_value", 23: "acc_descr_multiline_value", 24: "SQUARE_BRACES_START", 26: "SQUARE_BRACES_END", 27: "NUMBER_WITH_DECIMAL", 28: "COMMA", 31: "ARROW_DELIMITER", 34: "NEWLINE", 35: "SEMI", 36: "EOF", 38: "STR", 39: "MD_STR", 41: "AMP", 42: "NUM", 43: "ALPHA", 44: "PLUS", 45: "EQUALS", 46: "MULT", 47: "DOT", 48: "BRKT", 49: "MINUS", 50: "UNDERSCORE" }, + productions_: [0, [3, 2], [3, 3], [3, 2], [3, 1], [6, 1], [7, 0], [7, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 3], [9, 2], [9, 3], [9, 2], [9, 2], [9, 1], [17, 3], [25, 3], [25, 1], [13, 1], [13, 2], [13, 1], [29, 1], [29, 3], [30, 3], [32, 3], [32, 1], [15, 1], [15, 2], [15, 1], [33, 3], [4, 1], [4, 1], [4, 1], [11, 1], [11, 1], [11, 1], [37, 1], [37, 2], [40, 1], [40, 1], [40, 1], [40, 1], [40, 1], [40, 1], [40, 1], [40, 1], [40, 1], [40, 1]], + performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 5: + yy.setOrientation($$[$0]); + break; + case 9: + yy.setDiagramTitle($$[$0].text.trim()); + break; + case 12: + yy.setLineData({ text: "", type: "text" }, $$[$0]); + break; + case 13: + yy.setLineData($$[$0 - 1], $$[$0]); + break; + case 14: + yy.setBarData({ text: "", type: "text" }, $$[$0]); + break; + case 15: + yy.setBarData($$[$0 - 1], $$[$0]); + break; + case 16: + this.$ = $$[$0].trim(); + yy.setAccTitle(this.$); + break; + case 17: + case 18: + this.$ = $$[$0].trim(); + yy.setAccDescription(this.$); + break; + case 19: + this.$ = $$[$0 - 1]; + break; + case 20: + this.$ = [Number($$[$0 - 2]), ...$$[$0]]; + break; + case 21: + this.$ = [Number($$[$0])]; + break; + case 22: + yy.setXAxisTitle($$[$0]); + break; + case 23: + yy.setXAxisTitle($$[$0 - 1]); + break; + case 24: + yy.setXAxisTitle({ type: "text", text: "" }); + break; + case 25: + yy.setXAxisBand($$[$0]); + break; + case 26: + yy.setXAxisRangeData(Number($$[$0 - 2]), Number($$[$0])); + break; + case 27: + this.$ = $$[$0 - 1]; + break; + case 28: + this.$ = [$$[$0 - 2], ...$$[$0]]; + break; + case 29: + this.$ = [$$[$0]]; + break; + case 30: + yy.setYAxisTitle($$[$0]); + break; + case 31: + yy.setYAxisTitle($$[$0 - 1]); + break; + case 32: + yy.setYAxisTitle({ type: "text", text: "" }); + break; + case 33: + yy.setYAxisRangeData(Number($$[$0 - 2]), Number($$[$0])); + break; + case 37: + this.$ = { text: $$[$0], type: "text" }; + break; + case 38: + this.$ = { text: $$[$0], type: "text" }; + break; + case 39: + this.$ = { text: $$[$0], type: "markdown" }; + break; + case 40: + this.$ = $$[$0]; + break; + case 41: + this.$ = $$[$0 - 1] + "" + $$[$0]; + break; + } + }, "anonymous"), + table: [o($V0, $V1, { 3: 1, 4: 2, 7: 4, 5: $V2, 34: $V3, 35: $V4, 36: $V5 }), { 1: [3] }, o($V0, $V1, { 4: 2, 7: 4, 3: 8, 5: $V2, 34: $V3, 35: $V4, 36: $V5 }), o($V0, $V1, { 4: 2, 7: 4, 6: 9, 3: 10, 5: $V2, 8: [1, 11], 34: $V3, 35: $V4, 36: $V5 }), { 1: [2, 4], 9: 12, 10: [1, 13], 12: [1, 14], 14: [1, 15], 16: [1, 16], 18: [1, 17], 19: [1, 18], 21: [1, 19], 23: [1, 20] }, o($V6, [2, 34]), o($V6, [2, 35]), o($V6, [2, 36]), { 1: [2, 1] }, o($V0, $V1, { 4: 2, 7: 4, 3: 21, 5: $V2, 34: $V3, 35: $V4, 36: $V5 }), { 1: [2, 3] }, o($V6, [2, 5]), o($V0, [2, 7], { 4: 22, 34: $V3, 35: $V4, 36: $V5 }), { 11: 23, 37: 24, 38: $V7, 39: $V8, 40: 27, 41: $V9, 42: $Va, 43: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi }, { 11: 39, 13: 38, 24: $Vj, 27: $Vk, 29: 40, 30: 41, 37: 24, 38: $V7, 39: $V8, 40: 27, 41: $V9, 42: $Va, 43: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi }, { 11: 45, 15: 44, 27: $Vl, 33: 46, 37: 24, 38: $V7, 39: $V8, 40: 27, 41: $V9, 42: $Va, 43: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi }, { 11: 49, 17: 48, 24: $Vm, 37: 24, 38: $V7, 39: $V8, 40: 27, 41: $V9, 42: $Va, 43: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi }, { 11: 52, 17: 51, 24: $Vm, 37: 24, 38: $V7, 39: $V8, 40: 27, 41: $V9, 42: $Va, 43: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi }, { 20: [1, 53] }, { 22: [1, 54] }, o($Vn, [2, 18]), { 1: [2, 2] }, o($Vn, [2, 8]), o($Vn, [2, 9]), o($Vo, [2, 37], { 40: 55, 41: $V9, 42: $Va, 43: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi }), o($Vo, [2, 38]), o($Vo, [2, 39]), o($Vp, [2, 40]), o($Vp, [2, 42]), o($Vp, [2, 43]), o($Vp, [2, 44]), o($Vp, [2, 45]), o($Vp, [2, 46]), o($Vp, [2, 47]), o($Vp, [2, 48]), o($Vp, [2, 49]), o($Vp, [2, 50]), o($Vp, [2, 51]), o($Vn, [2, 10]), o($Vn, [2, 22], { 30: 41, 29: 56, 24: $Vj, 27: $Vk }), o($Vn, [2, 24]), o($Vn, [2, 25]), { 31: [1, 57] }, { 11: 59, 32: 58, 37: 24, 38: $V7, 39: $V8, 40: 27, 41: $V9, 42: $Va, 43: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi }, o($Vn, [2, 11]), o($Vn, [2, 30], { 33: 60, 27: $Vl }), o($Vn, [2, 32]), { 31: [1, 61] }, o($Vn, [2, 12]), { 17: 62, 24: $Vm }, { 25: 63, 27: $Vq }, o($Vn, [2, 14]), { 17: 65, 24: $Vm }, o($Vn, [2, 16]), o($Vn, [2, 17]), o($Vp, [2, 41]), o($Vn, [2, 23]), { 27: [1, 66] }, { 26: [1, 67] }, { 26: [2, 29], 28: [1, 68] }, o($Vn, [2, 31]), { 27: [1, 69] }, o($Vn, [2, 13]), { 26: [1, 70] }, { 26: [2, 21], 28: [1, 71] }, o($Vn, [2, 15]), o($Vn, [2, 26]), o($Vn, [2, 27]), { 11: 59, 32: 72, 37: 24, 38: $V7, 39: $V8, 40: 27, 41: $V9, 42: $Va, 43: $Vb, 44: $Vc, 45: $Vd, 46: $Ve, 47: $Vf, 48: $Vg, 49: $Vh, 50: $Vi }, o($Vn, [2, 33]), o($Vn, [2, 19]), { 25: 73, 27: $Vq }, { 26: [2, 28] }, { 26: [2, 20] }], + defaultActions: { 8: [2, 1], 10: [2, 3], 21: [2, 2], 72: [2, 28], 73: [2, 20] }, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, "parseError"), + parse: /* @__PURE__ */ __name(function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + __name(popStack, "popStack"); + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + __name(lex, "lex"); + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + }, "parse") + }; + var lexer = /* @__PURE__ */ (function() { + var lexer2 = { + EOF: 1, + parseError: /* @__PURE__ */ __name(function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, "parseError"), + // resets the lexer, sets new input + setInput: /* @__PURE__ */ __name(function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, "setInput"), + // consumes and returns one char from the input + input: /* @__PURE__ */ __name(function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, "input"), + // unshifts one char (or a string) into the input + unput: /* @__PURE__ */ __name(function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, "unput"), + // When called from action, caches matched text and appends it on next action + more: /* @__PURE__ */ __name(function() { + this._more = true; + return this; + }, "more"), + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: /* @__PURE__ */ __name(function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, "reject"), + // retain first n characters of the match + less: /* @__PURE__ */ __name(function(n) { + this.unput(this.match.slice(n)); + }, "less"), + // displays already matched input, i.e. for error messages + pastInput: /* @__PURE__ */ __name(function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, "pastInput"), + // displays upcoming input, i.e. for error messages + upcomingInput: /* @__PURE__ */ __name(function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, "upcomingInput"), + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: /* @__PURE__ */ __name(function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, "showPosition"), + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: /* @__PURE__ */ __name(function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, "test_match"), + // return next match in input + next: /* @__PURE__ */ __name(function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, "next"), + // return next match that has a token + lex: /* @__PURE__ */ __name(function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, "lex"), + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: /* @__PURE__ */ __name(function begin(condition) { + this.conditionStack.push(condition); + }, "begin"), + // pop the previously active lexer condition state off the condition stack + popState: /* @__PURE__ */ __name(function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, "popState"), + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: /* @__PURE__ */ __name(function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, "_currentRules"), + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: /* @__PURE__ */ __name(function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, "topState"), + // alias for begin(condition) + pushState: /* @__PURE__ */ __name(function pushState(condition) { + this.begin(condition); + }, "pushState"), + // return the number of states currently on the stack + stateStackSize: /* @__PURE__ */ __name(function stateStackSize() { + return this.conditionStack.length; + }, "stateStackSize"), + options: { "case-insensitive": true }, + performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + break; + case 1: + break; + case 2: + this.popState(); + return 34; + break; + case 3: + this.popState(); + return 34; + break; + case 4: + return 34; + break; + case 5: + break; + case 6: + return 10; + break; + case 7: + this.pushState("acc_title"); + return 19; + break; + case 8: + this.popState(); + return "acc_title_value"; + break; + case 9: + this.pushState("acc_descr"); + return 21; + break; + case 10: + this.popState(); + return "acc_descr_value"; + break; + case 11: + this.pushState("acc_descr_multiline"); + break; + case 12: + this.popState(); + break; + case 13: + return "acc_descr_multiline_value"; + break; + case 14: + return 5; + break; + case 15: + return 5; + break; + case 16: + return 8; + break; + case 17: + this.pushState("axis_data"); + return "X_AXIS"; + break; + case 18: + this.pushState("axis_data"); + return "Y_AXIS"; + break; + case 19: + this.pushState("axis_band_data"); + return 24; + break; + case 20: + return 31; + break; + case 21: + this.pushState("data"); + return 16; + break; + case 22: + this.pushState("data"); + return 18; + break; + case 23: + this.pushState("data_inner"); + return 24; + break; + case 24: + return 27; + break; + case 25: + this.popState(); + return 26; + break; + case 26: + this.popState(); + break; + case 27: + this.pushState("string"); + break; + case 28: + this.popState(); + break; + case 29: + return "STR"; + break; + case 30: + return 24; + break; + case 31: + return 26; + break; + case 32: + return 43; + break; + case 33: + return "COLON"; + break; + case 34: + return 44; + break; + case 35: + return 28; + break; + case 36: + return 45; + break; + case 37: + return 46; + break; + case 38: + return 48; + break; + case 39: + return 50; + break; + case 40: + return 47; + break; + case 41: + return 41; + break; + case 42: + return 49; + break; + case 43: + return 42; + break; + case 44: + break; + case 45: + return 35; + break; + case 46: + return 36; + break; + } + }, "anonymous"), + rules: [/^(?:%%(?!\{)[^\n]*)/i, /^(?:[^\}]%%[^\n]*)/i, /^(?:(\r?\n))/i, /^(?:(\r?\n))/i, /^(?:[\n\r]+)/i, /^(?:%%[^\n]*)/i, /^(?:title\b)/i, /^(?:accTitle\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*\{\s*)/i, /^(?:\{)/i, /^(?:[^\}]*)/i, /^(?:xychart-beta\b)/i, /^(?:xychart\b)/i, /^(?:(?:vertical|horizontal))/i, /^(?:x-axis\b)/i, /^(?:y-axis\b)/i, /^(?:\[)/i, /^(?:-->)/i, /^(?:line\b)/i, /^(?:bar\b)/i, /^(?:\[)/i, /^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i, /^(?:\])/i, /^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i, /^(?:["])/i, /^(?:["])/i, /^(?:[^"]*)/i, /^(?:\[)/i, /^(?:\])/i, /^(?:[A-Za-z]+)/i, /^(?::)/i, /^(?:\+)/i, /^(?:,)/i, /^(?:=)/i, /^(?:\*)/i, /^(?:#)/i, /^(?:[\_])/i, /^(?:\.)/i, /^(?:&)/i, /^(?:-)/i, /^(?:[0-9]+)/i, /^(?:\s+)/i, /^(?:;)/i, /^(?:$)/i], + conditions: { "data_inner": { "rules": [0, 1, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 18, 21, 22, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46], "inclusive": true }, "data": { "rules": [0, 1, 3, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 18, 21, 22, 23, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46], "inclusive": true }, "axis_band_data": { "rules": [0, 1, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 18, 21, 22, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46], "inclusive": true }, "axis_data": { "rules": [0, 1, 2, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46], "inclusive": true }, "acc_descr_multiline": { "rules": [12, 13], "inclusive": false }, "acc_descr": { "rules": [10], "inclusive": false }, "acc_title": { "rules": [8], "inclusive": false }, "title": { "rules": [], "inclusive": false }, "md_string": { "rules": [], "inclusive": false }, "string": { "rules": [28, 29], "inclusive": false }, "INITIAL": { "rules": [0, 1, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 18, 21, 22, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46], "inclusive": true } } + }; + return lexer2; + })(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + __name(Parser, "Parser"); + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +})(); +parser.parser = parser; +var xychart_default = parser; + +// src/diagrams/xychart/chartBuilder/interfaces.ts +function isBarPlot(data) { + return data.type === "bar"; +} +__name(isBarPlot, "isBarPlot"); +function isBandAxisData(data) { + return data.type === "band"; +} +__name(isBandAxisData, "isBandAxisData"); +function isLinearAxisData(data) { + return data.type === "linear"; +} +__name(isLinearAxisData, "isLinearAxisData"); + +// src/diagrams/xychart/chartBuilder/textDimensionCalculator.ts +var TextDimensionCalculatorWithFont = class { + constructor(parentGroup) { + this.parentGroup = parentGroup; + } + static { + __name(this, "TextDimensionCalculatorWithFont"); + } + getMaxDimension(texts, fontSize) { + if (!this.parentGroup) { + return { + width: texts.reduce((acc, cur) => Math.max(cur.length, acc), 0) * fontSize, + height: fontSize + }; + } + const dimension = { + width: 0, + height: 0 + }; + const elem = this.parentGroup.append("g").attr("visibility", "hidden").attr("font-size", fontSize); + for (const t of texts) { + const bbox = computeDimensionOfText(elem, 1, t); + const width = bbox ? bbox.width : t.length * fontSize; + const height = bbox ? bbox.height : fontSize; + dimension.width = Math.max(dimension.width, width); + dimension.height = Math.max(dimension.height, height); + } + elem.remove(); + return dimension; + } +}; + +// src/diagrams/xychart/chartBuilder/components/axis/bandAxis.ts +import { scaleBand } from "d3"; + +// src/diagrams/xychart/chartBuilder/components/axis/baseAxis.ts +var BAR_WIDTH_TO_TICK_WIDTH_RATIO = 0.7; +var MAX_OUTER_PADDING_PERCENT_FOR_WRT_LABEL = 0.2; +var BaseAxis = class { + constructor(axisConfig, title, textDimensionCalculator, axisThemeConfig) { + this.axisConfig = axisConfig; + this.title = title; + this.textDimensionCalculator = textDimensionCalculator; + this.axisThemeConfig = axisThemeConfig; + this.boundingRect = { x: 0, y: 0, width: 0, height: 0 }; + this.axisPosition = "left"; + this.showTitle = false; + this.showLabel = false; + this.showTick = false; + this.showAxisLine = false; + this.outerPadding = 0; + this.titleTextHeight = 0; + this.labelTextHeight = 0; + this.range = [0, 10]; + this.boundingRect = { x: 0, y: 0, width: 0, height: 0 }; + this.axisPosition = "left"; + } + static { + __name(this, "BaseAxis"); + } + setRange(range) { + this.range = range; + if (this.axisPosition === "left" || this.axisPosition === "right") { + this.boundingRect.height = range[1] - range[0]; + } else { + this.boundingRect.width = range[1] - range[0]; + } + this.recalculateScale(); + } + getRange() { + return [this.range[0] + this.outerPadding, this.range[1] - this.outerPadding]; + } + setAxisPosition(axisPosition) { + this.axisPosition = axisPosition; + this.setRange(this.range); + } + getTickDistance() { + const range = this.getRange(); + return Math.abs(range[0] - range[1]) / this.getTickValues().length; + } + getAxisOuterPadding() { + return this.outerPadding; + } + getLabelDimension() { + return this.textDimensionCalculator.getMaxDimension( + this.getTickValues().map((tick) => tick.toString()), + this.axisConfig.labelFontSize + ); + } + recalculateOuterPaddingToDrawBar() { + if (BAR_WIDTH_TO_TICK_WIDTH_RATIO * this.getTickDistance() > this.outerPadding * 2) { + this.outerPadding = Math.floor(BAR_WIDTH_TO_TICK_WIDTH_RATIO * this.getTickDistance() / 2); + } + this.recalculateScale(); + } + calculateSpaceIfDrawnHorizontally(availableSpace) { + let availableHeight = availableSpace.height; + if (this.axisConfig.showAxisLine && availableHeight > this.axisConfig.axisLineWidth) { + availableHeight -= this.axisConfig.axisLineWidth; + this.showAxisLine = true; + } + if (this.axisConfig.showLabel) { + const spaceRequired = this.getLabelDimension(); + const maxPadding = MAX_OUTER_PADDING_PERCENT_FOR_WRT_LABEL * availableSpace.width; + this.outerPadding = Math.min(spaceRequired.width / 2, maxPadding); + const heightRequired = spaceRequired.height + this.axisConfig.labelPadding * 2; + this.labelTextHeight = spaceRequired.height; + if (heightRequired <= availableHeight) { + availableHeight -= heightRequired; + this.showLabel = true; + } + } + if (this.axisConfig.showTick && availableHeight >= this.axisConfig.tickLength) { + this.showTick = true; + availableHeight -= this.axisConfig.tickLength; + } + if (this.axisConfig.showTitle && this.title) { + const spaceRequired = this.textDimensionCalculator.getMaxDimension( + [this.title], + this.axisConfig.titleFontSize + ); + const heightRequired = spaceRequired.height + this.axisConfig.titlePadding * 2; + this.titleTextHeight = spaceRequired.height; + if (heightRequired <= availableHeight) { + availableHeight -= heightRequired; + this.showTitle = true; + } + } + this.boundingRect.width = availableSpace.width; + this.boundingRect.height = availableSpace.height - availableHeight; + } + calculateSpaceIfDrawnVertical(availableSpace) { + let availableWidth = availableSpace.width; + if (this.axisConfig.showAxisLine && availableWidth > this.axisConfig.axisLineWidth) { + availableWidth -= this.axisConfig.axisLineWidth; + this.showAxisLine = true; + } + if (this.axisConfig.showLabel) { + const spaceRequired = this.getLabelDimension(); + const maxPadding = MAX_OUTER_PADDING_PERCENT_FOR_WRT_LABEL * availableSpace.height; + this.outerPadding = Math.min(spaceRequired.height / 2, maxPadding); + const widthRequired = spaceRequired.width + this.axisConfig.labelPadding * 2; + if (widthRequired <= availableWidth) { + availableWidth -= widthRequired; + this.showLabel = true; + } + } + if (this.axisConfig.showTick && availableWidth >= this.axisConfig.tickLength) { + this.showTick = true; + availableWidth -= this.axisConfig.tickLength; + } + if (this.axisConfig.showTitle && this.title) { + const spaceRequired = this.textDimensionCalculator.getMaxDimension( + [this.title], + this.axisConfig.titleFontSize + ); + const widthRequired = spaceRequired.height + this.axisConfig.titlePadding * 2; + this.titleTextHeight = spaceRequired.height; + if (widthRequired <= availableWidth) { + availableWidth -= widthRequired; + this.showTitle = true; + } + } + this.boundingRect.width = availableSpace.width - availableWidth; + this.boundingRect.height = availableSpace.height; + } + calculateSpace(availableSpace) { + if (this.axisPosition === "left" || this.axisPosition === "right") { + this.calculateSpaceIfDrawnVertical(availableSpace); + } else { + this.calculateSpaceIfDrawnHorizontally(availableSpace); + } + this.recalculateScale(); + return { + width: this.boundingRect.width, + height: this.boundingRect.height + }; + } + setBoundingBoxXY(point) { + this.boundingRect.x = point.x; + this.boundingRect.y = point.y; + } + getDrawableElementsForLeftAxis() { + const drawableElement = []; + if (this.showAxisLine) { + const x = this.boundingRect.x + this.boundingRect.width - this.axisConfig.axisLineWidth / 2; + drawableElement.push({ + type: "path", + groupTexts: ["left-axis", "axisl-line"], + data: [ + { + path: `M ${x},${this.boundingRect.y} L ${x},${this.boundingRect.y + this.boundingRect.height} `, + strokeFill: this.axisThemeConfig.axisLineColor, + strokeWidth: this.axisConfig.axisLineWidth + } + ] + }); + } + if (this.showLabel) { + drawableElement.push({ + type: "text", + groupTexts: ["left-axis", "label"], + data: this.getTickValues().map((tick) => ({ + text: tick.toString(), + x: this.boundingRect.x + this.boundingRect.width - (this.showLabel ? this.axisConfig.labelPadding : 0) - (this.showTick ? this.axisConfig.tickLength : 0) - (this.showAxisLine ? this.axisConfig.axisLineWidth : 0), + y: this.getScaleValue(tick), + fill: this.axisThemeConfig.labelColor, + fontSize: this.axisConfig.labelFontSize, + rotation: 0, + verticalPos: "middle", + horizontalPos: "right" + })) + }); + } + if (this.showTick) { + const x = this.boundingRect.x + this.boundingRect.width - (this.showAxisLine ? this.axisConfig.axisLineWidth : 0); + drawableElement.push({ + type: "path", + groupTexts: ["left-axis", "ticks"], + data: this.getTickValues().map((tick) => ({ + path: `M ${x},${this.getScaleValue(tick)} L ${x - this.axisConfig.tickLength},${this.getScaleValue(tick)}`, + strokeFill: this.axisThemeConfig.tickColor, + strokeWidth: this.axisConfig.tickWidth + })) + }); + } + if (this.showTitle) { + drawableElement.push({ + type: "text", + groupTexts: ["left-axis", "title"], + data: [ + { + text: this.title, + x: this.boundingRect.x + this.axisConfig.titlePadding, + y: this.boundingRect.y + this.boundingRect.height / 2, + fill: this.axisThemeConfig.titleColor, + fontSize: this.axisConfig.titleFontSize, + rotation: 270, + verticalPos: "top", + horizontalPos: "center" + } + ] + }); + } + return drawableElement; + } + getDrawableElementsForBottomAxis() { + const drawableElement = []; + if (this.showAxisLine) { + const y = this.boundingRect.y + this.axisConfig.axisLineWidth / 2; + drawableElement.push({ + type: "path", + groupTexts: ["bottom-axis", "axis-line"], + data: [ + { + path: `M ${this.boundingRect.x},${y} L ${this.boundingRect.x + this.boundingRect.width},${y}`, + strokeFill: this.axisThemeConfig.axisLineColor, + strokeWidth: this.axisConfig.axisLineWidth + } + ] + }); + } + if (this.showLabel) { + drawableElement.push({ + type: "text", + groupTexts: ["bottom-axis", "label"], + data: this.getTickValues().map((tick) => ({ + text: tick.toString(), + x: this.getScaleValue(tick), + y: this.boundingRect.y + this.axisConfig.labelPadding + (this.showTick ? this.axisConfig.tickLength : 0) + (this.showAxisLine ? this.axisConfig.axisLineWidth : 0), + fill: this.axisThemeConfig.labelColor, + fontSize: this.axisConfig.labelFontSize, + rotation: 0, + verticalPos: "top", + horizontalPos: "center" + })) + }); + } + if (this.showTick) { + const y = this.boundingRect.y + (this.showAxisLine ? this.axisConfig.axisLineWidth : 0); + drawableElement.push({ + type: "path", + groupTexts: ["bottom-axis", "ticks"], + data: this.getTickValues().map((tick) => ({ + path: `M ${this.getScaleValue(tick)},${y} L ${this.getScaleValue(tick)},${y + this.axisConfig.tickLength}`, + strokeFill: this.axisThemeConfig.tickColor, + strokeWidth: this.axisConfig.tickWidth + })) + }); + } + if (this.showTitle) { + drawableElement.push({ + type: "text", + groupTexts: ["bottom-axis", "title"], + data: [ + { + text: this.title, + x: this.range[0] + (this.range[1] - this.range[0]) / 2, + y: this.boundingRect.y + this.boundingRect.height - this.axisConfig.titlePadding - this.titleTextHeight, + fill: this.axisThemeConfig.titleColor, + fontSize: this.axisConfig.titleFontSize, + rotation: 0, + verticalPos: "top", + horizontalPos: "center" + } + ] + }); + } + return drawableElement; + } + getDrawableElementsForTopAxis() { + const drawableElement = []; + if (this.showAxisLine) { + const y = this.boundingRect.y + this.boundingRect.height - this.axisConfig.axisLineWidth / 2; + drawableElement.push({ + type: "path", + groupTexts: ["top-axis", "axis-line"], + data: [ + { + path: `M ${this.boundingRect.x},${y} L ${this.boundingRect.x + this.boundingRect.width},${y}`, + strokeFill: this.axisThemeConfig.axisLineColor, + strokeWidth: this.axisConfig.axisLineWidth + } + ] + }); + } + if (this.showLabel) { + drawableElement.push({ + type: "text", + groupTexts: ["top-axis", "label"], + data: this.getTickValues().map((tick) => ({ + text: tick.toString(), + x: this.getScaleValue(tick), + y: this.boundingRect.y + (this.showTitle ? this.titleTextHeight + this.axisConfig.titlePadding * 2 : 0) + this.axisConfig.labelPadding, + fill: this.axisThemeConfig.labelColor, + fontSize: this.axisConfig.labelFontSize, + rotation: 0, + verticalPos: "top", + horizontalPos: "center" + })) + }); + } + if (this.showTick) { + const y = this.boundingRect.y; + drawableElement.push({ + type: "path", + groupTexts: ["top-axis", "ticks"], + data: this.getTickValues().map((tick) => ({ + path: `M ${this.getScaleValue(tick)},${y + this.boundingRect.height - (this.showAxisLine ? this.axisConfig.axisLineWidth : 0)} L ${this.getScaleValue(tick)},${y + this.boundingRect.height - this.axisConfig.tickLength - (this.showAxisLine ? this.axisConfig.axisLineWidth : 0)}`, + strokeFill: this.axisThemeConfig.tickColor, + strokeWidth: this.axisConfig.tickWidth + })) + }); + } + if (this.showTitle) { + drawableElement.push({ + type: "text", + groupTexts: ["top-axis", "title"], + data: [ + { + text: this.title, + x: this.boundingRect.x + this.boundingRect.width / 2, + y: this.boundingRect.y + this.axisConfig.titlePadding, + fill: this.axisThemeConfig.titleColor, + fontSize: this.axisConfig.titleFontSize, + rotation: 0, + verticalPos: "top", + horizontalPos: "center" + } + ] + }); + } + return drawableElement; + } + getDrawableElements() { + if (this.axisPosition === "left") { + return this.getDrawableElementsForLeftAxis(); + } + if (this.axisPosition === "right") { + throw Error("Drawing of right axis is not implemented"); + } + if (this.axisPosition === "bottom") { + return this.getDrawableElementsForBottomAxis(); + } + if (this.axisPosition === "top") { + return this.getDrawableElementsForTopAxis(); + } + return []; + } +}; + +// src/diagrams/xychart/chartBuilder/components/axis/bandAxis.ts +var BandAxis = class extends BaseAxis { + static { + __name(this, "BandAxis"); + } + constructor(axisConfig, axisThemeConfig, categories, title, textDimensionCalculator) { + super(axisConfig, title, textDimensionCalculator, axisThemeConfig); + this.categories = categories; + this.scale = scaleBand().domain(this.categories).range(this.getRange()); + } + setRange(range) { + super.setRange(range); + } + recalculateScale() { + this.scale = scaleBand().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(0.5); + log.trace("BandAxis axis final categories, range: ", this.categories, this.getRange()); + } + getTickValues() { + return this.categories; + } + getScaleValue(value) { + return this.scale(value) ?? this.getRange()[0]; + } +}; + +// src/diagrams/xychart/chartBuilder/components/axis/linearAxis.ts +import { scaleLinear } from "d3"; +var LinearAxis = class extends BaseAxis { + static { + __name(this, "LinearAxis"); + } + constructor(axisConfig, axisThemeConfig, domain, title, textDimensionCalculator) { + super(axisConfig, title, textDimensionCalculator, axisThemeConfig); + this.domain = domain; + this.scale = scaleLinear().domain(this.domain).range(this.getRange()); + } + getTickValues() { + return this.scale.ticks(); + } + recalculateScale() { + const domain = [...this.domain]; + if (this.axisPosition === "left") { + domain.reverse(); + } + this.scale = scaleLinear().domain(domain).range(this.getRange()); + } + getScaleValue(value) { + return this.scale(value); + } +}; + +// src/diagrams/xychart/chartBuilder/components/axis/index.ts +function getAxis(data, axisConfig, axisThemeConfig, tmpSVGGroup2) { + const textDimensionCalculator = new TextDimensionCalculatorWithFont(tmpSVGGroup2); + if (isBandAxisData(data)) { + return new BandAxis( + axisConfig, + axisThemeConfig, + data.categories, + data.title, + textDimensionCalculator + ); + } + return new LinearAxis( + axisConfig, + axisThemeConfig, + [data.min, data.max], + data.title, + textDimensionCalculator + ); +} +__name(getAxis, "getAxis"); + +// src/diagrams/xychart/chartBuilder/components/chartTitle.ts +var ChartTitle = class { + constructor(textDimensionCalculator, chartConfig, chartData, chartThemeConfig) { + this.textDimensionCalculator = textDimensionCalculator; + this.chartConfig = chartConfig; + this.chartData = chartData; + this.chartThemeConfig = chartThemeConfig; + this.boundingRect = { + x: 0, + y: 0, + width: 0, + height: 0 + }; + this.showChartTitle = false; + } + static { + __name(this, "ChartTitle"); + } + setBoundingBoxXY(point) { + this.boundingRect.x = point.x; + this.boundingRect.y = point.y; + } + calculateSpace(availableSpace) { + const titleDimension = this.textDimensionCalculator.getMaxDimension( + [this.chartData.title], + this.chartConfig.titleFontSize + ); + const widthRequired = Math.max(titleDimension.width, availableSpace.width); + const heightRequired = titleDimension.height + 2 * this.chartConfig.titlePadding; + if (titleDimension.width <= widthRequired && titleDimension.height <= heightRequired && this.chartConfig.showTitle && this.chartData.title) { + this.boundingRect.width = widthRequired; + this.boundingRect.height = heightRequired; + this.showChartTitle = true; + } + return { + width: this.boundingRect.width, + height: this.boundingRect.height + }; + } + getDrawableElements() { + const drawableElem = []; + if (this.showChartTitle) { + drawableElem.push({ + groupTexts: ["chart-title"], + type: "text", + data: [ + { + fontSize: this.chartConfig.titleFontSize, + text: this.chartData.title, + verticalPos: "middle", + horizontalPos: "center", + x: this.boundingRect.x + this.boundingRect.width / 2, + y: this.boundingRect.y + this.boundingRect.height / 2, + fill: this.chartThemeConfig.titleColor, + rotation: 0 + } + ] + }); + } + return drawableElem; + } +}; +function getChartTitleComponent(chartConfig, chartData, chartThemeConfig, tmpSVGGroup2) { + const textDimensionCalculator = new TextDimensionCalculatorWithFont(tmpSVGGroup2); + return new ChartTitle(textDimensionCalculator, chartConfig, chartData, chartThemeConfig); +} +__name(getChartTitleComponent, "getChartTitleComponent"); + +// src/diagrams/xychart/chartBuilder/components/plot/linePlot.ts +import { line } from "d3"; +var LinePlot = class { + constructor(plotData, xAxis, yAxis, orientation, plotIndex2) { + this.plotData = plotData; + this.xAxis = xAxis; + this.yAxis = yAxis; + this.orientation = orientation; + this.plotIndex = plotIndex2; + } + static { + __name(this, "LinePlot"); + } + getDrawableElement() { + const finalData = this.plotData.data.map((d) => [ + this.xAxis.getScaleValue(d[0]), + this.yAxis.getScaleValue(d[1]) + ]); + let path; + if (this.orientation === "horizontal") { + path = line().y((d) => d[0]).x((d) => d[1])(finalData); + } else { + path = line().x((d) => d[0]).y((d) => d[1])(finalData); + } + if (!path) { + return []; + } + return [ + { + groupTexts: ["plot", `line-plot-${this.plotIndex}`], + type: "path", + data: [ + { + path, + strokeFill: this.plotData.strokeFill, + strokeWidth: this.plotData.strokeWidth + } + ] + } + ]; + } +}; + +// src/diagrams/xychart/chartBuilder/components/plot/barPlot.ts +var BarPlot = class { + constructor(barData, boundingRect, xAxis, yAxis, orientation, plotIndex2) { + this.barData = barData; + this.boundingRect = boundingRect; + this.xAxis = xAxis; + this.yAxis = yAxis; + this.orientation = orientation; + this.plotIndex = plotIndex2; + } + static { + __name(this, "BarPlot"); + } + getDrawableElement() { + const finalData = this.barData.data.map((d) => [ + this.xAxis.getScaleValue(d[0]), + this.yAxis.getScaleValue(d[1]) + ]); + const barPaddingPercent = 0.05; + const barWidth = Math.min(this.xAxis.getAxisOuterPadding() * 2, this.xAxis.getTickDistance()) * (1 - barPaddingPercent); + const barWidthHalf = barWidth / 2; + if (this.orientation === "horizontal") { + return [ + { + groupTexts: ["plot", `bar-plot-${this.plotIndex}`], + type: "rect", + data: finalData.map((data) => ({ + x: this.boundingRect.x, + y: data[0] - barWidthHalf, + height: barWidth, + width: data[1] - this.boundingRect.x, + fill: this.barData.fill, + strokeWidth: 0, + strokeFill: this.barData.fill + })) + } + ]; + } + return [ + { + groupTexts: ["plot", `bar-plot-${this.plotIndex}`], + type: "rect", + data: finalData.map((data) => ({ + x: data[0] - barWidthHalf, + y: data[1], + width: barWidth, + height: this.boundingRect.y + this.boundingRect.height - data[1], + fill: this.barData.fill, + strokeWidth: 0, + strokeFill: this.barData.fill + })) + } + ]; + } +}; + +// src/diagrams/xychart/chartBuilder/components/plot/index.ts +var BasePlot = class { + constructor(chartConfig, chartData, chartThemeConfig) { + this.chartConfig = chartConfig; + this.chartData = chartData; + this.chartThemeConfig = chartThemeConfig; + this.boundingRect = { + x: 0, + y: 0, + width: 0, + height: 0 + }; + } + static { + __name(this, "BasePlot"); + } + setAxes(xAxis, yAxis) { + this.xAxis = xAxis; + this.yAxis = yAxis; + } + setBoundingBoxXY(point) { + this.boundingRect.x = point.x; + this.boundingRect.y = point.y; + } + calculateSpace(availableSpace) { + this.boundingRect.width = availableSpace.width; + this.boundingRect.height = availableSpace.height; + return { + width: this.boundingRect.width, + height: this.boundingRect.height + }; + } + getDrawableElements() { + if (!(this.xAxis && this.yAxis)) { + throw Error("Axes must be passed to render Plots"); + } + const drawableElem = []; + for (const [i, plot] of this.chartData.plots.entries()) { + switch (plot.type) { + case "line": + { + const linePlot = new LinePlot( + plot, + this.xAxis, + this.yAxis, + this.chartConfig.chartOrientation, + i + ); + drawableElem.push(...linePlot.getDrawableElement()); + } + break; + case "bar": + { + const barPlot = new BarPlot( + plot, + this.boundingRect, + this.xAxis, + this.yAxis, + this.chartConfig.chartOrientation, + i + ); + drawableElem.push(...barPlot.getDrawableElement()); + } + break; + } + } + return drawableElem; + } +}; +function getPlotComponent(chartConfig, chartData, chartThemeConfig) { + return new BasePlot(chartConfig, chartData, chartThemeConfig); +} +__name(getPlotComponent, "getPlotComponent"); + +// src/diagrams/xychart/chartBuilder/orchestrator.ts +var Orchestrator = class { + constructor(chartConfig, chartData, chartThemeConfig, tmpSVGGroup2) { + this.chartConfig = chartConfig; + this.chartData = chartData; + this.componentStore = { + title: getChartTitleComponent(chartConfig, chartData, chartThemeConfig, tmpSVGGroup2), + plot: getPlotComponent(chartConfig, chartData, chartThemeConfig), + xAxis: getAxis( + chartData.xAxis, + chartConfig.xAxis, + { + titleColor: chartThemeConfig.xAxisTitleColor, + labelColor: chartThemeConfig.xAxisLabelColor, + tickColor: chartThemeConfig.xAxisTickColor, + axisLineColor: chartThemeConfig.xAxisLineColor + }, + tmpSVGGroup2 + ), + yAxis: getAxis( + chartData.yAxis, + chartConfig.yAxis, + { + titleColor: chartThemeConfig.yAxisTitleColor, + labelColor: chartThemeConfig.yAxisLabelColor, + tickColor: chartThemeConfig.yAxisTickColor, + axisLineColor: chartThemeConfig.yAxisLineColor + }, + tmpSVGGroup2 + ) + }; + } + static { + __name(this, "Orchestrator"); + } + calculateVerticalSpace() { + let availableWidth = this.chartConfig.width; + let availableHeight = this.chartConfig.height; + let plotX = 0; + let plotY = 0; + let chartWidth = Math.floor(availableWidth * this.chartConfig.plotReservedSpacePercent / 100); + let chartHeight = Math.floor( + availableHeight * this.chartConfig.plotReservedSpacePercent / 100 + ); + let spaceUsed = this.componentStore.plot.calculateSpace({ + width: chartWidth, + height: chartHeight + }); + availableWidth -= spaceUsed.width; + availableHeight -= spaceUsed.height; + spaceUsed = this.componentStore.title.calculateSpace({ + width: this.chartConfig.width, + height: availableHeight + }); + plotY = spaceUsed.height; + availableHeight -= spaceUsed.height; + this.componentStore.xAxis.setAxisPosition("bottom"); + spaceUsed = this.componentStore.xAxis.calculateSpace({ + width: availableWidth, + height: availableHeight + }); + availableHeight -= spaceUsed.height; + this.componentStore.yAxis.setAxisPosition("left"); + spaceUsed = this.componentStore.yAxis.calculateSpace({ + width: availableWidth, + height: availableHeight + }); + plotX = spaceUsed.width; + availableWidth -= spaceUsed.width; + if (availableWidth > 0) { + chartWidth += availableWidth; + availableWidth = 0; + } + if (availableHeight > 0) { + chartHeight += availableHeight; + availableHeight = 0; + } + this.componentStore.plot.calculateSpace({ + width: chartWidth, + height: chartHeight + }); + this.componentStore.plot.setBoundingBoxXY({ x: plotX, y: plotY }); + this.componentStore.xAxis.setRange([plotX, plotX + chartWidth]); + this.componentStore.xAxis.setBoundingBoxXY({ x: plotX, y: plotY + chartHeight }); + this.componentStore.yAxis.setRange([plotY, plotY + chartHeight]); + this.componentStore.yAxis.setBoundingBoxXY({ x: 0, y: plotY }); + if (this.chartData.plots.some((p) => isBarPlot(p))) { + this.componentStore.xAxis.recalculateOuterPaddingToDrawBar(); + } + } + calculateHorizontalSpace() { + let availableWidth = this.chartConfig.width; + let availableHeight = this.chartConfig.height; + let titleYEnd = 0; + let plotX = 0; + let plotY = 0; + let chartWidth = Math.floor(availableWidth * this.chartConfig.plotReservedSpacePercent / 100); + let chartHeight = Math.floor( + availableHeight * this.chartConfig.plotReservedSpacePercent / 100 + ); + let spaceUsed = this.componentStore.plot.calculateSpace({ + width: chartWidth, + height: chartHeight + }); + availableWidth -= spaceUsed.width; + availableHeight -= spaceUsed.height; + spaceUsed = this.componentStore.title.calculateSpace({ + width: this.chartConfig.width, + height: availableHeight + }); + titleYEnd = spaceUsed.height; + availableHeight -= spaceUsed.height; + this.componentStore.xAxis.setAxisPosition("left"); + spaceUsed = this.componentStore.xAxis.calculateSpace({ + width: availableWidth, + height: availableHeight + }); + availableWidth -= spaceUsed.width; + plotX = spaceUsed.width; + this.componentStore.yAxis.setAxisPosition("top"); + spaceUsed = this.componentStore.yAxis.calculateSpace({ + width: availableWidth, + height: availableHeight + }); + availableHeight -= spaceUsed.height; + plotY = titleYEnd + spaceUsed.height; + if (availableWidth > 0) { + chartWidth += availableWidth; + availableWidth = 0; + } + if (availableHeight > 0) { + chartHeight += availableHeight; + availableHeight = 0; + } + this.componentStore.plot.calculateSpace({ + width: chartWidth, + height: chartHeight + }); + this.componentStore.plot.setBoundingBoxXY({ x: plotX, y: plotY }); + this.componentStore.yAxis.setRange([plotX, plotX + chartWidth]); + this.componentStore.yAxis.setBoundingBoxXY({ x: plotX, y: titleYEnd }); + this.componentStore.xAxis.setRange([plotY, plotY + chartHeight]); + this.componentStore.xAxis.setBoundingBoxXY({ x: 0, y: plotY }); + if (this.chartData.plots.some((p) => isBarPlot(p))) { + this.componentStore.xAxis.recalculateOuterPaddingToDrawBar(); + } + } + calculateSpace() { + if (this.chartConfig.chartOrientation === "horizontal") { + this.calculateHorizontalSpace(); + } else { + this.calculateVerticalSpace(); + } + } + getDrawableElement() { + this.calculateSpace(); + const drawableElem = []; + this.componentStore.plot.setAxes(this.componentStore.xAxis, this.componentStore.yAxis); + for (const component of Object.values(this.componentStore)) { + drawableElem.push(...component.getDrawableElements()); + } + return drawableElem; + } +}; + +// src/diagrams/xychart/chartBuilder/index.ts +var XYChartBuilder = class { + static { + __name(this, "XYChartBuilder"); + } + static build(config, chartData, chartThemeConfig, tmpSVGGroup2) { + const orchestrator = new Orchestrator(config, chartData, chartThemeConfig, tmpSVGGroup2); + return orchestrator.getDrawableElement(); + } +}; + +// src/diagrams/xychart/xychartDb.ts +var plotIndex = 0; +var tmpSVGGroup; +var xyChartConfig = getChartDefaultConfig(); +var xyChartThemeConfig = getChartDefaultThemeConfig(); +var xyChartData = getChartDefaultData(); +var plotColorPalette = xyChartThemeConfig.plotColorPalette.split(",").map((color) => color.trim()); +var hasSetXAxis = false; +var hasSetYAxis = false; +function getChartDefaultThemeConfig() { + const defaultThemeVariables = getThemeVariables(); + const config = getConfig(); + return cleanAndMerge(defaultThemeVariables.xyChart, config.themeVariables.xyChart); +} +__name(getChartDefaultThemeConfig, "getChartDefaultThemeConfig"); +function getChartDefaultConfig() { + const config = getConfig(); + return cleanAndMerge( + defaultConfig_default.xyChart, + config.xyChart + ); +} +__name(getChartDefaultConfig, "getChartDefaultConfig"); +function getChartDefaultData() { + return { + yAxis: { + type: "linear", + title: "", + min: Infinity, + max: -Infinity + }, + xAxis: { + type: "band", + title: "", + categories: [] + }, + title: "", + plots: [] + }; +} +__name(getChartDefaultData, "getChartDefaultData"); +function textSanitizer(text) { + const config = getConfig(); + return sanitizeText(text.trim(), config); +} +__name(textSanitizer, "textSanitizer"); +function setTmpSVGG(SVGG) { + tmpSVGGroup = SVGG; +} +__name(setTmpSVGG, "setTmpSVGG"); +function setOrientation(orientation) { + if (orientation === "horizontal") { + xyChartConfig.chartOrientation = "horizontal"; + } else { + xyChartConfig.chartOrientation = "vertical"; + } +} +__name(setOrientation, "setOrientation"); +function setXAxisTitle(title) { + xyChartData.xAxis.title = textSanitizer(title.text); +} +__name(setXAxisTitle, "setXAxisTitle"); +function setXAxisRangeData(min, max) { + xyChartData.xAxis = { type: "linear", title: xyChartData.xAxis.title, min, max }; + hasSetXAxis = true; +} +__name(setXAxisRangeData, "setXAxisRangeData"); +function setXAxisBand(categories) { + xyChartData.xAxis = { + type: "band", + title: xyChartData.xAxis.title, + categories: categories.map((c) => textSanitizer(c.text)) + }; + hasSetXAxis = true; +} +__name(setXAxisBand, "setXAxisBand"); +function setYAxisTitle(title) { + xyChartData.yAxis.title = textSanitizer(title.text); +} +__name(setYAxisTitle, "setYAxisTitle"); +function setYAxisRangeData(min, max) { + xyChartData.yAxis = { type: "linear", title: xyChartData.yAxis.title, min, max }; + hasSetYAxis = true; +} +__name(setYAxisRangeData, "setYAxisRangeData"); +function setYAxisRangeFromPlotData(data) { + const minValue = Math.min(...data); + const maxValue = Math.max(...data); + const prevMinValue = isLinearAxisData(xyChartData.yAxis) ? xyChartData.yAxis.min : Infinity; + const prevMaxValue = isLinearAxisData(xyChartData.yAxis) ? xyChartData.yAxis.max : -Infinity; + xyChartData.yAxis = { + type: "linear", + title: xyChartData.yAxis.title, + min: Math.min(prevMinValue, minValue), + max: Math.max(prevMaxValue, maxValue) + }; +} +__name(setYAxisRangeFromPlotData, "setYAxisRangeFromPlotData"); +function transformDataWithoutCategory(data) { + let retData = []; + if (data.length === 0) { + return retData; + } + if (!hasSetXAxis) { + const prevMinValue = isLinearAxisData(xyChartData.xAxis) ? xyChartData.xAxis.min : Infinity; + const prevMaxValue = isLinearAxisData(xyChartData.xAxis) ? xyChartData.xAxis.max : -Infinity; + setXAxisRangeData(Math.min(prevMinValue, 1), Math.max(prevMaxValue, data.length)); + } + if (!hasSetYAxis) { + setYAxisRangeFromPlotData(data); + } + if (isBandAxisData(xyChartData.xAxis)) { + retData = xyChartData.xAxis.categories.map((c, i) => [c, data[i]]); + } + if (isLinearAxisData(xyChartData.xAxis)) { + const min = xyChartData.xAxis.min; + const max = xyChartData.xAxis.max; + const step = (max - min) / (data.length - 1); + const categories = []; + for (let i = min; i <= max; i += step) { + categories.push(`${i}`); + } + retData = categories.map((c, i) => [c, data[i]]); + } + return retData; +} +__name(transformDataWithoutCategory, "transformDataWithoutCategory"); +function getPlotColorFromPalette(plotIndex2) { + return plotColorPalette[plotIndex2 === 0 ? 0 : plotIndex2 % plotColorPalette.length]; +} +__name(getPlotColorFromPalette, "getPlotColorFromPalette"); +function setLineData(title, data) { + const plotData = transformDataWithoutCategory(data); + xyChartData.plots.push({ + type: "line", + strokeFill: getPlotColorFromPalette(plotIndex), + strokeWidth: 2, + data: plotData + }); + plotIndex++; +} +__name(setLineData, "setLineData"); +function setBarData(title, data) { + const plotData = transformDataWithoutCategory(data); + xyChartData.plots.push({ + type: "bar", + fill: getPlotColorFromPalette(plotIndex), + data: plotData + }); + plotIndex++; +} +__name(setBarData, "setBarData"); +function getDrawableElem() { + if (xyChartData.plots.length === 0) { + throw Error("No Plot to render, please provide a plot with some data"); + } + xyChartData.title = getDiagramTitle(); + return XYChartBuilder.build(xyChartConfig, xyChartData, xyChartThemeConfig, tmpSVGGroup); +} +__name(getDrawableElem, "getDrawableElem"); +function getChartThemeConfig() { + return xyChartThemeConfig; +} +__name(getChartThemeConfig, "getChartThemeConfig"); +function getChartConfig() { + return xyChartConfig; +} +__name(getChartConfig, "getChartConfig"); +function getXYChartData() { + return xyChartData; +} +__name(getXYChartData, "getXYChartData"); +var clear2 = /* @__PURE__ */ __name(function() { + clear(); + plotIndex = 0; + xyChartConfig = getChartDefaultConfig(); + xyChartData = getChartDefaultData(); + xyChartThemeConfig = getChartDefaultThemeConfig(); + plotColorPalette = xyChartThemeConfig.plotColorPalette.split(",").map((color) => color.trim()); + hasSetXAxis = false; + hasSetYAxis = false; +}, "clear"); +var xychartDb_default = { + getDrawableElem, + clear: clear2, + setAccTitle, + getAccTitle, + setDiagramTitle, + getDiagramTitle, + getAccDescription, + setAccDescription, + setOrientation, + setXAxisTitle, + setXAxisRangeData, + setXAxisBand, + setYAxisTitle, + setYAxisRangeData, + setLineData, + setBarData, + setTmpSVGG, + getChartThemeConfig, + getChartConfig, + getXYChartData +}; + +// src/diagrams/xychart/xychartRenderer.ts +var draw = /* @__PURE__ */ __name((txt, id, _version, diagObj) => { + const db = diagObj.db; + const themeConfig = db.getChartThemeConfig(); + const chartConfig = db.getChartConfig(); + const labelData = db.getXYChartData().plots[0].data.map((data) => data[1]); + function getDominantBaseLine(horizontalPos) { + return horizontalPos === "top" ? "text-before-edge" : "middle"; + } + __name(getDominantBaseLine, "getDominantBaseLine"); + function getTextAnchor(verticalPos) { + return verticalPos === "left" ? "start" : verticalPos === "right" ? "end" : "middle"; + } + __name(getTextAnchor, "getTextAnchor"); + function getTextTransformation(data) { + return `translate(${data.x}, ${data.y}) rotate(${data.rotation || 0})`; + } + __name(getTextTransformation, "getTextTransformation"); + log.debug("Rendering xychart chart\n" + txt); + const svg = selectSvgElement(id); + const group = svg.append("g").attr("class", "main"); + const background = group.append("rect").attr("width", chartConfig.width).attr("height", chartConfig.height).attr("class", "background"); + configureSvgSize(svg, chartConfig.height, chartConfig.width, true); + svg.attr("viewBox", `0 0 ${chartConfig.width} ${chartConfig.height}`); + background.attr("fill", themeConfig.backgroundColor); + db.setTmpSVGG(svg.append("g").attr("class", "mermaid-tmp-group")); + const shapes = db.getDrawableElem(); + const groups = {}; + function getGroup(gList) { + let elem = group; + let prefix = ""; + for (const [i] of gList.entries()) { + let parent = group; + if (i > 0 && groups[prefix]) { + parent = groups[prefix]; + } + prefix += gList[i]; + elem = groups[prefix]; + if (!elem) { + elem = groups[prefix] = parent.append("g").attr("class", gList[i]); + } + } + return elem; + } + __name(getGroup, "getGroup"); + for (const shape of shapes) { + if (shape.data.length === 0) { + continue; + } + const shapeGroup = getGroup(shape.groupTexts); + switch (shape.type) { + case "rect": + shapeGroup.selectAll("rect").data(shape.data).enter().append("rect").attr("x", (data) => data.x).attr("y", (data) => data.y).attr("width", (data) => data.width).attr("height", (data) => data.height).attr("fill", (data) => data.fill).attr("stroke", (data) => data.strokeFill).attr("stroke-width", (data) => data.strokeWidth); + if (chartConfig.showDataLabel) { + if (chartConfig.chartOrientation === "horizontal") { + let fitsHorizontally2 = function(item, fontSize) { + const { data, label } = item; + const textWidth = fontSize * label.length * charWidthFactor; + return textWidth <= data.width - 10; + }; + var fitsHorizontally = fitsHorizontally2; + __name(fitsHorizontally2, "fitsHorizontally"); + const charWidthFactor = 0.7; + const validItems = shape.data.map((d, i) => ({ data: d, label: labelData[i].toString() })).filter((item) => item.data.width > 0 && item.data.height > 0); + const candidateFontSizes = validItems.map((item) => { + const { data } = item; + let fontSize = data.height * 0.7; + while (!fitsHorizontally2(item, fontSize) && fontSize > 0) { + fontSize -= 1; + } + return fontSize; + }); + const uniformFontSize = Math.floor(Math.min(...candidateFontSizes)); + shapeGroup.selectAll("text").data(validItems).enter().append("text").attr("x", (item) => item.data.x + item.data.width - 10).attr("y", (item) => item.data.y + item.data.height / 2).attr("text-anchor", "end").attr("dominant-baseline", "middle").attr("fill", "black").attr("font-size", `${uniformFontSize}px`).text((item) => item.label); + } else { + let fitsInBar2 = function(item, fontSize, yOffset2) { + const { data, label } = item; + const charWidthFactor = 0.7; + const textWidth = fontSize * label.length * charWidthFactor; + const centerX = data.x + data.width / 2; + const leftEdge = centerX - textWidth / 2; + const rightEdge = centerX + textWidth / 2; + const horizontalFits = leftEdge >= data.x && rightEdge <= data.x + data.width; + const verticalFits = data.y + yOffset2 + fontSize <= data.y + data.height; + return horizontalFits && verticalFits; + }; + var fitsInBar = fitsInBar2; + __name(fitsInBar2, "fitsInBar"); + const yOffset = 10; + const validItems = shape.data.map((d, i) => ({ data: d, label: labelData[i].toString() })).filter((item) => item.data.width > 0 && item.data.height > 0); + const candidateFontSizes = validItems.map((item) => { + const { data, label } = item; + let fontSize = data.width / (label.length * 0.7); + while (!fitsInBar2(item, fontSize, yOffset) && fontSize > 0) { + fontSize -= 1; + } + return fontSize; + }); + const uniformFontSize = Math.floor(Math.min(...candidateFontSizes)); + shapeGroup.selectAll("text").data(validItems).enter().append("text").attr("x", (item) => item.data.x + item.data.width / 2).attr("y", (item) => item.data.y + yOffset).attr("text-anchor", "middle").attr("dominant-baseline", "hanging").attr("fill", "black").attr("font-size", `${uniformFontSize}px`).text((item) => item.label); + } + } + break; + case "text": + shapeGroup.selectAll("text").data(shape.data).enter().append("text").attr("x", 0).attr("y", 0).attr("fill", (data) => data.fill).attr("font-size", (data) => data.fontSize).attr("dominant-baseline", (data) => getDominantBaseLine(data.verticalPos)).attr("text-anchor", (data) => getTextAnchor(data.horizontalPos)).attr("transform", (data) => getTextTransformation(data)).text((data) => data.text); + break; + case "path": + shapeGroup.selectAll("path").data(shape.data).enter().append("path").attr("d", (data) => data.path).attr("fill", (data) => data.fill ? data.fill : "none").attr("stroke", (data) => data.strokeFill).attr("stroke-width", (data) => data.strokeWidth); + break; + } + } +}, "draw"); +var xychartRenderer_default = { + draw +}; + +// src/diagrams/xychart/xychartDiagram.ts +var diagram = { + parser: xychart_default, + db: xychartDb_default, + renderer: xychartRenderer_default +}; +export { + diagram +}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.core/xychartDiagram-PRI3JC2R.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.core/xychartDiagram-PRI3JC2R.mjs.map new file mode 100644 index 0000000..6857dc5 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.core/xychartDiagram-PRI3JC2R.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/xychart/parser/xychart.jison", "../../../src/diagrams/xychart/chartBuilder/interfaces.ts", "../../../src/diagrams/xychart/chartBuilder/textDimensionCalculator.ts", "../../../src/diagrams/xychart/chartBuilder/components/axis/bandAxis.ts", "../../../src/diagrams/xychart/chartBuilder/components/axis/baseAxis.ts", "../../../src/diagrams/xychart/chartBuilder/components/axis/linearAxis.ts", "../../../src/diagrams/xychart/chartBuilder/components/axis/index.ts", "../../../src/diagrams/xychart/chartBuilder/components/chartTitle.ts", "../../../src/diagrams/xychart/chartBuilder/components/plot/linePlot.ts", "../../../src/diagrams/xychart/chartBuilder/components/plot/barPlot.ts", "../../../src/diagrams/xychart/chartBuilder/components/plot/index.ts", "../../../src/diagrams/xychart/chartBuilder/orchestrator.ts", "../../../src/diagrams/xychart/chartBuilder/index.ts", "../../../src/diagrams/xychart/xychartDb.ts", "../../../src/diagrams/xychart/xychartRenderer.ts", "../../../src/diagrams/xychart/xychartDiagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,10,12,14,16,18,19,21,23],$V1=[2,6],$V2=[1,3],$V3=[1,5],$V4=[1,6],$V5=[1,7],$V6=[1,5,10,12,14,16,18,19,21,23,34,35,36],$V7=[1,25],$V8=[1,26],$V9=[1,28],$Va=[1,29],$Vb=[1,30],$Vc=[1,31],$Vd=[1,32],$Ve=[1,33],$Vf=[1,34],$Vg=[1,35],$Vh=[1,36],$Vi=[1,37],$Vj=[1,43],$Vk=[1,42],$Vl=[1,47],$Vm=[1,50],$Vn=[1,10,12,14,16,18,19,21,23,34,35,36],$Vo=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],$Vp=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],$Vq=[1,64];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"eol\":4,\"XYCHART\":5,\"chartConfig\":6,\"document\":7,\"CHART_ORIENTATION\":8,\"statement\":9,\"title\":10,\"text\":11,\"X_AXIS\":12,\"parseXAxis\":13,\"Y_AXIS\":14,\"parseYAxis\":15,\"LINE\":16,\"plotData\":17,\"BAR\":18,\"acc_title\":19,\"acc_title_value\":20,\"acc_descr\":21,\"acc_descr_value\":22,\"acc_descr_multiline_value\":23,\"SQUARE_BRACES_START\":24,\"commaSeparatedNumbers\":25,\"SQUARE_BRACES_END\":26,\"NUMBER_WITH_DECIMAL\":27,\"COMMA\":28,\"xAxisData\":29,\"bandData\":30,\"ARROW_DELIMITER\":31,\"commaSeparatedTexts\":32,\"yAxisData\":33,\"NEWLINE\":34,\"SEMI\":35,\"EOF\":36,\"alphaNum\":37,\"STR\":38,\"MD_STR\":39,\"alphaNumToken\":40,\"AMP\":41,\"NUM\":42,\"ALPHA\":43,\"PLUS\":44,\"EQUALS\":45,\"MULT\":46,\"DOT\":47,\"BRKT\":48,\"MINUS\":49,\"UNDERSCORE\":50,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",5:\"XYCHART\",8:\"CHART_ORIENTATION\",10:\"title\",12:\"X_AXIS\",14:\"Y_AXIS\",16:\"LINE\",18:\"BAR\",19:\"acc_title\",20:\"acc_title_value\",21:\"acc_descr\",22:\"acc_descr_value\",23:\"acc_descr_multiline_value\",24:\"SQUARE_BRACES_START\",26:\"SQUARE_BRACES_END\",27:\"NUMBER_WITH_DECIMAL\",28:\"COMMA\",31:\"ARROW_DELIMITER\",34:\"NEWLINE\",35:\"SEMI\",36:\"EOF\",38:\"STR\",39:\"MD_STR\",41:\"AMP\",42:\"NUM\",43:\"ALPHA\",44:\"PLUS\",45:\"EQUALS\",46:\"MULT\",47:\"DOT\",48:\"BRKT\",49:\"MINUS\",50:\"UNDERSCORE\"},\nproductions_: [0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 5:\n yy.setOrientation($$[$0]); \nbreak;\ncase 9:\n yy.setDiagramTitle($$[$0].text.trim()); \nbreak;\ncase 12:\n yy.setLineData({text: '', type: 'text'}, $$[$0]); \nbreak;\ncase 13:\n yy.setLineData($$[$0-1], $$[$0]); \nbreak;\ncase 14:\n yy.setBarData({text: '', type: 'text'}, $$[$0]); \nbreak;\ncase 15:\n yy.setBarData($$[$0-1], $$[$0]); \nbreak;\ncase 16:\n this.$=$$[$0].trim();yy.setAccTitle(this.$); \nbreak;\ncase 17: case 18:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 19:\n this.$ = $$[$0-1] \nbreak;\ncase 20:\n this.$ = [Number($$[$0-2]), ...$$[$0]] \nbreak;\ncase 21:\n this.$ = [Number($$[$0])] \nbreak;\ncase 22:\nyy.setXAxisTitle($$[$0]);\nbreak;\ncase 23:\nyy.setXAxisTitle($$[$0-1]);\nbreak;\ncase 24:\nyy.setXAxisTitle({type: 'text', text: ''});\nbreak;\ncase 25:\nyy.setXAxisBand($$[$0]);\nbreak;\ncase 26:\nyy.setXAxisRangeData(Number($$[$0-2]), Number($$[$0]));\nbreak;\ncase 27:\nthis.$ = $$[$0-1]\nbreak;\ncase 28:\n this.$ = [$$[$0-2], ...$$[$0]] \nbreak;\ncase 29:\n this.$ = [$$[$0]] \nbreak;\ncase 30:\nyy.setYAxisTitle($$[$0]);\nbreak;\ncase 31:\nyy.setYAxisTitle($$[$0-1]);\nbreak;\ncase 32:\nyy.setYAxisTitle({type: \"text\", text: \"\"});\nbreak;\ncase 33:\nyy.setYAxisRangeData(Number($$[$0-2]), Number($$[$0]));\nbreak;\ncase 37:\n this.$={text:$$[$0], type: 'text'};\nbreak;\ncase 38:\n this.$={text: $$[$0], type: 'text'};\nbreak;\ncase 39:\n this.$={text: $$[$0], type: 'markdown'};\nbreak;\ncase 40:\nthis.$=$$[$0];\nbreak;\ncase 41:\nthis.$=$$[$0-1]+''+$$[$0];\nbreak;\n}\n},\ntable: [o($V0,$V1,{3:1,4:2,7:4,5:$V2,34:$V3,35:$V4,36:$V5}),{1:[3]},o($V0,$V1,{4:2,7:4,3:8,5:$V2,34:$V3,35:$V4,36:$V5}),o($V0,$V1,{4:2,7:4,6:9,3:10,5:$V2,8:[1,11],34:$V3,35:$V4,36:$V5}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},o($V6,[2,34]),o($V6,[2,35]),o($V6,[2,36]),{1:[2,1]},o($V0,$V1,{4:2,7:4,3:21,5:$V2,34:$V3,35:$V4,36:$V5}),{1:[2,3]},o($V6,[2,5]),o($V0,[2,7],{4:22,34:$V3,35:$V4,36:$V5}),{11:23,37:24,38:$V7,39:$V8,40:27,41:$V9,42:$Va,43:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi},{11:39,13:38,24:$Vj,27:$Vk,29:40,30:41,37:24,38:$V7,39:$V8,40:27,41:$V9,42:$Va,43:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi},{11:45,15:44,27:$Vl,33:46,37:24,38:$V7,39:$V8,40:27,41:$V9,42:$Va,43:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi},{11:49,17:48,24:$Vm,37:24,38:$V7,39:$V8,40:27,41:$V9,42:$Va,43:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi},{11:52,17:51,24:$Vm,37:24,38:$V7,39:$V8,40:27,41:$V9,42:$Va,43:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi},{20:[1,53]},{22:[1,54]},o($Vn,[2,18]),{1:[2,2]},o($Vn,[2,8]),o($Vn,[2,9]),o($Vo,[2,37],{40:55,41:$V9,42:$Va,43:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi}),o($Vo,[2,38]),o($Vo,[2,39]),o($Vp,[2,40]),o($Vp,[2,42]),o($Vp,[2,43]),o($Vp,[2,44]),o($Vp,[2,45]),o($Vp,[2,46]),o($Vp,[2,47]),o($Vp,[2,48]),o($Vp,[2,49]),o($Vp,[2,50]),o($Vp,[2,51]),o($Vn,[2,10]),o($Vn,[2,22],{30:41,29:56,24:$Vj,27:$Vk}),o($Vn,[2,24]),o($Vn,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:$V7,39:$V8,40:27,41:$V9,42:$Va,43:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi},o($Vn,[2,11]),o($Vn,[2,30],{33:60,27:$Vl}),o($Vn,[2,32]),{31:[1,61]},o($Vn,[2,12]),{17:62,24:$Vm},{25:63,27:$Vq},o($Vn,[2,14]),{17:65,24:$Vm},o($Vn,[2,16]),o($Vn,[2,17]),o($Vp,[2,41]),o($Vn,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},o($Vn,[2,31]),{27:[1,69]},o($Vn,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},o($Vn,[2,15]),o($Vn,[2,26]),o($Vn,[2,27]),{11:59,32:72,37:24,38:$V7,39:$V8,40:27,41:$V9,42:$Va,43:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi},o($Vn,[2,33]),o($Vn,[2,19]),{25:73,27:$Vq},{26:[2,28]},{26:[2,20]}],\ndefaultActions: {8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:/* skip comments */\nbreak;\ncase 1:/* skip comments */\nbreak;\ncase 2: this.popState(); return 34; \nbreak;\ncase 3: this.popState(); return 34; \nbreak;\ncase 4:return 34;\nbreak;\ncase 5:/* do nothing */\nbreak;\ncase 6: return 10; \nbreak;\ncase 7: this.pushState(\"acc_title\");return 19; \nbreak;\ncase 8: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 9: this.pushState(\"acc_descr\");return 21; \nbreak;\ncase 10: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 11: this.pushState(\"acc_descr_multiline\");\nbreak;\ncase 12: this.popState(); \nbreak;\ncase 13: return \"acc_descr_multiline_value\"; \nbreak;\ncase 14:return 5;\nbreak;\ncase 15:return 5;\nbreak;\ncase 16:return 8\nbreak;\ncase 17: this.pushState(\"axis_data\"); return \"X_AXIS\"; \nbreak;\ncase 18: this.pushState(\"axis_data\"); return \"Y_AXIS\"; \nbreak;\ncase 19: this.pushState(\"axis_band_data\"); return 24; \nbreak;\ncase 20: return 31; \nbreak;\ncase 21: this.pushState(\"data\"); return 16; \nbreak;\ncase 22: this.pushState(\"data\"); return 18; \nbreak;\ncase 23: this.pushState(\"data_inner\"); return 24; \nbreak;\ncase 24: return 27; \nbreak;\ncase 25: this.popState(); return 26; \nbreak;\ncase 26: this.popState(); \nbreak;\ncase 27:this.pushState(\"string\");\nbreak;\ncase 28:this.popState();\nbreak;\ncase 29:return \"STR\";\nbreak;\ncase 30:return 24\nbreak;\ncase 31:return 26\nbreak;\ncase 32:return 43;\nbreak;\ncase 33:return 'COLON';\nbreak;\ncase 34:return 44;\nbreak;\ncase 35:return 28;\nbreak;\ncase 36:return 45;\nbreak;\ncase 37:return 46;\nbreak;\ncase 38:return 48;\nbreak;\ncase 39:return 50;\nbreak;\ncase 40:return 47;\nbreak;\ncase 41:return 41;\nbreak;\ncase 42:return 49;\nbreak;\ncase 43:return 42;\nbreak;\ncase 44:/* skip */\nbreak;\ncase 45:return 35;\nbreak;\ncase 46:return 36;\nbreak;\n}\n},\nrules: [/^(?:%%(?!\\{)[^\\n]*)/i,/^(?:[^\\}]%%[^\\n]*)/i,/^(?:(\\r?\\n))/i,/^(?:(\\r?\\n))/i,/^(?:[\\n\\r]+)/i,/^(?:%%[^\\n]*)/i,/^(?:title\\b)/i,/^(?:accTitle\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*:\\s*)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:accDescr\\s*\\{\\s*)/i,/^(?:\\{)/i,/^(?:[^\\}]*)/i,/^(?:xychart-beta\\b)/i,/^(?:xychart\\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\\b)/i,/^(?:y-axis\\b)/i,/^(?:\\[)/i,/^(?:-->)/i,/^(?:line\\b)/i,/^(?:bar\\b)/i,/^(?:\\[)/i,/^(?:[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+))/i,/^(?:\\])/i,/^(?:(?:`\\) \\{ this\\.pushState\\(md_string\\); \\}\\n\\(\\?:\\(\\?!`\"\\)\\.\\)\\+ \\{ return MD_STR; \\}\\n\\(\\?:`))/i,/^(?:[\"])/i,/^(?:[\"])/i,/^(?:[^\"]*)/i,/^(?:\\[)/i,/^(?:\\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\\*)/i,/^(?:#)/i,/^(?:[\\_])/i,/^(?:\\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\\s+)/i,/^(?:;)/i,/^(?:$)/i],\nconditions: {\"data_inner\":{\"rules\":[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,24,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],\"inclusive\":true},\"data\":{\"rules\":[0,1,3,4,5,6,7,9,11,14,15,16,17,18,21,22,23,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],\"inclusive\":true},\"axis_band_data\":{\"rules\":[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],\"inclusive\":true},\"axis_data\":{\"rules\":[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,22,24,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],\"inclusive\":true},\"acc_descr_multiline\":{\"rules\":[12,13],\"inclusive\":false},\"acc_descr\":{\"rules\":[10],\"inclusive\":false},\"acc_title\":{\"rules\":[8],\"inclusive\":false},\"title\":{\"rules\":[],\"inclusive\":false},\"md_string\":{\"rules\":[],\"inclusive\":false},\"string\":{\"rules\":[28,29],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "export interface XYChartAxisThemeConfig {\n titleColor: string;\n labelColor: string;\n tickColor: string;\n axisLineColor: string;\n}\n\nexport interface XYChartThemeConfig {\n backgroundColor: string;\n titleColor: string;\n xAxisLabelColor: string;\n xAxisTitleColor: string;\n xAxisTickColor: string;\n xAxisLineColor: string;\n yAxisLabelColor: string;\n yAxisTitleColor: string;\n yAxisTickColor: string;\n yAxisLineColor: string;\n plotColorPalette: string;\n}\n\nexport interface ChartComponent {\n calculateSpace(availableSpace: Dimension): Dimension;\n setBoundingBoxXY(point: Point): void;\n getDrawableElements(): DrawableElem[];\n}\n\nexport type SimplePlotDataType = [string, number][];\n\nexport interface LinePlotData {\n type: 'line';\n strokeFill: string;\n strokeWidth: number;\n data: SimplePlotDataType;\n}\n\nexport interface BarPlotData {\n type: 'bar';\n fill: string;\n data: SimplePlotDataType;\n}\n\nexport type PlotData = LinePlotData | BarPlotData;\n\nexport function isBarPlot(data: PlotData): data is BarPlotData {\n return data.type === 'bar';\n}\n\nexport interface BandAxisDataType {\n type: 'band';\n title: string;\n categories: string[];\n}\n\nexport interface LinearAxisDataType {\n type: 'linear';\n title: string;\n min: number;\n max: number;\n}\n\nexport type AxisDataType = LinearAxisDataType | BandAxisDataType;\n\nexport function isBandAxisData(data: AxisDataType): data is BandAxisDataType {\n return data.type === 'band';\n}\n\nexport function isLinearAxisData(data: AxisDataType): data is LinearAxisDataType {\n return data.type === 'linear';\n}\n\n/**\n * For now we are keeping this configs as we are removing the required fields while generating the config.type.ts file\n * we should remove `XYChartAxisConfig` and `XYChartConfig` after we started using required fields\n */\nexport interface XYChartAxisConfig {\n showLabel: boolean;\n labelFontSize: number;\n labelPadding: number;\n showTitle: boolean;\n titleFontSize: number;\n titlePadding: number;\n showTick: boolean;\n tickLength: number;\n tickWidth: number;\n showAxisLine: boolean;\n axisLineWidth: number;\n}\n\nexport interface XYChartConfig {\n width: number;\n height: number;\n titleFontSize: number;\n titlePadding: number;\n showTitle: boolean;\n showDataLabel: boolean;\n xAxis: XYChartAxisConfig;\n yAxis: XYChartAxisConfig;\n chartOrientation: 'vertical' | 'horizontal';\n plotReservedSpacePercent: number;\n}\n\nexport interface XYChartData {\n xAxis: AxisDataType;\n yAxis: AxisDataType;\n title: string;\n plots: PlotData[];\n}\n\nexport interface Dimension {\n width: number;\n height: number;\n}\n\nexport interface BoundingRect extends Point, Dimension {}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport type TextHorizontalPos = 'left' | 'center' | 'right';\nexport type TextVerticalPos = 'top' | 'middle';\n\nexport interface RectElem extends Point {\n width: number;\n height: number;\n fill: string;\n strokeWidth: number;\n strokeFill: string;\n}\n\nexport interface TextElem extends Point {\n text: string;\n fill: string;\n verticalPos: TextVerticalPos;\n horizontalPos: TextHorizontalPos;\n fontSize: number;\n rotation: number;\n}\n\nexport interface PathElem {\n path: string;\n fill?: string;\n strokeWidth: number;\n strokeFill: string;\n}\n\nexport type DrawableElem =\n | {\n groupTexts: string[];\n type: 'rect';\n data: RectElem[];\n }\n | {\n groupTexts: string[];\n type: 'text';\n data: TextElem[];\n }\n | {\n groupTexts: string[];\n type: 'path';\n data: PathElem[];\n };\n", "import type { SVGGroup } from '../../../diagram-api/types.js';\nimport { computeDimensionOfText } from '../../../rendering-util/createText.js';\nimport type { Dimension } from './interfaces.js';\n\nexport interface TextDimensionCalculator {\n getMaxDimension(texts: string[], fontSize: number): Dimension;\n}\n\nexport class TextDimensionCalculatorWithFont implements TextDimensionCalculator {\n constructor(private parentGroup: SVGGroup) {}\n getMaxDimension(texts: string[], fontSize: number): Dimension {\n if (!this.parentGroup) {\n return {\n width: texts.reduce((acc, cur) => Math.max(cur.length, acc), 0) * fontSize,\n height: fontSize,\n };\n }\n\n const dimension: Dimension = {\n width: 0,\n height: 0,\n };\n\n const elem = this.parentGroup\n .append('g')\n .attr('visibility', 'hidden')\n .attr('font-size', fontSize);\n\n for (const t of texts) {\n const bbox = computeDimensionOfText(elem, 1, t);\n const width = bbox ? bbox.width : t.length * fontSize;\n const height = bbox ? bbox.height : fontSize;\n dimension.width = Math.max(dimension.width, width);\n dimension.height = Math.max(dimension.height, height);\n }\n elem.remove();\n return dimension;\n }\n}\n", "import type { ScaleBand } from 'd3';\nimport { scaleBand } from 'd3';\nimport { log } from '../../../../../logger.js';\nimport type { TextDimensionCalculator } from '../../textDimensionCalculator.js';\nimport { BaseAxis } from './baseAxis.js';\nimport type { XYChartAxisThemeConfig, XYChartAxisConfig } from '../../interfaces.js';\n\nexport class BandAxis extends BaseAxis {\n private scale: ScaleBand;\n private categories: string[];\n\n constructor(\n axisConfig: XYChartAxisConfig,\n axisThemeConfig: XYChartAxisThemeConfig,\n categories: string[],\n title: string,\n textDimensionCalculator: TextDimensionCalculator\n ) {\n super(axisConfig, title, textDimensionCalculator, axisThemeConfig);\n this.categories = categories;\n this.scale = scaleBand().domain(this.categories).range(this.getRange());\n }\n\n setRange(range: [number, number]): void {\n super.setRange(range);\n }\n\n recalculateScale(): void {\n this.scale = scaleBand()\n .domain(this.categories)\n .range(this.getRange())\n .paddingInner(1)\n .paddingOuter(0)\n .align(0.5);\n log.trace('BandAxis axis final categories, range: ', this.categories, this.getRange());\n }\n\n getTickValues(): (string | number)[] {\n return this.categories;\n }\n\n getScaleValue(value: string): number {\n return this.scale(value) ?? this.getRange()[0];\n }\n}\n", "import type {\n BoundingRect,\n Dimension,\n DrawableElem,\n Point,\n XYChartAxisConfig,\n XYChartAxisThemeConfig,\n} from '../../interfaces.js';\nimport type { TextDimensionCalculator } from '../../textDimensionCalculator.js';\nimport type { Axis, AxisPosition } from './index.js';\n\nconst BAR_WIDTH_TO_TICK_WIDTH_RATIO = 0.7;\nconst MAX_OUTER_PADDING_PERCENT_FOR_WRT_LABEL = 0.2;\n\nexport abstract class BaseAxis implements Axis {\n protected boundingRect: BoundingRect = { x: 0, y: 0, width: 0, height: 0 };\n protected axisPosition: AxisPosition = 'left';\n private range: [number, number];\n protected showTitle = false;\n protected showLabel = false;\n protected showTick = false;\n protected showAxisLine = false;\n protected outerPadding = 0;\n protected titleTextHeight = 0;\n protected labelTextHeight = 0;\n\n constructor(\n protected axisConfig: XYChartAxisConfig,\n protected title: string,\n protected textDimensionCalculator: TextDimensionCalculator,\n protected axisThemeConfig: XYChartAxisThemeConfig\n ) {\n this.range = [0, 10];\n this.boundingRect = { x: 0, y: 0, width: 0, height: 0 };\n this.axisPosition = 'left';\n }\n\n setRange(range: [number, number]): void {\n this.range = range;\n if (this.axisPosition === 'left' || this.axisPosition === 'right') {\n this.boundingRect.height = range[1] - range[0];\n } else {\n this.boundingRect.width = range[1] - range[0];\n }\n this.recalculateScale();\n }\n\n getRange(): [number, number] {\n return [this.range[0] + this.outerPadding, this.range[1] - this.outerPadding];\n }\n\n setAxisPosition(axisPosition: AxisPosition): void {\n this.axisPosition = axisPosition;\n this.setRange(this.range);\n }\n\n abstract getScaleValue(value: number | string): number;\n\n abstract recalculateScale(): void;\n\n abstract getTickValues(): (string | number)[];\n\n getTickDistance(): number {\n const range = this.getRange();\n return Math.abs(range[0] - range[1]) / this.getTickValues().length;\n }\n\n getAxisOuterPadding(): number {\n return this.outerPadding;\n }\n\n private getLabelDimension(): Dimension {\n return this.textDimensionCalculator.getMaxDimension(\n this.getTickValues().map((tick) => tick.toString()),\n this.axisConfig.labelFontSize\n );\n }\n\n recalculateOuterPaddingToDrawBar(): void {\n if (BAR_WIDTH_TO_TICK_WIDTH_RATIO * this.getTickDistance() > this.outerPadding * 2) {\n this.outerPadding = Math.floor((BAR_WIDTH_TO_TICK_WIDTH_RATIO * this.getTickDistance()) / 2);\n }\n this.recalculateScale();\n }\n\n private calculateSpaceIfDrawnHorizontally(availableSpace: Dimension) {\n let availableHeight = availableSpace.height;\n if (this.axisConfig.showAxisLine && availableHeight > this.axisConfig.axisLineWidth) {\n availableHeight -= this.axisConfig.axisLineWidth;\n this.showAxisLine = true;\n }\n if (this.axisConfig.showLabel) {\n const spaceRequired = this.getLabelDimension();\n const maxPadding = MAX_OUTER_PADDING_PERCENT_FOR_WRT_LABEL * availableSpace.width;\n this.outerPadding = Math.min(spaceRequired.width / 2, maxPadding);\n\n const heightRequired = spaceRequired.height + this.axisConfig.labelPadding * 2;\n this.labelTextHeight = spaceRequired.height;\n if (heightRequired <= availableHeight) {\n availableHeight -= heightRequired;\n this.showLabel = true;\n }\n }\n if (this.axisConfig.showTick && availableHeight >= this.axisConfig.tickLength) {\n this.showTick = true;\n availableHeight -= this.axisConfig.tickLength;\n }\n if (this.axisConfig.showTitle && this.title) {\n const spaceRequired = this.textDimensionCalculator.getMaxDimension(\n [this.title],\n this.axisConfig.titleFontSize\n );\n const heightRequired = spaceRequired.height + this.axisConfig.titlePadding * 2;\n this.titleTextHeight = spaceRequired.height;\n if (heightRequired <= availableHeight) {\n availableHeight -= heightRequired;\n this.showTitle = true;\n }\n }\n this.boundingRect.width = availableSpace.width;\n this.boundingRect.height = availableSpace.height - availableHeight;\n }\n\n private calculateSpaceIfDrawnVertical(availableSpace: Dimension) {\n let availableWidth = availableSpace.width;\n if (this.axisConfig.showAxisLine && availableWidth > this.axisConfig.axisLineWidth) {\n availableWidth -= this.axisConfig.axisLineWidth;\n this.showAxisLine = true;\n }\n if (this.axisConfig.showLabel) {\n const spaceRequired = this.getLabelDimension();\n const maxPadding = MAX_OUTER_PADDING_PERCENT_FOR_WRT_LABEL * availableSpace.height;\n this.outerPadding = Math.min(spaceRequired.height / 2, maxPadding);\n const widthRequired = spaceRequired.width + this.axisConfig.labelPadding * 2;\n if (widthRequired <= availableWidth) {\n availableWidth -= widthRequired;\n this.showLabel = true;\n }\n }\n if (this.axisConfig.showTick && availableWidth >= this.axisConfig.tickLength) {\n this.showTick = true;\n availableWidth -= this.axisConfig.tickLength;\n }\n if (this.axisConfig.showTitle && this.title) {\n const spaceRequired = this.textDimensionCalculator.getMaxDimension(\n [this.title],\n this.axisConfig.titleFontSize\n );\n const widthRequired = spaceRequired.height + this.axisConfig.titlePadding * 2;\n this.titleTextHeight = spaceRequired.height;\n if (widthRequired <= availableWidth) {\n availableWidth -= widthRequired;\n this.showTitle = true;\n }\n }\n this.boundingRect.width = availableSpace.width - availableWidth;\n this.boundingRect.height = availableSpace.height;\n }\n\n calculateSpace(availableSpace: Dimension): Dimension {\n if (this.axisPosition === 'left' || this.axisPosition === 'right') {\n this.calculateSpaceIfDrawnVertical(availableSpace);\n } else {\n this.calculateSpaceIfDrawnHorizontally(availableSpace);\n }\n this.recalculateScale();\n return {\n width: this.boundingRect.width,\n height: this.boundingRect.height,\n };\n }\n\n setBoundingBoxXY(point: Point): void {\n this.boundingRect.x = point.x;\n this.boundingRect.y = point.y;\n }\n\n private getDrawableElementsForLeftAxis(): DrawableElem[] {\n const drawableElement: DrawableElem[] = [];\n if (this.showAxisLine) {\n const x = this.boundingRect.x + this.boundingRect.width - this.axisConfig.axisLineWidth / 2;\n drawableElement.push({\n type: 'path',\n groupTexts: ['left-axis', 'axisl-line'],\n data: [\n {\n path: `M ${x},${this.boundingRect.y} L ${x},${\n this.boundingRect.y + this.boundingRect.height\n } `,\n strokeFill: this.axisThemeConfig.axisLineColor,\n strokeWidth: this.axisConfig.axisLineWidth,\n },\n ],\n });\n }\n if (this.showLabel) {\n drawableElement.push({\n type: 'text',\n groupTexts: ['left-axis', 'label'],\n data: this.getTickValues().map((tick) => ({\n text: tick.toString(),\n x:\n this.boundingRect.x +\n this.boundingRect.width -\n (this.showLabel ? this.axisConfig.labelPadding : 0) -\n (this.showTick ? this.axisConfig.tickLength : 0) -\n (this.showAxisLine ? this.axisConfig.axisLineWidth : 0),\n y: this.getScaleValue(tick),\n fill: this.axisThemeConfig.labelColor,\n fontSize: this.axisConfig.labelFontSize,\n rotation: 0,\n verticalPos: 'middle',\n horizontalPos: 'right',\n })),\n });\n }\n if (this.showTick) {\n const x =\n this.boundingRect.x +\n this.boundingRect.width -\n (this.showAxisLine ? this.axisConfig.axisLineWidth : 0);\n drawableElement.push({\n type: 'path',\n groupTexts: ['left-axis', 'ticks'],\n data: this.getTickValues().map((tick) => ({\n path: `M ${x},${this.getScaleValue(tick)} L ${\n x - this.axisConfig.tickLength\n },${this.getScaleValue(tick)}`,\n strokeFill: this.axisThemeConfig.tickColor,\n strokeWidth: this.axisConfig.tickWidth,\n })),\n });\n }\n if (this.showTitle) {\n drawableElement.push({\n type: 'text',\n groupTexts: ['left-axis', 'title'],\n data: [\n {\n text: this.title,\n x: this.boundingRect.x + this.axisConfig.titlePadding,\n y: this.boundingRect.y + this.boundingRect.height / 2,\n fill: this.axisThemeConfig.titleColor,\n fontSize: this.axisConfig.titleFontSize,\n rotation: 270,\n verticalPos: 'top',\n horizontalPos: 'center',\n },\n ],\n });\n }\n return drawableElement;\n }\n private getDrawableElementsForBottomAxis(): DrawableElem[] {\n const drawableElement: DrawableElem[] = [];\n if (this.showAxisLine) {\n const y = this.boundingRect.y + this.axisConfig.axisLineWidth / 2;\n drawableElement.push({\n type: 'path',\n groupTexts: ['bottom-axis', 'axis-line'],\n data: [\n {\n path: `M ${this.boundingRect.x},${y} L ${\n this.boundingRect.x + this.boundingRect.width\n },${y}`,\n strokeFill: this.axisThemeConfig.axisLineColor,\n strokeWidth: this.axisConfig.axisLineWidth,\n },\n ],\n });\n }\n if (this.showLabel) {\n drawableElement.push({\n type: 'text',\n groupTexts: ['bottom-axis', 'label'],\n data: this.getTickValues().map((tick) => ({\n text: tick.toString(),\n x: this.getScaleValue(tick),\n y:\n this.boundingRect.y +\n this.axisConfig.labelPadding +\n (this.showTick ? this.axisConfig.tickLength : 0) +\n (this.showAxisLine ? this.axisConfig.axisLineWidth : 0),\n fill: this.axisThemeConfig.labelColor,\n fontSize: this.axisConfig.labelFontSize,\n rotation: 0,\n verticalPos: 'top',\n horizontalPos: 'center',\n })),\n });\n }\n if (this.showTick) {\n const y = this.boundingRect.y + (this.showAxisLine ? this.axisConfig.axisLineWidth : 0);\n drawableElement.push({\n type: 'path',\n groupTexts: ['bottom-axis', 'ticks'],\n data: this.getTickValues().map((tick) => ({\n path: `M ${this.getScaleValue(tick)},${y} L ${this.getScaleValue(tick)},${\n y + this.axisConfig.tickLength\n }`,\n strokeFill: this.axisThemeConfig.tickColor,\n strokeWidth: this.axisConfig.tickWidth,\n })),\n });\n }\n if (this.showTitle) {\n drawableElement.push({\n type: 'text',\n groupTexts: ['bottom-axis', 'title'],\n data: [\n {\n text: this.title,\n x: this.range[0] + (this.range[1] - this.range[0]) / 2,\n y:\n this.boundingRect.y +\n this.boundingRect.height -\n this.axisConfig.titlePadding -\n this.titleTextHeight,\n fill: this.axisThemeConfig.titleColor,\n fontSize: this.axisConfig.titleFontSize,\n rotation: 0,\n verticalPos: 'top',\n horizontalPos: 'center',\n },\n ],\n });\n }\n return drawableElement;\n }\n private getDrawableElementsForTopAxis(): DrawableElem[] {\n const drawableElement: DrawableElem[] = [];\n if (this.showAxisLine) {\n const y = this.boundingRect.y + this.boundingRect.height - this.axisConfig.axisLineWidth / 2;\n drawableElement.push({\n type: 'path',\n groupTexts: ['top-axis', 'axis-line'],\n data: [\n {\n path: `M ${this.boundingRect.x},${y} L ${\n this.boundingRect.x + this.boundingRect.width\n },${y}`,\n strokeFill: this.axisThemeConfig.axisLineColor,\n strokeWidth: this.axisConfig.axisLineWidth,\n },\n ],\n });\n }\n if (this.showLabel) {\n drawableElement.push({\n type: 'text',\n groupTexts: ['top-axis', 'label'],\n data: this.getTickValues().map((tick) => ({\n text: tick.toString(),\n x: this.getScaleValue(tick),\n y:\n this.boundingRect.y +\n (this.showTitle ? this.titleTextHeight + this.axisConfig.titlePadding * 2 : 0) +\n this.axisConfig.labelPadding,\n fill: this.axisThemeConfig.labelColor,\n fontSize: this.axisConfig.labelFontSize,\n rotation: 0,\n verticalPos: 'top',\n horizontalPos: 'center',\n })),\n });\n }\n if (this.showTick) {\n const y = this.boundingRect.y;\n drawableElement.push({\n type: 'path',\n groupTexts: ['top-axis', 'ticks'],\n data: this.getTickValues().map((tick) => ({\n path: `M ${this.getScaleValue(tick)},${\n y + this.boundingRect.height - (this.showAxisLine ? this.axisConfig.axisLineWidth : 0)\n } L ${this.getScaleValue(tick)},${\n y +\n this.boundingRect.height -\n this.axisConfig.tickLength -\n (this.showAxisLine ? this.axisConfig.axisLineWidth : 0)\n }`,\n strokeFill: this.axisThemeConfig.tickColor,\n strokeWidth: this.axisConfig.tickWidth,\n })),\n });\n }\n if (this.showTitle) {\n drawableElement.push({\n type: 'text',\n groupTexts: ['top-axis', 'title'],\n data: [\n {\n text: this.title,\n x: this.boundingRect.x + this.boundingRect.width / 2,\n y: this.boundingRect.y + this.axisConfig.titlePadding,\n fill: this.axisThemeConfig.titleColor,\n fontSize: this.axisConfig.titleFontSize,\n rotation: 0,\n verticalPos: 'top',\n horizontalPos: 'center',\n },\n ],\n });\n }\n return drawableElement;\n }\n\n getDrawableElements(): DrawableElem[] {\n if (this.axisPosition === 'left') {\n return this.getDrawableElementsForLeftAxis();\n }\n if (this.axisPosition === 'right') {\n throw Error('Drawing of right axis is not implemented');\n }\n if (this.axisPosition === 'bottom') {\n return this.getDrawableElementsForBottomAxis();\n }\n if (this.axisPosition === 'top') {\n return this.getDrawableElementsForTopAxis();\n }\n return [];\n }\n}\n", "import type { ScaleLinear } from 'd3';\nimport { scaleLinear } from 'd3';\nimport type { TextDimensionCalculator } from '../../textDimensionCalculator.js';\nimport { BaseAxis } from './baseAxis.js';\nimport type { XYChartAxisThemeConfig, XYChartAxisConfig } from '../../interfaces.js';\n\nexport class LinearAxis extends BaseAxis {\n private scale: ScaleLinear;\n private domain: [number, number];\n\n constructor(\n axisConfig: XYChartAxisConfig,\n axisThemeConfig: XYChartAxisThemeConfig,\n domain: [number, number],\n title: string,\n textDimensionCalculator: TextDimensionCalculator\n ) {\n super(axisConfig, title, textDimensionCalculator, axisThemeConfig);\n this.domain = domain;\n this.scale = scaleLinear().domain(this.domain).range(this.getRange());\n }\n\n getTickValues(): (string | number)[] {\n return this.scale.ticks();\n }\n\n recalculateScale(): void {\n const domain = [...this.domain]; // copy the array so if reverse is called two times it should not cancel the reverse effect\n if (this.axisPosition === 'left') {\n domain.reverse(); // since y-axis in svg start from top\n }\n this.scale = scaleLinear().domain(domain).range(this.getRange());\n }\n\n getScaleValue(value: number): number {\n return this.scale(value);\n }\n}\n", "import type { SVGGroup } from '../../../../../diagram-api/types.js';\nimport type {\n AxisDataType,\n ChartComponent,\n XYChartAxisConfig,\n XYChartAxisThemeConfig,\n} from '../../interfaces.js';\nimport { isBandAxisData } from '../../interfaces.js';\nimport { TextDimensionCalculatorWithFont } from '../../textDimensionCalculator.js';\nimport { BandAxis } from './bandAxis.js';\nimport { LinearAxis } from './linearAxis.js';\n\nexport type AxisPosition = 'left' | 'right' | 'top' | 'bottom';\n\nexport interface Axis extends ChartComponent {\n getScaleValue(value: string | number): number;\n setAxisPosition(axisPosition: AxisPosition): void;\n getAxisOuterPadding(): number;\n getTickDistance(): number;\n recalculateOuterPaddingToDrawBar(): void;\n setRange(range: [number, number]): void;\n}\n\nexport function getAxis(\n data: AxisDataType,\n axisConfig: XYChartAxisConfig,\n axisThemeConfig: XYChartAxisThemeConfig,\n tmpSVGGroup: SVGGroup\n): Axis {\n const textDimensionCalculator = new TextDimensionCalculatorWithFont(tmpSVGGroup);\n if (isBandAxisData(data)) {\n return new BandAxis(\n axisConfig,\n axisThemeConfig,\n data.categories,\n data.title,\n textDimensionCalculator\n );\n }\n return new LinearAxis(\n axisConfig,\n axisThemeConfig,\n [data.min, data.max],\n data.title,\n textDimensionCalculator\n );\n}\n", "import type { SVGGroup } from '../../../../diagram-api/types.js';\nimport type {\n BoundingRect,\n ChartComponent,\n Dimension,\n DrawableElem,\n Point,\n XYChartConfig,\n XYChartData,\n XYChartThemeConfig,\n} from '../interfaces.js';\nimport type { TextDimensionCalculator } from '../textDimensionCalculator.js';\nimport { TextDimensionCalculatorWithFont } from '../textDimensionCalculator.js';\n\nexport class ChartTitle implements ChartComponent {\n private boundingRect: BoundingRect;\n private showChartTitle: boolean;\n constructor(\n private textDimensionCalculator: TextDimensionCalculator,\n private chartConfig: XYChartConfig,\n private chartData: XYChartData,\n private chartThemeConfig: XYChartThemeConfig\n ) {\n this.boundingRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n this.showChartTitle = false;\n }\n setBoundingBoxXY(point: Point): void {\n this.boundingRect.x = point.x;\n this.boundingRect.y = point.y;\n }\n calculateSpace(availableSpace: Dimension): Dimension {\n const titleDimension = this.textDimensionCalculator.getMaxDimension(\n [this.chartData.title],\n this.chartConfig.titleFontSize\n );\n const widthRequired = Math.max(titleDimension.width, availableSpace.width);\n const heightRequired = titleDimension.height + 2 * this.chartConfig.titlePadding;\n if (\n titleDimension.width <= widthRequired &&\n titleDimension.height <= heightRequired &&\n this.chartConfig.showTitle &&\n this.chartData.title\n ) {\n this.boundingRect.width = widthRequired;\n this.boundingRect.height = heightRequired;\n this.showChartTitle = true;\n }\n\n return {\n width: this.boundingRect.width,\n height: this.boundingRect.height,\n };\n }\n getDrawableElements(): DrawableElem[] {\n const drawableElem: DrawableElem[] = [];\n if (this.showChartTitle) {\n drawableElem.push({\n groupTexts: ['chart-title'],\n type: 'text',\n data: [\n {\n fontSize: this.chartConfig.titleFontSize,\n text: this.chartData.title,\n verticalPos: 'middle',\n horizontalPos: 'center',\n x: this.boundingRect.x + this.boundingRect.width / 2,\n y: this.boundingRect.y + this.boundingRect.height / 2,\n fill: this.chartThemeConfig.titleColor,\n rotation: 0,\n },\n ],\n });\n }\n return drawableElem;\n }\n}\n\nexport function getChartTitleComponent(\n chartConfig: XYChartConfig,\n chartData: XYChartData,\n chartThemeConfig: XYChartThemeConfig,\n tmpSVGGroup: SVGGroup\n): ChartComponent {\n const textDimensionCalculator = new TextDimensionCalculatorWithFont(tmpSVGGroup);\n return new ChartTitle(textDimensionCalculator, chartConfig, chartData, chartThemeConfig);\n}\n", "import { line } from 'd3';\nimport type { DrawableElem, LinePlotData, XYChartConfig } from '../../interfaces.js';\nimport type { Axis } from '../axis/index.js';\n\nexport class LinePlot {\n constructor(\n private plotData: LinePlotData,\n private xAxis: Axis,\n private yAxis: Axis,\n private orientation: XYChartConfig['chartOrientation'],\n private plotIndex: number\n ) {}\n\n getDrawableElement(): DrawableElem[] {\n const finalData: [number, number][] = this.plotData.data.map((d) => [\n this.xAxis.getScaleValue(d[0]),\n this.yAxis.getScaleValue(d[1]),\n ]);\n\n let path: string | null;\n if (this.orientation === 'horizontal') {\n path = line()\n .y((d) => d[0])\n .x((d) => d[1])(finalData);\n } else {\n path = line()\n .x((d) => d[0])\n .y((d) => d[1])(finalData);\n }\n if (!path) {\n return [];\n }\n return [\n {\n groupTexts: ['plot', `line-plot-${this.plotIndex}`],\n type: 'path',\n data: [\n {\n path,\n strokeFill: this.plotData.strokeFill,\n strokeWidth: this.plotData.strokeWidth,\n },\n ],\n },\n ];\n }\n}\n", "import type { BarPlotData, BoundingRect, DrawableElem, XYChartConfig } from '../../interfaces.js';\nimport type { Axis } from '../axis/index.js';\n\nexport class BarPlot {\n constructor(\n private barData: BarPlotData,\n private boundingRect: BoundingRect,\n private xAxis: Axis,\n private yAxis: Axis,\n private orientation: XYChartConfig['chartOrientation'],\n private plotIndex: number\n ) {}\n\n getDrawableElement(): DrawableElem[] {\n const finalData: [number, number][] = this.barData.data.map((d) => [\n this.xAxis.getScaleValue(d[0]),\n this.yAxis.getScaleValue(d[1]),\n ]);\n\n const barPaddingPercent = 0.05;\n\n const barWidth =\n Math.min(this.xAxis.getAxisOuterPadding() * 2, this.xAxis.getTickDistance()) *\n (1 - barPaddingPercent);\n const barWidthHalf = barWidth / 2;\n\n if (this.orientation === 'horizontal') {\n return [\n {\n groupTexts: ['plot', `bar-plot-${this.plotIndex}`],\n type: 'rect',\n data: finalData.map((data) => ({\n x: this.boundingRect.x,\n y: data[0] - barWidthHalf,\n height: barWidth,\n width: data[1] - this.boundingRect.x,\n fill: this.barData.fill,\n strokeWidth: 0,\n strokeFill: this.barData.fill,\n })),\n },\n ];\n }\n return [\n {\n groupTexts: ['plot', `bar-plot-${this.plotIndex}`],\n type: 'rect',\n data: finalData.map((data) => ({\n x: data[0] - barWidthHalf,\n y: data[1],\n width: barWidth,\n height: this.boundingRect.y + this.boundingRect.height - data[1],\n fill: this.barData.fill,\n strokeWidth: 0,\n strokeFill: this.barData.fill,\n })),\n },\n ];\n }\n}\n", "import type {\n XYChartData,\n Dimension,\n BoundingRect,\n DrawableElem,\n Point,\n XYChartThemeConfig,\n XYChartConfig,\n} from '../../interfaces.js';\nimport type { Axis } from '../axis/index.js';\nimport type { ChartComponent } from '../../interfaces.js';\nimport { LinePlot } from './linePlot.js';\nimport { BarPlot } from './barPlot.js';\n\nexport interface Plot extends ChartComponent {\n setAxes(xAxis: Axis, yAxis: Axis): void;\n}\n\nexport class BasePlot implements Plot {\n private boundingRect: BoundingRect;\n private xAxis?: Axis;\n private yAxis?: Axis;\n\n constructor(\n private chartConfig: XYChartConfig,\n private chartData: XYChartData,\n private chartThemeConfig: XYChartThemeConfig\n ) {\n this.boundingRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n }\n setAxes(xAxis: Axis, yAxis: Axis) {\n this.xAxis = xAxis;\n this.yAxis = yAxis;\n }\n setBoundingBoxXY(point: Point): void {\n this.boundingRect.x = point.x;\n this.boundingRect.y = point.y;\n }\n calculateSpace(availableSpace: Dimension): Dimension {\n this.boundingRect.width = availableSpace.width;\n this.boundingRect.height = availableSpace.height;\n\n return {\n width: this.boundingRect.width,\n height: this.boundingRect.height,\n };\n }\n getDrawableElements(): DrawableElem[] {\n if (!(this.xAxis && this.yAxis)) {\n throw Error('Axes must be passed to render Plots');\n }\n const drawableElem: DrawableElem[] = [];\n for (const [i, plot] of this.chartData.plots.entries()) {\n switch (plot.type) {\n case 'line':\n {\n const linePlot = new LinePlot(\n plot,\n this.xAxis,\n this.yAxis,\n this.chartConfig.chartOrientation,\n i\n );\n drawableElem.push(...linePlot.getDrawableElement());\n }\n break;\n case 'bar':\n {\n const barPlot = new BarPlot(\n plot,\n this.boundingRect,\n this.xAxis,\n this.yAxis,\n this.chartConfig.chartOrientation,\n i\n );\n drawableElem.push(...barPlot.getDrawableElement());\n }\n break;\n }\n }\n return drawableElem;\n }\n}\n\nexport function getPlotComponent(\n chartConfig: XYChartConfig,\n chartData: XYChartData,\n chartThemeConfig: XYChartThemeConfig\n): Plot {\n return new BasePlot(chartConfig, chartData, chartThemeConfig);\n}\n", "import type { SVGGroup } from '../../../diagram-api/types.js';\nimport type { Axis } from './components/axis/index.js';\nimport { getAxis } from './components/axis/index.js';\nimport { getChartTitleComponent } from './components/chartTitle.js';\nimport type { Plot } from './components/plot/index.js';\nimport { getPlotComponent } from './components/plot/index.js';\nimport type {\n ChartComponent,\n DrawableElem,\n XYChartConfig,\n XYChartData,\n XYChartThemeConfig,\n} from './interfaces.js';\nimport { isBarPlot } from './interfaces.js';\n\nexport class Orchestrator {\n private componentStore: {\n title: ChartComponent;\n plot: Plot;\n xAxis: Axis;\n yAxis: Axis;\n };\n constructor(\n private chartConfig: XYChartConfig,\n private chartData: XYChartData,\n chartThemeConfig: XYChartThemeConfig,\n tmpSVGGroup: SVGGroup\n ) {\n this.componentStore = {\n title: getChartTitleComponent(chartConfig, chartData, chartThemeConfig, tmpSVGGroup),\n plot: getPlotComponent(chartConfig, chartData, chartThemeConfig),\n xAxis: getAxis(\n chartData.xAxis,\n chartConfig.xAxis,\n {\n titleColor: chartThemeConfig.xAxisTitleColor,\n labelColor: chartThemeConfig.xAxisLabelColor,\n tickColor: chartThemeConfig.xAxisTickColor,\n axisLineColor: chartThemeConfig.xAxisLineColor,\n },\n tmpSVGGroup\n ),\n yAxis: getAxis(\n chartData.yAxis,\n chartConfig.yAxis,\n {\n titleColor: chartThemeConfig.yAxisTitleColor,\n labelColor: chartThemeConfig.yAxisLabelColor,\n tickColor: chartThemeConfig.yAxisTickColor,\n axisLineColor: chartThemeConfig.yAxisLineColor,\n },\n tmpSVGGroup\n ),\n };\n }\n\n private calculateVerticalSpace() {\n let availableWidth = this.chartConfig.width;\n let availableHeight = this.chartConfig.height;\n let plotX = 0;\n let plotY = 0;\n let chartWidth = Math.floor((availableWidth * this.chartConfig.plotReservedSpacePercent) / 100);\n let chartHeight = Math.floor(\n (availableHeight * this.chartConfig.plotReservedSpacePercent) / 100\n );\n let spaceUsed = this.componentStore.plot.calculateSpace({\n width: chartWidth,\n height: chartHeight,\n });\n availableWidth -= spaceUsed.width;\n availableHeight -= spaceUsed.height;\n\n spaceUsed = this.componentStore.title.calculateSpace({\n width: this.chartConfig.width,\n height: availableHeight,\n });\n plotY = spaceUsed.height;\n availableHeight -= spaceUsed.height;\n this.componentStore.xAxis.setAxisPosition('bottom');\n spaceUsed = this.componentStore.xAxis.calculateSpace({\n width: availableWidth,\n height: availableHeight,\n });\n availableHeight -= spaceUsed.height;\n this.componentStore.yAxis.setAxisPosition('left');\n spaceUsed = this.componentStore.yAxis.calculateSpace({\n width: availableWidth,\n height: availableHeight,\n });\n plotX = spaceUsed.width;\n availableWidth -= spaceUsed.width;\n if (availableWidth > 0) {\n chartWidth += availableWidth;\n availableWidth = 0;\n }\n if (availableHeight > 0) {\n chartHeight += availableHeight;\n availableHeight = 0;\n }\n this.componentStore.plot.calculateSpace({\n width: chartWidth,\n height: chartHeight,\n });\n\n this.componentStore.plot.setBoundingBoxXY({ x: plotX, y: plotY });\n this.componentStore.xAxis.setRange([plotX, plotX + chartWidth]);\n this.componentStore.xAxis.setBoundingBoxXY({ x: plotX, y: plotY + chartHeight });\n this.componentStore.yAxis.setRange([plotY, plotY + chartHeight]);\n this.componentStore.yAxis.setBoundingBoxXY({ x: 0, y: plotY });\n if (this.chartData.plots.some((p) => isBarPlot(p))) {\n this.componentStore.xAxis.recalculateOuterPaddingToDrawBar();\n }\n }\n\n private calculateHorizontalSpace() {\n let availableWidth = this.chartConfig.width;\n let availableHeight = this.chartConfig.height;\n let titleYEnd = 0;\n let plotX = 0;\n let plotY = 0;\n let chartWidth = Math.floor((availableWidth * this.chartConfig.plotReservedSpacePercent) / 100);\n let chartHeight = Math.floor(\n (availableHeight * this.chartConfig.plotReservedSpacePercent) / 100\n );\n let spaceUsed = this.componentStore.plot.calculateSpace({\n width: chartWidth,\n height: chartHeight,\n });\n availableWidth -= spaceUsed.width;\n availableHeight -= spaceUsed.height;\n\n spaceUsed = this.componentStore.title.calculateSpace({\n width: this.chartConfig.width,\n height: availableHeight,\n });\n titleYEnd = spaceUsed.height;\n availableHeight -= spaceUsed.height;\n this.componentStore.xAxis.setAxisPosition('left');\n spaceUsed = this.componentStore.xAxis.calculateSpace({\n width: availableWidth,\n height: availableHeight,\n });\n availableWidth -= spaceUsed.width;\n plotX = spaceUsed.width;\n this.componentStore.yAxis.setAxisPosition('top');\n spaceUsed = this.componentStore.yAxis.calculateSpace({\n width: availableWidth,\n height: availableHeight,\n });\n availableHeight -= spaceUsed.height;\n plotY = titleYEnd + spaceUsed.height;\n if (availableWidth > 0) {\n chartWidth += availableWidth;\n availableWidth = 0;\n }\n if (availableHeight > 0) {\n chartHeight += availableHeight;\n availableHeight = 0;\n }\n this.componentStore.plot.calculateSpace({\n width: chartWidth,\n height: chartHeight,\n });\n\n this.componentStore.plot.setBoundingBoxXY({ x: plotX, y: plotY });\n this.componentStore.yAxis.setRange([plotX, plotX + chartWidth]);\n this.componentStore.yAxis.setBoundingBoxXY({ x: plotX, y: titleYEnd });\n this.componentStore.xAxis.setRange([plotY, plotY + chartHeight]);\n this.componentStore.xAxis.setBoundingBoxXY({ x: 0, y: plotY });\n if (this.chartData.plots.some((p) => isBarPlot(p))) {\n this.componentStore.xAxis.recalculateOuterPaddingToDrawBar();\n }\n }\n\n private calculateSpace() {\n if (this.chartConfig.chartOrientation === 'horizontal') {\n this.calculateHorizontalSpace();\n } else {\n this.calculateVerticalSpace();\n }\n }\n\n getDrawableElement() {\n this.calculateSpace();\n const drawableElem: DrawableElem[] = [];\n this.componentStore.plot.setAxes(this.componentStore.xAxis, this.componentStore.yAxis);\n for (const component of Object.values(this.componentStore)) {\n drawableElem.push(...component.getDrawableElements());\n }\n return drawableElem;\n }\n}\n", "import type { SVGGroup } from '../../../diagram-api/types.js';\nimport type { DrawableElem, XYChartConfig, XYChartData, XYChartThemeConfig } from './interfaces.js';\nimport { Orchestrator } from './orchestrator.js';\n\nexport class XYChartBuilder {\n static build(\n config: XYChartConfig,\n chartData: XYChartData,\n chartThemeConfig: XYChartThemeConfig,\n tmpSVGGroup: SVGGroup\n ): DrawableElem[] {\n const orchestrator = new Orchestrator(config, chartData, chartThemeConfig, tmpSVGGroup);\n return orchestrator.getDrawableElement();\n }\n}\n", "import * as configApi from '../../config.js';\nimport defaultConfig from '../../defaultConfig.js';\nimport type { SVGGroup } from '../../diagram-api/types.js';\nimport { getThemeVariables } from '../../themes/theme-default.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport { sanitizeText } from '../common/common.js';\nimport {\n clear as commonClear,\n getAccDescription,\n getAccTitle,\n getDiagramTitle,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n} from '../common/commonDb.js';\nimport { XYChartBuilder } from './chartBuilder/index.js';\nimport type {\n DrawableElem,\n SimplePlotDataType,\n XYChartConfig,\n XYChartData,\n XYChartThemeConfig,\n} from './chartBuilder/interfaces.js';\nimport { isBandAxisData, isLinearAxisData } from './chartBuilder/interfaces.js';\n\nlet plotIndex = 0;\n\nlet tmpSVGGroup: SVGGroup;\n\nlet xyChartConfig: XYChartConfig = getChartDefaultConfig();\nlet xyChartThemeConfig: XYChartThemeConfig = getChartDefaultThemeConfig();\nlet xyChartData: XYChartData = getChartDefaultData();\nlet plotColorPalette = xyChartThemeConfig.plotColorPalette.split(',').map((color) => color.trim());\nlet hasSetXAxis = false;\nlet hasSetYAxis = false;\n\ninterface NormalTextType {\n type: 'text';\n text: string;\n}\n\nfunction getChartDefaultThemeConfig(): XYChartThemeConfig {\n const defaultThemeVariables = getThemeVariables();\n const config = configApi.getConfig();\n return cleanAndMerge(defaultThemeVariables.xyChart, config.themeVariables.xyChart);\n}\nfunction getChartDefaultConfig(): XYChartConfig {\n const config = configApi.getConfig();\n return cleanAndMerge(\n defaultConfig.xyChart as XYChartConfig,\n config.xyChart as XYChartConfig\n );\n}\n\nfunction getChartDefaultData(): XYChartData {\n return {\n yAxis: {\n type: 'linear',\n title: '',\n min: Infinity,\n max: -Infinity,\n },\n xAxis: {\n type: 'band',\n title: '',\n categories: [],\n },\n title: '',\n plots: [],\n };\n}\n\nfunction textSanitizer(text: string) {\n const config = configApi.getConfig();\n return sanitizeText(text.trim(), config);\n}\n\nfunction setTmpSVGG(SVGG: SVGGroup) {\n tmpSVGGroup = SVGG;\n}\nfunction setOrientation(orientation: string) {\n if (orientation === 'horizontal') {\n xyChartConfig.chartOrientation = 'horizontal';\n } else {\n xyChartConfig.chartOrientation = 'vertical';\n }\n}\nfunction setXAxisTitle(title: NormalTextType) {\n xyChartData.xAxis.title = textSanitizer(title.text);\n}\nfunction setXAxisRangeData(min: number, max: number) {\n xyChartData.xAxis = { type: 'linear', title: xyChartData.xAxis.title, min, max };\n hasSetXAxis = true;\n}\nfunction setXAxisBand(categories: NormalTextType[]) {\n xyChartData.xAxis = {\n type: 'band',\n title: xyChartData.xAxis.title,\n categories: categories.map((c) => textSanitizer(c.text)),\n };\n hasSetXAxis = true;\n}\nfunction setYAxisTitle(title: NormalTextType) {\n xyChartData.yAxis.title = textSanitizer(title.text);\n}\nfunction setYAxisRangeData(min: number, max: number) {\n xyChartData.yAxis = { type: 'linear', title: xyChartData.yAxis.title, min, max };\n hasSetYAxis = true;\n}\n\n// this function does not set `hasSetYAxis` as there can be multiple data so we should calculate the range accordingly\nfunction setYAxisRangeFromPlotData(data: number[]) {\n const minValue = Math.min(...data);\n const maxValue = Math.max(...data);\n const prevMinValue = isLinearAxisData(xyChartData.yAxis) ? xyChartData.yAxis.min : Infinity;\n const prevMaxValue = isLinearAxisData(xyChartData.yAxis) ? xyChartData.yAxis.max : -Infinity;\n xyChartData.yAxis = {\n type: 'linear',\n title: xyChartData.yAxis.title,\n min: Math.min(prevMinValue, minValue),\n max: Math.max(prevMaxValue, maxValue),\n };\n}\n\nfunction transformDataWithoutCategory(data: number[]): SimplePlotDataType {\n let retData: SimplePlotDataType = [];\n if (data.length === 0) {\n return retData;\n }\n if (!hasSetXAxis) {\n const prevMinValue = isLinearAxisData(xyChartData.xAxis) ? xyChartData.xAxis.min : Infinity;\n const prevMaxValue = isLinearAxisData(xyChartData.xAxis) ? xyChartData.xAxis.max : -Infinity;\n setXAxisRangeData(Math.min(prevMinValue, 1), Math.max(prevMaxValue, data.length));\n }\n if (!hasSetYAxis) {\n setYAxisRangeFromPlotData(data);\n }\n\n if (isBandAxisData(xyChartData.xAxis)) {\n retData = xyChartData.xAxis.categories.map((c, i) => [c, data[i]]);\n }\n\n if (isLinearAxisData(xyChartData.xAxis)) {\n const min = xyChartData.xAxis.min;\n const max = xyChartData.xAxis.max;\n const step = (max - min) / (data.length - 1);\n const categories: string[] = [];\n for (let i = min; i <= max; i += step) {\n categories.push(`${i}`);\n }\n retData = categories.map((c, i) => [c, data[i]]);\n }\n\n return retData;\n}\n\nfunction getPlotColorFromPalette(plotIndex: number): string {\n return plotColorPalette[plotIndex === 0 ? 0 : plotIndex % plotColorPalette.length];\n}\n\nfunction setLineData(title: NormalTextType, data: number[]) {\n const plotData = transformDataWithoutCategory(data);\n xyChartData.plots.push({\n type: 'line',\n strokeFill: getPlotColorFromPalette(plotIndex),\n strokeWidth: 2,\n data: plotData,\n });\n plotIndex++;\n}\n\nfunction setBarData(title: NormalTextType, data: number[]) {\n const plotData = transformDataWithoutCategory(data);\n xyChartData.plots.push({\n type: 'bar',\n fill: getPlotColorFromPalette(plotIndex),\n data: plotData,\n });\n plotIndex++;\n}\n\nfunction getDrawableElem(): DrawableElem[] {\n if (xyChartData.plots.length === 0) {\n throw Error('No Plot to render, please provide a plot with some data');\n }\n xyChartData.title = getDiagramTitle();\n return XYChartBuilder.build(xyChartConfig, xyChartData, xyChartThemeConfig, tmpSVGGroup);\n}\n\nfunction getChartThemeConfig() {\n return xyChartThemeConfig;\n}\n\nfunction getChartConfig() {\n return xyChartConfig;\n}\n\nfunction getXYChartData() {\n return xyChartData;\n}\n\nconst clear = function () {\n commonClear();\n plotIndex = 0;\n xyChartConfig = getChartDefaultConfig();\n xyChartData = getChartDefaultData();\n xyChartThemeConfig = getChartDefaultThemeConfig();\n plotColorPalette = xyChartThemeConfig.plotColorPalette.split(',').map((color) => color.trim());\n hasSetXAxis = false;\n hasSetYAxis = false;\n};\n\nexport default {\n getDrawableElem,\n clear,\n setAccTitle,\n getAccTitle,\n setDiagramTitle,\n getDiagramTitle,\n getAccDescription,\n setAccDescription,\n setOrientation,\n setXAxisTitle,\n setXAxisRangeData,\n setXAxisBand,\n setYAxisTitle,\n setYAxisRangeData,\n setLineData,\n setBarData,\n setTmpSVGG,\n getChartThemeConfig,\n getChartConfig,\n getXYChartData,\n};\n", "import type { Diagram } from '../../Diagram.js';\nimport { log } from '../../logger.js';\nimport { selectSvgElement } from '../../rendering-util/selectSvgElement.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\nimport type {\n DrawableElem,\n TextElem,\n TextHorizontalPos,\n TextVerticalPos,\n} from './chartBuilder/interfaces.js';\nimport type XYChartDB from './xychartDb.js';\n\nexport const draw = (txt: string, id: string, _version: string, diagObj: Diagram) => {\n const db = diagObj.db as typeof XYChartDB;\n const themeConfig = db.getChartThemeConfig();\n const chartConfig = db.getChartConfig();\n const labelData = db.getXYChartData().plots[0].data.map((data) => data[1]);\n function getDominantBaseLine(horizontalPos: TextVerticalPos) {\n return horizontalPos === 'top' ? 'text-before-edge' : 'middle';\n }\n\n function getTextAnchor(verticalPos: TextHorizontalPos) {\n return verticalPos === 'left' ? 'start' : verticalPos === 'right' ? 'end' : 'middle';\n }\n\n function getTextTransformation(data: TextElem) {\n return `translate(${data.x}, ${data.y}) rotate(${data.rotation || 0})`;\n }\n\n log.debug('Rendering xychart chart\\n' + txt);\n\n const svg = selectSvgElement(id);\n const group = svg.append('g').attr('class', 'main');\n const background = group\n .append('rect')\n .attr('width', chartConfig.width)\n .attr('height', chartConfig.height)\n .attr('class', 'background');\n\n // @ts-ignore: TODO Fix ts errors\n configureSvgSize(svg, chartConfig.height, chartConfig.width, true);\n\n svg.attr('viewBox', `0 0 ${chartConfig.width} ${chartConfig.height}`);\n\n background.attr('fill', themeConfig.backgroundColor);\n\n db.setTmpSVGG(svg.append('g').attr('class', 'mermaid-tmp-group'));\n\n const shapes: DrawableElem[] = db.getDrawableElem();\n\n const groups: Record = {};\n\n interface BarItem {\n data: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n label: string;\n }\n\n function getGroup(gList: string[]) {\n let elem = group;\n let prefix = '';\n for (const [i] of gList.entries()) {\n let parent = group;\n if (i > 0 && groups[prefix]) {\n parent = groups[prefix];\n }\n prefix += gList[i];\n elem = groups[prefix];\n if (!elem) {\n elem = groups[prefix] = parent.append('g').attr('class', gList[i]);\n }\n }\n return elem;\n }\n\n for (const shape of shapes) {\n if (shape.data.length === 0) {\n continue;\n }\n\n const shapeGroup = getGroup(shape.groupTexts);\n\n switch (shape.type) {\n case 'rect':\n shapeGroup\n .selectAll('rect')\n .data(shape.data)\n .enter()\n .append('rect')\n .attr('x', (data) => data.x)\n .attr('y', (data) => data.y)\n .attr('width', (data) => data.width)\n .attr('height', (data) => data.height)\n .attr('fill', (data) => data.fill)\n .attr('stroke', (data) => data.strokeFill)\n .attr('stroke-width', (data) => data.strokeWidth);\n\n if (chartConfig.showDataLabel) {\n if (chartConfig.chartOrientation === 'horizontal') {\n // Factor to approximate each character's width.\n const charWidthFactor = 0.7;\n\n // Filter out bars that have zero width or height.\n const validItems = shape.data\n .map((d, i) => ({ data: d, label: labelData[i].toString() }))\n .filter((item) => item.data.width > 0 && item.data.height > 0);\n\n // Helper function to check if the text fits horizontally with a 10px right margin.\n function fitsHorizontally(item: BarItem, fontSize: number): boolean {\n const { data, label } = item;\n // Approximate the text width.\n const textWidth: number = fontSize * label.length * charWidthFactor;\n // The available width is the bar's width minus a 10px right margin.\n return textWidth <= data.width - 10;\n }\n\n // For each valid bar, start with an initial candidate font size (70% of the bar's height),\n // then reduce it until the text fits horizontally.\n const candidateFontSizes = validItems.map((item) => {\n const { data } = item;\n let fontSize = data.height * 0.7;\n // Decrease fontSize until the text fits horizontally.\n while (!fitsHorizontally(item, fontSize) && fontSize > 0) {\n fontSize -= 1;\n }\n return fontSize;\n });\n\n // Choose the smallest candidate font size across all valid bars for uniformity.\n const uniformFontSize = Math.floor(Math.min(...candidateFontSizes));\n\n shapeGroup\n .selectAll('text')\n .data(validItems)\n .enter()\n .append('text')\n .attr('x', (item) => item.data.x + item.data.width - 10)\n .attr('y', (item) => item.data.y + item.data.height / 2)\n .attr('text-anchor', 'end')\n .attr('dominant-baseline', 'middle')\n .attr('fill', 'black')\n .attr('font-size', `${uniformFontSize}px`)\n .text((item) => item.label);\n } else {\n const yOffset = 10;\n\n // filter out bars that have zero width or height.\n const validItems = shape.data\n .map((d, i) => ({ data: d, label: labelData[i].toString() }))\n .filter((item) => item.data.width > 0 && item.data.height > 0);\n\n // Helper function that checks if the text with a given fontSize fits within the bar boundaries.\n function fitsInBar(item: BarItem, fontSize: number, yOffset: number): boolean {\n const { data, label } = item;\n const charWidthFactor = 0.7;\n const textWidth = fontSize * label.length * charWidthFactor;\n\n // Compute horizontal boundaries using the center.\n const centerX = data.x + data.width / 2;\n const leftEdge = centerX - textWidth / 2;\n const rightEdge = centerX + textWidth / 2;\n\n // Check that text doesn't overflow horizontally.\n const horizontalFits = leftEdge >= data.x && rightEdge <= data.x + data.width;\n\n // For vertical placement, we use 'dominant-baseline: hanging' so that y marks the top of the text.\n // Thus, the bottom edge is y + yOffset + fontSize.\n const verticalFits = data.y + yOffset + fontSize <= data.y + data.height;\n\n return horizontalFits && verticalFits;\n }\n\n // For each valid item, start with a candidate font size based on the width,\n // then reduce it until the text fits within both the horizontal and vertical boundaries.\n const candidateFontSizes = validItems.map((item) => {\n const { data, label } = item;\n let fontSize = data.width / (label.length * 0.7);\n\n // Decrease the font size until the text fits or fontSize reaches 0.\n while (!fitsInBar(item, fontSize, yOffset) && fontSize > 0) {\n fontSize -= 1;\n }\n return fontSize;\n });\n\n // Choose the smallest candidate across all valid bars for uniformity.\n const uniformFontSize = Math.floor(Math.min(...candidateFontSizes));\n\n // Render text only for valid items.\n shapeGroup\n .selectAll('text')\n .data(validItems)\n .enter()\n .append('text')\n .attr('x', (item) => item.data.x + item.data.width / 2)\n .attr('y', (item) => item.data.y + yOffset)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging')\n .attr('fill', 'black')\n .attr('font-size', `${uniformFontSize}px`)\n .text((item) => item.label);\n }\n }\n break;\n case 'text':\n shapeGroup\n .selectAll('text')\n .data(shape.data)\n .enter()\n .append('text')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', (data) => data.fill)\n .attr('font-size', (data) => data.fontSize)\n .attr('dominant-baseline', (data) => getDominantBaseLine(data.verticalPos))\n .attr('text-anchor', (data) => getTextAnchor(data.horizontalPos))\n .attr('transform', (data) => getTextTransformation(data))\n .text((data) => data.text);\n break;\n case 'path':\n shapeGroup\n .selectAll('path')\n .data(shape.data)\n .enter()\n .append('path')\n .attr('d', (data) => data.path)\n .attr('fill', (data) => (data.fill ? data.fill : 'none'))\n .attr('stroke', (data) => data.strokeFill)\n .attr('stroke-width', (data) => data.strokeWidth);\n break;\n }\n }\n};\n\nexport default {\n draw,\n};\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: Jison doesn't support types.\nimport parser from './parser/xychart.jison';\nimport db from './xychartDb.js';\nimport renderer from './xychartRenderer.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n};\n"], + "mappings": "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,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAE,KAAI,KAAI,EAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,GAAE,EAAC,GAAE,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,GAAE,CAAC,GAAE,CAAC,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,CAAC,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,IAAG,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAE,KAAI,CAAC,GAAE,EAAE,CAAC,GAAE,EAAC,IAAG,IAAG,IAAG,IAAG,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,GAAE,EAAC,IAAG,CAAC,GAAE,EAAE,EAAC,CAAC;AAAA,IACzlE,gBAAgB,EAAC,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,CAAC,GAAE,EAAE,GAAE,IAAG,CAAC,GAAE,EAAE,EAAC;AAAA,IAC9D,YAAY,gCAAS,WAAY,KAAK,MAAM;AACxC,UAAI,KAAK,aAAa;AAClB,aAAK,MAAM,GAAG;AAAA,MAClB,OAAO;AACH,YAAI,QAAQ,IAAI,MAAM,GAAG;AACzB,cAAM,OAAO;AACb,cAAM;AAAA,MACV;AAAA,IACJ,GARY;AAAA,IASZ,OAAO,gCAAS,MAAM,OAAO;AACzB,UAAI,OAAO,MAAM,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,QAAQ,KAAK,OAAO,SAAS,IAAI,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM;AACtK,UAAI,OAAO,OAAO,MAAM,KAAK,WAAW,CAAC;AACzC,UAAIC,SAAQ,OAAO,OAAO,KAAK,KAAK;AACpC,UAAI,cAAc,EAAE,IAAI,CAAC,EAAE;AAC3B,eAAS,KAAK,KAAK,IAAI;AACnB,YAAI,OAAO,UAAU,eAAe,KAAK,KAAK,IAAI,CAAC,GAAG;AAClD,sBAAY,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA,QACjC;AAAA,MACJ;AACA,MAAAA,OAAM,SAAS,OAAO,YAAY,EAAE;AACpC,kBAAY,GAAG,QAAQA;AACvB,kBAAY,GAAG,SAAS;AACxB,UAAI,OAAOA,OAAM,UAAU,aAAa;AACpC,QAAAA,OAAM,SAAS,CAAC;AAAA,MACpB;AACA,UAAI,QAAQA,OAAM;AAClB,aAAO,KAAK,KAAK;AACjB,UAAI,SAASA,OAAM,WAAWA,OAAM,QAAQ;AAC5C,UAAI,OAAO,YAAY,GAAG,eAAe,YAAY;AACjD,aAAK,aAAa,YAAY,GAAG;AAAA,MACrC,OAAO;AACH,aAAK,aAAa,OAAO,eAAe,IAAI,EAAE;AAAA,MAClD;AACA,eAAS,SAAS,GAAG;AACjB,cAAM,SAAS,MAAM,SAAS,IAAI;AAClC,eAAO,SAAS,OAAO,SAAS;AAChC,eAAO,SAAS,OAAO,SAAS;AAAA,MACpC;AAJS;AAKD,eAAS,MAAM;AACf,YAAI;AACJ,gBAAQ,OAAO,IAAI,KAAKA,OAAM,IAAI,KAAK;AACvC,YAAI,OAAO,UAAU,UAAU;AAC3B,cAAI,iBAAiB,OAAO;AACxB,qBAAS;AACT,oBAAQ,OAAO,IAAI;AAAA,UACvB;AACA,kBAAQ,KAAK,SAAS,KAAK,KAAK;AAAA,QACpC;AACA,eAAO;AAAA,MACX;AAXa;AAYjB,UAAI,QAAQ,gBAAgB,OAAO,QAAQ,GAAG,GAAG,QAAQ,CAAC,GAAG,GAAG,KAAK,UAAU;AAC/E,aAAO,MAAM;AACT,gBAAQ,MAAM,MAAM,SAAS,CAAC;AAC9B,YAAI,KAAK,eAAe,KAAK,GAAG;AAC5B,mBAAS,KAAK,eAAe,KAAK;AAAA,QACtC,OAAO;AACH,cAAI,WAAW,QAAQ,OAAO,UAAU,aAAa;AACjD,qBAAS,IAAI;AAAA,UACjB;AACA,mBAAS,MAAM,KAAK,KAAK,MAAM,KAAK,EAAE,MAAM;AAAA,QAChD;AACA,YAAI,OAAO,WAAW,eAAe,CAAC,OAAO,UAAU,CAAC,OAAO,CAAC,GAAG;AAC/D,cAAI,SAAS;AACb,qBAAW,CAAC;AACZ,eAAK,KAAK,MAAM,KAAK,GAAG;AACpB,gBAAI,KAAK,WAAW,CAAC,KAAK,IAAI,QAAQ;AAClC,uBAAS,KAAK,MAAO,KAAK,WAAW,CAAC,IAAI,GAAI;AAAA,YAClD;AAAA,UACJ;AACA,cAAIA,OAAM,cAAc;AACpB,qBAAS,0BAA0B,WAAW,KAAK,QAAQA,OAAM,aAAa,IAAI,iBAAiB,SAAS,KAAK,IAAI,IAAI,aAAc,KAAK,WAAW,MAAM,KAAK,UAAU;AAAA,UAChL,OAAO;AACH,qBAAS,0BAA0B,WAAW,KAAK,mBAAmB,UAAU,MAAM,iBAAiB,OAAQ,KAAK,WAAW,MAAM,KAAK,UAAU;AAAA,UACxJ;AACA,eAAK,WAAW,QAAQ;AAAA,YACpB,MAAMA,OAAM;AAAA,YACZ,OAAO,KAAK,WAAW,MAAM,KAAK;AAAA,YAClC,MAAMA,OAAM;AAAA,YACZ,KAAK;AAAA,YACL;AAAA,UACJ,CAAC;AAAA,QACL;AACA,YAAI,OAAO,CAAC,aAAa,SAAS,OAAO,SAAS,GAAG;AACjD,gBAAM,IAAI,MAAM,sDAAsD,QAAQ,cAAc,MAAM;AAAA,QACtG;AACA,gBAAQ,OAAO,CAAC,GAAG;AAAA,UACnB,KAAK;AACD,kBAAM,KAAK,MAAM;AACjB,mBAAO,KAAKA,OAAM,MAAM;AACxB,mBAAO,KAAKA,OAAM,MAAM;AACxB,kBAAM,KAAK,OAAO,CAAC,CAAC;AACpB,qBAAS;AACT,gBAAI,CAAC,gBAAgB;AACjB,uBAASA,OAAM;AACf,uBAASA,OAAM;AACf,yBAAWA,OAAM;AACjB,sBAAQA,OAAM;AACd,kBAAI,aAAa,GAAG;AAChB;AAAA,cACJ;AAAA,YACJ,OAAO;AACH,uBAAS;AACT,+BAAiB;AAAA,YACrB;AACA;AAAA,UACJ,KAAK;AACD,kBAAM,KAAK,aAAa,OAAO,CAAC,CAAC,EAAE,CAAC;AACpC,kBAAM,IAAI,OAAO,OAAO,SAAS,GAAG;AACpC,kBAAM,KAAK;AAAA,cACP,YAAY,OAAO,OAAO,UAAU,OAAO,EAAE,EAAE;AAAA,cAC/C,WAAW,OAAO,OAAO,SAAS,CAAC,EAAE;AAAA,cACrC,cAAc,OAAO,OAAO,UAAU,OAAO,EAAE,EAAE;AAAA,cACjD,aAAa,OAAO,OAAO,SAAS,CAAC,EAAE;AAAA,YAC3C;AACA,gBAAI,QAAQ;AACR,oBAAM,GAAG,QAAQ;AAAA,gBACb,OAAO,OAAO,UAAU,OAAO,EAAE,EAAE,MAAM,CAAC;AAAA,gBAC1C,OAAO,OAAO,SAAS,CAAC,EAAE,MAAM,CAAC;AAAA,cACrC;AAAA,YACJ;AACA,gBAAI,KAAK,cAAc,MAAM,OAAO;AAAA,cAChC;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY;AAAA,cACZ,OAAO,CAAC;AAAA,cACR;AAAA,cACA;AAAA,YACJ,EAAE,OAAO,IAAI,CAAC;AACd,gBAAI,OAAO,MAAM,aAAa;AAC1B,qBAAO;AAAA,YACX;AACA,gBAAI,KAAK;AACL,sBAAQ,MAAM,MAAM,GAAG,KAAK,MAAM,CAAC;AACnC,uBAAS,OAAO,MAAM,GAAG,KAAK,GAAG;AACjC,uBAAS,OAAO,MAAM,GAAG,KAAK,GAAG;AAAA,YACrC;AACA,kBAAM,KAAK,KAAK,aAAa,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1C,mBAAO,KAAK,MAAM,CAAC;AACnB,mBAAO,KAAK,MAAM,EAAE;AACpB,uBAAW,MAAM,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,MAAM,MAAM,SAAS,CAAC,CAAC;AACjE,kBAAM,KAAK,QAAQ;AACnB;AAAA,UACJ,KAAK;AACD,mBAAO;AAAA,QACX;AAAA,MACJ;AACA,aAAO;AAAA,IACX,GA3IO;AAAA,EA2IN;AAGD,MAAI,QAAS,4BAAU;AACvB,QAAIA,SAAS;AAAA,MAEb,KAAI;AAAA,MAEJ,YAAW,gCAAS,WAAW,KAAK,MAAM;AAClC,YAAI,KAAK,GAAG,QAAQ;AAChB,eAAK,GAAG,OAAO,WAAW,KAAK,IAAI;AAAA,QACvC,OAAO;AACH,gBAAM,IAAI,MAAM,GAAG;AAAA,QACvB;AAAA,MACJ,GANO;AAAA;AAAA,MASX,UAAS,gCAAU,OAAO,IAAI;AACtB,aAAK,KAAK,MAAM,KAAK,MAAM,CAAC;AAC5B,aAAK,SAAS;AACd,aAAK,QAAQ,KAAK,aAAa,KAAK,OAAO;AAC3C,aAAK,WAAW,KAAK,SAAS;AAC9B,aAAK,SAAS,KAAK,UAAU,KAAK,QAAQ;AAC1C,aAAK,iBAAiB,CAAC,SAAS;AAChC,aAAK,SAAS;AAAA,UACV,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,WAAW;AAAA,UACX,aAAa;AAAA,QACjB;AACA,YAAI,KAAK,QAAQ,QAAQ;AACrB,eAAK,OAAO,QAAQ,CAAC,GAAE,CAAC;AAAA,QAC5B;AACA,aAAK,SAAS;AACd,eAAO;AAAA,MACX,GAlBK;AAAA;AAAA,MAqBT,OAAM,kCAAY;AACV,YAAI,KAAK,KAAK,OAAO,CAAC;AACtB,aAAK,UAAU;AACf,aAAK;AACL,aAAK;AACL,aAAK,SAAS;AACd,aAAK,WAAW;AAChB,YAAI,QAAQ,GAAG,MAAM,iBAAiB;AACtC,YAAI,OAAO;AACP,eAAK;AACL,eAAK,OAAO;AAAA,QAChB,OAAO;AACH,eAAK,OAAO;AAAA,QAChB;AACA,YAAI,KAAK,QAAQ,QAAQ;AACrB,eAAK,OAAO,MAAM,CAAC;AAAA,QACvB;AAEA,aAAK,SAAS,KAAK,OAAO,MAAM,CAAC;AACjC,eAAO;AAAA,MACX,GApBE;AAAA;AAAA,MAuBN,OAAM,gCAAU,IAAI;AACZ,YAAI,MAAM,GAAG;AACb,YAAI,QAAQ,GAAG,MAAM,eAAe;AAEpC,aAAK,SAAS,KAAK,KAAK;AACxB,aAAK,SAAS,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,SAAS,GAAG;AAE5D,aAAK,UAAU;AACf,YAAI,WAAW,KAAK,MAAM,MAAM,eAAe;AAC/C,aAAK,QAAQ,KAAK,MAAM,OAAO,GAAG,KAAK,MAAM,SAAS,CAAC;AACvD,aAAK,UAAU,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,SAAS,CAAC;AAE7D,YAAI,MAAM,SAAS,GAAG;AAClB,eAAK,YAAY,MAAM,SAAS;AAAA,QACpC;AACA,YAAI,IAAI,KAAK,OAAO;AAEpB,aAAK,SAAS;AAAA,UACV,YAAY,KAAK,OAAO;AAAA,UACxB,WAAW,KAAK,WAAW;AAAA,UAC3B,cAAc,KAAK,OAAO;AAAA,UAC1B,aAAa,SACR,MAAM,WAAW,SAAS,SAAS,KAAK,OAAO,eAAe,KAC5D,SAAS,SAAS,SAAS,MAAM,MAAM,EAAE,SAAS,MAAM,CAAC,EAAE,SAChE,KAAK,OAAO,eAAe;AAAA,QACjC;AAEA,YAAI,KAAK,QAAQ,QAAQ;AACrB,eAAK,OAAO,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,SAAS,GAAG;AAAA,QACvD;AACA,aAAK,SAAS,KAAK,OAAO;AAC1B,eAAO;AAAA,MACX,GAhCE;AAAA;AAAA,MAmCN,MAAK,kCAAY;AACT,aAAK,QAAQ;AACb,eAAO;AAAA,MACX,GAHC;AAAA;AAAA,MAML,QAAO,kCAAY;AACX,YAAI,KAAK,QAAQ,iBAAiB;AAC9B,eAAK,aAAa;AAAA,QACtB,OAAO;AACH,iBAAO,KAAK,WAAW,4BAA4B,KAAK,WAAW,KAAK,qIAAqI,KAAK,aAAa,GAAG;AAAA,YAC9N,MAAM;AAAA,YACN,OAAO;AAAA,YACP,MAAM,KAAK;AAAA,UACf,CAAC;AAAA,QAEL;AACA,eAAO;AAAA,MACX,GAZG;AAAA;AAAA,MAeP,MAAK,gCAAU,GAAG;AACV,aAAK,MAAM,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,MAClC,GAFC;AAAA;AAAA,MAKL,WAAU,kCAAY;AACd,YAAI,OAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,SAAS,KAAK,MAAM,MAAM;AACzE,gBAAQ,KAAK,SAAS,KAAK,QAAM,MAAM,KAAK,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE;AAAA,MAC7E,GAHM;AAAA;AAAA,MAMV,eAAc,kCAAY;AAClB,YAAI,OAAO,KAAK;AAChB,YAAI,KAAK,SAAS,IAAI;AAClB,kBAAQ,KAAK,OAAO,OAAO,GAAG,KAAG,KAAK,MAAM;AAAA,QAChD;AACA,gBAAQ,KAAK,OAAO,GAAE,EAAE,KAAK,KAAK,SAAS,KAAK,QAAQ,KAAK,QAAQ,OAAO,EAAE;AAAA,MAClF,GANU;AAAA;AAAA,MASd,cAAa,kCAAY;AACjB,YAAI,MAAM,KAAK,UAAU;AACzB,YAAI,IAAI,IAAI,MAAM,IAAI,SAAS,CAAC,EAAE,KAAK,GAAG;AAC1C,eAAO,MAAM,KAAK,cAAc,IAAI,OAAO,IAAI;AAAA,MACnD,GAJS;AAAA;AAAA,MAOb,YAAW,gCAAS,OAAO,cAAc;AACjC,YAAI,OACA,OACA;AAEJ,YAAI,KAAK,QAAQ,iBAAiB;AAE9B,mBAAS;AAAA,YACL,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,cACJ,YAAY,KAAK,OAAO;AAAA,cACxB,WAAW,KAAK;AAAA,cAChB,cAAc,KAAK,OAAO;AAAA,cAC1B,aAAa,KAAK,OAAO;AAAA,YAC7B;AAAA,YACA,QAAQ,KAAK;AAAA,YACb,OAAO,KAAK;AAAA,YACZ,SAAS,KAAK;AAAA,YACd,SAAS,KAAK;AAAA,YACd,QAAQ,KAAK;AAAA,YACb,QAAQ,KAAK;AAAA,YACb,OAAO,KAAK;AAAA,YACZ,QAAQ,KAAK;AAAA,YACb,IAAI,KAAK;AAAA,YACT,gBAAgB,KAAK,eAAe,MAAM,CAAC;AAAA,YAC3C,MAAM,KAAK;AAAA,UACf;AACA,cAAI,KAAK,QAAQ,QAAQ;AACrB,mBAAO,OAAO,QAAQ,KAAK,OAAO,MAAM,MAAM,CAAC;AAAA,UACnD;AAAA,QACJ;AAEA,gBAAQ,MAAM,CAAC,EAAE,MAAM,iBAAiB;AACxC,YAAI,OAAO;AACP,eAAK,YAAY,MAAM;AAAA,QAC3B;AACA,aAAK,SAAS;AAAA,UACV,YAAY,KAAK,OAAO;AAAA,UACxB,WAAW,KAAK,WAAW;AAAA,UAC3B,cAAc,KAAK,OAAO;AAAA,UAC1B,aAAa,QACA,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,MAAM,MAAM,SAAS,CAAC,EAAE,MAAM,QAAQ,EAAE,CAAC,EAAE,SAC5E,KAAK,OAAO,cAAc,MAAM,CAAC,EAAE;AAAA,QACpD;AACA,aAAK,UAAU,MAAM,CAAC;AACtB,aAAK,SAAS,MAAM,CAAC;AACrB,aAAK,UAAU;AACf,aAAK,SAAS,KAAK,OAAO;AAC1B,YAAI,KAAK,QAAQ,QAAQ;AACrB,eAAK,OAAO,QAAQ,CAAC,KAAK,QAAQ,KAAK,UAAU,KAAK,MAAM;AAAA,QAChE;AACA,aAAK,QAAQ;AACb,aAAK,aAAa;AAClB,aAAK,SAAS,KAAK,OAAO,MAAM,MAAM,CAAC,EAAE,MAAM;AAC/C,aAAK,WAAW,MAAM,CAAC;AACvB,gBAAQ,KAAK,cAAc,KAAK,MAAM,KAAK,IAAI,MAAM,cAAc,KAAK,eAAe,KAAK,eAAe,SAAS,CAAC,CAAC;AACtH,YAAI,KAAK,QAAQ,KAAK,QAAQ;AAC1B,eAAK,OAAO;AAAA,QAChB;AACA,YAAI,OAAO;AACP,iBAAO;AAAA,QACX,WAAW,KAAK,YAAY;AAExB,mBAAS,KAAK,QAAQ;AAClB,iBAAK,CAAC,IAAI,OAAO,CAAC;AAAA,UACtB;AACA,iBAAO;AAAA,QACX;AACA,eAAO;AAAA,MACX,GArEO;AAAA;AAAA,MAwEX,MAAK,kCAAY;AACT,YAAI,KAAK,MAAM;AACX,iBAAO,KAAK;AAAA,QAChB;AACA,YAAI,CAAC,KAAK,QAAQ;AACd,eAAK,OAAO;AAAA,QAChB;AAEA,YAAI,OACA,OACA,WACA;AACJ,YAAI,CAAC,KAAK,OAAO;AACb,eAAK,SAAS;AACd,eAAK,QAAQ;AAAA,QACjB;AACA,YAAI,QAAQ,KAAK,cAAc;AAC/B,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,sBAAY,KAAK,OAAO,MAAM,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC;AAClD,cAAI,cAAc,CAAC,SAAS,UAAU,CAAC,EAAE,SAAS,MAAM,CAAC,EAAE,SAAS;AAChE,oBAAQ;AACR,oBAAQ;AACR,gBAAI,KAAK,QAAQ,iBAAiB;AAC9B,sBAAQ,KAAK,WAAW,WAAW,MAAM,CAAC,CAAC;AAC3C,kBAAI,UAAU,OAAO;AACjB,uBAAO;AAAA,cACX,WAAW,KAAK,YAAY;AACxB,wBAAQ;AACR;AAAA,cACJ,OAAO;AAEH,uBAAO;AAAA,cACX;AAAA,YACJ,WAAW,CAAC,KAAK,QAAQ,MAAM;AAC3B;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AACA,YAAI,OAAO;AACP,kBAAQ,KAAK,WAAW,OAAO,MAAM,KAAK,CAAC;AAC3C,cAAI,UAAU,OAAO;AACjB,mBAAO;AAAA,UACX;AAEA,iBAAO;AAAA,QACX;AACA,YAAI,KAAK,WAAW,IAAI;AACpB,iBAAO,KAAK;AAAA,QAChB,OAAO;AACH,iBAAO,KAAK,WAAW,4BAA4B,KAAK,WAAW,KAAK,2BAA2B,KAAK,aAAa,GAAG;AAAA,YACpH,MAAM;AAAA,YACN,OAAO;AAAA,YACP,MAAM,KAAK;AAAA,UACf,CAAC;AAAA,QACL;AAAA,MACJ,GAvDC;AAAA;AAAA,MA0DL,KAAI,gCAAS,MAAO;AACZ,YAAI,IAAI,KAAK,KAAK;AAClB,YAAI,GAAG;AACH,iBAAO;AAAA,QACX,OAAO;AACH,iBAAO,KAAK,IAAI;AAAA,QACpB;AAAA,MACJ,GAPA;AAAA;AAAA,MAUJ,OAAM,gCAAS,MAAO,WAAW;AACzB,aAAK,eAAe,KAAK,SAAS;AAAA,MACtC,GAFE;AAAA;AAAA,MAKN,UAAS,gCAAS,WAAY;AACtB,YAAI,IAAI,KAAK,eAAe,SAAS;AACrC,YAAI,IAAI,GAAG;AACP,iBAAO,KAAK,eAAe,IAAI;AAAA,QACnC,OAAO;AACH,iBAAO,KAAK,eAAe,CAAC;AAAA,QAChC;AAAA,MACJ,GAPK;AAAA;AAAA,MAUT,eAAc,gCAAS,gBAAiB;AAChC,YAAI,KAAK,eAAe,UAAU,KAAK,eAAe,KAAK,eAAe,SAAS,CAAC,GAAG;AACnF,iBAAO,KAAK,WAAW,KAAK,eAAe,KAAK,eAAe,SAAS,CAAC,CAAC,EAAE;AAAA,QAChF,OAAO;AACH,iBAAO,KAAK,WAAW,SAAS,EAAE;AAAA,QACtC;AAAA,MACJ,GANU;AAAA;AAAA,MASd,UAAS,gCAAS,SAAU,GAAG;AACvB,YAAI,KAAK,eAAe,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC;AACpD,YAAI,KAAK,GAAG;AACR,iBAAO,KAAK,eAAe,CAAC;AAAA,QAChC,OAAO;AACH,iBAAO;AAAA,QACX;AAAA,MACJ,GAPK;AAAA;AAAA,MAUT,WAAU,gCAAS,UAAW,WAAW;AACjC,aAAK,MAAM,SAAS;AAAA,MACxB,GAFM;AAAA;AAAA,MAKV,gBAAe,gCAAS,iBAAiB;AACjC,eAAO,KAAK,eAAe;AAAA,MAC/B,GAFW;AAAA,MAGf,SAAS,EAAC,oBAAmB,KAAI;AAAA,MACjC,eAAe,gCAAS,UAAU,IAAG,KAAI,2BAA0B,UAAU;AAC7E,YAAI,UAAQ;AACZ,gBAAO,2BAA2B;AAAA,UAClC,KAAK;AACL;AAAA,UACA,KAAK;AACL;AAAA,UACA,KAAK;AAAG,iBAAK,SAAS;AAAG,mBAAO;AAChC;AAAA,UACA,KAAK;AAAG,iBAAK,SAAS;AAAG,mBAAO;AAChC;AAAA,UACA,KAAK;AAAE,mBAAO;AACd;AAAA,UACA,KAAK;AACL;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,iBAAK,UAAU,WAAW;AAAE,mBAAO;AAC3C;AAAA,UACA,KAAK;AAAG,iBAAK,SAAS;AAAG,mBAAO;AAChC;AAAA,UACA,KAAK;AAAG,iBAAK,UAAU,WAAW;AAAE,mBAAO;AAC3C;AAAA,UACA,KAAK;AAAI,iBAAK,SAAS;AAAG,mBAAO;AACjC;AAAA,UACA,KAAK;AAAI,iBAAK,UAAU,qBAAqB;AAC7C;AAAA,UACA,KAAK;AAAI,iBAAK,SAAS;AACvB;AAAA,UACA,KAAK;AAAI,mBAAO;AAChB;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAI,iBAAK,UAAU,WAAW;AAAG,mBAAO;AAC7C;AAAA,UACA,KAAK;AAAI,iBAAK,UAAU,WAAW;AAAG,mBAAO;AAC7C;AAAA,UACA,KAAK;AAAI,iBAAK,UAAU,gBAAgB;AAAG,mBAAO;AAClD;AAAA,UACA,KAAK;AAAI,mBAAO;AAChB;AAAA,UACA,KAAK;AAAI,iBAAK,UAAU,MAAM;AAAG,mBAAO;AACxC;AAAA,UACA,KAAK;AAAI,iBAAK,UAAU,MAAM;AAAG,mBAAO;AACxC;AAAA,UACA,KAAK;AAAI,iBAAK,UAAU,YAAY;AAAG,mBAAO;AAC9C;AAAA,UACA,KAAK;AAAI,mBAAO;AAChB;AAAA,UACA,KAAK;AAAI,iBAAK,SAAS;AAAG,mBAAO;AACjC;AAAA,UACA,KAAK;AAAI,iBAAK,SAAS;AACvB;AAAA,UACA,KAAK;AAAG,iBAAK,UAAU,QAAQ;AAC/B;AAAA,UACA,KAAK;AAAG,iBAAK,SAAS;AACtB;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AACL;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,UACA,KAAK;AAAG,mBAAO;AACf;AAAA,QACA;AAAA,MACA,GAlGe;AAAA,MAmGf,OAAO,CAAC,wBAAuB,uBAAsB,iBAAgB,iBAAgB,iBAAgB,kBAAiB,iBAAgB,yBAAwB,yBAAwB,yBAAwB,yBAAwB,0BAAyB,YAAW,gBAAe,wBAAuB,mBAAkB,iCAAgC,kBAAiB,kBAAiB,YAAW,aAAY,gBAAe,eAAc,YAAW,sCAAqC,YAAW,kLAAiL,aAAY,aAAY,eAAc,YAAW,YAAW,mBAAkB,WAAU,YAAW,WAAU,WAAU,YAAW,WAAU,cAAa,YAAW,WAAU,WAAU,gBAAe,aAAY,WAAU,SAAS;AAAA,MAC14B,YAAY,EAAC,cAAa,EAAC,SAAQ,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,aAAY,KAAI,GAAE,QAAO,EAAC,SAAQ,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,aAAY,KAAI,GAAE,kBAAiB,EAAC,SAAQ,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,aAAY,KAAI,GAAE,aAAY,EAAC,SAAQ,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,aAAY,KAAI,GAAE,uBAAsB,EAAC,SAAQ,CAAC,IAAG,EAAE,GAAE,aAAY,MAAK,GAAE,aAAY,EAAC,SAAQ,CAAC,EAAE,GAAE,aAAY,MAAK,GAAE,aAAY,EAAC,SAAQ,CAAC,CAAC,GAAE,aAAY,MAAK,GAAE,SAAQ,EAAC,SAAQ,CAAC,GAAE,aAAY,MAAK,GAAE,aAAY,EAAC,SAAQ,CAAC,GAAE,aAAY,MAAK,GAAE,UAAS,EAAC,SAAQ,CAAC,IAAG,EAAE,GAAE,aAAY,MAAK,GAAE,WAAU,EAAC,SAAQ,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,EAAE,GAAE,aAAY,KAAI,EAAC;AAAA,IAC99B;AACA,WAAOA;AAAA,EACP,GAAG;AACH,EAAAD,QAAO,QAAQ;AACf,WAAS,SAAU;AACjB,SAAK,KAAK,CAAC;AAAA,EACb;AAFS;AAGT,SAAO,YAAYA;AAAO,EAAAA,QAAO,SAAS;AAC1C,SAAO,IAAI;AACX,GAAG;AACF,OAAO,SAAS;AAEhB,IAAO,kBAAQ;;;AC7sBT,SAAS,UAAU,MAAqC;AAC7D,SAAO,KAAK,SAAS;AACvB;AAFgB;AAmBT,SAAS,eAAe,MAA8C;AAC3E,SAAO,KAAK,SAAS;AACvB;AAFgB;AAIT,SAAS,iBAAiB,MAAgD;AAC/E,SAAO,KAAK,SAAS;AACvB;AAFgB;;;AC3DT,IAAM,kCAAN,MAAyE;AAAA,EAC9E,YAAoB,aAAuB;AAAvB;AAAA,EAAwB;AAAA,EAT9C,OAQgF;AAAA;AAAA;AAAA,EAE9E,gBAAgB,OAAiB,UAA6B;AAC5D,QAAI,CAAC,KAAK,aAAa;AACrB,aAAO;AAAA,QACL,OAAO,MAAM,OAAO,CAAC,KAAK,QAAQ,KAAK,IAAI,IAAI,QAAQ,GAAG,GAAG,CAAC,IAAI;AAAA,QAClE,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,YAAuB;AAAA,MAC3B,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAEA,UAAM,OAAO,KAAK,YACf,OAAO,GAAG,EACV,KAAK,cAAc,QAAQ,EAC3B,KAAK,aAAa,QAAQ;AAE7B,eAAW,KAAK,OAAO;AACrB,YAAM,OAAO,uBAAuB,MAAM,GAAG,CAAC;AAC9C,YAAM,QAAQ,OAAO,KAAK,QAAQ,EAAE,SAAS;AAC7C,YAAM,SAAS,OAAO,KAAK,SAAS;AACpC,gBAAU,QAAQ,KAAK,IAAI,UAAU,OAAO,KAAK;AACjD,gBAAU,SAAS,KAAK,IAAI,UAAU,QAAQ,MAAM;AAAA,IACtD;AACA,SAAK,OAAO;AACZ,WAAO;AAAA,EACT;AACF;;;ACrCA,SAAS,iBAAiB;;;ACU1B,IAAM,gCAAgC;AACtC,IAAM,0CAA0C;AAEzC,IAAe,WAAf,MAAwC;AAAA,EAY7C,YACY,YACA,OACA,yBACA,iBACV;AAJU;AACA;AACA;AACA;AAfZ,SAAU,eAA6B,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AACzE,SAAU,eAA6B;AAEvC,SAAU,YAAY;AACtB,SAAU,YAAY;AACtB,SAAU,WAAW;AACrB,SAAU,eAAe;AACzB,SAAU,eAAe;AACzB,SAAU,kBAAkB;AAC5B,SAAU,kBAAkB;AAQ1B,SAAK,QAAQ,CAAC,GAAG,EAAE;AACnB,SAAK,eAAe,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AACtD,SAAK,eAAe;AAAA,EACtB;AAAA,EAnCF,OAc+C;AAAA;AAAA;AAAA,EAuB7C,SAAS,OAA+B;AACtC,SAAK,QAAQ;AACb,QAAI,KAAK,iBAAiB,UAAU,KAAK,iBAAiB,SAAS;AACjE,WAAK,aAAa,SAAS,MAAM,CAAC,IAAI,MAAM,CAAC;AAAA,IAC/C,OAAO;AACL,WAAK,aAAa,QAAQ,MAAM,CAAC,IAAI,MAAM,CAAC;AAAA,IAC9C;AACA,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,WAA6B;AAC3B,WAAO,CAAC,KAAK,MAAM,CAAC,IAAI,KAAK,cAAc,KAAK,MAAM,CAAC,IAAI,KAAK,YAAY;AAAA,EAC9E;AAAA,EAEA,gBAAgB,cAAkC;AAChD,SAAK,eAAe;AACpB,SAAK,SAAS,KAAK,KAAK;AAAA,EAC1B;AAAA,EAQA,kBAA0B;AACxB,UAAM,QAAQ,KAAK,SAAS;AAC5B,WAAO,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,KAAK,cAAc,EAAE;AAAA,EAC9D;AAAA,EAEA,sBAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,oBAA+B;AACrC,WAAO,KAAK,wBAAwB;AAAA,MAClC,KAAK,cAAc,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;AAAA,MAClD,KAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,mCAAyC;AACvC,QAAI,gCAAgC,KAAK,gBAAgB,IAAI,KAAK,eAAe,GAAG;AAClF,WAAK,eAAe,KAAK,MAAO,gCAAgC,KAAK,gBAAgB,IAAK,CAAC;AAAA,IAC7F;AACA,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,kCAAkC,gBAA2B;AACnE,QAAI,kBAAkB,eAAe;AACrC,QAAI,KAAK,WAAW,gBAAgB,kBAAkB,KAAK,WAAW,eAAe;AACnF,yBAAmB,KAAK,WAAW;AACnC,WAAK,eAAe;AAAA,IACtB;AACA,QAAI,KAAK,WAAW,WAAW;AAC7B,YAAM,gBAAgB,KAAK,kBAAkB;AAC7C,YAAM,aAAa,0CAA0C,eAAe;AAC5E,WAAK,eAAe,KAAK,IAAI,cAAc,QAAQ,GAAG,UAAU;AAEhE,YAAM,iBAAiB,cAAc,SAAS,KAAK,WAAW,eAAe;AAC7E,WAAK,kBAAkB,cAAc;AACrC,UAAI,kBAAkB,iBAAiB;AACrC,2BAAmB;AACnB,aAAK,YAAY;AAAA,MACnB;AAAA,IACF;AACA,QAAI,KAAK,WAAW,YAAY,mBAAmB,KAAK,WAAW,YAAY;AAC7E,WAAK,WAAW;AAChB,yBAAmB,KAAK,WAAW;AAAA,IACrC;AACA,QAAI,KAAK,WAAW,aAAa,KAAK,OAAO;AAC3C,YAAM,gBAAgB,KAAK,wBAAwB;AAAA,QACjD,CAAC,KAAK,KAAK;AAAA,QACX,KAAK,WAAW;AAAA,MAClB;AACA,YAAM,iBAAiB,cAAc,SAAS,KAAK,WAAW,eAAe;AAC7E,WAAK,kBAAkB,cAAc;AACrC,UAAI,kBAAkB,iBAAiB;AACrC,2BAAmB;AACnB,aAAK,YAAY;AAAA,MACnB;AAAA,IACF;AACA,SAAK,aAAa,QAAQ,eAAe;AACzC,SAAK,aAAa,SAAS,eAAe,SAAS;AAAA,EACrD;AAAA,EAEQ,8BAA8B,gBAA2B;AAC/D,QAAI,iBAAiB,eAAe;AACpC,QAAI,KAAK,WAAW,gBAAgB,iBAAiB,KAAK,WAAW,eAAe;AAClF,wBAAkB,KAAK,WAAW;AAClC,WAAK,eAAe;AAAA,IACtB;AACA,QAAI,KAAK,WAAW,WAAW;AAC7B,YAAM,gBAAgB,KAAK,kBAAkB;AAC7C,YAAM,aAAa,0CAA0C,eAAe;AAC5E,WAAK,eAAe,KAAK,IAAI,cAAc,SAAS,GAAG,UAAU;AACjE,YAAM,gBAAgB,cAAc,QAAQ,KAAK,WAAW,eAAe;AAC3E,UAAI,iBAAiB,gBAAgB;AACnC,0BAAkB;AAClB,aAAK,YAAY;AAAA,MACnB;AAAA,IACF;AACA,QAAI,KAAK,WAAW,YAAY,kBAAkB,KAAK,WAAW,YAAY;AAC5E,WAAK,WAAW;AAChB,wBAAkB,KAAK,WAAW;AAAA,IACpC;AACA,QAAI,KAAK,WAAW,aAAa,KAAK,OAAO;AAC3C,YAAM,gBAAgB,KAAK,wBAAwB;AAAA,QACjD,CAAC,KAAK,KAAK;AAAA,QACX,KAAK,WAAW;AAAA,MAClB;AACA,YAAM,gBAAgB,cAAc,SAAS,KAAK,WAAW,eAAe;AAC5E,WAAK,kBAAkB,cAAc;AACrC,UAAI,iBAAiB,gBAAgB;AACnC,0BAAkB;AAClB,aAAK,YAAY;AAAA,MACnB;AAAA,IACF;AACA,SAAK,aAAa,QAAQ,eAAe,QAAQ;AACjD,SAAK,aAAa,SAAS,eAAe;AAAA,EAC5C;AAAA,EAEA,eAAe,gBAAsC;AACnD,QAAI,KAAK,iBAAiB,UAAU,KAAK,iBAAiB,SAAS;AACjE,WAAK,8BAA8B,cAAc;AAAA,IACnD,OAAO;AACL,WAAK,kCAAkC,cAAc;AAAA,IACvD;AACA,SAAK,iBAAiB;AACtB,WAAO;AAAA,MACL,OAAO,KAAK,aAAa;AAAA,MACzB,QAAQ,KAAK,aAAa;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,iBAAiB,OAAoB;AACnC,SAAK,aAAa,IAAI,MAAM;AAC5B,SAAK,aAAa,IAAI,MAAM;AAAA,EAC9B;AAAA,EAEQ,iCAAiD;AACvD,UAAM,kBAAkC,CAAC;AACzC,QAAI,KAAK,cAAc;AACrB,YAAM,IAAI,KAAK,aAAa,IAAI,KAAK,aAAa,QAAQ,KAAK,WAAW,gBAAgB;AAC1F,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,aAAa,YAAY;AAAA,QACtC,MAAM;AAAA,UACJ;AAAA,YACE,MAAM,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,MAAM,CAAC,IACxC,KAAK,aAAa,IAAI,KAAK,aAAa,MAC1C;AAAA,YACA,YAAY,KAAK,gBAAgB;AAAA,YACjC,aAAa,KAAK,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,KAAK,WAAW;AAClB,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,aAAa,OAAO;AAAA,QACjC,MAAM,KAAK,cAAc,EAAE,IAAI,CAAC,UAAU;AAAA,UACxC,MAAM,KAAK,SAAS;AAAA,UACpB,GACE,KAAK,aAAa,IAClB,KAAK,aAAa,SACjB,KAAK,YAAY,KAAK,WAAW,eAAe,MAChD,KAAK,WAAW,KAAK,WAAW,aAAa,MAC7C,KAAK,eAAe,KAAK,WAAW,gBAAgB;AAAA,UACvD,GAAG,KAAK,cAAc,IAAI;AAAA,UAC1B,MAAM,KAAK,gBAAgB;AAAA,UAC3B,UAAU,KAAK,WAAW;AAAA,UAC1B,UAAU;AAAA,UACV,aAAa;AAAA,UACb,eAAe;AAAA,QACjB,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,QAAI,KAAK,UAAU;AACjB,YAAM,IACJ,KAAK,aAAa,IAClB,KAAK,aAAa,SACjB,KAAK,eAAe,KAAK,WAAW,gBAAgB;AACvD,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,aAAa,OAAO;AAAA,QACjC,MAAM,KAAK,cAAc,EAAE,IAAI,CAAC,UAAU;AAAA,UACxC,MAAM,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,MACtC,IAAI,KAAK,WAAW,UACtB,IAAI,KAAK,cAAc,IAAI,CAAC;AAAA,UAC5B,YAAY,KAAK,gBAAgB;AAAA,UACjC,aAAa,KAAK,WAAW;AAAA,QAC/B,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,QAAI,KAAK,WAAW;AAClB,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,aAAa,OAAO;AAAA,QACjC,MAAM;AAAA,UACJ;AAAA,YACE,MAAM,KAAK;AAAA,YACX,GAAG,KAAK,aAAa,IAAI,KAAK,WAAW;AAAA,YACzC,GAAG,KAAK,aAAa,IAAI,KAAK,aAAa,SAAS;AAAA,YACpD,MAAM,KAAK,gBAAgB;AAAA,YAC3B,UAAU,KAAK,WAAW;AAAA,YAC1B,UAAU;AAAA,YACV,aAAa;AAAA,YACb,eAAe;AAAA,UACjB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EACQ,mCAAmD;AACzD,UAAM,kBAAkC,CAAC;AACzC,QAAI,KAAK,cAAc;AACrB,YAAM,IAAI,KAAK,aAAa,IAAI,KAAK,WAAW,gBAAgB;AAChE,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,eAAe,WAAW;AAAA,QACvC,MAAM;AAAA,UACJ;AAAA,YACE,MAAM,KAAK,KAAK,aAAa,CAAC,IAAI,CAAC,MACjC,KAAK,aAAa,IAAI,KAAK,aAAa,KAC1C,IAAI,CAAC;AAAA,YACL,YAAY,KAAK,gBAAgB;AAAA,YACjC,aAAa,KAAK,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,KAAK,WAAW;AAClB,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,eAAe,OAAO;AAAA,QACnC,MAAM,KAAK,cAAc,EAAE,IAAI,CAAC,UAAU;AAAA,UACxC,MAAM,KAAK,SAAS;AAAA,UACpB,GAAG,KAAK,cAAc,IAAI;AAAA,UAC1B,GACE,KAAK,aAAa,IAClB,KAAK,WAAW,gBACf,KAAK,WAAW,KAAK,WAAW,aAAa,MAC7C,KAAK,eAAe,KAAK,WAAW,gBAAgB;AAAA,UACvD,MAAM,KAAK,gBAAgB;AAAA,UAC3B,UAAU,KAAK,WAAW;AAAA,UAC1B,UAAU;AAAA,UACV,aAAa;AAAA,UACb,eAAe;AAAA,QACjB,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,KAAK,aAAa,KAAK,KAAK,eAAe,KAAK,WAAW,gBAAgB;AACrF,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,eAAe,OAAO;AAAA,QACnC,MAAM,KAAK,cAAc,EAAE,IAAI,CAAC,UAAU;AAAA,UACxC,MAAM,KAAK,KAAK,cAAc,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,IACpE,IAAI,KAAK,WAAW,UACtB;AAAA,UACA,YAAY,KAAK,gBAAgB;AAAA,UACjC,aAAa,KAAK,WAAW;AAAA,QAC/B,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,QAAI,KAAK,WAAW;AAClB,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,eAAe,OAAO;AAAA,QACnC,MAAM;AAAA,UACJ;AAAA,YACE,MAAM,KAAK;AAAA,YACX,GAAG,KAAK,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK;AAAA,YACrD,GACE,KAAK,aAAa,IAClB,KAAK,aAAa,SAClB,KAAK,WAAW,eAChB,KAAK;AAAA,YACP,MAAM,KAAK,gBAAgB;AAAA,YAC3B,UAAU,KAAK,WAAW;AAAA,YAC1B,UAAU;AAAA,YACV,aAAa;AAAA,YACb,eAAe;AAAA,UACjB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EACQ,gCAAgD;AACtD,UAAM,kBAAkC,CAAC;AACzC,QAAI,KAAK,cAAc;AACrB,YAAM,IAAI,KAAK,aAAa,IAAI,KAAK,aAAa,SAAS,KAAK,WAAW,gBAAgB;AAC3F,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,YAAY,WAAW;AAAA,QACpC,MAAM;AAAA,UACJ;AAAA,YACE,MAAM,KAAK,KAAK,aAAa,CAAC,IAAI,CAAC,MACjC,KAAK,aAAa,IAAI,KAAK,aAAa,KAC1C,IAAI,CAAC;AAAA,YACL,YAAY,KAAK,gBAAgB;AAAA,YACjC,aAAa,KAAK,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,KAAK,WAAW;AAClB,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,YAAY,OAAO;AAAA,QAChC,MAAM,KAAK,cAAc,EAAE,IAAI,CAAC,UAAU;AAAA,UACxC,MAAM,KAAK,SAAS;AAAA,UACpB,GAAG,KAAK,cAAc,IAAI;AAAA,UAC1B,GACE,KAAK,aAAa,KACjB,KAAK,YAAY,KAAK,kBAAkB,KAAK,WAAW,eAAe,IAAI,KAC5E,KAAK,WAAW;AAAA,UAClB,MAAM,KAAK,gBAAgB;AAAA,UAC3B,UAAU,KAAK,WAAW;AAAA,UAC1B,UAAU;AAAA,UACV,aAAa;AAAA,UACb,eAAe;AAAA,QACjB,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,KAAK,aAAa;AAC5B,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,YAAY,OAAO;AAAA,QAChC,MAAM,KAAK,cAAc,EAAE,IAAI,CAAC,UAAU;AAAA,UACxC,MAAM,KAAK,KAAK,cAAc,IAAI,CAAC,IACjC,IAAI,KAAK,aAAa,UAAU,KAAK,eAAe,KAAK,WAAW,gBAAgB,EACtF,MAAM,KAAK,cAAc,IAAI,CAAC,IAC5B,IACA,KAAK,aAAa,SAClB,KAAK,WAAW,cACf,KAAK,eAAe,KAAK,WAAW,gBAAgB,EACvD;AAAA,UACA,YAAY,KAAK,gBAAgB;AAAA,UACjC,aAAa,KAAK,WAAW;AAAA,QAC/B,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,QAAI,KAAK,WAAW;AAClB,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,YAAY,CAAC,YAAY,OAAO;AAAA,QAChC,MAAM;AAAA,UACJ;AAAA,YACE,MAAM,KAAK;AAAA,YACX,GAAG,KAAK,aAAa,IAAI,KAAK,aAAa,QAAQ;AAAA,YACnD,GAAG,KAAK,aAAa,IAAI,KAAK,WAAW;AAAA,YACzC,MAAM,KAAK,gBAAgB;AAAA,YAC3B,UAAU,KAAK,WAAW;AAAA,YAC1B,UAAU;AAAA,YACV,aAAa;AAAA,YACb,eAAe;AAAA,UACjB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,sBAAsC;AACpC,QAAI,KAAK,iBAAiB,QAAQ;AAChC,aAAO,KAAK,+BAA+B;AAAA,IAC7C;AACA,QAAI,KAAK,iBAAiB,SAAS;AACjC,YAAM,MAAM,0CAA0C;AAAA,IACxD;AACA,QAAI,KAAK,iBAAiB,UAAU;AAClC,aAAO,KAAK,iCAAiC;AAAA,IAC/C;AACA,QAAI,KAAK,iBAAiB,OAAO;AAC/B,aAAO,KAAK,8BAA8B;AAAA,IAC5C;AACA,WAAO,CAAC;AAAA,EACV;AACF;;;AD9ZO,IAAM,WAAN,cAAuB,SAAS;AAAA,EAPvC,OAOuC;AAAA;AAAA;AAAA,EAIrC,YACE,YACA,iBACA,YACA,OACA,yBACA;AACA,UAAM,YAAY,OAAO,yBAAyB,eAAe;AACjE,SAAK,aAAa;AAClB,SAAK,QAAQ,UAAU,EAAE,OAAO,KAAK,UAAU,EAAE,MAAM,KAAK,SAAS,CAAC;AAAA,EACxE;AAAA,EAEA,SAAS,OAA+B;AACtC,UAAM,SAAS,KAAK;AAAA,EACtB;AAAA,EAEA,mBAAyB;AACvB,SAAK,QAAQ,UAAU,EACpB,OAAO,KAAK,UAAU,EACtB,MAAM,KAAK,SAAS,CAAC,EACrB,aAAa,CAAC,EACd,aAAa,CAAC,EACd,MAAM,GAAG;AACZ,QAAI,MAAM,2CAA2C,KAAK,YAAY,KAAK,SAAS,CAAC;AAAA,EACvF;AAAA,EAEA,gBAAqC;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc,OAAuB;AACnC,WAAO,KAAK,MAAM,KAAK,KAAK,KAAK,SAAS,EAAE,CAAC;AAAA,EAC/C;AACF;;;AE3CA,SAAS,mBAAmB;AAKrB,IAAM,aAAN,cAAyB,SAAS;AAAA,EANzC,OAMyC;AAAA;AAAA;AAAA,EAIvC,YACE,YACA,iBACA,QACA,OACA,yBACA;AACA,UAAM,YAAY,OAAO,yBAAyB,eAAe;AACjE,SAAK,SAAS;AACd,SAAK,QAAQ,YAAY,EAAE,OAAO,KAAK,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC;AAAA,EACtE;AAAA,EAEA,gBAAqC;AACnC,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B;AAAA,EAEA,mBAAyB;AACvB,UAAM,SAAS,CAAC,GAAG,KAAK,MAAM;AAC9B,QAAI,KAAK,iBAAiB,QAAQ;AAChC,aAAO,QAAQ;AAAA,IACjB;AACA,SAAK,QAAQ,YAAY,EAAE,OAAO,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC;AAAA,EACjE;AAAA,EAEA,cAAc,OAAuB;AACnC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AACF;;;ACdO,SAAS,QACd,MACA,YACA,iBACAE,cACM;AACN,QAAM,0BAA0B,IAAI,gCAAgCA,YAAW;AAC/E,MAAI,eAAe,IAAI,GAAG;AACxB,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,IACA,CAAC,KAAK,KAAK,KAAK,GAAG;AAAA,IACnB,KAAK;AAAA,IACL;AAAA,EACF;AACF;AAvBgB;;;ACTT,IAAM,aAAN,MAA2C;AAAA,EAGhD,YACU,yBACA,aACA,WACA,kBACR;AAJQ;AACA;AACA;AACA;AAER,SAAK,eAAe;AAAA,MAClB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AACA,SAAK,iBAAiB;AAAA,EACxB;AAAA,EA9BF,OAckD;AAAA;AAAA;AAAA,EAiBhD,iBAAiB,OAAoB;AACnC,SAAK,aAAa,IAAI,MAAM;AAC5B,SAAK,aAAa,IAAI,MAAM;AAAA,EAC9B;AAAA,EACA,eAAe,gBAAsC;AACnD,UAAM,iBAAiB,KAAK,wBAAwB;AAAA,MAClD,CAAC,KAAK,UAAU,KAAK;AAAA,MACrB,KAAK,YAAY;AAAA,IACnB;AACA,UAAM,gBAAgB,KAAK,IAAI,eAAe,OAAO,eAAe,KAAK;AACzE,UAAM,iBAAiB,eAAe,SAAS,IAAI,KAAK,YAAY;AACpE,QACE,eAAe,SAAS,iBACxB,eAAe,UAAU,kBACzB,KAAK,YAAY,aACjB,KAAK,UAAU,OACf;AACA,WAAK,aAAa,QAAQ;AAC1B,WAAK,aAAa,SAAS;AAC3B,WAAK,iBAAiB;AAAA,IACxB;AAEA,WAAO;AAAA,MACL,OAAO,KAAK,aAAa;AAAA,MACzB,QAAQ,KAAK,aAAa;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,sBAAsC;AACpC,UAAM,eAA+B,CAAC;AACtC,QAAI,KAAK,gBAAgB;AACvB,mBAAa,KAAK;AAAA,QAChB,YAAY,CAAC,aAAa;AAAA,QAC1B,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,YACE,UAAU,KAAK,YAAY;AAAA,YAC3B,MAAM,KAAK,UAAU;AAAA,YACrB,aAAa;AAAA,YACb,eAAe;AAAA,YACf,GAAG,KAAK,aAAa,IAAI,KAAK,aAAa,QAAQ;AAAA,YACnD,GAAG,KAAK,aAAa,IAAI,KAAK,aAAa,SAAS;AAAA,YACpD,MAAM,KAAK,iBAAiB;AAAA,YAC5B,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,uBACd,aACA,WACA,kBACAC,cACgB;AAChB,QAAM,0BAA0B,IAAI,gCAAgCA,YAAW;AAC/E,SAAO,IAAI,WAAW,yBAAyB,aAAa,WAAW,gBAAgB;AACzF;AARgB;;;AClFhB,SAAS,YAAY;AAId,IAAM,WAAN,MAAe;AAAA,EACpB,YACU,UACA,OACA,OACA,aACAC,YACR;AALQ;AACA;AACA;AACA;AACA,qBAAAA;AAAA,EACP;AAAA,EAXL,OAIsB;AAAA;AAAA;AAAA,EASpB,qBAAqC;AACnC,UAAM,YAAgC,KAAK,SAAS,KAAK,IAAI,CAAC,MAAM;AAAA,MAClE,KAAK,MAAM,cAAc,EAAE,CAAC,CAAC;AAAA,MAC7B,KAAK,MAAM,cAAc,EAAE,CAAC,CAAC;AAAA,IAC/B,CAAC;AAED,QAAI;AACJ,QAAI,KAAK,gBAAgB,cAAc;AACrC,aAAO,KAAK,EACT,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EACb,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,SAAS;AAAA,IAC7B,OAAO;AACL,aAAO,KAAK,EACT,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EACb,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,SAAS;AAAA,IAC7B;AACA,QAAI,CAAC,MAAM;AACT,aAAO,CAAC;AAAA,IACV;AACA,WAAO;AAAA,MACL;AAAA,QACE,YAAY,CAAC,QAAQ,aAAa,KAAK,SAAS,EAAE;AAAA,QAClD,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,YACE;AAAA,YACA,YAAY,KAAK,SAAS;AAAA,YAC1B,aAAa,KAAK,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC3CO,IAAM,UAAN,MAAc;AAAA,EACnB,YACU,SACA,cACA,OACA,OACA,aACAC,YACR;AANQ;AACA;AACA;AACA;AACA;AACA,qBAAAA;AAAA,EACP;AAAA,EAXL,OAGqB;AAAA;AAAA;AAAA,EAUnB,qBAAqC;AACnC,UAAM,YAAgC,KAAK,QAAQ,KAAK,IAAI,CAAC,MAAM;AAAA,MACjE,KAAK,MAAM,cAAc,EAAE,CAAC,CAAC;AAAA,MAC7B,KAAK,MAAM,cAAc,EAAE,CAAC,CAAC;AAAA,IAC/B,CAAC;AAED,UAAM,oBAAoB;AAE1B,UAAM,WACJ,KAAK,IAAI,KAAK,MAAM,oBAAoB,IAAI,GAAG,KAAK,MAAM,gBAAgB,CAAC,KAC1E,IAAI;AACP,UAAM,eAAe,WAAW;AAEhC,QAAI,KAAK,gBAAgB,cAAc;AACrC,aAAO;AAAA,QACL;AAAA,UACE,YAAY,CAAC,QAAQ,YAAY,KAAK,SAAS,EAAE;AAAA,UACjD,MAAM;AAAA,UACN,MAAM,UAAU,IAAI,CAAC,UAAU;AAAA,YAC7B,GAAG,KAAK,aAAa;AAAA,YACrB,GAAG,KAAK,CAAC,IAAI;AAAA,YACb,QAAQ;AAAA,YACR,OAAO,KAAK,CAAC,IAAI,KAAK,aAAa;AAAA,YACnC,MAAM,KAAK,QAAQ;AAAA,YACnB,aAAa;AAAA,YACb,YAAY,KAAK,QAAQ;AAAA,UAC3B,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,QACE,YAAY,CAAC,QAAQ,YAAY,KAAK,SAAS,EAAE;AAAA,QACjD,MAAM;AAAA,QACN,MAAM,UAAU,IAAI,CAAC,UAAU;AAAA,UAC7B,GAAG,KAAK,CAAC,IAAI;AAAA,UACb,GAAG,KAAK,CAAC;AAAA,UACT,OAAO;AAAA,UACP,QAAQ,KAAK,aAAa,IAAI,KAAK,aAAa,SAAS,KAAK,CAAC;AAAA,UAC/D,MAAM,KAAK,QAAQ;AAAA,UACnB,aAAa;AAAA,UACb,YAAY,KAAK,QAAQ;AAAA,QAC3B,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;;;ACzCO,IAAM,WAAN,MAA+B;AAAA,EAKpC,YACU,aACA,WACA,kBACR;AAHQ;AACA;AACA;AAER,SAAK,eAAe;AAAA,MAClB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAlCF,OAkBsC;AAAA;AAAA;AAAA,EAiBpC,QAAQ,OAAa,OAAa;AAChC,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,iBAAiB,OAAoB;AACnC,SAAK,aAAa,IAAI,MAAM;AAC5B,SAAK,aAAa,IAAI,MAAM;AAAA,EAC9B;AAAA,EACA,eAAe,gBAAsC;AACnD,SAAK,aAAa,QAAQ,eAAe;AACzC,SAAK,aAAa,SAAS,eAAe;AAE1C,WAAO;AAAA,MACL,OAAO,KAAK,aAAa;AAAA,MACzB,QAAQ,KAAK,aAAa;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,sBAAsC;AACpC,QAAI,EAAE,KAAK,SAAS,KAAK,QAAQ;AAC/B,YAAM,MAAM,qCAAqC;AAAA,IACnD;AACA,UAAM,eAA+B,CAAC;AACtC,eAAW,CAAC,GAAG,IAAI,KAAK,KAAK,UAAU,MAAM,QAAQ,GAAG;AACtD,cAAQ,KAAK,MAAM;AAAA,QACjB,KAAK;AACH;AACE,kBAAM,WAAW,IAAI;AAAA,cACnB;AAAA,cACA,KAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK,YAAY;AAAA,cACjB;AAAA,YACF;AACA,yBAAa,KAAK,GAAG,SAAS,mBAAmB,CAAC;AAAA,UACpD;AACA;AAAA,QACF,KAAK;AACH;AACE,kBAAM,UAAU,IAAI;AAAA,cAClB;AAAA,cACA,KAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK,YAAY;AAAA,cACjB;AAAA,YACF;AACA,yBAAa,KAAK,GAAG,QAAQ,mBAAmB,CAAC;AAAA,UACnD;AACA;AAAA,MACJ;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iBACd,aACA,WACA,kBACM;AACN,SAAO,IAAI,SAAS,aAAa,WAAW,gBAAgB;AAC9D;AANgB;;;AC3ET,IAAM,eAAN,MAAmB;AAAA,EAOxB,YACU,aACA,WACR,kBACAC,cACA;AAJQ;AACA;AAIR,SAAK,iBAAiB;AAAA,MACpB,OAAO,uBAAuB,aAAa,WAAW,kBAAkBA,YAAW;AAAA,MACnF,MAAM,iBAAiB,aAAa,WAAW,gBAAgB;AAAA,MAC/D,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ;AAAA,UACE,YAAY,iBAAiB;AAAA,UAC7B,YAAY,iBAAiB;AAAA,UAC7B,WAAW,iBAAiB;AAAA,UAC5B,eAAe,iBAAiB;AAAA,QAClC;AAAA,QACAA;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ;AAAA,UACE,YAAY,iBAAiB;AAAA,UAC7B,YAAY,iBAAiB;AAAA,UAC7B,WAAW,iBAAiB;AAAA,UAC5B,eAAe,iBAAiB;AAAA,QAClC;AAAA,QACAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAtDF,OAe0B;AAAA;AAAA;AAAA,EAyChB,yBAAyB;AAC/B,QAAI,iBAAiB,KAAK,YAAY;AACtC,QAAI,kBAAkB,KAAK,YAAY;AACvC,QAAI,QAAQ;AACZ,QAAI,QAAQ;AACZ,QAAI,aAAa,KAAK,MAAO,iBAAiB,KAAK,YAAY,2BAA4B,GAAG;AAC9F,QAAI,cAAc,KAAK;AAAA,MACpB,kBAAkB,KAAK,YAAY,2BAA4B;AAAA,IAClE;AACA,QAAI,YAAY,KAAK,eAAe,KAAK,eAAe;AAAA,MACtD,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AACD,sBAAkB,UAAU;AAC5B,uBAAmB,UAAU;AAE7B,gBAAY,KAAK,eAAe,MAAM,eAAe;AAAA,MACnD,OAAO,KAAK,YAAY;AAAA,MACxB,QAAQ;AAAA,IACV,CAAC;AACD,YAAQ,UAAU;AAClB,uBAAmB,UAAU;AAC7B,SAAK,eAAe,MAAM,gBAAgB,QAAQ;AAClD,gBAAY,KAAK,eAAe,MAAM,eAAe;AAAA,MACnD,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AACD,uBAAmB,UAAU;AAC7B,SAAK,eAAe,MAAM,gBAAgB,MAAM;AAChD,gBAAY,KAAK,eAAe,MAAM,eAAe;AAAA,MACnD,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AACD,YAAQ,UAAU;AAClB,sBAAkB,UAAU;AAC5B,QAAI,iBAAiB,GAAG;AACtB,oBAAc;AACd,uBAAiB;AAAA,IACnB;AACA,QAAI,kBAAkB,GAAG;AACvB,qBAAe;AACf,wBAAkB;AAAA,IACpB;AACA,SAAK,eAAe,KAAK,eAAe;AAAA,MACtC,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAED,SAAK,eAAe,KAAK,iBAAiB,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC;AAChE,SAAK,eAAe,MAAM,SAAS,CAAC,OAAO,QAAQ,UAAU,CAAC;AAC9D,SAAK,eAAe,MAAM,iBAAiB,EAAE,GAAG,OAAO,GAAG,QAAQ,YAAY,CAAC;AAC/E,SAAK,eAAe,MAAM,SAAS,CAAC,OAAO,QAAQ,WAAW,CAAC;AAC/D,SAAK,eAAe,MAAM,iBAAiB,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC;AAC7D,QAAI,KAAK,UAAU,MAAM,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC,GAAG;AAClD,WAAK,eAAe,MAAM,iCAAiC;AAAA,IAC7D;AAAA,EACF;AAAA,EAEQ,2BAA2B;AACjC,QAAI,iBAAiB,KAAK,YAAY;AACtC,QAAI,kBAAkB,KAAK,YAAY;AACvC,QAAI,YAAY;AAChB,QAAI,QAAQ;AACZ,QAAI,QAAQ;AACZ,QAAI,aAAa,KAAK,MAAO,iBAAiB,KAAK,YAAY,2BAA4B,GAAG;AAC9F,QAAI,cAAc,KAAK;AAAA,MACpB,kBAAkB,KAAK,YAAY,2BAA4B;AAAA,IAClE;AACA,QAAI,YAAY,KAAK,eAAe,KAAK,eAAe;AAAA,MACtD,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AACD,sBAAkB,UAAU;AAC5B,uBAAmB,UAAU;AAE7B,gBAAY,KAAK,eAAe,MAAM,eAAe;AAAA,MACnD,OAAO,KAAK,YAAY;AAAA,MACxB,QAAQ;AAAA,IACV,CAAC;AACD,gBAAY,UAAU;AACtB,uBAAmB,UAAU;AAC7B,SAAK,eAAe,MAAM,gBAAgB,MAAM;AAChD,gBAAY,KAAK,eAAe,MAAM,eAAe;AAAA,MACnD,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AACD,sBAAkB,UAAU;AAC5B,YAAQ,UAAU;AAClB,SAAK,eAAe,MAAM,gBAAgB,KAAK;AAC/C,gBAAY,KAAK,eAAe,MAAM,eAAe;AAAA,MACnD,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AACD,uBAAmB,UAAU;AAC7B,YAAQ,YAAY,UAAU;AAC9B,QAAI,iBAAiB,GAAG;AACtB,oBAAc;AACd,uBAAiB;AAAA,IACnB;AACA,QAAI,kBAAkB,GAAG;AACvB,qBAAe;AACf,wBAAkB;AAAA,IACpB;AACA,SAAK,eAAe,KAAK,eAAe;AAAA,MACtC,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAED,SAAK,eAAe,KAAK,iBAAiB,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC;AAChE,SAAK,eAAe,MAAM,SAAS,CAAC,OAAO,QAAQ,UAAU,CAAC;AAC9D,SAAK,eAAe,MAAM,iBAAiB,EAAE,GAAG,OAAO,GAAG,UAAU,CAAC;AACrE,SAAK,eAAe,MAAM,SAAS,CAAC,OAAO,QAAQ,WAAW,CAAC;AAC/D,SAAK,eAAe,MAAM,iBAAiB,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC;AAC7D,QAAI,KAAK,UAAU,MAAM,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC,GAAG;AAClD,WAAK,eAAe,MAAM,iCAAiC;AAAA,IAC7D;AAAA,EACF;AAAA,EAEQ,iBAAiB;AACvB,QAAI,KAAK,YAAY,qBAAqB,cAAc;AACtD,WAAK,yBAAyB;AAAA,IAChC,OAAO;AACL,WAAK,uBAAuB;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,qBAAqB;AACnB,SAAK,eAAe;AACpB,UAAM,eAA+B,CAAC;AACtC,SAAK,eAAe,KAAK,QAAQ,KAAK,eAAe,OAAO,KAAK,eAAe,KAAK;AACrF,eAAW,aAAa,OAAO,OAAO,KAAK,cAAc,GAAG;AAC1D,mBAAa,KAAK,GAAG,UAAU,oBAAoB,CAAC;AAAA,IACtD;AACA,WAAO;AAAA,EACT;AACF;;;AC3LO,IAAM,iBAAN,MAAqB;AAAA,EAJ5B,OAI4B;AAAA;AAAA;AAAA,EAC1B,OAAO,MACL,QACA,WACA,kBACAC,cACgB;AAChB,UAAM,eAAe,IAAI,aAAa,QAAQ,WAAW,kBAAkBA,YAAW;AACtF,WAAO,aAAa,mBAAmB;AAAA,EACzC;AACF;;;ACWA,IAAI,YAAY;AAEhB,IAAI;AAEJ,IAAI,gBAA+B,sBAAsB;AACzD,IAAI,qBAAyC,2BAA2B;AACxE,IAAI,cAA2B,oBAAoB;AACnD,IAAI,mBAAmB,mBAAmB,iBAAiB,MAAM,GAAG,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AACjG,IAAI,cAAc;AAClB,IAAI,cAAc;AAOlB,SAAS,6BAAiD;AACxD,QAAM,wBAAwB,kBAAkB;AAChD,QAAM,SAAmB,UAAU;AACnC,SAAO,cAAc,sBAAsB,SAAS,OAAO,eAAe,OAAO;AACnF;AAJS;AAKT,SAAS,wBAAuC;AAC9C,QAAM,SAAmB,UAAU;AACnC,SAAO;AAAA,IACL,sBAAc;AAAA,IACd,OAAO;AAAA,EACT;AACF;AANS;AAQT,SAAS,sBAAmC;AAC1C,SAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,YAAY,CAAC;AAAA,IACf;AAAA,IACA,OAAO;AAAA,IACP,OAAO,CAAC;AAAA,EACV;AACF;AAhBS;AAkBT,SAAS,cAAc,MAAc;AACnC,QAAM,SAAmB,UAAU;AACnC,SAAO,aAAa,KAAK,KAAK,GAAG,MAAM;AACzC;AAHS;AAKT,SAAS,WAAW,MAAgB;AAClC,gBAAc;AAChB;AAFS;AAGT,SAAS,eAAe,aAAqB;AAC3C,MAAI,gBAAgB,cAAc;AAChC,kBAAc,mBAAmB;AAAA,EACnC,OAAO;AACL,kBAAc,mBAAmB;AAAA,EACnC;AACF;AANS;AAOT,SAAS,cAAc,OAAuB;AAC5C,cAAY,MAAM,QAAQ,cAAc,MAAM,IAAI;AACpD;AAFS;AAGT,SAAS,kBAAkB,KAAa,KAAa;AACnD,cAAY,QAAQ,EAAE,MAAM,UAAU,OAAO,YAAY,MAAM,OAAO,KAAK,IAAI;AAC/E,gBAAc;AAChB;AAHS;AAIT,SAAS,aAAa,YAA8B;AAClD,cAAY,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,OAAO,YAAY,MAAM;AAAA,IACzB,YAAY,WAAW,IAAI,CAAC,MAAM,cAAc,EAAE,IAAI,CAAC;AAAA,EACzD;AACA,gBAAc;AAChB;AAPS;AAQT,SAAS,cAAc,OAAuB;AAC5C,cAAY,MAAM,QAAQ,cAAc,MAAM,IAAI;AACpD;AAFS;AAGT,SAAS,kBAAkB,KAAa,KAAa;AACnD,cAAY,QAAQ,EAAE,MAAM,UAAU,OAAO,YAAY,MAAM,OAAO,KAAK,IAAI;AAC/E,gBAAc;AAChB;AAHS;AAMT,SAAS,0BAA0B,MAAgB;AACjD,QAAM,WAAW,KAAK,IAAI,GAAG,IAAI;AACjC,QAAM,WAAW,KAAK,IAAI,GAAG,IAAI;AACjC,QAAM,eAAe,iBAAiB,YAAY,KAAK,IAAI,YAAY,MAAM,MAAM;AACnF,QAAM,eAAe,iBAAiB,YAAY,KAAK,IAAI,YAAY,MAAM,MAAM;AACnF,cAAY,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,OAAO,YAAY,MAAM;AAAA,IACzB,KAAK,KAAK,IAAI,cAAc,QAAQ;AAAA,IACpC,KAAK,KAAK,IAAI,cAAc,QAAQ;AAAA,EACtC;AACF;AAXS;AAaT,SAAS,6BAA6B,MAAoC;AACxE,MAAI,UAA8B,CAAC;AACnC,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,aAAa;AAChB,UAAM,eAAe,iBAAiB,YAAY,KAAK,IAAI,YAAY,MAAM,MAAM;AACnF,UAAM,eAAe,iBAAiB,YAAY,KAAK,IAAI,YAAY,MAAM,MAAM;AACnF,sBAAkB,KAAK,IAAI,cAAc,CAAC,GAAG,KAAK,IAAI,cAAc,KAAK,MAAM,CAAC;AAAA,EAClF;AACA,MAAI,CAAC,aAAa;AAChB,8BAA0B,IAAI;AAAA,EAChC;AAEA,MAAI,eAAe,YAAY,KAAK,GAAG;AACrC,cAAU,YAAY,MAAM,WAAW,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA,EACnE;AAEA,MAAI,iBAAiB,YAAY,KAAK,GAAG;AACvC,UAAM,MAAM,YAAY,MAAM;AAC9B,UAAM,MAAM,YAAY,MAAM;AAC9B,UAAM,QAAQ,MAAM,QAAQ,KAAK,SAAS;AAC1C,UAAM,aAAuB,CAAC;AAC9B,aAAS,IAAI,KAAK,KAAK,KAAK,KAAK,MAAM;AACrC,iBAAW,KAAK,GAAG,CAAC,EAAE;AAAA,IACxB;AACA,cAAU,WAAW,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA,EACjD;AAEA,SAAO;AACT;AA9BS;AAgCT,SAAS,wBAAwBC,YAA2B;AAC1D,SAAO,iBAAiBA,eAAc,IAAI,IAAIA,aAAY,iBAAiB,MAAM;AACnF;AAFS;AAIT,SAAS,YAAY,OAAuB,MAAgB;AAC1D,QAAM,WAAW,6BAA6B,IAAI;AAClD,cAAY,MAAM,KAAK;AAAA,IACrB,MAAM;AAAA,IACN,YAAY,wBAAwB,SAAS;AAAA,IAC7C,aAAa;AAAA,IACb,MAAM;AAAA,EACR,CAAC;AACD;AACF;AATS;AAWT,SAAS,WAAW,OAAuB,MAAgB;AACzD,QAAM,WAAW,6BAA6B,IAAI;AAClD,cAAY,MAAM,KAAK;AAAA,IACrB,MAAM;AAAA,IACN,MAAM,wBAAwB,SAAS;AAAA,IACvC,MAAM;AAAA,EACR,CAAC;AACD;AACF;AARS;AAUT,SAAS,kBAAkC;AACzC,MAAI,YAAY,MAAM,WAAW,GAAG;AAClC,UAAM,MAAM,yDAAyD;AAAA,EACvE;AACA,cAAY,QAAQ,gBAAgB;AACpC,SAAO,eAAe,MAAM,eAAe,aAAa,oBAAoB,WAAW;AACzF;AANS;AAQT,SAAS,sBAAsB;AAC7B,SAAO;AACT;AAFS;AAIT,SAAS,iBAAiB;AACxB,SAAO;AACT;AAFS;AAIT,SAAS,iBAAiB;AACxB,SAAO;AACT;AAFS;AAIT,IAAMC,SAAQ,kCAAY;AACxB,QAAY;AACZ,cAAY;AACZ,kBAAgB,sBAAsB;AACtC,gBAAc,oBAAoB;AAClC,uBAAqB,2BAA2B;AAChD,qBAAmB,mBAAmB,iBAAiB,MAAM,GAAG,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAC7F,gBAAc;AACd,gBAAc;AAChB,GATc;AAWd,IAAO,oBAAQ;AAAA,EACb;AAAA,EACA,OAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC7NO,IAAM,OAAO,wBAAC,KAAa,IAAY,UAAkB,YAAqB;AACnF,QAAM,KAAK,QAAQ;AACnB,QAAM,cAAc,GAAG,oBAAoB;AAC3C,QAAM,cAAc,GAAG,eAAe;AACtC,QAAM,YAAY,GAAG,eAAe,EAAE,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;AACzE,WAAS,oBAAoB,eAAgC;AAC3D,WAAO,kBAAkB,QAAQ,qBAAqB;AAAA,EACxD;AAFS;AAIT,WAAS,cAAc,aAAgC;AACrD,WAAO,gBAAgB,SAAS,UAAU,gBAAgB,UAAU,QAAQ;AAAA,EAC9E;AAFS;AAIT,WAAS,sBAAsB,MAAgB;AAC7C,WAAO,aAAa,KAAK,CAAC,KAAK,KAAK,CAAC,YAAY,KAAK,YAAY,CAAC;AAAA,EACrE;AAFS;AAIT,MAAI,MAAM,8BAA8B,GAAG;AAE3C,QAAM,MAAM,iBAAiB,EAAE;AAC/B,QAAM,QAAQ,IAAI,OAAO,GAAG,EAAE,KAAK,SAAS,MAAM;AAClD,QAAM,aAAa,MAChB,OAAO,MAAM,EACb,KAAK,SAAS,YAAY,KAAK,EAC/B,KAAK,UAAU,YAAY,MAAM,EACjC,KAAK,SAAS,YAAY;AAG7B,mBAAiB,KAAK,YAAY,QAAQ,YAAY,OAAO,IAAI;AAEjE,MAAI,KAAK,WAAW,OAAO,YAAY,KAAK,IAAI,YAAY,MAAM,EAAE;AAEpE,aAAW,KAAK,QAAQ,YAAY,eAAe;AAEnD,KAAG,WAAW,IAAI,OAAO,GAAG,EAAE,KAAK,SAAS,mBAAmB,CAAC;AAEhE,QAAM,SAAyB,GAAG,gBAAgB;AAElD,QAAM,SAA8B,CAAC;AAYrC,WAAS,SAAS,OAAiB;AACjC,QAAI,OAAO;AACX,QAAI,SAAS;AACb,eAAW,CAAC,CAAC,KAAK,MAAM,QAAQ,GAAG;AACjC,UAAI,SAAS;AACb,UAAI,IAAI,KAAK,OAAO,MAAM,GAAG;AAC3B,iBAAS,OAAO,MAAM;AAAA,MACxB;AACA,gBAAU,MAAM,CAAC;AACjB,aAAO,OAAO,MAAM;AACpB,UAAI,CAAC,MAAM;AACT,eAAO,OAAO,MAAM,IAAI,OAAO,OAAO,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,CAAC;AAAA,MACnE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAfS;AAiBT,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,KAAK,WAAW,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,aAAa,SAAS,MAAM,UAAU;AAE5C,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,mBACG,UAAU,MAAM,EAChB,KAAK,MAAM,IAAI,EACf,MAAM,EACN,OAAO,MAAM,EACb,KAAK,KAAK,CAAC,SAAS,KAAK,CAAC,EAC1B,KAAK,KAAK,CAAC,SAAS,KAAK,CAAC,EAC1B,KAAK,SAAS,CAAC,SAAS,KAAK,KAAK,EAClC,KAAK,UAAU,CAAC,SAAS,KAAK,MAAM,EACpC,KAAK,QAAQ,CAAC,SAAS,KAAK,IAAI,EAChC,KAAK,UAAU,CAAC,SAAS,KAAK,UAAU,EACxC,KAAK,gBAAgB,CAAC,SAAS,KAAK,WAAW;AAElD,YAAI,YAAY,eAAe;AAC7B,cAAI,YAAY,qBAAqB,cAAc;AAUjD,gBAASC,oBAAT,SAA0B,MAAe,UAA2B;AAClE,oBAAM,EAAE,MAAM,MAAM,IAAI;AAExB,oBAAM,YAAoB,WAAW,MAAM,SAAS;AAEpD,qBAAO,aAAa,KAAK,QAAQ;AAAA,YACnC;AANS,mCAAAA;AAAA,mBAAAA,mBAAA;AART,kBAAM,kBAAkB;AAGxB,kBAAM,aAAa,MAAM,KACtB,IAAI,CAAC,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE,EAC3D,OAAO,CAAC,SAAS,KAAK,KAAK,QAAQ,KAAK,KAAK,KAAK,SAAS,CAAC;AAa/D,kBAAM,qBAAqB,WAAW,IAAI,CAAC,SAAS;AAClD,oBAAM,EAAE,KAAK,IAAI;AACjB,kBAAI,WAAW,KAAK,SAAS;AAE7B,qBAAO,CAACA,kBAAiB,MAAM,QAAQ,KAAK,WAAW,GAAG;AACxD,4BAAY;AAAA,cACd;AACA,qBAAO;AAAA,YACT,CAAC;AAGD,kBAAM,kBAAkB,KAAK,MAAM,KAAK,IAAI,GAAG,kBAAkB,CAAC;AAElE,uBACG,UAAU,MAAM,EAChB,KAAK,UAAU,EACf,MAAM,EACN,OAAO,MAAM,EACb,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,EAAE,EACtD,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS,CAAC,EACtD,KAAK,eAAe,KAAK,EACzB,KAAK,qBAAqB,QAAQ,EAClC,KAAK,QAAQ,OAAO,EACpB,KAAK,aAAa,GAAG,eAAe,IAAI,EACxC,KAAK,CAAC,SAAS,KAAK,KAAK;AAAA,UAC9B,OAAO;AASL,gBAASC,aAAT,SAAmB,MAAe,UAAkBC,UAA0B;AAC5E,oBAAM,EAAE,MAAM,MAAM,IAAI;AACxB,oBAAM,kBAAkB;AACxB,oBAAM,YAAY,WAAW,MAAM,SAAS;AAG5C,oBAAM,UAAU,KAAK,IAAI,KAAK,QAAQ;AACtC,oBAAM,WAAW,UAAU,YAAY;AACvC,oBAAM,YAAY,UAAU,YAAY;AAGxC,oBAAM,iBAAiB,YAAY,KAAK,KAAK,aAAa,KAAK,IAAI,KAAK;AAIxE,oBAAM,eAAe,KAAK,IAAIA,WAAU,YAAY,KAAK,IAAI,KAAK;AAElE,qBAAO,kBAAkB;AAAA,YAC3B;AAlBS,4BAAAD;AAAA,mBAAAA,YAAA;AART,kBAAM,UAAU;AAGhB,kBAAM,aAAa,MAAM,KACtB,IAAI,CAAC,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE,EAC3D,OAAO,CAAC,SAAS,KAAK,KAAK,QAAQ,KAAK,KAAK,KAAK,SAAS,CAAC;AAyB/D,kBAAM,qBAAqB,WAAW,IAAI,CAAC,SAAS;AAClD,oBAAM,EAAE,MAAM,MAAM,IAAI;AACxB,kBAAI,WAAW,KAAK,SAAS,MAAM,SAAS;AAG5C,qBAAO,CAACA,WAAU,MAAM,UAAU,OAAO,KAAK,WAAW,GAAG;AAC1D,4BAAY;AAAA,cACd;AACA,qBAAO;AAAA,YACT,CAAC;AAGD,kBAAM,kBAAkB,KAAK,MAAM,KAAK,IAAI,GAAG,kBAAkB,CAAC;AAGlE,uBACG,UAAU,MAAM,EAChB,KAAK,UAAU,EACf,MAAM,EACN,OAAO,MAAM,EACb,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,CAAC,EACrD,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,IAAI,OAAO,EACzC,KAAK,eAAe,QAAQ,EAC5B,KAAK,qBAAqB,SAAS,EACnC,KAAK,QAAQ,OAAO,EACpB,KAAK,aAAa,GAAG,eAAe,IAAI,EACxC,KAAK,CAAC,SAAS,KAAK,KAAK;AAAA,UAC9B;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,mBACG,UAAU,MAAM,EAChB,KAAK,MAAM,IAAI,EACf,MAAM,EACN,OAAO,MAAM,EACb,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,QAAQ,CAAC,SAAS,KAAK,IAAI,EAChC,KAAK,aAAa,CAAC,SAAS,KAAK,QAAQ,EACzC,KAAK,qBAAqB,CAAC,SAAS,oBAAoB,KAAK,WAAW,CAAC,EACzE,KAAK,eAAe,CAAC,SAAS,cAAc,KAAK,aAAa,CAAC,EAC/D,KAAK,aAAa,CAAC,SAAS,sBAAsB,IAAI,CAAC,EACvD,KAAK,CAAC,SAAS,KAAK,IAAI;AAC3B;AAAA,MACF,KAAK;AACH,mBACG,UAAU,MAAM,EAChB,KAAK,MAAM,IAAI,EACf,MAAM,EACN,OAAO,MAAM,EACb,KAAK,KAAK,CAAC,SAAS,KAAK,IAAI,EAC7B,KAAK,QAAQ,CAAC,SAAU,KAAK,OAAO,KAAK,OAAO,MAAO,EACvD,KAAK,UAAU,CAAC,SAAS,KAAK,UAAU,EACxC,KAAK,gBAAgB,CAAC,SAAS,KAAK,WAAW;AAClD;AAAA,IACJ;AAAA,EACF;AACF,GAhOoB;AAkOpB,IAAO,0BAAQ;AAAA,EACb;AACF;;;AC1OO,IAAM,UAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF;", + "names": ["o", "parser", "lexer", "tmpSVGGroup", "tmpSVGGroup", "plotIndex", "plotIndex", "tmpSVGGroup", "tmpSVGGroup", "plotIndex", "clear", "fitsHorizontally", "fitsInBar", "yOffset"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architecture-U656AL7Q-3ZQKGQJL.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architecture-U656AL7Q-3ZQKGQJL.mjs new file mode 100644 index 0000000..999647b --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architecture-U656AL7Q-3ZQKGQJL.mjs @@ -0,0 +1 @@ +import{a as e,b as r}from"./chunk-EOITJJC2.mjs";import"./chunk-2XYWPRAO.mjs";import"./chunk-OMTJKCYW.mjs";import"./chunk-IQQE2MEC.mjs";import"./chunk-A4ITRWGT.mjs";import"./chunk-GTKDMUJJ.mjs";export{e as ArchitectureModule,r as createArchitectureServices}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architecture-U656AL7Q-3ZQKGQJL.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architecture-U656AL7Q-3ZQKGQJL.mjs.map new file mode 100644 index 0000000..9865211 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architecture-U656AL7Q-3ZQKGQJL.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": [], + "sourcesContent": [], + "mappings": "", + "names": [] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architectureDiagram-4X3Z3J56.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architectureDiagram-4X3Z3J56.mjs new file mode 100644 index 0000000..ab6478c --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architectureDiagram-4X3Z3J56.mjs @@ -0,0 +1,36 @@ +import{a as tr}from"./chunk-4KE642ED.mjs";import{a as _e}from"./chunk-353K7GK5.mjs";import"./chunk-DY3L2I7V.mjs";import"./chunk-6DHVG6KC.mjs";import"./chunk-EOITJJC2.mjs";import"./chunk-TLYDTAVK.mjs";import"./chunk-JXEFGRG2.mjs";import"./chunk-6XQQT3RD.mjs";import{a as er}from"./chunk-ASAHGCDZ.mjs";import{a as Ne}from"./chunk-7SRKK4IT.mjs";import{a as He,b as We,c as ue,g as de}from"./chunk-GOL2OBWC.mjs";import{l as Ke,p as je}from"./chunk-EFRVIJHI.mjs";import"./chunk-THXVA4DE.mjs";import{M as Ve,O as Be,P as ze,Q as $e,R as ke,S as Ze,T as Je,U as qe,W as ge,i as Ye,q as Ue,w as Xe}from"./chunk-KXVH62NG.mjs";import{b as fe,h as Qe}from"./chunk-63GW7ZVL.mjs";import"./chunk-XW6ABFJP.mjs";import"./chunk-2XYWPRAO.mjs";import"./chunk-OMTJKCYW.mjs";import"./chunk-IQQE2MEC.mjs";import"./chunk-A4ITRWGT.mjs";import{a as L,b as Ae,e as mr}from"./chunk-GTKDMUJJ.mjs";var xe=Ae((se,we)=>{"use strict";L((function(C,T){typeof se=="object"&&typeof we=="object"?we.exports=T():typeof define=="function"&&define.amd?define([],T):typeof se=="object"?se.layoutBase=T():C.layoutBase=T()}),"webpackUniversalModuleDefinition")(se,function(){return(function(D){var C={};function T(g){if(C[g])return C[g].exports;var o=C[g]={i:g,l:!1,exports:{}};return D[g].call(o.exports,o,o.exports,T),o.l=!0,o.exports}return L(T,"__webpack_require__"),T.m=D,T.c=C,T.i=function(g){return g},T.d=function(g,o,n){T.o(g,o)||Object.defineProperty(g,o,{configurable:!1,enumerable:!0,get:n})},T.n=function(g){var o=g&&g.__esModule?L(function(){return g.default},"getDefault"):L(function(){return g},"getModuleExports");return T.d(o,"a",o),o},T.o=function(g,o){return Object.prototype.hasOwnProperty.call(g,o)},T.p="",T(T.s=28)})([(function(D,C,T){"use strict";function g(){}L(g,"LayoutConstants"),g.QUALITY=1,g.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,g.DEFAULT_INCREMENTAL=!1,g.DEFAULT_ANIMATION_ON_LAYOUT=!0,g.DEFAULT_ANIMATION_DURING_LAYOUT=!1,g.DEFAULT_ANIMATION_PERIOD=50,g.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,g.DEFAULT_GRAPH_MARGIN=15,g.NODE_DIMENSIONS_INCLUDE_LABELS=!1,g.SIMPLE_NODE_SIZE=40,g.SIMPLE_NODE_HALF_SIZE=g.SIMPLE_NODE_SIZE/2,g.EMPTY_COMPOUND_NODE_SIZE=40,g.MIN_EDGE_LENGTH=1,g.WORLD_BOUNDARY=1e6,g.INITIAL_WORLD_BOUNDARY=g.WORLD_BOUNDARY/1e3,g.WORLD_CENTER_X=1200,g.WORLD_CENTER_Y=900,D.exports=g}),(function(D,C,T){"use strict";var g=T(2),o=T(8),n=T(9);function r(c,t,u){g.call(this,u),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=u,this.bendpoints=[],this.source=c,this.target=t}L(r,"LEdge"),r.prototype=Object.create(g.prototype);for(var a in g)r[a]=g[a];r.prototype.getSource=function(){return this.source},r.prototype.getTarget=function(){return this.target},r.prototype.isInterGraph=function(){return this.isInterGraph},r.prototype.getLength=function(){return this.length},r.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},r.prototype.getBendpoints=function(){return this.bendpoints},r.prototype.getLca=function(){return this.lca},r.prototype.getSourceInLca=function(){return this.sourceInLca},r.prototype.getTargetInLca=function(){return this.targetInLca},r.prototype.getOtherEnd=function(c){if(this.source===c)return this.target;if(this.target===c)return this.source;throw"Node is not incident with this edge"},r.prototype.getOtherEndInGraph=function(c,t){for(var u=this.getOtherEnd(c),i=t.getGraphManager().getRoot();;){if(u.getOwner()==t)return u;if(u.getOwner()==i)break;u=u.getOwner().getParent()}return null},r.prototype.updateLength=function(){var c=new Array(4);this.isOverlapingSourceAndTarget=o.getIntersection(this.target.getRect(),this.source.getRect(),c),this.isOverlapingSourceAndTarget||(this.lengthX=c[0]-c[2],this.lengthY=c[1]-c[3],Math.abs(this.lengthX)<1&&(this.lengthX=n.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=n.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},r.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=n.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=n.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},D.exports=r}),(function(D,C,T){"use strict";function g(o){this.vGraphObject=o}L(g,"LGraphObject"),D.exports=g}),(function(D,C,T){"use strict";var g=T(2),o=T(10),n=T(13),r=T(0),a=T(16),c=T(5);function t(i,e,h,f){h==null&&f==null&&(f=e),g.call(this,f),i.graphManager!=null&&(i=i.graphManager),this.estimatedSize=o.MIN_VALUE,this.inclusionTreeDepth=o.MAX_VALUE,this.vGraphObject=f,this.edges=[],this.graphManager=i,h!=null&&e!=null?this.rect=new n(e.x,e.y,h.width,h.height):this.rect=new n}L(t,"LNode"),t.prototype=Object.create(g.prototype);for(var u in g)t[u]=g[u];t.prototype.getEdges=function(){return this.edges},t.prototype.getChild=function(){return this.child},t.prototype.getOwner=function(){return this.owner},t.prototype.getWidth=function(){return this.rect.width},t.prototype.setWidth=function(i){this.rect.width=i},t.prototype.getHeight=function(){return this.rect.height},t.prototype.setHeight=function(i){this.rect.height=i},t.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},t.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},t.prototype.getCenter=function(){return new c(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},t.prototype.getLocation=function(){return new c(this.rect.x,this.rect.y)},t.prototype.getRect=function(){return this.rect},t.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},t.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},t.prototype.setRect=function(i,e){this.rect.x=i.x,this.rect.y=i.y,this.rect.width=e.width,this.rect.height=e.height},t.prototype.setCenter=function(i,e){this.rect.x=i-this.rect.width/2,this.rect.y=e-this.rect.height/2},t.prototype.setLocation=function(i,e){this.rect.x=i,this.rect.y=e},t.prototype.moveBy=function(i,e){this.rect.x+=i,this.rect.y+=e},t.prototype.getEdgeListToNode=function(i){var e=[],h,f=this;return f.edges.forEach(function(l){if(l.target==i){if(l.source!=f)throw"Incorrect edge source!";e.push(l)}}),e},t.prototype.getEdgesBetween=function(i){var e=[],h,f=this;return f.edges.forEach(function(l){if(!(l.source==f||l.target==f))throw"Incorrect edge source and/or target";(l.target==i||l.source==i)&&e.push(l)}),e},t.prototype.getNeighborsList=function(){var i=new Set,e=this;return e.edges.forEach(function(h){if(h.source==e)i.add(h.target);else{if(h.target!=e)throw"Incorrect incidency!";i.add(h.source)}}),i},t.prototype.withChildren=function(){var i=new Set,e,h;if(i.add(this),this.child!=null)for(var f=this.child.getNodes(),l=0;le?(this.rect.x-=(this.labelWidth-e)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(e+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(h+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>h?(this.rect.y-=(this.labelHeight-h)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(h+this.labelHeight))}}},t.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==o.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},t.prototype.transform=function(i){var e=this.rect.x;e>r.WORLD_BOUNDARY?e=r.WORLD_BOUNDARY:e<-r.WORLD_BOUNDARY&&(e=-r.WORLD_BOUNDARY);var h=this.rect.y;h>r.WORLD_BOUNDARY?h=r.WORLD_BOUNDARY:h<-r.WORLD_BOUNDARY&&(h=-r.WORLD_BOUNDARY);var f=new c(e,h),l=i.inverseTransformPoint(f);this.setLocation(l.x,l.y)},t.prototype.getLeft=function(){return this.rect.x},t.prototype.getRight=function(){return this.rect.x+this.rect.width},t.prototype.getTop=function(){return this.rect.y},t.prototype.getBottom=function(){return this.rect.y+this.rect.height},t.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},D.exports=t}),(function(D,C,T){"use strict";var g=T(0);function o(){}L(o,"FDLayoutConstants");for(var n in g)o[n]=g[n];o.MAX_ITERATIONS=2500,o.DEFAULT_EDGE_LENGTH=50,o.DEFAULT_SPRING_STRENGTH=.45,o.DEFAULT_REPULSION_STRENGTH=4500,o.DEFAULT_GRAVITY_STRENGTH=.4,o.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,o.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,o.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,o.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,o.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,o.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,o.COOLING_ADAPTATION_FACTOR=.33,o.ADAPTATION_LOWER_NODE_LIMIT=1e3,o.ADAPTATION_UPPER_NODE_LIMIT=5e3,o.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,o.MAX_NODE_DISPLACEMENT=o.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,o.MIN_REPULSION_DIST=o.DEFAULT_EDGE_LENGTH/10,o.CONVERGENCE_CHECK_PERIOD=100,o.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,o.MIN_EDGE_LENGTH=1,o.GRID_CALCULATION_CHECK_PERIOD=10,D.exports=o}),(function(D,C,T){"use strict";function g(o,n){o==null&&n==null?(this.x=0,this.y=0):(this.x=o,this.y=n)}L(g,"PointD"),g.prototype.getX=function(){return this.x},g.prototype.getY=function(){return this.y},g.prototype.setX=function(o){this.x=o},g.prototype.setY=function(o){this.y=o},g.prototype.getDifference=function(o){return new DimensionD(this.x-o.x,this.y-o.y)},g.prototype.getCopy=function(){return new g(this.x,this.y)},g.prototype.translate=function(o){return this.x+=o.width,this.y+=o.height,this},D.exports=g}),(function(D,C,T){"use strict";var g=T(2),o=T(10),n=T(0),r=T(7),a=T(3),c=T(1),t=T(13),u=T(12),i=T(11);function e(f,l,A){g.call(this,A),this.estimatedSize=o.MIN_VALUE,this.margin=n.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=f,l!=null&&l instanceof r?this.graphManager=l:l!=null&&l instanceof Layout&&(this.graphManager=l.graphManager)}L(e,"LGraph"),e.prototype=Object.create(g.prototype);for(var h in g)e[h]=g[h];e.prototype.getNodes=function(){return this.nodes},e.prototype.getEdges=function(){return this.edges},e.prototype.getGraphManager=function(){return this.graphManager},e.prototype.getParent=function(){return this.parent},e.prototype.getLeft=function(){return this.left},e.prototype.getRight=function(){return this.right},e.prototype.getTop=function(){return this.top},e.prototype.getBottom=function(){return this.bottom},e.prototype.isConnected=function(){return this.isConnected},e.prototype.add=function(f,l,A){if(l==null&&A==null){var y=f;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(y)>-1)throw"Node already in graph!";return y.owner=this,this.getNodes().push(y),y}else{var v=f;if(!(this.getNodes().indexOf(l)>-1&&this.getNodes().indexOf(A)>-1))throw"Source or target not in graph!";if(!(l.owner==A.owner&&l.owner==this))throw"Both owners must be this graph!";return l.owner!=A.owner?null:(v.source=l,v.target=A,v.isInterGraph=!1,this.getEdges().push(v),l.edges.push(v),A!=l&&A.edges.push(v),v)}},e.prototype.remove=function(f){var l=f;if(f instanceof a){if(l==null)throw"Node is null!";if(!(l.owner!=null&&l.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var A=l.edges.slice(),y,v=A.length,N=0;N-1&&b>-1))throw"Source and/or target doesn't know this edge!";y.source.edges.splice(M,1),y.target!=y.source&&y.target.edges.splice(b,1);var S=y.source.owner.getEdges().indexOf(y);if(S==-1)throw"Not in owner's edge list!";y.source.owner.getEdges().splice(S,1)}},e.prototype.updateLeftTop=function(){for(var f=o.MAX_VALUE,l=o.MAX_VALUE,A,y,v,N=this.getNodes(),S=N.length,M=0;MA&&(f=A),l>y&&(l=y)}return f==o.MAX_VALUE?null:(N[0].getParent().paddingLeft!=null?v=N[0].getParent().paddingLeft:v=this.margin,this.left=l-v,this.top=f-v,new u(this.left,this.top))},e.prototype.updateBounds=function(f){for(var l=o.MAX_VALUE,A=-o.MAX_VALUE,y=o.MAX_VALUE,v=-o.MAX_VALUE,N,S,M,b,$,X=this.nodes,et=X.length,R=0;RN&&(l=N),AM&&(y=M),vN&&(l=N),AM&&(y=M),v=this.nodes.length){var et=0;A.forEach(function(R){R.owner==f&&et++}),et==this.nodes.length&&(this.isConnected=!0)}},D.exports=e}),(function(D,C,T){"use strict";var g,o=T(1);function n(r){g=T(6),this.layout=r,this.graphs=[],this.edges=[]}L(n,"LGraphManager"),n.prototype.addRoot=function(){var r=this.layout.newGraph(),a=this.layout.newNode(null),c=this.add(r,a);return this.setRootGraph(c),this.rootGraph},n.prototype.add=function(r,a,c,t,u){if(c==null&&t==null&&u==null){if(r==null)throw"Graph is null!";if(a==null)throw"Parent node is null!";if(this.graphs.indexOf(r)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(r),r.parent!=null)throw"Already has a parent!";if(a.child!=null)throw"Already has a child!";return r.parent=a,a.child=r,r}else{u=c,t=a,c=r;var i=t.getOwner(),e=u.getOwner();if(!(i!=null&&i.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(e!=null&&e.getGraphManager()==this))throw"Target not in this graph mgr!";if(i==e)return c.isInterGraph=!1,i.add(c,t,u);if(c.isInterGraph=!0,c.source=t,c.target=u,this.edges.indexOf(c)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(c),!(c.source!=null&&c.target!=null))throw"Edge source and/or target is null!";if(!(c.source.edges.indexOf(c)==-1&&c.target.edges.indexOf(c)==-1))throw"Edge already in source and/or target incidency list!";return c.source.edges.push(c),c.target.edges.push(c),c}},n.prototype.remove=function(r){if(r instanceof g){var a=r;if(a.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(a==this.rootGraph||a.parent!=null&&a.parent.graphManager==this))throw"Invalid parent node!";var c=[];c=c.concat(a.getEdges());for(var t,u=c.length,i=0;i=r.getRight()?a[0]+=Math.min(r.getX()-n.getX(),n.getRight()-r.getRight()):r.getX()<=n.getX()&&r.getRight()>=n.getRight()&&(a[0]+=Math.min(n.getX()-r.getX(),r.getRight()-n.getRight())),n.getY()<=r.getY()&&n.getBottom()>=r.getBottom()?a[1]+=Math.min(r.getY()-n.getY(),n.getBottom()-r.getBottom()):r.getY()<=n.getY()&&r.getBottom()>=n.getBottom()&&(a[1]+=Math.min(n.getY()-r.getY(),r.getBottom()-n.getBottom()));var u=Math.abs((r.getCenterY()-n.getCenterY())/(r.getCenterX()-n.getCenterX()));r.getCenterY()===n.getCenterY()&&r.getCenterX()===n.getCenterX()&&(u=1);var i=u*a[0],e=a[1]/u;a[0]i)return a[0]=c,a[1]=h,a[2]=u,a[3]=X,!1;if(tu)return a[0]=e,a[1]=t,a[2]=b,a[3]=i,!1;if(cu?(a[0]=l,a[1]=A,s=!0):(a[0]=f,a[1]=h,s=!0):p===d&&(c>u?(a[0]=e,a[1]=h,s=!0):(a[0]=y,a[1]=A,s=!0)),-E===d?u>c?(a[2]=$,a[3]=X,m=!0):(a[2]=b,a[3]=M,m=!0):E===d&&(u>c?(a[2]=S,a[3]=M,m=!0):(a[2]=et,a[3]=X,m=!0)),s&&m)return!1;if(c>u?t>i?(O=this.getCardinalDirection(p,d,4),x=this.getCardinalDirection(E,d,2)):(O=this.getCardinalDirection(-p,d,3),x=this.getCardinalDirection(-E,d,1)):t>i?(O=this.getCardinalDirection(-p,d,1),x=this.getCardinalDirection(-E,d,3)):(O=this.getCardinalDirection(p,d,2),x=this.getCardinalDirection(E,d,4)),!s)switch(O){case 1:F=h,G=c+-N/d,a[0]=G,a[1]=F;break;case 2:G=y,F=t+v*d,a[0]=G,a[1]=F;break;case 3:F=A,G=c+N/d,a[0]=G,a[1]=F;break;case 4:G=l,F=t+-v*d,a[0]=G,a[1]=F;break}if(!m)switch(x){case 1:Z=M,I=u+-J/d,a[2]=I,a[3]=Z;break;case 2:I=et,Z=i+R*d,a[2]=I,a[3]=Z;break;case 3:Z=X,I=u+J/d,a[2]=I,a[3]=Z;break;case 4:I=$,Z=i+-R*d,a[2]=I,a[3]=Z;break}}return!1},o.getCardinalDirection=function(n,r,a){return n>r?a:1+a%4},o.getIntersection=function(n,r,a,c){if(c==null)return this.getIntersection2(n,r,a);var t=n.x,u=n.y,i=r.x,e=r.y,h=a.x,f=a.y,l=c.x,A=c.y,y=void 0,v=void 0,N=void 0,S=void 0,M=void 0,b=void 0,$=void 0,X=void 0,et=void 0;return N=e-u,M=t-i,$=i*u-t*e,S=A-f,b=h-l,X=l*f-h*A,et=N*b-S*M,et===0?null:(y=(M*X-b*$)/et,v=(S*$-N*X)/et,new g(y,v))},o.angleOfVector=function(n,r,a,c){var t=void 0;return n!==a?(t=Math.atan((c-r)/(a-n)),a=0){var A=(-h+Math.sqrt(h*h-4*e*f))/(2*e),y=(-h-Math.sqrt(h*h-4*e*f))/(2*e),v=null;return A>=0&&A<=1?[A]:y>=0&&y<=1?[y]:v}else return null},o.HALF_PI=.5*Math.PI,o.ONE_AND_HALF_PI=1.5*Math.PI,o.TWO_PI=2*Math.PI,o.THREE_PI=3*Math.PI,D.exports=o}),(function(D,C,T){"use strict";function g(){}L(g,"IMath"),g.sign=function(o){return o>0?1:o<0?-1:0},g.floor=function(o){return o<0?Math.ceil(o):Math.floor(o)},g.ceil=function(o){return o<0?Math.floor(o):Math.ceil(o)},D.exports=g}),(function(D,C,T){"use strict";function g(){}L(g,"Integer"),g.MAX_VALUE=2147483647,g.MIN_VALUE=-2147483648,D.exports=g}),(function(D,C,T){"use strict";var g=(function(){function t(u,i){for(var e=0;e"u"?"undefined":g(n);return n==null||r!="object"&&r!="function"},D.exports=o}),(function(D,C,T){"use strict";function g(h){if(Array.isArray(h)){for(var f=0,l=Array(h.length);f0&&f;){for(N.push(M[0]);N.length>0&&f;){var b=N[0];N.splice(0,1),v.add(b);for(var $=b.getEdges(),y=0;y<$.length;y++){var X=$[y].getOtherEnd(b);if(S.get(b)!=X)if(!v.has(X))N.push(X),S.set(X,b);else{f=!1;break}}}if(!f)h=[];else{var et=[].concat(g(v));h.push(et);for(var y=0;y-1&&M.splice(J,1)}v=new Set,S=new Map}}return h},e.prototype.createDummyNodesForBendpoints=function(h){for(var f=[],l=h.source,A=this.graphManager.calcLowestCommonAncestor(h.source,h.target),y=0;y0){for(var A=this.edgeToDummyNodes.get(l),y=0;y=0&&f.splice(X,1);var et=S.getNeighborsList();et.forEach(function(s){if(l.indexOf(s)<0){var m=A.get(s),p=m-1;p==1&&b.push(s),A.set(s,p)}})}l=l.concat(b),(f.length==1||f.length==2)&&(y=!0,v=f[0])}return v},e.prototype.setGraphManager=function(h){this.graphManager=h},D.exports=e}),(function(D,C,T){"use strict";function g(){}L(g,"RandomSeed"),g.seed=1,g.x=0,g.nextDouble=function(){return g.x=Math.sin(g.seed++)*1e4,g.x-Math.floor(g.x)},D.exports=g}),(function(D,C,T){"use strict";var g=T(5);function o(n,r){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}L(o,"Transform"),o.prototype.getWorldOrgX=function(){return this.lworldOrgX},o.prototype.setWorldOrgX=function(n){this.lworldOrgX=n},o.prototype.getWorldOrgY=function(){return this.lworldOrgY},o.prototype.setWorldOrgY=function(n){this.lworldOrgY=n},o.prototype.getWorldExtX=function(){return this.lworldExtX},o.prototype.setWorldExtX=function(n){this.lworldExtX=n},o.prototype.getWorldExtY=function(){return this.lworldExtY},o.prototype.setWorldExtY=function(n){this.lworldExtY=n},o.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},o.prototype.setDeviceOrgX=function(n){this.ldeviceOrgX=n},o.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},o.prototype.setDeviceOrgY=function(n){this.ldeviceOrgY=n},o.prototype.getDeviceExtX=function(){return this.ldeviceExtX},o.prototype.setDeviceExtX=function(n){this.ldeviceExtX=n},o.prototype.getDeviceExtY=function(){return this.ldeviceExtY},o.prototype.setDeviceExtY=function(n){this.ldeviceExtY=n},o.prototype.transformX=function(n){var r=0,a=this.lworldExtX;return a!=0&&(r=this.ldeviceOrgX+(n-this.lworldOrgX)*this.ldeviceExtX/a),r},o.prototype.transformY=function(n){var r=0,a=this.lworldExtY;return a!=0&&(r=this.ldeviceOrgY+(n-this.lworldOrgY)*this.ldeviceExtY/a),r},o.prototype.inverseTransformX=function(n){var r=0,a=this.ldeviceExtX;return a!=0&&(r=this.lworldOrgX+(n-this.ldeviceOrgX)*this.lworldExtX/a),r},o.prototype.inverseTransformY=function(n){var r=0,a=this.ldeviceExtY;return a!=0&&(r=this.lworldOrgY+(n-this.ldeviceOrgY)*this.lworldExtY/a),r},o.prototype.inverseTransformPoint=function(n){var r=new g(this.inverseTransformX(n.x),this.inverseTransformY(n.y));return r},D.exports=o}),(function(D,C,T){"use strict";function g(i){if(Array.isArray(i)){for(var e=0,h=Array(i.length);en.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*n.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(i-n.ADAPTATION_LOWER_NODE_LIMIT)/(n.ADAPTATION_UPPER_NODE_LIMIT-n.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-n.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=n.MAX_NODE_DISPLACEMENT_INCREMENTAL):(i>n.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(n.COOLING_ADAPTATION_FACTOR,1-(i-n.ADAPTATION_LOWER_NODE_LIMIT)/(n.ADAPTATION_UPPER_NODE_LIMIT-n.ADAPTATION_LOWER_NODE_LIMIT)*(1-n.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=n.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*n.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},t.prototype.calcSpringForces=function(){for(var i=this.getAllEdges(),e,h=0;h0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,h,f,l,A,y=this.getAllNodes(),v;if(this.useFRGridVariant)for(this.totalIterations%n.GRID_CALCULATION_CHECK_PERIOD==1&&i&&this.updateGrid(),v=new Set,h=0;hN||v>N)&&(i.gravitationForceX=-this.gravityConstant*l,i.gravitationForceY=-this.gravityConstant*A)):(N=e.getEstimatedSize()*this.compoundGravityRangeFactor,(y>N||v>N)&&(i.gravitationForceX=-this.gravityConstant*l*this.compoundGravityConstant,i.gravitationForceY=-this.gravityConstant*A*this.compoundGravityConstant))},t.prototype.isConverged=function(){var i,e=!1;return this.totalIterations>this.maxIterations/3&&(e=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),i=this.totalDisplacement=y.length||N>=y[0].length)){for(var S=0;St},"_defaultCompareFunction")}]),a})();D.exports=r}),(function(D,C,T){"use strict";function g(){}L(g,"SVD"),g.svd=function(o){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=o.length,this.n=o[0].length;var n=Math.min(this.m,this.n);this.s=(function(xt){for(var At=[];xt-- >0;)At.push(0);return At})(Math.min(this.m+1,this.n)),this.U=(function(xt){var At=L(function $t(It){if(It.length==0)return 0;for(var Xt=[],Bt=0;Bt0;)At.push(0);return At})(this.n),a=(function(xt){for(var At=[];xt-- >0;)At.push(0);return At})(this.m),c=!0,t=!0,u=Math.min(this.m-1,this.n),i=Math.max(0,Math.min(this.n-2,this.m)),e=0;e=0;d--)if(this.s[d]!==0){for(var O=d+1;O=0;P--){if((function(xt,At){return xt&&At})(P0;){var Q=void 0,Yt=void 0;for(Q=m-2;Q>=-1&&Q!==-1;Q--)if(Math.abs(r[Q])<=St+Nt*(Math.abs(this.s[Q])+Math.abs(this.s[Q+1]))){r[Q]=0;break}if(Q===m-2)Yt=4;else{var Mt=void 0;for(Mt=m-1;Mt>=Q&&Mt!==Q;Mt--){var ot=(Mt!==m?Math.abs(r[Mt]):0)+(Mt!==Q+1?Math.abs(r[Mt-1]):0);if(Math.abs(this.s[Mt])<=St+Nt*ot){this.s[Mt]=0;break}}Mt===Q?Yt=3:Mt===m-1?Yt=1:(Yt=2,Q=Mt)}switch(Q++,Yt){case 1:{var rt=r[m-2];r[m-2]=0;for(var vt=m-2;vt>=Q;vt--){var mt=g.hypot(this.s[vt],rt),Lt=this.s[vt]/mt,Et=rt/mt;if(this.s[vt]=mt,vt!==Q&&(rt=-Et*r[vt-1],r[vt-1]=Lt*r[vt-1]),t)for(var Tt=0;Tt=this.s[Q+1]);){var ct=this.s[Q];if(this.s[Q]=this.s[Q+1],this.s[Q+1]=ct,t&&QMath.abs(n)?(r=n/o,r=Math.abs(o)*Math.sqrt(1+r*r)):n!=0?(r=o/n,r=Math.abs(n)*Math.sqrt(1+r*r)):r=0,r},D.exports=g}),(function(D,C,T){"use strict";var g=(function(){function r(a,c){for(var t=0;t2&&arguments[2]!==void 0?arguments[2]:1,u=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;o(this,r),this.sequence1=a,this.sequence2=c,this.match_score=t,this.mismatch_penalty=u,this.gap_penalty=i,this.iMax=a.length+1,this.jMax=c.length+1,this.grid=new Array(this.iMax);for(var e=0;e=0;a--){var c=this.listeners[a];c.event===n&&c.callback===r&&this.listeners.splice(a,1)}},o.emit=function(n,r){for(var a=0;a{"use strict";L((function(C,T){typeof he=="object"&&typeof Oe=="object"?Oe.exports=T(xe()):typeof define=="function"&&define.amd?define(["layout-base"],T):typeof he=="object"?he.coseBase=T(xe()):C.coseBase=T(C.layoutBase)}),"webpackUniversalModuleDefinition")(he,function(D){return(()=>{"use strict";var C={45:((n,r,a)=>{var c={};c.layoutBase=a(551),c.CoSEConstants=a(806),c.CoSEEdge=a(767),c.CoSEGraph=a(880),c.CoSEGraphManager=a(578),c.CoSELayout=a(765),c.CoSENode=a(991),c.ConstraintHandler=a(902),n.exports=c}),806:((n,r,a)=>{var c=a(551).FDLayoutConstants;function t(){}L(t,"CoSEConstants");for(var u in c)t[u]=c[u];t.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,t.DEFAULT_RADIAL_SEPARATION=c.DEFAULT_EDGE_LENGTH,t.DEFAULT_COMPONENT_SEPERATION=60,t.TILE=!0,t.TILING_PADDING_VERTICAL=10,t.TILING_PADDING_HORIZONTAL=10,t.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,t.ENFORCE_CONSTRAINTS=!0,t.APPLY_LAYOUT=!0,t.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,t.TREE_REDUCTION_ON_INCREMENTAL=!0,t.PURE_INCREMENTAL=t.DEFAULT_INCREMENTAL,n.exports=t}),767:((n,r,a)=>{var c=a(551).FDLayoutEdge;function t(i,e,h){c.call(this,i,e,h)}L(t,"CoSEEdge"),t.prototype=Object.create(c.prototype);for(var u in c)t[u]=c[u];n.exports=t}),880:((n,r,a)=>{var c=a(551).LGraph;function t(i,e,h){c.call(this,i,e,h)}L(t,"CoSEGraph"),t.prototype=Object.create(c.prototype);for(var u in c)t[u]=c[u];n.exports=t}),578:((n,r,a)=>{var c=a(551).LGraphManager;function t(i){c.call(this,i)}L(t,"CoSEGraphManager"),t.prototype=Object.create(c.prototype);for(var u in c)t[u]=c[u];n.exports=t}),765:((n,r,a)=>{var c=a(551).FDLayout,t=a(578),u=a(880),i=a(991),e=a(767),h=a(806),f=a(902),l=a(551).FDLayoutConstants,A=a(551).LayoutConstants,y=a(551).Point,v=a(551).PointD,N=a(551).DimensionD,S=a(551).Layout,M=a(551).Integer,b=a(551).IGeometry,$=a(551).LGraph,X=a(551).Transform,et=a(551).LinkedList;function R(){c.call(this),this.toBeTiled={},this.constraints={}}L(R,"CoSELayout"),R.prototype=Object.create(c.prototype);for(var J in c)R[J]=c[J];R.prototype.newGraphManager=function(){var s=new t(this);return this.graphManager=s,s},R.prototype.newGraph=function(s){return new u(null,this.graphManager,s)},R.prototype.newNode=function(s){return new i(this.graphManager,s)},R.prototype.newEdge=function(s){return new e(null,null,s)},R.prototype.initParameters=function(){c.prototype.initParameters.call(this,arguments),this.isSubLayout||(h.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=h.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=h.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=l.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=l.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=l.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=l.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},R.prototype.initSpringEmbedder=function(){c.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/l.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},R.prototype.layout=function(){var s=A.DEFAULT_CREATE_BENDS_AS_NEEDED;return s&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},R.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(h.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var m=new Set(this.getAllNodes()),p=this.nodesWithGravity.filter(function(O){return m.has(O)});this.graphManager.setAllNodesToApplyGravitation(p)}}else{var s=this.getFlatForest();if(s.length>0)this.positionNodesRadially(s);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var m=new Set(this.getAllNodes()),p=this.nodesWithGravity.filter(function(E){return m.has(E)});this.graphManager.setAllNodesToApplyGravitation(p),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(f.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),h.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},R.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%l.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var s=new Set(this.getAllNodes()),m=this.nodesWithGravity.filter(function(d){return s.has(d)});this.graphManager.setAllNodesToApplyGravitation(m),this.graphManager.updateBounds(),this.updateGrid(),h.PURE_INCREMENTAL?this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),h.PURE_INCREMENTAL?this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var p=!this.isTreeGrowing&&!this.isGrowthFinished,E=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(p,E),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},R.prototype.getPositionsData=function(){for(var s=this.graphManager.getAllNodes(),m={},p=0;p0&&this.updateDisplacements();for(var p=0;p0&&(E.fixedNodeWeight=O)}}if(this.constraints.relativePlacementConstraint){var x=new Map,G=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(w){s.fixedNodesOnHorizontal.add(w),s.fixedNodesOnVertical.add(w)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var F=this.constraints.alignmentConstraint.vertical,p=0;p=2*w.length/3;K--)U=Math.floor(Math.random()*(K+1)),H=w[K],w[K]=w[U],w[U]=H;return w},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(w){if(w.left){var U=x.has(w.left)?x.get(w.left):w.left,H=x.has(w.right)?x.get(w.right):w.right;s.nodesInRelativeHorizontal.includes(U)||(s.nodesInRelativeHorizontal.push(U),s.nodeToRelativeConstraintMapHorizontal.set(U,[]),s.dummyToNodeForVerticalAlignment.has(U)?s.nodeToTempPositionMapHorizontal.set(U,s.idToNodeMap.get(s.dummyToNodeForVerticalAlignment.get(U)[0]).getCenterX()):s.nodeToTempPositionMapHorizontal.set(U,s.idToNodeMap.get(U).getCenterX())),s.nodesInRelativeHorizontal.includes(H)||(s.nodesInRelativeHorizontal.push(H),s.nodeToRelativeConstraintMapHorizontal.set(H,[]),s.dummyToNodeForVerticalAlignment.has(H)?s.nodeToTempPositionMapHorizontal.set(H,s.idToNodeMap.get(s.dummyToNodeForVerticalAlignment.get(H)[0]).getCenterX()):s.nodeToTempPositionMapHorizontal.set(H,s.idToNodeMap.get(H).getCenterX())),s.nodeToRelativeConstraintMapHorizontal.get(U).push({right:H,gap:w.gap}),s.nodeToRelativeConstraintMapHorizontal.get(H).push({left:U,gap:w.gap})}else{var K=G.has(w.top)?G.get(w.top):w.top,ht=G.has(w.bottom)?G.get(w.bottom):w.bottom;s.nodesInRelativeVertical.includes(K)||(s.nodesInRelativeVertical.push(K),s.nodeToRelativeConstraintMapVertical.set(K,[]),s.dummyToNodeForHorizontalAlignment.has(K)?s.nodeToTempPositionMapVertical.set(K,s.idToNodeMap.get(s.dummyToNodeForHorizontalAlignment.get(K)[0]).getCenterY()):s.nodeToTempPositionMapVertical.set(K,s.idToNodeMap.get(K).getCenterY())),s.nodesInRelativeVertical.includes(ht)||(s.nodesInRelativeVertical.push(ht),s.nodeToRelativeConstraintMapVertical.set(ht,[]),s.dummyToNodeForHorizontalAlignment.has(ht)?s.nodeToTempPositionMapVertical.set(ht,s.idToNodeMap.get(s.dummyToNodeForHorizontalAlignment.get(ht)[0]).getCenterY()):s.nodeToTempPositionMapVertical.set(ht,s.idToNodeMap.get(ht).getCenterY())),s.nodeToRelativeConstraintMapVertical.get(K).push({bottom:ht,gap:w.gap}),s.nodeToRelativeConstraintMapVertical.get(ht).push({top:K,gap:w.gap})}});else{var Z=new Map,tt=new Map;this.constraints.relativePlacementConstraint.forEach(function(w){if(w.left){var U=x.has(w.left)?x.get(w.left):w.left,H=x.has(w.right)?x.get(w.right):w.right;Z.has(U)?Z.get(U).push(H):Z.set(U,[H]),Z.has(H)?Z.get(H).push(U):Z.set(H,[U])}else{var K=G.has(w.top)?G.get(w.top):w.top,ht=G.has(w.bottom)?G.get(w.bottom):w.bottom;tt.has(K)?tt.get(K).push(ht):tt.set(K,[ht]),tt.has(ht)?tt.get(ht).push(K):tt.set(ht,[K])}});var P=L(function(U,H){var K=[],ht=[],Nt=new et,St=new Set,Q=0;return U.forEach(function(Yt,Mt){if(!St.has(Mt)){K[Q]=[],ht[Q]=!1;var ot=Mt;for(Nt.push(ot),St.add(ot),K[Q].push(ot);Nt.length!=0;){ot=Nt.shift(),H.has(ot)&&(ht[Q]=!0);var rt=U.get(ot);rt.forEach(function(vt){St.has(vt)||(Nt.push(vt),St.add(vt),K[Q].push(vt))})}Q++}}),{components:K,isFixed:ht}},"constructComponents"),_=P(Z,s.fixedNodesOnHorizontal);this.componentsOnHorizontal=_.components,this.fixedComponentsOnHorizontal=_.isFixed;var B=P(tt,s.fixedNodesOnVertical);this.componentsOnVertical=B.components,this.fixedComponentsOnVertical=B.isFixed}}},R.prototype.updateDisplacements=function(){var s=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(B){var w=s.idToNodeMap.get(B.nodeId);w.displacementX=0,w.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var m=this.constraints.alignmentConstraint.vertical,p=0;p1){var G;for(G=0;GE&&(E=Math.floor(x.y)),O=Math.floor(x.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new v(A.WORLD_CENTER_X-x.x/2,A.WORLD_CENTER_Y-x.y/2))},R.radialLayout=function(s,m,p){var E=Math.max(this.maxDiagonalInTree(s),h.DEFAULT_RADIAL_SEPARATION);R.branchRadialLayout(m,null,0,359,0,E);var d=$.calculateBounds(s),O=new X;O.setDeviceOrgX(d.getMinX()),O.setDeviceOrgY(d.getMinY()),O.setWorldOrgX(p.x),O.setWorldOrgY(p.y);for(var x=0;x1;){var K=H[0];H.splice(0,1);var ht=P.indexOf(K);ht>=0&&P.splice(ht,1),w--,_--}m!=null?U=(P.indexOf(H[0])+1)%w:U=0;for(var Nt=Math.abs(E-p)/_,St=U;B!=_;St=++St%w){var Q=P[St].getOtherEnd(s);if(Q!=m){var Yt=(p+B*Nt)%360,Mt=(Yt+Nt)%360;R.branchRadialLayout(Q,s,Yt,Mt,d+O,O),B++}}},R.maxDiagonalInTree=function(s){for(var m=M.MIN_VALUE,p=0;pm&&(m=d)}return m},R.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},R.prototype.groupZeroDegreeMembers=function(){var s=this,m={};this.memberGroups={},this.idToDummyNode={};for(var p=[],E=this.graphManager.getAllNodes(),d=0;d"u"&&(m[G]=[]),m[G]=m[G].concat(O)}Object.keys(m).forEach(function(F){if(m[F].length>1){var I="DummyCompound_"+F;s.memberGroups[I]=m[F];var Z=m[F][0].getParent(),tt=new i(s.graphManager);tt.id=I,tt.paddingLeft=Z.paddingLeft||0,tt.paddingRight=Z.paddingRight||0,tt.paddingBottom=Z.paddingBottom||0,tt.paddingTop=Z.paddingTop||0,s.idToDummyNode[I]=tt;var P=s.getGraphManager().add(s.newGraph(),tt),_=Z.getChild();_.add(tt);for(var B=0;Bd?(E.rect.x-=(E.labelWidth-d)/2,E.setWidth(E.labelWidth),E.labelMarginLeft=(E.labelWidth-d)/2):E.labelPosHorizontal=="right"&&E.setWidth(d+E.labelWidth)),E.labelHeight&&(E.labelPosVertical=="top"?(E.rect.y-=E.labelHeight,E.setHeight(O+E.labelHeight),E.labelMarginTop=E.labelHeight):E.labelPosVertical=="center"&&E.labelHeight>O?(E.rect.y-=(E.labelHeight-O)/2,E.setHeight(E.labelHeight),E.labelMarginTop=(E.labelHeight-O)/2):E.labelPosVertical=="bottom"&&E.setHeight(O+E.labelHeight))}})},R.prototype.repopulateCompounds=function(){for(var s=this.compoundOrder.length-1;s>=0;s--){var m=this.compoundOrder[s],p=m.id,E=m.paddingLeft,d=m.paddingTop,O=m.labelMarginLeft,x=m.labelMarginTop;this.adjustLocations(this.tiledMemberPack[p],m.rect.x,m.rect.y,E,d,O,x)}},R.prototype.repopulateZeroDegreeMembers=function(){var s=this,m=this.tiledZeroDegreePack;Object.keys(m).forEach(function(p){var E=s.idToDummyNode[p],d=E.paddingLeft,O=E.paddingTop,x=E.labelMarginLeft,G=E.labelMarginTop;s.adjustLocations(m[p],E.rect.x,E.rect.y,d,O,x,G)})},R.prototype.getToBeTiled=function(s){var m=s.id;if(this.toBeTiled[m]!=null)return this.toBeTiled[m];var p=s.getChild();if(p==null)return this.toBeTiled[m]=!1,!1;for(var E=p.getNodes(),d=0;d0)return this.toBeTiled[m]=!1,!1;if(O.getChild()==null){this.toBeTiled[O.id]=!1;continue}if(!this.getToBeTiled(O))return this.toBeTiled[m]=!1,!1}return this.toBeTiled[m]=!0,!0},R.prototype.getNodeDegree=function(s){for(var m=s.id,p=s.getEdges(),E=0,d=0;dZ&&(Z=P.rect.height)}p+=Z+s.verticalPadding}},R.prototype.tileCompoundMembers=function(s,m){var p=this;this.tiledMemberPack=[],Object.keys(s).forEach(function(E){var d=m[E];if(p.tiledMemberPack[E]=p.tileNodes(s[E],d.paddingLeft+d.paddingRight),d.rect.width=p.tiledMemberPack[E].width,d.rect.height=p.tiledMemberPack[E].height,d.setCenter(p.tiledMemberPack[E].centerX,p.tiledMemberPack[E].centerY),d.labelMarginLeft=0,d.labelMarginTop=0,h.NODE_DIMENSIONS_INCLUDE_LABELS){var O=d.rect.width,x=d.rect.height;d.labelWidth&&(d.labelPosHorizontal=="left"?(d.rect.x-=d.labelWidth,d.setWidth(O+d.labelWidth),d.labelMarginLeft=d.labelWidth):d.labelPosHorizontal=="center"&&d.labelWidth>O?(d.rect.x-=(d.labelWidth-O)/2,d.setWidth(d.labelWidth),d.labelMarginLeft=(d.labelWidth-O)/2):d.labelPosHorizontal=="right"&&d.setWidth(O+d.labelWidth)),d.labelHeight&&(d.labelPosVertical=="top"?(d.rect.y-=d.labelHeight,d.setHeight(x+d.labelHeight),d.labelMarginTop=d.labelHeight):d.labelPosVertical=="center"&&d.labelHeight>x?(d.rect.y-=(d.labelHeight-x)/2,d.setHeight(d.labelHeight),d.labelMarginTop=(d.labelHeight-x)/2):d.labelPosVertical=="bottom"&&d.setHeight(x+d.labelHeight))}})},R.prototype.tileNodes=function(s,m){var p=this.tileNodesByFavoringDim(s,m,!0),E=this.tileNodesByFavoringDim(s,m,!1),d=this.getOrgRatio(p),O=this.getOrgRatio(E),x;return OG&&(G=B.getWidth())});var F=O/d,I=x/d,Z=Math.pow(p-E,2)+4*(F+E)*(I+p)*d,tt=(E-p+Math.sqrt(Z))/(2*(F+E)),P;m?(P=Math.ceil(tt),P==tt&&P++):P=Math.floor(tt);var _=P*(F+E)-E;return G>_&&(_=G),_+=E*2,_},R.prototype.tileNodesByFavoringDim=function(s,m,p){var E=h.TILING_PADDING_VERTICAL,d=h.TILING_PADDING_HORIZONTAL,O=h.TILING_COMPARE_BY,x={rows:[],rowWidth:[],rowHeight:[],width:0,height:m,verticalPadding:E,horizontalPadding:d,centerX:0,centerY:0};O&&(x.idealRowWidth=this.calcIdealRowWidth(s,p));var G=L(function(w){return w.rect.width*w.rect.height},"getNodeArea"),F=L(function(w,U){return G(U)-G(w)},"areaCompareFcn");s.sort(function(B,w){var U=F;return x.idealRowWidth?(U=O,U(B.id,w.id)):U(B,w)});for(var I=0,Z=0,tt=0;tt0&&(x+=s.horizontalPadding),s.rowWidth[p]=x,s.width0&&(G+=s.verticalPadding);var F=0;G>s.rowHeight[p]&&(F=s.rowHeight[p],s.rowHeight[p]=G,F=s.rowHeight[p]-F),s.height+=F,s.rows[p].push(m)},R.prototype.getShortestRowIndex=function(s){for(var m=-1,p=Number.MAX_VALUE,E=0;Ep&&(m=E,p=s.rowWidth[E]);return m},R.prototype.canAddHorizontal=function(s,m,p){if(s.idealRowWidth){var E=s.rows.length-1,d=s.rowWidth[E];return d+m+s.horizontalPadding<=s.idealRowWidth}var O=this.getShortestRowIndex(s);if(O<0)return!0;var x=s.rowWidth[O];if(x+s.horizontalPadding+m<=s.width)return!0;var G=0;s.rowHeight[O]0&&(G=p+s.verticalPadding-s.rowHeight[O]);var F;s.width-x>=m+s.horizontalPadding?F=(s.height+G)/(x+m+s.horizontalPadding):F=(s.height+G)/s.width,G=p+s.verticalPadding;var I;return s.widthO&&m!=p){E.splice(-1,1),s.rows[p].push(d),s.rowWidth[m]=s.rowWidth[m]-O,s.rowWidth[p]=s.rowWidth[p]+O,s.width=s.rowWidth[instance.getLongestRowIndex(s)];for(var x=Number.MIN_VALUE,G=0;Gx&&(x=E[G].height);m>0&&(x+=s.verticalPadding);var F=s.rowHeight[m]+s.rowHeight[p];s.rowHeight[m]=x,s.rowHeight[p]0)for(var _=d;_<=O;_++)P[0]+=this.grid[_][x-1].length+this.grid[_][x].length-1;if(O0)for(var _=x;_<=G;_++)P[3]+=this.grid[d-1][_].length+this.grid[d][_].length-1;for(var B=M.MAX_VALUE,w,U,H=0;H{var c=a(551).FDLayoutNode,t=a(551).IMath;function u(e,h,f,l){c.call(this,e,h,f,l)}L(u,"CoSENode"),u.prototype=Object.create(c.prototype);for(var i in c)u[i]=c[i];u.prototype.calculateDisplacement=function(){var e=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=e.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=e.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=e.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=e.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>e.coolingFactor*e.maxNodeDisplacement&&(this.displacementX=e.coolingFactor*e.maxNodeDisplacement*t.sign(this.displacementX)),Math.abs(this.displacementY)>e.coolingFactor*e.maxNodeDisplacement&&(this.displacementY=e.coolingFactor*e.maxNodeDisplacement*t.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},u.prototype.propogateDisplacementToChildren=function(e,h){for(var f=this.getChild().getNodes(),l,A=0;A{function c(f){if(Array.isArray(f)){for(var l=0,A=Array(f.length);l0){var dt=0;nt.forEach(function(ct){V=="horizontal"?(q.set(ct,y.has(ct)?v[y.get(ct)]:k.get(ct)),dt+=q.get(ct)):(q.set(ct,y.has(ct)?N[y.get(ct)]:k.get(ct)),dt+=q.get(ct))}),dt=dt/nt.length,st.forEach(function(ct){z.has(ct)||q.set(ct,dt)})}else{var at=0;st.forEach(function(ct){V=="horizontal"?at+=y.has(ct)?v[y.get(ct)]:k.get(ct):at+=y.has(ct)?N[y.get(ct)]:k.get(ct)}),at=at/st.length,st.forEach(function(ct){q.set(ct,at)})}});for(var it=L(function(){var nt=ut.shift(),dt=W.get(nt);dt.forEach(function(at){if(q.get(at.id)ct&&(ct=Xt),Btbt&&(bt=Bt)}}catch(ee){Vt=!0,xt=ee}finally{try{!Ot&&At.return&&At.return()}finally{if(Vt)throw xt}}var ve=(dt+ct)/2-(at+bt)/2,qt=!0,jt=!1,_t=void 0;try{for(var Qt=st[Symbol.iterator](),ce;!(qt=(ce=Qt.next()).done);qt=!0){var te=ce.value;q.set(te,q.get(te)+ve)}}catch(ee){jt=!0,_t=ee}finally{try{!qt&&Qt.return&&Qt.return()}finally{if(jt)throw _t}}})}return q},"findAppropriatePositionForRelativePlacement"),J=L(function(W){var V=0,z=0,k=0,j=0;if(W.forEach(function(lt){lt.left?v[y.get(lt.left)]-v[y.get(lt.right)]>=0?V++:z++:N[y.get(lt.top)]-N[y.get(lt.bottom)]>=0?k++:j++}),V>z&&k>j)for(var gt=0;gtz)for(var ft=0;ftj)for(var q=0;q1)l.fixedNodeConstraint.forEach(function(Y,W){E[W]=[Y.position.x,Y.position.y],d[W]=[v[y.get(Y.nodeId)],N[y.get(Y.nodeId)]]}),O=!0;else if(l.alignmentConstraint)(function(){var Y=0;if(l.alignmentConstraint.vertical){for(var W=l.alignmentConstraint.vertical,V=L(function(q){var lt=new Set;W[q].forEach(function(pt){lt.add(pt)});var ut=new Set([].concat(c(lt)).filter(function(pt){return G.has(pt)})),it=void 0;ut.size>0?it=v[y.get(ut.values().next().value)]:it=et(lt).x,W[q].forEach(function(pt){E[Y]=[it,N[y.get(pt)]],d[Y]=[v[y.get(pt)],N[y.get(pt)]],Y++})},"_loop2"),z=0;z0?it=v[y.get(ut.values().next().value)]:it=et(lt).y,k[q].forEach(function(pt){E[Y]=[v[y.get(pt)],it],d[Y]=[v[y.get(pt)],N[y.get(pt)]],Y++})},"_loop3"),gt=0;gttt&&(tt=Z[_].length,P=_);if(tt0){var Lt={x:0,y:0};l.fixedNodeConstraint.forEach(function(Y,W){var V={x:v[y.get(Y.nodeId)],y:N[y.get(Y.nodeId)]},z=Y.position,k=X(z,V);Lt.x+=k.x,Lt.y+=k.y}),Lt.x/=l.fixedNodeConstraint.length,Lt.y/=l.fixedNodeConstraint.length,v.forEach(function(Y,W){v[W]+=Lt.x}),N.forEach(function(Y,W){N[W]+=Lt.y}),l.fixedNodeConstraint.forEach(function(Y){v[y.get(Y.nodeId)]=Y.position.x,N[y.get(Y.nodeId)]=Y.position.y})}if(l.alignmentConstraint){if(l.alignmentConstraint.vertical)for(var Et=l.alignmentConstraint.vertical,Tt=L(function(W){var V=new Set;Et[W].forEach(function(j){V.add(j)});var z=new Set([].concat(c(V)).filter(function(j){return G.has(j)})),k=void 0;z.size>0?k=v[y.get(z.values().next().value)]:k=et(V).x,V.forEach(function(j){G.has(j)||(v[y.get(j)]=k)})},"_loop4"),wt=0;wt0?k=N[y.get(z.values().next().value)]:k=et(V).y,V.forEach(function(j){G.has(j)||(N[y.get(j)]=k)})},"_loop5"),Pt=0;Pt{n.exports=D})},T={};function g(n){var r=T[n];if(r!==void 0)return r.exports;var a=T[n]={exports:{}};return C[n](a,a.exports,g),a.exports}L(g,"__webpack_require__");var o=g(45);return o})()})});var cr=Ae((le,Ie)=>{"use strict";L((function(C,T){typeof le=="object"&&typeof Ie=="object"?Ie.exports=T(Re()):typeof define=="function"&&define.amd?define(["cose-base"],T):typeof le=="object"?le.cytoscapeFcose=T(Re()):C.cytoscapeFcose=T(C.coseBase)}),"webpackUniversalModuleDefinition")(le,function(D){return(()=>{"use strict";var C={658:(n=>{n.exports=Object.assign!=null?Object.assign.bind(Object):function(r){for(var a=arguments.length,c=Array(a>1?a-1:0),t=1;t{var c=(function(){function i(e,h){var f=[],l=!0,A=!1,y=void 0;try{for(var v=e[Symbol.iterator](),N;!(l=(N=v.next()).done)&&(f.push(N.value),!(h&&f.length===h));l=!0);}catch(S){A=!0,y=S}finally{try{!l&&v.return&&v.return()}finally{if(A)throw y}}return f}return L(i,"sliceIterator"),function(e,h){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return i(e,h);throw new TypeError("Invalid attempt to destructure non-iterable instance")}})(),t=a(140).layoutBase.LinkedList,u={};u.getTopMostNodes=function(i){for(var e={},h=0;h0&&O.merge(I)});for(var x=0;x1){N=y[0],S=N.connectedEdges().length,y.forEach(function(d){d.connectedEdges().length0&&f.set("dummy"+(f.size+1),$),X},u.relocateComponent=function(i,e,h){if(!h.fixedNodeConstraint){var f=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,A=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY;if(h.quality=="draft"){var v=!0,N=!1,S=void 0;try{for(var M=e.nodeIndexes[Symbol.iterator](),b;!(v=(b=M.next()).done);v=!0){var $=b.value,X=c($,2),et=X[0],R=X[1],J=h.cy.getElementById(et);if(J){var s=J.boundingBox(),m=e.xCoords[R]-s.w/2,p=e.xCoords[R]+s.w/2,E=e.yCoords[R]-s.h/2,d=e.yCoords[R]+s.h/2;ml&&(l=p),Ey&&(y=d)}}}catch(I){N=!0,S=I}finally{try{!v&&M.return&&M.return()}finally{if(N)throw S}}var O=i.x-(l+f)/2,x=i.y-(y+A)/2;e.xCoords=e.xCoords.map(function(I){return I+O}),e.yCoords=e.yCoords.map(function(I){return I+x})}else{Object.keys(e).forEach(function(I){var Z=e[I],tt=Z.getRect().x,P=Z.getRect().x+Z.getRect().width,_=Z.getRect().y,B=Z.getRect().y+Z.getRect().height;ttl&&(l=P),_y&&(y=B)});var G=i.x-(l+f)/2,F=i.y-(y+A)/2;Object.keys(e).forEach(function(I){var Z=e[I];Z.setCenter(Z.getCenterX()+G,Z.getCenterY()+F)})}}},u.calcBoundingBox=function(i,e,h,f){for(var l=Number.MAX_SAFE_INTEGER,A=Number.MIN_SAFE_INTEGER,y=Number.MAX_SAFE_INTEGER,v=Number.MIN_SAFE_INTEGER,N=void 0,S=void 0,M=void 0,b=void 0,$=i.descendants().not(":parent"),X=$.length,et=0;etN&&(l=N),AM&&(y=M),v{var c=a(548),t=a(140).CoSELayout,u=a(140).CoSENode,i=a(140).layoutBase.PointD,e=a(140).layoutBase.DimensionD,h=a(140).layoutBase.LayoutConstants,f=a(140).layoutBase.FDLayoutConstants,l=a(140).CoSEConstants,A=L(function(v,N){var S=v.cy,M=v.eles,b=M.nodes(),$=M.edges(),X=void 0,et=void 0,R=void 0,J={};v.randomize&&(X=N.nodeIndexes,et=N.xCoords,R=N.yCoords);var s=L(function(I){return typeof I=="function"},"isFn"),m=L(function(I,Z){return s(I)?I(Z):I},"optFn"),p=c.calcParentsWithoutChildren(S,M),E=L(function F(I,Z,tt,P){for(var _=Z.length,B=0;B<_;B++){var w=Z[B],U=null;w.intersection(p).length==0&&(U=w.children());var H=void 0,K=w.layoutDimensions({nodeDimensionsIncludeLabels:P.nodeDimensionsIncludeLabels});if(w.outerWidth()!=null&&w.outerHeight()!=null)if(P.randomize)if(!w.isParent())H=I.add(new u(tt.graphManager,new i(et[X.get(w.id())]-K.w/2,R[X.get(w.id())]-K.h/2),new e(parseFloat(K.w),parseFloat(K.h))));else{var ht=c.calcBoundingBox(w,et,R,X);w.intersection(p).length==0?H=I.add(new u(tt.graphManager,new i(ht.topLeftX,ht.topLeftY),new e(ht.width,ht.height))):H=I.add(new u(tt.graphManager,new i(ht.topLeftX,ht.topLeftY),new e(parseFloat(K.w),parseFloat(K.h))))}else H=I.add(new u(tt.graphManager,new i(w.position("x")-K.w/2,w.position("y")-K.h/2),new e(parseFloat(K.w),parseFloat(K.h))));else H=I.add(new u(this.graphManager));if(H.id=w.data("id"),H.nodeRepulsion=m(P.nodeRepulsion,w),H.paddingLeft=parseInt(w.css("padding")),H.paddingTop=parseInt(w.css("padding")),H.paddingRight=parseInt(w.css("padding")),H.paddingBottom=parseInt(w.css("padding")),P.nodeDimensionsIncludeLabels&&(H.labelWidth=w.boundingBox({includeLabels:!0,includeNodes:!1,includeOverlays:!1}).w,H.labelHeight=w.boundingBox({includeLabels:!0,includeNodes:!1,includeOverlays:!1}).h,H.labelPosVertical=w.css("text-valign"),H.labelPosHorizontal=w.css("text-halign")),J[w.data("id")]=H,isNaN(H.rect.x)&&(H.rect.x=0),isNaN(H.rect.y)&&(H.rect.y=0),U!=null&&U.length>0){var Nt=void 0;Nt=tt.getGraphManager().add(tt.newGraph(),H),F(Nt,U,tt,P)}}},"processChildrenList"),d=L(function(I,Z,tt){for(var P=0,_=0,B=0;B0?l.DEFAULT_EDGE_LENGTH=f.DEFAULT_EDGE_LENGTH=P/_:s(v.idealEdgeLength)?l.DEFAULT_EDGE_LENGTH=f.DEFAULT_EDGE_LENGTH=50:l.DEFAULT_EDGE_LENGTH=f.DEFAULT_EDGE_LENGTH=v.idealEdgeLength,l.MIN_REPULSION_DIST=f.MIN_REPULSION_DIST=f.DEFAULT_EDGE_LENGTH/10,l.DEFAULT_RADIAL_SEPARATION=f.DEFAULT_EDGE_LENGTH)},"processEdges"),O=L(function(I,Z){Z.fixedNodeConstraint&&(I.constraints.fixedNodeConstraint=Z.fixedNodeConstraint),Z.alignmentConstraint&&(I.constraints.alignmentConstraint=Z.alignmentConstraint),Z.relativePlacementConstraint&&(I.constraints.relativePlacementConstraint=Z.relativePlacementConstraint)},"processConstraints");v.nestingFactor!=null&&(l.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=f.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=v.nestingFactor),v.gravity!=null&&(l.DEFAULT_GRAVITY_STRENGTH=f.DEFAULT_GRAVITY_STRENGTH=v.gravity),v.numIter!=null&&(l.MAX_ITERATIONS=f.MAX_ITERATIONS=v.numIter),v.gravityRange!=null&&(l.DEFAULT_GRAVITY_RANGE_FACTOR=f.DEFAULT_GRAVITY_RANGE_FACTOR=v.gravityRange),v.gravityCompound!=null&&(l.DEFAULT_COMPOUND_GRAVITY_STRENGTH=f.DEFAULT_COMPOUND_GRAVITY_STRENGTH=v.gravityCompound),v.gravityRangeCompound!=null&&(l.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=f.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=v.gravityRangeCompound),v.initialEnergyOnIncremental!=null&&(l.DEFAULT_COOLING_FACTOR_INCREMENTAL=f.DEFAULT_COOLING_FACTOR_INCREMENTAL=v.initialEnergyOnIncremental),v.tilingCompareBy!=null&&(l.TILING_COMPARE_BY=v.tilingCompareBy),v.quality=="proof"?h.QUALITY=2:h.QUALITY=0,l.NODE_DIMENSIONS_INCLUDE_LABELS=f.NODE_DIMENSIONS_INCLUDE_LABELS=h.NODE_DIMENSIONS_INCLUDE_LABELS=v.nodeDimensionsIncludeLabels,l.DEFAULT_INCREMENTAL=f.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!v.randomize,l.ANIMATE=f.ANIMATE=h.ANIMATE=v.animate,l.TILE=v.tile,l.TILING_PADDING_VERTICAL=typeof v.tilingPaddingVertical=="function"?v.tilingPaddingVertical.call():v.tilingPaddingVertical,l.TILING_PADDING_HORIZONTAL=typeof v.tilingPaddingHorizontal=="function"?v.tilingPaddingHorizontal.call():v.tilingPaddingHorizontal,l.DEFAULT_INCREMENTAL=f.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!0,l.PURE_INCREMENTAL=!v.randomize,h.DEFAULT_UNIFORM_LEAF_NODE_SIZES=v.uniformNodeDimensions,v.step=="transformed"&&(l.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,l.ENFORCE_CONSTRAINTS=!1,l.APPLY_LAYOUT=!1),v.step=="enforced"&&(l.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,l.ENFORCE_CONSTRAINTS=!0,l.APPLY_LAYOUT=!1),v.step=="cose"&&(l.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,l.ENFORCE_CONSTRAINTS=!1,l.APPLY_LAYOUT=!0),v.step=="all"&&(v.randomize?l.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:l.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,l.ENFORCE_CONSTRAINTS=!0,l.APPLY_LAYOUT=!0),v.fixedNodeConstraint||v.alignmentConstraint||v.relativePlacementConstraint?l.TREE_REDUCTION_ON_INCREMENTAL=!1:l.TREE_REDUCTION_ON_INCREMENTAL=!0;var x=new t,G=x.newGraphManager();return E(G.addRoot(),c.getTopMostNodes(b),x,v),d(x,G,$),O(x,v),x.runLayout(),J},"coseLayout");n.exports={coseLayout:A}}),212:((n,r,a)=>{var c=(function(){function v(N,S){for(var M=0;M0)if(d){var G=i.getTopMostNodes(M.eles.nodes());if(s=i.connectComponents(b,M.eles,G),s.forEach(function(ot){var rt=ot.boundingBox();m.push({x:rt.x1+rt.w/2,y:rt.y1+rt.h/2})}),M.randomize&&s.forEach(function(ot){M.eles=ot,X.push(h(M))}),M.quality=="default"||M.quality=="proof"){var F=b.collection();if(M.tile){var I=new Map,Z=[],tt=[],P=0,_={nodeIndexes:I,xCoords:Z,yCoords:tt},B=[];if(s.forEach(function(ot,rt){ot.edges().length==0&&(ot.nodes().forEach(function(vt,mt){F.merge(ot.nodes()[mt]),vt.isParent()||(_.nodeIndexes.set(ot.nodes()[mt].id(),P++),_.xCoords.push(ot.nodes()[0].position().x),_.yCoords.push(ot.nodes()[0].position().y))}),B.push(rt))}),F.length>1){var w=F.boundingBox();m.push({x:w.x1+w.w/2,y:w.y1+w.h/2}),s.push(F),X.push(_);for(var U=B.length-1;U>=0;U--)s.splice(B[U],1),X.splice(B[U],1),m.splice(B[U],1)}}s.forEach(function(ot,rt){M.eles=ot,J.push(l(M,X[rt])),i.relocateComponent(m[rt],J[rt],M)})}else s.forEach(function(ot,rt){i.relocateComponent(m[rt],X[rt],M)});var H=new Set;if(s.length>1){var K=[],ht=$.filter(function(ot){return ot.css("display")=="none"});s.forEach(function(ot,rt){var vt=void 0;if(M.quality=="draft"&&(vt=X[rt].nodeIndexes),ot.nodes().not(ht).length>0){var mt={};mt.edges=[],mt.nodes=[];var Lt=void 0;ot.nodes().not(ht).forEach(function(Et){if(M.quality=="draft")if(!Et.isParent())Lt=vt.get(Et.id()),mt.nodes.push({x:X[rt].xCoords[Lt]-Et.boundingbox().w/2,y:X[rt].yCoords[Lt]-Et.boundingbox().h/2,width:Et.boundingbox().w,height:Et.boundingbox().h});else{var Tt=i.calcBoundingBox(Et,X[rt].xCoords,X[rt].yCoords,vt);mt.nodes.push({x:Tt.topLeftX,y:Tt.topLeftY,width:Tt.width,height:Tt.height})}else J[rt][Et.id()]&&mt.nodes.push({x:J[rt][Et.id()].getLeft(),y:J[rt][Et.id()].getTop(),width:J[rt][Et.id()].getWidth(),height:J[rt][Et.id()].getHeight()})}),ot.edges().forEach(function(Et){var Tt=Et.source(),wt=Et.target();if(Tt.css("display")!="none"&&wt.css("display")!="none")if(M.quality=="draft"){var Rt=vt.get(Tt.id()),Wt=vt.get(wt.id()),Pt=[],Ut=[];if(Tt.isParent()){var Ft=i.calcBoundingBox(Tt,X[rt].xCoords,X[rt].yCoords,vt);Pt.push(Ft.topLeftX+Ft.width/2),Pt.push(Ft.topLeftY+Ft.height/2)}else Pt.push(X[rt].xCoords[Rt]),Pt.push(X[rt].yCoords[Rt]);if(wt.isParent()){var Y=i.calcBoundingBox(wt,X[rt].xCoords,X[rt].yCoords,vt);Ut.push(Y.topLeftX+Y.width/2),Ut.push(Y.topLeftY+Y.height/2)}else Ut.push(X[rt].xCoords[Wt]),Ut.push(X[rt].yCoords[Wt]);mt.edges.push({startX:Pt[0],startY:Pt[1],endX:Ut[0],endY:Ut[1]})}else J[rt][Tt.id()]&&J[rt][wt.id()]&&mt.edges.push({startX:J[rt][Tt.id()].getCenterX(),startY:J[rt][Tt.id()].getCenterY(),endX:J[rt][wt.id()].getCenterX(),endY:J[rt][wt.id()].getCenterY()})}),mt.nodes.length>0&&(K.push(mt),H.add(rt))}});var Nt=E.packComponents(K,M.randomize).shifts;if(M.quality=="draft")X.forEach(function(ot,rt){var vt=ot.xCoords.map(function(Lt){return Lt+Nt[rt].dx}),mt=ot.yCoords.map(function(Lt){return Lt+Nt[rt].dy});ot.xCoords=vt,ot.yCoords=mt});else{var St=0;H.forEach(function(ot){Object.keys(J[ot]).forEach(function(rt){var vt=J[ot][rt];vt.setCenter(vt.getCenterX()+Nt[St].dx,vt.getCenterY()+Nt[St].dy)}),St++})}}}else{var O=M.eles.boundingBox();if(m.push({x:O.x1+O.w/2,y:O.y1+O.h/2}),M.randomize){var x=h(M);X.push(x)}M.quality=="default"||M.quality=="proof"?(J.push(l(M,X[0])),i.relocateComponent(m[0],J[0],M)):i.relocateComponent(m[0],X[0],M)}var Q=L(function(rt,vt){if(M.quality=="default"||M.quality=="proof"){typeof rt=="number"&&(rt=vt);var mt=void 0,Lt=void 0,Et=rt.data("id");return J.forEach(function(wt){Et in wt&&(mt={x:wt[Et].getRect().getCenterX(),y:wt[Et].getRect().getCenterY()},Lt=wt[Et])}),M.nodeDimensionsIncludeLabels&&(Lt.labelWidth&&(Lt.labelPosHorizontal=="left"?mt.x+=Lt.labelWidth/2:Lt.labelPosHorizontal=="right"&&(mt.x-=Lt.labelWidth/2)),Lt.labelHeight&&(Lt.labelPosVertical=="top"?mt.y+=Lt.labelHeight/2:Lt.labelPosVertical=="bottom"&&(mt.y-=Lt.labelHeight/2))),mt==null&&(mt={x:rt.position("x"),y:rt.position("y")}),{x:mt.x,y:mt.y}}else{var Tt=void 0;return X.forEach(function(wt){var Rt=wt.nodeIndexes.get(rt.id());Rt!=null&&(Tt={x:wt.xCoords[Rt],y:wt.yCoords[Rt]})}),Tt==null&&(Tt={x:rt.position("x"),y:rt.position("y")}),{x:Tt.x,y:Tt.y}}},"getPositions");if(M.quality=="default"||M.quality=="proof"||M.randomize){var Yt=i.calcParentsWithoutChildren(b,$),Mt=$.filter(function(ot){return ot.css("display")=="none"});M.eles=$.not(Mt),$.nodes().not(":parent").not(Mt).layoutPositions(S,M,Q),Yt.length>0&&Yt.forEach(function(ot){ot.position(Q(ot))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")},"run")}]),v})();n.exports=y}),657:((n,r,a)=>{var c=a(548),t=a(140).layoutBase.Matrix,u=a(140).layoutBase.SVD,i=L(function(h){var f=h.cy,l=h.eles,A=l.nodes(),y=l.nodes(":parent"),v=new Map,N=new Map,S=new Map,M=[],b=[],$=[],X=[],et=[],R=[],J=[],s=[],m=void 0,p=void 0,E=1e8,d=1e-9,O=h.piTol,x=h.samplingType,G=h.nodeSeparation,F=void 0,I=L(function(){for(var V=0,z=0,k=!1;z=gt;){q=j[gt++];for(var st=M[q],nt=0;ntit&&(it=et[at],pt=at)}return pt},"BFS"),tt=L(function(V){var z=void 0;if(V){z=Math.floor(Math.random()*p),m=z;for(var j=0;j=1)break;it=ut}for(var st=0;st=1)break;it=ut}for(var dt=0;dt0&&(z.isParent()?M[V].push(S.get(z.id())):M[V].push(z.id()))})});var Yt=L(function(V){var z=N.get(V),k=void 0;v.get(V).forEach(function(j){f.getElementById(j).isParent()?k=S.get(j):k=j,M[z].push(k),M[N.get(k)].push(V)})},"_loop"),Mt=!0,ot=!1,rt=void 0;try{for(var vt=v.keys()[Symbol.iterator](),mt;!(Mt=(mt=vt.next()).done);Mt=!0){var Lt=mt.value;Yt(Lt)}}catch(W){ot=!0,rt=W}finally{try{!Mt&&vt.return&&vt.return()}finally{if(ot)throw rt}}p=N.size;var Et=void 0;if(p>2){F=p{var c=a(212),t=L(function(i){i&&i("layout","fcose",c)},"register");typeof cytoscape<"u"&&t(cytoscape),n.exports=t}),140:(n=>{n.exports=D})},T={};function g(n){var r=T[n];if(r!==void 0)return r.exports;var a=T[n]={exports:{}};return C[n](a,a.exports,g),a.exports}L(g,"__webpack_require__");var o=g(579);return o})()})});var Le={L:"left",R:"right",T:"top",B:"bottom"},De={L:L(D=>`${D},${D/2} 0,${D} 0,0`,"L"),R:L(D=>`0,${D/2} ${D},0 ${D},${D}`,"R"),T:L(D=>`0,0 ${D},0 ${D/2},${D}`,"T"),B:L(D=>`${D/2},0 ${D},${D} 0,${D}`,"B")},ne={L:L((D,C)=>D-C+2,"L"),R:L((D,C)=>D-2,"R"),T:L((D,C)=>D-C+2,"T"),B:L((D,C)=>D-2,"B")},rr=L(function(D){return Ht(D)?D==="L"?"R":"L":D==="T"?"B":"T"},"getOppositeArchitectureDirection"),Ce=L(function(D){let C=D;return C==="L"||C==="R"||C==="T"||C==="B"},"isArchitectureDirection"),Ht=L(function(D){let C=D;return C==="L"||C==="R"},"isArchitectureDirectionX"),kt=L(function(D){let C=D;return C==="T"||C==="B"},"isArchitectureDirectionY"),ae=L(function(D,C){let T=Ht(D)&&kt(C),g=kt(D)&&Ht(C);return T||g},"isArchitectureDirectionXY"),ir=L(function(D){let C=D[0],T=D[1],g=Ht(C)&&kt(T),o=kt(C)&&Ht(T);return g||o},"isArchitecturePairXY"),Er=L(function(D){return D!=="LL"&&D!=="RR"&&D!=="TT"&&D!=="BB"},"isValidArchitectureDirectionPair"),oe=L(function(D,C){let T=`${D}${C}`;return Er(T)?T:void 0},"getArchitectureDirectionPair"),nr=L(function([D,C],T){let g=T[0],o=T[1];return Ht(g)?kt(o)?[D+(g==="L"?-1:1),C+(o==="T"?1:-1)]:[D+(g==="L"?-1:1),C]:Ht(o)?[D+(o==="L"?1:-1),C+(g==="T"?1:-1)]:[D,C+(g==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),ar=L(function(D){return D==="LT"||D==="TL"?[1,1]:D==="BL"||D==="LB"?[1,-1]:D==="BR"||D==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),or=L(function(D,C){return ae(D,C)?"bend":Ht(D)?"horizontal":"vertical"},"getArchitectureDirectionAlignment"),sr=L(function(D){return D.type==="service"},"isArchitectureService"),hr=L(function(D){return D.type==="junction"},"isArchitectureJunction"),pe=L(D=>D.data(),"edgeData"),Jt=L(D=>D.data(),"nodeData");var Tr=Ye.architecture,re=class{constructor(){this.nodes={};this.groups={};this.edges=[];this.registeredIds={};this.elements={};this.setAccTitle=ze;this.getAccTitle=$e;this.setDiagramTitle=Je;this.getDiagramTitle=qe;this.getAccDescription=Ze;this.setAccDescription=ke;this.clear()}static{L(this,"ArchitectureDB")}clear(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.dataStructures=void 0,this.elements={},Be()}addService({id:C,icon:T,in:g,title:o,iconText:n}){if(this.registeredIds[C]!==void 0)throw new Error(`The service id [${C}] is already in use by another ${this.registeredIds[C]}`);if(g!==void 0){if(C===g)throw new Error(`The service [${C}] cannot be placed within itself`);if(this.registeredIds[g]===void 0)throw new Error(`The service [${C}]'s parent does not exist. Please make sure the parent is created before this service`);if(this.registeredIds[g]==="node")throw new Error(`The service [${C}]'s parent is not a group`)}this.registeredIds[C]="node",this.nodes[C]={id:C,type:"service",icon:T,iconText:n,title:o,edges:[],in:g}}getServices(){return Object.values(this.nodes).filter(sr)}addJunction({id:C,in:T}){this.registeredIds[C]="node",this.nodes[C]={id:C,type:"junction",edges:[],in:T}}getJunctions(){return Object.values(this.nodes).filter(hr)}getNodes(){return Object.values(this.nodes)}getNode(C){return this.nodes[C]??null}addGroup({id:C,icon:T,in:g,title:o}){if(this.registeredIds?.[C]!==void 0)throw new Error(`The group id [${C}] is already in use by another ${this.registeredIds[C]}`);if(g!==void 0){if(C===g)throw new Error(`The group [${C}] cannot be placed within itself`);if(this.registeredIds?.[g]===void 0)throw new Error(`The group [${C}]'s parent does not exist. Please make sure the parent is created before this group`);if(this.registeredIds?.[g]==="node")throw new Error(`The group [${C}]'s parent is not a group`)}this.registeredIds[C]="group",this.groups[C]={id:C,icon:T,title:o,in:g}}getGroups(){return Object.values(this.groups)}addEdge({lhsId:C,rhsId:T,lhsDir:g,rhsDir:o,lhsInto:n,rhsInto:r,lhsGroup:a,rhsGroup:c,title:t}){if(!Ce(g))throw new Error(`Invalid direction given for left hand side of edge ${C}--${T}. Expected (L,R,T,B) got ${String(g)}`);if(!Ce(o))throw new Error(`Invalid direction given for right hand side of edge ${C}--${T}. Expected (L,R,T,B) got ${String(o)}`);if(this.nodes[C]===void 0&&this.groups[C]===void 0)throw new Error(`The left-hand id [${C}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(this.nodes[T]===void 0&&this.groups[T]===void 0)throw new Error(`The right-hand id [${T}] does not yet exist. Please create the service/group before declaring an edge to it.`);let u=this.nodes[C].in,i=this.nodes[T].in;if(a&&u&&i&&u==i)throw new Error(`The left-hand id [${C}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(c&&u&&i&&u==i)throw new Error(`The right-hand id [${T}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let e={lhsId:C,lhsDir:g,lhsInto:n,lhsGroup:a,rhsId:T,rhsDir:o,rhsInto:r,rhsGroup:c,title:t};this.edges.push(e),this.nodes[C]&&this.nodes[T]&&(this.nodes[C].edges.push(this.edges[this.edges.length-1]),this.nodes[T].edges.push(this.edges[this.edges.length-1]))}getEdges(){return this.edges}getDataStructures(){if(this.dataStructures===void 0){let C={},T=Object.entries(this.nodes).reduce((c,[t,u])=>(c[t]=u.edges.reduce((i,e)=>{let h=this.getNode(e.lhsId)?.in,f=this.getNode(e.rhsId)?.in;if(h&&f&&h!==f){let l=or(e.lhsDir,e.rhsDir);l!=="bend"&&(C[h]??={},C[h][f]=l,C[f]??={},C[f][h]=l)}if(e.lhsId===t){let l=oe(e.lhsDir,e.rhsDir);l&&(i[l]=e.rhsId)}else{let l=oe(e.rhsDir,e.lhsDir);l&&(i[l]=e.lhsId)}return i},{}),c),{}),g=Object.keys(T)[0],o={[g]:1},n=Object.keys(T).reduce((c,t)=>t===g?c:{...c,[t]:1},{}),r=L(c=>{let t={[c]:[0,0]},u=[c];for(;u.length>0;){let i=u.shift();if(i){o[i]=1,delete n[i];let e=T[i],[h,f]=t[i];Object.entries(e).forEach(([l,A])=>{o[A]||(t[A]=nr([h,f],l),u.push(A))})}}return t},"BFS"),a=[r(g)];for(;Object.keys(n).length>0;)a.push(r(Object.keys(n)[0]));this.dataStructures={adjList:T,spatialMaps:a,groupAlignments:C}}return this.dataStructures}setElementForId(C,T){this.elements[C]=T}getElementById(C){return this.elements[C]}getConfig(){return Ke({...Tr,...Ue().architecture})}getConfigField(C){return this.getConfig()[C]}};var Ar=L((D,C)=>{tr(D,C),D.groups.map(T=>C.addGroup(T)),D.services.map(T=>C.addService({...T,type:"service"})),D.junctions.map(T=>C.addJunction({...T,type:"junction"})),D.edges.map(T=>C.addEdge(T))},"populateDb"),Me={parser:{yy:void 0},parse:L(async D=>{let C=await _e("architecture",D);fe.debug(C);let T=Me.parser?.yy;if(!(T instanceof re))throw new Error("parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");Ar(C,T)},"parse")};var Nr=L(D=>` + .edge { + stroke-width: ${D.archEdgeWidth}; + stroke: ${D.archEdgeColor}; + fill: none; + } + + .arrow { + fill: ${D.archEdgeArrowColor}; + } + + .node-bkg { + fill: none; + stroke: ${D.archGroupBorderColor}; + stroke-width: ${D.archGroupBorderWidth}; + stroke-dasharray: 8; + } + .node-icon-text { + display: flex; + align-items: center; + } + + .node-icon-text > div { + color: #fff; + margin: 1px; + height: fit-content; + text-align: center; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + } +`,"getStyles"),lr=Nr;var pr=mr(cr(),1);var ie=L(D=>`${D}`,"wrapIcon"),Kt={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:ie('')},server:{body:ie('')},disk:{body:ie('')},internet:{body:ie('')},cloud:{body:ie('')},unknown:He,blank:{body:ie("")}}};var fr=L(async function(D,C,T){let g=T.getConfigField("padding"),o=T.getConfigField("iconSize"),n=o/2,r=o/6,a=r/2;await Promise.all(C.edges().map(async c=>{let{source:t,sourceDir:u,sourceArrow:i,sourceGroup:e,target:h,targetDir:f,targetArrow:l,targetGroup:A,label:y}=pe(c),{x:v,y:N}=c[0].sourceEndpoint(),{x:S,y:M}=c[0].midpoint(),{x:b,y:$}=c[0].targetEndpoint(),X=g+4;if(e&&(Ht(u)?v+=u==="L"?-X:X:N+=u==="T"?-X:X+18),A&&(Ht(f)?b+=f==="L"?-X:X:$+=f==="T"?-X:X+18),!e&&T.getNode(t)?.type==="junction"&&(Ht(u)?v+=u==="L"?n:-n:N+=u==="T"?n:-n),!A&&T.getNode(h)?.type==="junction"&&(Ht(f)?b+=f==="L"?n:-n:$+=f==="T"?n:-n),c[0]._private.rscratch){let et=D.insert("g");if(et.insert("path").attr("d",`M ${v},${N} L ${S},${M} L${b},${$} `).attr("class","edge").attr("id",je(t,h,{prefix:"L"})),i){let R=Ht(u)?ne[u](v,r):v-a,J=kt(u)?ne[u](N,r):N-a;et.insert("polygon").attr("points",De[u](r)).attr("transform",`translate(${R},${J})`).attr("class","arrow")}if(l){let R=Ht(f)?ne[f](b,r):b-a,J=kt(f)?ne[f]($,r):$-a;et.insert("polygon").attr("points",De[f](r)).attr("transform",`translate(${R},${J})`).attr("class","arrow")}if(y){let R=ae(u,f)?"XY":Ht(u)?"X":"Y",J=0;R==="X"?J=Math.abs(v-b):R==="Y"?J=Math.abs(N-$)/1.5:J=Math.abs(v-b)/2;let s=et.append("g");if(await de(s,y,{useHtmlLabels:!1,width:J,classes:"architecture-service-label"},ge()),s.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),R==="X")s.attr("transform","translate("+S+", "+M+")");else if(R==="Y")s.attr("transform","translate("+S+", "+M+") rotate(-90)");else if(R==="XY"){let m=oe(u,f);if(m&&ir(m)){let p=s.node().getBoundingClientRect(),[E,d]=ar(m);s.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*E*d*45})`);let O=s.node().getBoundingClientRect();s.attr("transform",` + translate(${S}, ${M-p.height/2}) + translate(${E*O.width/2}, ${d*O.height/2}) + rotate(${-1*E*d*45}, 0, ${p.height/2}) + `)}}}}}))},"drawEdges"),ur=L(async function(D,C,T){let o=T.getConfigField("padding")*.75,n=T.getConfigField("fontSize"),a=T.getConfigField("iconSize")/2;await Promise.all(C.nodes().map(async c=>{let t=Jt(c);if(t.type==="group"){let{h:u,w:i,x1:e,y1:h}=c.boundingBox(),f=D.append("rect");f.attr("id",`group-${t.id}`).attr("x",e+a).attr("y",h+a).attr("width",i).attr("height",u).attr("class","node-bkg");let l=D.append("g"),A=e,y=h;if(t.icon){let v=l.append("g");v.html(`${await ue(t.icon,{height:o,width:o,fallbackPrefix:Kt.prefix})}`),v.attr("transform","translate("+(A+a+1)+", "+(y+a+1)+")"),A+=o,y+=n/2-1-2}if(t.label){let v=l.append("g");await de(v,t.label,{useHtmlLabels:!1,width:i,classes:"architecture-service-label"},ge()),v.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),v.attr("transform","translate("+(A+a+4)+", "+(y+a+2)+")")}T.setElementForId(t.id,f)}}))},"drawGroups"),gr=L(async function(D,C,T){let g=ge();for(let o of T){let n=C.append("g"),r=D.getConfigField("iconSize");if(o.title){let u=n.append("g");await de(u,o.title,{useHtmlLabels:!1,width:r*1.5,classes:"architecture-service-label"},g),u.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),u.attr("transform","translate("+r/2+", "+r+")")}let a=n.append("g");if(o.icon)a.html(`${await ue(o.icon,{height:r,width:r,fallbackPrefix:Kt.prefix})}`);else if(o.iconText){a.html(`${await ue("blank",{height:r,width:r,fallbackPrefix:Kt.prefix})}`);let e=a.append("g").append("foreignObject").attr("width",r).attr("height",r).append("div").attr("class","node-icon-text").attr("style",`height: ${r}px;`).append("div").html(Xe(o.iconText,g)),h=parseInt(window.getComputedStyle(e.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;e.attr("style",`-webkit-line-clamp: ${Math.floor((r-2)/h)};`)}else a.append("path").attr("class","node-bkg").attr("id","node-"+o.id).attr("d",`M0 ${r} v${-r} q0,-5 5,-5 h${r} q5,0 5,5 v${r} H0 Z`);n.attr("id",`service-${o.id}`).attr("class","architecture-service");let{width:c,height:t}=n.node().getBBox();o.width=c,o.height=t,D.setElementForId(o.id,n)}return 0},"drawServices"),dr=L(function(D,C,T){T.forEach(g=>{let o=C.append("g"),n=D.getConfigField("iconSize");o.append("g").append("rect").attr("id","node-"+g.id).attr("fill-opacity","0").attr("width",n).attr("height",n),o.attr("class","architecture-junction");let{width:a,height:c}=o._groups[0][0].getBBox();o.width=a,o.height=c,D.setElementForId(g.id,o)})},"drawJunctions");We([{name:Kt.prefix,icons:Kt}]);Ne.use(pr.default);function Lr(D,C,T){D.forEach(g=>{C.add({group:"nodes",data:{type:"service",id:g.id,icon:g.icon,label:g.title,parent:g.in,width:T.getConfigField("iconSize"),height:T.getConfigField("iconSize")},classes:"node-service"})})}L(Lr,"addServices");function Dr(D,C,T){D.forEach(g=>{C.add({group:"nodes",data:{type:"junction",id:g.id,parent:g.in,width:T.getConfigField("iconSize"),height:T.getConfigField("iconSize")},classes:"node-junction"})})}L(Dr,"addJunctions");function Cr(D,C){C.nodes().map(T=>{let g=Jt(T);if(g.type==="group")return;g.x=T.position().x,g.y=T.position().y,D.getElementById(g.id).attr("transform","translate("+(g.x||0)+","+(g.y||0)+")")})}L(Cr,"positionNodes");function Mr(D,C){D.forEach(T=>{C.add({group:"nodes",data:{type:"group",id:T.id,icon:T.icon,label:T.title,parent:T.in},classes:"node-group"})})}L(Mr,"addGroups");function wr(D,C){D.forEach(T=>{let{lhsId:g,rhsId:o,lhsInto:n,lhsGroup:r,rhsInto:a,lhsDir:c,rhsDir:t,rhsGroup:u,title:i}=T,e=ae(T.lhsDir,T.rhsDir)?"segments":"straight",h={id:`${g}-${o}`,label:i,source:g,sourceDir:c,sourceArrow:n,sourceGroup:r,sourceEndpoint:c==="L"?"0 50%":c==="R"?"100% 50%":c==="T"?"50% 0":"50% 100%",target:o,targetDir:t,targetArrow:a,targetGroup:u,targetEndpoint:t==="L"?"0 50%":t==="R"?"100% 50%":t==="T"?"50% 0":"50% 100%"};C.add({group:"edges",data:h,classes:e})})}L(wr,"addEdges");function xr(D,C,T){let g=L((a,c)=>Object.entries(a).reduce((t,[u,i])=>{let e=0,h=Object.entries(i);if(h.length===1)return t[u]=h[0][1],t;for(let f=0;f{let c={},t={};return Object.entries(a).forEach(([u,[i,e]])=>{let h=D.getNode(u)?.in??"default";c[e]??={},c[e][h]??=[],c[e][h].push(u),t[i]??={},t[i][h]??=[],t[i][h].push(u)}),{horiz:Object.values(g(c,"horizontal")).filter(u=>u.length>1),vert:Object.values(g(t,"vertical")).filter(u=>u.length>1)}}),[n,r]=o.reduce(([a,c],{horiz:t,vert:u})=>[[...a,...t],[...c,...u]],[[],[]]);return{horizontal:n,vertical:r}}L(xr,"getAlignments");function Or(D,C){let T=[],g=L(n=>`${n[0]},${n[1]}`,"posToStr"),o=L(n=>n.split(",").map(r=>parseInt(r)),"strToPos");return D.forEach(n=>{let r=Object.fromEntries(Object.entries(n).map(([u,i])=>[g(i),u])),a=[g([0,0])],c={},t={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;a.length>0;){let u=a.shift();if(u){c[u]=1;let i=r[u];if(i){let e=o(u);Object.entries(t).forEach(([h,f])=>{let l=g([e[0]+f[0],e[1]+f[1]]),A=r[l];A&&!c[l]&&(a.push(l),T.push({[Le[h]]:A,[Le[rr(h)]]:i,gap:1.5*C.getConfigField("iconSize")}))})}}}}),T}L(Or,"getRelativeConstraints");function Rr(D,C,T,g,o,{spatialMaps:n,groupAlignments:r}){return new Promise(a=>{let c=Qe("body").append("div").attr("id","cy").attr("style","display:none"),t=Ne({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight",label:"data(label)","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${o.getConfigField("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${o.getConfigField("padding")}px`}}],layout:{name:"grid",boundingBox:{x1:0,x2:100,y1:0,y2:100}}});c.remove(),Mr(T,t),Lr(D,t,o),Dr(C,t,o),wr(g,t);let u=xr(o,n,r),i=Or(n,o),e=t.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(h){let[f,l]=h.connectedNodes(),{parent:A}=Jt(f),{parent:y}=Jt(l);return A===y?1.5*o.getConfigField("iconSize"):.5*o.getConfigField("iconSize")},edgeElasticity(h){let[f,l]=h.connectedNodes(),{parent:A}=Jt(f),{parent:y}=Jt(l);return A===y?.45:.001},alignmentConstraint:u,relativePlacementConstraint:i});e.one("layoutstop",()=>{function h(f,l,A,y){let v,N,{x:S,y:M}=f,{x:b,y:$}=l;N=(y-M+(S-A)*(M-$)/(S-b))/Math.sqrt(1+Math.pow((M-$)/(S-b),2)),v=Math.sqrt(Math.pow(y-M,2)+Math.pow(A-S,2)-Math.pow(N,2));let X=Math.sqrt(Math.pow(b-S,2)+Math.pow($-M,2));v=v/X;let et=(b-S)*(y-M)-($-M)*(A-S);switch(!0){case et>=0:et=1;break;case et<0:et=-1;break}let R=(b-S)*(A-S)+($-M)*(y-M);switch(!0){case R>=0:R=1;break;case R<0:R=-1;break}return N=Math.abs(N)*et,v=v*R,{distances:N,weights:v}}L(h,"getSegmentWeights"),t.startBatch();for(let f of Object.values(t.edges()))if(f.data?.()){let{x:l,y:A}=f.source().position(),{x:y,y:v}=f.target().position();if(l!==y&&A!==v){let N=f.sourceEndpoint(),S=f.targetEndpoint(),{sourceDir:M}=pe(f),[b,$]=kt(M)?[N.x,S.y]:[S.x,N.y],{weights:X,distances:et}=h(N,S,b,$);f.style("segment-distances",et),f.style("segment-weights",X)}}t.endBatch(),e.run()}),e.run(),t.ready(h=>{fe.info("Ready",h),a(t)})})}L(Rr,"layoutArchitecture");var Ir=L(async(D,C,T,g)=>{let o=g.db,n=o.getServices(),r=o.getJunctions(),a=o.getGroups(),c=o.getEdges(),t=o.getDataStructures(),u=er(C),i=u.append("g");i.attr("class","architecture-edges");let e=u.append("g");e.attr("class","architecture-services");let h=u.append("g");h.attr("class","architecture-groups"),await gr(o,e,n),dr(o,e,r);let f=await Rr(n,r,a,c,o,t);await fr(i,f,o),await ur(h,f,o),Cr(o,f),Ve(void 0,u,o.getConfigField("padding"),o.getConfigField("useMaxWidth"))},"draw"),vr={draw:Ir};var Ci={parser:Me,get db(){return new re},renderer:vr,styles:lr};export{Ci as diagram}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architectureDiagram-4X3Z3J56.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architectureDiagram-4X3Z3J56.mjs.map new file mode 100644 index 0000000..4d2c0ec --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/architectureDiagram-4X3Z3J56.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../../node_modules/.pnpm/layout-base@2.0.1/node_modules/layout-base/layout-base.js", "../../../../../node_modules/.pnpm/cose-base@2.2.0/node_modules/cose-base/cose-base.js", "../../../../../node_modules/.pnpm/cytoscape-fcose@2.2.0_cytoscape@3.33.1/node_modules/cytoscape-fcose/cytoscape-fcose.js", "../../../src/diagrams/architecture/architectureTypes.ts", "../../../src/diagrams/architecture/architectureDb.ts", "../../../src/diagrams/architecture/architectureParser.ts", "../../../src/diagrams/architecture/architectureStyles.ts", "../../../src/diagrams/architecture/architectureRenderer.ts", "../../../src/diagrams/architecture/architectureIcons.ts", "../../../src/diagrams/architecture/svgDraw.ts", "../../../src/diagrams/architecture/architectureDiagram.ts"], + "sourcesContent": ["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"layoutBase\"] = factory();\n\telse\n\t\troot[\"layoutBase\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 28);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction LayoutConstants() {}\n\n/**\r\n * Layout Quality: 0:draft, 1:default, 2:proof\r\n */\nLayoutConstants.QUALITY = 1;\n\n/**\r\n * Default parameters\r\n */\nLayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED = false;\nLayoutConstants.DEFAULT_INCREMENTAL = false;\nLayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT = true;\nLayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT = false;\nLayoutConstants.DEFAULT_ANIMATION_PERIOD = 50;\nLayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES = false;\n\n// -----------------------------------------------------------------------------\n// Section: General other constants\n// -----------------------------------------------------------------------------\n/*\r\n * Margins of a graph to be applied on bouding rectangle of its contents. We\r\n * assume margins on all four sides to be uniform.\r\n */\nLayoutConstants.DEFAULT_GRAPH_MARGIN = 15;\n\n/*\r\n * Whether to consider labels in node dimensions or not\r\n */\nLayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = false;\n\n/*\r\n * Default dimension of a non-compound node.\r\n */\nLayoutConstants.SIMPLE_NODE_SIZE = 40;\n\n/*\r\n * Default dimension of a non-compound node.\r\n */\nLayoutConstants.SIMPLE_NODE_HALF_SIZE = LayoutConstants.SIMPLE_NODE_SIZE / 2;\n\n/*\r\n * Empty compound node size. When a compound node is empty, its both\r\n * dimensions should be of this value.\r\n */\nLayoutConstants.EMPTY_COMPOUND_NODE_SIZE = 40;\n\n/*\r\n * Minimum length that an edge should take during layout\r\n */\nLayoutConstants.MIN_EDGE_LENGTH = 1;\n\n/*\r\n * World boundaries that layout operates on\r\n */\nLayoutConstants.WORLD_BOUNDARY = 1000000;\n\n/*\r\n * World boundaries that random positioning can be performed with\r\n */\nLayoutConstants.INITIAL_WORLD_BOUNDARY = LayoutConstants.WORLD_BOUNDARY / 1000;\n\n/*\r\n * Coordinates of the world center\r\n */\nLayoutConstants.WORLD_CENTER_X = 1200;\nLayoutConstants.WORLD_CENTER_Y = 900;\n\nmodule.exports = LayoutConstants;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LGraphObject = __webpack_require__(2);\nvar IGeometry = __webpack_require__(8);\nvar IMath = __webpack_require__(9);\n\nfunction LEdge(source, target, vEdge) {\n LGraphObject.call(this, vEdge);\n\n this.isOverlapingSourceAndTarget = false;\n this.vGraphObject = vEdge;\n this.bendpoints = [];\n this.source = source;\n this.target = target;\n}\n\nLEdge.prototype = Object.create(LGraphObject.prototype);\n\nfor (var prop in LGraphObject) {\n LEdge[prop] = LGraphObject[prop];\n}\n\nLEdge.prototype.getSource = function () {\n return this.source;\n};\n\nLEdge.prototype.getTarget = function () {\n return this.target;\n};\n\nLEdge.prototype.isInterGraph = function () {\n return this.isInterGraph;\n};\n\nLEdge.prototype.getLength = function () {\n return this.length;\n};\n\nLEdge.prototype.isOverlapingSourceAndTarget = function () {\n return this.isOverlapingSourceAndTarget;\n};\n\nLEdge.prototype.getBendpoints = function () {\n return this.bendpoints;\n};\n\nLEdge.prototype.getLca = function () {\n return this.lca;\n};\n\nLEdge.prototype.getSourceInLca = function () {\n return this.sourceInLca;\n};\n\nLEdge.prototype.getTargetInLca = function () {\n return this.targetInLca;\n};\n\nLEdge.prototype.getOtherEnd = function (node) {\n if (this.source === node) {\n return this.target;\n } else if (this.target === node) {\n return this.source;\n } else {\n throw \"Node is not incident with this edge\";\n }\n};\n\nLEdge.prototype.getOtherEndInGraph = function (node, graph) {\n var otherEnd = this.getOtherEnd(node);\n var root = graph.getGraphManager().getRoot();\n\n while (true) {\n if (otherEnd.getOwner() == graph) {\n return otherEnd;\n }\n\n if (otherEnd.getOwner() == root) {\n break;\n }\n\n otherEnd = otherEnd.getOwner().getParent();\n }\n\n return null;\n};\n\nLEdge.prototype.updateLength = function () {\n var clipPointCoordinates = new Array(4);\n\n this.isOverlapingSourceAndTarget = IGeometry.getIntersection(this.target.getRect(), this.source.getRect(), clipPointCoordinates);\n\n if (!this.isOverlapingSourceAndTarget) {\n this.lengthX = clipPointCoordinates[0] - clipPointCoordinates[2];\n this.lengthY = clipPointCoordinates[1] - clipPointCoordinates[3];\n\n if (Math.abs(this.lengthX) < 1.0) {\n this.lengthX = IMath.sign(this.lengthX);\n }\n\n if (Math.abs(this.lengthY) < 1.0) {\n this.lengthY = IMath.sign(this.lengthY);\n }\n\n this.length = Math.sqrt(this.lengthX * this.lengthX + this.lengthY * this.lengthY);\n }\n};\n\nLEdge.prototype.updateLengthSimple = function () {\n this.lengthX = this.target.getCenterX() - this.source.getCenterX();\n this.lengthY = this.target.getCenterY() - this.source.getCenterY();\n\n if (Math.abs(this.lengthX) < 1.0) {\n this.lengthX = IMath.sign(this.lengthX);\n }\n\n if (Math.abs(this.lengthY) < 1.0) {\n this.lengthY = IMath.sign(this.lengthY);\n }\n\n this.length = Math.sqrt(this.lengthX * this.lengthX + this.lengthY * this.lengthY);\n};\n\nmodule.exports = LEdge;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction LGraphObject(vGraphObject) {\n this.vGraphObject = vGraphObject;\n}\n\nmodule.exports = LGraphObject;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LGraphObject = __webpack_require__(2);\nvar Integer = __webpack_require__(10);\nvar RectangleD = __webpack_require__(13);\nvar LayoutConstants = __webpack_require__(0);\nvar RandomSeed = __webpack_require__(16);\nvar PointD = __webpack_require__(5);\n\nfunction LNode(gm, loc, size, vNode) {\n //Alternative constructor 1 : LNode(LGraphManager gm, Point loc, Dimension size, Object vNode)\n if (size == null && vNode == null) {\n vNode = loc;\n }\n\n LGraphObject.call(this, vNode);\n\n //Alternative constructor 2 : LNode(Layout layout, Object vNode)\n if (gm.graphManager != null) gm = gm.graphManager;\n\n this.estimatedSize = Integer.MIN_VALUE;\n this.inclusionTreeDepth = Integer.MAX_VALUE;\n this.vGraphObject = vNode;\n this.edges = [];\n this.graphManager = gm;\n\n if (size != null && loc != null) this.rect = new RectangleD(loc.x, loc.y, size.width, size.height);else this.rect = new RectangleD();\n}\n\nLNode.prototype = Object.create(LGraphObject.prototype);\nfor (var prop in LGraphObject) {\n LNode[prop] = LGraphObject[prop];\n}\n\nLNode.prototype.getEdges = function () {\n return this.edges;\n};\n\nLNode.prototype.getChild = function () {\n return this.child;\n};\n\nLNode.prototype.getOwner = function () {\n // if (this.owner != null) {\n // if (!(this.owner == null || this.owner.getNodes().indexOf(this) > -1)) {\n // throw \"assert failed\";\n // }\n // }\n\n return this.owner;\n};\n\nLNode.prototype.getWidth = function () {\n return this.rect.width;\n};\n\nLNode.prototype.setWidth = function (width) {\n this.rect.width = width;\n};\n\nLNode.prototype.getHeight = function () {\n return this.rect.height;\n};\n\nLNode.prototype.setHeight = function (height) {\n this.rect.height = height;\n};\n\nLNode.prototype.getCenterX = function () {\n return this.rect.x + this.rect.width / 2;\n};\n\nLNode.prototype.getCenterY = function () {\n return this.rect.y + this.rect.height / 2;\n};\n\nLNode.prototype.getCenter = function () {\n return new PointD(this.rect.x + this.rect.width / 2, this.rect.y + this.rect.height / 2);\n};\n\nLNode.prototype.getLocation = function () {\n return new PointD(this.rect.x, this.rect.y);\n};\n\nLNode.prototype.getRect = function () {\n return this.rect;\n};\n\nLNode.prototype.getDiagonal = function () {\n return Math.sqrt(this.rect.width * this.rect.width + this.rect.height * this.rect.height);\n};\n\n/**\n * This method returns half the diagonal length of this node.\n */\nLNode.prototype.getHalfTheDiagonal = function () {\n return Math.sqrt(this.rect.height * this.rect.height + this.rect.width * this.rect.width) / 2;\n};\n\nLNode.prototype.setRect = function (upperLeft, dimension) {\n this.rect.x = upperLeft.x;\n this.rect.y = upperLeft.y;\n this.rect.width = dimension.width;\n this.rect.height = dimension.height;\n};\n\nLNode.prototype.setCenter = function (cx, cy) {\n this.rect.x = cx - this.rect.width / 2;\n this.rect.y = cy - this.rect.height / 2;\n};\n\nLNode.prototype.setLocation = function (x, y) {\n this.rect.x = x;\n this.rect.y = y;\n};\n\nLNode.prototype.moveBy = function (dx, dy) {\n this.rect.x += dx;\n this.rect.y += dy;\n};\n\nLNode.prototype.getEdgeListToNode = function (to) {\n var edgeList = [];\n var edge;\n var self = this;\n\n self.edges.forEach(function (edge) {\n\n if (edge.target == to) {\n if (edge.source != self) throw \"Incorrect edge source!\";\n\n edgeList.push(edge);\n }\n });\n\n return edgeList;\n};\n\nLNode.prototype.getEdgesBetween = function (other) {\n var edgeList = [];\n var edge;\n\n var self = this;\n self.edges.forEach(function (edge) {\n\n if (!(edge.source == self || edge.target == self)) throw \"Incorrect edge source and/or target\";\n\n if (edge.target == other || edge.source == other) {\n edgeList.push(edge);\n }\n });\n\n return edgeList;\n};\n\nLNode.prototype.getNeighborsList = function () {\n var neighbors = new Set();\n\n var self = this;\n self.edges.forEach(function (edge) {\n\n if (edge.source == self) {\n neighbors.add(edge.target);\n } else {\n if (edge.target != self) {\n throw \"Incorrect incidency!\";\n }\n\n neighbors.add(edge.source);\n }\n });\n\n return neighbors;\n};\n\nLNode.prototype.withChildren = function () {\n var withNeighborsList = new Set();\n var childNode;\n var children;\n\n withNeighborsList.add(this);\n\n if (this.child != null) {\n var nodes = this.child.getNodes();\n for (var i = 0; i < nodes.length; i++) {\n childNode = nodes[i];\n children = childNode.withChildren();\n children.forEach(function (node) {\n withNeighborsList.add(node);\n });\n }\n }\n\n return withNeighborsList;\n};\n\nLNode.prototype.getNoOfChildren = function () {\n var noOfChildren = 0;\n var childNode;\n\n if (this.child == null) {\n noOfChildren = 1;\n } else {\n var nodes = this.child.getNodes();\n for (var i = 0; i < nodes.length; i++) {\n childNode = nodes[i];\n\n noOfChildren += childNode.getNoOfChildren();\n }\n }\n\n if (noOfChildren == 0) {\n noOfChildren = 1;\n }\n return noOfChildren;\n};\n\nLNode.prototype.getEstimatedSize = function () {\n if (this.estimatedSize == Integer.MIN_VALUE) {\n throw \"assert failed\";\n }\n return this.estimatedSize;\n};\n\nLNode.prototype.calcEstimatedSize = function () {\n if (this.child == null) {\n return this.estimatedSize = (this.rect.width + this.rect.height) / 2;\n } else {\n this.estimatedSize = this.child.calcEstimatedSize();\n this.rect.width = this.estimatedSize;\n this.rect.height = this.estimatedSize;\n\n return this.estimatedSize;\n }\n};\n\nLNode.prototype.scatter = function () {\n var randomCenterX;\n var randomCenterY;\n\n var minX = -LayoutConstants.INITIAL_WORLD_BOUNDARY;\n var maxX = LayoutConstants.INITIAL_WORLD_BOUNDARY;\n randomCenterX = LayoutConstants.WORLD_CENTER_X + RandomSeed.nextDouble() * (maxX - minX) + minX;\n\n var minY = -LayoutConstants.INITIAL_WORLD_BOUNDARY;\n var maxY = LayoutConstants.INITIAL_WORLD_BOUNDARY;\n randomCenterY = LayoutConstants.WORLD_CENTER_Y + RandomSeed.nextDouble() * (maxY - minY) + minY;\n\n this.rect.x = randomCenterX;\n this.rect.y = randomCenterY;\n};\n\nLNode.prototype.updateBounds = function () {\n if (this.getChild() == null) {\n throw \"assert failed\";\n }\n if (this.getChild().getNodes().length != 0) {\n // wrap the children nodes by re-arranging the boundaries\n var childGraph = this.getChild();\n childGraph.updateBounds(true);\n\n this.rect.x = childGraph.getLeft();\n this.rect.y = childGraph.getTop();\n\n this.setWidth(childGraph.getRight() - childGraph.getLeft());\n this.setHeight(childGraph.getBottom() - childGraph.getTop());\n\n // Update compound bounds considering its label properties \n if (LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS) {\n\n var width = childGraph.getRight() - childGraph.getLeft();\n var height = childGraph.getBottom() - childGraph.getTop();\n\n if (this.labelWidth) {\n if (this.labelPosHorizontal == \"left\") {\n this.rect.x -= this.labelWidth;\n this.setWidth(width + this.labelWidth);\n } else if (this.labelPosHorizontal == \"center\" && this.labelWidth > width) {\n this.rect.x -= (this.labelWidth - width) / 2;\n this.setWidth(this.labelWidth);\n } else if (this.labelPosHorizontal == \"right\") {\n this.setWidth(width + this.labelWidth);\n }\n }\n\n if (this.labelHeight) {\n if (this.labelPosVertical == \"top\") {\n this.rect.y -= this.labelHeight;\n this.setHeight(height + this.labelHeight);\n } else if (this.labelPosVertical == \"center\" && this.labelHeight > height) {\n this.rect.y -= (this.labelHeight - height) / 2;\n this.setHeight(this.labelHeight);\n } else if (this.labelPosVertical == \"bottom\") {\n this.setHeight(height + this.labelHeight);\n }\n }\n }\n }\n};\n\nLNode.prototype.getInclusionTreeDepth = function () {\n if (this.inclusionTreeDepth == Integer.MAX_VALUE) {\n throw \"assert failed\";\n }\n return this.inclusionTreeDepth;\n};\n\nLNode.prototype.transform = function (trans) {\n var left = this.rect.x;\n\n if (left > LayoutConstants.WORLD_BOUNDARY) {\n left = LayoutConstants.WORLD_BOUNDARY;\n } else if (left < -LayoutConstants.WORLD_BOUNDARY) {\n left = -LayoutConstants.WORLD_BOUNDARY;\n }\n\n var top = this.rect.y;\n\n if (top > LayoutConstants.WORLD_BOUNDARY) {\n top = LayoutConstants.WORLD_BOUNDARY;\n } else if (top < -LayoutConstants.WORLD_BOUNDARY) {\n top = -LayoutConstants.WORLD_BOUNDARY;\n }\n\n var leftTop = new PointD(left, top);\n var vLeftTop = trans.inverseTransformPoint(leftTop);\n\n this.setLocation(vLeftTop.x, vLeftTop.y);\n};\n\nLNode.prototype.getLeft = function () {\n return this.rect.x;\n};\n\nLNode.prototype.getRight = function () {\n return this.rect.x + this.rect.width;\n};\n\nLNode.prototype.getTop = function () {\n return this.rect.y;\n};\n\nLNode.prototype.getBottom = function () {\n return this.rect.y + this.rect.height;\n};\n\nLNode.prototype.getParent = function () {\n if (this.owner == null) {\n return null;\n }\n\n return this.owner.getParent();\n};\n\nmodule.exports = LNode;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LayoutConstants = __webpack_require__(0);\n\nfunction FDLayoutConstants() {}\n\n//FDLayoutConstants inherits static props in LayoutConstants\nfor (var prop in LayoutConstants) {\n FDLayoutConstants[prop] = LayoutConstants[prop];\n}\n\nFDLayoutConstants.MAX_ITERATIONS = 2500;\n\nFDLayoutConstants.DEFAULT_EDGE_LENGTH = 50;\nFDLayoutConstants.DEFAULT_SPRING_STRENGTH = 0.45;\nFDLayoutConstants.DEFAULT_REPULSION_STRENGTH = 4500.0;\nFDLayoutConstants.DEFAULT_GRAVITY_STRENGTH = 0.4;\nFDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = 1.0;\nFDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR = 3.8;\nFDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = 1.5;\nFDLayoutConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION = true;\nFDLayoutConstants.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION = true;\nFDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = 0.3;\nFDLayoutConstants.COOLING_ADAPTATION_FACTOR = 0.33;\nFDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT = 1000;\nFDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT = 5000;\nFDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL = 100.0;\nFDLayoutConstants.MAX_NODE_DISPLACEMENT = FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL * 3;\nFDLayoutConstants.MIN_REPULSION_DIST = FDLayoutConstants.DEFAULT_EDGE_LENGTH / 10.0;\nFDLayoutConstants.CONVERGENCE_CHECK_PERIOD = 100;\nFDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = 0.1;\nFDLayoutConstants.MIN_EDGE_LENGTH = 1;\nFDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD = 10;\n\nmodule.exports = FDLayoutConstants;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction PointD(x, y) {\n if (x == null && y == null) {\n this.x = 0;\n this.y = 0;\n } else {\n this.x = x;\n this.y = y;\n }\n}\n\nPointD.prototype.getX = function () {\n return this.x;\n};\n\nPointD.prototype.getY = function () {\n return this.y;\n};\n\nPointD.prototype.setX = function (x) {\n this.x = x;\n};\n\nPointD.prototype.setY = function (y) {\n this.y = y;\n};\n\nPointD.prototype.getDifference = function (pt) {\n return new DimensionD(this.x - pt.x, this.y - pt.y);\n};\n\nPointD.prototype.getCopy = function () {\n return new PointD(this.x, this.y);\n};\n\nPointD.prototype.translate = function (dim) {\n this.x += dim.width;\n this.y += dim.height;\n return this;\n};\n\nmodule.exports = PointD;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LGraphObject = __webpack_require__(2);\nvar Integer = __webpack_require__(10);\nvar LayoutConstants = __webpack_require__(0);\nvar LGraphManager = __webpack_require__(7);\nvar LNode = __webpack_require__(3);\nvar LEdge = __webpack_require__(1);\nvar RectangleD = __webpack_require__(13);\nvar Point = __webpack_require__(12);\nvar LinkedList = __webpack_require__(11);\n\nfunction LGraph(parent, obj2, vGraph) {\n LGraphObject.call(this, vGraph);\n this.estimatedSize = Integer.MIN_VALUE;\n this.margin = LayoutConstants.DEFAULT_GRAPH_MARGIN;\n this.edges = [];\n this.nodes = [];\n this.isConnected = false;\n this.parent = parent;\n\n if (obj2 != null && obj2 instanceof LGraphManager) {\n this.graphManager = obj2;\n } else if (obj2 != null && obj2 instanceof Layout) {\n this.graphManager = obj2.graphManager;\n }\n}\n\nLGraph.prototype = Object.create(LGraphObject.prototype);\nfor (var prop in LGraphObject) {\n LGraph[prop] = LGraphObject[prop];\n}\n\nLGraph.prototype.getNodes = function () {\n return this.nodes;\n};\n\nLGraph.prototype.getEdges = function () {\n return this.edges;\n};\n\nLGraph.prototype.getGraphManager = function () {\n return this.graphManager;\n};\n\nLGraph.prototype.getParent = function () {\n return this.parent;\n};\n\nLGraph.prototype.getLeft = function () {\n return this.left;\n};\n\nLGraph.prototype.getRight = function () {\n return this.right;\n};\n\nLGraph.prototype.getTop = function () {\n return this.top;\n};\n\nLGraph.prototype.getBottom = function () {\n return this.bottom;\n};\n\nLGraph.prototype.isConnected = function () {\n return this.isConnected;\n};\n\nLGraph.prototype.add = function (obj1, sourceNode, targetNode) {\n if (sourceNode == null && targetNode == null) {\n var newNode = obj1;\n if (this.graphManager == null) {\n throw \"Graph has no graph mgr!\";\n }\n if (this.getNodes().indexOf(newNode) > -1) {\n throw \"Node already in graph!\";\n }\n newNode.owner = this;\n this.getNodes().push(newNode);\n\n return newNode;\n } else {\n var newEdge = obj1;\n if (!(this.getNodes().indexOf(sourceNode) > -1 && this.getNodes().indexOf(targetNode) > -1)) {\n throw \"Source or target not in graph!\";\n }\n\n if (!(sourceNode.owner == targetNode.owner && sourceNode.owner == this)) {\n throw \"Both owners must be this graph!\";\n }\n\n if (sourceNode.owner != targetNode.owner) {\n return null;\n }\n\n // set source and target\n newEdge.source = sourceNode;\n newEdge.target = targetNode;\n\n // set as intra-graph edge\n newEdge.isInterGraph = false;\n\n // add to graph edge list\n this.getEdges().push(newEdge);\n\n // add to incidency lists\n sourceNode.edges.push(newEdge);\n\n if (targetNode != sourceNode) {\n targetNode.edges.push(newEdge);\n }\n\n return newEdge;\n }\n};\n\nLGraph.prototype.remove = function (obj) {\n var node = obj;\n if (obj instanceof LNode) {\n if (node == null) {\n throw \"Node is null!\";\n }\n if (!(node.owner != null && node.owner == this)) {\n throw \"Owner graph is invalid!\";\n }\n if (this.graphManager == null) {\n throw \"Owner graph manager is invalid!\";\n }\n // remove incident edges first (make a copy to do it safely)\n var edgesToBeRemoved = node.edges.slice();\n var edge;\n var s = edgesToBeRemoved.length;\n for (var i = 0; i < s; i++) {\n edge = edgesToBeRemoved[i];\n\n if (edge.isInterGraph) {\n this.graphManager.remove(edge);\n } else {\n edge.source.owner.remove(edge);\n }\n }\n\n // now the node itself\n var index = this.nodes.indexOf(node);\n if (index == -1) {\n throw \"Node not in owner node list!\";\n }\n\n this.nodes.splice(index, 1);\n } else if (obj instanceof LEdge) {\n var edge = obj;\n if (edge == null) {\n throw \"Edge is null!\";\n }\n if (!(edge.source != null && edge.target != null)) {\n throw \"Source and/or target is null!\";\n }\n if (!(edge.source.owner != null && edge.target.owner != null && edge.source.owner == this && edge.target.owner == this)) {\n throw \"Source and/or target owner is invalid!\";\n }\n\n var sourceIndex = edge.source.edges.indexOf(edge);\n var targetIndex = edge.target.edges.indexOf(edge);\n if (!(sourceIndex > -1 && targetIndex > -1)) {\n throw \"Source and/or target doesn't know this edge!\";\n }\n\n edge.source.edges.splice(sourceIndex, 1);\n\n if (edge.target != edge.source) {\n edge.target.edges.splice(targetIndex, 1);\n }\n\n var index = edge.source.owner.getEdges().indexOf(edge);\n if (index == -1) {\n throw \"Not in owner's edge list!\";\n }\n\n edge.source.owner.getEdges().splice(index, 1);\n }\n};\n\nLGraph.prototype.updateLeftTop = function () {\n var top = Integer.MAX_VALUE;\n var left = Integer.MAX_VALUE;\n var nodeTop;\n var nodeLeft;\n var margin;\n\n var nodes = this.getNodes();\n var s = nodes.length;\n\n for (var i = 0; i < s; i++) {\n var lNode = nodes[i];\n nodeTop = lNode.getTop();\n nodeLeft = lNode.getLeft();\n\n if (top > nodeTop) {\n top = nodeTop;\n }\n\n if (left > nodeLeft) {\n left = nodeLeft;\n }\n }\n\n // Do we have any nodes in this graph?\n if (top == Integer.MAX_VALUE) {\n return null;\n }\n\n if (nodes[0].getParent().paddingLeft != undefined) {\n margin = nodes[0].getParent().paddingLeft;\n } else {\n margin = this.margin;\n }\n\n this.left = left - margin;\n this.top = top - margin;\n\n // Apply the margins and return the result\n return new Point(this.left, this.top);\n};\n\nLGraph.prototype.updateBounds = function (recursive) {\n // calculate bounds\n var left = Integer.MAX_VALUE;\n var right = -Integer.MAX_VALUE;\n var top = Integer.MAX_VALUE;\n var bottom = -Integer.MAX_VALUE;\n var nodeLeft;\n var nodeRight;\n var nodeTop;\n var nodeBottom;\n var margin;\n\n var nodes = this.nodes;\n var s = nodes.length;\n for (var i = 0; i < s; i++) {\n var lNode = nodes[i];\n\n if (recursive && lNode.child != null) {\n lNode.updateBounds();\n }\n nodeLeft = lNode.getLeft();\n nodeRight = lNode.getRight();\n nodeTop = lNode.getTop();\n nodeBottom = lNode.getBottom();\n\n if (left > nodeLeft) {\n left = nodeLeft;\n }\n\n if (right < nodeRight) {\n right = nodeRight;\n }\n\n if (top > nodeTop) {\n top = nodeTop;\n }\n\n if (bottom < nodeBottom) {\n bottom = nodeBottom;\n }\n }\n\n var boundingRect = new RectangleD(left, top, right - left, bottom - top);\n if (left == Integer.MAX_VALUE) {\n this.left = this.parent.getLeft();\n this.right = this.parent.getRight();\n this.top = this.parent.getTop();\n this.bottom = this.parent.getBottom();\n }\n\n if (nodes[0].getParent().paddingLeft != undefined) {\n margin = nodes[0].getParent().paddingLeft;\n } else {\n margin = this.margin;\n }\n\n this.left = boundingRect.x - margin;\n this.right = boundingRect.x + boundingRect.width + margin;\n this.top = boundingRect.y - margin;\n this.bottom = boundingRect.y + boundingRect.height + margin;\n};\n\nLGraph.calculateBounds = function (nodes) {\n var left = Integer.MAX_VALUE;\n var right = -Integer.MAX_VALUE;\n var top = Integer.MAX_VALUE;\n var bottom = -Integer.MAX_VALUE;\n var nodeLeft;\n var nodeRight;\n var nodeTop;\n var nodeBottom;\n\n var s = nodes.length;\n\n for (var i = 0; i < s; i++) {\n var lNode = nodes[i];\n nodeLeft = lNode.getLeft();\n nodeRight = lNode.getRight();\n nodeTop = lNode.getTop();\n nodeBottom = lNode.getBottom();\n\n if (left > nodeLeft) {\n left = nodeLeft;\n }\n\n if (right < nodeRight) {\n right = nodeRight;\n }\n\n if (top > nodeTop) {\n top = nodeTop;\n }\n\n if (bottom < nodeBottom) {\n bottom = nodeBottom;\n }\n }\n\n var boundingRect = new RectangleD(left, top, right - left, bottom - top);\n\n return boundingRect;\n};\n\nLGraph.prototype.getInclusionTreeDepth = function () {\n if (this == this.graphManager.getRoot()) {\n return 1;\n } else {\n return this.parent.getInclusionTreeDepth();\n }\n};\n\nLGraph.prototype.getEstimatedSize = function () {\n if (this.estimatedSize == Integer.MIN_VALUE) {\n throw \"assert failed\";\n }\n return this.estimatedSize;\n};\n\nLGraph.prototype.calcEstimatedSize = function () {\n var size = 0;\n var nodes = this.nodes;\n var s = nodes.length;\n\n for (var i = 0; i < s; i++) {\n var lNode = nodes[i];\n size += lNode.calcEstimatedSize();\n }\n\n if (size == 0) {\n this.estimatedSize = LayoutConstants.EMPTY_COMPOUND_NODE_SIZE;\n } else {\n this.estimatedSize = size / Math.sqrt(this.nodes.length);\n }\n\n return this.estimatedSize;\n};\n\nLGraph.prototype.updateConnected = function () {\n var self = this;\n if (this.nodes.length == 0) {\n this.isConnected = true;\n return;\n }\n\n var queue = new LinkedList();\n var visited = new Set();\n var currentNode = this.nodes[0];\n var neighborEdges;\n var currentNeighbor;\n var childrenOfNode = currentNode.withChildren();\n childrenOfNode.forEach(function (node) {\n queue.push(node);\n visited.add(node);\n });\n\n while (queue.length !== 0) {\n currentNode = queue.shift();\n\n // Traverse all neighbors of this node\n neighborEdges = currentNode.getEdges();\n var size = neighborEdges.length;\n for (var i = 0; i < size; i++) {\n var neighborEdge = neighborEdges[i];\n currentNeighbor = neighborEdge.getOtherEndInGraph(currentNode, this);\n\n // Add unvisited neighbors to the list to visit\n if (currentNeighbor != null && !visited.has(currentNeighbor)) {\n var childrenOfNeighbor = currentNeighbor.withChildren();\n\n childrenOfNeighbor.forEach(function (node) {\n queue.push(node);\n visited.add(node);\n });\n }\n }\n }\n\n this.isConnected = false;\n\n if (visited.size >= this.nodes.length) {\n var noOfVisitedInThisGraph = 0;\n\n visited.forEach(function (visitedNode) {\n if (visitedNode.owner == self) {\n noOfVisitedInThisGraph++;\n }\n });\n\n if (noOfVisitedInThisGraph == this.nodes.length) {\n this.isConnected = true;\n }\n }\n};\n\nmodule.exports = LGraph;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LGraph;\nvar LEdge = __webpack_require__(1);\n\nfunction LGraphManager(layout) {\n LGraph = __webpack_require__(6); // It may be better to initilize this out of this function but it gives an error (Right-hand side of 'instanceof' is not callable) now.\n this.layout = layout;\n\n this.graphs = [];\n this.edges = [];\n}\n\nLGraphManager.prototype.addRoot = function () {\n var ngraph = this.layout.newGraph();\n var nnode = this.layout.newNode(null);\n var root = this.add(ngraph, nnode);\n this.setRootGraph(root);\n return this.rootGraph;\n};\n\nLGraphManager.prototype.add = function (newGraph, parentNode, newEdge, sourceNode, targetNode) {\n //there are just 2 parameters are passed then it adds an LGraph else it adds an LEdge\n if (newEdge == null && sourceNode == null && targetNode == null) {\n if (newGraph == null) {\n throw \"Graph is null!\";\n }\n if (parentNode == null) {\n throw \"Parent node is null!\";\n }\n if (this.graphs.indexOf(newGraph) > -1) {\n throw \"Graph already in this graph mgr!\";\n }\n\n this.graphs.push(newGraph);\n\n if (newGraph.parent != null) {\n throw \"Already has a parent!\";\n }\n if (parentNode.child != null) {\n throw \"Already has a child!\";\n }\n\n newGraph.parent = parentNode;\n parentNode.child = newGraph;\n\n return newGraph;\n } else {\n //change the order of the parameters\n targetNode = newEdge;\n sourceNode = parentNode;\n newEdge = newGraph;\n var sourceGraph = sourceNode.getOwner();\n var targetGraph = targetNode.getOwner();\n\n if (!(sourceGraph != null && sourceGraph.getGraphManager() == this)) {\n throw \"Source not in this graph mgr!\";\n }\n if (!(targetGraph != null && targetGraph.getGraphManager() == this)) {\n throw \"Target not in this graph mgr!\";\n }\n\n if (sourceGraph == targetGraph) {\n newEdge.isInterGraph = false;\n return sourceGraph.add(newEdge, sourceNode, targetNode);\n } else {\n newEdge.isInterGraph = true;\n\n // set source and target\n newEdge.source = sourceNode;\n newEdge.target = targetNode;\n\n // add edge to inter-graph edge list\n if (this.edges.indexOf(newEdge) > -1) {\n throw \"Edge already in inter-graph edge list!\";\n }\n\n this.edges.push(newEdge);\n\n // add edge to source and target incidency lists\n if (!(newEdge.source != null && newEdge.target != null)) {\n throw \"Edge source and/or target is null!\";\n }\n\n if (!(newEdge.source.edges.indexOf(newEdge) == -1 && newEdge.target.edges.indexOf(newEdge) == -1)) {\n throw \"Edge already in source and/or target incidency list!\";\n }\n\n newEdge.source.edges.push(newEdge);\n newEdge.target.edges.push(newEdge);\n\n return newEdge;\n }\n }\n};\n\nLGraphManager.prototype.remove = function (lObj) {\n if (lObj instanceof LGraph) {\n var graph = lObj;\n if (graph.getGraphManager() != this) {\n throw \"Graph not in this graph mgr\";\n }\n if (!(graph == this.rootGraph || graph.parent != null && graph.parent.graphManager == this)) {\n throw \"Invalid parent node!\";\n }\n\n // first the edges (make a copy to do it safely)\n var edgesToBeRemoved = [];\n\n edgesToBeRemoved = edgesToBeRemoved.concat(graph.getEdges());\n\n var edge;\n var s = edgesToBeRemoved.length;\n for (var i = 0; i < s; i++) {\n edge = edgesToBeRemoved[i];\n graph.remove(edge);\n }\n\n // then the nodes (make a copy to do it safely)\n var nodesToBeRemoved = [];\n\n nodesToBeRemoved = nodesToBeRemoved.concat(graph.getNodes());\n\n var node;\n s = nodesToBeRemoved.length;\n for (var i = 0; i < s; i++) {\n node = nodesToBeRemoved[i];\n graph.remove(node);\n }\n\n // check if graph is the root\n if (graph == this.rootGraph) {\n this.setRootGraph(null);\n }\n\n // now remove the graph itself\n var index = this.graphs.indexOf(graph);\n this.graphs.splice(index, 1);\n\n // also reset the parent of the graph\n graph.parent = null;\n } else if (lObj instanceof LEdge) {\n edge = lObj;\n if (edge == null) {\n throw \"Edge is null!\";\n }\n if (!edge.isInterGraph) {\n throw \"Not an inter-graph edge!\";\n }\n if (!(edge.source != null && edge.target != null)) {\n throw \"Source and/or target is null!\";\n }\n\n // remove edge from source and target nodes' incidency lists\n\n if (!(edge.source.edges.indexOf(edge) != -1 && edge.target.edges.indexOf(edge) != -1)) {\n throw \"Source and/or target doesn't know this edge!\";\n }\n\n var index = edge.source.edges.indexOf(edge);\n edge.source.edges.splice(index, 1);\n index = edge.target.edges.indexOf(edge);\n edge.target.edges.splice(index, 1);\n\n // remove edge from owner graph manager's inter-graph edge list\n\n if (!(edge.source.owner != null && edge.source.owner.getGraphManager() != null)) {\n throw \"Edge owner graph or owner graph manager is null!\";\n }\n if (edge.source.owner.getGraphManager().edges.indexOf(edge) == -1) {\n throw \"Not in owner graph manager's edge list!\";\n }\n\n var index = edge.source.owner.getGraphManager().edges.indexOf(edge);\n edge.source.owner.getGraphManager().edges.splice(index, 1);\n }\n};\n\nLGraphManager.prototype.updateBounds = function () {\n this.rootGraph.updateBounds(true);\n};\n\nLGraphManager.prototype.getGraphs = function () {\n return this.graphs;\n};\n\nLGraphManager.prototype.getAllNodes = function () {\n if (this.allNodes == null) {\n var nodeList = [];\n var graphs = this.getGraphs();\n var s = graphs.length;\n for (var i = 0; i < s; i++) {\n nodeList = nodeList.concat(graphs[i].getNodes());\n }\n this.allNodes = nodeList;\n }\n return this.allNodes;\n};\n\nLGraphManager.prototype.resetAllNodes = function () {\n this.allNodes = null;\n};\n\nLGraphManager.prototype.resetAllEdges = function () {\n this.allEdges = null;\n};\n\nLGraphManager.prototype.resetAllNodesToApplyGravitation = function () {\n this.allNodesToApplyGravitation = null;\n};\n\nLGraphManager.prototype.getAllEdges = function () {\n if (this.allEdges == null) {\n var edgeList = [];\n var graphs = this.getGraphs();\n var s = graphs.length;\n for (var i = 0; i < graphs.length; i++) {\n edgeList = edgeList.concat(graphs[i].getEdges());\n }\n\n edgeList = edgeList.concat(this.edges);\n\n this.allEdges = edgeList;\n }\n return this.allEdges;\n};\n\nLGraphManager.prototype.getAllNodesToApplyGravitation = function () {\n return this.allNodesToApplyGravitation;\n};\n\nLGraphManager.prototype.setAllNodesToApplyGravitation = function (nodeList) {\n if (this.allNodesToApplyGravitation != null) {\n throw \"assert failed\";\n }\n\n this.allNodesToApplyGravitation = nodeList;\n};\n\nLGraphManager.prototype.getRoot = function () {\n return this.rootGraph;\n};\n\nLGraphManager.prototype.setRootGraph = function (graph) {\n if (graph.getGraphManager() != this) {\n throw \"Root not in this graph mgr!\";\n }\n\n this.rootGraph = graph;\n // root graph must have a root node associated with it for convenience\n if (graph.parent == null) {\n graph.parent = this.layout.newNode(\"Root node\");\n }\n};\n\nLGraphManager.prototype.getLayout = function () {\n return this.layout;\n};\n\nLGraphManager.prototype.isOneAncestorOfOther = function (firstNode, secondNode) {\n if (!(firstNode != null && secondNode != null)) {\n throw \"assert failed\";\n }\n\n if (firstNode == secondNode) {\n return true;\n }\n // Is second node an ancestor of the first one?\n var ownerGraph = firstNode.getOwner();\n var parentNode;\n\n do {\n parentNode = ownerGraph.getParent();\n\n if (parentNode == null) {\n break;\n }\n\n if (parentNode == secondNode) {\n return true;\n }\n\n ownerGraph = parentNode.getOwner();\n if (ownerGraph == null) {\n break;\n }\n } while (true);\n // Is first node an ancestor of the second one?\n ownerGraph = secondNode.getOwner();\n\n do {\n parentNode = ownerGraph.getParent();\n\n if (parentNode == null) {\n break;\n }\n\n if (parentNode == firstNode) {\n return true;\n }\n\n ownerGraph = parentNode.getOwner();\n if (ownerGraph == null) {\n break;\n }\n } while (true);\n\n return false;\n};\n\nLGraphManager.prototype.calcLowestCommonAncestors = function () {\n var edge;\n var sourceNode;\n var targetNode;\n var sourceAncestorGraph;\n var targetAncestorGraph;\n\n var edges = this.getAllEdges();\n var s = edges.length;\n for (var i = 0; i < s; i++) {\n edge = edges[i];\n\n sourceNode = edge.source;\n targetNode = edge.target;\n edge.lca = null;\n edge.sourceInLca = sourceNode;\n edge.targetInLca = targetNode;\n\n if (sourceNode == targetNode) {\n edge.lca = sourceNode.getOwner();\n continue;\n }\n\n sourceAncestorGraph = sourceNode.getOwner();\n\n while (edge.lca == null) {\n edge.targetInLca = targetNode;\n targetAncestorGraph = targetNode.getOwner();\n\n while (edge.lca == null) {\n if (targetAncestorGraph == sourceAncestorGraph) {\n edge.lca = targetAncestorGraph;\n break;\n }\n\n if (targetAncestorGraph == this.rootGraph) {\n break;\n }\n\n if (edge.lca != null) {\n throw \"assert failed\";\n }\n edge.targetInLca = targetAncestorGraph.getParent();\n targetAncestorGraph = edge.targetInLca.getOwner();\n }\n\n if (sourceAncestorGraph == this.rootGraph) {\n break;\n }\n\n if (edge.lca == null) {\n edge.sourceInLca = sourceAncestorGraph.getParent();\n sourceAncestorGraph = edge.sourceInLca.getOwner();\n }\n }\n\n if (edge.lca == null) {\n throw \"assert failed\";\n }\n }\n};\n\nLGraphManager.prototype.calcLowestCommonAncestor = function (firstNode, secondNode) {\n if (firstNode == secondNode) {\n return firstNode.getOwner();\n }\n var firstOwnerGraph = firstNode.getOwner();\n\n do {\n if (firstOwnerGraph == null) {\n break;\n }\n var secondOwnerGraph = secondNode.getOwner();\n\n do {\n if (secondOwnerGraph == null) {\n break;\n }\n\n if (secondOwnerGraph == firstOwnerGraph) {\n return secondOwnerGraph;\n }\n secondOwnerGraph = secondOwnerGraph.getParent().getOwner();\n } while (true);\n\n firstOwnerGraph = firstOwnerGraph.getParent().getOwner();\n } while (true);\n\n return firstOwnerGraph;\n};\n\nLGraphManager.prototype.calcInclusionTreeDepths = function (graph, depth) {\n if (graph == null && depth == null) {\n graph = this.rootGraph;\n depth = 1;\n }\n var node;\n\n var nodes = graph.getNodes();\n var s = nodes.length;\n for (var i = 0; i < s; i++) {\n node = nodes[i];\n node.inclusionTreeDepth = depth;\n\n if (node.child != null) {\n this.calcInclusionTreeDepths(node.child, depth + 1);\n }\n }\n};\n\nLGraphManager.prototype.includesInvalidEdge = function () {\n var edge;\n var edgesToRemove = [];\n\n var s = this.edges.length;\n for (var i = 0; i < s; i++) {\n edge = this.edges[i];\n\n if (this.isOneAncestorOfOther(edge.source, edge.target)) {\n edgesToRemove.push(edge);\n }\n }\n\n // Remove invalid edges from graph manager\n for (var i = 0; i < edgesToRemove.length; i++) {\n this.remove(edgesToRemove[i]);\n }\n\n // Invalid edges are cleared, so return false\n return false;\n};\n\nmodule.exports = LGraphManager;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * This class maintains a list of static geometry related utility methods.\n *\n *\n * Copyright: i-Vis Research Group, Bilkent University, 2007 - present\n */\n\nvar Point = __webpack_require__(12);\n\nfunction IGeometry() {}\n\n/**\n * This method calculates *half* the amount in x and y directions of the two\n * input rectangles needed to separate them keeping their respective\n * positioning, and returns the result in the input array. An input\n * separation buffer added to the amount in both directions. We assume that\n * the two rectangles do intersect.\n */\nIGeometry.calcSeparationAmount = function (rectA, rectB, overlapAmount, separationBuffer) {\n if (!rectA.intersects(rectB)) {\n throw \"assert failed\";\n }\n\n var directions = new Array(2);\n\n this.decideDirectionsForOverlappingNodes(rectA, rectB, directions);\n\n overlapAmount[0] = Math.min(rectA.getRight(), rectB.getRight()) - Math.max(rectA.x, rectB.x);\n overlapAmount[1] = Math.min(rectA.getBottom(), rectB.getBottom()) - Math.max(rectA.y, rectB.y);\n\n // update the overlapping amounts for the following cases:\n if (rectA.getX() <= rectB.getX() && rectA.getRight() >= rectB.getRight()) {\n /* Case x.1:\n *\n * rectA\n * \t| |\n * \t| _________ |\n * \t| | | |\n * \t|________|_______|______|\n * \t\t\t | |\n * | |\n * rectB\n */\n overlapAmount[0] += Math.min(rectB.getX() - rectA.getX(), rectA.getRight() - rectB.getRight());\n } else if (rectB.getX() <= rectA.getX() && rectB.getRight() >= rectA.getRight()) {\n /* Case x.2:\n *\n * rectB\n * \t| |\n * \t| _________ |\n * \t| | | |\n * \t|________|_______|______|\n * \t\t\t | |\n * | |\n * rectA\n */\n overlapAmount[0] += Math.min(rectA.getX() - rectB.getX(), rectB.getRight() - rectA.getRight());\n }\n if (rectA.getY() <= rectB.getY() && rectA.getBottom() >= rectB.getBottom()) {\n /* Case y.1:\n * ________ rectA\n * |\n * |\n * ______|____ rectB\n * | |\n * | |\n * ______|____|\n * |\n * |\n * |________\n *\n */\n overlapAmount[1] += Math.min(rectB.getY() - rectA.getY(), rectA.getBottom() - rectB.getBottom());\n } else if (rectB.getY() <= rectA.getY() && rectB.getBottom() >= rectA.getBottom()) {\n /* Case y.2:\n * ________ rectB\n * |\n * |\n * ______|____ rectA\n * | |\n * | |\n * ______|____|\n * |\n * |\n * |________\n *\n */\n overlapAmount[1] += Math.min(rectA.getY() - rectB.getY(), rectB.getBottom() - rectA.getBottom());\n }\n\n // find slope of the line passes two centers\n var slope = Math.abs((rectB.getCenterY() - rectA.getCenterY()) / (rectB.getCenterX() - rectA.getCenterX()));\n // if centers are overlapped\n if (rectB.getCenterY() === rectA.getCenterY() && rectB.getCenterX() === rectA.getCenterX()) {\n // assume the slope is 1 (45 degree)\n slope = 1.0;\n }\n\n var moveByY = slope * overlapAmount[0];\n var moveByX = overlapAmount[1] / slope;\n if (overlapAmount[0] < moveByX) {\n moveByX = overlapAmount[0];\n } else {\n moveByY = overlapAmount[1];\n }\n // return half the amount so that if each rectangle is moved by these\n // amounts in opposite directions, overlap will be resolved\n overlapAmount[0] = -1 * directions[0] * (moveByX / 2 + separationBuffer);\n overlapAmount[1] = -1 * directions[1] * (moveByY / 2 + separationBuffer);\n};\n\n/**\n * This method decides the separation direction of overlapping nodes\n *\n * if directions[0] = -1, then rectA goes left\n * if directions[0] = 1, then rectA goes right\n * if directions[1] = -1, then rectA goes up\n * if directions[1] = 1, then rectA goes down\n */\nIGeometry.decideDirectionsForOverlappingNodes = function (rectA, rectB, directions) {\n if (rectA.getCenterX() < rectB.getCenterX()) {\n directions[0] = -1;\n } else {\n directions[0] = 1;\n }\n\n if (rectA.getCenterY() < rectB.getCenterY()) {\n directions[1] = -1;\n } else {\n directions[1] = 1;\n }\n};\n\n/**\n * This method calculates the intersection (clipping) points of the two\n * input rectangles with line segment defined by the centers of these two\n * rectangles. The clipping points are saved in the input double array and\n * whether or not the two rectangles overlap is returned.\n */\nIGeometry.getIntersection2 = function (rectA, rectB, result) {\n //result[0-1] will contain clipPoint of rectA, result[2-3] will contain clipPoint of rectB\n var p1x = rectA.getCenterX();\n var p1y = rectA.getCenterY();\n var p2x = rectB.getCenterX();\n var p2y = rectB.getCenterY();\n\n //if two rectangles intersect, then clipping points are centers\n if (rectA.intersects(rectB)) {\n result[0] = p1x;\n result[1] = p1y;\n result[2] = p2x;\n result[3] = p2y;\n return true;\n }\n //variables for rectA\n var topLeftAx = rectA.getX();\n var topLeftAy = rectA.getY();\n var topRightAx = rectA.getRight();\n var bottomLeftAx = rectA.getX();\n var bottomLeftAy = rectA.getBottom();\n var bottomRightAx = rectA.getRight();\n var halfWidthA = rectA.getWidthHalf();\n var halfHeightA = rectA.getHeightHalf();\n //variables for rectB\n var topLeftBx = rectB.getX();\n var topLeftBy = rectB.getY();\n var topRightBx = rectB.getRight();\n var bottomLeftBx = rectB.getX();\n var bottomLeftBy = rectB.getBottom();\n var bottomRightBx = rectB.getRight();\n var halfWidthB = rectB.getWidthHalf();\n var halfHeightB = rectB.getHeightHalf();\n\n //flag whether clipping points are found\n var clipPointAFound = false;\n var clipPointBFound = false;\n\n // line is vertical\n if (p1x === p2x) {\n if (p1y > p2y) {\n result[0] = p1x;\n result[1] = topLeftAy;\n result[2] = p2x;\n result[3] = bottomLeftBy;\n return false;\n } else if (p1y < p2y) {\n result[0] = p1x;\n result[1] = bottomLeftAy;\n result[2] = p2x;\n result[3] = topLeftBy;\n return false;\n } else {\n //not line, return null;\n }\n }\n // line is horizontal\n else if (p1y === p2y) {\n if (p1x > p2x) {\n result[0] = topLeftAx;\n result[1] = p1y;\n result[2] = topRightBx;\n result[3] = p2y;\n return false;\n } else if (p1x < p2x) {\n result[0] = topRightAx;\n result[1] = p1y;\n result[2] = topLeftBx;\n result[3] = p2y;\n return false;\n } else {\n //not valid line, return null;\n }\n } else {\n //slopes of rectA's and rectB's diagonals\n var slopeA = rectA.height / rectA.width;\n var slopeB = rectB.height / rectB.width;\n\n //slope of line between center of rectA and center of rectB\n var slopePrime = (p2y - p1y) / (p2x - p1x);\n var cardinalDirectionA = void 0;\n var cardinalDirectionB = void 0;\n var tempPointAx = void 0;\n var tempPointAy = void 0;\n var tempPointBx = void 0;\n var tempPointBy = void 0;\n\n //determine whether clipping point is the corner of nodeA\n if (-slopeA === slopePrime) {\n if (p1x > p2x) {\n result[0] = bottomLeftAx;\n result[1] = bottomLeftAy;\n clipPointAFound = true;\n } else {\n result[0] = topRightAx;\n result[1] = topLeftAy;\n clipPointAFound = true;\n }\n } else if (slopeA === slopePrime) {\n if (p1x > p2x) {\n result[0] = topLeftAx;\n result[1] = topLeftAy;\n clipPointAFound = true;\n } else {\n result[0] = bottomRightAx;\n result[1] = bottomLeftAy;\n clipPointAFound = true;\n }\n }\n\n //determine whether clipping point is the corner of nodeB\n if (-slopeB === slopePrime) {\n if (p2x > p1x) {\n result[2] = bottomLeftBx;\n result[3] = bottomLeftBy;\n clipPointBFound = true;\n } else {\n result[2] = topRightBx;\n result[3] = topLeftBy;\n clipPointBFound = true;\n }\n } else if (slopeB === slopePrime) {\n if (p2x > p1x) {\n result[2] = topLeftBx;\n result[3] = topLeftBy;\n clipPointBFound = true;\n } else {\n result[2] = bottomRightBx;\n result[3] = bottomLeftBy;\n clipPointBFound = true;\n }\n }\n\n //if both clipping points are corners\n if (clipPointAFound && clipPointBFound) {\n return false;\n }\n\n //determine Cardinal Direction of rectangles\n if (p1x > p2x) {\n if (p1y > p2y) {\n cardinalDirectionA = this.getCardinalDirection(slopeA, slopePrime, 4);\n cardinalDirectionB = this.getCardinalDirection(slopeB, slopePrime, 2);\n } else {\n cardinalDirectionA = this.getCardinalDirection(-slopeA, slopePrime, 3);\n cardinalDirectionB = this.getCardinalDirection(-slopeB, slopePrime, 1);\n }\n } else {\n if (p1y > p2y) {\n cardinalDirectionA = this.getCardinalDirection(-slopeA, slopePrime, 1);\n cardinalDirectionB = this.getCardinalDirection(-slopeB, slopePrime, 3);\n } else {\n cardinalDirectionA = this.getCardinalDirection(slopeA, slopePrime, 2);\n cardinalDirectionB = this.getCardinalDirection(slopeB, slopePrime, 4);\n }\n }\n //calculate clipping Point if it is not found before\n if (!clipPointAFound) {\n switch (cardinalDirectionA) {\n case 1:\n tempPointAy = topLeftAy;\n tempPointAx = p1x + -halfHeightA / slopePrime;\n result[0] = tempPointAx;\n result[1] = tempPointAy;\n break;\n case 2:\n tempPointAx = bottomRightAx;\n tempPointAy = p1y + halfWidthA * slopePrime;\n result[0] = tempPointAx;\n result[1] = tempPointAy;\n break;\n case 3:\n tempPointAy = bottomLeftAy;\n tempPointAx = p1x + halfHeightA / slopePrime;\n result[0] = tempPointAx;\n result[1] = tempPointAy;\n break;\n case 4:\n tempPointAx = bottomLeftAx;\n tempPointAy = p1y + -halfWidthA * slopePrime;\n result[0] = tempPointAx;\n result[1] = tempPointAy;\n break;\n }\n }\n if (!clipPointBFound) {\n switch (cardinalDirectionB) {\n case 1:\n tempPointBy = topLeftBy;\n tempPointBx = p2x + -halfHeightB / slopePrime;\n result[2] = tempPointBx;\n result[3] = tempPointBy;\n break;\n case 2:\n tempPointBx = bottomRightBx;\n tempPointBy = p2y + halfWidthB * slopePrime;\n result[2] = tempPointBx;\n result[3] = tempPointBy;\n break;\n case 3:\n tempPointBy = bottomLeftBy;\n tempPointBx = p2x + halfHeightB / slopePrime;\n result[2] = tempPointBx;\n result[3] = tempPointBy;\n break;\n case 4:\n tempPointBx = bottomLeftBx;\n tempPointBy = p2y + -halfWidthB * slopePrime;\n result[2] = tempPointBx;\n result[3] = tempPointBy;\n break;\n }\n }\n }\n return false;\n};\n\n/**\n * This method returns in which cardinal direction does input point stays\n * 1: North\n * 2: East\n * 3: South\n * 4: West\n */\nIGeometry.getCardinalDirection = function (slope, slopePrime, line) {\n if (slope > slopePrime) {\n return line;\n } else {\n return 1 + line % 4;\n }\n};\n\n/**\n * This method calculates the intersection of the two lines defined by\n * point pairs (s1,s2) and (f1,f2).\n */\nIGeometry.getIntersection = function (s1, s2, f1, f2) {\n if (f2 == null) {\n return this.getIntersection2(s1, s2, f1);\n }\n\n var x1 = s1.x;\n var y1 = s1.y;\n var x2 = s2.x;\n var y2 = s2.y;\n var x3 = f1.x;\n var y3 = f1.y;\n var x4 = f2.x;\n var y4 = f2.y;\n var x = void 0,\n y = void 0; // intersection point\n var a1 = void 0,\n a2 = void 0,\n b1 = void 0,\n b2 = void 0,\n c1 = void 0,\n c2 = void 0; // coefficients of line eqns.\n var denom = void 0;\n\n a1 = y2 - y1;\n b1 = x1 - x2;\n c1 = x2 * y1 - x1 * y2; // { a1*x + b1*y + c1 = 0 is line 1 }\n\n a2 = y4 - y3;\n b2 = x3 - x4;\n c2 = x4 * y3 - x3 * y4; // { a2*x + b2*y + c2 = 0 is line 2 }\n\n denom = a1 * b2 - a2 * b1;\n\n if (denom === 0) {\n return null;\n }\n\n x = (b1 * c2 - b2 * c1) / denom;\n y = (a2 * c1 - a1 * c2) / denom;\n\n return new Point(x, y);\n};\n\n/**\n * This method finds and returns the angle of the vector from the + x-axis\n * in clockwise direction (compatible w/ Java coordinate system!).\n */\nIGeometry.angleOfVector = function (Cx, Cy, Nx, Ny) {\n var C_angle = void 0;\n\n if (Cx !== Nx) {\n C_angle = Math.atan((Ny - Cy) / (Nx - Cx));\n\n if (Nx < Cx) {\n C_angle += Math.PI;\n } else if (Ny < Cy) {\n C_angle += this.TWO_PI;\n }\n } else if (Ny < Cy) {\n C_angle = this.ONE_AND_HALF_PI; // 270 degrees\n } else {\n C_angle = this.HALF_PI; // 90 degrees\n }\n\n return C_angle;\n};\n\n/**\n * This method checks whether the given two line segments (one with point\n * p1 and p2, the other with point p3 and p4) intersect at a point other\n * than these points.\n */\nIGeometry.doIntersect = function (p1, p2, p3, p4) {\n var a = p1.x;\n var b = p1.y;\n var c = p2.x;\n var d = p2.y;\n var p = p3.x;\n var q = p3.y;\n var r = p4.x;\n var s = p4.y;\n var det = (c - a) * (s - q) - (r - p) * (d - b);\n\n if (det === 0) {\n return false;\n } else {\n var lambda = ((s - q) * (r - a) + (p - r) * (s - b)) / det;\n var gamma = ((b - d) * (r - a) + (c - a) * (s - b)) / det;\n return 0 < lambda && lambda < 1 && 0 < gamma && gamma < 1;\n }\n};\n\n/**\n * This method checks and calculates the intersection of \n * a line segment and a circle.\n */\nIGeometry.findCircleLineIntersections = function (Ex, Ey, Lx, Ly, Cx, Cy, r) {\n\n // E is the starting point of the ray,\n // L is the end point of the ray,\n // C is the center of sphere you're testing against\n // r is the radius of that sphere\n\n // Compute:\n // d = L - E ( Direction vector of ray, from start to end )\n // f = E - C ( Vector from center sphere to ray start )\n\n // Then the intersection is found by..\n // P = E + t * d\n // This is a parametric equation:\n // Px = Ex + tdx\n // Py = Ey + tdy\n\n // get a, b, c values\n var a = (Lx - Ex) * (Lx - Ex) + (Ly - Ey) * (Ly - Ey);\n var b = 2 * ((Ex - Cx) * (Lx - Ex) + (Ey - Cy) * (Ly - Ey));\n var c = (Ex - Cx) * (Ex - Cx) + (Ey - Cy) * (Ey - Cy) - r * r;\n\n // get discriminant\n var disc = b * b - 4 * a * c;\n if (disc >= 0) {\n // insert into quadratic formula\n var t1 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);\n var t2 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);\n var intersections = null;\n if (t1 >= 0 && t1 <= 1) {\n // t1 is the intersection, and it's closer than t2\n // (since t1 uses -b - discriminant)\n // Impale, Poke\n return [t1];\n }\n\n // here t1 didn't intersect so we are either started\n // inside the sphere or completely past it\n if (t2 >= 0 && t2 <= 1) {\n // ExitWound\n return [t2];\n }\n\n return intersections;\n } else return null;\n};\n\n// -----------------------------------------------------------------------------\n// Section: Class Constants\n// -----------------------------------------------------------------------------\n/**\n * Some useful pre-calculated constants\n */\nIGeometry.HALF_PI = 0.5 * Math.PI;\nIGeometry.ONE_AND_HALF_PI = 1.5 * Math.PI;\nIGeometry.TWO_PI = 2.0 * Math.PI;\nIGeometry.THREE_PI = 3.0 * Math.PI;\n\nmodule.exports = IGeometry;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction IMath() {}\n\n/**\n * This method returns the sign of the input value.\n */\nIMath.sign = function (value) {\n if (value > 0) {\n return 1;\n } else if (value < 0) {\n return -1;\n } else {\n return 0;\n }\n};\n\nIMath.floor = function (value) {\n return value < 0 ? Math.ceil(value) : Math.floor(value);\n};\n\nIMath.ceil = function (value) {\n return value < 0 ? Math.floor(value) : Math.ceil(value);\n};\n\nmodule.exports = IMath;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction Integer() {}\n\nInteger.MAX_VALUE = 2147483647;\nInteger.MIN_VALUE = -2147483648;\n\nmodule.exports = Integer;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar nodeFrom = function nodeFrom(value) {\n return { value: value, next: null, prev: null };\n};\n\nvar add = function add(prev, node, next, list) {\n if (prev !== null) {\n prev.next = node;\n } else {\n list.head = node;\n }\n\n if (next !== null) {\n next.prev = node;\n } else {\n list.tail = node;\n }\n\n node.prev = prev;\n node.next = next;\n\n list.length++;\n\n return node;\n};\n\nvar _remove = function _remove(node, list) {\n var prev = node.prev,\n next = node.next;\n\n\n if (prev !== null) {\n prev.next = next;\n } else {\n list.head = next;\n }\n\n if (next !== null) {\n next.prev = prev;\n } else {\n list.tail = prev;\n }\n\n node.prev = node.next = null;\n\n list.length--;\n\n return node;\n};\n\nvar LinkedList = function () {\n function LinkedList(vals) {\n var _this = this;\n\n _classCallCheck(this, LinkedList);\n\n this.length = 0;\n this.head = null;\n this.tail = null;\n\n if (vals != null) {\n vals.forEach(function (v) {\n return _this.push(v);\n });\n }\n }\n\n _createClass(LinkedList, [{\n key: \"size\",\n value: function size() {\n return this.length;\n }\n }, {\n key: \"insertBefore\",\n value: function insertBefore(val, otherNode) {\n return add(otherNode.prev, nodeFrom(val), otherNode, this);\n }\n }, {\n key: \"insertAfter\",\n value: function insertAfter(val, otherNode) {\n return add(otherNode, nodeFrom(val), otherNode.next, this);\n }\n }, {\n key: \"insertNodeBefore\",\n value: function insertNodeBefore(newNode, otherNode) {\n return add(otherNode.prev, newNode, otherNode, this);\n }\n }, {\n key: \"insertNodeAfter\",\n value: function insertNodeAfter(newNode, otherNode) {\n return add(otherNode, newNode, otherNode.next, this);\n }\n }, {\n key: \"push\",\n value: function push(val) {\n return add(this.tail, nodeFrom(val), null, this);\n }\n }, {\n key: \"unshift\",\n value: function unshift(val) {\n return add(null, nodeFrom(val), this.head, this);\n }\n }, {\n key: \"remove\",\n value: function remove(node) {\n return _remove(node, this);\n }\n }, {\n key: \"pop\",\n value: function pop() {\n return _remove(this.tail, this).value;\n }\n }, {\n key: \"popNode\",\n value: function popNode() {\n return _remove(this.tail, this);\n }\n }, {\n key: \"shift\",\n value: function shift() {\n return _remove(this.head, this).value;\n }\n }, {\n key: \"shiftNode\",\n value: function shiftNode() {\n return _remove(this.head, this);\n }\n }, {\n key: \"get_object_at\",\n value: function get_object_at(index) {\n if (index <= this.length()) {\n var i = 1;\n var current = this.head;\n while (i < index) {\n current = current.next;\n i++;\n }\n return current.value;\n }\n }\n }, {\n key: \"set_object_at\",\n value: function set_object_at(index, value) {\n if (index <= this.length()) {\n var i = 1;\n var current = this.head;\n while (i < index) {\n current = current.next;\n i++;\n }\n current.value = value;\n }\n }\n }]);\n\n return LinkedList;\n}();\n\nmodule.exports = LinkedList;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/*\r\n *This class is the javascript implementation of the Point.java class in jdk\r\n */\nfunction Point(x, y, p) {\n this.x = null;\n this.y = null;\n if (x == null && y == null && p == null) {\n this.x = 0;\n this.y = 0;\n } else if (typeof x == 'number' && typeof y == 'number' && p == null) {\n this.x = x;\n this.y = y;\n } else if (x.constructor.name == 'Point' && y == null && p == null) {\n p = x;\n this.x = p.x;\n this.y = p.y;\n }\n}\n\nPoint.prototype.getX = function () {\n return this.x;\n};\n\nPoint.prototype.getY = function () {\n return this.y;\n};\n\nPoint.prototype.getLocation = function () {\n return new Point(this.x, this.y);\n};\n\nPoint.prototype.setLocation = function (x, y, p) {\n if (x.constructor.name == 'Point' && y == null && p == null) {\n p = x;\n this.setLocation(p.x, p.y);\n } else if (typeof x == 'number' && typeof y == 'number' && p == null) {\n //if both parameters are integer just move (x,y) location\n if (parseInt(x) == x && parseInt(y) == y) {\n this.move(x, y);\n } else {\n this.x = Math.floor(x + 0.5);\n this.y = Math.floor(y + 0.5);\n }\n }\n};\n\nPoint.prototype.move = function (x, y) {\n this.x = x;\n this.y = y;\n};\n\nPoint.prototype.translate = function (dx, dy) {\n this.x += dx;\n this.y += dy;\n};\n\nPoint.prototype.equals = function (obj) {\n if (obj.constructor.name == \"Point\") {\n var pt = obj;\n return this.x == pt.x && this.y == pt.y;\n }\n return this == obj;\n};\n\nPoint.prototype.toString = function () {\n return new Point().constructor.name + \"[x=\" + this.x + \",y=\" + this.y + \"]\";\n};\n\nmodule.exports = Point;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction RectangleD(x, y, width, height) {\n this.x = 0;\n this.y = 0;\n this.width = 0;\n this.height = 0;\n\n if (x != null && y != null && width != null && height != null) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n}\n\nRectangleD.prototype.getX = function () {\n return this.x;\n};\n\nRectangleD.prototype.setX = function (x) {\n this.x = x;\n};\n\nRectangleD.prototype.getY = function () {\n return this.y;\n};\n\nRectangleD.prototype.setY = function (y) {\n this.y = y;\n};\n\nRectangleD.prototype.getWidth = function () {\n return this.width;\n};\n\nRectangleD.prototype.setWidth = function (width) {\n this.width = width;\n};\n\nRectangleD.prototype.getHeight = function () {\n return this.height;\n};\n\nRectangleD.prototype.setHeight = function (height) {\n this.height = height;\n};\n\nRectangleD.prototype.getRight = function () {\n return this.x + this.width;\n};\n\nRectangleD.prototype.getBottom = function () {\n return this.y + this.height;\n};\n\nRectangleD.prototype.intersects = function (a) {\n if (this.getRight() < a.x) {\n return false;\n }\n\n if (this.getBottom() < a.y) {\n return false;\n }\n\n if (a.getRight() < this.x) {\n return false;\n }\n\n if (a.getBottom() < this.y) {\n return false;\n }\n\n return true;\n};\n\nRectangleD.prototype.getCenterX = function () {\n return this.x + this.width / 2;\n};\n\nRectangleD.prototype.getMinX = function () {\n return this.getX();\n};\n\nRectangleD.prototype.getMaxX = function () {\n return this.getX() + this.width;\n};\n\nRectangleD.prototype.getCenterY = function () {\n return this.y + this.height / 2;\n};\n\nRectangleD.prototype.getMinY = function () {\n return this.getY();\n};\n\nRectangleD.prototype.getMaxY = function () {\n return this.getY() + this.height;\n};\n\nRectangleD.prototype.getWidthHalf = function () {\n return this.width / 2;\n};\n\nRectangleD.prototype.getHeightHalf = function () {\n return this.height / 2;\n};\n\nmodule.exports = RectangleD;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction UniqueIDGeneretor() {}\n\nUniqueIDGeneretor.lastID = 0;\n\nUniqueIDGeneretor.createID = function (obj) {\n if (UniqueIDGeneretor.isPrimitive(obj)) {\n return obj;\n }\n if (obj.uniqueID != null) {\n return obj.uniqueID;\n }\n obj.uniqueID = UniqueIDGeneretor.getString();\n UniqueIDGeneretor.lastID++;\n return obj.uniqueID;\n};\n\nUniqueIDGeneretor.getString = function (id) {\n if (id == null) id = UniqueIDGeneretor.lastID;\n return \"Object#\" + id + \"\";\n};\n\nUniqueIDGeneretor.isPrimitive = function (arg) {\n var type = typeof arg === \"undefined\" ? \"undefined\" : _typeof(arg);\n return arg == null || type != \"object\" && type != \"function\";\n};\n\nmodule.exports = UniqueIDGeneretor;\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar LayoutConstants = __webpack_require__(0);\nvar LGraphManager = __webpack_require__(7);\nvar LNode = __webpack_require__(3);\nvar LEdge = __webpack_require__(1);\nvar LGraph = __webpack_require__(6);\nvar PointD = __webpack_require__(5);\nvar Transform = __webpack_require__(17);\nvar Emitter = __webpack_require__(29);\n\nfunction Layout(isRemoteUse) {\n Emitter.call(this);\n\n //Layout Quality: 0:draft, 1:default, 2:proof\n this.layoutQuality = LayoutConstants.QUALITY;\n //Whether layout should create bendpoints as needed or not\n this.createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED;\n //Whether layout should be incremental or not\n this.incremental = LayoutConstants.DEFAULT_INCREMENTAL;\n //Whether we animate from before to after layout node positions\n this.animationOnLayout = LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT;\n //Whether we animate the layout process or not\n this.animationDuringLayout = LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT;\n //Number iterations that should be done between two successive animations\n this.animationPeriod = LayoutConstants.DEFAULT_ANIMATION_PERIOD;\n /**\r\n * Whether or not leaf nodes (non-compound nodes) are of uniform sizes. When\r\n * they are, both spring and repulsion forces between two leaf nodes can be\r\n * calculated without the expensive clipping point calculations, resulting\r\n * in major speed-up.\r\n */\n this.uniformLeafNodeSizes = LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES;\n /**\r\n * This is used for creation of bendpoints by using dummy nodes and edges.\r\n * Maps an LEdge to its dummy bendpoint path.\r\n */\n this.edgeToDummyNodes = new Map();\n this.graphManager = new LGraphManager(this);\n this.isLayoutFinished = false;\n this.isSubLayout = false;\n this.isRemoteUse = false;\n\n if (isRemoteUse != null) {\n this.isRemoteUse = isRemoteUse;\n }\n}\n\nLayout.RANDOM_SEED = 1;\n\nLayout.prototype = Object.create(Emitter.prototype);\n\nLayout.prototype.getGraphManager = function () {\n return this.graphManager;\n};\n\nLayout.prototype.getAllNodes = function () {\n return this.graphManager.getAllNodes();\n};\n\nLayout.prototype.getAllEdges = function () {\n return this.graphManager.getAllEdges();\n};\n\nLayout.prototype.getAllNodesToApplyGravitation = function () {\n return this.graphManager.getAllNodesToApplyGravitation();\n};\n\nLayout.prototype.newGraphManager = function () {\n var gm = new LGraphManager(this);\n this.graphManager = gm;\n return gm;\n};\n\nLayout.prototype.newGraph = function (vGraph) {\n return new LGraph(null, this.graphManager, vGraph);\n};\n\nLayout.prototype.newNode = function (vNode) {\n return new LNode(this.graphManager, vNode);\n};\n\nLayout.prototype.newEdge = function (vEdge) {\n return new LEdge(null, null, vEdge);\n};\n\nLayout.prototype.checkLayoutSuccess = function () {\n return this.graphManager.getRoot() == null || this.graphManager.getRoot().getNodes().length == 0 || this.graphManager.includesInvalidEdge();\n};\n\nLayout.prototype.runLayout = function () {\n this.isLayoutFinished = false;\n\n if (this.tilingPreLayout) {\n this.tilingPreLayout();\n }\n\n this.initParameters();\n var isLayoutSuccessfull;\n\n if (this.checkLayoutSuccess()) {\n isLayoutSuccessfull = false;\n } else {\n isLayoutSuccessfull = this.layout();\n }\n\n if (LayoutConstants.ANIMATE === 'during') {\n // If this is a 'during' layout animation. Layout is not finished yet. \n // We need to perform these in index.js when layout is really finished.\n return false;\n }\n\n if (isLayoutSuccessfull) {\n if (!this.isSubLayout) {\n this.doPostLayout();\n }\n }\n\n if (this.tilingPostLayout) {\n this.tilingPostLayout();\n }\n\n this.isLayoutFinished = true;\n\n return isLayoutSuccessfull;\n};\n\n/**\r\n * This method performs the operations required after layout.\r\n */\nLayout.prototype.doPostLayout = function () {\n //assert !isSubLayout : \"Should not be called on sub-layout!\";\n // Propagate geometric changes to v-level objects\n if (!this.incremental) {\n this.transform();\n }\n this.update();\n};\n\n/**\r\n * This method updates the geometry of the target graph according to\r\n * calculated layout.\r\n */\nLayout.prototype.update2 = function () {\n // update bend points\n if (this.createBendsAsNeeded) {\n this.createBendpointsFromDummyNodes();\n\n // reset all edges, since the topology has changed\n this.graphManager.resetAllEdges();\n }\n\n // perform edge, node and root updates if layout is not called\n // remotely\n if (!this.isRemoteUse) {\n // update all edges\n var edge;\n var allEdges = this.graphManager.getAllEdges();\n for (var i = 0; i < allEdges.length; i++) {\n edge = allEdges[i];\n // this.update(edge);\n }\n\n // recursively update nodes\n var node;\n var nodes = this.graphManager.getRoot().getNodes();\n for (var i = 0; i < nodes.length; i++) {\n node = nodes[i];\n // this.update(node);\n }\n\n // update root graph\n this.update(this.graphManager.getRoot());\n }\n};\n\nLayout.prototype.update = function (obj) {\n if (obj == null) {\n this.update2();\n } else if (obj instanceof LNode) {\n var node = obj;\n if (node.getChild() != null) {\n // since node is compound, recursively update child nodes\n var nodes = node.getChild().getNodes();\n for (var i = 0; i < nodes.length; i++) {\n update(nodes[i]);\n }\n }\n\n // if the l-level node is associated with a v-level graph object,\n // then it is assumed that the v-level node implements the\n // interface Updatable.\n if (node.vGraphObject != null) {\n // cast to Updatable without any type check\n var vNode = node.vGraphObject;\n\n // call the update method of the interface\n vNode.update(node);\n }\n } else if (obj instanceof LEdge) {\n var edge = obj;\n // if the l-level edge is associated with a v-level graph object,\n // then it is assumed that the v-level edge implements the\n // interface Updatable.\n\n if (edge.vGraphObject != null) {\n // cast to Updatable without any type check\n var vEdge = edge.vGraphObject;\n\n // call the update method of the interface\n vEdge.update(edge);\n }\n } else if (obj instanceof LGraph) {\n var graph = obj;\n // if the l-level graph is associated with a v-level graph object,\n // then it is assumed that the v-level object implements the\n // interface Updatable.\n\n if (graph.vGraphObject != null) {\n // cast to Updatable without any type check\n var vGraph = graph.vGraphObject;\n\n // call the update method of the interface\n vGraph.update(graph);\n }\n }\n};\n\n/**\r\n * This method is used to set all layout parameters to default values\r\n * determined at compile time.\r\n */\nLayout.prototype.initParameters = function () {\n if (!this.isSubLayout) {\n this.layoutQuality = LayoutConstants.QUALITY;\n this.animationDuringLayout = LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT;\n this.animationPeriod = LayoutConstants.DEFAULT_ANIMATION_PERIOD;\n this.animationOnLayout = LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT;\n this.incremental = LayoutConstants.DEFAULT_INCREMENTAL;\n this.createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED;\n this.uniformLeafNodeSizes = LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES;\n }\n\n if (this.animationDuringLayout) {\n this.animationOnLayout = false;\n }\n};\n\nLayout.prototype.transform = function (newLeftTop) {\n if (newLeftTop == undefined) {\n this.transform(new PointD(0, 0));\n } else {\n // create a transformation object (from Eclipse to layout). When an\n // inverse transform is applied, we get upper-left coordinate of the\n // drawing or the root graph at given input coordinate (some margins\n // already included in calculation of left-top).\n\n var trans = new Transform();\n var leftTop = this.graphManager.getRoot().updateLeftTop();\n\n if (leftTop != null) {\n trans.setWorldOrgX(newLeftTop.x);\n trans.setWorldOrgY(newLeftTop.y);\n\n trans.setDeviceOrgX(leftTop.x);\n trans.setDeviceOrgY(leftTop.y);\n\n var nodes = this.getAllNodes();\n var node;\n\n for (var i = 0; i < nodes.length; i++) {\n node = nodes[i];\n node.transform(trans);\n }\n }\n }\n};\n\nLayout.prototype.positionNodesRandomly = function (graph) {\n\n if (graph == undefined) {\n //assert !this.incremental;\n this.positionNodesRandomly(this.getGraphManager().getRoot());\n this.getGraphManager().getRoot().updateBounds(true);\n } else {\n var lNode;\n var childGraph;\n\n var nodes = graph.getNodes();\n for (var i = 0; i < nodes.length; i++) {\n lNode = nodes[i];\n childGraph = lNode.getChild();\n\n if (childGraph == null) {\n lNode.scatter();\n } else if (childGraph.getNodes().length == 0) {\n lNode.scatter();\n } else {\n this.positionNodesRandomly(childGraph);\n lNode.updateBounds();\n }\n }\n }\n};\n\n/**\r\n * This method returns a list of trees where each tree is represented as a\r\n * list of l-nodes. The method returns a list of size 0 when:\r\n * - The graph is not flat or\r\n * - One of the component(s) of the graph is not a tree.\r\n */\nLayout.prototype.getFlatForest = function () {\n var flatForest = [];\n var isForest = true;\n\n // Quick reference for all nodes in the graph manager associated with\n // this layout. The list should not be changed.\n var allNodes = this.graphManager.getRoot().getNodes();\n\n // First be sure that the graph is flat\n var isFlat = true;\n\n for (var i = 0; i < allNodes.length; i++) {\n if (allNodes[i].getChild() != null) {\n isFlat = false;\n }\n }\n\n // Return empty forest if the graph is not flat.\n if (!isFlat) {\n return flatForest;\n }\n\n // Run BFS for each component of the graph.\n\n var visited = new Set();\n var toBeVisited = [];\n var parents = new Map();\n var unProcessedNodes = [];\n\n unProcessedNodes = unProcessedNodes.concat(allNodes);\n\n // Each iteration of this loop finds a component of the graph and\n // decides whether it is a tree or not. If it is a tree, adds it to the\n // forest and continued with the next component.\n\n while (unProcessedNodes.length > 0 && isForest) {\n toBeVisited.push(unProcessedNodes[0]);\n\n // Start the BFS. Each iteration of this loop visits a node in a\n // BFS manner.\n while (toBeVisited.length > 0 && isForest) {\n //pool operation\n var currentNode = toBeVisited[0];\n toBeVisited.splice(0, 1);\n visited.add(currentNode);\n\n // Traverse all neighbors of this node\n var neighborEdges = currentNode.getEdges();\n\n for (var i = 0; i < neighborEdges.length; i++) {\n var currentNeighbor = neighborEdges[i].getOtherEnd(currentNode);\n\n // If BFS is not growing from this neighbor.\n if (parents.get(currentNode) != currentNeighbor) {\n // We haven't previously visited this neighbor.\n if (!visited.has(currentNeighbor)) {\n toBeVisited.push(currentNeighbor);\n parents.set(currentNeighbor, currentNode);\n }\n // Since we have previously visited this neighbor and\n // this neighbor is not parent of currentNode, given\n // graph contains a component that is not tree, hence\n // it is not a forest.\n else {\n isForest = false;\n break;\n }\n }\n }\n }\n\n // The graph contains a component that is not a tree. Empty\n // previously found trees. The method will end.\n if (!isForest) {\n flatForest = [];\n }\n // Save currently visited nodes as a tree in our forest. Reset\n // visited and parents lists. Continue with the next component of\n // the graph, if any.\n else {\n var temp = [].concat(_toConsumableArray(visited));\n flatForest.push(temp);\n //flatForest = flatForest.concat(temp);\n //unProcessedNodes.removeAll(visited);\n for (var i = 0; i < temp.length; i++) {\n var value = temp[i];\n var index = unProcessedNodes.indexOf(value);\n if (index > -1) {\n unProcessedNodes.splice(index, 1);\n }\n }\n visited = new Set();\n parents = new Map();\n }\n }\n\n return flatForest;\n};\n\n/**\r\n * This method creates dummy nodes (an l-level node with minimal dimensions)\r\n * for the given edge (one per bendpoint). The existing l-level structure\r\n * is updated accordingly.\r\n */\nLayout.prototype.createDummyNodesForBendpoints = function (edge) {\n var dummyNodes = [];\n var prev = edge.source;\n\n var graph = this.graphManager.calcLowestCommonAncestor(edge.source, edge.target);\n\n for (var i = 0; i < edge.bendpoints.length; i++) {\n // create new dummy node\n var dummyNode = this.newNode(null);\n dummyNode.setRect(new Point(0, 0), new Dimension(1, 1));\n\n graph.add(dummyNode);\n\n // create new dummy edge between prev and dummy node\n var dummyEdge = this.newEdge(null);\n this.graphManager.add(dummyEdge, prev, dummyNode);\n\n dummyNodes.add(dummyNode);\n prev = dummyNode;\n }\n\n var dummyEdge = this.newEdge(null);\n this.graphManager.add(dummyEdge, prev, edge.target);\n\n this.edgeToDummyNodes.set(edge, dummyNodes);\n\n // remove real edge from graph manager if it is inter-graph\n if (edge.isInterGraph()) {\n this.graphManager.remove(edge);\n }\n // else, remove the edge from the current graph\n else {\n graph.remove(edge);\n }\n\n return dummyNodes;\n};\n\n/**\r\n * This method creates bendpoints for edges from the dummy nodes\r\n * at l-level.\r\n */\nLayout.prototype.createBendpointsFromDummyNodes = function () {\n var edges = [];\n edges = edges.concat(this.graphManager.getAllEdges());\n edges = [].concat(_toConsumableArray(this.edgeToDummyNodes.keys())).concat(edges);\n\n for (var k = 0; k < edges.length; k++) {\n var lEdge = edges[k];\n\n if (lEdge.bendpoints.length > 0) {\n var path = this.edgeToDummyNodes.get(lEdge);\n\n for (var i = 0; i < path.length; i++) {\n var dummyNode = path[i];\n var p = new PointD(dummyNode.getCenterX(), dummyNode.getCenterY());\n\n // update bendpoint's location according to dummy node\n var ebp = lEdge.bendpoints.get(i);\n ebp.x = p.x;\n ebp.y = p.y;\n\n // remove the dummy node, dummy edges incident with this\n // dummy node is also removed (within the remove method)\n dummyNode.getOwner().remove(dummyNode);\n }\n\n // add the real edge to graph\n this.graphManager.add(lEdge, lEdge.source, lEdge.target);\n }\n }\n};\n\nLayout.transform = function (sliderValue, defaultValue, minDiv, maxMul) {\n if (minDiv != undefined && maxMul != undefined) {\n var value = defaultValue;\n\n if (sliderValue <= 50) {\n var minValue = defaultValue / minDiv;\n value -= (defaultValue - minValue) / 50 * (50 - sliderValue);\n } else {\n var maxValue = defaultValue * maxMul;\n value += (maxValue - defaultValue) / 50 * (sliderValue - 50);\n }\n\n return value;\n } else {\n var a, b;\n\n if (sliderValue <= 50) {\n a = 9.0 * defaultValue / 500.0;\n b = defaultValue / 10.0;\n } else {\n a = 9.0 * defaultValue / 50.0;\n b = -8 * defaultValue;\n }\n\n return a * sliderValue + b;\n }\n};\n\n/**\r\n * This method finds and returns the center of the given nodes, assuming\r\n * that the given nodes form a tree in themselves.\r\n */\nLayout.findCenterOfTree = function (nodes) {\n var list = [];\n list = list.concat(nodes);\n\n var removedNodes = [];\n var remainingDegrees = new Map();\n var foundCenter = false;\n var centerNode = null;\n\n if (list.length == 1 || list.length == 2) {\n foundCenter = true;\n centerNode = list[0];\n }\n\n for (var i = 0; i < list.length; i++) {\n var node = list[i];\n var degree = node.getNeighborsList().size;\n remainingDegrees.set(node, node.getNeighborsList().size);\n\n if (degree == 1) {\n removedNodes.push(node);\n }\n }\n\n var tempList = [];\n tempList = tempList.concat(removedNodes);\n\n while (!foundCenter) {\n var tempList2 = [];\n tempList2 = tempList2.concat(tempList);\n tempList = [];\n\n for (var i = 0; i < list.length; i++) {\n var node = list[i];\n\n var index = list.indexOf(node);\n if (index >= 0) {\n list.splice(index, 1);\n }\n\n var neighbours = node.getNeighborsList();\n\n neighbours.forEach(function (neighbour) {\n if (removedNodes.indexOf(neighbour) < 0) {\n var otherDegree = remainingDegrees.get(neighbour);\n var newDegree = otherDegree - 1;\n\n if (newDegree == 1) {\n tempList.push(neighbour);\n }\n\n remainingDegrees.set(neighbour, newDegree);\n }\n });\n }\n\n removedNodes = removedNodes.concat(tempList);\n\n if (list.length == 1 || list.length == 2) {\n foundCenter = true;\n centerNode = list[0];\n }\n }\n\n return centerNode;\n};\n\n/**\r\n * During the coarsening process, this layout may be referenced by two graph managers\r\n * this setter function grants access to change the currently being used graph manager\r\n */\nLayout.prototype.setGraphManager = function (gm) {\n this.graphManager = gm;\n};\n\nmodule.exports = Layout;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction RandomSeed() {}\n// adapted from: https://stackoverflow.com/a/19303725\nRandomSeed.seed = 1;\nRandomSeed.x = 0;\n\nRandomSeed.nextDouble = function () {\n RandomSeed.x = Math.sin(RandomSeed.seed++) * 10000;\n return RandomSeed.x - Math.floor(RandomSeed.x);\n};\n\nmodule.exports = RandomSeed;\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar PointD = __webpack_require__(5);\n\nfunction Transform(x, y) {\n this.lworldOrgX = 0.0;\n this.lworldOrgY = 0.0;\n this.ldeviceOrgX = 0.0;\n this.ldeviceOrgY = 0.0;\n this.lworldExtX = 1.0;\n this.lworldExtY = 1.0;\n this.ldeviceExtX = 1.0;\n this.ldeviceExtY = 1.0;\n}\n\nTransform.prototype.getWorldOrgX = function () {\n return this.lworldOrgX;\n};\n\nTransform.prototype.setWorldOrgX = function (wox) {\n this.lworldOrgX = wox;\n};\n\nTransform.prototype.getWorldOrgY = function () {\n return this.lworldOrgY;\n};\n\nTransform.prototype.setWorldOrgY = function (woy) {\n this.lworldOrgY = woy;\n};\n\nTransform.prototype.getWorldExtX = function () {\n return this.lworldExtX;\n};\n\nTransform.prototype.setWorldExtX = function (wex) {\n this.lworldExtX = wex;\n};\n\nTransform.prototype.getWorldExtY = function () {\n return this.lworldExtY;\n};\n\nTransform.prototype.setWorldExtY = function (wey) {\n this.lworldExtY = wey;\n};\n\n/* Device related */\n\nTransform.prototype.getDeviceOrgX = function () {\n return this.ldeviceOrgX;\n};\n\nTransform.prototype.setDeviceOrgX = function (dox) {\n this.ldeviceOrgX = dox;\n};\n\nTransform.prototype.getDeviceOrgY = function () {\n return this.ldeviceOrgY;\n};\n\nTransform.prototype.setDeviceOrgY = function (doy) {\n this.ldeviceOrgY = doy;\n};\n\nTransform.prototype.getDeviceExtX = function () {\n return this.ldeviceExtX;\n};\n\nTransform.prototype.setDeviceExtX = function (dex) {\n this.ldeviceExtX = dex;\n};\n\nTransform.prototype.getDeviceExtY = function () {\n return this.ldeviceExtY;\n};\n\nTransform.prototype.setDeviceExtY = function (dey) {\n this.ldeviceExtY = dey;\n};\n\nTransform.prototype.transformX = function (x) {\n var xDevice = 0.0;\n var worldExtX = this.lworldExtX;\n if (worldExtX != 0.0) {\n xDevice = this.ldeviceOrgX + (x - this.lworldOrgX) * this.ldeviceExtX / worldExtX;\n }\n\n return xDevice;\n};\n\nTransform.prototype.transformY = function (y) {\n var yDevice = 0.0;\n var worldExtY = this.lworldExtY;\n if (worldExtY != 0.0) {\n yDevice = this.ldeviceOrgY + (y - this.lworldOrgY) * this.ldeviceExtY / worldExtY;\n }\n\n return yDevice;\n};\n\nTransform.prototype.inverseTransformX = function (x) {\n var xWorld = 0.0;\n var deviceExtX = this.ldeviceExtX;\n if (deviceExtX != 0.0) {\n xWorld = this.lworldOrgX + (x - this.ldeviceOrgX) * this.lworldExtX / deviceExtX;\n }\n\n return xWorld;\n};\n\nTransform.prototype.inverseTransformY = function (y) {\n var yWorld = 0.0;\n var deviceExtY = this.ldeviceExtY;\n if (deviceExtY != 0.0) {\n yWorld = this.lworldOrgY + (y - this.ldeviceOrgY) * this.lworldExtY / deviceExtY;\n }\n return yWorld;\n};\n\nTransform.prototype.inverseTransformPoint = function (inPoint) {\n var outPoint = new PointD(this.inverseTransformX(inPoint.x), this.inverseTransformY(inPoint.y));\n return outPoint;\n};\n\nmodule.exports = Transform;\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar Layout = __webpack_require__(15);\nvar FDLayoutConstants = __webpack_require__(4);\nvar LayoutConstants = __webpack_require__(0);\nvar IGeometry = __webpack_require__(8);\nvar IMath = __webpack_require__(9);\n\nfunction FDLayout() {\n Layout.call(this);\n\n this.useSmartIdealEdgeLengthCalculation = FDLayoutConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION;\n this.gravityConstant = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH;\n this.compoundGravityConstant = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH;\n this.gravityRangeFactor = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR;\n this.compoundGravityRangeFactor = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR;\n this.displacementThresholdPerNode = 3.0 * FDLayoutConstants.DEFAULT_EDGE_LENGTH / 100;\n this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL;\n this.initialCoolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL;\n this.totalDisplacement = 0.0;\n this.oldTotalDisplacement = 0.0;\n this.maxIterations = FDLayoutConstants.MAX_ITERATIONS;\n}\n\nFDLayout.prototype = Object.create(Layout.prototype);\n\nfor (var prop in Layout) {\n FDLayout[prop] = Layout[prop];\n}\n\nFDLayout.prototype.initParameters = function () {\n Layout.prototype.initParameters.call(this, arguments);\n\n this.totalIterations = 0;\n this.notAnimatedIterations = 0;\n\n this.useFRGridVariant = FDLayoutConstants.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION;\n\n this.grid = [];\n};\n\nFDLayout.prototype.calcIdealEdgeLengths = function () {\n var edge;\n var originalIdealLength;\n var lcaDepth;\n var source;\n var target;\n var sizeOfSourceInLca;\n var sizeOfTargetInLca;\n\n var allEdges = this.getGraphManager().getAllEdges();\n for (var i = 0; i < allEdges.length; i++) {\n edge = allEdges[i];\n\n originalIdealLength = edge.idealLength;\n\n if (edge.isInterGraph) {\n source = edge.getSource();\n target = edge.getTarget();\n\n sizeOfSourceInLca = edge.getSourceInLca().getEstimatedSize();\n sizeOfTargetInLca = edge.getTargetInLca().getEstimatedSize();\n\n if (this.useSmartIdealEdgeLengthCalculation) {\n edge.idealLength += sizeOfSourceInLca + sizeOfTargetInLca - 2 * LayoutConstants.SIMPLE_NODE_SIZE;\n }\n\n lcaDepth = edge.getLca().getInclusionTreeDepth();\n\n edge.idealLength += originalIdealLength * FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR * (source.getInclusionTreeDepth() + target.getInclusionTreeDepth() - 2 * lcaDepth);\n }\n }\n};\n\nFDLayout.prototype.initSpringEmbedder = function () {\n\n var s = this.getAllNodes().length;\n if (this.incremental) {\n if (s > FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) {\n this.coolingFactor = Math.max(this.coolingFactor * FDLayoutConstants.COOLING_ADAPTATION_FACTOR, this.coolingFactor - (s - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) / (FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) * this.coolingFactor * (1 - FDLayoutConstants.COOLING_ADAPTATION_FACTOR));\n }\n this.maxNodeDisplacement = FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL;\n } else {\n if (s > FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) {\n this.coolingFactor = Math.max(FDLayoutConstants.COOLING_ADAPTATION_FACTOR, 1.0 - (s - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) / (FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) * (1 - FDLayoutConstants.COOLING_ADAPTATION_FACTOR));\n } else {\n this.coolingFactor = 1.0;\n }\n this.initialCoolingFactor = this.coolingFactor;\n this.maxNodeDisplacement = FDLayoutConstants.MAX_NODE_DISPLACEMENT;\n }\n\n this.maxIterations = Math.max(this.getAllNodes().length * 5, this.maxIterations);\n\n // Reassign this attribute by using new constant value\n this.displacementThresholdPerNode = 3.0 * FDLayoutConstants.DEFAULT_EDGE_LENGTH / 100;\n this.totalDisplacementThreshold = this.displacementThresholdPerNode * this.getAllNodes().length;\n\n this.repulsionRange = this.calcRepulsionRange();\n};\n\nFDLayout.prototype.calcSpringForces = function () {\n var lEdges = this.getAllEdges();\n var edge;\n\n for (var i = 0; i < lEdges.length; i++) {\n edge = lEdges[i];\n\n this.calcSpringForce(edge, edge.idealLength);\n }\n};\n\nFDLayout.prototype.calcRepulsionForces = function () {\n var gridUpdateAllowed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var forceToNodeSurroundingUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var i, j;\n var nodeA, nodeB;\n var lNodes = this.getAllNodes();\n var processedNodeSet;\n\n if (this.useFRGridVariant) {\n if (this.totalIterations % FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD == 1 && gridUpdateAllowed) {\n this.updateGrid();\n }\n\n processedNodeSet = new Set();\n\n // calculate repulsion forces between each nodes and its surrounding\n for (i = 0; i < lNodes.length; i++) {\n nodeA = lNodes[i];\n this.calculateRepulsionForceOfANode(nodeA, processedNodeSet, gridUpdateAllowed, forceToNodeSurroundingUpdate);\n processedNodeSet.add(nodeA);\n }\n } else {\n for (i = 0; i < lNodes.length; i++) {\n nodeA = lNodes[i];\n\n for (j = i + 1; j < lNodes.length; j++) {\n nodeB = lNodes[j];\n\n // If both nodes are not members of the same graph, skip.\n if (nodeA.getOwner() != nodeB.getOwner()) {\n continue;\n }\n\n this.calcRepulsionForce(nodeA, nodeB);\n }\n }\n }\n};\n\nFDLayout.prototype.calcGravitationalForces = function () {\n var node;\n var lNodes = this.getAllNodesToApplyGravitation();\n\n for (var i = 0; i < lNodes.length; i++) {\n node = lNodes[i];\n this.calcGravitationalForce(node);\n }\n};\n\nFDLayout.prototype.moveNodes = function () {\n var lNodes = this.getAllNodes();\n var node;\n\n for (var i = 0; i < lNodes.length; i++) {\n node = lNodes[i];\n node.move();\n }\n};\n\nFDLayout.prototype.calcSpringForce = function (edge, idealLength) {\n var sourceNode = edge.getSource();\n var targetNode = edge.getTarget();\n\n var length;\n var springForce;\n var springForceX;\n var springForceY;\n\n // Update edge length\n if (this.uniformLeafNodeSizes && sourceNode.getChild() == null && targetNode.getChild() == null) {\n edge.updateLengthSimple();\n } else {\n edge.updateLength();\n\n if (edge.isOverlapingSourceAndTarget) {\n return;\n }\n }\n\n length = edge.getLength();\n\n if (length == 0) return;\n\n // Calculate spring forces\n springForce = edge.edgeElasticity * (length - idealLength);\n\n // Project force onto x and y axes\n springForceX = springForce * (edge.lengthX / length);\n springForceY = springForce * (edge.lengthY / length);\n\n // Apply forces on the end nodes\n sourceNode.springForceX += springForceX;\n sourceNode.springForceY += springForceY;\n targetNode.springForceX -= springForceX;\n targetNode.springForceY -= springForceY;\n};\n\nFDLayout.prototype.calcRepulsionForce = function (nodeA, nodeB) {\n var rectA = nodeA.getRect();\n var rectB = nodeB.getRect();\n var overlapAmount = new Array(2);\n var clipPoints = new Array(4);\n var distanceX;\n var distanceY;\n var distanceSquared;\n var distance;\n var repulsionForce;\n var repulsionForceX;\n var repulsionForceY;\n\n if (rectA.intersects(rectB)) // two nodes overlap\n {\n // calculate separation amount in x and y directions\n IGeometry.calcSeparationAmount(rectA, rectB, overlapAmount, FDLayoutConstants.DEFAULT_EDGE_LENGTH / 2.0);\n\n repulsionForceX = 2 * overlapAmount[0];\n repulsionForceY = 2 * overlapAmount[1];\n\n var childrenConstant = nodeA.noOfChildren * nodeB.noOfChildren / (nodeA.noOfChildren + nodeB.noOfChildren);\n\n // Apply forces on the two nodes\n nodeA.repulsionForceX -= childrenConstant * repulsionForceX;\n nodeA.repulsionForceY -= childrenConstant * repulsionForceY;\n nodeB.repulsionForceX += childrenConstant * repulsionForceX;\n nodeB.repulsionForceY += childrenConstant * repulsionForceY;\n } else // no overlap\n {\n // calculate distance\n\n if (this.uniformLeafNodeSizes && nodeA.getChild() == null && nodeB.getChild() == null) // simply base repulsion on distance of node centers\n {\n distanceX = rectB.getCenterX() - rectA.getCenterX();\n distanceY = rectB.getCenterY() - rectA.getCenterY();\n } else // use clipping points\n {\n IGeometry.getIntersection(rectA, rectB, clipPoints);\n\n distanceX = clipPoints[2] - clipPoints[0];\n distanceY = clipPoints[3] - clipPoints[1];\n }\n\n // No repulsion range. FR grid variant should take care of this.\n if (Math.abs(distanceX) < FDLayoutConstants.MIN_REPULSION_DIST) {\n distanceX = IMath.sign(distanceX) * FDLayoutConstants.MIN_REPULSION_DIST;\n }\n\n if (Math.abs(distanceY) < FDLayoutConstants.MIN_REPULSION_DIST) {\n distanceY = IMath.sign(distanceY) * FDLayoutConstants.MIN_REPULSION_DIST;\n }\n\n distanceSquared = distanceX * distanceX + distanceY * distanceY;\n distance = Math.sqrt(distanceSquared);\n\n // Here we use half of the nodes' repulsion values for backward compatibility\n repulsionForce = (nodeA.nodeRepulsion / 2 + nodeB.nodeRepulsion / 2) * nodeA.noOfChildren * nodeB.noOfChildren / distanceSquared;\n\n // Project force onto x and y axes\n repulsionForceX = repulsionForce * distanceX / distance;\n repulsionForceY = repulsionForce * distanceY / distance;\n\n // Apply forces on the two nodes \n nodeA.repulsionForceX -= repulsionForceX;\n nodeA.repulsionForceY -= repulsionForceY;\n nodeB.repulsionForceX += repulsionForceX;\n nodeB.repulsionForceY += repulsionForceY;\n }\n};\n\nFDLayout.prototype.calcGravitationalForce = function (node) {\n var ownerGraph;\n var ownerCenterX;\n var ownerCenterY;\n var distanceX;\n var distanceY;\n var absDistanceX;\n var absDistanceY;\n var estimatedSize;\n ownerGraph = node.getOwner();\n\n ownerCenterX = (ownerGraph.getRight() + ownerGraph.getLeft()) / 2;\n ownerCenterY = (ownerGraph.getTop() + ownerGraph.getBottom()) / 2;\n distanceX = node.getCenterX() - ownerCenterX;\n distanceY = node.getCenterY() - ownerCenterY;\n absDistanceX = Math.abs(distanceX) + node.getWidth() / 2;\n absDistanceY = Math.abs(distanceY) + node.getHeight() / 2;\n\n if (node.getOwner() == this.graphManager.getRoot()) // in the root graph\n {\n estimatedSize = ownerGraph.getEstimatedSize() * this.gravityRangeFactor;\n\n if (absDistanceX > estimatedSize || absDistanceY > estimatedSize) {\n node.gravitationForceX = -this.gravityConstant * distanceX;\n node.gravitationForceY = -this.gravityConstant * distanceY;\n }\n } else // inside a compound\n {\n estimatedSize = ownerGraph.getEstimatedSize() * this.compoundGravityRangeFactor;\n\n if (absDistanceX > estimatedSize || absDistanceY > estimatedSize) {\n node.gravitationForceX = -this.gravityConstant * distanceX * this.compoundGravityConstant;\n node.gravitationForceY = -this.gravityConstant * distanceY * this.compoundGravityConstant;\n }\n }\n};\n\nFDLayout.prototype.isConverged = function () {\n var converged;\n var oscilating = false;\n\n if (this.totalIterations > this.maxIterations / 3) {\n oscilating = Math.abs(this.totalDisplacement - this.oldTotalDisplacement) < 2;\n }\n\n converged = this.totalDisplacement < this.totalDisplacementThreshold;\n\n this.oldTotalDisplacement = this.totalDisplacement;\n\n return converged || oscilating;\n};\n\nFDLayout.prototype.animate = function () {\n if (this.animationDuringLayout && !this.isSubLayout) {\n if (this.notAnimatedIterations == this.animationPeriod) {\n this.update();\n this.notAnimatedIterations = 0;\n } else {\n this.notAnimatedIterations++;\n }\n }\n};\n\n//This method calculates the number of children (weight) for all nodes\nFDLayout.prototype.calcNoOfChildrenForAllNodes = function () {\n var node;\n var allNodes = this.graphManager.getAllNodes();\n\n for (var i = 0; i < allNodes.length; i++) {\n node = allNodes[i];\n node.noOfChildren = node.getNoOfChildren();\n }\n};\n\n// -----------------------------------------------------------------------------\n// Section: FR-Grid Variant Repulsion Force Calculation\n// -----------------------------------------------------------------------------\n\nFDLayout.prototype.calcGrid = function (graph) {\n\n var sizeX = 0;\n var sizeY = 0;\n\n sizeX = parseInt(Math.ceil((graph.getRight() - graph.getLeft()) / this.repulsionRange));\n sizeY = parseInt(Math.ceil((graph.getBottom() - graph.getTop()) / this.repulsionRange));\n\n var grid = new Array(sizeX);\n\n for (var i = 0; i < sizeX; i++) {\n grid[i] = new Array(sizeY);\n }\n\n for (var i = 0; i < sizeX; i++) {\n for (var j = 0; j < sizeY; j++) {\n grid[i][j] = new Array();\n }\n }\n\n return grid;\n};\n\nFDLayout.prototype.addNodeToGrid = function (v, left, top) {\n\n var startX = 0;\n var finishX = 0;\n var startY = 0;\n var finishY = 0;\n\n startX = parseInt(Math.floor((v.getRect().x - left) / this.repulsionRange));\n finishX = parseInt(Math.floor((v.getRect().width + v.getRect().x - left) / this.repulsionRange));\n startY = parseInt(Math.floor((v.getRect().y - top) / this.repulsionRange));\n finishY = parseInt(Math.floor((v.getRect().height + v.getRect().y - top) / this.repulsionRange));\n\n for (var i = startX; i <= finishX; i++) {\n for (var j = startY; j <= finishY; j++) {\n this.grid[i][j].push(v);\n v.setGridCoordinates(startX, finishX, startY, finishY);\n }\n }\n};\n\nFDLayout.prototype.updateGrid = function () {\n var i;\n var nodeA;\n var lNodes = this.getAllNodes();\n\n this.grid = this.calcGrid(this.graphManager.getRoot());\n\n // put all nodes to proper grid cells\n for (i = 0; i < lNodes.length; i++) {\n nodeA = lNodes[i];\n this.addNodeToGrid(nodeA, this.graphManager.getRoot().getLeft(), this.graphManager.getRoot().getTop());\n }\n};\n\nFDLayout.prototype.calculateRepulsionForceOfANode = function (nodeA, processedNodeSet, gridUpdateAllowed, forceToNodeSurroundingUpdate) {\n\n if (this.totalIterations % FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD == 1 && gridUpdateAllowed || forceToNodeSurroundingUpdate) {\n var surrounding = new Set();\n nodeA.surrounding = new Array();\n var nodeB;\n var grid = this.grid;\n\n for (var i = nodeA.startX - 1; i < nodeA.finishX + 2; i++) {\n for (var j = nodeA.startY - 1; j < nodeA.finishY + 2; j++) {\n if (!(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length)) {\n for (var k = 0; k < grid[i][j].length; k++) {\n nodeB = grid[i][j][k];\n\n // If both nodes are not members of the same graph, \n // or both nodes are the same, skip.\n if (nodeA.getOwner() != nodeB.getOwner() || nodeA == nodeB) {\n continue;\n }\n\n // check if the repulsion force between\n // nodeA and nodeB has already been calculated\n if (!processedNodeSet.has(nodeB) && !surrounding.has(nodeB)) {\n var distanceX = Math.abs(nodeA.getCenterX() - nodeB.getCenterX()) - (nodeA.getWidth() / 2 + nodeB.getWidth() / 2);\n var distanceY = Math.abs(nodeA.getCenterY() - nodeB.getCenterY()) - (nodeA.getHeight() / 2 + nodeB.getHeight() / 2);\n\n // if the distance between nodeA and nodeB \n // is less then calculation range\n if (distanceX <= this.repulsionRange && distanceY <= this.repulsionRange) {\n //then add nodeB to surrounding of nodeA\n surrounding.add(nodeB);\n }\n }\n }\n }\n }\n }\n\n nodeA.surrounding = [].concat(_toConsumableArray(surrounding));\n }\n for (i = 0; i < nodeA.surrounding.length; i++) {\n this.calcRepulsionForce(nodeA, nodeA.surrounding[i]);\n }\n};\n\nFDLayout.prototype.calcRepulsionRange = function () {\n return 0.0;\n};\n\nmodule.exports = FDLayout;\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LEdge = __webpack_require__(1);\nvar FDLayoutConstants = __webpack_require__(4);\n\nfunction FDLayoutEdge(source, target, vEdge) {\n LEdge.call(this, source, target, vEdge);\n\n // Ideal length and elasticity value for this edge\n this.idealLength = FDLayoutConstants.DEFAULT_EDGE_LENGTH;\n this.edgeElasticity = FDLayoutConstants.DEFAULT_SPRING_STRENGTH;\n}\n\nFDLayoutEdge.prototype = Object.create(LEdge.prototype);\n\nfor (var prop in LEdge) {\n FDLayoutEdge[prop] = LEdge[prop];\n}\n\nmodule.exports = FDLayoutEdge;\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LNode = __webpack_require__(3);\nvar FDLayoutConstants = __webpack_require__(4);\n\nfunction FDLayoutNode(gm, loc, size, vNode) {\n // alternative constructor is handled inside LNode\n LNode.call(this, gm, loc, size, vNode);\n\n // Repulsion value of this node\n this.nodeRepulsion = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH;\n\n //Spring, repulsion and gravitational forces acting on this node\n this.springForceX = 0;\n this.springForceY = 0;\n this.repulsionForceX = 0;\n this.repulsionForceY = 0;\n this.gravitationForceX = 0;\n this.gravitationForceY = 0;\n //Amount by which this node is to be moved in this iteration\n this.displacementX = 0;\n this.displacementY = 0;\n\n //Start and finish grid coordinates that this node is fallen into\n this.startX = 0;\n this.finishX = 0;\n this.startY = 0;\n this.finishY = 0;\n\n //Geometric neighbors of this node\n this.surrounding = [];\n}\n\nFDLayoutNode.prototype = Object.create(LNode.prototype);\n\nfor (var prop in LNode) {\n FDLayoutNode[prop] = LNode[prop];\n}\n\nFDLayoutNode.prototype.setGridCoordinates = function (_startX, _finishX, _startY, _finishY) {\n this.startX = _startX;\n this.finishX = _finishX;\n this.startY = _startY;\n this.finishY = _finishY;\n};\n\nmodule.exports = FDLayoutNode;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction DimensionD(width, height) {\n this.width = 0;\n this.height = 0;\n if (width !== null && height !== null) {\n this.height = height;\n this.width = width;\n }\n}\n\nDimensionD.prototype.getWidth = function () {\n return this.width;\n};\n\nDimensionD.prototype.setWidth = function (width) {\n this.width = width;\n};\n\nDimensionD.prototype.getHeight = function () {\n return this.height;\n};\n\nDimensionD.prototype.setHeight = function (height) {\n this.height = height;\n};\n\nmodule.exports = DimensionD;\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar UniqueIDGeneretor = __webpack_require__(14);\n\nfunction HashMap() {\n this.map = {};\n this.keys = [];\n}\n\nHashMap.prototype.put = function (key, value) {\n var theId = UniqueIDGeneretor.createID(key);\n if (!this.contains(theId)) {\n this.map[theId] = value;\n this.keys.push(key);\n }\n};\n\nHashMap.prototype.contains = function (key) {\n var theId = UniqueIDGeneretor.createID(key);\n return this.map[key] != null;\n};\n\nHashMap.prototype.get = function (key) {\n var theId = UniqueIDGeneretor.createID(key);\n return this.map[theId];\n};\n\nHashMap.prototype.keySet = function () {\n return this.keys;\n};\n\nmodule.exports = HashMap;\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar UniqueIDGeneretor = __webpack_require__(14);\n\nfunction HashSet() {\n this.set = {};\n}\n;\n\nHashSet.prototype.add = function (obj) {\n var theId = UniqueIDGeneretor.createID(obj);\n if (!this.contains(theId)) this.set[theId] = obj;\n};\n\nHashSet.prototype.remove = function (obj) {\n delete this.set[UniqueIDGeneretor.createID(obj)];\n};\n\nHashSet.prototype.clear = function () {\n this.set = {};\n};\n\nHashSet.prototype.contains = function (obj) {\n return this.set[UniqueIDGeneretor.createID(obj)] == obj;\n};\n\nHashSet.prototype.isEmpty = function () {\n return this.size() === 0;\n};\n\nHashSet.prototype.size = function () {\n return Object.keys(this.set).length;\n};\n\n//concats this.set to the given list\nHashSet.prototype.addAllTo = function (list) {\n var keys = Object.keys(this.set);\n var length = keys.length;\n for (var i = 0; i < length; i++) {\n list.push(this.set[keys[i]]);\n }\n};\n\nHashSet.prototype.size = function () {\n return Object.keys(this.set).length;\n};\n\nHashSet.prototype.addAll = function (list) {\n var s = list.length;\n for (var i = 0; i < s; i++) {\n var v = list[i];\n this.add(v);\n }\n};\n\nmodule.exports = HashSet;\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Some matrix (1d and 2d array) operations\nfunction Matrix() {}\n\n/**\n * matrix multiplication\n * array1, array2 and result are 2d arrays\n */\nMatrix.multMat = function (array1, array2) {\n var result = [];\n\n for (var i = 0; i < array1.length; i++) {\n result[i] = [];\n for (var j = 0; j < array2[0].length; j++) {\n result[i][j] = 0;\n for (var k = 0; k < array1[0].length; k++) {\n result[i][j] += array1[i][k] * array2[k][j];\n }\n }\n }\n return result;\n};\n\n/**\n * matrix transpose\n * array and result are 2d arrays\n */\nMatrix.transpose = function (array) {\n var result = [];\n\n for (var i = 0; i < array[0].length; i++) {\n result[i] = [];\n for (var j = 0; j < array.length; j++) {\n result[i][j] = array[j][i];\n }\n }\n\n return result;\n};\n\n/**\n * multiply array with constant\n * array and result are 1d arrays\n */\nMatrix.multCons = function (array, constant) {\n var result = [];\n\n for (var i = 0; i < array.length; i++) {\n result[i] = array[i] * constant;\n }\n\n return result;\n};\n\n/**\n * substract two arrays\n * array1, array2 and result are 1d arrays\n */\nMatrix.minusOp = function (array1, array2) {\n var result = [];\n\n for (var i = 0; i < array1.length; i++) {\n result[i] = array1[i] - array2[i];\n }\n\n return result;\n};\n\n/**\n * dot product of two arrays with same size\n * array1 and array2 are 1d arrays\n */\nMatrix.dotProduct = function (array1, array2) {\n var product = 0;\n\n for (var i = 0; i < array1.length; i++) {\n product += array1[i] * array2[i];\n }\n\n return product;\n};\n\n/**\n * magnitude of an array\n * array is 1d array\n */\nMatrix.mag = function (array) {\n return Math.sqrt(this.dotProduct(array, array));\n};\n\n/**\n * normalization of an array\n * array and result are 1d array\n */\nMatrix.normalize = function (array) {\n var result = [];\n var magnitude = this.mag(array);\n\n for (var i = 0; i < array.length; i++) {\n result[i] = array[i] / magnitude;\n }\n\n return result;\n};\n\n/**\n * multiply an array with centering matrix\n * array and result are 1d array\n */\nMatrix.multGamma = function (array) {\n var result = [];\n var sum = 0;\n\n for (var i = 0; i < array.length; i++) {\n sum += array[i];\n }\n\n sum *= -1 / array.length;\n\n for (var _i = 0; _i < array.length; _i++) {\n result[_i] = sum + array[_i];\n }\n return result;\n};\n\n/**\n * a special matrix multiplication\n * result = 0.5 * C * INV * C^T * array\n * array and result are 1d, C and INV are 2d arrays\n */\nMatrix.multL = function (array, C, INV) {\n var result = [];\n var temp1 = [];\n var temp2 = [];\n\n // multiply by C^T\n for (var i = 0; i < C[0].length; i++) {\n var sum = 0;\n for (var j = 0; j < C.length; j++) {\n sum += -0.5 * C[j][i] * array[j];\n }\n temp1[i] = sum;\n }\n // multiply the result by INV\n for (var _i2 = 0; _i2 < INV.length; _i2++) {\n var _sum = 0;\n for (var _j = 0; _j < INV.length; _j++) {\n _sum += INV[_i2][_j] * temp1[_j];\n }\n temp2[_i2] = _sum;\n }\n // multiply the result by C\n for (var _i3 = 0; _i3 < C.length; _i3++) {\n var _sum2 = 0;\n for (var _j2 = 0; _j2 < C[0].length; _j2++) {\n _sum2 += C[_i3][_j2] * temp2[_j2];\n }\n result[_i3] = _sum2;\n }\n\n return result;\n};\n\nmodule.exports = Matrix;\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * A classic Quicksort algorithm with Hoare's partition\n * - Works also on LinkedList objects\n *\n * Copyright: i-Vis Research Group, Bilkent University, 2007 - present\n */\n\nvar LinkedList = __webpack_require__(11);\n\nvar Quicksort = function () {\n function Quicksort(A, compareFunction) {\n _classCallCheck(this, Quicksort);\n\n if (compareFunction !== null || compareFunction !== undefined) this.compareFunction = this._defaultCompareFunction;\n\n var length = void 0;\n if (A instanceof LinkedList) length = A.size();else length = A.length;\n\n this._quicksort(A, 0, length - 1);\n }\n\n _createClass(Quicksort, [{\n key: '_quicksort',\n value: function _quicksort(A, p, r) {\n if (p < r) {\n var q = this._partition(A, p, r);\n this._quicksort(A, p, q);\n this._quicksort(A, q + 1, r);\n }\n }\n }, {\n key: '_partition',\n value: function _partition(A, p, r) {\n var x = this._get(A, p);\n var i = p;\n var j = r;\n while (true) {\n while (this.compareFunction(x, this._get(A, j))) {\n j--;\n }while (this.compareFunction(this._get(A, i), x)) {\n i++;\n }if (i < j) {\n this._swap(A, i, j);\n i++;\n j--;\n } else return j;\n }\n }\n }, {\n key: '_get',\n value: function _get(object, index) {\n if (object instanceof LinkedList) return object.get_object_at(index);else return object[index];\n }\n }, {\n key: '_set',\n value: function _set(object, index, value) {\n if (object instanceof LinkedList) object.set_object_at(index, value);else object[index] = value;\n }\n }, {\n key: '_swap',\n value: function _swap(A, i, j) {\n var temp = this._get(A, i);\n this._set(A, i, this._get(A, j));\n this._set(A, j, temp);\n }\n }, {\n key: '_defaultCompareFunction',\n value: function _defaultCompareFunction(a, b) {\n return b > a;\n }\n }]);\n\n return Quicksort;\n}();\n\nmodule.exports = Quicksort;\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Singular Value Decomposition implementation\nfunction SVD() {};\n\n/* Below singular value decomposition (svd) code including hypot function is adopted from https://github.com/dragonfly-ai/JamaJS\n Some changes are applied to make the code compatible with the fcose code and to make it independent from Jama.\n Input matrix is changed to a 2D array instead of Jama matrix. Matrix dimensions are taken according to 2D array instead of using Jama functions.\n An object that includes singular value components is created for return. \n The types of input parameters of the hypot function are removed. \n let is used instead of var for the variable initialization.\n*/\n/*\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\nSVD.svd = function (A) {\n this.U = null;\n this.V = null;\n this.s = null;\n this.m = 0;\n this.n = 0;\n this.m = A.length;\n this.n = A[0].length;\n var nu = Math.min(this.m, this.n);\n this.s = function (s) {\n var a = [];\n while (s-- > 0) {\n a.push(0);\n }return a;\n }(Math.min(this.m + 1, this.n));\n this.U = function (dims) {\n var allocate = function allocate(dims) {\n if (dims.length == 0) {\n return 0;\n } else {\n var array = [];\n for (var i = 0; i < dims[0]; i++) {\n array.push(allocate(dims.slice(1)));\n }\n return array;\n }\n };\n return allocate(dims);\n }([this.m, nu]);\n this.V = function (dims) {\n var allocate = function allocate(dims) {\n if (dims.length == 0) {\n return 0;\n } else {\n var array = [];\n for (var i = 0; i < dims[0]; i++) {\n array.push(allocate(dims.slice(1)));\n }\n return array;\n }\n };\n return allocate(dims);\n }([this.n, this.n]);\n var e = function (s) {\n var a = [];\n while (s-- > 0) {\n a.push(0);\n }return a;\n }(this.n);\n var work = function (s) {\n var a = [];\n while (s-- > 0) {\n a.push(0);\n }return a;\n }(this.m);\n var wantu = true;\n var wantv = true;\n var nct = Math.min(this.m - 1, this.n);\n var nrt = Math.max(0, Math.min(this.n - 2, this.m));\n for (var k = 0; k < Math.max(nct, nrt); k++) {\n if (k < nct) {\n this.s[k] = 0;\n for (var i = k; i < this.m; i++) {\n this.s[k] = SVD.hypot(this.s[k], A[i][k]);\n }\n ;\n if (this.s[k] !== 0.0) {\n if (A[k][k] < 0.0) {\n this.s[k] = -this.s[k];\n }\n for (var _i = k; _i < this.m; _i++) {\n A[_i][k] /= this.s[k];\n }\n ;\n A[k][k] += 1.0;\n }\n this.s[k] = -this.s[k];\n }\n for (var j = k + 1; j < this.n; j++) {\n if (function (lhs, rhs) {\n return lhs && rhs;\n }(k < nct, this.s[k] !== 0.0)) {\n var t = 0;\n for (var _i2 = k; _i2 < this.m; _i2++) {\n t += A[_i2][k] * A[_i2][j];\n }\n ;\n t = -t / A[k][k];\n for (var _i3 = k; _i3 < this.m; _i3++) {\n A[_i3][j] += t * A[_i3][k];\n }\n ;\n }\n e[j] = A[k][j];\n }\n ;\n if (function (lhs, rhs) {\n return lhs && rhs;\n }(wantu, k < nct)) {\n for (var _i4 = k; _i4 < this.m; _i4++) {\n this.U[_i4][k] = A[_i4][k];\n }\n ;\n }\n if (k < nrt) {\n e[k] = 0;\n for (var _i5 = k + 1; _i5 < this.n; _i5++) {\n e[k] = SVD.hypot(e[k], e[_i5]);\n }\n ;\n if (e[k] !== 0.0) {\n if (e[k + 1] < 0.0) {\n e[k] = -e[k];\n }\n for (var _i6 = k + 1; _i6 < this.n; _i6++) {\n e[_i6] /= e[k];\n }\n ;\n e[k + 1] += 1.0;\n }\n e[k] = -e[k];\n if (function (lhs, rhs) {\n return lhs && rhs;\n }(k + 1 < this.m, e[k] !== 0.0)) {\n for (var _i7 = k + 1; _i7 < this.m; _i7++) {\n work[_i7] = 0.0;\n }\n ;\n for (var _j = k + 1; _j < this.n; _j++) {\n for (var _i8 = k + 1; _i8 < this.m; _i8++) {\n work[_i8] += e[_j] * A[_i8][_j];\n }\n ;\n }\n ;\n for (var _j2 = k + 1; _j2 < this.n; _j2++) {\n var _t = -e[_j2] / e[k + 1];\n for (var _i9 = k + 1; _i9 < this.m; _i9++) {\n A[_i9][_j2] += _t * work[_i9];\n }\n ;\n }\n ;\n }\n if (wantv) {\n for (var _i10 = k + 1; _i10 < this.n; _i10++) {\n this.V[_i10][k] = e[_i10];\n };\n }\n }\n };\n var p = Math.min(this.n, this.m + 1);\n if (nct < this.n) {\n this.s[nct] = A[nct][nct];\n }\n if (this.m < p) {\n this.s[p - 1] = 0.0;\n }\n if (nrt + 1 < p) {\n e[nrt] = A[nrt][p - 1];\n }\n e[p - 1] = 0.0;\n if (wantu) {\n for (var _j3 = nct; _j3 < nu; _j3++) {\n for (var _i11 = 0; _i11 < this.m; _i11++) {\n this.U[_i11][_j3] = 0.0;\n }\n ;\n this.U[_j3][_j3] = 1.0;\n };\n for (var _k = nct - 1; _k >= 0; _k--) {\n if (this.s[_k] !== 0.0) {\n for (var _j4 = _k + 1; _j4 < nu; _j4++) {\n var _t2 = 0;\n for (var _i12 = _k; _i12 < this.m; _i12++) {\n _t2 += this.U[_i12][_k] * this.U[_i12][_j4];\n };\n _t2 = -_t2 / this.U[_k][_k];\n for (var _i13 = _k; _i13 < this.m; _i13++) {\n this.U[_i13][_j4] += _t2 * this.U[_i13][_k];\n };\n };\n for (var _i14 = _k; _i14 < this.m; _i14++) {\n this.U[_i14][_k] = -this.U[_i14][_k];\n };\n this.U[_k][_k] = 1.0 + this.U[_k][_k];\n for (var _i15 = 0; _i15 < _k - 1; _i15++) {\n this.U[_i15][_k] = 0.0;\n };\n } else {\n for (var _i16 = 0; _i16 < this.m; _i16++) {\n this.U[_i16][_k] = 0.0;\n };\n this.U[_k][_k] = 1.0;\n }\n };\n }\n if (wantv) {\n for (var _k2 = this.n - 1; _k2 >= 0; _k2--) {\n if (function (lhs, rhs) {\n return lhs && rhs;\n }(_k2 < nrt, e[_k2] !== 0.0)) {\n for (var _j5 = _k2 + 1; _j5 < nu; _j5++) {\n var _t3 = 0;\n for (var _i17 = _k2 + 1; _i17 < this.n; _i17++) {\n _t3 += this.V[_i17][_k2] * this.V[_i17][_j5];\n };\n _t3 = -_t3 / this.V[_k2 + 1][_k2];\n for (var _i18 = _k2 + 1; _i18 < this.n; _i18++) {\n this.V[_i18][_j5] += _t3 * this.V[_i18][_k2];\n };\n };\n }\n for (var _i19 = 0; _i19 < this.n; _i19++) {\n this.V[_i19][_k2] = 0.0;\n };\n this.V[_k2][_k2] = 1.0;\n };\n }\n var pp = p - 1;\n var iter = 0;\n var eps = Math.pow(2.0, -52.0);\n var tiny = Math.pow(2.0, -966.0);\n while (p > 0) {\n var _k3 = void 0;\n var kase = void 0;\n for (_k3 = p - 2; _k3 >= -1; _k3--) {\n if (_k3 === -1) {\n break;\n }\n if (Math.abs(e[_k3]) <= tiny + eps * (Math.abs(this.s[_k3]) + Math.abs(this.s[_k3 + 1]))) {\n e[_k3] = 0.0;\n break;\n }\n };\n if (_k3 === p - 2) {\n kase = 4;\n } else {\n var ks = void 0;\n for (ks = p - 1; ks >= _k3; ks--) {\n if (ks === _k3) {\n break;\n }\n var _t4 = (ks !== p ? Math.abs(e[ks]) : 0.0) + (ks !== _k3 + 1 ? Math.abs(e[ks - 1]) : 0.0);\n if (Math.abs(this.s[ks]) <= tiny + eps * _t4) {\n this.s[ks] = 0.0;\n break;\n }\n };\n if (ks === _k3) {\n kase = 3;\n } else if (ks === p - 1) {\n kase = 1;\n } else {\n kase = 2;\n _k3 = ks;\n }\n }\n _k3++;\n switch (kase) {\n case 1:\n {\n var f = e[p - 2];\n e[p - 2] = 0.0;\n for (var _j6 = p - 2; _j6 >= _k3; _j6--) {\n var _t5 = SVD.hypot(this.s[_j6], f);\n var cs = this.s[_j6] / _t5;\n var sn = f / _t5;\n this.s[_j6] = _t5;\n if (_j6 !== _k3) {\n f = -sn * e[_j6 - 1];\n e[_j6 - 1] = cs * e[_j6 - 1];\n }\n if (wantv) {\n for (var _i20 = 0; _i20 < this.n; _i20++) {\n _t5 = cs * this.V[_i20][_j6] + sn * this.V[_i20][p - 1];\n this.V[_i20][p - 1] = -sn * this.V[_i20][_j6] + cs * this.V[_i20][p - 1];\n this.V[_i20][_j6] = _t5;\n };\n }\n };\n };\n break;\n case 2:\n {\n var _f = e[_k3 - 1];\n e[_k3 - 1] = 0.0;\n for (var _j7 = _k3; _j7 < p; _j7++) {\n var _t6 = SVD.hypot(this.s[_j7], _f);\n var _cs = this.s[_j7] / _t6;\n var _sn = _f / _t6;\n this.s[_j7] = _t6;\n _f = -_sn * e[_j7];\n e[_j7] = _cs * e[_j7];\n if (wantu) {\n for (var _i21 = 0; _i21 < this.m; _i21++) {\n _t6 = _cs * this.U[_i21][_j7] + _sn * this.U[_i21][_k3 - 1];\n this.U[_i21][_k3 - 1] = -_sn * this.U[_i21][_j7] + _cs * this.U[_i21][_k3 - 1];\n this.U[_i21][_j7] = _t6;\n };\n }\n };\n };\n break;\n case 3:\n {\n var scale = Math.max(Math.max(Math.max(Math.max(Math.abs(this.s[p - 1]), Math.abs(this.s[p - 2])), Math.abs(e[p - 2])), Math.abs(this.s[_k3])), Math.abs(e[_k3]));\n var sp = this.s[p - 1] / scale;\n var spm1 = this.s[p - 2] / scale;\n var epm1 = e[p - 2] / scale;\n var sk = this.s[_k3] / scale;\n var ek = e[_k3] / scale;\n var b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2.0;\n var c = sp * epm1 * (sp * epm1);\n var shift = 0.0;\n if (function (lhs, rhs) {\n return lhs || rhs;\n }(b !== 0.0, c !== 0.0)) {\n shift = Math.sqrt(b * b + c);\n if (b < 0.0) {\n shift = -shift;\n }\n shift = c / (b + shift);\n }\n var _f2 = (sk + sp) * (sk - sp) + shift;\n var g = sk * ek;\n for (var _j8 = _k3; _j8 < p - 1; _j8++) {\n var _t7 = SVD.hypot(_f2, g);\n var _cs2 = _f2 / _t7;\n var _sn2 = g / _t7;\n if (_j8 !== _k3) {\n e[_j8 - 1] = _t7;\n }\n _f2 = _cs2 * this.s[_j8] + _sn2 * e[_j8];\n e[_j8] = _cs2 * e[_j8] - _sn2 * this.s[_j8];\n g = _sn2 * this.s[_j8 + 1];\n this.s[_j8 + 1] = _cs2 * this.s[_j8 + 1];\n if (wantv) {\n for (var _i22 = 0; _i22 < this.n; _i22++) {\n _t7 = _cs2 * this.V[_i22][_j8] + _sn2 * this.V[_i22][_j8 + 1];\n this.V[_i22][_j8 + 1] = -_sn2 * this.V[_i22][_j8] + _cs2 * this.V[_i22][_j8 + 1];\n this.V[_i22][_j8] = _t7;\n };\n }\n _t7 = SVD.hypot(_f2, g);\n _cs2 = _f2 / _t7;\n _sn2 = g / _t7;\n this.s[_j8] = _t7;\n _f2 = _cs2 * e[_j8] + _sn2 * this.s[_j8 + 1];\n this.s[_j8 + 1] = -_sn2 * e[_j8] + _cs2 * this.s[_j8 + 1];\n g = _sn2 * e[_j8 + 1];\n e[_j8 + 1] = _cs2 * e[_j8 + 1];\n if (wantu && _j8 < this.m - 1) {\n for (var _i23 = 0; _i23 < this.m; _i23++) {\n _t7 = _cs2 * this.U[_i23][_j8] + _sn2 * this.U[_i23][_j8 + 1];\n this.U[_i23][_j8 + 1] = -_sn2 * this.U[_i23][_j8] + _cs2 * this.U[_i23][_j8 + 1];\n this.U[_i23][_j8] = _t7;\n };\n }\n };\n e[p - 2] = _f2;\n iter = iter + 1;\n };\n break;\n case 4:\n {\n if (this.s[_k3] <= 0.0) {\n this.s[_k3] = this.s[_k3] < 0.0 ? -this.s[_k3] : 0.0;\n if (wantv) {\n for (var _i24 = 0; _i24 <= pp; _i24++) {\n this.V[_i24][_k3] = -this.V[_i24][_k3];\n };\n }\n }\n while (_k3 < pp) {\n if (this.s[_k3] >= this.s[_k3 + 1]) {\n break;\n }\n var _t8 = this.s[_k3];\n this.s[_k3] = this.s[_k3 + 1];\n this.s[_k3 + 1] = _t8;\n if (wantv && _k3 < this.n - 1) {\n for (var _i25 = 0; _i25 < this.n; _i25++) {\n _t8 = this.V[_i25][_k3 + 1];\n this.V[_i25][_k3 + 1] = this.V[_i25][_k3];\n this.V[_i25][_k3] = _t8;\n };\n }\n if (wantu && _k3 < this.m - 1) {\n for (var _i26 = 0; _i26 < this.m; _i26++) {\n _t8 = this.U[_i26][_k3 + 1];\n this.U[_i26][_k3 + 1] = this.U[_i26][_k3];\n this.U[_i26][_k3] = _t8;\n };\n }\n _k3++;\n };\n iter = 0;\n p--;\n };\n break;\n }\n };\n var result = { U: this.U, V: this.V, S: this.s };\n return result;\n};\n\n// sqrt(a^2 + b^2) without under/overflow.\nSVD.hypot = function (a, b) {\n var r = void 0;\n if (Math.abs(a) > Math.abs(b)) {\n r = b / a;\n r = Math.abs(a) * Math.sqrt(1 + r * r);\n } else if (b != 0) {\n r = a / b;\n r = Math.abs(b) * Math.sqrt(1 + r * r);\n } else {\n r = 0.0;\n }\n return r;\n};\n\nmodule.exports = SVD;\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Needleman-Wunsch algorithm is an procedure to compute the optimal global alignment of two string\n * sequences by S.B.Needleman and C.D.Wunsch (1970).\n *\n * Aside from the inputs, you can assign the scores for,\n * - Match: The two characters at the current index are same.\n * - Mismatch: The two characters at the current index are different.\n * - Insertion/Deletion(gaps): The best alignment involves one letter aligning to a gap in the other string.\n */\n\nvar NeedlemanWunsch = function () {\n function NeedlemanWunsch(sequence1, sequence2) {\n var match_score = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var mismatch_penalty = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -1;\n var gap_penalty = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1;\n\n _classCallCheck(this, NeedlemanWunsch);\n\n this.sequence1 = sequence1;\n this.sequence2 = sequence2;\n this.match_score = match_score;\n this.mismatch_penalty = mismatch_penalty;\n this.gap_penalty = gap_penalty;\n\n // Just the remove redundancy\n this.iMax = sequence1.length + 1;\n this.jMax = sequence2.length + 1;\n\n // Grid matrix of scores\n this.grid = new Array(this.iMax);\n for (var i = 0; i < this.iMax; i++) {\n this.grid[i] = new Array(this.jMax);\n\n for (var j = 0; j < this.jMax; j++) {\n this.grid[i][j] = 0;\n }\n }\n\n // Traceback matrix (2D array, each cell is an array of boolean values for [`Diag`, `Up`, `Left`] positions)\n this.tracebackGrid = new Array(this.iMax);\n for (var _i = 0; _i < this.iMax; _i++) {\n this.tracebackGrid[_i] = new Array(this.jMax);\n\n for (var _j = 0; _j < this.jMax; _j++) {\n this.tracebackGrid[_i][_j] = [null, null, null];\n }\n }\n\n // The aligned sequences (return multiple possibilities)\n this.alignments = [];\n\n // Final alignment score\n this.score = -1;\n\n // Calculate scores and tracebacks\n this.computeGrids();\n }\n\n _createClass(NeedlemanWunsch, [{\n key: \"getScore\",\n value: function getScore() {\n return this.score;\n }\n }, {\n key: \"getAlignments\",\n value: function getAlignments() {\n return this.alignments;\n }\n\n // Main dynamic programming procedure\n\n }, {\n key: \"computeGrids\",\n value: function computeGrids() {\n // Fill in the first row\n for (var j = 1; j < this.jMax; j++) {\n this.grid[0][j] = this.grid[0][j - 1] + this.gap_penalty;\n this.tracebackGrid[0][j] = [false, false, true];\n }\n\n // Fill in the first column\n for (var i = 1; i < this.iMax; i++) {\n this.grid[i][0] = this.grid[i - 1][0] + this.gap_penalty;\n this.tracebackGrid[i][0] = [false, true, false];\n }\n\n // Fill the rest of the grid\n for (var _i2 = 1; _i2 < this.iMax; _i2++) {\n for (var _j2 = 1; _j2 < this.jMax; _j2++) {\n // Find the max score(s) among [`Diag`, `Up`, `Left`]\n var diag = void 0;\n if (this.sequence1[_i2 - 1] === this.sequence2[_j2 - 1]) diag = this.grid[_i2 - 1][_j2 - 1] + this.match_score;else diag = this.grid[_i2 - 1][_j2 - 1] + this.mismatch_penalty;\n\n var up = this.grid[_i2 - 1][_j2] + this.gap_penalty;\n var left = this.grid[_i2][_j2 - 1] + this.gap_penalty;\n\n // If there exists multiple max values, capture them for multiple paths\n var maxOf = [diag, up, left];\n var indices = this.arrayAllMaxIndexes(maxOf);\n\n // Update Grids\n this.grid[_i2][_j2] = maxOf[indices[0]];\n this.tracebackGrid[_i2][_j2] = [indices.includes(0), indices.includes(1), indices.includes(2)];\n }\n }\n\n // Update alignment score\n this.score = this.grid[this.iMax - 1][this.jMax - 1];\n }\n\n // Gets all possible valid sequence combinations\n\n }, {\n key: \"alignmentTraceback\",\n value: function alignmentTraceback() {\n var inProcessAlignments = [];\n\n inProcessAlignments.push({ pos: [this.sequence1.length, this.sequence2.length],\n seq1: \"\",\n seq2: \"\"\n });\n\n while (inProcessAlignments[0]) {\n var current = inProcessAlignments[0];\n var directions = this.tracebackGrid[current.pos[0]][current.pos[1]];\n\n if (directions[0]) {\n inProcessAlignments.push({ pos: [current.pos[0] - 1, current.pos[1] - 1],\n seq1: this.sequence1[current.pos[0] - 1] + current.seq1,\n seq2: this.sequence2[current.pos[1] - 1] + current.seq2\n });\n }\n if (directions[1]) {\n inProcessAlignments.push({ pos: [current.pos[0] - 1, current.pos[1]],\n seq1: this.sequence1[current.pos[0] - 1] + current.seq1,\n seq2: '-' + current.seq2\n });\n }\n if (directions[2]) {\n inProcessAlignments.push({ pos: [current.pos[0], current.pos[1] - 1],\n seq1: '-' + current.seq1,\n seq2: this.sequence2[current.pos[1] - 1] + current.seq2\n });\n }\n\n if (current.pos[0] === 0 && current.pos[1] === 0) this.alignments.push({ sequence1: current.seq1,\n sequence2: current.seq2\n });\n\n inProcessAlignments.shift();\n }\n\n return this.alignments;\n }\n\n // Helper Functions\n\n }, {\n key: \"getAllIndexes\",\n value: function getAllIndexes(arr, val) {\n var indexes = [],\n i = -1;\n while ((i = arr.indexOf(val, i + 1)) !== -1) {\n indexes.push(i);\n }\n return indexes;\n }\n }, {\n key: \"arrayAllMaxIndexes\",\n value: function arrayAllMaxIndexes(array) {\n return this.getAllIndexes(array, Math.max.apply(null, array));\n }\n }]);\n\n return NeedlemanWunsch;\n}();\n\nmodule.exports = NeedlemanWunsch;\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar layoutBase = function layoutBase() {\n return;\n};\n\nlayoutBase.FDLayout = __webpack_require__(18);\nlayoutBase.FDLayoutConstants = __webpack_require__(4);\nlayoutBase.FDLayoutEdge = __webpack_require__(19);\nlayoutBase.FDLayoutNode = __webpack_require__(20);\nlayoutBase.DimensionD = __webpack_require__(21);\nlayoutBase.HashMap = __webpack_require__(22);\nlayoutBase.HashSet = __webpack_require__(23);\nlayoutBase.IGeometry = __webpack_require__(8);\nlayoutBase.IMath = __webpack_require__(9);\nlayoutBase.Integer = __webpack_require__(10);\nlayoutBase.Point = __webpack_require__(12);\nlayoutBase.PointD = __webpack_require__(5);\nlayoutBase.RandomSeed = __webpack_require__(16);\nlayoutBase.RectangleD = __webpack_require__(13);\nlayoutBase.Transform = __webpack_require__(17);\nlayoutBase.UniqueIDGeneretor = __webpack_require__(14);\nlayoutBase.Quicksort = __webpack_require__(25);\nlayoutBase.LinkedList = __webpack_require__(11);\nlayoutBase.LGraphObject = __webpack_require__(2);\nlayoutBase.LGraph = __webpack_require__(6);\nlayoutBase.LEdge = __webpack_require__(1);\nlayoutBase.LGraphManager = __webpack_require__(7);\nlayoutBase.LNode = __webpack_require__(3);\nlayoutBase.Layout = __webpack_require__(15);\nlayoutBase.LayoutConstants = __webpack_require__(0);\nlayoutBase.NeedlemanWunsch = __webpack_require__(27);\nlayoutBase.Matrix = __webpack_require__(24);\nlayoutBase.SVD = __webpack_require__(26);\n\nmodule.exports = layoutBase;\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction Emitter() {\n this.listeners = [];\n}\n\nvar p = Emitter.prototype;\n\np.addListener = function (event, callback) {\n this.listeners.push({\n event: event,\n callback: callback\n });\n};\n\np.removeListener = function (event, callback) {\n for (var i = this.listeners.length; i >= 0; i--) {\n var l = this.listeners[i];\n\n if (l.event === event && l.callback === callback) {\n this.listeners.splice(i, 1);\n }\n }\n};\n\np.emit = function (event, data) {\n for (var i = 0; i < this.listeners.length; i++) {\n var l = this.listeners[i];\n\n if (event === l.event) {\n l.callback(data);\n }\n }\n};\n\nmodule.exports = Emitter;\n\n/***/ })\n/******/ ]);\n});", "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"layout-base\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"layout-base\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"coseBase\"] = factory(require(\"layout-base\"));\n\telse\n\t\troot[\"coseBase\"] = factory(root[\"layoutBase\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE__551__) {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 45:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nvar coseBase = {};\n\ncoseBase.layoutBase = __webpack_require__(551);\ncoseBase.CoSEConstants = __webpack_require__(806);\ncoseBase.CoSEEdge = __webpack_require__(767);\ncoseBase.CoSEGraph = __webpack_require__(880);\ncoseBase.CoSEGraphManager = __webpack_require__(578);\ncoseBase.CoSELayout = __webpack_require__(765);\ncoseBase.CoSENode = __webpack_require__(991);\ncoseBase.ConstraintHandler = __webpack_require__(902);\n\nmodule.exports = coseBase;\n\n/***/ }),\n\n/***/ 806:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nvar FDLayoutConstants = __webpack_require__(551).FDLayoutConstants;\n\nfunction CoSEConstants() {}\n\n//CoSEConstants inherits static props in FDLayoutConstants\nfor (var prop in FDLayoutConstants) {\n CoSEConstants[prop] = FDLayoutConstants[prop];\n}\n\nCoSEConstants.DEFAULT_USE_MULTI_LEVEL_SCALING = false;\nCoSEConstants.DEFAULT_RADIAL_SEPARATION = FDLayoutConstants.DEFAULT_EDGE_LENGTH;\nCoSEConstants.DEFAULT_COMPONENT_SEPERATION = 60;\nCoSEConstants.TILE = true;\nCoSEConstants.TILING_PADDING_VERTICAL = 10;\nCoSEConstants.TILING_PADDING_HORIZONTAL = 10;\nCoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = true;\nCoSEConstants.ENFORCE_CONSTRAINTS = true;\nCoSEConstants.APPLY_LAYOUT = true;\nCoSEConstants.RELAX_MOVEMENT_ON_CONSTRAINTS = true;\nCoSEConstants.TREE_REDUCTION_ON_INCREMENTAL = true; // this should be set to false if there will be a constraint\n// This constant is for differentiating whether actual layout algorithm that uses cose-base wants to apply only incremental layout or \n// an incremental layout on top of a randomized layout. If it is only incremental layout, then this constant should be true.\nCoSEConstants.PURE_INCREMENTAL = CoSEConstants.DEFAULT_INCREMENTAL;\n\nmodule.exports = CoSEConstants;\n\n/***/ }),\n\n/***/ 767:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nvar FDLayoutEdge = __webpack_require__(551).FDLayoutEdge;\n\nfunction CoSEEdge(source, target, vEdge) {\n FDLayoutEdge.call(this, source, target, vEdge);\n}\n\nCoSEEdge.prototype = Object.create(FDLayoutEdge.prototype);\nfor (var prop in FDLayoutEdge) {\n CoSEEdge[prop] = FDLayoutEdge[prop];\n}\n\nmodule.exports = CoSEEdge;\n\n/***/ }),\n\n/***/ 880:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nvar LGraph = __webpack_require__(551).LGraph;\n\nfunction CoSEGraph(parent, graphMgr, vGraph) {\n LGraph.call(this, parent, graphMgr, vGraph);\n}\n\nCoSEGraph.prototype = Object.create(LGraph.prototype);\nfor (var prop in LGraph) {\n CoSEGraph[prop] = LGraph[prop];\n}\n\nmodule.exports = CoSEGraph;\n\n/***/ }),\n\n/***/ 578:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nvar LGraphManager = __webpack_require__(551).LGraphManager;\n\nfunction CoSEGraphManager(layout) {\n LGraphManager.call(this, layout);\n}\n\nCoSEGraphManager.prototype = Object.create(LGraphManager.prototype);\nfor (var prop in LGraphManager) {\n CoSEGraphManager[prop] = LGraphManager[prop];\n}\n\nmodule.exports = CoSEGraphManager;\n\n/***/ }),\n\n/***/ 765:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nvar FDLayout = __webpack_require__(551).FDLayout;\nvar CoSEGraphManager = __webpack_require__(578);\nvar CoSEGraph = __webpack_require__(880);\nvar CoSENode = __webpack_require__(991);\nvar CoSEEdge = __webpack_require__(767);\nvar CoSEConstants = __webpack_require__(806);\nvar ConstraintHandler = __webpack_require__(902);\nvar FDLayoutConstants = __webpack_require__(551).FDLayoutConstants;\nvar LayoutConstants = __webpack_require__(551).LayoutConstants;\nvar Point = __webpack_require__(551).Point;\nvar PointD = __webpack_require__(551).PointD;\nvar DimensionD = __webpack_require__(551).DimensionD;\nvar Layout = __webpack_require__(551).Layout;\nvar Integer = __webpack_require__(551).Integer;\nvar IGeometry = __webpack_require__(551).IGeometry;\nvar LGraph = __webpack_require__(551).LGraph;\nvar Transform = __webpack_require__(551).Transform;\nvar LinkedList = __webpack_require__(551).LinkedList;\n\nfunction CoSELayout() {\n FDLayout.call(this);\n\n this.toBeTiled = {}; // Memorize if a node is to be tiled or is tiled\n this.constraints = {}; // keep layout constraints\n}\n\nCoSELayout.prototype = Object.create(FDLayout.prototype);\n\nfor (var prop in FDLayout) {\n CoSELayout[prop] = FDLayout[prop];\n}\n\nCoSELayout.prototype.newGraphManager = function () {\n var gm = new CoSEGraphManager(this);\n this.graphManager = gm;\n return gm;\n};\n\nCoSELayout.prototype.newGraph = function (vGraph) {\n return new CoSEGraph(null, this.graphManager, vGraph);\n};\n\nCoSELayout.prototype.newNode = function (vNode) {\n return new CoSENode(this.graphManager, vNode);\n};\n\nCoSELayout.prototype.newEdge = function (vEdge) {\n return new CoSEEdge(null, null, vEdge);\n};\n\nCoSELayout.prototype.initParameters = function () {\n FDLayout.prototype.initParameters.call(this, arguments);\n if (!this.isSubLayout) {\n if (CoSEConstants.DEFAULT_EDGE_LENGTH < 10) {\n this.idealEdgeLength = 10;\n } else {\n this.idealEdgeLength = CoSEConstants.DEFAULT_EDGE_LENGTH;\n }\n\n this.useSmartIdealEdgeLengthCalculation = CoSEConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION;\n this.gravityConstant = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH;\n this.compoundGravityConstant = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH;\n this.gravityRangeFactor = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR;\n this.compoundGravityRangeFactor = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR;\n\n // variables for tree reduction support\n this.prunedNodesAll = [];\n this.growTreeIterations = 0;\n this.afterGrowthIterations = 0;\n this.isTreeGrowing = false;\n this.isGrowthFinished = false;\n }\n};\n\n// This method is used to set CoSE related parameters used by spring embedder.\nCoSELayout.prototype.initSpringEmbedder = function () {\n FDLayout.prototype.initSpringEmbedder.call(this);\n\n // variables for cooling\n this.coolingCycle = 0;\n this.maxCoolingCycle = this.maxIterations / FDLayoutConstants.CONVERGENCE_CHECK_PERIOD;\n this.finalTemperature = 0.04;\n this.coolingAdjuster = 1;\n};\n\nCoSELayout.prototype.layout = function () {\n var createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED;\n if (createBendsAsNeeded) {\n this.createBendpoints();\n this.graphManager.resetAllEdges();\n }\n\n this.level = 0;\n return this.classicLayout();\n};\n\nCoSELayout.prototype.classicLayout = function () {\n this.nodesWithGravity = this.calculateNodesToApplyGravitationTo();\n this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity);\n this.calcNoOfChildrenForAllNodes();\n this.graphManager.calcLowestCommonAncestors();\n this.graphManager.calcInclusionTreeDepths();\n this.graphManager.getRoot().calcEstimatedSize();\n this.calcIdealEdgeLengths();\n\n if (!this.incremental) {\n var forest = this.getFlatForest();\n\n // The graph associated with this layout is flat and a forest\n if (forest.length > 0) {\n this.positionNodesRadially(forest);\n }\n // The graph associated with this layout is not flat or a forest\n else {\n // Reduce the trees when incremental mode is not enabled and graph is not a forest \n this.reduceTrees();\n // Update nodes that gravity will be applied\n this.graphManager.resetAllNodesToApplyGravitation();\n var allNodes = new Set(this.getAllNodes());\n var intersection = this.nodesWithGravity.filter(function (x) {\n return allNodes.has(x);\n });\n this.graphManager.setAllNodesToApplyGravitation(intersection);\n\n this.positionNodesRandomly();\n }\n } else {\n if (CoSEConstants.TREE_REDUCTION_ON_INCREMENTAL) {\n // Reduce the trees in incremental mode if only this constant is set to true \n this.reduceTrees();\n // Update nodes that gravity will be applied\n this.graphManager.resetAllNodesToApplyGravitation();\n var allNodes = new Set(this.getAllNodes());\n var intersection = this.nodesWithGravity.filter(function (x) {\n return allNodes.has(x);\n });\n this.graphManager.setAllNodesToApplyGravitation(intersection);\n }\n }\n\n if (Object.keys(this.constraints).length > 0) {\n ConstraintHandler.handleConstraints(this);\n this.initConstraintVariables();\n }\n\n this.initSpringEmbedder();\n if (CoSEConstants.APPLY_LAYOUT) {\n this.runSpringEmbedder();\n }\n\n return true;\n};\n\nCoSELayout.prototype.tick = function () {\n this.totalIterations++;\n\n if (this.totalIterations === this.maxIterations && !this.isTreeGrowing && !this.isGrowthFinished) {\n if (this.prunedNodesAll.length > 0) {\n this.isTreeGrowing = true;\n } else {\n return true;\n }\n }\n\n if (this.totalIterations % FDLayoutConstants.CONVERGENCE_CHECK_PERIOD == 0 && !this.isTreeGrowing && !this.isGrowthFinished) {\n if (this.isConverged()) {\n if (this.prunedNodesAll.length > 0) {\n this.isTreeGrowing = true;\n } else {\n return true;\n }\n }\n\n this.coolingCycle++;\n\n if (this.layoutQuality == 0) {\n // quality - \"draft\"\n this.coolingAdjuster = this.coolingCycle;\n } else if (this.layoutQuality == 1) {\n // quality - \"default\"\n this.coolingAdjuster = this.coolingCycle / 3;\n }\n\n // cooling schedule is based on http://www.btluke.com/simanf1.html -> cooling schedule 3\n this.coolingFactor = Math.max(this.initialCoolingFactor - Math.pow(this.coolingCycle, Math.log(100 * (this.initialCoolingFactor - this.finalTemperature)) / Math.log(this.maxCoolingCycle)) / 100 * this.coolingAdjuster, this.finalTemperature);\n this.animationPeriod = Math.ceil(this.initialAnimationPeriod * Math.sqrt(this.coolingFactor));\n }\n // Operations while tree is growing again \n if (this.isTreeGrowing) {\n if (this.growTreeIterations % 10 == 0) {\n if (this.prunedNodesAll.length > 0) {\n this.graphManager.updateBounds();\n this.updateGrid();\n this.growTree(this.prunedNodesAll);\n // Update nodes that gravity will be applied\n this.graphManager.resetAllNodesToApplyGravitation();\n var allNodes = new Set(this.getAllNodes());\n var intersection = this.nodesWithGravity.filter(function (x) {\n return allNodes.has(x);\n });\n this.graphManager.setAllNodesToApplyGravitation(intersection);\n\n this.graphManager.updateBounds();\n this.updateGrid();\n if (CoSEConstants.PURE_INCREMENTAL) this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL / 2;else this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL;\n } else {\n this.isTreeGrowing = false;\n this.isGrowthFinished = true;\n }\n }\n this.growTreeIterations++;\n }\n // Operations after growth is finished\n if (this.isGrowthFinished) {\n if (this.isConverged()) {\n return true;\n }\n if (this.afterGrowthIterations % 10 == 0) {\n this.graphManager.updateBounds();\n this.updateGrid();\n }\n if (CoSEConstants.PURE_INCREMENTAL) this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL / 2 * ((100 - this.afterGrowthIterations) / 100);else this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL * ((100 - this.afterGrowthIterations) / 100);\n this.afterGrowthIterations++;\n }\n\n var gridUpdateAllowed = !this.isTreeGrowing && !this.isGrowthFinished;\n var forceToNodeSurroundingUpdate = this.growTreeIterations % 10 == 1 && this.isTreeGrowing || this.afterGrowthIterations % 10 == 1 && this.isGrowthFinished;\n\n this.totalDisplacement = 0;\n this.graphManager.updateBounds();\n this.calcSpringForces();\n this.calcRepulsionForces(gridUpdateAllowed, forceToNodeSurroundingUpdate);\n this.calcGravitationalForces();\n this.moveNodes();\n this.animate();\n\n return false; // Layout is not ended yet return false\n};\n\nCoSELayout.prototype.getPositionsData = function () {\n var allNodes = this.graphManager.getAllNodes();\n var pData = {};\n for (var i = 0; i < allNodes.length; i++) {\n var rect = allNodes[i].rect;\n var id = allNodes[i].id;\n pData[id] = {\n id: id,\n x: rect.getCenterX(),\n y: rect.getCenterY(),\n w: rect.width,\n h: rect.height\n };\n }\n\n return pData;\n};\n\nCoSELayout.prototype.runSpringEmbedder = function () {\n this.initialAnimationPeriod = 25;\n this.animationPeriod = this.initialAnimationPeriod;\n var layoutEnded = false;\n\n // If aminate option is 'during' signal that layout is supposed to start iterating\n if (FDLayoutConstants.ANIMATE === 'during') {\n this.emit('layoutstarted');\n } else {\n // If aminate option is 'during' tick() function will be called on index.js\n while (!layoutEnded) {\n layoutEnded = this.tick();\n }\n\n this.graphManager.updateBounds();\n }\n};\n\n// overrides moveNodes method in FDLayout\nCoSELayout.prototype.moveNodes = function () {\n var lNodes = this.getAllNodes();\n var node;\n\n // calculate displacement for each node \n for (var i = 0; i < lNodes.length; i++) {\n node = lNodes[i];\n node.calculateDisplacement();\n }\n\n if (Object.keys(this.constraints).length > 0) {\n this.updateDisplacements();\n }\n\n // move each node\n for (var i = 0; i < lNodes.length; i++) {\n node = lNodes[i];\n node.move();\n }\n};\n\n// constraint related methods: initConstraintVariables and updateDisplacements\n\n// initialize constraint related variables\nCoSELayout.prototype.initConstraintVariables = function () {\n var self = this;\n this.idToNodeMap = new Map();\n this.fixedNodeSet = new Set();\n\n var allNodes = this.graphManager.getAllNodes();\n\n // fill idToNodeMap\n for (var i = 0; i < allNodes.length; i++) {\n var node = allNodes[i];\n this.idToNodeMap.set(node.id, node);\n }\n\n // calculate fixed node weight for given compound node\n var calculateCompoundWeight = function calculateCompoundWeight(compoundNode) {\n var nodes = compoundNode.getChild().getNodes();\n var node;\n var fixedNodeWeight = 0;\n for (var i = 0; i < nodes.length; i++) {\n node = nodes[i];\n if (node.getChild() == null) {\n if (self.fixedNodeSet.has(node.id)) {\n fixedNodeWeight += 100;\n }\n } else {\n fixedNodeWeight += calculateCompoundWeight(node);\n }\n }\n return fixedNodeWeight;\n };\n\n if (this.constraints.fixedNodeConstraint) {\n // fill fixedNodeSet\n this.constraints.fixedNodeConstraint.forEach(function (nodeData) {\n self.fixedNodeSet.add(nodeData.nodeId);\n });\n\n // assign fixed node weights to compounds if they contain fixed nodes\n var allNodes = this.graphManager.getAllNodes();\n var node;\n\n for (var i = 0; i < allNodes.length; i++) {\n node = allNodes[i];\n if (node.getChild() != null) {\n var fixedNodeWeight = calculateCompoundWeight(node);\n if (fixedNodeWeight > 0) {\n node.fixedNodeWeight = fixedNodeWeight;\n }\n }\n }\n }\n\n if (this.constraints.relativePlacementConstraint) {\n var nodeToDummyForVerticalAlignment = new Map();\n var nodeToDummyForHorizontalAlignment = new Map();\n this.dummyToNodeForVerticalAlignment = new Map();\n this.dummyToNodeForHorizontalAlignment = new Map();\n this.fixedNodesOnHorizontal = new Set();\n this.fixedNodesOnVertical = new Set();\n\n // fill maps and sets\n this.fixedNodeSet.forEach(function (nodeId) {\n self.fixedNodesOnHorizontal.add(nodeId);\n self.fixedNodesOnVertical.add(nodeId);\n });\n\n if (this.constraints.alignmentConstraint) {\n if (this.constraints.alignmentConstraint.vertical) {\n var verticalAlignment = this.constraints.alignmentConstraint.vertical;\n for (var i = 0; i < verticalAlignment.length; i++) {\n this.dummyToNodeForVerticalAlignment.set(\"dummy\" + i, []);\n verticalAlignment[i].forEach(function (nodeId) {\n nodeToDummyForVerticalAlignment.set(nodeId, \"dummy\" + i);\n self.dummyToNodeForVerticalAlignment.get(\"dummy\" + i).push(nodeId);\n if (self.fixedNodeSet.has(nodeId)) {\n self.fixedNodesOnHorizontal.add(\"dummy\" + i);\n }\n });\n }\n }\n if (this.constraints.alignmentConstraint.horizontal) {\n var horizontalAlignment = this.constraints.alignmentConstraint.horizontal;\n for (var i = 0; i < horizontalAlignment.length; i++) {\n this.dummyToNodeForHorizontalAlignment.set(\"dummy\" + i, []);\n horizontalAlignment[i].forEach(function (nodeId) {\n nodeToDummyForHorizontalAlignment.set(nodeId, \"dummy\" + i);\n self.dummyToNodeForHorizontalAlignment.get(\"dummy\" + i).push(nodeId);\n if (self.fixedNodeSet.has(nodeId)) {\n self.fixedNodesOnVertical.add(\"dummy\" + i);\n }\n });\n }\n }\n }\n\n if (CoSEConstants.RELAX_MOVEMENT_ON_CONSTRAINTS) {\n\n this.shuffle = function (array) {\n var j, x, i;\n for (i = array.length - 1; i >= 2 * array.length / 3; i--) {\n j = Math.floor(Math.random() * (i + 1));\n x = array[i];\n array[i] = array[j];\n array[j] = x;\n }\n return array;\n };\n\n this.nodesInRelativeHorizontal = [];\n this.nodesInRelativeVertical = [];\n this.nodeToRelativeConstraintMapHorizontal = new Map();\n this.nodeToRelativeConstraintMapVertical = new Map();\n this.nodeToTempPositionMapHorizontal = new Map();\n this.nodeToTempPositionMapVertical = new Map();\n\n // fill arrays and maps\n this.constraints.relativePlacementConstraint.forEach(function (constraint) {\n if (constraint.left) {\n var nodeIdLeft = nodeToDummyForVerticalAlignment.has(constraint.left) ? nodeToDummyForVerticalAlignment.get(constraint.left) : constraint.left;\n var nodeIdRight = nodeToDummyForVerticalAlignment.has(constraint.right) ? nodeToDummyForVerticalAlignment.get(constraint.right) : constraint.right;\n\n if (!self.nodesInRelativeHorizontal.includes(nodeIdLeft)) {\n self.nodesInRelativeHorizontal.push(nodeIdLeft);\n self.nodeToRelativeConstraintMapHorizontal.set(nodeIdLeft, []);\n if (self.dummyToNodeForVerticalAlignment.has(nodeIdLeft)) {\n self.nodeToTempPositionMapHorizontal.set(nodeIdLeft, self.idToNodeMap.get(self.dummyToNodeForVerticalAlignment.get(nodeIdLeft)[0]).getCenterX());\n } else {\n self.nodeToTempPositionMapHorizontal.set(nodeIdLeft, self.idToNodeMap.get(nodeIdLeft).getCenterX());\n }\n }\n if (!self.nodesInRelativeHorizontal.includes(nodeIdRight)) {\n self.nodesInRelativeHorizontal.push(nodeIdRight);\n self.nodeToRelativeConstraintMapHorizontal.set(nodeIdRight, []);\n if (self.dummyToNodeForVerticalAlignment.has(nodeIdRight)) {\n self.nodeToTempPositionMapHorizontal.set(nodeIdRight, self.idToNodeMap.get(self.dummyToNodeForVerticalAlignment.get(nodeIdRight)[0]).getCenterX());\n } else {\n self.nodeToTempPositionMapHorizontal.set(nodeIdRight, self.idToNodeMap.get(nodeIdRight).getCenterX());\n }\n }\n\n self.nodeToRelativeConstraintMapHorizontal.get(nodeIdLeft).push({ right: nodeIdRight, gap: constraint.gap });\n self.nodeToRelativeConstraintMapHorizontal.get(nodeIdRight).push({ left: nodeIdLeft, gap: constraint.gap });\n } else {\n var nodeIdTop = nodeToDummyForHorizontalAlignment.has(constraint.top) ? nodeToDummyForHorizontalAlignment.get(constraint.top) : constraint.top;\n var nodeIdBottom = nodeToDummyForHorizontalAlignment.has(constraint.bottom) ? nodeToDummyForHorizontalAlignment.get(constraint.bottom) : constraint.bottom;\n\n if (!self.nodesInRelativeVertical.includes(nodeIdTop)) {\n self.nodesInRelativeVertical.push(nodeIdTop);\n self.nodeToRelativeConstraintMapVertical.set(nodeIdTop, []);\n if (self.dummyToNodeForHorizontalAlignment.has(nodeIdTop)) {\n self.nodeToTempPositionMapVertical.set(nodeIdTop, self.idToNodeMap.get(self.dummyToNodeForHorizontalAlignment.get(nodeIdTop)[0]).getCenterY());\n } else {\n self.nodeToTempPositionMapVertical.set(nodeIdTop, self.idToNodeMap.get(nodeIdTop).getCenterY());\n }\n }\n if (!self.nodesInRelativeVertical.includes(nodeIdBottom)) {\n self.nodesInRelativeVertical.push(nodeIdBottom);\n self.nodeToRelativeConstraintMapVertical.set(nodeIdBottom, []);\n if (self.dummyToNodeForHorizontalAlignment.has(nodeIdBottom)) {\n self.nodeToTempPositionMapVertical.set(nodeIdBottom, self.idToNodeMap.get(self.dummyToNodeForHorizontalAlignment.get(nodeIdBottom)[0]).getCenterY());\n } else {\n self.nodeToTempPositionMapVertical.set(nodeIdBottom, self.idToNodeMap.get(nodeIdBottom).getCenterY());\n }\n }\n self.nodeToRelativeConstraintMapVertical.get(nodeIdTop).push({ bottom: nodeIdBottom, gap: constraint.gap });\n self.nodeToRelativeConstraintMapVertical.get(nodeIdBottom).push({ top: nodeIdTop, gap: constraint.gap });\n }\n });\n } else {\n var subGraphOnHorizontal = new Map(); // subgraph from vertical RP constraints\n var subGraphOnVertical = new Map(); // subgraph from vertical RP constraints\n\n // construct subgraphs from relative placement constraints \n this.constraints.relativePlacementConstraint.forEach(function (constraint) {\n if (constraint.left) {\n var left = nodeToDummyForVerticalAlignment.has(constraint.left) ? nodeToDummyForVerticalAlignment.get(constraint.left) : constraint.left;\n var right = nodeToDummyForVerticalAlignment.has(constraint.right) ? nodeToDummyForVerticalAlignment.get(constraint.right) : constraint.right;\n if (subGraphOnHorizontal.has(left)) {\n subGraphOnHorizontal.get(left).push(right);\n } else {\n subGraphOnHorizontal.set(left, [right]);\n }\n if (subGraphOnHorizontal.has(right)) {\n subGraphOnHorizontal.get(right).push(left);\n } else {\n subGraphOnHorizontal.set(right, [left]);\n }\n } else {\n var top = nodeToDummyForHorizontalAlignment.has(constraint.top) ? nodeToDummyForHorizontalAlignment.get(constraint.top) : constraint.top;\n var bottom = nodeToDummyForHorizontalAlignment.has(constraint.bottom) ? nodeToDummyForHorizontalAlignment.get(constraint.bottom) : constraint.bottom;\n if (subGraphOnVertical.has(top)) {\n subGraphOnVertical.get(top).push(bottom);\n } else {\n subGraphOnVertical.set(top, [bottom]);\n }\n if (subGraphOnVertical.has(bottom)) {\n subGraphOnVertical.get(bottom).push(top);\n } else {\n subGraphOnVertical.set(bottom, [top]);\n }\n }\n });\n\n // function to construct components from a given graph \n // also returns an array that keeps whether each component contains fixed node\n var constructComponents = function constructComponents(graph, fixedNodes) {\n var components = [];\n var isFixed = [];\n var queue = new LinkedList();\n var visited = new Set();\n var count = 0;\n\n graph.forEach(function (value, key) {\n if (!visited.has(key)) {\n components[count] = [];\n isFixed[count] = false;\n var currentNode = key;\n queue.push(currentNode);\n visited.add(currentNode);\n components[count].push(currentNode);\n\n while (queue.length != 0) {\n currentNode = queue.shift();\n if (fixedNodes.has(currentNode)) {\n isFixed[count] = true;\n }\n var neighbors = graph.get(currentNode);\n neighbors.forEach(function (neighbor) {\n if (!visited.has(neighbor)) {\n queue.push(neighbor);\n visited.add(neighbor);\n components[count].push(neighbor);\n }\n });\n }\n count++;\n }\n });\n\n return { components: components, isFixed: isFixed };\n };\n\n var resultOnHorizontal = constructComponents(subGraphOnHorizontal, self.fixedNodesOnHorizontal);\n this.componentsOnHorizontal = resultOnHorizontal.components;\n this.fixedComponentsOnHorizontal = resultOnHorizontal.isFixed;\n var resultOnVertical = constructComponents(subGraphOnVertical, self.fixedNodesOnVertical);\n this.componentsOnVertical = resultOnVertical.components;\n this.fixedComponentsOnVertical = resultOnVertical.isFixed;\n }\n }\n};\n\n// updates node displacements based on constraints\nCoSELayout.prototype.updateDisplacements = function () {\n var self = this;\n if (this.constraints.fixedNodeConstraint) {\n this.constraints.fixedNodeConstraint.forEach(function (nodeData) {\n var fixedNode = self.idToNodeMap.get(nodeData.nodeId);\n fixedNode.displacementX = 0;\n fixedNode.displacementY = 0;\n });\n }\n\n if (this.constraints.alignmentConstraint) {\n if (this.constraints.alignmentConstraint.vertical) {\n var allVerticalAlignments = this.constraints.alignmentConstraint.vertical;\n for (var i = 0; i < allVerticalAlignments.length; i++) {\n var totalDisplacementX = 0;\n for (var j = 0; j < allVerticalAlignments[i].length; j++) {\n if (this.fixedNodeSet.has(allVerticalAlignments[i][j])) {\n totalDisplacementX = 0;\n break;\n }\n totalDisplacementX += this.idToNodeMap.get(allVerticalAlignments[i][j]).displacementX;\n }\n var averageDisplacementX = totalDisplacementX / allVerticalAlignments[i].length;\n for (var j = 0; j < allVerticalAlignments[i].length; j++) {\n this.idToNodeMap.get(allVerticalAlignments[i][j]).displacementX = averageDisplacementX;\n }\n }\n }\n if (this.constraints.alignmentConstraint.horizontal) {\n var allHorizontalAlignments = this.constraints.alignmentConstraint.horizontal;\n for (var i = 0; i < allHorizontalAlignments.length; i++) {\n var totalDisplacementY = 0;\n for (var j = 0; j < allHorizontalAlignments[i].length; j++) {\n if (this.fixedNodeSet.has(allHorizontalAlignments[i][j])) {\n totalDisplacementY = 0;\n break;\n }\n totalDisplacementY += this.idToNodeMap.get(allHorizontalAlignments[i][j]).displacementY;\n }\n var averageDisplacementY = totalDisplacementY / allHorizontalAlignments[i].length;\n for (var j = 0; j < allHorizontalAlignments[i].length; j++) {\n this.idToNodeMap.get(allHorizontalAlignments[i][j]).displacementY = averageDisplacementY;\n }\n }\n }\n }\n\n if (this.constraints.relativePlacementConstraint) {\n\n if (CoSEConstants.RELAX_MOVEMENT_ON_CONSTRAINTS) {\n // shuffle array to randomize node processing order\n if (this.totalIterations % 10 == 0) {\n this.shuffle(this.nodesInRelativeHorizontal);\n this.shuffle(this.nodesInRelativeVertical);\n }\n\n this.nodesInRelativeHorizontal.forEach(function (nodeId) {\n if (!self.fixedNodesOnHorizontal.has(nodeId)) {\n var displacement = 0;\n if (self.dummyToNodeForVerticalAlignment.has(nodeId)) {\n displacement = self.idToNodeMap.get(self.dummyToNodeForVerticalAlignment.get(nodeId)[0]).displacementX;\n } else {\n displacement = self.idToNodeMap.get(nodeId).displacementX;\n }\n self.nodeToRelativeConstraintMapHorizontal.get(nodeId).forEach(function (constraint) {\n if (constraint.right) {\n var diff = self.nodeToTempPositionMapHorizontal.get(constraint.right) - self.nodeToTempPositionMapHorizontal.get(nodeId) - displacement;\n if (diff < constraint.gap) {\n displacement -= constraint.gap - diff;\n }\n } else {\n var diff = self.nodeToTempPositionMapHorizontal.get(nodeId) - self.nodeToTempPositionMapHorizontal.get(constraint.left) + displacement;\n if (diff < constraint.gap) {\n displacement += constraint.gap - diff;\n }\n }\n });\n self.nodeToTempPositionMapHorizontal.set(nodeId, self.nodeToTempPositionMapHorizontal.get(nodeId) + displacement);\n if (self.dummyToNodeForVerticalAlignment.has(nodeId)) {\n self.dummyToNodeForVerticalAlignment.get(nodeId).forEach(function (nodeId) {\n self.idToNodeMap.get(nodeId).displacementX = displacement;\n });\n } else {\n self.idToNodeMap.get(nodeId).displacementX = displacement;\n }\n }\n });\n\n this.nodesInRelativeVertical.forEach(function (nodeId) {\n if (!self.fixedNodesOnHorizontal.has(nodeId)) {\n var displacement = 0;\n if (self.dummyToNodeForHorizontalAlignment.has(nodeId)) {\n displacement = self.idToNodeMap.get(self.dummyToNodeForHorizontalAlignment.get(nodeId)[0]).displacementY;\n } else {\n displacement = self.idToNodeMap.get(nodeId).displacementY;\n }\n self.nodeToRelativeConstraintMapVertical.get(nodeId).forEach(function (constraint) {\n if (constraint.bottom) {\n var diff = self.nodeToTempPositionMapVertical.get(constraint.bottom) - self.nodeToTempPositionMapVertical.get(nodeId) - displacement;\n if (diff < constraint.gap) {\n displacement -= constraint.gap - diff;\n }\n } else {\n var diff = self.nodeToTempPositionMapVertical.get(nodeId) - self.nodeToTempPositionMapVertical.get(constraint.top) + displacement;\n if (diff < constraint.gap) {\n displacement += constraint.gap - diff;\n }\n }\n });\n self.nodeToTempPositionMapVertical.set(nodeId, self.nodeToTempPositionMapVertical.get(nodeId) + displacement);\n if (self.dummyToNodeForHorizontalAlignment.has(nodeId)) {\n self.dummyToNodeForHorizontalAlignment.get(nodeId).forEach(function (nodeId) {\n self.idToNodeMap.get(nodeId).displacementY = displacement;\n });\n } else {\n self.idToNodeMap.get(nodeId).displacementY = displacement;\n }\n }\n });\n } else {\n for (var i = 0; i < this.componentsOnHorizontal.length; i++) {\n var component = this.componentsOnHorizontal[i];\n if (this.fixedComponentsOnHorizontal[i]) {\n for (var j = 0; j < component.length; j++) {\n if (this.dummyToNodeForVerticalAlignment.has(component[j])) {\n this.dummyToNodeForVerticalAlignment.get(component[j]).forEach(function (nodeId) {\n self.idToNodeMap.get(nodeId).displacementX = 0;\n });\n } else {\n this.idToNodeMap.get(component[j]).displacementX = 0;\n }\n }\n } else {\n var sum = 0;\n var count = 0;\n for (var j = 0; j < component.length; j++) {\n if (this.dummyToNodeForVerticalAlignment.has(component[j])) {\n var actualNodes = this.dummyToNodeForVerticalAlignment.get(component[j]);\n sum += actualNodes.length * this.idToNodeMap.get(actualNodes[0]).displacementX;\n count += actualNodes.length;\n } else {\n sum += this.idToNodeMap.get(component[j]).displacementX;\n count++;\n }\n }\n var averageDisplacement = sum / count;\n for (var j = 0; j < component.length; j++) {\n if (this.dummyToNodeForVerticalAlignment.has(component[j])) {\n this.dummyToNodeForVerticalAlignment.get(component[j]).forEach(function (nodeId) {\n self.idToNodeMap.get(nodeId).displacementX = averageDisplacement;\n });\n } else {\n this.idToNodeMap.get(component[j]).displacementX = averageDisplacement;\n }\n }\n }\n }\n\n for (var i = 0; i < this.componentsOnVertical.length; i++) {\n var component = this.componentsOnVertical[i];\n if (this.fixedComponentsOnVertical[i]) {\n for (var j = 0; j < component.length; j++) {\n if (this.dummyToNodeForHorizontalAlignment.has(component[j])) {\n this.dummyToNodeForHorizontalAlignment.get(component[j]).forEach(function (nodeId) {\n self.idToNodeMap.get(nodeId).displacementY = 0;\n });\n } else {\n this.idToNodeMap.get(component[j]).displacementY = 0;\n }\n }\n } else {\n var sum = 0;\n var count = 0;\n for (var j = 0; j < component.length; j++) {\n if (this.dummyToNodeForHorizontalAlignment.has(component[j])) {\n var actualNodes = this.dummyToNodeForHorizontalAlignment.get(component[j]);\n sum += actualNodes.length * this.idToNodeMap.get(actualNodes[0]).displacementY;\n count += actualNodes.length;\n } else {\n sum += this.idToNodeMap.get(component[j]).displacementY;\n count++;\n }\n }\n var averageDisplacement = sum / count;\n for (var j = 0; j < component.length; j++) {\n if (this.dummyToNodeForHorizontalAlignment.has(component[j])) {\n this.dummyToNodeForHorizontalAlignment.get(component[j]).forEach(function (nodeId) {\n self.idToNodeMap.get(nodeId).displacementY = averageDisplacement;\n });\n } else {\n this.idToNodeMap.get(component[j]).displacementY = averageDisplacement;\n }\n }\n }\n }\n }\n }\n};\n\nCoSELayout.prototype.calculateNodesToApplyGravitationTo = function () {\n var nodeList = [];\n var graph;\n\n var graphs = this.graphManager.getGraphs();\n var size = graphs.length;\n var i;\n for (i = 0; i < size; i++) {\n graph = graphs[i];\n\n graph.updateConnected();\n\n if (!graph.isConnected) {\n nodeList = nodeList.concat(graph.getNodes());\n }\n }\n\n return nodeList;\n};\n\nCoSELayout.prototype.createBendpoints = function () {\n var edges = [];\n edges = edges.concat(this.graphManager.getAllEdges());\n var visited = new Set();\n var i;\n for (i = 0; i < edges.length; i++) {\n var edge = edges[i];\n\n if (!visited.has(edge)) {\n var source = edge.getSource();\n var target = edge.getTarget();\n\n if (source == target) {\n edge.getBendpoints().push(new PointD());\n edge.getBendpoints().push(new PointD());\n this.createDummyNodesForBendpoints(edge);\n visited.add(edge);\n } else {\n var edgeList = [];\n\n edgeList = edgeList.concat(source.getEdgeListToNode(target));\n edgeList = edgeList.concat(target.getEdgeListToNode(source));\n\n if (!visited.has(edgeList[0])) {\n if (edgeList.length > 1) {\n var k;\n for (k = 0; k < edgeList.length; k++) {\n var multiEdge = edgeList[k];\n multiEdge.getBendpoints().push(new PointD());\n this.createDummyNodesForBendpoints(multiEdge);\n }\n }\n edgeList.forEach(function (edge) {\n visited.add(edge);\n });\n }\n }\n }\n\n if (visited.size == edges.length) {\n break;\n }\n }\n};\n\nCoSELayout.prototype.positionNodesRadially = function (forest) {\n // We tile the trees to a grid row by row; first tree starts at (0,0)\n var currentStartingPoint = new Point(0, 0);\n var numberOfColumns = Math.ceil(Math.sqrt(forest.length));\n var height = 0;\n var currentY = 0;\n var currentX = 0;\n var point = new PointD(0, 0);\n\n for (var i = 0; i < forest.length; i++) {\n if (i % numberOfColumns == 0) {\n // Start of a new row, make the x coordinate 0, increment the\n // y coordinate with the max height of the previous row\n currentX = 0;\n currentY = height;\n\n if (i != 0) {\n currentY += CoSEConstants.DEFAULT_COMPONENT_SEPERATION;\n }\n\n height = 0;\n }\n\n var tree = forest[i];\n\n // Find the center of the tree\n var centerNode = Layout.findCenterOfTree(tree);\n\n // Set the staring point of the next tree\n currentStartingPoint.x = currentX;\n currentStartingPoint.y = currentY;\n\n // Do a radial layout starting with the center\n point = CoSELayout.radialLayout(tree, centerNode, currentStartingPoint);\n\n if (point.y > height) {\n height = Math.floor(point.y);\n }\n\n currentX = Math.floor(point.x + CoSEConstants.DEFAULT_COMPONENT_SEPERATION);\n }\n\n this.transform(new PointD(LayoutConstants.WORLD_CENTER_X - point.x / 2, LayoutConstants.WORLD_CENTER_Y - point.y / 2));\n};\n\nCoSELayout.radialLayout = function (tree, centerNode, startingPoint) {\n var radialSep = Math.max(this.maxDiagonalInTree(tree), CoSEConstants.DEFAULT_RADIAL_SEPARATION);\n CoSELayout.branchRadialLayout(centerNode, null, 0, 359, 0, radialSep);\n var bounds = LGraph.calculateBounds(tree);\n\n var transform = new Transform();\n transform.setDeviceOrgX(bounds.getMinX());\n transform.setDeviceOrgY(bounds.getMinY());\n transform.setWorldOrgX(startingPoint.x);\n transform.setWorldOrgY(startingPoint.y);\n\n for (var i = 0; i < tree.length; i++) {\n var node = tree[i];\n node.transform(transform);\n }\n\n var bottomRight = new PointD(bounds.getMaxX(), bounds.getMaxY());\n\n return transform.inverseTransformPoint(bottomRight);\n};\n\nCoSELayout.branchRadialLayout = function (node, parentOfNode, startAngle, endAngle, distance, radialSeparation) {\n // First, position this node by finding its angle.\n var halfInterval = (endAngle - startAngle + 1) / 2;\n\n if (halfInterval < 0) {\n halfInterval += 180;\n }\n\n var nodeAngle = (halfInterval + startAngle) % 360;\n var teta = nodeAngle * IGeometry.TWO_PI / 360;\n\n // Make polar to java cordinate conversion.\n var cos_teta = Math.cos(teta);\n var x_ = distance * Math.cos(teta);\n var y_ = distance * Math.sin(teta);\n\n node.setCenter(x_, y_);\n\n // Traverse all neighbors of this node and recursively call this\n // function.\n var neighborEdges = [];\n neighborEdges = neighborEdges.concat(node.getEdges());\n var childCount = neighborEdges.length;\n\n if (parentOfNode != null) {\n childCount--;\n }\n\n var branchCount = 0;\n\n var incEdgesCount = neighborEdges.length;\n var startIndex;\n\n var edges = node.getEdgesBetween(parentOfNode);\n\n // If there are multiple edges, prune them until there remains only one\n // edge.\n while (edges.length > 1) {\n //neighborEdges.remove(edges.remove(0));\n var temp = edges[0];\n edges.splice(0, 1);\n var index = neighborEdges.indexOf(temp);\n if (index >= 0) {\n neighborEdges.splice(index, 1);\n }\n incEdgesCount--;\n childCount--;\n }\n\n if (parentOfNode != null) {\n //assert edges.length == 1;\n startIndex = (neighborEdges.indexOf(edges[0]) + 1) % incEdgesCount;\n } else {\n startIndex = 0;\n }\n\n var stepAngle = Math.abs(endAngle - startAngle) / childCount;\n\n for (var i = startIndex; branchCount != childCount; i = ++i % incEdgesCount) {\n var currentNeighbor = neighborEdges[i].getOtherEnd(node);\n\n // Don't back traverse to root node in current tree.\n if (currentNeighbor == parentOfNode) {\n continue;\n }\n\n var childStartAngle = (startAngle + branchCount * stepAngle) % 360;\n var childEndAngle = (childStartAngle + stepAngle) % 360;\n\n CoSELayout.branchRadialLayout(currentNeighbor, node, childStartAngle, childEndAngle, distance + radialSeparation, radialSeparation);\n\n branchCount++;\n }\n};\n\nCoSELayout.maxDiagonalInTree = function (tree) {\n var maxDiagonal = Integer.MIN_VALUE;\n\n for (var i = 0; i < tree.length; i++) {\n var node = tree[i];\n var diagonal = node.getDiagonal();\n\n if (diagonal > maxDiagonal) {\n maxDiagonal = diagonal;\n }\n }\n\n return maxDiagonal;\n};\n\nCoSELayout.prototype.calcRepulsionRange = function () {\n // formula is 2 x (level + 1) x idealEdgeLength\n return 2 * (this.level + 1) * this.idealEdgeLength;\n};\n\n// Tiling methods\n\n// Group zero degree members whose parents are not to be tiled, create dummy parents where needed and fill memberGroups by their dummp parent id's\nCoSELayout.prototype.groupZeroDegreeMembers = function () {\n var self = this;\n // array of [parent_id x oneDegreeNode_id]\n var tempMemberGroups = {}; // A temporary map of parent node and its zero degree members\n this.memberGroups = {}; // A map of dummy parent node and its zero degree members whose parents are not to be tiled\n this.idToDummyNode = {}; // A map of id to dummy node \n\n var zeroDegree = []; // List of zero degree nodes whose parents are not to be tiled\n var allNodes = this.graphManager.getAllNodes();\n\n // Fill zero degree list\n for (var i = 0; i < allNodes.length; i++) {\n var node = allNodes[i];\n var parent = node.getParent();\n // If a node has zero degree and its parent is not to be tiled if exists add that node to zeroDegres list\n if (this.getNodeDegreeWithChildren(node) === 0 && (parent.id == undefined || !this.getToBeTiled(parent))) {\n zeroDegree.push(node);\n }\n }\n\n // Create a map of parent node and its zero degree members\n for (var i = 0; i < zeroDegree.length; i++) {\n var node = zeroDegree[i]; // Zero degree node itself\n var p_id = node.getParent().id; // Parent id\n\n if (typeof tempMemberGroups[p_id] === \"undefined\") tempMemberGroups[p_id] = [];\n\n tempMemberGroups[p_id] = tempMemberGroups[p_id].concat(node); // Push node to the list belongs to its parent in tempMemberGroups\n }\n\n // If there are at least two nodes at a level, create a dummy compound for them\n Object.keys(tempMemberGroups).forEach(function (p_id) {\n if (tempMemberGroups[p_id].length > 1) {\n var dummyCompoundId = \"DummyCompound_\" + p_id; // The id of dummy compound which will be created soon\n self.memberGroups[dummyCompoundId] = tempMemberGroups[p_id]; // Add dummy compound to memberGroups\n\n var parent = tempMemberGroups[p_id][0].getParent(); // The parent of zero degree nodes will be the parent of new dummy compound\n\n // Create a dummy compound with calculated id\n var dummyCompound = new CoSENode(self.graphManager);\n dummyCompound.id = dummyCompoundId;\n dummyCompound.paddingLeft = parent.paddingLeft || 0;\n dummyCompound.paddingRight = parent.paddingRight || 0;\n dummyCompound.paddingBottom = parent.paddingBottom || 0;\n dummyCompound.paddingTop = parent.paddingTop || 0;\n\n self.idToDummyNode[dummyCompoundId] = dummyCompound;\n\n var dummyParentGraph = self.getGraphManager().add(self.newGraph(), dummyCompound);\n var parentGraph = parent.getChild();\n\n // Add dummy compound to parent the graph\n parentGraph.add(dummyCompound);\n\n // For each zero degree node in this level remove it from its parent graph and add it to the graph of dummy parent\n for (var i = 0; i < tempMemberGroups[p_id].length; i++) {\n var node = tempMemberGroups[p_id][i];\n\n parentGraph.remove(node);\n dummyParentGraph.add(node);\n }\n }\n });\n};\n\nCoSELayout.prototype.clearCompounds = function () {\n var childGraphMap = {};\n var idToNode = {};\n\n // Get compound ordering by finding the inner one first\n this.performDFSOnCompounds();\n\n for (var i = 0; i < this.compoundOrder.length; i++) {\n\n idToNode[this.compoundOrder[i].id] = this.compoundOrder[i];\n childGraphMap[this.compoundOrder[i].id] = [].concat(this.compoundOrder[i].getChild().getNodes());\n\n // Remove children of compounds\n this.graphManager.remove(this.compoundOrder[i].getChild());\n this.compoundOrder[i].child = null;\n }\n\n this.graphManager.resetAllNodes();\n\n // Tile the removed children\n this.tileCompoundMembers(childGraphMap, idToNode);\n};\n\nCoSELayout.prototype.clearZeroDegreeMembers = function () {\n var self = this;\n var tiledZeroDegreePack = this.tiledZeroDegreePack = [];\n\n Object.keys(this.memberGroups).forEach(function (id) {\n var compoundNode = self.idToDummyNode[id]; // Get the dummy compound\n\n tiledZeroDegreePack[id] = self.tileNodes(self.memberGroups[id], compoundNode.paddingLeft + compoundNode.paddingRight);\n\n // Set the width and height of the dummy compound as calculated\n compoundNode.rect.width = tiledZeroDegreePack[id].width;\n compoundNode.rect.height = tiledZeroDegreePack[id].height;\n compoundNode.setCenter(tiledZeroDegreePack[id].centerX, tiledZeroDegreePack[id].centerY);\n\n // compound left and top margings for labels\n // when node labels are included, these values may be set to different values below and are used in tilingPostLayout,\n // otherwise they stay as zero\n compoundNode.labelMarginLeft = 0;\n compoundNode.labelMarginTop = 0;\n\n // Update compound bounds considering its label properties and set label margins for left and top\n if (CoSEConstants.NODE_DIMENSIONS_INCLUDE_LABELS) {\n\n var width = compoundNode.rect.width;\n var height = compoundNode.rect.height;\n\n if (compoundNode.labelWidth) {\n if (compoundNode.labelPosHorizontal == \"left\") {\n compoundNode.rect.x -= compoundNode.labelWidth;\n compoundNode.setWidth(width + compoundNode.labelWidth);\n compoundNode.labelMarginLeft = compoundNode.labelWidth;\n } else if (compoundNode.labelPosHorizontal == \"center\" && compoundNode.labelWidth > width) {\n compoundNode.rect.x -= (compoundNode.labelWidth - width) / 2;\n compoundNode.setWidth(compoundNode.labelWidth);\n compoundNode.labelMarginLeft = (compoundNode.labelWidth - width) / 2;\n } else if (compoundNode.labelPosHorizontal == \"right\") {\n compoundNode.setWidth(width + compoundNode.labelWidth);\n }\n }\n\n if (compoundNode.labelHeight) {\n if (compoundNode.labelPosVertical == \"top\") {\n compoundNode.rect.y -= compoundNode.labelHeight;\n compoundNode.setHeight(height + compoundNode.labelHeight);\n compoundNode.labelMarginTop = compoundNode.labelHeight;\n } else if (compoundNode.labelPosVertical == \"center\" && compoundNode.labelHeight > height) {\n compoundNode.rect.y -= (compoundNode.labelHeight - height) / 2;\n compoundNode.setHeight(compoundNode.labelHeight);\n compoundNode.labelMarginTop = (compoundNode.labelHeight - height) / 2;\n } else if (compoundNode.labelPosVertical == \"bottom\") {\n compoundNode.setHeight(height + compoundNode.labelHeight);\n }\n }\n }\n });\n};\n\nCoSELayout.prototype.repopulateCompounds = function () {\n for (var i = this.compoundOrder.length - 1; i >= 0; i--) {\n var lCompoundNode = this.compoundOrder[i];\n var id = lCompoundNode.id;\n var horizontalMargin = lCompoundNode.paddingLeft;\n var verticalMargin = lCompoundNode.paddingTop;\n var labelMarginLeft = lCompoundNode.labelMarginLeft;\n var labelMarginTop = lCompoundNode.labelMarginTop;\n\n this.adjustLocations(this.tiledMemberPack[id], lCompoundNode.rect.x, lCompoundNode.rect.y, horizontalMargin, verticalMargin, labelMarginLeft, labelMarginTop);\n }\n};\n\nCoSELayout.prototype.repopulateZeroDegreeMembers = function () {\n var self = this;\n var tiledPack = this.tiledZeroDegreePack;\n\n Object.keys(tiledPack).forEach(function (id) {\n var compoundNode = self.idToDummyNode[id]; // Get the dummy compound by its id\n var horizontalMargin = compoundNode.paddingLeft;\n var verticalMargin = compoundNode.paddingTop;\n var labelMarginLeft = compoundNode.labelMarginLeft;\n var labelMarginTop = compoundNode.labelMarginTop;\n\n // Adjust the positions of nodes wrt its compound\n self.adjustLocations(tiledPack[id], compoundNode.rect.x, compoundNode.rect.y, horizontalMargin, verticalMargin, labelMarginLeft, labelMarginTop);\n });\n};\n\nCoSELayout.prototype.getToBeTiled = function (node) {\n var id = node.id;\n //firstly check the previous results\n if (this.toBeTiled[id] != null) {\n return this.toBeTiled[id];\n }\n\n //only compound nodes are to be tiled\n var childGraph = node.getChild();\n if (childGraph == null) {\n this.toBeTiled[id] = false;\n return false;\n }\n\n var children = childGraph.getNodes(); // Get the children nodes\n\n //a compound node is not to be tiled if all of its compound children are not to be tiled\n for (var i = 0; i < children.length; i++) {\n var theChild = children[i];\n\n if (this.getNodeDegree(theChild) > 0) {\n this.toBeTiled[id] = false;\n return false;\n }\n\n //pass the children not having the compound structure\n if (theChild.getChild() == null) {\n this.toBeTiled[theChild.id] = false;\n continue;\n }\n\n if (!this.getToBeTiled(theChild)) {\n this.toBeTiled[id] = false;\n return false;\n }\n }\n this.toBeTiled[id] = true;\n return true;\n};\n\n// Get degree of a node depending of its edges and independent of its children\nCoSELayout.prototype.getNodeDegree = function (node) {\n var id = node.id;\n var edges = node.getEdges();\n var degree = 0;\n\n // For the edges connected\n for (var i = 0; i < edges.length; i++) {\n var edge = edges[i];\n if (edge.getSource().id !== edge.getTarget().id) {\n degree = degree + 1;\n }\n }\n return degree;\n};\n\n// Get degree of a node with its children\nCoSELayout.prototype.getNodeDegreeWithChildren = function (node) {\n var degree = this.getNodeDegree(node);\n if (node.getChild() == null) {\n return degree;\n }\n var children = node.getChild().getNodes();\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n degree += this.getNodeDegreeWithChildren(child);\n }\n return degree;\n};\n\nCoSELayout.prototype.performDFSOnCompounds = function () {\n this.compoundOrder = [];\n this.fillCompexOrderByDFS(this.graphManager.getRoot().getNodes());\n};\n\nCoSELayout.prototype.fillCompexOrderByDFS = function (children) {\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n if (child.getChild() != null) {\n this.fillCompexOrderByDFS(child.getChild().getNodes());\n }\n if (this.getToBeTiled(child)) {\n this.compoundOrder.push(child);\n }\n }\n};\n\n/**\n* This method places each zero degree member wrt given (x,y) coordinates (top left).\n*/\nCoSELayout.prototype.adjustLocations = function (organization, x, y, compoundHorizontalMargin, compoundVerticalMargin, compoundLabelMarginLeft, compoundLabelMarginTop) {\n x += compoundHorizontalMargin + compoundLabelMarginLeft;\n y += compoundVerticalMargin + compoundLabelMarginTop;\n\n var left = x;\n\n for (var i = 0; i < organization.rows.length; i++) {\n var row = organization.rows[i];\n x = left;\n var maxHeight = 0;\n\n for (var j = 0; j < row.length; j++) {\n var lnode = row[j];\n\n lnode.rect.x = x; // + lnode.rect.width / 2;\n lnode.rect.y = y; // + lnode.rect.height / 2;\n\n x += lnode.rect.width + organization.horizontalPadding;\n\n if (lnode.rect.height > maxHeight) maxHeight = lnode.rect.height;\n }\n\n y += maxHeight + organization.verticalPadding;\n }\n};\n\nCoSELayout.prototype.tileCompoundMembers = function (childGraphMap, idToNode) {\n var self = this;\n this.tiledMemberPack = [];\n\n Object.keys(childGraphMap).forEach(function (id) {\n // Get the compound node\n var compoundNode = idToNode[id];\n\n self.tiledMemberPack[id] = self.tileNodes(childGraphMap[id], compoundNode.paddingLeft + compoundNode.paddingRight);\n\n compoundNode.rect.width = self.tiledMemberPack[id].width;\n compoundNode.rect.height = self.tiledMemberPack[id].height;\n compoundNode.setCenter(self.tiledMemberPack[id].centerX, self.tiledMemberPack[id].centerY);\n\n // compound left and top margings for labels\n // when node labels are included, these values may be set to different values below and are used in tilingPostLayout,\n // otherwise they stay as zero\n compoundNode.labelMarginLeft = 0;\n compoundNode.labelMarginTop = 0;\n\n // Update compound bounds considering its label properties and set label margins for left and top\n if (CoSEConstants.NODE_DIMENSIONS_INCLUDE_LABELS) {\n\n var width = compoundNode.rect.width;\n var height = compoundNode.rect.height;\n\n if (compoundNode.labelWidth) {\n if (compoundNode.labelPosHorizontal == \"left\") {\n compoundNode.rect.x -= compoundNode.labelWidth;\n compoundNode.setWidth(width + compoundNode.labelWidth);\n compoundNode.labelMarginLeft = compoundNode.labelWidth;\n } else if (compoundNode.labelPosHorizontal == \"center\" && compoundNode.labelWidth > width) {\n compoundNode.rect.x -= (compoundNode.labelWidth - width) / 2;\n compoundNode.setWidth(compoundNode.labelWidth);\n compoundNode.labelMarginLeft = (compoundNode.labelWidth - width) / 2;\n } else if (compoundNode.labelPosHorizontal == \"right\") {\n compoundNode.setWidth(width + compoundNode.labelWidth);\n }\n }\n\n if (compoundNode.labelHeight) {\n if (compoundNode.labelPosVertical == \"top\") {\n compoundNode.rect.y -= compoundNode.labelHeight;\n compoundNode.setHeight(height + compoundNode.labelHeight);\n compoundNode.labelMarginTop = compoundNode.labelHeight;\n } else if (compoundNode.labelPosVertical == \"center\" && compoundNode.labelHeight > height) {\n compoundNode.rect.y -= (compoundNode.labelHeight - height) / 2;\n compoundNode.setHeight(compoundNode.labelHeight);\n compoundNode.labelMarginTop = (compoundNode.labelHeight - height) / 2;\n } else if (compoundNode.labelPosVertical == \"bottom\") {\n compoundNode.setHeight(height + compoundNode.labelHeight);\n }\n }\n }\n });\n};\n\nCoSELayout.prototype.tileNodes = function (nodes, minWidth) {\n var horizontalOrg = this.tileNodesByFavoringDim(nodes, minWidth, true);\n var verticalOrg = this.tileNodesByFavoringDim(nodes, minWidth, false);\n\n var horizontalRatio = this.getOrgRatio(horizontalOrg);\n var verticalRatio = this.getOrgRatio(verticalOrg);\n var bestOrg;\n\n // the best ratio is the one that is closer to 1 since the ratios are already normalized\n // and the best organization is the one that has the best ratio\n if (verticalRatio < horizontalRatio) {\n bestOrg = verticalOrg;\n } else {\n bestOrg = horizontalOrg;\n }\n\n return bestOrg;\n};\n\n// get the width/height ratio of the organization that is normalized so that it will not be less than 1\nCoSELayout.prototype.getOrgRatio = function (organization) {\n // get dimensions and calculate the initial ratio\n var width = organization.width;\n var height = organization.height;\n var ratio = width / height;\n\n // if the initial ratio is less then 1 then inverse it\n if (ratio < 1) {\n ratio = 1 / ratio;\n }\n\n // return the normalized ratio\n return ratio;\n};\n\n/*\n * Calculates the ideal width for the rows. This method assumes that\n * each node has the same sizes and calculates the ideal row width that\n * approximates a square shaped complex accordingly. However, since nodes would\n * have different sizes some rows would have different sizes and the resulting\n * shape would not be an exact square.\n */\nCoSELayout.prototype.calcIdealRowWidth = function (members, favorHorizontalDim) {\n // To approximate a square shaped complex we need to make complex width equal to complex height.\n // To achieve this we need to solve the following equation system for hc:\n // (x + bx) * hc - bx = (y + by) * vc - by, hc * vc = n\n // where x is the avarage width of the nodes, y is the avarage height of nodes\n // bx and by are the buffer sizes in horizontal and vertical dimensions accordingly,\n // hc and vc are the number of rows in horizontal and vertical dimensions\n // n is number of members.\n\n var verticalPadding = CoSEConstants.TILING_PADDING_VERTICAL;\n var horizontalPadding = CoSEConstants.TILING_PADDING_HORIZONTAL;\n\n // number of members\n var membersSize = members.length;\n\n // sum of the width of all members\n var totalWidth = 0;\n\n // sum of the height of all members\n var totalHeight = 0;\n\n var maxWidth = 0;\n\n // traverse all members to calculate total width and total height and get the maximum members width\n members.forEach(function (node) {\n totalWidth += node.getWidth();\n totalHeight += node.getHeight();\n\n if (node.getWidth() > maxWidth) {\n maxWidth = node.getWidth();\n }\n });\n\n // average width of the members\n var averageWidth = totalWidth / membersSize;\n\n // average height of the members\n var averageHeight = totalHeight / membersSize;\n\n // solving the initial equation system for the hc yields the following second degree equation:\n // hc^2 * (x+bx) + hc * (by - bx) - n * (y + by) = 0\n\n // the delta value to solve the equation above for hc\n var delta = Math.pow(verticalPadding - horizontalPadding, 2) + 4 * (averageWidth + horizontalPadding) * (averageHeight + verticalPadding) * membersSize;\n\n // solve the equation using delta value to calculate the horizontal count\n // that represents the number of nodes in an ideal row\n var horizontalCountDouble = (horizontalPadding - verticalPadding + Math.sqrt(delta)) / (2 * (averageWidth + horizontalPadding));\n // round the calculated horizontal count up or down according to the favored dimension\n var horizontalCount;\n\n if (favorHorizontalDim) {\n horizontalCount = Math.ceil(horizontalCountDouble);\n // if horizontalCount count is not a float value then both of rounding to floor and ceil\n // will yield the same values. Instead of repeating the same calculation try going up\n // while favoring horizontal dimension in such cases\n if (horizontalCount == horizontalCountDouble) {\n horizontalCount++;\n }\n } else {\n horizontalCount = Math.floor(horizontalCountDouble);\n }\n\n // ideal width to be calculated\n var idealWidth = horizontalCount * (averageWidth + horizontalPadding) - horizontalPadding;\n\n // if max width is bigger than calculated ideal width reset ideal width to it\n if (maxWidth > idealWidth) {\n idealWidth = maxWidth;\n }\n\n // add the left-right margins to the ideal row width\n idealWidth += horizontalPadding * 2;\n\n // return the ideal row width1\n return idealWidth;\n};\n\nCoSELayout.prototype.tileNodesByFavoringDim = function (nodes, minWidth, favorHorizontalDim) {\n var verticalPadding = CoSEConstants.TILING_PADDING_VERTICAL;\n var horizontalPadding = CoSEConstants.TILING_PADDING_HORIZONTAL;\n var tilingCompareBy = CoSEConstants.TILING_COMPARE_BY;\n var organization = {\n rows: [],\n rowWidth: [],\n rowHeight: [],\n width: 0,\n height: minWidth, // assume minHeight equals to minWidth\n verticalPadding: verticalPadding,\n horizontalPadding: horizontalPadding,\n centerX: 0,\n centerY: 0\n };\n\n if (tilingCompareBy) {\n organization.idealRowWidth = this.calcIdealRowWidth(nodes, favorHorizontalDim);\n }\n\n var getNodeArea = function getNodeArea(n) {\n return n.rect.width * n.rect.height;\n };\n\n var areaCompareFcn = function areaCompareFcn(n1, n2) {\n return getNodeArea(n2) - getNodeArea(n1);\n };\n\n // Sort the nodes in descending order of their areas\n nodes.sort(function (n1, n2) {\n var cmpBy = areaCompareFcn;\n if (organization.idealRowWidth) {\n cmpBy = tilingCompareBy;\n return cmpBy(n1.id, n2.id);\n }\n return cmpBy(n1, n2);\n });\n\n // Create the organization -> calculate compound center\n var sumCenterX = 0;\n var sumCenterY = 0;\n for (var i = 0; i < nodes.length; i++) {\n var lNode = nodes[i];\n\n sumCenterX += lNode.getCenterX();\n sumCenterY += lNode.getCenterY();\n }\n\n organization.centerX = sumCenterX / nodes.length;\n organization.centerY = sumCenterY / nodes.length;\n\n // Create the organization -> tile members\n for (var i = 0; i < nodes.length; i++) {\n var lNode = nodes[i];\n\n if (organization.rows.length == 0) {\n this.insertNodeToRow(organization, lNode, 0, minWidth);\n } else if (this.canAddHorizontal(organization, lNode.rect.width, lNode.rect.height)) {\n var rowIndex = organization.rows.length - 1;\n if (!organization.idealRowWidth) {\n rowIndex = this.getShortestRowIndex(organization);\n }\n this.insertNodeToRow(organization, lNode, rowIndex, minWidth);\n } else {\n this.insertNodeToRow(organization, lNode, organization.rows.length, minWidth);\n }\n\n this.shiftToLastRow(organization);\n }\n\n return organization;\n};\n\nCoSELayout.prototype.insertNodeToRow = function (organization, node, rowIndex, minWidth) {\n var minCompoundSize = minWidth;\n\n // Add new row if needed\n if (rowIndex == organization.rows.length) {\n var secondDimension = [];\n\n organization.rows.push(secondDimension);\n organization.rowWidth.push(minCompoundSize);\n organization.rowHeight.push(0);\n }\n\n // Update row width\n var w = organization.rowWidth[rowIndex] + node.rect.width;\n\n if (organization.rows[rowIndex].length > 0) {\n w += organization.horizontalPadding;\n }\n\n organization.rowWidth[rowIndex] = w;\n // Update compound width\n if (organization.width < w) {\n organization.width = w;\n }\n\n // Update height\n var h = node.rect.height;\n if (rowIndex > 0) h += organization.verticalPadding;\n\n var extraHeight = 0;\n if (h > organization.rowHeight[rowIndex]) {\n extraHeight = organization.rowHeight[rowIndex];\n organization.rowHeight[rowIndex] = h;\n extraHeight = organization.rowHeight[rowIndex] - extraHeight;\n }\n\n organization.height += extraHeight;\n\n // Insert node\n organization.rows[rowIndex].push(node);\n};\n\n//Scans the rows of an organization and returns the one with the min width\nCoSELayout.prototype.getShortestRowIndex = function (organization) {\n var r = -1;\n var min = Number.MAX_VALUE;\n\n for (var i = 0; i < organization.rows.length; i++) {\n if (organization.rowWidth[i] < min) {\n r = i;\n min = organization.rowWidth[i];\n }\n }\n return r;\n};\n\n//Scans the rows of an organization and returns the one with the max width\nCoSELayout.prototype.getLongestRowIndex = function (organization) {\n var r = -1;\n var max = Number.MIN_VALUE;\n\n for (var i = 0; i < organization.rows.length; i++) {\n\n if (organization.rowWidth[i] > max) {\n r = i;\n max = organization.rowWidth[i];\n }\n }\n\n return r;\n};\n\n/**\n* This method checks whether adding extra width to the organization violates\n* the aspect ratio(1) or not.\n*/\nCoSELayout.prototype.canAddHorizontal = function (organization, extraWidth, extraHeight) {\n\n // if there is an ideal row width specified use it instead of checking the aspect ratio\n if (organization.idealRowWidth) {\n var lastRowIndex = organization.rows.length - 1;\n var lastRowWidth = organization.rowWidth[lastRowIndex];\n\n // check and return if ideal row width will be exceed if the node is added to the row\n return lastRowWidth + extraWidth + organization.horizontalPadding <= organization.idealRowWidth;\n }\n\n var sri = this.getShortestRowIndex(organization);\n\n if (sri < 0) {\n return true;\n }\n\n var min = organization.rowWidth[sri];\n\n if (min + organization.horizontalPadding + extraWidth <= organization.width) return true;\n\n var hDiff = 0;\n\n // Adding to an existing row\n if (organization.rowHeight[sri] < extraHeight) {\n if (sri > 0) hDiff = extraHeight + organization.verticalPadding - organization.rowHeight[sri];\n }\n\n var add_to_row_ratio;\n if (organization.width - min >= extraWidth + organization.horizontalPadding) {\n add_to_row_ratio = (organization.height + hDiff) / (min + extraWidth + organization.horizontalPadding);\n } else {\n add_to_row_ratio = (organization.height + hDiff) / organization.width;\n }\n\n // Adding a new row for this node\n hDiff = extraHeight + organization.verticalPadding;\n var add_new_row_ratio;\n if (organization.width < extraWidth) {\n add_new_row_ratio = (organization.height + hDiff) / extraWidth;\n } else {\n add_new_row_ratio = (organization.height + hDiff) / organization.width;\n }\n\n if (add_new_row_ratio < 1) add_new_row_ratio = 1 / add_new_row_ratio;\n\n if (add_to_row_ratio < 1) add_to_row_ratio = 1 / add_to_row_ratio;\n\n return add_to_row_ratio < add_new_row_ratio;\n};\n\n//If moving the last node from the longest row and adding it to the last\n//row makes the bounding box smaller, do it.\nCoSELayout.prototype.shiftToLastRow = function (organization) {\n var longest = this.getLongestRowIndex(organization);\n var last = organization.rowWidth.length - 1;\n var row = organization.rows[longest];\n var node = row[row.length - 1];\n\n var diff = node.width + organization.horizontalPadding;\n\n // Check if there is enough space on the last row\n if (organization.width - organization.rowWidth[last] > diff && longest != last) {\n // Remove the last element of the longest row\n row.splice(-1, 1);\n\n // Push it to the last row\n organization.rows[last].push(node);\n\n organization.rowWidth[longest] = organization.rowWidth[longest] - diff;\n organization.rowWidth[last] = organization.rowWidth[last] + diff;\n organization.width = organization.rowWidth[instance.getLongestRowIndex(organization)];\n\n // Update heights of the organization\n var maxHeight = Number.MIN_VALUE;\n for (var i = 0; i < row.length; i++) {\n if (row[i].height > maxHeight) maxHeight = row[i].height;\n }\n if (longest > 0) maxHeight += organization.verticalPadding;\n\n var prevTotal = organization.rowHeight[longest] + organization.rowHeight[last];\n\n organization.rowHeight[longest] = maxHeight;\n if (organization.rowHeight[last] < node.height + organization.verticalPadding) organization.rowHeight[last] = node.height + organization.verticalPadding;\n\n var finalTotal = organization.rowHeight[longest] + organization.rowHeight[last];\n organization.height += finalTotal - prevTotal;\n\n this.shiftToLastRow(organization);\n }\n};\n\nCoSELayout.prototype.tilingPreLayout = function () {\n if (CoSEConstants.TILE) {\n // Find zero degree nodes and create a compound for each level\n this.groupZeroDegreeMembers();\n // Tile and clear children of each compound\n this.clearCompounds();\n // Separately tile and clear zero degree nodes for each level\n this.clearZeroDegreeMembers();\n }\n};\n\nCoSELayout.prototype.tilingPostLayout = function () {\n if (CoSEConstants.TILE) {\n this.repopulateZeroDegreeMembers();\n this.repopulateCompounds();\n }\n};\n\n// -----------------------------------------------------------------------------\n// Section: Tree Reduction methods\n// -----------------------------------------------------------------------------\n// Reduce trees \nCoSELayout.prototype.reduceTrees = function () {\n var prunedNodesAll = [];\n var containsLeaf = true;\n var node;\n\n while (containsLeaf) {\n var allNodes = this.graphManager.getAllNodes();\n var prunedNodesInStepTemp = [];\n containsLeaf = false;\n\n for (var i = 0; i < allNodes.length; i++) {\n node = allNodes[i];\n if (node.getEdges().length == 1 && !node.getEdges()[0].isInterGraph && node.getChild() == null) {\n if (CoSEConstants.PURE_INCREMENTAL) {\n var otherEnd = node.getEdges()[0].getOtherEnd(node);\n var relativePosition = new DimensionD(node.getCenterX() - otherEnd.getCenterX(), node.getCenterY() - otherEnd.getCenterY());\n prunedNodesInStepTemp.push([node, node.getEdges()[0], node.getOwner(), relativePosition]);\n } else {\n prunedNodesInStepTemp.push([node, node.getEdges()[0], node.getOwner()]);\n }\n containsLeaf = true;\n }\n }\n if (containsLeaf == true) {\n var prunedNodesInStep = [];\n for (var j = 0; j < prunedNodesInStepTemp.length; j++) {\n if (prunedNodesInStepTemp[j][0].getEdges().length == 1) {\n prunedNodesInStep.push(prunedNodesInStepTemp[j]);\n prunedNodesInStepTemp[j][0].getOwner().remove(prunedNodesInStepTemp[j][0]);\n }\n }\n prunedNodesAll.push(prunedNodesInStep);\n this.graphManager.resetAllNodes();\n this.graphManager.resetAllEdges();\n }\n }\n this.prunedNodesAll = prunedNodesAll;\n};\n\n// Grow tree one step \nCoSELayout.prototype.growTree = function (prunedNodesAll) {\n var lengthOfPrunedNodesInStep = prunedNodesAll.length;\n var prunedNodesInStep = prunedNodesAll[lengthOfPrunedNodesInStep - 1];\n\n var nodeData;\n for (var i = 0; i < prunedNodesInStep.length; i++) {\n nodeData = prunedNodesInStep[i];\n\n this.findPlaceforPrunedNode(nodeData);\n\n nodeData[2].add(nodeData[0]);\n nodeData[2].add(nodeData[1], nodeData[1].source, nodeData[1].target);\n }\n\n prunedNodesAll.splice(prunedNodesAll.length - 1, 1);\n this.graphManager.resetAllNodes();\n this.graphManager.resetAllEdges();\n};\n\n// Find an appropriate position to replace pruned node, this method can be improved\nCoSELayout.prototype.findPlaceforPrunedNode = function (nodeData) {\n\n var gridForPrunedNode;\n var nodeToConnect;\n var prunedNode = nodeData[0];\n if (prunedNode == nodeData[1].source) {\n nodeToConnect = nodeData[1].target;\n } else {\n nodeToConnect = nodeData[1].source;\n }\n\n if (CoSEConstants.PURE_INCREMENTAL) {\n prunedNode.setCenter(nodeToConnect.getCenterX() + nodeData[3].getWidth(), nodeToConnect.getCenterY() + nodeData[3].getHeight());\n } else {\n var startGridX = nodeToConnect.startX;\n var finishGridX = nodeToConnect.finishX;\n var startGridY = nodeToConnect.startY;\n var finishGridY = nodeToConnect.finishY;\n\n var upNodeCount = 0;\n var downNodeCount = 0;\n var rightNodeCount = 0;\n var leftNodeCount = 0;\n var controlRegions = [upNodeCount, rightNodeCount, downNodeCount, leftNodeCount];\n\n if (startGridY > 0) {\n for (var i = startGridX; i <= finishGridX; i++) {\n controlRegions[0] += this.grid[i][startGridY - 1].length + this.grid[i][startGridY].length - 1;\n }\n }\n if (finishGridX < this.grid.length - 1) {\n for (var i = startGridY; i <= finishGridY; i++) {\n controlRegions[1] += this.grid[finishGridX + 1][i].length + this.grid[finishGridX][i].length - 1;\n }\n }\n if (finishGridY < this.grid[0].length - 1) {\n for (var i = startGridX; i <= finishGridX; i++) {\n controlRegions[2] += this.grid[i][finishGridY + 1].length + this.grid[i][finishGridY].length - 1;\n }\n }\n if (startGridX > 0) {\n for (var i = startGridY; i <= finishGridY; i++) {\n controlRegions[3] += this.grid[startGridX - 1][i].length + this.grid[startGridX][i].length - 1;\n }\n }\n var min = Integer.MAX_VALUE;\n var minCount;\n var minIndex;\n for (var j = 0; j < controlRegions.length; j++) {\n if (controlRegions[j] < min) {\n min = controlRegions[j];\n minCount = 1;\n minIndex = j;\n } else if (controlRegions[j] == min) {\n minCount++;\n }\n }\n\n if (minCount == 3 && min == 0) {\n if (controlRegions[0] == 0 && controlRegions[1] == 0 && controlRegions[2] == 0) {\n gridForPrunedNode = 1;\n } else if (controlRegions[0] == 0 && controlRegions[1] == 0 && controlRegions[3] == 0) {\n gridForPrunedNode = 0;\n } else if (controlRegions[0] == 0 && controlRegions[2] == 0 && controlRegions[3] == 0) {\n gridForPrunedNode = 3;\n } else if (controlRegions[1] == 0 && controlRegions[2] == 0 && controlRegions[3] == 0) {\n gridForPrunedNode = 2;\n }\n } else if (minCount == 2 && min == 0) {\n var random = Math.floor(Math.random() * 2);\n if (controlRegions[0] == 0 && controlRegions[1] == 0) {\n ;\n if (random == 0) {\n gridForPrunedNode = 0;\n } else {\n gridForPrunedNode = 1;\n }\n } else if (controlRegions[0] == 0 && controlRegions[2] == 0) {\n if (random == 0) {\n gridForPrunedNode = 0;\n } else {\n gridForPrunedNode = 2;\n }\n } else if (controlRegions[0] == 0 && controlRegions[3] == 0) {\n if (random == 0) {\n gridForPrunedNode = 0;\n } else {\n gridForPrunedNode = 3;\n }\n } else if (controlRegions[1] == 0 && controlRegions[2] == 0) {\n if (random == 0) {\n gridForPrunedNode = 1;\n } else {\n gridForPrunedNode = 2;\n }\n } else if (controlRegions[1] == 0 && controlRegions[3] == 0) {\n if (random == 0) {\n gridForPrunedNode = 1;\n } else {\n gridForPrunedNode = 3;\n }\n } else {\n if (random == 0) {\n gridForPrunedNode = 2;\n } else {\n gridForPrunedNode = 3;\n }\n }\n } else if (minCount == 4 && min == 0) {\n var random = Math.floor(Math.random() * 4);\n gridForPrunedNode = random;\n } else {\n gridForPrunedNode = minIndex;\n }\n\n if (gridForPrunedNode == 0) {\n prunedNode.setCenter(nodeToConnect.getCenterX(), nodeToConnect.getCenterY() - nodeToConnect.getHeight() / 2 - FDLayoutConstants.DEFAULT_EDGE_LENGTH - prunedNode.getHeight() / 2);\n } else if (gridForPrunedNode == 1) {\n prunedNode.setCenter(nodeToConnect.getCenterX() + nodeToConnect.getWidth() / 2 + FDLayoutConstants.DEFAULT_EDGE_LENGTH + prunedNode.getWidth() / 2, nodeToConnect.getCenterY());\n } else if (gridForPrunedNode == 2) {\n prunedNode.setCenter(nodeToConnect.getCenterX(), nodeToConnect.getCenterY() + nodeToConnect.getHeight() / 2 + FDLayoutConstants.DEFAULT_EDGE_LENGTH + prunedNode.getHeight() / 2);\n } else {\n prunedNode.setCenter(nodeToConnect.getCenterX() - nodeToConnect.getWidth() / 2 - FDLayoutConstants.DEFAULT_EDGE_LENGTH - prunedNode.getWidth() / 2, nodeToConnect.getCenterY());\n }\n }\n};\n\nmodule.exports = CoSELayout;\n\n/***/ }),\n\n/***/ 991:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nvar FDLayoutNode = __webpack_require__(551).FDLayoutNode;\nvar IMath = __webpack_require__(551).IMath;\n\nfunction CoSENode(gm, loc, size, vNode) {\n FDLayoutNode.call(this, gm, loc, size, vNode);\n}\n\nCoSENode.prototype = Object.create(FDLayoutNode.prototype);\nfor (var prop in FDLayoutNode) {\n CoSENode[prop] = FDLayoutNode[prop];\n}\n\nCoSENode.prototype.calculateDisplacement = function () {\n var layout = this.graphManager.getLayout();\n // this check is for compound nodes that contain fixed nodes\n if (this.getChild() != null && this.fixedNodeWeight) {\n this.displacementX += layout.coolingFactor * (this.springForceX + this.repulsionForceX + this.gravitationForceX) / this.fixedNodeWeight;\n this.displacementY += layout.coolingFactor * (this.springForceY + this.repulsionForceY + this.gravitationForceY) / this.fixedNodeWeight;\n } else {\n this.displacementX += layout.coolingFactor * (this.springForceX + this.repulsionForceX + this.gravitationForceX) / this.noOfChildren;\n this.displacementY += layout.coolingFactor * (this.springForceY + this.repulsionForceY + this.gravitationForceY) / this.noOfChildren;\n }\n\n if (Math.abs(this.displacementX) > layout.coolingFactor * layout.maxNodeDisplacement) {\n this.displacementX = layout.coolingFactor * layout.maxNodeDisplacement * IMath.sign(this.displacementX);\n }\n\n if (Math.abs(this.displacementY) > layout.coolingFactor * layout.maxNodeDisplacement) {\n this.displacementY = layout.coolingFactor * layout.maxNodeDisplacement * IMath.sign(this.displacementY);\n }\n\n // non-empty compound node, propogate movement to children as well\n if (this.child && this.child.getNodes().length > 0) {\n this.propogateDisplacementToChildren(this.displacementX, this.displacementY);\n }\n};\n\nCoSENode.prototype.propogateDisplacementToChildren = function (dX, dY) {\n var nodes = this.getChild().getNodes();\n var node;\n for (var i = 0; i < nodes.length; i++) {\n node = nodes[i];\n if (node.getChild() == null) {\n node.displacementX += dX;\n node.displacementY += dY;\n } else {\n node.propogateDisplacementToChildren(dX, dY);\n }\n }\n};\n\nCoSENode.prototype.move = function () {\n var layout = this.graphManager.getLayout();\n\n // a simple node or an empty compound node, move it\n if (this.child == null || this.child.getNodes().length == 0) {\n this.moveBy(this.displacementX, this.displacementY);\n\n layout.totalDisplacement += Math.abs(this.displacementX) + Math.abs(this.displacementY);\n }\n\n this.springForceX = 0;\n this.springForceY = 0;\n this.repulsionForceX = 0;\n this.repulsionForceY = 0;\n this.gravitationForceX = 0;\n this.gravitationForceY = 0;\n this.displacementX = 0;\n this.displacementY = 0;\n};\n\nCoSENode.prototype.setPred1 = function (pred1) {\n this.pred1 = pred1;\n};\n\nCoSENode.prototype.getPred1 = function () {\n return pred1;\n};\n\nCoSENode.prototype.getPred2 = function () {\n return pred2;\n};\n\nCoSENode.prototype.setNext = function (next) {\n this.next = next;\n};\n\nCoSENode.prototype.getNext = function () {\n return next;\n};\n\nCoSENode.prototype.setProcessed = function (processed) {\n this.processed = processed;\n};\n\nCoSENode.prototype.isProcessed = function () {\n return processed;\n};\n\nmodule.exports = CoSENode;\n\n/***/ }),\n\n/***/ 902:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar CoSEConstants = __webpack_require__(806);\nvar LinkedList = __webpack_require__(551).LinkedList;\nvar Matrix = __webpack_require__(551).Matrix;\nvar SVD = __webpack_require__(551).SVD;\n\nfunction ConstraintHandler() {}\n\nConstraintHandler.handleConstraints = function (layout) {\n // let layout = this.graphManager.getLayout();\n\n // get constraints from layout\n var constraints = {};\n constraints.fixedNodeConstraint = layout.constraints.fixedNodeConstraint;\n constraints.alignmentConstraint = layout.constraints.alignmentConstraint;\n constraints.relativePlacementConstraint = layout.constraints.relativePlacementConstraint;\n\n var idToNodeMap = new Map();\n var nodeIndexes = new Map();\n var xCoords = [];\n var yCoords = [];\n\n var allNodes = layout.getAllNodes();\n var index = 0;\n // fill index map and coordinates\n for (var i = 0; i < allNodes.length; i++) {\n var node = allNodes[i];\n if (node.getChild() == null) {\n nodeIndexes.set(node.id, index++);\n xCoords.push(node.getCenterX());\n yCoords.push(node.getCenterY());\n idToNodeMap.set(node.id, node);\n }\n }\n\n // if there exists relative placement constraint without gap value, set it to default \n if (constraints.relativePlacementConstraint) {\n constraints.relativePlacementConstraint.forEach(function (constraint) {\n if (!constraint.gap && constraint.gap != 0) {\n if (constraint.left) {\n constraint.gap = CoSEConstants.DEFAULT_EDGE_LENGTH + idToNodeMap.get(constraint.left).getWidth() / 2 + idToNodeMap.get(constraint.right).getWidth() / 2;\n } else {\n constraint.gap = CoSEConstants.DEFAULT_EDGE_LENGTH + idToNodeMap.get(constraint.top).getHeight() / 2 + idToNodeMap.get(constraint.bottom).getHeight() / 2;\n }\n }\n });\n }\n\n /* auxiliary functions */\n\n // calculate difference between two position objects\n var calculatePositionDiff = function calculatePositionDiff(pos1, pos2) {\n return { x: pos1.x - pos2.x, y: pos1.y - pos2.y };\n };\n\n // calculate average position of the nodes\n var calculateAvgPosition = function calculateAvgPosition(nodeIdSet) {\n var xPosSum = 0;\n var yPosSum = 0;\n nodeIdSet.forEach(function (nodeId) {\n xPosSum += xCoords[nodeIndexes.get(nodeId)];\n yPosSum += yCoords[nodeIndexes.get(nodeId)];\n });\n\n return { x: xPosSum / nodeIdSet.size, y: yPosSum / nodeIdSet.size };\n };\n\n // find an appropriate positioning for the nodes in a given graph according to relative placement constraints\n // this function also takes the fixed nodes and alignment constraints into account\n // graph: dag to be evaluated, direction: \"horizontal\" or \"vertical\", \n // fixedNodes: set of fixed nodes to consider during evaluation, dummyPositions: appropriate coordinates of the dummy nodes \n var findAppropriatePositionForRelativePlacement = function findAppropriatePositionForRelativePlacement(graph, direction, fixedNodes, dummyPositions, componentSources) {\n\n // find union of two sets\n function setUnion(setA, setB) {\n var union = new Set(setA);\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = setB[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var elem = _step.value;\n\n union.add(elem);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return union;\n }\n\n // find indegree count for each node\n var inDegrees = new Map();\n\n graph.forEach(function (value, key) {\n inDegrees.set(key, 0);\n });\n graph.forEach(function (value, key) {\n value.forEach(function (adjacent) {\n inDegrees.set(adjacent.id, inDegrees.get(adjacent.id) + 1);\n });\n });\n\n var positionMap = new Map(); // keeps the position for each node\n var pastMap = new Map(); // keeps the predecessors(past) of a node\n var queue = new LinkedList();\n inDegrees.forEach(function (value, key) {\n if (value == 0) {\n queue.push(key);\n if (!fixedNodes) {\n if (direction == \"horizontal\") {\n positionMap.set(key, nodeIndexes.has(key) ? xCoords[nodeIndexes.get(key)] : dummyPositions.get(key));\n } else {\n positionMap.set(key, nodeIndexes.has(key) ? yCoords[nodeIndexes.get(key)] : dummyPositions.get(key));\n }\n }\n } else {\n positionMap.set(key, Number.NEGATIVE_INFINITY);\n }\n if (fixedNodes) {\n pastMap.set(key, new Set([key]));\n }\n });\n\n // align sources of each component in enforcement phase\n if (fixedNodes) {\n componentSources.forEach(function (component) {\n var fixedIds = [];\n component.forEach(function (nodeId) {\n if (fixedNodes.has(nodeId)) {\n fixedIds.push(nodeId);\n }\n });\n if (fixedIds.length > 0) {\n var position = 0;\n fixedIds.forEach(function (fixedId) {\n if (direction == \"horizontal\") {\n positionMap.set(fixedId, nodeIndexes.has(fixedId) ? xCoords[nodeIndexes.get(fixedId)] : dummyPositions.get(fixedId));\n position += positionMap.get(fixedId);\n } else {\n positionMap.set(fixedId, nodeIndexes.has(fixedId) ? yCoords[nodeIndexes.get(fixedId)] : dummyPositions.get(fixedId));\n position += positionMap.get(fixedId);\n }\n });\n position = position / fixedIds.length;\n component.forEach(function (nodeId) {\n if (!fixedNodes.has(nodeId)) {\n positionMap.set(nodeId, position);\n }\n });\n } else {\n var _position = 0;\n component.forEach(function (nodeId) {\n if (direction == \"horizontal\") {\n _position += nodeIndexes.has(nodeId) ? xCoords[nodeIndexes.get(nodeId)] : dummyPositions.get(nodeId);\n } else {\n _position += nodeIndexes.has(nodeId) ? yCoords[nodeIndexes.get(nodeId)] : dummyPositions.get(nodeId);\n }\n });\n _position = _position / component.length;\n component.forEach(function (nodeId) {\n positionMap.set(nodeId, _position);\n });\n }\n });\n }\n\n // calculate positions of the nodes\n\n var _loop = function _loop() {\n var currentNode = queue.shift();\n var neighbors = graph.get(currentNode);\n neighbors.forEach(function (neighbor) {\n if (positionMap.get(neighbor.id) < positionMap.get(currentNode) + neighbor.gap) {\n if (fixedNodes && fixedNodes.has(neighbor.id)) {\n var fixedPosition = void 0;\n if (direction == \"horizontal\") {\n fixedPosition = nodeIndexes.has(neighbor.id) ? xCoords[nodeIndexes.get(neighbor.id)] : dummyPositions.get(neighbor.id);\n } else {\n fixedPosition = nodeIndexes.has(neighbor.id) ? yCoords[nodeIndexes.get(neighbor.id)] : dummyPositions.get(neighbor.id);\n }\n positionMap.set(neighbor.id, fixedPosition); // TODO: may do unnecessary work\n if (fixedPosition < positionMap.get(currentNode) + neighbor.gap) {\n var diff = positionMap.get(currentNode) + neighbor.gap - fixedPosition;\n pastMap.get(currentNode).forEach(function (nodeId) {\n positionMap.set(nodeId, positionMap.get(nodeId) - diff);\n });\n }\n } else {\n positionMap.set(neighbor.id, positionMap.get(currentNode) + neighbor.gap);\n }\n }\n inDegrees.set(neighbor.id, inDegrees.get(neighbor.id) - 1);\n if (inDegrees.get(neighbor.id) == 0) {\n queue.push(neighbor.id);\n }\n if (fixedNodes) {\n pastMap.set(neighbor.id, setUnion(pastMap.get(currentNode), pastMap.get(neighbor.id)));\n }\n });\n };\n\n while (queue.length != 0) {\n _loop();\n }\n\n // readjust position of the nodes after enforcement\n if (fixedNodes) {\n // find indegree count for each node\n var sinkNodes = new Set();\n\n graph.forEach(function (value, key) {\n if (value.length == 0) {\n sinkNodes.add(key);\n }\n });\n\n var _components = [];\n pastMap.forEach(function (value, key) {\n if (sinkNodes.has(key)) {\n var isFixedComponent = false;\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = value[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var nodeId = _step2.value;\n\n if (fixedNodes.has(nodeId)) {\n isFixedComponent = true;\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n if (!isFixedComponent) {\n var isExist = false;\n var existAt = void 0;\n _components.forEach(function (component, index) {\n if (component.has([].concat(_toConsumableArray(value))[0])) {\n isExist = true;\n existAt = index;\n }\n });\n if (!isExist) {\n _components.push(new Set(value));\n } else {\n value.forEach(function (ele) {\n _components[existAt].add(ele);\n });\n }\n }\n }\n });\n\n _components.forEach(function (component, index) {\n var minBefore = Number.POSITIVE_INFINITY;\n var minAfter = Number.POSITIVE_INFINITY;\n var maxBefore = Number.NEGATIVE_INFINITY;\n var maxAfter = Number.NEGATIVE_INFINITY;\n\n var _iteratorNormalCompletion3 = true;\n var _didIteratorError3 = false;\n var _iteratorError3 = undefined;\n\n try {\n for (var _iterator3 = component[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n var nodeId = _step3.value;\n\n var posBefore = void 0;\n if (direction == \"horizontal\") {\n posBefore = nodeIndexes.has(nodeId) ? xCoords[nodeIndexes.get(nodeId)] : dummyPositions.get(nodeId);\n } else {\n posBefore = nodeIndexes.has(nodeId) ? yCoords[nodeIndexes.get(nodeId)] : dummyPositions.get(nodeId);\n }\n var posAfter = positionMap.get(nodeId);\n if (posBefore < minBefore) {\n minBefore = posBefore;\n }\n if (posBefore > maxBefore) {\n maxBefore = posBefore;\n }\n if (posAfter < minAfter) {\n minAfter = posAfter;\n }\n if (posAfter > maxAfter) {\n maxAfter = posAfter;\n }\n }\n } catch (err) {\n _didIteratorError3 = true;\n _iteratorError3 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion3 && _iterator3.return) {\n _iterator3.return();\n }\n } finally {\n if (_didIteratorError3) {\n throw _iteratorError3;\n }\n }\n }\n\n var diff = (minBefore + maxBefore) / 2 - (minAfter + maxAfter) / 2;\n\n var _iteratorNormalCompletion4 = true;\n var _didIteratorError4 = false;\n var _iteratorError4 = undefined;\n\n try {\n for (var _iterator4 = component[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n var _nodeId = _step4.value;\n\n positionMap.set(_nodeId, positionMap.get(_nodeId) + diff);\n }\n } catch (err) {\n _didIteratorError4 = true;\n _iteratorError4 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion4 && _iterator4.return) {\n _iterator4.return();\n }\n } finally {\n if (_didIteratorError4) {\n throw _iteratorError4;\n }\n }\n }\n });\n }\n\n return positionMap;\n };\n\n // find transformation based on rel. placement constraints if there are both alignment and rel. placement constraints\n // or if there are only rel. placement contraints where the largest component isn't sufficiently large\n var applyReflectionForRelativePlacement = function applyReflectionForRelativePlacement(relativePlacementConstraints) {\n // variables to count votes\n var reflectOnY = 0,\n notReflectOnY = 0;\n var reflectOnX = 0,\n notReflectOnX = 0;\n\n relativePlacementConstraints.forEach(function (constraint) {\n if (constraint.left) {\n xCoords[nodeIndexes.get(constraint.left)] - xCoords[nodeIndexes.get(constraint.right)] >= 0 ? reflectOnY++ : notReflectOnY++;\n } else {\n yCoords[nodeIndexes.get(constraint.top)] - yCoords[nodeIndexes.get(constraint.bottom)] >= 0 ? reflectOnX++ : notReflectOnX++;\n }\n });\n\n if (reflectOnY > notReflectOnY && reflectOnX > notReflectOnX) {\n for (var _i = 0; _i < nodeIndexes.size; _i++) {\n xCoords[_i] = -1 * xCoords[_i];\n yCoords[_i] = -1 * yCoords[_i];\n }\n } else if (reflectOnY > notReflectOnY) {\n for (var _i2 = 0; _i2 < nodeIndexes.size; _i2++) {\n xCoords[_i2] = -1 * xCoords[_i2];\n }\n } else if (reflectOnX > notReflectOnX) {\n for (var _i3 = 0; _i3 < nodeIndexes.size; _i3++) {\n yCoords[_i3] = -1 * yCoords[_i3];\n }\n }\n };\n\n // find weakly connected components in undirected graph\n var findComponents = function findComponents(graph) {\n // find weakly connected components in dag\n var components = [];\n var queue = new LinkedList();\n var visited = new Set();\n var count = 0;\n\n graph.forEach(function (value, key) {\n if (!visited.has(key)) {\n components[count] = [];\n var _currentNode = key;\n queue.push(_currentNode);\n visited.add(_currentNode);\n components[count].push(_currentNode);\n\n while (queue.length != 0) {\n _currentNode = queue.shift();\n var neighbors = graph.get(_currentNode);\n neighbors.forEach(function (neighbor) {\n if (!visited.has(neighbor.id)) {\n queue.push(neighbor.id);\n visited.add(neighbor.id);\n components[count].push(neighbor.id);\n }\n });\n }\n count++;\n }\n });\n return components;\n };\n\n // return undirected version of given dag\n var dagToUndirected = function dagToUndirected(dag) {\n var undirected = new Map();\n\n dag.forEach(function (value, key) {\n undirected.set(key, []);\n });\n\n dag.forEach(function (value, key) {\n value.forEach(function (adjacent) {\n undirected.get(key).push(adjacent);\n undirected.get(adjacent.id).push({ id: key, gap: adjacent.gap, direction: adjacent.direction });\n });\n });\n\n return undirected;\n };\n\n // return reversed (directions inverted) version of given dag\n var dagToReversed = function dagToReversed(dag) {\n var reversed = new Map();\n\n dag.forEach(function (value, key) {\n reversed.set(key, []);\n });\n\n dag.forEach(function (value, key) {\n value.forEach(function (adjacent) {\n reversed.get(adjacent.id).push({ id: key, gap: adjacent.gap, direction: adjacent.direction });\n });\n });\n\n return reversed;\n };\n\n /**** apply transformation to the initial draft layout to better align with constrained nodes ****/\n // solve the Orthogonal Procrustean Problem to rotate and/or reflect initial draft layout\n // here we follow the solution in Chapter 20.2 of Borg, I. & Groenen, P. (2005) Modern Multidimensional Scaling: Theory and Applications \n\n /* construct source and target configurations */\n\n var targetMatrix = []; // A - target configuration\n var sourceMatrix = []; // B - source configuration \n var standardTransformation = false; // false for no transformation, true for standart (Procrustes) transformation (rotation and/or reflection)\n var reflectionType = false; // false/true for reflection check, 'reflectOnX', 'reflectOnY' or 'reflectOnBoth' for reflection type if necessary\n var fixedNodes = new Set();\n var dag = new Map(); // adjacency list to keep directed acyclic graph (dag) that consists of relative placement constraints\n var dagUndirected = new Map(); // undirected version of the dag\n var components = []; // weakly connected components\n\n // fill fixedNodes collection to use later\n if (constraints.fixedNodeConstraint) {\n constraints.fixedNodeConstraint.forEach(function (nodeData) {\n fixedNodes.add(nodeData.nodeId);\n });\n }\n\n // construct dag from relative placement constraints \n if (constraints.relativePlacementConstraint) {\n // construct both directed and undirected version of the dag\n constraints.relativePlacementConstraint.forEach(function (constraint) {\n if (constraint.left) {\n if (dag.has(constraint.left)) {\n dag.get(constraint.left).push({ id: constraint.right, gap: constraint.gap, direction: \"horizontal\" });\n } else {\n dag.set(constraint.left, [{ id: constraint.right, gap: constraint.gap, direction: \"horizontal\" }]);\n }\n if (!dag.has(constraint.right)) {\n dag.set(constraint.right, []);\n }\n } else {\n if (dag.has(constraint.top)) {\n dag.get(constraint.top).push({ id: constraint.bottom, gap: constraint.gap, direction: \"vertical\" });\n } else {\n dag.set(constraint.top, [{ id: constraint.bottom, gap: constraint.gap, direction: \"vertical\" }]);\n }\n if (!dag.has(constraint.bottom)) {\n dag.set(constraint.bottom, []);\n }\n }\n });\n\n dagUndirected = dagToUndirected(dag);\n components = findComponents(dagUndirected);\n }\n\n if (CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING) {\n // first check fixed node constraint\n if (constraints.fixedNodeConstraint && constraints.fixedNodeConstraint.length > 1) {\n constraints.fixedNodeConstraint.forEach(function (nodeData, i) {\n targetMatrix[i] = [nodeData.position.x, nodeData.position.y];\n sourceMatrix[i] = [xCoords[nodeIndexes.get(nodeData.nodeId)], yCoords[nodeIndexes.get(nodeData.nodeId)]];\n });\n standardTransformation = true;\n } else if (constraints.alignmentConstraint) {\n (function () {\n // then check alignment constraint\n var count = 0;\n if (constraints.alignmentConstraint.vertical) {\n var verticalAlign = constraints.alignmentConstraint.vertical;\n\n var _loop2 = function _loop2(_i4) {\n var alignmentSet = new Set();\n verticalAlign[_i4].forEach(function (nodeId) {\n alignmentSet.add(nodeId);\n });\n var intersection = new Set([].concat(_toConsumableArray(alignmentSet)).filter(function (x) {\n return fixedNodes.has(x);\n }));\n var xPos = void 0;\n if (intersection.size > 0) xPos = xCoords[nodeIndexes.get(intersection.values().next().value)];else xPos = calculateAvgPosition(alignmentSet).x;\n\n verticalAlign[_i4].forEach(function (nodeId) {\n targetMatrix[count] = [xPos, yCoords[nodeIndexes.get(nodeId)]];\n sourceMatrix[count] = [xCoords[nodeIndexes.get(nodeId)], yCoords[nodeIndexes.get(nodeId)]];\n count++;\n });\n };\n\n for (var _i4 = 0; _i4 < verticalAlign.length; _i4++) {\n _loop2(_i4);\n }\n standardTransformation = true;\n }\n if (constraints.alignmentConstraint.horizontal) {\n var horizontalAlign = constraints.alignmentConstraint.horizontal;\n\n var _loop3 = function _loop3(_i5) {\n var alignmentSet = new Set();\n horizontalAlign[_i5].forEach(function (nodeId) {\n alignmentSet.add(nodeId);\n });\n var intersection = new Set([].concat(_toConsumableArray(alignmentSet)).filter(function (x) {\n return fixedNodes.has(x);\n }));\n var yPos = void 0;\n if (intersection.size > 0) yPos = xCoords[nodeIndexes.get(intersection.values().next().value)];else yPos = calculateAvgPosition(alignmentSet).y;\n\n horizontalAlign[_i5].forEach(function (nodeId) {\n targetMatrix[count] = [xCoords[nodeIndexes.get(nodeId)], yPos];\n sourceMatrix[count] = [xCoords[nodeIndexes.get(nodeId)], yCoords[nodeIndexes.get(nodeId)]];\n count++;\n });\n };\n\n for (var _i5 = 0; _i5 < horizontalAlign.length; _i5++) {\n _loop3(_i5);\n }\n standardTransformation = true;\n }\n if (constraints.relativePlacementConstraint) {\n reflectionType = true;\n }\n })();\n } else if (constraints.relativePlacementConstraint) {\n // finally check relative placement constraint\n // find largest component in dag\n var largestComponentSize = 0;\n var largestComponentIndex = 0;\n for (var _i6 = 0; _i6 < components.length; _i6++) {\n if (components[_i6].length > largestComponentSize) {\n largestComponentSize = components[_i6].length;\n largestComponentIndex = _i6;\n }\n }\n // if largest component isn't dominant, then take the votes for reflection\n if (largestComponentSize < dagUndirected.size / 2) {\n applyReflectionForRelativePlacement(constraints.relativePlacementConstraint);\n standardTransformation = false;\n reflectionType = false;\n } else {\n // use largest component for transformation\n // construct horizontal and vertical subgraphs in the largest component\n var subGraphOnHorizontal = new Map();\n var subGraphOnVertical = new Map();\n var constraintsInlargestComponent = [];\n\n components[largestComponentIndex].forEach(function (nodeId) {\n dag.get(nodeId).forEach(function (adjacent) {\n if (adjacent.direction == \"horizontal\") {\n if (subGraphOnHorizontal.has(nodeId)) {\n subGraphOnHorizontal.get(nodeId).push(adjacent);\n } else {\n subGraphOnHorizontal.set(nodeId, [adjacent]);\n }\n if (!subGraphOnHorizontal.has(adjacent.id)) {\n subGraphOnHorizontal.set(adjacent.id, []);\n }\n constraintsInlargestComponent.push({ left: nodeId, right: adjacent.id });\n } else {\n if (subGraphOnVertical.has(nodeId)) {\n subGraphOnVertical.get(nodeId).push(adjacent);\n } else {\n subGraphOnVertical.set(nodeId, [adjacent]);\n }\n if (!subGraphOnVertical.has(adjacent.id)) {\n subGraphOnVertical.set(adjacent.id, []);\n }\n constraintsInlargestComponent.push({ top: nodeId, bottom: adjacent.id });\n }\n });\n });\n\n applyReflectionForRelativePlacement(constraintsInlargestComponent);\n reflectionType = false;\n\n // calculate appropriate positioning for subgraphs\n var positionMapHorizontal = findAppropriatePositionForRelativePlacement(subGraphOnHorizontal, \"horizontal\");\n var positionMapVertical = findAppropriatePositionForRelativePlacement(subGraphOnVertical, \"vertical\");\n\n // construct source and target configuration\n components[largestComponentIndex].forEach(function (nodeId, i) {\n sourceMatrix[i] = [xCoords[nodeIndexes.get(nodeId)], yCoords[nodeIndexes.get(nodeId)]];\n targetMatrix[i] = [];\n if (positionMapHorizontal.has(nodeId)) {\n targetMatrix[i][0] = positionMapHorizontal.get(nodeId);\n } else {\n targetMatrix[i][0] = xCoords[nodeIndexes.get(nodeId)];\n }\n if (positionMapVertical.has(nodeId)) {\n targetMatrix[i][1] = positionMapVertical.get(nodeId);\n } else {\n targetMatrix[i][1] = yCoords[nodeIndexes.get(nodeId)];\n }\n });\n\n standardTransformation = true;\n }\n }\n\n // if transformation is required, then calculate and apply transformation matrix\n if (standardTransformation) {\n /* calculate transformation matrix */\n var transformationMatrix = void 0;\n var targetMatrixTranspose = Matrix.transpose(targetMatrix); // A'\n var sourceMatrixTranspose = Matrix.transpose(sourceMatrix); // B'\n\n // centralize transpose matrices\n for (var _i7 = 0; _i7 < targetMatrixTranspose.length; _i7++) {\n targetMatrixTranspose[_i7] = Matrix.multGamma(targetMatrixTranspose[_i7]);\n sourceMatrixTranspose[_i7] = Matrix.multGamma(sourceMatrixTranspose[_i7]);\n }\n\n // do actual calculation for transformation matrix\n var tempMatrix = Matrix.multMat(targetMatrixTranspose, Matrix.transpose(sourceMatrixTranspose)); // tempMatrix = A'B\n var SVDResult = SVD.svd(tempMatrix); // SVD(A'B) = USV', svd function returns U, S and V \n transformationMatrix = Matrix.multMat(SVDResult.V, Matrix.transpose(SVDResult.U)); // transformationMatrix = T = VU'\n\n /* apply found transformation matrix to obtain final draft layout */\n for (var _i8 = 0; _i8 < nodeIndexes.size; _i8++) {\n var temp1 = [xCoords[_i8], yCoords[_i8]];\n var temp2 = [transformationMatrix[0][0], transformationMatrix[1][0]];\n var temp3 = [transformationMatrix[0][1], transformationMatrix[1][1]];\n xCoords[_i8] = Matrix.dotProduct(temp1, temp2);\n yCoords[_i8] = Matrix.dotProduct(temp1, temp3);\n }\n\n // applied only both alignment and rel. placement constraints exist\n if (reflectionType) {\n applyReflectionForRelativePlacement(constraints.relativePlacementConstraint);\n }\n }\n }\n\n if (CoSEConstants.ENFORCE_CONSTRAINTS) {\n /**** enforce constraints on the transformed draft layout ****/\n\n /* first enforce fixed node constraint */\n\n if (constraints.fixedNodeConstraint && constraints.fixedNodeConstraint.length > 0) {\n var translationAmount = { x: 0, y: 0 };\n constraints.fixedNodeConstraint.forEach(function (nodeData, i) {\n var posInTheory = { x: xCoords[nodeIndexes.get(nodeData.nodeId)], y: yCoords[nodeIndexes.get(nodeData.nodeId)] };\n var posDesired = nodeData.position;\n var posDiff = calculatePositionDiff(posDesired, posInTheory);\n translationAmount.x += posDiff.x;\n translationAmount.y += posDiff.y;\n });\n translationAmount.x /= constraints.fixedNodeConstraint.length;\n translationAmount.y /= constraints.fixedNodeConstraint.length;\n\n xCoords.forEach(function (value, i) {\n xCoords[i] += translationAmount.x;\n });\n\n yCoords.forEach(function (value, i) {\n yCoords[i] += translationAmount.y;\n });\n\n constraints.fixedNodeConstraint.forEach(function (nodeData) {\n xCoords[nodeIndexes.get(nodeData.nodeId)] = nodeData.position.x;\n yCoords[nodeIndexes.get(nodeData.nodeId)] = nodeData.position.y;\n });\n }\n\n /* then enforce alignment constraint */\n\n if (constraints.alignmentConstraint) {\n if (constraints.alignmentConstraint.vertical) {\n var xAlign = constraints.alignmentConstraint.vertical;\n\n var _loop4 = function _loop4(_i9) {\n var alignmentSet = new Set();\n xAlign[_i9].forEach(function (nodeId) {\n alignmentSet.add(nodeId);\n });\n var intersection = new Set([].concat(_toConsumableArray(alignmentSet)).filter(function (x) {\n return fixedNodes.has(x);\n }));\n var xPos = void 0;\n if (intersection.size > 0) xPos = xCoords[nodeIndexes.get(intersection.values().next().value)];else xPos = calculateAvgPosition(alignmentSet).x;\n\n alignmentSet.forEach(function (nodeId) {\n if (!fixedNodes.has(nodeId)) xCoords[nodeIndexes.get(nodeId)] = xPos;\n });\n };\n\n for (var _i9 = 0; _i9 < xAlign.length; _i9++) {\n _loop4(_i9);\n }\n }\n if (constraints.alignmentConstraint.horizontal) {\n var yAlign = constraints.alignmentConstraint.horizontal;\n\n var _loop5 = function _loop5(_i10) {\n var alignmentSet = new Set();\n yAlign[_i10].forEach(function (nodeId) {\n alignmentSet.add(nodeId);\n });\n var intersection = new Set([].concat(_toConsumableArray(alignmentSet)).filter(function (x) {\n return fixedNodes.has(x);\n }));\n var yPos = void 0;\n if (intersection.size > 0) yPos = yCoords[nodeIndexes.get(intersection.values().next().value)];else yPos = calculateAvgPosition(alignmentSet).y;\n\n alignmentSet.forEach(function (nodeId) {\n if (!fixedNodes.has(nodeId)) yCoords[nodeIndexes.get(nodeId)] = yPos;\n });\n };\n\n for (var _i10 = 0; _i10 < yAlign.length; _i10++) {\n _loop5(_i10);\n }\n }\n }\n\n /* finally enforce relative placement constraint */\n\n if (constraints.relativePlacementConstraint) {\n (function () {\n var nodeToDummyForVerticalAlignment = new Map();\n var nodeToDummyForHorizontalAlignment = new Map();\n var dummyToNodeForVerticalAlignment = new Map();\n var dummyToNodeForHorizontalAlignment = new Map();\n var dummyPositionsForVerticalAlignment = new Map();\n var dummyPositionsForHorizontalAlignment = new Map();\n var fixedNodesOnHorizontal = new Set();\n var fixedNodesOnVertical = new Set();\n\n // fill maps and sets \n fixedNodes.forEach(function (nodeId) {\n fixedNodesOnHorizontal.add(nodeId);\n fixedNodesOnVertical.add(nodeId);\n });\n\n if (constraints.alignmentConstraint) {\n if (constraints.alignmentConstraint.vertical) {\n var verticalAlignment = constraints.alignmentConstraint.vertical;\n\n var _loop6 = function _loop6(_i11) {\n dummyToNodeForVerticalAlignment.set(\"dummy\" + _i11, []);\n verticalAlignment[_i11].forEach(function (nodeId) {\n nodeToDummyForVerticalAlignment.set(nodeId, \"dummy\" + _i11);\n dummyToNodeForVerticalAlignment.get(\"dummy\" + _i11).push(nodeId);\n if (fixedNodes.has(nodeId)) {\n fixedNodesOnHorizontal.add(\"dummy\" + _i11);\n }\n });\n dummyPositionsForVerticalAlignment.set(\"dummy\" + _i11, xCoords[nodeIndexes.get(verticalAlignment[_i11][0])]);\n };\n\n for (var _i11 = 0; _i11 < verticalAlignment.length; _i11++) {\n _loop6(_i11);\n }\n }\n if (constraints.alignmentConstraint.horizontal) {\n var horizontalAlignment = constraints.alignmentConstraint.horizontal;\n\n var _loop7 = function _loop7(_i12) {\n dummyToNodeForHorizontalAlignment.set(\"dummy\" + _i12, []);\n horizontalAlignment[_i12].forEach(function (nodeId) {\n nodeToDummyForHorizontalAlignment.set(nodeId, \"dummy\" + _i12);\n dummyToNodeForHorizontalAlignment.get(\"dummy\" + _i12).push(nodeId);\n if (fixedNodes.has(nodeId)) {\n fixedNodesOnVertical.add(\"dummy\" + _i12);\n }\n });\n dummyPositionsForHorizontalAlignment.set(\"dummy\" + _i12, yCoords[nodeIndexes.get(horizontalAlignment[_i12][0])]);\n };\n\n for (var _i12 = 0; _i12 < horizontalAlignment.length; _i12++) {\n _loop7(_i12);\n }\n }\n }\n\n // construct horizontal and vertical dags (subgraphs) from overall dag\n var dagOnHorizontal = new Map();\n var dagOnVertical = new Map();\n\n var _loop8 = function _loop8(nodeId) {\n dag.get(nodeId).forEach(function (adjacent) {\n var sourceId = void 0;\n var targetNode = void 0;\n if (adjacent[\"direction\"] == \"horizontal\") {\n sourceId = nodeToDummyForVerticalAlignment.get(nodeId) ? nodeToDummyForVerticalAlignment.get(nodeId) : nodeId;\n if (nodeToDummyForVerticalAlignment.get(adjacent.id)) {\n targetNode = { id: nodeToDummyForVerticalAlignment.get(adjacent.id), gap: adjacent.gap, direction: adjacent.direction };\n } else {\n targetNode = adjacent;\n }\n if (dagOnHorizontal.has(sourceId)) {\n dagOnHorizontal.get(sourceId).push(targetNode);\n } else {\n dagOnHorizontal.set(sourceId, [targetNode]);\n }\n if (!dagOnHorizontal.has(targetNode.id)) {\n dagOnHorizontal.set(targetNode.id, []);\n }\n } else {\n sourceId = nodeToDummyForHorizontalAlignment.get(nodeId) ? nodeToDummyForHorizontalAlignment.get(nodeId) : nodeId;\n if (nodeToDummyForHorizontalAlignment.get(adjacent.id)) {\n targetNode = { id: nodeToDummyForHorizontalAlignment.get(adjacent.id), gap: adjacent.gap, direction: adjacent.direction };\n } else {\n targetNode = adjacent;\n }\n if (dagOnVertical.has(sourceId)) {\n dagOnVertical.get(sourceId).push(targetNode);\n } else {\n dagOnVertical.set(sourceId, [targetNode]);\n }\n if (!dagOnVertical.has(targetNode.id)) {\n dagOnVertical.set(targetNode.id, []);\n }\n }\n });\n };\n\n var _iteratorNormalCompletion5 = true;\n var _didIteratorError5 = false;\n var _iteratorError5 = undefined;\n\n try {\n for (var _iterator5 = dag.keys()[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {\n var nodeId = _step5.value;\n\n _loop8(nodeId);\n }\n\n // find source nodes of each component in horizontal and vertical dags\n } catch (err) {\n _didIteratorError5 = true;\n _iteratorError5 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion5 && _iterator5.return) {\n _iterator5.return();\n }\n } finally {\n if (_didIteratorError5) {\n throw _iteratorError5;\n }\n }\n }\n\n var undirectedOnHorizontal = dagToUndirected(dagOnHorizontal);\n var undirectedOnVertical = dagToUndirected(dagOnVertical);\n var componentsOnHorizontal = findComponents(undirectedOnHorizontal);\n var componentsOnVertical = findComponents(undirectedOnVertical);\n var reversedDagOnHorizontal = dagToReversed(dagOnHorizontal);\n var reversedDagOnVertical = dagToReversed(dagOnVertical);\n var componentSourcesOnHorizontal = [];\n var componentSourcesOnVertical = [];\n\n componentsOnHorizontal.forEach(function (component, index) {\n componentSourcesOnHorizontal[index] = [];\n component.forEach(function (nodeId) {\n if (reversedDagOnHorizontal.get(nodeId).length == 0) {\n componentSourcesOnHorizontal[index].push(nodeId);\n }\n });\n });\n\n componentsOnVertical.forEach(function (component, index) {\n componentSourcesOnVertical[index] = [];\n component.forEach(function (nodeId) {\n if (reversedDagOnVertical.get(nodeId).length == 0) {\n componentSourcesOnVertical[index].push(nodeId);\n }\n });\n });\n\n // calculate appropriate positioning for subgraphs\n var positionMapHorizontal = findAppropriatePositionForRelativePlacement(dagOnHorizontal, \"horizontal\", fixedNodesOnHorizontal, dummyPositionsForVerticalAlignment, componentSourcesOnHorizontal);\n var positionMapVertical = findAppropriatePositionForRelativePlacement(dagOnVertical, \"vertical\", fixedNodesOnVertical, dummyPositionsForHorizontalAlignment, componentSourcesOnVertical);\n\n // update positions of the nodes based on relative placement constraints\n\n var _loop9 = function _loop9(key) {\n if (dummyToNodeForVerticalAlignment.get(key)) {\n dummyToNodeForVerticalAlignment.get(key).forEach(function (nodeId) {\n xCoords[nodeIndexes.get(nodeId)] = positionMapHorizontal.get(key);\n });\n } else {\n xCoords[nodeIndexes.get(key)] = positionMapHorizontal.get(key);\n }\n };\n\n var _iteratorNormalCompletion6 = true;\n var _didIteratorError6 = false;\n var _iteratorError6 = undefined;\n\n try {\n for (var _iterator6 = positionMapHorizontal.keys()[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {\n var key = _step6.value;\n\n _loop9(key);\n }\n } catch (err) {\n _didIteratorError6 = true;\n _iteratorError6 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion6 && _iterator6.return) {\n _iterator6.return();\n }\n } finally {\n if (_didIteratorError6) {\n throw _iteratorError6;\n }\n }\n }\n\n var _loop10 = function _loop10(key) {\n if (dummyToNodeForHorizontalAlignment.get(key)) {\n dummyToNodeForHorizontalAlignment.get(key).forEach(function (nodeId) {\n yCoords[nodeIndexes.get(nodeId)] = positionMapVertical.get(key);\n });\n } else {\n yCoords[nodeIndexes.get(key)] = positionMapVertical.get(key);\n }\n };\n\n var _iteratorNormalCompletion7 = true;\n var _didIteratorError7 = false;\n var _iteratorError7 = undefined;\n\n try {\n for (var _iterator7 = positionMapVertical.keys()[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {\n var key = _step7.value;\n\n _loop10(key);\n }\n } catch (err) {\n _didIteratorError7 = true;\n _iteratorError7 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion7 && _iterator7.return) {\n _iterator7.return();\n }\n } finally {\n if (_didIteratorError7) {\n throw _iteratorError7;\n }\n }\n }\n })();\n }\n }\n\n // assign new coordinates to nodes after constraint handling\n for (var _i13 = 0; _i13 < allNodes.length; _i13++) {\n var _node = allNodes[_i13];\n if (_node.getChild() == null) {\n _node.setCenter(xCoords[nodeIndexes.get(_node.id)], yCoords[nodeIndexes.get(_node.id)]);\n }\n }\n};\n\nmodule.exports = ConstraintHandler;\n\n/***/ }),\n\n/***/ 551:\n/***/ ((module) => {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__551__;\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \t// This entry module is referenced by other modules so it can't be inlined\n/******/ \tvar __webpack_exports__ = __webpack_require__(45);\n/******/ \t\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});", "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"cose-base\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"cose-base\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cytoscapeFcose\"] = factory(require(\"cose-base\"));\n\telse\n\t\troot[\"cytoscapeFcose\"] = factory(root[\"coseBase\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE__140__) {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 658:\n/***/ ((module) => {\n\n\n\n// Simple, internal Object.assign() polyfill for options objects etc.\n\nmodule.exports = Object.assign != null ? Object.assign.bind(Object) : function (tgt) {\n for (var _len = arguments.length, srcs = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n srcs[_key - 1] = arguments[_key];\n }\n\n srcs.forEach(function (src) {\n Object.keys(src).forEach(function (k) {\n return tgt[k] = src[k];\n });\n });\n\n return tgt;\n};\n\n/***/ }),\n\n/***/ 548:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n/*\n * Auxiliary functions\n */\n\nvar LinkedList = __webpack_require__(140).layoutBase.LinkedList;\n\nvar auxiliary = {};\n\n// get the top most nodes\nauxiliary.getTopMostNodes = function (nodes) {\n var nodesMap = {};\n for (var i = 0; i < nodes.length; i++) {\n nodesMap[nodes[i].id()] = true;\n }\n var roots = nodes.filter(function (ele, i) {\n if (typeof ele === \"number\") {\n ele = i;\n }\n var parent = ele.parent()[0];\n while (parent != null) {\n if (nodesMap[parent.id()]) {\n return false;\n }\n parent = parent.parent()[0];\n }\n return true;\n });\n\n return roots;\n};\n\n// find disconnected components and create dummy nodes that connect them\nauxiliary.connectComponents = function (cy, eles, topMostNodes, dummyNodes) {\n var queue = new LinkedList();\n var visited = new Set();\n var visitedTopMostNodes = [];\n var currentNeighbor = void 0;\n var minDegreeNode = void 0;\n var minDegree = void 0;\n\n var isConnected = false;\n var count = 1;\n var nodesConnectedToDummy = [];\n var components = [];\n\n var _loop = function _loop() {\n var cmpt = cy.collection();\n components.push(cmpt);\n\n var currentNode = topMostNodes[0];\n var childrenOfCurrentNode = cy.collection();\n childrenOfCurrentNode.merge(currentNode).merge(currentNode.descendants().intersection(eles));\n visitedTopMostNodes.push(currentNode);\n\n childrenOfCurrentNode.forEach(function (node) {\n queue.push(node);\n visited.add(node);\n cmpt.merge(node);\n });\n\n var _loop2 = function _loop2() {\n currentNode = queue.shift();\n\n // Traverse all neighbors of this node\n var neighborNodes = cy.collection();\n currentNode.neighborhood().nodes().forEach(function (node) {\n if (eles.intersection(currentNode.edgesWith(node)).length > 0) {\n neighborNodes.merge(node);\n }\n });\n\n for (var i = 0; i < neighborNodes.length; i++) {\n var neighborNode = neighborNodes[i];\n currentNeighbor = topMostNodes.intersection(neighborNode.union(neighborNode.ancestors()));\n if (currentNeighbor != null && !visited.has(currentNeighbor[0])) {\n var childrenOfNeighbor = currentNeighbor.union(currentNeighbor.descendants());\n\n childrenOfNeighbor.forEach(function (node) {\n queue.push(node);\n visited.add(node);\n cmpt.merge(node);\n if (topMostNodes.has(node)) {\n visitedTopMostNodes.push(node);\n }\n });\n }\n }\n };\n\n while (queue.length != 0) {\n _loop2();\n }\n\n cmpt.forEach(function (node) {\n eles.intersection(node.connectedEdges()).forEach(function (e) {\n // connectedEdges() usually cached\n if (cmpt.has(e.source()) && cmpt.has(e.target())) {\n // has() is cheap\n cmpt.merge(e);\n }\n });\n });\n\n if (visitedTopMostNodes.length == topMostNodes.length) {\n isConnected = true;\n }\n\n if (!isConnected || isConnected && count > 1) {\n minDegreeNode = visitedTopMostNodes[0];\n minDegree = minDegreeNode.connectedEdges().length;\n visitedTopMostNodes.forEach(function (node) {\n if (node.connectedEdges().length < minDegree) {\n minDegree = node.connectedEdges().length;\n minDegreeNode = node;\n }\n });\n nodesConnectedToDummy.push(minDegreeNode.id());\n // TO DO: Check efficiency of this part\n var temp = cy.collection();\n temp.merge(visitedTopMostNodes[0]);\n visitedTopMostNodes.forEach(function (node) {\n temp.merge(node);\n });\n visitedTopMostNodes = [];\n topMostNodes = topMostNodes.difference(temp);\n count++;\n }\n };\n\n do {\n _loop();\n } while (!isConnected);\n\n if (dummyNodes) {\n if (nodesConnectedToDummy.length > 0) {\n dummyNodes.set('dummy' + (dummyNodes.size + 1), nodesConnectedToDummy);\n }\n }\n return components;\n};\n\n// relocates componentResult to originalCenter if there is no fixedNodeConstraint\nauxiliary.relocateComponent = function (originalCenter, componentResult, options) {\n if (!options.fixedNodeConstraint) {\n var minXCoord = Number.POSITIVE_INFINITY;\n var maxXCoord = Number.NEGATIVE_INFINITY;\n var minYCoord = Number.POSITIVE_INFINITY;\n var maxYCoord = Number.NEGATIVE_INFINITY;\n if (options.quality == \"draft\") {\n // calculate current bounding box\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = componentResult.nodeIndexes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var _ref = _step.value;\n\n var _ref2 = _slicedToArray(_ref, 2);\n\n var key = _ref2[0];\n var value = _ref2[1];\n\n var cyNode = options.cy.getElementById(key);\n if (cyNode) {\n var nodeBB = cyNode.boundingBox();\n var leftX = componentResult.xCoords[value] - nodeBB.w / 2;\n var rightX = componentResult.xCoords[value] + nodeBB.w / 2;\n var topY = componentResult.yCoords[value] - nodeBB.h / 2;\n var bottomY = componentResult.yCoords[value] + nodeBB.h / 2;\n\n if (leftX < minXCoord) minXCoord = leftX;\n if (rightX > maxXCoord) maxXCoord = rightX;\n if (topY < minYCoord) minYCoord = topY;\n if (bottomY > maxYCoord) maxYCoord = bottomY;\n }\n }\n // find difference between current and original center\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n var diffOnX = originalCenter.x - (maxXCoord + minXCoord) / 2;\n var diffOnY = originalCenter.y - (maxYCoord + minYCoord) / 2;\n // move component to original center\n componentResult.xCoords = componentResult.xCoords.map(function (x) {\n return x + diffOnX;\n });\n componentResult.yCoords = componentResult.yCoords.map(function (y) {\n return y + diffOnY;\n });\n } else {\n // calculate current bounding box\n Object.keys(componentResult).forEach(function (item) {\n var node = componentResult[item];\n var leftX = node.getRect().x;\n var rightX = node.getRect().x + node.getRect().width;\n var topY = node.getRect().y;\n var bottomY = node.getRect().y + node.getRect().height;\n\n if (leftX < minXCoord) minXCoord = leftX;\n if (rightX > maxXCoord) maxXCoord = rightX;\n if (topY < minYCoord) minYCoord = topY;\n if (bottomY > maxYCoord) maxYCoord = bottomY;\n });\n // find difference between current and original center\n var _diffOnX = originalCenter.x - (maxXCoord + minXCoord) / 2;\n var _diffOnY = originalCenter.y - (maxYCoord + minYCoord) / 2;\n // move component to original center\n Object.keys(componentResult).forEach(function (item) {\n var node = componentResult[item];\n node.setCenter(node.getCenterX() + _diffOnX, node.getCenterY() + _diffOnY);\n });\n }\n }\n};\n\nauxiliary.calcBoundingBox = function (parentNode, xCoords, yCoords, nodeIndexes) {\n // calculate bounds\n var left = Number.MAX_SAFE_INTEGER;\n var right = Number.MIN_SAFE_INTEGER;\n var top = Number.MAX_SAFE_INTEGER;\n var bottom = Number.MIN_SAFE_INTEGER;\n var nodeLeft = void 0;\n var nodeRight = void 0;\n var nodeTop = void 0;\n var nodeBottom = void 0;\n\n var nodes = parentNode.descendants().not(\":parent\");\n var s = nodes.length;\n for (var i = 0; i < s; i++) {\n var node = nodes[i];\n\n nodeLeft = xCoords[nodeIndexes.get(node.id())] - node.width() / 2;\n nodeRight = xCoords[nodeIndexes.get(node.id())] + node.width() / 2;\n nodeTop = yCoords[nodeIndexes.get(node.id())] - node.height() / 2;\n nodeBottom = yCoords[nodeIndexes.get(node.id())] + node.height() / 2;\n\n if (left > nodeLeft) {\n left = nodeLeft;\n }\n\n if (right < nodeRight) {\n right = nodeRight;\n }\n\n if (top > nodeTop) {\n top = nodeTop;\n }\n\n if (bottom < nodeBottom) {\n bottom = nodeBottom;\n }\n }\n\n var boundingBox = {};\n boundingBox.topLeftX = left;\n boundingBox.topLeftY = top;\n boundingBox.width = right - left;\n boundingBox.height = bottom - top;\n return boundingBox;\n};\n\n// This function finds and returns parent nodes whose all children are hidden\nauxiliary.calcParentsWithoutChildren = function (cy, eles) {\n var parentsWithoutChildren = cy.collection();\n eles.nodes(':parent').forEach(function (parent) {\n var check = false;\n parent.children().forEach(function (child) {\n if (child.css('display') != 'none') {\n check = true;\n }\n });\n if (!check) {\n parentsWithoutChildren.merge(parent);\n }\n });\n\n return parentsWithoutChildren;\n};\n\nmodule.exports = auxiliary;\n\n/***/ }),\n\n/***/ 816:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\n/**\n The implementation of the postprocessing part that applies CoSE layout over the spectral layout\n*/\n\nvar aux = __webpack_require__(548);\nvar CoSELayout = __webpack_require__(140).CoSELayout;\nvar CoSENode = __webpack_require__(140).CoSENode;\nvar PointD = __webpack_require__(140).layoutBase.PointD;\nvar DimensionD = __webpack_require__(140).layoutBase.DimensionD;\nvar LayoutConstants = __webpack_require__(140).layoutBase.LayoutConstants;\nvar FDLayoutConstants = __webpack_require__(140).layoutBase.FDLayoutConstants;\nvar CoSEConstants = __webpack_require__(140).CoSEConstants;\n\n// main function that cose layout is processed\nvar coseLayout = function coseLayout(options, spectralResult) {\n\n var cy = options.cy;\n var eles = options.eles;\n var nodes = eles.nodes();\n var edges = eles.edges();\n\n var nodeIndexes = void 0;\n var xCoords = void 0;\n var yCoords = void 0;\n var idToLNode = {};\n\n if (options.randomize) {\n nodeIndexes = spectralResult[\"nodeIndexes\"];\n xCoords = spectralResult[\"xCoords\"];\n yCoords = spectralResult[\"yCoords\"];\n }\n\n var isFn = function isFn(fn) {\n return typeof fn === 'function';\n };\n\n var optFn = function optFn(opt, ele) {\n if (isFn(opt)) {\n return opt(ele);\n } else {\n return opt;\n }\n };\n\n /**** Postprocessing functions ****/\n\n var parentsWithoutChildren = aux.calcParentsWithoutChildren(cy, eles);\n\n // transfer cytoscape nodes to cose nodes\n var processChildrenList = function processChildrenList(parent, children, layout, options) {\n var size = children.length;\n for (var i = 0; i < size; i++) {\n var theChild = children[i];\n var children_of_children = null;\n if (theChild.intersection(parentsWithoutChildren).length == 0) {\n children_of_children = theChild.children();\n }\n var theNode = void 0;\n\n var dimensions = theChild.layoutDimensions({\n nodeDimensionsIncludeLabels: options.nodeDimensionsIncludeLabels\n });\n\n if (theChild.outerWidth() != null && theChild.outerHeight() != null) {\n if (options.randomize) {\n if (!theChild.isParent()) {\n theNode = parent.add(new CoSENode(layout.graphManager, new PointD(xCoords[nodeIndexes.get(theChild.id())] - dimensions.w / 2, yCoords[nodeIndexes.get(theChild.id())] - dimensions.h / 2), new DimensionD(parseFloat(dimensions.w), parseFloat(dimensions.h))));\n } else {\n var parentInfo = aux.calcBoundingBox(theChild, xCoords, yCoords, nodeIndexes);\n if (theChild.intersection(parentsWithoutChildren).length == 0) {\n theNode = parent.add(new CoSENode(layout.graphManager, new PointD(parentInfo.topLeftX, parentInfo.topLeftY), new DimensionD(parentInfo.width, parentInfo.height)));\n } else {\n // for the parentsWithoutChildren\n theNode = parent.add(new CoSENode(layout.graphManager, new PointD(parentInfo.topLeftX, parentInfo.topLeftY), new DimensionD(parseFloat(dimensions.w), parseFloat(dimensions.h))));\n }\n }\n } else {\n theNode = parent.add(new CoSENode(layout.graphManager, new PointD(theChild.position('x') - dimensions.w / 2, theChild.position('y') - dimensions.h / 2), new DimensionD(parseFloat(dimensions.w), parseFloat(dimensions.h))));\n }\n } else {\n theNode = parent.add(new CoSENode(this.graphManager));\n }\n // Attach id to the layout node and repulsion value\n theNode.id = theChild.data(\"id\");\n theNode.nodeRepulsion = optFn(options.nodeRepulsion, theChild);\n // Attach the paddings of cy node to layout node\n theNode.paddingLeft = parseInt(theChild.css('padding'));\n theNode.paddingTop = parseInt(theChild.css('padding'));\n theNode.paddingRight = parseInt(theChild.css('padding'));\n theNode.paddingBottom = parseInt(theChild.css('padding'));\n\n //Attach the label properties to both compound and simple nodes if labels will be included in node dimensions\n //These properties will be used while updating bounds of compounds during iterations or tiling\n //and will be used for simple nodes while transferring final positions to cytoscape\n if (options.nodeDimensionsIncludeLabels) {\n theNode.labelWidth = theChild.boundingBox({ includeLabels: true, includeNodes: false, includeOverlays: false }).w;\n theNode.labelHeight = theChild.boundingBox({ includeLabels: true, includeNodes: false, includeOverlays: false }).h;\n theNode.labelPosVertical = theChild.css(\"text-valign\");\n theNode.labelPosHorizontal = theChild.css(\"text-halign\");\n }\n\n // Map the layout node\n idToLNode[theChild.data(\"id\")] = theNode;\n\n if (isNaN(theNode.rect.x)) {\n theNode.rect.x = 0;\n }\n\n if (isNaN(theNode.rect.y)) {\n theNode.rect.y = 0;\n }\n\n if (children_of_children != null && children_of_children.length > 0) {\n var theNewGraph = void 0;\n theNewGraph = layout.getGraphManager().add(layout.newGraph(), theNode);\n processChildrenList(theNewGraph, children_of_children, layout, options);\n }\n }\n };\n\n // transfer cytoscape edges to cose edges\n var processEdges = function processEdges(layout, gm, edges) {\n var idealLengthTotal = 0;\n var edgeCount = 0;\n for (var i = 0; i < edges.length; i++) {\n var edge = edges[i];\n var sourceNode = idToLNode[edge.data(\"source\")];\n var targetNode = idToLNode[edge.data(\"target\")];\n if (sourceNode && targetNode && sourceNode !== targetNode && sourceNode.getEdgesBetween(targetNode).length == 0) {\n var e1 = gm.add(layout.newEdge(), sourceNode, targetNode);\n e1.id = edge.id();\n e1.idealLength = optFn(options.idealEdgeLength, edge);\n e1.edgeElasticity = optFn(options.edgeElasticity, edge);\n idealLengthTotal += e1.idealLength;\n edgeCount++;\n }\n }\n // we need to update the ideal edge length constant with the avg. ideal length value after processing edges\n // in case there is no edge, use other options\n if (options.idealEdgeLength != null) {\n if (edgeCount > 0) CoSEConstants.DEFAULT_EDGE_LENGTH = FDLayoutConstants.DEFAULT_EDGE_LENGTH = idealLengthTotal / edgeCount;else if (!isFn(options.idealEdgeLength)) // in case there is no edge, but option gives a value to use\n CoSEConstants.DEFAULT_EDGE_LENGTH = FDLayoutConstants.DEFAULT_EDGE_LENGTH = options.idealEdgeLength;else // in case there is no edge and we cannot get a value from option (because it's a function)\n CoSEConstants.DEFAULT_EDGE_LENGTH = FDLayoutConstants.DEFAULT_EDGE_LENGTH = 50;\n // we need to update these constant values based on the ideal edge length constant\n CoSEConstants.MIN_REPULSION_DIST = FDLayoutConstants.MIN_REPULSION_DIST = FDLayoutConstants.DEFAULT_EDGE_LENGTH / 10.0;\n CoSEConstants.DEFAULT_RADIAL_SEPARATION = FDLayoutConstants.DEFAULT_EDGE_LENGTH;\n }\n };\n\n // transfer cytoscape constraints to cose layout\n var processConstraints = function processConstraints(layout, options) {\n // get nodes to be fixed\n if (options.fixedNodeConstraint) {\n layout.constraints[\"fixedNodeConstraint\"] = options.fixedNodeConstraint;\n }\n // get nodes to be aligned\n if (options.alignmentConstraint) {\n layout.constraints[\"alignmentConstraint\"] = options.alignmentConstraint;\n }\n // get nodes to be relatively placed\n if (options.relativePlacementConstraint) {\n layout.constraints[\"relativePlacementConstraint\"] = options.relativePlacementConstraint;\n }\n };\n\n /**** Apply postprocessing ****/\n if (options.nestingFactor != null) CoSEConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = options.nestingFactor;\n if (options.gravity != null) CoSEConstants.DEFAULT_GRAVITY_STRENGTH = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH = options.gravity;\n if (options.numIter != null) CoSEConstants.MAX_ITERATIONS = FDLayoutConstants.MAX_ITERATIONS = options.numIter;\n if (options.gravityRange != null) CoSEConstants.DEFAULT_GRAVITY_RANGE_FACTOR = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR = options.gravityRange;\n if (options.gravityCompound != null) CoSEConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = options.gravityCompound;\n if (options.gravityRangeCompound != null) CoSEConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = options.gravityRangeCompound;\n if (options.initialEnergyOnIncremental != null) CoSEConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = options.initialEnergyOnIncremental;\n\n if (options.tilingCompareBy != null) CoSEConstants.TILING_COMPARE_BY = options.tilingCompareBy;\n\n if (options.quality == 'proof') LayoutConstants.QUALITY = 2;else LayoutConstants.QUALITY = 0;\n\n CoSEConstants.NODE_DIMENSIONS_INCLUDE_LABELS = FDLayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = options.nodeDimensionsIncludeLabels;\n CoSEConstants.DEFAULT_INCREMENTAL = FDLayoutConstants.DEFAULT_INCREMENTAL = LayoutConstants.DEFAULT_INCREMENTAL = !options.randomize;\n CoSEConstants.ANIMATE = FDLayoutConstants.ANIMATE = LayoutConstants.ANIMATE = options.animate;\n CoSEConstants.TILE = options.tile;\n CoSEConstants.TILING_PADDING_VERTICAL = typeof options.tilingPaddingVertical === 'function' ? options.tilingPaddingVertical.call() : options.tilingPaddingVertical;\n CoSEConstants.TILING_PADDING_HORIZONTAL = typeof options.tilingPaddingHorizontal === 'function' ? options.tilingPaddingHorizontal.call() : options.tilingPaddingHorizontal;\n\n CoSEConstants.DEFAULT_INCREMENTAL = FDLayoutConstants.DEFAULT_INCREMENTAL = LayoutConstants.DEFAULT_INCREMENTAL = true;\n CoSEConstants.PURE_INCREMENTAL = !options.randomize;\n LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES = options.uniformNodeDimensions;\n\n // This part is for debug/demo purpose\n if (options.step == \"transformed\") {\n CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = true;\n CoSEConstants.ENFORCE_CONSTRAINTS = false;\n CoSEConstants.APPLY_LAYOUT = false;\n }\n if (options.step == \"enforced\") {\n CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = false;\n CoSEConstants.ENFORCE_CONSTRAINTS = true;\n CoSEConstants.APPLY_LAYOUT = false;\n }\n if (options.step == \"cose\") {\n CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = false;\n CoSEConstants.ENFORCE_CONSTRAINTS = false;\n CoSEConstants.APPLY_LAYOUT = true;\n }\n if (options.step == \"all\") {\n if (options.randomize) CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = true;else CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = false;\n CoSEConstants.ENFORCE_CONSTRAINTS = true;\n CoSEConstants.APPLY_LAYOUT = true;\n }\n\n if (options.fixedNodeConstraint || options.alignmentConstraint || options.relativePlacementConstraint) {\n CoSEConstants.TREE_REDUCTION_ON_INCREMENTAL = false;\n } else {\n CoSEConstants.TREE_REDUCTION_ON_INCREMENTAL = true;\n }\n\n var coseLayout = new CoSELayout();\n var gm = coseLayout.newGraphManager();\n\n processChildrenList(gm.addRoot(), aux.getTopMostNodes(nodes), coseLayout, options);\n processEdges(coseLayout, gm, edges);\n processConstraints(coseLayout, options);\n\n coseLayout.runLayout();\n\n return idToLNode;\n};\n\nmodule.exports = { coseLayout: coseLayout };\n\n/***/ }),\n\n/***/ 212:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n The implementation of the fcose layout algorithm\n*/\n\nvar assign = __webpack_require__(658);\nvar aux = __webpack_require__(548);\n\nvar _require = __webpack_require__(657),\n spectralLayout = _require.spectralLayout;\n\nvar _require2 = __webpack_require__(816),\n coseLayout = _require2.coseLayout;\n\nvar defaults = Object.freeze({\n\n // 'draft', 'default' or 'proof' \n // - 'draft' only applies spectral layout \n // - 'default' improves the quality with subsequent CoSE layout (fast cooling rate)\n // - 'proof' improves the quality with subsequent CoSE layout (slow cooling rate) \n quality: \"default\",\n // Use random node positions at beginning of layout\n // if this is set to false, then quality option must be \"proof\"\n randomize: true,\n // Whether or not to animate the layout\n animate: true,\n // Duration of animation in ms, if enabled\n animationDuration: 1000,\n // Easing of animation, if enabled\n animationEasing: undefined,\n // Fit the viewport to the repositioned nodes\n fit: true,\n // Padding around layout\n padding: 30,\n // Whether to include labels in node dimensions. Valid in \"proof\" quality\n nodeDimensionsIncludeLabels: false,\n // Whether or not simple nodes (non-compound nodes) are of uniform dimensions\n uniformNodeDimensions: false,\n // Whether to pack disconnected components - valid only if randomize: true\n packComponents: true,\n // Layout step - all, transformed, enforced, cose - for debug purpose only\n step: \"all\",\n\n /* spectral layout options */\n\n // False for random, true for greedy\n samplingType: true,\n // Sample size to construct distance matrix\n sampleSize: 25,\n // Separation amount between nodes\n nodeSeparation: 75,\n // Power iteration tolerance\n piTol: 0.0000001,\n\n /* CoSE layout options */\n\n // Node repulsion (non overlapping) multiplier\n nodeRepulsion: function nodeRepulsion(node) {\n return 4500;\n },\n // Ideal edge (non nested) length\n idealEdgeLength: function idealEdgeLength(edge) {\n return 50;\n },\n // Divisor to compute edge forces\n edgeElasticity: function edgeElasticity(edge) {\n return 0.45;\n },\n // Nesting factor (multiplier) to compute ideal edge length for nested edges\n nestingFactor: 0.1,\n // Gravity force (constant)\n gravity: 0.25,\n // Maximum number of iterations to perform\n numIter: 2500,\n // For enabling tiling\n tile: true,\n // The function that specifies the criteria for comparing nodes while sorting them during tiling operation.\n // Takes the node id as a parameter and the default tiling operation is perfomed when this option is not set.\n tilingCompareBy: undefined,\n // Represents the amount of the vertical space to put between the zero degree members during the tiling operation(can also be a function)\n tilingPaddingVertical: 10,\n // Represents the amount of the horizontal space to put between the zero degree members during the tiling operation(can also be a function)\n tilingPaddingHorizontal: 10,\n // Gravity range (constant) for compounds\n gravityRangeCompound: 1.5,\n // Gravity force (constant) for compounds\n gravityCompound: 1.0,\n // Gravity range (constant)\n gravityRange: 3.8,\n // Initial cooling factor for incremental layout \n initialEnergyOnIncremental: 0.3,\n\n /* constraint options */\n\n // Fix required nodes to predefined positions\n // [{nodeId: 'n1', position: {x: 100, y: 200}, {...}]\n fixedNodeConstraint: undefined,\n // Align required nodes in vertical/horizontal direction\n // {vertical: [['n1', 'n2')], ['n3', 'n4']], horizontal: ['n2', 'n4']}\n alignmentConstraint: undefined,\n // Place two nodes relatively in vertical/horizontal direction \n // [{top: 'n1', bottom: 'n2', gap: 100}, {left: 'n3', right: 'n4', gap: 75}]\n relativePlacementConstraint: undefined,\n\n /* layout event callbacks */\n ready: function ready() {}, // on layoutready\n stop: function stop() {} // on layoutstop\n});\n\nvar Layout = function () {\n function Layout(options) {\n _classCallCheck(this, Layout);\n\n this.options = assign({}, defaults, options);\n }\n\n _createClass(Layout, [{\n key: 'run',\n value: function run() {\n var layout = this;\n var options = this.options;\n var cy = options.cy;\n var eles = options.eles;\n\n var spectralResult = [];\n var xCoords = void 0;\n var yCoords = void 0;\n var coseResult = [];\n var components = void 0;\n var componentCenters = [];\n\n // basic validity check for constraint inputs \n if (options.fixedNodeConstraint && (!Array.isArray(options.fixedNodeConstraint) || options.fixedNodeConstraint.length == 0)) {\n options.fixedNodeConstraint = undefined;\n }\n\n if (options.alignmentConstraint) {\n if (options.alignmentConstraint.vertical && (!Array.isArray(options.alignmentConstraint.vertical) || options.alignmentConstraint.vertical.length == 0)) {\n options.alignmentConstraint.vertical = undefined;\n }\n if (options.alignmentConstraint.horizontal && (!Array.isArray(options.alignmentConstraint.horizontal) || options.alignmentConstraint.horizontal.length == 0)) {\n options.alignmentConstraint.horizontal = undefined;\n }\n }\n\n if (options.relativePlacementConstraint && (!Array.isArray(options.relativePlacementConstraint) || options.relativePlacementConstraint.length == 0)) {\n options.relativePlacementConstraint = undefined;\n }\n\n // if any constraint exists, set some options\n var constraintExist = options.fixedNodeConstraint || options.alignmentConstraint || options.relativePlacementConstraint;\n if (constraintExist) {\n // constraints work with these options\n options.tile = false;\n options.packComponents = false;\n }\n\n // decide component packing is enabled or not\n var layUtil = void 0;\n var packingEnabled = false;\n if (cy.layoutUtilities && options.packComponents) {\n layUtil = cy.layoutUtilities(\"get\");\n if (!layUtil) layUtil = cy.layoutUtilities();\n packingEnabled = true;\n }\n\n if (eles.nodes().length > 0) {\n // if packing is not enabled, perform layout on the whole graph\n if (!packingEnabled) {\n // store component center\n var boundingBox = options.eles.boundingBox();\n componentCenters.push({ x: boundingBox.x1 + boundingBox.w / 2, y: boundingBox.y1 + boundingBox.h / 2 });\n // apply spectral layout\n if (options.randomize) {\n var result = spectralLayout(options);\n spectralResult.push(result);\n }\n // apply cose layout as postprocessing\n if (options.quality == \"default\" || options.quality == \"proof\") {\n coseResult.push(coseLayout(options, spectralResult[0]));\n aux.relocateComponent(componentCenters[0], coseResult[0], options); // relocate center to original position\n } else {\n aux.relocateComponent(componentCenters[0], spectralResult[0], options); // relocate center to original position\n }\n } else {\n // packing is enabled\n var topMostNodes = aux.getTopMostNodes(options.eles.nodes());\n components = aux.connectComponents(cy, options.eles, topMostNodes);\n // store component centers\n components.forEach(function (component) {\n var boundingBox = component.boundingBox();\n componentCenters.push({ x: boundingBox.x1 + boundingBox.w / 2, y: boundingBox.y1 + boundingBox.h / 2 });\n });\n\n //send each component to spectral layout if randomized\n if (options.randomize) {\n components.forEach(function (component) {\n options.eles = component;\n spectralResult.push(spectralLayout(options));\n });\n }\n\n if (options.quality == \"default\" || options.quality == \"proof\") {\n var toBeTiledNodes = cy.collection();\n if (options.tile) {\n // behave nodes to be tiled as one component\n var nodeIndexes = new Map();\n var _xCoords = [];\n var _yCoords = [];\n var count = 0;\n var tempSpectralResult = { nodeIndexes: nodeIndexes, xCoords: _xCoords, yCoords: _yCoords };\n var indexesToBeDeleted = [];\n components.forEach(function (component, index) {\n if (component.edges().length == 0) {\n component.nodes().forEach(function (node, i) {\n toBeTiledNodes.merge(component.nodes()[i]);\n if (!node.isParent()) {\n tempSpectralResult.nodeIndexes.set(component.nodes()[i].id(), count++);\n tempSpectralResult.xCoords.push(component.nodes()[0].position().x);\n tempSpectralResult.yCoords.push(component.nodes()[0].position().y);\n }\n });\n indexesToBeDeleted.push(index);\n }\n });\n if (toBeTiledNodes.length > 1) {\n var _boundingBox = toBeTiledNodes.boundingBox();\n componentCenters.push({ x: _boundingBox.x1 + _boundingBox.w / 2, y: _boundingBox.y1 + _boundingBox.h / 2 });\n components.push(toBeTiledNodes);\n spectralResult.push(tempSpectralResult);\n for (var i = indexesToBeDeleted.length - 1; i >= 0; i--) {\n components.splice(indexesToBeDeleted[i], 1);\n spectralResult.splice(indexesToBeDeleted[i], 1);\n componentCenters.splice(indexesToBeDeleted[i], 1);\n };\n }\n }\n components.forEach(function (component, index) {\n // send each component to cose layout\n options.eles = component;\n coseResult.push(coseLayout(options, spectralResult[index]));\n aux.relocateComponent(componentCenters[index], coseResult[index], options); // relocate center to original position\n });\n } else {\n components.forEach(function (component, index) {\n aux.relocateComponent(componentCenters[index], spectralResult[index], options); // relocate center to original position\n });\n }\n\n // packing\n var componentsEvaluated = new Set();\n if (components.length > 1) {\n var subgraphs = [];\n var hiddenEles = eles.filter(function (ele) {\n return ele.css('display') == 'none';\n });\n components.forEach(function (component, index) {\n var nodeIndexes = void 0;\n if (options.quality == \"draft\") {\n nodeIndexes = spectralResult[index].nodeIndexes;\n }\n\n if (component.nodes().not(hiddenEles).length > 0) {\n var subgraph = {};\n subgraph.edges = [];\n subgraph.nodes = [];\n var nodeIndex = void 0;\n component.nodes().not(hiddenEles).forEach(function (node) {\n if (options.quality == \"draft\") {\n if (!node.isParent()) {\n nodeIndex = nodeIndexes.get(node.id());\n subgraph.nodes.push({ x: spectralResult[index].xCoords[nodeIndex] - node.boundingbox().w / 2, y: spectralResult[index].yCoords[nodeIndex] - node.boundingbox().h / 2, width: node.boundingbox().w, height: node.boundingbox().h });\n } else {\n var parentInfo = aux.calcBoundingBox(node, spectralResult[index].xCoords, spectralResult[index].yCoords, nodeIndexes);\n subgraph.nodes.push({ x: parentInfo.topLeftX, y: parentInfo.topLeftY, width: parentInfo.width, height: parentInfo.height });\n }\n } else {\n if (coseResult[index][node.id()]) {\n subgraph.nodes.push({ x: coseResult[index][node.id()].getLeft(), y: coseResult[index][node.id()].getTop(), width: coseResult[index][node.id()].getWidth(), height: coseResult[index][node.id()].getHeight() });\n }\n }\n });\n component.edges().forEach(function (edge) {\n var source = edge.source();\n var target = edge.target();\n if (source.css(\"display\") != \"none\" && target.css(\"display\") != \"none\") {\n if (options.quality == \"draft\") {\n var sourceNodeIndex = nodeIndexes.get(source.id());\n var targetNodeIndex = nodeIndexes.get(target.id());\n var sourceCenter = [];\n var targetCenter = [];\n if (source.isParent()) {\n var parentInfo = aux.calcBoundingBox(source, spectralResult[index].xCoords, spectralResult[index].yCoords, nodeIndexes);\n sourceCenter.push(parentInfo.topLeftX + parentInfo.width / 2);\n sourceCenter.push(parentInfo.topLeftY + parentInfo.height / 2);\n } else {\n sourceCenter.push(spectralResult[index].xCoords[sourceNodeIndex]);\n sourceCenter.push(spectralResult[index].yCoords[sourceNodeIndex]);\n }\n if (target.isParent()) {\n var _parentInfo = aux.calcBoundingBox(target, spectralResult[index].xCoords, spectralResult[index].yCoords, nodeIndexes);\n targetCenter.push(_parentInfo.topLeftX + _parentInfo.width / 2);\n targetCenter.push(_parentInfo.topLeftY + _parentInfo.height / 2);\n } else {\n targetCenter.push(spectralResult[index].xCoords[targetNodeIndex]);\n targetCenter.push(spectralResult[index].yCoords[targetNodeIndex]);\n }\n subgraph.edges.push({ startX: sourceCenter[0], startY: sourceCenter[1], endX: targetCenter[0], endY: targetCenter[1] });\n } else {\n if (coseResult[index][source.id()] && coseResult[index][target.id()]) {\n subgraph.edges.push({ startX: coseResult[index][source.id()].getCenterX(), startY: coseResult[index][source.id()].getCenterY(), endX: coseResult[index][target.id()].getCenterX(), endY: coseResult[index][target.id()].getCenterY() });\n }\n }\n }\n });\n if (subgraph.nodes.length > 0) {\n subgraphs.push(subgraph);\n componentsEvaluated.add(index);\n }\n }\n });\n var shiftResult = layUtil.packComponents(subgraphs, options.randomize).shifts;\n if (options.quality == \"draft\") {\n spectralResult.forEach(function (result, index) {\n var newXCoords = result.xCoords.map(function (x) {\n return x + shiftResult[index].dx;\n });\n var newYCoords = result.yCoords.map(function (y) {\n return y + shiftResult[index].dy;\n });\n result.xCoords = newXCoords;\n result.yCoords = newYCoords;\n });\n } else {\n var _count = 0;\n componentsEvaluated.forEach(function (index) {\n Object.keys(coseResult[index]).forEach(function (item) {\n var nodeRectangle = coseResult[index][item];\n nodeRectangle.setCenter(nodeRectangle.getCenterX() + shiftResult[_count].dx, nodeRectangle.getCenterY() + shiftResult[_count].dy);\n });\n _count++;\n });\n }\n }\n }\n }\n\n // get each element's calculated position\n var getPositions = function getPositions(ele, i) {\n if (options.quality == \"default\" || options.quality == \"proof\") {\n if (typeof ele === \"number\") {\n ele = i;\n }\n var pos = void 0;\n var node = void 0;\n var theId = ele.data('id');\n coseResult.forEach(function (result) {\n if (theId in result) {\n pos = { x: result[theId].getRect().getCenterX(), y: result[theId].getRect().getCenterY() };\n node = result[theId];\n }\n });\n if (options.nodeDimensionsIncludeLabels) {\n if (node.labelWidth) {\n if (node.labelPosHorizontal == \"left\") {\n pos.x += node.labelWidth / 2;\n } else if (node.labelPosHorizontal == \"right\") {\n pos.x -= node.labelWidth / 2;\n }\n }\n if (node.labelHeight) {\n if (node.labelPosVertical == \"top\") {\n pos.y += node.labelHeight / 2;\n } else if (node.labelPosVertical == \"bottom\") {\n pos.y -= node.labelHeight / 2;\n }\n }\n }\n if (pos == undefined) pos = { x: ele.position(\"x\"), y: ele.position(\"y\") };\n return {\n x: pos.x,\n y: pos.y\n };\n } else {\n var _pos = void 0;\n spectralResult.forEach(function (result) {\n var index = result.nodeIndexes.get(ele.id());\n if (index != undefined) {\n _pos = { x: result.xCoords[index], y: result.yCoords[index] };\n }\n });\n if (_pos == undefined) _pos = { x: ele.position(\"x\"), y: ele.position(\"y\") };\n return {\n x: _pos.x,\n y: _pos.y\n };\n }\n };\n\n // quality = \"draft\" and randomize = false are contradictive so in that case positions don't change\n if (options.quality == \"default\" || options.quality == \"proof\" || options.randomize) {\n // transfer calculated positions to nodes (positions of only simple nodes are evaluated, compounds are positioned automatically)\n var parentsWithoutChildren = aux.calcParentsWithoutChildren(cy, eles);\n var _hiddenEles = eles.filter(function (ele) {\n return ele.css('display') == 'none';\n });\n options.eles = eles.not(_hiddenEles);\n\n eles.nodes().not(\":parent\").not(_hiddenEles).layoutPositions(layout, options, getPositions);\n\n if (parentsWithoutChildren.length > 0) {\n parentsWithoutChildren.forEach(function (ele) {\n ele.position(getPositions(ele));\n });\n }\n } else {\n console.log(\"If randomize option is set to false, then quality option must be 'default' or 'proof'.\");\n }\n }\n }]);\n\n return Layout;\n}();\n\nmodule.exports = Layout;\n\n/***/ }),\n\n/***/ 657:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\n/**\n The implementation of the spectral layout that is the first part of the fcose layout algorithm\n*/\n\nvar aux = __webpack_require__(548);\nvar Matrix = __webpack_require__(140).layoutBase.Matrix;\nvar SVD = __webpack_require__(140).layoutBase.SVD;\n\n// main function that spectral layout is processed\nvar spectralLayout = function spectralLayout(options) {\n\n var cy = options.cy;\n var eles = options.eles;\n var nodes = eles.nodes();\n var parentNodes = eles.nodes(\":parent\");\n\n var dummyNodes = new Map(); // map to keep dummy nodes and their neighbors\n var nodeIndexes = new Map(); // map to keep indexes to nodes\n var parentChildMap = new Map(); // mapping btw. compound and its representative node \n var allNodesNeighborhood = []; // array to keep neighborhood of all nodes\n var xCoords = [];\n var yCoords = [];\n\n var samplesColumn = []; // sampled vertices\n var minDistancesColumn = [];\n var C = []; // column sampling matrix\n var PHI = []; // intersection of column and row sampling matrices \n var INV = []; // inverse of PHI \n\n var firstSample = void 0; // the first sampled node\n var nodeSize = void 0;\n\n var infinity = 100000000;\n var small = 0.000000001;\n\n var piTol = options.piTol;\n var samplingType = options.samplingType; // false for random, true for greedy\n var nodeSeparation = options.nodeSeparation;\n var sampleSize = void 0;\n\n /**** Spectral-preprocessing functions ****/\n\n /**** Spectral layout functions ****/\n\n // determine which columns to be sampled\n var randomSampleCR = function randomSampleCR() {\n var sample = 0;\n var count = 0;\n var flag = false;\n\n while (count < sampleSize) {\n sample = Math.floor(Math.random() * nodeSize);\n\n flag = false;\n for (var i = 0; i < count; i++) {\n if (samplesColumn[i] == sample) {\n flag = true;\n break;\n }\n }\n\n if (!flag) {\n samplesColumn[count] = sample;\n count++;\n } else {\n continue;\n }\n }\n };\n\n // takes the index of the node(pivot) to initiate BFS as a parameter\n var BFS = function BFS(pivot, index, samplingMethod) {\n var path = []; // the front of the path\n var front = 0; // the back of the path\n var back = 0;\n var current = 0;\n var temp = void 0;\n var distance = [];\n\n var max_dist = 0; // the furthest node to be returned\n var max_ind = 1;\n\n for (var i = 0; i < nodeSize; i++) {\n distance[i] = infinity;\n }\n\n path[back] = pivot;\n distance[pivot] = 0;\n\n while (back >= front) {\n current = path[front++];\n var neighbors = allNodesNeighborhood[current];\n for (var _i = 0; _i < neighbors.length; _i++) {\n temp = nodeIndexes.get(neighbors[_i]);\n if (distance[temp] == infinity) {\n distance[temp] = distance[current] + 1;\n path[++back] = temp;\n }\n }\n C[current][index] = distance[current] * nodeSeparation;\n }\n\n if (samplingMethod) {\n for (var _i2 = 0; _i2 < nodeSize; _i2++) {\n if (C[_i2][index] < minDistancesColumn[_i2]) minDistancesColumn[_i2] = C[_i2][index];\n }\n\n for (var _i3 = 0; _i3 < nodeSize; _i3++) {\n if (minDistancesColumn[_i3] > max_dist) {\n max_dist = minDistancesColumn[_i3];\n max_ind = _i3;\n }\n }\n }\n return max_ind;\n };\n\n // apply BFS to all nodes or selected samples\n var allBFS = function allBFS(samplingMethod) {\n\n var sample = void 0;\n\n if (!samplingMethod) {\n randomSampleCR();\n\n // call BFS\n for (var i = 0; i < sampleSize; i++) {\n BFS(samplesColumn[i], i, samplingMethod, false);\n }\n } else {\n sample = Math.floor(Math.random() * nodeSize);\n firstSample = sample;\n\n for (var _i4 = 0; _i4 < nodeSize; _i4++) {\n minDistancesColumn[_i4] = infinity;\n }\n\n for (var _i5 = 0; _i5 < sampleSize; _i5++) {\n samplesColumn[_i5] = sample;\n sample = BFS(sample, _i5, samplingMethod);\n }\n }\n\n // form the squared distances for C\n for (var _i6 = 0; _i6 < nodeSize; _i6++) {\n for (var j = 0; j < sampleSize; j++) {\n C[_i6][j] *= C[_i6][j];\n }\n }\n\n // form PHI\n for (var _i7 = 0; _i7 < sampleSize; _i7++) {\n PHI[_i7] = [];\n }\n\n for (var _i8 = 0; _i8 < sampleSize; _i8++) {\n for (var _j = 0; _j < sampleSize; _j++) {\n PHI[_i8][_j] = C[samplesColumn[_j]][_i8];\n }\n }\n };\n\n // perform the SVD algorithm and apply a regularization step\n var sample = function sample() {\n\n var SVDResult = SVD.svd(PHI);\n\n var a_q = SVDResult.S;\n var a_u = SVDResult.U;\n var a_v = SVDResult.V;\n\n var max_s = a_q[0] * a_q[0] * a_q[0];\n\n var a_Sig = [];\n\n // regularization\n for (var i = 0; i < sampleSize; i++) {\n a_Sig[i] = [];\n for (var j = 0; j < sampleSize; j++) {\n a_Sig[i][j] = 0;\n if (i == j) {\n a_Sig[i][j] = a_q[i] / (a_q[i] * a_q[i] + max_s / (a_q[i] * a_q[i]));\n }\n }\n }\n\n INV = Matrix.multMat(Matrix.multMat(a_v, a_Sig), Matrix.transpose(a_u));\n };\n\n // calculate final coordinates \n var powerIteration = function powerIteration() {\n // two largest eigenvalues\n var theta1 = void 0;\n var theta2 = void 0;\n\n // initial guesses for eigenvectors\n var Y1 = [];\n var Y2 = [];\n\n var V1 = [];\n var V2 = [];\n\n for (var i = 0; i < nodeSize; i++) {\n Y1[i] = Math.random();\n Y2[i] = Math.random();\n }\n\n Y1 = Matrix.normalize(Y1);\n Y2 = Matrix.normalize(Y2);\n\n var count = 0;\n // to keep track of the improvement ratio in power iteration\n var current = small;\n var previous = small;\n\n var temp = void 0;\n\n while (true) {\n count++;\n\n for (var _i9 = 0; _i9 < nodeSize; _i9++) {\n V1[_i9] = Y1[_i9];\n }\n\n Y1 = Matrix.multGamma(Matrix.multL(Matrix.multGamma(V1), C, INV));\n theta1 = Matrix.dotProduct(V1, Y1);\n Y1 = Matrix.normalize(Y1);\n\n current = Matrix.dotProduct(V1, Y1);\n\n temp = Math.abs(current / previous);\n\n if (temp <= 1 + piTol && temp >= 1) {\n break;\n }\n\n previous = current;\n }\n\n for (var _i10 = 0; _i10 < nodeSize; _i10++) {\n V1[_i10] = Y1[_i10];\n }\n\n count = 0;\n previous = small;\n while (true) {\n count++;\n\n for (var _i11 = 0; _i11 < nodeSize; _i11++) {\n V2[_i11] = Y2[_i11];\n }\n\n V2 = Matrix.minusOp(V2, Matrix.multCons(V1, Matrix.dotProduct(V1, V2)));\n Y2 = Matrix.multGamma(Matrix.multL(Matrix.multGamma(V2), C, INV));\n theta2 = Matrix.dotProduct(V2, Y2);\n Y2 = Matrix.normalize(Y2);\n\n current = Matrix.dotProduct(V2, Y2);\n\n temp = Math.abs(current / previous);\n\n if (temp <= 1 + piTol && temp >= 1) {\n break;\n }\n\n previous = current;\n }\n\n for (var _i12 = 0; _i12 < nodeSize; _i12++) {\n V2[_i12] = Y2[_i12];\n }\n\n // theta1 now contains dominant eigenvalue\n // theta2 now contains the second-largest eigenvalue\n // V1 now contains theta1's eigenvector\n // V2 now contains theta2's eigenvector\n\n //populate the two vectors\n xCoords = Matrix.multCons(V1, Math.sqrt(Math.abs(theta1)));\n yCoords = Matrix.multCons(V2, Math.sqrt(Math.abs(theta2)));\n };\n\n /**** Preparation for spectral layout (Preprocessing) ****/\n\n // connect disconnected components (first top level, then inside of each compound node)\n aux.connectComponents(cy, eles, aux.getTopMostNodes(nodes), dummyNodes);\n\n parentNodes.forEach(function (ele) {\n aux.connectComponents(cy, eles, aux.getTopMostNodes(ele.descendants().intersection(eles)), dummyNodes);\n });\n\n // assign indexes to nodes (first real, then dummy nodes)\n var index = 0;\n for (var i = 0; i < nodes.length; i++) {\n if (!nodes[i].isParent()) {\n nodeIndexes.set(nodes[i].id(), index++);\n }\n }\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = dummyNodes.keys()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var key = _step.value;\n\n nodeIndexes.set(key, index++);\n }\n\n // instantiate the neighborhood matrix\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n for (var _i13 = 0; _i13 < nodeIndexes.size; _i13++) {\n allNodesNeighborhood[_i13] = [];\n }\n\n // form a parent-child map to keep representative node of each compound node \n parentNodes.forEach(function (ele) {\n var children = ele.children().intersection(eles);\n\n // let random = 0;\n while (children.nodes(\":childless\").length == 0) {\n // random = Math.floor(Math.random() * children.nodes().length); // if all children are compound then proceed randomly\n children = children.nodes()[0].children().intersection(eles);\n }\n // select the representative node - we can apply different methods here\n // random = Math.floor(Math.random() * children.nodes(\":childless\").length);\n var index = 0;\n var min = children.nodes(\":childless\")[0].connectedEdges().length;\n children.nodes(\":childless\").forEach(function (ele2, i) {\n if (ele2.connectedEdges().length < min) {\n min = ele2.connectedEdges().length;\n index = i;\n }\n });\n parentChildMap.set(ele.id(), children.nodes(\":childless\")[index].id());\n });\n\n // add neighborhood relations (first real, then dummy nodes)\n nodes.forEach(function (ele) {\n var eleIndex = void 0;\n\n if (ele.isParent()) eleIndex = nodeIndexes.get(parentChildMap.get(ele.id()));else eleIndex = nodeIndexes.get(ele.id());\n\n ele.neighborhood().nodes().forEach(function (node) {\n if (eles.intersection(ele.edgesWith(node)).length > 0) {\n if (node.isParent()) allNodesNeighborhood[eleIndex].push(parentChildMap.get(node.id()));else allNodesNeighborhood[eleIndex].push(node.id());\n }\n });\n });\n\n var _loop = function _loop(_key) {\n var eleIndex = nodeIndexes.get(_key);\n var disconnectedId = void 0;\n dummyNodes.get(_key).forEach(function (id) {\n if (cy.getElementById(id).isParent()) disconnectedId = parentChildMap.get(id);else disconnectedId = id;\n\n allNodesNeighborhood[eleIndex].push(disconnectedId);\n allNodesNeighborhood[nodeIndexes.get(disconnectedId)].push(_key);\n });\n };\n\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = dummyNodes.keys()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var _key = _step2.value;\n\n _loop(_key);\n }\n\n // nodeSize now only considers the size of transformed graph\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n nodeSize = nodeIndexes.size;\n\n var spectralResult = void 0;\n\n // If number of nodes in transformed graph is 1 or 2, either SVD or powerIteration causes problem\n // So skip spectral and layout the graph with cose\n if (nodeSize > 2) {\n // if # of nodes in transformed graph is smaller than sample size,\n // then use # of nodes as sample size\n sampleSize = nodeSize < options.sampleSize ? nodeSize : options.sampleSize;\n\n // instantiates the partial matrices that will be used in spectral layout\n for (var _i14 = 0; _i14 < nodeSize; _i14++) {\n C[_i14] = [];\n }\n for (var _i15 = 0; _i15 < sampleSize; _i15++) {\n INV[_i15] = [];\n }\n\n /**** Apply spectral layout ****/\n\n if (options.quality == \"draft\" || options.step == \"all\") {\n allBFS(samplingType);\n sample();\n powerIteration();\n\n spectralResult = { nodeIndexes: nodeIndexes, xCoords: xCoords, yCoords: yCoords };\n } else {\n nodeIndexes.forEach(function (value, key) {\n xCoords.push(cy.getElementById(key).position(\"x\"));\n yCoords.push(cy.getElementById(key).position(\"y\"));\n });\n spectralResult = { nodeIndexes: nodeIndexes, xCoords: xCoords, yCoords: yCoords };\n }\n return spectralResult;\n } else {\n var iterator = nodeIndexes.keys();\n var firstNode = cy.getElementById(iterator.next().value);\n var firstNodePos = firstNode.position();\n var firstNodeWidth = firstNode.outerWidth();\n xCoords.push(firstNodePos.x);\n yCoords.push(firstNodePos.y);\n if (nodeSize == 2) {\n var secondNode = cy.getElementById(iterator.next().value);\n var secondNodeWidth = secondNode.outerWidth();\n xCoords.push(firstNodePos.x + firstNodeWidth / 2 + secondNodeWidth / 2 + options.idealEdgeLength);\n yCoords.push(firstNodePos.y);\n }\n\n spectralResult = { nodeIndexes: nodeIndexes, xCoords: xCoords, yCoords: yCoords };\n return spectralResult;\n }\n};\n\nmodule.exports = { spectralLayout: spectralLayout };\n\n/***/ }),\n\n/***/ 579:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nvar impl = __webpack_require__(212);\n\n// registers the extension on a cytoscape lib ref\nvar register = function register(cytoscape) {\n if (!cytoscape) {\n return;\n } // can't register if cytoscape unspecified\n\n cytoscape('layout', 'fcose', impl); // register with cytoscape.js\n};\n\nif (typeof cytoscape !== 'undefined') {\n // expose to global cytoscape (i.e. window.cytoscape)\n register(cytoscape);\n}\n\nmodule.exports = register;\n\n/***/ }),\n\n/***/ 140:\n/***/ ((module) => {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__140__;\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \t// This entry module is referenced by other modules so it can't be inlined\n/******/ \tvar __webpack_exports__ = __webpack_require__(579);\n/******/ \t\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});", "import type { DiagramDBBase } from '../../diagram-api/types.js';\nimport type { ArchitectureDiagramConfig } from '../../config.type.js';\nimport type { D3Element } from '../../types.js';\nimport type cytoscape from 'cytoscape';\n\n/*=======================================*\\\n| Architecture Diagram Types |\n\\*=======================================*/\n\nexport type ArchitectureAlignment = 'vertical' | 'horizontal' | 'bend';\n\nexport type ArchitectureDirection = 'L' | 'R' | 'T' | 'B';\nexport type ArchitectureDirectionX = Extract;\nexport type ArchitectureDirectionY = Extract;\n\n/**\n * Contains LL, RR, TT, BB which are impossible connections\n */\nexport type InvalidArchitectureDirectionPair = `${ArchitectureDirection}${ArchitectureDirection}`;\nexport type ArchitectureDirectionPair = Exclude<\n InvalidArchitectureDirectionPair,\n 'LL' | 'RR' | 'TT' | 'BB'\n>;\nexport type ArchitectureDirectionPairXY = Exclude<\n InvalidArchitectureDirectionPair,\n 'LL' | 'RR' | 'TT' | 'BB' | 'LR' | 'RL' | 'TB' | 'BT'\n>;\n\nexport const ArchitectureDirectionName = {\n L: 'left',\n R: 'right',\n T: 'top',\n B: 'bottom',\n} as const;\n\nexport const ArchitectureDirectionArrow = {\n L: (scale: number) => `${scale},${scale / 2} 0,${scale} 0,0`,\n R: (scale: number) => `0,${scale / 2} ${scale},0 ${scale},${scale}`,\n T: (scale: number) => `0,0 ${scale},0 ${scale / 2},${scale}`,\n B: (scale: number) => `${scale / 2},0 ${scale},${scale} 0,${scale}`,\n} as const;\n\nexport const ArchitectureDirectionArrowShift = {\n L: (orig: number, arrowSize: number) => orig - arrowSize + 2,\n R: (orig: number, _arrowSize: number) => orig - 2,\n T: (orig: number, arrowSize: number) => orig - arrowSize + 2,\n B: (orig: number, _arrowSize: number) => orig - 2,\n} as const;\n\nexport const getOppositeArchitectureDirection = function (\n x: ArchitectureDirection\n): ArchitectureDirection {\n if (isArchitectureDirectionX(x)) {\n return x === 'L' ? 'R' : 'L';\n } else {\n return x === 'T' ? 'B' : 'T';\n }\n};\n\nexport const isArchitectureDirection = function (x: unknown): x is ArchitectureDirection {\n const temp = x as ArchitectureDirection;\n return temp === 'L' || temp === 'R' || temp === 'T' || temp === 'B';\n};\n\nexport const isArchitectureDirectionX = function (\n x: ArchitectureDirection\n): x is ArchitectureDirectionX {\n const temp = x as ArchitectureDirectionX;\n return temp === 'L' || temp === 'R';\n};\n\nexport const isArchitectureDirectionY = function (\n x: ArchitectureDirection\n): x is ArchitectureDirectionY {\n const temp = x as ArchitectureDirectionY;\n return temp === 'T' || temp === 'B';\n};\n\nexport const isArchitectureDirectionXY = function (\n a: ArchitectureDirection,\n b: ArchitectureDirection\n) {\n const aX_bY = isArchitectureDirectionX(a) && isArchitectureDirectionY(b);\n const aY_bX = isArchitectureDirectionY(a) && isArchitectureDirectionX(b);\n return aX_bY || aY_bX;\n};\n\nexport const isArchitecturePairXY = function (\n pair: ArchitectureDirectionPair\n): pair is ArchitectureDirectionPairXY {\n const lhs = pair[0] as ArchitectureDirection;\n const rhs = pair[1] as ArchitectureDirection;\n const aX_bY = isArchitectureDirectionX(lhs) && isArchitectureDirectionY(rhs);\n const aY_bX = isArchitectureDirectionY(lhs) && isArchitectureDirectionX(rhs);\n return aX_bY || aY_bX;\n};\n\n/**\n * Verifies that the architecture direction pair does not contain an invalid match (LL, RR, TT, BB)\n * @param x - architecture direction pair which could potentially be invalid\n * @returns true if the pair is not LL, RR, TT, or BB\n */\nexport const isValidArchitectureDirectionPair = function (\n x: InvalidArchitectureDirectionPair\n): x is ArchitectureDirectionPair {\n return x !== 'LL' && x !== 'RR' && x !== 'TT' && x !== 'BB';\n};\n\nexport type ArchitectureDirectionPairMap = Partial>;\n\n/**\n * Creates a pair of the directions of each side of an edge. This function should be used instead of manually creating it to ensure that the source is always the first character.\n *\n * Note: Undefined is returned when sourceDir and targetDir are the same. In theory this should never happen since the diagram parser throws an error if a user defines it as such.\n * @param sourceDir - source direction\n * @param targetDir - target direction\n * @returns\n */\nexport const getArchitectureDirectionPair = function (\n sourceDir: ArchitectureDirection,\n targetDir: ArchitectureDirection\n): ArchitectureDirectionPair | undefined {\n const pair: `${ArchitectureDirection}${ArchitectureDirection}` = `${sourceDir}${targetDir}`;\n return isValidArchitectureDirectionPair(pair) ? pair : undefined;\n};\n\n/**\n * Given an x,y position for an arrow and the direction of the edge it belongs to, return a factor for slightly shifting the edge\n * @param param0 - [x, y] coordinate pair\n * @param pair - architecture direction pair\n * @returns a new [x, y] coordinate pair\n */\nexport const shiftPositionByArchitectureDirectionPair = function (\n [x, y]: number[],\n pair: ArchitectureDirectionPair\n): number[] {\n const lhs = pair[0] as ArchitectureDirection;\n const rhs = pair[1] as ArchitectureDirection;\n if (isArchitectureDirectionX(lhs)) {\n if (isArchitectureDirectionY(rhs)) {\n return [x + (lhs === 'L' ? -1 : 1), y + (rhs === 'T' ? 1 : -1)];\n } else {\n return [x + (lhs === 'L' ? -1 : 1), y];\n }\n } else {\n if (isArchitectureDirectionX(rhs)) {\n return [x + (rhs === 'L' ? 1 : -1), y + (lhs === 'T' ? 1 : -1)];\n } else {\n return [x, y + (lhs === 'T' ? 1 : -1)];\n }\n }\n};\n\n/**\n * Given the directional pair of an XY edge, get the scale factors necessary to shift the coordinates inwards towards the edge\n * @param pair - XY pair of an edge\n * @returns - number[] containing [+/- 1, +/- 1]\n */\nexport const getArchitectureDirectionXYFactors = function (\n pair: ArchitectureDirectionPairXY\n): number[] {\n if (pair === 'LT' || pair === 'TL') {\n return [1, 1];\n } else if (pair === 'BL' || pair === 'LB') {\n return [1, -1];\n } else if (pair === 'BR' || pair === 'RB') {\n return [-1, -1];\n } else {\n return [-1, 1];\n }\n};\n\nexport const getArchitectureDirectionAlignment = function (\n a: ArchitectureDirection,\n b: ArchitectureDirection\n): ArchitectureAlignment {\n if (isArchitectureDirectionXY(a, b)) {\n return 'bend';\n } else if (isArchitectureDirectionX(a)) {\n return 'horizontal';\n }\n return 'vertical';\n};\n\nexport interface ArchitectureStyleOptions {\n archEdgeColor: string;\n archEdgeArrowColor: string;\n archEdgeWidth: string;\n archGroupBorderColor: string;\n archGroupBorderWidth: string;\n}\n\nexport interface ArchitectureService {\n id: string;\n type: 'service';\n edges: ArchitectureEdge[];\n icon?: string;\n iconText?: string;\n title?: string;\n in?: string;\n width?: number;\n height?: number;\n}\n\nexport interface ArchitectureJunction {\n id: string;\n type: 'junction';\n edges: ArchitectureEdge[];\n in?: string;\n width?: number;\n height?: number;\n}\n\nexport type ArchitectureNode = ArchitectureService | ArchitectureJunction;\n\nexport const isArchitectureService = function (x: ArchitectureNode): x is ArchitectureService {\n const temp = x as ArchitectureService;\n return temp.type === 'service';\n};\n\nexport const isArchitectureJunction = function (x: ArchitectureNode): x is ArchitectureJunction {\n const temp = x as ArchitectureJunction;\n return temp.type === 'junction';\n};\n\nexport interface ArchitectureGroup {\n id: string;\n icon?: string;\n title?: string;\n in?: string;\n}\n\nexport interface ArchitectureEdge
{\n lhsId: string;\n lhsDir: DT;\n lhsInto?: boolean;\n lhsGroup?: boolean;\n rhsId: string;\n rhsDir: DT;\n rhsInto?: boolean;\n rhsGroup?: boolean;\n title?: string;\n}\n\nexport interface ArchitectureDB extends DiagramDBBase {\n clear: () => void;\n addService: (service: Omit) => void;\n getServices: () => ArchitectureService[];\n addJunction: (service: Omit) => void;\n getJunctions: () => ArchitectureJunction[];\n getNodes: () => ArchitectureNode[];\n getNode: (id: string) => ArchitectureNode | null;\n addGroup: (group: ArchitectureGroup) => void;\n getGroups: () => ArchitectureGroup[];\n addEdge: (edge: ArchitectureEdge) => void;\n getEdges: () => ArchitectureEdge[];\n setElementForId: (id: string, element: D3Element) => void;\n getElementById: (id: string) => D3Element;\n getDataStructures: () => ArchitectureDataStructures;\n}\n\nexport type ArchitectureAdjacencyList = Record;\nexport type ArchitectureSpatialMap = Record;\n\n/**\n * Maps the direction that groups connect from.\n *\n * **Outer key**: ID of group A\n *\n * **Inner key**: ID of group B\n *\n * **Value**: 'vertical' or 'horizontal'\n *\n * Note: tmp[groupA][groupB] == tmp[groupB][groupA]\n */\nexport type ArchitectureGroupAlignments = Record<\n string,\n Record>\n>;\n\nexport interface ArchitectureDataStructures {\n adjList: ArchitectureAdjacencyList;\n spatialMaps: ArchitectureSpatialMap[];\n groupAlignments: ArchitectureGroupAlignments;\n}\n\nexport interface ArchitectureState extends Record {\n nodes: Record;\n groups: Record;\n edges: ArchitectureEdge[];\n registeredIds: Record;\n dataStructures?: ArchitectureDataStructures;\n elements: Record;\n config: ArchitectureDiagramConfig;\n}\n\n/*=======================================*\\\n| Cytoscape Override Types |\n\\*=======================================*/\n\nexport interface EdgeSingularData {\n id: string;\n label?: string;\n source: string;\n sourceDir: ArchitectureDirection;\n sourceArrow?: boolean;\n sourceGroup?: boolean;\n target: string;\n targetDir: ArchitectureDirection;\n targetArrow?: boolean;\n targetGroup?: boolean;\n [key: string]: any;\n}\n\nexport const edgeData = (edge: cytoscape.EdgeSingular) => {\n return edge.data() as EdgeSingularData;\n};\n\nexport interface EdgeSingular extends cytoscape.EdgeSingular {\n _private: {\n bodyBounds: unknown;\n rscratch: {\n startX: number;\n startY: number;\n midX: number;\n midY: number;\n endX: number;\n endY: number;\n };\n };\n data(): EdgeSingularData;\n data(key: T): EdgeSingularData[T];\n}\n\nexport type NodeSingularData =\n | {\n type: 'service';\n id: string;\n icon?: string;\n label?: string;\n parent?: string;\n width: number;\n height: number;\n [key: string]: any;\n }\n | {\n type: 'junction';\n id: string;\n parent?: string;\n width: number;\n height: number;\n [key: string]: any;\n }\n | {\n type: 'group';\n id: string;\n icon?: string;\n label?: string;\n parent?: string;\n [key: string]: any;\n };\n\nexport const nodeData = (node: cytoscape.NodeSingular) => {\n return node.data() as NodeSingularData;\n};\n\nexport interface NodeSingular extends cytoscape.NodeSingular {\n _private: {\n bodyBounds: {\n h: number;\n w: number;\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n };\n children: cytoscape.NodeSingular[];\n };\n data(): NodeSingularData;\n data(key: T): NodeSingularData[T];\n}\n", "import { getConfig as commonGetConfig } from '../../config.js';\nimport type { ArchitectureDiagramConfig } from '../../config.type.js';\nimport DEFAULT_CONFIG from '../../defaultConfig.js';\nimport type { DiagramDB } from '../../diagram-api/types.js';\nimport type { D3Element } from '../../types.js';\nimport { cleanAndMerge } from '../../utils.js';\nimport {\n clear as commonClear,\n getAccDescription,\n getAccTitle,\n getDiagramTitle,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n} from '../common/commonDb.js';\nimport type {\n ArchitectureAlignment,\n ArchitectureDirectionPair,\n ArchitectureDirectionPairMap,\n ArchitectureEdge,\n ArchitectureGroup,\n ArchitectureJunction,\n ArchitectureNode,\n ArchitectureService,\n ArchitectureSpatialMap,\n ArchitectureState,\n} from './architectureTypes.js';\nimport {\n getArchitectureDirectionAlignment,\n getArchitectureDirectionPair,\n isArchitectureDirection,\n isArchitectureJunction,\n isArchitectureService,\n shiftPositionByArchitectureDirectionPair,\n} from './architectureTypes.js';\n\nconst DEFAULT_ARCHITECTURE_CONFIG: Required =\n DEFAULT_CONFIG.architecture;\nexport class ArchitectureDB implements DiagramDB {\n private nodes: Record = {};\n private groups: Record = {};\n private edges: ArchitectureEdge[] = [];\n private registeredIds: Record = {};\n private dataStructures?: ArchitectureState['dataStructures'];\n private elements: Record = {};\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.nodes = {};\n this.groups = {};\n this.edges = [];\n this.registeredIds = {};\n this.dataStructures = undefined;\n this.elements = {};\n commonClear();\n }\n\n public addService({\n id,\n icon,\n in: parent,\n title,\n iconText,\n }: Omit): void {\n if (this.registeredIds[id] !== undefined) {\n throw new Error(\n `The service id [${id}] is already in use by another ${this.registeredIds[id]}`\n );\n }\n if (parent !== undefined) {\n if (id === parent) {\n throw new Error(`The service [${id}] cannot be placed within itself`);\n }\n if (this.registeredIds[parent] === undefined) {\n throw new Error(\n `The service [${id}]'s parent does not exist. Please make sure the parent is created before this service`\n );\n }\n if (this.registeredIds[parent] === 'node') {\n throw new Error(`The service [${id}]'s parent is not a group`);\n }\n }\n\n this.registeredIds[id] = 'node';\n\n this.nodes[id] = {\n id,\n type: 'service',\n icon,\n iconText,\n title,\n edges: [],\n in: parent,\n };\n }\n\n public getServices(): ArchitectureService[] {\n return Object.values(this.nodes).filter(isArchitectureService);\n }\n\n public addJunction({ id, in: parent }: Omit): void {\n this.registeredIds[id] = 'node';\n\n this.nodes[id] = {\n id,\n type: 'junction',\n edges: [],\n in: parent,\n };\n }\n\n public getJunctions(): ArchitectureJunction[] {\n return Object.values(this.nodes).filter(isArchitectureJunction);\n }\n\n public getNodes(): ArchitectureNode[] {\n return Object.values(this.nodes);\n }\n\n public getNode(id: string): ArchitectureNode | null {\n return this.nodes[id] ?? null;\n }\n\n public addGroup({ id, icon, in: parent, title }: ArchitectureGroup): void {\n if (this.registeredIds?.[id] !== undefined) {\n throw new Error(\n `The group id [${id}] is already in use by another ${this.registeredIds[id]}`\n );\n }\n if (parent !== undefined) {\n if (id === parent) {\n throw new Error(`The group [${id}] cannot be placed within itself`);\n }\n if (this.registeredIds?.[parent] === undefined) {\n throw new Error(\n `The group [${id}]'s parent does not exist. Please make sure the parent is created before this group`\n );\n }\n if (this.registeredIds?.[parent] === 'node') {\n throw new Error(`The group [${id}]'s parent is not a group`);\n }\n }\n\n this.registeredIds[id] = 'group';\n\n this.groups[id] = {\n id,\n icon,\n title,\n in: parent,\n };\n }\n public getGroups(): ArchitectureGroup[] {\n return Object.values(this.groups);\n }\n public addEdge({\n lhsId,\n rhsId,\n lhsDir,\n rhsDir,\n lhsInto,\n rhsInto,\n lhsGroup,\n rhsGroup,\n title,\n }: ArchitectureEdge): void {\n if (!isArchitectureDirection(lhsDir)) {\n throw new Error(\n `Invalid direction given for left hand side of edge ${lhsId}--${rhsId}. Expected (L,R,T,B) got ${String(lhsDir)}`\n );\n }\n if (!isArchitectureDirection(rhsDir)) {\n throw new Error(\n `Invalid direction given for right hand side of edge ${lhsId}--${rhsId}. Expected (L,R,T,B) got ${String(rhsDir)}`\n );\n }\n\n if (this.nodes[lhsId] === undefined && this.groups[lhsId] === undefined) {\n throw new Error(\n `The left-hand id [${lhsId}] does not yet exist. Please create the service/group before declaring an edge to it.`\n );\n }\n if (this.nodes[rhsId] === undefined && this.groups[rhsId] === undefined) {\n throw new Error(\n `The right-hand id [${rhsId}] does not yet exist. Please create the service/group before declaring an edge to it.`\n );\n }\n\n const lhsGroupId = this.nodes[lhsId].in;\n const rhsGroupId = this.nodes[rhsId].in;\n if (lhsGroup && lhsGroupId && rhsGroupId && lhsGroupId == rhsGroupId) {\n throw new Error(\n `The left-hand id [${lhsId}] is modified to traverse the group boundary, but the edge does not pass through two groups.`\n );\n }\n if (rhsGroup && lhsGroupId && rhsGroupId && lhsGroupId == rhsGroupId) {\n throw new Error(\n `The right-hand id [${rhsId}] is modified to traverse the group boundary, but the edge does not pass through two groups.`\n );\n }\n\n const edge = {\n lhsId,\n lhsDir,\n lhsInto,\n lhsGroup,\n rhsId,\n rhsDir,\n rhsInto,\n rhsGroup,\n title,\n };\n\n this.edges.push(edge);\n if (this.nodes[lhsId] && this.nodes[rhsId]) {\n this.nodes[lhsId].edges.push(this.edges[this.edges.length - 1]);\n this.nodes[rhsId].edges.push(this.edges[this.edges.length - 1]);\n }\n }\n\n public getEdges(): ArchitectureEdge[] {\n return this.edges;\n }\n\n /**\n * Returns the current diagram's adjacency list, spatial map, & group alignments.\n * If they have not been created, run the algorithms to generate them.\n * @returns\n */\n public getDataStructures() {\n if (this.dataStructures === undefined) {\n // Tracks how groups are aligned with one another. Generated while creating the adj list\n const groupAlignments: Record<\n string,\n Record>\n > = {};\n\n // Create an adjacency list of the diagram to perform BFS on\n // Outer reduce applied on all services\n // Inner reduce applied on the edges for a service\n const adjList = Object.entries(this.nodes).reduce<\n Record\n >((prevOuter, [id, service]) => {\n prevOuter[id] = service.edges.reduce((prevInner, edge) => {\n // track the direction groups connect to one another\n const lhsGroupId = this.getNode(edge.lhsId)?.in;\n const rhsGroupId = this.getNode(edge.rhsId)?.in;\n if (lhsGroupId && rhsGroupId && lhsGroupId !== rhsGroupId) {\n const alignment = getArchitectureDirectionAlignment(edge.lhsDir, edge.rhsDir);\n if (alignment !== 'bend') {\n groupAlignments[lhsGroupId] ??= {};\n groupAlignments[lhsGroupId][rhsGroupId] = alignment;\n groupAlignments[rhsGroupId] ??= {};\n groupAlignments[rhsGroupId][lhsGroupId] = alignment;\n }\n }\n\n if (edge.lhsId === id) {\n // source is LHS\n const pair = getArchitectureDirectionPair(edge.lhsDir, edge.rhsDir);\n if (pair) {\n prevInner[pair] = edge.rhsId;\n }\n } else {\n // source is RHS\n const pair = getArchitectureDirectionPair(edge.rhsDir, edge.lhsDir);\n if (pair) {\n prevInner[pair] = edge.lhsId;\n }\n }\n return prevInner;\n }, {});\n return prevOuter;\n }, {});\n\n // Configuration for the initial pass of BFS\n const firstId = Object.keys(adjList)[0];\n const visited = { [firstId]: 1 };\n // If a key is present in this object, it has not been visited\n const notVisited = Object.keys(adjList).reduce(\n (prev, id) => (id === firstId ? prev : { ...prev, [id]: 1 }),\n {} as Record\n );\n\n // Perform BFS on the adjacency list\n const BFS = (startingId: string): ArchitectureSpatialMap => {\n const spatialMap = { [startingId]: [0, 0] };\n const queue = [startingId];\n while (queue.length > 0) {\n const id = queue.shift();\n if (id) {\n visited[id] = 1;\n delete notVisited[id];\n const adj = adjList[id];\n const [posX, posY] = spatialMap[id];\n Object.entries(adj).forEach(([dir, rhsId]) => {\n if (!visited[rhsId]) {\n spatialMap[rhsId] = shiftPositionByArchitectureDirectionPair(\n [posX, posY],\n dir as ArchitectureDirectionPair\n );\n queue.push(rhsId);\n }\n });\n }\n }\n return spatialMap;\n };\n const spatialMaps = [BFS(firstId)];\n\n // If our diagram is disconnected, keep adding additional spatial maps until all disconnected graphs have been found\n while (Object.keys(notVisited).length > 0) {\n spatialMaps.push(BFS(Object.keys(notVisited)[0]));\n }\n this.dataStructures = {\n adjList,\n spatialMaps,\n groupAlignments,\n };\n }\n return this.dataStructures;\n }\n\n public setElementForId(id: string, element: D3Element): void {\n this.elements[id] = element;\n }\n\n public getElementById(id: string): D3Element {\n return this.elements[id];\n }\n\n public getConfig(): Required {\n return cleanAndMerge({\n ...DEFAULT_ARCHITECTURE_CONFIG,\n ...commonGetConfig().architecture,\n });\n }\n\n public getConfigField(\n field: T\n ): Required[T] {\n return this.getConfig()[field];\n }\n\n public setAccTitle = setAccTitle;\n public getAccTitle = getAccTitle;\n public setDiagramTitle = setDiagramTitle;\n public getDiagramTitle = getDiagramTitle;\n public getAccDescription = getAccDescription;\n public setAccDescription = setAccDescription;\n}\n\n/**\n * Typed wrapper for resolving an architecture diagram's config fields. Returns the default value if undefined\n * @param field - the config field to access\n * @returns\n */\n// export function getConfigField(\n// field: T\n// ): Required[T] {\n// return db.getConfig()[field];\n// }\n", "import type { Architecture } from '@mermaid-js/parser';\nimport { parse } from '@mermaid-js/parser';\nimport type { ParserDefinition } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { populateCommonDb } from '../common/populateCommonDb.js';\nimport { ArchitectureDB } from './architectureDb.js';\n\nconst populateDb = (ast: Architecture, db: ArchitectureDB) => {\n populateCommonDb(ast, db);\n ast.groups.map((group) => db.addGroup(group));\n ast.services.map((service) => db.addService({ ...service, type: 'service' }));\n ast.junctions.map((service) => db.addJunction({ ...service, type: 'junction' }));\n // @ts-ignore TODO our parser guarantees the type is L/R/T/B and not string. How to change to union type?\n ast.edges.map((edge) => db.addEdge(edge));\n};\n\nexport const parser: ParserDefinition = {\n parser: {\n // @ts-expect-error - ArchitectureDB is not assignable to DiagramDB\n yy: undefined,\n },\n parse: async (input: string): Promise => {\n const ast: Architecture = await parse('architecture', input);\n log.debug(ast);\n const db = parser.parser?.yy;\n if (!(db instanceof ArchitectureDB)) {\n throw new Error(\n 'parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.'\n );\n }\n populateDb(ast, db);\n },\n};\n", "import type { DiagramStylesProvider } from '../../diagram-api/types.js';\nimport type { ArchitectureStyleOptions } from './architectureTypes.js';\n\nconst getStyles: DiagramStylesProvider = (options: ArchitectureStyleOptions) =>\n `\n .edge {\n stroke-width: ${options.archEdgeWidth};\n stroke: ${options.archEdgeColor};\n fill: none;\n }\n\n .arrow {\n fill: ${options.archEdgeArrowColor};\n }\n\n .node-bkg {\n fill: none;\n stroke: ${options.archGroupBorderColor};\n stroke-width: ${options.archGroupBorderWidth};\n stroke-dasharray: 8;\n }\n .node-icon-text {\n display: flex; \n align-items: center;\n }\n \n .node-icon-text > div {\n color: #fff;\n margin: 1px;\n height: fit-content;\n text-align: center;\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n }\n`;\n\nexport default getStyles;\n", "import type { LayoutOptions, Position } from 'cytoscape';\nimport cytoscape from 'cytoscape';\nimport fcose from 'cytoscape-fcose';\nimport { select } from 'd3';\nimport type { DrawDefinition, SVG } from '../../diagram-api/types.js';\nimport type { Diagram } from '../../Diagram.js';\nimport { log } from '../../logger.js';\nimport { registerIconPacks } from '../../rendering-util/icons.js';\nimport { selectSvgElement } from '../../rendering-util/selectSvgElement.js';\nimport { setupGraphViewbox } from '../../setupGraphViewbox.js';\nimport type { ArchitectureDB } from './architectureDb.js';\nimport { architectureIcons } from './architectureIcons.js';\nimport type {\n ArchitectureAlignment,\n ArchitectureDataStructures,\n ArchitectureGroupAlignments,\n ArchitectureJunction,\n ArchitectureSpatialMap,\n EdgeSingular,\n EdgeSingularData,\n NodeSingularData,\n} from './architectureTypes.js';\nimport {\n type ArchitectureDirection,\n type ArchitectureEdge,\n type ArchitectureGroup,\n type ArchitectureService,\n ArchitectureDirectionName,\n edgeData,\n getOppositeArchitectureDirection,\n isArchitectureDirectionXY,\n isArchitectureDirectionY,\n nodeData,\n} from './architectureTypes.js';\nimport { drawEdges, drawGroups, drawJunctions, drawServices } from './svgDraw.js';\n\nregisterIconPacks([\n {\n name: architectureIcons.prefix,\n icons: architectureIcons,\n },\n]);\ncytoscape.use(fcose as any);\n\nfunction addServices(services: ArchitectureService[], cy: cytoscape.Core, db: ArchitectureDB) {\n services.forEach((service) => {\n cy.add({\n group: 'nodes',\n data: {\n type: 'service',\n id: service.id,\n icon: service.icon,\n label: service.title,\n parent: service.in,\n width: db.getConfigField('iconSize'),\n height: db.getConfigField('iconSize'),\n } as NodeSingularData,\n classes: 'node-service',\n });\n });\n}\n\nfunction addJunctions(junctions: ArchitectureJunction[], cy: cytoscape.Core, db: ArchitectureDB) {\n junctions.forEach((junction) => {\n cy.add({\n group: 'nodes',\n data: {\n type: 'junction',\n id: junction.id,\n parent: junction.in,\n width: db.getConfigField('iconSize'),\n height: db.getConfigField('iconSize'),\n } as NodeSingularData,\n classes: 'node-junction',\n });\n });\n}\n\nfunction positionNodes(db: ArchitectureDB, cy: cytoscape.Core) {\n cy.nodes().map((node) => {\n const data = nodeData(node);\n if (data.type === 'group') {\n return;\n }\n data.x = node.position().x;\n data.y = node.position().y;\n\n const nodeElem = db.getElementById(data.id);\n nodeElem.attr('transform', 'translate(' + (data.x || 0) + ',' + (data.y || 0) + ')');\n });\n}\n\nfunction addGroups(groups: ArchitectureGroup[], cy: cytoscape.Core) {\n groups.forEach((group) => {\n cy.add({\n group: 'nodes',\n data: {\n type: 'group',\n id: group.id,\n icon: group.icon,\n label: group.title,\n parent: group.in,\n } as NodeSingularData,\n classes: 'node-group',\n });\n });\n}\n\nfunction addEdges(edges: ArchitectureEdge[], cy: cytoscape.Core) {\n edges.forEach((parsedEdge) => {\n const { lhsId, rhsId, lhsInto, lhsGroup, rhsInto, lhsDir, rhsDir, rhsGroup, title } =\n parsedEdge;\n const edgeType = isArchitectureDirectionXY(parsedEdge.lhsDir, parsedEdge.rhsDir)\n ? 'segments'\n : 'straight';\n const edge: EdgeSingularData = {\n id: `${lhsId}-${rhsId}`,\n label: title,\n source: lhsId,\n sourceDir: lhsDir,\n sourceArrow: lhsInto,\n sourceGroup: lhsGroup,\n sourceEndpoint:\n lhsDir === 'L'\n ? '0 50%'\n : lhsDir === 'R'\n ? '100% 50%'\n : lhsDir === 'T'\n ? '50% 0'\n : '50% 100%',\n target: rhsId,\n targetDir: rhsDir,\n targetArrow: rhsInto,\n targetGroup: rhsGroup,\n targetEndpoint:\n rhsDir === 'L'\n ? '0 50%'\n : rhsDir === 'R'\n ? '100% 50%'\n : rhsDir === 'T'\n ? '50% 0'\n : '50% 100%',\n };\n cy.add({\n group: 'edges',\n data: edge,\n classes: edgeType,\n });\n });\n}\n\nfunction getAlignments(\n db: ArchitectureDB,\n spatialMaps: ArchitectureSpatialMap[],\n groupAlignments: ArchitectureGroupAlignments\n): fcose.FcoseAlignmentConstraint {\n /**\n * Flattens the alignment object so nodes in different groups will be in the same alignment array IFF their groups don't connect in a conflicting alignment\n *\n * i.e., two groups which connect horizontally should not have nodes with vertical alignments to one another\n *\n * See: #5952\n *\n * @param alignmentObj - alignment object with the outer key being the row/col # and the inner key being the group name mapped to the nodes on that axis in the group\n * @param alignmentDir - alignment direction\n * @returns flattened alignment object with an arbitrary key mapping to nodes in the same row/col\n */\n const flattenAlignments = (\n alignmentObj: Record>,\n alignmentDir: ArchitectureAlignment\n ): Record => {\n return Object.entries(alignmentObj).reduce(\n (prev, [dir, alignments]) => {\n // prev is the mapping of x/y coordinate to an array of the nodes in that row/column\n let cnt = 0;\n const arr = Object.entries(alignments); // [group name, array of nodes within the group on axis dir]\n if (arr.length === 1) {\n // If only one group exists in the row/column, we don't need to do anything else\n prev[dir] = arr[0][1];\n return prev;\n }\n for (let i = 0; i < arr.length - 1; i++) {\n for (let j = i + 1; j < arr.length; j++) {\n const [aGroupId, aNodeIds] = arr[i];\n const [bGroupId, bNodeIds] = arr[j];\n const alignment = groupAlignments[aGroupId]?.[bGroupId]; // Get how the two groups are intended to align (undefined if they aren't)\n\n if (alignment === alignmentDir) {\n // If the intended alignment between the two groups is the same as the alignment we are parsing\n prev[dir] ??= [];\n prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds]; // add the node ids of both groups to the axis array in prev\n } else if (aGroupId === 'default' || bGroupId === 'default') {\n // If either of the groups are in the default space (not in a group), use the same behavior as above\n prev[dir] ??= [];\n prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds];\n } else {\n // Otherwise, the nodes in the two groups are not intended to align\n const keyA = `${dir}-${cnt++}`;\n prev[keyA] = aNodeIds;\n const keyB = `${dir}-${cnt++}`;\n prev[keyB] = bNodeIds;\n }\n }\n }\n\n return prev;\n },\n {} as Record\n );\n };\n\n const alignments = spatialMaps.map((spatialMap) => {\n const horizontalAlignments: Record> = {};\n const verticalAlignments: Record> = {};\n\n // Group service ids in an object with their x and y coordinate as the key\n Object.entries(spatialMap).forEach(([id, [x, y]]) => {\n const nodeGroup = db.getNode(id)?.in ?? 'default';\n\n horizontalAlignments[y] ??= {};\n horizontalAlignments[y][nodeGroup] ??= [];\n horizontalAlignments[y][nodeGroup].push(id);\n\n verticalAlignments[x] ??= {};\n verticalAlignments[x][nodeGroup] ??= [];\n verticalAlignments[x][nodeGroup].push(id);\n });\n\n // Merge the values of each object into a list if the inner list has at least 2 elements\n return {\n horiz: Object.values(flattenAlignments(horizontalAlignments, 'horizontal')).filter(\n (arr) => arr.length > 1\n ),\n vert: Object.values(flattenAlignments(verticalAlignments, 'vertical')).filter(\n (arr) => arr.length > 1\n ),\n };\n });\n\n // Merge the alignment lists for each spatial map into one 2d array per axis\n const [horizontal, vertical] = alignments.reduce(\n ([prevHoriz, prevVert], { horiz, vert }) => {\n return [\n [...prevHoriz, ...horiz],\n [...prevVert, ...vert],\n ];\n },\n [[] as string[][], [] as string[][]]\n );\n\n return {\n horizontal,\n vertical,\n };\n}\n\nfunction getRelativeConstraints(\n spatialMaps: ArchitectureSpatialMap[],\n db: ArchitectureDB\n): fcose.FcoseRelativePlacementConstraint[] {\n const relativeConstraints: fcose.FcoseRelativePlacementConstraint[] = [];\n const posToStr = (pos: number[]) => `${pos[0]},${pos[1]}`;\n const strToPos = (pos: string) => pos.split(',').map((p) => parseInt(p));\n\n spatialMaps.forEach((spatialMap) => {\n const invSpatialMap = Object.fromEntries(\n Object.entries(spatialMap).map(([id, pos]) => [posToStr(pos), id])\n );\n\n // perform BFS\n const queue = [posToStr([0, 0])];\n const visited: Record = {};\n const directions: Record = {\n L: [-1, 0],\n R: [1, 0],\n T: [0, 1],\n B: [0, -1],\n };\n while (queue.length > 0) {\n const curr = queue.shift();\n if (curr) {\n visited[curr] = 1;\n const currId = invSpatialMap[curr];\n if (currId) {\n const currPos = strToPos(curr);\n Object.entries(directions).forEach(([dir, shift]) => {\n const newPos = posToStr([currPos[0] + shift[0], currPos[1] + shift[1]]);\n const newId = invSpatialMap[newPos];\n // If there is an adjacent service to the current one and it has not yet been visited\n if (newId && !visited[newPos]) {\n queue.push(newPos);\n // @ts-ignore cannot determine if left/right or top/bottom are paired together\n relativeConstraints.push({\n [ArchitectureDirectionName[dir as ArchitectureDirection]]: newId,\n [ArchitectureDirectionName[\n getOppositeArchitectureDirection(dir as ArchitectureDirection)\n ]]: currId,\n gap: 1.5 * db.getConfigField('iconSize'),\n });\n }\n });\n }\n }\n }\n });\n return relativeConstraints;\n}\n\nfunction layoutArchitecture(\n services: ArchitectureService[],\n junctions: ArchitectureJunction[],\n groups: ArchitectureGroup[],\n edges: ArchitectureEdge[],\n db: ArchitectureDB,\n { spatialMaps, groupAlignments }: ArchitectureDataStructures\n): Promise {\n return new Promise((resolve) => {\n const renderEl = select('body').append('div').attr('id', 'cy').attr('style', 'display:none');\n const cy = cytoscape({\n container: document.getElementById('cy'),\n style: [\n {\n selector: 'edge',\n style: {\n 'curve-style': 'straight',\n label: 'data(label)',\n 'source-endpoint': 'data(sourceEndpoint)',\n 'target-endpoint': 'data(targetEndpoint)',\n },\n },\n {\n selector: 'edge.segments',\n style: {\n 'curve-style': 'segments',\n 'segment-weights': '0',\n 'segment-distances': [0.5],\n // @ts-ignore Incorrect library types\n 'edge-distances': 'endpoints',\n 'source-endpoint': 'data(sourceEndpoint)',\n 'target-endpoint': 'data(targetEndpoint)',\n },\n },\n {\n selector: 'node',\n style: {\n // @ts-ignore Incorrect library types\n 'compound-sizing-wrt-labels': 'include',\n },\n },\n {\n selector: 'node[label]',\n style: {\n 'text-valign': 'bottom',\n 'text-halign': 'center',\n 'font-size': `${db.getConfigField('fontSize')}px`,\n },\n },\n {\n selector: '.node-service',\n style: {\n label: 'data(label)',\n width: 'data(width)',\n height: 'data(height)',\n },\n },\n {\n selector: '.node-junction',\n style: {\n width: 'data(width)',\n height: 'data(height)',\n },\n },\n {\n selector: '.node-group',\n style: {\n // @ts-ignore Incorrect library types\n padding: `${db.getConfigField('padding')}px`,\n },\n },\n ],\n layout: {\n name: 'grid',\n boundingBox: {\n x1: 0,\n x2: 100,\n y1: 0,\n y2: 100,\n },\n },\n });\n // Remove element after layout\n renderEl.remove();\n\n addGroups(groups, cy);\n addServices(services, cy, db);\n addJunctions(junctions, cy, db);\n addEdges(edges, cy);\n // Use the spatial map to create alignment arrays for fcose\n const alignmentConstraint = getAlignments(db, spatialMaps, groupAlignments);\n\n // Create the relative constraints for fcose by using an inverse of the spatial map and performing BFS on it\n const relativePlacementConstraint = getRelativeConstraints(spatialMaps, db);\n\n const layout = cy.layout({\n name: 'fcose',\n quality: 'proof',\n styleEnabled: false,\n animate: false,\n nodeDimensionsIncludeLabels: false,\n // Adjust the edge parameters if it passes through the border of a group\n // Hacky fix for: https://github.com/iVis-at-Bilkent/cytoscape.js-fcose/issues/67\n idealEdgeLength(edge: EdgeSingular) {\n const [nodeA, nodeB] = edge.connectedNodes();\n const { parent: parentA } = nodeData(nodeA);\n const { parent: parentB } = nodeData(nodeB);\n const elasticity =\n parentA === parentB\n ? 1.5 * db.getConfigField('iconSize')\n : 0.5 * db.getConfigField('iconSize');\n return elasticity;\n },\n edgeElasticity(edge: EdgeSingular) {\n const [nodeA, nodeB] = edge.connectedNodes();\n const { parent: parentA } = nodeData(nodeA);\n const { parent: parentB } = nodeData(nodeB);\n const elasticity = parentA === parentB ? 0.45 : 0.001;\n return elasticity;\n },\n alignmentConstraint,\n relativePlacementConstraint,\n } as LayoutOptions);\n\n // Once the diagram has been generated and the service's position cords are set, adjust the XY edges to have a 90deg bend\n layout.one('layoutstop', () => {\n function getSegmentWeights(\n source: Position,\n target: Position,\n pointX: number,\n pointY: number\n ) {\n let W, D;\n const { x: sX, y: sY } = source;\n const { x: tX, y: tY } = target;\n\n D =\n (pointY - sY + ((sX - pointX) * (sY - tY)) / (sX - tX)) /\n Math.sqrt(1 + Math.pow((sY - tY) / (sX - tX), 2));\n W = Math.sqrt(Math.pow(pointY - sY, 2) + Math.pow(pointX - sX, 2) - Math.pow(D, 2));\n\n const distAB = Math.sqrt(Math.pow(tX - sX, 2) + Math.pow(tY - sY, 2));\n W = W / distAB;\n\n //check whether the point (pointX, pointY) is on right or left of the line src to tgt. for instance : a point C(X, Y) and line (AB). d=(xB-xA)(yC-yA)-(yB-yA)(xC-xA). if d>0, then C is on left of the line. if d<0, it is on right. if d=0, it is on the line.\n let delta1 = (tX - sX) * (pointY - sY) - (tY - sY) * (pointX - sX);\n switch (true) {\n case delta1 >= 0:\n delta1 = 1;\n break;\n case delta1 < 0:\n delta1 = -1;\n break;\n }\n //check whether the point (pointX, pointY) is \"behind\" the line src to tgt\n let delta2 = (tX - sX) * (pointX - sX) + (tY - sY) * (pointY - sY);\n switch (true) {\n case delta2 >= 0:\n delta2 = 1;\n break;\n case delta2 < 0:\n delta2 = -1;\n break;\n }\n\n D = Math.abs(D) * delta1; //ensure that sign of D is same as sign of delta1. Hence we need to take absolute value of D and multiply by delta1\n W = W * delta2;\n\n return {\n distances: D,\n weights: W,\n };\n }\n cy.startBatch();\n for (const edge of Object.values(cy.edges())) {\n if (edge.data?.()) {\n const { x: sX, y: sY } = edge.source().position();\n const { x: tX, y: tY } = edge.target().position();\n if (sX !== tX && sY !== tY) {\n const sEP = edge.sourceEndpoint();\n const tEP = edge.targetEndpoint();\n const { sourceDir } = edgeData(edge);\n const [pointX, pointY] = isArchitectureDirectionY(sourceDir)\n ? [sEP.x, tEP.y]\n : [tEP.x, sEP.y];\n const { weights, distances } = getSegmentWeights(sEP, tEP, pointX, pointY);\n edge.style('segment-distances', distances);\n edge.style('segment-weights', weights);\n }\n }\n }\n cy.endBatch();\n layout.run();\n });\n layout.run();\n\n cy.ready((e) => {\n log.info('Ready', e);\n resolve(cy);\n });\n });\n}\n\nexport const draw: DrawDefinition = async (text, id, _version, diagObj: Diagram) => {\n // TODO: Add title support for architecture diagrams\n\n const db = diagObj.db as ArchitectureDB;\n\n const services = db.getServices();\n const junctions = db.getJunctions();\n const groups = db.getGroups();\n const edges = db.getEdges();\n const ds = db.getDataStructures();\n\n const svg: SVG = selectSvgElement(id);\n\n const edgesElem = svg.append('g');\n edgesElem.attr('class', 'architecture-edges');\n\n const servicesElem = svg.append('g');\n servicesElem.attr('class', 'architecture-services');\n\n const groupElem = svg.append('g');\n groupElem.attr('class', 'architecture-groups');\n\n await drawServices(db, servicesElem, services);\n drawJunctions(db, servicesElem, junctions);\n\n const cy = await layoutArchitecture(services, junctions, groups, edges, db, ds);\n\n await drawEdges(edgesElem, cy, db);\n await drawGroups(groupElem, cy, db);\n positionNodes(db, cy);\n\n setupGraphViewbox(undefined, svg, db.getConfigField('padding'), db.getConfigField('useMaxWidth'));\n};\n\nexport const renderer = { draw };\n", "import { unknownIcon } from '../../rendering-util/icons.js';\nimport type { IconifyJSON } from '@iconify/types';\n\nconst wrapIcon = (icon: string) => {\n return `${icon}`;\n};\n\nexport const architectureIcons: IconifyJSON = {\n prefix: 'mermaid-architecture',\n height: 80,\n width: 80,\n icons: {\n database: {\n body: wrapIcon(\n ''\n ),\n },\n server: {\n body: wrapIcon(\n ''\n ),\n },\n disk: {\n body: wrapIcon(\n ''\n ),\n },\n internet: {\n body: wrapIcon(\n ''\n ),\n },\n cloud: {\n body: wrapIcon(\n ''\n ),\n },\n unknown: unknownIcon,\n blank: {\n body: wrapIcon(''),\n },\n },\n};\n", "import type cytoscape from 'cytoscape';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { createText } from '../../rendering-util/createText.js';\nimport { getIconSVG } from '../../rendering-util/icons.js';\nimport type { D3Element } from '../../types.js';\nimport { sanitizeText } from '../common/common.js';\nimport type { ArchitectureDB } from './architectureDb.js';\nimport { architectureIcons } from './architectureIcons.js';\nimport {\n ArchitectureDirectionArrow,\n ArchitectureDirectionArrowShift,\n edgeData,\n getArchitectureDirectionPair,\n getArchitectureDirectionXYFactors,\n isArchitectureDirectionX,\n isArchitectureDirectionXY,\n isArchitectureDirectionY,\n isArchitecturePairXY,\n nodeData,\n type ArchitectureJunction,\n type ArchitectureService,\n} from './architectureTypes.js';\nimport { getEdgeId } from '../../utils.js';\n\nexport const drawEdges = async function (\n edgesEl: D3Element,\n cy: cytoscape.Core,\n db: ArchitectureDB\n) {\n const padding = db.getConfigField('padding');\n const iconSize = db.getConfigField('iconSize');\n const halfIconSize = iconSize / 2;\n const arrowSize = iconSize / 6;\n const halfArrowSize = arrowSize / 2;\n\n await Promise.all(\n cy.edges().map(async (edge) => {\n const {\n source,\n sourceDir,\n sourceArrow,\n sourceGroup,\n target,\n targetDir,\n targetArrow,\n targetGroup,\n label,\n } = edgeData(edge);\n let { x: startX, y: startY } = edge[0].sourceEndpoint();\n const { x: midX, y: midY } = edge[0].midpoint();\n let { x: endX, y: endY } = edge[0].targetEndpoint();\n\n // Adjust the edge distance if it has the {group} modifier\n const groupEdgeShift = padding + 4;\n // +18 comes from the service label height that extends the padding on the bottom side of each group\n if (sourceGroup) {\n if (isArchitectureDirectionX(sourceDir)) {\n startX += sourceDir === 'L' ? -groupEdgeShift : groupEdgeShift;\n } else {\n startY += sourceDir === 'T' ? -groupEdgeShift : groupEdgeShift + 18;\n }\n }\n\n if (targetGroup) {\n if (isArchitectureDirectionX(targetDir)) {\n endX += targetDir === 'L' ? -groupEdgeShift : groupEdgeShift;\n } else {\n endY += targetDir === 'T' ? -groupEdgeShift : groupEdgeShift + 18;\n }\n }\n\n // Adjust the edge distance if it doesn't have the {group} modifier and the endpoint is a junction node\n if (!sourceGroup && db.getNode(source)?.type === 'junction') {\n if (isArchitectureDirectionX(sourceDir)) {\n startX += sourceDir === 'L' ? halfIconSize : -halfIconSize;\n } else {\n startY += sourceDir === 'T' ? halfIconSize : -halfIconSize;\n }\n }\n if (!targetGroup && db.getNode(target)?.type === 'junction') {\n if (isArchitectureDirectionX(targetDir)) {\n endX += targetDir === 'L' ? halfIconSize : -halfIconSize;\n } else {\n endY += targetDir === 'T' ? halfIconSize : -halfIconSize;\n }\n }\n\n if (edge[0]._private.rscratch) {\n // const bounds = edge[0]._private.rscratch;\n\n const g = edgesEl.insert('g');\n\n g.insert('path')\n .attr('d', `M ${startX},${startY} L ${midX},${midY} L${endX},${endY} `)\n .attr('class', 'edge')\n .attr('id', getEdgeId(source, target, { prefix: 'L' }));\n\n if (sourceArrow) {\n const xShift = isArchitectureDirectionX(sourceDir)\n ? ArchitectureDirectionArrowShift[sourceDir](startX, arrowSize)\n : startX - halfArrowSize;\n const yShift = isArchitectureDirectionY(sourceDir)\n ? ArchitectureDirectionArrowShift[sourceDir](startY, arrowSize)\n : startY - halfArrowSize;\n\n g.insert('polygon')\n .attr('points', ArchitectureDirectionArrow[sourceDir](arrowSize))\n .attr('transform', `translate(${xShift},${yShift})`)\n .attr('class', 'arrow');\n }\n if (targetArrow) {\n const xShift = isArchitectureDirectionX(targetDir)\n ? ArchitectureDirectionArrowShift[targetDir](endX, arrowSize)\n : endX - halfArrowSize;\n const yShift = isArchitectureDirectionY(targetDir)\n ? ArchitectureDirectionArrowShift[targetDir](endY, arrowSize)\n : endY - halfArrowSize;\n\n g.insert('polygon')\n .attr('points', ArchitectureDirectionArrow[targetDir](arrowSize))\n .attr('transform', `translate(${xShift},${yShift})`)\n .attr('class', 'arrow');\n }\n\n if (label) {\n const axis = !isArchitectureDirectionXY(sourceDir, targetDir)\n ? isArchitectureDirectionX(sourceDir)\n ? 'X'\n : 'Y'\n : 'XY';\n\n let width = 0;\n if (axis === 'X') {\n width = Math.abs(startX - endX);\n } else if (axis === 'Y') {\n // Reduce width by a factor of 1.5 to avoid overlapping service labels\n width = Math.abs(startY - endY) / 1.5;\n } else {\n width = Math.abs(startX - endX) / 2;\n }\n\n const textElem = g.append('g');\n await createText(\n textElem,\n label,\n {\n useHtmlLabels: false,\n width,\n classes: 'architecture-service-label',\n },\n getConfig()\n );\n\n textElem\n .attr('dy', '1em')\n .attr('alignment-baseline', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'middle');\n\n if (axis === 'X') {\n textElem.attr('transform', 'translate(' + midX + ', ' + midY + ')');\n } else if (axis === 'Y') {\n textElem.attr('transform', 'translate(' + midX + ', ' + midY + ') rotate(-90)');\n } else if (axis === 'XY') {\n const pair = getArchitectureDirectionPair(sourceDir, targetDir);\n if (pair && isArchitecturePairXY(pair)) {\n const bboxOrig = textElem.node().getBoundingClientRect();\n const [x, y] = getArchitectureDirectionXYFactors(pair);\n\n textElem\n .attr('dominant-baseline', 'auto')\n .attr('transform', `rotate(${-1 * x * y * 45})`);\n\n // Calculate the new width/height with the rotation applied, and transform to the proper position\n const bboxNew = textElem.node().getBoundingClientRect();\n textElem.attr(\n 'transform',\n `\n translate(${midX}, ${midY - bboxOrig.height / 2})\n translate(${(x * bboxNew.width) / 2}, ${(y * bboxNew.height) / 2})\n rotate(${-1 * x * y * 45}, 0, ${bboxOrig.height / 2})\n `\n );\n }\n }\n }\n }\n })\n );\n};\n\nexport const drawGroups = async function (\n groupsEl: D3Element,\n cy: cytoscape.Core,\n db: ArchitectureDB\n) {\n const padding = db.getConfigField('padding');\n const groupIconSize = padding * 0.75;\n\n const fontSize = db.getConfigField('fontSize');\n\n const iconSize = db.getConfigField('iconSize');\n const halfIconSize = iconSize / 2;\n\n await Promise.all(\n cy.nodes().map(async (node) => {\n const data = nodeData(node);\n if (data.type === 'group') {\n const { h, w, x1, y1 } = node.boundingBox();\n\n const groupsNode = groupsEl.append('rect');\n groupsNode\n .attr('id', `group-${data.id}`)\n .attr('x', x1 + halfIconSize)\n .attr('y', y1 + halfIconSize)\n .attr('width', w)\n .attr('height', h)\n .attr('class', 'node-bkg');\n\n const groupLabelContainer = groupsEl.append('g');\n let shiftedX1 = x1;\n let shiftedY1 = y1;\n if (data.icon) {\n const bkgElem = groupLabelContainer.append('g');\n bkgElem.html(\n `${await getIconSVG(data.icon, { height: groupIconSize, width: groupIconSize, fallbackPrefix: architectureIcons.prefix })}`\n );\n bkgElem.attr(\n 'transform',\n 'translate(' +\n (shiftedX1 + halfIconSize + 1) +\n ', ' +\n (shiftedY1 + halfIconSize + 1) +\n ')'\n );\n shiftedX1 += groupIconSize;\n // TODO: test with more values\n // - 1 - 2 comes from the Y axis transform of the icon and label\n shiftedY1 += fontSize / 2 - 1 - 2;\n }\n if (data.label) {\n const textElem = groupLabelContainer.append('g');\n await createText(\n textElem,\n data.label,\n {\n useHtmlLabels: false,\n width: w,\n classes: 'architecture-service-label',\n },\n getConfig()\n );\n textElem\n .attr('dy', '1em')\n .attr('alignment-baseline', 'middle')\n .attr('dominant-baseline', 'start')\n .attr('text-anchor', 'start');\n\n textElem.attr(\n 'transform',\n 'translate(' +\n (shiftedX1 + halfIconSize + 4) +\n ', ' +\n (shiftedY1 + halfIconSize + 2) +\n ')'\n );\n }\n db.setElementForId(data.id, groupsNode);\n }\n })\n );\n};\n\nexport const drawServices = async function (\n db: ArchitectureDB,\n elem: D3Element,\n services: ArchitectureService[]\n): Promise {\n const config = getConfig();\n for (const service of services) {\n const serviceElem = elem.append('g');\n const iconSize = db.getConfigField('iconSize');\n\n if (service.title) {\n const textElem = serviceElem.append('g');\n await createText(\n textElem,\n service.title,\n {\n useHtmlLabels: false,\n width: iconSize * 1.5,\n classes: 'architecture-service-label',\n },\n config\n );\n\n textElem\n .attr('dy', '1em')\n .attr('alignment-baseline', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'middle');\n\n textElem.attr('transform', 'translate(' + iconSize / 2 + ', ' + iconSize + ')');\n }\n\n const bkgElem = serviceElem.append('g');\n if (service.icon) {\n // TODO: should a warning be given to end-users saying which icon names are available?\n // if (!isIconNameInUse(service.icon)) {\n // throw new Error(`Invalid SVG Icon name: \"${service.icon}\"`);\n // }\n bkgElem.html(\n `${await getIconSVG(service.icon, { height: iconSize, width: iconSize, fallbackPrefix: architectureIcons.prefix })}`\n );\n } else if (service.iconText) {\n bkgElem.html(\n `${await getIconSVG('blank', { height: iconSize, width: iconSize, fallbackPrefix: architectureIcons.prefix })}`\n );\n const textElemContainer = bkgElem.append('g');\n const fo = textElemContainer\n .append('foreignObject')\n .attr('width', iconSize)\n .attr('height', iconSize);\n const divElem = fo\n .append('div')\n .attr('class', 'node-icon-text')\n .attr('style', `height: ${iconSize}px;`)\n .append('div')\n .html(sanitizeText(service.iconText, config));\n const fontSize =\n parseInt(\n window\n .getComputedStyle(divElem.node(), null)\n .getPropertyValue('font-size')\n .replace(/\\D/g, '')\n ) ?? 16;\n divElem.attr('style', `-webkit-line-clamp: ${Math.floor((iconSize - 2) / fontSize)};`);\n } else {\n bkgElem\n .append('path')\n .attr('class', 'node-bkg')\n .attr('id', 'node-' + service.id)\n .attr(\n 'd',\n `M0 ${iconSize} v${-iconSize} q0,-5 5,-5 h${iconSize} q5,0 5,5 v${iconSize} H0 Z`\n );\n }\n\n serviceElem.attr('id', `service-${service.id}`).attr('class', 'architecture-service');\n\n const { width, height } = serviceElem.node().getBBox();\n service.width = width;\n service.height = height;\n db.setElementForId(service.id, serviceElem);\n }\n return 0;\n};\n\nexport const drawJunctions = function (\n db: ArchitectureDB,\n elem: D3Element,\n junctions: ArchitectureJunction[]\n) {\n junctions.forEach((junction) => {\n const junctionElem = elem.append('g');\n const iconSize = db.getConfigField('iconSize');\n\n const bkgElem = junctionElem.append('g');\n bkgElem\n .append('rect')\n .attr('id', 'node-' + junction.id)\n .attr('fill-opacity', '0')\n .attr('width', iconSize)\n .attr('height', iconSize);\n\n junctionElem.attr('class', 'architecture-junction');\n\n const { width, height } = junctionElem._groups[0][0].getBBox();\n junctionElem.width = width;\n junctionElem.height = height;\n db.setElementForId(junction.id, junctionElem);\n });\n};\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { parser } from './architectureParser.js';\nimport { ArchitectureDB } from './architectureDb.js';\nimport styles from './architectureStyles.js';\nimport { renderer } from './architectureRenderer.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n get db() {\n return new ArchitectureDB();\n },\n renderer,\n styles,\n};\n"], + "mappings": "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", + "names": ["require_layout_base", "__commonJSMin", "exports", "module", "__name", "root", "factory", "modules", "installedModules", "__webpack_require__", "moduleId", "value", "name", "getter", "object", "property", "LayoutConstants", "LGraphObject", "IGeometry", "IMath", "LEdge", "source", "target", "vEdge", "prop", "node", "graph", "otherEnd", "clipPointCoordinates", "vGraphObject", "Integer", "RectangleD", "RandomSeed", "PointD", "LNode", "gm", "loc", "size", "vNode", "width", "height", "upperLeft", "dimension", "cx", "cy", "x", "y", "dx", "dy", "to", "edgeList", "edge", "self", "other", "neighbors", "withNeighborsList", "childNode", "children", "nodes", "i", "noOfChildren", "randomCenterX", "randomCenterY", "minX", "maxX", "minY", "maxY", "childGraph", "trans", "left", "top", "leftTop", "vLeftTop", "FDLayoutConstants", "pt", "dim", "LGraphManager", "Point", "LinkedList", "LGraph", "parent", "obj2", "vGraph", "obj1", "sourceNode", "targetNode", "newNode", "newEdge", "obj", "edgesToBeRemoved", "s", "index", "sourceIndex", "targetIndex", "nodeTop", "nodeLeft", "margin", "lNode", "recursive", "right", "bottom", "nodeRight", "nodeBottom", "boundingRect", "queue", "visited", "currentNode", "neighborEdges", "currentNeighbor", "childrenOfNode", "neighborEdge", "childrenOfNeighbor", "noOfVisitedInThisGraph", "visitedNode", "layout", "ngraph", "nnode", "newGraph", "parentNode", "sourceGraph", "targetGraph", "lObj", "nodesToBeRemoved", "nodeList", "graphs", "firstNode", "secondNode", "ownerGraph", "sourceAncestorGraph", "targetAncestorGraph", "edges", "firstOwnerGraph", "secondOwnerGraph", "depth", "edgesToRemove", "rectA", "rectB", "overlapAmount", "separationBuffer", "directions", "slope", "moveByY", "moveByX", "result", "p1x", "p1y", "p2x", "p2y", "topLeftAx", "topLeftAy", "topRightAx", "bottomLeftAx", "bottomLeftAy", "bottomRightAx", "halfWidthA", "halfHeightA", "topLeftBx", "topLeftBy", "topRightBx", "bottomLeftBx", "bottomLeftBy", "bottomRightBx", "halfWidthB", "halfHeightB", "clipPointAFound", "clipPointBFound", "slopeA", "slopeB", "slopePrime", "cardinalDirectionA", "cardinalDirectionB", "tempPointAx", "tempPointAy", "tempPointBx", "tempPointBy", "line", "s1", "s2", "f1", "f2", "x1", "y1", "x2", "y2", "x3", "y3", "x4", "y4", "a1", "a2", "b1", "b2", "c1", "c2", "denom", "Cx", "Cy", "Nx", "Ny", "C_angle", "p1", "p2", "p3", "p4", "a", "b", "c", "d", "p", "q", "r", "det", "lambda", "gamma", "Ex", "Ey", "Lx", "Ly", "disc", "t1", "t2", "intersections", "_createClass", "defineProperties", "props", "descriptor", "Constructor", "protoProps", "staticProps", "_classCallCheck", "instance", "nodeFrom", "add", "prev", "next", "list", "_remove", "vals", "_this", "v", "val", "otherNode", "current", "_typeof", "UniqueIDGeneretor", "id", "arg", "type", "_toConsumableArray", "arr", "arr2", "Transform", "Emitter", "Layout", "isRemoteUse", "isLayoutSuccessfull", "allEdges", "newLeftTop", "flatForest", "isForest", "allNodes", "isFlat", "toBeVisited", "parents", "unProcessedNodes", "temp", "dummyNodes", "dummyNode", "dummyEdge", "k", "lEdge", "path", "ebp", "sliderValue", "defaultValue", "minDiv", "maxMul", "minValue", "maxValue", "removedNodes", "remainingDegrees", "foundCenter", "centerNode", "degree", "tempList", "tempList2", "neighbours", "neighbour", "otherDegree", "newDegree", "wox", "woy", "wex", "wey", "dox", "doy", "dex", "dey", "xDevice", "worldExtX", "yDevice", "worldExtY", "xWorld", "deviceExtX", "yWorld", "deviceExtY", "inPoint", "outPoint", "FDLayout", "originalIdealLength", "lcaDepth", "sizeOfSourceInLca", "sizeOfTargetInLca", "lEdges", "gridUpdateAllowed", "forceToNodeSurroundingUpdate", "j", "nodeA", "nodeB", "lNodes", "processedNodeSet", "idealLength", "length", "springForce", "springForceX", "springForceY", "clipPoints", "distanceX", "distanceY", "distanceSquared", "distance", "repulsionForce", "repulsionForceX", "repulsionForceY", "childrenConstant", "ownerCenterX", "ownerCenterY", "absDistanceX", "absDistanceY", "estimatedSize", "converged", "oscilating", "sizeX", "sizeY", "grid", "startX", "finishX", "startY", "finishY", "surrounding", "FDLayoutEdge", "FDLayoutNode", "_startX", "_finishX", "_startY", "_finishY", "DimensionD", "HashMap", "key", "theId", "HashSet", "keys", "Matrix", "array1", "array2", "array", "constant", "product", "magnitude", "sum", "_i", "C", "INV", "temp1", "temp2", "_i2", "_sum", "_j", "_i3", "_sum2", "_j2", "Quicksort", "A", "compareFunction", "SVD", "nu", "dims", "allocate", "e", "work", "wantu", "wantv", "nct", "nrt", "lhs", "rhs", "t", "_i4", "_i5", "_i6", "_i7", "_i8", "_t", "_i9", "_i10", "_j3", "_i11", "_k", "_j4", "_t2", "_i12", "_i13", "_i14", "_i15", "_i16", "_k2", "_j5", "_t3", "_i17", "_i18", "_i19", "pp", "iter", "eps", "tiny", "_k3", "kase", "ks", "_t4", "f", "_j6", "_t5", "cs", "sn", "_i20", "_f", "_j7", "_t6", "_cs", "_sn", "_i21", "scale", "sp", "spm1", "epm1", "sk", "ek", "shift", "_f2", "g", "_j8", "_t7", "_cs2", "_sn2", "_i22", "_i23", "_i24", "_t8", "_i25", "_i26", "NeedlemanWunsch", "sequence1", "sequence2", "match_score", "mismatch_penalty", "gap_penalty", "diag", "up", "maxOf", "indices", "inProcessAlignments", "indexes", "layoutBase", "event", "callback", "l", "data", "require_cose_base", "__commonJSMin", "exports", "module", "__name", "root", "factory", "__WEBPACK_EXTERNAL_MODULE__551__", "__webpack_modules__", "__unused_webpack_exports", "__webpack_require__", "coseBase", "FDLayoutConstants", "CoSEConstants", "prop", "FDLayoutEdge", "CoSEEdge", "source", "target", "vEdge", "LGraph", "CoSEGraph", "parent", "graphMgr", "vGraph", "LGraphManager", "CoSEGraphManager", "layout", "FDLayout", "CoSENode", "ConstraintHandler", "LayoutConstants", "Point", "PointD", "DimensionD", "Layout", "Integer", "IGeometry", "Transform", "LinkedList", "CoSELayout", "gm", "vNode", "createBendsAsNeeded", "allNodes", "intersection", "x", "forest", "gridUpdateAllowed", "forceToNodeSurroundingUpdate", "pData", "i", "rect", "id", "layoutEnded", "lNodes", "node", "self", "calculateCompoundWeight", "compoundNode", "nodes", "fixedNodeWeight", "nodeData", "nodeToDummyForVerticalAlignment", "nodeToDummyForHorizontalAlignment", "nodeId", "verticalAlignment", "horizontalAlignment", "array", "j", "constraint", "nodeIdLeft", "nodeIdRight", "nodeIdTop", "nodeIdBottom", "subGraphOnHorizontal", "subGraphOnVertical", "left", "right", "top", "bottom", "constructComponents", "graph", "fixedNodes", "components", "isFixed", "queue", "visited", "count", "value", "key", "currentNode", "neighbors", "neighbor", "resultOnHorizontal", "resultOnVertical", "fixedNode", "allVerticalAlignments", "totalDisplacementX", "averageDisplacementX", "allHorizontalAlignments", "totalDisplacementY", "averageDisplacementY", "displacement", "diff", "component", "sum", "actualNodes", "averageDisplacement", "nodeList", "graphs", "size", "edges", "edge", "edgeList", "k", "multiEdge", "currentStartingPoint", "numberOfColumns", "height", "currentY", "currentX", "point", "tree", "centerNode", "startingPoint", "radialSep", "bounds", "transform", "bottomRight", "parentOfNode", "startAngle", "endAngle", "distance", "radialSeparation", "halfInterval", "nodeAngle", "teta", "cos_teta", "x_", "y_", "neighborEdges", "childCount", "branchCount", "incEdgesCount", "startIndex", "temp", "index", "stepAngle", "currentNeighbor", "childStartAngle", "childEndAngle", "maxDiagonal", "diagonal", "tempMemberGroups", "zeroDegree", "p_id", "dummyCompoundId", "dummyCompound", "dummyParentGraph", "parentGraph", "childGraphMap", "idToNode", "tiledZeroDegreePack", "width", "lCompoundNode", "horizontalMargin", "verticalMargin", "labelMarginLeft", "labelMarginTop", "tiledPack", "childGraph", "children", "theChild", "degree", "child", "organization", "y", "compoundHorizontalMargin", "compoundVerticalMargin", "compoundLabelMarginLeft", "compoundLabelMarginTop", "row", "maxHeight", "lnode", "minWidth", "horizontalOrg", "verticalOrg", "horizontalRatio", "verticalRatio", "bestOrg", "ratio", "members", "favorHorizontalDim", "verticalPadding", "horizontalPadding", "membersSize", "totalWidth", "totalHeight", "maxWidth", "averageWidth", "averageHeight", "delta", "horizontalCountDouble", "horizontalCount", "idealWidth", "tilingCompareBy", "getNodeArea", "n", "areaCompareFcn", "n1", "n2", "cmpBy", "sumCenterX", "sumCenterY", "lNode", "rowIndex", "minCompoundSize", "secondDimension", "w", "h", "extraHeight", "r", "min", "max", "extraWidth", "lastRowIndex", "lastRowWidth", "sri", "hDiff", "add_to_row_ratio", "add_new_row_ratio", "longest", "last", "prevTotal", "finalTotal", "prunedNodesAll", "containsLeaf", "prunedNodesInStepTemp", "otherEnd", "relativePosition", "prunedNodesInStep", "lengthOfPrunedNodesInStep", "gridForPrunedNode", "nodeToConnect", "prunedNode", "startGridX", "finishGridX", "startGridY", "finishGridY", "upNodeCount", "downNodeCount", "rightNodeCount", "leftNodeCount", "controlRegions", "minCount", "minIndex", "random", "FDLayoutNode", "IMath", "loc", "dX", "dY", "pred1", "next", "processed", "_toConsumableArray", "arr", "arr2", "Matrix", "SVD", "constraints", "idToNodeMap", "nodeIndexes", "xCoords", "yCoords", "calculatePositionDiff", "pos1", "pos2", "calculateAvgPosition", "nodeIdSet", "xPosSum", "yPosSum", "findAppropriatePositionForRelativePlacement", "direction", "dummyPositions", "componentSources", "setUnion", "setA", "setB", "union", "_iteratorNormalCompletion", "_didIteratorError", "_iteratorError", "_iterator", "_step", "elem", "err", "inDegrees", "adjacent", "positionMap", "pastMap", "fixedIds", "position", "fixedId", "_position", "_loop", "fixedPosition", "sinkNodes", "_components", "isFixedComponent", "_iteratorNormalCompletion2", "_didIteratorError2", "_iteratorError2", "_iterator2", "_step2", "isExist", "existAt", "ele", "minBefore", "minAfter", "maxBefore", "maxAfter", "_iteratorNormalCompletion3", "_didIteratorError3", "_iteratorError3", "_iterator3", "_step3", "posBefore", "posAfter", "_iteratorNormalCompletion4", "_didIteratorError4", "_iteratorError4", "_iterator4", "_step4", "_nodeId", "applyReflectionForRelativePlacement", "relativePlacementConstraints", "reflectOnY", "notReflectOnY", "reflectOnX", "notReflectOnX", "_i", "_i2", "_i3", "findComponents", "_currentNode", "dagToUndirected", "dag", "undirected", "dagToReversed", "reversed", "targetMatrix", "sourceMatrix", "standardTransformation", "reflectionType", "dagUndirected", "verticalAlign", "_loop2", "_i4", "alignmentSet", "xPos", "horizontalAlign", "_loop3", "_i5", "yPos", "largestComponentSize", "largestComponentIndex", "_i6", "constraintsInlargestComponent", "positionMapHorizontal", "positionMapVertical", "transformationMatrix", "targetMatrixTranspose", "sourceMatrixTranspose", "_i7", "tempMatrix", "SVDResult", "_i8", "temp1", "temp2", "temp3", "translationAmount", "posInTheory", "posDesired", "posDiff", "xAlign", "_loop4", "_i9", "yAlign", "_loop5", "_i10", "dummyToNodeForVerticalAlignment", "dummyToNodeForHorizontalAlignment", "dummyPositionsForVerticalAlignment", "dummyPositionsForHorizontalAlignment", "fixedNodesOnHorizontal", "fixedNodesOnVertical", "_loop6", "_i11", "_loop7", "_i12", "dagOnHorizontal", "dagOnVertical", "_loop8", "sourceId", "targetNode", "_iteratorNormalCompletion5", "_didIteratorError5", "_iteratorError5", "_iterator5", "_step5", "undirectedOnHorizontal", "undirectedOnVertical", "componentsOnHorizontal", "componentsOnVertical", "reversedDagOnHorizontal", "reversedDagOnVertical", "componentSourcesOnHorizontal", "componentSourcesOnVertical", "_loop9", "_iteratorNormalCompletion6", "_didIteratorError6", "_iteratorError6", "_iterator6", "_step6", "_loop10", "_iteratorNormalCompletion7", "_didIteratorError7", "_iteratorError7", "_iterator7", "_step7", "_i13", "_node", "__webpack_module_cache__", "moduleId", "cachedModule", "__webpack_exports__", "require_cytoscape_fcose", "__commonJSMin", "exports", "module", "__name", "root", "factory", "__WEBPACK_EXTERNAL_MODULE__140__", "__webpack_modules__", "tgt", "_len", "srcs", "_key", "src", "k", "__unused_webpack_exports", "__webpack_require__", "_slicedToArray", "sliceIterator", "arr", "i", "_arr", "_n", "_d", "_e", "_i", "_s", "err", "LinkedList", "auxiliary", "nodes", "nodesMap", "roots", "ele", "parent", "cy", "eles", "topMostNodes", "dummyNodes", "queue", "visited", "visitedTopMostNodes", "currentNeighbor", "minDegreeNode", "minDegree", "isConnected", "count", "nodesConnectedToDummy", "components", "_loop", "cmpt", "currentNode", "childrenOfCurrentNode", "node", "_loop2", "neighborNodes", "neighborNode", "childrenOfNeighbor", "e", "temp", "originalCenter", "componentResult", "options", "minXCoord", "maxXCoord", "minYCoord", "maxYCoord", "_iteratorNormalCompletion", "_didIteratorError", "_iteratorError", "_iterator", "_step", "_ref", "_ref2", "key", "value", "cyNode", "nodeBB", "leftX", "rightX", "topY", "bottomY", "diffOnX", "diffOnY", "x", "y", "item", "_diffOnX", "_diffOnY", "parentNode", "xCoords", "yCoords", "nodeIndexes", "left", "right", "top", "bottom", "nodeLeft", "nodeRight", "nodeTop", "nodeBottom", "s", "boundingBox", "parentsWithoutChildren", "check", "child", "aux", "CoSELayout", "CoSENode", "PointD", "DimensionD", "LayoutConstants", "FDLayoutConstants", "CoSEConstants", "coseLayout", "spectralResult", "edges", "idToLNode", "isFn", "fn", "optFn", "opt", "processChildrenList", "children", "layout", "size", "theChild", "children_of_children", "theNode", "dimensions", "parentInfo", "theNewGraph", "processEdges", "gm", "idealLengthTotal", "edgeCount", "edge", "sourceNode", "targetNode", "e1", "processConstraints", "_createClass", "defineProperties", "target", "props", "descriptor", "Constructor", "protoProps", "staticProps", "_classCallCheck", "instance", "assign", "_require", "spectralLayout", "_require2", "defaults", "Layout", "coseResult", "componentCenters", "constraintExist", "layUtil", "packingEnabled", "component", "toBeTiledNodes", "_xCoords", "_yCoords", "tempSpectralResult", "indexesToBeDeleted", "index", "_boundingBox", "componentsEvaluated", "subgraphs", "hiddenEles", "subgraph", "nodeIndex", "source", "sourceNodeIndex", "targetNodeIndex", "sourceCenter", "targetCenter", "_parentInfo", "shiftResult", "result", "newXCoords", "newYCoords", "_count", "nodeRectangle", "getPositions", "pos", "theId", "_pos", "_hiddenEles", "Matrix", "SVD", "parentNodes", "parentChildMap", "allNodesNeighborhood", "samplesColumn", "minDistancesColumn", "C", "PHI", "INV", "firstSample", "nodeSize", "infinity", "small", "piTol", "samplingType", "nodeSeparation", "sampleSize", "randomSampleCR", "sample", "flag", "BFS", "pivot", "samplingMethod", "path", "front", "back", "current", "distance", "max_dist", "max_ind", "neighbors", "_i2", "_i3", "allBFS", "_i4", "_i5", "_i6", "j", "_i7", "_i8", "_j", "SVDResult", "a_q", "a_u", "a_v", "max_s", "a_Sig", "powerIteration", "theta1", "theta2", "Y1", "Y2", "V1", "V2", "previous", "_i9", "_i10", "_i11", "_i12", "_i13", "min", "ele2", "eleIndex", "disconnectedId", "id", "_iteratorNormalCompletion2", "_didIteratorError2", "_iteratorError2", "_iterator2", "_step2", "_i14", "_i15", "iterator", "firstNode", "firstNodePos", "firstNodeWidth", "secondNode", "secondNodeWidth", "impl", "register", "cytoscape", "__webpack_module_cache__", "moduleId", "cachedModule", "__webpack_exports__", "ArchitectureDirectionName", "ArchitectureDirectionArrow", "__name", "scale", "ArchitectureDirectionArrowShift", "orig", "arrowSize", "_arrowSize", "getOppositeArchitectureDirection", "x", "isArchitectureDirectionX", "isArchitectureDirection", "temp", "isArchitectureDirectionY", "isArchitectureDirectionXY", "a", "b", "aX_bY", "aY_bX", "isArchitecturePairXY", "pair", "lhs", "rhs", "isValidArchitectureDirectionPair", "getArchitectureDirectionPair", "sourceDir", "targetDir", "shiftPositionByArchitectureDirectionPair", "y", "getArchitectureDirectionXYFactors", "getArchitectureDirectionAlignment", "isArchitectureService", "isArchitectureJunction", "edgeData", "edge", "nodeData", "node", "DEFAULT_ARCHITECTURE_CONFIG", "defaultConfig_default", "ArchitectureDB", "setAccTitle", "getAccTitle", "setDiagramTitle", "getDiagramTitle", "getAccDescription", "setAccDescription", "__name", "clear", "id", "icon", "parent", "title", "iconText", "isArchitectureService", "isArchitectureJunction", "lhsId", "rhsId", "lhsDir", "rhsDir", "lhsInto", "rhsInto", "lhsGroup", "rhsGroup", "isArchitectureDirection", "lhsGroupId", "rhsGroupId", "edge", "groupAlignments", "adjList", "prevOuter", "service", "prevInner", "alignment", "getArchitectureDirectionAlignment", "pair", "getArchitectureDirectionPair", "firstId", "visited", "notVisited", "prev", "BFS", "startingId", "spatialMap", "queue", "adj", "posX", "posY", "dir", "shiftPositionByArchitectureDirectionPair", "spatialMaps", "element", "cleanAndMerge", "getConfig", "field", "populateDb", "__name", "ast", "db", "populateCommonDb", "group", "service", "edge", "parser", "input", "parse", "log", "ArchitectureDB", "getStyles", "__name", "options", "architectureStyles_default", "import_cytoscape_fcose", "wrapIcon", "__name", "icon", "architectureIcons", "unknownIcon", "drawEdges", "__name", "edgesEl", "cy", "db", "padding", "iconSize", "halfIconSize", "arrowSize", "halfArrowSize", "edge", "source", "sourceDir", "sourceArrow", "sourceGroup", "target", "targetDir", "targetArrow", "targetGroup", "label", "edgeData", "startX", "startY", "midX", "midY", "endX", "endY", "groupEdgeShift", "isArchitectureDirectionX", "g", "getEdgeId", "xShift", "ArchitectureDirectionArrowShift", "yShift", "isArchitectureDirectionY", "ArchitectureDirectionArrow", "axis", "isArchitectureDirectionXY", "width", "textElem", "createText", "getConfig", "pair", "getArchitectureDirectionPair", "isArchitecturePairXY", "bboxOrig", "x", "y", "getArchitectureDirectionXYFactors", "bboxNew", "drawGroups", "groupsEl", "groupIconSize", "fontSize", "node", "data", "nodeData", "h", "w", "x1", "y1", "groupsNode", "groupLabelContainer", "shiftedX1", "shiftedY1", "bkgElem", "getIconSVG", "architectureIcons", "drawServices", "elem", "services", "config", "service", "serviceElem", "divElem", "sanitizeText", "height", "drawJunctions", "junctions", "junction", "junctionElem", "registerIconPacks", "architectureIcons", "cytoscape", "fcose", "addServices", "services", "cy", "db", "service", "__name", "addJunctions", "junctions", "junction", "positionNodes", "node", "data", "nodeData", "addGroups", "groups", "group", "addEdges", "edges", "parsedEdge", "lhsId", "rhsId", "lhsInto", "lhsGroup", "rhsInto", "lhsDir", "rhsDir", "rhsGroup", "title", "edgeType", "isArchitectureDirectionXY", "edge", "getAlignments", "spatialMaps", "groupAlignments", "flattenAlignments", "alignmentObj", "alignmentDir", "prev", "dir", "alignments", "cnt", "arr", "i", "j", "aGroupId", "aNodeIds", "bGroupId", "bNodeIds", "keyA", "keyB", "spatialMap", "horizontalAlignments", "verticalAlignments", "id", "x", "y", "nodeGroup", "horizontal", "vertical", "prevHoriz", "prevVert", "horiz", "vert", "getRelativeConstraints", "relativeConstraints", "posToStr", "pos", "strToPos", "p", "invSpatialMap", "queue", "visited", "directions", "curr", "currId", "currPos", "shift", "newPos", "newId", "ArchitectureDirectionName", "getOppositeArchitectureDirection", "layoutArchitecture", "resolve", "renderEl", "select_default", "alignmentConstraint", "relativePlacementConstraint", "layout", "nodeA", "nodeB", "parentA", "parentB", "getSegmentWeights", "source", "target", "pointX", "pointY", "W", "D", "sX", "sY", "tX", "tY", "distAB", "delta1", "delta2", "sEP", "tEP", "sourceDir", "edgeData", "isArchitectureDirectionY", "weights", "distances", "e", "log", "draw", "text", "_version", "diagObj", "ds", "svg", "selectSvgElement", "edgesElem", "servicesElem", "groupElem", "drawServices", "drawJunctions", "drawEdges", "drawGroups", "setupGraphViewbox", "renderer", "diagram", "parser", "ArchitectureDB", "renderer", "architectureStyles_default"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/blockDiagram-MFEFEJY7.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/blockDiagram-MFEFEJY7.mjs new file mode 100644 index 0000000..6fea08c --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/blockDiagram-MFEFEJY7.mjs @@ -0,0 +1,122 @@ +import{a as Ht}from"./chunk-S4Z6OVSW.mjs";import{a as jt}from"./chunk-ZZTKAOFA.mjs";import{c as Pt}from"./chunk-RV6DXAHM.mjs";import{a as Wt}from"./chunk-LM6QDVU5.mjs";import{f as Ft,g as lt}from"./chunk-GOL2OBWC.mjs";import{d as Mt,m as tt,o as rt}from"./chunk-EFRVIJHI.mjs";import"./chunk-THXVA4DE.mjs";import{D as It,L as Ot,O as Rt,W as B,b as Tt,c as Ct,q,w as et,x as Nt,y as P}from"./chunk-KXVH62NG.mjs";import{H as zt,L as At,b as w,h as C}from"./chunk-63GW7ZVL.mjs";import{e as Yt}from"./chunk-OMTJKCYW.mjs";import"./chunk-IQQE2MEC.mjs";import"./chunk-A4ITRWGT.mjs";import{a as c}from"./chunk-GTKDMUJJ.mjs";var yt=(function(){var e=c(function(T,y,d,f){for(d=d||{},f=T.length;f--;d[T[f]]=y);return d},"o"),t=[1,15],a=[1,7],i=[1,13],l=[1,14],s=[1,19],r=[1,16],n=[1,17],o=[1,18],u=[8,30],h=[8,10,21,28,29,30,31,39,43,46],x=[1,23],m=[1,24],b=[8,10,15,16,21,28,29,30,31,39,43,46],L=[8,10,15,16,21,27,28,29,30,31,39,43,46],_=[1,49],S={trace:c(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,NODE_ID:31,nodeShapeNLabel:32,dirList:33,DIR:34,NODE_DSTART:35,NODE_DEND:36,BLOCK_ARROW_START:37,BLOCK_ARROW_END:38,classDef:39,CLASSDEF_ID:40,CLASSDEF_STYLEOPTS:41,DEFAULT:42,class:43,CLASSENTITY_IDS:44,STYLECLASS:45,style:46,STYLE_ENTITY_IDS:47,STYLE_DEFINITION_DATA:48,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"NODE_ID",34:"DIR",35:"NODE_DSTART",36:"NODE_DEND",37:"BLOCK_ARROW_START",38:"BLOCK_ARROW_END",39:"classDef",40:"CLASSDEF_ID",41:"CLASSDEF_STYLEOPTS",42:"DEFAULT",43:"class",44:"CLASSENTITY_IDS",45:"STYLECLASS",46:"style",47:"STYLE_ENTITY_IDS",48:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[33,1],[33,2],[32,3],[32,4],[23,3],[23,3],[24,3],[25,3]],performAction:c(function(y,d,f,k,E,g,Y){var p=g.length-1;switch(E){case 4:k.getLogger().debug("Rule: separator (NL) ");break;case 5:k.getLogger().debug("Rule: separator (Space) ");break;case 6:k.getLogger().debug("Rule: separator (EOF) ");break;case 7:k.getLogger().debug("Rule: hierarchy: ",g[p-1]),k.setHierarchy(g[p-1]);break;case 8:k.getLogger().debug("Stop NL ");break;case 9:k.getLogger().debug("Stop EOF ");break;case 10:k.getLogger().debug("Stop NL2 ");break;case 11:k.getLogger().debug("Stop EOF2 ");break;case 12:k.getLogger().debug("Rule: statement: ",g[p]),typeof g[p].length=="number"?this.$=g[p]:this.$=[g[p]];break;case 13:k.getLogger().debug("Rule: statement #2: ",g[p-1]),this.$=[g[p-1]].concat(g[p]);break;case 14:k.getLogger().debug("Rule: link: ",g[p],y),this.$={edgeTypeStr:g[p],label:""};break;case 15:k.getLogger().debug("Rule: LABEL link: ",g[p-3],g[p-1],g[p]),this.$={edgeTypeStr:g[p],label:g[p-1]};break;case 18:let R=parseInt(g[p]),Z=k.generateId();this.$={id:Z,type:"space",label:"",width:R,children:[]};break;case 23:k.getLogger().debug("Rule: (nodeStatement link node) ",g[p-2],g[p-1],g[p]," typestr: ",g[p-1].edgeTypeStr);let V=k.edgeStrToEdgeData(g[p-1].edgeTypeStr);this.$=[{id:g[p-2].id,label:g[p-2].label,type:g[p-2].type,directions:g[p-2].directions},{id:g[p-2].id+"-"+g[p].id,start:g[p-2].id,end:g[p].id,label:g[p-1].label,type:"edge",directions:g[p].directions,arrowTypeEnd:V,arrowTypeStart:"arrow_open"},{id:g[p].id,label:g[p].label,type:k.typeStr2Type(g[p].typeStr),directions:g[p].directions}];break;case 24:k.getLogger().debug("Rule: nodeStatement (abc88 node size) ",g[p-1],g[p]),this.$={id:g[p-1].id,label:g[p-1].label,type:k.typeStr2Type(g[p-1].typeStr),directions:g[p-1].directions,widthInColumns:parseInt(g[p],10)};break;case 25:k.getLogger().debug("Rule: nodeStatement (node) ",g[p]),this.$={id:g[p].id,label:g[p].label,type:k.typeStr2Type(g[p].typeStr),directions:g[p].directions,widthInColumns:1};break;case 26:k.getLogger().debug("APA123",this?this:"na"),k.getLogger().debug("COLUMNS: ",g[p]),this.$={type:"column-setting",columns:g[p]==="auto"?-1:parseInt(g[p])};break;case 27:k.getLogger().debug("Rule: id-block statement : ",g[p-2],g[p-1]);let Bt=k.generateId();this.$={...g[p-2],type:"composite",children:g[p-1]};break;case 28:k.getLogger().debug("Rule: blockStatement : ",g[p-2],g[p-1],g[p]);let st=k.generateId();this.$={id:st,type:"composite",label:"",children:g[p-1]};break;case 29:k.getLogger().debug("Rule: node (NODE_ID separator): ",g[p]),this.$={id:g[p]};break;case 30:k.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",g[p-1],g[p]),this.$={id:g[p-1],label:g[p].label,typeStr:g[p].typeStr,directions:g[p].directions};break;case 31:k.getLogger().debug("Rule: dirList: ",g[p]),this.$=[g[p]];break;case 32:k.getLogger().debug("Rule: dirList: ",g[p-1],g[p]),this.$=[g[p-1]].concat(g[p]);break;case 33:k.getLogger().debug("Rule: nodeShapeNLabel: ",g[p-2],g[p-1],g[p]),this.$={typeStr:g[p-2]+g[p],label:g[p-1]};break;case 34:k.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",g[p-3],g[p-2]," #3:",g[p-1],g[p]),this.$={typeStr:g[p-3]+g[p],label:g[p-2],directions:g[p-1]};break;case 35:case 36:this.$={type:"classDef",id:g[p-1].trim(),css:g[p].trim()};break;case 37:this.$={type:"applyClass",id:g[p-1].trim(),styleClass:g[p].trim()};break;case 38:this.$={type:"applyStyles",id:g[p-1].trim(),stylesStr:g[p].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{10:t,11:3,13:4,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:i,29:l,31:s,39:r,43:n,46:o},{8:[1,20]},e(u,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,10:t,21:a,28:i,29:l,31:s,39:r,43:n,46:o}),e(h,[2,16],{14:22,15:x,16:m}),e(h,[2,17]),e(h,[2,18]),e(h,[2,19]),e(h,[2,20]),e(h,[2,21]),e(h,[2,22]),e(b,[2,25],{27:[1,25]}),e(h,[2,26]),{19:26,26:12,31:s},{10:t,11:27,13:4,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:i,29:l,31:s,39:r,43:n,46:o},{40:[1,28],42:[1,29]},{44:[1,30]},{47:[1,31]},e(L,[2,29],{32:32,35:[1,33],37:[1,34]}),{1:[2,7]},e(u,[2,13]),{26:35,31:s},{31:[2,14]},{17:[1,36]},e(b,[2,24]),{10:t,11:37,13:4,14:22,15:x,16:m,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:i,29:l,31:s,39:r,43:n,46:o},{30:[1,38]},{41:[1,39]},{41:[1,40]},{45:[1,41]},{48:[1,42]},e(L,[2,30]),{18:[1,43]},{18:[1,44]},e(b,[2,23]),{18:[1,45]},{30:[1,46]},e(h,[2,28]),e(h,[2,35]),e(h,[2,36]),e(h,[2,37]),e(h,[2,38]),{36:[1,47]},{33:48,34:_},{15:[1,50]},e(h,[2,27]),e(L,[2,33]),{38:[1,51]},{33:52,34:_,38:[2,31]},{31:[2,15]},e(L,[2,34]),{38:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:c(function(y,d){if(d.recoverable)this.trace(y);else{var f=new Error(y);throw f.hash=d,f}},"parseError"),parse:c(function(y){var d=this,f=[0],k=[],E=[null],g=[],Y=this.table,p="",R=0,Z=0,V=0,Bt=2,st=1,Be=g.slice.call(arguments,1),A=Object.create(this.lexer),J={yy:{}};for(var ut in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ut)&&(J.yy[ut]=this.yy[ut]);A.setInput(y,J.yy),J.yy.lexer=A,J.yy.parser=this,typeof A.yylloc>"u"&&(A.yylloc={});var pt=A.yylloc;g.push(pt);var ve=A.options&&A.options.ranges;typeof J.yy.parseError=="function"?this.parseError=J.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function qr(H){f.length=f.length-2*H,E.length=E.length-H,g.length=g.length-H}c(qr,"popStack");function Te(){var H;return H=k.pop()||A.lex()||st,typeof H!="number"&&(H instanceof Array&&(k=H,H=k.pop()),H=d.symbols_[H]||H),H}c(Te,"lex");for(var F,ft,Q,K,Jr,xt,$={},it,G,vt,nt;;){if(Q=f[f.length-1],this.defaultActions[Q]?K=this.defaultActions[Q]:((F===null||typeof F>"u")&&(F=Te()),K=Y[Q]&&Y[Q][F]),typeof K>"u"||!K.length||!K[0]){var bt="";nt=[];for(it in Y[Q])this.terminals_[it]&&it>Bt&&nt.push("'"+this.terminals_[it]+"'");A.showPosition?bt="Parse error on line "+(R+1)+`: +`+A.showPosition()+` +Expecting `+nt.join(", ")+", got '"+(this.terminals_[F]||F)+"'":bt="Parse error on line "+(R+1)+": Unexpected "+(F==st?"end of input":"'"+(this.terminals_[F]||F)+"'"),this.parseError(bt,{text:A.match,token:this.terminals_[F]||F,line:A.yylineno,loc:pt,expected:nt})}if(K[0]instanceof Array&&K.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Q+", token: "+F);switch(K[0]){case 1:f.push(F),E.push(A.yytext),g.push(A.yylloc),f.push(K[1]),F=null,ft?(F=ft,ft=null):(Z=A.yyleng,p=A.yytext,R=A.yylineno,pt=A.yylloc,V>0&&V--);break;case 2:if(G=this.productions_[K[1]][1],$.$=E[E.length-G],$._$={first_line:g[g.length-(G||1)].first_line,last_line:g[g.length-1].last_line,first_column:g[g.length-(G||1)].first_column,last_column:g[g.length-1].last_column},ve&&($._$.range=[g[g.length-(G||1)].range[0],g[g.length-1].range[1]]),xt=this.performAction.apply($,[p,Z,R,J.yy,K[1],E,g].concat(Be)),typeof xt<"u")return xt;G&&(f=f.slice(0,-1*G*2),E=E.slice(0,-1*G),g=g.slice(0,-1*G)),f.push(this.productions_[K[1]][0]),E.push($.$),g.push($._$),vt=Y[f[f.length-2]][f[f.length-1]],f.push(vt);break;case 3:return!0}}return!0},"parse")},I=(function(){var T={EOF:1,parseError:c(function(d,f){if(this.yy.parser)this.yy.parser.parseError(d,f);else throw new Error(d)},"parseError"),setInput:c(function(y,d){return this.yy=d||this.yy||{},this._input=y,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:c(function(){var y=this._input[0];this.yytext+=y,this.yyleng++,this.offset++,this.match+=y,this.matched+=y;var d=y.match(/(?:\r\n?|\n).*/g);return d?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),y},"input"),unput:c(function(y){var d=y.length,f=y.split(/(?:\r\n?|\n)/g);this._input=y+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-d),this.offset-=d;var k=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),f.length-1&&(this.yylineno-=f.length-1);var E=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:f?(f.length===k.length?this.yylloc.first_column:0)+k[k.length-f.length].length-f[0].length:this.yylloc.first_column-d},this.options.ranges&&(this.yylloc.range=[E[0],E[0]+this.yyleng-d]),this.yyleng=this.yytext.length,this},"unput"),more:c(function(){return this._more=!0,this},"more"),reject:c(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:c(function(y){this.unput(this.match.slice(y))},"less"),pastInput:c(function(){var y=this.matched.substr(0,this.matched.length-this.match.length);return(y.length>20?"...":"")+y.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:c(function(){var y=this.match;return y.length<20&&(y+=this._input.substr(0,20-y.length)),(y.substr(0,20)+(y.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:c(function(){var y=this.pastInput(),d=new Array(y.length+1).join("-");return y+this.upcomingInput()+` +`+d+"^"},"showPosition"),test_match:c(function(y,d){var f,k,E;if(this.options.backtrack_lexer&&(E={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(E.yylloc.range=this.yylloc.range.slice(0))),k=y[0].match(/(?:\r\n?|\n).*/g),k&&(this.yylineno+=k.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:k?k[k.length-1].length-k[k.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+y[0].length},this.yytext+=y[0],this.match+=y[0],this.matches=y,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(y[0].length),this.matched+=y[0],f=this.performAction.call(this,this.yy,this,d,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),f)return f;if(this._backtrack){for(var g in E)this[g]=E[g];return!1}return!1},"test_match"),next:c(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var y,d,f,k;this._more||(this.yytext="",this.match="");for(var E=this._currentRules(),g=0;gd[0].length)){if(d=f,k=g,this.options.backtrack_lexer){if(y=this.test_match(f,E[g]),y!==!1)return y;if(this._backtrack){d=!1;continue}else return!1}else if(!this.options.flex)break}return d?(y=this.test_match(d,E[k]),y!==!1?y:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:c(function(){var d=this.next();return d||this.lex()},"lex"),begin:c(function(d){this.conditionStack.push(d)},"begin"),popState:c(function(){var d=this.conditionStack.length-1;return d>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:c(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:c(function(d){return d=this.conditionStack.length-1-Math.abs(d||0),d>=0?this.conditionStack[d]:"INITIAL"},"topState"),pushState:c(function(d){this.begin(d)},"pushState"),stateStackSize:c(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:c(function(d,f,k,E){var g=E;switch(k){case 0:return d.getLogger().debug("Found block-beta"),10;break;case 1:return d.getLogger().debug("Found id-block"),29;break;case 2:return d.getLogger().debug("Found block"),10;break;case 3:d.getLogger().debug(".",f.yytext);break;case 4:d.getLogger().debug("_",f.yytext);break;case 5:return 5;case 6:return f.yytext=-1,28;break;case 7:return f.yytext=f.yytext.replace(/columns\s+/,""),d.getLogger().debug("COLUMNS (LEX)",f.yytext),28;break;case 8:this.pushState("md_string");break;case 9:return"MD_STR";case 10:this.popState();break;case 11:this.pushState("string");break;case 12:d.getLogger().debug("LEX: POPPING STR:",f.yytext),this.popState();break;case 13:return d.getLogger().debug("LEX: STR end:",f.yytext),"STR";break;case 14:return f.yytext=f.yytext.replace(/space\:/,""),d.getLogger().debug("SPACE NUM (LEX)",f.yytext),21;break;case 15:return f.yytext="1",d.getLogger().debug("COLUMNS (LEX)",f.yytext),21;break;case 16:return 42;case 17:return"LINKSTYLE";case 18:return"INTERPOLATE";case 19:return this.pushState("CLASSDEF"),39;break;case 20:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 21:return this.popState(),this.pushState("CLASSDEFID"),40;break;case 22:return this.popState(),41;break;case 23:return this.pushState("CLASS"),43;break;case 24:return this.popState(),this.pushState("CLASS_STYLE"),44;break;case 25:return this.popState(),45;break;case 26:return this.pushState("STYLE_STMNT"),46;break;case 27:return this.popState(),this.pushState("STYLE_DEFINITION"),47;break;case 28:return this.popState(),48;break;case 29:return this.pushState("acc_title"),"acc_title";break;case 30:return this.popState(),"acc_title_value";break;case 31:return this.pushState("acc_descr"),"acc_descr";break;case 32:return this.popState(),"acc_descr_value";break;case 33:this.pushState("acc_descr_multiline");break;case 34:this.popState();break;case 35:return"acc_descr_multiline_value";case 36:return 30;case 37:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 38:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 39:return this.popState(),d.getLogger().debug("Lex: ))"),"NODE_DEND";break;case 40:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 41:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 42:return this.popState(),d.getLogger().debug("Lex: (-"),"NODE_DEND";break;case 43:return this.popState(),d.getLogger().debug("Lex: -)"),"NODE_DEND";break;case 44:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 45:return this.popState(),d.getLogger().debug("Lex: ]]"),"NODE_DEND";break;case 46:return this.popState(),d.getLogger().debug("Lex: ("),"NODE_DEND";break;case 47:return this.popState(),d.getLogger().debug("Lex: ])"),"NODE_DEND";break;case 48:return this.popState(),d.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 49:return this.popState(),d.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 50:return this.popState(),d.getLogger().debug("Lex: )]"),"NODE_DEND";break;case 51:return this.popState(),d.getLogger().debug("Lex: )"),"NODE_DEND";break;case 52:return this.popState(),d.getLogger().debug("Lex: ]>"),"NODE_DEND";break;case 53:return this.popState(),d.getLogger().debug("Lex: ]"),"NODE_DEND";break;case 54:return d.getLogger().debug("Lexa: -)"),this.pushState("NODE"),35;break;case 55:return d.getLogger().debug("Lexa: (-"),this.pushState("NODE"),35;break;case 56:return d.getLogger().debug("Lexa: ))"),this.pushState("NODE"),35;break;case 57:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 58:return d.getLogger().debug("Lex: ((("),this.pushState("NODE"),35;break;case 59:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 60:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 61:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 62:return d.getLogger().debug("Lexc: >"),this.pushState("NODE"),35;break;case 63:return d.getLogger().debug("Lexa: (["),this.pushState("NODE"),35;break;case 64:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 65:return this.pushState("NODE"),35;break;case 66:return this.pushState("NODE"),35;break;case 67:return this.pushState("NODE"),35;break;case 68:return this.pushState("NODE"),35;break;case 69:return this.pushState("NODE"),35;break;case 70:return this.pushState("NODE"),35;break;case 71:return this.pushState("NODE"),35;break;case 72:return d.getLogger().debug("Lexa: ["),this.pushState("NODE"),35;break;case 73:return this.pushState("BLOCK_ARROW"),d.getLogger().debug("LEX ARR START"),37;break;case 74:return d.getLogger().debug("Lex: NODE_ID",f.yytext),31;break;case 75:return d.getLogger().debug("Lex: EOF",f.yytext),8;break;case 76:this.pushState("md_string");break;case 77:this.pushState("md_string");break;case 78:return"NODE_DESCR";case 79:this.popState();break;case 80:d.getLogger().debug("Lex: Starting string"),this.pushState("string");break;case 81:d.getLogger().debug("LEX ARR: Starting string"),this.pushState("string");break;case 82:return d.getLogger().debug("LEX: NODE_DESCR:",f.yytext),"NODE_DESCR";break;case 83:d.getLogger().debug("LEX POPPING"),this.popState();break;case 84:d.getLogger().debug("Lex: =>BAE"),this.pushState("ARROW_DIR");break;case 85:return f.yytext=f.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (right): dir:",f.yytext),"DIR";break;case 86:return f.yytext=f.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (left):",f.yytext),"DIR";break;case 87:return f.yytext=f.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (x):",f.yytext),"DIR";break;case 88:return f.yytext=f.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (y):",f.yytext),"DIR";break;case 89:return f.yytext=f.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (up):",f.yytext),"DIR";break;case 90:return f.yytext=f.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (down):",f.yytext),"DIR";break;case 91:return f.yytext="]>",d.getLogger().debug("Lex (ARROW_DIR end):",f.yytext),this.popState(),this.popState(),"BLOCK_ARROW_END";break;case 92:return d.getLogger().debug("Lex: LINK","#"+f.yytext+"#"),15;break;case 93:return d.getLogger().debug("Lex: LINK",f.yytext),15;break;case 94:return d.getLogger().debug("Lex: LINK",f.yytext),15;break;case 95:return d.getLogger().debug("Lex: LINK",f.yytext),15;break;case 96:return d.getLogger().debug("Lex: START_LINK",f.yytext),this.pushState("LLABEL"),16;break;case 97:return d.getLogger().debug("Lex: START_LINK",f.yytext),this.pushState("LLABEL"),16;break;case 98:return d.getLogger().debug("Lex: START_LINK",f.yytext),this.pushState("LLABEL"),16;break;case 99:this.pushState("md_string");break;case 100:return d.getLogger().debug("Lex: Starting string"),this.pushState("string"),"LINK_LABEL";break;case 101:return this.popState(),d.getLogger().debug("Lex: LINK","#"+f.yytext+"#"),15;break;case 102:return this.popState(),d.getLogger().debug("Lex: LINK",f.yytext),15;break;case 103:return this.popState(),d.getLogger().debug("Lex: LINK",f.yytext),15;break;case 104:return d.getLogger().debug("Lex: COLON",f.yytext),f.yytext=f.yytext.slice(1),27;break}},"anonymous"),rules:[/^(?:block-beta\b)/,/^(?:block:)/,/^(?:block\b)/,/^(?:[\s]+)/,/^(?:[\n]+)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:columns\s+auto\b)/,/^(?:columns\s+[\d]+)/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:space[:]\d+)/,/^(?:space\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\s+)/,/^(?:DEFAULT\s+)/,/^(?:\w+\s+)/,/^(?:[^\n]*)/,/^(?:class\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:style\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:end\b\s*)/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:[\)]\))/,/^(?:\}\})/,/^(?:\})/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\()/,/^(?:\]\])/,/^(?:\()/,/^(?:\]\))/,/^(?:\\\])/,/^(?:\/\])/,/^(?:\)\])/,/^(?:[\)])/,/^(?:\]>)/,/^(?:[\]])/,/^(?:-\))/,/^(?:\(-)/,/^(?:\)\))/,/^(?:\))/,/^(?:\(\(\()/,/^(?:\(\()/,/^(?:\{\{)/,/^(?:\{)/,/^(?:>)/,/^(?:\(\[)/,/^(?:\()/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\[\\)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:\[)/,/^(?:<\[)/,/^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/,/^(?:$)/,/^(?:["][`])/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:\]>\s*\()/,/^(?:,?\s*right\s*)/,/^(?:,?\s*left\s*)/,/^(?:,?\s*x\s*)/,/^(?:,?\s*y\s*)/,/^(?:,?\s*up\s*)/,/^(?:,?\s*down\s*)/,/^(?:\)\s*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*~~[\~]+\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:["][`])/,/^(?:["])/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?::\d+)/],conditions:{STYLE_DEFINITION:{rules:[28],inclusive:!1},STYLE_STMNT:{rules:[27],inclusive:!1},CLASSDEFID:{rules:[22],inclusive:!1},CLASSDEF:{rules:[20,21],inclusive:!1},CLASS_STYLE:{rules:[25],inclusive:!1},CLASS:{rules:[24],inclusive:!1},LLABEL:{rules:[99,100,101,102,103],inclusive:!1},ARROW_DIR:{rules:[85,86,87,88,89,90,91],inclusive:!1},BLOCK_ARROW:{rules:[76,81,84],inclusive:!1},NODE:{rules:[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,77,80],inclusive:!1},md_string:{rules:[9,10,78,79],inclusive:!1},space:{rules:[],inclusive:!1},string:{rules:[12,13,82,83],inclusive:!1},acc_descr_multiline:{rules:[34,35],inclusive:!1},acc_descr:{rules:[32],inclusive:!1},acc_title:{rules:[30],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,11,14,15,16,17,18,19,23,26,29,31,33,36,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,92,93,94,95,96,97,98,104],inclusive:!0}}};return T})();S.lexer=I;function D(){this.yy={}}return c(D,"Parser"),D.prototype=S,S.Parser=D,new D})();yt.parser=yt;var Kt=yt;var X=new Map,wt=[],mt=new Map,Xt="color",Ut="fill",Ne="bgFill",Gt=",",Ie=B(),ot=new Map,Oe=c(e=>It.sanitizeText(e,Ie),"sanitizeText"),Re=c(function(e,t=""){let a=ot.get(e);a||(a={id:e,styles:[],textStyles:[]},ot.set(e,a)),t?.split(Gt).forEach(i=>{let l=i.replace(/([^;]*);/,"$1").trim();if(RegExp(Xt).exec(i)){let r=l.replace(Ut,Ne).replace(Xt,Ut);a.textStyles.push(r)}a.styles.push(l)})},"addStyleClass"),ze=c(function(e,t=""){let a=X.get(e);t!=null&&(a.styles=t.split(Gt))},"addStyle2Node"),Ae=c(function(e,t){e.split(",").forEach(function(a){let i=X.get(a);if(i===void 0){let l=a.trim();i={id:l,type:"na",children:[]},X.set(l,i)}i.classes||(i.classes=[]),i.classes.push(t)})},"setCssClass"),Zt=c((e,t)=>{let a=e.flat(),i=[],s=a.find(r=>r?.type==="column-setting")?.columns??-1;for(let r of a){if(typeof s=="number"&&s>0&&r.type!=="column-setting"&&typeof r.widthInColumns=="number"&&r.widthInColumns>s&&w.warn(`Block ${r.id} width ${r.widthInColumns} exceeds configured column width ${s}`),r.label&&(r.label=Oe(r.label)),r.type==="classDef"){Re(r.id,r.css);continue}if(r.type==="applyClass"){Ae(r.id,r?.styleClass??"");continue}if(r.type==="applyStyles"){r?.stylesStr&&ze(r.id,r?.stylesStr);continue}if(r.type==="column-setting")t.columns=r.columns??-1;else if(r.type==="edge"){let n=(mt.get(r.id)??0)+1;mt.set(r.id,n),r.id=n+"-"+r.id,wt.push(r)}else{r.label||(r.type==="composite"?r.label="":r.label=r.id);let n=X.get(r.id);if(n===void 0?X.set(r.id,r):(r.type!=="na"&&(n.type=r.type),r.label!==r.id&&(n.label=r.label)),r.children&&Zt(r.children,r),r.type==="space"){let o=r.width??1;for(let u=0;u{w.debug("Clear called"),Rt(),at={id:"root",type:"composite",children:[],columns:-1},X=new Map([["root",at]]),kt=[],ot=new Map,wt=[],mt=new Map},"clear");function Fe(e){switch(w.debug("typeStr2Type",e),e){case"[]":return"square";case"()":return w.debug("we have a round"),"round";case"(())":return"circle";case">]":return"rect_left_inv_arrow";case"{}":return"diamond";case"{{}}":return"hexagon";case"([])":return"stadium";case"[[]]":return"subroutine";case"[()]":return"cylinder";case"((()))":return"doublecircle";case"[//]":return"lean_right";case"[\\\\]":return"lean_left";case"[/\\]":return"trapezoid";case"[\\/]":return"inv_trapezoid";case"<[]>":return"block_arrow";default:return"na"}}c(Fe,"typeStr2Type");function We(e){switch(w.debug("typeStr2Type",e),e){case"==":return"thick";default:return"normal"}}c(We,"edgeTypeStr2Type");function Pe(e){switch(e.replace(/^[\s-]+|[\s-]+$/g,"")){case"x":return"arrow_cross";case"o":return"arrow_circle";case">":return"arrow_point";default:return""}}c(Pe,"edgeStrToEdgeData");var Vt=0,Ye=c(()=>(Vt++,"id-"+Math.random().toString(36).substr(2,12)+"-"+Vt),"generateId"),He=c(e=>{at.children=e,Zt(e,at),kt=at.children},"setHierarchy"),je=c(e=>{let t=X.get(e);return t?t.columns?t.columns:t.children?t.children.length:-1:-1},"getColumns"),Ke=c(()=>[...X.values()],"getBlocksFlat"),Xe=c(()=>kt||[],"getBlocks"),Ue=c(()=>wt,"getEdges"),Ve=c(e=>X.get(e),"getBlock"),Ge=c(e=>{X.set(e.id,e)},"setBlock"),Ze=c(()=>w,"getLogger"),qe=c(function(){return ot},"getClasses"),Je={getConfig:c(()=>q().block,"getConfig"),typeStr2Type:Fe,edgeTypeStr2Type:We,edgeStrToEdgeData:Pe,getLogger:Ze,getBlocksFlat:Ke,getBlocks:Xe,getEdges:Ue,setHierarchy:He,getBlock:Ve,setBlock:Ge,getColumns:je,getClasses:qe,clear:Me,generateId:Ye},qt=Je;var ct=c((e,t)=>{let a=Ct,i=a(e,"r"),l=a(e,"g"),s=a(e,"b");return Tt(i,l,s,t)},"fade"),Qe=c(e=>`.label { + font-family: ${e.fontFamily}; + color: ${e.nodeTextColor||e.textColor}; + } + .cluster-label text { + fill: ${e.titleColor}; + } + .cluster-label span,p { + color: ${e.titleColor}; + } + + + + .label text,span,p { + fill: ${e.nodeTextColor||e.textColor}; + color: ${e.nodeTextColor||e.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${e.mainBkg}; + stroke: ${e.nodeBorder}; + stroke-width: 1px; + } + .flowchart-label text { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${e.arrowheadColor}; + } + + .edgePath .path { + stroke: ${e.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${e.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${e.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${e.edgeLabelBackground}; + fill: ${e.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${ct(e.edgeLabelBackground,.5)}; + // background-color: + } + + .node .cluster { + // fill: ${ct(e.mainBkg,.5)}; + fill: ${ct(e.clusterBkg,.5)}; + stroke: ${ct(e.clusterBorder,.2)}; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + stroke-width: 1px; + } + + .cluster text { + fill: ${e.titleColor}; + } + + .cluster span,p { + color: ${e.titleColor}; + } + /* .cluster div { + color: ${e.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${e.fontFamily}; + font-size: 12px; + background: ${e.tertiaryColor}; + border: 1px solid ${e.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${e.textColor}; + } + ${jt()} +`,"getStyles"),Jt=Qe;var $e=c((e,t,a,i)=>{t.forEach(l=>{cr[l](e,a,i)})},"insertMarkers"),tr=c((e,t,a)=>{w.trace("Making markers for ",a),e.append("defs").append("marker").attr("id",a+"_"+t+"-extensionStart").attr("class","marker extension "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-extensionEnd").attr("class","marker extension "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),er=c((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-compositionStart").attr("class","marker composition "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-compositionEnd").attr("class","marker composition "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),rr=c((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-aggregationStart").attr("class","marker aggregation "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-aggregationEnd").attr("class","marker aggregation "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),ar=c((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-dependencyStart").attr("class","marker dependency "+t).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-dependencyEnd").attr("class","marker dependency "+t).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),sr=c((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-lollipopStart").attr("class","marker lollipop "+t).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),e.append("defs").append("marker").attr("id",a+"_"+t+"-lollipopEnd").attr("class","marker lollipop "+t).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),ir=c((e,t,a)=>{e.append("marker").attr("id",a+"_"+t+"-pointEnd").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),e.append("marker").attr("id",a+"_"+t+"-pointStart").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),nr=c((e,t,a)=>{e.append("marker").attr("id",a+"_"+t+"-circleEnd").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),e.append("marker").attr("id",a+"_"+t+"-circleStart").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),lr=c((e,t,a)=>{e.append("marker").attr("id",a+"_"+t+"-crossEnd").attr("class","marker cross "+t).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),e.append("marker").attr("id",a+"_"+t+"-crossStart").attr("class","marker cross "+t).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),or=c((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),cr={extension:tr,composition:er,aggregation:rr,dependency:ar,lollipop:sr,point:ir,circle:nr,cross:lr,barb:or},Qt=$e;var O=B()?.block?.padding??8;function hr(e,t){if(e===0||!Number.isInteger(e))throw new Error("Columns must be an integer !== 0.");if(t<0||!Number.isInteger(t))throw new Error("Position must be a non-negative integer."+t);if(e<0)return{px:t,py:0};if(e===1)return{px:0,py:t};let a=t%e,i=Math.floor(t/e);return{px:a,py:i}}c(hr,"calculateBlockPosition");var gr=c(e=>{let t=0,a=0;for(let i of e.children){let{width:l,height:s,x:r,y:n}=i.size??{width:0,height:0,x:0,y:0};w.debug("getMaxChildSize abc95 child:",i.id,"width:",l,"height:",s,"x:",r,"y:",n,i.type),i.type!=="space"&&(l>t&&(t=l/(e.widthInColumns??1)),s>a&&(a=s))}return{width:t,height:a}},"getMaxChildSize");function Lt(e,t,a=0,i=0){w.debug("setBlockSizes abc95 (start)",e.id,e?.size?.x,"block width =",e?.size,"siblingWidth",a),e?.size?.width||(e.size={width:a,height:i,x:0,y:0});let l=0,s=0;if(e.children?.length>0){for(let b of e.children)Lt(b,t);let r=gr(e);l=r.width,s=r.height,w.debug("setBlockSizes abc95 maxWidth of",e.id,":s children is ",l,s);for(let b of e.children)b.size&&(w.debug(`abc95 Setting size of children of ${e.id} id=${b.id} ${l} ${s} ${JSON.stringify(b.size)}`),b.size.width=l*(b.widthInColumns??1)+O*((b.widthInColumns??1)-1),b.size.height=s,b.size.x=0,b.size.y=0,w.debug(`abc95 updating size of ${e.id} children child:${b.id} maxWidth:${l} maxHeight:${s}`));for(let b of e.children)Lt(b,t,l,s);let n=e.columns??-1,o=0;for(let b of e.children)o+=b.widthInColumns??1;let u=e.children.length;n>0&&n0?Math.min(e.children.length,n):e.children.length;if(b>0){let L=(x-b*O-O)/b;w.debug("abc95 (growing to fit) width",e.id,x,e.size?.width,L);for(let _ of e.children)_.size&&(_.size.width=L)}}e.size={width:x,height:m,x:0,y:0}}w.debug("setBlockSizes abc94 (done)",e.id,e?.size?.x,e?.size?.width,e?.size?.y,e?.size?.height)}c(Lt,"setBlockSizes");function $t(e,t){w.debug(`abc85 layout blocks (=>layoutBlocks) ${e.id} x: ${e?.size?.x} y: ${e?.size?.y} width: ${e?.size?.width}`);let a=e.columns??-1;if(w.debug("layoutBlocks columns abc95",e.id,"=>",a,e),e.children&&e.children.length>0){let i=e?.children[0]?.size?.width??0,l=e.children.length*i+(e.children.length-1)*O;w.debug("widthOfChildren 88",l,"posX");let s=0;w.debug("abc91 block?.size?.x",e.id,e?.size?.x);let r=e?.size?.x?e?.size?.x+(-e?.size?.width/2||0):-O,n=0;for(let o of e.children){let u=e;if(!o.size)continue;let{width:h,height:x}=o.size,{px:m,py:b}=hr(a,s);if(b!=n&&(n=b,r=e?.size?.x?e?.size?.x+(-e?.size?.width/2||0):-O,w.debug("New row in layout for block",e.id," and child ",o.id,n)),w.debug(`abc89 layout blocks (child) id: ${o.id} Pos: ${s} (px, py) ${m},${b} (${u?.size?.x},${u?.size?.y}) parent: ${u.id} width: ${h}${O}`),u.size){let _=h/2;o.size.x=r+O+_,w.debug(`abc91 layout blocks (calc) px, pyid:${o.id} startingPos=X${r} new startingPosX${o.size.x} ${_} padding=${O} width=${h} halfWidth=${_} => x:${o.size.x} y:${o.size.y} ${o.widthInColumns} (width * (child?.w || 1)) / 2 ${h*(o?.widthInColumns??1)/2}`),r=o.size.x+_,o.size.y=u.size.y-u.size.height/2+b*(x+O)+x/2+O,w.debug(`abc88 layout blocks (calc) px, pyid:${o.id}startingPosX${r}${O}${_}=>x:${o.size.x}y:${o.size.y}${o.widthInColumns}(width * (child?.w || 1)) / 2${h*(o?.widthInColumns??1)/2}`)}o.children&&$t(o,t);let L=o?.widthInColumns??1;a>0&&(L=Math.min(L,a-s%a)),s+=L,w.debug("abc88 columnsPos",o,s)}}w.debug(`layout blocks (<==layoutBlocks) ${e.id} x: ${e?.size?.x} y: ${e?.size?.y} width: ${e?.size?.width}`)}c($t,"layoutBlocks");function te(e,{minX:t,minY:a,maxX:i,maxY:l}={minX:0,minY:0,maxX:0,maxY:0}){if(e.size&&e.id!=="root"){let{x:s,y:r,width:n,height:o}=e.size;s-n/2i&&(i=s+n/2),r+o/2>l&&(l=r+o/2)}if(e.children)for(let s of e.children)({minX:t,minY:a,maxX:i,maxY:l}=te(s,{minX:t,minY:a,maxX:i,maxY:l}));return{minX:t,minY:a,maxX:i,maxY:l}}c(te,"findBounds");function ee(e){let t=e.getBlock("root");if(!t)return;Lt(t,e,0,0),$t(t,e),w.debug("getBlocks",JSON.stringify(t,null,2));let{minX:a,minY:i,maxX:l,maxY:s}=te(t),r=s-i,n=l-a;return{x:a,y:i,width:n,height:r}}c(ee,"layout");function re(e,t){t&&e.attr("style",t)}c(re,"applyStyle");function dr(e,t){let a=C(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),i=a.append("xhtml:div"),l=e.label,s=e.isNode?"nodeLabel":"edgeLabel",r=i.append("span");return r.html(et(l,t)),re(r,e.labelStyle),r.attr("class",s),re(i,e.labelStyle),i.style("display","inline-block"),i.style("white-space","nowrap"),i.attr("xmlns","http://www.w3.org/1999/xhtml"),a.node()}c(dr,"addHtmlLabel");var ur=c(async(e,t,a,i)=>{let l=e||"";typeof l=="object"&&(l=l[0]);let s=B();if(P(s.flowchart.htmlLabels)){l=l.replace(/\\n|\n/g,"
"),w.debug("vertexText"+l);let r=await Ft(rt(l)),n={isNode:i,label:r,labelStyle:t.replace("fill:","color:")};return dr(n,s)}else{let r=document.createElementNS("http://www.w3.org/2000/svg","text");r.setAttribute("style",t.replace("color:","fill:"));let n=[];typeof l=="string"?n=l.split(/\\n|\n|/gi):Array.isArray(l)?n=l:n=[];for(let o of n){let u=document.createElementNS("http://www.w3.org/2000/svg","tspan");u.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),u.setAttribute("dy","1em"),u.setAttribute("x","0"),a?u.setAttribute("class","title-row"):u.setAttribute("class","row"),u.textContent=o.trim(),r.appendChild(u)}return r}},"createLabel"),W=ur;var se=c((e,t,a,i,l)=>{t.arrowTypeStart&&ae(e,"start",t.arrowTypeStart,a,i,l),t.arrowTypeEnd&&ae(e,"end",t.arrowTypeEnd,a,i,l)},"addEdgeMarkers"),pr={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},ae=c((e,t,a,i,l,s)=>{let r=pr[a];if(!r){w.warn(`Unknown arrow type: ${a}`);return}let n=t==="start"?"Start":"End";e.attr(`marker-${t}`,`url(${i}#${l}_${s}-${r}${n})`)},"addEdgeMarker");var St={},M={};var ne=c(async(e,t)=>{let a=B(),i=P(a.flowchart.htmlLabels),l=t.labelType==="markdown"?lt(e,t.label,{style:t.labelStyle,useHtmlLabels:i,addSvgBackground:!0},a):await W(t.label,t.labelStyle),s=e.insert("g").attr("class","edgeLabel"),r=s.insert("g").attr("class","label");r.node().appendChild(l);let n=l.getBBox();if(i){let u=l.children[0],h=C(l);n=u.getBoundingClientRect(),h.attr("width",n.width),h.attr("height",n.height)}r.attr("transform","translate("+-n.width/2+", "+-n.height/2+")"),St[t.id]=s,t.width=n.width,t.height=n.height;let o;if(t.startLabelLeft){let u=await W(t.startLabelLeft,t.labelStyle),h=e.insert("g").attr("class","edgeTerminals"),x=h.insert("g").attr("class","inner");o=x.node().appendChild(u);let m=u.getBBox();x.attr("transform","translate("+-m.width/2+", "+-m.height/2+")"),M[t.id]||(M[t.id]={}),M[t.id].startLeft=h,ht(o,t.startLabelLeft)}if(t.startLabelRight){let u=await W(t.startLabelRight,t.labelStyle),h=e.insert("g").attr("class","edgeTerminals"),x=h.insert("g").attr("class","inner");o=h.node().appendChild(u),x.node().appendChild(u);let m=u.getBBox();x.attr("transform","translate("+-m.width/2+", "+-m.height/2+")"),M[t.id]||(M[t.id]={}),M[t.id].startRight=h,ht(o,t.startLabelRight)}if(t.endLabelLeft){let u=await W(t.endLabelLeft,t.labelStyle),h=e.insert("g").attr("class","edgeTerminals"),x=h.insert("g").attr("class","inner");o=x.node().appendChild(u);let m=u.getBBox();x.attr("transform","translate("+-m.width/2+", "+-m.height/2+")"),h.node().appendChild(u),M[t.id]||(M[t.id]={}),M[t.id].endLeft=h,ht(o,t.endLabelLeft)}if(t.endLabelRight){let u=await W(t.endLabelRight,t.labelStyle),h=e.insert("g").attr("class","edgeTerminals"),x=h.insert("g").attr("class","inner");o=x.node().appendChild(u);let m=u.getBBox();x.attr("transform","translate("+-m.width/2+", "+-m.height/2+")"),h.node().appendChild(u),M[t.id]||(M[t.id]={}),M[t.id].endRight=h,ht(o,t.endLabelRight)}return l},"insertEdgeLabel");function ht(e,t){B().flowchart.htmlLabels&&e&&(e.style.width=t.length*9+"px",e.style.height="12px")}c(ht,"setTerminalWidth");var le=c((e,t)=>{w.debug("Moving label abc88 ",e.id,e.label,St[e.id],t);let a=t.updatedPath?t.updatedPath:t.originalPath,i=B(),{subGraphTitleTotalMargin:l}=Wt(i);if(e.label){let s=St[e.id],r=e.x,n=e.y;if(a){let o=tt.calcLabelPosition(a);w.debug("Moving label "+e.label+" from (",r,",",n,") to (",o.x,",",o.y,") abc88"),t.updatedPath&&(r=o.x,n=o.y)}s.attr("transform",`translate(${r}, ${n+l/2})`)}if(e.startLabelLeft){let s=M[e.id].startLeft,r=e.x,n=e.y;if(a){let o=tt.calcTerminalLabelPosition(e.arrowTypeStart?10:0,"start_left",a);r=o.x,n=o.y}s.attr("transform",`translate(${r}, ${n})`)}if(e.startLabelRight){let s=M[e.id].startRight,r=e.x,n=e.y;if(a){let o=tt.calcTerminalLabelPosition(e.arrowTypeStart?10:0,"start_right",a);r=o.x,n=o.y}s.attr("transform",`translate(${r}, ${n})`)}if(e.endLabelLeft){let s=M[e.id].endLeft,r=e.x,n=e.y;if(a){let o=tt.calcTerminalLabelPosition(e.arrowTypeEnd?10:0,"end_left",a);r=o.x,n=o.y}s.attr("transform",`translate(${r}, ${n})`)}if(e.endLabelRight){let s=M[e.id].endRight,r=e.x,n=e.y;if(a){let o=tt.calcTerminalLabelPosition(e.arrowTypeEnd?10:0,"end_right",a);r=o.x,n=o.y}s.attr("transform",`translate(${r}, ${n})`)}},"positionEdgeLabel"),fr=c((e,t)=>{let a=e.x,i=e.y,l=Math.abs(t.x-a),s=Math.abs(t.y-i),r=e.width/2,n=e.height/2;return l>=r||s>=n},"outsideNode"),xr=c((e,t,a)=>{w.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(t)} + insidePoint : ${JSON.stringify(a)} + node : x:${e.x} y:${e.y} w:${e.width} h:${e.height}`);let i=e.x,l=e.y,s=Math.abs(i-a.x),r=e.width/2,n=a.xMath.abs(i-t.x)*o){let x=a.y{w.debug("abc88 cutPathAtIntersect",e,t);let a=[],i=e[0],l=!1;return e.forEach(s=>{if(!fr(t,s)&&!l){let r=xr(t,i,s),n=!1;a.forEach(o=>{n=n||o.x===r.x&&o.y===r.y}),a.some(o=>o.x===r.x&&o.y===r.y)||a.push(r),l=!0}else i=s,l||a.push(s)}),a},"cutPathAtIntersect"),oe=c(function(e,t,a,i,l,s,r){let n=a.points;w.debug("abc88 InsertEdge: edge=",a,"e=",t);let o=!1,u=s.node(t.v);var h=s.node(t.w);h?.intersect&&u?.intersect&&(n=n.slice(1,a.points.length-1),n.unshift(u.intersect(n[0])),n.push(h.intersect(n[n.length-1]))),a.toCluster&&(w.debug("to cluster abc88",i[a.toCluster]),n=ie(a.points,i[a.toCluster].node),o=!0),a.fromCluster&&(w.debug("from cluster abc88",i[a.fromCluster]),n=ie(n.reverse(),i[a.fromCluster].node).reverse(),o=!0);let x=n.filter(y=>!Number.isNaN(y.y)),m=At;a.curve&&(l==="graph"||l==="flowchart")&&(m=a.curve);let{x:b,y:L}=Pt(a),_=zt().x(b).y(L).curve(m),S;switch(a.thickness){case"normal":S="edge-thickness-normal";break;case"thick":S="edge-thickness-thick";break;case"invisible":S="edge-thickness-thick";break;default:S=""}switch(a.pattern){case"solid":S+=" edge-pattern-solid";break;case"dotted":S+=" edge-pattern-dotted";break;case"dashed":S+=" edge-pattern-dashed";break}let I=e.append("path").attr("d",_(x)).attr("id",a.id).attr("class"," "+S+(a.classes?" "+a.classes:"")).attr("style",a.style),D="";(B().flowchart.arrowMarkerAbsolute||B().state.arrowMarkerAbsolute)&&(D=Nt(!0)),se(I,a,D,r,l);let T={};return o&&(T.updatedPath=n),T.originalPath=a.points,T},"insertEdge");var br=c(e=>{let t=new Set;for(let a of e)switch(a){case"x":t.add("right"),t.add("left");break;case"y":t.add("up"),t.add("down");break;default:t.add(a);break}return t},"expandAndDeduplicateDirections"),ce=c((e,t,a)=>{let i=br(e),l=2,s=t.height+2*a.padding,r=s/l,n=t.width+2*r+a.padding,o=a.padding/2;return i.has("right")&&i.has("left")&&i.has("up")&&i.has("down")?[{x:0,y:0},{x:r,y:0},{x:n/2,y:2*o},{x:n-r,y:0},{x:n,y:0},{x:n,y:-s/3},{x:n+2*o,y:-s/2},{x:n,y:-2*s/3},{x:n,y:-s},{x:n-r,y:-s},{x:n/2,y:-s-2*o},{x:r,y:-s},{x:0,y:-s},{x:0,y:-2*s/3},{x:-2*o,y:-s/2},{x:0,y:-s/3}]:i.has("right")&&i.has("left")&&i.has("up")?[{x:r,y:0},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:r,y:-s},{x:0,y:-s/2}]:i.has("right")&&i.has("left")&&i.has("down")?[{x:0,y:0},{x:r,y:-s},{x:n-r,y:-s},{x:n,y:0}]:i.has("right")&&i.has("up")&&i.has("down")?[{x:0,y:0},{x:n,y:-r},{x:n,y:-s+r},{x:0,y:-s}]:i.has("left")&&i.has("up")&&i.has("down")?[{x:n,y:0},{x:0,y:-r},{x:0,y:-s+r},{x:n,y:-s}]:i.has("right")&&i.has("left")?[{x:r,y:0},{x:r,y:-o},{x:n-r,y:-o},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:n-r,y:-s+o},{x:r,y:-s+o},{x:r,y:-s},{x:0,y:-s/2}]:i.has("up")&&i.has("down")?[{x:n/2,y:0},{x:0,y:-o},{x:r,y:-o},{x:r,y:-s+o},{x:0,y:-s+o},{x:n/2,y:-s},{x:n,y:-s+o},{x:n-r,y:-s+o},{x:n-r,y:-o},{x:n,y:-o}]:i.has("right")&&i.has("up")?[{x:0,y:0},{x:n,y:-r},{x:0,y:-s}]:i.has("right")&&i.has("down")?[{x:0,y:0},{x:n,y:0},{x:0,y:-s}]:i.has("left")&&i.has("up")?[{x:n,y:0},{x:0,y:-r},{x:n,y:-s}]:i.has("left")&&i.has("down")?[{x:n,y:0},{x:0,y:0},{x:n,y:-s}]:i.has("right")?[{x:r,y:-o},{x:r,y:-o},{x:n-r,y:-o},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:n-r,y:-s+o},{x:r,y:-s+o},{x:r,y:-s+o}]:i.has("left")?[{x:r,y:0},{x:r,y:-o},{x:n-r,y:-o},{x:n-r,y:-s+o},{x:r,y:-s+o},{x:r,y:-s},{x:0,y:-s/2}]:i.has("up")?[{x:r,y:-o},{x:r,y:-s+o},{x:0,y:-s+o},{x:n/2,y:-s},{x:n,y:-s+o},{x:n-r,y:-s+o},{x:n-r,y:-o}]:i.has("down")?[{x:n/2,y:0},{x:0,y:-o},{x:r,y:-o},{x:r,y:-s+o},{x:n-r,y:-s+o},{x:n-r,y:-o},{x:n,y:-o}]:[{x:0,y:0}]},"getArrowPoints");function yr(e,t){return e.intersect(t)}c(yr,"intersectNode");var he=yr;function mr(e,t,a,i){var l=e.x,s=e.y,r=l-i.x,n=s-i.y,o=Math.sqrt(t*t*n*n+a*a*r*r),u=Math.abs(t*a*r/o);i.x0}c(de,"sameSign");var ue=kr;var pe=Lr;function Lr(e,t,a){var i=e.x,l=e.y,s=[],r=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY;typeof t.forEach=="function"?t.forEach(function(L){r=Math.min(r,L.x),n=Math.min(n,L.y)}):(r=Math.min(r,t.x),n=Math.min(n,t.y));for(var o=i-e.width/2-r,u=l-e.height/2-n,h=0;h1&&s.sort(function(L,_){var S=L.x-a.x,I=L.y-a.y,D=Math.sqrt(S*S+I*I),T=_.x-a.x,y=_.y-a.y,d=Math.sqrt(T*T+y*y);return D{var a=e.x,i=e.y,l=t.x-a,s=t.y-i,r=e.width/2,n=e.height/2,o,u;return Math.abs(s)*r>Math.abs(l)*n?(s<0&&(n=-n),o=s===0?0:n*l/s,u=n):(l<0&&(r=-r),o=r,u=l===0?0:r*s/l),{x:a+o,y:i+u}},"intersectRect"),fe=Sr;var v={node:he,circle:ge,ellipse:gt,polygon:pe,rect:fe};var z=c(async(e,t,a,i)=>{let l=B(),s,r=t.useHtmlLabels||P(l.flowchart.htmlLabels);a?s=a:s="node default";let n=e.insert("g").attr("class",s).attr("id",t.domId||t.id),o=n.insert("g").attr("class","label").attr("style",t.labelStyle),u;t.labelText===void 0?u="":u=typeof t.labelText=="string"?t.labelText:t.labelText[0];let h=o.node(),x;t.labelType==="markdown"?x=lt(o,et(rt(u),l),{useHtmlLabels:r,width:t.width||l.flowchart.wrappingWidth,classes:"markdown-node-label"},l):x=h.appendChild(await W(et(rt(u),l),t.labelStyle,!1,i));let m=x.getBBox(),b=t.padding/2;if(P(l.flowchart.htmlLabels)){let L=x.children[0],_=C(x),S=L.getElementsByTagName("img");if(S){let I=u.replace(/]*>/g,"").trim()==="";await Promise.all([...S].map(D=>new Promise(T=>{function y(){if(D.style.display="flex",D.style.flexDirection="column",I){let d=l.fontSize?l.fontSize:window.getComputedStyle(document.body).fontSize,k=parseInt(d,10)*5+"px";D.style.minWidth=k,D.style.maxWidth=k}else D.style.width="100%";T(D)}c(y,"setupImage"),setTimeout(()=>{D.complete&&y()}),D.addEventListener("error",y),D.addEventListener("load",y)})))}m=L.getBoundingClientRect(),_.attr("width",m.width),_.attr("height",m.height)}return r?o.attr("transform","translate("+-m.width/2+", "+-m.height/2+")"):o.attr("transform","translate(0, "+-m.height/2+")"),t.centerLabel&&o.attr("transform","translate("+-m.width/2+", "+-m.height/2+")"),o.insert("rect",":first-child"),{shapeSvg:n,bbox:m,halfPadding:b,label:o}},"labelHelper"),N=c((e,t)=>{let a=t.node().getBBox();e.width=a.width,e.height=a.height},"updateNodeBounds");function U(e,t,a,i){return e.insert("polygon",":first-child").attr("points",i.map(function(l){return l.x+","+l.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-t/2+","+a/2+")")}c(U,"insertPolygonShape");var Er=c(async(e,t)=>{t.useHtmlLabels||B().flowchart.htmlLabels||(t.centerLabel=!0);let{shapeSvg:i,bbox:l,halfPadding:s}=await z(e,t,"node "+t.classes,!0);w.info("Classes = ",t.classes);let r=i.insert("rect",":first-child");return r.attr("rx",t.rx).attr("ry",t.ry).attr("x",-l.width/2-s).attr("y",-l.height/2-s).attr("width",l.width+t.padding).attr("height",l.height+t.padding),N(t,r),t.intersect=function(n){return v.rect(t,n)},i},"note"),xe=Er;var be=c(e=>e?" "+e:"","formatClass"),j=c((e,t)=>`${t||"node default"}${be(e.classes)} ${be(e.class)}`,"getClassesFromNode"),ye=c(async(e,t)=>{let{shapeSvg:a,bbox:i}=await z(e,t,j(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=l+s,n=[{x:r/2,y:0},{x:r,y:-r/2},{x:r/2,y:-r},{x:0,y:-r/2}];w.info("Question main (Circle)");let o=U(a,r,r,n);return o.attr("style",t.style),N(t,o),t.intersect=function(u){return w.warn("Intersect called"),v.polygon(t,n,u)},a},"question"),_r=c((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),i=28,l=[{x:0,y:i/2},{x:i/2,y:0},{x:0,y:-i/2},{x:-i/2,y:0}];return a.insert("polygon",":first-child").attr("points",l.map(function(r){return r.x+","+r.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),t.width=28,t.height=28,t.intersect=function(r){return v.circle(t,14,r)},a},"choice"),Dr=c(async(e,t)=>{let{shapeSvg:a,bbox:i}=await z(e,t,j(t,void 0),!0),l=4,s=i.height+t.padding,r=s/l,n=i.width+2*r+t.padding,o=[{x:r,y:0},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:r,y:-s},{x:0,y:-s/2}],u=U(a,n,s,o);return u.attr("style",t.style),N(t,u),t.intersect=function(h){return v.polygon(t,o,h)},a},"hexagon"),Br=c(async(e,t)=>{let{shapeSvg:a,bbox:i}=await z(e,t,void 0,!0),l=2,s=i.height+2*t.padding,r=s/l,n=i.width+2*r+t.padding,o=ce(t.directions,i,t),u=U(a,n,s,o);return u.attr("style",t.style),N(t,u),t.intersect=function(h){return v.polygon(t,o,h)},a},"block_arrow"),vr=c(async(e,t)=>{let{shapeSvg:a,bbox:i}=await z(e,t,j(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:-s/2,y:0},{x:l,y:0},{x:l,y:-s},{x:-s/2,y:-s},{x:0,y:-s/2}];return U(a,l,s,r).attr("style",t.style),t.width=l+s,t.height=s,t.intersect=function(o){return v.polygon(t,r,o)},a},"rect_left_inv_arrow"),Tr=c(async(e,t)=>{let{shapeSvg:a,bbox:i}=await z(e,t,j(t),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:-2*s/6,y:0},{x:l-s/6,y:0},{x:l+2*s/6,y:-s},{x:s/6,y:-s}],n=U(a,l,s,r);return n.attr("style",t.style),N(t,n),t.intersect=function(o){return v.polygon(t,r,o)},a},"lean_right"),Cr=c(async(e,t)=>{let{shapeSvg:a,bbox:i}=await z(e,t,j(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:2*s/6,y:0},{x:l+s/6,y:0},{x:l-2*s/6,y:-s},{x:-s/6,y:-s}],n=U(a,l,s,r);return n.attr("style",t.style),N(t,n),t.intersect=function(o){return v.polygon(t,r,o)},a},"lean_left"),Nr=c(async(e,t)=>{let{shapeSvg:a,bbox:i}=await z(e,t,j(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:-2*s/6,y:0},{x:l+2*s/6,y:0},{x:l-s/6,y:-s},{x:s/6,y:-s}],n=U(a,l,s,r);return n.attr("style",t.style),N(t,n),t.intersect=function(o){return v.polygon(t,r,o)},a},"trapezoid"),Ir=c(async(e,t)=>{let{shapeSvg:a,bbox:i}=await z(e,t,j(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:s/6,y:0},{x:l-s/6,y:0},{x:l+2*s/6,y:-s},{x:-2*s/6,y:-s}],n=U(a,l,s,r);return n.attr("style",t.style),N(t,n),t.intersect=function(o){return v.polygon(t,r,o)},a},"inv_trapezoid"),Or=c(async(e,t)=>{let{shapeSvg:a,bbox:i}=await z(e,t,j(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:0,y:0},{x:l+s/2,y:0},{x:l,y:-s/2},{x:l+s/2,y:-s},{x:0,y:-s}],n=U(a,l,s,r);return n.attr("style",t.style),N(t,n),t.intersect=function(o){return v.polygon(t,r,o)},a},"rect_right_inv_arrow"),Rr=c(async(e,t)=>{let{shapeSvg:a,bbox:i}=await z(e,t,j(t,void 0),!0),l=i.width+t.padding,s=l/2,r=s/(2.5+l/50),n=i.height+r+t.padding,o="M 0,"+r+" a "+s+","+r+" 0,0,0 "+l+" 0 a "+s+","+r+" 0,0,0 "+-l+" 0 l 0,"+n+" a "+s+","+r+" 0,0,0 "+l+" 0 l 0,"+-n,u=a.attr("label-offset-y",r).insert("path",":first-child").attr("style",t.style).attr("d",o).attr("transform","translate("+-l/2+","+-(n/2+r)+")");return N(t,u),t.intersect=function(h){let x=v.rect(t,h),m=x.x-t.x;if(s!=0&&(Math.abs(m)t.height/2-r)){let b=r*r*(1-m*m/(s*s));b!=0&&(b=Math.sqrt(b)),b=r-b,h.y-t.y>0&&(b=-b),x.y+=b}return x},a},"cylinder"),zr=c(async(e,t)=>{let{shapeSvg:a,bbox:i,halfPadding:l}=await z(e,t,"node "+t.classes+" "+t.class,!0),s=a.insert("rect",":first-child"),r=t.positioned?t.width:i.width+t.padding,n=t.positioned?t.height:i.height+t.padding,o=t.positioned?-r/2:-i.width/2-l,u=t.positioned?-n/2:-i.height/2-l;if(s.attr("class","basic label-container").attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("x",o).attr("y",u).attr("width",r).attr("height",n),t.props){let h=new Set(Object.keys(t.props));t.props.borders&&(Et(s,t.props.borders,r,n),h.delete("borders")),h.forEach(x=>{w.warn(`Unknown node property ${x}`)})}return N(t,s),t.intersect=function(h){return v.rect(t,h)},a},"rect"),Ar=c(async(e,t)=>{let{shapeSvg:a,bbox:i,halfPadding:l}=await z(e,t,"node "+t.classes,!0),s=a.insert("rect",":first-child"),r=t.positioned?t.width:i.width+t.padding,n=t.positioned?t.height:i.height+t.padding,o=t.positioned?-r/2:-i.width/2-l,u=t.positioned?-n/2:-i.height/2-l;if(s.attr("class","basic cluster composite label-container").attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("x",o).attr("y",u).attr("width",r).attr("height",n),t.props){let h=new Set(Object.keys(t.props));t.props.borders&&(Et(s,t.props.borders,r,n),h.delete("borders")),h.forEach(x=>{w.warn(`Unknown node property ${x}`)})}return N(t,s),t.intersect=function(h){return v.rect(t,h)},a},"composite"),Mr=c(async(e,t)=>{let{shapeSvg:a}=await z(e,t,"label",!0);w.trace("Classes = ",t.class);let i=a.insert("rect",":first-child"),l=0,s=0;if(i.attr("width",l).attr("height",s),a.attr("class","label edgeLabel"),t.props){let r=new Set(Object.keys(t.props));t.props.borders&&(Et(i,t.props.borders,l,s),r.delete("borders")),r.forEach(n=>{w.warn(`Unknown node property ${n}`)})}return N(t,i),t.intersect=function(r){return v.rect(t,r)},a},"labelRect");function Et(e,t,a,i){let l=[],s=c(n=>{l.push(n,0)},"addBorder"),r=c(n=>{l.push(0,n)},"skipBorder");t.includes("t")?(w.debug("add top border"),s(a)):r(a),t.includes("r")?(w.debug("add right border"),s(i)):r(i),t.includes("b")?(w.debug("add bottom border"),s(a)):r(a),t.includes("l")?(w.debug("add left border"),s(i)):r(i),e.attr("stroke-dasharray",l.join(" "))}c(Et,"applyNodePropertyBorders");var Fr=c(async(e,t)=>{let a;t.classes?a="node "+t.classes:a="node default";let i=e.insert("g").attr("class",a).attr("id",t.domId||t.id),l=i.insert("rect",":first-child"),s=i.insert("line"),r=i.insert("g").attr("class","label"),n=t.labelText.flat?t.labelText.flat():t.labelText,o="";typeof n=="object"?o=n[0]:o=n,w.info("Label text abc79",o,n,typeof n=="object");let u=r.node().appendChild(await W(o,t.labelStyle,!0,!0)),h={width:0,height:0};if(P(B().flowchart.htmlLabels)){let _=u.children[0],S=C(u);h=_.getBoundingClientRect(),S.attr("width",h.width),S.attr("height",h.height)}w.info("Text 2",n);let x=n.slice(1,n.length),m=u.getBBox(),b=r.node().appendChild(await W(x.join?x.join("
"):x,t.labelStyle,!0,!0));if(P(B().flowchart.htmlLabels)){let _=b.children[0],S=C(b);h=_.getBoundingClientRect(),S.attr("width",h.width),S.attr("height",h.height)}let L=t.padding/2;return C(b).attr("transform","translate( "+(h.width>m.width?0:(m.width-h.width)/2)+", "+(m.height+L+5)+")"),C(u).attr("transform","translate( "+(h.width{let{shapeSvg:a,bbox:i}=await z(e,t,j(t,void 0),!0),l=i.height+t.padding,s=i.width+l/4+t.padding,r=a.insert("rect",":first-child").attr("style",t.style).attr("rx",l/2).attr("ry",l/2).attr("x",-s/2).attr("y",-l/2).attr("width",s).attr("height",l);return N(t,r),t.intersect=function(n){return v.rect(t,n)},a},"stadium"),Pr=c(async(e,t)=>{let{shapeSvg:a,bbox:i,halfPadding:l}=await z(e,t,j(t,void 0),!0),s=a.insert("circle",":first-child");return s.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",i.width/2+l).attr("width",i.width+t.padding).attr("height",i.height+t.padding),w.info("Circle main"),N(t,s),t.intersect=function(r){return w.info("Circle intersect",t,i.width/2+l,r),v.circle(t,i.width/2+l,r)},a},"circle"),Yr=c(async(e,t)=>{let{shapeSvg:a,bbox:i,halfPadding:l}=await z(e,t,j(t,void 0),!0),s=5,r=a.insert("g",":first-child"),n=r.insert("circle"),o=r.insert("circle");return r.attr("class",t.class),n.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",i.width/2+l+s).attr("width",i.width+t.padding+s*2).attr("height",i.height+t.padding+s*2),o.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",i.width/2+l).attr("width",i.width+t.padding).attr("height",i.height+t.padding),w.info("DoubleCircle main"),N(t,n),t.intersect=function(u){return w.info("DoubleCircle intersect",t,i.width/2+l+s,u),v.circle(t,i.width/2+l+s,u)},a},"doublecircle"),Hr=c(async(e,t)=>{let{shapeSvg:a,bbox:i}=await z(e,t,j(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:0,y:0},{x:l,y:0},{x:l,y:-s},{x:0,y:-s},{x:0,y:0},{x:-8,y:0},{x:l+8,y:0},{x:l+8,y:-s},{x:-8,y:-s},{x:-8,y:0}],n=U(a,l,s,r);return n.attr("style",t.style),N(t,n),t.intersect=function(o){return v.polygon(t,r,o)},a},"subroutine"),jr=c((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),i=a.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),N(t,i),t.intersect=function(l){return v.circle(t,7,l)},a},"start"),me=c((e,t,a)=>{let i=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),l=70,s=10;a==="LR"&&(l=10,s=70);let r=i.append("rect").attr("x",-1*l/2).attr("y",-1*s/2).attr("width",l).attr("height",s).attr("class","fork-join");return N(t,r),t.height=t.height+t.padding/2,t.width=t.width+t.padding/2,t.intersect=function(n){return v.rect(t,n)},i},"forkJoin"),Kr=c((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),i=a.insert("circle",":first-child"),l=a.insert("circle",":first-child");return l.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),i.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),N(t,l),t.intersect=function(s){return v.circle(t,7,s)},a},"end"),Xr=c(async(e,t)=>{let a=t.padding/2,i=4,l=8,s;t.classes?s="node "+t.classes:s="node default";let r=e.insert("g").attr("class",s).attr("id",t.domId||t.id),n=r.insert("rect",":first-child"),o=r.insert("line"),u=r.insert("line"),h=0,x=i,m=r.insert("g").attr("class","label"),b=0,L=t.classData.annotations?.[0],_=t.classData.annotations[0]?"\xAB"+t.classData.annotations[0]+"\xBB":"",S=m.node().appendChild(await W(_,t.labelStyle,!0,!0)),I=S.getBBox();if(P(B().flowchart.htmlLabels)){let E=S.children[0],g=C(S);I=E.getBoundingClientRect(),g.attr("width",I.width),g.attr("height",I.height)}t.classData.annotations[0]&&(x+=I.height+i,h+=I.width);let D=t.classData.label;t.classData.type!==void 0&&t.classData.type!==""&&(B().flowchart.htmlLabels?D+="<"+t.classData.type+">":D+="<"+t.classData.type+">");let T=m.node().appendChild(await W(D,t.labelStyle,!0,!0));C(T).attr("class","classTitle");let y=T.getBBox();if(P(B().flowchart.htmlLabels)){let E=T.children[0],g=C(T);y=E.getBoundingClientRect(),g.attr("width",y.width),g.attr("height",y.height)}x+=y.height+i,y.width>h&&(h=y.width);let d=[];t.classData.members.forEach(async E=>{let g=E.getDisplayDetails(),Y=g.displayText;B().flowchart.htmlLabels&&(Y=Y.replace(//g,">"));let p=m.node().appendChild(await W(Y,g.cssStyle?g.cssStyle:t.labelStyle,!0,!0)),R=p.getBBox();if(P(B().flowchart.htmlLabels)){let Z=p.children[0],V=C(p);R=Z.getBoundingClientRect(),V.attr("width",R.width),V.attr("height",R.height)}R.width>h&&(h=R.width),x+=R.height+i,d.push(p)}),x+=l;let f=[];if(t.classData.methods.forEach(async E=>{let g=E.getDisplayDetails(),Y=g.displayText;B().flowchart.htmlLabels&&(Y=Y.replace(//g,">"));let p=m.node().appendChild(await W(Y,g.cssStyle?g.cssStyle:t.labelStyle,!0,!0)),R=p.getBBox();if(P(B().flowchart.htmlLabels)){let Z=p.children[0],V=C(p);R=Z.getBoundingClientRect(),V.attr("width",R.width),V.attr("height",R.height)}R.width>h&&(h=R.width),x+=R.height+i,f.push(p)}),x+=l,L){let E=(h-I.width)/2;C(S).attr("transform","translate( "+(-1*h/2+E)+", "+-1*x/2+")"),b=I.height+i}let k=(h-y.width)/2;return C(T).attr("transform","translate( "+(-1*h/2+k)+", "+(-1*x/2+b)+")"),b+=y.height+i,o.attr("class","divider").attr("x1",-h/2-a).attr("x2",h/2+a).attr("y1",-x/2-a+l+b).attr("y2",-x/2-a+l+b),b+=l,d.forEach(E=>{C(E).attr("transform","translate( "+-h/2+", "+(-1*x/2+b+l/2)+")");let g=E?.getBBox();b+=(g?.height??0)+i}),b+=l,u.attr("class","divider").attr("x1",-h/2-a).attr("x2",h/2+a).attr("y1",-x/2-a+l+b).attr("y2",-x/2-a+l+b),b+=l,f.forEach(E=>{C(E).attr("transform","translate( "+-h/2+", "+(-1*x/2+b)+")");let g=E?.getBBox();b+=(g?.height??0)+i}),n.attr("style",t.style).attr("class","outer title-state").attr("x",-h/2-a).attr("y",-(x/2)-a).attr("width",h+t.padding).attr("height",x+t.padding),N(t,n),t.intersect=function(E){return v.rect(t,E)},r},"class_box"),we={rhombus:ye,composite:Ar,question:ye,rect:zr,labelRect:Mr,rectWithTitle:Fr,choice:_r,circle:Pr,doublecircle:Yr,stadium:Wr,hexagon:Dr,block_arrow:Br,rect_left_inv_arrow:vr,lean_right:Tr,lean_left:Cr,trapezoid:Nr,inv_trapezoid:Ir,rect_right_inv_arrow:Or,cylinder:Rr,start:jr,end:Kr,note:xe,subroutine:Hr,fork:me,join:me,class_box:Xr},dt={},_t=c(async(e,t,a)=>{let i,l;if(t.link){let s;B().securityLevel==="sandbox"?s="_top":t.linkTarget&&(s=t.linkTarget||"_blank"),i=e.insert("svg:a").attr("xlink:href",t.link).attr("target",s),l=await we[t.shape](i,t,a)}else l=await we[t.shape](e,t,a),i=l;return t.tooltip&&l.attr("title",t.tooltip),t.class&&l.attr("class","node default "+t.class),dt[t.id]=i,t.haveCallback&&dt[t.id].attr("class",dt[t.id].attr("class")+" clickable"),i},"insertNode");var ke=c(e=>{let t=dt[e.id];w.trace("Transforming node",e.diff,e,"translate("+(e.x-e.width/2-5)+", "+e.width/2+")");let a=8,i=e.diff||0;return e.clusterNode?t.attr("transform","translate("+(e.x+i-e.width/2)+", "+(e.y-e.height/2-a)+")"):t.attr("transform","translate("+e.x+", "+e.y+")"),i},"positionNode");function Le(e,t,a=!1){let i=e,l="default";(i?.classes?.length||0)>0&&(l=(i?.classes??[]).join(" ")),l=l+" flowchart-label";let s=0,r="",n;switch(i.type){case"round":s=5,r="rect";break;case"composite":s=0,r="composite",n=0;break;case"square":r="rect";break;case"diamond":r="question";break;case"hexagon":r="hexagon";break;case"block_arrow":r="block_arrow";break;case"odd":r="rect_left_inv_arrow";break;case"lean_right":r="lean_right";break;case"lean_left":r="lean_left";break;case"trapezoid":r="trapezoid";break;case"inv_trapezoid":r="inv_trapezoid";break;case"rect_left_inv_arrow":r="rect_left_inv_arrow";break;case"circle":r="circle";break;case"ellipse":r="ellipse";break;case"stadium":r="stadium";break;case"subroutine":r="subroutine";break;case"cylinder":r="cylinder";break;case"group":r="rect";break;case"doublecircle":r="doublecircle";break;default:r="rect"}let o=Mt(i?.styles??[]),u=i.label,h=i.size??{width:0,height:0,x:0,y:0};return{labelStyle:o.labelStyle,shape:r,labelText:u,rx:s,ry:s,class:l,style:o.style,id:i.id,directions:i.directions,width:h.width,height:h.height,x:h.x,y:h.y,positioned:a,intersect:void 0,type:i.type,padding:n??q()?.block?.padding??0}}c(Le,"getNodeFromBlock");async function Ur(e,t,a){let i=Le(t,a,!1);if(i.type==="group")return;let l=q(),s=await _t(e,i,{config:l}),r=s.node().getBBox(),n=a.getBlock(i.id);n.size={width:r.width,height:r.height,x:0,y:0,node:s},a.setBlock(n),s.remove()}c(Ur,"calculateBlockSize");async function Vr(e,t,a){let i=Le(t,a,!0);if(a.getBlock(i.id).type!=="space"){let s=q();await _t(e,i,{config:s}),t.intersect=i?.intersect,ke(i)}}c(Vr,"insertBlockPositioned");async function Dt(e,t,a,i){for(let l of t)await i(e,l,a),l.children&&await Dt(e,l.children,a,i)}c(Dt,"performOperations");async function Se(e,t,a){await Dt(e,t,a,Ur)}c(Se,"calculateBlockSizes");async function Ee(e,t,a){await Dt(e,t,a,Vr)}c(Ee,"insertBlocks");async function _e(e,t,a,i,l){let s=new Ht({multigraph:!0,compound:!0});s.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(let r of a)r.size&&s.setNode(r.id,{width:r.size.width,height:r.size.height,intersect:r.intersect});for(let r of t)if(r.start&&r.end){let n=i.getBlock(r.start),o=i.getBlock(r.end);if(n?.size&&o?.size){let u=n.size,h=o.size,x=[{x:u.x,y:u.y},{x:u.x+(h.x-u.x)/2,y:u.y+(h.y-u.y)/2},{x:h.x,y:h.y}];oe(e,{v:r.start,w:r.end,name:r.id},{...r,arrowTypeEnd:r.arrowTypeEnd,arrowTypeStart:r.arrowTypeStart,points:x,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"},void 0,"block",s,l),r.label&&(await ne(e,{...r,label:r.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:r.arrowTypeEnd,arrowTypeStart:r.arrowTypeStart,points:x,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),le({...r,x:x[1].x,y:x[1].y},{originalPath:x}))}}}c(_e,"insertEdges");var Gr=c(function(e,t){return t.db.getClasses()},"getClasses"),Zr=c(async function(e,t,a,i){let{securityLevel:l,block:s}=q(),r=i.db,n;l==="sandbox"&&(n=C("#i"+t));let o=l==="sandbox"?C(n.nodes()[0].contentDocument.body):C("body"),u=l==="sandbox"?o.select(`[id="${t}"]`):C(`[id="${t}"]`);Qt(u,["point","circle","cross"],i.type,t);let x=r.getBlocks(),m=r.getBlocksFlat(),b=r.getEdges(),L=u.insert("g").attr("class","block");await Se(L,x,r);let _=ee(r);if(await Ee(L,x,r),await _e(L,b,m,r,t),_){let S=_,I=Math.max(1,Math.round(.125*(S.width/S.height))),D=S.height+I+10,T=S.width+10,{useMaxWidth:y}=s;Ot(u,D,T,!!y),w.debug("Here Bounds",_,S),u.attr("viewBox",`${S.x-5} ${S.y-5} ${S.width+10} ${S.height+10}`)}},"draw"),De={draw:Zr,getClasses:Gr};var $s={parser:Kt,db:qt,renderer:De,styles:Jt};export{$s as diagram}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/blockDiagram-MFEFEJY7.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/blockDiagram-MFEFEJY7.mjs.map new file mode 100644 index 0000000..114c4f1 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/blockDiagram-MFEFEJY7.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/block/parser/block.jison", "../../../src/diagrams/block/blockDB.ts", "../../../src/diagrams/block/styles.ts", "../../../src/dagre-wrapper/markers.js", "../../../src/diagrams/block/layout.ts", "../../../src/dagre-wrapper/createLabel.js", "../../../src/dagre-wrapper/edgeMarker.ts", "../../../src/dagre-wrapper/edges.js", "../../../src/dagre-wrapper/blockArrowHelper.ts", "../../../src/dagre-wrapper/intersect/intersect-node.js", "../../../src/dagre-wrapper/intersect/intersect-ellipse.js", "../../../src/dagre-wrapper/intersect/intersect-circle.js", "../../../src/dagre-wrapper/intersect/intersect-line.js", "../../../src/dagre-wrapper/intersect/intersect-polygon.js", "../../../src/dagre-wrapper/intersect/intersect-rect.js", "../../../src/dagre-wrapper/intersect/index.js", "../../../src/dagre-wrapper/shapes/util.js", "../../../src/dagre-wrapper/shapes/note.js", "../../../src/dagre-wrapper/nodes.js", "../../../src/diagrams/block/renderHelpers.ts", "../../../src/diagrams/block/blockRenderer.ts", "../../../src/diagrams/block/blockDiagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,15],$V1=[1,7],$V2=[1,13],$V3=[1,14],$V4=[1,19],$V5=[1,16],$V6=[1,17],$V7=[1,18],$V8=[8,30],$V9=[8,10,21,28,29,30,31,39,43,46],$Va=[1,23],$Vb=[1,24],$Vc=[8,10,15,16,21,28,29,30,31,39,43,46],$Vd=[8,10,15,16,21,27,28,29,30,31,39,43,46],$Ve=[1,49];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"spaceLines\":3,\"SPACELINE\":4,\"NL\":5,\"separator\":6,\"SPACE\":7,\"EOF\":8,\"start\":9,\"BLOCK_DIAGRAM_KEY\":10,\"document\":11,\"stop\":12,\"statement\":13,\"link\":14,\"LINK\":15,\"START_LINK\":16,\"LINK_LABEL\":17,\"STR\":18,\"nodeStatement\":19,\"columnsStatement\":20,\"SPACE_BLOCK\":21,\"blockStatement\":22,\"classDefStatement\":23,\"cssClassStatement\":24,\"styleStatement\":25,\"node\":26,\"SIZE\":27,\"COLUMNS\":28,\"id-block\":29,\"end\":30,\"NODE_ID\":31,\"nodeShapeNLabel\":32,\"dirList\":33,\"DIR\":34,\"NODE_DSTART\":35,\"NODE_DEND\":36,\"BLOCK_ARROW_START\":37,\"BLOCK_ARROW_END\":38,\"classDef\":39,\"CLASSDEF_ID\":40,\"CLASSDEF_STYLEOPTS\":41,\"DEFAULT\":42,\"class\":43,\"CLASSENTITY_IDS\":44,\"STYLECLASS\":45,\"style\":46,\"STYLE_ENTITY_IDS\":47,\"STYLE_DEFINITION_DATA\":48,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"SPACELINE\",5:\"NL\",7:\"SPACE\",8:\"EOF\",10:\"BLOCK_DIAGRAM_KEY\",15:\"LINK\",16:\"START_LINK\",17:\"LINK_LABEL\",18:\"STR\",21:\"SPACE_BLOCK\",27:\"SIZE\",28:\"COLUMNS\",29:\"id-block\",30:\"end\",31:\"NODE_ID\",34:\"DIR\",35:\"NODE_DSTART\",36:\"NODE_DEND\",37:\"BLOCK_ARROW_START\",38:\"BLOCK_ARROW_END\",39:\"classDef\",40:\"CLASSDEF_ID\",41:\"CLASSDEF_STYLEOPTS\",42:\"DEFAULT\",43:\"class\",44:\"CLASSENTITY_IDS\",45:\"STYLECLASS\",46:\"style\",47:\"STYLE_ENTITY_IDS\",48:\"STYLE_DEFINITION_DATA\"},\nproductions_: [0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[33,1],[33,2],[32,3],[32,4],[23,3],[23,3],[24,3],[25,3]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 4:\nyy.getLogger().debug('Rule: separator (NL) ');\nbreak;\ncase 5:\nyy.getLogger().debug('Rule: separator (Space) ');\nbreak;\ncase 6:\nyy.getLogger().debug('Rule: separator (EOF) ');\nbreak;\ncase 7:\n yy.getLogger().debug(\"Rule: hierarchy: \", $$[$0-1]); yy.setHierarchy($$[$0-1]); \nbreak;\ncase 8:\nyy.getLogger().debug('Stop NL ');\nbreak;\ncase 9:\nyy.getLogger().debug('Stop EOF ');\nbreak;\ncase 10:\nyy.getLogger().debug('Stop NL2 ');\nbreak;\ncase 11:\nyy.getLogger().debug('Stop EOF2 ');\nbreak;\ncase 12:\n yy.getLogger().debug(\"Rule: statement: \", $$[$0]); typeof $$[$0].length === 'number'?this.$ = $$[$0]:this.$ = [$$[$0]]; \nbreak;\ncase 13:\n yy.getLogger().debug(\"Rule: statement #2: \", $$[$0-1]); this.$ = [$$[$0-1]].concat($$[$0]); \nbreak;\ncase 14:\n yy.getLogger().debug(\"Rule: link: \", $$[$0], yytext); this.$={edgeTypeStr: $$[$0], label:''}; \nbreak;\ncase 15:\n yy.getLogger().debug(\"Rule: LABEL link: \", $$[$0-3], $$[$0-1], $$[$0]); this.$={edgeTypeStr: $$[$0], label:$$[$0-1]}; \nbreak;\ncase 18:\n const num=parseInt($$[$0]); const spaceId = yy.generateId(); this.$ = { id: spaceId, type:'space', label:'', width: num, children: [] }\nbreak;\ncase 23:\n\n yy.getLogger().debug('Rule: (nodeStatement link node) ', $$[$0-2], $$[$0-1], $$[$0], ' typestr: ',$$[$0-1].edgeTypeStr);\n const edgeData = yy.edgeStrToEdgeData($$[$0-1].edgeTypeStr)\n this.$ = [\n {id: $$[$0-2].id, label: $$[$0-2].label, type:$$[$0-2].type, directions: $$[$0-2].directions},\n {id: $$[$0-2].id + '-' + $$[$0].id, start: $$[$0-2].id, end: $$[$0].id, label: $$[$0-1].label, type: 'edge', directions: $$[$0].directions, arrowTypeEnd: edgeData, arrowTypeStart: 'arrow_open' },\n {id: $$[$0].id, label: $$[$0].label, type: yy.typeStr2Type($$[$0].typeStr), directions: $$[$0].directions}\n ];\n \nbreak;\ncase 24:\n yy.getLogger().debug('Rule: nodeStatement (abc88 node size) ', $$[$0-1], $$[$0]); this.$ = {id: $$[$0-1].id, label: $$[$0-1].label, type: yy.typeStr2Type($$[$0-1].typeStr), directions: $$[$0-1].directions, widthInColumns: parseInt($$[$0],10)}; \nbreak;\ncase 25:\n yy.getLogger().debug('Rule: nodeStatement (node) ', $$[$0]); this.$ = {id: $$[$0].id, label: $$[$0].label, type: yy.typeStr2Type($$[$0].typeStr), directions: $$[$0].directions, widthInColumns:1}; \nbreak;\ncase 26:\n yy.getLogger().debug('APA123', this? this:'na'); yy.getLogger().debug(\"COLUMNS: \", $$[$0]); this.$ = {type: 'column-setting', columns: $$[$0] === 'auto'?-1:parseInt($$[$0]) } \nbreak;\ncase 27:\n yy.getLogger().debug('Rule: id-block statement : ', $$[$0-2], $$[$0-1]); const id2 = yy.generateId(); this.$ = { ...$$[$0-2], type:'composite', children: $$[$0-1] }; \nbreak;\ncase 28:\n yy.getLogger().debug('Rule: blockStatement : ', $$[$0-2], $$[$0-1], $$[$0]); const id = yy.generateId(); this.$ = { id, type:'composite', label:'', children: $$[$0-1] }; \nbreak;\ncase 29:\n yy.getLogger().debug(\"Rule: node (NODE_ID separator): \", $$[$0]); this.$ = { id: $$[$0] }; \nbreak;\ncase 30:\n\n yy.getLogger().debug(\"Rule: node (NODE_ID nodeShapeNLabel separator): \", $$[$0-1], $$[$0]);\n this.$ = { id: $$[$0-1], label: $$[$0].label, typeStr: $$[$0].typeStr, directions: $$[$0].directions };\n \nbreak;\ncase 31:\n yy.getLogger().debug(\"Rule: dirList: \", $$[$0]); this.$ = [$$[$0]]; \nbreak;\ncase 32:\n yy.getLogger().debug(\"Rule: dirList: \", $$[$0-1], $$[$0]); this.$ = [$$[$0-1]].concat($$[$0]); \nbreak;\ncase 33:\n yy.getLogger().debug(\"Rule: nodeShapeNLabel: \", $$[$0-2], $$[$0-1], $$[$0]); this.$ = { typeStr: $$[$0-2] + $$[$0], label: $$[$0-1] }; \nbreak;\ncase 34:\n yy.getLogger().debug(\"Rule: BLOCK_ARROW nodeShapeNLabel: \", $$[$0-3], $$[$0-2], \" #3:\",$$[$0-1], $$[$0]); this.$ = { typeStr: $$[$0-3] + $$[$0], label: $$[$0-2], directions: $$[$0-1]}; \nbreak;\ncase 35: case 36:\n\n this.$ = { type: 'classDef', id: $$[$0-1].trim(), css: $$[$0].trim() };\n \nbreak;\ncase 37:\n\n //log.debug('apply class: id(s): ',$$[$0-1], ' style class: ', $$[$0]);\n this.$={ type: 'applyClass', id: $$[$0-1].trim(), styleClass: $$[$0].trim() };\n \nbreak;\ncase 38:\n\n this.$={ type: 'applyStyles', id: $$[$0-1].trim(), stylesStr: $$[$0].trim() };\n \nbreak;\n}\n},\ntable: [{9:1,10:[1,2]},{1:[3]},{10:$V0,11:3,13:4,19:5,20:6,21:$V1,22:8,23:9,24:10,25:11,26:12,28:$V2,29:$V3,31:$V4,39:$V5,43:$V6,46:$V7},{8:[1,20]},o($V8,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,10:$V0,21:$V1,28:$V2,29:$V3,31:$V4,39:$V5,43:$V6,46:$V7}),o($V9,[2,16],{14:22,15:$Va,16:$Vb}),o($V9,[2,17]),o($V9,[2,18]),o($V9,[2,19]),o($V9,[2,20]),o($V9,[2,21]),o($V9,[2,22]),o($Vc,[2,25],{27:[1,25]}),o($V9,[2,26]),{19:26,26:12,31:$V4},{10:$V0,11:27,13:4,19:5,20:6,21:$V1,22:8,23:9,24:10,25:11,26:12,28:$V2,29:$V3,31:$V4,39:$V5,43:$V6,46:$V7},{40:[1,28],42:[1,29]},{44:[1,30]},{47:[1,31]},o($Vd,[2,29],{32:32,35:[1,33],37:[1,34]}),{1:[2,7]},o($V8,[2,13]),{26:35,31:$V4},{31:[2,14]},{17:[1,36]},o($Vc,[2,24]),{10:$V0,11:37,13:4,14:22,15:$Va,16:$Vb,19:5,20:6,21:$V1,22:8,23:9,24:10,25:11,26:12,28:$V2,29:$V3,31:$V4,39:$V5,43:$V6,46:$V7},{30:[1,38]},{41:[1,39]},{41:[1,40]},{45:[1,41]},{48:[1,42]},o($Vd,[2,30]),{18:[1,43]},{18:[1,44]},o($Vc,[2,23]),{18:[1,45]},{30:[1,46]},o($V9,[2,28]),o($V9,[2,35]),o($V9,[2,36]),o($V9,[2,37]),o($V9,[2,38]),{36:[1,47]},{33:48,34:$Ve},{15:[1,50]},o($V9,[2,27]),o($Vd,[2,33]),{38:[1,51]},{33:52,34:$Ve,38:[2,31]},{31:[2,15]},o($Vd,[2,34]),{38:[2,32]}],\ndefaultActions: {20:[2,7],23:[2,14],50:[2,15],52:[2,32]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: yy.getLogger().debug('Found block-beta'); return 10; \nbreak;\ncase 1: yy.getLogger().debug('Found id-block'); return 29; \nbreak;\ncase 2: yy.getLogger().debug('Found block'); return 10; \nbreak;\ncase 3: yy.getLogger().debug('.', yy_.yytext); /* skip all whitespace */ \nbreak;\ncase 4:yy.getLogger().debug('_', yy_.yytext); /* skip all whitespace */ \nbreak;\ncase 5: return 5 \nbreak;\ncase 6: yy_.yytext=-1; return 28; \nbreak;\ncase 7: yy_.yytext = yy_.yytext.replace(/columns\\s+/,''); yy.getLogger().debug('COLUMNS (LEX)', yy_.yytext); return 28; \nbreak;\ncase 8: this.pushState(\"md_string\");\nbreak;\ncase 9: return \"MD_STR\";\nbreak;\ncase 10: this.popState();\nbreak;\ncase 11:this.pushState(\"string\");\nbreak;\ncase 12: yy.getLogger().debug('LEX: POPPING STR:', yy_.yytext);this.popState();\nbreak;\ncase 13: yy.getLogger().debug('LEX: STR end:', yy_.yytext); return \"STR\";\nbreak;\ncase 14: yy_.yytext = yy_.yytext.replace(/space\\:/,'');yy.getLogger().debug('SPACE NUM (LEX)', yy_.yytext); return 21; \nbreak;\ncase 15: yy_.yytext = '1'; yy.getLogger().debug('COLUMNS (LEX)', yy_.yytext); return 21; \nbreak;\ncase 16:return 42;\nbreak;\ncase 17:return 'LINKSTYLE';\nbreak;\ncase 18:return 'INTERPOLATE';\nbreak;\ncase 19: this.pushState('CLASSDEF'); return 39; \nbreak;\ncase 20: this.popState(); this.pushState('CLASSDEFID'); return 'DEFAULT_CLASSDEF_ID' \nbreak;\ncase 21: this.popState(); this.pushState('CLASSDEFID'); return 40 \nbreak;\ncase 22: this.popState(); return 41 \nbreak;\ncase 23: this.pushState('CLASS'); return 43; \nbreak;\ncase 24: this.popState(); this.pushState('CLASS_STYLE'); return 44 \nbreak;\ncase 25: this.popState(); return 45 \nbreak;\ncase 26: this.pushState('STYLE_STMNT'); return 46; \nbreak;\ncase 27: this.popState(); this.pushState('STYLE_DEFINITION'); return 47 \nbreak;\ncase 28: this.popState(); return 48 \nbreak;\ncase 29: this.pushState(\"acc_title\");return 'acc_title'; \nbreak;\ncase 30: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 31: this.pushState(\"acc_descr\");return 'acc_descr'; \nbreak;\ncase 32: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 33: this.pushState(\"acc_descr_multiline\");\nbreak;\ncase 34: this.popState(); \nbreak;\ncase 35:return \"acc_descr_multiline_value\";\nbreak;\ncase 36:return 30;\nbreak;\ncase 37: this.popState();yy.getLogger().debug('Lex: (('); return \"NODE_DEND\"; \nbreak;\ncase 38: this.popState();yy.getLogger().debug('Lex: (('); return \"NODE_DEND\"; \nbreak;\ncase 39: this.popState();yy.getLogger().debug('Lex: ))'); return \"NODE_DEND\"; \nbreak;\ncase 40: this.popState();yy.getLogger().debug('Lex: (('); return \"NODE_DEND\"; \nbreak;\ncase 41: this.popState();yy.getLogger().debug('Lex: (('); return \"NODE_DEND\"; \nbreak;\ncase 42: this.popState();yy.getLogger().debug('Lex: (-'); return \"NODE_DEND\"; \nbreak;\ncase 43: this.popState();yy.getLogger().debug('Lex: -)'); return \"NODE_DEND\"; \nbreak;\ncase 44: this.popState();yy.getLogger().debug('Lex: (('); return \"NODE_DEND\"; \nbreak;\ncase 45: this.popState();yy.getLogger().debug('Lex: ]]'); return \"NODE_DEND\"; \nbreak;\ncase 46: this.popState();yy.getLogger().debug('Lex: ('); return \"NODE_DEND\"; \nbreak;\ncase 47: this.popState();yy.getLogger().debug('Lex: ])'); return \"NODE_DEND\"; \nbreak;\ncase 48: this.popState();yy.getLogger().debug('Lex: /]'); return \"NODE_DEND\"; \nbreak;\ncase 49: this.popState();yy.getLogger().debug('Lex: /]'); return \"NODE_DEND\"; \nbreak;\ncase 50: this.popState();yy.getLogger().debug('Lex: )]'); return \"NODE_DEND\"; \nbreak;\ncase 51: this.popState();yy.getLogger().debug('Lex: )'); return \"NODE_DEND\"; \nbreak;\ncase 52: this.popState();yy.getLogger().debug('Lex: ]>'); return \"NODE_DEND\"; \nbreak;\ncase 53: this.popState();yy.getLogger().debug('Lex: ]'); return \"NODE_DEND\"; \nbreak;\ncase 54: yy.getLogger().debug('Lexa: -)'); this.pushState('NODE');return 35; \nbreak;\ncase 55: yy.getLogger().debug('Lexa: (-'); this.pushState('NODE');return 35; \nbreak;\ncase 56: yy.getLogger().debug('Lexa: ))'); this.pushState('NODE');return 35; \nbreak;\ncase 57: yy.getLogger().debug('Lexa: )'); this.pushState('NODE');return 35; \nbreak;\ncase 58: yy.getLogger().debug('Lex: ((('); this.pushState('NODE');return 35; \nbreak;\ncase 59: yy.getLogger().debug('Lexa: )'); this.pushState('NODE');return 35; \nbreak;\ncase 60: yy.getLogger().debug('Lexa: )'); this.pushState('NODE');return 35; \nbreak;\ncase 61: yy.getLogger().debug('Lexa: )'); this.pushState('NODE');return 35; \nbreak;\ncase 62: yy.getLogger().debug('Lexc: >'); this.pushState('NODE');return 35; \nbreak;\ncase 63: yy.getLogger().debug('Lexa: (['); this.pushState('NODE');return 35; \nbreak;\ncase 64: yy.getLogger().debug('Lexa: )'); this.pushState('NODE');return 35; \nbreak;\ncase 65: this.pushState('NODE');return 35; \nbreak;\ncase 66: this.pushState('NODE');return 35; \nbreak;\ncase 67: this.pushState('NODE');return 35; \nbreak;\ncase 68: this.pushState('NODE');return 35; \nbreak;\ncase 69: this.pushState('NODE');return 35; \nbreak;\ncase 70: this.pushState('NODE');return 35; \nbreak;\ncase 71: this.pushState('NODE');return 35; \nbreak;\ncase 72: yy.getLogger().debug('Lexa: ['); this.pushState('NODE');return 35; \nbreak;\ncase 73: this.pushState('BLOCK_ARROW');yy.getLogger().debug('LEX ARR START');return 37; \nbreak;\ncase 74: yy.getLogger().debug('Lex: NODE_ID', yy_.yytext);return 31; \nbreak;\ncase 75: yy.getLogger().debug('Lex: EOF', yy_.yytext);return 8; \nbreak;\ncase 76: this.pushState(\"md_string\");\nbreak;\ncase 77: this.pushState(\"md_string\");\nbreak;\ncase 78: return \"NODE_DESCR\";\nbreak;\ncase 79: this.popState();\nbreak;\ncase 80: yy.getLogger().debug('Lex: Starting string');this.pushState(\"string\");\nbreak;\ncase 81: yy.getLogger().debug('LEX ARR: Starting string');this.pushState(\"string\");\nbreak;\ncase 82: yy.getLogger().debug('LEX: NODE_DESCR:', yy_.yytext); return \"NODE_DESCR\";\nbreak;\ncase 83:yy.getLogger().debug('LEX POPPING');this.popState();\nbreak;\ncase 84: yy.getLogger().debug('Lex: =>BAE'); this.pushState('ARROW_DIR'); \nbreak;\ncase 85: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (right): dir:',yy_.yytext);return \"DIR\"; \nbreak;\ncase 86: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (left):',yy_.yytext);return \"DIR\"; \nbreak;\ncase 87: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (x):',yy_.yytext); return \"DIR\"; \nbreak;\ncase 88: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (y):',yy_.yytext); return \"DIR\"; \nbreak;\ncase 89: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (up):',yy_.yytext); return \"DIR\"; \nbreak;\ncase 90: yy_.yytext = yy_.yytext.replace(/^,\\s*/, ''); yy.getLogger().debug('Lex (down):',yy_.yytext); return \"DIR\"; \nbreak;\ncase 91: yy_.yytext=']>';yy.getLogger().debug('Lex (ARROW_DIR end):',yy_.yytext);this.popState();this.popState();return \"BLOCK_ARROW_END\"; \nbreak;\ncase 92: yy.getLogger().debug('Lex: LINK', '#'+yy_.yytext+'#'); return 15; \nbreak;\ncase 93: yy.getLogger().debug('Lex: LINK', yy_.yytext); return 15; \nbreak;\ncase 94: yy.getLogger().debug('Lex: LINK', yy_.yytext); return 15; \nbreak;\ncase 95: yy.getLogger().debug('Lex: LINK', yy_.yytext); return 15; \nbreak;\ncase 96: yy.getLogger().debug('Lex: START_LINK', yy_.yytext);this.pushState(\"LLABEL\");return 16; \nbreak;\ncase 97: yy.getLogger().debug('Lex: START_LINK', yy_.yytext);this.pushState(\"LLABEL\");return 16; \nbreak;\ncase 98: yy.getLogger().debug('Lex: START_LINK', yy_.yytext);this.pushState(\"LLABEL\");return 16; \nbreak;\ncase 99: this.pushState(\"md_string\");\nbreak;\ncase 100: yy.getLogger().debug('Lex: Starting string');this.pushState(\"string\"); return \"LINK_LABEL\";\nbreak;\ncase 101: this.popState(); yy.getLogger().debug('Lex: LINK', '#'+yy_.yytext+'#'); return 15; \nbreak;\ncase 102: this.popState(); yy.getLogger().debug('Lex: LINK', yy_.yytext); return 15; \nbreak;\ncase 103: this.popState(); yy.getLogger().debug('Lex: LINK', yy_.yytext); return 15; \nbreak;\ncase 104: yy.getLogger().debug('Lex: COLON', yy_.yytext); yy_.yytext=yy_.yytext.slice(1);return 27; \nbreak;\n}\n},\nrules: [/^(?:block-beta\\b)/,/^(?:block:)/,/^(?:block\\b)/,/^(?:[\\s]+)/,/^(?:[\\n]+)/,/^(?:((\\u000D\\u000A)|(\\u000A)))/,/^(?:columns\\s+auto\\b)/,/^(?:columns\\s+[\\d]+)/,/^(?:[\"][`])/,/^(?:[^`\"]+)/,/^(?:[`][\"])/,/^(?:[\"])/,/^(?:[\"])/,/^(?:[^\"]*)/,/^(?:space[:]\\d+)/,/^(?:space\\b)/,/^(?:default\\b)/,/^(?:linkStyle\\b)/,/^(?:interpolate\\b)/,/^(?:classDef\\s+)/,/^(?:DEFAULT\\s+)/,/^(?:\\w+\\s+)/,/^(?:[^\\n]*)/,/^(?:class\\s+)/,/^(?:(\\w+)+((,\\s*\\w+)*))/,/^(?:[^\\n]*)/,/^(?:style\\s+)/,/^(?:(\\w+)+((,\\s*\\w+)*))/,/^(?:[^\\n]*)/,/^(?:accTitle\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*\\{\\s*)/,/^(?:[\\}])/,/^(?:[^\\}]*)/,/^(?:end\\b\\s*)/,/^(?:\\(\\(\\()/,/^(?:\\)\\)\\))/,/^(?:[\\)]\\))/,/^(?:\\}\\})/,/^(?:\\})/,/^(?:\\(-)/,/^(?:-\\))/,/^(?:\\(\\()/,/^(?:\\]\\])/,/^(?:\\()/,/^(?:\\]\\))/,/^(?:\\\\\\])/,/^(?:\\/\\])/,/^(?:\\)\\])/,/^(?:[\\)])/,/^(?:\\]>)/,/^(?:[\\]])/,/^(?:-\\))/,/^(?:\\(-)/,/^(?:\\)\\))/,/^(?:\\))/,/^(?:\\(\\(\\()/,/^(?:\\(\\()/,/^(?:\\{\\{)/,/^(?:\\{)/,/^(?:>)/,/^(?:\\(\\[)/,/^(?:\\()/,/^(?:\\[\\[)/,/^(?:\\[\\|)/,/^(?:\\[\\()/,/^(?:\\)\\)\\))/,/^(?:\\[\\\\)/,/^(?:\\[\\/)/,/^(?:\\[\\\\)/,/^(?:\\[)/,/^(?:<\\[)/,/^(?:[^\\(\\[\\n\\-\\)\\{\\}\\s\\<\\>:]+)/,/^(?:$)/,/^(?:[\"][`])/,/^(?:[\"][`])/,/^(?:[^`\"]+)/,/^(?:[`][\"])/,/^(?:[\"])/,/^(?:[\"])/,/^(?:[^\"]+)/,/^(?:[\"])/,/^(?:\\]>\\s*\\()/,/^(?:,?\\s*right\\s*)/,/^(?:,?\\s*left\\s*)/,/^(?:,?\\s*x\\s*)/,/^(?:,?\\s*y\\s*)/,/^(?:,?\\s*up\\s*)/,/^(?:,?\\s*down\\s*)/,/^(?:\\)\\s*)/,/^(?:\\s*[xo<]?--+[-xo>]\\s*)/,/^(?:\\s*[xo<]?==+[=xo>]\\s*)/,/^(?:\\s*[xo<]?-?\\.+-[xo>]?\\s*)/,/^(?:\\s*~~[\\~]+\\s*)/,/^(?:\\s*[xo<]?--\\s*)/,/^(?:\\s*[xo<]?==\\s*)/,/^(?:\\s*[xo<]?-\\.\\s*)/,/^(?:[\"][`])/,/^(?:[\"])/,/^(?:\\s*[xo<]?--+[-xo>]\\s*)/,/^(?:\\s*[xo<]?==+[=xo>]\\s*)/,/^(?:\\s*[xo<]?-?\\.+-[xo>]?\\s*)/,/^(?::\\d+)/],\nconditions: {\"STYLE_DEFINITION\":{\"rules\":[28],\"inclusive\":false},\"STYLE_STMNT\":{\"rules\":[27],\"inclusive\":false},\"CLASSDEFID\":{\"rules\":[22],\"inclusive\":false},\"CLASSDEF\":{\"rules\":[20,21],\"inclusive\":false},\"CLASS_STYLE\":{\"rules\":[25],\"inclusive\":false},\"CLASS\":{\"rules\":[24],\"inclusive\":false},\"LLABEL\":{\"rules\":[99,100,101,102,103],\"inclusive\":false},\"ARROW_DIR\":{\"rules\":[85,86,87,88,89,90,91],\"inclusive\":false},\"BLOCK_ARROW\":{\"rules\":[76,81,84],\"inclusive\":false},\"NODE\":{\"rules\":[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,77,80],\"inclusive\":false},\"md_string\":{\"rules\":[9,10,78,79],\"inclusive\":false},\"space\":{\"rules\":[],\"inclusive\":false},\"string\":{\"rules\":[12,13,82,83],\"inclusive\":false},\"acc_descr_multiline\":{\"rules\":[34,35],\"inclusive\":false},\"acc_descr\":{\"rules\":[32],\"inclusive\":false},\"acc_title\":{\"rules\":[30],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,11,14,15,16,17,18,19,23,26,29,31,33,36,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,92,93,94,95,96,97,98,104],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import clone from 'lodash-es/clone.js';\nimport * as configApi from '../../config.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport type { DiagramDB } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport common from '../common/common.js';\nimport { clear as commonClear } from '../common/commonDb.js';\nimport type { Block, ClassDef } from './blockTypes.js';\n\n// Initialize the node database for simple lookups\nlet blockDatabase = new Map();\nlet edgeList: Block[] = [];\nlet edgeCount = new Map();\n\nconst COLOR_KEYWORD = 'color';\nconst FILL_KEYWORD = 'fill';\nconst BG_FILL = 'bgFill';\nconst STYLECLASS_SEP = ',';\nconst config = getConfig();\n\nlet classes = new Map();\n\nconst sanitizeText = (txt: string) => common.sanitizeText(txt, config);\n\n/**\n * Called when the parser comes across a (style) class definition\n * @example classDef my-style fill:#f96;\n *\n * @param id - the id of this (style) class\n * @param styleAttributes - the string with 1 or more style attributes (each separated by a comma)\n */\nexport const addStyleClass = function (id: string, styleAttributes = '') {\n // create a new style class object with this id\n let foundClass = classes.get(id);\n if (!foundClass) {\n foundClass = { id: id, styles: [], textStyles: [] };\n classes.set(id, foundClass); // This is a classDef\n }\n if (styleAttributes !== undefined && styleAttributes !== null) {\n styleAttributes.split(STYLECLASS_SEP).forEach((attrib) => {\n // remove any trailing ;\n const fixedAttrib = attrib.replace(/([^;]*);/, '$1').trim();\n\n // replace some style keywords\n if (RegExp(COLOR_KEYWORD).exec(attrib)) {\n const newStyle1 = fixedAttrib.replace(FILL_KEYWORD, BG_FILL);\n const newStyle2 = newStyle1.replace(COLOR_KEYWORD, FILL_KEYWORD);\n foundClass.textStyles.push(newStyle2);\n }\n foundClass.styles.push(fixedAttrib);\n });\n }\n};\n\n/**\n * Called when the parser comes across a style definition\n * @example style my-block-id fill:#f96;\n *\n * @param id - the id of the block to style\n * @param styles - the string with 1 or more style attributes (each separated by a comma)\n */\nexport const addStyle2Node = function (id: string, styles = '') {\n const foundBlock = blockDatabase.get(id)!;\n if (styles !== undefined && styles !== null) {\n foundBlock.styles = styles.split(STYLECLASS_SEP);\n }\n};\n\n/**\n * Add a CSS/style class to the block with the given id.\n * If the block isn't already in the list of known blocks, add it.\n * Might be called by parser when a CSS/style class should be applied to a block\n *\n * @param itemIds - The id or a list of ids of the item(s) to apply the css class to\n * @param cssClassName - CSS class name\n */\nexport const setCssClass = function (itemIds: string, cssClassName: string) {\n itemIds.split(',').forEach(function (id: string) {\n let foundBlock = blockDatabase.get(id);\n if (foundBlock === undefined) {\n const trimmedId = id.trim();\n foundBlock = { id: trimmedId, type: 'na', children: [] } as Block;\n blockDatabase.set(trimmedId, foundBlock);\n }\n if (!foundBlock.classes) {\n foundBlock.classes = [];\n }\n foundBlock.classes.push(cssClassName);\n });\n};\n\nconst populateBlockDatabase = (_blockList: Block[], parent: Block): void => {\n const blockList = _blockList.flat();\n const children = [];\n const columnSettingBlock = blockList.find((b) => b?.type === 'column-setting');\n const column = columnSettingBlock?.columns ?? -1;\n for (const block of blockList) {\n if (\n typeof column === 'number' &&\n column > 0 &&\n block.type !== 'column-setting' &&\n typeof block.widthInColumns === 'number' &&\n block.widthInColumns > column\n ) {\n log.warn(\n `Block ${block.id} width ${block.widthInColumns} exceeds configured column width ${column}`\n );\n }\n if (block.label) {\n block.label = sanitizeText(block.label);\n }\n if (block.type === 'classDef') {\n addStyleClass(block.id, block.css);\n continue;\n }\n if (block.type === 'applyClass') {\n setCssClass(block.id, block?.styleClass ?? '');\n continue;\n }\n if (block.type === 'applyStyles') {\n if (block?.stylesStr) {\n addStyle2Node(block.id, block?.stylesStr);\n }\n continue;\n }\n if (block.type === 'column-setting') {\n parent.columns = block.columns ?? -1;\n } else if (block.type === 'edge') {\n const count = (edgeCount.get(block.id) ?? 0) + 1;\n edgeCount.set(block.id, count);\n block.id = count + '-' + block.id;\n edgeList.push(block);\n } else {\n if (!block.label) {\n if (block.type === 'composite') {\n block.label = '';\n // log.debug('abc89 composite', block);\n } else {\n block.label = block.id;\n }\n }\n const existingBlock = blockDatabase.get(block.id);\n\n if (existingBlock === undefined) {\n blockDatabase.set(block.id, block);\n } else {\n // Add newer relevant data to aggregated node\n if (block.type !== 'na') {\n existingBlock.type = block.type;\n }\n if (block.label !== block.id) {\n existingBlock.label = block.label;\n }\n }\n\n if (block.children) {\n populateBlockDatabase(block.children, block);\n }\n if (block.type === 'space') {\n // log.debug('abc95 space', block);\n const w = block.width ?? 1;\n for (let j = 0; j < w; j++) {\n const newBlock = clone(block);\n newBlock.id = newBlock.id + '-' + j;\n blockDatabase.set(newBlock.id, newBlock);\n children.push(newBlock);\n }\n } else if (existingBlock === undefined) {\n children.push(block);\n }\n }\n }\n parent.children = children;\n};\n\nlet blocks: Block[] = [];\nlet rootBlock = { id: 'root', type: 'composite', children: [], columns: -1 } as Block;\n\nconst clear = (): void => {\n log.debug('Clear called');\n commonClear();\n rootBlock = { id: 'root', type: 'composite', children: [], columns: -1 } as Block;\n blockDatabase = new Map([['root', rootBlock]]);\n blocks = [];\n classes = new Map();\n\n edgeList = [];\n edgeCount = new Map();\n};\n\nexport function typeStr2Type(typeStr: string) {\n log.debug('typeStr2Type', typeStr);\n switch (typeStr) {\n case '[]':\n return 'square';\n case '()':\n log.debug('we have a round');\n return 'round';\n case '(())':\n return 'circle';\n case '>]':\n return 'rect_left_inv_arrow';\n case '{}':\n return 'diamond';\n case '{{}}':\n return 'hexagon';\n case '([])':\n return 'stadium';\n case '[[]]':\n return 'subroutine';\n case '[()]':\n return 'cylinder';\n case '((()))':\n return 'doublecircle';\n case '[//]':\n return 'lean_right';\n case '[\\\\\\\\]':\n return 'lean_left';\n case '[/\\\\]':\n return 'trapezoid';\n case '[\\\\/]':\n return 'inv_trapezoid';\n case '<[]>':\n return 'block_arrow';\n default:\n return 'na';\n }\n}\n\nexport function edgeTypeStr2Type(typeStr: string): string {\n log.debug('typeStr2Type', typeStr);\n switch (typeStr) {\n case '==':\n return 'thick';\n default:\n return 'normal';\n }\n}\n\nexport function edgeStrToEdgeData(typeStr: string): string {\n switch (typeStr.replace(/^[\\s-]+|[\\s-]+$/g, '')) {\n case 'x':\n return 'arrow_cross';\n case 'o':\n return 'arrow_circle';\n case '>':\n return 'arrow_point';\n default:\n return '';\n }\n}\n\nlet cnt = 0;\nexport const generateId = () => {\n cnt++;\n return 'id-' + Math.random().toString(36).substr(2, 12) + '-' + cnt;\n};\n\nconst setHierarchy = (block: Block[]): void => {\n rootBlock.children = block;\n populateBlockDatabase(block, rootBlock);\n blocks = rootBlock.children;\n};\n\nconst getColumns = (blockId: string): number => {\n const block = blockDatabase.get(blockId);\n if (!block) {\n return -1;\n }\n if (block.columns) {\n return block.columns;\n }\n if (!block.children) {\n return -1;\n }\n return block.children.length;\n};\n\n/**\n * Returns all the blocks as a flat array\n * @returns\n */\nconst getBlocksFlat = () => {\n return [...blockDatabase.values()];\n};\n/**\n * Returns the hierarchy of blocks\n * @returns\n */\nconst getBlocks = () => {\n return blocks || [];\n};\n\nconst getEdges = () => {\n return edgeList;\n};\nconst getBlock = (id: string) => {\n return blockDatabase.get(id);\n};\n\nconst setBlock = (block: Block) => {\n blockDatabase.set(block.id, block);\n};\n\nconst getLogger = () => log;\n\n/**\n * Return all of the style classes\n */\nexport const getClasses = function () {\n return classes;\n};\n\nconst db = {\n getConfig: () => configApi.getConfig().block,\n typeStr2Type: typeStr2Type,\n edgeTypeStr2Type: edgeTypeStr2Type,\n edgeStrToEdgeData,\n getLogger,\n getBlocksFlat,\n getBlocks,\n getEdges,\n setHierarchy,\n getBlock,\n setBlock,\n getColumns,\n getClasses,\n clear,\n generateId,\n} as const;\n\nexport type BlockDB = typeof db & DiagramDB;\nexport default db;\n", "import * as khroma from 'khroma';\nimport { getIconStyles } from '../globalStyles.js';\n\n/** Returns the styles given options */\nexport interface BlockChartStyleOptions {\n arrowheadColor: string;\n border2: string;\n clusterBkg: string;\n clusterBorder: string;\n edgeLabelBackground: string;\n fontFamily: string;\n lineColor: string;\n mainBkg: string;\n nodeBorder: string;\n nodeTextColor: string;\n tertiaryColor: string;\n textColor: string;\n titleColor: string;\n}\n\nconst fade = (color: string, opacity: number) => {\n // @ts-ignore TODO: incorrect types from khroma\n const channel = khroma.channel;\n\n const r = channel(color, 'r');\n const g = channel(color, 'g');\n const b = channel(color, 'b');\n\n // @ts-ignore incorrect types from khroma\n return khroma.rgba(r, g, b, opacity);\n};\n\nconst getStyles = (options: BlockChartStyleOptions) =>\n `.label {\n font-family: ${options.fontFamily};\n color: ${options.nodeTextColor || options.textColor};\n }\n .cluster-label text {\n fill: ${options.titleColor};\n }\n .cluster-label span,p {\n color: ${options.titleColor};\n }\n\n\n\n .label text,span,p {\n fill: ${options.nodeTextColor || options.textColor};\n color: ${options.nodeTextColor || options.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n }\n .flowchart-label text {\n text-anchor: middle;\n }\n // .flowchart-label .text-outer-tspan {\n // text-anchor: middle;\n // }\n // .flowchart-label .text-inner-tspan {\n // text-anchor: start;\n // }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${options.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${options.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${options.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${options.edgeLabelBackground};\n rect {\n opacity: 0.5;\n background-color: ${options.edgeLabelBackground};\n fill: ${options.edgeLabelBackground};\n }\n text-align: center;\n }\n\n /* For html labels only */\n .labelBkg {\n background-color: ${fade(options.edgeLabelBackground, 0.5)};\n // background-color:\n }\n\n .node .cluster {\n // fill: ${fade(options.mainBkg, 0.5)};\n fill: ${fade(options.clusterBkg, 0.5)};\n stroke: ${fade(options.clusterBorder, 0.2)};\n box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px;\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${options.titleColor};\n }\n\n .cluster span,p {\n color: ${options.titleColor};\n }\n /* .cluster div {\n color: ${options.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${options.fontFamily};\n font-size: 12px;\n background: ${options.tertiaryColor};\n border: 1px solid ${options.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .flowchartTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${options.textColor};\n }\n ${getIconStyles()}\n`;\n\nexport default getStyles;\n", "/** Setup arrow head and define the marker. The result is appended to the svg. */\n\nimport { log } from '../logger.js';\n\n// Only add the number of markers that the diagram needs\nconst insertMarkers = (elem, markerArray, type, id) => {\n markerArray.forEach((markerName) => {\n markers[markerName](elem, type, id);\n });\n};\n\nconst extension = (elem, type, id) => {\n log.trace('Making markers for ', id);\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-extensionStart')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,7 L18,13 V 1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-extensionEnd')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead\n};\n\nconst composition = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-compositionStart')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-compositionEnd')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst aggregation = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-aggregationStart')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-aggregationEnd')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst dependency = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-dependencyStart')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 6)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-dependencyEnd')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 13)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\nconst lollipop = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-lollipopStart')\n .attr('class', 'marker lollipop ' + type)\n .attr('refX', 13)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('circle')\n .attr('stroke', 'black')\n .attr('fill', 'transparent')\n .attr('cx', 7)\n .attr('cy', 7)\n .attr('r', 6);\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-lollipopEnd')\n .attr('class', 'marker lollipop ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('circle')\n .attr('stroke', 'black')\n .attr('fill', 'transparent')\n .attr('cx', 7)\n .attr('cy', 7)\n .attr('r', 6);\n};\nconst point = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-pointEnd')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 6)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 0 L 10 5 L 0 10 z')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-pointStart')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 4.5)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 5 L 10 10 L 10 0 z')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n};\nconst circle = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-circleEnd')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 11)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-circleStart')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', -1)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n};\nconst cross = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-crossEnd')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 11 11')\n .attr('refX', 12)\n .attr('refY', 5.2)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('path')\n // .attr('stroke', 'black')\n .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '1,0');\n\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-crossStart')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 11 11')\n .attr('refX', -1)\n .attr('refY', 5.2)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('path')\n // .attr('stroke', 'black')\n .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '1,0');\n};\nconst barb = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-barbEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 14)\n .attr('markerUnits', 'strokeWidth')\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');\n};\n\n// TODO rename the class diagram markers to something shape descriptive and semantic free\nconst markers = {\n extension,\n composition,\n aggregation,\n dependency,\n lollipop,\n point,\n circle,\n cross,\n barb,\n};\nexport default insertMarkers;\n", "import type { BlockDB } from './blockDB.js';\nimport type { Block } from './blockTypes.js';\nimport { log } from '../../logger.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\n// TODO: This means the number we provide in diagram's config will never be used. Should fix.\nconst padding = getConfig()?.block?.padding ?? 8;\n\ninterface BlockPosition {\n px: number;\n py: number;\n}\n\nexport function calculateBlockPosition(columns: number, position: number): BlockPosition {\n // log.debug('calculateBlockPosition abc89', columns, position);\n // Ensure that columns is a positive integer\n if (columns === 0 || !Number.isInteger(columns)) {\n throw new Error('Columns must be an integer !== 0.');\n }\n\n // Ensure that position is a non-negative integer\n if (position < 0 || !Number.isInteger(position)) {\n throw new Error('Position must be a non-negative integer.' + position);\n }\n\n if (columns < 0) {\n // Auto columns is set\n return { px: position, py: 0 };\n }\n if (columns === 1) {\n // Auto columns is set\n return { px: 0, py: position };\n }\n // Calculate posX and posY\n const px = position % columns;\n const py = Math.floor(position / columns);\n // log.debug('calculateBlockPosition abc89', columns, position, '=> (', px, py, ')');\n return { px, py };\n}\n\nconst getMaxChildSize = (block: Block) => {\n let maxWidth = 0;\n let maxHeight = 0;\n // find max width of children\n // log.debug('getMaxChildSize abc95 (start) parent:', block.id);\n for (const child of block.children) {\n const { width, height, x, y } = child.size ?? { width: 0, height: 0, x: 0, y: 0 };\n log.debug(\n 'getMaxChildSize abc95 child:',\n child.id,\n 'width:',\n width,\n 'height:',\n height,\n 'x:',\n x,\n 'y:',\n y,\n child.type\n );\n if (child.type === 'space') {\n continue;\n }\n if (width > maxWidth) {\n maxWidth = width / (block.widthInColumns ?? 1);\n }\n if (height > maxHeight) {\n maxHeight = height;\n }\n }\n return { width: maxWidth, height: maxHeight };\n};\n\nfunction setBlockSizes(block: Block, db: BlockDB, siblingWidth = 0, siblingHeight = 0) {\n log.debug(\n 'setBlockSizes abc95 (start)',\n block.id,\n block?.size?.x,\n 'block width =',\n block?.size,\n 'siblingWidth',\n siblingWidth\n );\n if (!block?.size?.width) {\n block.size = {\n width: siblingWidth,\n height: siblingHeight,\n x: 0,\n y: 0,\n };\n }\n let maxWidth = 0;\n let maxHeight = 0;\n\n if (block.children?.length > 0) {\n for (const child of block.children) {\n setBlockSizes(child, db);\n }\n // find max width of children\n const childSize = getMaxChildSize(block);\n maxWidth = childSize.width;\n maxHeight = childSize.height;\n log.debug('setBlockSizes abc95 maxWidth of', block.id, ':s children is ', maxWidth, maxHeight);\n\n // set width of block to max width of children\n for (const child of block.children) {\n if (child.size) {\n log.debug(\n `abc95 Setting size of children of ${block.id} id=${child.id} ${maxWidth} ${maxHeight} ${JSON.stringify(child.size)}`\n );\n child.size.width =\n maxWidth * (child.widthInColumns ?? 1) + padding * ((child.widthInColumns ?? 1) - 1);\n child.size.height = maxHeight;\n child.size.x = 0;\n child.size.y = 0;\n\n log.debug(\n `abc95 updating size of ${block.id} children child:${child.id} maxWidth:${maxWidth} maxHeight:${maxHeight}`\n );\n }\n }\n for (const child of block.children) {\n setBlockSizes(child, db, maxWidth, maxHeight);\n }\n\n const columns = block.columns ?? -1;\n let numItems = 0;\n for (const child of block.children) {\n numItems += child.widthInColumns ?? 1;\n }\n\n // The width and height in number blocks\n let xSize = block.children.length;\n if (columns > 0 && columns < numItems) {\n xSize = columns;\n }\n\n const ySize = Math.ceil(numItems / xSize);\n\n let width = xSize * (maxWidth + padding) + padding;\n let height = ySize * (maxHeight + padding) + padding;\n // If maxWidth\n if (width < siblingWidth) {\n log.debug(\n `Detected to small sibling: abc95 ${block.id} siblingWidth ${siblingWidth} siblingHeight ${siblingHeight} width ${width}`\n );\n width = siblingWidth;\n height = siblingHeight;\n const childWidth = (siblingWidth - xSize * padding - padding) / xSize;\n const childHeight = (siblingHeight - ySize * padding - padding) / ySize;\n // cspell:ignore indata\n log.debug('Size indata abc88', block.id, 'childWidth', childWidth, 'maxWidth', maxWidth);\n log.debug('Size indata abc88', block.id, 'childHeight', childHeight, 'maxHeight', maxHeight);\n log.debug('Size indata abc88 xSize', xSize, 'padding', padding);\n\n // set width of block to max width of children\n for (const child of block.children) {\n if (child.size) {\n child.size.width = childWidth;\n child.size.height = childHeight;\n child.size.x = 0;\n child.size.y = 0;\n }\n }\n }\n\n log.debug(\n `abc95 (finale calc) ${block.id} xSize ${xSize} ySize ${ySize} columns ${columns}${\n block.children.length\n } width=${Math.max(width, block.size?.width || 0)}`\n );\n if (width < (block?.size?.width || 0)) {\n width = block?.size?.width || 0;\n\n // Grow children to fit\n const num = columns > 0 ? Math.min(block.children.length, columns) : block.children.length;\n if (num > 0) {\n const childWidth = (width - num * padding - padding) / num;\n log.debug('abc95 (growing to fit) width', block.id, width, block.size?.width, childWidth);\n for (const child of block.children) {\n if (child.size) {\n child.size.width = childWidth;\n }\n }\n }\n }\n block.size = {\n width,\n height,\n x: 0,\n y: 0,\n };\n }\n\n log.debug(\n 'setBlockSizes abc94 (done)',\n block.id,\n block?.size?.x,\n block?.size?.width,\n block?.size?.y,\n block?.size?.height\n );\n}\n\nfunction layoutBlocks(block: Block, db: BlockDB) {\n log.debug(\n `abc85 layout blocks (=>layoutBlocks) ${block.id} x: ${block?.size?.x} y: ${block?.size?.y} width: ${block?.size?.width}`\n );\n const columns = block.columns ?? -1;\n log.debug('layoutBlocks columns abc95', block.id, '=>', columns, block);\n if (\n block.children && // find max width of children\n block.children.length > 0\n ) {\n const width = block?.children[0]?.size?.width ?? 0;\n const widthOfChildren = block.children.length * width + (block.children.length - 1) * padding;\n\n log.debug('widthOfChildren 88', widthOfChildren, 'posX');\n\n // let first = true;\n let columnPos = 0;\n log.debug('abc91 block?.size?.x', block.id, block?.size?.x);\n let startingPosX = block?.size?.x ? block?.size?.x + (-block?.size?.width / 2 || 0) : -padding;\n let rowPos = 0;\n for (const child of block.children) {\n const parent = block;\n\n if (!child.size) {\n continue;\n }\n const { width, height } = child.size;\n const { px, py } = calculateBlockPosition(columns, columnPos);\n if (py != rowPos) {\n rowPos = py;\n startingPosX = block?.size?.x ? block?.size?.x + (-block?.size?.width / 2 || 0) : -padding;\n log.debug('New row in layout for block', block.id, ' and child ', child.id, rowPos);\n }\n log.debug(\n `abc89 layout blocks (child) id: ${child.id} Pos: ${columnPos} (px, py) ${px},${py} (${parent?.size?.x},${parent?.size?.y}) parent: ${parent.id} width: ${width}${padding}`\n );\n if (parent.size) {\n const halfWidth = width / 2;\n child.size.x = startingPosX + padding + halfWidth;\n\n // cspell:ignore pyid\n log.debug(\n `abc91 layout blocks (calc) px, pyid:${\n child.id\n } startingPos=X${startingPosX} new startingPosX${\n child.size.x\n } ${halfWidth} padding=${padding} width=${width} halfWidth=${halfWidth} => x:${\n child.size.x\n } y:${child.size.y} ${child.widthInColumns} (width * (child?.w || 1)) / 2 ${\n (width * (child?.widthInColumns ?? 1)) / 2\n }`\n );\n\n startingPosX = child.size.x + halfWidth;\n\n child.size.y =\n parent.size.y - parent.size.height / 2 + py * (height + padding) + height / 2 + padding;\n\n log.debug(\n `abc88 layout blocks (calc) px, pyid:${\n child.id\n }startingPosX${startingPosX}${padding}${halfWidth}=>x:${child.size.x}y:${child.size.y}${\n child.widthInColumns\n }(width * (child?.w || 1)) / 2${(width * (child?.widthInColumns ?? 1)) / 2}`\n );\n }\n if (child.children) {\n layoutBlocks(child, db);\n }\n let columnsFilled = child?.widthInColumns ?? 1;\n if (columns > 0) {\n // Make sure overflowing lines do not affect later lines\n columnsFilled = Math.min(columnsFilled, columns - (columnPos % columns));\n }\n columnPos += columnsFilled;\n log.debug('abc88 columnsPos', child, columnPos);\n }\n }\n log.debug(\n `layout blocks (<==layoutBlocks) ${block.id} x: ${block?.size?.x} y: ${block?.size?.y} width: ${block?.size?.width}`\n );\n}\n\nfunction findBounds(\n block: Block,\n { minX, minY, maxX, maxY } = { minX: 0, minY: 0, maxX: 0, maxY: 0 }\n) {\n if (block.size && block.id !== 'root') {\n const { x, y, width, height } = block.size;\n if (x - width / 2 < minX) {\n minX = x - width / 2;\n }\n if (y - height / 2 < minY) {\n minY = y - height / 2;\n }\n if (x + width / 2 > maxX) {\n maxX = x + width / 2;\n }\n if (y + height / 2 > maxY) {\n maxY = y + height / 2;\n }\n }\n if (block.children) {\n for (const child of block.children) {\n ({ minX, minY, maxX, maxY } = findBounds(child, { minX, minY, maxX, maxY }));\n }\n }\n return { minX, minY, maxX, maxY };\n}\n\nexport function layout(db: BlockDB) {\n const root = db.getBlock('root');\n if (!root) {\n return;\n }\n\n setBlockSizes(root, db, 0, 0);\n layoutBlocks(root, db);\n // Position blocks relative to parents\n // positionBlock(root, root, db);\n log.debug('getBlocks', JSON.stringify(root, null, 2));\n\n const { minX, minY, maxX, maxY } = findBounds(root);\n\n const height = maxY - minY;\n const width = maxX - minX;\n return { x: minX, y: minY, width, height };\n}\n", "import { select } from 'd3';\nimport { getConfig } from '../diagram-api/diagramAPI.js';\nimport { evaluate, sanitizeText } from '../diagrams/common/common.js';\nimport { log } from '../logger.js';\nimport { replaceIconSubstring } from '../rendering-util/createText.js';\nimport { decodeEntities } from '../utils.js';\n\n/**\n * @param dom\n * @param styleFn\n */\nfunction applyStyle(dom, styleFn) {\n if (styleFn) {\n dom.attr('style', styleFn);\n }\n}\n\n/**\n * @param {any} node\n * @returns {SVGForeignObjectElement} Node\n */\nfunction addHtmlLabel(node, config) {\n const fo = select(document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject'));\n const div = fo.append('xhtml:div');\n\n const label = node.label;\n const labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel';\n const span = div.append('span');\n span.html(sanitizeText(label, config));\n applyStyle(span, node.labelStyle);\n span.attr('class', labelClass);\n\n applyStyle(div, node.labelStyle);\n div.style('display', 'inline-block');\n // Fix for firefox\n div.style('white-space', 'nowrap');\n div.attr('xmlns', 'http://www.w3.org/1999/xhtml');\n return fo.node();\n}\n/**\n * @param _vertexText\n * @param style\n * @param isTitle\n * @param isNode\n * @deprecated svg-util/createText instead\n */\nconst createLabel = async (_vertexText, style, isTitle, isNode) => {\n let vertexText = _vertexText || '';\n if (typeof vertexText === 'object') {\n vertexText = vertexText[0];\n }\n const config = getConfig();\n if (evaluate(config.flowchart.htmlLabels)) {\n // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?\n vertexText = vertexText.replace(/\\\\n|\\n/g, '
');\n log.debug('vertexText' + vertexText);\n const label = await replaceIconSubstring(decodeEntities(vertexText));\n const node = {\n isNode,\n label,\n labelStyle: style.replace('fill:', 'color:'),\n };\n let vertexNode = addHtmlLabel(node, config);\n // vertexNode.parentNode.removeChild(vertexNode);\n return vertexNode;\n } else {\n const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n svgLabel.setAttribute('style', style.replace('color:', 'fill:'));\n let rows = [];\n if (typeof vertexText === 'string') {\n rows = vertexText.split(/\\\\n|\\n|/gi);\n } else if (Array.isArray(vertexText)) {\n rows = vertexText;\n } else {\n rows = [];\n }\n\n for (const row of rows) {\n const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n tspan.setAttribute('dy', '1em');\n tspan.setAttribute('x', '0');\n if (isTitle) {\n tspan.setAttribute('class', 'title-row');\n } else {\n tspan.setAttribute('class', 'row');\n }\n tspan.textContent = row.trim();\n svgLabel.appendChild(tspan);\n }\n return svgLabel;\n }\n};\n\nexport default createLabel;\n", "import type { SVG } from '../diagram-api/types.js';\nimport { log } from '../logger.js';\nimport type { EdgeData } from '../types.js';\n/**\n * Adds SVG markers to a path element based on the arrow types specified in the edge.\n *\n * @param svgPath - The SVG path element to add markers to.\n * @param edge - The edge data object containing the arrow types.\n * @param url - The URL of the SVG marker definitions.\n * @param id - The ID prefix for the SVG marker definitions.\n * @param diagramType - The type of diagram being rendered.\n */\nexport const addEdgeMarkers = (\n svgPath: SVG,\n edge: Pick,\n url: string,\n id: string,\n diagramType: string\n) => {\n if (edge.arrowTypeStart) {\n addEdgeMarker(svgPath, 'start', edge.arrowTypeStart, url, id, diagramType);\n }\n if (edge.arrowTypeEnd) {\n addEdgeMarker(svgPath, 'end', edge.arrowTypeEnd, url, id, diagramType);\n }\n};\n\nconst arrowTypesMap = {\n arrow_cross: 'cross',\n arrow_point: 'point',\n arrow_barb: 'barb',\n arrow_circle: 'circle',\n aggregation: 'aggregation',\n extension: 'extension',\n composition: 'composition',\n dependency: 'dependency',\n lollipop: 'lollipop',\n} as const;\n\nconst addEdgeMarker = (\n svgPath: SVG,\n position: 'start' | 'end',\n arrowType: string,\n url: string,\n id: string,\n diagramType: string\n) => {\n const endMarkerType = arrowTypesMap[arrowType as keyof typeof arrowTypesMap];\n\n if (!endMarkerType) {\n log.warn(`Unknown arrow type: ${arrowType}`);\n return; // unknown arrow type, ignore\n }\n\n const suffix = position === 'start' ? 'Start' : 'End';\n svgPath.attr(`marker-${position}`, `url(${url}#${id}_${diagramType}-${endMarkerType}${suffix})`);\n};\n", "import { log } from '../logger.js';\nimport createLabel from './createLabel.js';\nimport { createText } from '../rendering-util/createText.js';\nimport { line, curveBasis, select } from 'd3';\nimport { getConfig } from '../diagram-api/diagramAPI.js';\nimport utils from '../utils.js';\nimport { evaluate, getUrl } from '../diagrams/common/common.js';\nimport { getLineFunctionsWithOffset } from '../utils/lineWithOffset.js';\nimport { getSubGraphTitleMargins } from '../utils/subGraphTitleMargins.js';\nimport { addEdgeMarkers } from './edgeMarker.js';\n\nlet edgeLabels = {};\nlet terminalLabels = {};\n\nexport const clear = () => {\n edgeLabels = {};\n terminalLabels = {};\n};\n\nexport const insertEdgeLabel = async (elem, edge) => {\n const config = getConfig();\n const useHtmlLabels = evaluate(config.flowchart.htmlLabels);\n // Create the actual text element\n const labelElement =\n edge.labelType === 'markdown'\n ? createText(\n elem,\n edge.label,\n {\n style: edge.labelStyle,\n useHtmlLabels,\n addSvgBackground: true,\n },\n config\n )\n : await createLabel(edge.label, edge.labelStyle);\n\n // Create outer g, edgeLabel, this will be positioned after graph layout\n const edgeLabel = elem.insert('g').attr('class', 'edgeLabel');\n\n // Create inner g, label, this will be positioned now for centering the text\n const label = edgeLabel.insert('g').attr('class', 'label');\n label.node().appendChild(labelElement);\n\n // Center the label\n let bbox = labelElement.getBBox();\n if (useHtmlLabels) {\n const div = labelElement.children[0];\n const dv = select(labelElement);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n\n // Make element accessible by id for positioning\n edgeLabels[edge.id] = edgeLabel;\n\n // Update the abstract data of the edge with the new information about its width and height\n edge.width = bbox.width;\n edge.height = bbox.height;\n\n let fo;\n if (edge.startLabelLeft) {\n // Create the actual text element\n const startLabelElement = await createLabel(edge.startLabelLeft, edge.labelStyle);\n const startEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = startEdgeLabelLeft.insert('g').attr('class', 'inner');\n fo = inner.node().appendChild(startLabelElement);\n const slBox = startLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].startLeft = startEdgeLabelLeft;\n setTerminalWidth(fo, edge.startLabelLeft);\n }\n if (edge.startLabelRight) {\n // Create the actual text element\n const startLabelElement = await createLabel(edge.startLabelRight, edge.labelStyle);\n const startEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = startEdgeLabelRight.insert('g').attr('class', 'inner');\n fo = startEdgeLabelRight.node().appendChild(startLabelElement);\n inner.node().appendChild(startLabelElement);\n const slBox = startLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].startRight = startEdgeLabelRight;\n setTerminalWidth(fo, edge.startLabelRight);\n }\n if (edge.endLabelLeft) {\n // Create the actual text element\n const endLabelElement = await createLabel(edge.endLabelLeft, edge.labelStyle);\n const endEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = endEdgeLabelLeft.insert('g').attr('class', 'inner');\n fo = inner.node().appendChild(endLabelElement);\n const slBox = endLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n endEdgeLabelLeft.node().appendChild(endLabelElement);\n\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].endLeft = endEdgeLabelLeft;\n setTerminalWidth(fo, edge.endLabelLeft);\n }\n if (edge.endLabelRight) {\n // Create the actual text element\n const endLabelElement = await createLabel(edge.endLabelRight, edge.labelStyle);\n const endEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = endEdgeLabelRight.insert('g').attr('class', 'inner');\n\n fo = inner.node().appendChild(endLabelElement);\n const slBox = endLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n endEdgeLabelRight.node().appendChild(endLabelElement);\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].endRight = endEdgeLabelRight;\n setTerminalWidth(fo, edge.endLabelRight);\n }\n return labelElement;\n};\n\n/**\n * @param {any} fo\n * @param {any} value\n */\nfunction setTerminalWidth(fo, value) {\n if (getConfig().flowchart.htmlLabels && fo) {\n fo.style.width = value.length * 9 + 'px';\n fo.style.height = '12px';\n }\n}\n\nexport const positionEdgeLabel = (edge, paths) => {\n log.debug('Moving label abc88 ', edge.id, edge.label, edgeLabels[edge.id], paths);\n let path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\n const siteConfig = getConfig();\n const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig);\n if (edge.label) {\n const el = edgeLabels[edge.id];\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // // debugger;\n const pos = utils.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.updatedPath) {\n x = pos.x;\n y = pos.y;\n }\n }\n el.attr('transform', `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`);\n }\n\n //let path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\n if (edge.startLabelLeft) {\n const el = terminalLabels[edge.id].startLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.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[edge.id].startRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.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[edge.id].endLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.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[edge.id].endRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.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\nconst outsideNode = (node, point) => {\n const x = node.x;\n const y = node.y;\n const dx = Math.abs(point.x - x);\n const dy = Math.abs(point.y - y);\n const w = node.width / 2;\n const h = node.height / 2;\n if (dx >= w || dy >= h) {\n return true;\n }\n return false;\n};\n\nexport const intersection = (node, outsidePoint, insidePoint) => {\n log.debug(`intersection calc abc89:\n outsidePoint: ${JSON.stringify(outsidePoint)}\n insidePoint : ${JSON.stringify(insidePoint)}\n node : x:${node.x} y:${node.y} w:${node.width} h:${node.height}`);\n const x = node.x;\n const y = node.y;\n\n const dx = Math.abs(x - insidePoint.x);\n // const dy = Math.abs(y - insidePoint.y);\n const w = node.width / 2;\n let r = insidePoint.x < outsidePoint.x ? w - dx : w + dx;\n const h = node.height / 2;\n\n const Q = Math.abs(outsidePoint.y - insidePoint.y);\n const R = Math.abs(outsidePoint.x - insidePoint.x);\n\n if (Math.abs(y - outsidePoint.y) * w > Math.abs(x - outsidePoint.x) * h) {\n // Intersection is top or bottom of rect.\n let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y;\n r = (R * q) / Q;\n const res = {\n x: insidePoint.x < outsidePoint.x ? insidePoint.x + r : insidePoint.x - R + r,\n y: insidePoint.y < outsidePoint.y ? insidePoint.y + Q - q : insidePoint.y - Q + q,\n };\n\n if (r === 0) {\n res.x = outsidePoint.x;\n res.y = outsidePoint.y;\n }\n if (R === 0) {\n res.x = outsidePoint.x;\n }\n if (Q === 0) {\n res.y = outsidePoint.y;\n }\n\n log.debug(`abc89 topp/bott calc, Q ${Q}, q ${q}, R ${R}, r ${r}`, res); // cspell: disable-line\n\n return res;\n } else {\n // Intersection on sides of rect\n if (insidePoint.x < outsidePoint.x) {\n r = outsidePoint.x - w - x;\n } else {\n // r = outsidePoint.x - w - x;\n r = x - w - outsidePoint.x;\n }\n let q = (Q * r) / R;\n // OK let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x + dx - w;\n // OK let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : outsidePoint.x + r;\n let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x - R + r;\n // let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : outsidePoint.x + r;\n let _y = insidePoint.y < outsidePoint.y ? insidePoint.y + q : insidePoint.y - q;\n log.debug(`sides calc abc89, Q ${Q}, q ${q}, R ${R}, r ${r}`, { _x, _y });\n if (r === 0) {\n _x = outsidePoint.x;\n _y = outsidePoint.y;\n }\n if (R === 0) {\n _x = outsidePoint.x;\n }\n if (Q === 0) {\n _y = outsidePoint.y;\n }\n\n return { x: _x, y: _y };\n }\n};\n/**\n * This function will page a path and node where the last point(s) in the path is inside the node\n * and return an update path ending by the border of the node.\n *\n * @param {Array} _points\n * @param {any} boundaryNode\n * @returns {Array} Points\n */\nconst cutPathAtIntersect = (_points, boundaryNode) => {\n log.debug('abc88 cutPathAtIntersect', _points, boundaryNode);\n let points = [];\n let lastPointOutside = _points[0];\n let isInside = false;\n _points.forEach((point) => {\n // check if point is inside the boundary rect\n if (!outsideNode(boundaryNode, point) && !isInside) {\n // First point inside the rect found\n // Calc the intersection coord between the point and the last point outside the rect\n const inter = intersection(boundaryNode, lastPointOutside, point);\n\n // // Check case where the intersection is the same as the last point\n let pointPresent = false;\n points.forEach((p) => {\n pointPresent = pointPresent || (p.x === inter.x && p.y === inter.y);\n });\n // // if (!pointPresent) {\n if (!points.some((e) => e.x === inter.x && e.y === inter.y)) {\n points.push(inter);\n }\n\n isInside = true;\n } else {\n // Outside\n lastPointOutside = point;\n // points.push(point);\n if (!isInside) {\n points.push(point);\n }\n }\n });\n return points;\n};\n\nexport const insertEdge = function (elem, e, edge, clusterDb, diagramType, graph, id) {\n let points = edge.points;\n log.debug('abc88 InsertEdge: edge=', edge, 'e=', e);\n let pointsHasChanged = false;\n const tail = graph.node(e.v);\n var head = graph.node(e.w);\n\n if (head?.intersect && tail?.intersect) {\n points = points.slice(1, edge.points.length - 1);\n points.unshift(tail.intersect(points[0]));\n points.push(head.intersect(points[points.length - 1]));\n }\n\n if (edge.toCluster) {\n log.debug('to cluster abc88', clusterDb[edge.toCluster]);\n points = cutPathAtIntersect(edge.points, clusterDb[edge.toCluster].node);\n\n pointsHasChanged = true;\n }\n\n if (edge.fromCluster) {\n log.debug('from cluster abc88', clusterDb[edge.fromCluster]);\n points = cutPathAtIntersect(points.reverse(), clusterDb[edge.fromCluster].node).reverse();\n\n pointsHasChanged = true;\n }\n\n // The data for our line\n const lineData = points.filter((p) => !Number.isNaN(p.y));\n\n // This is the accessor function we talked about above\n let curve = curveBasis;\n // Currently only flowcharts get the curve from the settings, perhaps this should\n // be expanded to a common setting? Restricting it for now in order not to cause side-effects that\n // have not been thought through\n if (edge.curve && (diagramType === 'graph' || diagramType === 'flowchart')) {\n curve = edge.curve;\n }\n\n const { x, y } = getLineFunctionsWithOffset(edge);\n const lineFunction = line().x(x).y(y).curve(curve);\n\n // Construct stroke classes based on properties\n let strokeClasses;\n switch (edge.thickness) {\n case 'normal':\n strokeClasses = 'edge-thickness-normal';\n break;\n case 'thick':\n strokeClasses = 'edge-thickness-thick';\n break;\n case 'invisible':\n strokeClasses = 'edge-thickness-thick';\n break;\n default:\n strokeClasses = '';\n }\n switch (edge.pattern) {\n case 'solid':\n strokeClasses += ' edge-pattern-solid';\n break;\n case 'dotted':\n strokeClasses += ' edge-pattern-dotted';\n break;\n case 'dashed':\n strokeClasses += ' edge-pattern-dashed';\n break;\n }\n\n const svgPath = elem\n .append('path')\n .attr('d', lineFunction(lineData))\n .attr('id', edge.id)\n .attr('class', ' ' + strokeClasses + (edge.classes ? ' ' + edge.classes : ''))\n .attr('style', edge.style);\n\n // DEBUG code, adds a red circle at each edge coordinate\n // edge.points.forEach((point) => {\n // elem\n // .append('circle')\n // .style('stroke', 'red')\n // .style('fill', 'red')\n // .attr('r', 1)\n // .attr('cx', point.x)\n // .attr('cy', point.y);\n // });\n\n let url = '';\n // // TODO: Can we load this config only from the rendered graph type?\n if (getConfig().flowchart.arrowMarkerAbsolute || getConfig().state.arrowMarkerAbsolute) {\n url = getUrl(true);\n }\n\n addEdgeMarkers(svgPath, edge, url, id, diagramType);\n\n let paths = {};\n if (pointsHasChanged) {\n paths.updatedPath = points;\n }\n paths.originalPath = edge.points;\n return paths;\n};\n", "import type { Direction } from '../../src/diagrams/block/blockTypes.js';\n\nconst expandAndDeduplicateDirections = (directions: Direction[]) => {\n const uniqueDirections = new Set();\n\n for (const direction of directions) {\n switch (direction) {\n case 'x':\n uniqueDirections.add('right');\n uniqueDirections.add('left');\n break;\n case 'y':\n uniqueDirections.add('up');\n uniqueDirections.add('down');\n break;\n default:\n uniqueDirections.add(direction);\n break;\n }\n }\n\n return uniqueDirections;\n};\nexport const getArrowPoints = (\n duplicatedDirections: Direction[],\n bbox: { width: number; height: number },\n node: any\n) => {\n // Expand and deduplicate the provided directions.\n // for instance: x, right => right, left\n const directions = expandAndDeduplicateDirections(duplicatedDirections);\n\n // Factor to divide height for some calculations.\n const f = 2;\n\n // Calculated height of the bounding box, accounting for node padding.\n const height = bbox.height + 2 * node.padding;\n // Midpoint calculation based on height.\n const midpoint = height / f;\n // Calculated width of the bounding box, accounting for additional width and node padding.\n const width = bbox.width + 2 * midpoint + node.padding;\n // Padding to use, half of the node padding.\n const padding = node.padding / 2;\n\n if (\n directions.has('right') &&\n directions.has('left') &&\n directions.has('up') &&\n directions.has('down')\n ) {\n // SQUARE\n return [\n // Bottom\n { x: 0, y: 0 },\n { x: midpoint, y: 0 },\n { x: width / 2, y: 2 * padding },\n { x: width - midpoint, y: 0 },\n { x: width, y: 0 },\n\n // Right\n { x: width, y: -height / 3 },\n { x: width + 2 * padding, y: -height / 2 },\n { x: width, y: (-2 * height) / 3 },\n { x: width, y: -height },\n\n // Top\n { x: width - midpoint, y: -height },\n { x: width / 2, y: -height - 2 * padding },\n { x: midpoint, y: -height },\n\n // Left\n { x: 0, y: -height },\n { x: 0, y: (-2 * height) / 3 },\n { x: -2 * padding, y: -height / 2 },\n { x: 0, y: -height / 3 },\n ];\n }\n if (directions.has('right') && directions.has('left') && directions.has('up')) {\n // RECTANGLE_VERTICAL (Top Open)\n return [\n { x: midpoint, y: 0 },\n { x: width - midpoint, y: 0 },\n { x: width, y: -height / 2 },\n { x: width - midpoint, y: -height },\n { x: midpoint, y: -height },\n { x: 0, y: -height / 2 },\n ];\n }\n if (directions.has('right') && directions.has('left') && directions.has('down')) {\n // RECTANGLE_VERTICAL (Bottom Open)\n return [\n { x: 0, y: 0 },\n { x: midpoint, y: -height },\n { x: width - midpoint, y: -height },\n { x: width, y: 0 },\n ];\n }\n if (directions.has('right') && directions.has('up') && directions.has('down')) {\n // RECTANGLE_HORIZONTAL (Right Open)\n return [\n { x: 0, y: 0 },\n { x: width, y: -midpoint },\n { x: width, y: -height + midpoint },\n { x: 0, y: -height },\n ];\n }\n if (directions.has('left') && directions.has('up') && directions.has('down')) {\n // RECTANGLE_HORIZONTAL (Left Open)\n return [\n { x: width, y: 0 },\n { x: 0, y: -midpoint },\n { x: 0, y: -height + midpoint },\n { x: width, y: -height },\n ];\n }\n if (directions.has('right') && directions.has('left')) {\n // HORIZONTAL_LINE\n return [\n { x: midpoint, y: 0 },\n { x: midpoint, y: -padding },\n { x: width - midpoint, y: -padding },\n { x: width - midpoint, y: 0 },\n { x: width, y: -height / 2 },\n { x: width - midpoint, y: -height },\n { x: width - midpoint, y: -height + padding },\n { x: midpoint, y: -height + padding },\n { x: midpoint, y: -height },\n { x: 0, y: -height / 2 },\n ];\n }\n if (directions.has('up') && directions.has('down')) {\n // VERTICAL_LINE\n return [\n // Bottom center\n { x: width / 2, y: 0 },\n // Left pont of bottom arrow\n { x: 0, y: -padding },\n { x: midpoint, y: -padding },\n // Left top over vertical section\n { x: midpoint, y: -height + padding },\n { x: 0, y: -height + padding },\n // Top of arrow\n { x: width / 2, y: -height },\n { x: width, y: -height + padding },\n // Top of right vertical bar\n { x: width - midpoint, y: -height + padding },\n { x: width - midpoint, y: -padding },\n { x: width, y: -padding },\n ];\n }\n if (directions.has('right') && directions.has('up')) {\n // ANGLE_RT\n return [\n { x: 0, y: 0 },\n { x: width, y: -midpoint },\n { x: 0, y: -height },\n ];\n }\n if (directions.has('right') && directions.has('down')) {\n // ANGLE_RB\n return [\n { x: 0, y: 0 },\n { x: width, y: 0 },\n { x: 0, y: -height },\n ];\n }\n if (directions.has('left') && directions.has('up')) {\n // ANGLE_LT\n return [\n { x: width, y: 0 },\n { x: 0, y: -midpoint },\n { x: width, y: -height },\n ];\n }\n if (directions.has('left') && directions.has('down')) {\n // ANGLE_LB\n return [\n { x: width, y: 0 },\n { x: 0, y: 0 },\n { x: width, y: -height },\n ];\n }\n if (directions.has('right')) {\n // ARROW_RIGHT\n return [\n { x: midpoint, y: -padding },\n { x: midpoint, y: -padding },\n { x: width - midpoint, y: -padding },\n { x: width - midpoint, y: 0 },\n { x: width, y: -height / 2 },\n { x: width - midpoint, y: -height },\n { x: width - midpoint, y: -height + padding },\n // top left corner of arrow\n { x: midpoint, y: -height + padding },\n { x: midpoint, y: -height + padding },\n ];\n }\n if (directions.has('left')) {\n // ARROW_LEFT\n return [\n { x: midpoint, y: 0 },\n { x: midpoint, y: -padding },\n // Two points, the right corners\n { x: width - midpoint, y: -padding },\n { x: width - midpoint, y: -height + padding },\n { x: midpoint, y: -height + padding },\n { x: midpoint, y: -height },\n { x: 0, y: -height / 2 },\n ];\n }\n if (directions.has('up')) {\n // ARROW_TOP\n return [\n // Bottom center\n { x: midpoint, y: -padding },\n // Left top over vertical section\n { x: midpoint, y: -height + padding },\n { x: 0, y: -height + padding },\n // Top of arrow\n { x: width / 2, y: -height },\n { x: width, y: -height + padding },\n // Top of right vertical bar\n { x: width - midpoint, y: -height + padding },\n { x: width - midpoint, y: -padding },\n ];\n }\n if (directions.has('down')) {\n // ARROW_BOTTOM\n return [\n // Bottom center\n { x: width / 2, y: 0 },\n // Left pont of bottom arrow\n { x: 0, y: -padding },\n { x: midpoint, y: -padding },\n // Left top over vertical section\n { x: midpoint, y: -height + padding },\n { x: width - midpoint, y: -height + padding },\n { x: width - midpoint, y: -padding },\n { x: width, y: -padding },\n ];\n }\n\n // POINT\n return [{ x: 0, y: 0 }];\n};\n", "/**\n * @param node\n * @param point\n */\nfunction intersectNode(node, point) {\n // console.info('Intersect Node');\n return node.intersect(point);\n}\n\nexport default intersectNode;\n", "/**\n * @param node\n * @param rx\n * @param ry\n * @param point\n */\nfunction intersectEllipse(node, rx, ry, point) {\n // Formulae from: https://mathworld.wolfram.com/Ellipse-LineIntersection.html\n\n var cx = node.x;\n var cy = node.y;\n\n var px = cx - point.x;\n var py = cy - point.y;\n\n var det = Math.sqrt(rx * rx * py * py + ry * ry * px * px);\n\n var dx = Math.abs((rx * ry * px) / det);\n if (point.x < cx) {\n dx = -dx;\n }\n var dy = Math.abs((rx * ry * py) / det);\n if (point.y < cy) {\n dy = -dy;\n }\n\n return { x: cx + dx, y: cy + dy };\n}\n\nexport default intersectEllipse;\n", "import intersectEllipse from './intersect-ellipse.js';\n\n/**\n * @param node\n * @param rx\n * @param point\n */\nfunction intersectCircle(node, rx, point) {\n return intersectEllipse(node, rx, rx, point);\n}\n\nexport default intersectCircle;\n", "/**\n * Returns the point at which two lines, p and q, intersect or returns undefined if they do not intersect.\n *\n * @param p1\n * @param p2\n * @param q1\n * @param q2\n */\nfunction intersectLine(p1, p2, q1, q2) {\n // Algorithm from J. Avro, (ed.) Graphics Gems, No 2, Morgan Kaufmann, 1994,\n // p7 and p473.\n\n var a1, a2, b1, b2, c1, c2;\n var r1, r2, r3, r4;\n var denom, offset, num;\n var x, y;\n\n // Compute a1, b1, c1, where line joining points 1 and 2 is F(x,y) = a1 x +\n // b1 y + c1 = 0.\n a1 = p2.y - p1.y;\n b1 = p1.x - p2.x;\n c1 = p2.x * p1.y - p1.x * p2.y;\n\n // Compute r3 and r4.\n r3 = a1 * q1.x + b1 * q1.y + c1;\n r4 = a1 * q2.x + b1 * q2.y + c1;\n\n // Check signs of r3 and r4. If both point 3 and point 4 lie on\n // same side of line 1, the line segments do not intersect.\n if (r3 !== 0 && r4 !== 0 && sameSign(r3, r4)) {\n return /*DON'T_INTERSECT*/;\n }\n\n // Compute a2, b2, c2 where line joining points 3 and 4 is G(x,y) = a2 x + b2 y + c2 = 0\n a2 = q2.y - q1.y;\n b2 = q1.x - q2.x;\n c2 = q2.x * q1.y - q1.x * q2.y;\n\n // Compute r1 and r2\n r1 = a2 * p1.x + b2 * p1.y + c2;\n r2 = a2 * p2.x + b2 * p2.y + c2;\n\n // Check signs of r1 and r2. If both point 1 and point 2 lie\n // on same side of second line segment, the line segments do\n // not intersect.\n if (r1 !== 0 && r2 !== 0 && sameSign(r1, r2)) {\n return /*DON'T_INTERSECT*/;\n }\n\n // Line segments intersect: compute intersection point.\n denom = a1 * b2 - a2 * b1;\n if (denom === 0) {\n return /*COLLINEAR*/;\n }\n\n offset = Math.abs(denom / 2);\n\n // The denom/2 is to get rounding instead of truncating. It\n // is added or subtracted to the numerator, depending upon the\n // sign of the numerator.\n num = b1 * c2 - b2 * c1;\n x = num < 0 ? (num - offset) / denom : (num + offset) / denom;\n\n num = a2 * c1 - a1 * c2;\n y = num < 0 ? (num - offset) / denom : (num + offset) / denom;\n\n return { x: x, y: y };\n}\n\n/**\n * @param r1\n * @param r2\n */\nfunction sameSign(r1, r2) {\n return r1 * r2 > 0;\n}\n\nexport default intersectLine;\n", "/* eslint \"no-console\": off */\n\nimport intersectLine from './intersect-line.js';\n\nexport default intersectPolygon;\n\n/**\n * Returns the point ({x, y}) at which the point argument intersects with the node argument assuming\n * that it has the shape specified by polygon.\n *\n * @param node\n * @param polyPoints\n * @param point\n */\nfunction intersectPolygon(node, polyPoints, point) {\n var x1 = node.x;\n var y1 = node.y;\n\n var intersections = [];\n\n var minX = Number.POSITIVE_INFINITY;\n var minY = Number.POSITIVE_INFINITY;\n if (typeof polyPoints.forEach === 'function') {\n polyPoints.forEach(function (entry) {\n minX = Math.min(minX, entry.x);\n minY = Math.min(minY, entry.y);\n });\n } else {\n minX = Math.min(minX, polyPoints.x);\n minY = Math.min(minY, polyPoints.y);\n }\n\n var left = x1 - node.width / 2 - minX;\n var top = y1 - node.height / 2 - minY;\n\n for (var i = 0; i < polyPoints.length; i++) {\n var p1 = polyPoints[i];\n var p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0];\n var intersect = intersectLine(\n node,\n point,\n { x: left + p1.x, y: top + p1.y },\n { x: left + p2.x, y: top + p2.y }\n );\n if (intersect) {\n intersections.push(intersect);\n }\n }\n\n if (!intersections.length) {\n // console.log('NO INTERSECTION FOUND, RETURN NODE CENTER', node);\n return node;\n }\n\n if (intersections.length > 1) {\n // More intersections, find the one nearest to edge end point\n intersections.sort(function (p, q) {\n var pdx = p.x - point.x;\n var pdy = p.y - point.y;\n var distp = Math.sqrt(pdx * pdx + pdy * pdy);\n\n var qdx = q.x - point.x;\n var qdy = q.y - point.y;\n var distq = Math.sqrt(qdx * qdx + qdy * qdy);\n\n return distp < distq ? -1 : distp === distq ? 0 : 1;\n });\n }\n return intersections[0];\n}\n", "const intersectRect = (node, point) => {\n var x = node.x;\n var y = node.y;\n\n // Rectangle intersection algorithm from:\n // https://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\n var dx = point.x - x;\n var dy = point.y - y;\n var w = node.width / 2;\n var h = node.height / 2;\n\n var sx, sy;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n // Intersection is top or bottom of rect.\n if (dy < 0) {\n h = -h;\n }\n sx = dy === 0 ? 0 : (h * dx) / dy;\n sy = h;\n } else {\n // Intersection is left or right of rect.\n if (dx < 0) {\n w = -w;\n }\n sx = w;\n sy = dx === 0 ? 0 : (w * dy) / dx;\n }\n\n return { x: x + sx, y: y + sy };\n};\n\nexport default intersectRect;\n", "/*\n * Borrowed with love from dagre-d3. Many thanks to cpettitt!\n */\n\nimport node from './intersect-node.js';\nimport circle from './intersect-circle.js';\nimport ellipse from './intersect-ellipse.js';\nimport polygon from './intersect-polygon.js';\nimport rect from './intersect-rect.js';\n\nexport default {\n node,\n circle,\n ellipse,\n polygon,\n rect,\n};\n", "import createLabel from '../createLabel.js';\nimport { createText } from '../../rendering-util/createText.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { select } from 'd3';\nimport { evaluate, sanitizeText } from '../../diagrams/common/common.js';\nimport { decodeEntities } from '../../utils.js';\n\nexport const labelHelper = async (parent, node, _classes, isNode) => {\n const config = getConfig();\n let classes;\n const useHtmlLabels = node.useHtmlLabels || evaluate(config.flowchart.htmlLabels);\n if (!_classes) {\n classes = 'node default';\n } else {\n classes = _classes;\n }\n\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', classes)\n .attr('id', node.domId || node.id);\n\n // Create the label and insert it after the rect\n const label = shapeSvg.insert('g').attr('class', 'label').attr('style', node.labelStyle);\n\n // Replace labelText with default value if undefined\n let labelText;\n if (node.labelText === undefined) {\n labelText = '';\n } else {\n labelText = typeof node.labelText === 'string' ? node.labelText : node.labelText[0];\n }\n\n const textNode = label.node();\n let text;\n if (node.labelType === 'markdown') {\n // text = textNode;\n text = createText(\n label,\n sanitizeText(decodeEntities(labelText), config),\n {\n useHtmlLabels,\n width: node.width || config.flowchart.wrappingWidth,\n classes: 'markdown-node-label',\n },\n config\n );\n } else {\n text = textNode.appendChild(\n await createLabel(\n sanitizeText(decodeEntities(labelText), config),\n node.labelStyle,\n false,\n isNode\n )\n );\n }\n // Get the size of the label\n let bbox = text.getBBox();\n const halfPadding = node.padding / 2;\n\n if (evaluate(config.flowchart.htmlLabels)) {\n const div = text.children[0];\n const dv = select(text);\n\n // if there are images, need to wait for them to load before getting the bounding box\n const images = div.getElementsByTagName('img');\n if (images) {\n const noImgText = labelText.replace(/]*>/g, '').trim() === '';\n\n await Promise.all(\n [...images].map(\n (img) =>\n new Promise((res) => {\n /**\n *\n */\n function setupImage() {\n img.style.display = 'flex';\n img.style.flexDirection = 'column';\n\n if (noImgText) {\n // default size if no text\n const bodyFontSize = config.fontSize\n ? config.fontSize\n : window.getComputedStyle(document.body).fontSize;\n const enlargingFactor = 5;\n const width = parseInt(bodyFontSize, 10) * enlargingFactor + 'px';\n img.style.minWidth = width;\n img.style.maxWidth = width;\n } else {\n img.style.width = '100%';\n }\n res(img);\n }\n setTimeout(() => {\n if (img.complete) {\n setupImage();\n }\n });\n img.addEventListener('error', setupImage);\n img.addEventListener('load', setupImage);\n })\n )\n );\n }\n\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n // Center the label\n if (useHtmlLabels) {\n label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n } else {\n label.attr('transform', 'translate(' + 0 + ', ' + -bbox.height / 2 + ')');\n }\n if (node.centerLabel) {\n label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n }\n label.insert('rect', ':first-child');\n\n return { shapeSvg, bbox, halfPadding, label };\n};\n\nexport const updateNodeBounds = (node, element) => {\n const bbox = element.node().getBBox();\n node.width = bbox.width;\n node.height = bbox.height;\n};\n\n/**\n * @param parent\n * @param w\n * @param h\n * @param points\n */\nexport function insertPolygonShape(parent, w, h, points) {\n return parent\n .insert('polygon', ':first-child')\n .attr(\n 'points',\n points\n .map(function (d) {\n return d.x + ',' + d.y;\n })\n .join(' ')\n )\n .attr('class', 'label-container')\n .attr('transform', 'translate(' + -w / 2 + ',' + h / 2 + ')');\n}\n", "import { updateNodeBounds, labelHelper } from './util.js';\nimport { log } from '../../logger.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport intersect from '../intersect/index.js';\n\nconst note = async (parent, node) => {\n const useHtmlLabels = node.useHtmlLabels || getConfig().flowchart.htmlLabels;\n if (!useHtmlLabels) {\n node.centerLabel = true;\n }\n const { shapeSvg, bbox, halfPadding } = await labelHelper(\n parent,\n node,\n 'node ' + node.classes,\n true\n );\n\n log.info('Classes = ', node.classes);\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n rect\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', -bbox.width / 2 - halfPadding)\n .attr('y', -bbox.height / 2 - halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nexport default note;\n", "import { select } from 'd3';\nimport { getConfig } from '../diagram-api/diagramAPI.js';\nimport { evaluate } from '../diagrams/common/common.js';\nimport { log } from '../logger.js';\nimport { getArrowPoints } from './blockArrowHelper.js';\nimport createLabel from './createLabel.js';\nimport intersect from './intersect/index.js';\nimport note from './shapes/note.js';\nimport { insertPolygonShape, labelHelper, updateNodeBounds } from './shapes/util.js';\n\nconst formatClass = (str) => {\n if (str) {\n return ' ' + str;\n }\n return '';\n};\nconst getClassesFromNode = (node, otherClasses) => {\n return `${otherClasses ? otherClasses : 'node default'}${formatClass(node.classes)} ${formatClass(\n node.class\n )}`;\n};\n\nconst question = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const s = w + h;\n\n const points = [\n { x: s / 2, y: 0 },\n { x: s, y: -s / 2 },\n { x: s / 2, y: -s },\n { x: 0, y: -s / 2 },\n ];\n\n log.info('Question main (Circle)');\n\n const questionElem = insertPolygonShape(shapeSvg, s, s, points);\n questionElem.attr('style', node.style);\n updateNodeBounds(node, questionElem);\n\n node.intersect = function (point) {\n log.warn('Intersect called');\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst choice = (parent, node) => {\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n\n const s = 28;\n const points = [\n { x: 0, y: s / 2 },\n { x: s / 2, y: 0 },\n { x: 0, y: -s / 2 },\n { x: -s / 2, y: 0 },\n ];\n\n const choice = shapeSvg.insert('polygon', ':first-child').attr(\n 'points',\n points\n .map(function (d) {\n return d.x + ',' + d.y;\n })\n .join(' ')\n );\n // center the circle around its coordinate\n choice.attr('class', 'state-start').attr('r', 7).attr('width', 28).attr('height', 28);\n node.width = 28;\n node.height = 28;\n\n node.intersect = function (point) {\n return intersect.circle(node, 14, point);\n };\n\n return shapeSvg;\n};\n\nconst hexagon = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const f = 4;\n const h = bbox.height + node.padding;\n const m = h / f;\n const w = bbox.width + 2 * m + node.padding;\n const points = [\n { x: m, y: 0 },\n { x: w - m, y: 0 },\n { x: w, y: -h / 2 },\n { x: w - m, y: -h },\n { x: m, y: -h },\n { x: 0, y: -h / 2 },\n ];\n\n const hex = insertPolygonShape(shapeSvg, w, h, points);\n hex.attr('style', node.style);\n updateNodeBounds(node, hex);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst block_arrow = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(parent, node, undefined, true);\n\n const f = 2;\n const h = bbox.height + 2 * node.padding;\n const m = h / f;\n const w = bbox.width + 2 * m + node.padding;\n\n const points = getArrowPoints(node.directions, bbox, node);\n\n const blockArrow = insertPolygonShape(shapeSvg, w, h, points);\n blockArrow.attr('style', node.style);\n updateNodeBounds(node, blockArrow);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst rect_left_inv_arrow = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: -h / 2, y: 0 },\n { x: w, y: 0 },\n { x: w, y: -h },\n { x: -h / 2, y: -h },\n { x: 0, y: -h / 2 },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n\n node.width = w + h;\n node.height = h;\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst lean_right = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(parent, node, getClassesFromNode(node), true);\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: (-2 * h) / 6, y: 0 },\n { x: w - h / 6, y: 0 },\n { x: w + (2 * h) / 6, y: -h },\n { x: h / 6, y: -h },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst lean_left = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: (2 * h) / 6, y: 0 },\n { x: w + h / 6, y: 0 },\n { x: w - (2 * h) / 6, y: -h },\n { x: -h / 6, y: -h },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst trapezoid = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: (-2 * h) / 6, y: 0 },\n { x: w + (2 * h) / 6, y: 0 },\n { x: w - h / 6, y: -h },\n { x: h / 6, y: -h },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst inv_trapezoid = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: h / 6, y: 0 },\n { x: w - h / 6, y: 0 },\n { x: w + (2 * h) / 6, y: -h },\n { x: (-2 * h) / 6, y: -h },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst rect_right_inv_arrow = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: 0, y: 0 },\n { x: w + h / 2, y: 0 },\n { x: w, y: -h / 2 },\n { x: w + h / 2, y: -h },\n { x: 0, y: -h },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst cylinder = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const rx = w / 2;\n const ry = rx / (2.5 + w / 50);\n const h = bbox.height + ry + node.padding;\n\n const shape =\n 'M 0,' +\n ry +\n ' a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n w +\n ' 0 a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n -w +\n ' 0 l 0,' +\n h +\n ' a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n w +\n ' 0 l 0,' +\n -h;\n\n const el = shapeSvg\n .attr('label-offset-y', ry)\n .insert('path', ':first-child')\n .attr('style', node.style)\n .attr('d', shape)\n .attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2 + ry) + ')');\n\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n const pos = intersect.rect(node, point);\n const x = pos.x - node.x;\n\n if (\n rx != 0 &&\n (Math.abs(x) < node.width / 2 ||\n (Math.abs(x) == node.width / 2 && Math.abs(pos.y - node.y) > node.height / 2 - ry))\n ) {\n // ellipsis equation: x*x / a*a + y*y / b*b = 1\n // solve for y to get adjusted value for pos.y\n let y = ry * ry * (1 - (x * x) / (rx * rx));\n if (y != 0) {\n y = Math.sqrt(y);\n }\n y = ry - y;\n if (point.y - node.y > 0) {\n y = -y;\n }\n\n pos.y += y;\n }\n\n return pos;\n };\n\n return shapeSvg;\n};\n\nconst rect = async (parent, node) => {\n const { shapeSvg, bbox, halfPadding } = await labelHelper(\n parent,\n node,\n 'node ' + node.classes + ' ' + node.class,\n true\n );\n\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n // console.log('Rect node:', node, 'bbox:', bbox, 'halfPadding:', halfPadding, 'node.padding:', node.padding);\n // const totalWidth = bbox.width + node.padding * 2;\n // const totalHeight = bbox.height + node.padding * 2;\n const totalWidth = node.positioned ? node.width : bbox.width + node.padding;\n const totalHeight = node.positioned ? node.height : bbox.height + node.padding;\n const x = node.positioned ? -totalWidth / 2 : -bbox.width / 2 - halfPadding;\n const y = node.positioned ? -totalHeight / 2 : -bbox.height / 2 - halfPadding;\n rect\n .attr('class', 'basic label-container')\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', x)\n .attr('y', y)\n .attr('width', totalWidth)\n .attr('height', totalHeight);\n\n if (node.props) {\n const propKeys = new Set(Object.keys(node.props));\n if (node.props.borders) {\n applyNodePropertyBorders(rect, node.props.borders, totalWidth, totalHeight);\n propKeys.delete('borders');\n }\n propKeys.forEach((propKey) => {\n log.warn(`Unknown node property ${propKey}`);\n });\n }\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst composite = async (parent, node) => {\n const { shapeSvg, bbox, halfPadding } = await labelHelper(\n parent,\n node,\n 'node ' + node.classes,\n true\n );\n\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n // const totalWidth = bbox.width + node.padding * 2;\n // const totalHeight = bbox.height + node.padding * 2;\n const totalWidth = node.positioned ? node.width : bbox.width + node.padding;\n const totalHeight = node.positioned ? node.height : bbox.height + node.padding;\n const x = node.positioned ? -totalWidth / 2 : -bbox.width / 2 - halfPadding;\n const y = node.positioned ? -totalHeight / 2 : -bbox.height / 2 - halfPadding;\n rect\n .attr('class', 'basic cluster composite label-container')\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', x)\n .attr('y', y)\n .attr('width', totalWidth)\n .attr('height', totalHeight);\n\n if (node.props) {\n const propKeys = new Set(Object.keys(node.props));\n if (node.props.borders) {\n applyNodePropertyBorders(rect, node.props.borders, totalWidth, totalHeight);\n propKeys.delete('borders');\n }\n propKeys.forEach((propKey) => {\n log.warn(`Unknown node property ${propKey}`);\n });\n }\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst labelRect = async (parent, node) => {\n const { shapeSvg } = await labelHelper(parent, node, 'label', true);\n\n log.trace('Classes = ', node.class);\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n // Hide the rect we are only after the label\n const totalWidth = 0;\n const totalHeight = 0;\n rect.attr('width', totalWidth).attr('height', totalHeight);\n shapeSvg.attr('class', 'label edgeLabel');\n\n if (node.props) {\n const propKeys = new Set(Object.keys(node.props));\n if (node.props.borders) {\n applyNodePropertyBorders(rect, node.props.borders, totalWidth, totalHeight);\n propKeys.delete('borders');\n }\n propKeys.forEach((propKey) => {\n log.warn(`Unknown node property ${propKey}`);\n });\n }\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\n/**\n * @param rect\n * @param borders\n * @param totalWidth\n * @param totalHeight\n */\nfunction applyNodePropertyBorders(rect, borders, totalWidth, totalHeight) {\n const strokeDashArray = [];\n const addBorder = (length) => {\n strokeDashArray.push(length, 0);\n };\n const skipBorder = (length) => {\n strokeDashArray.push(0, length);\n };\n if (borders.includes('t')) {\n log.debug('add top border');\n addBorder(totalWidth);\n } else {\n skipBorder(totalWidth);\n }\n if (borders.includes('r')) {\n log.debug('add right border');\n addBorder(totalHeight);\n } else {\n skipBorder(totalHeight);\n }\n if (borders.includes('b')) {\n log.debug('add bottom border');\n addBorder(totalWidth);\n } else {\n skipBorder(totalWidth);\n }\n if (borders.includes('l')) {\n log.debug('add left border');\n addBorder(totalHeight);\n } else {\n skipBorder(totalHeight);\n }\n rect.attr('stroke-dasharray', strokeDashArray.join(' '));\n}\n\nconst rectWithTitle = async (parent, node) => {\n // const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, 'node ' + node.classes);\n\n let classes;\n if (!node.classes) {\n classes = 'node default';\n } else {\n classes = 'node ' + node.classes;\n }\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', classes)\n .attr('id', node.domId || node.id);\n\n // Create the title label and insert it after the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n // const innerRect = shapeSvg.insert('rect');\n const innerLine = shapeSvg.insert('line');\n\n const label = shapeSvg.insert('g').attr('class', 'label');\n\n const text2 = node.labelText.flat ? node.labelText.flat() : node.labelText;\n // const text2 = typeof text2prim === 'object' ? text2prim[0] : text2prim;\n\n let title = '';\n if (typeof text2 === 'object') {\n title = text2[0];\n } else {\n title = text2;\n }\n log.info('Label text abc79', title, text2, typeof text2 === 'object');\n\n const text = label.node().appendChild(await createLabel(title, node.labelStyle, true, true));\n let bbox = { width: 0, height: 0 };\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = text.children[0];\n const dv = select(text);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n log.info('Text 2', text2);\n const textRows = text2.slice(1, text2.length);\n let titleBox = text.getBBox();\n const descr = label\n .node()\n .appendChild(\n await createLabel(\n textRows.join ? textRows.join('
') : textRows,\n node.labelStyle,\n true,\n true\n )\n );\n\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = descr.children[0];\n const dv = select(descr);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n // bbox = label.getBBox();\n // log.info(descr);\n const halfPadding = node.padding / 2;\n select(descr).attr(\n 'transform',\n 'translate( ' +\n // (titleBox.width - bbox.width) / 2 +\n (bbox.width > titleBox.width ? 0 : (titleBox.width - bbox.width) / 2) +\n ', ' +\n (titleBox.height + halfPadding + 5) +\n ')'\n );\n select(text).attr(\n 'transform',\n 'translate( ' +\n // (titleBox.width - bbox.width) / 2 +\n (bbox.width < titleBox.width ? 0 : -(titleBox.width - bbox.width) / 2) +\n ', ' +\n 0 +\n ')'\n );\n // Get the size of the label\n\n // Bounding box for title and text\n bbox = label.node().getBBox();\n\n // Center the label\n label.attr(\n 'transform',\n 'translate(' + -bbox.width / 2 + ', ' + (-bbox.height / 2 - halfPadding + 3) + ')'\n );\n\n rect\n .attr('class', 'outer title-state')\n .attr('x', -bbox.width / 2 - halfPadding)\n .attr('y', -bbox.height / 2 - halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n innerLine\n .attr('class', 'divider')\n .attr('x1', -bbox.width / 2 - halfPadding)\n .attr('x2', bbox.width / 2 + halfPadding)\n .attr('y1', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding)\n .attr('y2', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst stadium = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const h = bbox.height + node.padding;\n const w = bbox.width + h / 4 + node.padding;\n\n // add the rect\n const rect = shapeSvg\n .insert('rect', ':first-child')\n .attr('style', node.style)\n .attr('rx', h / 2)\n .attr('ry', h / 2)\n .attr('x', -w / 2)\n .attr('y', -h / 2)\n .attr('width', w)\n .attr('height', h);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst circle = async (parent, node) => {\n const { shapeSvg, bbox, halfPadding } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n const circle = shapeSvg.insert('circle', ':first-child');\n\n // center the circle around its coordinate\n circle\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('r', bbox.width / 2 + halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n log.info('Circle main');\n\n updateNodeBounds(node, circle);\n\n node.intersect = function (point) {\n log.info('Circle intersect', node, bbox.width / 2 + halfPadding, point);\n return intersect.circle(node, bbox.width / 2 + halfPadding, point);\n };\n\n return shapeSvg;\n};\n\nconst doublecircle = async (parent, node) => {\n const { shapeSvg, bbox, halfPadding } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n const gap = 5;\n const circleGroup = shapeSvg.insert('g', ':first-child');\n const outerCircle = circleGroup.insert('circle');\n const innerCircle = circleGroup.insert('circle');\n\n circleGroup.attr('class', node.class);\n\n // center the circle around its coordinate\n outerCircle\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('r', bbox.width / 2 + halfPadding + gap)\n .attr('width', bbox.width + node.padding + gap * 2)\n .attr('height', bbox.height + node.padding + gap * 2);\n\n innerCircle\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('r', bbox.width / 2 + halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n log.info('DoubleCircle main');\n\n updateNodeBounds(node, outerCircle);\n\n node.intersect = function (point) {\n log.info('DoubleCircle intersect', node, bbox.width / 2 + halfPadding + gap, point);\n return intersect.circle(node, bbox.width / 2 + halfPadding + gap, point);\n };\n\n return shapeSvg;\n};\n\nconst subroutine = async (parent, node) => {\n const { shapeSvg, bbox } = await labelHelper(\n parent,\n node,\n getClassesFromNode(node, undefined),\n true\n );\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: 0, y: 0 },\n { x: w, y: 0 },\n { x: w, y: -h },\n { x: 0, y: -h },\n { x: 0, y: 0 },\n { x: -8, y: 0 },\n { x: w + 8, y: 0 },\n { x: w + 8, y: -h },\n { x: -8, y: -h },\n { x: -8, y: 0 },\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function (point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst start = (parent, node) => {\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n const circle = shapeSvg.insert('circle', ':first-child');\n\n // center the circle around its coordinate\n circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);\n\n updateNodeBounds(node, circle);\n\n node.intersect = function (point) {\n return intersect.circle(node, 7, point);\n };\n\n return shapeSvg;\n};\n\nconst forkJoin = (parent, node, dir) => {\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n\n let width = 70;\n let height = 10;\n\n if (dir === 'LR') {\n width = 10;\n height = 70;\n }\n\n const shape = shapeSvg\n .append('rect')\n .attr('x', (-1 * width) / 2)\n .attr('y', (-1 * height) / 2)\n .attr('width', width)\n .attr('height', height)\n .attr('class', 'fork-join');\n\n updateNodeBounds(node, shape);\n node.height = node.height + node.padding / 2;\n node.width = node.width + node.padding / 2;\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst end = (parent, node) => {\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n const innerCircle = shapeSvg.insert('circle', ':first-child');\n const circle = shapeSvg.insert('circle', ':first-child');\n\n circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);\n\n innerCircle.attr('class', 'state-end').attr('r', 5).attr('width', 10).attr('height', 10);\n\n updateNodeBounds(node, circle);\n\n node.intersect = function (point) {\n return intersect.circle(node, 7, point);\n };\n\n return shapeSvg;\n};\n\nconst class_box = async (parent, node) => {\n const halfPadding = node.padding / 2;\n const rowPadding = 4;\n const lineHeight = 8;\n\n let classes;\n if (!node.classes) {\n classes = 'node default';\n } else {\n classes = 'node ' + node.classes;\n }\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', classes)\n .attr('id', node.domId || node.id);\n\n // Create the title label and insert it after the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n const topLine = shapeSvg.insert('line');\n const bottomLine = shapeSvg.insert('line');\n let maxWidth = 0;\n let maxHeight = rowPadding;\n\n const labelContainer = shapeSvg.insert('g').attr('class', 'label');\n let verticalPos = 0;\n const hasInterface = node.classData.annotations?.[0];\n\n // 1. Create the labels\n const interfaceLabelText = node.classData.annotations[0]\n ? '\u00AB' + node.classData.annotations[0] + '\u00BB'\n : '';\n const interfaceLabel = labelContainer\n .node()\n .appendChild(await createLabel(interfaceLabelText, node.labelStyle, true, true));\n let interfaceBBox = interfaceLabel.getBBox();\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = interfaceLabel.children[0];\n const dv = select(interfaceLabel);\n interfaceBBox = div.getBoundingClientRect();\n dv.attr('width', interfaceBBox.width);\n dv.attr('height', interfaceBBox.height);\n }\n if (node.classData.annotations[0]) {\n maxHeight += interfaceBBox.height + rowPadding;\n maxWidth += interfaceBBox.width;\n }\n\n let classTitleString = node.classData.label;\n\n if (node.classData.type !== undefined && node.classData.type !== '') {\n if (getConfig().flowchart.htmlLabels) {\n classTitleString += '<' + node.classData.type + '>';\n } else {\n classTitleString += '<' + node.classData.type + '>';\n }\n }\n const classTitleLabel = labelContainer\n .node()\n .appendChild(await createLabel(classTitleString, node.labelStyle, true, true));\n select(classTitleLabel).attr('class', 'classTitle');\n let classTitleBBox = classTitleLabel.getBBox();\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = classTitleLabel.children[0];\n const dv = select(classTitleLabel);\n classTitleBBox = div.getBoundingClientRect();\n dv.attr('width', classTitleBBox.width);\n dv.attr('height', classTitleBBox.height);\n }\n maxHeight += classTitleBBox.height + rowPadding;\n if (classTitleBBox.width > maxWidth) {\n maxWidth = classTitleBBox.width;\n }\n const classAttributes = [];\n node.classData.members.forEach(async (member) => {\n const parsedInfo = member.getDisplayDetails();\n let parsedText = parsedInfo.displayText;\n if (getConfig().flowchart.htmlLabels) {\n parsedText = parsedText.replace(//g, '>');\n }\n const lbl = labelContainer\n .node()\n .appendChild(\n await createLabel(\n parsedText,\n parsedInfo.cssStyle ? parsedInfo.cssStyle : node.labelStyle,\n true,\n true\n )\n );\n let bbox = lbl.getBBox();\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = lbl.children[0];\n const dv = select(lbl);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n if (bbox.width > maxWidth) {\n maxWidth = bbox.width;\n }\n maxHeight += bbox.height + rowPadding;\n classAttributes.push(lbl);\n });\n\n maxHeight += lineHeight;\n\n const classMethods = [];\n node.classData.methods.forEach(async (member) => {\n const parsedInfo = member.getDisplayDetails();\n let displayText = parsedInfo.displayText;\n if (getConfig().flowchart.htmlLabels) {\n displayText = displayText.replace(//g, '>');\n }\n const lbl = labelContainer\n .node()\n .appendChild(\n await createLabel(\n displayText,\n parsedInfo.cssStyle ? parsedInfo.cssStyle : node.labelStyle,\n true,\n true\n )\n );\n let bbox = lbl.getBBox();\n if (evaluate(getConfig().flowchart.htmlLabels)) {\n const div = lbl.children[0];\n const dv = select(lbl);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n if (bbox.width > maxWidth) {\n maxWidth = bbox.width;\n }\n maxHeight += bbox.height + rowPadding;\n\n classMethods.push(lbl);\n });\n\n maxHeight += lineHeight;\n\n // 2. Position the labels\n\n // position the interface label\n if (hasInterface) {\n let diffX = (maxWidth - interfaceBBox.width) / 2;\n select(interfaceLabel).attr(\n 'transform',\n 'translate( ' + ((-1 * maxWidth) / 2 + diffX) + ', ' + (-1 * maxHeight) / 2 + ')'\n );\n verticalPos = interfaceBBox.height + rowPadding;\n }\n // Position the class title label\n let diffX = (maxWidth - classTitleBBox.width) / 2;\n select(classTitleLabel).attr(\n 'transform',\n 'translate( ' +\n ((-1 * maxWidth) / 2 + diffX) +\n ', ' +\n ((-1 * maxHeight) / 2 + verticalPos) +\n ')'\n );\n verticalPos += classTitleBBox.height + rowPadding;\n\n topLine\n .attr('class', 'divider')\n .attr('x1', -maxWidth / 2 - halfPadding)\n .attr('x2', maxWidth / 2 + halfPadding)\n .attr('y1', -maxHeight / 2 - halfPadding + lineHeight + verticalPos)\n .attr('y2', -maxHeight / 2 - halfPadding + lineHeight + verticalPos);\n\n verticalPos += lineHeight;\n\n classAttributes.forEach((lbl) => {\n select(lbl).attr(\n 'transform',\n 'translate( ' +\n -maxWidth / 2 +\n ', ' +\n ((-1 * maxHeight) / 2 + verticalPos + lineHeight / 2) +\n ')'\n );\n //get the height of the bounding box of each member if exists\n const memberBBox = lbl?.getBBox();\n verticalPos += (memberBBox?.height ?? 0) + rowPadding;\n });\n\n verticalPos += lineHeight;\n bottomLine\n .attr('class', 'divider')\n .attr('x1', -maxWidth / 2 - halfPadding)\n .attr('x2', maxWidth / 2 + halfPadding)\n .attr('y1', -maxHeight / 2 - halfPadding + lineHeight + verticalPos)\n .attr('y2', -maxHeight / 2 - halfPadding + lineHeight + verticalPos);\n\n verticalPos += lineHeight;\n\n classMethods.forEach((lbl) => {\n select(lbl).attr(\n 'transform',\n 'translate( ' + -maxWidth / 2 + ', ' + ((-1 * maxHeight) / 2 + verticalPos) + ')'\n );\n const memberBBox = lbl?.getBBox();\n verticalPos += (memberBBox?.height ?? 0) + rowPadding;\n });\n\n rect\n .attr('style', node.style)\n .attr('class', 'outer title-state')\n .attr('x', -maxWidth / 2 - halfPadding)\n .attr('y', -(maxHeight / 2) - halfPadding)\n .attr('width', maxWidth + node.padding)\n .attr('height', maxHeight + node.padding);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function (point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst shapes = {\n rhombus: question,\n composite,\n question,\n rect,\n labelRect,\n rectWithTitle,\n choice,\n circle,\n doublecircle,\n stadium,\n hexagon,\n block_arrow,\n rect_left_inv_arrow,\n lean_right,\n lean_left,\n trapezoid,\n inv_trapezoid,\n rect_right_inv_arrow,\n cylinder,\n start,\n end,\n note,\n subroutine,\n fork: forkJoin,\n join: forkJoin,\n class_box,\n};\n\nlet nodeElems = {};\n\nexport const insertNode = async (elem, node, renderOptions) => {\n let newEl;\n let el;\n\n // Add link when appropriate\n if (node.link) {\n let target;\n if (getConfig().securityLevel === 'sandbox') {\n target = '_top';\n } else if (node.linkTarget) {\n target = node.linkTarget || '_blank';\n }\n newEl = elem.insert('svg:a').attr('xlink:href', node.link).attr('target', target);\n el = await shapes[node.shape](newEl, node, renderOptions);\n } else {\n el = await shapes[node.shape](elem, node, renderOptions);\n newEl = el;\n }\n if (node.tooltip) {\n el.attr('title', node.tooltip);\n }\n if (node.class) {\n el.attr('class', 'node default ' + node.class);\n }\n\n nodeElems[node.id] = newEl;\n\n if (node.haveCallback) {\n nodeElems[node.id].attr('class', nodeElems[node.id].attr('class') + ' clickable');\n }\n return newEl;\n};\nexport const setNodeElem = (elem, node) => {\n nodeElems[node.id] = elem;\n};\nexport const clear = () => {\n nodeElems = {};\n};\n\nexport const positionNode = (node) => {\n const el = nodeElems[node.id];\n log.trace(\n 'Transforming node',\n node.diff,\n node,\n 'translate(' + (node.x - node.width / 2 - 5) + ', ' + node.width / 2 + ')'\n );\n const padding = 8;\n const diff = node.diff || 0;\n if (node.clusterNode) {\n el.attr(\n 'transform',\n 'translate(' +\n (node.x + diff - node.width / 2) +\n ', ' +\n (node.y - node.height / 2 - padding) +\n ')'\n );\n } else {\n el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');\n }\n return diff;\n};\n", "import * as graphlib from 'dagre-d3-es/src/graphlib/index.js';\nimport { getConfig } from '../../config.js';\nimport { insertEdge, insertEdgeLabel, positionEdgeLabel } from '../../dagre-wrapper/edges.js';\nimport { insertNode, positionNode } from '../../dagre-wrapper/nodes.js';\nimport { getStylesFromArray } from '../../utils.js';\nimport type { BlockDB } from './blockDB.js';\nimport type { Block } from './blockTypes.js';\n\nfunction getNodeFromBlock(block: Block, db: BlockDB, positioned = false) {\n const vertex = block;\n\n let classStr = 'default';\n if ((vertex?.classes?.length || 0) > 0) {\n classStr = (vertex?.classes ?? []).join(' ');\n }\n classStr = classStr + ' flowchart-label';\n\n // We create a SVG label, either by delegating to addHtmlLabel or manually\n let radius = 0;\n let shape = '';\n let padding;\n // Set the shape based parameters\n switch (vertex.type) {\n case 'round':\n radius = 5;\n shape = 'rect';\n break;\n case 'composite':\n radius = 0;\n shape = 'composite';\n padding = 0;\n break;\n case 'square':\n shape = 'rect';\n break;\n case 'diamond':\n shape = 'question';\n break;\n case 'hexagon':\n shape = 'hexagon';\n break;\n case 'block_arrow':\n shape = 'block_arrow';\n break;\n case 'odd':\n shape = 'rect_left_inv_arrow';\n break;\n case 'lean_right':\n shape = 'lean_right';\n break;\n case 'lean_left':\n shape = 'lean_left';\n break;\n case 'trapezoid':\n shape = 'trapezoid';\n break;\n case 'inv_trapezoid':\n shape = 'inv_trapezoid';\n break;\n case 'rect_left_inv_arrow':\n shape = 'rect_left_inv_arrow';\n break;\n case 'circle':\n shape = 'circle';\n break;\n case 'ellipse':\n shape = 'ellipse';\n break;\n case 'stadium':\n shape = 'stadium';\n break;\n case 'subroutine':\n shape = 'subroutine';\n break;\n case 'cylinder':\n shape = 'cylinder';\n break;\n case 'group':\n shape = 'rect';\n break;\n case 'doublecircle':\n shape = 'doublecircle';\n break;\n default:\n shape = 'rect';\n }\n\n const styles = getStylesFromArray(vertex?.styles ?? []);\n\n // Use vertex id as text in the box if no text is provided by the graph definition\n const vertexText = vertex.label;\n\n const bounds = vertex.size ?? { width: 0, height: 0, x: 0, y: 0 };\n // Add the node\n const node = {\n labelStyle: styles.labelStyle,\n shape: shape,\n labelText: vertexText,\n rx: radius,\n ry: radius,\n class: classStr,\n style: styles.style,\n id: vertex.id,\n directions: vertex.directions,\n width: bounds.width,\n height: bounds.height,\n x: bounds.x,\n y: bounds.y,\n positioned,\n intersect: undefined,\n type: vertex.type,\n padding: padding ?? getConfig()?.block?.padding ?? 0,\n };\n return node;\n}\nasync function calculateBlockSize(\n elem: d3.Selection,\n block: any,\n db: any\n) {\n const node = getNodeFromBlock(block, db, false);\n if (node.type === 'group') {\n return;\n }\n\n // Add the element to the DOM to size it\n const config = getConfig();\n const nodeEl = await insertNode(elem, node, { config });\n const boundingBox = nodeEl.node().getBBox();\n const obj = db.getBlock(node.id);\n obj.size = { width: boundingBox.width, height: boundingBox.height, x: 0, y: 0, node: nodeEl };\n db.setBlock(obj);\n nodeEl.remove();\n}\ntype ActionFun = typeof calculateBlockSize;\n\nexport async function insertBlockPositioned(elem: any, block: Block, db: any) {\n const node = getNodeFromBlock(block, db, true);\n // Add the element to the DOM to size it\n const obj = db.getBlock(node.id);\n if (obj.type !== 'space') {\n const config = getConfig();\n await insertNode(elem, node, { config });\n block.intersect = node?.intersect;\n positionNode(node);\n }\n}\n\nexport async function performOperations(\n elem: d3.Selection,\n blocks: Block[],\n db: BlockDB,\n operation: ActionFun\n) {\n for (const block of blocks) {\n await operation(elem, block, db);\n if (block.children) {\n await performOperations(elem, block.children, db, operation);\n }\n }\n}\n\nexport async function calculateBlockSizes(elem: any, blocks: Block[], db: BlockDB) {\n await performOperations(elem, blocks, db, calculateBlockSize);\n}\n\nexport async function insertBlocks(\n elem: d3.Selection,\n blocks: Block[],\n db: BlockDB\n) {\n await performOperations(elem, blocks, db, insertBlockPositioned);\n}\n\nexport async function insertEdges(\n elem: any,\n edges: Block[],\n blocks: Block[],\n db: BlockDB,\n id: string\n) {\n const g = new graphlib.Graph({\n multigraph: true,\n compound: true,\n });\n g.setGraph({\n rankdir: 'TB',\n nodesep: 10,\n ranksep: 10,\n marginx: 8,\n marginy: 8,\n });\n\n for (const block of blocks) {\n if (block.size) {\n g.setNode(block.id, {\n width: block.size.width,\n height: block.size.height,\n intersect: block.intersect,\n });\n }\n }\n\n for (const edge of edges) {\n // elem, e, edge, clusterDb, diagramType, graph;\n if (edge.start && edge.end) {\n const startBlock = db.getBlock(edge.start);\n const endBlock = db.getBlock(edge.end);\n\n if (startBlock?.size && endBlock?.size) {\n const start = startBlock.size;\n const end = endBlock.size;\n const points = [\n { x: start.x, y: start.y },\n { x: start.x + (end.x - start.x) / 2, y: start.y + (end.y - start.y) / 2 },\n { x: end.x, y: end.y },\n ];\n // edge.points = points;\n insertEdge(\n elem,\n { v: edge.start, w: edge.end, name: edge.id },\n {\n ...edge,\n arrowTypeEnd: edge.arrowTypeEnd,\n arrowTypeStart: edge.arrowTypeStart,\n points,\n classes: 'edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1',\n },\n undefined,\n 'block',\n g,\n id\n );\n if (edge.label) {\n await insertEdgeLabel(elem, {\n ...edge,\n label: edge.label,\n labelStyle: 'stroke: #333; stroke-width: 1.5px;fill:none;',\n arrowTypeEnd: edge.arrowTypeEnd,\n arrowTypeStart: edge.arrowTypeStart,\n points,\n classes: 'edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1',\n });\n positionEdgeLabel(\n { ...edge, x: points[1].x, y: points[1].y },\n {\n originalPath: points,\n }\n );\n }\n }\n }\n }\n}\n", "import { select as d3select } from 'd3';\nimport type { Diagram } from '../../Diagram.js';\nimport * as configApi from '../../config.js';\nimport insertMarkers from '../../dagre-wrapper/markers.js';\nimport { log } from '../../logger.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\nimport type { BlockDB } from './blockDB.js';\nimport { layout } from './layout.js';\nimport { calculateBlockSizes, insertBlocks, insertEdges } from './renderHelpers.js';\n\nexport const getClasses = function (text: any, diagObj: any) {\n return diagObj.db.getClasses();\n};\n\nexport const draw = async function (\n text: string,\n id: string,\n _version: string,\n diagObj: Diagram\n): Promise {\n const { securityLevel, block: conf } = configApi.getConfig();\n const db = diagObj.db as BlockDB;\n let sandboxElement: any;\n if (securityLevel === 'sandbox') {\n sandboxElement = d3select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? d3select(sandboxElement.nodes()[0].contentDocument.body)\n : d3select('body');\n\n const svg =\n securityLevel === 'sandbox'\n ? root.select(`[id=\"${id}\"]`)\n : d3select(`[id=\"${id}\"]`);\n\n // Define the supported markers for the diagram\n const markers = ['point', 'circle', 'cross'];\n\n // Add the marker definitions to the svg as marker tags\n insertMarkers(svg, markers, diagObj.type, id);\n\n const bl = db.getBlocks();\n const blArr = db.getBlocksFlat();\n const edges = db.getEdges();\n\n const nodes = svg.insert('g').attr('class', 'block');\n await calculateBlockSizes(nodes, bl, db);\n const bounds = layout(db);\n await insertBlocks(nodes, bl, db);\n await insertEdges(nodes, edges, blArr, db, id);\n\n // Establish svg dimensions and get width and height\n // Why, oh why ????\n if (bounds) {\n const bounds2 = bounds;\n const magicFactor = Math.max(1, Math.round(0.125 * (bounds2.width / bounds2.height)));\n const height = bounds2.height + magicFactor + 10;\n const width = bounds2.width + 10;\n const { useMaxWidth } = conf!;\n configureSvgSize(svg, height, width, !!useMaxWidth);\n log.debug('Here Bounds', bounds, bounds2);\n svg.attr(\n 'viewBox',\n `${bounds2.x - 5} ${bounds2.y - 5} ${bounds2.width + 10} ${bounds2.height + 10}`\n );\n }\n};\n\nexport default {\n draw,\n getClasses,\n};\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: jison doesn't export types\nimport parser from './parser/block.jison';\nimport db from './blockDB.js';\nimport flowStyles from './styles.js';\nimport renderer from './blockRenderer.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles: flowStyles,\n};\n"], + "mappings": "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", + "names": ["parser", "o", "__name", "k", "v", "l", "$V0", "$V1", "$V2", "$V3", "$V4", "$V5", "$V6", "$V7", "$V8", "$V9", "$Va", "$Vb", "$Vc", "$Vd", "$Ve", "yytext", "yyleng", "yylineno", "yy", "yystate", "$$", "_$", "$0", "num", "spaceId", "edgeData", "id2", "id", "str", "hash", "error", "input", "self", "stack", "tstack", "vstack", "lstack", "table", "recovering", "TERROR", "EOF", "args", "lexer", "sharedState", "yyloc", "ranges", "popStack", "n", "lex", "token", "symbol", "preErrorSymbol", "state", "action", "a", "r", "yyval", "p", "len", "newState", "expected", "errStr", "ch", "lines", "oldLines", "past", "next", "pre", "c", "match", "indexed_rule", "backup", "tempMatch", "index", "rules", "i", "condition", "yy_", "$avoiding_name_collisions", "YY_START", "YYSTATE", "Parser", "block_default", "parser", "blockDatabase", "edgeList", "edgeCount", "COLOR_KEYWORD", "FILL_KEYWORD", "BG_FILL", "STYLECLASS_SEP", "config", "getConfig", "classes", "sanitizeText", "__name", "txt", "common_default", "addStyleClass", "id", "styleAttributes", "foundClass", "attrib", "fixedAttrib", "newStyle2", "addStyle2Node", "styles", "foundBlock", "setCssClass", "itemIds", "cssClassName", "trimmedId", "populateBlockDatabase", "_blockList", "parent", "blockList", "children", "column", "b", "block", "log", "count", "existingBlock", "w", "j", "newBlock", "clone_default", "blocks", "rootBlock", "clear", "typeStr2Type", "typeStr", "edgeTypeStr2Type", "edgeStrToEdgeData", "cnt", "generateId", "setHierarchy", "getColumns", "blockId", "getBlocksFlat", "getBlocks", "getEdges", "getBlock", "setBlock", "getLogger", "getClasses", "db", "blockDB_default", "fade", "__name", "color", "opacity", "channel", "channel_default", "r", "g", "b", "rgba_default", "getStyles", "options", "getIconStyles", "styles_default", "insertMarkers", "__name", "elem", "markerArray", "type", "id", "markerName", "markers", "extension", "log", "composition", "aggregation", "dependency", "lollipop", "point", "circle", "cross", "barb", "markers_default", "padding", "getConfig", "calculateBlockPosition", "columns", "position", "px", "py", "__name", "getMaxChildSize", "block", "maxWidth", "maxHeight", "child", "width", "height", "x", "y", "log", "setBlockSizes", "db", "siblingWidth", "siblingHeight", "childSize", "numItems", "xSize", "ySize", "childWidth", "childHeight", "num", "layoutBlocks", "widthOfChildren", "columnPos", "startingPosX", "rowPos", "parent", "halfWidth", "columnsFilled", "findBounds", "minX", "minY", "maxX", "maxY", "layout", "root", "applyStyle", "dom", "styleFn", "__name", "addHtmlLabel", "node", "config", "fo", "select_default", "div", "label", "labelClass", "span", "sanitizeText", "createLabel", "_vertexText", "style", "isTitle", "isNode", "vertexText", "getConfig", "evaluate", "log", "replaceIconSubstring", "decodeEntities", "svgLabel", "rows", "row", "tspan", "createLabel_default", "addEdgeMarkers", "__name", "svgPath", "edge", "url", "id", "diagramType", "addEdgeMarker", "arrowTypesMap", "position", "arrowType", "endMarkerType", "log", "suffix", "edgeLabels", "terminalLabels", "insertEdgeLabel", "__name", "elem", "edge", "config", "getConfig", "useHtmlLabels", "evaluate", "labelElement", "createText", "createLabel_default", "edgeLabel", "label", "bbox", "div", "dv", "select_default", "edgeLabels", "fo", "startLabelElement", "startEdgeLabelLeft", "inner", "slBox", "terminalLabels", "setTerminalWidth", "startEdgeLabelRight", "endLabelElement", "endEdgeLabelLeft", "endEdgeLabelRight", "value", "positionEdgeLabel", "paths", "log", "path", "siteConfig", "subGraphTitleTotalMargin", "getSubGraphTitleMargins", "el", "x", "y", "pos", "utils_default", "outsideNode", "node", "point", "dx", "dy", "w", "h", "intersection", "outsidePoint", "insidePoint", "r", "Q", "R", "q", "res", "_x", "_y", "cutPathAtIntersect", "_points", "boundaryNode", "points", "lastPointOutside", "isInside", "inter", "pointPresent", "p", "e", "insertEdge", "clusterDb", "diagramType", "graph", "id", "pointsHasChanged", "tail", "head", "lineData", "curve", "basis_default", "getLineFunctionsWithOffset", "lineFunction", "line_default", "strokeClasses", "svgPath", "url", "getUrl", "addEdgeMarkers", "expandAndDeduplicateDirections", "__name", "directions", "uniqueDirections", "direction", "getArrowPoints", "duplicatedDirections", "bbox", "node", "f", "height", "midpoint", "width", "padding", "intersectNode", "node", "point", "__name", "intersect_node_default", "intersectEllipse", "node", "rx", "ry", "point", "cx", "cy", "px", "py", "det", "dx", "dy", "__name", "intersect_ellipse_default", "intersectCircle", "node", "rx", "point", "intersect_ellipse_default", "__name", "intersect_circle_default", "intersectLine", "p1", "p2", "q1", "q2", "a1", "a2", "b1", "b2", "c1", "c2", "r1", "r2", "r3", "r4", "denom", "offset", "num", "x", "y", "sameSign", "__name", "intersect_line_default", "intersect_polygon_default", "intersectPolygon", "node", "polyPoints", "point", "x1", "y1", "intersections", "minX", "minY", "entry", "left", "top", "i", "p1", "p2", "intersect", "intersect_line_default", "p", "q", "pdx", "pdy", "distp", "qdx", "qdy", "distq", "__name", "intersectRect", "__name", "node", "point", "x", "y", "dx", "dy", "w", "h", "sx", "sy", "intersect_rect_default", "intersect_default", "intersect_node_default", "intersect_circle_default", "intersect_ellipse_default", "intersect_polygon_default", "intersect_rect_default", "labelHelper", "__name", "parent", "node", "_classes", "isNode", "config", "getConfig", "classes", "useHtmlLabels", "evaluate", "shapeSvg", "label", "labelText", "textNode", "text", "createText", "sanitizeText", "decodeEntities", "createLabel_default", "bbox", "halfPadding", "div", "dv", "select_default", "images", "noImgText", "img", "res", "setupImage", "bodyFontSize", "width", "updateNodeBounds", "element", "insertPolygonShape", "w", "h", "points", "d", "note", "__name", "parent", "node", "getConfig", "shapeSvg", "bbox", "halfPadding", "labelHelper", "log", "rect", "updateNodeBounds", "point", "intersect_default", "note_default", "formatClass", "__name", "str", "getClassesFromNode", "node", "otherClasses", "question", "parent", "shapeSvg", "bbox", "labelHelper", "w", "h", "s", "points", "log", "questionElem", "insertPolygonShape", "updateNodeBounds", "point", "intersect_default", "choice", "d", "hexagon", "f", "m", "hex", "block_arrow", "getArrowPoints", "blockArrow", "rect_left_inv_arrow", "lean_right", "el", "lean_left", "trapezoid", "inv_trapezoid", "rect_right_inv_arrow", "cylinder", "rx", "ry", "shape", "pos", "x", "y", "rect", "halfPadding", "totalWidth", "totalHeight", "propKeys", "applyNodePropertyBorders", "propKey", "composite", "labelRect", "borders", "strokeDashArray", "addBorder", "length", "skipBorder", "rectWithTitle", "classes", "innerLine", "label", "text2", "title", "text", "createLabel_default", "evaluate", "getConfig", "div", "dv", "select_default", "textRows", "titleBox", "descr", "stadium", "circle", "doublecircle", "gap", "circleGroup", "outerCircle", "innerCircle", "subroutine", "start", "forkJoin", "dir", "width", "height", "end", "class_box", "rowPadding", "lineHeight", "topLine", "bottomLine", "maxWidth", "maxHeight", "labelContainer", "verticalPos", "hasInterface", "interfaceLabelText", "interfaceLabel", "interfaceBBox", "classTitleString", "classTitleLabel", "classTitleBBox", "classAttributes", "member", "parsedInfo", "parsedText", "lbl", "classMethods", "displayText", "diffX", "memberBBox", "shapes", "note_default", "nodeElems", "insertNode", "elem", "renderOptions", "newEl", "target", "positionNode", "__name", "node", "el", "nodeElems", "log", "padding", "diff", "getNodeFromBlock", "block", "db", "positioned", "vertex", "classStr", "radius", "shape", "padding", "styles", "getStylesFromArray", "vertexText", "bounds", "getConfig", "__name", "calculateBlockSize", "elem", "node", "config", "nodeEl", "insertNode", "boundingBox", "obj", "insertBlockPositioned", "positionNode", "performOperations", "blocks", "operation", "calculateBlockSizes", "insertBlocks", "insertEdges", "edges", "id", "g", "Graph", "edge", "startBlock", "endBlock", "start", "end", "points", "insertEdge", "insertEdgeLabel", "positionEdgeLabel", "getClasses", "__name", "text", "diagObj", "draw", "id", "_version", "securityLevel", "conf", "getConfig", "db", "sandboxElement", "select_default", "root", "svg", "markers_default", "bl", "blArr", "edges", "nodes", "calculateBlockSizes", "bounds", "layout", "insertBlocks", "insertEdges", "bounds2", "magicFactor", "height", "width", "useMaxWidth", "configureSvgSize", "log", "blockRenderer_default", "diagram", "block_default", "blockDB_default", "blockRenderer_default", "styles_default"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/c4Diagram-Q5SP5FFD.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/c4Diagram-Q5SP5FFD.mjs new file mode 100644 index 0000000..2f98482 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/c4Diagram-Q5SP5FFD.mjs @@ -0,0 +1,10 @@ +import{a as ke,f as Ee}from"./chunk-WONJCSFZ.mjs";import{g as Ae,h as ie,i as wt}from"./chunk-EFRVIJHI.mjs";import{a as Ve}from"./chunk-THXVA4DE.mjs";import{D as St,L as be,P as ge,Q as xe,R as me,S as _e,W as vt,a as ye,w as ne}from"./chunk-KXVH62NG.mjs";import{b as ee,h as Pt}from"./chunk-63GW7ZVL.mjs";import"./chunk-A4ITRWGT.mjs";import{a as y,e as Fe}from"./chunk-GTKDMUJJ.mjs";var Mt=(function(){var e=y(function(xt,m,_,k){for(_=_||{},k=xt.length;k--;_[xt[k]]=m);return _},"o"),t=[1,24],s=[1,25],o=[1,26],l=[1,27],n=[1,28],a=[1,63],r=[1,64],i=[1,65],u=[1,66],d=[1,67],b=[1,68],p=[1,69],E=[1,29],T=[1,30],D=[1,31],P=[1,32],B=[1,33],j=[1,34],H=[1,35],q=[1,36],G=[1,37],K=[1,38],J=[1,39],Z=[1,40],$=[1,41],tt=[1,42],et=[1,43],nt=[1,44],it=[1,45],rt=[1,46],at=[1,47],st=[1,48],lt=[1,50],ot=[1,51],ct=[1,52],ht=[1,53],ut=[1,54],dt=[1,55],ft=[1,56],pt=[1,57],yt=[1,58],bt=[1,59],gt=[1,60],Ot=[14,42],Qt=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Rt=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],A=[1,82],C=[1,83],v=[1,84],w=[1,85],O=[12,14,42],he=[12,14,33,42],Yt=[12,14,33,42,76,77,79,80],kt=[12,33],Ht=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],qt={trace:y(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:y(function(m,_,k,g,R,h,Dt){var f=h.length-1;switch(R){case 3:g.setDirection("TB");break;case 4:g.setDirection("BT");break;case 5:g.setDirection("RL");break;case 6:g.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:g.setC4Type(h[f-3]);break;case 19:g.setTitle(h[f].substring(6)),this.$=h[f].substring(6);break;case 20:g.setAccDescription(h[f].substring(15)),this.$=h[f].substring(15);break;case 21:this.$=h[f].trim(),g.setTitle(this.$);break;case 22:case 23:this.$=h[f].trim(),g.setAccDescription(this.$);break;case 28:h[f].splice(2,0,"ENTERPRISE"),g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 29:h[f].splice(2,0,"SYSTEM"),g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 30:g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 31:h[f].splice(2,0,"CONTAINER"),g.addContainerBoundary(...h[f]),this.$=h[f];break;case 32:g.addDeploymentNode("node",...h[f]),this.$=h[f];break;case 33:g.addDeploymentNode("nodeL",...h[f]),this.$=h[f];break;case 34:g.addDeploymentNode("nodeR",...h[f]),this.$=h[f];break;case 35:g.popBoundaryParseStack();break;case 39:g.addPersonOrSystem("person",...h[f]),this.$=h[f];break;case 40:g.addPersonOrSystem("external_person",...h[f]),this.$=h[f];break;case 41:g.addPersonOrSystem("system",...h[f]),this.$=h[f];break;case 42:g.addPersonOrSystem("system_db",...h[f]),this.$=h[f];break;case 43:g.addPersonOrSystem("system_queue",...h[f]),this.$=h[f];break;case 44:g.addPersonOrSystem("external_system",...h[f]),this.$=h[f];break;case 45:g.addPersonOrSystem("external_system_db",...h[f]),this.$=h[f];break;case 46:g.addPersonOrSystem("external_system_queue",...h[f]),this.$=h[f];break;case 47:g.addContainer("container",...h[f]),this.$=h[f];break;case 48:g.addContainer("container_db",...h[f]),this.$=h[f];break;case 49:g.addContainer("container_queue",...h[f]),this.$=h[f];break;case 50:g.addContainer("external_container",...h[f]),this.$=h[f];break;case 51:g.addContainer("external_container_db",...h[f]),this.$=h[f];break;case 52:g.addContainer("external_container_queue",...h[f]),this.$=h[f];break;case 53:g.addComponent("component",...h[f]),this.$=h[f];break;case 54:g.addComponent("component_db",...h[f]),this.$=h[f];break;case 55:g.addComponent("component_queue",...h[f]),this.$=h[f];break;case 56:g.addComponent("external_component",...h[f]),this.$=h[f];break;case 57:g.addComponent("external_component_db",...h[f]),this.$=h[f];break;case 58:g.addComponent("external_component_queue",...h[f]),this.$=h[f];break;case 60:g.addRel("rel",...h[f]),this.$=h[f];break;case 61:g.addRel("birel",...h[f]),this.$=h[f];break;case 62:g.addRel("rel_u",...h[f]),this.$=h[f];break;case 63:g.addRel("rel_d",...h[f]),this.$=h[f];break;case 64:g.addRel("rel_l",...h[f]),this.$=h[f];break;case 65:g.addRel("rel_r",...h[f]),this.$=h[f];break;case 66:g.addRel("rel_b",...h[f]),this.$=h[f];break;case 67:h[f].splice(0,1),g.addRel("rel",...h[f]),this.$=h[f];break;case 68:g.updateElStyle("update_el_style",...h[f]),this.$=h[f];break;case 69:g.updateRelStyle("update_rel_style",...h[f]),this.$=h[f];break;case 70:g.updateLayoutConfig("update_layout_config",...h[f]),this.$=h[f];break;case 71:this.$=[h[f]];break;case 72:h[f].unshift(h[f-1]),this.$=h[f];break;case 73:case 75:this.$=h[f].trim();break;case 74:let Et={};Et[h[f-1].trim()]=h[f].trim(),this.$=Et;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:n,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:b,41:p,43:23,44:E,45:T,46:D,47:P,48:B,49:j,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:nt,60:it,61:rt,62:at,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:70,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:n,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:b,41:p,43:23,44:E,45:T,46:D,47:P,48:B,49:j,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:nt,60:it,61:rt,62:at,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:71,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:n,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:b,41:p,43:23,44:E,45:T,46:D,47:P,48:B,49:j,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:nt,60:it,61:rt,62:at,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:72,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:n,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:b,41:p,43:23,44:E,45:T,46:D,47:P,48:B,49:j,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:nt,60:it,61:rt,62:at,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:73,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:n,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:b,41:p,43:23,44:E,45:T,46:D,47:P,48:B,49:j,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:nt,60:it,61:rt,62:at,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{14:[1,74]},e(Ot,[2,13],{43:23,29:49,30:61,32:62,20:75,34:a,36:r,37:i,38:u,39:d,40:b,41:p,44:E,45:T,46:D,47:P,48:B,49:j,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:nt,60:it,61:rt,62:at,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt}),e(Ot,[2,14]),e(Qt,[2,16],{12:[1,76]}),e(Ot,[2,36],{12:[1,77]}),e(Rt,[2,19]),e(Rt,[2,20]),{25:[1,78]},{27:[1,79]},e(Rt,[2,23]),{35:80,75:81,76:A,77:C,79:v,80:w},{35:86,75:81,76:A,77:C,79:v,80:w},{35:87,75:81,76:A,77:C,79:v,80:w},{35:88,75:81,76:A,77:C,79:v,80:w},{35:89,75:81,76:A,77:C,79:v,80:w},{35:90,75:81,76:A,77:C,79:v,80:w},{35:91,75:81,76:A,77:C,79:v,80:w},{35:92,75:81,76:A,77:C,79:v,80:w},{35:93,75:81,76:A,77:C,79:v,80:w},{35:94,75:81,76:A,77:C,79:v,80:w},{35:95,75:81,76:A,77:C,79:v,80:w},{35:96,75:81,76:A,77:C,79:v,80:w},{35:97,75:81,76:A,77:C,79:v,80:w},{35:98,75:81,76:A,77:C,79:v,80:w},{35:99,75:81,76:A,77:C,79:v,80:w},{35:100,75:81,76:A,77:C,79:v,80:w},{35:101,75:81,76:A,77:C,79:v,80:w},{35:102,75:81,76:A,77:C,79:v,80:w},{35:103,75:81,76:A,77:C,79:v,80:w},{35:104,75:81,76:A,77:C,79:v,80:w},e(O,[2,59]),{35:105,75:81,76:A,77:C,79:v,80:w},{35:106,75:81,76:A,77:C,79:v,80:w},{35:107,75:81,76:A,77:C,79:v,80:w},{35:108,75:81,76:A,77:C,79:v,80:w},{35:109,75:81,76:A,77:C,79:v,80:w},{35:110,75:81,76:A,77:C,79:v,80:w},{35:111,75:81,76:A,77:C,79:v,80:w},{35:112,75:81,76:A,77:C,79:v,80:w},{35:113,75:81,76:A,77:C,79:v,80:w},{35:114,75:81,76:A,77:C,79:v,80:w},{35:115,75:81,76:A,77:C,79:v,80:w},{20:116,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:b,41:p,43:23,44:E,45:T,46:D,47:P,48:B,49:j,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:nt,60:it,61:rt,62:at,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{12:[1,118],33:[1,117]},{35:119,75:81,76:A,77:C,79:v,80:w},{35:120,75:81,76:A,77:C,79:v,80:w},{35:121,75:81,76:A,77:C,79:v,80:w},{35:122,75:81,76:A,77:C,79:v,80:w},{35:123,75:81,76:A,77:C,79:v,80:w},{35:124,75:81,76:A,77:C,79:v,80:w},{35:125,75:81,76:A,77:C,79:v,80:w},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},e(Ot,[2,15]),e(Qt,[2,17],{21:22,19:130,22:t,23:s,24:o,26:l,28:n}),e(Ot,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:t,23:s,24:o,26:l,28:n,34:a,36:r,37:i,38:u,39:d,40:b,41:p,44:E,45:T,46:D,47:P,48:B,49:j,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:nt,60:it,61:rt,62:at,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt}),e(Rt,[2,21]),e(Rt,[2,22]),e(O,[2,39]),e(he,[2,71],{75:81,35:132,76:A,77:C,79:v,80:w}),e(Yt,[2,73]),{78:[1,133]},e(Yt,[2,75]),e(Yt,[2,76]),e(O,[2,40]),e(O,[2,41]),e(O,[2,42]),e(O,[2,43]),e(O,[2,44]),e(O,[2,45]),e(O,[2,46]),e(O,[2,47]),e(O,[2,48]),e(O,[2,49]),e(O,[2,50]),e(O,[2,51]),e(O,[2,52]),e(O,[2,53]),e(O,[2,54]),e(O,[2,55]),e(O,[2,56]),e(O,[2,57]),e(O,[2,58]),e(O,[2,60]),e(O,[2,61]),e(O,[2,62]),e(O,[2,63]),e(O,[2,64]),e(O,[2,65]),e(O,[2,66]),e(O,[2,67]),e(O,[2,68]),e(O,[2,69]),e(O,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},e(kt,[2,28]),e(kt,[2,29]),e(kt,[2,30]),e(kt,[2,31]),e(kt,[2,32]),e(kt,[2,33]),e(kt,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},e(Qt,[2,18]),e(Ot,[2,38]),e(he,[2,72]),e(Yt,[2,74]),e(O,[2,24]),e(O,[2,35]),e(Ht,[2,25]),e(Ht,[2,26],{12:[1,138]}),e(Ht,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:y(function(m,_){if(_.recoverable)this.trace(m);else{var k=new Error(m);throw k.hash=_,k}},"parseError"),parse:y(function(m){var _=this,k=[0],g=[],R=[null],h=[],Dt=this.table,f="",Et=0,ue=0,de=0,Ye=2,fe=1,Ie=h.slice.call(arguments,1),S=Object.create(this.lexer),At={yy:{}};for(var Kt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Kt)&&(At.yy[Kt]=this.yy[Kt]);S.setInput(m,At.yy),At.yy.lexer=S,At.yy.parser=this,typeof S.yylloc>"u"&&(S.yylloc={});var Jt=S.yylloc;h.push(Jt);var je=S.options&&S.options.ranges;typeof At.yy.parseError=="function"?this.parseError=At.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function L0(Y){k.length=k.length-2*Y,R.length=R.length-Y,h.length=h.length-Y}y(L0,"popStack");function Ue(){var Y;return Y=g.pop()||S.lex()||fe,typeof Y!="number"&&(Y instanceof Array&&(g=Y,Y=g.pop()),Y=_.symbols_[Y]||Y),Y}y(Ue,"lex");for(var M,Zt,Ct,I,N0,$t,Tt={},It,W,pe,jt;;){if(Ct=k[k.length-1],this.defaultActions[Ct]?I=this.defaultActions[Ct]:((M===null||typeof M>"u")&&(M=Ue()),I=Dt[Ct]&&Dt[Ct][M]),typeof I>"u"||!I.length||!I[0]){var te="";jt=[];for(It in Dt[Ct])this.terminals_[It]&&It>Ye&&jt.push("'"+this.terminals_[It]+"'");S.showPosition?te="Parse error on line "+(Et+1)+`: +`+S.showPosition()+` +Expecting `+jt.join(", ")+", got '"+(this.terminals_[M]||M)+"'":te="Parse error on line "+(Et+1)+": Unexpected "+(M==fe?"end of input":"'"+(this.terminals_[M]||M)+"'"),this.parseError(te,{text:S.match,token:this.terminals_[M]||M,line:S.yylineno,loc:Jt,expected:jt})}if(I[0]instanceof Array&&I.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ct+", token: "+M);switch(I[0]){case 1:k.push(M),R.push(S.yytext),h.push(S.yylloc),k.push(I[1]),M=null,Zt?(M=Zt,Zt=null):(ue=S.yyleng,f=S.yytext,Et=S.yylineno,Jt=S.yylloc,de>0&&de--);break;case 2:if(W=this.productions_[I[1]][1],Tt.$=R[R.length-W],Tt._$={first_line:h[h.length-(W||1)].first_line,last_line:h[h.length-1].last_line,first_column:h[h.length-(W||1)].first_column,last_column:h[h.length-1].last_column},je&&(Tt._$.range=[h[h.length-(W||1)].range[0],h[h.length-1].range[1]]),$t=this.performAction.apply(Tt,[f,ue,Et,At.yy,I[1],R,h].concat(Ie)),typeof $t<"u")return $t;W&&(k=k.slice(0,-1*W*2),R=R.slice(0,-1*W),h=h.slice(0,-1*W)),k.push(this.productions_[I[1]][0]),R.push(Tt.$),h.push(Tt._$),pe=Dt[k[k.length-2]][k[k.length-1]],k.push(pe);break;case 3:return!0}}return!0},"parse")},Be=(function(){var xt={EOF:1,parseError:y(function(_,k){if(this.yy.parser)this.yy.parser.parseError(_,k);else throw new Error(_)},"parseError"),setInput:y(function(m,_){return this.yy=_||this.yy||{},this._input=m,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:y(function(){var m=this._input[0];this.yytext+=m,this.yyleng++,this.offset++,this.match+=m,this.matched+=m;var _=m.match(/(?:\r\n?|\n).*/g);return _?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),m},"input"),unput:y(function(m){var _=m.length,k=m.split(/(?:\r\n?|\n)/g);this._input=m+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-_),this.offset-=_;var g=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),k.length-1&&(this.yylineno-=k.length-1);var R=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:k?(k.length===g.length?this.yylloc.first_column:0)+g[g.length-k.length].length-k[0].length:this.yylloc.first_column-_},this.options.ranges&&(this.yylloc.range=[R[0],R[0]+this.yyleng-_]),this.yyleng=this.yytext.length,this},"unput"),more:y(function(){return this._more=!0,this},"more"),reject:y(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:y(function(m){this.unput(this.match.slice(m))},"less"),pastInput:y(function(){var m=this.matched.substr(0,this.matched.length-this.match.length);return(m.length>20?"...":"")+m.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:y(function(){var m=this.match;return m.length<20&&(m+=this._input.substr(0,20-m.length)),(m.substr(0,20)+(m.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:y(function(){var m=this.pastInput(),_=new Array(m.length+1).join("-");return m+this.upcomingInput()+` +`+_+"^"},"showPosition"),test_match:y(function(m,_){var k,g,R;if(this.options.backtrack_lexer&&(R={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(R.yylloc.range=this.yylloc.range.slice(0))),g=m[0].match(/(?:\r\n?|\n).*/g),g&&(this.yylineno+=g.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:g?g[g.length-1].length-g[g.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+m[0].length},this.yytext+=m[0],this.match+=m[0],this.matches=m,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(m[0].length),this.matched+=m[0],k=this.performAction.call(this,this.yy,this,_,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),k)return k;if(this._backtrack){for(var h in R)this[h]=R[h];return!1}return!1},"test_match"),next:y(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var m,_,k,g;this._more||(this.yytext="",this.match="");for(var R=this._currentRules(),h=0;h_[0].length)){if(_=k,g=h,this.options.backtrack_lexer){if(m=this.test_match(k,R[h]),m!==!1)return m;if(this._backtrack){_=!1;continue}else return!1}else if(!this.options.flex)break}return _?(m=this.test_match(_,R[g]),m!==!1?m:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:y(function(){var _=this.next();return _||this.lex()},"lex"),begin:y(function(_){this.conditionStack.push(_)},"begin"),popState:y(function(){var _=this.conditionStack.length-1;return _>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:y(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:y(function(_){return _=this.conditionStack.length-1-Math.abs(_||0),_>=0?this.conditionStack[_]:"INITIAL"},"topState"),pushState:y(function(_){this.begin(_)},"pushState"),stateStackSize:y(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:y(function(_,k,g,R){var h=R;switch(g){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),26;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:break;case 14:c;break;case 15:return 12;case 16:break;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;break;case 23:return this.begin("person"),44;break;case 24:return this.begin("system_ext_queue"),51;break;case 25:return this.begin("system_ext_db"),50;break;case 26:return this.begin("system_ext"),49;break;case 27:return this.begin("system_queue"),48;break;case 28:return this.begin("system_db"),47;break;case 29:return this.begin("system"),46;break;case 30:return this.begin("boundary"),37;break;case 31:return this.begin("enterprise_boundary"),34;break;case 32:return this.begin("system_boundary"),36;break;case 33:return this.begin("container_ext_queue"),57;break;case 34:return this.begin("container_ext_db"),56;break;case 35:return this.begin("container_ext"),55;break;case 36:return this.begin("container_queue"),54;break;case 37:return this.begin("container_db"),53;break;case 38:return this.begin("container"),52;break;case 39:return this.begin("container_boundary"),38;break;case 40:return this.begin("component_ext_queue"),63;break;case 41:return this.begin("component_ext_db"),62;break;case 42:return this.begin("component_ext"),61;break;case 43:return this.begin("component_queue"),60;break;case 44:return this.begin("component_db"),59;break;case 45:return this.begin("component"),58;break;case 46:return this.begin("node"),39;break;case 47:return this.begin("node"),39;break;case 48:return this.begin("node_l"),40;break;case 49:return this.begin("node_r"),41;break;case 50:return this.begin("rel"),64;break;case 51:return this.begin("birel"),65;break;case 52:return this.begin("rel_u"),66;break;case 53:return this.begin("rel_u"),66;break;case 54:return this.begin("rel_d"),67;break;case 55:return this.begin("rel_d"),67;break;case 56:return this.begin("rel_l"),68;break;case 57:return this.begin("rel_l"),68;break;case 58:return this.begin("rel_r"),69;break;case 59:return this.begin("rel_r"),69;break;case 60:return this.begin("rel_b"),70;break;case 61:return this.begin("rel_index"),71;break;case 62:return this.begin("update_el_style"),72;break;case 63:return this.begin("update_rel_style"),73;break;case 64:return this.begin("update_layout_config"),74;break;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";break;case 67:this.begin("attribute");break;case 68:this.popState(),this.popState();break;case 69:return 80;case 70:break;case 71:return 80;case 72:this.begin("string");break;case 73:this.popState();break;case 74:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";break;case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 79:this.popState(),this.popState();break;case 80:return"STR";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}};return xt})();qt.lexer=Be;function Gt(){this.yy={}}return y(Gt,"Parser"),Gt.prototype=qt,qt.Parser=Gt,new Gt})();Mt.parser=Mt;var Ce=Mt;var F=[],mt=[""],L="global",U="",X=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],Lt=[],re="",ae=!1,Ut=4,Ft=2,ve,ze=y(function(){return ve},"getC4Type"),Xe=y(function(e){ve=ne(e,vt())},"setC4Type"),We=y(function(e,t,s,o,l,n,a,r,i){if(e==null||t===void 0||t===null||s===void 0||s===null||o===void 0||o===null)return;let u={},d=Lt.find(b=>b.from===t&&b.to===s);if(d?u=d:Lt.push(u),u.type=e,u.from=t,u.to=s,u.label={text:o},l==null)u.techn={text:""};else if(typeof l=="object"){let[b,p]=Object.entries(l)[0];u[b]={text:p}}else u.techn={text:l};if(n==null)u.descr={text:""};else if(typeof n=="object"){let[b,p]=Object.entries(n)[0];u[b]={text:p}}else u.descr={text:n};if(typeof a=="object"){let[b,p]=Object.entries(a)[0];u[b]=p}else u.sprite=a;if(typeof r=="object"){let[b,p]=Object.entries(r)[0];u[b]=p}else u.tags=r;if(typeof i=="object"){let[b,p]=Object.entries(i)[0];u[b]=p}else u.link=i;u.wrap=_t()},"addRel"),Qe=y(function(e,t,s,o,l,n,a){if(t===null||s===null)return;let r={},i=F.find(u=>u.alias===t);if(i&&t===i.alias?r=i:(r.alias=t,F.push(r)),s==null?r.label={text:""}:r.label={text:s},o==null)r.descr={text:""};else if(typeof o=="object"){let[u,d]=Object.entries(o)[0];r[u]={text:d}}else r.descr={text:o};if(typeof l=="object"){let[u,d]=Object.entries(l)[0];r[u]=d}else r.sprite=l;if(typeof n=="object"){let[u,d]=Object.entries(n)[0];r[u]=d}else r.tags=n;if(typeof a=="object"){let[u,d]=Object.entries(a)[0];r[u]=d}else r.link=a;r.typeC4Shape={text:e},r.parentBoundary=L,r.wrap=_t()},"addPersonOrSystem"),He=y(function(e,t,s,o,l,n,a,r){if(t===null||s===null)return;let i={},u=F.find(d=>d.alias===t);if(u&&t===u.alias?i=u:(i.alias=t,F.push(i)),s==null?i.label={text:""}:i.label={text:s},o==null)i.techn={text:""};else if(typeof o=="object"){let[d,b]=Object.entries(o)[0];i[d]={text:b}}else i.techn={text:o};if(l==null)i.descr={text:""};else if(typeof l=="object"){let[d,b]=Object.entries(l)[0];i[d]={text:b}}else i.descr={text:l};if(typeof n=="object"){let[d,b]=Object.entries(n)[0];i[d]=b}else i.sprite=n;if(typeof a=="object"){let[d,b]=Object.entries(a)[0];i[d]=b}else i.tags=a;if(typeof r=="object"){let[d,b]=Object.entries(r)[0];i[d]=b}else i.link=r;i.wrap=_t(),i.typeC4Shape={text:e},i.parentBoundary=L},"addContainer"),qe=y(function(e,t,s,o,l,n,a,r){if(t===null||s===null)return;let i={},u=F.find(d=>d.alias===t);if(u&&t===u.alias?i=u:(i.alias=t,F.push(i)),s==null?i.label={text:""}:i.label={text:s},o==null)i.techn={text:""};else if(typeof o=="object"){let[d,b]=Object.entries(o)[0];i[d]={text:b}}else i.techn={text:o};if(l==null)i.descr={text:""};else if(typeof l=="object"){let[d,b]=Object.entries(l)[0];i[d]={text:b}}else i.descr={text:l};if(typeof n=="object"){let[d,b]=Object.entries(n)[0];i[d]=b}else i.sprite=n;if(typeof a=="object"){let[d,b]=Object.entries(a)[0];i[d]=b}else i.tags=a;if(typeof r=="object"){let[d,b]=Object.entries(r)[0];i[d]=b}else i.link=r;i.wrap=_t(),i.typeC4Shape={text:e},i.parentBoundary=L},"addComponent"),Ge=y(function(e,t,s,o,l){if(e===null||t===null)return;let n={},a=X.find(r=>r.alias===e);if(a&&e===a.alias?n=a:(n.alias=e,X.push(n)),t==null?n.label={text:""}:n.label={text:t},s==null)n.type={text:"system"};else if(typeof s=="object"){let[r,i]=Object.entries(s)[0];n[r]={text:i}}else n.type={text:s};if(typeof o=="object"){let[r,i]=Object.entries(o)[0];n[r]=i}else n.tags=o;if(typeof l=="object"){let[r,i]=Object.entries(l)[0];n[r]=i}else n.link=l;n.parentBoundary=L,n.wrap=_t(),U=L,L=e,mt.push(U)},"addPersonOrSystemBoundary"),Ke=y(function(e,t,s,o,l){if(e===null||t===null)return;let n={},a=X.find(r=>r.alias===e);if(a&&e===a.alias?n=a:(n.alias=e,X.push(n)),t==null?n.label={text:""}:n.label={text:t},s==null)n.type={text:"container"};else if(typeof s=="object"){let[r,i]=Object.entries(s)[0];n[r]={text:i}}else n.type={text:s};if(typeof o=="object"){let[r,i]=Object.entries(o)[0];n[r]=i}else n.tags=o;if(typeof l=="object"){let[r,i]=Object.entries(l)[0];n[r]=i}else n.link=l;n.parentBoundary=L,n.wrap=_t(),U=L,L=e,mt.push(U)},"addContainerBoundary"),Je=y(function(e,t,s,o,l,n,a,r){if(t===null||s===null)return;let i={},u=X.find(d=>d.alias===t);if(u&&t===u.alias?i=u:(i.alias=t,X.push(i)),s==null?i.label={text:""}:i.label={text:s},o==null)i.type={text:"node"};else if(typeof o=="object"){let[d,b]=Object.entries(o)[0];i[d]={text:b}}else i.type={text:o};if(l==null)i.descr={text:""};else if(typeof l=="object"){let[d,b]=Object.entries(l)[0];i[d]={text:b}}else i.descr={text:l};if(typeof a=="object"){let[d,b]=Object.entries(a)[0];i[d]=b}else i.tags=a;if(typeof r=="object"){let[d,b]=Object.entries(r)[0];i[d]=b}else i.link=r;i.nodeType=e,i.parentBoundary=L,i.wrap=_t(),U=L,L=t,mt.push(U)},"addDeploymentNode"),Ze=y(function(){L=U,mt.pop(),U=mt.pop(),mt.push(U)},"popBoundaryParseStack"),$e=y(function(e,t,s,o,l,n,a,r,i,u,d){let b=F.find(p=>p.alias===t);if(!(b===void 0&&(b=X.find(p=>p.alias===t),b===void 0))){if(s!=null)if(typeof s=="object"){let[p,E]=Object.entries(s)[0];b[p]=E}else b.bgColor=s;if(o!=null)if(typeof o=="object"){let[p,E]=Object.entries(o)[0];b[p]=E}else b.fontColor=o;if(l!=null)if(typeof l=="object"){let[p,E]=Object.entries(l)[0];b[p]=E}else b.borderColor=l;if(n!=null)if(typeof n=="object"){let[p,E]=Object.entries(n)[0];b[p]=E}else b.shadowing=n;if(a!=null)if(typeof a=="object"){let[p,E]=Object.entries(a)[0];b[p]=E}else b.shape=a;if(r!=null)if(typeof r=="object"){let[p,E]=Object.entries(r)[0];b[p]=E}else b.sprite=r;if(i!=null)if(typeof i=="object"){let[p,E]=Object.entries(i)[0];b[p]=E}else b.techn=i;if(u!=null)if(typeof u=="object"){let[p,E]=Object.entries(u)[0];b[p]=E}else b.legendText=u;if(d!=null)if(typeof d=="object"){let[p,E]=Object.entries(d)[0];b[p]=E}else b.legendSprite=d}},"updateElStyle"),t0=y(function(e,t,s,o,l,n,a){let r=Lt.find(i=>i.from===t&&i.to===s);if(r!==void 0){if(o!=null)if(typeof o=="object"){let[i,u]=Object.entries(o)[0];r[i]=u}else r.textColor=o;if(l!=null)if(typeof l=="object"){let[i,u]=Object.entries(l)[0];r[i]=u}else r.lineColor=l;if(n!=null)if(typeof n=="object"){let[i,u]=Object.entries(n)[0];r[i]=parseInt(u)}else r.offsetX=parseInt(n);if(a!=null)if(typeof a=="object"){let[i,u]=Object.entries(a)[0];r[i]=parseInt(u)}else r.offsetY=parseInt(a)}},"updateRelStyle"),e0=y(function(e,t,s){let o=Ut,l=Ft;if(typeof t=="object"){let n=Object.values(t)[0];o=parseInt(n)}else o=parseInt(t);if(typeof s=="object"){let n=Object.values(s)[0];l=parseInt(n)}else l=parseInt(s);o>=1&&(Ut=o),l>=1&&(Ft=l)},"updateLayoutConfig"),n0=y(function(){return Ut},"getC4ShapeInRow"),i0=y(function(){return Ft},"getC4BoundaryInRow"),r0=y(function(){return L},"getCurrentBoundaryParse"),a0=y(function(){return U},"getParentBoundaryParse"),we=y(function(e){return e==null?F:F.filter(t=>t.parentBoundary===e)},"getC4ShapeArray"),s0=y(function(e){return F.find(t=>t.alias===e)},"getC4Shape"),l0=y(function(e){return Object.keys(we(e))},"getC4ShapeKeys"),Oe=y(function(e){return e==null?X:X.filter(t=>t.parentBoundary===e)},"getBoundaries"),o0=Oe,c0=y(function(){return Lt},"getRels"),h0=y(function(){return re},"getTitle"),u0=y(function(e){ae=e},"setWrap"),_t=y(function(){return ae},"autoWrap"),d0=y(function(){F=[],X=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],U="",L="global",mt=[""],Lt=[],mt=[""],re="",ae=!1,Ut=4,Ft=2},"clear"),f0={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},p0={FILLED:0,OPEN:1},y0={LEFTOF:0,RIGHTOF:1,OVER:2},b0=y(function(e){re=ne(e,vt())},"setTitle"),Nt={addPersonOrSystem:Qe,addPersonOrSystemBoundary:Ge,addContainer:He,addContainerBoundary:Ke,addComponent:qe,addDeploymentNode:Je,popBoundaryParseStack:Ze,addRel:We,updateElStyle:$e,updateRelStyle:t0,updateLayoutConfig:e0,autoWrap:_t,setWrap:u0,getC4ShapeArray:we,getC4Shape:s0,getC4ShapeKeys:l0,getBoundaries:Oe,getBoundarys:o0,getCurrentBoundaryParse:r0,getParentBoundaryParse:a0,getRels:c0,getTitle:h0,getC4Type:ze,getC4ShapeInRow:n0,getC4BoundaryInRow:i0,setAccTitle:ge,getAccTitle:xe,getAccDescription:_e,setAccDescription:me,getConfig:y(()=>vt().c4,"getConfig"),clear:d0,LINETYPE:f0,ARROWTYPE:p0,PLACEMENT:y0,setTitle:b0,setC4Type:Xe};var Te=Fe(Ve(),1);var se=y(function(e,t){return ke(e,t)},"drawRect"),Re=y(function(e,t,s,o,l,n){let a=e.append("image");a.attr("width",t),a.attr("height",s),a.attr("x",o),a.attr("y",l);let r=n.startsWith("data:image/png;base64")?n:(0,Te.sanitizeUrl)(n);a.attr("xlink:href",r)},"drawImage"),g0=y((e,t,s)=>{let o=e.append("g"),l=0;for(let n of t){let a=n.textColor?n.textColor:"#444444",r=n.lineColor?n.lineColor:"#444444",i=n.offsetX?parseInt(n.offsetX):0,u=n.offsetY?parseInt(n.offsetY):0,d="";if(l===0){let p=o.append("line");p.attr("x1",n.startPoint.x),p.attr("y1",n.startPoint.y),p.attr("x2",n.endPoint.x),p.attr("y2",n.endPoint.y),p.attr("stroke-width","1"),p.attr("stroke",r),p.style("fill","none"),n.type!=="rel_b"&&p.attr("marker-end","url("+d+"#arrowhead)"),(n.type==="birel"||n.type==="rel_b")&&p.attr("marker-start","url("+d+"#arrowend)"),l=-1}else{let p=o.append("path");p.attr("fill","none").attr("stroke-width","1").attr("stroke",r).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",n.startPoint.x).replaceAll("starty",n.startPoint.y).replaceAll("controlx",n.startPoint.x+(n.endPoint.x-n.startPoint.x)/2-(n.endPoint.x-n.startPoint.x)/4).replaceAll("controly",n.startPoint.y+(n.endPoint.y-n.startPoint.y)/2).replaceAll("stopx",n.endPoint.x).replaceAll("stopy",n.endPoint.y)),n.type!=="rel_b"&&p.attr("marker-end","url("+d+"#arrowhead)"),(n.type==="birel"||n.type==="rel_b")&&p.attr("marker-start","url("+d+"#arrowend)")}let b=s.messageFont();Q(s)(n.label.text,o,Math.min(n.startPoint.x,n.endPoint.x)+Math.abs(n.endPoint.x-n.startPoint.x)/2+i,Math.min(n.startPoint.y,n.endPoint.y)+Math.abs(n.endPoint.y-n.startPoint.y)/2+u,n.label.width,n.label.height,{fill:a},b),n.techn&&n.techn.text!==""&&(b=s.messageFont(),Q(s)("["+n.techn.text+"]",o,Math.min(n.startPoint.x,n.endPoint.x)+Math.abs(n.endPoint.x-n.startPoint.x)/2+i,Math.min(n.startPoint.y,n.endPoint.y)+Math.abs(n.endPoint.y-n.startPoint.y)/2+s.messageFontSize+5+u,Math.max(n.label.width,n.techn.width),n.techn.height,{fill:a,"font-style":"italic"},b))}},"drawRels"),x0=y(function(e,t,s){let o=e.append("g"),l=t.bgColor?t.bgColor:"none",n=t.borderColor?t.borderColor:"#444444",a=t.fontColor?t.fontColor:"black",r={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};t.nodeType&&(r={"stroke-width":1});let i={x:t.x,y:t.y,fill:l,stroke:n,width:t.width,height:t.height,rx:2.5,ry:2.5,attrs:r};se(o,i);let u=s.boundaryFont();u.fontWeight="bold",u.fontSize=u.fontSize+2,u.fontColor=a,Q(s)(t.label.text,o,t.x,t.y+t.label.Y,t.width,t.height,{fill:"#444444"},u),t.type&&t.type.text!==""&&(u=s.boundaryFont(),u.fontColor=a,Q(s)(t.type.text,o,t.x,t.y+t.type.Y,t.width,t.height,{fill:"#444444"},u)),t.descr&&t.descr.text!==""&&(u=s.boundaryFont(),u.fontSize=u.fontSize-2,u.fontColor=a,Q(s)(t.descr.text,o,t.x,t.y+t.descr.Y,t.width,t.height,{fill:"#444444"},u))},"drawBoundary"),m0=y(function(e,t,s){let o=t.bgColor?t.bgColor:s[t.typeC4Shape.text+"_bg_color"],l=t.borderColor?t.borderColor:s[t.typeC4Shape.text+"_border_color"],n=t.fontColor?t.fontColor:"#FFFFFF",a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(t.typeC4Shape.text){case"person":a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=";break}let r=e.append("g");r.attr("class","person-man");let i=Ee();switch(t.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":i.x=t.x,i.y=t.y,i.fill=o,i.width=t.width,i.height=t.height,i.stroke=l,i.rx=2.5,i.ry=2.5,i.attrs={"stroke-width":.5},se(r,i);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":r.append("path").attr("fill",o).attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",t.x).replaceAll("starty",t.y).replaceAll("half",t.width/2).replaceAll("height",t.height)),r.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",t.x).replaceAll("starty",t.y).replaceAll("half",t.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":r.append("path").attr("fill",o).attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",t.x).replaceAll("starty",t.y).replaceAll("width",t.width).replaceAll("half",t.height/2)),r.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",t.x+t.width).replaceAll("starty",t.y).replaceAll("half",t.height/2));break}let u=T0(s,t.typeC4Shape.text);switch(r.append("text").attr("fill",n).attr("font-family",u.fontFamily).attr("font-size",u.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",t.typeC4Shape.width).attr("x",t.x+t.width/2-t.typeC4Shape.width/2).attr("y",t.y+t.typeC4Shape.Y).text("<<"+t.typeC4Shape.text+">>"),t.typeC4Shape.text){case"person":case"external_person":Re(r,48,48,t.x+t.width/2-24,t.y+t.image.Y,a);break}let d=s[t.typeC4Shape.text+"Font"]();return d.fontWeight="bold",d.fontSize=d.fontSize+2,d.fontColor=n,Q(s)(t.label.text,r,t.x,t.y+t.label.Y,t.width,t.height,{fill:n},d),d=s[t.typeC4Shape.text+"Font"](),d.fontColor=n,t.techn&&t.techn?.text!==""?Q(s)(t.techn.text,r,t.x,t.y+t.techn.Y,t.width,t.height,{fill:n,"font-style":"italic"},d):t.type&&t.type.text!==""&&Q(s)(t.type.text,r,t.x,t.y+t.type.Y,t.width,t.height,{fill:n,"font-style":"italic"},d),t.descr&&t.descr.text!==""&&(d=s.personFont(),d.fontColor=n,Q(s)(t.descr.text,r,t.x,t.y+t.descr.Y,t.width,t.height,{fill:n},d)),t.height},"drawC4Shape"),_0=y(function(e){e.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),k0=y(function(e){e.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),E0=y(function(e){e.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),A0=y(function(e){e.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},"insertArrowHead"),C0=y(function(e){e.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},"insertArrowEnd"),v0=y(function(e){e.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),w0=y(function(e){e.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertDynamicNumber"),O0=y(function(e){let s=e.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);s.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),s.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},"insertArrowCrossHead"),T0=y((e,t)=>({fontFamily:e[t+"FontFamily"],fontSize:e[t+"FontSize"],fontWeight:e[t+"FontWeight"]}),"getC4ShapeFont"),Q=(function(){function e(l,n,a,r,i,u,d){let b=n.append("text").attr("x",a+i/2).attr("y",r+u/2+5).style("text-anchor","middle").text(l);o(b,d)}y(e,"byText");function t(l,n,a,r,i,u,d,b){let{fontSize:p,fontFamily:E,fontWeight:T}=b,D=l.split(St.lineBreakRegex);for(let P=0;P=this.data.widthLimit||o>=this.data.widthLimit||this.nextData.cnt>Se)&&(s=this.nextData.startx+t.margin+x.nextLinePaddingX,l=this.nextData.stopy+t.margin*2,this.nextData.stopx=o=s+t.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=n=l+t.height,this.nextData.cnt=1),t.x=s,t.y=l,this.updateVal(this.data,"startx",s,Math.min),this.updateVal(this.data,"starty",l,Math.min),this.updateVal(this.data,"stopx",o,Math.max),this.updateVal(this.data,"stopy",n,Math.max),this.updateVal(this.nextData,"startx",s,Math.min),this.updateVal(this.nextData,"starty",l,Math.min),this.updateVal(this.nextData,"stopx",o,Math.max),this.updateVal(this.nextData,"stopy",n,Math.max)}init(t){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},oe(t.db.getConfig())}bumpLastMargin(t){this.data.stopx+=t,this.data.stopy+=t}},oe=y(function(e){ye(x,e),e.fontFamily&&(x.personFontFamily=x.systemFontFamily=x.messageFontFamily=e.fontFamily),e.fontSize&&(x.personFontSize=x.systemFontSize=x.messageFontSize=e.fontSize),e.fontWeight&&(x.personFontWeight=x.systemFontWeight=x.messageFontWeight=e.fontWeight)},"setConf"),Bt=y((e,t)=>({fontFamily:e[t+"FontFamily"],fontSize:e[t+"FontSize"],fontWeight:e[t+"FontWeight"]}),"c4ShapeFont"),Vt=y(e=>({fontFamily:e.boundaryFontFamily,fontSize:e.boundaryFontSize,fontWeight:e.boundaryFontWeight}),"boundaryFont"),R0=y(e=>({fontFamily:e.messageFontFamily,fontSize:e.messageFontSize,fontWeight:e.messageFontWeight}),"messageFont");function z(e,t,s,o,l){if(!t[e].width)if(s)t[e].text=Ae(t[e].text,l,o),t[e].textLines=t[e].text.split(St.lineBreakRegex).length,t[e].width=l,t[e].height=ie(t[e].text,o);else{let n=t[e].text.split(St.lineBreakRegex);t[e].textLines=n.length;let a=0;t[e].height=0,t[e].width=0;for(let r of n)t[e].width=Math.max(wt(r,o),t[e].width),a=ie(r,o),t[e].height=t[e].height+a}}y(z,"calcC4ShapeTextWH");var Pe=y(function(e,t,s){t.x=s.data.startx,t.y=s.data.starty,t.width=s.data.stopx-s.data.startx,t.height=s.data.stopy-s.data.starty,t.label.y=x.c4ShapeMargin-35;let o=t.wrap&&x.wrap,l=Vt(x);l.fontSize=l.fontSize+2,l.fontWeight="bold";let n=wt(t.label.text,l);z("label",t,o,l,n),V.drawBoundary(e,t,x)},"drawBoundary"),Me=y(function(e,t,s,o){let l=0;for(let n of o){l=0;let a=s[n],r=Bt(x,a.typeC4Shape.text);switch(r.fontSize=r.fontSize-2,a.typeC4Shape.width=wt("\xAB"+a.typeC4Shape.text+"\xBB",r),a.typeC4Shape.height=r.fontSize+2,a.typeC4Shape.Y=x.c4ShapePadding,l=a.typeC4Shape.Y+a.typeC4Shape.height-4,a.image={width:0,height:0,Y:0},a.typeC4Shape.text){case"person":case"external_person":a.image.width=48,a.image.height=48,a.image.Y=l,l=a.image.Y+a.image.height;break}a.sprite&&(a.image.width=48,a.image.height=48,a.image.Y=l,l=a.image.Y+a.image.height);let i=a.wrap&&x.wrap,u=x.width-x.c4ShapePadding*2,d=Bt(x,a.typeC4Shape.text);if(d.fontSize=d.fontSize+2,d.fontWeight="bold",z("label",a,i,d,u),a.label.Y=l+8,l=a.label.Y+a.label.height,a.type&&a.type.text!==""){a.type.text="["+a.type.text+"]";let E=Bt(x,a.typeC4Shape.text);z("type",a,i,E,u),a.type.Y=l+5,l=a.type.Y+a.type.height}else if(a.techn&&a.techn.text!==""){a.techn.text="["+a.techn.text+"]";let E=Bt(x,a.techn.text);z("techn",a,i,E,u),a.techn.Y=l+5,l=a.techn.Y+a.techn.height}let b=l,p=a.label.width;if(a.descr&&a.descr.text!==""){let E=Bt(x,a.typeC4Shape.text);z("descr",a,i,E,u),a.descr.Y=l+20,l=a.descr.Y+a.descr.height,p=Math.max(a.label.width,a.descr.width),b=l-a.descr.textLines*5}p=p+x.c4ShapePadding,a.width=Math.max(a.width||x.width,p,x.width),a.height=Math.max(a.height||x.height,b,x.height),a.margin=a.margin||x.c4ShapeMargin,e.insert(a),V.drawC4Shape(t,a,x)}e.bumpLastMargin(x.c4ShapeMargin)},"drawC4ShapeArray"),N=class{static{y(this,"Point")}constructor(t,s){this.x=t,this.y=s}},De=y(function(e,t){let s=e.x,o=e.y,l=t.x,n=t.y,a=s+e.width/2,r=o+e.height/2,i=Math.abs(s-l),u=Math.abs(o-n),d=u/i,b=e.height/e.width,p=null;return o==n&&sl?p=new N(s,r):s==l&&on&&(p=new N(a,o)),s>l&&o=d?p=new N(s,r+d*e.width/2):p=new N(a-i/u*e.height/2,o+e.height):s=d?p=new N(s+e.width,r+d*e.width/2):p=new N(a+i/u*e.height/2,o+e.height):sn?b>=d?p=new N(s+e.width,r-d*e.width/2):p=new N(a+e.height/2*i/u,o):s>l&&o>n&&(b>=d?p=new N(s,r-e.width/2*d):p=new N(a-e.height/2*i/u,o)),p},"getIntersectPoint"),D0=y(function(e,t){let s={x:0,y:0};s.x=t.x+t.width/2,s.y=t.y+t.height/2;let o=De(e,s);s.x=e.x+e.width/2,s.y=e.y+e.height/2;let l=De(t,s);return{startPoint:o,endPoint:l}},"getIntersectPoints"),S0=y(function(e,t,s,o){let l=0;for(let n of t){l=l+1;let a=n.wrap&&x.wrap,r=R0(x);o.db.getC4Type()==="C4Dynamic"&&(n.label.text=l+": "+n.label.text);let u=wt(n.label.text,r);z("label",n,a,r,u),n.techn&&n.techn.text!==""&&(u=wt(n.techn.text,r),z("techn",n,a,r,u)),n.descr&&n.descr.text!==""&&(u=wt(n.descr.text,r),z("descr",n,a,r,u));let d=s(n.from),b=s(n.to),p=D0(d,b);n.startPoint=p.startPoint,n.endPoint=p.endPoint}V.drawRels(e,t,x)},"drawRels");function Le(e,t,s,o,l){let n=new Wt(l);n.data.widthLimit=s.data.widthLimit/Math.min(le,o.length);for(let[a,r]of o.entries()){let i=0;r.image={width:0,height:0,Y:0},r.sprite&&(r.image.width=48,r.image.height=48,r.image.Y=i,i=r.image.Y+r.image.height);let u=r.wrap&&x.wrap,d=Vt(x);if(d.fontSize=d.fontSize+2,d.fontWeight="bold",z("label",r,u,d,n.data.widthLimit),r.label.Y=i+8,i=r.label.Y+r.label.height,r.type&&r.type.text!==""){r.type.text="["+r.type.text+"]";let T=Vt(x);z("type",r,u,T,n.data.widthLimit),r.type.Y=i+5,i=r.type.Y+r.type.height}if(r.descr&&r.descr.text!==""){let T=Vt(x);T.fontSize=T.fontSize-2,z("descr",r,u,T,n.data.widthLimit),r.descr.Y=i+20,i=r.descr.Y+r.descr.height}if(a==0||a%le===0){let T=s.data.startx+x.diagramMarginX,D=s.data.stopy+x.diagramMarginY+i;n.setData(T,T,D,D)}else{let T=n.data.stopx!==n.data.startx?n.data.stopx+x.diagramMarginX:n.data.startx,D=n.data.starty;n.setData(T,T,D,D)}n.name=r.alias;let b=l.db.getC4ShapeArray(r.alias),p=l.db.getC4ShapeKeys(r.alias);p.length>0&&Me(n,e,b,p),t=r.alias;let E=l.db.getBoundaries(t);E.length>0&&Le(e,t,n,E,l),r.alias!=="global"&&Pe(e,r,n),s.data.stopy=Math.max(n.data.stopy+x.c4ShapeMargin,s.data.stopy),s.data.stopx=Math.max(n.data.stopx+x.c4ShapeMargin,s.data.stopx),zt=Math.max(zt,s.data.stopx),Xt=Math.max(Xt,s.data.stopy)}}y(Le,"drawInsideBoundary");var P0=y(function(e,t,s,o){x=vt().c4;let l=vt().securityLevel,n;l==="sandbox"&&(n=Pt("#i"+t));let a=l==="sandbox"?Pt(n.nodes()[0].contentDocument.body):Pt("body"),r=o.db;o.db.setWrap(x.wrap),Se=r.getC4ShapeInRow(),le=r.getC4BoundaryInRow(),ee.debug(`C:${JSON.stringify(x,null,2)}`);let i=l==="sandbox"?a.select(`[id="${t}"]`):Pt(`[id="${t}"]`);V.insertComputerIcon(i),V.insertDatabaseIcon(i),V.insertClockIcon(i);let u=new Wt(o);u.setData(x.diagramMarginX,x.diagramMarginX,x.diagramMarginY,x.diagramMarginY),u.data.widthLimit=screen.availWidth,zt=x.diagramMarginX,Xt=x.diagramMarginY;let d=o.db.getTitle(),b=o.db.getBoundaries("");Le(i,"",u,b,o),V.insertArrowHead(i),V.insertArrowEnd(i),V.insertArrowCrossHead(i),V.insertArrowFilledHead(i),S0(i,o.db.getRels(),o.db.getC4Shape,o),u.data.stopx=zt,u.data.stopy=Xt;let p=u.data,T=p.stopy-p.starty+2*x.diagramMarginY,P=p.stopx-p.startx+2*x.diagramMarginX;d&&i.append("text").text(d).attr("x",(p.stopx-p.startx)/2-4*x.diagramMarginX).attr("y",p.starty+x.diagramMarginY),be(i,T,P,x.useMaxWidth);let B=d?60:0;i.attr("viewBox",p.startx-x.diagramMarginX+" -"+(x.diagramMarginY+B)+" "+P+" "+(T+B)),ee.debug("models:",p)},"draw"),ce={drawPersonOrSystemArray:Me,drawBoundary:Pe,setConf:oe,draw:P0};var M0=y(e=>`.person { + stroke: ${e.personBorder}; + fill: ${e.personBkg}; + } +`,"getStyles"),Ne=M0;var u1={parser:Ce,db:Nt,renderer:ce,styles:Ne,init:y(({c4:e,wrap:t})=>{ce.setConf(e),Nt.setWrap(t)},"init")};export{u1 as diagram}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/c4Diagram-Q5SP5FFD.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/c4Diagram-Q5SP5FFD.mjs.map new file mode 100644 index 0000000..82cb0b4 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/c4Diagram-Q5SP5FFD.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/c4/parser/c4Diagram.jison", "../../../src/diagrams/c4/c4Db.js", "../../../src/diagrams/c4/svgDraw.js", "../../../src/diagrams/c4/c4Renderer.js", "../../../src/diagrams/c4/styles.js", "../../../src/diagrams/c4/c4Diagram.ts"], + "sourcesContent": ["/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,24],$V1=[1,25],$V2=[1,26],$V3=[1,27],$V4=[1,28],$V5=[1,63],$V6=[1,64],$V7=[1,65],$V8=[1,66],$V9=[1,67],$Va=[1,68],$Vb=[1,69],$Vc=[1,29],$Vd=[1,30],$Ve=[1,31],$Vf=[1,32],$Vg=[1,33],$Vh=[1,34],$Vi=[1,35],$Vj=[1,36],$Vk=[1,37],$Vl=[1,38],$Vm=[1,39],$Vn=[1,40],$Vo=[1,41],$Vp=[1,42],$Vq=[1,43],$Vr=[1,44],$Vs=[1,45],$Vt=[1,46],$Vu=[1,47],$Vv=[1,48],$Vw=[1,50],$Vx=[1,51],$Vy=[1,52],$Vz=[1,53],$VA=[1,54],$VB=[1,55],$VC=[1,56],$VD=[1,57],$VE=[1,58],$VF=[1,59],$VG=[1,60],$VH=[14,42],$VI=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],$VJ=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],$VK=[1,82],$VL=[1,83],$VM=[1,84],$VN=[1,85],$VO=[12,14,42],$VP=[12,14,33,42],$VQ=[12,14,33,42,76,77,79,80],$VR=[12,33],$VS=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"mermaidDoc\":4,\"direction\":5,\"direction_tb\":6,\"direction_bt\":7,\"direction_rl\":8,\"direction_lr\":9,\"graphConfig\":10,\"C4_CONTEXT\":11,\"NEWLINE\":12,\"statements\":13,\"EOF\":14,\"C4_CONTAINER\":15,\"C4_COMPONENT\":16,\"C4_DYNAMIC\":17,\"C4_DEPLOYMENT\":18,\"otherStatements\":19,\"diagramStatements\":20,\"otherStatement\":21,\"title\":22,\"accDescription\":23,\"acc_title\":24,\"acc_title_value\":25,\"acc_descr\":26,\"acc_descr_value\":27,\"acc_descr_multiline_value\":28,\"boundaryStatement\":29,\"boundaryStartStatement\":30,\"boundaryStopStatement\":31,\"boundaryStart\":32,\"LBRACE\":33,\"ENTERPRISE_BOUNDARY\":34,\"attributes\":35,\"SYSTEM_BOUNDARY\":36,\"BOUNDARY\":37,\"CONTAINER_BOUNDARY\":38,\"NODE\":39,\"NODE_L\":40,\"NODE_R\":41,\"RBRACE\":42,\"diagramStatement\":43,\"PERSON\":44,\"PERSON_EXT\":45,\"SYSTEM\":46,\"SYSTEM_DB\":47,\"SYSTEM_QUEUE\":48,\"SYSTEM_EXT\":49,\"SYSTEM_EXT_DB\":50,\"SYSTEM_EXT_QUEUE\":51,\"CONTAINER\":52,\"CONTAINER_DB\":53,\"CONTAINER_QUEUE\":54,\"CONTAINER_EXT\":55,\"CONTAINER_EXT_DB\":56,\"CONTAINER_EXT_QUEUE\":57,\"COMPONENT\":58,\"COMPONENT_DB\":59,\"COMPONENT_QUEUE\":60,\"COMPONENT_EXT\":61,\"COMPONENT_EXT_DB\":62,\"COMPONENT_EXT_QUEUE\":63,\"REL\":64,\"BIREL\":65,\"REL_U\":66,\"REL_D\":67,\"REL_L\":68,\"REL_R\":69,\"REL_B\":70,\"REL_INDEX\":71,\"UPDATE_EL_STYLE\":72,\"UPDATE_REL_STYLE\":73,\"UPDATE_LAYOUT_CONFIG\":74,\"attribute\":75,\"STR\":76,\"STR_KEY\":77,\"STR_VALUE\":78,\"ATTRIBUTE\":79,\"ATTRIBUTE_EMPTY\":80,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",6:\"direction_tb\",7:\"direction_bt\",8:\"direction_rl\",9:\"direction_lr\",11:\"C4_CONTEXT\",12:\"NEWLINE\",14:\"EOF\",15:\"C4_CONTAINER\",16:\"C4_COMPONENT\",17:\"C4_DYNAMIC\",18:\"C4_DEPLOYMENT\",22:\"title\",23:\"accDescription\",24:\"acc_title\",25:\"acc_title_value\",26:\"acc_descr\",27:\"acc_descr_value\",28:\"acc_descr_multiline_value\",33:\"LBRACE\",34:\"ENTERPRISE_BOUNDARY\",36:\"SYSTEM_BOUNDARY\",37:\"BOUNDARY\",38:\"CONTAINER_BOUNDARY\",39:\"NODE\",40:\"NODE_L\",41:\"NODE_R\",42:\"RBRACE\",44:\"PERSON\",45:\"PERSON_EXT\",46:\"SYSTEM\",47:\"SYSTEM_DB\",48:\"SYSTEM_QUEUE\",49:\"SYSTEM_EXT\",50:\"SYSTEM_EXT_DB\",51:\"SYSTEM_EXT_QUEUE\",52:\"CONTAINER\",53:\"CONTAINER_DB\",54:\"CONTAINER_QUEUE\",55:\"CONTAINER_EXT\",56:\"CONTAINER_EXT_DB\",57:\"CONTAINER_EXT_QUEUE\",58:\"COMPONENT\",59:\"COMPONENT_DB\",60:\"COMPONENT_QUEUE\",61:\"COMPONENT_EXT\",62:\"COMPONENT_EXT_DB\",63:\"COMPONENT_EXT_QUEUE\",64:\"REL\",65:\"BIREL\",66:\"REL_U\",67:\"REL_D\",68:\"REL_L\",69:\"REL_R\",70:\"REL_B\",71:\"REL_INDEX\",72:\"UPDATE_EL_STYLE\",73:\"UPDATE_REL_STYLE\",74:\"UPDATE_LAYOUT_CONFIG\",76:\"STR\",77:\"STR_KEY\",78:\"STR_VALUE\",79:\"ATTRIBUTE\",80:\"ATTRIBUTE_EMPTY\"},\nproductions_: [0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 3:\n yy.setDirection('TB');\nbreak;\ncase 4:\n yy.setDirection('BT');\nbreak;\ncase 5:\n yy.setDirection('RL');\nbreak;\ncase 6:\n yy.setDirection('LR');\nbreak;\ncase 8: case 9: case 10: case 11: case 12:\nyy.setC4Type($$[$0-3])\nbreak;\ncase 19:\nyy.setTitle($$[$0].substring(6));this.$=$$[$0].substring(6);\nbreak;\ncase 20:\nyy.setAccDescription($$[$0].substring(15));this.$=$$[$0].substring(15);\nbreak;\ncase 21:\n this.$=$$[$0].trim();yy.setTitle(this.$); \nbreak;\ncase 22: case 23:\n this.$=$$[$0].trim();yy.setAccDescription(this.$); \nbreak;\ncase 28:\n$$[$0].splice(2, 0, 'ENTERPRISE'); yy.addPersonOrSystemBoundary(...$$[$0]); this.$=$$[$0];\nbreak;\ncase 29:\n$$[$0].splice(2, 0, 'SYSTEM'); yy.addPersonOrSystemBoundary(...$$[$0]); this.$=$$[$0];\nbreak;\ncase 30:\nyy.addPersonOrSystemBoundary(...$$[$0]); this.$=$$[$0];\nbreak;\ncase 31:\n$$[$0].splice(2, 0, 'CONTAINER'); yy.addContainerBoundary(...$$[$0]); this.$=$$[$0];\nbreak;\ncase 32:\nyy.addDeploymentNode('node', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 33:\nyy.addDeploymentNode('nodeL', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 34:\nyy.addDeploymentNode('nodeR', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 35:\n yy.popBoundaryParseStack() \nbreak;\ncase 39:\nyy.addPersonOrSystem('person', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 40:\nyy.addPersonOrSystem('external_person', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 41:\nyy.addPersonOrSystem('system', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 42:\nyy.addPersonOrSystem('system_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 43:\nyy.addPersonOrSystem('system_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 44:\nyy.addPersonOrSystem('external_system', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 45:\nyy.addPersonOrSystem('external_system_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 46:\nyy.addPersonOrSystem('external_system_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 47:\nyy.addContainer('container', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 48:\nyy.addContainer('container_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 49:\nyy.addContainer('container_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 50:\nyy.addContainer('external_container', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 51:\nyy.addContainer('external_container_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 52:\nyy.addContainer('external_container_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 53:\nyy.addComponent('component', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 54:\nyy.addComponent('component_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 55:\nyy.addComponent('component_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 56:\nyy.addComponent('external_component', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 57:\nyy.addComponent('external_component_db', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 58:\nyy.addComponent('external_component_queue', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 60:\nyy.addRel('rel', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 61:\nyy.addRel('birel', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 62:\nyy.addRel('rel_u', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 63:\nyy.addRel('rel_d', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 64:\nyy.addRel('rel_l', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 65:\nyy.addRel('rel_r', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 66:\nyy.addRel('rel_b', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 67:\n$$[$0].splice(0, 1); yy.addRel('rel', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 68:\nyy.updateElStyle('update_el_style', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 69:\nyy.updateRelStyle('update_rel_style', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 70:\nyy.updateLayoutConfig('update_layout_config', ...$$[$0]); this.$=$$[$0];\nbreak;\ncase 71:\n this.$ = [$$[$0]]; \nbreak;\ncase 72:\n $$[$0].unshift($$[$0-1]); this.$=$$[$0];\nbreak;\ncase 73: case 75:\n this.$ = $$[$0].trim(); \nbreak;\ncase 74:\n let kv={}; kv[$$[$0-1].trim()]=$$[$0].trim(); this.$=kv; \nbreak;\ncase 76:\n this.$ = \"\"; \nbreak;\n}\n},\ntable: [{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{13:70,19:20,20:21,21:22,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{13:71,19:20,20:21,21:22,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{13:72,19:20,20:21,21:22,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{13:73,19:20,20:21,21:22,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{14:[1,74]},o($VH,[2,13],{43:23,29:49,30:61,32:62,20:75,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG}),o($VH,[2,14]),o($VI,[2,16],{12:[1,76]}),o($VH,[2,36],{12:[1,77]}),o($VJ,[2,19]),o($VJ,[2,20]),{25:[1,78]},{27:[1,79]},o($VJ,[2,23]),{35:80,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:86,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:87,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:88,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:89,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:90,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:91,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:92,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:93,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:94,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:95,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:96,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:97,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:98,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:99,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:100,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:101,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:102,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:103,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:104,75:81,76:$VK,77:$VL,79:$VM,80:$VN},o($VO,[2,59]),{35:105,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:106,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:107,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:108,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:109,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:110,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:111,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:112,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:113,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:114,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:115,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{20:116,29:49,30:61,32:62,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,43:23,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG},{12:[1,118],33:[1,117]},{35:119,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:120,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:121,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:122,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:123,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:124,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{35:125,75:81,76:$VK,77:$VL,79:$VM,80:$VN},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},o($VH,[2,15]),o($VI,[2,17],{21:22,19:130,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4}),o($VH,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:$V0,23:$V1,24:$V2,26:$V3,28:$V4,34:$V5,36:$V6,37:$V7,38:$V8,39:$V9,40:$Va,41:$Vb,44:$Vc,45:$Vd,46:$Ve,47:$Vf,48:$Vg,49:$Vh,50:$Vi,51:$Vj,52:$Vk,53:$Vl,54:$Vm,55:$Vn,56:$Vo,57:$Vp,58:$Vq,59:$Vr,60:$Vs,61:$Vt,62:$Vu,63:$Vv,64:$Vw,65:$Vx,66:$Vy,67:$Vz,68:$VA,69:$VB,70:$VC,71:$VD,72:$VE,73:$VF,74:$VG}),o($VJ,[2,21]),o($VJ,[2,22]),o($VO,[2,39]),o($VP,[2,71],{75:81,35:132,76:$VK,77:$VL,79:$VM,80:$VN}),o($VQ,[2,73]),{78:[1,133]},o($VQ,[2,75]),o($VQ,[2,76]),o($VO,[2,40]),o($VO,[2,41]),o($VO,[2,42]),o($VO,[2,43]),o($VO,[2,44]),o($VO,[2,45]),o($VO,[2,46]),o($VO,[2,47]),o($VO,[2,48]),o($VO,[2,49]),o($VO,[2,50]),o($VO,[2,51]),o($VO,[2,52]),o($VO,[2,53]),o($VO,[2,54]),o($VO,[2,55]),o($VO,[2,56]),o($VO,[2,57]),o($VO,[2,58]),o($VO,[2,60]),o($VO,[2,61]),o($VO,[2,62]),o($VO,[2,63]),o($VO,[2,64]),o($VO,[2,65]),o($VO,[2,66]),o($VO,[2,67]),o($VO,[2,68]),o($VO,[2,69]),o($VO,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},o($VR,[2,28]),o($VR,[2,29]),o($VR,[2,30]),o($VR,[2,31]),o($VR,[2,32]),o($VR,[2,33]),o($VR,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},o($VI,[2,18]),o($VH,[2,38]),o($VP,[2,72]),o($VQ,[2,74]),o($VO,[2,24]),o($VO,[2,35]),o($VS,[2,25]),o($VS,[2,26],{12:[1,138]}),o($VS,[2,27])],\ndefaultActions: {2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 6;\nbreak;\ncase 1:return 7;\nbreak;\ncase 2:return 8;\nbreak;\ncase 3:return 9;\nbreak;\ncase 4:return 22;\nbreak;\ncase 5:return 23;\nbreak;\ncase 6: this.begin(\"acc_title\");return 24; \nbreak;\ncase 7: this.popState(); return \"acc_title_value\"; \nbreak;\ncase 8: this.begin(\"acc_descr\");return 26; \nbreak;\ncase 9: this.popState(); return \"acc_descr_value\"; \nbreak;\ncase 10: this.begin(\"acc_descr_multiline\");\nbreak;\ncase 11: this.popState(); \nbreak;\ncase 12:return \"acc_descr_multiline_value\";\nbreak;\ncase 13:/* skip comments */\nbreak;\ncase 14:c /* skip comments */\nbreak;\ncase 15:return 12;\nbreak;\ncase 16:/* skip whitespace */\nbreak;\ncase 17:return 11;\nbreak;\ncase 18:return 15;\nbreak;\ncase 19:return 16;\nbreak;\ncase 20:return 17;\nbreak;\ncase 21:return 18;\nbreak;\ncase 22: this.begin(\"person_ext\"); return 45;\nbreak;\ncase 23: this.begin(\"person\"); return 44;\nbreak;\ncase 24: this.begin(\"system_ext_queue\"); return 51;\nbreak;\ncase 25: this.begin(\"system_ext_db\"); return 50;\nbreak;\ncase 26: this.begin(\"system_ext\"); return 49;\nbreak;\ncase 27: this.begin(\"system_queue\"); return 48;\nbreak;\ncase 28: this.begin(\"system_db\"); return 47;\nbreak;\ncase 29: this.begin(\"system\"); return 46;\nbreak;\ncase 30: this.begin(\"boundary\"); return 37;\nbreak;\ncase 31: this.begin(\"enterprise_boundary\"); return 34;\nbreak;\ncase 32: this.begin(\"system_boundary\"); return 36;\nbreak;\ncase 33: this.begin(\"container_ext_queue\"); return 57;\nbreak;\ncase 34: this.begin(\"container_ext_db\"); return 56;\nbreak;\ncase 35: this.begin(\"container_ext\"); return 55;\nbreak;\ncase 36: this.begin(\"container_queue\"); return 54;\nbreak;\ncase 37: this.begin(\"container_db\"); return 53;\nbreak;\ncase 38: this.begin(\"container\"); return 52;\nbreak;\ncase 39: this.begin(\"container_boundary\"); return 38;\nbreak;\ncase 40: this.begin(\"component_ext_queue\"); return 63;\nbreak;\ncase 41: this.begin(\"component_ext_db\"); return 62;\nbreak;\ncase 42: this.begin(\"component_ext\"); return 61;\nbreak;\ncase 43: this.begin(\"component_queue\"); return 60;\nbreak;\ncase 44: this.begin(\"component_db\"); return 59;\nbreak;\ncase 45: this.begin(\"component\"); return 58;\nbreak;\ncase 46: this.begin(\"node\"); return 39;\nbreak;\ncase 47: this.begin(\"node\"); return 39;\nbreak;\ncase 48: this.begin(\"node_l\"); return 40;\nbreak;\ncase 49: this.begin(\"node_r\"); return 41;\nbreak;\ncase 50: this.begin(\"rel\"); return 64;\nbreak;\ncase 51: this.begin(\"birel\"); return 65;\nbreak;\ncase 52: this.begin(\"rel_u\"); return 66;\nbreak;\ncase 53: this.begin(\"rel_u\"); return 66;\nbreak;\ncase 54: this.begin(\"rel_d\"); return 67;\nbreak;\ncase 55: this.begin(\"rel_d\"); return 67;\nbreak;\ncase 56: this.begin(\"rel_l\"); return 68;\nbreak;\ncase 57: this.begin(\"rel_l\"); return 68;\nbreak;\ncase 58: this.begin(\"rel_r\"); return 69;\nbreak;\ncase 59: this.begin(\"rel_r\"); return 69;\nbreak;\ncase 60: this.begin(\"rel_b\"); return 70;\nbreak;\ncase 61: this.begin(\"rel_index\"); return 71;\nbreak;\ncase 62: this.begin(\"update_el_style\"); return 72;\nbreak;\ncase 63: this.begin(\"update_rel_style\"); return 73;\nbreak;\ncase 64: this.begin(\"update_layout_config\"); return 74;\nbreak;\ncase 65:return \"EOF_IN_STRUCT\";\nbreak;\ncase 66: this.begin(\"attribute\"); return \"ATTRIBUTE_EMPTY\";\nbreak;\ncase 67: this.begin(\"attribute\"); \nbreak;\ncase 68: this.popState();this.popState();\nbreak;\ncase 69: return 80;\nbreak;\ncase 70: \nbreak;\ncase 71: return 80;\nbreak;\ncase 72: this.begin(\"string\");\nbreak;\ncase 73: this.popState(); \nbreak;\ncase 74: return \"STR\";\nbreak;\ncase 75: this.begin(\"string_kv\");\nbreak;\ncase 76: this.begin(\"string_kv_key\"); return \"STR_KEY\";\nbreak;\ncase 77: this.popState(); this.begin(\"string_kv_value\"); \nbreak;\ncase 78: return \"STR_VALUE\";\nbreak;\ncase 79: this.popState(); this.popState(); \nbreak;\ncase 80: return \"STR\";\nbreak;\ncase 81: /* this.begin(\"lbrace\"); */ return \"LBRACE\";\nbreak;\ncase 82: /* this.popState(); */ return \"RBRACE\";\nbreak;\ncase 83:return 'SPACE';\nbreak;\ncase 84:return 'EOL';\nbreak;\ncase 85:return 14;\nbreak;\n}\n},\nrules: [/^(?:.*direction\\s+TB[^\\n]*)/,/^(?:.*direction\\s+BT[^\\n]*)/,/^(?:.*direction\\s+RL[^\\n]*)/,/^(?:.*direction\\s+LR[^\\n]*)/,/^(?:title\\s[^#\\n;]+)/,/^(?:accDescription\\s[^#\\n;]+)/,/^(?:accTitle\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*:\\s*)/,/^(?:(?!\\n||)*[^\\n]*)/,/^(?:accDescr\\s*\\{\\s*)/,/^(?:[\\}])/,/^(?:[^\\}]*)/,/^(?:%%(?!\\{)*[^\\n]*(\\r?\\n?)+)/,/^(?:%%[^\\n]*(\\r?\\n)*)/,/^(?:\\s*(\\r?\\n)+)/,/^(?:\\s+)/,/^(?:C4Context\\b)/,/^(?:C4Container\\b)/,/^(?:C4Component\\b)/,/^(?:C4Dynamic\\b)/,/^(?:C4Deployment\\b)/,/^(?:Person_Ext\\b)/,/^(?:Person\\b)/,/^(?:SystemQueue_Ext\\b)/,/^(?:SystemDb_Ext\\b)/,/^(?:System_Ext\\b)/,/^(?:SystemQueue\\b)/,/^(?:SystemDb\\b)/,/^(?:System\\b)/,/^(?:Boundary\\b)/,/^(?:Enterprise_Boundary\\b)/,/^(?:System_Boundary\\b)/,/^(?:ContainerQueue_Ext\\b)/,/^(?:ContainerDb_Ext\\b)/,/^(?:Container_Ext\\b)/,/^(?:ContainerQueue\\b)/,/^(?:ContainerDb\\b)/,/^(?:Container\\b)/,/^(?:Container_Boundary\\b)/,/^(?:ComponentQueue_Ext\\b)/,/^(?:ComponentDb_Ext\\b)/,/^(?:Component_Ext\\b)/,/^(?:ComponentQueue\\b)/,/^(?:ComponentDb\\b)/,/^(?:Component\\b)/,/^(?:Deployment_Node\\b)/,/^(?:Node\\b)/,/^(?:Node_L\\b)/,/^(?:Node_R\\b)/,/^(?:Rel\\b)/,/^(?:BiRel\\b)/,/^(?:Rel_Up\\b)/,/^(?:Rel_U\\b)/,/^(?:Rel_Down\\b)/,/^(?:Rel_D\\b)/,/^(?:Rel_Left\\b)/,/^(?:Rel_L\\b)/,/^(?:Rel_Right\\b)/,/^(?:Rel_R\\b)/,/^(?:Rel_Back\\b)/,/^(?:RelIndex\\b)/,/^(?:UpdateElementStyle\\b)/,/^(?:UpdateRelStyle\\b)/,/^(?:UpdateLayoutConfig\\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*[\"][\"])/,/^(?:[ ]*[\"])/,/^(?:[\"])/,/^(?:[^\"]*)/,/^(?:[ ]*[\\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*[\"])/,/^(?:[^\"]+)/,/^(?:[\"])/,/^(?:[^,]+)/,/^(?:\\{)/,/^(?:\\})/,/^(?:[\\s]+)/,/^(?:[\\n\\r]+)/,/^(?:$)/],\nconditions: {\"acc_descr_multiline\":{\"rules\":[11,12],\"inclusive\":false},\"acc_descr\":{\"rules\":[9],\"inclusive\":false},\"acc_title\":{\"rules\":[7],\"inclusive\":false},\"string_kv_value\":{\"rules\":[78,79],\"inclusive\":false},\"string_kv_key\":{\"rules\":[77],\"inclusive\":false},\"string_kv\":{\"rules\":[76],\"inclusive\":false},\"string\":{\"rules\":[73,74],\"inclusive\":false},\"attribute\":{\"rules\":[68,69,70,71,72,75,80],\"inclusive\":false},\"update_layout_config\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"update_rel_style\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"update_el_style\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_b\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_r\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_l\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_d\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_u\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"rel_bi\":{\"rules\":[],\"inclusive\":false},\"rel\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"node_r\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"node_l\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"node\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"index\":{\"rules\":[],\"inclusive\":false},\"rel_index\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"component_ext_queue\":{\"rules\":[],\"inclusive\":false},\"component_ext_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"component_ext\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"component_queue\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"component_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"component\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_boundary\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_ext_queue\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_ext_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_ext\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_queue\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"container\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"birel\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_boundary\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"enterprise_boundary\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"boundary\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_ext_queue\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_ext_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_ext\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_queue\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system_db\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"system\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"person_ext\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"person\":{\"rules\":[65,66,67,68],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})(); \n\tparser.parser = parser;\n\texport { parser };\n\texport default parser;\n\t", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { sanitizeText } from '../common/common.js';\nimport {\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n} from '../common/commonDb.js';\n\nlet c4ShapeArray = [];\nlet boundaryParseStack = [''];\nlet currentBoundaryParse = 'global';\nlet parentBoundaryParse = '';\nlet boundaries = [\n {\n alias: 'global',\n label: { text: 'global' },\n type: { text: 'global' },\n tags: null,\n link: null,\n parentBoundary: '',\n },\n];\nlet rels = [];\nlet title = '';\nlet wrapEnabled = false;\nlet c4ShapeInRow = 4;\nlet c4BoundaryInRow = 2;\nvar c4Type;\n\nexport const getC4Type = function () {\n return c4Type;\n};\n\nexport const setC4Type = function (c4TypeParam) {\n let sanitizedText = sanitizeText(c4TypeParam, getConfig());\n c4Type = sanitizedText;\n};\n\n//type, from, to, label, ?techn, ?descr, ?sprite, ?tags, $link\nexport const addRel = function (type, from, to, label, techn, descr, sprite, tags, link) {\n // Don't allow label nulling\n if (\n type === undefined ||\n type === null ||\n from === undefined ||\n from === null ||\n to === undefined ||\n to === null ||\n label === undefined ||\n label === null\n ) {\n return;\n }\n\n let rel = {};\n const old = rels.find((rel) => rel.from === from && rel.to === to);\n if (old) {\n rel = old;\n } else {\n rels.push(rel);\n }\n\n rel.type = type;\n rel.from = from;\n rel.to = to;\n rel.label = { text: label };\n\n if (techn === undefined || techn === null) {\n rel.techn = { text: '' };\n } else {\n if (typeof techn === 'object') {\n let [key, value] = Object.entries(techn)[0];\n rel[key] = { text: value };\n } else {\n rel.techn = { text: techn };\n }\n }\n\n if (descr === undefined || descr === null) {\n rel.descr = { text: '' };\n } else {\n if (typeof descr === 'object') {\n let [key, value] = Object.entries(descr)[0];\n rel[key] = { text: value };\n } else {\n rel.descr = { text: descr };\n }\n }\n\n if (typeof sprite === 'object') {\n let [key, value] = Object.entries(sprite)[0];\n rel[key] = value;\n } else {\n rel.sprite = sprite;\n }\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n rel[key] = value;\n } else {\n rel.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n rel[key] = value;\n } else {\n rel.link = link;\n }\n rel.wrap = autoWrap();\n};\n\n//type, alias, label, ?descr, ?sprite, ?tags, $link\nexport const addPersonOrSystem = function (typeC4Shape, alias, label, descr, sprite, tags, link) {\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let personOrSystem = {};\n const old = c4ShapeArray.find((personOrSystem) => personOrSystem.alias === alias);\n if (old && alias === old.alias) {\n personOrSystem = old;\n } else {\n personOrSystem.alias = alias;\n c4ShapeArray.push(personOrSystem);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n personOrSystem.label = { text: '' };\n } else {\n personOrSystem.label = { text: label };\n }\n\n if (descr === undefined || descr === null) {\n personOrSystem.descr = { text: '' };\n } else {\n if (typeof descr === 'object') {\n let [key, value] = Object.entries(descr)[0];\n personOrSystem[key] = { text: value };\n } else {\n personOrSystem.descr = { text: descr };\n }\n }\n\n if (typeof sprite === 'object') {\n let [key, value] = Object.entries(sprite)[0];\n personOrSystem[key] = value;\n } else {\n personOrSystem.sprite = sprite;\n }\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n personOrSystem[key] = value;\n } else {\n personOrSystem.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n personOrSystem[key] = value;\n } else {\n personOrSystem.link = link;\n }\n personOrSystem.typeC4Shape = { text: typeC4Shape };\n personOrSystem.parentBoundary = currentBoundaryParse;\n personOrSystem.wrap = autoWrap();\n};\n\n//type, alias, label, ?techn, ?descr ?sprite, ?tags, $link\nexport const addContainer = function (typeC4Shape, alias, label, techn, descr, sprite, tags, link) {\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let container = {};\n const old = c4ShapeArray.find((container) => container.alias === alias);\n if (old && alias === old.alias) {\n container = old;\n } else {\n container.alias = alias;\n c4ShapeArray.push(container);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n container.label = { text: '' };\n } else {\n container.label = { text: label };\n }\n\n if (techn === undefined || techn === null) {\n container.techn = { text: '' };\n } else {\n if (typeof techn === 'object') {\n let [key, value] = Object.entries(techn)[0];\n container[key] = { text: value };\n } else {\n container.techn = { text: techn };\n }\n }\n\n if (descr === undefined || descr === null) {\n container.descr = { text: '' };\n } else {\n if (typeof descr === 'object') {\n let [key, value] = Object.entries(descr)[0];\n container[key] = { text: value };\n } else {\n container.descr = { text: descr };\n }\n }\n\n if (typeof sprite === 'object') {\n let [key, value] = Object.entries(sprite)[0];\n container[key] = value;\n } else {\n container.sprite = sprite;\n }\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n container[key] = value;\n } else {\n container.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n container[key] = value;\n } else {\n container.link = link;\n }\n container.wrap = autoWrap();\n container.typeC4Shape = { text: typeC4Shape };\n container.parentBoundary = currentBoundaryParse;\n};\n\n//type, alias, label, ?techn, ?descr ?sprite, ?tags, $link\nexport const addComponent = function (typeC4Shape, alias, label, techn, descr, sprite, tags, link) {\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let component = {};\n const old = c4ShapeArray.find((component) => component.alias === alias);\n if (old && alias === old.alias) {\n component = old;\n } else {\n component.alias = alias;\n c4ShapeArray.push(component);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n component.label = { text: '' };\n } else {\n component.label = { text: label };\n }\n\n if (techn === undefined || techn === null) {\n component.techn = { text: '' };\n } else {\n if (typeof techn === 'object') {\n let [key, value] = Object.entries(techn)[0];\n component[key] = { text: value };\n } else {\n component.techn = { text: techn };\n }\n }\n\n if (descr === undefined || descr === null) {\n component.descr = { text: '' };\n } else {\n if (typeof descr === 'object') {\n let [key, value] = Object.entries(descr)[0];\n component[key] = { text: value };\n } else {\n component.descr = { text: descr };\n }\n }\n\n if (typeof sprite === 'object') {\n let [key, value] = Object.entries(sprite)[0];\n component[key] = value;\n } else {\n component.sprite = sprite;\n }\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n component[key] = value;\n } else {\n component.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n component[key] = value;\n } else {\n component.link = link;\n }\n component.wrap = autoWrap();\n component.typeC4Shape = { text: typeC4Shape };\n component.parentBoundary = currentBoundaryParse;\n};\n\n//alias, label, ?type, ?tags, $link\nexport const addPersonOrSystemBoundary = function (alias, label, type, tags, link) {\n // if (parentBoundary === null) return;\n\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let boundary = {};\n const old = boundaries.find((boundary) => boundary.alias === alias);\n if (old && alias === old.alias) {\n boundary = old;\n } else {\n boundary.alias = alias;\n boundaries.push(boundary);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n boundary.label = { text: '' };\n } else {\n boundary.label = { text: label };\n }\n\n if (type === undefined || type === null) {\n boundary.type = { text: 'system' };\n } else {\n if (typeof type === 'object') {\n let [key, value] = Object.entries(type)[0];\n boundary[key] = { text: value };\n } else {\n boundary.type = { text: type };\n }\n }\n\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n boundary[key] = value;\n } else {\n boundary.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n boundary[key] = value;\n } else {\n boundary.link = link;\n }\n boundary.parentBoundary = currentBoundaryParse;\n boundary.wrap = autoWrap();\n\n parentBoundaryParse = currentBoundaryParse;\n currentBoundaryParse = alias;\n boundaryParseStack.push(parentBoundaryParse);\n};\n\n//alias, label, ?type, ?tags, $link\nexport const addContainerBoundary = function (alias, label, type, tags, link) {\n // if (parentBoundary === null) return;\n\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let boundary = {};\n const old = boundaries.find((boundary) => boundary.alias === alias);\n if (old && alias === old.alias) {\n boundary = old;\n } else {\n boundary.alias = alias;\n boundaries.push(boundary);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n boundary.label = { text: '' };\n } else {\n boundary.label = { text: label };\n }\n\n if (type === undefined || type === null) {\n boundary.type = { text: 'container' };\n } else {\n if (typeof type === 'object') {\n let [key, value] = Object.entries(type)[0];\n boundary[key] = { text: value };\n } else {\n boundary.type = { text: type };\n }\n }\n\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n boundary[key] = value;\n } else {\n boundary.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n boundary[key] = value;\n } else {\n boundary.link = link;\n }\n boundary.parentBoundary = currentBoundaryParse;\n boundary.wrap = autoWrap();\n\n parentBoundaryParse = currentBoundaryParse;\n currentBoundaryParse = alias;\n boundaryParseStack.push(parentBoundaryParse);\n};\n\n//alias, label, ?type, ?descr, ?sprite, ?tags, $link\nexport const addDeploymentNode = function (\n nodeType,\n alias,\n label,\n type,\n descr,\n sprite,\n tags,\n link\n) {\n // if (parentBoundary === null) return;\n\n // Don't allow label nulling\n if (alias === null || label === null) {\n return;\n }\n\n let boundary = {};\n const old = boundaries.find((boundary) => boundary.alias === alias);\n if (old && alias === old.alias) {\n boundary = old;\n } else {\n boundary.alias = alias;\n boundaries.push(boundary);\n }\n\n // Don't allow null labels, either\n if (label === undefined || label === null) {\n boundary.label = { text: '' };\n } else {\n boundary.label = { text: label };\n }\n\n if (type === undefined || type === null) {\n boundary.type = { text: 'node' };\n } else {\n if (typeof type === 'object') {\n let [key, value] = Object.entries(type)[0];\n boundary[key] = { text: value };\n } else {\n boundary.type = { text: type };\n }\n }\n\n if (descr === undefined || descr === null) {\n boundary.descr = { text: '' };\n } else {\n if (typeof descr === 'object') {\n let [key, value] = Object.entries(descr)[0];\n boundary[key] = { text: value };\n } else {\n boundary.descr = { text: descr };\n }\n }\n\n if (typeof tags === 'object') {\n let [key, value] = Object.entries(tags)[0];\n boundary[key] = value;\n } else {\n boundary.tags = tags;\n }\n if (typeof link === 'object') {\n let [key, value] = Object.entries(link)[0];\n boundary[key] = value;\n } else {\n boundary.link = link;\n }\n boundary.nodeType = nodeType;\n boundary.parentBoundary = currentBoundaryParse;\n boundary.wrap = autoWrap();\n\n parentBoundaryParse = currentBoundaryParse;\n currentBoundaryParse = alias;\n boundaryParseStack.push(parentBoundaryParse);\n};\n\nexport const popBoundaryParseStack = function () {\n currentBoundaryParse = parentBoundaryParse;\n boundaryParseStack.pop();\n parentBoundaryParse = boundaryParseStack.pop();\n boundaryParseStack.push(parentBoundaryParse);\n};\n\n//elementName, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?techn, ?legendText, ?legendSprite\nexport const updateElStyle = function (\n typeC4Shape,\n elementName,\n bgColor,\n fontColor,\n borderColor,\n shadowing,\n shape,\n sprite,\n techn,\n legendText,\n legendSprite\n) {\n let old = c4ShapeArray.find((element) => element.alias === elementName);\n if (old === undefined) {\n old = boundaries.find((element) => element.alias === elementName);\n if (old === undefined) {\n return;\n }\n }\n if (bgColor !== undefined && bgColor !== null) {\n if (typeof bgColor === 'object') {\n let [key, value] = Object.entries(bgColor)[0];\n old[key] = value;\n } else {\n old.bgColor = bgColor;\n }\n }\n if (fontColor !== undefined && fontColor !== null) {\n if (typeof fontColor === 'object') {\n let [key, value] = Object.entries(fontColor)[0];\n old[key] = value;\n } else {\n old.fontColor = fontColor;\n }\n }\n if (borderColor !== undefined && borderColor !== null) {\n if (typeof borderColor === 'object') {\n let [key, value] = Object.entries(borderColor)[0];\n old[key] = value;\n } else {\n old.borderColor = borderColor;\n }\n }\n if (shadowing !== undefined && shadowing !== null) {\n if (typeof shadowing === 'object') {\n let [key, value] = Object.entries(shadowing)[0];\n old[key] = value;\n } else {\n old.shadowing = shadowing;\n }\n }\n if (shape !== undefined && shape !== null) {\n if (typeof shape === 'object') {\n let [key, value] = Object.entries(shape)[0];\n old[key] = value;\n } else {\n old.shape = shape;\n }\n }\n if (sprite !== undefined && sprite !== null) {\n if (typeof sprite === 'object') {\n let [key, value] = Object.entries(sprite)[0];\n old[key] = value;\n } else {\n old.sprite = sprite;\n }\n }\n if (techn !== undefined && techn !== null) {\n if (typeof techn === 'object') {\n let [key, value] = Object.entries(techn)[0];\n old[key] = value;\n } else {\n old.techn = techn;\n }\n }\n if (legendText !== undefined && legendText !== null) {\n if (typeof legendText === 'object') {\n let [key, value] = Object.entries(legendText)[0];\n old[key] = value;\n } else {\n old.legendText = legendText;\n }\n }\n if (legendSprite !== undefined && legendSprite !== null) {\n if (typeof legendSprite === 'object') {\n let [key, value] = Object.entries(legendSprite)[0];\n old[key] = value;\n } else {\n old.legendSprite = legendSprite;\n }\n }\n};\n\n//textColor, lineColor, ?offsetX, ?offsetY\nexport const updateRelStyle = function (\n typeC4Shape,\n from,\n to,\n textColor,\n lineColor,\n offsetX,\n offsetY\n) {\n const old = rels.find((rel) => rel.from === from && rel.to === to);\n if (old === undefined) {\n return;\n }\n if (textColor !== undefined && textColor !== null) {\n if (typeof textColor === 'object') {\n let [key, value] = Object.entries(textColor)[0];\n old[key] = value;\n } else {\n old.textColor = textColor;\n }\n }\n if (lineColor !== undefined && lineColor !== null) {\n if (typeof lineColor === 'object') {\n let [key, value] = Object.entries(lineColor)[0];\n old[key] = value;\n } else {\n old.lineColor = lineColor;\n }\n }\n if (offsetX !== undefined && offsetX !== null) {\n if (typeof offsetX === 'object') {\n let [key, value] = Object.entries(offsetX)[0];\n old[key] = parseInt(value);\n } else {\n old.offsetX = parseInt(offsetX);\n }\n }\n if (offsetY !== undefined && offsetY !== null) {\n if (typeof offsetY === 'object') {\n let [key, value] = Object.entries(offsetY)[0];\n old[key] = parseInt(value);\n } else {\n old.offsetY = parseInt(offsetY);\n }\n }\n};\n\n//?c4ShapeInRow, ?c4BoundaryInRow\nexport const updateLayoutConfig = function (typeC4Shape, c4ShapeInRowParam, c4BoundaryInRowParam) {\n let c4ShapeInRowValue = c4ShapeInRow;\n let c4BoundaryInRowValue = c4BoundaryInRow;\n\n if (typeof c4ShapeInRowParam === 'object') {\n const value = Object.values(c4ShapeInRowParam)[0];\n c4ShapeInRowValue = parseInt(value);\n } else {\n c4ShapeInRowValue = parseInt(c4ShapeInRowParam);\n }\n if (typeof c4BoundaryInRowParam === 'object') {\n const value = Object.values(c4BoundaryInRowParam)[0];\n c4BoundaryInRowValue = parseInt(value);\n } else {\n c4BoundaryInRowValue = parseInt(c4BoundaryInRowParam);\n }\n\n if (c4ShapeInRowValue >= 1) {\n c4ShapeInRow = c4ShapeInRowValue;\n }\n if (c4BoundaryInRowValue >= 1) {\n c4BoundaryInRow = c4BoundaryInRowValue;\n }\n};\n\nexport const getC4ShapeInRow = function () {\n return c4ShapeInRow;\n};\nexport const getC4BoundaryInRow = function () {\n return c4BoundaryInRow;\n};\nexport const getCurrentBoundaryParse = function () {\n return currentBoundaryParse;\n};\n\nexport const getParentBoundaryParse = function () {\n return parentBoundaryParse;\n};\n\nexport const getC4ShapeArray = function (parentBoundary) {\n if (parentBoundary === undefined || parentBoundary === null) {\n return c4ShapeArray;\n } else {\n return c4ShapeArray.filter((personOrSystem) => {\n return personOrSystem.parentBoundary === parentBoundary;\n });\n }\n};\nexport const getC4Shape = function (alias) {\n return c4ShapeArray.find((personOrSystem) => personOrSystem.alias === alias);\n};\nexport const getC4ShapeKeys = function (parentBoundary) {\n return Object.keys(getC4ShapeArray(parentBoundary));\n};\n\nexport const getBoundaries = function (parentBoundary) {\n if (parentBoundary === undefined || parentBoundary === null) {\n return boundaries;\n } else {\n return boundaries.filter((boundary) => boundary.parentBoundary === parentBoundary);\n }\n};\n\n// cspell:ignore getBoundarys\n/**\n * @deprecated Use {@link getBoundaries} instead\n */\nexport const getBoundarys = getBoundaries;\n\nexport const getRels = function () {\n return rels;\n};\n\nexport const getTitle = function () {\n return title;\n};\n\nexport const setWrap = function (wrapSetting) {\n wrapEnabled = wrapSetting;\n};\n\nexport const autoWrap = function () {\n return wrapEnabled;\n};\n\nexport const clear = function () {\n c4ShapeArray = [];\n boundaries = [\n {\n alias: 'global',\n label: { text: 'global' },\n type: { text: 'global' },\n tags: null,\n link: null,\n parentBoundary: '',\n },\n ];\n parentBoundaryParse = '';\n currentBoundaryParse = 'global';\n boundaryParseStack = [''];\n rels = [];\n\n boundaryParseStack = [''];\n title = '';\n wrapEnabled = false;\n c4ShapeInRow = 4;\n c4BoundaryInRow = 2;\n};\n\nexport const LINETYPE = {\n SOLID: 0,\n DOTTED: 1,\n NOTE: 2,\n SOLID_CROSS: 3,\n DOTTED_CROSS: 4,\n SOLID_OPEN: 5,\n DOTTED_OPEN: 6,\n LOOP_START: 10,\n LOOP_END: 11,\n ALT_START: 12,\n ALT_ELSE: 13,\n ALT_END: 14,\n OPT_START: 15,\n OPT_END: 16,\n ACTIVE_START: 17,\n ACTIVE_END: 18,\n PAR_START: 19,\n PAR_AND: 20,\n PAR_END: 21,\n RECT_START: 22,\n RECT_END: 23,\n SOLID_POINT: 24,\n DOTTED_POINT: 25,\n};\n\nexport const ARROWTYPE = {\n FILLED: 0,\n OPEN: 1,\n};\n\nexport const PLACEMENT = {\n LEFTOF: 0,\n RIGHTOF: 1,\n OVER: 2,\n};\n\nexport const setTitle = function (txt) {\n let sanitizedText = sanitizeText(txt, getConfig());\n title = sanitizedText;\n};\n\nexport default {\n addPersonOrSystem,\n addPersonOrSystemBoundary,\n addContainer,\n addContainerBoundary,\n addComponent,\n addDeploymentNode,\n popBoundaryParseStack,\n addRel,\n updateElStyle,\n updateRelStyle,\n updateLayoutConfig,\n autoWrap,\n setWrap,\n getC4ShapeArray,\n getC4Shape,\n getC4ShapeKeys,\n getBoundaries,\n getBoundarys,\n getCurrentBoundaryParse,\n getParentBoundaryParse,\n getRels,\n getTitle,\n getC4Type,\n getC4ShapeInRow,\n getC4BoundaryInRow,\n setAccTitle,\n getAccTitle,\n getAccDescription,\n setAccDescription,\n getConfig: () => getConfig().c4,\n clear,\n LINETYPE,\n ARROWTYPE,\n PLACEMENT,\n setTitle,\n setC4Type,\n // apply,\n};\n", "import common from '../common/common.js';\nimport * as svgDrawCommon from '../common/svgDrawCommon.js';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\n\nexport const drawRect = function (elem, rectData) {\n return svgDrawCommon.drawRect(elem, rectData);\n};\n\nexport const drawImage = function (elem, width, height, x, y, link) {\n const imageElem = elem.append('image');\n imageElem.attr('width', width);\n imageElem.attr('height', height);\n imageElem.attr('x', x);\n imageElem.attr('y', y);\n let sanitizedLink = link.startsWith('data:image/png;base64') ? link : sanitizeUrl(link);\n imageElem.attr('xlink:href', sanitizedLink);\n};\n\nexport const drawRels = (elem, rels, conf) => {\n const relsElem = elem.append('g');\n let i = 0;\n for (let rel of rels) {\n let textColor = rel.textColor ? rel.textColor : '#444444';\n let strokeColor = rel.lineColor ? rel.lineColor : '#444444';\n let offsetX = rel.offsetX ? parseInt(rel.offsetX) : 0;\n let offsetY = rel.offsetY ? parseInt(rel.offsetY) : 0;\n\n let url = '';\n if (i === 0) {\n let line = relsElem.append('line');\n line.attr('x1', rel.startPoint.x);\n line.attr('y1', rel.startPoint.y);\n line.attr('x2', rel.endPoint.x);\n line.attr('y2', rel.endPoint.y);\n\n line.attr('stroke-width', '1');\n line.attr('stroke', strokeColor);\n line.style('fill', 'none');\n if (rel.type !== 'rel_b') {\n line.attr('marker-end', 'url(' + url + '#arrowhead)');\n }\n if (rel.type === 'birel' || rel.type === 'rel_b') {\n line.attr('marker-start', 'url(' + url + '#arrowend)');\n }\n i = -1;\n } else {\n let line = relsElem.append('path');\n line\n .attr('fill', 'none')\n .attr('stroke-width', '1')\n .attr('stroke', strokeColor)\n .attr(\n 'd',\n 'Mstartx,starty Qcontrolx,controly stopx,stopy '\n .replaceAll('startx', rel.startPoint.x)\n .replaceAll('starty', rel.startPoint.y)\n .replaceAll(\n 'controlx',\n rel.startPoint.x +\n (rel.endPoint.x - rel.startPoint.x) / 2 -\n (rel.endPoint.x - rel.startPoint.x) / 4\n )\n .replaceAll('controly', rel.startPoint.y + (rel.endPoint.y - rel.startPoint.y) / 2)\n .replaceAll('stopx', rel.endPoint.x)\n .replaceAll('stopy', rel.endPoint.y)\n );\n if (rel.type !== 'rel_b') {\n line.attr('marker-end', 'url(' + url + '#arrowhead)');\n }\n if (rel.type === 'birel' || rel.type === 'rel_b') {\n line.attr('marker-start', 'url(' + url + '#arrowend)');\n }\n }\n\n let messageConf = conf.messageFont();\n _drawTextCandidateFunc(conf)(\n rel.label.text,\n relsElem,\n Math.min(rel.startPoint.x, rel.endPoint.x) +\n Math.abs(rel.endPoint.x - rel.startPoint.x) / 2 +\n offsetX,\n Math.min(rel.startPoint.y, rel.endPoint.y) +\n Math.abs(rel.endPoint.y - rel.startPoint.y) / 2 +\n offsetY,\n rel.label.width,\n rel.label.height,\n { fill: textColor },\n messageConf\n );\n\n if (rel.techn && rel.techn.text !== '') {\n messageConf = conf.messageFont();\n _drawTextCandidateFunc(conf)(\n '[' + rel.techn.text + ']',\n relsElem,\n Math.min(rel.startPoint.x, rel.endPoint.x) +\n Math.abs(rel.endPoint.x - rel.startPoint.x) / 2 +\n offsetX,\n Math.min(rel.startPoint.y, rel.endPoint.y) +\n Math.abs(rel.endPoint.y - rel.startPoint.y) / 2 +\n conf.messageFontSize +\n 5 +\n offsetY,\n Math.max(rel.label.width, rel.techn.width),\n rel.techn.height,\n { fill: textColor, 'font-style': 'italic' },\n messageConf\n );\n }\n }\n};\n\n/**\n * Draws a boundary in the diagram\n *\n * @param {any} elem - The diagram we'll draw to.\n * @param {any} boundary - The boundary to draw.\n * @param {any} conf - DrawText implementation discriminator object\n */\nconst drawBoundary = function (elem, boundary, conf) {\n const boundaryElem = elem.append('g');\n\n let fillColor = boundary.bgColor ? boundary.bgColor : 'none';\n let strokeColor = boundary.borderColor ? boundary.borderColor : '#444444';\n let fontColor = boundary.fontColor ? boundary.fontColor : 'black';\n\n let attrsValue = { 'stroke-width': 1.0, 'stroke-dasharray': '7.0,7.0' };\n if (boundary.nodeType) {\n attrsValue = { 'stroke-width': 1.0 };\n }\n let rectData = {\n x: boundary.x,\n y: boundary.y,\n fill: fillColor,\n stroke: strokeColor,\n width: boundary.width,\n height: boundary.height,\n rx: 2.5,\n ry: 2.5,\n attrs: attrsValue,\n };\n\n drawRect(boundaryElem, rectData);\n\n // draw label\n let boundaryConf = conf.boundaryFont();\n boundaryConf.fontWeight = 'bold';\n boundaryConf.fontSize = boundaryConf.fontSize + 2;\n boundaryConf.fontColor = fontColor;\n _drawTextCandidateFunc(conf)(\n boundary.label.text,\n boundaryElem,\n boundary.x,\n boundary.y + boundary.label.Y,\n boundary.width,\n boundary.height,\n { fill: '#444444' },\n boundaryConf\n );\n\n // draw type\n if (boundary.type && boundary.type.text !== '') {\n boundaryConf = conf.boundaryFont();\n boundaryConf.fontColor = fontColor;\n _drawTextCandidateFunc(conf)(\n boundary.type.text,\n boundaryElem,\n boundary.x,\n boundary.y + boundary.type.Y,\n boundary.width,\n boundary.height,\n { fill: '#444444' },\n boundaryConf\n );\n }\n\n // draw descr\n if (boundary.descr && boundary.descr.text !== '') {\n boundaryConf = conf.boundaryFont();\n boundaryConf.fontSize = boundaryConf.fontSize - 2;\n boundaryConf.fontColor = fontColor;\n _drawTextCandidateFunc(conf)(\n boundary.descr.text,\n boundaryElem,\n boundary.x,\n boundary.y + boundary.descr.Y,\n boundary.width,\n boundary.height,\n { fill: '#444444' },\n boundaryConf\n );\n }\n};\n\nexport const drawC4Shape = function (elem, c4Shape, conf) {\n let fillColor = c4Shape.bgColor ? c4Shape.bgColor : conf[c4Shape.typeC4Shape.text + '_bg_color'];\n let strokeColor = c4Shape.borderColor\n ? c4Shape.borderColor\n : conf[c4Shape.typeC4Shape.text + '_border_color'];\n let fontColor = c4Shape.fontColor ? c4Shape.fontColor : '#FFFFFF';\n\n let personImg =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=';\n switch (c4Shape.typeC4Shape.text) {\n case 'person':\n personImg =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=';\n break;\n case 'external_person':\n personImg =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=';\n break;\n }\n\n const c4ShapeElem = elem.append('g');\n c4ShapeElem.attr('class', 'person-man');\n\n // \n // draw rect of c4Shape\n const rect = svgDrawCommon.getNoteRect();\n\n switch (c4Shape.typeC4Shape.text) {\n case 'person':\n case 'external_person':\n case 'system':\n case 'external_system':\n case 'container':\n case 'external_container':\n case 'component':\n case 'external_component':\n rect.x = c4Shape.x;\n rect.y = c4Shape.y;\n rect.fill = fillColor;\n rect.width = c4Shape.width;\n rect.height = c4Shape.height;\n rect.stroke = strokeColor;\n rect.rx = 2.5;\n rect.ry = 2.5;\n rect.attrs = { 'stroke-width': 0.5 };\n drawRect(c4ShapeElem, rect);\n break;\n case 'system_db':\n case 'external_system_db':\n case 'container_db':\n case 'external_container_db':\n case 'component_db':\n case 'external_component_db':\n c4ShapeElem\n .append('path')\n .attr('fill', fillColor)\n .attr('stroke-width', '0.5')\n .attr('stroke', strokeColor)\n .attr(\n 'd',\n 'Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height'\n .replaceAll('startx', c4Shape.x)\n .replaceAll('starty', c4Shape.y)\n .replaceAll('half', c4Shape.width / 2)\n .replaceAll('height', c4Shape.height)\n );\n c4ShapeElem\n .append('path')\n .attr('fill', 'none')\n .attr('stroke-width', '0.5')\n .attr('stroke', strokeColor)\n .attr(\n 'd',\n 'Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10'\n .replaceAll('startx', c4Shape.x)\n .replaceAll('starty', c4Shape.y)\n .replaceAll('half', c4Shape.width / 2)\n );\n break;\n case 'system_queue':\n case 'external_system_queue':\n case 'container_queue':\n case 'external_container_queue':\n case 'component_queue':\n case 'external_component_queue':\n c4ShapeElem\n .append('path')\n .attr('fill', fillColor)\n .attr('stroke-width', '0.5')\n .attr('stroke', strokeColor)\n .attr(\n 'd',\n 'Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half'\n .replaceAll('startx', c4Shape.x)\n .replaceAll('starty', c4Shape.y)\n .replaceAll('width', c4Shape.width)\n .replaceAll('half', c4Shape.height / 2)\n );\n c4ShapeElem\n .append('path')\n .attr('fill', 'none')\n .attr('stroke-width', '0.5')\n .attr('stroke', strokeColor)\n .attr(\n 'd',\n 'Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half'\n .replaceAll('startx', c4Shape.x + c4Shape.width)\n .replaceAll('starty', c4Shape.y)\n .replaceAll('half', c4Shape.height / 2)\n );\n break;\n }\n\n // draw type of c4Shape\n let c4ShapeFontConf = getC4ShapeFont(conf, c4Shape.typeC4Shape.text);\n c4ShapeElem\n .append('text')\n .attr('fill', fontColor)\n .attr('font-family', c4ShapeFontConf.fontFamily)\n .attr('font-size', c4ShapeFontConf.fontSize - 2)\n .attr('font-style', 'italic')\n .attr('lengthAdjust', 'spacing')\n .attr('textLength', c4Shape.typeC4Shape.width)\n .attr('x', c4Shape.x + c4Shape.width / 2 - c4Shape.typeC4Shape.width / 2)\n .attr('y', c4Shape.y + c4Shape.typeC4Shape.Y)\n .text('<<' + c4Shape.typeC4Shape.text + '>>');\n\n // draw image/sprite\n switch (c4Shape.typeC4Shape.text) {\n case 'person':\n case 'external_person':\n drawImage(\n c4ShapeElem,\n 48,\n 48,\n c4Shape.x + c4Shape.width / 2 - 24,\n c4Shape.y + c4Shape.image.Y,\n personImg\n );\n break;\n }\n\n // draw label\n let textFontConf = conf[c4Shape.typeC4Shape.text + 'Font']();\n textFontConf.fontWeight = 'bold';\n textFontConf.fontSize = textFontConf.fontSize + 2;\n textFontConf.fontColor = fontColor;\n _drawTextCandidateFunc(conf)(\n c4Shape.label.text,\n c4ShapeElem,\n c4Shape.x,\n c4Shape.y + c4Shape.label.Y,\n c4Shape.width,\n c4Shape.height,\n { fill: fontColor },\n textFontConf\n );\n\n // draw techn/type\n textFontConf = conf[c4Shape.typeC4Shape.text + 'Font']();\n textFontConf.fontColor = fontColor;\n\n if (c4Shape.techn && c4Shape.techn?.text !== '') {\n _drawTextCandidateFunc(conf)(\n c4Shape.techn.text,\n c4ShapeElem,\n c4Shape.x,\n c4Shape.y + c4Shape.techn.Y,\n c4Shape.width,\n c4Shape.height,\n { fill: fontColor, 'font-style': 'italic' },\n textFontConf\n );\n } else if (c4Shape.type && c4Shape.type.text !== '') {\n _drawTextCandidateFunc(conf)(\n c4Shape.type.text,\n c4ShapeElem,\n c4Shape.x,\n c4Shape.y + c4Shape.type.Y,\n c4Shape.width,\n c4Shape.height,\n { fill: fontColor, 'font-style': 'italic' },\n textFontConf\n );\n }\n\n // draw descr\n if (c4Shape.descr && c4Shape.descr.text !== '') {\n textFontConf = conf.personFont();\n textFontConf.fontColor = fontColor;\n _drawTextCandidateFunc(conf)(\n c4Shape.descr.text,\n c4ShapeElem,\n c4Shape.x,\n c4Shape.y + c4Shape.descr.Y,\n c4Shape.width,\n c4Shape.height,\n { fill: fontColor },\n textFontConf\n );\n }\n\n return c4Shape.height;\n};\n\nexport const insertDatabaseIcon = function (elem) {\n elem\n .append('defs')\n .append('symbol')\n .attr('id', 'database')\n .attr('fill-rule', 'evenodd')\n .attr('clip-rule', 'evenodd')\n .append('path')\n .attr('transform', 'scale(.5)')\n .attr(\n 'd',\n 'M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z'\n );\n};\n\nexport const insertComputerIcon = function (elem) {\n elem\n .append('defs')\n .append('symbol')\n .attr('id', 'computer')\n .attr('width', '24')\n .attr('height', '24')\n .append('path')\n .attr('transform', 'scale(.5)')\n .attr(\n 'd',\n 'M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z'\n );\n};\n\nexport const insertClockIcon = function (elem) {\n elem\n .append('defs')\n .append('symbol')\n .attr('id', 'clock')\n .attr('width', '24')\n .attr('height', '24')\n .append('path')\n .attr('transform', 'scale(.5)')\n .attr(\n 'd',\n 'M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z'\n );\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n *\n * @param elem\n */\nexport const insertArrowHead = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'arrowhead')\n .attr('refX', 9)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 0 L 10 5 L 0 10 z'); // this is actual shape for arrowhead\n};\n\nexport const insertArrowEnd = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'arrowend')\n .attr('refX', 1)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 10 0 L 0 5 L 10 10 z'); // this is actual shape for arrowhead\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n *\n * @param {any} elem\n */\nexport const insertArrowFilledHead = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'filled-head')\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\n\n/**\n * Setup node number. The result is appended to the svg.\n *\n * @param {any} elem\n */\nexport const insertDynamicNumber = function (elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'sequencenumber')\n .attr('refX', 15)\n .attr('refY', 15)\n .attr('markerWidth', 60)\n .attr('markerHeight', 40)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', 15)\n .attr('cy', 15)\n .attr('r', 6);\n // .style(\"fill\", '#f00');\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n *\n * @param {any} elem\n */\nexport const insertArrowCrossHead = function (elem) {\n const defs = elem.append('defs');\n const marker = defs\n .append('marker')\n .attr('id', 'crosshead')\n .attr('markerWidth', 15)\n .attr('markerHeight', 8)\n .attr('orient', 'auto')\n .attr('refX', 16)\n .attr('refY', 4);\n\n // The arrow\n marker\n .append('path')\n .attr('fill', 'black')\n .attr('stroke', '#000000')\n .style('stroke-dasharray', '0, 0')\n .attr('stroke-width', '1px')\n .attr('d', 'M 9,2 V 6 L16,4 Z');\n\n // The cross\n marker\n .append('path')\n .attr('fill', 'none')\n .attr('stroke', '#000000')\n .style('stroke-dasharray', '0, 0')\n .attr('stroke-width', '1px')\n .attr('d', 'M 0,1 L 6,7 M 6,1 L 0,7');\n // this is actual shape for arrowhead\n};\n\nconst getC4ShapeFont = (cnf, typeC4Shape) => {\n return {\n fontFamily: cnf[typeC4Shape + 'FontFamily'],\n fontSize: cnf[typeC4Shape + 'FontSize'],\n fontWeight: cnf[typeC4Shape + 'FontWeight'],\n };\n};\n\nconst _drawTextCandidateFunc = (function () {\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n */\n function byText(content, g, x, y, width, height, textAttrs) {\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y + height / 2 + 5)\n .style('text-anchor', 'middle')\n .text(content);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n */\n function byTspan(content, g, x, y, width, height, textAttrs, conf) {\n const { fontSize, fontFamily, fontWeight } = conf;\n\n const lines = content.split(common.lineBreakRegex);\n for (let i = 0; i < lines.length; i++) {\n const dy = i * fontSize - (fontSize * (lines.length - 1)) / 2;\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y)\n .style('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', fontSize)\n .style('font-weight', fontWeight)\n .style('font-family', fontFamily);\n text\n .append('tspan')\n // .attr('x', x + width / 2)\n .attr('dy', dy)\n .text(lines[i])\n // .attr('y', y + height / 2)\n .attr('alignment-baseline', 'mathematical');\n\n _setTextAttrs(text, textAttrs);\n }\n }\n\n /**\n * @param {any} content\n * @param {any} g\n * @param {any} x\n * @param {any} y\n * @param {any} width\n * @param {any} height\n * @param {any} textAttrs\n * @param {any} conf\n */\n function byFo(content, g, x, y, width, height, textAttrs, conf) {\n const s = g.append('switch');\n const f = s\n .append('foreignObject')\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height);\n\n const text = f\n .append('xhtml:div')\n .style('display', 'table')\n .style('height', '100%')\n .style('width', '100%');\n\n text\n .append('div')\n .style('display', 'table-cell')\n .style('text-align', 'center')\n .style('vertical-align', 'middle')\n .text(content);\n\n byTspan(content, s, x, y, width, height, textAttrs, conf);\n _setTextAttrs(text, textAttrs);\n }\n\n /**\n * @param {any} toText\n * @param {any} fromTextAttrsDict\n */\n function _setTextAttrs(toText, fromTextAttrsDict) {\n for (const key in fromTextAttrsDict) {\n if (fromTextAttrsDict.hasOwnProperty(key)) {\n toText.attr(key, fromTextAttrsDict[key]);\n }\n }\n }\n\n return function (conf) {\n return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;\n };\n})();\n\nexport default {\n drawRect,\n drawBoundary,\n drawC4Shape,\n drawRels,\n drawImage,\n insertArrowHead,\n insertArrowEnd,\n insertArrowFilledHead,\n insertDynamicNumber,\n insertArrowCrossHead,\n insertDatabaseIcon,\n insertComputerIcon,\n insertClockIcon,\n};\n\n// cspell:ignoreRegExp /'Mstartx.*/g\n", "import { select } from 'd3';\nimport svgDraw from './svgDraw.js';\nimport { log } from '../../logger.js';\nimport { parser } from './parser/c4Diagram.jison';\nimport common from '../common/common.js';\nimport c4Db from './c4Db.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport assignWithDepth from '../../assignWithDepth.js';\nimport { wrapLabel, calculateTextWidth, calculateTextHeight } from '../../utils.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\n\nlet globalBoundaryMaxX = 0,\n globalBoundaryMaxY = 0;\n\nlet c4ShapeInRow = 4;\nlet c4BoundaryInRow = 2;\n\nparser.yy = c4Db;\n\nlet conf = {};\n\nclass Bounds {\n constructor(diagObj) {\n this.name = '';\n this.data = {};\n this.data.startx = undefined;\n this.data.stopx = undefined;\n this.data.starty = undefined;\n this.data.stopy = undefined;\n this.data.widthLimit = undefined;\n\n this.nextData = {};\n this.nextData.startx = undefined;\n this.nextData.stopx = undefined;\n this.nextData.starty = undefined;\n this.nextData.stopy = undefined;\n this.nextData.cnt = 0;\n\n setConf(diagObj.db.getConfig());\n }\n\n setData(startx, stopx, starty, stopy) {\n this.nextData.startx = this.data.startx = startx;\n this.nextData.stopx = this.data.stopx = stopx;\n this.nextData.starty = this.data.starty = starty;\n this.nextData.stopy = this.data.stopy = stopy;\n }\n\n updateVal(obj, key, val, fun) {\n if (obj[key] === undefined) {\n obj[key] = val;\n } else {\n obj[key] = fun(val, obj[key]);\n }\n }\n\n insert(c4Shape) {\n this.nextData.cnt = this.nextData.cnt + 1;\n let _startx =\n this.nextData.startx === this.nextData.stopx\n ? this.nextData.stopx + c4Shape.margin\n : this.nextData.stopx + c4Shape.margin * 2;\n let _stopx = _startx + c4Shape.width;\n let _starty = this.nextData.starty + c4Shape.margin * 2;\n let _stopy = _starty + c4Shape.height;\n if (\n _startx >= this.data.widthLimit ||\n _stopx >= this.data.widthLimit ||\n this.nextData.cnt > c4ShapeInRow\n ) {\n _startx = this.nextData.startx + c4Shape.margin + conf.nextLinePaddingX;\n _starty = this.nextData.stopy + c4Shape.margin * 2;\n\n this.nextData.stopx = _stopx = _startx + c4Shape.width;\n this.nextData.starty = this.nextData.stopy;\n this.nextData.stopy = _stopy = _starty + c4Shape.height;\n this.nextData.cnt = 1;\n }\n\n c4Shape.x = _startx;\n c4Shape.y = _starty;\n\n this.updateVal(this.data, 'startx', _startx, Math.min);\n this.updateVal(this.data, 'starty', _starty, Math.min);\n this.updateVal(this.data, 'stopx', _stopx, Math.max);\n this.updateVal(this.data, 'stopy', _stopy, Math.max);\n\n this.updateVal(this.nextData, 'startx', _startx, Math.min);\n this.updateVal(this.nextData, 'starty', _starty, Math.min);\n this.updateVal(this.nextData, 'stopx', _stopx, Math.max);\n this.updateVal(this.nextData, 'stopy', _stopy, Math.max);\n }\n\n init(diagObj) {\n this.name = '';\n this.data = {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined,\n widthLimit: undefined,\n };\n this.nextData = {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined,\n cnt: 0,\n };\n setConf(diagObj.db.getConfig());\n }\n\n bumpLastMargin(margin) {\n this.data.stopx += margin;\n this.data.stopy += margin;\n }\n}\n\nexport const setConf = function (cnf) {\n assignWithDepth(conf, cnf);\n\n if (cnf.fontFamily) {\n conf.personFontFamily = conf.systemFontFamily = conf.messageFontFamily = cnf.fontFamily;\n }\n if (cnf.fontSize) {\n conf.personFontSize = conf.systemFontSize = conf.messageFontSize = cnf.fontSize;\n }\n if (cnf.fontWeight) {\n conf.personFontWeight = conf.systemFontWeight = conf.messageFontWeight = cnf.fontWeight;\n }\n};\n\nconst c4ShapeFont = (cnf, typeC4Shape) => {\n return {\n fontFamily: cnf[typeC4Shape + 'FontFamily'],\n fontSize: cnf[typeC4Shape + 'FontSize'],\n fontWeight: cnf[typeC4Shape + 'FontWeight'],\n };\n};\n\nconst boundaryFont = (cnf) => {\n return {\n fontFamily: cnf.boundaryFontFamily,\n fontSize: cnf.boundaryFontSize,\n fontWeight: cnf.boundaryFontWeight,\n };\n};\n\nconst messageFont = (cnf) => {\n return {\n fontFamily: cnf.messageFontFamily,\n fontSize: cnf.messageFontSize,\n fontWeight: cnf.messageFontWeight,\n };\n};\n\n/**\n * @param textType\n * @param c4Shape\n * @param c4ShapeTextWrap\n * @param textConf\n * @param textLimitWidth\n */\nfunction calcC4ShapeTextWH(textType, c4Shape, c4ShapeTextWrap, textConf, textLimitWidth) {\n if (!c4Shape[textType].width) {\n if (c4ShapeTextWrap) {\n c4Shape[textType].text = wrapLabel(c4Shape[textType].text, textLimitWidth, textConf);\n c4Shape[textType].textLines = c4Shape[textType].text.split(common.lineBreakRegex).length;\n // c4Shape[textType].width = calculateTextWidth(c4Shape[textType].text, textConf);\n c4Shape[textType].width = textLimitWidth;\n // c4Shape[textType].height = c4Shape[textType].textLines * textConf.fontSize;\n c4Shape[textType].height = calculateTextHeight(c4Shape[textType].text, textConf);\n } else {\n let lines = c4Shape[textType].text.split(common.lineBreakRegex);\n c4Shape[textType].textLines = lines.length;\n let lineHeight = 0;\n c4Shape[textType].height = 0;\n c4Shape[textType].width = 0;\n for (const line of lines) {\n c4Shape[textType].width = Math.max(\n calculateTextWidth(line, textConf),\n c4Shape[textType].width\n );\n lineHeight = calculateTextHeight(line, textConf);\n c4Shape[textType].height = c4Shape[textType].height + lineHeight;\n }\n // c4Shapes[textType].height = c4Shapes[textType].textLines * textConf.fontSize;\n }\n }\n}\n\nexport const drawBoundary = function (diagram, boundary, bounds) {\n boundary.x = bounds.data.startx;\n boundary.y = bounds.data.starty;\n boundary.width = bounds.data.stopx - bounds.data.startx;\n boundary.height = bounds.data.stopy - bounds.data.starty;\n\n boundary.label.y = conf.c4ShapeMargin - 35;\n\n let boundaryTextWrap = boundary.wrap && conf.wrap;\n let boundaryLabelConf = boundaryFont(conf);\n boundaryLabelConf.fontSize = boundaryLabelConf.fontSize + 2;\n boundaryLabelConf.fontWeight = 'bold';\n let textLimitWidth = calculateTextWidth(boundary.label.text, boundaryLabelConf);\n calcC4ShapeTextWH('label', boundary, boundaryTextWrap, boundaryLabelConf, textLimitWidth);\n\n svgDraw.drawBoundary(diagram, boundary, conf);\n};\n\nexport const drawC4ShapeArray = function (currentBounds, diagram, c4ShapeArray, c4ShapeKeys) {\n // Upper Y is relative point\n let Y = 0;\n // Draw the c4ShapeArray\n for (const c4ShapeKey of c4ShapeKeys) {\n Y = 0;\n const c4Shape = c4ShapeArray[c4ShapeKey];\n\n // calc c4 shape type width and height\n\n let c4ShapeTypeConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text);\n c4ShapeTypeConf.fontSize = c4ShapeTypeConf.fontSize - 2;\n c4Shape.typeC4Shape.width = calculateTextWidth(\n '\u00AB' + c4Shape.typeC4Shape.text + '\u00BB',\n c4ShapeTypeConf\n );\n c4Shape.typeC4Shape.height = c4ShapeTypeConf.fontSize + 2;\n c4Shape.typeC4Shape.Y = conf.c4ShapePadding;\n Y = c4Shape.typeC4Shape.Y + c4Shape.typeC4Shape.height - 4;\n\n // set image width and height c4Shape.x + c4Shape.width / 2 - 24, c4Shape.y + 28\n // let imageWidth = 0,\n // imageHeight = 0,\n // imageY = 0;\n //\n c4Shape.image = { width: 0, height: 0, Y: 0 };\n switch (c4Shape.typeC4Shape.text) {\n case 'person':\n case 'external_person':\n c4Shape.image.width = 48;\n c4Shape.image.height = 48;\n c4Shape.image.Y = Y;\n Y = c4Shape.image.Y + c4Shape.image.height;\n break;\n }\n if (c4Shape.sprite) {\n c4Shape.image.width = 48;\n c4Shape.image.height = 48;\n c4Shape.image.Y = Y;\n Y = c4Shape.image.Y + c4Shape.image.height;\n }\n\n // Y = conf.c4ShapePadding + c4Shape.image.height;\n\n let c4ShapeTextWrap = c4Shape.wrap && conf.wrap;\n let textLimitWidth = conf.width - conf.c4ShapePadding * 2;\n\n let c4ShapeLabelConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text);\n c4ShapeLabelConf.fontSize = c4ShapeLabelConf.fontSize + 2;\n c4ShapeLabelConf.fontWeight = 'bold';\n calcC4ShapeTextWH('label', c4Shape, c4ShapeTextWrap, c4ShapeLabelConf, textLimitWidth);\n c4Shape.label.Y = Y + 8;\n Y = c4Shape.label.Y + c4Shape.label.height;\n\n if (c4Shape.type && c4Shape.type.text !== '') {\n c4Shape.type.text = '[' + c4Shape.type.text + ']';\n let c4ShapeTypeConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text);\n calcC4ShapeTextWH('type', c4Shape, c4ShapeTextWrap, c4ShapeTypeConf, textLimitWidth);\n c4Shape.type.Y = Y + 5;\n Y = c4Shape.type.Y + c4Shape.type.height;\n } else if (c4Shape.techn && c4Shape.techn.text !== '') {\n c4Shape.techn.text = '[' + c4Shape.techn.text + ']';\n let c4ShapeTechnConf = c4ShapeFont(conf, c4Shape.techn.text);\n calcC4ShapeTextWH('techn', c4Shape, c4ShapeTextWrap, c4ShapeTechnConf, textLimitWidth);\n c4Shape.techn.Y = Y + 5;\n Y = c4Shape.techn.Y + c4Shape.techn.height;\n }\n\n let rectHeight = Y;\n let rectWidth = c4Shape.label.width;\n\n if (c4Shape.descr && c4Shape.descr.text !== '') {\n let c4ShapeDescrConf = c4ShapeFont(conf, c4Shape.typeC4Shape.text);\n calcC4ShapeTextWH('descr', c4Shape, c4ShapeTextWrap, c4ShapeDescrConf, textLimitWidth);\n c4Shape.descr.Y = Y + 20;\n Y = c4Shape.descr.Y + c4Shape.descr.height;\n\n rectWidth = Math.max(c4Shape.label.width, c4Shape.descr.width);\n rectHeight = Y - c4Shape.descr.textLines * 5;\n }\n\n rectWidth = rectWidth + conf.c4ShapePadding;\n // let rectHeight =\n\n c4Shape.width = Math.max(c4Shape.width || conf.width, rectWidth, conf.width);\n c4Shape.height = Math.max(c4Shape.height || conf.height, rectHeight, conf.height);\n c4Shape.margin = c4Shape.margin || conf.c4ShapeMargin;\n\n currentBounds.insert(c4Shape);\n\n svgDraw.drawC4Shape(diagram, c4Shape, conf);\n }\n\n currentBounds.bumpLastMargin(conf.c4ShapeMargin);\n};\n\nclass Point {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n}\n\n/* * *\n * Get the intersection of the line between the center point of a rectangle and a point outside the rectangle.\n * Algorithm idea.\n * Using a point outside the rectangle as the coordinate origin, the graph is divided into four quadrants, and each quadrant is divided into two cases, with separate treatment on the coordinate axes\n * 1. The case of coordinate axes.\n * 1. The case of the negative x-axis\n * 2. The case of the positive x-axis\n * 3. The case of the positive y-axis\n * 4. The negative y-axis case\n * 2. Quadrant cases.\n * 2.1. first quadrant: the case where the line intersects the left side of the rectangle; the case where it intersects the lower side of the rectangle\n * 2.2. second quadrant: the case where the line intersects the right side of the rectangle; the case where it intersects the lower edge of the rectangle\n * 2.3. third quadrant: the case where the line intersects the right side of the rectangle; the case where it intersects the upper edge of the rectangle\n * 2.4. fourth quadrant: the case where the line intersects the left side of the rectangle; the case where it intersects the upper side of the rectangle\n *\n */\nlet getIntersectPoint = function (fromNode, endPoint) {\n let x1 = fromNode.x;\n\n let y1 = fromNode.y;\n\n let x2 = endPoint.x;\n\n let y2 = endPoint.y;\n\n let fromCenterX = x1 + fromNode.width / 2;\n\n let fromCenterY = y1 + fromNode.height / 2;\n\n let dx = Math.abs(x1 - x2);\n\n let dy = Math.abs(y1 - y2);\n\n let tanDYX = dy / dx;\n\n let fromDYX = fromNode.height / fromNode.width;\n\n let returnPoint = null;\n\n if (y1 == y2 && x1 < x2) {\n returnPoint = new Point(x1 + fromNode.width, fromCenterY);\n } else if (y1 == y2 && x1 > x2) {\n returnPoint = new Point(x1, fromCenterY);\n } else if (x1 == x2 && y1 < y2) {\n returnPoint = new Point(fromCenterX, y1 + fromNode.height);\n } else if (x1 == x2 && y1 > y2) {\n returnPoint = new Point(fromCenterX, y1);\n }\n\n if (x1 > x2 && y1 < y2) {\n if (fromDYX >= tanDYX) {\n returnPoint = new Point(x1, fromCenterY + (tanDYX * fromNode.width) / 2);\n } else {\n returnPoint = new Point(\n fromCenterX - ((dx / dy) * fromNode.height) / 2,\n y1 + fromNode.height\n );\n }\n } else if (x1 < x2 && y1 < y2) {\n //\n if (fromDYX >= tanDYX) {\n returnPoint = new Point(x1 + fromNode.width, fromCenterY + (tanDYX * fromNode.width) / 2);\n } else {\n returnPoint = new Point(\n fromCenterX + ((dx / dy) * fromNode.height) / 2,\n y1 + fromNode.height\n );\n }\n } else if (x1 < x2 && y1 > y2) {\n if (fromDYX >= tanDYX) {\n returnPoint = new Point(x1 + fromNode.width, fromCenterY - (tanDYX * fromNode.width) / 2);\n } else {\n returnPoint = new Point(fromCenterX + ((fromNode.height / 2) * dx) / dy, y1);\n }\n } else if (x1 > x2 && y1 > y2) {\n if (fromDYX >= tanDYX) {\n returnPoint = new Point(x1, fromCenterY - (fromNode.width / 2) * tanDYX);\n } else {\n returnPoint = new Point(fromCenterX - ((fromNode.height / 2) * dx) / dy, y1);\n }\n }\n return returnPoint;\n};\n\nlet getIntersectPoints = function (fromNode, endNode) {\n let endIntersectPoint = { x: 0, y: 0 };\n endIntersectPoint.x = endNode.x + endNode.width / 2;\n endIntersectPoint.y = endNode.y + endNode.height / 2;\n let startPoint = getIntersectPoint(fromNode, endIntersectPoint);\n\n endIntersectPoint.x = fromNode.x + fromNode.width / 2;\n endIntersectPoint.y = fromNode.y + fromNode.height / 2;\n let endPoint = getIntersectPoint(endNode, endIntersectPoint);\n return { startPoint: startPoint, endPoint: endPoint };\n};\n\nexport const drawRels = function (diagram, rels, getC4ShapeObj, diagObj) {\n let i = 0;\n for (let rel of rels) {\n i = i + 1;\n let relTextWrap = rel.wrap && conf.wrap;\n let relConf = messageFont(conf);\n let diagramType = diagObj.db.getC4Type();\n if (diagramType === 'C4Dynamic') {\n rel.label.text = i + ': ' + rel.label.text;\n }\n let textLimitWidth = calculateTextWidth(rel.label.text, relConf);\n calcC4ShapeTextWH('label', rel, relTextWrap, relConf, textLimitWidth);\n\n if (rel.techn && rel.techn.text !== '') {\n textLimitWidth = calculateTextWidth(rel.techn.text, relConf);\n calcC4ShapeTextWH('techn', rel, relTextWrap, relConf, textLimitWidth);\n }\n\n if (rel.descr && rel.descr.text !== '') {\n textLimitWidth = calculateTextWidth(rel.descr.text, relConf);\n calcC4ShapeTextWH('descr', rel, relTextWrap, relConf, textLimitWidth);\n }\n\n let fromNode = getC4ShapeObj(rel.from);\n let endNode = getC4ShapeObj(rel.to);\n let points = getIntersectPoints(fromNode, endNode);\n rel.startPoint = points.startPoint;\n rel.endPoint = points.endPoint;\n }\n svgDraw.drawRels(diagram, rels, conf);\n};\n\n/**\n * @param diagram\n * @param parentBoundaryAlias\n * @param parentBounds\n * @param currentBoundaries\n * @param diagObj\n */\nfunction drawInsideBoundary(\n diagram,\n parentBoundaryAlias,\n parentBounds,\n currentBoundaries,\n diagObj\n) {\n let currentBounds = new Bounds(diagObj);\n // Calculate the width limit of the boundary. label/type \u7684\u957F\u5EA6\uFF0C\n currentBounds.data.widthLimit =\n parentBounds.data.widthLimit / Math.min(c4BoundaryInRow, currentBoundaries.length);\n // Math.min(\n // conf.width * conf.c4ShapeInRow + conf.c4ShapeMargin * conf.c4ShapeInRow * 2,\n // parentBounds.data.widthLimit / Math.min(conf.c4BoundaryInRow, currentBoundaries.length)\n // );\n for (let [i, currentBoundary] of currentBoundaries.entries()) {\n let Y = 0;\n currentBoundary.image = { width: 0, height: 0, Y: 0 };\n if (currentBoundary.sprite) {\n currentBoundary.image.width = 48;\n currentBoundary.image.height = 48;\n currentBoundary.image.Y = Y;\n Y = currentBoundary.image.Y + currentBoundary.image.height;\n }\n\n let currentBoundaryTextWrap = currentBoundary.wrap && conf.wrap;\n\n let currentBoundaryLabelConf = boundaryFont(conf);\n currentBoundaryLabelConf.fontSize = currentBoundaryLabelConf.fontSize + 2;\n currentBoundaryLabelConf.fontWeight = 'bold';\n calcC4ShapeTextWH(\n 'label',\n currentBoundary,\n currentBoundaryTextWrap,\n currentBoundaryLabelConf,\n currentBounds.data.widthLimit\n );\n currentBoundary.label.Y = Y + 8;\n Y = currentBoundary.label.Y + currentBoundary.label.height;\n\n if (currentBoundary.type && currentBoundary.type.text !== '') {\n currentBoundary.type.text = '[' + currentBoundary.type.text + ']';\n let currentBoundaryTypeConf = boundaryFont(conf);\n calcC4ShapeTextWH(\n 'type',\n currentBoundary,\n currentBoundaryTextWrap,\n currentBoundaryTypeConf,\n currentBounds.data.widthLimit\n );\n currentBoundary.type.Y = Y + 5;\n Y = currentBoundary.type.Y + currentBoundary.type.height;\n }\n\n if (currentBoundary.descr && currentBoundary.descr.text !== '') {\n let currentBoundaryDescrConf = boundaryFont(conf);\n currentBoundaryDescrConf.fontSize = currentBoundaryDescrConf.fontSize - 2;\n calcC4ShapeTextWH(\n 'descr',\n currentBoundary,\n currentBoundaryTextWrap,\n currentBoundaryDescrConf,\n currentBounds.data.widthLimit\n );\n currentBoundary.descr.Y = Y + 20;\n Y = currentBoundary.descr.Y + currentBoundary.descr.height;\n }\n\n if (i == 0 || i % c4BoundaryInRow === 0) {\n // Calculate the drawing start point of the currentBoundaries.\n let _x = parentBounds.data.startx + conf.diagramMarginX;\n let _y = parentBounds.data.stopy + conf.diagramMarginY + Y;\n\n currentBounds.setData(_x, _x, _y, _y);\n } else {\n // Calculate the drawing start point of the currentBoundaries.\n let _x =\n currentBounds.data.stopx !== currentBounds.data.startx\n ? currentBounds.data.stopx + conf.diagramMarginX\n : currentBounds.data.startx;\n let _y = currentBounds.data.starty;\n\n currentBounds.setData(_x, _x, _y, _y);\n }\n currentBounds.name = currentBoundary.alias;\n let currentPersonOrSystemArray = diagObj.db.getC4ShapeArray(currentBoundary.alias);\n let currentPersonOrSystemKeys = diagObj.db.getC4ShapeKeys(currentBoundary.alias);\n\n if (currentPersonOrSystemKeys.length > 0) {\n drawC4ShapeArray(\n currentBounds,\n diagram,\n currentPersonOrSystemArray,\n currentPersonOrSystemKeys\n );\n }\n parentBoundaryAlias = currentBoundary.alias;\n let nextCurrentBoundaries = diagObj.db.getBoundaries(parentBoundaryAlias);\n\n if (nextCurrentBoundaries.length > 0) {\n // draw boundary inside currentBoundary\n drawInsideBoundary(\n diagram,\n parentBoundaryAlias,\n currentBounds,\n nextCurrentBoundaries,\n diagObj\n );\n }\n // draw boundary\n if (currentBoundary.alias !== 'global') {\n drawBoundary(diagram, currentBoundary, currentBounds);\n }\n parentBounds.data.stopy = Math.max(\n currentBounds.data.stopy + conf.c4ShapeMargin,\n parentBounds.data.stopy\n );\n parentBounds.data.stopx = Math.max(\n currentBounds.data.stopx + conf.c4ShapeMargin,\n parentBounds.data.stopx\n );\n globalBoundaryMaxX = Math.max(globalBoundaryMaxX, parentBounds.data.stopx);\n globalBoundaryMaxY = Math.max(globalBoundaryMaxY, parentBounds.data.stopy);\n }\n}\n\n/**\n * Draws a sequenceDiagram in the tag with id: id based on the graph definition in text.\n *\n * @param {any} _text\n * @param {any} id\n * @param {any} _version\n * @param diagObj\n */\nexport const draw = function (_text, id, _version, diagObj) {\n conf = getConfig().c4;\n const securityLevel = getConfig().securityLevel;\n // Handle root and Document for when rendering in sandbox mode\n let sandboxElement;\n if (securityLevel === 'sandbox') {\n sandboxElement = select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? select(sandboxElement.nodes()[0].contentDocument.body)\n : select('body');\n\n let db = diagObj.db;\n\n diagObj.db.setWrap(conf.wrap);\n\n c4ShapeInRow = db.getC4ShapeInRow();\n c4BoundaryInRow = db.getC4BoundaryInRow();\n\n log.debug(`C:${JSON.stringify(conf, null, 2)}`);\n\n const diagram =\n securityLevel === 'sandbox' ? root.select(`[id=\"${id}\"]`) : select(`[id=\"${id}\"]`);\n\n svgDraw.insertComputerIcon(diagram);\n svgDraw.insertDatabaseIcon(diagram);\n svgDraw.insertClockIcon(diagram);\n\n let screenBounds = new Bounds(diagObj);\n\n screenBounds.setData(\n conf.diagramMarginX,\n conf.diagramMarginX,\n conf.diagramMarginY,\n conf.diagramMarginY\n );\n\n screenBounds.data.widthLimit = screen.availWidth;\n globalBoundaryMaxX = conf.diagramMarginX;\n globalBoundaryMaxY = conf.diagramMarginY;\n\n const title = diagObj.db.getTitle();\n let currentBoundaries = diagObj.db.getBoundaries('');\n // switch (c4type) {\n // case 'C4Context':\n drawInsideBoundary(diagram, '', screenBounds, currentBoundaries, diagObj);\n // break;\n // }\n\n // The arrow head definition is attached to the svg once\n svgDraw.insertArrowHead(diagram);\n svgDraw.insertArrowEnd(diagram);\n svgDraw.insertArrowCrossHead(diagram);\n svgDraw.insertArrowFilledHead(diagram);\n\n drawRels(diagram, diagObj.db.getRels(), diagObj.db.getC4Shape, diagObj);\n\n screenBounds.data.stopx = globalBoundaryMaxX;\n screenBounds.data.stopy = globalBoundaryMaxY;\n\n const box = screenBounds.data;\n\n // Make sure the height of the diagram supports long menus.\n let boxHeight = box.stopy - box.starty;\n\n let height = boxHeight + 2 * conf.diagramMarginY;\n\n // Make sure the width of the diagram supports wide menus.\n let boxWidth = box.stopx - box.startx;\n const width = boxWidth + 2 * conf.diagramMarginX;\n\n if (title) {\n diagram\n .append('text')\n .text(title)\n .attr('x', (box.stopx - box.startx) / 2 - 4 * conf.diagramMarginX)\n .attr('y', box.starty + conf.diagramMarginY);\n }\n\n configureSvgSize(diagram, height, width, conf.useMaxWidth);\n\n const extraVertForTitle = title ? 60 : 0;\n diagram.attr(\n 'viewBox',\n box.startx -\n conf.diagramMarginX +\n ' -' +\n (conf.diagramMarginY + extraVertForTitle) +\n ' ' +\n width +\n ' ' +\n (height + extraVertForTitle)\n );\n\n log.debug(`models:`, box);\n};\n\nexport default {\n drawPersonOrSystemArray: drawC4ShapeArray,\n drawBoundary,\n setConf,\n draw,\n};\n", "const getStyles = (options) =>\n `.person {\n stroke: ${options.personBorder};\n fill: ${options.personBkg};\n }\n`;\n\nexport default getStyles;\n", "// @ts-ignore: JISON doesn't support types\nimport parser from './parser/c4Diagram.jison';\nimport db from './c4Db.js';\nimport renderer from './c4Renderer.js';\nimport styles from './styles.js';\nimport type { MermaidConfig } from '../../config.type.js';\nimport type { DiagramDefinition } from '../../diagram-api/types.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles,\n init: ({ c4, wrap }: MermaidConfig) => {\n renderer.setConf(c4);\n db.setWrap(wrap);\n },\n};\n"], + "mappings": "gYAyEA,IAAIA,IAAU,UAAU,CACxB,IAAIC,EAAEC,EAAA,SAASC,GAAEC,EAAEH,EAAEI,EAAE,CAAC,IAAIJ,EAAEA,GAAG,CAAC,EAAEI,EAAEF,GAAE,OAAOE,IAAIJ,EAAEE,GAAEE,CAAC,CAAC,EAAED,EAAE,CAAC,OAAOH,CAAC,EAAhE,KAAkEK,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,EAAE,EAAE,EAAEC,GAAI,CAAC,GAAG,EAAE,EAAEC,GAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAEC,GAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,EAAE,EAAE,EAAEC,EAAI,CAAC,GAAG,GAAG,EAAE,EAAEC,GAAI,CAAC,GAAG,GAAG,GAAG,EAAE,EAAEC,GAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAEC,GAAI,CAAC,GAAG,EAAE,EAAEC,GAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EACrhC5D,GAAS,CAAC,MAAOE,EAAA,UAAkB,CAAE,EAApB,SACrB,GAAI,CAAC,EACL,SAAU,CAAC,MAAQ,EAAE,MAAQ,EAAE,WAAa,EAAE,UAAY,EAAE,aAAe,EAAE,aAAe,EAAE,aAAe,EAAE,aAAe,EAAE,YAAc,GAAG,WAAa,GAAG,QAAU,GAAG,WAAa,GAAG,IAAM,GAAG,aAAe,GAAG,aAAe,GAAG,WAAa,GAAG,cAAgB,GAAG,gBAAkB,GAAG,kBAAoB,GAAG,eAAiB,GAAG,MAAQ,GAAG,eAAiB,GAAG,UAAY,GAAG,gBAAkB,GAAG,UAAY,GAAG,gBAAkB,GAAG,0BAA4B,GAAG,kBAAoB,GAAG,uBAAyB,GAAG,sBAAwB,GAAG,cAAgB,GAAG,OAAS,GAAG,oBAAsB,GAAG,WAAa,GAAG,gBAAkB,GAAG,SAAW,GAAG,mBAAqB,GAAG,KAAO,GAAG,OAAS,GAAG,OAAS,GAAG,OAAS,GAAG,iBAAmB,GAAG,OAAS,GAAG,WAAa,GAAG,OAAS,GAAG,UAAY,GAAG,aAAe,GAAG,WAAa,GAAG,cAAgB,GAAG,iBAAmB,GAAG,UAAY,GAAG,aAAe,GAAG,gBAAkB,GAAG,cAAgB,GAAG,iBAAmB,GAAG,oBAAsB,GAAG,UAAY,GAAG,aAAe,GAAG,gBAAkB,GAAG,cAAgB,GAAG,iBAAmB,GAAG,oBAAsB,GAAG,IAAM,GAAG,MAAQ,GAAG,MAAQ,GAAG,MAAQ,GAAG,MAAQ,GAAG,MAAQ,GAAG,MAAQ,GAAG,UAAY,GAAG,gBAAkB,GAAG,iBAAmB,GAAG,qBAAuB,GAAG,UAAY,GAAG,IAAM,GAAG,QAAU,GAAG,UAAY,GAAG,UAAY,GAAG,gBAAkB,GAAG,QAAU,EAAE,KAAO,CAAC,EACt2C,WAAY,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,GAAG,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,eAAe,GAAG,eAAe,GAAG,aAAa,GAAG,gBAAgB,GAAG,QAAQ,GAAG,iBAAiB,GAAG,YAAY,GAAG,kBAAkB,GAAG,YAAY,GAAG,kBAAkB,GAAG,4BAA4B,GAAG,SAAS,GAAG,sBAAsB,GAAG,kBAAkB,GAAG,WAAW,GAAG,qBAAqB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,YAAY,GAAG,eAAe,GAAG,aAAa,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,YAAY,GAAG,eAAe,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,sBAAsB,GAAG,YAAY,GAAG,eAAe,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,kBAAkB,GAAG,mBAAmB,GAAG,uBAAuB,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,EACrjC,aAAc,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAC7hB,cAAeA,EAAA,SAAmB2D,EAAQC,EAAQC,EAAUC,EAAIC,EAAyBC,EAAiBC,GAAiB,CAG3H,IAAIC,EAAKF,EAAG,OAAS,EACrB,OAAQD,EAAS,CACjB,IAAK,GACJD,EAAG,aAAa,IAAI,EACrB,MACA,IAAK,GACJA,EAAG,aAAa,IAAI,EACrB,MACA,IAAK,GACJA,EAAG,aAAa,IAAI,EACrB,MACA,IAAK,GACJA,EAAG,aAAa,IAAI,EACrB,MACA,IAAK,GAAG,IAAK,GAAG,IAAK,IAAI,IAAK,IAAI,IAAK,IACvCA,EAAG,UAAUE,EAAGE,EAAG,CAAC,CAAC,EACrB,MACA,IAAK,IACLJ,EAAG,SAASE,EAAGE,CAAE,EAAE,UAAU,CAAC,CAAC,EAAE,KAAK,EAAEF,EAAGE,CAAE,EAAE,UAAU,CAAC,EAC1D,MACA,IAAK,IACLJ,EAAG,kBAAkBE,EAAGE,CAAE,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAEF,EAAGE,CAAE,EAAE,UAAU,EAAE,EACrE,MACA,IAAK,IACJ,KAAK,EAAEF,EAAGE,CAAE,EAAE,KAAK,EAAEJ,EAAG,SAAS,KAAK,CAAC,EACxC,MACA,IAAK,IAAI,IAAK,IACb,KAAK,EAAEE,EAAGE,CAAE,EAAE,KAAK,EAAEJ,EAAG,kBAAkB,KAAK,CAAC,EACjD,MACA,IAAK,IACLE,EAAGE,CAAE,EAAE,OAAO,EAAG,EAAG,YAAY,EAAGJ,EAAG,0BAA0B,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACxF,MACA,IAAK,IACLF,EAAGE,CAAE,EAAE,OAAO,EAAG,EAAG,QAAQ,EAAGJ,EAAG,0BAA0B,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACpF,MACA,IAAK,IACLJ,EAAG,0BAA0B,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACrD,MACA,IAAK,IACLF,EAAGE,CAAE,EAAE,OAAO,EAAG,EAAG,WAAW,EAAGJ,EAAG,qBAAqB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAClF,MACA,IAAK,IACLJ,EAAG,kBAAkB,OAAQ,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACrD,MACA,IAAK,IACLJ,EAAG,kBAAkB,QAAS,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACtD,MACA,IAAK,IACLJ,EAAG,kBAAkB,QAAS,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACtD,MACA,IAAK,IACJJ,EAAG,sBAAsB,EAC1B,MACA,IAAK,IACLA,EAAG,kBAAkB,SAAU,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACvD,MACA,IAAK,IACLJ,EAAG,kBAAkB,kBAAmB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAChE,MACA,IAAK,IACLJ,EAAG,kBAAkB,SAAU,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACvD,MACA,IAAK,IACLJ,EAAG,kBAAkB,YAAa,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC1D,MACA,IAAK,IACLJ,EAAG,kBAAkB,eAAgB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC7D,MACA,IAAK,IACLJ,EAAG,kBAAkB,kBAAmB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAChE,MACA,IAAK,IACLJ,EAAG,kBAAkB,qBAAsB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACnE,MACA,IAAK,IACLJ,EAAG,kBAAkB,wBAAyB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACtE,MACA,IAAK,IACLJ,EAAG,aAAa,YAAa,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACrD,MACA,IAAK,IACLJ,EAAG,aAAa,eAAgB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACxD,MACA,IAAK,IACLJ,EAAG,aAAa,kBAAmB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC3D,MACA,IAAK,IACLJ,EAAG,aAAa,qBAAsB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC9D,MACA,IAAK,IACLJ,EAAG,aAAa,wBAAyB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACjE,MACA,IAAK,IACLJ,EAAG,aAAa,2BAA4B,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACpE,MACA,IAAK,IACLJ,EAAG,aAAa,YAAa,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACrD,MACA,IAAK,IACLJ,EAAG,aAAa,eAAgB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACxD,MACA,IAAK,IACLJ,EAAG,aAAa,kBAAmB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC3D,MACA,IAAK,IACLJ,EAAG,aAAa,qBAAsB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC9D,MACA,IAAK,IACLJ,EAAG,aAAa,wBAAyB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACjE,MACA,IAAK,IACLJ,EAAG,aAAa,2BAA4B,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACpE,MACA,IAAK,IACLJ,EAAG,OAAO,MAAO,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACzC,MACA,IAAK,IACLJ,EAAG,OAAO,QAAS,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC3C,MACA,IAAK,IACLJ,EAAG,OAAO,QAAS,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC3C,MACA,IAAK,IACLJ,EAAG,OAAO,QAAS,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC3C,MACA,IAAK,IACLJ,EAAG,OAAO,QAAS,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC3C,MACA,IAAK,IACLJ,EAAG,OAAO,QAAS,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC3C,MACA,IAAK,IACLJ,EAAG,OAAO,QAAS,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC3C,MACA,IAAK,IACLF,EAAGE,CAAE,EAAE,OAAO,EAAG,CAAC,EAAGJ,EAAG,OAAO,MAAO,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC9D,MACA,IAAK,IACLJ,EAAG,cAAc,kBAAmB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC5D,MACA,IAAK,IACLJ,EAAG,eAAe,mBAAoB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EAC9D,MACA,IAAK,IACLJ,EAAG,mBAAmB,uBAAwB,GAAGE,EAAGE,CAAE,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACtE,MACA,IAAK,IACJ,KAAK,EAAI,CAACF,EAAGE,CAAE,CAAC,EACjB,MACA,IAAK,IACJF,EAAGE,CAAE,EAAE,QAAQF,EAAGE,EAAG,CAAC,CAAC,EAAG,KAAK,EAAEF,EAAGE,CAAE,EACvC,MACA,IAAK,IAAI,IAAK,IACZ,KAAK,EAAIF,EAAGE,CAAE,EAAE,KAAK,EACvB,MACA,IAAK,IACJ,IAAIC,GAAG,CAAC,EAAGA,GAAGH,EAAGE,EAAG,CAAC,EAAE,KAAK,CAAC,EAAEF,EAAGE,CAAE,EAAE,KAAK,EAAG,KAAK,EAAEC,GACtD,MACA,IAAK,IACH,KAAK,EAAI,GACX,KACA,CACA,EArKe,aAsKf,MAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG/D,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,EAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG1C,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,EAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG1C,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,EAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG1C,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,EAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG1C,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,EAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE/C,EAAEgD,GAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGtC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,EAAG,CAAC,EAAE/C,EAAEgD,GAAI,CAAC,EAAE,EAAE,CAAC,EAAEhD,EAAEiD,GAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAEjD,EAAEgD,GAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAEhD,EAAEkD,GAAI,CAAC,EAAE,EAAE,CAAC,EAAElD,EAAEkD,GAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAElD,EAAEkD,GAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAEtD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG5C,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,EAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGI,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAGH,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAEtD,EAAEgD,GAAI,CAAC,EAAE,EAAE,CAAC,EAAEhD,EAAEiD,GAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG5C,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,CAAC,EAAET,EAAEgD,GAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG3C,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,GAAI,GAAGC,EAAG,CAAC,EAAE/C,EAAEkD,GAAI,CAAC,EAAE,EAAE,CAAC,EAAElD,EAAEkD,GAAI,CAAC,EAAE,EAAE,CAAC,EAAElD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEwD,GAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,GAAGL,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,CAAG,CAAC,EAAEtD,EAAEyD,GAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAEzD,EAAEyD,GAAI,CAAC,EAAE,EAAE,CAAC,EAAEzD,EAAEyD,GAAI,CAAC,EAAE,EAAE,CAAC,EAAEzD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAAE,CAAC,EAAEvD,EAAEuD,EAAI,CAAC,EAAE,EAA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", + "names": ["parser", "o", "__name", "k", "v", "l", "$V0", "$V1", "$V2", "$V3", "$V4", "$V5", "$V6", "$V7", "$V8", "$V9", "$Va", "$Vb", "$Vc", "$Vd", "$Ve", "$Vf", "$Vg", "$Vh", "$Vi", "$Vj", "$Vk", "$Vl", "$Vm", "$Vn", "$Vo", "$Vp", "$Vq", "$Vr", "$Vs", "$Vt", "$Vu", "$Vv", "$Vw", "$Vx", "$Vy", "$Vz", "$VA", "$VB", "$VC", "$VD", "$VE", "$VF", "$VG", "$VH", "$VI", "$VJ", "$VK", "$VL", "$VM", "$VN", "$VO", "$VP", "$VQ", "$VR", "$VS", "yytext", "yyleng", "yylineno", "yy", "yystate", "$$", "_$", "$0", "kv", "str", "hash", "error", "input", "self", "stack", "tstack", "vstack", "lstack", "table", "recovering", "TERROR", "EOF", "args", "lexer", "sharedState", "yyloc", "ranges", "popStack", "n", "lex", "token", "symbol", "preErrorSymbol", "state", "action", "a", "r", "yyval", "p", "len", "newState", "expected", "errStr", "ch", "lines", "oldLines", "past", "next", "pre", "c", "match", "indexed_rule", "backup", "tempMatch", "index", "rules", "i", "condition", "yy_", "$avoiding_name_collisions", "YY_START", "YYSTATE", "Parser", "c4Diagram_default", "parser", "c4ShapeArray", "boundaryParseStack", "currentBoundaryParse", "parentBoundaryParse", "boundaries", "rels", "title", "wrapEnabled", "c4ShapeInRow", "c4BoundaryInRow", "c4Type", "getC4Type", "__name", "setC4Type", "c4TypeParam", "sanitizeText", "getConfig", "addRel", "type", "from", "to", "label", "techn", "descr", "sprite", "tags", "link", "rel", "old", "key", "value", "autoWrap", "addPersonOrSystem", "typeC4Shape", "alias", "personOrSystem", "addContainer", "container", "addComponent", "component", "addPersonOrSystemBoundary", "boundary", "addContainerBoundary", "addDeploymentNode", "nodeType", "popBoundaryParseStack", "updateElStyle", "elementName", "bgColor", "fontColor", "borderColor", "shadowing", "shape", "legendText", "legendSprite", "element", "updateRelStyle", "textColor", "lineColor", "offsetX", "offsetY", "updateLayoutConfig", "c4ShapeInRowParam", "c4BoundaryInRowParam", "c4ShapeInRowValue", "c4BoundaryInRowValue", "getC4ShapeInRow", "getC4BoundaryInRow", "getCurrentBoundaryParse", "getParentBoundaryParse", "getC4ShapeArray", "parentBoundary", "getC4Shape", "getC4ShapeKeys", "getBoundaries", "getBoundarys", "getRels", "getTitle", "setWrap", "wrapSetting", "clear", "LINETYPE", "ARROWTYPE", "PLACEMENT", "setTitle", "txt", "c4Db_default", "setAccTitle", "getAccTitle", "getAccDescription", "setAccDescription", "import_sanitize_url", "drawRect", "__name", "elem", "rectData", "drawImage", "width", "height", "x", "y", "link", "imageElem", "sanitizedLink", "drawRels", "rels", "conf", "relsElem", "i", "rel", "textColor", "strokeColor", "offsetX", "offsetY", "url", "line", "messageConf", "_drawTextCandidateFunc", "drawBoundary", "boundary", "boundaryElem", "fillColor", "fontColor", "attrsValue", "boundaryConf", "drawC4Shape", "c4Shape", "personImg", "c4ShapeElem", "rect", "getNoteRect", "c4ShapeFontConf", "getC4ShapeFont", "textFontConf", "insertDatabaseIcon", "insertComputerIcon", "insertClockIcon", "insertArrowHead", "insertArrowEnd", "insertArrowFilledHead", "insertDynamicNumber", "insertArrowCrossHead", "marker", "cnf", "typeC4Shape", "byText", "content", "g", "textAttrs", "text", "_setTextAttrs", "byTspan", "fontSize", "fontFamily", "fontWeight", "lines", "common_default", "dy", "byFo", "s", "toText", "fromTextAttrsDict", "key", "svgDraw_default", "globalBoundaryMaxX", "globalBoundaryMaxY", "c4ShapeInRow", "c4BoundaryInRow", "parser", "c4Db_default", "conf", "Bounds", "__name", "diagObj", "setConf", "startx", "stopx", "starty", "stopy", "obj", "key", "val", "fun", "c4Shape", "_startx", "_stopx", "_starty", "_stopy", "margin", "cnf", "assignWithDepth_default", "c4ShapeFont", "typeC4Shape", "boundaryFont", "messageFont", "calcC4ShapeTextWH", "textType", "c4ShapeTextWrap", "textConf", "textLimitWidth", "wrapLabel", "common_default", "calculateTextHeight", "lines", "lineHeight", "line", "calculateTextWidth", "drawBoundary", "diagram", "boundary", "bounds", "boundaryTextWrap", "boundaryLabelConf", "svgDraw_default", "drawC4ShapeArray", "currentBounds", "c4ShapeArray", "c4ShapeKeys", "Y", "c4ShapeKey", "c4ShapeTypeConf", "c4ShapeLabelConf", "c4ShapeTechnConf", "rectHeight", "rectWidth", "c4ShapeDescrConf", "Point", "x", "y", "getIntersectPoint", "fromNode", "endPoint", "x1", "y1", "x2", "y2", "fromCenterX", "fromCenterY", "dx", "dy", "tanDYX", "fromDYX", "returnPoint", "getIntersectPoints", "endNode", "endIntersectPoint", "startPoint", "drawRels", "rels", "getC4ShapeObj", "i", "rel", "relTextWrap", "relConf", "points", "drawInsideBoundary", "parentBoundaryAlias", "parentBounds", "currentBoundaries", "currentBoundary", "currentBoundaryTextWrap", "currentBoundaryLabelConf", "currentBoundaryTypeConf", "currentBoundaryDescrConf", "_x", "_y", "currentPersonOrSystemArray", "currentPersonOrSystemKeys", "nextCurrentBoundaries", "draw", "_text", "id", "_version", "getConfig", "securityLevel", "sandboxElement", "select_default", "root", "db", "log", "screenBounds", "title", "box", "height", "width", "configureSvgSize", "extraVertForTitle", "c4Renderer_default", "getStyles", "__name", "options", "styles_default", "diagram", "c4Diagram_default", "c4Db_default", "c4Renderer_default", "styles_default", "__name", "c4", "wrap"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-2XYWPRAO.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-2XYWPRAO.mjs new file mode 100644 index 0000000..0f75eec --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-2XYWPRAO.mjs @@ -0,0 +1,127 @@ +import{A as oe,B as ho,C as et,D as be,G as zu,I as Ve,L as ue,M as Yt,O as Is,R as Qn,S as qu,a as de,b as Et,c as ke,d as he,e as te,g as At,i as Jn,j as Xt,k as vt,l as pe,m as Ft,n as $,o as Pe,p as xe,q as kt,r as $e,s as E,t as Ie,w as Hu,x as I,y as Ne,z as re}from"./chunk-OMTJKCYW.mjs";import{d as M}from"./chunk-IQQE2MEC.mjs";import{M as fo,d as ju,e as ot,z as ge}from"./chunk-A4ITRWGT.mjs";import{a,b as $s,c as qt,d as B,e as Vu}from"./chunk-GTKDMUJJ.mjs";var au=$s(su=>{"use strict";Object.defineProperty(su,"__esModule",{value:!0});var nu;function iu(){if(nu===void 0)throw new Error("No runtime abstraction layer installed");return nu}a(iu,"RAL");(function(r){function e(t){if(t===void 0)throw new Error("No runtime abstraction layer provided");nu=t}a(e,"install"),r.install=e})(iu||(iu={}));su.default=iu});var Vd=$s(_e=>{"use strict";Object.defineProperty(_e,"__esModule",{value:!0});_e.stringArray=_e.array=_e.func=_e.error=_e.number=_e.string=_e.boolean=void 0;function tg(r){return r===!0||r===!1}a(tg,"boolean");_e.boolean=tg;function Wd(r){return typeof r=="string"||r instanceof String}a(Wd,"string");_e.string=Wd;function rg(r){return typeof r=="number"||r instanceof Number}a(rg,"number");_e.number=rg;function ng(r){return r instanceof Error}a(ng,"error");_e.error=ng;function ig(r){return typeof r=="function"}a(ig,"func");_e.func=ig;function Kd(r){return Array.isArray(r)}a(Kd,"array");_e.array=Kd;function sg(r){return Kd(r)&&r.every(e=>Wd(e))}a(sg,"stringArray");_e.stringArray=sg});var lu=$s(Kn=>{"use strict";Object.defineProperty(Kn,"__esModule",{value:!0});Kn.Emitter=Kn.Event=void 0;var ag=au(),jd;(function(r){let e={dispose(){}};r.None=function(){return e}})(jd||(Kn.Event=jd={}));var ou=class{static{a(this,"CallbackList")}add(e,t=null,n){this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(t),Array.isArray(n)&&n.push({dispose:a(()=>this.remove(e,t),"dispose")})}remove(e,t=null){if(!this._callbacks)return;let n=!1;for(let i=0,s=this._callbacks.length;i{this._callbacks||(this._callbacks=new ou),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,t);let i={dispose:a(()=>{this._callbacks&&(this._callbacks.remove(e,t),i.dispose=r._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))},"dispose")};return Array.isArray(n)&&n.push(i),i}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}};Kn.Emitter=Pa;Pa._noop=function(){}});var Hd=$s(Vn=>{"use strict";Object.defineProperty(Vn,"__esModule",{value:!0});Vn.CancellationTokenSource=Vn.CancellationToken=void 0;var og=au(),lg=Vd(),uu=lu(),ba;(function(r){r.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:uu.Event.None}),r.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:uu.Event.None});function e(t){let n=t;return n&&(n===r.None||n===r.Cancelled||lg.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}a(e,"is"),r.is=e})(ba||(Vn.CancellationToken=ba={}));var ug=Object.freeze(function(r,e){let t=(0,og.default)().timer.setTimeout(r.bind(e),0);return{dispose(){t.dispose()}}}),Ma=class{static{a(this,"MutableToken")}constructor(){this._isCancelled=!1}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?ug:(this._emitter||(this._emitter=new uu.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}},cu=class{static{a(this,"CancellationTokenSource")}get token(){return this._token||(this._token=new Ma),this._token}cancel(){this._token?this._token.cancel():this._token=ba.Cancelled}dispose(){this._token?this._token instanceof Ma&&this._token.dispose():this._token=ba.None}};Vn.CancellationTokenSource=cu});var fe={};qt(fe,{AbstractAstReflection:()=>Jt,AbstractCstNode:()=>Wi,AbstractLangiumParser:()=>Ki,AbstractParserErrorMessageProvider:()=>La,AbstractThreadedAsyncParser:()=>Au,AstUtils:()=>Fs,BiMap:()=>Rr,Cancellation:()=>S,CompositeCstNodeImpl:()=>gr,ContextCache:()=>xr,CstNodeBuilder:()=>Bi,CstUtils:()=>Ss,DEFAULT_TOKENIZE_OPTIONS:()=>Wa,DONE_RESULT:()=>Ce,DatatypeSymbol:()=>_a,DefaultAstNodeDescriptionProvider:()=>as,DefaultAstNodeLocator:()=>ls,DefaultAsyncParser:()=>Ts,DefaultCommentProvider:()=>ys,DefaultConfigurationProvider:()=>us,DefaultDocumentBuilder:()=>cs,DefaultDocumentValidator:()=>ss,DefaultHydrator:()=>xs,DefaultIndexManager:()=>fs,DefaultJsonSerializer:()=>rs,DefaultLangiumDocumentFactory:()=>zi,DefaultLangiumDocuments:()=>qi,DefaultLexer:()=>Ar,DefaultLexerErrorMessageProvider:()=>hs,DefaultLinker:()=>Xi,DefaultNameProvider:()=>Yi,DefaultReferenceDescriptionProvider:()=>os,DefaultReferences:()=>Ji,DefaultScopeComputation:()=>Qi,DefaultScopeProvider:()=>ts,DefaultServiceRegistry:()=>ns,DefaultTokenBuilder:()=>bt,DefaultValueConverter:()=>Tr,DefaultWorkspaceLock:()=>Rs,DefaultWorkspaceManager:()=>ds,Deferred:()=>Ge,Disposable:()=>jt,DisposableCache:()=>qn,DocumentCache:()=>Ua,DocumentState:()=>Y,DocumentValidator:()=>Qe,EMPTY_SCOPE:()=>fg,EMPTY_STREAM:()=>ei,EmptyFileSystem:()=>Su,EmptyFileSystemProvider:()=>Xa,ErrorWithLocation:()=>tr,GrammarAST:()=>ui,GrammarUtils:()=>Ks,IndentationAwareLexer:()=>Cu,IndentationAwareTokenBuilder:()=>qa,JSDocDocumentationProvider:()=>gs,LangiumCompletionParser:()=>ji,LangiumParser:()=>Vi,LangiumParserErrorMessageProvider:()=>Wn,LeafCstNodeImpl:()=>mr,LexingMode:()=>vr,MapScope:()=>Zi,Module:()=>Iu,MultiMap:()=>st,OperationCancelled:()=>mt,ParserWorker:()=>vu,Reduction:()=>Ir,RegExpUtils:()=>Bs,RootCstNodeImpl:()=>Bn,SimpleCache:()=>es,StreamImpl:()=>je,StreamScope:()=>zn,TextDocument:()=>jn,TreeStreamImpl:()=>lt,URI:()=>Ue,UriUtils:()=>Be,ValidationCategory:()=>Yn,ValidationRegistry:()=>is,ValueConverter:()=>pt,WorkspaceCache:()=>Xn,assertUnreachable:()=>ct,createCompletionParser:()=>tu,createDefaultCoreModule:()=>ku,createDefaultSharedCoreModule:()=>$u,createGrammarConfig:()=>il,createLangiumParser:()=>ru,createParser:()=>Hi,delayNextTick:()=>fu,diagnosticData:()=>Er,eagerLoad:()=>dh,getDiagnosticRange:()=>th,indentationBuilderDefaultOptions:()=>Nu,inject:()=>za,interruptAndCheck:()=>ce,isAstNode:()=>le,isAstNodeDescription:()=>po,isAstNodeWithComment:()=>pu,isCompositeCstNode:()=>tt,isIMultiModeLexerDefinition:()=>gu,isJSDoc:()=>xu,isLeafCstNode:()=>Gt,isLinkingError:()=>Qt,isNamed:()=>Zd,isOperationCancelled:()=>gt,isReference:()=>Ee,isRootCstNode:()=>Zn,isTokenTypeArray:()=>Ka,isTokenTypeDictionary:()=>mu,loadGrammarFromJson:()=>yt,parseJSDoc:()=>Ru,prepareLangiumParser:()=>Bd,setInterruptionPeriod:()=>qd,startCancelableOperation:()=>Fa,stream:()=>j,toDiagnosticData:()=>rh,toDiagnosticSeverity:()=>Ba});var Ss={};qt(Ss,{DefaultNameRegexp:()=>Cs,RangeComparison:()=>ut,compareRange:()=>Yu,findCommentNode:()=>To,findDeclarationNodeAtOffset:()=>Ih,findLeafNodeAtOffset:()=>Ro,findLeafNodeBeforeOffset:()=>Ju,flattenCst:()=>$h,getInteriorNodes:()=>Sh,getNextNode:()=>Nh,getPreviousNode:()=>Zu,getStartlineNode:()=>Ch,inRange:()=>yo,isChildNode:()=>go,isCommentNode:()=>mo,streamCst:()=>Zt,toDocumentSegment:()=>er,tokenToRange:()=>Nr});function le(r){return typeof r=="object"&&r!==null&&typeof r.$type=="string"}a(le,"isAstNode");function Ee(r){return typeof r=="object"&&r!==null&&typeof r.$refText=="string"}a(Ee,"isReference");function po(r){return typeof r=="object"&&r!==null&&typeof r.name=="string"&&typeof r.type=="string"&&typeof r.path=="string"}a(po,"isAstNodeDescription");function Qt(r){return typeof r=="object"&&r!==null&&le(r.container)&&Ee(r.reference)&&typeof r.message=="string"}a(Qt,"isLinkingError");var Jt=class{static{a(this,"AbstractAstReflection")}constructor(){this.subtypes={},this.allSubtypes={}}isInstance(e,t){return le(e)&&this.isSubtype(e.$type,t)}isSubtype(e,t){if(e===t)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});let i=n[t];if(i!==void 0)return i;{let s=this.computeIsSubtype(e,t);return n[t]=s,s}}getAllSubTypes(e){let t=this.allSubtypes[e];if(t)return t;{let n=this.getAllTypes(),i=[];for(let s of n)this.isSubtype(s,e)&&i.push(s);return this.allSubtypes[e]=i,i}}};function tt(r){return typeof r=="object"&&r!==null&&Array.isArray(r.content)}a(tt,"isCompositeCstNode");function Gt(r){return typeof r=="object"&&r!==null&&typeof r.tokenType=="object"}a(Gt,"isLeafCstNode");function Zn(r){return tt(r)&&typeof r.fullText=="string"}a(Zn,"isRootCstNode");var je=class r{static{a(this,"StreamImpl")}constructor(e,t){this.startFn=e,this.nextFn=t}iterator(){let e={state:this.startFn(),next:a(()=>this.nextFn(e.state),"next"),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){return!!this.iterator().next().done}count(){let e=this.iterator(),t=0,n=e.next();for(;!n.done;)t++,n=e.next();return t}toArray(){let e=[],t=this.iterator(),n;do n=t.next(),n.value!==void 0&&e.push(n.value);while(!n.done);return e}toSet(){return new Set(this)}toMap(e,t){let n=this.map(i=>[e?e(i):i,t?t(i):i]);return new Map(n)}toString(){return this.join()}concat(e){return new r(()=>({first:this.startFn(),firstDone:!1,iterator:e[Symbol.iterator]()}),t=>{let n;if(!t.firstDone){do if(n=this.nextFn(t.first),!n.done)return n;while(!n.done);t.firstDone=!0}do if(n=t.iterator.next(),!n.done)return n;while(!n.done);return Ce})}join(e=","){let t=this.iterator(),n="",i,s=!1;do i=t.next(),i.done||(s&&(n+=e),n+=kh(i.value)),s=!0;while(!i.done);return n}indexOf(e,t=0){let n=this.iterator(),i=0,s=n.next();for(;!s.done;){if(i>=t&&s.value===e)return i;s=n.next(),i++}return-1}every(e){let t=this.iterator(),n=t.next();for(;!n.done;){if(!e(n.value))return!1;n=t.next()}return!0}some(e){let t=this.iterator(),n=t.next();for(;!n.done;){if(e(n.value))return!0;n=t.next()}return!1}forEach(e){let t=this.iterator(),n=0,i=t.next();for(;!i.done;)e(i.value,n),i=t.next(),n++}map(e){return new r(this.startFn,t=>{let{done:n,value:i}=this.nextFn(t);return n?Ce:{done:!1,value:e(i)}})}filter(e){return new r(this.startFn,t=>{let n;do if(n=this.nextFn(t),!n.done&&e(n.value))return n;while(!n.done);return Ce})}nonNullable(){return this.filter(e=>e!=null)}reduce(e,t){let n=this.iterator(),i=t,s=n.next();for(;!s.done;)i===void 0?i=s.value:i=e(i,s.value),s=n.next();return i}reduceRight(e,t){return this.recursiveReduce(this.iterator(),e,t)}recursiveReduce(e,t,n){let i=e.next();if(i.done)return n;let s=this.recursiveReduce(e,t,n);return s===void 0?i.value:t(s,i.value)}find(e){let t=this.iterator(),n=t.next();for(;!n.done;){if(e(n.value))return n.value;n=t.next()}}findIndex(e){let t=this.iterator(),n=0,i=t.next();for(;!i.done;){if(e(i.value))return n;i=t.next(),n++}return-1}includes(e){let t=this.iterator(),n=t.next();for(;!n.done;){if(n.value===e)return!0;n=t.next()}return!1}flatMap(e){return new r(()=>({this:this.startFn()}),t=>{do{if(t.iterator){let s=t.iterator.next();if(s.done)t.iterator=void 0;else return s}let{done:n,value:i}=this.nextFn(t.this);if(!n){let s=e(i);if(Ns(s))t.iterator=s[Symbol.iterator]();else return{done:!1,value:s}}}while(t.iterator);return Ce})}flat(e){if(e===void 0&&(e=1),e<=0)return this;let t=e>1?this.flat(e-1):this;return new r(()=>({this:t.startFn()}),n=>{do{if(n.iterator){let o=n.iterator.next();if(o.done)n.iterator=void 0;else return o}let{done:i,value:s}=t.nextFn(n.this);if(!i)if(Ns(s))n.iterator=s[Symbol.iterator]();else return{done:!1,value:s}}while(n.iterator);return Ce})}head(){let t=this.iterator().next();if(!t.done)return t.value}tail(e=1){return new r(()=>{let t=this.startFn();for(let n=0;n({size:0,state:this.startFn()}),t=>(t.size++,t.size>e?Ce:this.nextFn(t.state)))}distinct(e){return new r(()=>({set:new Set,internalState:this.startFn()}),t=>{let n;do if(n=this.nextFn(t.internalState),!n.done){let i=e?e(n.value):n.value;if(!t.set.has(i))return t.set.add(i),n}while(!n.done);return Ce})}exclude(e,t){let n=new Set;for(let i of e){let s=t?t(i):i;n.add(s)}return this.filter(i=>{let s=t?t(i):i;return!n.has(s)})}};function kh(r){return typeof r=="string"?r:typeof r>"u"?"undefined":typeof r.toString=="function"?r.toString():Object.prototype.toString.call(r)}a(kh,"toString");function Ns(r){return!!r&&typeof r[Symbol.iterator]=="function"}a(Ns,"isIterable");var ei=new je(()=>{},()=>Ce),Ce=Object.freeze({done:!0,value:void 0});function j(...r){if(r.length===1){let e=r[0];if(e instanceof je)return e;if(Ns(e))return new je(()=>e[Symbol.iterator](),t=>t.next());if(typeof e.length=="number")return new je(()=>({index:0}),t=>t.index1?new je(()=>({collIndex:0,arrIndex:0}),e=>{do{if(e.iterator){let t=e.iterator.next();if(!t.done)return t;e.iterator=void 0}if(e.array){if(e.arrIndex({iterators:n?.includeRoot?[[e][Symbol.iterator]()]:[t(e)[Symbol.iterator]()],pruned:!1}),i=>{for(i.pruned&&(i.iterators.pop(),i.pruned=!1);i.iterators.length>0;){let o=i.iterators[i.iterators.length-1].next();if(o.done)i.iterators.pop();else return i.iterators.push(t(o.value)[Symbol.iterator]()),o}return Ce})}iterator(){let e={state:this.startFn(),next:a(()=>this.nextFn(e.state),"next"),prune:a(()=>{e.state.pruned=!0},"prune"),[Symbol.iterator]:()=>e};return e}},Ir;(function(r){function e(s){return s.reduce((o,l)=>o+l,0)}a(e,"sum"),r.sum=e;function t(s){return s.reduce((o,l)=>o*l,0)}a(t,"product"),r.product=t;function n(s){return s.reduce((o,l)=>Math.min(o,l))}a(n,"min"),r.min=n;function i(s){return s.reduce((o,l)=>Math.max(o,l))}a(i,"max"),r.max=i})(Ir||(Ir={}));function Zt(r){return new lt(r,e=>tt(e)?e.content:[],{includeRoot:!0})}a(Zt,"streamCst");function $h(r){return Zt(r).filter(Gt)}a($h,"flattenCst");function go(r,e){for(;r.container;)if(r=r.container,r===e)return!0;return!1}a(go,"isChildNode");function Nr(r){return{start:{character:r.startColumn-1,line:r.startLine-1},end:{character:r.endColumn,line:r.endLine-1}}}a(Nr,"tokenToRange");function er(r){if(!r)return;let{offset:e,end:t,range:n}=r;return{range:n,offset:e,end:t,length:t-e}}a(er,"toDocumentSegment");var ut;(function(r){r[r.Before=0]="Before",r[r.After=1]="After",r[r.OverlapFront=2]="OverlapFront",r[r.OverlapBack=3]="OverlapBack",r[r.Inside=4]="Inside",r[r.Outside=5]="Outside"})(ut||(ut={}));function Yu(r,e){if(r.end.linee.end.line||r.start.line===e.end.line&&r.start.character>=e.end.character)return ut.After;let t=r.start.line>e.start.line||r.start.line===e.start.line&&r.start.character>=e.start.character,n=r.end.lineut.After}a(yo,"inRange");var Cs=/^[\w\p{L}]$/u;function Ih(r,e,t=Cs){if(r){if(e>0){let n=e-r.offset,i=r.text.charAt(n);t.test(i)||e--}return Ro(r,e)}}a(Ih,"findDeclarationNodeAtOffset");function To(r,e){if(r){let t=Zu(r,!0);if(t&&mo(t,e))return t;if(Zn(r)){let n=r.content.findIndex(i=>!i.hidden);for(let i=n-1;i>=0;i--){let s=r.content[i];if(mo(s,e))return s}}}}a(To,"findCommentNode");function mo(r,e){return Gt(r)&&e.includes(r.tokenType.name)}a(mo,"isCommentNode");function Ro(r,e){if(Gt(r))return r;if(tt(r)){let t=Qu(r,e,!1);if(t)return Ro(t,e)}}a(Ro,"findLeafNodeAtOffset");function Ju(r,e){if(Gt(r))return r;if(tt(r)){let t=Qu(r,e,!0);if(t)return Ju(t,e)}}a(Ju,"findLeafNodeBeforeOffset");function Qu(r,e,t){let n=0,i=r.content.length-1,s;for(;n<=i;){let o=Math.floor((n+i)/2),l=r.content[o];if(l.offset<=e&&l.end>e)return l;l.end<=e?(s=t?l:void 0,n=o+1):i=o-1}return s}a(Qu,"binarySearch");function Zu(r,e=!0){for(;r.container;){let t=r.container,n=t.content.indexOf(r);for(;n>0;){n--;let i=t.content[n];if(e||!i.hidden)return i}r=t}}a(Zu,"getPreviousNode");function Nh(r,e=!0){for(;r.container;){let t=r.container,n=t.content.indexOf(r),i=t.content.length-1;for(;ntl,findNameAssignment:()=>Ws,findNodeForKeyword:()=>Zo,findNodeForProperty:()=>gi,findNodesForKeyword:()=>Jh,findNodesForKeywordInternal:()=>el,findNodesForProperty:()=>Jo,getActionAtElement:()=>uc,getActionType:()=>fc,getAllReachableRules:()=>mi,getCrossReferenceTerminal:()=>Xo,getEntryRule:()=>sc,getExplicitRuleType:()=>yn,getHiddenRules:()=>ac,getRuleType:()=>rl,getRuleTypeName:()=>rp,getTypeName:()=>Ti,isArrayCardinality:()=>Zh,isArrayOperator:()=>ep,isCommentTerminal:()=>Yo,isDataType:()=>tp,isDataTypeRule:()=>yi,isOptionalCardinality:()=>Qh,terminalRegex:()=>Tn});var tr=class extends Error{static{a(this,"ErrorWithLocation")}constructor(e,t){super(e?`${t} at ${e.range.start.line}:${e.range.start.character}`:t)}};function ct(r){throw new Error("Error! The input value was not handled.")}a(ct,"assertUnreachable");var ui={};qt(ui,{AbstractElement:()=>wr,AbstractRule:()=>Cr,AbstractType:()=>Sr,Action:()=>Xr,Alternatives:()=>Yr,ArrayLiteral:()=>_r,ArrayType:()=>Lr,Assignment:()=>Jr,BooleanLiteral:()=>Or,CharacterRange:()=>Qr,Condition:()=>ti,Conjunction:()=>Pr,CrossReference:()=>Zr,Disjunction:()=>br,EndOfFile:()=>en,Grammar:()=>Mr,GrammarImport:()=>ni,Group:()=>tn,InferredType:()=>Dr,Interface:()=>Fr,Keyword:()=>rn,LangiumGrammarAstReflection:()=>hn,LangiumGrammarTerminals:()=>_h,NamedArgument:()=>ii,NegatedToken:()=>nn,Negation:()=>Gr,NumberLiteral:()=>Ur,Parameter:()=>Br,ParameterReference:()=>Wr,ParserRule:()=>Kr,ReferenceType:()=>Vr,RegexToken:()=>sn,ReturnType:()=>si,RuleCall:()=>an,SimpleType:()=>jr,StringLiteral:()=>Hr,TerminalAlternatives:()=>on,TerminalGroup:()=>ln,TerminalRule:()=>rr,TerminalRuleCall:()=>un,Type:()=>zr,TypeAttribute:()=>ai,TypeDefinition:()=>ws,UnionType:()=>qr,UnorderedGroup:()=>cn,UntilToken:()=>fn,ValueLiteral:()=>ri,Wildcard:()=>dn,isAbstractElement:()=>oi,isAbstractRule:()=>Lh,isAbstractType:()=>Oh,isAction:()=>$t,isAlternatives:()=>Ps,isArrayLiteral:()=>Fh,isArrayType:()=>xo,isAssignment:()=>rt,isBooleanLiteral:()=>Eo,isCharacterRange:()=>So,isCondition:()=>Ph,isConjunction:()=>Ao,isCrossReference:()=>nr,isDisjunction:()=>vo,isEndOfFile:()=>wo,isFeatureName:()=>bh,isGrammar:()=>Gh,isGrammarImport:()=>Uh,isGroup:()=>Ut,isInferredType:()=>_s,isInterface:()=>Ls,isKeyword:()=>Ye,isNamedArgument:()=>Bh,isNegatedToken:()=>_o,isNegation:()=>ko,isNumberLiteral:()=>Wh,isParameter:()=>Kh,isParameterReference:()=>$o,isParserRule:()=>Se,isPrimitiveType:()=>ec,isReferenceType:()=>Io,isRegexToken:()=>Lo,isReturnType:()=>No,isRuleCall:()=>nt,isSimpleType:()=>Os,isStringLiteral:()=>Vh,isTerminalAlternatives:()=>Oo,isTerminalGroup:()=>Po,isTerminalRule:()=>He,isTerminalRuleCall:()=>bs,isType:()=>li,isTypeAttribute:()=>jh,isTypeDefinition:()=>Mh,isUnionType:()=>Co,isUnorderedGroup:()=>Ms,isUntilToken:()=>bo,isValueLiteral:()=>Dh,isWildcard:()=>Mo,reflection:()=>_});var _h={ID:/\^?[_a-zA-Z][\w_]*/,STRING:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,NUMBER:/NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)/,RegexLiteral:/\/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+\/[a-z]*/,WS:/\s+/,ML_COMMENT:/\/\*[\s\S]*?\*\//,SL_COMMENT:/\/\/[^\n\r]*/},Cr="AbstractRule";function Lh(r){return _.isInstance(r,Cr)}a(Lh,"isAbstractRule");var Sr="AbstractType";function Oh(r){return _.isInstance(r,Sr)}a(Oh,"isAbstractType");var ti="Condition";function Ph(r){return _.isInstance(r,ti)}a(Ph,"isCondition");function bh(r){return ec(r)||r==="current"||r==="entry"||r==="extends"||r==="false"||r==="fragment"||r==="grammar"||r==="hidden"||r==="import"||r==="interface"||r==="returns"||r==="terminal"||r==="true"||r==="type"||r==="infer"||r==="infers"||r==="with"||typeof r=="string"&&/\^?[_a-zA-Z][\w_]*/.test(r)}a(bh,"isFeatureName");function ec(r){return r==="string"||r==="number"||r==="boolean"||r==="Date"||r==="bigint"}a(ec,"isPrimitiveType");var ws="TypeDefinition";function Mh(r){return _.isInstance(r,ws)}a(Mh,"isTypeDefinition");var ri="ValueLiteral";function Dh(r){return _.isInstance(r,ri)}a(Dh,"isValueLiteral");var wr="AbstractElement";function oi(r){return _.isInstance(r,wr)}a(oi,"isAbstractElement");var _r="ArrayLiteral";function Fh(r){return _.isInstance(r,_r)}a(Fh,"isArrayLiteral");var Lr="ArrayType";function xo(r){return _.isInstance(r,Lr)}a(xo,"isArrayType");var Or="BooleanLiteral";function Eo(r){return _.isInstance(r,Or)}a(Eo,"isBooleanLiteral");var Pr="Conjunction";function Ao(r){return _.isInstance(r,Pr)}a(Ao,"isConjunction");var br="Disjunction";function vo(r){return _.isInstance(r,br)}a(vo,"isDisjunction");var Mr="Grammar";function Gh(r){return _.isInstance(r,Mr)}a(Gh,"isGrammar");var ni="GrammarImport";function Uh(r){return _.isInstance(r,ni)}a(Uh,"isGrammarImport");var Dr="InferredType";function _s(r){return _.isInstance(r,Dr)}a(_s,"isInferredType");var Fr="Interface";function Ls(r){return _.isInstance(r,Fr)}a(Ls,"isInterface");var ii="NamedArgument";function Bh(r){return _.isInstance(r,ii)}a(Bh,"isNamedArgument");var Gr="Negation";function ko(r){return _.isInstance(r,Gr)}a(ko,"isNegation");var Ur="NumberLiteral";function Wh(r){return _.isInstance(r,Ur)}a(Wh,"isNumberLiteral");var Br="Parameter";function Kh(r){return _.isInstance(r,Br)}a(Kh,"isParameter");var Wr="ParameterReference";function $o(r){return _.isInstance(r,Wr)}a($o,"isParameterReference");var Kr="ParserRule";function Se(r){return _.isInstance(r,Kr)}a(Se,"isParserRule");var Vr="ReferenceType";function Io(r){return _.isInstance(r,Vr)}a(Io,"isReferenceType");var si="ReturnType";function No(r){return _.isInstance(r,si)}a(No,"isReturnType");var jr="SimpleType";function Os(r){return _.isInstance(r,jr)}a(Os,"isSimpleType");var Hr="StringLiteral";function Vh(r){return _.isInstance(r,Hr)}a(Vh,"isStringLiteral");var rr="TerminalRule";function He(r){return _.isInstance(r,rr)}a(He,"isTerminalRule");var zr="Type";function li(r){return _.isInstance(r,zr)}a(li,"isType");var ai="TypeAttribute";function jh(r){return _.isInstance(r,ai)}a(jh,"isTypeAttribute");var qr="UnionType";function Co(r){return _.isInstance(r,qr)}a(Co,"isUnionType");var Xr="Action";function $t(r){return _.isInstance(r,Xr)}a($t,"isAction");var Yr="Alternatives";function Ps(r){return _.isInstance(r,Yr)}a(Ps,"isAlternatives");var Jr="Assignment";function rt(r){return _.isInstance(r,Jr)}a(rt,"isAssignment");var Qr="CharacterRange";function So(r){return _.isInstance(r,Qr)}a(So,"isCharacterRange");var Zr="CrossReference";function nr(r){return _.isInstance(r,Zr)}a(nr,"isCrossReference");var en="EndOfFile";function wo(r){return _.isInstance(r,en)}a(wo,"isEndOfFile");var tn="Group";function Ut(r){return _.isInstance(r,tn)}a(Ut,"isGroup");var rn="Keyword";function Ye(r){return _.isInstance(r,rn)}a(Ye,"isKeyword");var nn="NegatedToken";function _o(r){return _.isInstance(r,nn)}a(_o,"isNegatedToken");var sn="RegexToken";function Lo(r){return _.isInstance(r,sn)}a(Lo,"isRegexToken");var an="RuleCall";function nt(r){return _.isInstance(r,an)}a(nt,"isRuleCall");var on="TerminalAlternatives";function Oo(r){return _.isInstance(r,on)}a(Oo,"isTerminalAlternatives");var ln="TerminalGroup";function Po(r){return _.isInstance(r,ln)}a(Po,"isTerminalGroup");var un="TerminalRuleCall";function bs(r){return _.isInstance(r,un)}a(bs,"isTerminalRuleCall");var cn="UnorderedGroup";function Ms(r){return _.isInstance(r,cn)}a(Ms,"isUnorderedGroup");var fn="UntilToken";function bo(r){return _.isInstance(r,fn)}a(bo,"isUntilToken");var dn="Wildcard";function Mo(r){return _.isInstance(r,dn)}a(Mo,"isWildcard");var hn=class extends Jt{static{a(this,"LangiumGrammarAstReflection")}getAllTypes(){return[wr,Cr,Sr,Xr,Yr,_r,Lr,Jr,Or,Qr,ti,Pr,Zr,br,en,Mr,ni,tn,Dr,Fr,rn,ii,nn,Gr,Ur,Br,Wr,Kr,Vr,sn,si,an,jr,Hr,on,ln,rr,un,zr,ai,ws,qr,cn,fn,ri,dn]}computeIsSubtype(e,t){switch(e){case Xr:case Yr:case Jr:case Qr:case Zr:case en:case tn:case rn:case nn:case sn:case an:case on:case ln:case un:case cn:case fn:case dn:return this.isSubtype(wr,t);case _r:case Ur:case Hr:return this.isSubtype(ri,t);case Lr:case Vr:case jr:case qr:return this.isSubtype(ws,t);case Or:return this.isSubtype(ti,t)||this.isSubtype(ri,t);case Pr:case br:case Gr:case Wr:return this.isSubtype(ti,t);case Dr:case Fr:case zr:return this.isSubtype(Sr,t);case Kr:return this.isSubtype(Cr,t)||this.isSubtype(Sr,t);case rr:return this.isSubtype(Cr,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case"Action:type":case"CrossReference:type":case"Interface:superTypes":case"ParserRule:returnType":case"SimpleType:typeRef":return Sr;case"Grammar:hiddenTokens":case"ParserRule:hiddenTokens":case"RuleCall:rule":return Cr;case"Grammar:usedGrammars":return Mr;case"NamedArgument:parameter":case"ParameterReference:parameter":return Br;case"TerminalRuleCall:rule":return rr;default:throw new Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case wr:return{name:wr,properties:[{name:"cardinality"},{name:"lookahead"}]};case _r:return{name:_r,properties:[{name:"elements",defaultValue:[]}]};case Lr:return{name:Lr,properties:[{name:"elementType"}]};case Or:return{name:Or,properties:[{name:"true",defaultValue:!1}]};case Pr:return{name:Pr,properties:[{name:"left"},{name:"right"}]};case br:return{name:br,properties:[{name:"left"},{name:"right"}]};case Mr:return{name:Mr,properties:[{name:"definesHiddenTokens",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"imports",defaultValue:[]},{name:"interfaces",defaultValue:[]},{name:"isDeclared",defaultValue:!1},{name:"name"},{name:"rules",defaultValue:[]},{name:"types",defaultValue:[]},{name:"usedGrammars",defaultValue:[]}]};case ni:return{name:ni,properties:[{name:"path"}]};case Dr:return{name:Dr,properties:[{name:"name"}]};case Fr:return{name:Fr,properties:[{name:"attributes",defaultValue:[]},{name:"name"},{name:"superTypes",defaultValue:[]}]};case ii:return{name:ii,properties:[{name:"calledByName",defaultValue:!1},{name:"parameter"},{name:"value"}]};case Gr:return{name:Gr,properties:[{name:"value"}]};case Ur:return{name:Ur,properties:[{name:"value"}]};case Br:return{name:Br,properties:[{name:"name"}]};case Wr:return{name:Wr,properties:[{name:"parameter"}]};case Kr:return{name:Kr,properties:[{name:"dataType"},{name:"definesHiddenTokens",defaultValue:!1},{name:"definition"},{name:"entry",defaultValue:!1},{name:"fragment",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"inferredType"},{name:"name"},{name:"parameters",defaultValue:[]},{name:"returnType"},{name:"wildcard",defaultValue:!1}]};case Vr:return{name:Vr,properties:[{name:"referenceType"}]};case si:return{name:si,properties:[{name:"name"}]};case jr:return{name:jr,properties:[{name:"primitiveType"},{name:"stringType"},{name:"typeRef"}]};case Hr:return{name:Hr,properties:[{name:"value"}]};case rr:return{name:rr,properties:[{name:"definition"},{name:"fragment",defaultValue:!1},{name:"hidden",defaultValue:!1},{name:"name"},{name:"type"}]};case zr:return{name:zr,properties:[{name:"name"},{name:"type"}]};case ai:return{name:ai,properties:[{name:"defaultValue"},{name:"isOptional",defaultValue:!1},{name:"name"},{name:"type"}]};case qr:return{name:qr,properties:[{name:"types",defaultValue:[]}]};case Xr:return{name:Xr,properties:[{name:"cardinality"},{name:"feature"},{name:"inferredType"},{name:"lookahead"},{name:"operator"},{name:"type"}]};case Yr:return{name:Yr,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Jr:return{name:Jr,properties:[{name:"cardinality"},{name:"feature"},{name:"lookahead"},{name:"operator"},{name:"terminal"}]};case Qr:return{name:Qr,properties:[{name:"cardinality"},{name:"left"},{name:"lookahead"},{name:"right"}]};case Zr:return{name:Zr,properties:[{name:"cardinality"},{name:"deprecatedSyntax",defaultValue:!1},{name:"lookahead"},{name:"terminal"},{name:"type"}]};case en:return{name:en,properties:[{name:"cardinality"},{name:"lookahead"}]};case tn:return{name:tn,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"guardCondition"},{name:"lookahead"}]};case rn:return{name:rn,properties:[{name:"cardinality"},{name:"lookahead"},{name:"value"}]};case nn:return{name:nn,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case sn:return{name:sn,properties:[{name:"cardinality"},{name:"lookahead"},{name:"regex"}]};case an:return{name:an,properties:[{name:"arguments",defaultValue:[]},{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case on:return{name:on,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case ln:return{name:ln,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case un:return{name:un,properties:[{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case cn:return{name:cn,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case fn:return{name:fn,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case dn:return{name:dn,properties:[{name:"cardinality"},{name:"lookahead"}]};default:return{name:e,properties:[]}}}},_=new hn;var Fs={};qt(Fs,{assignMandatoryProperties:()=>Go,copyAstNode:()=>Fo,findLocalReferences:()=>zh,findRootNode:()=>ci,getContainerOfType:()=>ir,getDocument:()=>we,hasContainerOfType:()=>Hh,linkContentToContainer:()=>Ds,streamAllContents:()=>ft,streamAst:()=>Je,streamContents:()=>fi,streamReferences:()=>pn});function Ds(r){for(let[e,t]of Object.entries(r))e.startsWith("$")||(Array.isArray(t)?t.forEach((n,i)=>{le(n)&&(n.$container=r,n.$containerProperty=e,n.$containerIndex=i)}):le(t)&&(t.$container=r,t.$containerProperty=e))}a(Ds,"linkContentToContainer");function ir(r,e){let t=r;for(;t;){if(e(t))return t;t=t.$container}}a(ir,"getContainerOfType");function Hh(r,e){let t=r;for(;t;){if(e(t))return!0;t=t.$container}return!1}a(Hh,"hasContainerOfType");function we(r){let t=ci(r).$document;if(!t)throw new Error("AST node has no document.");return t}a(we,"getDocument");function ci(r){for(;r.$container;)r=r.$container;return r}a(ci,"findRootNode");function fi(r,e){if(!r)throw new Error("Node must be an AstNode.");let t=e?.range;return new je(()=>({keys:Object.keys(r),keyIndex:0,arrayIndex:0}),n=>{for(;n.keyIndexfi(t,e))}a(ft,"streamAllContents");function Je(r,e){if(r){if(e?.range&&!Do(r,e.range))return new lt(r,()=>[])}else throw new Error("Root node must be an AstNode.");return new lt(r,t=>fi(t,e),{includeRoot:!0})}a(Je,"streamAst");function Do(r,e){var t;if(!e)return!0;let n=(t=r.$cstNode)===null||t===void 0?void 0:t.range;return n?yo(n,e):!1}a(Do,"isAstNodeInRange");function pn(r){return new je(()=>({keys:Object.keys(r),keyIndex:0,arrayIndex:0}),e=>{for(;e.keyIndex{pn(n).forEach(i=>{i.reference.ref===r&&t.push(i.reference)})}),j(t)}a(zh,"findLocalReferences");function Go(r,e){let t=r.getTypeMetaData(e.$type),n=e;for(let i of t.properties)i.defaultValue!==void 0&&n[i.name]===void 0&&(n[i.name]=tc(i.defaultValue))}a(Go,"assignMandatoryProperties");function tc(r){return Array.isArray(r)?[...r.map(tc)]:r}a(tc,"copyDefaultValue");function Fo(r,e){let t={$type:r.$type};for(let[n,i]of Object.entries(r))if(!n.startsWith("$"))if(le(i))t[n]=Fo(i,e);else if(Ee(i))t[n]=e(t,n,i.$refNode,i.$refText);else if(Array.isArray(i)){let s=[];for(let o of i)le(o)?s.push(Fo(o,e)):Ee(o)?s.push(e(t,n,o.$refNode,o.$refText)):s.push(o);t[n]=s}else t[n]=i;return Ds(t),t}a(Fo,"copyAstNode");var Bs={};qt(Bs,{NEWLINE_REGEXP:()=>Ko,escapeRegExp:()=>lr,getCaseInsensitivePattern:()=>jo,getTerminalParts:()=>Yh,isMultilineComment:()=>Vo,isWhitespace:()=>gn,partialMatches:()=>Ho,partialRegExp:()=>ic,whitespaceCharacters:()=>nc});function w(r){return r.charCodeAt(0)}a(w,"cc");function Gs(r,e){Array.isArray(r)?r.forEach(function(t){e.push(t)}):e.push(r)}a(Gs,"insertToSet");function mn(r,e){if(r[e]===!0)throw"duplicate flag "+e;let t=r[e];r[e]=!0}a(mn,"addFlag");function sr(r){if(r===void 0)throw Error("Internal Error - Should never get here!");return!0}a(sr,"ASSERT_EXISTS");function di(){throw Error("Internal Error - Should never get here!")}a(di,"ASSERT_NEVER_REACH_HERE");function Uo(r){return r.type==="Character"}a(Uo,"isCharacter");var hi=[];for(let r=w("0");r<=w("9");r++)hi.push(r);var pi=[w("_")].concat(hi);for(let r=w("a");r<=w("z");r++)pi.push(r);for(let r=w("A");r<=w("Z");r++)pi.push(r);var Bo=[w(" "),w("\f"),w(` +`),w("\r"),w(" "),w("\v"),w(" "),w("\xA0"),w("\u1680"),w("\u2000"),w("\u2001"),w("\u2002"),w("\u2003"),w("\u2004"),w("\u2005"),w("\u2006"),w("\u2007"),w("\u2008"),w("\u2009"),w("\u200A"),w("\u2028"),w("\u2029"),w("\u202F"),w("\u205F"),w("\u3000"),w("\uFEFF")];var qh=/[0-9a-fA-F]/,Us=/[0-9]/,Xh=/[1-9]/,ar=class{static{a(this,"RegExpParser")}constructor(){this.idx=0,this.input="",this.groupIdx=0}saveState(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}}restoreState(e){this.idx=e.idx,this.input=e.input,this.groupIdx=e.groupIdx}pattern(e){this.idx=0,this.input=e,this.groupIdx=0,this.consumeChar("/");let t=this.disjunction();this.consumeChar("/");let n={type:"Flags",loc:{begin:this.idx,end:e.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};for(;this.isRegExpFlag();)switch(this.popChar()){case"g":mn(n,"global");break;case"i":mn(n,"ignoreCase");break;case"m":mn(n,"multiLine");break;case"u":mn(n,"unicode");break;case"y":mn(n,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:t,loc:this.loc(0)}}disjunction(){let e=[],t=this.idx;for(e.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),e.push(this.alternative());return{type:"Disjunction",value:e,loc:this.loc(t)}}alternative(){let e=[],t=this.idx;for(;this.isTerm();)e.push(this.term());return{type:"Alternative",value:e,loc:this.loc(t)}}term(){return this.isAssertion()?this.assertion():this.atom()}assertion(){let e=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(e)};case"$":return{type:"EndAnchor",loc:this.loc(e)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(e)};case"B":return{type:"NonWordBoundary",loc:this.loc(e)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");let t;switch(this.popChar()){case"=":t="Lookahead";break;case"!":t="NegativeLookahead";break}sr(t);let n=this.disjunction();return this.consumeChar(")"),{type:t,value:n,loc:this.loc(e)}}return di()}quantifier(e=!1){let t,n=this.idx;switch(this.popChar()){case"*":t={atLeast:0,atMost:1/0};break;case"+":t={atLeast:1,atMost:1/0};break;case"?":t={atLeast:0,atMost:1};break;case"{":let i=this.integerIncludingZero();switch(this.popChar()){case"}":t={atLeast:i,atMost:i};break;case",":let s;this.isDigit()?(s=this.integerIncludingZero(),t={atLeast:i,atMost:s}):t={atLeast:i,atMost:1/0},this.consumeChar("}");break}if(e===!0&&t===void 0)return;sr(t);break}if(!(e===!0&&t===void 0)&&sr(t))return this.peekChar(0)==="?"?(this.consumeChar("?"),t.greedy=!1):t.greedy=!0,t.type="Quantifier",t.loc=this.loc(n),t}atom(){let e,t=this.idx;switch(this.peekChar()){case".":e=this.dotAll();break;case"\\":e=this.atomEscape();break;case"[":e=this.characterClass();break;case"(":e=this.group();break}return e===void 0&&this.isPatternCharacter()&&(e=this.patternCharacter()),sr(e)?(e.loc=this.loc(t),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):di()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[w(` +`),w("\r"),w("\u2028"),w("\u2029")]}}atomEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}decimalEscapeAtom(){return{type:"GroupBackReference",value:this.positiveInteger()}}characterClassEscape(){let e,t=!1;switch(this.popChar()){case"d":e=hi;break;case"D":e=hi,t=!0;break;case"s":e=Bo;break;case"S":e=Bo,t=!0;break;case"w":e=pi;break;case"W":e=pi,t=!0;break}return sr(e)?{type:"Set",value:e,complement:t}:di()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=w("\f");break;case"n":e=w(` +`);break;case"r":e=w("\r");break;case"t":e=w(" ");break;case"v":e=w("\v");break}return sr(e)?{type:"Character",value:e}:di()}controlLetterEscapeAtom(){this.consumeChar("c");let e=this.popChar();if(/[a-zA-Z]/.test(e)===!1)throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:w("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){let e=this.popChar();return{type:"Character",value:w(e)}}classPatternCharacterAtom(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:let e=this.popChar();return{type:"Character",value:w(e)}}}characterClass(){let e=[],t=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),t=!0);this.isClassAtom();){let n=this.classAtom(),i=n.type==="Character";if(Uo(n)&&this.isRangeDash()){this.consumeChar("-");let s=this.classAtom(),o=s.type==="Character";if(Uo(s)){if(s.value=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}};var dt=class{static{a(this,"BaseRegExpVisitor")}visitChildren(e){for(let t in e){let n=e[t];e.hasOwnProperty(t)&&(n.type!==void 0?this.visit(n):Array.isArray(n)&&n.forEach(i=>{this.visit(i)},this))}}visit(e){switch(e.type){case"Pattern":this.visitPattern(e);break;case"Flags":this.visitFlags(e);break;case"Disjunction":this.visitDisjunction(e);break;case"Alternative":this.visitAlternative(e);break;case"StartAnchor":this.visitStartAnchor(e);break;case"EndAnchor":this.visitEndAnchor(e);break;case"WordBoundary":this.visitWordBoundary(e);break;case"NonWordBoundary":this.visitNonWordBoundary(e);break;case"Lookahead":this.visitLookahead(e);break;case"NegativeLookahead":this.visitNegativeLookahead(e);break;case"Character":this.visitCharacter(e);break;case"Set":this.visitSet(e);break;case"Group":this.visitGroup(e);break;case"GroupBackReference":this.visitGroupBackReference(e);break;case"Quantifier":this.visitQuantifier(e);break}this.visitChildren(e)}visitPattern(e){}visitFlags(e){}visitDisjunction(e){}visitAlternative(e){}visitStartAnchor(e){}visitEndAnchor(e){}visitWordBoundary(e){}visitNonWordBoundary(e){}visitLookahead(e){}visitNegativeLookahead(e){}visitCharacter(e){}visitSet(e){}visitGroup(e){}visitGroupBackReference(e){}visitQuantifier(e){}};var Ko=/\r?\n/gm,rc=new ar,Wo=class extends dt{static{a(this,"TerminalRegExpVisitor")}constructor(){super(...arguments),this.isStarting=!0,this.endRegexpStack=[],this.multiline=!1}get endRegex(){return this.endRegexpStack.join("")}reset(e){this.multiline=!1,this.regex=e,this.startRegexp="",this.isStarting=!0,this.endRegexpStack=[]}visitGroup(e){e.quantifier&&(this.isStarting=!1,this.endRegexpStack=[])}visitCharacter(e){let t=String.fromCharCode(e.value);if(!this.multiline&&t===` +`&&(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let n=lr(t);this.endRegexpStack.push(n),this.isStarting&&(this.startRegexp+=n)}}visitSet(e){if(!this.multiline){let t=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(t);this.multiline=!!` +`.match(n)}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let t=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(t),this.isStarting&&(this.startRegexp+=t)}}visitChildren(e){e.type==="Group"&&e.quantifier||super.visitChildren(e)}},or=new Wo;function Yh(r){try{typeof r!="string"&&(r=r.source),r=`/${r}/`;let e=rc.pattern(r),t=[];for(let n of e.value.value)or.reset(r),or.visit(n),t.push({start:or.startRegexp,end:or.endRegex});return t}catch{return[]}}a(Yh,"getTerminalParts");function Vo(r){try{return typeof r=="string"&&(r=new RegExp(r)),r=r.toString(),or.reset(r),or.visit(rc.pattern(r)),or.multiline}catch{return!1}}a(Vo,"isMultilineComment");var nc=`\f +\r \v \xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF`.split("");function gn(r){let e=typeof r=="string"?new RegExp(r):r;return nc.some(t=>e.test(t))}a(gn,"isWhitespace");function lr(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}a(lr,"escapeRegExp");function jo(r){return Array.prototype.map.call(r,e=>/\w/.test(e)?`[${e.toLowerCase()}${e.toUpperCase()}]`:lr(e)).join("")}a(jo,"getCaseInsensitivePattern");function Ho(r,e){let t=ic(r),n=e.match(t);return!!n&&n[0].length>0}a(Ho,"partialMatches");function ic(r){typeof r=="string"&&(r=new RegExp(r));let e=r,t=r.source,n=0;function i(){let s="",o;function l(c){s+=t.substr(n,c),n+=c}a(l,"appendRaw");function u(c){s+="(?:"+t.substr(n,c)+"|$)",n+=c}for(a(u,"appendOptional");n",n)-n+1);break;default:u(2);break}break;case"[":o=/\[(?:\\.|.)*?\]/g,o.lastIndex=n,o=o.exec(t)||[],u(o[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":l(1);break;case"{":o=/\{\d+,?\d*\}/g,o.lastIndex=n,o=o.exec(t),o?l(o[0].length):u(1);break;case"(":if(t[n+1]==="?")switch(t[n+2]){case":":s+="(?:",n+=3,s+=i()+"|$)";break;case"=":s+="(?=",n+=3,s+=i()+")";break;case"!":o=n,n+=3,i(),s+=t.substr(o,n-o);break;case"<":switch(t[n+3]){case"=":case"!":o=n,n+=4,i(),s+=t.substr(o,n-o);break;default:l(t.indexOf(">",n)-n+1),s+=i()+"|$)";break}break}else l(1),s+=i()+"|$)";break;case")":return++n,s;default:u(1);break}return s}return a(i,"process"),new RegExp(i(),r.flags)}a(ic,"partialRegExp");function sc(r){return r.rules.find(e=>Se(e)&&e.entry)}a(sc,"getEntryRule");function ac(r){return r.rules.filter(e=>He(e)&&e.hidden)}a(ac,"getHiddenRules");function mi(r,e){let t=new Set,n=sc(r);if(!n)return new Set(r.rules);let i=[n].concat(ac(r));for(let o of i)oc(o,t,e);let s=new Set;for(let o of r.rules)(t.has(o.name)||He(o)&&o.hidden)&&s.add(o);return s}a(mi,"getAllReachableRules");function oc(r,e,t){e.add(r.name),ft(r).forEach(n=>{if(nt(n)||t&&bs(n)){let i=n.rule.ref;i&&!e.has(i.name)&&oc(i,e,t)}})}a(oc,"ruleDfs");function Xo(r){if(r.terminal)return r.terminal;if(r.type.ref){let e=Ws(r.type.ref);return e?.terminal}}a(Xo,"getCrossReferenceTerminal");function Yo(r){return r.hidden&&!gn(Tn(r))}a(Yo,"isCommentTerminal");function Jo(r,e){return!r||!e?[]:Qo(r,e,r.astNode,!0)}a(Jo,"findNodesForProperty");function gi(r,e,t){if(!r||!e)return;let n=Qo(r,e,r.astNode,!0);if(n.length!==0)return t!==void 0?t=Math.max(0,Math.min(t,n.length-1)):t=0,n[t]}a(gi,"findNodeForProperty");function Qo(r,e,t,n){if(!n){let i=ir(r.grammarSource,rt);if(i&&i.feature===e)return[r]}return tt(r)&&r.astNode===t?r.content.flatMap(i=>Qo(i,e,t,!1)):[]}a(Qo,"findNodesForPropertyInternal");function Jh(r,e){return r?el(r,e,r?.astNode):[]}a(Jh,"findNodesForKeyword");function Zo(r,e,t){if(!r)return;let n=el(r,e,r?.astNode);if(n.length!==0)return t!==void 0?t=Math.max(0,Math.min(t,n.length-1)):t=0,n[t]}a(Zo,"findNodeForKeyword");function el(r,e,t){if(r.astNode!==t)return[];if(Ye(r.grammarSource)&&r.grammarSource.value===e)return[r];let n=Zt(r).iterator(),i,s=[];do if(i=n.next(),!i.done){let o=i.value;o.astNode===t?Ye(o.grammarSource)&&o.grammarSource.value===e&&s.push(o):n.prune()}while(!i.done);return s}a(el,"findNodesForKeywordInternal");function tl(r){var e;let t=r.astNode;for(;t===((e=r.container)===null||e===void 0?void 0:e.astNode);){let n=ir(r.grammarSource,rt);if(n)return n;r=r.container}}a(tl,"findAssignment");function Ws(r){let e=r;return _s(e)&&($t(e.$container)?e=e.$container.$container:Se(e.$container)?e=e.$container:ct(e.$container)),lc(r,e,new Map)}a(Ws,"findNameAssignment");function lc(r,e,t){var n;function i(s,o){let l;return ir(s,rt)||(l=lc(o,o,t)),t.set(r,l),l}if(a(i,"go"),t.has(r))return t.get(r);t.set(r,void 0);for(let s of ft(e)){if(rt(s)&&s.feature.toLowerCase()==="name")return t.set(r,s),s;if(nt(s)&&Se(s.rule.ref))return i(s,s.rule.ref);if(Os(s)&&(!((n=s.typeRef)===null||n===void 0)&&n.ref))return i(s,s.typeRef.ref)}}a(lc,"findNameAssignmentInternal");function uc(r){let e=r.$container;if(Ut(e)){let t=e.elements,n=t.indexOf(r);for(let i=n-1;i>=0;i--){let s=t[i];if($t(s))return s;{let o=ft(t[i]).find($t);if(o)return o}}}if(oi(e))return uc(e)}a(uc,"getActionAtElement");function Qh(r,e){return r==="?"||r==="*"||Ut(e)&&!!e.guardCondition}a(Qh,"isOptionalCardinality");function Zh(r){return r==="*"||r==="+"}a(Zh,"isArrayCardinality");function ep(r){return r==="+="}a(ep,"isArrayOperator");function yi(r){return cc(r,new Set)}a(yi,"isDataTypeRule");function cc(r,e){if(e.has(r))return!0;e.add(r);for(let t of ft(r))if(nt(t)){if(!t.rule.ref||Se(t.rule.ref)&&!cc(t.rule.ref,e))return!1}else{if(rt(t))return!1;if($t(t))return!1}return!!r.definition}a(cc,"isDataTypeRuleInternal");function tp(r){return qo(r.type,new Set)}a(tp,"isDataType");function qo(r,e){if(e.has(r))return!0;if(e.add(r),xo(r))return!1;if(Io(r))return!1;if(Co(r))return r.types.every(t=>qo(t,e));if(Os(r)){if(r.primitiveType!==void 0)return!0;if(r.stringType!==void 0)return!0;if(r.typeRef!==void 0){let t=r.typeRef.ref;return li(t)?qo(t.type,e):!1}else return!1}else return!1}a(qo,"isDataTypeInternal");function yn(r){if(r.inferredType)return r.inferredType.name;if(r.dataType)return r.dataType;if(r.returnType){let e=r.returnType.ref;if(e){if(Se(e))return e.name;if(Ls(e)||li(e))return e.name}}}a(yn,"getExplicitRuleType");function Ti(r){var e;if(Se(r))return yi(r)?r.name:(e=yn(r))!==null&&e!==void 0?e:r.name;if(Ls(r)||li(r)||No(r))return r.name;if($t(r)){let t=fc(r);if(t)return t}else if(_s(r))return r.name;throw new Error("Cannot get name of Unknown Type")}a(Ti,"getTypeName");function fc(r){var e;if(r.inferredType)return r.inferredType.name;if(!((e=r.type)===null||e===void 0)&&e.ref)return Ti(r.type.ref)}a(fc,"getActionType");function rp(r){var e,t,n;return He(r)?(t=(e=r.type)===null||e===void 0?void 0:e.name)!==null&&t!==void 0?t:"string":yi(r)?r.name:(n=yn(r))!==null&&n!==void 0?n:r.name}a(rp,"getRuleTypeName");function rl(r){var e,t,n;return He(r)?(t=(e=r.type)===null||e===void 0?void 0:e.name)!==null&&t!==void 0?t:"string":(n=yn(r))!==null&&n!==void 0?n:r.name}a(rl,"getRuleType");function Tn(r){let e={s:!1,i:!1,u:!1},t=Rn(r.definition,e),n=Object.entries(e).filter(([,i])=>i).map(([i])=>i).join("");return new RegExp(t,n)}a(Tn,"terminalRegex");var nl=/[\s\S]/.source;function Rn(r,e){if(Oo(r))return np(r);if(Po(r))return ip(r);if(So(r))return op(r);if(bs(r)){let t=r.rule.ref;if(!t)throw new Error("Missing rule reference.");return It(Rn(t.definition),{cardinality:r.cardinality,lookahead:r.lookahead})}else{if(_o(r))return ap(r);if(bo(r))return sp(r);if(Lo(r)){let t=r.regex.lastIndexOf("/"),n=r.regex.substring(1,t),i=r.regex.substring(t+1);return e&&(e.i=i.includes("i"),e.s=i.includes("s"),e.u=i.includes("u")),It(n,{cardinality:r.cardinality,lookahead:r.lookahead,wrap:!1})}else{if(Mo(r))return It(nl,{cardinality:r.cardinality,lookahead:r.lookahead});throw new Error(`Invalid terminal element: ${r?.$type}`)}}}a(Rn,"abstractElementToRegex");function np(r){return It(r.elements.map(e=>Rn(e)).join("|"),{cardinality:r.cardinality,lookahead:r.lookahead})}a(np,"terminalAlternativesToRegex");function ip(r){return It(r.elements.map(e=>Rn(e)).join(""),{cardinality:r.cardinality,lookahead:r.lookahead})}a(ip,"terminalGroupToRegex");function sp(r){return It(`${nl}*?${Rn(r.terminal)}`,{cardinality:r.cardinality,lookahead:r.lookahead})}a(sp,"untilTokenToRegex");function ap(r){return It(`(?!${Rn(r.terminal)})${nl}*?`,{cardinality:r.cardinality,lookahead:r.lookahead})}a(ap,"negateTokenToRegex");function op(r){return r.right?It(`[${zo(r.left)}-${zo(r.right)}]`,{cardinality:r.cardinality,lookahead:r.lookahead,wrap:!1}):It(zo(r.left),{cardinality:r.cardinality,lookahead:r.lookahead,wrap:!1})}a(op,"characterRangeToRegex");function zo(r){return lr(r.value)}a(zo,"keywordToRegex");function It(r,e){var t;return(e.wrap!==!1||e.lookahead)&&(r=`(${(t=e.lookahead)!==null&&t!==void 0?t:""}${r})`),e.cardinality?`${r}${e.cardinality}`:r}a(It,"withCardinality");function il(r){let e=[],t=r.Grammar;for(let n of t.rules)He(n)&&Yo(n)&&Vo(Tn(n))&&e.push(n.name);return{multilineCommentRules:e,nameRegexp:Cs}}a(il,"createGrammarConfig");function xn(r){console&&console.error&&console.error(`Error: ${r}`)}a(xn,"PRINT_ERROR");function Ri(r){console&&console.warn&&console.warn(`Warning: ${r}`)}a(Ri,"PRINT_WARNING");function xi(r){let e=new Date().getTime(),t=r();return{time:new Date().getTime()-e,value:t}}a(xi,"timer");function Ei(r){function e(){}a(e,"FakeConstructor"),e.prototype=r;let t=new e;function n(){return typeof t.bar}return a(n,"fakeAccess"),n(),n(),r;(0,eval)(r)}a(Ei,"toFastProperties");function lp(r){return up(r)?r.LABEL:r.name}a(lp,"tokenLabel");function up(r){return Ne(r.LABEL)&&r.LABEL!==""}a(up,"hasTokenLabel");var ze=class{static{a(this,"AbstractProduction")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){this._definition=e}accept(e){e.visit(this),$(this.definition,t=>{t.accept(e)})}},H=class extends ze{static{a(this,"NonTerminal")}constructor(e){super([]),this.idx=1,ke(this,Ve(e,t=>t!==void 0))}set definition(e){}get definition(){return this.referencedRule!==void 0?this.referencedRule.definition:[]}accept(e){e.visit(this)}},Me=class extends ze{static{a(this,"Rule")}constructor(e){super(e.definition),this.orgText="",ke(this,Ve(e,t=>t!==void 0))}},J=class extends ze{static{a(this,"Alternative")}constructor(e){super(e.definition),this.ignoreAmbiguities=!1,ke(this,Ve(e,t=>t!==void 0))}},z=class extends ze{static{a(this,"Option")}constructor(e){super(e.definition),this.idx=1,ke(this,Ve(e,t=>t!==void 0))}},Q=class extends ze{static{a(this,"RepetitionMandatory")}constructor(e){super(e.definition),this.idx=1,ke(this,Ve(e,t=>t!==void 0))}},Z=class extends ze{static{a(this,"RepetitionMandatoryWithSeparator")}constructor(e){super(e.definition),this.idx=1,ke(this,Ve(e,t=>t!==void 0))}},G=class extends ze{static{a(this,"Repetition")}constructor(e){super(e.definition),this.idx=1,ke(this,Ve(e,t=>t!==void 0))}},q=class extends ze{static{a(this,"RepetitionWithSeparator")}constructor(e){super(e.definition),this.idx=1,ke(this,Ve(e,t=>t!==void 0))}},X=class extends ze{static{a(this,"Alternation")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){super(e.definition),this.idx=1,this.ignoreAmbiguities=!1,this.hasPredicates=!1,ke(this,Ve(e,t=>t!==void 0))}},D=class{static{a(this,"Terminal")}constructor(e){this.idx=1,ke(this,Ve(e,t=>t!==void 0))}accept(e){e.visit(this)}};function Vs(r){return E(r,En)}a(Vs,"serializeGrammar");function En(r){function e(t){return E(t,En)}if(a(e,"convertDefinition"),r instanceof H){let t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return Ne(r.label)&&(t.label=r.label),t}else{if(r instanceof J)return{type:"Alternative",definition:e(r.definition)};if(r instanceof z)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof Q)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof Z)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:En(new D({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof q)return{type:"RepetitionWithSeparator",idx:r.idx,separator:En(new D({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof G)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof X)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof D){let t={type:"Terminal",name:r.terminalType.name,label:lp(r.terminalType),idx:r.idx};Ne(r.label)&&(t.terminalLabel=r.label);let n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(t.pattern=et(n)?n.source:n),t}else{if(r instanceof Me)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}a(En,"serializeProduction");var De=class{static{a(this,"GAstVisitor")}visit(e){let t=e;switch(t.constructor){case H:return this.visitNonTerminal(t);case J:return this.visitAlternative(t);case z:return this.visitOption(t);case Q:return this.visitRepetitionMandatory(t);case Z:return this.visitRepetitionMandatoryWithSeparator(t);case q:return this.visitRepetitionWithSeparator(t);case G:return this.visitRepetition(t);case X:return this.visitAlternation(t);case D:return this.visitTerminal(t);case Me:return this.visitRule(t);default:throw Error("non exhaustive match")}}visitNonTerminal(e){}visitAlternative(e){}visitOption(e){}visitRepetition(e){}visitRepetitionMandatory(e){}visitRepetitionMandatoryWithSeparator(e){}visitRepetitionWithSeparator(e){}visitAlternation(e){}visitTerminal(e){}visitRule(e){}};function sl(r){return r instanceof J||r instanceof z||r instanceof G||r instanceof Q||r instanceof Z||r instanceof q||r instanceof D||r instanceof Me}a(sl,"isSequenceProd");function ur(r,e=[]){return r instanceof z||r instanceof G||r instanceof q?!0:r instanceof X?Is(r.definition,n=>ur(n,e)):r instanceof H&&oe(e,r)?!1:r instanceof ze?(r instanceof H&&e.push(r),Pe(r.definition,n=>ur(n,e))):!1}a(ur,"isOptionalProd");function al(r){return r instanceof X}a(al,"isBranchingProd");function We(r){if(r instanceof H)return"SUBRULE";if(r instanceof z)return"OPTION";if(r instanceof X)return"OR";if(r instanceof Q)return"AT_LEAST_ONE";if(r instanceof Z)return"AT_LEAST_ONE_SEP";if(r instanceof q)return"MANY_SEP";if(r instanceof G)return"MANY";if(r instanceof D)return"CONSUME";throw Error("non exhaustive match")}a(We,"getProductionDslName");var Nt=class{static{a(this,"RestWalker")}walk(e,t=[]){$(e.definition,(n,i)=>{let s=pe(e.definition,i+1);if(n instanceof H)this.walkProdRef(n,s,t);else if(n instanceof D)this.walkTerminal(n,s,t);else if(n instanceof J)this.walkFlat(n,s,t);else if(n instanceof z)this.walkOption(n,s,t);else if(n instanceof Q)this.walkAtLeastOne(n,s,t);else if(n instanceof Z)this.walkAtLeastOneSep(n,s,t);else if(n instanceof q)this.walkManySep(n,s,t);else if(n instanceof G)this.walkMany(n,s,t);else if(n instanceof X)this.walkOr(n,s,t);else throw Error("non exhaustive match")})}walkTerminal(e,t,n){}walkProdRef(e,t,n){}walkFlat(e,t,n){let i=t.concat(n);this.walk(e,i)}walkOption(e,t,n){let i=t.concat(n);this.walk(e,i)}walkAtLeastOne(e,t,n){let i=[new z({definition:e.definition})].concat(t,n);this.walk(e,i)}walkAtLeastOneSep(e,t,n){let i=dc(e,t,n);this.walk(e,i)}walkMany(e,t,n){let i=[new z({definition:e.definition})].concat(t,n);this.walk(e,i)}walkManySep(e,t,n){let i=dc(e,t,n);this.walk(e,i)}walkOr(e,t,n){let i=t.concat(n);$(e.definition,s=>{let o=new J({definition:[s]});this.walk(o,i)})}};function dc(r,e,t){return[new z({definition:[new D({terminalType:r.separator})].concat(r.definition)})].concat(e,t)}a(dc,"restForRepetitionWithSeparator");function cr(r){if(r instanceof H)return cr(r.referencedRule);if(r instanceof D)return dp(r);if(sl(r))return cp(r);if(al(r))return fp(r);throw Error("non exhaustive match")}a(cr,"first");function cp(r){let e=[],t=r.definition,n=0,i=t.length>n,s,o=!0;for(;i&&o;)s=t[n],o=ur(s),e=e.concat(cr(s)),n=n+1,i=t.length>n;return Qn(e)}a(cp,"firstForSequence");function fp(r){let e=E(r.definition,t=>cr(t));return Qn(he(e))}a(fp,"firstForBranching");function dp(r){return[r.terminalType]}a(dp,"firstForTerminal");var js="_~IN~_";var ol=class extends Nt{static{a(this,"ResyncFollowsWalker")}constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,t,n){}walkProdRef(e,t,n){let i=hp(e.referencedRule,e.idx)+this.topProd.name,s=t.concat(n),o=new J({definition:s}),l=cr(o);this.follows[i]=l}};function hc(r){let e={};return $(r,t=>{let n=new ol(t).startWalking();ke(e,n)}),e}a(hc,"computeAllProdsFollows");function hp(r,e){return r.name+e+js}a(hp,"buildBetweenProdsFollowPrefix");var Hs={},pp=new ar;function An(r){let e=r.toString();if(Hs.hasOwnProperty(e))return Hs[e];{let t=pp.pattern(e);return Hs[e]=t,t}}a(An,"getRegExpAst");function pc(){Hs={}}a(pc,"clearRegExpParserCache");var gc="Complement Sets are not supported for first char optimization",Ai=`Unable to use "first char" lexer optimizations: +`;function yc(r,e=!1){try{let t=An(r);return ll(t.value,{},t.flags.ignoreCase)}catch(t){if(t.message===gc)e&&Ri(`${Ai} Unable to optimize: < ${r.toString()} > + Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),xn(`${Ai} + Failed parsing: < ${r.toString()} > + Using the @chevrotain/regexp-to-ast library + Please open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}a(yc,"getOptimizedStartCodesIndices");function ll(r,e,t){switch(r.type){case"Disjunction":for(let i=0;i{if(typeof u=="number")zs(u,e,t);else{let c=u;if(t===!0)for(let f=c.from;f<=c.to;f++)zs(f,e,t);else{for(let f=c.from;f<=c.to&&f=vn){let f=c.from>=vn?c.from:vn,d=c.to,h=ht(f),p=ht(d);for(let g=h;g<=p;g++)e[g]=g}}}});break;case"Group":ll(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}let l=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&ul(o)===!1||o.type!=="Group"&&l===!1)break}break;default:throw Error("non exhaustive match!")}return re(e)}a(ll,"firstCharOptimizedIndices");function zs(r,e,t){let n=ht(r);e[n]=n,t===!0&&mp(r,e)}a(zs,"addOptimizedIdxToResult");function mp(r,e){let t=String.fromCharCode(r),n=t.toUpperCase();if(n!==t){let i=ht(n.charCodeAt(0));e[i]=i}else{let i=t.toLowerCase();if(i!==t){let s=ht(i.charCodeAt(0));e[s]=s}}}a(mp,"handleIgnoreCase");function mc(r,e){return kt(r.value,t=>{if(typeof t=="number")return oe(e,t);{let n=t;return kt(e,i=>n.from<=i&&i<=n.to)!==void 0}})}a(mc,"findCode");function ul(r){let e=r.quantifier;return e&&e.atLeast===0?!0:r.value?ge(r.value)?Pe(r.value,ul):ul(r.value):!1}a(ul,"isWholeOptional");var cl=class extends dt{static{a(this,"CharCodeFinder")}constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(this.found!==!0){switch(e.type){case"Lookahead":this.visitLookahead(e);return;case"NegativeLookahead":this.visitNegativeLookahead(e);return}super.visitChildren(e)}}visitCharacter(e){oe(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?mc(e,this.targetCharCodes)===void 0&&(this.found=!0):mc(e,this.targetCharCodes)!==void 0&&(this.found=!0)}};function qs(r,e){if(e instanceof RegExp){let t=An(e),n=new cl(r);return n.visit(t),n.found}else return kt(e,t=>oe(r,t.charCodeAt(0)))!==void 0}a(qs,"canMatchCharCode");var fr="PATTERN",kn="defaultMode",Xs="modes",dl=typeof new RegExp("(?:)").sticky=="boolean";function xc(r,e){e=Jn(e,{useSticky:dl,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:a((A,R)=>R(),"tracer")});let t=e.tracer;t("initCharCodeToOptimizedIndexMap",()=>{Op()});let n;t("Reject Lexer.NA",()=>{n=Yt(r,A=>A[fr]===se.NA)});let i=!1,s;t("Transform Patterns",()=>{i=!1,s=E(n,A=>{let R=A[fr];if(et(R)){let P=R.source;return P.length===1&&P!=="^"&&P!=="$"&&P!=="."&&!R.ignoreCase?P:P.length===2&&P[0]==="\\"&&!oe(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],P[1])?P[1]:e.useSticky?Rc(R):Tc(R)}else{if(ot(R))return i=!0,{exec:R};if(typeof R=="object")return i=!0,R;if(typeof R=="string"){if(R.length===1)return R;{let P=R.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),b=new RegExp(P);return e.useSticky?Rc(b):Tc(b)}}else throw Error("non exhaustive match")}})});let o,l,u,c,f;t("misc mapping",()=>{o=E(n,A=>A.tokenTypeIdx),l=E(n,A=>{let R=A.GROUP;if(R!==se.SKIPPED){if(Ne(R))return R;if(be(R))return!1;throw Error("non exhaustive match")}}),u=E(n,A=>{let R=A.LONGER_ALT;if(R)return ge(R)?E(R,b=>ho(n,b)):[ho(n,R)]}),c=E(n,A=>A.PUSH_MODE),f=E(n,A=>I(A,"POP_MODE"))});let d;t("Line Terminator Handling",()=>{let A=Cc(e.lineTerminatorCharacters);d=E(n,R=>!1),e.positionTracking!=="onlyOffset"&&(d=E(n,R=>I(R,"LINE_BREAKS")?!!R.LINE_BREAKS:Nc(R,A)===!1&&qs(A,R.PATTERN)))});let h,p,g,y;t("Misc Mapping #2",()=>{h=E(n,$c),p=E(s,_p),g=ue(n,(A,R)=>{let P=R.GROUP;return Ne(P)&&P!==se.SKIPPED&&(A[P]=[]),A},{}),y=E(s,(A,R)=>({pattern:s[R],longerAlt:u[R],canLineTerminator:d[R],isCustom:h[R],short:p[R],group:l[R],push:c[R],pop:f[R],tokenTypeIdx:o[R],tokenType:n[R]}))});let v=!0,x=[];return e.safeMode||t("First Char Optimization",()=>{x=ue(n,(A,R,P)=>{if(typeof R.PATTERN=="string"){let b=R.PATTERN.charCodeAt(0),Te=ht(b);fl(A,Te,y[P])}else if(ge(R.START_CHARS_HINT)){let b;$(R.START_CHARS_HINT,Te=>{let kr=typeof Te=="string"?Te.charCodeAt(0):Te,Ae=ht(kr);b!==Ae&&(b=Ae,fl(A,Ae,y[P]))})}else if(et(R.PATTERN))if(R.PATTERN.unicode)v=!1,e.ensureOptimizations&&xn(`${Ai} Unable to analyze < ${R.PATTERN.toString()} > pattern. + The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{let b=yc(R.PATTERN,e.ensureOptimizations);M(b)&&(v=!1),$(b,Te=>{fl(A,Te,y[P])})}else e.ensureOptimizations&&xn(`${Ai} TokenType: <${R.name}> is using a custom token pattern without providing parameter. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),v=!1;return A},[])}),{emptyGroups:g,patternIdxToConfig:y,charCodeToPatternIdxToConfig:x,hasCustom:i,canBeOptimized:v}}a(xc,"analyzeTokenTypes");function Ec(r,e){let t=[],n=yp(r);t=t.concat(n.errors);let i=Tp(n.valid),s=i.valid;return t=t.concat(i.errors),t=t.concat(gp(s)),t=t.concat(Ip(s)),t=t.concat(Np(s,e)),t=t.concat(Cp(s)),t}a(Ec,"validatePatterns");function gp(r){let e=[],t=xe(r,n=>et(n[fr]));return e=e.concat(xp(t)),e=e.concat(vp(t)),e=e.concat(kp(t)),e=e.concat($p(t)),e=e.concat(Ep(t)),e}a(gp,"validateRegExpPattern");function yp(r){let e=xe(r,i=>!I(i,fr)),t=E(e,i=>({message:"Token Type: ->"+i.name+"<- missing static 'PATTERN' property",type:ie.MISSING_PATTERN,tokenTypes:[i]})),n=Xt(r,e);return{errors:t,valid:n}}a(yp,"findMissingPatterns");function Tp(r){let e=xe(r,i=>{let s=i[fr];return!et(s)&&!ot(s)&&!I(s,"exec")&&!Ne(s)}),t=E(e,i=>({message:"Token Type: ->"+i.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:ie.INVALID_PATTERN,tokenTypes:[i]})),n=Xt(r,e);return{errors:t,valid:n}}a(Tp,"findInvalidPatterns");var Rp=/[^\\][$]/;function xp(r){class e extends dt{static{a(this,"EndAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitEndAnchor(s){this.found=!0}}let t=xe(r,i=>{let s=i.PATTERN;try{let o=An(s),l=new e;return l.visit(o),l.found}catch{return Rp.test(s.source)}});return E(t,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ie.EOI_ANCHOR_FOUND,tokenTypes:[i]}))}a(xp,"findEndOfInputAnchor");function Ep(r){let e=xe(r,n=>n.PATTERN.test(""));return E(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' must not match an empty string",type:ie.EMPTY_MATCH_PATTERN,tokenTypes:[n]}))}a(Ep,"findEmptyMatchRegExps");var Ap=/[^\\[][\^]|^\^/;function vp(r){class e extends dt{static{a(this,"StartAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitStartAnchor(s){this.found=!0}}let t=xe(r,i=>{let s=i.PATTERN;try{let o=An(s),l=new e;return l.visit(o),l.found}catch{return Ap.test(s.source)}});return E(t,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ie.SOI_ANCHOR_FOUND,tokenTypes:[i]}))}a(vp,"findStartOfInputAnchor");function kp(r){let e=xe(r,n=>{let i=n[fr];return i instanceof RegExp&&(i.multiline||i.global)});return E(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:ie.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[n]}))}a(kp,"findUnsupportedFlags");function $p(r){let e=[],t=E(r,s=>ue(r,(o,l)=>(s.PATTERN.source===l.PATTERN.source&&!oe(e,l)&&l.PATTERN!==se.NA&&(e.push(l),o.push(l)),o),[]));t=At(t);let n=xe(t,s=>s.length>1);return E(n,s=>{let o=E(s,u=>u.name);return{message:`The same RegExp pattern ->${$e(s).PATTERN}<-has been used in all of the following Token Types: ${o.join(", ")} <-`,type:ie.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}})}a($p,"findDuplicatePatterns");function Ip(r){let e=xe(r,n=>{if(!I(n,"GROUP"))return!1;let i=n.GROUP;return i!==se.SKIPPED&&i!==se.NA&&!Ne(i)});return E(e,n=>({message:"Token Type: ->"+n.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:ie.INVALID_GROUP_TYPE_FOUND,tokenTypes:[n]}))}a(Ip,"findInvalidGroupType");function Np(r,e){let t=xe(r,i=>i.PUSH_MODE!==void 0&&!oe(e,i.PUSH_MODE));return E(t,i=>({message:`Token Type: ->${i.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${i.PUSH_MODE}<-which does not exist`,type:ie.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[i]}))}a(Np,"findModesThatDoNotExist");function Cp(r){let e=[],t=ue(r,(n,i,s)=>{let o=i.PATTERN;return o===se.NA||(Ne(o)?n.push({str:o,idx:s,tokenType:i}):et(o)&&wp(o)&&n.push({str:o.source,idx:s,tokenType:i})),n},[]);return $(r,(n,i)=>{$(t,({str:s,idx:o,tokenType:l})=>{if(i${l.name}<- can never be matched. +Because it appears AFTER the Token Type ->${n.name}<-in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:u,type:ie.UNREACHABLE_PATTERN,tokenTypes:[n,l]})}})}),e}a(Cp,"findUnreachablePatterns");function Sp(r,e){if(et(e)){let t=e.exec(r);return t!==null&&t.index===0}else{if(ot(e))return e(r,0,[],{});if(I(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}a(Sp,"testTokenType");function wp(r){return kt([".","\\","[","]","|","^","$","(",")","?","*","+","{"],t=>r.source.indexOf(t)!==-1)===void 0}a(wp,"noMetaChar");function Tc(r){let e=r.ignoreCase?"i":"";return new RegExp(`^(?:${r.source})`,e)}a(Tc,"addStartOfInput");function Rc(r){let e=r.ignoreCase?"iy":"y";return new RegExp(`${r.source}`,e)}a(Rc,"addStickyFlag");function Ac(r,e,t){let n=[];return I(r,kn)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+kn+`> property in its definition +`,type:ie.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),I(r,Xs)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+Xs+`> property in its definition +`,type:ie.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),I(r,Xs)&&I(r,kn)&&!I(r.modes,r.defaultMode)&&n.push({message:`A MultiMode Lexer cannot be initialized with a ${kn}: <${r.defaultMode}>which does not exist +`,type:ie.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),I(r,Xs)&&$(r.modes,(i,s)=>{$(i,(o,l)=>{if(be(o))n.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${s}> at index: <${l}> +`,type:ie.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if(I(o,"LONGER_ALT")){let u=ge(o.LONGER_ALT)?o.LONGER_ALT:[o.LONGER_ALT];$(u,c=>{!be(c)&&!oe(i,c)&&n.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${c.name}> on token <${o.name}> outside of mode <${s}> +`,type:ie.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),n}a(Ac,"performRuntimeChecks");function vc(r,e,t){let n=[],i=!1,s=At(he(re(r.modes))),o=Yt(s,u=>u[fr]===se.NA),l=Cc(t);return e&&$(o,u=>{let c=Nc(u,l);if(c!==!1){let d={message:Lp(u,c),type:c.issue,tokenType:u};n.push(d)}else I(u,"LINE_BREAKS")?u.LINE_BREAKS===!0&&(i=!0):qs(l,u.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:ie.NO_LINE_BREAKS_FLAGS}),n}a(vc,"performWarningRuntimeChecks");function kc(r){let e={},t=Et(r);return $(t,n=>{let i=r[n];if(ge(i))e[n]=[];else throw Error("non exhaustive match")}),e}a(kc,"cloneEmptyGroups");function $c(r){let e=r.PATTERN;if(et(e))return!1;if(ot(e))return!0;if(I(e,"exec"))return!0;if(Ne(e))return!1;throw Error("non exhaustive match")}a($c,"isCustomPattern");function _p(r){return Ne(r)&&r.length===1?r.charCodeAt(0):!1}a(_p,"isShortPattern");var Ic={test:a(function(r){let e=r.length;for(let t=this.lastIndex;t Token Type + Root cause: ${e.errMsg}. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(e.issue===ie.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. + The problem is in the <${r.name}> Token Type + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}a(Lp,"buildLineBreakIssueMessage");function Cc(r){return E(r,t=>Ne(t)?t.charCodeAt(0):t)}a(Cc,"getCharCodes");function fl(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}a(fl,"addToMapOfArrays");var vn=256,Ys=[];function ht(r){return r255?255+~~(r/255):r}}a(Op,"initCharCodeToOptimizedIndexMap");function Ct(r,e){let t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}a(Ct,"tokenStructuredMatcher");function $n(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}a($n,"tokenStructuredMatcherNoCategories");var Sc=1,_c={};function St(r){let e=Pp(r);bp(e),Dp(e),Mp(e),$(e,t=>{t.isParent=t.categoryMatches.length>0})}a(St,"augmentTokenTypes");function Pp(r){let e=te(r),t=r,n=!0;for(;n;){t=At(he(E(t,s=>s.CATEGORIES)));let i=Xt(t,e);e=e.concat(i),M(i)?n=!1:t=i}return e}a(Pp,"expandCategories");function bp(r){$(r,e=>{hl(e)||(_c[Sc]=e,e.tokenTypeIdx=Sc++),wc(e)&&!ge(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),wc(e)||(e.CATEGORIES=[]),Fp(e)||(e.categoryMatches=[]),Gp(e)||(e.categoryMatchesMap={})})}a(bp,"assignTokenDefaultProps");function Mp(r){$(r,e=>{e.categoryMatches=[],$(e.categoryMatchesMap,(t,n)=>{e.categoryMatches.push(_c[n].tokenTypeIdx)})})}a(Mp,"assignCategoriesTokensProp");function Dp(r){$(r,e=>{Lc([],e)})}a(Dp,"assignCategoriesMapProp");function Lc(r,e){$(r,t=>{e.categoryMatchesMap[t.tokenTypeIdx]=!0}),$(e.CATEGORIES,t=>{let n=r.concat(e);oe(n,t)||Lc(n,t)})}a(Lc,"singleAssignCategoriesToksMap");function hl(r){return I(r,"tokenTypeIdx")}a(hl,"hasShortKeyProperty");function wc(r){return I(r,"CATEGORIES")}a(wc,"hasCategoriesProperty");function Fp(r){return I(r,"categoryMatches")}a(Fp,"hasExtendingTokensTypesProperty");function Gp(r){return I(r,"categoryMatchesMap")}a(Gp,"hasExtendingTokensTypesMapProperty");function Oc(r){return I(r,"tokenTypeIdx")}a(Oc,"isTokenType");var In={buildUnableToPopLexerModeMessage(r){return`Unable to pop Lexer Mode after encountering Token ->${r.image}<- The Mode Stack is empty`},buildUnexpectedCharactersMessage(r,e,t,n,i){return`unexpected character: ->${r.charAt(e)}<- at offset: ${e}, skipped ${t} characters.`}};var ie;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",r[r.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE"})(ie||(ie={}));var vi={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:In,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(vi);var se=class{static{a(this,"Lexer")}constructor(e,t=vi){if(this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=(i,s)=>{if(this.traceInitPerf===!0){this.traceInitIndent++;let o=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${i}>`);let{time:l,value:u}=xi(s),c=l>10?console.warn:console.log;return this.traceInitIndent time: ${l}ms`),this.traceInitIndent--,u}else return s()},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=ke({},vi,t);let n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",()=>{let i,s=!0;this.TRACE_INIT("Lexer Config handling",()=>{if(this.config.lineTerminatorsPattern===vi.lineTerminatorsPattern)this.config.lineTerminatorsPattern=Ic;else if(this.config.lineTerminatorCharacters===vi.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');this.trackStartLines=/full|onlyStart/i.test(this.config.positionTracking),this.trackEndLines=/full/i.test(this.config.positionTracking),ge(e)?i={modes:{defaultMode:te(e)},defaultMode:kn}:(s=!1,i=te(e))}),this.config.skipValidations===!1&&(this.TRACE_INIT("performRuntimeChecks",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(Ac(i,this.trackStartLines,this.config.lineTerminatorCharacters))}),this.TRACE_INIT("performWarningRuntimeChecks",()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat(vc(i,this.trackStartLines,this.config.lineTerminatorCharacters))})),i.modes=i.modes?i.modes:{},$(i.modes,(l,u)=>{i.modes[u]=Yt(l,c=>be(c))});let o=Et(i.modes);if($(i.modes,(l,u)=>{this.TRACE_INIT(`Mode: <${u}> processing`,()=>{if(this.modes.push(u),this.config.skipValidations===!1&&this.TRACE_INIT("validatePatterns",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(Ec(l,o))}),M(this.lexerDefinitionErrors)){St(l);let c;this.TRACE_INIT("analyzeTokenTypes",()=>{c=xc(l,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:this.TRACE_INIT})}),this.patternIdxToConfig[u]=c.patternIdxToConfig,this.charCodeToPatternIdxToConfig[u]=c.charCodeToPatternIdxToConfig,this.emptyGroups=ke({},this.emptyGroups,c.emptyGroups),this.hasCustom=c.hasCustom||this.hasCustom,this.canModeBeOptimized[u]=c.canBeOptimized}})}),this.defaultMode=i.defaultMode,!M(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){let u=E(this.lexerDefinitionErrors,c=>c.message).join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+u)}$(this.lexerDefinitionWarning,l=>{Ri(l.message)}),this.TRACE_INIT("Choosing sub-methods implementations",()=>{if(dl?(this.chopInput=fo,this.match=this.matchWithTest):(this.updateLastIndex=de,this.match=this.matchWithExec),s&&(this.handleModes=de),this.trackStartLines===!1&&(this.computeNewColumn=fo),this.trackEndLines===!1&&(this.updateTokenEndLineColumnLocation=de),/full/i.test(this.config.positionTracking))this.createTokenInstance=this.createFullToken;else if(/onlyStart/i.test(this.config.positionTracking))this.createTokenInstance=this.createStartOnlyToken;else if(/onlyOffset/i.test(this.config.positionTracking))this.createTokenInstance=this.createOffsetOnlyToken;else throw Error(`Invalid config option: "${this.config.positionTracking}"`);this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)}),this.TRACE_INIT("Failed Optimization Warnings",()=>{let l=ue(this.canModeBeOptimized,(u,c,f)=>(c===!1&&u.push(f),u),[]);if(t.ensureOptimizations&&!M(l))throw Error(`Lexer Modes: < ${l.join(", ")} > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),this.TRACE_INIT("clearRegExpParserCache",()=>{pc()}),this.TRACE_INIT("toFastProperties",()=>{Ei(this)})})}tokenize(e,t=this.defaultMode){if(!M(this.lexerDefinitionErrors)){let i=E(this.lexerDefinitionErrors,s=>s.message).join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+i)}return this.tokenizeInternal(e,t)}tokenizeInternal(e,t){let n,i,s,o,l,u,c,f,d,h,p,g,y,v,x,A,R=e,P=R.length,b=0,Te=0,kr=this.hasCustom?0:Math.floor(e.length/10),Ae=new Array(kr),Mt=[],Tt=this.trackStartLines?1:void 0,k=this.trackStartLines?1:void 0,T=kc(this.emptyGroups),C=this.trackStartLines,N=this.config.lineTerminatorsPattern,V=0,O=[],L=[],Le=[],Oe=[];Object.freeze(Oe);let ee;function Ht(){return O}a(Ht,"getPossiblePatternsSlow");function Uu(ve){let Xe=ht(ve),$r=L[Xe];return $r===void 0?Oe:$r}a(Uu,"getPossiblePatternsOptimized");let vh=a(ve=>{if(Le.length===1&&ve.tokenType.PUSH_MODE===void 0){let Xe=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(ve);Mt.push({offset:ve.startOffset,line:ve.startLine,column:ve.startColumn,length:ve.image.length,message:Xe})}else{Le.pop();let Xe=vt(Le);O=this.patternIdxToConfig[Xe],L=this.charCodeToPatternIdxToConfig[Xe],V=O.length;let $r=this.canModeBeOptimized[Xe]&&this.config.safeMode===!1;L&&$r?ee=Uu:ee=Ht}},"pop_mode");function Bu(ve){Le.push(ve),L=this.charCodeToPatternIdxToConfig[ve],O=this.patternIdxToConfig[ve],V=O.length,V=O.length;let Xe=this.canModeBeOptimized[ve]&&this.config.safeMode===!1;L&&Xe?ee=Uu:ee=Ht}a(Bu,"push_mode"),Bu.call(this,t);let Ze,Wu=this.config.recoveryEnabled;for(;bu.length){u=o,c=f,Ze=xt;break}}}break}}if(u!==null){if(d=u.length,h=Ze.group,h!==void 0&&(p=Ze.tokenTypeIdx,g=this.createTokenInstance(u,b,p,Ze.tokenType,Tt,k,d),this.handlePayload(g,c),h===!1?Te=this.addToken(Ae,Te,g):T[h].push(g)),e=this.chopInput(e,d),b=b+d,k=this.computeNewColumn(k,d),C===!0&&Ze.canLineTerminator===!0){let Ke=0,Rt,Dt;N.lastIndex=0;do Rt=N.test(u),Rt===!0&&(Dt=N.lastIndex-1,Ke++);while(Rt===!0);Ke!==0&&(Tt=Tt+Ke,k=d-Dt,this.updateTokenEndLineColumnLocation(g,h,Dt,Ke,Tt,k,d))}this.handleModes(Ze,vh,Bu,g)}else{let Ke=b,Rt=Tt,Dt=k,xt=Wu===!1;for(;xt===!1&&b ${wt(r)} <--`:`token of type --> ${r.name} <--`} but found --> '${e.image}' <--`},buildNotAllInputParsedMessage({firstRedundant:r,ruleName:e}){return"Redundant input, expecting EOF but found: "+r.image},buildNoViableAltMessage({expectedPathsPerAlt:r,actual:e,previous:t,customUserDescription:n,ruleName:i}){let s="Expecting: ",l=` +but found: '`+$e(e).image+"'";if(n)return s+n+l;{let u=ue(r,(h,p)=>h.concat(p),[]),c=E(u,h=>`[${E(h,p=>wt(p)).join(", ")}]`),d=`one of these possible Token sequences: +${E(c,(h,p)=>` ${p+1}. ${h}`).join(` +`)}`;return s+d+l}},buildEarlyExitMessage({expectedIterationPaths:r,actual:e,customUserDescription:t,ruleName:n}){let i="Expecting: ",o=` +but found: '`+$e(e).image+"'";if(t)return i+t+o;{let u=`expecting at least one iteration which starts with one of these possible Token sequences:: + <${E(r,c=>`[${E(c,f=>wt(f)).join(",")}]`).join(" ,")}>`;return i+u+o}}};Object.freeze(Lt);var Wc={buildRuleNotFoundError(r,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+r.name+"<-"}},it={buildDuplicateFoundError(r,e){function t(f){return f instanceof D?f.terminalType.name:f instanceof H?f.nonTerminalName:""}a(t,"getExtraProductionArgument");let n=r.name,i=$e(e),s=i.idx,o=We(i),l=t(i),u=s>0,c=`->${o}${u?s:""}<- ${l?`with argument: ->${l}<-`:""} + appears more than once (${e.length} times) in the top level rule: ->${n}<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` +`),c},buildNamespaceConflictError(r){return`Namespace conflict found in grammar. +The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${r.name}>. +To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`},buildAlternationPrefixAmbiguityError(r){let e=E(r.prefixPath,i=>wt(i)).join(", "),t=r.alternation.idx===0?"":r.alternation.idx;return`Ambiguous alternatives: <${r.ambiguityIndices.join(" ,")}> due to common lookahead prefix +in inside <${r.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`},buildAlternationAmbiguityError(r){let e=E(r.prefixPath,i=>wt(i)).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,n=`Ambiguous Alternatives Detected: <${r.ambiguityIndices.join(" ,")}> in inside <${r.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n},buildEmptyRepetitionError(r){let e=We(r.repetition);return r.repetition.idx!==0&&(e+=r.repetition.idx),`The repetition <${e}> within Rule <${r.topLevelRule.name}> can never consume any tokens. +This could lead to an infinite loop.`},buildTokenNameError(r){return"deprecated"},buildEmptyAlternationError(r){return`Ambiguous empty alternative: <${r.emptyChoiceIdx+1}> in inside <${r.topLevelRule.name}> Rule. +Only the last alternative may be an empty alternative.`},buildTooManyAlternativesError(r){return`An Alternation cannot have more than 256 alternatives: + inside <${r.topLevelRule.name}> Rule. + has ${r.alternation.definition.length+1} alternatives.`},buildLeftRecursionError(r){let e=r.topLevelRule.name,t=E(r.leftRecursionPath,s=>s.name),n=`${e} --> ${t.concat([e]).join(" --> ")}`;return`Left Recursion found in grammar. +rule: <${e}> can be invoked from itself (directly or indirectly) +without consuming any Tokens. The grammar path that causes this is: + ${n} + To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError(r){return"deprecated"},buildDuplicateRuleNameError(r){let e;return r.topLevelRule instanceof Me?e=r.topLevelRule.name:e=r.topLevelRule,`Duplicate definition, rule: ->${e}<- is already defined in the grammar: ->${r.grammarName}<-`}};function Kc(r,e){let t=new ml(r,e);return t.resolveRefs(),t.errors}a(Kc,"resolveGrammar");var ml=class extends De{static{a(this,"GastRefResolverVisitor")}constructor(e,t){super(),this.nameToTopRule=e,this.errMsgProvider=t,this.errors=[]}resolveRefs(){$(re(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){let t=this.nameToTopRule[e.nonTerminalName];if(t)e.referencedRule=t;else{let n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:n,type:ye.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}};var gl=class extends Nt{static{a(this,"AbstractNextPossibleTokensWalker")}constructor(e,t){super(),this.topProd=e,this.path=t,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=te(this.path.ruleStack).reverse(),this.occurrenceStack=te(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,t=[]){this.found||super.walk(e,t)}walkProdRef(e,t,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){let i=t.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,i)}}updateExpectedNext(){M(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}},Js=class extends gl{static{a(this,"NextAfterTokenWalker")}constructor(e,t){super(e,t),this.path=t,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,t,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){let i=t.concat(n),s=new J({definition:i});this.possibleTokTypes=cr(s),this.found=!0}}},Nn=class extends Nt{static{a(this,"AbstractNextTerminalAfterProductionWalker")}constructor(e,t){super(),this.topRule=e,this.occurrence=t,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}},Qs=class extends Nn{static{a(this,"NextTerminalAfterManyWalker")}walkMany(e,t,n){if(e.idx===this.occurrence){let i=$e(t.concat(n));this.result.isEndOfRule=i===void 0,i instanceof D&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkMany(e,t,n)}},$i=class extends Nn{static{a(this,"NextTerminalAfterManySepWalker")}walkManySep(e,t,n){if(e.idx===this.occurrence){let i=$e(t.concat(n));this.result.isEndOfRule=i===void 0,i instanceof D&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkManySep(e,t,n)}},Zs=class extends Nn{static{a(this,"NextTerminalAfterAtLeastOneWalker")}walkAtLeastOne(e,t,n){if(e.idx===this.occurrence){let i=$e(t.concat(n));this.result.isEndOfRule=i===void 0,i instanceof D&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOne(e,t,n)}},Ii=class extends Nn{static{a(this,"NextTerminalAfterAtLeastOneSepWalker")}walkAtLeastOneSep(e,t,n){if(e.idx===this.occurrence){let i=$e(t.concat(n));this.result.isEndOfRule=i===void 0,i instanceof D&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOneSep(e,t,n)}};function ea(r,e,t=[]){t=te(t);let n=[],i=0;function s(l){return l.concat(pe(r,i+1))}a(s,"remainingPathWith");function o(l){let u=ea(s(l),e,t);return n.concat(u)}for(a(o,"getAlternativesForProd");t.length{M(u.definition)===!1&&(n=o(u.definition))}),n;if(l instanceof D)t.push(l.terminalType);else throw Error("non exhaustive match")}i++}return n.push({partialPath:t,suffixDef:pe(r,i)}),n}a(ea,"possiblePathsFrom");function ta(r,e,t,n){let i="EXIT_NONE_TERMINAL",s=[i],o="EXIT_ALTERNATIVE",l=!1,u=e.length,c=u-n-1,f=[],d=[];for(d.push({idx:-1,def:r,ruleStack:[],occurrenceStack:[]});!M(d);){let h=d.pop();if(h===o){l&&vt(d).idx<=c&&d.pop();continue}let p=h.def,g=h.idx,y=h.ruleStack,v=h.occurrenceStack;if(M(p))continue;let x=p[0];if(x===i){let A={idx:g,def:pe(p),ruleStack:Ft(y),occurrenceStack:Ft(v)};d.push(A)}else if(x instanceof D)if(g=0;A--){let R=x.definition[A],P={idx:g,def:R.definition.concat(pe(p)),ruleStack:y,occurrenceStack:v};d.push(P),d.push(o)}else if(x instanceof J)d.push({idx:g,def:x.definition.concat(pe(p)),ruleStack:y,occurrenceStack:v});else if(x instanceof Me)d.push(Wp(x,g,y,v));else throw Error("non exhaustive match")}return f}a(ta,"nextPossibleTokensAfter");function Wp(r,e,t,n){let i=te(t);i.push(r.name);let s=te(n);return s.push(1),{idx:e,def:r.definition,ruleStack:i,occurrenceStack:s}}a(Wp,"expandTopLevelRule");var ae;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(ae||(ae={}));function Ni(r){if(r instanceof z||r==="Option")return ae.OPTION;if(r instanceof G||r==="Repetition")return ae.REPETITION;if(r instanceof Q||r==="RepetitionMandatory")return ae.REPETITION_MANDATORY;if(r instanceof Z||r==="RepetitionMandatoryWithSeparator")return ae.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof q||r==="RepetitionWithSeparator")return ae.REPETITION_WITH_SEPARATOR;if(r instanceof X||r==="Alternation")return ae.ALTERNATION;throw Error("non exhaustive match")}a(Ni,"getProdType");function na(r){let{occurrence:e,rule:t,prodType:n,maxLookahead:i}=r,s=Ni(n);return s===ae.ALTERNATION?Cn(e,t,i):Sn(e,t,s,i)}a(na,"getLookaheadPaths");function jc(r,e,t,n,i,s){let o=Cn(r,e,t),l=Jc(o)?$n:Ct;return s(o,n,l,i)}a(jc,"buildLookaheadFuncForOr");function Hc(r,e,t,n,i,s){let o=Sn(r,e,i,t),l=Jc(o)?$n:Ct;return s(o[0],l,n)}a(Hc,"buildLookaheadFuncForOptionalProd");function zc(r,e,t,n){let i=r.length,s=Pe(r,o=>Pe(o,l=>l.length===1));if(e)return function(o){let l=E(o,u=>u.GATE);for(let u=0;uhe(u)),l=ue(o,(u,c,f)=>($(c,d=>{I(u,d.tokenTypeIdx)||(u[d.tokenTypeIdx]=f),$(d.categoryMatches,h=>{I(u,h)||(u[h]=f)})}),u),{});return function(){let u=this.LA(1);return l[u.tokenTypeIdx]}}else return function(){for(let o=0;os.length===1),i=r.length;if(n&&!t){let s=he(r);if(s.length===1&&M(s[0].categoryMatches)){let l=s[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===l}}else{let o=ue(s,(l,u,c)=>(l[u.tokenTypeIdx]=!0,$(u.categoryMatches,f=>{l[f]=!0}),l),[]);return function(){let l=this.LA(1);return o[l.tokenTypeIdx]===!0}}}else return function(){e:for(let s=0;sea([o],1)),n=Vc(t.length),i=E(t,o=>{let l={};return $(o,u=>{let c=yl(u.partialPath);$(c,f=>{l[f]=!0})}),l}),s=t;for(let o=1;o<=e;o++){let l=s;s=Vc(l.length);for(let u=0;u{let x=yl(v.partialPath);$(x,A=>{i[u][A]=!0})})}}}}return n}a(Xc,"lookAheadSequenceFromAlternatives");function Cn(r,e,t,n){let i=new ra(r,ae.ALTERNATION,n);return e.accept(i),Xc(i.result,t)}a(Cn,"getLookaheadPathsForOr");function Sn(r,e,t,n){let i=new ra(r,t);e.accept(i);let s=i.result,l=new Tl(e,r,t).startWalking(),u=new J({definition:s}),c=new J({definition:l});return Xc([u,c],n)}a(Sn,"getLookaheadPathsForOptionalProd");function ia(r,e){e:for(let t=0;t{let i=e[n];return t===i||i.categoryMatchesMap[t.tokenTypeIdx]})}a(Yc,"isStrictPrefixOfPath");function Jc(r){return Pe(r,e=>Pe(e,t=>Pe(t,n=>M(n.categoryMatches))))}a(Jc,"areTokenCategoriesNotUsed");function Qc(r){let e=r.lookaheadStrategy.validate({rules:r.rules,tokenTypes:r.tokenTypes,grammarName:r.grammarName});return E(e,t=>Object.assign({type:ye.CUSTOM_LOOKAHEAD_VALIDATION},t))}a(Qc,"validateLookahead");function Zc(r,e,t,n){let i=Ie(r,u=>Vp(u,t)),s=Yp(r,e,t),o=Ie(r,u=>zp(u,t)),l=Ie(r,u=>Hp(u,r,n,t));return i.concat(s,o,l)}a(Zc,"validateGrammar");function Vp(r,e){let t=new Rl;r.accept(t);let n=t.allProductions,i=Hu(n,jp),s=Ve(i,l=>l.length>1);return E(re(s),l=>{let u=$e(l),c=e.buildDuplicateFoundError(r,l),f=We(u),d={message:c,type:ye.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:f,occurrence:u.idx},h=ef(u);return h&&(d.parameter=h),d})}a(Vp,"validateDuplicateProductions");function jp(r){return`${We(r)}_#_${r.idx}_#_${ef(r)}`}a(jp,"identifyProductionForDuplicates");function ef(r){return r instanceof D?r.terminalType.name:r instanceof H?r.nonTerminalName:""}a(ef,"getExtraProductionArgument");var Rl=class extends De{static{a(this,"OccurrenceValidationCollector")}constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}};function Hp(r,e,t,n){let i=[];if(ue(e,(o,l)=>l.name===r.name?o+1:o,0)>1){let o=n.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});i.push({message:o,type:ye.DUPLICATE_RULE_NAME,ruleName:r.name})}return i}a(Hp,"validateRuleDoesNotAlreadyExist");function tf(r,e,t){let n=[],i;return oe(e,r)||(i=`Invalid rule override, rule: ->${r}<- cannot be overridden in the grammar: ->${t}<-as it is not defined in any of the super grammars `,n.push({message:i,type:ye.INVALID_RULE_OVERRIDE,ruleName:r})),n}a(tf,"validateRuleIsOverridden");function El(r,e,t,n=[]){let i=[],s=sa(e.definition);if(M(s))return[];{let o=r.name;oe(s,r)&&i.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:n}),type:ye.LEFT_RECURSION,ruleName:o});let u=Xt(s,n.concat([r])),c=Ie(u,f=>{let d=te(n);return d.push(f),El(r,f,t,d)});return i.concat(c)}}a(El,"validateNoLeftRecursion");function sa(r){let e=[];if(M(r))return e;let t=$e(r);if(t instanceof H)e.push(t.referencedRule);else if(t instanceof J||t instanceof z||t instanceof Q||t instanceof Z||t instanceof q||t instanceof G)e=e.concat(sa(t.definition));else if(t instanceof X)e=he(E(t.definition,s=>sa(s.definition)));else if(!(t instanceof D))throw Error("non exhaustive match");let n=ur(t),i=r.length>1;if(n&&i){let s=pe(r);return e.concat(sa(s))}else return e}a(sa,"getFirstNoneTerminal");var Ci=class extends De{static{a(this,"OrCollector")}constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}};function rf(r,e){let t=new Ci;r.accept(t);let n=t.alternations;return Ie(n,s=>{let o=Ft(s.definition);return Ie(o,(l,u)=>{let c=ta([l],[],Ct,1);return M(c)?[{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:s,emptyChoiceIdx:u}),type:ye.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:s.idx,alternative:u+1}]:[]})})}a(rf,"validateEmptyOrAlternative");function nf(r,e,t){let n=new Ci;r.accept(n);let i=n.alternations;return i=Yt(i,o=>o.ignoreAmbiguities===!0),Ie(i,o=>{let l=o.idx,u=o.maxLookahead||e,c=Cn(l,r,u,o),f=qp(c,o,r,t),d=Xp(c,o,r,t);return f.concat(d)})}a(nf,"validateAmbiguousAlternationAlternatives");var xl=class extends De{static{a(this,"RepetitionCollector")}constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}};function zp(r,e){let t=new Ci;r.accept(t);let n=t.alternations;return Ie(n,s=>s.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:s}),type:ye.TOO_MANY_ALTS,ruleName:r.name,occurrence:s.idx}]:[])}a(zp,"validateTooManyAlts");function sf(r,e,t){let n=[];return $(r,i=>{let s=new xl;i.accept(s);let o=s.allProductions;$(o,l=>{let u=Ni(l),c=l.maxLookahead||e,f=l.idx,h=Sn(f,i,u,c)[0];if(M(he(h))){let p=t.buildEmptyRepetitionError({topLevelRule:i,repetition:l});n.push({message:p,type:ye.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}a(sf,"validateSomeNonEmptyLookaheadPath");function qp(r,e,t,n){let i=[],s=ue(r,(l,u,c)=>(e.definition[c].ignoreAmbiguities===!0||$(u,f=>{let d=[c];$(r,(h,p)=>{c!==p&&ia(h,f)&&e.definition[p].ignoreAmbiguities!==!0&&d.push(p)}),d.length>1&&!ia(i,f)&&(i.push(f),l.push({alts:d,path:f}))}),l),[]);return E(s,l=>{let u=E(l.alts,f=>f+1);return{message:n.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:u,prefixPath:l.path}),type:ye.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:l.alts}})}a(qp,"checkAlternativesAmbiguities");function Xp(r,e,t,n){let i=ue(r,(o,l,u)=>{let c=E(l,f=>({idx:u,path:f}));return o.concat(c)},[]);return At(Ie(i,o=>{if(e.definition[o.idx].ignoreAmbiguities===!0)return[];let u=o.idx,c=o.path,f=xe(i,h=>e.definition[h.idx].ignoreAmbiguities!==!0&&h.idx{let p=[h.idx+1,u+1],g=e.idx===0?"":e.idx;return{message:n.buildAlternationPrefixAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:p,prefixPath:h.path}),type:ye.AMBIGUOUS_PREFIX_ALTS,ruleName:t.name,occurrence:g,alternatives:p}})}))}a(Xp,"checkPrefixAlternativesAmbiguities");function Yp(r,e,t){let n=[],i=E(e,s=>s.name);return $(r,s=>{let o=s.name;if(oe(i,o)){let l=t.buildNamespaceConflictError(s);n.push({message:l,type:ye.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:o})}}),n}a(Yp,"checkTerminalAndNoneTerminalsNameSpace");function af(r){let e=Jn(r,{errMsgProvider:Wc}),t={};return $(r.rules,n=>{t[n.name]=n}),Kc(t,e.errMsgProvider)}a(af,"resolveGrammar");function of(r){return r=Jn(r,{errMsgProvider:it}),Zc(r.rules,r.tokenTypes,r.errMsgProvider,r.grammarName)}a(of,"validateGrammar");var lf="MismatchedTokenException",uf="NoViableAltException",cf="EarlyExitException",ff="NotAllInputParsedException",df=[lf,uf,cf,ff];Object.freeze(df);function Wt(r){return oe(df,r.name)}a(Wt,"isRecognitionException");var wn=class extends Error{static{a(this,"RecognitionException")}constructor(e,t){super(e),this.token=t,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},dr=class extends wn{static{a(this,"MismatchedTokenException")}constructor(e,t,n){super(e,t),this.previousToken=n,this.name=lf}},Si=class extends wn{static{a(this,"NoViableAltException")}constructor(e,t,n){super(e,t),this.previousToken=n,this.name=uf}},wi=class extends wn{static{a(this,"NotAllInputParsedException")}constructor(e,t){super(e,t),this.name=ff}},_i=class extends wn{static{a(this,"EarlyExitException")}constructor(e,t,n){super(e,t),this.previousToken=n,this.name=cf}};var Al={},kl="InRuleRecoveryException",vl=class extends Error{static{a(this,"InRuleRecoveryException")}constructor(e){super(e),this.name=kl}},aa=class{static{a(this,"Recoverable")}initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=I(e,"recoveryEnabled")?e.recoveryEnabled:Fe.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=Jp)}getTokenToInsert(e){let t=_t(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,t,n,i){let s=this.findReSyncTokenType(),o=this.exportLexerState(),l=[],u=!1,c=this.LA(1),f=this.LA(1),d=a(()=>{let h=this.LA(0),p=this.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:c,previous:h,ruleName:this.getCurrRuleFullName()}),g=new dr(p,c,this.LA(0));g.resyncedTokens=Ft(l),this.SAVE_ERROR(g)},"generateErrorMessage");for(;!u;)if(this.tokenMatcher(f,i)){d();return}else if(n.call(this)){d(),e.apply(this,t);return}else this.tokenMatcher(f,s)?u=!0:(f=this.SKIP_TOKEN(),this.addToResyncTokens(f,l));this.importLexerState(o)}shouldInRepetitionRecoveryBeTried(e,t,n){return!(n===!1||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))}getFollowsForInRuleRecovery(e,t){let n=this.getCurrentGrammarPath(e,t);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){let n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new vl("sad sad panda")}canPerformInRuleRecovery(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,t){if(!this.canTokenTypeBeInsertedInRecovery(e)||M(t))return!1;let n=this.LA(1);return kt(t,s=>this.tokenMatcher(n,s))!==void 0}canRecoverWithSingleTokenDeletion(e){return this.canTokenTypeBeDeletedInRecovery(e)?this.tokenMatcher(this.LA(2),e):!1}isInCurrentRuleReSyncSet(e){let t=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(t);return oe(n,e)}findReSyncTokenType(){let e=this.flattenFollowSet(),t=this.LA(1),n=2;for(;;){let i=kt(e,s=>ki(t,s));if(i!==void 0)return i;t=this.LA(n),n++}}getCurrFollowKey(){if(this.RULE_STACK.length===1)return Al;let e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){let e=this.RULE_STACK,t=this.RULE_OCCURRENCE_STACK;return E(e,(n,i)=>i===0?Al:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:t[i],inRule:this.shortRuleNameToFullName(e[i-1])})}flattenFollowSet(){let e=E(this.buildFullFollowKeyStack(),t=>this.getFollowSetFromFollowKey(t));return he(e)}getFollowSetFromFollowKey(e){if(e===Al)return[qe];let t=e.ruleName+e.idxInCallingRule+js+e.inRule;return this.resyncFollows[t]}addToResyncTokens(e,t){return this.tokenMatcher(e,qe)||t.push(e),t}reSyncTo(e){let t=[],n=this.LA(1);for(;this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,t);return Ft(t)}attemptInRepetitionRecovery(e,t,n,i,s,o,l){}getCurrentGrammarPath(e,t){let n=this.getHumanReadableRuleStack(),i=te(this.RULE_OCCURRENCE_STACK);return{ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:t}}getHumanReadableRuleStack(){return E(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}};function Jp(r,e,t,n,i,s,o){let l=this.getKeyForAutomaticLookahead(n,i),u=this.firstAfterRepMap[l];if(u===void 0){let h=this.getCurrRuleFullName(),p=this.getGAstProductions()[h];u=new s(p,i).startWalking(),this.firstAfterRepMap[l]=u}let c=u.token,f=u.occurrence,d=u.isEndOfRule;this.RULE_STACK.length===1&&d&&c===void 0&&(c=qe,f=1),!(c===void 0||f===void 0)&&this.shouldInRepetitionRecoveryBeTried(c,f,o)&&this.tryInRepetitionRecovery(r,e,t,c)}a(Jp,"attemptInRepetitionRecovery");function oa(r,e,t){return t|e|r}a(oa,"getKeyForAutomaticLookahead");var Ot=class{static{a(this,"LLkLookaheadStrategy")}constructor(e){var t;this.maxLookahead=(t=e?.maxLookahead)!==null&&t!==void 0?t:Fe.maxLookahead}validate(e){let t=this.validateNoLeftRecursion(e.rules);if(M(t)){let n=this.validateEmptyOrAlternatives(e.rules),i=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),s=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...t,...n,...i,...s]}return t}validateNoLeftRecursion(e){return Ie(e,t=>El(t,t,it))}validateEmptyOrAlternatives(e){return Ie(e,t=>rf(t,it))}validateAmbiguousAlternationAlternatives(e,t){return Ie(e,n=>nf(n,t,it))}validateSomeNonEmptyLookaheadPath(e,t){return sf(e,t,it)}buildLookaheadForAlternation(e){return jc(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,zc)}buildLookaheadForOptional(e){return Hc(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,Ni(e.prodType),qc)}};var ua=class{static{a(this,"LooksAhead")}initLooksAhead(e){this.dynamicTokensEnabled=I(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:Fe.dynamicTokensEnabled,this.maxLookahead=I(e,"maxLookahead")?e.maxLookahead:Fe.maxLookahead,this.lookaheadStrategy=I(e,"lookaheadStrategy")?e.lookaheadStrategy:new Ot({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){$(e,t=>{this.TRACE_INIT(`${t.name} Rule Lookahead`,()=>{let{alternation:n,repetition:i,option:s,repetitionMandatory:o,repetitionMandatoryWithSeparator:l,repetitionWithSeparator:u}=Qp(t);$(n,c=>{let f=c.idx===0?"":c.idx;this.TRACE_INIT(`${We(c)}${f}`,()=>{let d=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:c.idx,rule:t,maxLookahead:c.maxLookahead||this.maxLookahead,hasPredicates:c.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),h=oa(this.fullRuleNameToShort[t.name],256,c.idx);this.setLaFuncCache(h,d)})}),$(i,c=>{this.computeLookaheadFunc(t,c.idx,768,"Repetition",c.maxLookahead,We(c))}),$(s,c=>{this.computeLookaheadFunc(t,c.idx,512,"Option",c.maxLookahead,We(c))}),$(o,c=>{this.computeLookaheadFunc(t,c.idx,1024,"RepetitionMandatory",c.maxLookahead,We(c))}),$(l,c=>{this.computeLookaheadFunc(t,c.idx,1536,"RepetitionMandatoryWithSeparator",c.maxLookahead,We(c))}),$(u,c=>{this.computeLookaheadFunc(t,c.idx,1280,"RepetitionWithSeparator",c.maxLookahead,We(c))})})})}computeLookaheadFunc(e,t,n,i,s,o){this.TRACE_INIT(`${o}${t===0?"":t}`,()=>{let l=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:t,rule:e,maxLookahead:s||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:i}),u=oa(this.fullRuleNameToShort[e.name],n,t);this.setLaFuncCache(u,l)})}getKeyForAutomaticLookahead(e,t){let n=this.getLastExplicitRuleShortName();return oa(n,e,t)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,t){this.lookAheadFuncsCache.set(e,t)}},$l=class extends De{static{a(this,"DslMethodsCollectorVisitor")}constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}},la=new $l;function Qp(r){la.reset(),r.accept(la);let e=la.dslMethods;return la.reset(),e}a(Qp,"collectMethods");function Cl(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffseto.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>: + ${s.join(` + +`).replace(/\n/g,` + `)}`)}},"validateVisitor")};return t.prototype=n,t.prototype.constructor=t,t._RULE_NAMES=e,t}a(mf,"createBaseSemanticVisitorConstructor");function gf(r,e,t){let n=a(function(){},"derivedConstructor");wl(n,r+"BaseSemanticsWithDefaults");let i=Object.create(t.prototype);return $(e,s=>{i[s]=em}),n.prototype=i,n.prototype.constructor=n,n}a(gf,"createBaseVisitorConstructorWithDefaults");var _l;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(_l||(_l={}));function tm(r,e){return rm(r,e)}a(tm,"validateVisitor");function rm(r,e){let t=xe(e,i=>ot(r[i])===!1),n=E(t,i=>({msg:`Missing visitor method: <${i}> on ${r.constructor.name} CST Visitor.`,type:_l.MISSING_METHOD,methodName:i}));return At(n)}a(rm,"validateMissingCstMethods");var ha=class{static{a(this,"TreeBuilder")}initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=I(e,"nodeLocationTracking")?e.nodeLocationTracking:Fe.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=de,this.cstFinallyStateUpdate=de,this.cstPostTerminal=de,this.cstPostNonTerminal=de,this.cstPostRule=de;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=Sl,this.setNodeLocationFromNode=Sl,this.cstPostRule=de,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=de,this.setNodeLocationFromNode=de,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=Cl,this.setNodeLocationFromNode=Cl,this.cstPostRule=de,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=de,this.setNodeLocationFromNode=de,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=de,this.setNodeLocationFromNode=de,this.cstPostRule=de,this.setInitialNodeLocation=de;else throw Error(`Invalid config option: "${e.nodeLocationTracking}"`)}setInitialNodeLocationOnlyOffsetRecovery(e){e.location={startOffset:NaN,endOffset:NaN}}setInitialNodeLocationOnlyOffsetRegular(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}}setInitialNodeLocationFullRecovery(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}}setInitialNodeLocationFullRegular(e){let t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){let t={name:e,children:Object.create(null)};this.setInitialNodeLocation(t),this.CST_STACK.push(t)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){let t=this.LA(0),n=e.location;n.startOffset<=t.startOffset?(n.endOffset=t.endOffset,n.endLine=t.endLine,n.endColumn=t.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){let t=this.LA(0),n=e.location;n.startOffset<=t.startOffset?n.endOffset=t.endOffset:n.startOffset=NaN}cstPostTerminal(e,t){let n=this.CST_STACK[this.CST_STACK.length-1];hf(n,t,e),this.setNodeLocationFromToken(n.location,t)}cstPostNonTerminal(e,t){let n=this.CST_STACK[this.CST_STACK.length-1];pf(n,t,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if(be(this.baseCstVisitorConstructor)){let e=mf(this.className,Et(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if(be(this.baseCstVisitorWithDefaultsConstructor)){let e=gf(this.className,Et(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){let e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}};var pa=class{static{a(this,"LexerAdapter")}initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length}get input(){return this.tokVector}SKIP_TOKEN(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):_n}LA(e){let t=this.currIdx+e;return t<0||this.tokVectorLength<=t?_n:this.tokVector[t]}consumeToken(){this.currIdx++}exportLexerState(){return this.currIdx}importLexerState(e){this.currIdx=e}resetLexerState(){this.currIdx=-1}moveToTerminatedState(){this.currIdx=this.tokVector.length-1}getLexerPosition(){return this.exportLexerState()}};var ma=class{static{a(this,"RecognizerApi")}ACTION(e){return e.call(this)}consume(e,t,n){return this.consumeInternal(t,e,n)}subrule(e,t,n){return this.subruleInternal(t,e,n)}option(e,t){return this.optionInternal(t,e)}or(e,t){return this.orInternal(t,e)}many(e,t){return this.manyInternal(e,t)}atLeastOne(e,t){return this.atLeastOneInternal(e,t)}CONSUME(e,t){return this.consumeInternal(e,0,t)}CONSUME1(e,t){return this.consumeInternal(e,1,t)}CONSUME2(e,t){return this.consumeInternal(e,2,t)}CONSUME3(e,t){return this.consumeInternal(e,3,t)}CONSUME4(e,t){return this.consumeInternal(e,4,t)}CONSUME5(e,t){return this.consumeInternal(e,5,t)}CONSUME6(e,t){return this.consumeInternal(e,6,t)}CONSUME7(e,t){return this.consumeInternal(e,7,t)}CONSUME8(e,t){return this.consumeInternal(e,8,t)}CONSUME9(e,t){return this.consumeInternal(e,9,t)}SUBRULE(e,t){return this.subruleInternal(e,0,t)}SUBRULE1(e,t){return this.subruleInternal(e,1,t)}SUBRULE2(e,t){return this.subruleInternal(e,2,t)}SUBRULE3(e,t){return this.subruleInternal(e,3,t)}SUBRULE4(e,t){return this.subruleInternal(e,4,t)}SUBRULE5(e,t){return this.subruleInternal(e,5,t)}SUBRULE6(e,t){return this.subruleInternal(e,6,t)}SUBRULE7(e,t){return this.subruleInternal(e,7,t)}SUBRULE8(e,t){return this.subruleInternal(e,8,t)}SUBRULE9(e,t){return this.subruleInternal(e,9,t)}OPTION(e){return this.optionInternal(e,0)}OPTION1(e){return this.optionInternal(e,1)}OPTION2(e){return this.optionInternal(e,2)}OPTION3(e){return this.optionInternal(e,3)}OPTION4(e){return this.optionInternal(e,4)}OPTION5(e){return this.optionInternal(e,5)}OPTION6(e){return this.optionInternal(e,6)}OPTION7(e){return this.optionInternal(e,7)}OPTION8(e){return this.optionInternal(e,8)}OPTION9(e){return this.optionInternal(e,9)}OR(e){return this.orInternal(e,0)}OR1(e){return this.orInternal(e,1)}OR2(e){return this.orInternal(e,2)}OR3(e){return this.orInternal(e,3)}OR4(e){return this.orInternal(e,4)}OR5(e){return this.orInternal(e,5)}OR6(e){return this.orInternal(e,6)}OR7(e){return this.orInternal(e,7)}OR8(e){return this.orInternal(e,8)}OR9(e){return this.orInternal(e,9)}MANY(e){this.manyInternal(0,e)}MANY1(e){this.manyInternal(1,e)}MANY2(e){this.manyInternal(2,e)}MANY3(e){this.manyInternal(3,e)}MANY4(e){this.manyInternal(4,e)}MANY5(e){this.manyInternal(5,e)}MANY6(e){this.manyInternal(6,e)}MANY7(e){this.manyInternal(7,e)}MANY8(e){this.manyInternal(8,e)}MANY9(e){this.manyInternal(9,e)}MANY_SEP(e){this.manySepFirstInternal(0,e)}MANY_SEP1(e){this.manySepFirstInternal(1,e)}MANY_SEP2(e){this.manySepFirstInternal(2,e)}MANY_SEP3(e){this.manySepFirstInternal(3,e)}MANY_SEP4(e){this.manySepFirstInternal(4,e)}MANY_SEP5(e){this.manySepFirstInternal(5,e)}MANY_SEP6(e){this.manySepFirstInternal(6,e)}MANY_SEP7(e){this.manySepFirstInternal(7,e)}MANY_SEP8(e){this.manySepFirstInternal(8,e)}MANY_SEP9(e){this.manySepFirstInternal(9,e)}AT_LEAST_ONE(e){this.atLeastOneInternal(0,e)}AT_LEAST_ONE1(e){return this.atLeastOneInternal(1,e)}AT_LEAST_ONE2(e){this.atLeastOneInternal(2,e)}AT_LEAST_ONE3(e){this.atLeastOneInternal(3,e)}AT_LEAST_ONE4(e){this.atLeastOneInternal(4,e)}AT_LEAST_ONE5(e){this.atLeastOneInternal(5,e)}AT_LEAST_ONE6(e){this.atLeastOneInternal(6,e)}AT_LEAST_ONE7(e){this.atLeastOneInternal(7,e)}AT_LEAST_ONE8(e){this.atLeastOneInternal(8,e)}AT_LEAST_ONE9(e){this.atLeastOneInternal(9,e)}AT_LEAST_ONE_SEP(e){this.atLeastOneSepFirstInternal(0,e)}AT_LEAST_ONE_SEP1(e){this.atLeastOneSepFirstInternal(1,e)}AT_LEAST_ONE_SEP2(e){this.atLeastOneSepFirstInternal(2,e)}AT_LEAST_ONE_SEP3(e){this.atLeastOneSepFirstInternal(3,e)}AT_LEAST_ONE_SEP4(e){this.atLeastOneSepFirstInternal(4,e)}AT_LEAST_ONE_SEP5(e){this.atLeastOneSepFirstInternal(5,e)}AT_LEAST_ONE_SEP6(e){this.atLeastOneSepFirstInternal(6,e)}AT_LEAST_ONE_SEP7(e){this.atLeastOneSepFirstInternal(7,e)}AT_LEAST_ONE_SEP8(e){this.atLeastOneSepFirstInternal(8,e)}AT_LEAST_ONE_SEP9(e){this.atLeastOneSepFirstInternal(9,e)}RULE(e,t,n=Ln){if(oe(this.definedRulesNames,e)){let o={message:it.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:ye.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(o)}this.definedRulesNames.push(e);let i=this.defineRule(e,t,n);return this[e]=i,i}OVERRIDE_RULE(e,t,n=Ln){let i=tf(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(i);let s=this.defineRule(e,t,n);return this[e]=s,s}BACKTRACK(e,t){return function(){this.isBackTrackingStack.push(1);let n=this.saveRecogState();try{return e.apply(this,t),!0}catch(i){if(Wt(i))return!1;throw i}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return Vs(re(this.gastProductionsCache))}};var ga=class{static{a(this,"RecognizerEngine")}initRecognizerEngine(e,t){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=$n,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},I(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if(ge(e)){if(M(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if(ge(e))this.tokensMap=ue(e,(s,o)=>(s[o.name]=o,s),{});else if(I(e,"modes")&&Pe(he(re(e.modes)),Oc)){let s=he(re(e.modes)),o=Qn(s);this.tokensMap=ue(o,(l,u)=>(l[u.name]=u,l),{})}else if(ju(e))this.tokensMap=te(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=qe;let n=I(e,"modes")?he(re(e.modes)):re(e),i=Pe(n,s=>M(s.categoryMatches));this.tokenMatcher=i?$n:Ct,St(re(this.tokensMap))}defineRule(e,t,n){if(this.selfAnalysisDone)throw Error(`Grammar rule <${e}> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);let i=I(n,"resyncEnabled")?n.resyncEnabled:Ln.resyncEnabled,s=I(n,"recoveryValueFunc")?n.recoveryValueFunc:Ln.recoveryValueFunc,o=this.ruleShortNameIdx<<12;this.ruleShortNameIdx++,this.shortRuleNameToFull[o]=e,this.fullRuleNameToShort[e]=o;let l;return this.outputCst===!0?l=a(function(...f){try{this.ruleInvocationStateUpdate(o,e,this.subruleIdx),t.apply(this,f);let d=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(d),d}catch(d){return this.invokeRuleCatch(d,i,s)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTry"):l=a(function(...f){try{return this.ruleInvocationStateUpdate(o,e,this.subruleIdx),t.apply(this,f)}catch(d){return this.invokeRuleCatch(d,i,s)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTryCst"),Object.assign(l,{ruleName:e,originalGrammarAction:t})}invokeRuleCatch(e,t,n){let i=this.RULE_STACK.length===1,s=t&&!this.isBackTracking()&&this.recoveryEnabled;if(Wt(e)){let o=e;if(s){let l=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(l))if(o.resyncedTokens=this.reSyncTo(l),this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];return u.recoveredNode=!0,u}else return n(e);else{if(this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];u.recoveredNode=!0,o.partialCstResult=u}throw o}}else{if(i)return this.moveToTerminatedState(),n(e);throw o}}else throw e}optionInternal(e,t){let n=this.getKeyForAutomaticLookahead(512,t);return this.optionInternalLogic(e,t,n)}optionInternalLogic(e,t,n){let i=this.getLaFuncFromCache(n),s;if(typeof e!="function"){s=e.DEF;let o=e.GATE;if(o!==void 0){let l=i;i=a(()=>o.call(this)&&l.call(this),"lookAheadFunc")}}else s=e;if(i.call(this)===!0)return s.call(this)}atLeastOneInternal(e,t){let n=this.getKeyForAutomaticLookahead(1024,e);return this.atLeastOneInternalLogic(e,t,n)}atLeastOneInternalLogic(e,t,n){let i=this.getLaFuncFromCache(n),s;if(typeof t!="function"){s=t.DEF;let o=t.GATE;if(o!==void 0){let l=i;i=a(()=>o.call(this)&&l.call(this),"lookAheadFunc")}}else s=t;if(i.call(this)===!0){let o=this.doSingleRepetition(s);for(;i.call(this)===!0&&o===!0;)o=this.doSingleRepetition(s)}else throw this.raiseEarlyExitException(e,ae.REPETITION_MANDATORY,t.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,t],i,1024,e,Zs)}atLeastOneSepFirstInternal(e,t){let n=this.getKeyForAutomaticLookahead(1536,e);this.atLeastOneSepFirstInternalLogic(e,t,n)}atLeastOneSepFirstInternalLogic(e,t,n){let i=t.DEF,s=t.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=a(()=>this.tokenMatcher(this.LA(1),s),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),s)===!0;)this.CONSUME(s),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,s,l,i,Ii],l,1536,e,Ii)}else throw this.raiseEarlyExitException(e,ae.REPETITION_MANDATORY_WITH_SEPARATOR,t.ERR_MSG)}manyInternal(e,t){let n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,t,n)}manyInternalLogic(e,t,n){let i=this.getLaFuncFromCache(n),s;if(typeof t!="function"){s=t.DEF;let l=t.GATE;if(l!==void 0){let u=i;i=a(()=>l.call(this)&&u.call(this),"lookaheadFunction")}}else s=t;let o=!0;for(;i.call(this)===!0&&o===!0;)o=this.doSingleRepetition(s);this.attemptInRepetitionRecovery(this.manyInternal,[e,t],i,768,e,Qs,o)}manySepFirstInternal(e,t){let n=this.getKeyForAutomaticLookahead(1280,e);this.manySepFirstInternalLogic(e,t,n)}manySepFirstInternalLogic(e,t,n){let i=t.DEF,s=t.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=a(()=>this.tokenMatcher(this.LA(1),s),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),s)===!0;)this.CONSUME(s),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,s,l,i,$i],l,1280,e,$i)}}repetitionSepSecondInternal(e,t,n,i,s){for(;n();)this.CONSUME(t),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,t,n,i,s],n,1536,e,s)}doSingleRepetition(e){let t=this.getLexerPosition();return e.call(this),this.getLexerPosition()>t}orInternal(e,t){let n=this.getKeyForAutomaticLookahead(256,t),i=ge(e)?e:e.DEF,o=this.getLaFuncFromCache(n).call(this,i);if(o!==void 0)return i[o].ALT.call(this);this.raiseNoAltException(t,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){let e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new wi(t,e))}}subruleInternal(e,t,n){let i;try{let s=n!==void 0?n.ARGS:void 0;return this.subruleIdx=t,i=e.apply(this,s),this.cstPostNonTerminal(i,n!==void 0&&n.LABEL!==void 0?n.LABEL:e.ruleName),i}catch(s){throw this.subruleInternalError(s,n,e.ruleName)}}subruleInternalError(e,t,n){throw Wt(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,t,n){let i;try{let s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),i=s):this.consumeInternalError(e,s,n)}catch(s){i=this.consumeInternalRecovery(e,t,s)}return this.cstPostTerminal(n!==void 0&&n.LABEL!==void 0?n.LABEL:e.name,i),i}consumeInternalError(e,t,n){let i,s=this.LA(0);throw n!==void 0&&n.ERR_MSG?i=n.ERR_MSG:i=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new dr(i,t,s))}consumeInternalRecovery(e,t,n){if(this.recoveryEnabled&&n.name==="MismatchedTokenException"&&!this.isBackTracking()){let i=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,i)}catch(s){throw s.name===kl?n:s}}else throw n}saveRecogState(){let e=this.errors,t=te(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}}reloadRecogState(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK}ruleInvocationStateUpdate(e,t,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t)}isBackTracking(){return this.isBackTrackingStack.length!==0}getCurrRuleFullName(){let e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),qe)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}};var ya=class{static{a(this,"ErrorHandler")}initErrorHandler(e){this._errors=[],this.errorMessageProvider=I(e,"errorMessageProvider")?e.errorMessageProvider:Fe.errorMessageProvider}SAVE_ERROR(e){if(Wt(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:te(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return te(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,t,n){let i=this.getCurrRuleFullName(),s=this.getGAstProductions()[i],l=Sn(e,s,t,this.maxLookahead)[0],u=[];for(let f=1;f<=this.maxLookahead;f++)u.push(this.LA(f));let c=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:l,actual:u,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new _i(c,this.LA(1),this.LA(0)))}raiseNoAltException(e,t){let n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],s=Cn(e,i,this.maxLookahead),o=[];for(let c=1;c<=this.maxLookahead;c++)o.push(this.LA(c));let l=this.LA(0),u=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new Si(u,this.LA(1),l))}};var Ta=class{static{a(this,"ContentAssist")}initContentAssist(){}computeContentAssist(e,t){let n=this.gastProductionsCache[e];if(be(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return ta([n],t,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){let t=$e(e.ruleStack),i=this.getGAstProductions()[t];return new Js(i,e).startWalking()}};var Ea={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(Ea);var yf=!0,Tf=Math.pow(2,8)-1,xf=Bt({name:"RECORDING_PHASE_TOKEN",pattern:se.NA});St([xf]);var Ef=_t(xf,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(Ef);var im={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},Ra=class{static{a(this,"GastRecorder")}initGastRecorder(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1}enableRecording(){this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",()=>{for(let e=0;e<10;e++){let t=e>0?e:"";this[`CONSUME${t}`]=function(n,i){return this.consumeInternalRecord(n,e,i)},this[`SUBRULE${t}`]=function(n,i){return this.subruleInternalRecord(n,e,i)},this[`OPTION${t}`]=function(n){return this.optionInternalRecord(n,e)},this[`OR${t}`]=function(n){return this.orInternalRecord(n,e)},this[`MANY${t}`]=function(n){this.manyInternalRecord(e,n)},this[`MANY_SEP${t}`]=function(n){this.manySepFirstInternalRecord(e,n)},this[`AT_LEAST_ONE${t}`]=function(n){this.atLeastOneInternalRecord(e,n)},this[`AT_LEAST_ONE_SEP${t}`]=function(n){this.atLeastOneSepFirstInternalRecord(e,n)}}this.consume=function(e,t,n){return this.consumeInternalRecord(t,e,n)},this.subrule=function(e,t,n){return this.subruleInternalRecord(t,e,n)},this.option=function(e,t){return this.optionInternalRecord(t,e)},this.or=function(e,t){return this.orInternalRecord(t,e)},this.many=function(e,t){this.manyInternalRecord(e,t)},this.atLeastOne=function(e,t){this.atLeastOneInternalRecord(e,t)},this.ACTION=this.ACTION_RECORD,this.BACKTRACK=this.BACKTRACK_RECORD,this.LA=this.LA_RECORD})}disableRecording(){this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",()=>{let e=this;for(let t=0;t<10;t++){let n=t>0?t:"";delete e[`CONSUME${n}`],delete e[`SUBRULE${n}`],delete e[`OPTION${n}`],delete e[`OR${n}`],delete e[`MANY${n}`],delete e[`MANY_SEP${n}`],delete e[`AT_LEAST_ONE${n}`],delete e[`AT_LEAST_ONE_SEP${n}`]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})}ACTION_RECORD(e){}BACKTRACK_RECORD(e,t){return()=>!0}LA_RECORD(e){return _n}topLevelRuleRecord(e,t){try{let n=new Me({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),t.call(this),this.recordingProdStack.pop(),n}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}}optionInternalRecord(e,t){return Oi.call(this,z,e,t)}atLeastOneInternalRecord(e,t){Oi.call(this,Q,t,e)}atLeastOneSepFirstInternalRecord(e,t){Oi.call(this,Z,t,e,yf)}manyInternalRecord(e,t){Oi.call(this,G,t,e)}manySepFirstInternalRecord(e,t){Oi.call(this,q,t,e,yf)}orInternalRecord(e,t){return sm.call(this,e,t)}subruleInternalRecord(e,t,n){if(xa(t),!e||I(e,"ruleName")===!1){let l=new Error(` argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw l.KNOWN_RECORDER_ERROR=!0,l}let i=vt(this.recordingProdStack),s=e.ruleName,o=new H({idx:t,nonTerminalName:s,label:n?.LABEL,referencedRule:void 0});return i.definition.push(o),this.outputCst?im:Ea}consumeInternalRecord(e,t,n){if(xa(t),!hl(e)){let o=new Error(` argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw o.KNOWN_RECORDER_ERROR=!0,o}let i=vt(this.recordingProdStack),s=new D({idx:t,terminalType:e,label:n?.LABEL});return i.definition.push(s),Ef}};function Oi(r,e,t,n=!1){xa(t);let i=vt(this.recordingProdStack),s=ot(e)?e:e.DEF,o=new r({definition:[],idx:t});return n&&(o.separator=e.SEP),I(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),i.definition.push(o),this.recordingProdStack.pop(),Ea}a(Oi,"recordProd");function sm(r,e){xa(e);let t=vt(this.recordingProdStack),n=ge(r)===!1,i=n===!1?r:r.DEF,s=new X({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});I(r,"MAX_LOOKAHEAD")&&(s.maxLookahead=r.MAX_LOOKAHEAD);let o=Is(i,l=>ot(l.GATE));return s.hasPredicates=o,t.definition.push(s),$(i,l=>{let u=new J({definition:[]});s.definition.push(u),I(l,"IGNORE_AMBIGUITIES")?u.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:I(l,"GATE")&&(u.ignoreAmbiguities=!0),this.recordingProdStack.push(u),l.ALT.call(this),this.recordingProdStack.pop()}),Ea}a(sm,"recordOrProd");function Rf(r){return r===0?"":`${r}`}a(Rf,"getIdxSuffix");function xa(r){if(r<0||r>Tf){let e=new Error(`Invalid DSL Method idx value: <${r}> + Idx value must be a none negative value smaller than ${Tf+1}`);throw e.KNOWN_RECORDER_ERROR=!0,e}}a(xa,"assertMethodIdxIsValid");var Aa=class{static{a(this,"PerformanceTracer")}initPerformanceTracer(e){if(I(e,"traceInitPerf")){let t=e.traceInitPerf,n=typeof t=="number";this.traceInitMaxIdent=n?t:1/0,this.traceInitPerf=n?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=Fe.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;let n=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${e}>`);let{time:i,value:s}=xi(t),o=i>10?console.warn:console.log;return this.traceInitIndent time: ${i}ms`),this.traceInitIndent--,s}else return t()}};function Af(r,e){e.forEach(t=>{let n=t.prototype;Object.getOwnPropertyNames(n).forEach(i=>{if(i==="constructor")return;let s=Object.getOwnPropertyDescriptor(n,i);s&&(s.get||s.set)?Object.defineProperty(r.prototype,i,s):r.prototype[i]=t.prototype[i]})})}a(Af,"applyMixins");var _n=_t(qe,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(_n);var Fe=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:Lt,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),Ln=Object.freeze({recoveryValueFunc:a(()=>{},"recoveryValueFunc"),resyncEnabled:!0}),ye;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",r[r.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION"})(ye||(ye={}));function va(r=void 0){return function(){return r}}a(va,"EMPTY_ALT");var Pi=class r{static{a(this,"Parser")}static performSelfAnalysis(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",()=>{let e;this.selfAnalysisDone=!0;let t=this.className;this.TRACE_INIT("toFastProps",()=>{Ei(this)}),this.TRACE_INIT("Grammar Recording",()=>{try{this.enableRecording(),$(this.definedRulesNames,i=>{let o=this[i].originalGrammarAction,l;this.TRACE_INIT(`${i} Rule`,()=>{l=this.topLevelRuleRecord(i,o)}),this.gastProductionsCache[i]=l})}finally{this.disableRecording()}});let n=[];if(this.TRACE_INIT("Grammar Resolving",()=>{n=af({rules:re(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(n)}),this.TRACE_INIT("Grammar Validations",()=>{if(M(n)&&this.skipValidations===!1){let i=of({rules:re(this.gastProductionsCache),tokenTypes:re(this.tokensMap),errMsgProvider:it,grammarName:t}),s=Qc({lookaheadStrategy:this.lookaheadStrategy,rules:re(this.gastProductionsCache),tokenTypes:re(this.tokensMap),grammarName:t});this.definitionErrors=this.definitionErrors.concat(i,s)}}),M(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",()=>{let i=hc(re(this.gastProductionsCache));this.resyncFollows=i}),this.TRACE_INIT("ComputeLookaheadFunctions",()=>{var i,s;(s=(i=this.lookaheadStrategy).initialize)===null||s===void 0||s.call(i,{rules:re(this.gastProductionsCache)}),this.preComputeLookaheadFunctions(re(this.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!M(this.definitionErrors))throw e=E(this.definitionErrors,i=>i.message),new Error(`Parser Definition Errors detected: + ${e.join(` +------------------------------- +`)}`)})}constructor(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;let n=this;if(n.initErrorHandler(t),n.initLexerAdapter(),n.initLooksAhead(t),n.initRecognizerEngine(e,t),n.initRecoverable(t),n.initTreeBuilder(t),n.initContentAssist(),n.initGastRecorder(t),n.initPerformanceTracer(t),I(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=I(t,"skipValidations")?t.skipValidations:Fe.skipValidations}};Pi.DEFER_DEFINITION_ERRORS_HANDLING=!1;Af(Pi,[aa,ua,ha,pa,ga,ma,ya,Ta,Ra,Aa]);var bi=class extends Pi{static{a(this,"EmbeddedActionsParser")}constructor(e,t=Fe){let n=te(t);n.outputCst=!1,super(e,n)}};function hr(r,e,t){return`${r.name}_${e}_${t}`}a(hr,"buildATNKey");var Kt=1,om=2,vf=4,kf=5;var bn=7,lm=8,um=9,cm=10,fm=11,$f=12,Mi=class{static{a(this,"AbstractTransition")}constructor(e){this.target=e}isEpsilon(){return!1}},On=class extends Mi{static{a(this,"AtomTransition")}constructor(e,t){super(e),this.tokenType=t}},Di=class extends Mi{static{a(this,"EpsilonTransition")}constructor(e){super(e)}isEpsilon(){return!0}},Pn=class extends Mi{static{a(this,"RuleTransition")}constructor(e,t,n){super(e),this.rule=t,this.followState=n}isEpsilon(){return!0}};function If(r){let e={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};dm(e,r);let t=r.length;for(let n=0;nNf(r,e,o));return Mn(r,e,n,t,...i)}a(ym,"alternation");function Tm(r,e,t){let n=Re(r,e,t,{type:Kt});Vt(r,n);let i=Mn(r,e,n,t,pr(r,e,t));return Rm(r,e,t,i)}a(Tm,"option");function pr(r,e,t){let n=xe(E(t.definition,i=>Nf(r,e,i)),i=>i!==void 0);return n.length===1?n[0]:n.length===0?void 0:Em(r,n)}a(pr,"block");function Cf(r,e,t,n,i){let s=n.left,o=n.right,l=Re(r,e,t,{type:fm});Vt(r,l);let u=Re(r,e,t,{type:$f});return s.loopback=l,u.loopback=l,r.decisionMap[hr(e,i?"RepetitionMandatoryWithSeparator":"RepetitionMandatory",t.idx)]=l,me(o,l),i===void 0?(me(l,s),me(l,u)):(me(l,u),me(l,i.left),me(i.right,s)),{left:s,right:u}}a(Cf,"plus");function Sf(r,e,t,n,i){let s=n.left,o=n.right,l=Re(r,e,t,{type:cm});Vt(r,l);let u=Re(r,e,t,{type:$f}),c=Re(r,e,t,{type:um});return l.loopback=c,u.loopback=c,me(l,s),me(l,u),me(o,c),i!==void 0?(me(c,u),me(c,i.left),me(i.right,s)):me(c,l),r.decisionMap[hr(e,i?"RepetitionWithSeparator":"Repetition",t.idx)]=l,{left:l,right:u}}a(Sf,"star");function Rm(r,e,t,n){let i=n.left,s=n.right;return me(i,s),r.decisionMap[hr(e,"Option",t.idx)]=i,n}a(Rm,"optional");function Vt(r,e){return r.decisionStates.push(e),e.decision=r.decisionStates.length-1,e.decision}a(Vt,"defineDecisionState");function Mn(r,e,t,n,...i){let s=Re(r,e,n,{type:lm,start:t});t.end=s;for(let l of i)l!==void 0?(me(t,l.left),me(l.right,s)):me(t,s);let o={left:t,right:s};return r.decisionMap[hr(e,xm(n),n.idx)]=t,o}a(Mn,"makeAlts");function xm(r){if(r instanceof X)return"Alternation";if(r instanceof z)return"Option";if(r instanceof G)return"Repetition";if(r instanceof q)return"RepetitionWithSeparator";if(r instanceof Q)return"RepetitionMandatory";if(r instanceof Z)return"RepetitionMandatoryWithSeparator";throw new Error("Invalid production type encountered")}a(xm,"getProdType");function Em(r,e){let t=e.length;for(let s=0;se.alt)}get key(){let e="";for(let t in this.map)e+=t+":";return e}};function bl(r,e=!0){return`${e?`a${r.alt}`:""}s${r.state.stateNumber}:${r.stack.map(t=>t.stateNumber.toString()).join("_")}`}a(bl,"getATNConfigKey");function $m(r,e){let t={};return n=>{let i=n.toString(),s=t[i];return s!==void 0||(s={atnStartState:r,decision:e,states:{}},t[i]=s),s}}a($m,"createDFACache");var ka=class{static{a(this,"PredicateSet")}constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,t){this.predicates[e]=t}toString(){let e="",t=this.predicates.length;for(let n=0;nconsole.log(n))}initialize(e){this.atn=If(e.rules),this.dfas=Im(this.atn)}validateAmbiguousAlternationAlternatives(){return[]}validateEmptyOrAlternatives(){return[]}buildLookaheadForAlternation(e){let{prodOccurrence:t,rule:n,hasPredicates:i,dynamicTokensEnabled:s}=e,o=this.dfas,l=this.logging,u=hr(n,"Alternation",t),f=this.atn.decisionMap[u].decision,d=E(na({maxLookahead:1,occurrence:t,prodType:"Alternation",rule:n}),h=>E(h,p=>p[0]));if(_f(d,!1)&&!s){let h=ue(d,(p,g,y)=>($(g,v=>{v&&(p[v.tokenTypeIdx]=y,$(v.categoryMatches,x=>{p[x]=y}))}),p),{});return i?function(p){var g;let y=this.LA(1),v=h[y.tokenTypeIdx];if(p!==void 0&&v!==void 0){let x=(g=p[v])===null||g===void 0?void 0:g.GATE;if(x!==void 0&&x.call(this)===!1)return}return v}:function(){let p=this.LA(1);return h[p.tokenTypeIdx]}}else return i?function(h){let p=new ka,g=h===void 0?0:h.length;for(let v=0;vE(h,p=>p[0]));if(_f(d)&&d[0][0]&&!s){let h=d[0],p=he(h);if(p.length===1&&M(p[0].categoryMatches)){let y=p[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===y}}else{let g=ue(p,(y,v)=>(v!==void 0&&(y[v.tokenTypeIdx]=!0,$(v.categoryMatches,x=>{y[x]=!0})),y),{});return function(){let y=this.LA(1);return g[y.tokenTypeIdx]===!0}}}return function(){let h=Ml.call(this,o,f,wf,l);return typeof h=="object"?!1:h===0}}};function _f(r,e=!0){let t=new Set;for(let n of r){let i=new Set;for(let s of n){if(s===void 0){if(e)break;return!1}let o=[s.tokenTypeIdx].concat(s.categoryMatches);for(let l of o)if(t.has(l)){if(!i.has(l))return!1}else t.add(l),i.add(l)}}return!0}a(_f,"isLL1Sequence");function Im(r){let e=r.decisionStates.length,t=Array(e);for(let n=0;nwt(i)).join(", "),t=r.production.idx===0?"":r.production.idx,n=`Ambiguous Alternatives Detected: <${r.ambiguityIndices.join(", ")}> in <${_m(r.production)}${t}> inside <${r.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n}a(wm,"buildAmbiguityError");function _m(r){if(r instanceof H)return"SUBRULE";if(r instanceof z)return"OPTION";if(r instanceof X)return"OR";if(r instanceof Q)return"AT_LEAST_ONE";if(r instanceof Z)return"AT_LEAST_ONE_SEP";if(r instanceof q)return"MANY_SEP";if(r instanceof G)return"MANY";if(r instanceof D)return"CONSUME";throw Error("non exhaustive match")}a(_m,"getProductionDslName");function Lm(r,e,t){let n=Ie(e.configs.elements,s=>s.state.transitions),i=qu(n.filter(s=>s instanceof On).map(s=>s.tokenType),s=>s.tokenTypeIdx);return{actualToken:t,possibleTokenTypes:i,tokenPath:r}}a(Lm,"buildAdaptivePredictError");function Om(r,e){return r.edges[e.tokenTypeIdx]}a(Om,"getExistingTargetState");function Pm(r,e,t){let n=new Dn,i=[];for(let o of r.elements){if(t.is(o.alt)===!1)continue;if(o.state.type===bn){i.push(o);continue}let l=o.state.transitions.length;for(let u=0;u0&&!Gm(s))for(let o of i)s.add(o);return s}a(Pm,"computeReachSet");function bm(r,e){if(r instanceof On&&ki(e,r.tokenType))return r.target}a(bm,"getReachableTarget");function Mm(r,e){let t;for(let n of r.elements)if(e.is(n.alt)===!0){if(t===void 0)t=n.alt;else if(t!==n.alt)return}return t}a(Mm,"getUniqueAlt");function Of(r){return{configs:r,edges:{},isAcceptState:!1,prediction:-1}}a(Of,"newDFAState");function Lf(r,e,t,n){return n=Pf(r,n),e.edges[t.tokenTypeIdx]=n,n}a(Lf,"addDFAEdge");function Pf(r,e){if(e===Fi)return e;let t=e.configs.key,n=r.states[t];return n!==void 0?n:(e.configs.finalize(),r.states[t]=e,e)}a(Pf,"addDFAState");function Dm(r){let e=new Dn,t=r.transitions.length;for(let n=0;n0){let i=[...r.stack],o={state:i.pop(),alt:r.alt,stack:i};$a(o,e)}else e.add(r);return}t.epsilonOnlyTransitions||e.add(r);let n=t.transitions.length;for(let i=0;i1)return!0;return!1}a(Km,"hasConflictingAltSet");function Vm(r){for(let e of Array.from(r.values()))if(Object.keys(e).length===1)return!0;return!1}a(Vm,"hasStateAssociatedWithOneAlt");var bf;(function(r){function e(t){return typeof t=="string"}a(e,"is"),r.is=e})(bf||(bf={}));var Dl;(function(r){function e(t){return typeof t=="string"}a(e,"is"),r.is=e})(Dl||(Dl={}));var Mf;(function(r){r.MIN_VALUE=-2147483648,r.MAX_VALUE=2147483647;function e(t){return typeof t=="number"&&r.MIN_VALUE<=t&&t<=r.MAX_VALUE}a(e,"is"),r.is=e})(Mf||(Mf={}));var Ia;(function(r){r.MIN_VALUE=0,r.MAX_VALUE=2147483647;function e(t){return typeof t=="number"&&r.MIN_VALUE<=t&&t<=r.MAX_VALUE}a(e,"is"),r.is=e})(Ia||(Ia={}));var W;(function(r){function e(n,i){return n===Number.MAX_VALUE&&(n=Ia.MAX_VALUE),i===Number.MAX_VALUE&&(i=Ia.MAX_VALUE),{line:n,character:i}}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&m.uinteger(i.line)&&m.uinteger(i.character)}a(t,"is"),r.is=t})(W||(W={}));var U;(function(r){function e(n,i,s,o){if(m.uinteger(n)&&m.uinteger(i)&&m.uinteger(s)&&m.uinteger(o))return{start:W.create(n,i),end:W.create(s,o)};if(W.is(n)&&W.is(i))return{start:n,end:i};throw new Error(`Range#create called with invalid arguments[${n}, ${i}, ${s}, ${o}]`)}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&W.is(i.start)&&W.is(i.end)}a(t,"is"),r.is=t})(U||(U={}));var Na;(function(r){function e(n,i){return{uri:n,range:i}}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&U.is(i.range)&&(m.string(i.uri)||m.undefined(i.uri))}a(t,"is"),r.is=t})(Na||(Na={}));var Df;(function(r){function e(n,i,s,o){return{targetUri:n,targetRange:i,targetSelectionRange:s,originSelectionRange:o}}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&U.is(i.targetRange)&&m.string(i.targetUri)&&U.is(i.targetSelectionRange)&&(U.is(i.originSelectionRange)||m.undefined(i.originSelectionRange))}a(t,"is"),r.is=t})(Df||(Df={}));var Fl;(function(r){function e(n,i,s,o){return{red:n,green:i,blue:s,alpha:o}}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&m.numberRange(i.red,0,1)&&m.numberRange(i.green,0,1)&&m.numberRange(i.blue,0,1)&&m.numberRange(i.alpha,0,1)}a(t,"is"),r.is=t})(Fl||(Fl={}));var Ff;(function(r){function e(n,i){return{range:n,color:i}}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&U.is(i.range)&&Fl.is(i.color)}a(t,"is"),r.is=t})(Ff||(Ff={}));var Gf;(function(r){function e(n,i,s){return{label:n,textEdit:i,additionalTextEdits:s}}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&m.string(i.label)&&(m.undefined(i.textEdit)||Gn.is(i))&&(m.undefined(i.additionalTextEdits)||m.typedArray(i.additionalTextEdits,Gn.is))}a(t,"is"),r.is=t})(Gf||(Gf={}));var Uf;(function(r){r.Comment="comment",r.Imports="imports",r.Region="region"})(Uf||(Uf={}));var Bf;(function(r){function e(n,i,s,o,l,u){let c={startLine:n,endLine:i};return m.defined(s)&&(c.startCharacter=s),m.defined(o)&&(c.endCharacter=o),m.defined(l)&&(c.kind=l),m.defined(u)&&(c.collapsedText=u),c}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&m.uinteger(i.startLine)&&m.uinteger(i.startLine)&&(m.undefined(i.startCharacter)||m.uinteger(i.startCharacter))&&(m.undefined(i.endCharacter)||m.uinteger(i.endCharacter))&&(m.undefined(i.kind)||m.string(i.kind))}a(t,"is"),r.is=t})(Bf||(Bf={}));var Gl;(function(r){function e(n,i){return{location:n,message:i}}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&Na.is(i.location)&&m.string(i.message)}a(t,"is"),r.is=t})(Gl||(Gl={}));var Wf;(function(r){r.Error=1,r.Warning=2,r.Information=3,r.Hint=4})(Wf||(Wf={}));var Kf;(function(r){r.Unnecessary=1,r.Deprecated=2})(Kf||(Kf={}));var Vf;(function(r){function e(t){let n=t;return m.objectLiteral(n)&&m.string(n.href)}a(e,"is"),r.is=e})(Vf||(Vf={}));var Ca;(function(r){function e(n,i,s,o,l,u){let c={range:n,message:i};return m.defined(s)&&(c.severity=s),m.defined(o)&&(c.code=o),m.defined(l)&&(c.source=l),m.defined(u)&&(c.relatedInformation=u),c}a(e,"create"),r.create=e;function t(n){var i;let s=n;return m.defined(s)&&U.is(s.range)&&m.string(s.message)&&(m.number(s.severity)||m.undefined(s.severity))&&(m.integer(s.code)||m.string(s.code)||m.undefined(s.code))&&(m.undefined(s.codeDescription)||m.string((i=s.codeDescription)===null||i===void 0?void 0:i.href))&&(m.string(s.source)||m.undefined(s.source))&&(m.undefined(s.relatedInformation)||m.typedArray(s.relatedInformation,Gl.is))}a(t,"is"),r.is=t})(Ca||(Ca={}));var Fn;(function(r){function e(n,i,...s){let o={title:n,command:i};return m.defined(s)&&s.length>0&&(o.arguments=s),o}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&m.string(i.title)&&m.string(i.command)}a(t,"is"),r.is=t})(Fn||(Fn={}));var Gn;(function(r){function e(s,o){return{range:s,newText:o}}a(e,"replace"),r.replace=e;function t(s,o){return{range:{start:s,end:s},newText:o}}a(t,"insert"),r.insert=t;function n(s){return{range:s,newText:""}}a(n,"del"),r.del=n;function i(s){let o=s;return m.objectLiteral(o)&&m.string(o.newText)&&U.is(o.range)}a(i,"is"),r.is=i})(Gn||(Gn={}));var Ul;(function(r){function e(n,i,s){let o={label:n};return i!==void 0&&(o.needsConfirmation=i),s!==void 0&&(o.description=s),o}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&m.string(i.label)&&(m.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&(m.string(i.description)||i.description===void 0)}a(t,"is"),r.is=t})(Ul||(Ul={}));var Un;(function(r){function e(t){let n=t;return m.string(n)}a(e,"is"),r.is=e})(Un||(Un={}));var jf;(function(r){function e(s,o,l){return{range:s,newText:o,annotationId:l}}a(e,"replace"),r.replace=e;function t(s,o,l){return{range:{start:s,end:s},newText:o,annotationId:l}}a(t,"insert"),r.insert=t;function n(s,o){return{range:s,newText:"",annotationId:o}}a(n,"del"),r.del=n;function i(s){let o=s;return Gn.is(o)&&(Ul.is(o.annotationId)||Un.is(o.annotationId))}a(i,"is"),r.is=i})(jf||(jf={}));var Bl;(function(r){function e(n,i){return{textDocument:n,edits:i}}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&Hl.is(i.textDocument)&&Array.isArray(i.edits)}a(t,"is"),r.is=t})(Bl||(Bl={}));var Wl;(function(r){function e(n,i,s){let o={kind:"create",uri:n};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(o.options=i),s!==void 0&&(o.annotationId=s),o}a(e,"create"),r.create=e;function t(n){let i=n;return i&&i.kind==="create"&&m.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||m.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||m.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||Un.is(i.annotationId))}a(t,"is"),r.is=t})(Wl||(Wl={}));var Kl;(function(r){function e(n,i,s,o){let l={kind:"rename",oldUri:n,newUri:i};return s!==void 0&&(s.overwrite!==void 0||s.ignoreIfExists!==void 0)&&(l.options=s),o!==void 0&&(l.annotationId=o),l}a(e,"create"),r.create=e;function t(n){let i=n;return i&&i.kind==="rename"&&m.string(i.oldUri)&&m.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||m.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||m.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||Un.is(i.annotationId))}a(t,"is"),r.is=t})(Kl||(Kl={}));var Vl;(function(r){function e(n,i,s){let o={kind:"delete",uri:n};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(o.options=i),s!==void 0&&(o.annotationId=s),o}a(e,"create"),r.create=e;function t(n){let i=n;return i&&i.kind==="delete"&&m.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||m.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||m.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||Un.is(i.annotationId))}a(t,"is"),r.is=t})(Vl||(Vl={}));var jl;(function(r){function e(t){let n=t;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(i=>m.string(i.kind)?Wl.is(i)||Kl.is(i)||Vl.is(i):Bl.is(i)))}a(e,"is"),r.is=e})(jl||(jl={}));var Hf;(function(r){function e(n){return{uri:n}}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&m.string(i.uri)}a(t,"is"),r.is=t})(Hf||(Hf={}));var zf;(function(r){function e(n,i){return{uri:n,version:i}}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&m.string(i.uri)&&m.integer(i.version)}a(t,"is"),r.is=t})(zf||(zf={}));var Hl;(function(r){function e(n,i){return{uri:n,version:i}}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&m.string(i.uri)&&(i.version===null||m.integer(i.version))}a(t,"is"),r.is=t})(Hl||(Hl={}));var qf;(function(r){function e(n,i,s,o){return{uri:n,languageId:i,version:s,text:o}}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&m.string(i.uri)&&m.string(i.languageId)&&m.integer(i.version)&&m.string(i.text)}a(t,"is"),r.is=t})(qf||(qf={}));var zl;(function(r){r.PlainText="plaintext",r.Markdown="markdown";function e(t){let n=t;return n===r.PlainText||n===r.Markdown}a(e,"is"),r.is=e})(zl||(zl={}));var Ui;(function(r){function e(t){let n=t;return m.objectLiteral(t)&&zl.is(n.kind)&&m.string(n.value)}a(e,"is"),r.is=e})(Ui||(Ui={}));var Xf;(function(r){r.Text=1,r.Method=2,r.Function=3,r.Constructor=4,r.Field=5,r.Variable=6,r.Class=7,r.Interface=8,r.Module=9,r.Property=10,r.Unit=11,r.Value=12,r.Enum=13,r.Keyword=14,r.Snippet=15,r.Color=16,r.File=17,r.Reference=18,r.Folder=19,r.EnumMember=20,r.Constant=21,r.Struct=22,r.Event=23,r.Operator=24,r.TypeParameter=25})(Xf||(Xf={}));var Yf;(function(r){r.PlainText=1,r.Snippet=2})(Yf||(Yf={}));var Jf;(function(r){r.Deprecated=1})(Jf||(Jf={}));var Qf;(function(r){function e(n,i,s){return{newText:n,insert:i,replace:s}}a(e,"create"),r.create=e;function t(n){let i=n;return i&&m.string(i.newText)&&U.is(i.insert)&&U.is(i.replace)}a(t,"is"),r.is=t})(Qf||(Qf={}));var Zf;(function(r){r.asIs=1,r.adjustIndentation=2})(Zf||(Zf={}));var ed;(function(r){function e(t){let n=t;return n&&(m.string(n.detail)||n.detail===void 0)&&(m.string(n.description)||n.description===void 0)}a(e,"is"),r.is=e})(ed||(ed={}));var td;(function(r){function e(t){return{label:t}}a(e,"create"),r.create=e})(td||(td={}));var rd;(function(r){function e(t,n){return{items:t||[],isIncomplete:!!n}}a(e,"create"),r.create=e})(rd||(rd={}));var Sa;(function(r){function e(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}a(e,"fromPlainText"),r.fromPlainText=e;function t(n){let i=n;return m.string(i)||m.objectLiteral(i)&&m.string(i.language)&&m.string(i.value)}a(t,"is"),r.is=t})(Sa||(Sa={}));var nd;(function(r){function e(t){let n=t;return!!n&&m.objectLiteral(n)&&(Ui.is(n.contents)||Sa.is(n.contents)||m.typedArray(n.contents,Sa.is))&&(t.range===void 0||U.is(t.range))}a(e,"is"),r.is=e})(nd||(nd={}));var id;(function(r){function e(t,n){return n?{label:t,documentation:n}:{label:t}}a(e,"create"),r.create=e})(id||(id={}));var sd;(function(r){function e(t,n,...i){let s={label:t};return m.defined(n)&&(s.documentation=n),m.defined(i)?s.parameters=i:s.parameters=[],s}a(e,"create"),r.create=e})(sd||(sd={}));var ad;(function(r){r.Text=1,r.Read=2,r.Write=3})(ad||(ad={}));var od;(function(r){function e(t,n){let i={range:t};return m.number(n)&&(i.kind=n),i}a(e,"create"),r.create=e})(od||(od={}));var ld;(function(r){r.File=1,r.Module=2,r.Namespace=3,r.Package=4,r.Class=5,r.Method=6,r.Property=7,r.Field=8,r.Constructor=9,r.Enum=10,r.Interface=11,r.Function=12,r.Variable=13,r.Constant=14,r.String=15,r.Number=16,r.Boolean=17,r.Array=18,r.Object=19,r.Key=20,r.Null=21,r.EnumMember=22,r.Struct=23,r.Event=24,r.Operator=25,r.TypeParameter=26})(ld||(ld={}));var ud;(function(r){r.Deprecated=1})(ud||(ud={}));var cd;(function(r){function e(t,n,i,s,o){let l={name:t,kind:n,location:{uri:s,range:i}};return o&&(l.containerName=o),l}a(e,"create"),r.create=e})(cd||(cd={}));var fd;(function(r){function e(t,n,i,s){return s!==void 0?{name:t,kind:n,location:{uri:i,range:s}}:{name:t,kind:n,location:{uri:i}}}a(e,"create"),r.create=e})(fd||(fd={}));var dd;(function(r){function e(n,i,s,o,l,u){let c={name:n,detail:i,kind:s,range:o,selectionRange:l};return u!==void 0&&(c.children=u),c}a(e,"create"),r.create=e;function t(n){let i=n;return i&&m.string(i.name)&&m.number(i.kind)&&U.is(i.range)&&U.is(i.selectionRange)&&(i.detail===void 0||m.string(i.detail))&&(i.deprecated===void 0||m.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}a(t,"is"),r.is=t})(dd||(dd={}));var hd;(function(r){r.Empty="",r.QuickFix="quickfix",r.Refactor="refactor",r.RefactorExtract="refactor.extract",r.RefactorInline="refactor.inline",r.RefactorRewrite="refactor.rewrite",r.Source="source",r.SourceOrganizeImports="source.organizeImports",r.SourceFixAll="source.fixAll"})(hd||(hd={}));var wa;(function(r){r.Invoked=1,r.Automatic=2})(wa||(wa={}));var pd;(function(r){function e(n,i,s){let o={diagnostics:n};return i!=null&&(o.only=i),s!=null&&(o.triggerKind=s),o}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&m.typedArray(i.diagnostics,Ca.is)&&(i.only===void 0||m.typedArray(i.only,m.string))&&(i.triggerKind===void 0||i.triggerKind===wa.Invoked||i.triggerKind===wa.Automatic)}a(t,"is"),r.is=t})(pd||(pd={}));var md;(function(r){function e(n,i,s){let o={title:n},l=!0;return typeof i=="string"?(l=!1,o.kind=i):Fn.is(i)?o.command=i:o.edit=i,l&&s!==void 0&&(o.kind=s),o}a(e,"create"),r.create=e;function t(n){let i=n;return i&&m.string(i.title)&&(i.diagnostics===void 0||m.typedArray(i.diagnostics,Ca.is))&&(i.kind===void 0||m.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||Fn.is(i.command))&&(i.isPreferred===void 0||m.boolean(i.isPreferred))&&(i.edit===void 0||jl.is(i.edit))}a(t,"is"),r.is=t})(md||(md={}));var gd;(function(r){function e(n,i){let s={range:n};return m.defined(i)&&(s.data=i),s}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&U.is(i.range)&&(m.undefined(i.command)||Fn.is(i.command))}a(t,"is"),r.is=t})(gd||(gd={}));var yd;(function(r){function e(n,i){return{tabSize:n,insertSpaces:i}}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&m.uinteger(i.tabSize)&&m.boolean(i.insertSpaces)}a(t,"is"),r.is=t})(yd||(yd={}));var Td;(function(r){function e(n,i,s){return{range:n,target:i,data:s}}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&U.is(i.range)&&(m.undefined(i.target)||m.string(i.target))}a(t,"is"),r.is=t})(Td||(Td={}));var Rd;(function(r){function e(n,i){return{range:n,parent:i}}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&U.is(i.range)&&(i.parent===void 0||r.is(i.parent))}a(t,"is"),r.is=t})(Rd||(Rd={}));var xd;(function(r){r.namespace="namespace",r.type="type",r.class="class",r.enum="enum",r.interface="interface",r.struct="struct",r.typeParameter="typeParameter",r.parameter="parameter",r.variable="variable",r.property="property",r.enumMember="enumMember",r.event="event",r.function="function",r.method="method",r.macro="macro",r.keyword="keyword",r.modifier="modifier",r.comment="comment",r.string="string",r.number="number",r.regexp="regexp",r.operator="operator",r.decorator="decorator"})(xd||(xd={}));var Ed;(function(r){r.declaration="declaration",r.definition="definition",r.readonly="readonly",r.static="static",r.deprecated="deprecated",r.abstract="abstract",r.async="async",r.modification="modification",r.documentation="documentation",r.defaultLibrary="defaultLibrary"})(Ed||(Ed={}));var Ad;(function(r){function e(t){let n=t;return m.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}a(e,"is"),r.is=e})(Ad||(Ad={}));var vd;(function(r){function e(n,i){return{range:n,text:i}}a(e,"create"),r.create=e;function t(n){let i=n;return i!=null&&U.is(i.range)&&m.string(i.text)}a(t,"is"),r.is=t})(vd||(vd={}));var kd;(function(r){function e(n,i,s){return{range:n,variableName:i,caseSensitiveLookup:s}}a(e,"create"),r.create=e;function t(n){let i=n;return i!=null&&U.is(i.range)&&m.boolean(i.caseSensitiveLookup)&&(m.string(i.variableName)||i.variableName===void 0)}a(t,"is"),r.is=t})(kd||(kd={}));var $d;(function(r){function e(n,i){return{range:n,expression:i}}a(e,"create"),r.create=e;function t(n){let i=n;return i!=null&&U.is(i.range)&&(m.string(i.expression)||i.expression===void 0)}a(t,"is"),r.is=t})($d||($d={}));var Id;(function(r){function e(n,i){return{frameId:n,stoppedLocation:i}}a(e,"create"),r.create=e;function t(n){let i=n;return m.defined(i)&&U.is(n.stoppedLocation)}a(t,"is"),r.is=t})(Id||(Id={}));var ql;(function(r){r.Type=1,r.Parameter=2;function e(t){return t===1||t===2}a(e,"is"),r.is=e})(ql||(ql={}));var Xl;(function(r){function e(n){return{value:n}}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&(i.tooltip===void 0||m.string(i.tooltip)||Ui.is(i.tooltip))&&(i.location===void 0||Na.is(i.location))&&(i.command===void 0||Fn.is(i.command))}a(t,"is"),r.is=t})(Xl||(Xl={}));var Nd;(function(r){function e(n,i,s){let o={position:n,label:i};return s!==void 0&&(o.kind=s),o}a(e,"create"),r.create=e;function t(n){let i=n;return m.objectLiteral(i)&&W.is(i.position)&&(m.string(i.label)||m.typedArray(i.label,Xl.is))&&(i.kind===void 0||ql.is(i.kind))&&i.textEdits===void 0||m.typedArray(i.textEdits,Gn.is)&&(i.tooltip===void 0||m.string(i.tooltip)||Ui.is(i.tooltip))&&(i.paddingLeft===void 0||m.boolean(i.paddingLeft))&&(i.paddingRight===void 0||m.boolean(i.paddingRight))}a(t,"is"),r.is=t})(Nd||(Nd={}));var Cd;(function(r){function e(t){return{kind:"snippet",value:t}}a(e,"createSnippet"),r.createSnippet=e})(Cd||(Cd={}));var Sd;(function(r){function e(t,n,i,s){return{insertText:t,filterText:n,range:i,command:s}}a(e,"create"),r.create=e})(Sd||(Sd={}));var wd;(function(r){function e(t){return{items:t}}a(e,"create"),r.create=e})(wd||(wd={}));var _d;(function(r){r.Invoked=0,r.Automatic=1})(_d||(_d={}));var Ld;(function(r){function e(t,n){return{range:t,text:n}}a(e,"create"),r.create=e})(Ld||(Ld={}));var Od;(function(r){function e(t,n){return{triggerKind:t,selectedCompletionInfo:n}}a(e,"create"),r.create=e})(Od||(Od={}));var Pd;(function(r){function e(t){let n=t;return m.objectLiteral(n)&&Dl.is(n.uri)&&m.string(n.name)}a(e,"is"),r.is=e})(Pd||(Pd={}));var bd;(function(r){function e(s,o,l,u){return new Yl(s,o,l,u)}a(e,"create"),r.create=e;function t(s){let o=s;return!!(m.defined(o)&&m.string(o.uri)&&(m.undefined(o.languageId)||m.string(o.languageId))&&m.uinteger(o.lineCount)&&m.func(o.getText)&&m.func(o.positionAt)&&m.func(o.offsetAt))}a(t,"is"),r.is=t;function n(s,o){let l=s.getText(),u=i(o,(f,d)=>{let h=f.range.start.line-d.range.start.line;return h===0?f.range.start.character-d.range.start.character:h}),c=l.length;for(let f=u.length-1;f>=0;f--){let d=u[f],h=s.offsetAt(d.range.start),p=s.offsetAt(d.range.end);if(p<=c)l=l.substring(0,h)+d.newText+l.substring(p,l.length);else throw new Error("Overlapping edit");c=h}return l}a(n,"applyEdits"),r.applyEdits=n;function i(s,o){if(s.length<=1)return s;let l=s.length/2|0,u=s.slice(0,l),c=s.slice(l);i(u,o),i(c,o);let f=0,d=0,h=0;for(;f0&&e.push(t.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let t=this.getLineOffsets(),n=0,i=t.length;if(i===0)return W.create(0,e);for(;ne?i=o:n=o+1}let s=n-1;return W.create(s,e-t[s])}offsetAt(e){let t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;let n=t[e.line],i=e.line+1"u"}a(n,"undefined"),r.undefined=n;function i(p){return p===!0||p===!1}a(i,"boolean"),r.boolean=i;function s(p){return e.call(p)==="[object String]"}a(s,"string"),r.string=s;function o(p){return e.call(p)==="[object Number]"}a(o,"number"),r.number=o;function l(p,g,y){return e.call(p)==="[object Number]"&&g<=p&&p<=y}a(l,"numberRange"),r.numberRange=l;function u(p){return e.call(p)==="[object Number]"&&-2147483648<=p&&p<=2147483647}a(u,"integer"),r.integer=u;function c(p){return e.call(p)==="[object Number]"&&0<=p&&p<=2147483647}a(c,"uinteger"),r.uinteger=c;function f(p){return e.call(p)==="[object Function]"}a(f,"func"),r.func=f;function d(p){return p!==null&&typeof p=="object"}a(d,"objectLiteral"),r.objectLiteral=d;function h(p,g){return Array.isArray(p)&&p.every(g)}a(h,"typedArray"),r.typedArray=h})(m||(m={}));var Bi=class{static{a(this,"CstNodeBuilder")}constructor(){this.nodeStack=[]}get current(){var e;return(e=this.nodeStack[this.nodeStack.length-1])!==null&&e!==void 0?e:this.rootNode}buildRootNode(e){return this.rootNode=new Bn(e),this.rootNode.root=this.rootNode,this.nodeStack=[this.rootNode],this.rootNode}buildCompositeNode(e){let t=new gr;return t.grammarSource=e,t.root=this.rootNode,this.current.content.push(t),this.nodeStack.push(t),t}buildLeafNode(e,t){let n=new mr(e.startOffset,e.image.length,Nr(e),e.tokenType,!t);return n.grammarSource=t,n.root=this.rootNode,this.current.content.push(n),n}removeNode(e){let t=e.container;if(t){let n=t.content.indexOf(e);n>=0&&t.content.splice(n,1)}}addHiddenNodes(e){let t=[];for(let s of e){let o=new mr(s.startOffset,s.image.length,Nr(s),s.tokenType,!0);o.root=this.rootNode,t.push(o)}let n=this.current,i=!1;if(n.content.length>0){n.content.push(...t);return}for(;n.container;){let s=n.container.content.indexOf(n);if(s>0){n.container.content.splice(s,0,...t),i=!0;break}n=n.container}i||this.rootNode.content.unshift(...t)}construct(e){let t=this.current;typeof e.$type=="string"&&(this.current.astNode=e),e.$cstNode=t;let n=this.nodeStack.pop();n?.content.length===0&&this.removeNode(n)}},Wi=class{static{a(this,"AbstractCstNode")}get parent(){return this.container}get feature(){return this.grammarSource}get hidden(){return!1}get astNode(){var e,t;let n=typeof((e=this._astNode)===null||e===void 0?void 0:e.$type)=="string"?this._astNode:(t=this.container)===null||t===void 0?void 0:t.astNode;if(!n)throw new Error("This node has no associated AST element");return n}set astNode(e){this._astNode=e}get element(){return this.astNode}get text(){return this.root.fullText.substring(this.offset,this.end)}},mr=class extends Wi{static{a(this,"LeafCstNodeImpl")}get offset(){return this._offset}get length(){return this._length}get end(){return this._offset+this._length}get hidden(){return this._hidden}get tokenType(){return this._tokenType}get range(){return this._range}constructor(e,t,n,i,s=!1){super(),this._hidden=s,this._offset=e,this._tokenType=i,this._length=t,this._range=n}},gr=class extends Wi{static{a(this,"CompositeCstNodeImpl")}constructor(){super(...arguments),this.content=new Jl(this)}get children(){return this.content}get offset(){var e,t;return(t=(e=this.firstNonHiddenNode)===null||e===void 0?void 0:e.offset)!==null&&t!==void 0?t:0}get length(){return this.end-this.offset}get end(){var e,t;return(t=(e=this.lastNonHiddenNode)===null||e===void 0?void 0:e.end)!==null&&t!==void 0?t:0}get range(){let e=this.firstNonHiddenNode,t=this.lastNonHiddenNode;if(e&&t){if(this._rangeCache===void 0){let{range:n}=e,{range:i}=t;this._rangeCache={start:n.start,end:i.end.line=0;e--){let t=this.content[e];if(!t.hidden)return t}return this.content[this.content.length-1]}},Jl=class r extends Array{static{a(this,"CstNodeContainer")}constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,r.prototype)}push(...e){return this.addParents(e),super.push(...e)}unshift(...e){return this.addParents(e),super.unshift(...e)}splice(e,t,...n){return this.addParents(n),super.splice(e,t,...n)}addParents(e){for(let t of e)t.container=this.parent}},Bn=class extends gr{static{a(this,"RootCstNodeImpl")}get text(){return this._text.substring(this.offset,this.end)}get fullText(){return this._text}constructor(e){super(),this._text="",this._text=e??""}};var _a=Symbol("Datatype");function Ql(r){return r.$type===_a}a(Ql,"isDataTypeNode");var Md="\u200B",Dd=a(r=>r.endsWith(Md)?r:r+Md,"withRuleSuffix"),Ki=class{static{a(this,"AbstractLangiumParser")}constructor(e){this._unorderedGroups=new Map,this.allRules=new Map,this.lexer=e.parser.Lexer;let t=this.lexer.definition,n=e.LanguageMetaData.mode==="production";this.wrapper=new Zl(t,Object.assign(Object.assign({},e.parser.ParserConfig),{skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider}))}alternatives(e,t){this.wrapper.wrapOr(e,t)}optional(e,t){this.wrapper.wrapOption(e,t)}many(e,t){this.wrapper.wrapMany(e,t)}atLeastOne(e,t){this.wrapper.wrapAtLeastOne(e,t)}getRule(e){return this.allRules.get(e)}isRecording(){return this.wrapper.IS_RECORDING}get unorderedGroups(){return this._unorderedGroups}getRuleStack(){return this.wrapper.RULE_STACK}finalize(){this.wrapper.wrapSelfAnalysis()}},Vi=class extends Ki{static{a(this,"LangiumParser")}get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new Bi,this.stack=[],this.assignmentMap=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,t){let n=this.computeRuleType(e),i=this.wrapper.DEFINE_RULE(Dd(e.name),this.startImplementation(n,t).bind(this));return this.allRules.set(e.name,i),e.entry&&(this.mainRule=i),i}computeRuleType(e){if(!e.fragment){if(yi(e))return _a;{let t=yn(e);return t??e.name}}}parse(e,t={}){this.nodeBuilder.buildRootNode(e);let n=this.lexerResult=this.lexer.tokenize(e);this.wrapper.input=n.tokens;let i=t.rule?this.allRules.get(t.rule):this.mainRule;if(!i)throw new Error(t.rule?`No rule found with name '${t.rule}'`:"No main rule available.");let s=i.call(this.wrapper,{});return this.nodeBuilder.addHiddenNodes(n.hidden),this.unorderedGroups.clear(),this.lexerResult=void 0,{value:s,lexerErrors:n.errors,lexerReport:n.report,parserErrors:this.wrapper.errors}}startImplementation(e,t){return n=>{let i=!this.isRecording()&&e!==void 0;if(i){let o={$type:e};this.stack.push(o),e===_a&&(o.value="")}let s;try{s=t(n)}catch{s=void 0}return s===void 0&&i&&(s=this.construct()),s}}extractHiddenTokens(e){let t=this.lexerResult.hidden;if(!t.length)return[];let n=e.startOffset;for(let i=0;in)return t.splice(0,i);return t.splice(0,t.length)}consume(e,t,n){let i=this.wrapper.wrapConsume(e,t);if(!this.isRecording()&&this.isValidToken(i)){let s=this.extractHiddenTokens(i);this.nodeBuilder.addHiddenNodes(s);let o=this.nodeBuilder.buildLeafNode(i,n),{assignment:l,isCrossRef:u}=this.getAssignment(n),c=this.current;if(l){let f=Ye(n)?i.image:this.converter.convert(i.image,o);this.assign(l.operator,l.feature,f,o,u)}else if(Ql(c)){let f=i.image;Ye(n)||(f=this.converter.convert(f,o).toString()),c.value+=f}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&typeof e.endOffset=="number"&&!isNaN(e.endOffset)}subrule(e,t,n,i,s){let o;!this.isRecording()&&!n&&(o=this.nodeBuilder.buildCompositeNode(i));let l=this.wrapper.wrapSubrule(e,t,s);!this.isRecording()&&o&&o.length>0&&this.performSubruleAssignment(l,i,o)}performSubruleAssignment(e,t,n){let{assignment:i,isCrossRef:s}=this.getAssignment(t);if(i)this.assign(i.operator,i.feature,e,n,s);else if(!i){let o=this.current;if(Ql(o))o.value+=e.toString();else if(typeof e=="object"&&e){let u=this.assignWithoutOverride(e,o);this.stack.pop(),this.stack.push(u)}}}action(e,t){if(!this.isRecording()){let n=this.current;if(t.feature&&t.operator){n=this.construct(),this.nodeBuilder.removeNode(n.$cstNode),this.nodeBuilder.buildCompositeNode(t).content.push(n.$cstNode);let s={$type:e};this.stack.push(s),this.assign(t.operator,t.feature,n,n.$cstNode,!1)}else n.$type=e}}construct(){if(this.isRecording())return;let e=this.current;return Ds(e),this.nodeBuilder.construct(e),this.stack.pop(),Ql(e)?this.converter.convert(e.value,e.$cstNode):(Go(this.astReflection,e),e)}getAssignment(e){if(!this.assignmentMap.has(e)){let t=ir(e,rt);this.assignmentMap.set(e,{assignment:t,isCrossRef:t?nr(t.terminal):!1})}return this.assignmentMap.get(e)}assign(e,t,n,i,s){let o=this.current,l;switch(s&&typeof n=="string"?l=this.linker.buildReference(o,t,i,n):l=n,e){case"=":{o[t]=l;break}case"?=":{o[t]=!0;break}case"+=":Array.isArray(o[t])||(o[t]=[]),o[t].push(l)}}assignWithoutOverride(e,t){for(let[i,s]of Object.entries(t)){let o=e[i];o===void 0?e[i]=s:Array.isArray(o)&&Array.isArray(s)&&(s.push(...o),e[i]=s)}let n=e.$cstNode;return n&&(n.astNode=void 0,e.$cstNode=void 0),e}get definitionErrors(){return this.wrapper.definitionErrors}},La=class{static{a(this,"AbstractParserErrorMessageProvider")}buildMismatchTokenMessage(e){return Lt.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return Lt.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return Lt.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return Lt.buildEarlyExitMessage(e)}},Wn=class extends La{static{a(this,"LangiumParserErrorMessageProvider")}buildMismatchTokenMessage({expected:e,actual:t}){return`Expecting ${e.LABEL?"`"+e.LABEL+"`":e.name.endsWith(":KW")?`keyword '${e.name.substring(0,e.name.length-3)}'`:`token of type '${e.name}'`} but found \`${t.image}\`.`}buildNotAllInputParsedMessage({firstRedundant:e}){return`Expecting end of file but found \`${e.image}\`.`}},ji=class extends Ki{static{a(this,"LangiumCompletionParser")}constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();let t=this.lexer.tokenize(e,{mode:"partial"});return this.tokens=t.tokens,this.wrapper.input=[...this.tokens],this.mainRule.call(this.wrapper,{}),this.unorderedGroups.clear(),{tokens:this.tokens,elementStack:[...this.lastElementStack],tokenIndex:this.nextTokenIndex}}rule(e,t){let n=this.wrapper.DEFINE_RULE(Dd(e.name),this.startImplementation(t).bind(this));return this.allRules.set(e.name,n),e.entry&&(this.mainRule=n),n}resetState(){this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}startImplementation(e){return t=>{let n=this.keepStackSize();try{e(t)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){let e=this.elementStack.length;return this.stackSize=e,e}resetStackSize(e){this.removeUnexpectedElements(),this.stackSize=e}consume(e,t,n){this.wrapper.wrapConsume(e,t),this.isRecording()||(this.lastElementStack=[...this.elementStack,n],this.nextTokenIndex=this.currIdx+1)}subrule(e,t,n,i,s){this.before(i),this.wrapper.wrapSubrule(e,t,s),this.after(i)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){let t=this.elementStack.lastIndexOf(e);t>=0&&this.elementStack.splice(t)}}get currIdx(){return this.wrapper.currIdx}},jm={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new Wn},Zl=class extends bi{static{a(this,"ChevrotainWrapper")}constructor(e,t){let n=t&&"maxLookahead"in t;super(e,Object.assign(Object.assign(Object.assign({},jm),{lookaheadStrategy:n?new Ot({maxLookahead:t.maxLookahead}):new Gi({logging:t.skipValidations?()=>{}:void 0})}),t))}get IS_RECORDING(){return this.RECORDING_PHASE}DEFINE_RULE(e,t){return this.RULE(e,t)}wrapSelfAnalysis(){this.performSelfAnalysis()}wrapConsume(e,t){return this.consume(e,t)}wrapSubrule(e,t,n){return this.subrule(e,t,{ARGS:[n]})}wrapOr(e,t){this.or(e,t)}wrapOption(e,t){this.option(e,t)}wrapMany(e,t){this.many(e,t)}wrapAtLeastOne(e,t){this.atLeastOne(e,t)}};function Hi(r,e,t){return Hm({parser:e,tokens:t,ruleNames:new Map},r),e}a(Hi,"createParser");function Hm(r,e){let t=mi(e,!1),n=j(e.rules).filter(Se).filter(i=>t.has(i));for(let i of n){let s=Object.assign(Object.assign({},r),{consume:1,optional:1,subrule:1,many:1,or:1});r.parser.rule(i,yr(s,i.definition))}}a(Hm,"buildRules");function yr(r,e,t=!1){let n;if(Ye(e))n=Zm(r,e);else if($t(e))n=zm(r,e);else if(rt(e))n=yr(r,e.terminal);else if(nr(e))n=Fd(r,e);else if(nt(e))n=qm(r,e);else if(Ps(e))n=Ym(r,e);else if(Ms(e))n=Jm(r,e);else if(Ut(e))n=Qm(r,e);else if(wo(e)){let i=r.consume++;n=a(()=>r.parser.consume(i,qe,e),"method")}else throw new tr(e.$cstNode,`Unexpected element type: ${e.$type}`);return Gd(r,t?void 0:Oa(e),n,e.cardinality)}a(yr,"buildElement");function zm(r,e){let t=Ti(e);return()=>r.parser.action(t,e)}a(zm,"buildAction");function qm(r,e){let t=e.rule.ref;if(Se(t)){let n=r.subrule++,i=t.fragment,s=e.arguments.length>0?Xm(t,e.arguments):()=>({});return o=>r.parser.subrule(n,Ud(r,t),i,e,s(o))}else if(He(t)){let n=r.consume++,i=eu(r,t.name);return()=>r.parser.consume(n,i,e)}else if(t)ct(t);else throw new tr(e.$cstNode,`Undefined rule: ${e.rule.$refText}`)}a(qm,"buildRuleCall");function Xm(r,e){let t=e.map(n=>Pt(n.value));return n=>{let i={};for(let s=0;se(n)||t(n)}else if(Ao(r)){let e=Pt(r.left),t=Pt(r.right);return n=>e(n)&&t(n)}else if(ko(r)){let e=Pt(r.value);return t=>!e(t)}else if($o(r)){let e=r.parameter.ref.name;return t=>t!==void 0&&t[e]===!0}else if(Eo(r)){let e=!!r.true;return()=>e}ct(r)}a(Pt,"buildPredicate");function Ym(r,e){if(e.elements.length===1)return yr(r,e.elements[0]);{let t=[];for(let i of e.elements){let s={ALT:yr(r,i,!0)},o=Oa(i);o&&(s.GATE=Pt(o)),t.push(s)}let n=r.or++;return i=>r.parser.alternatives(n,t.map(s=>{let o={ALT:a(()=>s.ALT(i),"ALT")},l=s.GATE;return l&&(o.GATE=()=>l(i)),o}))}}a(Ym,"buildAlternatives");function Jm(r,e){if(e.elements.length===1)return yr(r,e.elements[0]);let t=[];for(let l of e.elements){let u={ALT:yr(r,l,!0)},c=Oa(l);c&&(u.GATE=Pt(c)),t.push(u)}let n=r.or++,i=a((l,u)=>{let c=u.getRuleStack().join("-");return`uGroup_${l}_${c}`},"idFunc"),s=a(l=>r.parser.alternatives(n,t.map((u,c)=>{let f={ALT:a(()=>!0,"ALT")},d=r.parser;f.ALT=()=>{if(u.ALT(l),!d.isRecording()){let p=i(n,d);d.unorderedGroups.get(p)||d.unorderedGroups.set(p,[]);let g=d.unorderedGroups.get(p);typeof g?.[c]>"u"&&(g[c]=!0)}};let h=u.GATE;return h?f.GATE=()=>h(l):f.GATE=()=>{let p=d.unorderedGroups.get(i(n,d));return!p?.[c]},f})),"alternatives"),o=Gd(r,Oa(e),s,"*");return l=>{o(l),r.parser.isRecording()||r.parser.unorderedGroups.delete(i(n,r.parser))}}a(Jm,"buildUnorderedGroup");function Qm(r,e){let t=e.elements.map(n=>yr(r,n));return n=>t.forEach(i=>i(n))}a(Qm,"buildGroup");function Oa(r){if(Ut(r))return r.guardCondition}a(Oa,"getGuardCondition");function Fd(r,e,t=e.terminal){if(t)if(nt(t)&&Se(t.rule.ref)){let n=t.rule.ref,i=r.subrule++;return s=>r.parser.subrule(i,Ud(r,n),!1,e,s)}else if(nt(t)&&He(t.rule.ref)){let n=r.consume++,i=eu(r,t.rule.ref.name);return()=>r.parser.consume(n,i,e)}else if(Ye(t)){let n=r.consume++,i=eu(r,t.value);return()=>r.parser.consume(n,i,e)}else throw new Error("Could not build cross reference parser");else{if(!e.type.ref)throw new Error("Could not resolve reference to type: "+e.type.$refText);let n=Ws(e.type.ref),i=n?.terminal;if(!i)throw new Error("Could not find name assignment for type: "+Ti(e.type.ref));return Fd(r,e,i)}}a(Fd,"buildCrossReference");function Zm(r,e){let t=r.consume++,n=r.tokens[e.value];if(!n)throw new Error("Could not find token for keyword: "+e.value);return()=>r.parser.consume(t,n,e)}a(Zm,"buildKeyword");function Gd(r,e,t,n){let i=e&&Pt(e);if(!n)if(i){let s=r.or++;return o=>r.parser.alternatives(s,[{ALT:a(()=>t(o),"ALT"),GATE:a(()=>i(o),"GATE")},{ALT:va(),GATE:a(()=>!i(o),"GATE")}])}else return t;if(n==="*"){let s=r.many++;return o=>r.parser.many(s,{DEF:a(()=>t(o),"DEF"),GATE:i?()=>i(o):void 0})}else if(n==="+"){let s=r.many++;if(i){let o=r.or++;return l=>r.parser.alternatives(o,[{ALT:a(()=>r.parser.atLeastOne(s,{DEF:a(()=>t(l),"DEF")}),"ALT"),GATE:a(()=>i(l),"GATE")},{ALT:va(),GATE:a(()=>!i(l),"GATE")}])}else return o=>r.parser.atLeastOne(s,{DEF:a(()=>t(o),"DEF")})}else if(n==="?"){let s=r.optional++;return o=>r.parser.optional(s,{DEF:a(()=>t(o),"DEF"),GATE:i?()=>i(o):void 0})}else ct(n)}a(Gd,"wrap");function Ud(r,e){let t=eg(r,e),n=r.parser.getRule(t);if(!n)throw new Error(`Rule "${t}" not found."`);return n}a(Ud,"getRule");function eg(r,e){if(Se(e))return e.name;if(r.ruleNames.has(e))return r.ruleNames.get(e);{let t=e,n=t.$container,i=e.$type;for(;!Se(n);)(Ut(n)||Ps(n)||Ms(n))&&(i=n.elements.indexOf(t).toString()+":"+i),t=n,n=n.$container;return i=n.name+":"+i,r.ruleNames.set(e,i),i}}a(eg,"getRuleName");function eu(r,e){let t=r.tokens[e];if(!t)throw new Error(`Token "${e}" not found."`);return t}a(eu,"getToken");function tu(r){let e=r.Grammar,t=r.parser.Lexer,n=new ji(r);return Hi(e,n,t.definition),n.finalize(),n}a(tu,"createCompletionParser");function ru(r){let e=Bd(r);return e.finalize(),e}a(ru,"createLangiumParser");function Bd(r){let e=r.Grammar,t=r.parser.Lexer,n=new Vi(r);return Hi(e,n,t.definition)}a(Bd,"prepareLangiumParser");var bt=class{static{a(this,"DefaultTokenBuilder")}constructor(){this.diagnostics=[]}buildTokens(e,t){let n=j(mi(e,!1)),i=this.buildTerminalTokens(n),s=this.buildKeywordTokens(n,i,t);return i.forEach(o=>{let l=o.PATTERN;typeof l=="object"&&l&&"test"in l&&gn(l)?s.unshift(o):s.push(o)}),s}flushLexingReport(e){return{diagnostics:this.popDiagnostics()}}popDiagnostics(){let e=[...this.diagnostics];return this.diagnostics=[],e}buildTerminalTokens(e){return e.filter(He).filter(t=>!t.fragment).map(t=>this.buildTerminalToken(t)).toArray()}buildTerminalToken(e){let t=Tn(e),n=this.requiresCustomPattern(t)?this.regexPatternFunction(t):t,i={name:e.name,PATTERN:n};return typeof n=="function"&&(i.LINE_BREAKS=!0),e.hidden&&(i.GROUP=gn(t)?se.SKIPPED:"hidden"),i}requiresCustomPattern(e){return e.flags.includes("u")||e.flags.includes("s")?!0:!!(e.source.includes("?<=")||e.source.includes("?(t.lastIndex=i,t.exec(n))}buildKeywordTokens(e,t,n){return e.filter(Se).flatMap(i=>ft(i).filter(Ye)).distinct(i=>i.value).toArray().sort((i,s)=>s.value.length-i.value.length).map(i=>this.buildKeywordToken(i,t,!!n?.caseInsensitive))}buildKeywordToken(e,t,n){let i=this.buildKeywordPattern(e,n),s={name:e.value,PATTERN:i,LONGER_ALT:this.findLongerAlt(e,t)};return typeof i=="function"&&(s.LINE_BREAKS=!0),s}buildKeywordPattern(e,t){return t?new RegExp(jo(e.value)):e.value}findLongerAlt(e,t){return t.reduce((n,i)=>{let s=i?.PATTERN;return s?.source&&Ho("^"+s.source+"$",e.value)&&n.push(i),n},[])}};var Tr=class{static{a(this,"DefaultValueConverter")}convert(e,t){let n=t.grammarSource;if(nr(n)&&(n=Xo(n)),nt(n)){let i=n.rule.ref;if(!i)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(i,e,t)}return e}runConverter(e,t,n){var i;switch(e.name.toUpperCase()){case"INT":return pt.convertInt(t);case"STRING":return pt.convertString(t);case"ID":return pt.convertID(t)}switch((i=rl(e))===null||i===void 0?void 0:i.toLowerCase()){case"number":return pt.convertNumber(t);case"boolean":return pt.convertBoolean(t);case"bigint":return pt.convertBigint(t);case"date":return pt.convertDate(t);default:return t}}},pt;(function(r){function e(c){let f="";for(let d=1;d{typeof setImmediate>"u"?setTimeout(r,0):setImmediate(r)})}a(fu,"delayNextTick");var Da=0,zd=10;function Fa(){return Da=performance.now(),new S.CancellationTokenSource}a(Fa,"startCancelableOperation");function qd(r){zd=r}a(qd,"setInterruptionPeriod");var mt=Symbol("OperationCancelled");function gt(r){return r===mt}a(gt,"isOperationCancelled");async function ce(r){if(r===S.CancellationToken.None)return;let e=performance.now();if(e-Da>=zd&&(Da=e,await fu(),Da=performance.now()),r.isCancellationRequested)throw mt}a(ce,"interruptAndCheck");var Ge=class{static{a(this,"Deferred")}constructor(){this.promise=new Promise((e,t)=>{this.resolve=n=>(e(n),this),this.reject=n=>(t(n),this)})}};var Ga=class r{static{a(this,"FullTextDocument")}constructor(e,t,n,i){this._uri=e,this._languageId=t,this._version=n,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let t=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(t,n)}return this._content}update(e,t){for(let n of e)if(r.isIncremental(n)){let i=Jd(n.range),s=this.offsetAt(i.start),o=this.offsetAt(i.end);this._content=this._content.substring(0,s)+n.text+this._content.substring(o,this._content.length);let l=Math.max(i.start.line,0),u=Math.max(i.end.line,0),c=this._lineOffsets,f=Xd(n.text,!1,s);if(u-l===f.length)for(let h=0,p=f.length;he?i=o:n=o+1}let s=n-1;return e=this.ensureBeforeEOL(e,t[s]),{line:s,character:e-t[s]}}offsetAt(e){let t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;let n=t[e.line];if(e.character<=0)return n;let i=e.line+1t&&Yd(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){let t=e;return t!=null&&typeof t.text=="string"&&t.range!==void 0&&(t.rangeLength===void 0||typeof t.rangeLength=="number")}static isFull(e){let t=e;return t!=null&&typeof t.text=="string"&&t.range===void 0&&t.rangeLength===void 0}},jn;(function(r){function e(i,s,o,l){return new Ga(i,s,o,l)}a(e,"create"),r.create=e;function t(i,s,o){if(i instanceof Ga)return i.update(s,o),i;throw new Error("TextDocument.update: document must be created by TextDocument.create")}a(t,"update"),r.update=t;function n(i,s){let o=i.getText(),l=du(s.map(cg),(f,d)=>{let h=f.range.start.line-d.range.start.line;return h===0?f.range.start.character-d.range.start.character:h}),u=0,c=[];for(let f of l){let d=i.offsetAt(f.range.start);if(du&&c.push(o.substring(u,d)),f.newText.length&&c.push(f.newText),u=i.offsetAt(f.range.end)}return c.push(o.substr(u)),c.join("")}a(n,"applyEdits"),r.applyEdits=n})(jn||(jn={}));function du(r,e){if(r.length<=1)return r;let t=r.length/2|0,n=r.slice(0,t),i=r.slice(t);du(n,e),du(i,e);let s=0,o=0,l=0;for(;st.line||e.line===t.line&&e.character>t.character?{start:t,end:e}:r}a(Jd,"getWellformedRange");function cg(r){let e=Jd(r.range);return e!==r.range?{newText:r.newText,range:e}:r}a(cg,"getWellformedEdit");var Qd;(()=>{"use strict";var r={470:i=>{function s(u){if(typeof u!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(u))}a(s,"e");function o(u,c){for(var f,d="",h=0,p=-1,g=0,y=0;y<=u.length;++y){if(y2){var v=d.lastIndexOf("/");if(v!==d.length-1){v===-1?(d="",h=0):h=(d=d.slice(0,v)).length-1-d.lastIndexOf("/"),p=y,g=0;continue}}else if(d.length===2||d.length===1){d="",h=0,p=y,g=0;continue}}c&&(d.length>0?d+="/..":d="..",h=2)}else d.length>0?d+="/"+u.slice(p+1,y):d=u.slice(p+1,y),h=y-p-1;p=y,g=0}else f===46&&g!==-1?++g:g=-1}return d}a(o,"r");var l={resolve:a(function(){for(var u,c="",f=!1,d=arguments.length-1;d>=-1&&!f;d--){var h;d>=0?h=arguments[d]:(u===void 0&&(u=process.cwd()),h=u),s(h),h.length!==0&&(c=h+"/"+c,f=h.charCodeAt(0)===47)}return c=o(c,!f),f?c.length>0?"/"+c:"/":c.length>0?c:"."},"resolve"),normalize:a(function(u){if(s(u),u.length===0)return".";var c=u.charCodeAt(0)===47,f=u.charCodeAt(u.length-1)===47;return(u=o(u,!c)).length!==0||c||(u="."),u.length>0&&f&&(u+="/"),c?"/"+u:u},"normalize"),isAbsolute:a(function(u){return s(u),u.length>0&&u.charCodeAt(0)===47},"isAbsolute"),join:a(function(){if(arguments.length===0)return".";for(var u,c=0;c0&&(u===void 0?u=f:u+="/"+f)}return u===void 0?".":l.normalize(u)},"join"),relative:a(function(u,c){if(s(u),s(c),u===c||(u=l.resolve(u))===(c=l.resolve(c)))return"";for(var f=1;fy){if(c.charCodeAt(p+x)===47)return c.slice(p+x+1);if(x===0)return c.slice(p+x)}else h>y&&(u.charCodeAt(f+x)===47?v=x:x===0&&(v=0));break}var A=u.charCodeAt(f+x);if(A!==c.charCodeAt(p+x))break;A===47&&(v=x)}var R="";for(x=f+v+1;x<=d;++x)x!==d&&u.charCodeAt(x)!==47||(R.length===0?R+="..":R+="/..");return R.length>0?R+c.slice(p+v):(p+=v,c.charCodeAt(p)===47&&++p,c.slice(p))},"relative"),_makeLong:a(function(u){return u},"_makeLong"),dirname:a(function(u){if(s(u),u.length===0)return".";for(var c=u.charCodeAt(0),f=c===47,d=-1,h=!0,p=u.length-1;p>=1;--p)if((c=u.charCodeAt(p))===47){if(!h){d=p;break}}else h=!1;return d===-1?f?"/":".":f&&d===1?"//":u.slice(0,d)},"dirname"),basename:a(function(u,c){if(c!==void 0&&typeof c!="string")throw new TypeError('"ext" argument must be a string');s(u);var f,d=0,h=-1,p=!0;if(c!==void 0&&c.length>0&&c.length<=u.length){if(c.length===u.length&&c===u)return"";var g=c.length-1,y=-1;for(f=u.length-1;f>=0;--f){var v=u.charCodeAt(f);if(v===47){if(!p){d=f+1;break}}else y===-1&&(p=!1,y=f+1),g>=0&&(v===c.charCodeAt(g)?--g==-1&&(h=f):(g=-1,h=y))}return d===h?h=y:h===-1&&(h=u.length),u.slice(d,h)}for(f=u.length-1;f>=0;--f)if(u.charCodeAt(f)===47){if(!p){d=f+1;break}}else h===-1&&(p=!1,h=f+1);return h===-1?"":u.slice(d,h)},"basename"),extname:a(function(u){s(u);for(var c=-1,f=0,d=-1,h=!0,p=0,g=u.length-1;g>=0;--g){var y=u.charCodeAt(g);if(y!==47)d===-1&&(h=!1,d=g+1),y===46?c===-1?c=g:p!==1&&(p=1):c!==-1&&(p=-1);else if(!h){f=g+1;break}}return c===-1||d===-1||p===0||p===1&&c===d-1&&c===f+1?"":u.slice(c,d)},"extname"),format:a(function(u){if(u===null||typeof u!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof u);return(function(c,f){var d=f.dir||f.root,h=f.base||(f.name||"")+(f.ext||"");return d?d===f.root?d+h:d+"/"+h:h})(0,u)},"format"),parse:a(function(u){s(u);var c={root:"",dir:"",base:"",ext:"",name:""};if(u.length===0)return c;var f,d=u.charCodeAt(0),h=d===47;h?(c.root="/",f=1):f=0;for(var p=-1,g=0,y=-1,v=!0,x=u.length-1,A=0;x>=f;--x)if((d=u.charCodeAt(x))!==47)y===-1&&(v=!1,y=x+1),d===46?p===-1?p=x:A!==1&&(A=1):p!==-1&&(A=-1);else if(!v){g=x+1;break}return p===-1||y===-1||A===0||A===1&&p===y-1&&p===g+1?y!==-1&&(c.base=c.name=g===0&&h?u.slice(1,y):u.slice(g,y)):(g===0&&h?(c.name=u.slice(1,p),c.base=u.slice(1,y)):(c.name=u.slice(g,p),c.base=u.slice(g,y)),c.ext=u.slice(p,y)),g>0?c.dir=u.slice(0,g-1):h&&(c.dir="/"),c},"parse"),sep:"/",delimiter:":",win32:null,posix:null};l.posix=l,i.exports=l}},e={};function t(i){var s=e[i];if(s!==void 0)return s.exports;var o=e[i]={exports:{}};return r[i](o,o.exports,t),o.exports}a(t,"r"),t.d=(i,s)=>{for(var o in s)t.o(s,o)&&!t.o(i,o)&&Object.defineProperty(i,o,{enumerable:!0,get:s[o]})},t.o=(i,s)=>Object.prototype.hasOwnProperty.call(i,s),t.r=i=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})};var n={};(()=>{let i;t.r(n),t.d(n,{URI:a(()=>h,"URI"),Utils:a(()=>Tt,"Utils")}),typeof process=="object"?i=process.platform==="win32":typeof navigator=="object"&&(i=navigator.userAgent.indexOf("Windows")>=0);let s=/^\w[\w\d+.-]*$/,o=/^\//,l=/^\/\//;function u(k,T){if(!k.scheme&&T)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${k.authority}", path: "${k.path}", query: "${k.query}", fragment: "${k.fragment}"}`);if(k.scheme&&!s.test(k.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(k.path){if(k.authority){if(!o.test(k.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(l.test(k.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}a(u,"s");let c="",f="/",d=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class h{static{a(this,"f")}static isUri(T){return T instanceof h||!!T&&typeof T.authority=="string"&&typeof T.fragment=="string"&&typeof T.path=="string"&&typeof T.query=="string"&&typeof T.scheme=="string"&&typeof T.fsPath=="string"&&typeof T.with=="function"&&typeof T.toString=="function"}scheme;authority;path;query;fragment;constructor(T,C,N,V,O,L=!1){typeof T=="object"?(this.scheme=T.scheme||c,this.authority=T.authority||c,this.path=T.path||c,this.query=T.query||c,this.fragment=T.fragment||c):(this.scheme=(function(Le,Oe){return Le||Oe?Le:"file"})(T,L),this.authority=C||c,this.path=(function(Le,Oe){switch(Le){case"https":case"http":case"file":Oe?Oe[0]!==f&&(Oe=f+Oe):Oe=f}return Oe})(this.scheme,N||c),this.query=V||c,this.fragment=O||c,u(this,L))}get fsPath(){return A(this,!1)}with(T){if(!T)return this;let{scheme:C,authority:N,path:V,query:O,fragment:L}=T;return C===void 0?C=this.scheme:C===null&&(C=c),N===void 0?N=this.authority:N===null&&(N=c),V===void 0?V=this.path:V===null&&(V=c),O===void 0?O=this.query:O===null&&(O=c),L===void 0?L=this.fragment:L===null&&(L=c),C===this.scheme&&N===this.authority&&V===this.path&&O===this.query&&L===this.fragment?this:new g(C,N,V,O,L)}static parse(T,C=!1){let N=d.exec(T);return N?new g(N[2]||c,Te(N[4]||c),Te(N[5]||c),Te(N[7]||c),Te(N[9]||c),C):new g(c,c,c,c,c)}static file(T){let C=c;if(i&&(T=T.replace(/\\/g,f)),T[0]===f&&T[1]===f){let N=T.indexOf(f,2);N===-1?(C=T.substring(2),T=f):(C=T.substring(2,N),T=T.substring(N)||f)}return new g("file",C,T,c,c)}static from(T){let C=new g(T.scheme,T.authority,T.path,T.query,T.fragment);return u(C,!0),C}toString(T=!1){return R(this,T)}toJSON(){return this}static revive(T){if(T){if(T instanceof h)return T;{let C=new g(T);return C._formatted=T.external,C._fsPath=T._sep===p?T.fsPath:null,C}}return T}}let p=i?1:void 0;class g extends h{static{a(this,"l")}_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=A(this,!1)),this._fsPath}toString(T=!1){return T?R(this,!0):(this._formatted||(this._formatted=R(this,!1)),this._formatted)}toJSON(){let T={$mid:1};return this._fsPath&&(T.fsPath=this._fsPath,T._sep=p),this._formatted&&(T.external=this._formatted),this.path&&(T.path=this.path),this.scheme&&(T.scheme=this.scheme),this.authority&&(T.authority=this.authority),this.query&&(T.query=this.query),this.fragment&&(T.fragment=this.fragment),T}}let y={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function v(k,T,C){let N,V=-1;for(let O=0;O=97&&L<=122||L>=65&&L<=90||L>=48&&L<=57||L===45||L===46||L===95||L===126||T&&L===47||C&&L===91||C&&L===93||C&&L===58)V!==-1&&(N+=encodeURIComponent(k.substring(V,O)),V=-1),N!==void 0&&(N+=k.charAt(O));else{N===void 0&&(N=k.substr(0,O));let Le=y[L];Le!==void 0?(V!==-1&&(N+=encodeURIComponent(k.substring(V,O)),V=-1),N+=Le):V===-1&&(V=O)}}return V!==-1&&(N+=encodeURIComponent(k.substring(V))),N!==void 0?N:k}a(v,"d");function x(k){let T;for(let C=0;C1&&k.scheme==="file"?`//${k.authority}${k.path}`:k.path.charCodeAt(0)===47&&(k.path.charCodeAt(1)>=65&&k.path.charCodeAt(1)<=90||k.path.charCodeAt(1)>=97&&k.path.charCodeAt(1)<=122)&&k.path.charCodeAt(2)===58?T?k.path.substr(1):k.path[1].toLowerCase()+k.path.substr(2):k.path,i&&(C=C.replace(/\//g,"\\")),C}a(A,"m");function R(k,T){let C=T?x:v,N="",{scheme:V,authority:O,path:L,query:Le,fragment:Oe}=k;if(V&&(N+=V,N+=":"),(O||V==="file")&&(N+=f,N+=f),O){let ee=O.indexOf("@");if(ee!==-1){let Ht=O.substr(0,ee);O=O.substr(ee+1),ee=Ht.lastIndexOf(":"),ee===-1?N+=C(Ht,!1,!1):(N+=C(Ht.substr(0,ee),!1,!1),N+=":",N+=C(Ht.substr(ee+1),!1,!0)),N+="@"}O=O.toLowerCase(),ee=O.lastIndexOf(":"),ee===-1?N+=C(O,!1,!0):(N+=C(O.substr(0,ee),!1,!0),N+=O.substr(ee))}if(L){if(L.length>=3&&L.charCodeAt(0)===47&&L.charCodeAt(2)===58){let ee=L.charCodeAt(1);ee>=65&&ee<=90&&(L=`/${String.fromCharCode(ee+32)}:${L.substr(3)}`)}else if(L.length>=2&&L.charCodeAt(1)===58){let ee=L.charCodeAt(0);ee>=65&&ee<=90&&(L=`${String.fromCharCode(ee+32)}:${L.substr(2)}`)}N+=C(L,!0,!1)}return Le&&(N+="?",N+=C(Le,!1,!1)),Oe&&(N+="#",N+=T?Oe:v(Oe,!1,!1)),N}a(R,"y");function P(k){try{return decodeURIComponent(k)}catch{return k.length>3?k.substr(0,3)+P(k.substr(3)):k}}a(P,"v");let b=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function Te(k){return k.match(b)?k.replace(b,(T=>P(T))):k}a(Te,"C");var kr=t(470);let Ae=kr.posix||kr,Mt="/";var Tt;(function(k){k.joinPath=function(T,...C){return T.with({path:Ae.join(T.path,...C)})},k.resolvePath=function(T,...C){let N=T.path,V=!1;N[0]!==Mt&&(N=Mt+N,V=!0);let O=Ae.resolve(N,...C);return V&&O[0]===Mt&&!T.authority&&(O=O.substring(1)),T.with({path:O})},k.dirname=function(T){if(T.path.length===0||T.path===Mt)return T;let C=Ae.dirname(T.path);return C.length===1&&C.charCodeAt(0)===46&&(C=""),T.with({path:C})},k.basename=function(T){return Ae.basename(T.path)},k.extname=function(T){return Ae.extname(T.path)}})(Tt||(Tt={}))})(),Qd=n})();var{URI:Ue,Utils:Hn}=Qd;var Be;(function(r){r.basename=Hn.basename,r.dirname=Hn.dirname,r.extname=Hn.extname,r.joinPath=Hn.joinPath,r.resolvePath=Hn.resolvePath;function e(i,s){return i?.toString()===s?.toString()}a(e,"equals"),r.equals=e;function t(i,s){let o=typeof i=="string"?i:i.path,l=typeof s=="string"?s:s.path,u=o.split("/").filter(p=>p.length>0),c=l.split("/").filter(p=>p.length>0),f=0;for(;fi??(i=jn.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,t??""))}},qi=class{static{a(this,"DefaultLangiumDocuments")}constructor(e){this.documentMap=new Map,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.serviceRegistry=e.ServiceRegistry}get all(){return j(this.documentMap.values())}addDocument(e){let t=e.uri.toString();if(this.documentMap.has(t))throw new Error(`A document with the URI '${t}' is already present.`);this.documentMap.set(t,e)}getDocument(e){let t=e.toString();return this.documentMap.get(t)}async getOrCreateDocument(e,t){let n=this.getDocument(e);return n||(n=await this.langiumDocumentFactory.fromUri(e,t),this.addDocument(n),n)}createDocument(e,t,n){if(n)return this.langiumDocumentFactory.fromString(t,e,n).then(i=>(this.addDocument(i),i));{let i=this.langiumDocumentFactory.fromString(t,e);return this.addDocument(i),i}}hasDocument(e){return this.documentMap.has(e.toString())}invalidateDocument(e){let t=e.toString(),n=this.documentMap.get(t);return n&&(this.serviceRegistry.getServices(e).references.Linker.unlink(n),n.state=Y.Changed,n.precomputedScopes=void 0,n.diagnostics=void 0),n}deleteDocument(e){let t=e.toString(),n=this.documentMap.get(t);return n&&(n.state=Y.Changed,this.documentMap.delete(t)),n}};var hu=Symbol("ref_resolving"),Xi=class{static{a(this,"DefaultLinker")}constructor(e){this.reflection=e.shared.AstReflection,this.langiumDocuments=()=>e.shared.workspace.LangiumDocuments,this.scopeProvider=e.references.ScopeProvider,this.astNodeLocator=e.workspace.AstNodeLocator}async link(e,t=S.CancellationToken.None){for(let n of Je(e.parseResult.value))await ce(t),pn(n).forEach(i=>this.doLink(i,e))}doLink(e,t){var n;let i=e.reference;if(i._ref===void 0){i._ref=hu;try{let s=this.getCandidate(e);if(Qt(s))i._ref=s;else if(i._nodeDescription=s,this.langiumDocuments().hasDocument(s.documentUri)){let o=this.loadAstNode(s);i._ref=o??this.createLinkingError(e,s)}else i._ref=void 0}catch(s){console.error(`An error occurred while resolving reference to '${i.$refText}':`,s);let o=(n=s.message)!==null&&n!==void 0?n:String(s);i._ref=Object.assign(Object.assign({},e),{message:`An error occurred while resolving reference to '${i.$refText}': ${o}`})}t.references.push(i)}}unlink(e){for(let t of e.references)delete t._ref,delete t._nodeDescription;e.references=[]}getCandidate(e){let n=this.scopeProvider.getScope(e).getElement(e.reference.$refText);return n??this.createLinkingError(e)}buildReference(e,t,n,i){let s=this,o={$refNode:n,$refText:i,get ref(){var l;if(le(this._ref))return this._ref;if(po(this._nodeDescription)){let u=s.loadAstNode(this._nodeDescription);this._ref=u??s.createLinkingError({reference:o,container:e,property:t},this._nodeDescription)}else if(this._ref===void 0){this._ref=hu;let u=ci(e).$document,c=s.getLinkedNode({reference:o,container:e,property:t});if(c.error&&u&&u.state=e.end)return s.ref}}if(n){let i=this.nameProvider.getNameNode(n);if(i&&(i===e||go(e,i)))return n}}}findDeclarationNode(e){let t=this.findDeclaration(e);if(t?.$cstNode){let n=this.nameProvider.getNameNode(t);return n??t.$cstNode}}findReferences(e,t){let n=[];if(t.includeDeclaration){let s=this.getReferenceToSelf(e);s&&n.push(s)}let i=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return t.documentUri&&(i=i.filter(s=>Be.equals(s.sourceUri,t.documentUri))),n.push(...i),j(n)}getReferenceToSelf(e){let t=this.nameProvider.getNameNode(e);if(t){let n=we(e),i=this.nodeLocator.getAstNodePath(e);return{sourceUri:n.uri,sourcePath:i,targetUri:n.uri,targetPath:i,segment:er(t),local:!0}}}};var st=class{static{a(this,"MultiMap")}constructor(e){if(this.map=new Map,e)for(let[t,n]of e)this.add(t,n)}get size(){return Ir.sum(j(this.map.values()).map(e=>e.length))}clear(){this.map.clear()}delete(e,t){if(t===void 0)return this.map.delete(e);{let n=this.map.get(e);if(n){let i=n.indexOf(t);if(i>=0)return n.length===1?this.map.delete(e):n.splice(i,1),!0}return!1}}get(e){var t;return(t=this.map.get(e))!==null&&t!==void 0?t:[]}has(e,t){if(t===void 0)return this.map.has(e);{let n=this.map.get(e);return n?n.indexOf(t)>=0:!1}}add(e,t){return this.map.has(e)?this.map.get(e).push(t):this.map.set(e,[t]),this}addAll(e,t){return this.map.has(e)?this.map.get(e).push(...t):this.map.set(e,Array.from(t)),this}forEach(e){this.map.forEach((t,n)=>t.forEach(i=>e(i,n,this)))}[Symbol.iterator](){return this.entries().iterator()}entries(){return j(this.map.entries()).flatMap(([e,t])=>t.map(n=>[e,n]))}keys(){return j(this.map.keys())}values(){return j(this.map.values()).flat()}entriesGroupedByKey(){return j(this.map.entries())}},Rr=class{static{a(this,"BiMap")}get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(let[t,n]of e)this.set(t,n)}clear(){this.map.clear(),this.inverse.clear()}set(e,t){return this.map.set(e,t),this.inverse.set(t,e),this}get(e){return this.map.get(e)}getKey(e){return this.inverse.get(e)}delete(e){let t=this.map.get(e);return t!==void 0?(this.map.delete(e),this.inverse.delete(t),!0):!1}};var Qi=class{static{a(this,"DefaultScopeComputation")}constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}async computeExports(e,t=S.CancellationToken.None){return this.computeExportsForNode(e.parseResult.value,e,void 0,t)}async computeExportsForNode(e,t,n=fi,i=S.CancellationToken.None){let s=[];this.exportNode(e,s,t);for(let o of n(e))await ce(i),this.exportNode(o,s,t);return s}exportNode(e,t,n){let i=this.nameProvider.getName(e);i&&t.push(this.descriptions.createDescription(e,i,n))}async computeLocalScopes(e,t=S.CancellationToken.None){let n=e.parseResult.value,i=new st;for(let s of ft(n))await ce(t),this.processNode(s,e,i);return i}processNode(e,t,n){let i=e.$container;if(i){let s=this.nameProvider.getName(e);s&&n.add(i,this.descriptions.createDescription(e,s,t))}}};var zn=class{static{a(this,"StreamScope")}constructor(e,t,n){var i;this.elements=e,this.outerScope=t,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){let t=this.caseInsensitive?this.elements.find(n=>n.name.toLowerCase()===e.toLowerCase()):this.elements.find(n=>n.name===e);if(t)return t;if(this.outerScope)return this.outerScope.getElement(e)}},Zi=class{static{a(this,"MapScope")}constructor(e,t,n){var i;this.elements=new Map,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1;for(let s of e){let o=this.caseInsensitive?s.name.toLowerCase():s.name;this.elements.set(o,s)}this.outerScope=t}getElement(e){let t=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(t);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getAllElements(){let e=j(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},fg={getElement(){},getAllElements(){return ei}};var qn=class{static{a(this,"DisposableCache")}constructor(){this.toDispose=[],this.isDisposed=!1}onDispose(e){this.toDispose.push(e)}dispose(){this.throwIfDisposed(),this.clear(),this.isDisposed=!0,this.toDispose.forEach(e=>e.dispose())}throwIfDisposed(){if(this.isDisposed)throw new Error("This cache has already been disposed")}},es=class extends qn{static{a(this,"SimpleCache")}constructor(){super(...arguments),this.cache=new Map}has(e){return this.throwIfDisposed(),this.cache.has(e)}set(e,t){this.throwIfDisposed(),this.cache.set(e,t)}get(e,t){if(this.throwIfDisposed(),this.cache.has(e))return this.cache.get(e);if(t){let n=t();return this.cache.set(e,n),n}else return}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}},xr=class extends qn{static{a(this,"ContextCache")}constructor(e){super(),this.cache=new Map,this.converter=e??(t=>t)}has(e,t){return this.throwIfDisposed(),this.cacheForContext(e).has(t)}set(e,t,n){this.throwIfDisposed(),this.cacheForContext(e).set(t,n)}get(e,t,n){this.throwIfDisposed();let i=this.cacheForContext(e);if(i.has(t))return i.get(t);if(n){let s=n();return i.set(t,s),s}else return}delete(e,t){return this.throwIfDisposed(),this.cacheForContext(e).delete(t)}clear(e){if(this.throwIfDisposed(),e){let t=this.converter(e);this.cache.delete(t)}else this.cache.clear()}cacheForContext(e){let t=this.converter(e),n=this.cache.get(t);return n||(n=new Map,this.cache.set(t,n)),n}},Ua=class extends xr{static{a(this,"DocumentCache")}constructor(e,t){super(n=>n.toString()),t?(this.toDispose.push(e.workspace.DocumentBuilder.onDocumentPhase(t,n=>{this.clear(n.uri.toString())})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{for(let s of i)this.clear(s)}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{let s=n.concat(i);for(let o of s)this.clear(o)}))}},Xn=class extends es{static{a(this,"WorkspaceCache")}constructor(e,t){super(),t?(this.toDispose.push(e.workspace.DocumentBuilder.onBuildPhase(t,()=>{this.clear()})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{i.length>0&&this.clear()}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate(()=>{this.clear()}))}};var ts=class{static{a(this,"DefaultScopeProvider")}constructor(e){this.reflection=e.shared.AstReflection,this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider,this.indexManager=e.shared.workspace.IndexManager,this.globalScopeCache=new Xn(e.shared)}getScope(e){let t=[],n=this.reflection.getReferenceType(e),i=we(e.container).precomputedScopes;if(i){let o=e.container;do{let l=i.get(o);l.length>0&&t.push(j(l).filter(u=>this.reflection.isSubtype(u.type,n))),o=o.$container}while(o)}let s=this.getGlobalScope(n,e);for(let o=t.length-1;o>=0;o--)s=this.createScope(t[o],s);return s}createScope(e,t,n){return new zn(j(e),t,n)}createScopeForNodes(e,t,n){let i=j(e).map(s=>{let o=this.nameProvider.getName(s);if(o)return this.descriptions.createDescription(s,o)}).nonNullable();return new zn(i,t,n)}getGlobalScope(e,t){return this.globalScopeCache.get(e,()=>new Zi(this.indexManager.allElements(e)))}};function pu(r){return typeof r.$comment=="string"}a(pu,"isAstNodeWithComment");function eh(r){return typeof r=="object"&&!!r&&("$ref"in r||"$error"in r)}a(eh,"isIntermediateReference");var rs=class{static{a(this,"DefaultJsonSerializer")}constructor(e){this.ignoreProperties=new Set(["$container","$containerProperty","$containerIndex","$document","$cstNode"]),this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider,this.commentProvider=e.documentation.CommentProvider}serialize(e,t){let n=t??{},i=t?.replacer,s=a((l,u)=>this.replacer(l,u,n),"defaultReplacer"),o=i?(l,u)=>i(l,u,s):s;try{return this.currentDocument=we(e),JSON.stringify(e,o,t?.space)}finally{this.currentDocument=void 0}}deserialize(e,t){let n=t??{},i=JSON.parse(e);return this.linkNode(i,i,n),i}replacer(e,t,{refText:n,sourceText:i,textRegions:s,comments:o,uriConverter:l}){var u,c,f,d;if(!this.ignoreProperties.has(e))if(Ee(t)){let h=t.ref,p=n?t.$refText:void 0;if(h){let g=we(h),y="";this.currentDocument&&this.currentDocument!==g&&(l?y=l(g.uri,t):y=g.uri.toString());let v=this.astNodeLocator.getAstNodePath(h);return{$ref:`${y}#${v}`,$refText:p}}else return{$error:(c=(u=t.error)===null||u===void 0?void 0:u.message)!==null&&c!==void 0?c:"Could not resolve reference",$refText:p}}else if(le(t)){let h;if(s&&(h=this.addAstNodeRegionWithAssignmentsTo(Object.assign({},t)),(!e||t.$document)&&h?.$textRegion&&(h.$textRegion.documentURI=(f=this.currentDocument)===null||f===void 0?void 0:f.uri.toString())),i&&!e&&(h??(h=Object.assign({},t)),h.$sourceText=(d=t.$cstNode)===null||d===void 0?void 0:d.text),o){h??(h=Object.assign({},t));let p=this.commentProvider.getComment(t);p&&(h.$comment=p.replace(/\r/g,""))}return h??t}else return t}addAstNodeRegionWithAssignmentsTo(e){let t=a(n=>({offset:n.offset,end:n.end,length:n.length,range:n.range}),"createDocumentSegment");if(e.$cstNode){let n=e.$textRegion=t(e.$cstNode),i=n.assignments={};return Object.keys(e).filter(s=>!s.startsWith("$")).forEach(s=>{let o=Jo(e.$cstNode,s).map(t);o.length!==0&&(i[s]=o)}),e}}linkNode(e,t,n,i,s,o){for(let[u,c]of Object.entries(e))if(Array.isArray(c))for(let f=0;f{await this.handleException(()=>e.call(t,n,i,s),"An error occurred during validation",i,n)}}async handleException(e,t,n,i){try{await e()}catch(s){if(gt(s))throw s;console.error(`${t}:`,s),s instanceof Error&&s.stack&&console.error(s.stack);let o=s instanceof Error?s.message:String(s);n("error",`${t}: ${o}`,{node:i})}}addEntry(e,t){if(e==="AstNode"){this.entries.add("AstNode",t);return}for(let n of this.reflection.getAllSubTypes(e))this.entries.add(n,t)}getChecks(e,t){let n=j(this.entries.get(e)).concat(this.entries.get("AstNode"));return t&&(n=n.filter(i=>t.includes(i.category))),n.map(i=>i.check)}registerBeforeDocument(e,t=this){this.entriesBefore.push(this.wrapPreparationException(e,"An error occurred during set-up of the validation",t))}registerAfterDocument(e,t=this){this.entriesAfter.push(this.wrapPreparationException(e,"An error occurred during tear-down of the validation",t))}wrapPreparationException(e,t,n){return async(i,s,o,l)=>{await this.handleException(()=>e.call(n,i,s,o,l),t,s,i)}}get checksBefore(){return this.entriesBefore}get checksAfter(){return this.entriesAfter}};var ss=class{static{a(this,"DefaultDocumentValidator")}constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData}async validateDocument(e,t={},n=S.CancellationToken.None){let i=e.parseResult,s=[];if(await ce(n),(!t.categories||t.categories.includes("built-in"))&&(this.processLexingErrors(i,s,t),t.stopAfterLexingErrors&&s.some(o=>{var l;return((l=o.data)===null||l===void 0?void 0:l.code)===Qe.LexingError})||(this.processParsingErrors(i,s,t),t.stopAfterParsingErrors&&s.some(o=>{var l;return((l=o.data)===null||l===void 0?void 0:l.code)===Qe.ParsingError}))||(this.processLinkingErrors(e,s,t),t.stopAfterLinkingErrors&&s.some(o=>{var l;return((l=o.data)===null||l===void 0?void 0:l.code)===Qe.LinkingError}))))return s;try{s.push(...await this.validateAst(i.value,t,n))}catch(o){if(gt(o))throw o;console.error("An error occurred during validation:",o)}return await ce(n),s}processLexingErrors(e,t,n){var i,s,o;let l=[...e.lexerErrors,...(s=(i=e.lexerReport)===null||i===void 0?void 0:i.diagnostics)!==null&&s!==void 0?s:[]];for(let u of l){let c=(o=u.severity)!==null&&o!==void 0?o:"error",f={severity:Ba(c),range:{start:{line:u.line-1,character:u.column-1},end:{line:u.line-1,character:u.column+u.length-1}},message:u.message,data:rh(c),source:this.getSource()};t.push(f)}}processParsingErrors(e,t,n){for(let i of e.parserErrors){let s;if(isNaN(i.token.startOffset)){if("previousToken"in i){let o=i.previousToken;if(isNaN(o.startOffset)){let l={line:0,character:0};s={start:l,end:l}}else{let l={line:o.endLine-1,character:o.endColumn};s={start:l,end:l}}}}else s=Nr(i.token);if(s){let o={severity:Ba("error"),range:s,message:i.message,data:Er(Qe.ParsingError),source:this.getSource()};t.push(o)}}}processLinkingErrors(e,t,n){for(let i of e.references){let s=i.error;if(s){let o={node:s.container,property:s.property,index:s.index,data:{code:Qe.LinkingError,containerType:s.container.$type,property:s.property,refText:s.reference.$refText}};t.push(this.toDiagnostic("error",s.message,o))}}}async validateAst(e,t,n=S.CancellationToken.None){let i=[],s=a((o,l,u)=>{i.push(this.toDiagnostic(o,l,u))},"acceptor");return await this.validateAstBefore(e,t,s,n),await this.validateAstNodes(e,t,s,n),await this.validateAstAfter(e,t,s,n),i}async validateAstBefore(e,t,n,i=S.CancellationToken.None){var s;let o=this.validationRegistry.checksBefore;for(let l of o)await ce(i),await l(e,n,(s=t.categories)!==null&&s!==void 0?s:[],i)}async validateAstNodes(e,t,n,i=S.CancellationToken.None){await Promise.all(Je(e).map(async s=>{await ce(i);let o=this.validationRegistry.getChecks(s.$type,t.categories);for(let l of o)await l(s,n,i)}))}async validateAstAfter(e,t,n,i=S.CancellationToken.None){var s;let o=this.validationRegistry.checksAfter;for(let l of o)await ce(i),await l(e,n,(s=t.categories)!==null&&s!==void 0?s:[],i)}toDiagnostic(e,t,n){return{message:t,range:th(n),severity:Ba(e),code:n.code,codeDescription:n.codeDescription,tags:n.tags,relatedInformation:n.relatedInformation,data:n.data,source:this.getSource()}}getSource(){return this.metadata.languageId}};function th(r){if(r.range)return r.range;let e;return typeof r.property=="string"?e=gi(r.node.$cstNode,r.property,r.index):typeof r.keyword=="string"&&(e=Zo(r.node.$cstNode,r.keyword,r.index)),e??(e=r.node.$cstNode),e?e.range:{start:{line:0,character:0},end:{line:0,character:0}}}a(th,"getDiagnosticRange");function Ba(r){switch(r){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+r)}}a(Ba,"toDiagnosticSeverity");function rh(r){switch(r){case"error":return Er(Qe.LexingError);case"warning":return Er(Qe.LexingWarning);case"info":return Er(Qe.LexingInfo);case"hint":return Er(Qe.LexingHint);default:throw new Error("Invalid diagnostic severity: "+r)}}a(rh,"toDiagnosticData");var Qe;(function(r){r.LexingError="lexing-error",r.LexingWarning="lexing-warning",r.LexingInfo="lexing-info",r.LexingHint="lexing-hint",r.ParsingError="parsing-error",r.LinkingError="linking-error"})(Qe||(Qe={}));var as=class{static{a(this,"DefaultAstNodeDescriptionProvider")}constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,t,n){let i=n??we(e);t??(t=this.nameProvider.getName(e));let s=this.astNodeLocator.getAstNodePath(e);if(!t)throw new Error(`Node at path ${s} has no name.`);let o,l=a(()=>{var u;return o??(o=er((u=this.nameProvider.getNameNode(e))!==null&&u!==void 0?u:e.$cstNode))},"nameSegmentGetter");return{node:e,name:t,get nameSegment(){return l()},selectionSegment:er(e.$cstNode),type:e.$type,documentUri:i.uri,path:s}}},os=class{static{a(this,"DefaultReferenceDescriptionProvider")}constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}async createDescriptions(e,t=S.CancellationToken.None){let n=[],i=e.parseResult.value;for(let s of Je(i))await ce(t),pn(s).filter(o=>!Qt(o)).forEach(o=>{let l=this.createDescription(o);l&&n.push(l)});return n}createDescription(e){let t=e.reference.$nodeDescription,n=e.reference.$refNode;if(!t||!n)return;let i=we(e.container).uri;return{sourceUri:i,sourcePath:this.nodeLocator.getAstNodePath(e.container),targetUri:t.documentUri,targetPath:t.path,segment:er(n),local:Be.equals(t.documentUri,i)}}};var ls=class{static{a(this,"DefaultAstNodeLocator")}constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){let t=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return t+this.segmentSeparator+n}return""}getPathSegment({$containerProperty:e,$containerIndex:t}){if(!e)throw new Error("Missing '$containerProperty' in AST node.");return t!==void 0?e+this.indexSeparator+t:e}getAstNode(e,t){return t.split(this.segmentSeparator).reduce((i,s)=>{if(!i||s.length===0)return i;let o=s.indexOf(this.indexSeparator);if(o>0){let l=s.substring(0,o),u=parseInt(s.substring(o+1)),c=i[l];return c?.[u]}return i[s]},e)}};var ne={};B(ne,Vu(lu(),1));var us=class{static{a(this,"DefaultConfigurationProvider")}constructor(e){this._ready=new Ge,this.settings={},this.workspaceConfig=!1,this.onConfigurationSectionUpdateEmitter=new ne.Emitter,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){var t,n;this.workspaceConfig=(n=(t=e.capabilities.workspace)===null||t===void 0?void 0:t.configuration)!==null&&n!==void 0?n:!1}async initialized(e){if(this.workspaceConfig){if(e.register){let t=this.serviceRegistry.all;e.register({section:t.map(n=>this.toSectionName(n.LanguageMetaData.languageId))})}if(e.fetchConfiguration){let t=this.serviceRegistry.all.map(i=>({section:this.toSectionName(i.LanguageMetaData.languageId)})),n=await e.fetchConfiguration(t);t.forEach((i,s)=>{this.updateSectionConfiguration(i.section,n[s])})}}this._ready.resolve()}updateConfiguration(e){e.settings&&Object.keys(e.settings).forEach(t=>{let n=e.settings[t];this.updateSectionConfiguration(t,n),this.onConfigurationSectionUpdateEmitter.fire({section:t,configuration:n})})}updateSectionConfiguration(e,t){this.settings[e]=t}async getConfiguration(e,t){await this.ready;let n=this.toSectionName(e);if(this.settings[n])return this.settings[n][t]}toSectionName(e){return`${e}`}get onConfigurationSectionUpdate(){return this.onConfigurationSectionUpdateEmitter.event}};var jt;(function(r){function e(t){return{dispose:a(async()=>await t(),"dispose")}}a(e,"create"),r.create=e})(jt||(jt={}));var cs=class{static{a(this,"DefaultDocumentBuilder")}constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new st,this.documentPhaseListeners=new st,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=Y.Changed,this.langiumDocuments=e.workspace.LangiumDocuments,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.textDocuments=e.workspace.TextDocuments,this.indexManager=e.workspace.IndexManager,this.serviceRegistry=e.ServiceRegistry}async build(e,t={},n=S.CancellationToken.None){var i,s;for(let o of e){let l=o.uri.toString();if(o.state===Y.Validated){if(typeof t.validation=="boolean"&&t.validation)o.state=Y.IndexedReferences,o.diagnostics=void 0,this.buildState.delete(l);else if(typeof t.validation=="object"){let u=this.buildState.get(l),c=(i=u?.result)===null||i===void 0?void 0:i.validationChecks;if(c){let d=((s=t.validation.categories)!==null&&s!==void 0?s:Yn.all).filter(h=>!c.includes(h));d.length>0&&(this.buildState.set(l,{completed:!1,options:{validation:Object.assign(Object.assign({},t.validation),{categories:d})},result:u.result}),o.state=Y.IndexedReferences)}}}else this.buildState.delete(l)}this.currentState=Y.Changed,await this.emitUpdate(e.map(o=>o.uri),[]),await this.buildDocuments(e,t,n)}async update(e,t,n=S.CancellationToken.None){this.currentState=Y.Changed;for(let o of t)this.langiumDocuments.deleteDocument(o),this.buildState.delete(o.toString()),this.indexManager.remove(o);for(let o of e){if(!this.langiumDocuments.invalidateDocument(o)){let u=this.langiumDocumentFactory.fromModel({$type:"INVALID"},o);u.state=Y.Changed,this.langiumDocuments.addDocument(u)}this.buildState.delete(o.toString())}let i=j(e).concat(t).map(o=>o.toString()).toSet();this.langiumDocuments.all.filter(o=>!i.has(o.uri.toString())&&this.shouldRelink(o,i)).forEach(o=>{this.serviceRegistry.getServices(o.uri).references.Linker.unlink(o),o.state=Math.min(o.state,Y.ComputedScopes),o.diagnostics=void 0}),await this.emitUpdate(e,t),await ce(n);let s=this.sortDocuments(this.langiumDocuments.all.filter(o=>{var l;return o.staten(e,t)))}sortDocuments(e){let t=0,n=e.length-1;for(;t=0&&!this.hasTextDocument(e[n]);)n--;tn.error!==void 0)?!0:this.indexManager.isAffected(e,t)}onUpdate(e){return this.updateListeners.push(e),jt.create(()=>{let t=this.updateListeners.indexOf(e);t>=0&&this.updateListeners.splice(t,1)})}async buildDocuments(e,t,n){this.prepareBuild(e,t),await this.runCancelable(e,Y.Parsed,n,s=>this.langiumDocumentFactory.update(s,n)),await this.runCancelable(e,Y.IndexedContent,n,s=>this.indexManager.updateContent(s,n)),await this.runCancelable(e,Y.ComputedScopes,n,async s=>{let o=this.serviceRegistry.getServices(s.uri).references.ScopeComputation;s.precomputedScopes=await o.computeLocalScopes(s,n)}),await this.runCancelable(e,Y.Linked,n,s=>this.serviceRegistry.getServices(s.uri).references.Linker.link(s,n)),await this.runCancelable(e,Y.IndexedReferences,n,s=>this.indexManager.updateReferences(s,n));let i=e.filter(s=>this.shouldValidate(s));await this.runCancelable(i,Y.Validated,n,s=>this.validate(s,n));for(let s of e){let o=this.buildState.get(s.uri.toString());o&&(o.completed=!0)}}prepareBuild(e,t){for(let n of e){let i=n.uri.toString(),s=this.buildState.get(i);(!s||s.completed)&&this.buildState.set(i,{completed:!1,options:t,result:s?.result})}}async runCancelable(e,t,n,i){let s=e.filter(l=>l.statel.state===t);await this.notifyBuildPhase(o,t,n),this.currentState=t}onBuildPhase(e,t){return this.buildPhaseListeners.add(e,t),jt.create(()=>{this.buildPhaseListeners.delete(e,t)})}onDocumentPhase(e,t){return this.documentPhaseListeners.add(e,t),jt.create(()=>{this.documentPhaseListeners.delete(e,t)})}waitUntil(e,t,n){let i;if(t&&"path"in t?i=t:n=t,n??(n=S.CancellationToken.None),i){let s=this.langiumDocuments.getDocument(i);if(s&&s.state>e)return Promise.resolve(i)}return this.currentState>=e?Promise.resolve(void 0):n.isCancellationRequested?Promise.reject(mt):new Promise((s,o)=>{let l=this.onBuildPhase(e,()=>{if(l.dispose(),u.dispose(),i){let c=this.langiumDocuments.getDocument(i);s(c?.uri)}else s(void 0)}),u=n.onCancellationRequested(()=>{l.dispose(),u.dispose(),o(mt)})})}async notifyDocumentPhase(e,t,n){let s=this.documentPhaseListeners.get(t).slice();for(let o of s)try{await o(e,n)}catch(l){if(!gt(l))throw l}}async notifyBuildPhase(e,t,n){if(e.length===0)return;let s=this.buildPhaseListeners.get(t).slice();for(let o of s)await ce(n),await o(e,n)}shouldValidate(e){return!!this.getBuildOptions(e).validation}async validate(e,t){var n,i;let s=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,o=this.getBuildOptions(e).validation,l=typeof o=="object"?o:void 0,u=await s.validateDocument(e,l,t);e.diagnostics?e.diagnostics.push(...u):e.diagnostics=u;let c=this.buildState.get(e.uri.toString());if(c){(n=c.result)!==null&&n!==void 0||(c.result={});let f=(i=l?.categories)!==null&&i!==void 0?i:Yn.all;c.result.validationChecks?c.result.validationChecks.push(...f):c.result.validationChecks=[...f]}}getBuildOptions(e){var t,n;return(n=(t=this.buildState.get(e.uri.toString()))===null||t===void 0?void 0:t.options)!==null&&n!==void 0?n:{}}};var fs=class{static{a(this,"DefaultIndexManager")}constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new xr,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,t){let n=we(e).uri,i=[];return this.referenceIndex.forEach(s=>{s.forEach(o=>{Be.equals(o.targetUri,n)&&o.targetPath===t&&i.push(o)})}),j(i)}allElements(e,t){let n=j(this.symbolIndex.keys());return t&&(n=n.filter(i=>!t||t.has(i))),n.map(i=>this.getFileDescriptions(i,e)).flat()}getFileDescriptions(e,t){var n;return t?this.symbolByTypeIndex.get(e,t,()=>{var s;return((s=this.symbolIndex.get(e))!==null&&s!==void 0?s:[]).filter(l=>this.astReflection.isSubtype(l.type,t))}):(n=this.symbolIndex.get(e))!==null&&n!==void 0?n:[]}remove(e){let t=e.toString();this.symbolIndex.delete(t),this.symbolByTypeIndex.clear(t),this.referenceIndex.delete(t)}async updateContent(e,t=S.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).references.ScopeComputation.computeExports(e,t),s=e.uri.toString();this.symbolIndex.set(s,i),this.symbolByTypeIndex.clear(s)}async updateReferences(e,t=S.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).workspace.ReferenceDescriptionProvider.createDescriptions(e,t);this.referenceIndex.set(e.uri.toString(),i)}isAffected(e,t){let n=this.referenceIndex.get(e.uri.toString());return n?n.some(i=>!i.local&&t.has(i.targetUri.toString())):!1}};var ds=class{static{a(this,"DefaultWorkspaceManager")}constructor(e){this.initialBuildOptions={},this._ready=new Ge,this.serviceRegistry=e.ServiceRegistry,this.langiumDocuments=e.workspace.LangiumDocuments,this.documentBuilder=e.workspace.DocumentBuilder,this.fileSystemProvider=e.workspace.FileSystemProvider,this.mutex=e.workspace.WorkspaceLock}get ready(){return this._ready.promise}get workspaceFolders(){return this.folders}initialize(e){var t;this.folders=(t=e.workspaceFolders)!==null&&t!==void 0?t:void 0}initialized(e){return this.mutex.write(t=>{var n;return this.initializeWorkspace((n=this.folders)!==null&&n!==void 0?n:[],t)})}async initializeWorkspace(e,t=S.CancellationToken.None){let n=await this.performStartup(e);await ce(t),await this.documentBuilder.build(n,this.initialBuildOptions,t)}async performStartup(e){let t=this.serviceRegistry.all.flatMap(s=>s.LanguageMetaData.fileExtensions),n=[],i=a(s=>{n.push(s),this.langiumDocuments.hasDocument(s.uri)||this.langiumDocuments.addDocument(s)},"collector");return await this.loadAdditionalDocuments(e,i),await Promise.all(e.map(s=>[s,this.getRootFolder(s)]).map(async s=>this.traverseFolder(...s,t,i))),this._ready.resolve(),n}loadAdditionalDocuments(e,t){return Promise.resolve()}getRootFolder(e){return Ue.parse(e.uri)}async traverseFolder(e,t,n,i){let s=await this.fileSystemProvider.readDirectory(t);await Promise.all(s.map(async o=>{if(this.includeEntry(e,o,n)){if(o.isDirectory)await this.traverseFolder(e,o.uri,n,i);else if(o.isFile){let l=await this.langiumDocuments.getOrCreateDocument(o.uri);i(l)}}}))}includeEntry(e,t,n){let i=Be.basename(t.uri);if(i.startsWith("."))return!1;if(t.isDirectory)return i!=="node_modules"&&i!=="out";if(t.isFile){let s=Be.extname(t.uri);return n.includes(s)}return!1}};var hs=class{static{a(this,"DefaultLexerErrorMessageProvider")}buildUnexpectedCharactersMessage(e,t,n,i,s){return In.buildUnexpectedCharactersMessage(e,t,n,i,s)}buildUnableToPopLexerModeMessage(e){return In.buildUnableToPopLexerModeMessage(e)}},Wa={mode:"full"},Ar=class{static{a(this,"DefaultLexer")}constructor(e){this.errorMessageProvider=e.parser.LexerErrorMessageProvider,this.tokenBuilder=e.parser.TokenBuilder;let t=this.tokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(t);let n=mu(t)?Object.values(t):t,i=e.LanguageMetaData.mode==="production";this.chevrotainLexer=new se(n,{positionTracking:"full",skipValidations:i,errorMessageProvider:this.errorMessageProvider})}get definition(){return this.tokenTypes}tokenize(e,t=Wa){var n,i,s;let o=this.chevrotainLexer.tokenize(e);return{tokens:o.tokens,errors:o.errors,hidden:(n=o.groups.hidden)!==null&&n!==void 0?n:[],report:(s=(i=this.tokenBuilder).flushLexingReport)===null||s===void 0?void 0:s.call(i,e)}}toTokenTypeDictionary(e){if(mu(e))return e;let t=gu(e)?Object.values(e.modes).flat():e,n={};return t.forEach(i=>n[i.name]=i),n}};function Ka(r){return Array.isArray(r)&&(r.length===0||"name"in r[0])}a(Ka,"isTokenTypeArray");function gu(r){return r&&"modes"in r&&"defaultMode"in r}a(gu,"isIMultiModeLexerDefinition");function mu(r){return!Ka(r)&&!gu(r)}a(mu,"isTokenTypeDictionary");function Ru(r,e,t){let n,i;typeof r=="string"?(i=e,n=t):(i=r.range.start,n=e),i||(i=W.create(0,0));let s=sh(r),o=Eu(n),l=hg({lines:s,position:i,options:o});return Tg({index:0,tokens:l,position:i})}a(Ru,"parseJSDoc");function xu(r,e){let t=Eu(e),n=sh(r);if(n.length===0)return!1;let i=n[0],s=n[n.length-1],o=t.start,l=t.end;return!!o?.exec(i)&&!!l?.exec(s)}a(xu,"isJSDoc");function sh(r){let e="";return typeof r=="string"?e=r:e=r.text,e.split(Ko)}a(sh,"getLines");var nh=/\s*(@([\p{L}][\p{L}\p{N}]*)?)/uy,dg=/\{(@[\p{L}][\p{L}\p{N}]*)(\s*)([^\r\n}]+)?\}/gu;function hg(r){var e,t,n;let i=[],s=r.position.line,o=r.position.character;for(let l=0;l=f.length){if(i.length>0){let p=W.create(s,o);i.push({type:"break",content:"",range:U.create(p,p)})}}else{nh.lastIndex=d;let p=nh.exec(f);if(p){let g=p[0],y=p[1],v=W.create(s,o+d),x=W.create(s,o+d+g.length);i.push({type:"tag",content:y,range:U.create(v,x)}),d+=g.length,d=Tu(f,d)}if(d0&&i[i.length-1].type==="break"?i.slice(0,-1):i}a(hg,"tokenize");function pg(r,e,t,n){let i=[];if(r.length===0){let s=W.create(t,n),o=W.create(t,n+e.length);i.push({type:"text",content:e,range:U.create(s,o)})}else{let s=0;for(let l of r){let u=l.index,c=e.substring(s,u);c.length>0&&i.push({type:"text",content:e.substring(s,u),range:U.create(W.create(t,s+n),W.create(t,u+n))});let f=c.length+1,d=l[1];if(i.push({type:"inline-tag",content:d,range:U.create(W.create(t,s+f+n),W.create(t,s+f+d.length+n))}),f+=d.length,l.length===4){f+=l[2].length;let h=l[3];i.push({type:"text",content:h,range:U.create(W.create(t,s+f+n),W.create(t,s+f+h.length+n))})}else i.push({type:"text",content:"",range:U.create(W.create(t,s+f+n),W.create(t,s+f+n))});s=u+l[0].length}let o=e.substring(s);o.length>0&&i.push({type:"text",content:o,range:U.create(W.create(t,s+n),W.create(t,s+n+o.length))})}return i}a(pg,"buildInlineTokens");var mg=/\S/,gg=/\s*$/;function Tu(r,e){let t=r.substring(e).match(mg);return t?e+t.index:r.length}a(Tu,"skipWhitespace");function yg(r){let e=r.match(gg);if(e&&typeof e.index=="number")return e.index}a(yg,"lastCharacter");function Tg(r){var e,t,n,i;let s=W.create(r.position.line,r.position.character);if(r.tokens.length===0)return new Va([],U.create(s,s));let o=[];for(;r.indext.name===e)}getTags(e){return this.getAllTags().filter(t=>t.name===e)}getAllTags(){return this.elements.filter(e=>"name"in e)}toString(){let e="";for(let t of this.elements)if(e.length===0)e=t.toString();else{let n=t.toString();e+=ih(e)+n}return e.trim()}toMarkdown(e){let t="";for(let n of this.elements)if(t.length===0)t=n.toMarkdown(e);else{let i=n.toMarkdown(e);t+=ih(t)+i}return t.trim()}},ps=class{static{a(this,"JSDocTagImpl")}constructor(e,t,n,i){this.name=e,this.content=t,this.inline=n,this.range=i}toString(){let e=`@${this.name}`,t=this.content.toString();return this.content.inlines.length===1?e=`${e} ${t}`:this.content.inlines.length>1&&(e=`${e} +${t}`),this.inline?`{${e}}`:e}toMarkdown(e){var t,n;return(n=(t=e?.renderTag)===null||t===void 0?void 0:t.call(e,this))!==null&&n!==void 0?n:this.toMarkdownDefault(e)}toMarkdownDefault(e){let t=this.content.toMarkdown(e);if(this.inline){let s=Ag(this.name,t,e??{});if(typeof s=="string")return s}let n="";e?.tag==="italic"||e?.tag===void 0?n="*":e?.tag==="bold"?n="**":e?.tag==="bold-italic"&&(n="***");let i=`${n}@${this.name}${n}`;return this.content.inlines.length===1?i=`${i} \u2014 ${t}`:this.content.inlines.length>1&&(i=`${i} +${t}`),this.inline?`{${i}}`:i}};function Ag(r,e,t){var n,i;if(r==="linkplain"||r==="linkcode"||r==="link"){let s=e.indexOf(" "),o=e;if(s>0){let u=Tu(e,s);o=e.substring(u),e=e.substring(0,s)}return(r==="linkcode"||r==="link"&&t.link==="code")&&(o=`\`${o}\``),(i=(n=t.renderLink)===null||n===void 0?void 0:n.call(t,e,o))!==null&&i!==void 0?i:vg(e,o)}}a(Ag,"renderInlineTag");function vg(r,e){try{return Ue.parse(r,!0),`[${e}](${r})`}catch{return r}}a(vg,"renderLinkDefault");var ms=class{static{a(this,"JSDocTextImpl")}constructor(e,t){this.inlines=e,this.range=t}toString(){let e="";for(let t=0;tn.range.start.line&&(e+=` +`)}return e}toMarkdown(e){let t="";for(let n=0;ni.range.start.line&&(t+=` +`)}return t}},ja=class{static{a(this,"JSDocLineImpl")}constructor(e,t){this.text=e,this.range=t}toString(){return this.text}toMarkdown(){return this.text}};function ih(r){return r.endsWith(` +`)?` +`:` + +`}a(ih,"fillNewlines");var gs=class{static{a(this,"JSDocDocumentationProvider")}constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){let t=this.commentProvider.getComment(e);if(t&&xu(t))return Ru(t).toMarkdown({renderLink:a((i,s)=>this.documentationLinkRenderer(e,i,s),"renderLink"),renderTag:a(i=>this.documentationTagRenderer(e,i),"renderTag")})}documentationLinkRenderer(e,t,n){var i;let s=(i=this.findNameInPrecomputedScopes(e,t))!==null&&i!==void 0?i:this.findNameInGlobalScope(e,t);if(s&&s.nameSegment){let o=s.nameSegment.range.start.line+1,l=s.nameSegment.range.start.character+1,u=s.documentUri.with({fragment:`L${o},${l}`});return`[${n}](${u.toString()})`}else return}documentationTagRenderer(e,t){}findNameInPrecomputedScopes(e,t){let i=we(e).precomputedScopes;if(!i)return;let s=e;do{let l=i.get(s).find(u=>u.name===t);if(l)return l;s=s.$container}while(s)}findNameInGlobalScope(e,t){return this.indexManager.allElements().find(i=>i.name===t)}};var ys=class{static{a(this,"DefaultCommentProvider")}constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){var t;return pu(e)?e.$comment:(t=To(e.$cstNode,this.grammarConfig().multilineCommentRules))===null||t===void 0?void 0:t.text}};var Ts=class{static{a(this,"DefaultAsyncParser")}constructor(e){this.syncParser=e.parser.LangiumParser}parse(e,t){return Promise.resolve(this.syncParser.parse(e))}},Au=class{static{a(this,"AbstractThreadedAsyncParser")}constructor(e){this.threadCount=8,this.terminationDelay=200,this.workerPool=[],this.queue=[],this.hydrator=e.serializer.Hydrator}initializeWorkers(){for(;this.workerPool.length{if(this.queue.length>0){let t=this.queue.shift();t&&(e.lock(),t.resolve(e))}}),this.workerPool.push(e)}}async parse(e,t){let n=await this.acquireParserWorker(t),i=new Ge,s,o=t.onCancellationRequested(()=>{s=setTimeout(()=>{this.terminateWorker(n)},this.terminationDelay)});return n.parse(e).then(l=>{let u=this.hydrator.hydrate(l);i.resolve(u)}).catch(l=>{i.reject(l)}).finally(()=>{o.dispose(),clearTimeout(s)}),i.promise}terminateWorker(e){e.terminate();let t=this.workerPool.indexOf(e);t>=0&&this.workerPool.splice(t,1)}async acquireParserWorker(e){this.initializeWorkers();for(let n of this.workerPool)if(n.ready)return n.lock(),n;let t=new Ge;return e.onCancellationRequested(()=>{let n=this.queue.indexOf(t);n>=0&&this.queue.splice(n,1),t.reject(mt)}),this.queue.push(t),t.promise}},vu=class{static{a(this,"ParserWorker")}get ready(){return this._ready}get onReady(){return this.onReadyEmitter.event}constructor(e,t,n,i){this.onReadyEmitter=new ne.Emitter,this.deferred=new Ge,this._ready=!0,this._parsing=!1,this.sendMessage=e,this._terminate=i,t(s=>{let o=s;this.deferred.resolve(o),this.unlock()}),n(s=>{this.deferred.reject(s),this.unlock()})}terminate(){this.deferred.reject(mt),this._terminate()}lock(){this._ready=!1}unlock(){this._parsing=!1,this._ready=!0,this.onReadyEmitter.fire()}parse(e){if(this._parsing)throw new Error("Parser worker is busy");return this._parsing=!0,this.deferred=new Ge,this.sendMessage(e),this.deferred.promise}};var Rs=class{static{a(this,"DefaultWorkspaceLock")}constructor(){this.previousTokenSource=new S.CancellationTokenSource,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();let t=Fa();return this.previousTokenSource=t,this.enqueue(this.writeQueue,e,t.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,t,n=S.CancellationToken.None){let i=new Ge,s={action:t,deferred:i,cancellationToken:n};return e.push(s),this.performNextOperation(),i.promise}async performNextOperation(){if(!this.done)return;let e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else if(this.readQueue.length>0)e.push(...this.readQueue.splice(0,this.readQueue.length));else return;this.done=!1,await Promise.all(e.map(async({action:t,deferred:n,cancellationToken:i})=>{try{let s=await Promise.resolve().then(()=>t(i));n.resolve(s)}catch(s){gt(s)?n.resolve(void 0):n.reject(s)}})),this.done=!0,this.performNextOperation()}cancelWrite(){this.previousTokenSource.cancel()}};var xs=class{static{a(this,"DefaultHydrator")}constructor(e){this.grammarElementIdMap=new Rr,this.tokenTypeIdMap=new Rr,this.grammar=e.Grammar,this.lexer=e.parser.Lexer,this.linker=e.references.Linker}dehydrate(e){return{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport?this.dehydrateLexerReport(e.lexerReport):void 0,parserErrors:e.parserErrors.map(t=>Object.assign(Object.assign({},t),{message:t.message})),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}dehydrateLexerReport(e){return e}createDehyrationContext(e){let t=new Map,n=new Map;for(let i of Je(e))t.set(i,{});if(e.$cstNode)for(let i of Zt(e.$cstNode))n.set(i,{});return{astNodes:t,cstNodes:n}}dehydrateAstNode(e,t){let n=t.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode!==void 0&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,t));for(let[i,s]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(s)){let o=[];n[i]=o;for(let l of s)le(l)?o.push(this.dehydrateAstNode(l,t)):Ee(l)?o.push(this.dehydrateReference(l,t)):o.push(l)}else le(s)?n[i]=this.dehydrateAstNode(s,t):Ee(s)?n[i]=this.dehydrateReference(s,t):s!==void 0&&(n[i]=s);return n}dehydrateReference(e,t){let n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=t.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,t){let n=t.cstNodes.get(e);return Zn(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=t.astNodes.get(e.astNode),tt(e)?n.content=e.content.map(i=>this.dehydrateCstNode(i,t)):Gt(e)&&(n.tokenType=e.tokenType.name,n.offset=e.offset,n.length=e.length,n.startLine=e.range.start.line,n.startColumn=e.range.start.character,n.endLine=e.range.end.line,n.endColumn=e.range.end.character),n}hydrate(e){let t=e.value,n=this.createHydrationContext(t);return"$cstNode"in t&&this.hydrateCstNode(t.$cstNode,n),{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport,parserErrors:e.parserErrors,value:this.hydrateAstNode(t,n)}}createHydrationContext(e){let t=new Map,n=new Map;for(let s of Je(e))t.set(s,{});let i;if(e.$cstNode)for(let s of Zt(e.$cstNode)){let o;"fullText"in s?(o=new Bn(s.fullText),i=o):"content"in s?o=new gr:"tokenType"in s&&(o=this.hydrateCstLeafNode(s)),o&&(n.set(s,o),o.root=i)}return{astNodes:t,cstNodes:n}}hydrateAstNode(e,t){let n=t.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode&&(n.$cstNode=t.cstNodes.get(e.$cstNode));for(let[i,s]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(s)){let o=[];n[i]=o;for(let l of s)le(l)?o.push(this.setParent(this.hydrateAstNode(l,t),n)):Ee(l)?o.push(this.hydrateReference(l,n,i,t)):o.push(l)}else le(s)?n[i]=this.setParent(this.hydrateAstNode(s,t),n):Ee(s)?n[i]=this.hydrateReference(s,n,i,t):s!==void 0&&(n[i]=s);return n}setParent(e,t){return e.$container=t,e}hydrateReference(e,t,n,i){return this.linker.buildReference(t,n,i.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,t,n=0){let i=t.cstNodes.get(e);if(typeof e.grammarSource=="number"&&(i.grammarSource=this.getGrammarElement(e.grammarSource)),i.astNode=t.astNodes.get(e.astNode),tt(i))for(let s of e.content){let o=this.hydrateCstNode(s,t,n++);i.content.push(o)}return i}hydrateCstLeafNode(e){let t=this.getTokenType(e.tokenType),n=e.offset,i=e.length,s=e.startLine,o=e.startColumn,l=e.endLine,u=e.endColumn,c=e.hidden;return new mr(n,i,{start:{line:s,character:o},end:{line:l,character:u}},t,c)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){if(e)return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.getKey(e)}createGrammarElementIdMap(){let e=0;for(let t of Je(this.grammar))oi(t)&&this.grammarElementIdMap.set(t,e++)}};function ku(r){return{documentation:{CommentProvider:a(e=>new ys(e),"CommentProvider"),DocumentationProvider:a(e=>new gs(e),"DocumentationProvider")},parser:{AsyncParser:a(e=>new Ts(e),"AsyncParser"),GrammarConfig:a(e=>il(e),"GrammarConfig"),LangiumParser:a(e=>ru(e),"LangiumParser"),CompletionParser:a(e=>tu(e),"CompletionParser"),ValueConverter:a(()=>new Tr,"ValueConverter"),TokenBuilder:a(()=>new bt,"TokenBuilder"),Lexer:a(e=>new Ar(e),"Lexer"),ParserErrorMessageProvider:a(()=>new Wn,"ParserErrorMessageProvider"),LexerErrorMessageProvider:a(()=>new hs,"LexerErrorMessageProvider")},workspace:{AstNodeLocator:a(()=>new ls,"AstNodeLocator"),AstNodeDescriptionProvider:a(e=>new as(e),"AstNodeDescriptionProvider"),ReferenceDescriptionProvider:a(e=>new os(e),"ReferenceDescriptionProvider")},references:{Linker:a(e=>new Xi(e),"Linker"),NameProvider:a(()=>new Yi,"NameProvider"),ScopeProvider:a(e=>new ts(e),"ScopeProvider"),ScopeComputation:a(e=>new Qi(e),"ScopeComputation"),References:a(e=>new Ji(e),"References")},serializer:{Hydrator:a(e=>new xs(e),"Hydrator"),JsonSerializer:a(e=>new rs(e),"JsonSerializer")},validation:{DocumentValidator:a(e=>new ss(e),"DocumentValidator"),ValidationRegistry:a(e=>new is(e),"ValidationRegistry")},shared:a(()=>r.shared,"shared")}}a(ku,"createDefaultCoreModule");function $u(r){return{ServiceRegistry:a(e=>new ns(e),"ServiceRegistry"),workspace:{LangiumDocuments:a(e=>new qi(e),"LangiumDocuments"),LangiumDocumentFactory:a(e=>new zi(e),"LangiumDocumentFactory"),DocumentBuilder:a(e=>new cs(e),"DocumentBuilder"),IndexManager:a(e=>new fs(e),"IndexManager"),WorkspaceManager:a(e=>new ds(e),"WorkspaceManager"),FileSystemProvider:a(e=>r.fileSystemProvider(e),"FileSystemProvider"),WorkspaceLock:a(()=>new Rs,"WorkspaceLock"),ConfigurationProvider:a(e=>new us(e),"ConfigurationProvider")}}}a($u,"createDefaultSharedCoreModule");var Iu;(function(r){r.merge=(e,t)=>Ha(Ha({},e),t)})(Iu||(Iu={}));function za(r,e,t,n,i,s,o,l,u){let c=[r,e,t,n,i,s,o,l,u].reduce(Ha,{});return hh(c)}a(za,"inject");var fh=Symbol("isProxy");function dh(r){if(r&&r[fh])for(let e of Object.values(r))dh(e);return r}a(dh,"eagerLoad");function hh(r,e){let t=new Proxy({},{deleteProperty:a(()=>!1,"deleteProperty"),set:a(()=>{throw new Error("Cannot set property on injected service container")},"set"),get:a((n,i)=>i===fh?!0:ch(n,i,r,e||t),"get"),getOwnPropertyDescriptor:a((n,i)=>(ch(n,i,r,e||t),Object.getOwnPropertyDescriptor(n,i)),"getOwnPropertyDescriptor"),has:a((n,i)=>i in r,"has"),ownKeys:a(()=>[...Object.getOwnPropertyNames(r)],"ownKeys")});return t}a(hh,"_inject");var uh=Symbol();function ch(r,e,t,n){if(e in r){if(r[e]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable.",{cause:r[e]});if(r[e]===uh)throw new Error('Cycle detected. Please make "'+String(e)+'" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');return r[e]}else if(e in t){let i=t[e];r[e]=uh;try{r[e]=typeof i=="function"?i(n):hh(i,n)}catch(s){throw r[e]=s instanceof Error?s:void 0,s}return r[e]}else return}a(ch,"_resolve");function Ha(r,e){if(e){for(let[t,n]of Object.entries(e))if(n!==void 0){let i=r[t];i!==null&&n!==null&&typeof i=="object"&&typeof n=="object"?r[t]=Ha(i,n):r[t]=n}}return r}a(Ha,"_merge");var Nu={indentTokenName:"INDENT",dedentTokenName:"DEDENT",whitespaceTokenName:"WS",ignoreIndentationDelimiters:[]},vr;(function(r){r.REGULAR="indentation-sensitive",r.IGNORE_INDENTATION="ignore-indentation"})(vr||(vr={}));var qa=class extends bt{static{a(this,"IndentationAwareTokenBuilder")}constructor(e=Nu){super(),this.indentationStack=[0],this.whitespaceRegExp=/[ \t]+/y,this.options=Object.assign(Object.assign({},Nu),e),this.indentTokenType=Bt({name:this.options.indentTokenName,pattern:this.indentMatcher.bind(this),line_breaks:!1}),this.dedentTokenType=Bt({name:this.options.dedentTokenName,pattern:this.dedentMatcher.bind(this),line_breaks:!1})}buildTokens(e,t){let n=super.buildTokens(e,t);if(!Ka(n))throw new Error("Invalid tokens built by default builder");let{indentTokenName:i,dedentTokenName:s,whitespaceTokenName:o,ignoreIndentationDelimiters:l}=this.options,u,c,f,d=[];for(let h of n){for(let[p,g]of l)h.name===p?h.PUSH_MODE=vr.IGNORE_INDENTATION:h.name===g&&(h.POP_MODE=!0);h.name===s?u=h:h.name===i?c=h:h.name===o?f=h:d.push(h)}if(!u||!c||!f)throw new Error("Some indentation/whitespace tokens not found!");return l.length>0?{modes:{[vr.REGULAR]:[u,c,...d,f],[vr.IGNORE_INDENTATION]:[...d,f]},defaultMode:vr.REGULAR}:[u,c,f,...d]}flushLexingReport(e){let t=super.flushLexingReport(e);return Object.assign(Object.assign({},t),{remainingDedents:this.flushRemainingDedents(e)})}isStartOfLine(e,t){return t===0||`\r +`.includes(e[t-1])}matchWhitespace(e,t,n,i){var s;this.whitespaceRegExp.lastIndex=t;let o=this.whitespaceRegExp.exec(e);return{currIndentLevel:(s=o?.[0].length)!==null&&s!==void 0?s:0,prevIndentLevel:this.indentationStack.at(-1),match:o}}createIndentationTokenInstance(e,t,n,i){let s=this.getLineNumber(t,i);return _t(e,n,i,i+n.length,s,s,1,n.length)}getLineNumber(e,t){return e.substring(0,t).split(/\r\n|\r|\n/).length}indentMatcher(e,t,n,i){if(!this.isStartOfLine(e,t))return null;let{currIndentLevel:s,prevIndentLevel:o,match:l}=this.matchWhitespace(e,t,n,i);return s<=o?null:(this.indentationStack.push(s),l)}dedentMatcher(e,t,n,i){var s,o,l,u;if(!this.isStartOfLine(e,t))return null;let{currIndentLevel:c,prevIndentLevel:f,match:d}=this.matchWhitespace(e,t,n,i);if(c>=f)return null;let h=this.indentationStack.lastIndexOf(c);if(h===-1)return this.diagnostics.push({severity:"error",message:`Invalid dedent level ${c} at offset: ${t}. Current indentation stack: ${this.indentationStack}`,offset:t,length:(o=(s=d?.[0])===null||s===void 0?void 0:s.length)!==null&&o!==void 0?o:0,line:this.getLineNumber(e,t),column:1}),null;let p=this.indentationStack.length-h-1,g=(u=(l=e.substring(0,t).match(/[\r\n]+$/))===null||l===void 0?void 0:l[0].length)!==null&&u!==void 0?u:1;for(let y=0;y1;)t.push(this.createIndentationTokenInstance(this.dedentTokenType,e,"",e.length)),this.indentationStack.pop();return this.indentationStack=[0],t}},Cu=class extends Ar{static{a(this,"IndentationAwareLexer")}constructor(e){if(super(e),e.parser.TokenBuilder instanceof qa)this.indentationTokenBuilder=e.parser.TokenBuilder;else throw new Error("IndentationAwareLexer requires an accompanying IndentationAwareTokenBuilder")}tokenize(e,t=Wa){let n=super.tokenize(e),i=n.report;t?.mode==="full"&&n.tokens.push(...i.remainingDedents),i.remainingDedents=[];let{indentTokenType:s,dedentTokenType:o}=this.indentationTokenBuilder,l=s.tokenTypeIdx,u=o.tokenTypeIdx,c=[],f=n.tokens.length-1;for(let d=0;d=0&&c.push(n.tokens[f]),n.tokens=c,n}};var K={};qt(K,{AstUtils:()=>Fs,BiMap:()=>Rr,Cancellation:()=>S,ContextCache:()=>xr,CstUtils:()=>Ss,DONE_RESULT:()=>Ce,Deferred:()=>Ge,Disposable:()=>jt,DisposableCache:()=>qn,DocumentCache:()=>Ua,EMPTY_STREAM:()=>ei,ErrorWithLocation:()=>tr,GrammarUtils:()=>Ks,MultiMap:()=>st,OperationCancelled:()=>mt,Reduction:()=>Ir,RegExpUtils:()=>Bs,SimpleCache:()=>es,StreamImpl:()=>je,TreeStreamImpl:()=>lt,URI:()=>Ue,UriUtils:()=>Be,WorkspaceCache:()=>Xn,assertUnreachable:()=>ct,delayNextTick:()=>fu,interruptAndCheck:()=>ce,isOperationCancelled:()=>gt,loadGrammarFromJson:()=>yt,setInterruptionPeriod:()=>qd,startCancelableOperation:()=>Fa,stream:()=>j});B(K,ne);var Xa=class{static{a(this,"EmptyFileSystemProvider")}readFile(){throw new Error("No file system is available.")}async readDirectory(){return[]}},Su={fileSystemProvider:a(()=>new Xa,"fileSystemProvider")};var kg={Grammar:a(()=>{},"Grammar"),LanguageMetaData:a(()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"}),"LanguageMetaData")},$g={AstReflection:a(()=>new hn,"AstReflection")};function Ig(){let r=za($u(Su),$g),e=za(ku({shared:r}),kg);return r.ServiceRegistry.register(e),e}a(Ig,"createMinimalGrammarServices");function yt(r){var e;let t=Ig(),n=t.serializer.JsonSerializer.deserialize(r);return t.shared.workspace.LangiumDocumentFactory.fromModel(n,Ue.parse(`memory://${(e=n.name)!==null&&e!==void 0?e:"grammar"}.langium`)),n}a(yt,"loadGrammarFromJson");B(fe,K);var Ng=Object.defineProperty,F=a((r,e)=>Ng(r,"name",{value:e,configurable:!0}),"__name"),ph="Statement",no="Architecture";function Cg(r){return at.isInstance(r,no)}a(Cg,"isArchitecture");F(Cg,"isArchitecture");var Ya="Axis",Es="Branch";function Sg(r){return at.isInstance(r,Es)}a(Sg,"isBranch");F(Sg,"isBranch");var Ja="Checkout",Qa="CherryPicking",wu="ClassDefStatement",As="Commit";function wg(r){return at.isInstance(r,As)}a(wg,"isCommit");F(wg,"isCommit");var _u="Curve",Lu="Edge",Ou="Entry",vs="GitGraph";function _g(r){return at.isInstance(r,vs)}a(_g,"isGitGraph");F(_g,"isGitGraph");var Pu="Group",io="Info";function Lg(r){return at.isInstance(r,io)}a(Lg,"isInfo");F(Lg,"isInfo");var Za="Item",bu="Junction",ks="Merge";function Og(r){return at.isInstance(r,ks)}a(Og,"isMerge");F(Og,"isMerge");var Mu="Option",so="Packet";function Pg(r){return at.isInstance(r,so)}a(Pg,"isPacket");F(Pg,"isPacket");var ao="PacketBlock";function bg(r){return at.isInstance(r,ao)}a(bg,"isPacketBlock");F(bg,"isPacketBlock");var oo="Pie";function Mg(r){return at.isInstance(r,oo)}a(Mg,"isPie");F(Mg,"isPie");var lo="PieSection";function Dg(r){return at.isInstance(r,lo)}a(Dg,"isPieSection");F(Dg,"isPieSection");var Du="Radar",Fu="Service",uo="Treemap";function Fg(r){return at.isInstance(r,uo)}a(Fg,"isTreemap");F(Fg,"isTreemap");var Gu="TreemapRow",eo="Direction",to="Leaf",ro="Section",Ah=class extends Jt{static{a(this,"MermaidAstReflection")}static{F(this,"MermaidAstReflection")}getAllTypes(){return[no,Ya,Es,Ja,Qa,wu,As,_u,eo,Lu,Ou,vs,Pu,io,Za,bu,to,ks,Mu,so,ao,oo,lo,Du,ro,Fu,ph,uo,Gu]}computeIsSubtype(r,e){switch(r){case Es:case Ja:case Qa:case As:case ks:return this.isSubtype(ph,e);case eo:return this.isSubtype(vs,e);case to:case ro:return this.isSubtype(Za,e);default:return!1}}getReferenceType(r){let e=`${r.container.$type}:${r.property}`;switch(e){case"Entry:axis":return Ya;default:throw new Error(`${e} is not a valid reference id.`)}}getTypeMetaData(r){switch(r){case no:return{name:no,properties:[{name:"accDescr"},{name:"accTitle"},{name:"edges",defaultValue:[]},{name:"groups",defaultValue:[]},{name:"junctions",defaultValue:[]},{name:"services",defaultValue:[]},{name:"title"}]};case Ya:return{name:Ya,properties:[{name:"label"},{name:"name"}]};case Es:return{name:Es,properties:[{name:"name"},{name:"order"}]};case Ja:return{name:Ja,properties:[{name:"branch"}]};case Qa:return{name:Qa,properties:[{name:"id"},{name:"parent"},{name:"tags",defaultValue:[]}]};case wu:return{name:wu,properties:[{name:"className"},{name:"styleText"}]};case As:return{name:As,properties:[{name:"id"},{name:"message"},{name:"tags",defaultValue:[]},{name:"type"}]};case _u:return{name:_u,properties:[{name:"entries",defaultValue:[]},{name:"label"},{name:"name"}]};case Lu:return{name:Lu,properties:[{name:"lhsDir"},{name:"lhsGroup",defaultValue:!1},{name:"lhsId"},{name:"lhsInto",defaultValue:!1},{name:"rhsDir"},{name:"rhsGroup",defaultValue:!1},{name:"rhsId"},{name:"rhsInto",defaultValue:!1},{name:"title"}]};case Ou:return{name:Ou,properties:[{name:"axis"},{name:"value"}]};case vs:return{name:vs,properties:[{name:"accDescr"},{name:"accTitle"},{name:"statements",defaultValue:[]},{name:"title"}]};case Pu:return{name:Pu,properties:[{name:"icon"},{name:"id"},{name:"in"},{name:"title"}]};case io:return{name:io,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case Za:return{name:Za,properties:[{name:"classSelector"},{name:"name"}]};case bu:return{name:bu,properties:[{name:"id"},{name:"in"}]};case ks:return{name:ks,properties:[{name:"branch"},{name:"id"},{name:"tags",defaultValue:[]},{name:"type"}]};case Mu:return{name:Mu,properties:[{name:"name"},{name:"value",defaultValue:!1}]};case so:return{name:so,properties:[{name:"accDescr"},{name:"accTitle"},{name:"blocks",defaultValue:[]},{name:"title"}]};case ao:return{name:ao,properties:[{name:"bits"},{name:"end"},{name:"label"},{name:"start"}]};case oo:return{name:oo,properties:[{name:"accDescr"},{name:"accTitle"},{name:"sections",defaultValue:[]},{name:"showData",defaultValue:!1},{name:"title"}]};case lo:return{name:lo,properties:[{name:"label"},{name:"value"}]};case Du:return{name:Du,properties:[{name:"accDescr"},{name:"accTitle"},{name:"axes",defaultValue:[]},{name:"curves",defaultValue:[]},{name:"options",defaultValue:[]},{name:"title"}]};case Fu:return{name:Fu,properties:[{name:"icon"},{name:"iconText"},{name:"id"},{name:"in"},{name:"title"}]};case uo:return{name:uo,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"},{name:"TreemapRows",defaultValue:[]}]};case Gu:return{name:Gu,properties:[{name:"indent"},{name:"item"}]};case eo:return{name:eo,properties:[{name:"accDescr"},{name:"accTitle"},{name:"dir"},{name:"statements",defaultValue:[]},{name:"title"}]};case to:return{name:to,properties:[{name:"classSelector"},{name:"name"},{name:"value"}]};case ro:return{name:ro,properties:[{name:"classSelector"},{name:"name"}]};default:return{name:r,properties:[]}}}},at=new Ah,mh,Gg=F(()=>mh??(mh=yt(`{"$type":"Grammar","isDeclared":true,"name":"Info","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Info","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@7"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"InfoGrammar"),gh,Ug=F(()=>gh??(gh=yt(`{"$type":"Grammar","isDeclared":true,"name":"Packet","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Packet","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"packet"},{"$type":"Keyword","value":"packet-beta"}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"+"},{"$type":"Assignment","feature":"bits","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]}]},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@9"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"PacketGrammar"),yh,Bg=F(()=>yh??(yh=yt(`{"$type":"Grammar","isDeclared":true,"name":"Pie","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Pie","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PieSection","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"FLOAT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?(0|[1-9][0-9]*)(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@2"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@3"}}]},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@11"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@12"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"PieGrammar"),Th,Wg=F(()=>Th??(Th=yt(`{"$type":"Grammar","isDeclared":true,"name":"Architecture","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Architecture","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"groups","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"services","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"junctions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"edges","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"LeftPort","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"lhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"RightPort","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"rhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Keyword","value":":"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Arrow","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Assignment","feature":"lhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"--"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Group","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Service","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"service"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Junction","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"junction"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Edge","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"lhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"ARROW_DIRECTION","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"L"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"R"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"T"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"B"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_GROUP","definition":{"$type":"RegexToken","regex":"/\\\\{group\\\\}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_INTO","definition":{"$type":"RegexToken","regex":"/<|>/"},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@18"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@19"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","name":"ARCH_ICON","definition":{"$type":"RegexToken","regex":"/\\\\([\\\\w-:]+\\\\)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TITLE","definition":{"$type":"RegexToken","regex":"/\\\\[[\\\\w ]+\\\\]/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"ArchitectureGrammar"),Rh,Kg=F(()=>Rh??(Rh=yt(`{"$type":"Grammar","isDeclared":true,"name":"GitGraph","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"GitGraph","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Keyword","value":":"}]},{"$type":"Keyword","value":"gitGraph:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Direction","definition":{"$type":"Assignment","feature":"dir","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"LR"},{"$type":"Keyword","value":"TB"},{"$type":"Keyword","value":"BT"}]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Commit","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"commit"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Branch","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"branch"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Merge","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"merge"},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Checkout","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"checkout"},{"$type":"Keyword","value":"switch"}]},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CherryPicking","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"cherry-pick"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@14"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","name":"REFERENCE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\\\w([-\\\\./\\\\w]*[-\\\\w])?/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"GitGraphGrammar"),xh,Vg=F(()=>xh??(xh=yt(`{"$type":"Grammar","isDeclared":true,"name":"Radar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Radar","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":"radar-beta:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Keyword","value":"axis"},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"curve"},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Label","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Axis","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Curve","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Entries","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DetailedEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"axis","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NumberEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Option","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"showLegend"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"ticks"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"max"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"min"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"graticule"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"GRATICULE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"circle"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"polygon"}}]},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@16"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"interfaces":[{"$type":"Interface","name":"Entry","attributes":[{"$type":"TypeAttribute","name":"axis","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@2"}}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}],"superTypes":[]}],"definesHiddenTokens":false,"hiddenTokens":[],"types":[],"usedGrammars":[]}`)),"RadarGrammar"),Eh,jg=F(()=>Eh??(Eh=yt(`{"$type":"Grammar","isDeclared":true,"name":"Treemap","rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"ParserRule","entry":true,"name":"Treemap","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"TreemapRows","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"TREEMAP_KEYWORD","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap-beta"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"CLASS_DEF","definition":{"$type":"RegexToken","regex":"/classDef\\\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\\\s+([^;\\\\r\\\\n]*))?(?:;)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STYLE_SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":::"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"COMMA","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":","}},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[ \\\\t]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"ML_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\%\\\\%[^\\\\n]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false},{"$type":"ParserRule","name":"TreemapRow","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"indent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"item","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ClassDef","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Item","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Section","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Leaf","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INDENTATION","definition":{"$type":"RegexToken","regex":"/[ \\\\t]{1,}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID2","definition":{"$type":"RegexToken","regex":"/[a-zA-Z_][a-zA-Z0-9_]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER2","definition":{"$type":"RegexToken","regex":"/[0-9_\\\\.\\\\,]+/"},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"MyNumber","dataType":"number","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"STRING2","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/"},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"Item","attributes":[{"$type":"TypeAttribute","name":"name","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"classSelector","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]},{"$type":"Interface","name":"Section","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[]},{"$type":"Interface","name":"Leaf","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}]},{"$type":"Interface","name":"ClassDefStatement","attributes":[{"$type":"TypeAttribute","name":"className","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"styleText","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"Treemap","attributes":[{"$type":"TypeAttribute","name":"TreemapRows","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@14"}}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"types":[],"usedGrammars":[],"$comment":"/**\\n * Treemap grammar for Langium\\n * Converted from mindmap grammar\\n *\\n * The ML_COMMENT and NL hidden terminals handle whitespace, comments, and newlines\\n * before the treemap keyword, allowing for empty lines and comments before the\\n * treemap declaration.\\n */"}`)),"TreemapGrammar"),Hg={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},zg={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},qg={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Xg={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Yg={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Jg={languageId:"radar",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Qg={languageId:"treemap",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},JN={AstReflection:F(()=>new Ah,"AstReflection")},QN={Grammar:F(()=>Gg(),"Grammar"),LanguageMetaData:F(()=>Hg,"LanguageMetaData"),parser:{}},ZN={Grammar:F(()=>Ug(),"Grammar"),LanguageMetaData:F(()=>zg,"LanguageMetaData"),parser:{}},eC={Grammar:F(()=>Bg(),"Grammar"),LanguageMetaData:F(()=>qg,"LanguageMetaData"),parser:{}},tC={Grammar:F(()=>Wg(),"Grammar"),LanguageMetaData:F(()=>Xg,"LanguageMetaData"),parser:{}},rC={Grammar:F(()=>Kg(),"Grammar"),LanguageMetaData:F(()=>Yg,"LanguageMetaData"),parser:{}},nC={Grammar:F(()=>Vg(),"Grammar"),LanguageMetaData:F(()=>Jg,"LanguageMetaData"),parser:{}},iC={Grammar:F(()=>jg(),"Grammar"),LanguageMetaData:F(()=>Qg,"LanguageMetaData"),parser:{}},Zg=/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,ey=/accTitle[\t ]*:([^\n\r]*)/,ty=/title([\t ][^\n\r]*|)/,ry={ACC_DESCR:Zg,ACC_TITLE:ey,TITLE:ty},ny=class extends Tr{static{a(this,"AbstractMermaidValueConverter")}static{F(this,"AbstractMermaidValueConverter")}runConverter(r,e,t){let n=this.runCommonConverter(r,e,t);return n===void 0&&(n=this.runCustomConverter(r,e,t)),n===void 0?super.runConverter(r,e,t):n}runCommonConverter(r,e,t){let n=ry[r.name];if(n===void 0)return;let i=n.exec(e);if(i!==null){if(i[1]!==void 0)return i[1].trim().replace(/[\t ]{2,}/gm," ");if(i[2]!==void 0)return i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,` +`)}}},aC=class extends ny{static{a(this,"CommonValueConverter")}static{F(this,"CommonValueConverter")}runCustomConverter(r,e,t){}},iy=class extends bt{static{a(this,"AbstractMermaidTokenBuilder")}static{F(this,"AbstractMermaidTokenBuilder")}constructor(r){super(),this.keywords=new Set(r)}buildKeywordTokens(r,e,t){let n=super.buildKeywordTokens(r,e,t);return n.forEach(i=>{this.keywords.has(i.name)&&i.PATTERN!==void 0&&(i.PATTERN=new RegExp(i.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))}),n}},lC=class extends iy{static{a(this,"CommonTokenBuilder")}static{F(this,"CommonTokenBuilder")}};export{ku as a,$u as b,za as c,Su as d,fe as e,F as f,JN as g,QN as h,ZN as i,eC as j,tC as k,rC as l,nC as m,iC as n,ny as o,aC as p,iy as q}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-2XYWPRAO.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-2XYWPRAO.mjs.map new file mode 100644 index 0000000..dc4c68b --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-2XYWPRAO.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../../node_modules/.pnpm/vscode-jsonrpc@8.2.0/node_modules/vscode-jsonrpc/lib/common/ral.js", "../../../../../node_modules/.pnpm/vscode-jsonrpc@8.2.0/node_modules/vscode-jsonrpc/lib/common/is.js", "../../../../../node_modules/.pnpm/vscode-jsonrpc@8.2.0/node_modules/vscode-jsonrpc/lib/common/events.js", "../../../../../node_modules/.pnpm/vscode-jsonrpc@8.2.0/node_modules/vscode-jsonrpc/lib/common/cancellation.js", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/index.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/cst-utils.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/syntax-tree.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/stream.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/grammar-utils.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/errors.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/languages/generated/ast.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/ast-utils.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/regexp-utils.ts", "../../../../../node_modules/.pnpm/@chevrotain+regexp-to-ast@11.0.3/node_modules/@chevrotain/regexp-to-ast/src/utils.ts", "../../../../../node_modules/.pnpm/@chevrotain+regexp-to-ast@11.0.3/node_modules/@chevrotain/regexp-to-ast/src/character-classes.ts", "../../../../../node_modules/.pnpm/@chevrotain+regexp-to-ast@11.0.3/node_modules/@chevrotain/regexp-to-ast/src/regexp-parser.ts", "../../../../../node_modules/.pnpm/@chevrotain+regexp-to-ast@11.0.3/node_modules/@chevrotain/regexp-to-ast/src/base-regexp-visitor.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/languages/grammar-config.ts", "../../../../../node_modules/.pnpm/@chevrotain+utils@11.0.3/node_modules/@chevrotain/utils/src/print.ts", "../../../../../node_modules/.pnpm/@chevrotain+utils@11.0.3/node_modules/@chevrotain/utils/src/timer.ts", "../../../../../node_modules/.pnpm/@chevrotain+utils@11.0.3/node_modules/@chevrotain/utils/src/to-fast-properties.ts", "../../../../../node_modules/.pnpm/@chevrotain+gast@11.0.3/node_modules/@chevrotain/gast/src/model.ts", "../../../../../node_modules/.pnpm/@chevrotain+gast@11.0.3/node_modules/@chevrotain/gast/src/visitor.ts", "../../../../../node_modules/.pnpm/@chevrotain+gast@11.0.3/node_modules/@chevrotain/gast/src/helpers.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/rest.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/first.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/constants.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/follow.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/reg_exp_parser.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/reg_exp.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/lexer.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/tokens.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/lexer_errors_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/lexer_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/tokens_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/errors_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/resolver.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/interpreter.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/lookahead.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/checks.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/gast/gast_resolver_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/exceptions_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/recoverable.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/keys.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/llk_lookahead.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/looksahead.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/cst/cst.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/lang/lang_extensions.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/cst/cst_visitor.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/tree_builder.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/lexer_adapter.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/recognizer_api.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/recognizer_engine.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/error_handler.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/context_assist.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/gast_recorder.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/perf_tracer.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/utils/apply_mixins.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/parser.ts", "../../../../../node_modules/.pnpm/chevrotain-allstar@0.3.1_chevrotain@11.0.3/node_modules/chevrotain-allstar/src/atn.ts", "../../../../../node_modules/.pnpm/chevrotain-allstar@0.3.1_chevrotain@11.0.3/node_modules/chevrotain-allstar/src/dfa.ts", "../../../../../node_modules/.pnpm/chevrotain-allstar@0.3.1_chevrotain@11.0.3/node_modules/chevrotain-allstar/src/all-star-lookahead.ts", "../../../../../node_modules/.pnpm/vscode-languageserver-types@3.17.5/node_modules/vscode-languageserver-types/lib/esm/main.js", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/cst-node-builder.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/langium-parser.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/parser-builder-base.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/completion-parser-builder.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/langium-parser-builder.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/token-builder.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/value-converter.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/cancellation.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/promise-utils.ts", "../../../../../node_modules/.pnpm/vscode-languageserver-textdocument@1.0.12/node_modules/vscode-languageserver-textdocument/lib/esm/main.js", "webpack://LIB/node_modules/path-browserify/index.js", "webpack://LIB/webpack/bootstrap", "webpack://LIB/webpack/runtime/define%20property%20getters", "webpack://LIB/webpack/runtime/hasOwnProperty%20shorthand", "webpack://LIB/webpack/runtime/make%20namespace%20object", "webpack://LIB/src/platform.ts", "webpack://LIB/src/uri.ts", "webpack://LIB/src/utils.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/uri-utils.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/documents.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/linker.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/name-provider.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/references.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/collections.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/scope-computation.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/scope.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/caching.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/scope-provider.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/serializer/json-serializer.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/service-registry.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/validation/validation-registry.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/validation/document-validator.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/ast-descriptions.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/ast-node-locator.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/event.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/configuration.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/disposable.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/document-builder.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/index-manager.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/workspace-manager.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/lexer.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/documentation/jsdoc.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/documentation/documentation-provider.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/documentation/comment-provider.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/async-parser.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/workspace-lock.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/serializer/hydrator.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/default-module.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/dependency-injection.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/indentation-aware.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/index.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/file-system-provider.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/grammar-loader.ts", "../../../../parser/dist/chunks/mermaid-parser.core/chunk-FPAJGGOC.mjs"], + "sourcesContent": ["\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nlet _ral;\nfunction RAL() {\n if (_ral === undefined) {\n throw new Error(`No runtime abstraction layer installed`);\n }\n return _ral;\n}\n(function (RAL) {\n function install(ral) {\n if (ral === undefined) {\n throw new Error(`No runtime abstraction layer provided`);\n }\n _ral = ral;\n }\n RAL.install = install;\n})(RAL || (RAL = {}));\nexports.default = RAL;\n", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringArray = exports.array = exports.func = exports.error = exports.number = exports.string = exports.boolean = void 0;\nfunction boolean(value) {\n return value === true || value === false;\n}\nexports.boolean = boolean;\nfunction string(value) {\n return typeof value === 'string' || value instanceof String;\n}\nexports.string = string;\nfunction number(value) {\n return typeof value === 'number' || value instanceof Number;\n}\nexports.number = number;\nfunction error(value) {\n return value instanceof Error;\n}\nexports.error = error;\nfunction func(value) {\n return typeof value === 'function';\n}\nexports.func = func;\nfunction array(value) {\n return Array.isArray(value);\n}\nexports.array = array;\nfunction stringArray(value) {\n return array(value) && value.every(elem => string(elem));\n}\nexports.stringArray = stringArray;\n", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Emitter = exports.Event = void 0;\nconst ral_1 = require(\"./ral\");\nvar Event;\n(function (Event) {\n const _disposable = { dispose() { } };\n Event.None = function () { return _disposable; };\n})(Event || (exports.Event = Event = {}));\nclass CallbackList {\n add(callback, context = null, bucket) {\n if (!this._callbacks) {\n this._callbacks = [];\n this._contexts = [];\n }\n this._callbacks.push(callback);\n this._contexts.push(context);\n if (Array.isArray(bucket)) {\n bucket.push({ dispose: () => this.remove(callback, context) });\n }\n }\n remove(callback, context = null) {\n if (!this._callbacks) {\n return;\n }\n let foundCallbackWithDifferentContext = false;\n for (let i = 0, len = this._callbacks.length; i < len; i++) {\n if (this._callbacks[i] === callback) {\n if (this._contexts[i] === context) {\n // callback & context match => remove it\n this._callbacks.splice(i, 1);\n this._contexts.splice(i, 1);\n return;\n }\n else {\n foundCallbackWithDifferentContext = true;\n }\n }\n }\n if (foundCallbackWithDifferentContext) {\n throw new Error('When adding a listener with a context, you should remove it with the same context');\n }\n }\n invoke(...args) {\n if (!this._callbacks) {\n return [];\n }\n const ret = [], callbacks = this._callbacks.slice(0), contexts = this._contexts.slice(0);\n for (let i = 0, len = callbacks.length; i < len; i++) {\n try {\n ret.push(callbacks[i].apply(contexts[i], args));\n }\n catch (e) {\n // eslint-disable-next-line no-console\n (0, ral_1.default)().console.error(e);\n }\n }\n return ret;\n }\n isEmpty() {\n return !this._callbacks || this._callbacks.length === 0;\n }\n dispose() {\n this._callbacks = undefined;\n this._contexts = undefined;\n }\n}\nclass Emitter {\n constructor(_options) {\n this._options = _options;\n }\n /**\n * For the public to allow to subscribe\n * to events from this Emitter\n */\n get event() {\n if (!this._event) {\n this._event = (listener, thisArgs, disposables) => {\n if (!this._callbacks) {\n this._callbacks = new CallbackList();\n }\n if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {\n this._options.onFirstListenerAdd(this);\n }\n this._callbacks.add(listener, thisArgs);\n const result = {\n dispose: () => {\n if (!this._callbacks) {\n // disposable is disposed after emitter is disposed.\n return;\n }\n this._callbacks.remove(listener, thisArgs);\n result.dispose = Emitter._noop;\n if (this._options && this._options.onLastListenerRemove && this._callbacks.isEmpty()) {\n this._options.onLastListenerRemove(this);\n }\n }\n };\n if (Array.isArray(disposables)) {\n disposables.push(result);\n }\n return result;\n };\n }\n return this._event;\n }\n /**\n * To be kept private to fire an event to\n * subscribers\n */\n fire(event) {\n if (this._callbacks) {\n this._callbacks.invoke.call(this._callbacks, event);\n }\n }\n dispose() {\n if (this._callbacks) {\n this._callbacks.dispose();\n this._callbacks = undefined;\n }\n }\n}\nexports.Emitter = Emitter;\nEmitter._noop = function () { };\n", "\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancellationTokenSource = exports.CancellationToken = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst events_1 = require(\"./events\");\nvar CancellationToken;\n(function (CancellationToken) {\n CancellationToken.None = Object.freeze({\n isCancellationRequested: false,\n onCancellationRequested: events_1.Event.None\n });\n CancellationToken.Cancelled = Object.freeze({\n isCancellationRequested: true,\n onCancellationRequested: events_1.Event.None\n });\n function is(value) {\n const candidate = value;\n return candidate && (candidate === CancellationToken.None\n || candidate === CancellationToken.Cancelled\n || (Is.boolean(candidate.isCancellationRequested) && !!candidate.onCancellationRequested));\n }\n CancellationToken.is = is;\n})(CancellationToken || (exports.CancellationToken = CancellationToken = {}));\nconst shortcutEvent = Object.freeze(function (callback, context) {\n const handle = (0, ral_1.default)().timer.setTimeout(callback.bind(context), 0);\n return { dispose() { handle.dispose(); } };\n});\nclass MutableToken {\n constructor() {\n this._isCancelled = false;\n }\n cancel() {\n if (!this._isCancelled) {\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire(undefined);\n this.dispose();\n }\n }\n }\n get isCancellationRequested() {\n return this._isCancelled;\n }\n get onCancellationRequested() {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new events_1.Emitter();\n }\n return this._emitter.event;\n }\n dispose() {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = undefined;\n }\n }\n}\nclass CancellationTokenSource {\n get token() {\n if (!this._token) {\n // be lazy and create the token only when\n // actually needed\n this._token = new MutableToken();\n }\n return this._token;\n }\n cancel() {\n if (!this._token) {\n // save an object by returning the default\n // cancelled token when cancellation happens\n // before someone asks for the token\n this._token = CancellationToken.Cancelled;\n }\n else {\n this._token.cancel();\n }\n }\n dispose() {\n if (!this._token) {\n // ensure to initialize with an empty token if we had none\n this._token = CancellationToken.None;\n }\n else if (this._token instanceof MutableToken) {\n // actually dispose\n this._token.dispose();\n }\n }\n}\nexports.CancellationTokenSource = CancellationTokenSource;\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n *\r\n * @module langium\r\n */\r\n\r\nexport * from './default-module.js';\r\nexport * from './dependency-injection.js';\r\nexport * from './service-registry.js';\r\nexport * from './services.js';\r\nexport * from './syntax-tree.js';\r\nexport * from './documentation/index.js';\r\nexport * from './languages/index.js';\r\nexport * from './parser/index.js';\r\nexport * from './references/index.js';\r\nexport * from './serializer/index.js';\r\nexport * from './utils/index.js';\r\nexport * from './validation/index.js';\r\nexport * from './workspace/index.js';\r\n\r\n// Export the Langium Grammar AST definitions in the `GrammarAST` namespace\r\nimport * as GrammarAST from './languages/generated/ast.js';\r\nimport type { Grammar } from './languages/generated/ast.js';\r\nexport { Grammar, GrammarAST };\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { IToken } from '@chevrotain/types';\r\nimport type { Range } from 'vscode-languageserver-types';\r\nimport type { CstNode, CompositeCstNode, LeafCstNode } from '../syntax-tree.js';\r\nimport type { DocumentSegment } from '../workspace/documents.js';\r\nimport type { Stream, TreeStream } from './stream.js';\r\nimport { isCompositeCstNode, isLeafCstNode, isRootCstNode } from '../syntax-tree.js';\r\nimport { TreeStreamImpl } from './stream.js';\r\n\r\n/**\r\n * Create a stream of all CST nodes that are directly and indirectly contained in the given root node,\r\n * including the root node itself.\r\n */\r\nexport function streamCst(node: CstNode): TreeStream {\r\n return new TreeStreamImpl(node, element => {\r\n if (isCompositeCstNode(element)) {\r\n return element.content;\r\n } else {\r\n return [];\r\n }\r\n }, { includeRoot: true });\r\n}\r\n\r\n/**\r\n * Create a stream of all leaf nodes that are directly and indirectly contained in the given root node.\r\n */\r\nexport function flattenCst(node: CstNode): Stream {\r\n return streamCst(node).filter(isLeafCstNode);\r\n}\r\n\r\n/**\r\n * Determines whether the specified cst node is a child of the specified parent node.\r\n */\r\nexport function isChildNode(child: CstNode, parent: CstNode): boolean {\r\n while (child.container) {\r\n child = child.container;\r\n if (child === parent) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport function tokenToRange(token: IToken): Range {\r\n // Chevrotain uses 1-based indices everywhere\r\n // So we subtract 1 from every value to align with the LSP\r\n return {\r\n start: {\r\n character: token.startColumn! - 1,\r\n line: token.startLine! - 1\r\n },\r\n end: {\r\n character: token.endColumn!, // endColumn uses the correct index\r\n line: token.endLine! - 1\r\n }\r\n };\r\n}\r\n\r\nexport function toDocumentSegment(node: CstNode): DocumentSegment;\r\nexport function toDocumentSegment(node?: CstNode): DocumentSegment | undefined;\r\nexport function toDocumentSegment(node?: CstNode): DocumentSegment | undefined {\r\n if (!node) {\r\n return undefined;\r\n }\r\n const { offset, end, range } = node;\r\n return {\r\n range,\r\n offset,\r\n end,\r\n length: end - offset\r\n };\r\n}\r\n\r\nexport enum RangeComparison {\r\n Before = 0,\r\n After = 1,\r\n OverlapFront = 2,\r\n OverlapBack = 3,\r\n Inside = 4,\r\n Outside = 5,\r\n}\r\n\r\nexport function compareRange(range: Range, to: Range): RangeComparison {\r\n if (range.end.line < to.start.line || (range.end.line === to.start.line && range.end.character <= to.start.character)) {\r\n return RangeComparison.Before;\r\n } else if (range.start.line > to.end.line || (range.start.line === to.end.line && range.start.character >= to.end.character)) {\r\n return RangeComparison.After;\r\n }\r\n const startInside = range.start.line > to.start.line || (range.start.line === to.start.line && range.start.character >= to.start.character);\r\n const endInside = range.end.line < to.end.line || (range.end.line === to.end.line && range.end.character <= to.end.character);\r\n if (startInside && endInside) {\r\n return RangeComparison.Inside;\r\n } else if (startInside) {\r\n return RangeComparison.OverlapBack;\r\n } else if (endInside) {\r\n return RangeComparison.OverlapFront;\r\n } else {\r\n return RangeComparison.Outside;\r\n }\r\n}\r\n\r\nexport function inRange(range: Range, to: Range): boolean {\r\n const comparison = compareRange(range, to);\r\n return comparison > RangeComparison.After;\r\n}\r\n\r\n// The \\p{L} regex matches any unicode letter character, i.e. characters from non-english alphabets\r\n// Together with \\w it matches any kind of character which can commonly appear in IDs\r\nexport const DefaultNameRegexp = /^[\\w\\p{L}]$/u;\r\n\r\n/**\r\n * Performs `findLeafNodeAtOffset` with a minor difference: When encountering a character that matches the `nameRegexp` argument,\r\n * it will instead return the leaf node at the `offset - 1` position.\r\n *\r\n * For LSP services, users expect that the declaration of an element is available if the cursor is directly after the element.\r\n */\r\nexport function findDeclarationNodeAtOffset(cstNode: CstNode | undefined, offset: number, nameRegexp = DefaultNameRegexp): LeafCstNode | undefined {\r\n if (cstNode) {\r\n if (offset > 0) {\r\n const localOffset = offset - cstNode.offset;\r\n const textAtOffset = cstNode.text.charAt(localOffset);\r\n if (!nameRegexp.test(textAtOffset)) {\r\n offset--;\r\n }\r\n }\r\n return findLeafNodeAtOffset(cstNode, offset);\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function findCommentNode(cstNode: CstNode | undefined, commentNames: string[]): CstNode | undefined {\r\n if (cstNode) {\r\n const previous = getPreviousNode(cstNode, true);\r\n if (previous && isCommentNode(previous, commentNames)) {\r\n return previous;\r\n }\r\n if (isRootCstNode(cstNode)) {\r\n // Go from the first non-hidden node through all nodes in reverse order\r\n // We do this to find the comment node which directly precedes the root node\r\n const endIndex = cstNode.content.findIndex(e => !e.hidden);\r\n for (let i = endIndex - 1; i >= 0; i--) {\r\n const child = cstNode.content[i];\r\n if (isCommentNode(child, commentNames)) {\r\n return child;\r\n }\r\n }\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function isCommentNode(cstNode: CstNode, commentNames: string[]): boolean {\r\n return isLeafCstNode(cstNode) && commentNames.includes(cstNode.tokenType.name);\r\n}\r\n\r\n/**\r\n * Finds the leaf CST node at the specified 0-based string offset.\r\n * Note that the given offset will be within the range of the returned leaf node.\r\n *\r\n * If the offset does not point to a CST node (but just white space), this method will return `undefined`.\r\n *\r\n * @param node The CST node to search through.\r\n * @param offset The specified offset.\r\n * @returns The CST node at the specified offset.\r\n */\r\nexport function findLeafNodeAtOffset(node: CstNode, offset: number): LeafCstNode | undefined {\r\n if (isLeafCstNode(node)) {\r\n return node;\r\n } else if (isCompositeCstNode(node)) {\r\n const searchResult = binarySearch(node, offset, false);\r\n if (searchResult) {\r\n return findLeafNodeAtOffset(searchResult, offset);\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Finds the leaf CST node at the specified 0-based string offset.\r\n * If no CST node exists at the specified position, it will return the leaf node before it.\r\n *\r\n * If there is no leaf node before the specified offset, this method will return `undefined`.\r\n *\r\n * @param node The CST node to search through.\r\n * @param offset The specified offset.\r\n * @returns The CST node closest to the specified offset.\r\n */\r\nexport function findLeafNodeBeforeOffset(node: CstNode, offset: number): LeafCstNode | undefined {\r\n if (isLeafCstNode(node)) {\r\n return node;\r\n } else if (isCompositeCstNode(node)) {\r\n const searchResult = binarySearch(node, offset, true);\r\n if (searchResult) {\r\n return findLeafNodeBeforeOffset(searchResult, offset);\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction binarySearch(node: CompositeCstNode, offset: number, closest: boolean): CstNode | undefined {\r\n let left = 0;\r\n let right = node.content.length - 1;\r\n let closestNode: CstNode | undefined = undefined;\r\n\r\n while (left <= right) {\r\n const middle = Math.floor((left + right) / 2);\r\n const middleNode = node.content[middle];\r\n\r\n if (middleNode.offset <= offset && middleNode.end > offset) {\r\n // Found an exact match\r\n return middleNode;\r\n }\r\n\r\n if (middleNode.end <= offset) {\r\n // Update the closest node (less than offset) and move to the right half\r\n closestNode = closest ? middleNode : undefined;\r\n left = middle + 1;\r\n } else {\r\n // Move to the left half\r\n right = middle - 1;\r\n }\r\n }\r\n\r\n return closestNode;\r\n}\r\n\r\nexport function getPreviousNode(node: CstNode, hidden = true): CstNode | undefined {\r\n while (node.container) {\r\n const parent = node.container;\r\n let index = parent.content.indexOf(node);\r\n while (index > 0) {\r\n index--;\r\n const previous = parent.content[index];\r\n if (hidden || !previous.hidden) {\r\n return previous;\r\n }\r\n }\r\n node = parent;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getNextNode(node: CstNode, hidden = true): CstNode | undefined {\r\n while (node.container) {\r\n const parent = node.container;\r\n let index = parent.content.indexOf(node);\r\n const last = parent.content.length - 1;\r\n while (index < last) {\r\n index++;\r\n const next = parent.content[index];\r\n if (hidden || !next.hidden) {\r\n return next;\r\n }\r\n }\r\n node = parent;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getStartlineNode(node: CstNode): CstNode {\r\n if (node.range.start.character === 0) {\r\n return node;\r\n }\r\n const line = node.range.start.line;\r\n let last = node;\r\n let index: number | undefined;\r\n while (node.container) {\r\n const parent = node.container;\r\n const selfIndex = index ?? parent.content.indexOf(node);\r\n if (selfIndex === 0) {\r\n node = parent;\r\n index = undefined;\r\n } else {\r\n index = selfIndex - 1;\r\n node = parent.content[index];\r\n }\r\n if (node.range.start.line !== line) {\r\n break;\r\n }\r\n last = node;\r\n }\r\n return last;\r\n}\r\n\r\nexport function getInteriorNodes(start: CstNode, end: CstNode): CstNode[] {\r\n const commonParent = getCommonParent(start, end);\r\n if (!commonParent) {\r\n return [];\r\n }\r\n return commonParent.parent.content.slice(commonParent.a + 1, commonParent.b);\r\n}\r\n\r\nfunction getCommonParent(a: CstNode, b: CstNode): CommonParent | undefined {\r\n const aParents = getParentChain(a);\r\n const bParents = getParentChain(b);\r\n let current: CommonParent | undefined;\r\n for (let i = 0; i < aParents.length && i < bParents.length; i++) {\r\n const aParent = aParents[i];\r\n const bParent = bParents[i];\r\n if (aParent.parent === bParent.parent) {\r\n current = {\r\n parent: aParent.parent,\r\n a: aParent.index,\r\n b: bParent.index\r\n };\r\n } else {\r\n break;\r\n }\r\n }\r\n return current;\r\n}\r\n\r\ninterface CommonParent {\r\n parent: CompositeCstNode\r\n a: number\r\n b: number\r\n}\r\n\r\nfunction getParentChain(node: CstNode): ParentLink[] {\r\n const chain: ParentLink[] = [];\r\n while (node.container) {\r\n const parent = node.container;\r\n const index = parent.content.indexOf(node);\r\n chain.push({\r\n parent,\r\n index\r\n });\r\n node = parent;\r\n }\r\n return chain.reverse();\r\n}\r\n\r\ninterface ParentLink {\r\n parent: CompositeCstNode\r\n index: number\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { TokenType } from 'chevrotain';\r\nimport type { URI } from './utils/uri-utils.js';\r\nimport type { AbstractElement } from './languages/generated/ast.js';\r\nimport type { DocumentSegment, LangiumDocument } from './workspace/documents.js';\r\n\r\n/**\r\n * A node in the Abstract Syntax Tree (AST).\r\n */\r\nexport interface AstNode {\r\n /** Every AST node has a type corresponding to what was specified in the grammar declaration. */\r\n readonly $type: string;\r\n /** The container node in the AST; every node except the root node has a container. */\r\n readonly $container?: AstNode;\r\n /** The property of the `$container` node that contains this node. This is either a direct reference or an array. */\r\n readonly $containerProperty?: string;\r\n /** In case `$containerProperty` is an array, the array index is stored here. */\r\n readonly $containerIndex?: number;\r\n /** The Concrete Syntax Tree (CST) node of the text range from which this node was parsed. */\r\n readonly $cstNode?: CstNode;\r\n /** The document containing the AST; only the root node has a direct reference to the document. */\r\n readonly $document?: LangiumDocument;\r\n}\r\n\r\nexport function isAstNode(obj: unknown): obj is AstNode {\r\n return typeof obj === 'object' && obj !== null && typeof (obj as AstNode).$type === 'string';\r\n}\r\n\r\nexport interface GenericAstNode extends AstNode {\r\n [key: string]: unknown\r\n}\r\n\r\ntype SpecificNodeProperties = keyof Omit;\r\n\r\n/**\r\n * The property names of a given AST node type.\r\n */\r\nexport type Properties = SpecificNodeProperties extends never ? string : SpecificNodeProperties\r\n\r\n/**\r\n * A cross-reference in the AST. Cross-references may or may not be successfully resolved.\r\n */\r\nexport interface Reference {\r\n /**\r\n * The target AST node of this reference. Accessing this property may trigger cross-reference\r\n * resolution by the `Linker` in case it has not been done yet. If the reference cannot be resolved,\r\n * the value is `undefined`.\r\n */\r\n readonly ref?: T;\r\n\r\n /** If any problem occurred while resolving the reference, it is described by this property. */\r\n readonly error?: LinkingError;\r\n /** The CST node from which the reference was parsed */\r\n readonly $refNode?: CstNode;\r\n /** The actual text used to look up in the surrounding scope */\r\n readonly $refText: string;\r\n /** The node description for the AstNode returned by `ref` */\r\n readonly $nodeDescription?: AstNodeDescription;\r\n}\r\n\r\nexport function isReference(obj: unknown): obj is Reference {\r\n return typeof obj === 'object' && obj !== null && typeof (obj as Reference).$refText === 'string';\r\n}\r\n\r\nexport type ResolvedReference = Reference & {\r\n readonly ref: T;\r\n}\r\n\r\n/**\r\n * A description of an AST node is used when constructing scopes and looking up cross-reference targets.\r\n */\r\nexport interface AstNodeDescription {\r\n /** The target node; should be present only for local references (linking to the same document). */\r\n node?: AstNode;\r\n /**\r\n * The document segment that represents the range of the name of the AST node.\r\n */\r\n nameSegment?: DocumentSegment;\r\n /**\r\n * The document segment that represents the full range of the AST node.\r\n */\r\n selectionSegment?: DocumentSegment;\r\n /** `$type` property value of the AST node */\r\n type: string;\r\n /** Name of the AST node; this is usually determined by the `NameProvider` service. */\r\n name: string;\r\n /** URI to the document containing the AST node */\r\n documentUri: URI;\r\n /** Navigation path inside the document */\r\n path: string;\r\n}\r\n\r\nexport function isAstNodeDescription(obj: unknown): obj is AstNodeDescription {\r\n return typeof obj === 'object' && obj !== null\r\n && typeof (obj as AstNodeDescription).name === 'string'\r\n && typeof (obj as AstNodeDescription).type === 'string'\r\n && typeof (obj as AstNodeDescription).path === 'string';\r\n}\r\n\r\n/**\r\n * Information about a cross-reference. This is used when traversing references in an AST or to describe\r\n * unresolved references.\r\n */\r\nexport interface ReferenceInfo {\r\n reference: Reference\r\n container: AstNode\r\n property: string\r\n index?: number\r\n}\r\n\r\n/**\r\n * Used to collect information when the `Linker` service fails to resolve a cross-reference.\r\n */\r\nexport interface LinkingError extends ReferenceInfo {\r\n message: string;\r\n targetDescription?: AstNodeDescription;\r\n}\r\n\r\nexport function isLinkingError(obj: unknown): obj is LinkingError {\r\n return typeof obj === 'object' && obj !== null\r\n && isAstNode((obj as LinkingError).container)\r\n && isReference((obj as LinkingError).reference)\r\n && typeof (obj as LinkingError).message === 'string';\r\n}\r\n\r\n/**\r\n * Service used for generic access to the structure of the AST. This service is shared between\r\n * all involved languages, so it operates on the superset of types of these languages.\r\n */\r\nexport interface AstReflection {\r\n getAllTypes(): string[]\r\n getAllSubTypes(type: string): string[]\r\n getReferenceType(refInfo: ReferenceInfo): string\r\n getTypeMetaData(type: string): TypeMetaData\r\n isInstance(node: unknown, type: string): boolean\r\n isSubtype(subtype: string, supertype: string): boolean\r\n}\r\n\r\n/**\r\n * An abstract implementation of the {@link AstReflection} interface.\r\n * Serves to cache subtype computation results to improve performance throughout different parts of Langium.\r\n */\r\nexport abstract class AbstractAstReflection implements AstReflection {\r\n\r\n protected subtypes: Record> = {};\r\n protected allSubtypes: Record = {};\r\n\r\n abstract getAllTypes(): string[];\r\n abstract getReferenceType(refInfo: ReferenceInfo): string;\r\n abstract getTypeMetaData(type: string): TypeMetaData;\r\n protected abstract computeIsSubtype(subtype: string, supertype: string): boolean;\r\n\r\n isInstance(node: unknown, type: string): boolean {\r\n return isAstNode(node) && this.isSubtype(node.$type, type);\r\n }\r\n\r\n isSubtype(subtype: string, supertype: string): boolean {\r\n if (subtype === supertype) {\r\n return true;\r\n }\r\n let nested = this.subtypes[subtype];\r\n if (!nested) {\r\n nested = this.subtypes[subtype] = {};\r\n }\r\n const existing = nested[supertype];\r\n if (existing !== undefined) {\r\n return existing;\r\n } else {\r\n const result = this.computeIsSubtype(subtype, supertype);\r\n nested[supertype] = result;\r\n return result;\r\n }\r\n }\r\n\r\n getAllSubTypes(type: string): string[] {\r\n const existing = this.allSubtypes[type];\r\n if (existing) {\r\n return existing;\r\n } else {\r\n const allTypes = this.getAllTypes();\r\n const types: string[] = [];\r\n for (const possibleSubType of allTypes) {\r\n if (this.isSubtype(possibleSubType, type)) {\r\n types.push(possibleSubType);\r\n }\r\n }\r\n this.allSubtypes[type] = types;\r\n return types;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Represents runtime meta data about a meta model type.\r\n */\r\nexport interface TypeMetaData {\r\n /** The name of this meta model type. Corresponds to the `AstNode.$type` value. */\r\n name: string\r\n /** A list of properties. They can contain default values for their respective property in the AST. */\r\n properties: TypeProperty[]\r\n}\r\n\r\n/**\r\n * Describes the meta data of a property of an AST node.\r\n *\r\n * The optional `defaultValue` indicates that the property is mandatory in the AST node.\r\n * For example, if an AST node contains an array, but no elements of this array have been parsed, we still expect an empty array instead of `undefined`.\r\n */\r\nexport interface TypeProperty {\r\n name: string\r\n defaultValue?: PropertyType\r\n}\r\n\r\n/**\r\n * Represents a default value for an AST property.\r\n */\r\nexport type PropertyType = number | string | boolean | PropertyType[];\r\n\r\n/**\r\n * A node in the Concrete Syntax Tree (CST).\r\n */\r\nexport interface CstNode extends DocumentSegment {\r\n /** The container node in the CST */\r\n readonly container?: CompositeCstNode;\r\n /** @deprecated use `container` instead. */\r\n readonly parent?: CompositeCstNode;\r\n /** The actual text */\r\n readonly text: string;\r\n /** The root CST node */\r\n readonly root: RootCstNode;\r\n /** The grammar element from which this node was parsed */\r\n readonly grammarSource?: AbstractElement;\r\n /** @deprecated use `grammarSource` instead. */\r\n readonly feature?: AbstractElement;\r\n /** The AST node created from this CST node */\r\n readonly astNode: AstNode;\r\n /** @deprecated use `astNode` instead. */\r\n readonly element: AstNode;\r\n /** Whether the token is hidden, i.e. not explicitly part of the containing grammar rule */\r\n readonly hidden: boolean;\r\n}\r\n\r\n/**\r\n * A composite CST node contains other nodes, but no directly associated token.\r\n */\r\nexport interface CompositeCstNode extends CstNode {\r\n readonly content: CstNode[];\r\n /** @deprecated use `content` instead. */\r\n readonly children: CstNode[];\r\n}\r\n\r\nexport function isCompositeCstNode(node: unknown): node is CompositeCstNode {\r\n return typeof node === 'object' && node !== null && Array.isArray((node as CompositeCstNode).content);\r\n}\r\n\r\n/**\r\n * A leaf CST node corresponds to a token in the input token stream.\r\n */\r\nexport interface LeafCstNode extends CstNode {\r\n readonly tokenType: TokenType;\r\n}\r\n\r\nexport function isLeafCstNode(node: unknown): node is LeafCstNode {\r\n return typeof node === 'object' && node !== null && typeof (node as LeafCstNode).tokenType === 'object';\r\n}\r\n\r\nexport interface RootCstNode extends CompositeCstNode {\r\n readonly fullText: string\r\n}\r\n\r\nexport function isRootCstNode(node: unknown): node is RootCstNode {\r\n return isCompositeCstNode(node) && typeof (node as RootCstNode).fullText === 'string';\r\n}\r\n\r\n/**\r\n * Returns a type to have only properties names (!) of a type T whose property value is of a certain type K.\r\n */\r\ntype ExtractKeysOfValueType = { [I in keyof T]: T[I] extends K ? I : never }[keyof T];\r\n\r\n/**\r\n * Returns the property names (!) of an AstNode that are cross-references.\r\n * Meant to be used during cross-reference resolution in combination with `assertUnreachable(context.property)`.\r\n */\r\nexport type CrossReferencesOfAstNodeType = (\r\n ExtractKeysOfValueType\r\n | ExtractKeysOfValueType|undefined>\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\n) & {};\r\n\r\n/**\r\n * Represents the enumeration-like type, that lists all AstNode types of your grammar.\r\n */\r\nexport type AstTypeList = Record;\r\n\r\n/**\r\n * Returns all types that contain cross-references, A is meant to be the interface `XXXAstType` fromm your generated `ast.ts` file.\r\n * Meant to be used during cross-reference resolution in combination with `assertUnreachable(context.container)`.\r\n */\r\nexport type AstNodeTypesWithCrossReferences
> = {\r\n [T in keyof A]: CrossReferencesOfAstNodeType extends never ? never : A[T]\r\n}[keyof A];\r\n\r\nexport type Mutable = {\r\n -readonly [P in keyof T]: T[P]\r\n};\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n/**\r\n * A stream is a read-only sequence of values. While the contents of an array can be accessed\r\n * both sequentially and randomly (via index), a stream allows only sequential access.\r\n *\r\n * The advantage of this is that a stream can be evaluated lazily, so it does not require\r\n * to store intermediate values. This can boost performance when a large sequence is\r\n * processed via filtering, mapping etc. and accessed at most once. However, lazy\r\n * evaluation means that all processing is repeated when you access the sequence multiple\r\n * times; in such a case, it may be better to store the resulting sequence into an array.\r\n */\r\nexport interface Stream extends Iterable {\r\n\r\n /**\r\n * Returns an iterator for this stream. This is the same as calling the `Symbol.iterator` function property.\r\n */\r\n iterator(): IterableIterator;\r\n\r\n /**\r\n * Determines whether this stream contains no elements.\r\n */\r\n isEmpty(): boolean;\r\n\r\n /**\r\n * Determines the number of elements in this stream.\r\n */\r\n count(): number;\r\n\r\n /**\r\n * Collects all elements of this stream into an array.\r\n */\r\n toArray(): T[];\r\n\r\n /**\r\n * Collects all elements of this stream into a Set.\r\n */\r\n toSet(): Set;\r\n\r\n /**\r\n * Collects all elements of this stream into a Map, applying the provided functions to determine keys and values.\r\n *\r\n * @param keyFn The function to derive map keys. If omitted, the stream elements are used as keys.\r\n * @param valueFn The function to derive map values. If omitted, the stream elements are used as values.\r\n */\r\n toMap(keyFn?: (e: T) => K, valueFn?: (e: T) => V): Map;\r\n\r\n /**\r\n * Returns a string representation of a stream.\r\n */\r\n toString(): string;\r\n\r\n /**\r\n * Combines two streams by returning a new stream that yields all elements of this stream and the other stream.\r\n *\r\n * @param other Stream to be concatenated with this one.\r\n */\r\n concat(other: Iterable): Stream;\r\n\r\n /**\r\n * Adds all elements of the stream into a string, separated by the specified separator string.\r\n *\r\n * @param separator A string used to separate one element of the stream from the next in the resulting string.\r\n * If omitted, the steam elements are separated with a comma.\r\n */\r\n join(separator?: string): string\r\n\r\n /**\r\n * Returns the index of the first occurrence of a value in the stream, or -1 if it is not present.\r\n *\r\n * @param searchElement The value to locate in the array.\r\n * @param fromIndex The stream index at which to begin the search. If fromIndex is omitted, the search\r\n * starts at index 0.\r\n */\r\n indexOf(searchElement: T, fromIndex?: number): number;\r\n\r\n /**\r\n * Determines whether all members of the stream satisfy the specified test.\r\n *\r\n * @param predicate This method calls the predicate function for each element in the stream until the\r\n * predicate returns a value which is coercible to the Boolean value `false`, or until the end\r\n * of the stream.\r\n */\r\n every(predicate: (value: T) => value is S): this is Stream;\r\n every(predicate: (value: T) => unknown): boolean;\r\n\r\n /**\r\n * Determines whether any member of the stream satisfies the specified test.\r\n *\r\n * @param predicate This method calls the predicate function for each element in the stream until the\r\n * predicate returns a value which is coercible to the Boolean value `true`, or until the end\r\n * of the stream.\r\n */\r\n some(predicate: (value: T) => unknown): boolean;\r\n\r\n /**\r\n * Performs the specified action for each element in the stream.\r\n *\r\n * @param callbackfn Function called once for each element in the stream.\r\n */\r\n forEach(callbackfn: (value: T, index: number) => void): void;\r\n\r\n /**\r\n * Returns a stream that yields the results of calling the specified callback function on each element\r\n * of the stream. The function is called when the resulting stream elements are actually accessed, so\r\n * accessing the resulting stream multiple times means the function is also called multiple times for\r\n * each element of the stream.\r\n *\r\n * @param callbackfn Lazily evaluated function mapping stream elements.\r\n */\r\n map(callbackfn: (value: T) => U): Stream;\r\n\r\n /**\r\n * Returns the elements of the stream that meet the condition specified in a callback function.\r\n * The function is called when the resulting stream elements are actually accessed, so accessing the\r\n * resulting stream multiple times means the function is also called multiple times for each element\r\n * of the stream.\r\n *\r\n * @param predicate Lazily evaluated function checking a condition on stream elements.\r\n */\r\n filter(predicate: (value: T) => value is S): Stream;\r\n filter(predicate: (value: T) => unknown): Stream;\r\n\r\n /**\r\n * Returns the elements of the stream that are _non-nullable_, which means they are neither `undefined`\r\n * nor `null`.\r\n */\r\n nonNullable(): Stream>;\r\n\r\n /**\r\n * Calls the specified callback function for all elements in the stream. The return value of the\r\n * callback function is the accumulated result, and is provided as an argument in the next call to\r\n * the callback function.\r\n *\r\n * @param callbackfn This method calls the function once for each element in the stream, providing\r\n * the previous and current values of the reduction.\r\n * @param initialValue If specified, `initialValue` is used as the initial value to start the\r\n * accumulation. The first call to the function provides this value as an argument instead\r\n * of a stream value.\r\n */\r\n reduce(callbackfn: (previousValue: T, currentValue: T) => T): T | undefined;\r\n reduce(callbackfn: (previousValue: U, currentValue: T) => U, initialValue: U): U;\r\n\r\n /**\r\n * Calls the specified callback function for all elements in the stream, in descending order.\r\n * The return value of the callback function is the accumulated result, and is provided as an\r\n * argument in the next call to the callback function.\r\n *\r\n * @param callbackfn This method calls the function once for each element in the stream, providing\r\n * the previous and current values of the reduction.\r\n * @param initialValue If specified, `initialValue` is used as the initial value to start the\r\n * accumulation. The first call to the function provides this value as an argument instead\r\n * of an array value.\r\n */\r\n reduceRight(callbackfn: (previousValue: T, currentValue: T) => T): T | undefined;\r\n reduceRight(callbackfn: (previousValue: U, currentValue: T) => U, initialValue: U): U;\r\n\r\n /**\r\n * Returns the value of the first element in the stream that meets the condition, or `undefined`\r\n * if there is no such element.\r\n *\r\n * @param predicate This method calls `predicate` once for each element of the stream, in ascending\r\n * order, until it finds one where `predicate` returns a value which is coercible to the\r\n * Boolean value `true`.\r\n */\r\n find(predicate: (value: T) => value is S): S | undefined;\r\n find(predicate: (value: T) => unknown): T | undefined;\r\n\r\n /**\r\n * Returns the index of the first element in the stream that meets the condition, or `-1`\r\n * if there is no such element.\r\n *\r\n * @param predicate This method calls `predicate` once for each element of the stream, in ascending\r\n * order, until it finds one where `predicate` returns a value which is coercible to the\r\n * Boolean value `true`.\r\n */\r\n findIndex(predicate: (value: T) => unknown): number;\r\n\r\n /**\r\n * Determines whether the stream includes a certain element, returning `true` or `false` as appropriate.\r\n *\r\n * @param searchElement The element to search for.\r\n */\r\n includes(searchElement: T): boolean;\r\n\r\n /**\r\n * Calls a defined callback function on each element of the stream and then flattens the result into\r\n * a new stream. This is identical to a `map` followed by `flat` with depth 1.\r\n *\r\n * @param callbackfn Lazily evaluated function mapping stream elements.\r\n */\r\n flatMap(callbackfn: (value: T) => U | Iterable): Stream;\r\n\r\n /**\r\n * Returns a new stream with all sub-stream or sub-array elements concatenated into it recursively up\r\n * to the specified depth.\r\n *\r\n * @param depth The maximum recursion depth. Defaults to 1.\r\n */\r\n flat(depth?: D): FlatStream;\r\n\r\n /**\r\n * Returns the first element in the stream, or `undefined` if the stream is empty.\r\n */\r\n head(): T | undefined;\r\n\r\n /**\r\n * Returns a stream that skips the first `skipCount` elements from this stream.\r\n *\r\n * @param skipCount The number of elements to skip. If this is larger than the number of elements in\r\n * the stream, an empty stream is returned. Defaults to 1.\r\n */\r\n tail(skipCount?: number): Stream;\r\n\r\n /**\r\n * Returns a stream consisting of the elements of this stream, truncated to be no longer than `maxSize`\r\n * in length.\r\n *\r\n * @param maxSize The number of elements the stream should be limited to\r\n */\r\n limit(maxSize: number): Stream;\r\n\r\n /**\r\n * Returns a stream containing only the distinct elements from this stream.\r\n * Equality is determined with the same rules as a standard `Set`.\r\n *\r\n * @param by A function returning the key used to check equality with a previous stream element.\r\n * If omitted, the stream elements themselves are used for comparison.\r\n */\r\n distinct(by?: (element: T) => Key): Stream;\r\n\r\n /**\r\n * Returns a stream that contains all elements that don't exist in the {@link other} iterable.\r\n * Equality is determined with the same rules as a standard `Set`.\r\n * @param other The elements that should be exluded from this stream.\r\n * @param key A function returning the key used to check quality.\r\n * If omitted, the stream elements themselves are used for comparison.\r\n */\r\n exclude(other: Iterable, key?: (element: T) => Key): Stream;\r\n\r\n}\r\n\r\nexport type FlatStream = {\r\n 'done': Stream,\r\n 'recur': T extends Iterable\r\n ? FlatStream>\r\n : Stream\r\n}[Depth extends 0 ? 'done' : 'recur'];\r\n\r\nexport type MinusOne = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][N];\r\n\r\n/**\r\n * The default implementation of `Stream` works with two input functions:\r\n * - The first function creates the initial state of an iteration.\r\n * - The second function gets the current state as argument and returns an `IteratorResult`.\r\n */\r\nexport class StreamImpl implements Stream {\r\n protected readonly startFn: () => S;\r\n protected readonly nextFn: (state: S) => IteratorResult;\r\n\r\n constructor(startFn: () => S, nextFn: (state: S) => IteratorResult) {\r\n this.startFn = startFn;\r\n this.nextFn = nextFn;\r\n }\r\n\r\n iterator(): IterableIterator {\r\n const iterator = {\r\n state: this.startFn(),\r\n next: () => this.nextFn(iterator.state),\r\n [Symbol.iterator]: () => iterator\r\n };\r\n return iterator;\r\n }\r\n\r\n [Symbol.iterator](): Iterator {\r\n return this.iterator();\r\n }\r\n\r\n isEmpty(): boolean {\r\n const iterator = this.iterator();\r\n return Boolean(iterator.next().done);\r\n }\r\n\r\n count(): number {\r\n const iterator = this.iterator();\r\n let count = 0;\r\n let next = iterator.next();\r\n while (!next.done) {\r\n count++;\r\n next = iterator.next();\r\n }\r\n return count;\r\n }\r\n\r\n toArray(): T[] {\r\n const result: T[] = [];\r\n const iterator = this.iterator();\r\n let next: IteratorResult;\r\n do {\r\n next = iterator.next();\r\n if (next.value !== undefined) {\r\n result.push(next.value);\r\n }\r\n } while (!next.done);\r\n return result;\r\n }\r\n\r\n toSet(): Set {\r\n return new Set(this);\r\n }\r\n\r\n toMap(keyFn?: (e: T) => K, valueFn?: (e: T) => V): Map {\r\n const entryStream = this.map(element => <[K, V]>[\r\n keyFn ? keyFn(element) : element,\r\n valueFn ? valueFn(element) : element\r\n ]);\r\n return new Map(entryStream);\r\n }\r\n\r\n toString(): string {\r\n return this.join();\r\n }\r\n\r\n concat(other: Iterable): Stream {\r\n return new StreamImpl<{ first: S, firstDone: boolean, iterator: Iterator }, T | T2>(\r\n () => ({ first: this.startFn(), firstDone: false, iterator: other[Symbol.iterator]() }),\r\n state => {\r\n let result: IteratorResult;\r\n if (!state.firstDone) {\r\n do {\r\n result = this.nextFn(state.first);\r\n if (!result.done) {\r\n return result;\r\n }\r\n } while (!result.done);\r\n state.firstDone = true;\r\n }\r\n do {\r\n result = state.iterator.next();\r\n if (!result.done) {\r\n return result;\r\n }\r\n } while (!result.done);\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n\r\n join(separator = ','): string {\r\n const iterator = this.iterator();\r\n let value = '';\r\n let result: IteratorResult;\r\n let addSeparator = false;\r\n do {\r\n result = iterator.next();\r\n if (!result.done) {\r\n if (addSeparator) {\r\n value += separator;\r\n }\r\n value += toString(result.value);\r\n }\r\n addSeparator = true;\r\n } while (!result.done);\r\n return value;\r\n }\r\n\r\n indexOf(searchElement: T, fromIndex = 0): number {\r\n const iterator = this.iterator();\r\n let index = 0;\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (index >= fromIndex && next.value === searchElement) {\r\n return index;\r\n }\r\n next = iterator.next();\r\n index++;\r\n }\r\n return -1;\r\n }\r\n\r\n // In the following definition the '& this' part in the return type is important\r\n // _and_ the order within 'Stream & this' is crucial!\r\n // Otherwise Typescript would infer the type of 'this' as 'StreamImpl & Stream'\r\n // (or ' & Stream') and usages like\r\n // ```\r\n // const stream = new StreamImpl(...);\r\n // ... stream.every() & stream....\r\n // ```\r\n // cannot benefit from '', as Typescript would priorize the signatures\r\n // of 'StreamImpl' (i.e. those of 'Stream') over those of 'Stream'.\r\n // With the order of 'Stream & this' the signatures of 'Stream' get precedence.\r\n every(predicate: (value: T) => value is U): this is Stream & this;\r\n every(predicate: (value: T) => unknown): boolean;\r\n every(predicate: (value: T) => unknown): boolean {\r\n const iterator = this.iterator();\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (!predicate(next.value)) {\r\n return false;\r\n }\r\n next = iterator.next();\r\n }\r\n return true;\r\n }\r\n\r\n some(predicate: (value: T) => unknown): boolean {\r\n const iterator = this.iterator();\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (predicate(next.value)) {\r\n return true;\r\n }\r\n next = iterator.next();\r\n }\r\n return false;\r\n }\r\n\r\n forEach(callbackfn: (value: T, index: number) => void): void {\r\n const iterator = this.iterator();\r\n let index = 0;\r\n let next = iterator.next();\r\n while (!next.done) {\r\n callbackfn(next.value, index);\r\n next = iterator.next();\r\n index++;\r\n }\r\n }\r\n\r\n map(callbackfn: (value: T) => U): Stream {\r\n return new StreamImpl(\r\n this.startFn,\r\n (state) => {\r\n const { done, value } = this.nextFn(state);\r\n if (done) {\r\n return DONE_RESULT;\r\n } else {\r\n return { done: false, value: callbackfn(value) };\r\n }\r\n }\r\n );\r\n }\r\n\r\n // for remarks on the return type definition refer to 'every(...)'\r\n filter(predicate: (value: T) => value is U): Stream & this;\r\n filter(predicate: (value: T) => unknown): Stream & this;\r\n filter(predicate: (value: T) => unknown): Stream {\r\n return new StreamImpl(\r\n this.startFn,\r\n state => {\r\n let result: IteratorResult;\r\n do {\r\n result = this.nextFn(state);\r\n if (!result.done && predicate(result.value)) {\r\n return result;\r\n }\r\n } while (!result.done);\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n\r\n nonNullable(): Stream> {\r\n return this.filter(e => e !== undefined && e !== null) as Stream>;\r\n }\r\n\r\n reduce(callbackfn: (previousValue: T, currentValue: T) => T): T | undefined;\r\n reduce(callbackfn: (previousValue: U, currentValue: T) => U, initialValue: U): U;\r\n reduce(callbackfn: (previousValue: U | T, currentValue: T) => U, initialValue?: U): U | T | undefined {\r\n const iterator = this.iterator();\r\n let previousValue: U | T | undefined = initialValue;\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (previousValue === undefined) {\r\n previousValue = next.value;\r\n } else {\r\n previousValue = callbackfn(previousValue, next.value);\r\n }\r\n next = iterator.next();\r\n }\r\n return previousValue;\r\n }\r\n\r\n reduceRight(callbackfn: (previousValue: T, currentValue: T) => T): T | undefined;\r\n reduceRight(callbackfn: (previousValue: U, currentValue: T) => U, initialValue: U): U;\r\n reduceRight(callbackfn: (previousValue: U | T, currentValue: T) => U, initialValue?: U): U | T | undefined {\r\n return this.recursiveReduce(this.iterator(), callbackfn, initialValue);\r\n }\r\n\r\n protected recursiveReduce(iterator: Iterator, callbackfn: (previousValue: U | T, currentValue: T) => U, initialValue?: U): U | T | undefined {\r\n const next = iterator.next();\r\n if (next.done) {\r\n return initialValue;\r\n }\r\n const previousValue = this.recursiveReduce(iterator, callbackfn, initialValue);\r\n if (previousValue === undefined) {\r\n return next.value;\r\n }\r\n return callbackfn(previousValue, next.value);\r\n }\r\n\r\n find(predicate: (value: T) => value is S): S | undefined;\r\n find(predicate: (value: T) => unknown): T | undefined;\r\n find(predicate: (value: T) => unknown): T | undefined {\r\n const iterator = this.iterator();\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (predicate(next.value)) {\r\n return next.value;\r\n }\r\n next = iterator.next();\r\n }\r\n return undefined;\r\n }\r\n\r\n findIndex(predicate: (value: T) => unknown): number {\r\n const iterator = this.iterator();\r\n let index = 0;\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (predicate(next.value)) {\r\n return index;\r\n }\r\n next = iterator.next();\r\n index++;\r\n }\r\n return -1;\r\n }\r\n\r\n includes(searchElement: T): boolean {\r\n const iterator = this.iterator();\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (next.value === searchElement) {\r\n return true;\r\n }\r\n next = iterator.next();\r\n }\r\n return false;\r\n }\r\n\r\n flatMap(callbackfn: (value: T) => U | Iterable): Stream {\r\n type FlatMapState = { this: S, iterator?: Iterator }\r\n return new StreamImpl(\r\n () => ({ this: this.startFn() }),\r\n (state) => {\r\n do {\r\n if (state.iterator) {\r\n const next = state.iterator.next();\r\n if (next.done) {\r\n state.iterator = undefined;\r\n } else {\r\n return next;\r\n }\r\n }\r\n const { done, value } = this.nextFn(state.this);\r\n if (!done) {\r\n const mapped = callbackfn(value);\r\n if (isIterable(mapped)) {\r\n state.iterator = mapped[Symbol.iterator]();\r\n } else {\r\n return { done: false, value: mapped };\r\n }\r\n }\r\n } while (state.iterator);\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n\r\n flat(depth?: D): FlatStream {\r\n if (depth === undefined) {\r\n depth = 1 as D;\r\n }\r\n if (depth <= 0) {\r\n return this as unknown as FlatStream;\r\n }\r\n const stream = depth > 1 ? this.flat(depth - 1) as unknown as StreamImpl : this;\r\n type FlatMapState = { this: S, iterator?: Iterator }\r\n return new StreamImpl(\r\n () => ({ this: stream.startFn() }),\r\n (state) => {\r\n do {\r\n if (state.iterator) {\r\n const next = state.iterator.next();\r\n if (next.done) {\r\n state.iterator = undefined;\r\n } else {\r\n return next;\r\n }\r\n }\r\n const { done, value } = stream.nextFn(state.this);\r\n if (!done) {\r\n if (isIterable(value)) {\r\n state.iterator = value[Symbol.iterator]() as Iterator;\r\n } else {\r\n return { done: false, value: value };\r\n }\r\n }\r\n } while (state.iterator);\r\n return DONE_RESULT;\r\n }\r\n ) as unknown as FlatStream;\r\n }\r\n\r\n head(): T | undefined {\r\n const iterator = this.iterator();\r\n const result = iterator.next();\r\n if (result.done) {\r\n return undefined;\r\n }\r\n return result.value;\r\n }\r\n\r\n tail(skipCount = 1): Stream {\r\n return new StreamImpl(\r\n () => {\r\n const state = this.startFn();\r\n for (let i = 0; i < skipCount; i++) {\r\n const next = this.nextFn(state);\r\n if (next.done) {\r\n return state;\r\n }\r\n }\r\n return state;\r\n },\r\n this.nextFn\r\n );\r\n }\r\n\r\n limit(maxSize: number): Stream {\r\n return new StreamImpl<{ size: number, state: S }, T>(\r\n () => ({ size: 0, state: this.startFn() }),\r\n state => {\r\n state.size++;\r\n if (state.size > maxSize) {\r\n return DONE_RESULT;\r\n }\r\n return this.nextFn(state.state);\r\n }\r\n );\r\n }\r\n\r\n distinct(by?: (element: T) => Key): Stream {\r\n return new StreamImpl<{ set: Set, internalState: S }, T>(\r\n () => ({ set: new Set(), internalState: this.startFn() }),\r\n state => {\r\n let result: IteratorResult;\r\n do {\r\n result = this.nextFn(state.internalState);\r\n if (!result.done) {\r\n const value = by ? by(result.value) : result.value;\r\n if (!state.set.has(value)) {\r\n state.set.add(value);\r\n return result;\r\n }\r\n }\r\n } while (!result.done);\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n\r\n exclude(other: Iterable, key?: (element: T) => Key): Stream {\r\n const otherKeySet = new Set();\r\n for (const item of other) {\r\n const value = key ? key(item) : item;\r\n otherKeySet.add(value);\r\n }\r\n return this.filter(e => {\r\n const ownKey = key ? key(e) : e;\r\n return !otherKeySet.has(ownKey);\r\n });\r\n }\r\n}\r\n\r\nfunction toString(item: unknown): string {\r\n if (typeof item === 'string') {\r\n return item as string;\r\n }\r\n if (typeof item === 'undefined') {\r\n return 'undefined';\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if (typeof (item as any).toString === 'function') {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return (item as any).toString();\r\n }\r\n return Object.prototype.toString.call(item);\r\n}\r\n\r\nfunction isIterable(obj: unknown): obj is Iterable {\r\n return !!obj && typeof (obj as Iterable)[Symbol.iterator] === 'function';\r\n}\r\n\r\n/**\r\n * An empty stream of any type.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport const EMPTY_STREAM: Stream = new StreamImpl(() => undefined, () => DONE_RESULT);\r\n\r\n/**\r\n * Use this `IteratorResult` when implementing a `StreamImpl` to indicate that there are no more elements in the stream.\r\n */\r\nexport const DONE_RESULT: IteratorReturnResult = Object.freeze({ done: true, value: undefined });\r\n\r\n/**\r\n * Create a stream from one or more iterables or array-likes.\r\n */\r\nexport function stream(...collections: Array | ArrayLike>): Stream {\r\n if (collections.length === 1) {\r\n const collection = collections[0];\r\n if (collection instanceof StreamImpl) {\r\n return collection as Stream;\r\n }\r\n if (isIterable(collection)) {\r\n return new StreamImpl, T>(\r\n () => collection[Symbol.iterator](),\r\n (iterator) => iterator.next()\r\n );\r\n }\r\n if (typeof collection.length === 'number') {\r\n return new StreamImpl<{ index: number }, T>(\r\n () => ({ index: 0 }),\r\n (state) => {\r\n if (state.index < collection.length) {\r\n return { done: false, value: collection[state.index++] };\r\n } else {\r\n return DONE_RESULT;\r\n }\r\n }\r\n );\r\n }\r\n }\r\n if (collections.length > 1) {\r\n type State = { collIndex: number, iterator?: Iterator, array?: ArrayLike, arrIndex: number };\r\n return new StreamImpl(\r\n () => ({ collIndex: 0, arrIndex: 0 }),\r\n (state) => {\r\n do {\r\n if (state.iterator) {\r\n const next = state.iterator.next();\r\n if (!next.done) {\r\n return next;\r\n }\r\n state.iterator = undefined;\r\n }\r\n if (state.array) {\r\n if (state.arrIndex < state.array.length) {\r\n return { done: false, value: state.array[state.arrIndex++] };\r\n }\r\n state.array = undefined;\r\n state.arrIndex = 0;\r\n }\r\n if (state.collIndex < collections.length) {\r\n const collection = collections[state.collIndex++];\r\n if (isIterable(collection)) {\r\n state.iterator = collection[Symbol.iterator]();\r\n } else if (collection && typeof collection.length === 'number') {\r\n state.array = collection;\r\n }\r\n }\r\n } while (state.iterator || state.array || state.collIndex < collections.length);\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n return EMPTY_STREAM;\r\n}\r\n\r\n/**\r\n * A tree iterator adds the ability to prune the current iteration.\r\n */\r\nexport interface TreeIterator extends IterableIterator {\r\n /**\r\n * Skip the whole subtree below the last returned element. The iteration continues as if that\r\n * element had no children.\r\n */\r\n prune(): void\r\n}\r\n\r\n/**\r\n * A tree stream is used to stream the elements of a tree, for example an AST or CST.\r\n */\r\nexport interface TreeStream extends Stream {\r\n iterator(): TreeIterator\r\n}\r\n\r\n/**\r\n * The default implementation of `TreeStream` takes a root element and a function that computes the\r\n * children of its argument. Whether the root node included in the stream is controlled with the\r\n * `includeRoot` option, which defaults to `false`.\r\n */\r\nexport class TreeStreamImpl\r\n extends StreamImpl<{ iterators: Array>, pruned: boolean }, T>\r\n implements TreeStream {\r\n\r\n constructor(root: T, children: (node: T) => Iterable, options?: { includeRoot?: boolean }) {\r\n super(\r\n () => ({\r\n iterators: options?.includeRoot ? [[root][Symbol.iterator]()] : [children(root)[Symbol.iterator]()],\r\n pruned: false\r\n }),\r\n state => {\r\n if (state.pruned) {\r\n state.iterators.pop();\r\n state.pruned = false;\r\n }\r\n while (state.iterators.length > 0) {\r\n const iterator = state.iterators[state.iterators.length - 1];\r\n const next = iterator.next();\r\n if (next.done) {\r\n state.iterators.pop();\r\n } else {\r\n state.iterators.push(children(next.value)[Symbol.iterator]());\r\n return next;\r\n }\r\n }\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n\r\n override iterator(): TreeIterator {\r\n const iterator = {\r\n state: this.startFn(),\r\n next: () => this.nextFn(iterator.state),\r\n prune: () => {\r\n iterator.state.pruned = true;\r\n },\r\n [Symbol.iterator]: () => iterator\r\n };\r\n return iterator;\r\n }\r\n}\r\n\r\n/**\r\n * A set of utility functions that reduce a stream to a single value.\r\n */\r\nexport namespace Reduction {\r\n\r\n /**\r\n * Compute the sum of a number stream.\r\n */\r\n export function sum(stream: Stream): number {\r\n return stream.reduce((a, b) => a + b, 0);\r\n }\r\n\r\n /**\r\n * Compute the product of a number stream.\r\n */\r\n export function product(stream: Stream): number {\r\n return stream.reduce((a, b) => a * b, 0);\r\n }\r\n\r\n /**\r\n * Compute the minimum of a number stream. Returns `undefined` if the stream is empty.\r\n */\r\n export function min(stream: Stream): number | undefined {\r\n return stream.reduce((a, b) => Math.min(a, b));\r\n }\r\n\r\n /**\r\n * Compute the maximum of a number stream. Returns `undefined` if the stream is empty.\r\n */\r\n export function max(stream: Stream): number | undefined {\r\n return stream.reduce((a, b) => Math.max(a, b));\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021-2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { assertUnreachable } from '../utils/errors.js';\r\nimport * as ast from '../languages/generated/ast.js';\r\nimport type { AstNode, CstNode } from '../syntax-tree.js';\r\nimport { isCompositeCstNode } from '../syntax-tree.js';\r\nimport { getContainerOfType, streamAllContents } from './ast-utils.js';\r\nimport { streamCst } from './cst-utils.js';\r\nimport { escapeRegExp, isWhitespace } from './regexp-utils.js';\r\n\r\n/**\r\n * Returns the entry rule of the given grammar, if any. If the grammar file does not contain an entry rule,\r\n * the result is `undefined`.\r\n */\r\nexport function getEntryRule(grammar: ast.Grammar): ast.ParserRule | undefined {\r\n return grammar.rules.find(e => ast.isParserRule(e) && e.entry) as ast.ParserRule;\r\n}\r\n\r\n/**\r\n * Returns all hidden terminal rules of the given grammar, if any.\r\n */\r\nexport function getHiddenRules(grammar: ast.Grammar) {\r\n return grammar.rules.filter((e): e is ast.TerminalRule => ast.isTerminalRule(e) && e.hidden);\r\n}\r\n\r\n/**\r\n * Returns all rules that can be reached from the topmost rules of the specified grammar (entry and hidden terminal rules).\r\n *\r\n * @param grammar The grammar that contains all rules\r\n * @param allTerminals Whether or not to include terminals that are referenced only by other terminals\r\n * @returns A list of referenced parser and terminal rules. If the grammar contains no entry rule,\r\n * this function returns all rules of the specified grammar.\r\n */\r\nexport function getAllReachableRules(grammar: ast.Grammar, allTerminals: boolean): Set {\r\n const ruleNames = new Set();\r\n const entryRule = getEntryRule(grammar);\r\n if (!entryRule) {\r\n return new Set(grammar.rules);\r\n }\r\n\r\n const topMostRules = [entryRule as ast.AbstractRule].concat(getHiddenRules(grammar));\r\n for (const rule of topMostRules) {\r\n ruleDfs(rule, ruleNames, allTerminals);\r\n }\r\n\r\n const rules = new Set();\r\n for (const rule of grammar.rules) {\r\n if (ruleNames.has(rule.name) || (ast.isTerminalRule(rule) && rule.hidden)) {\r\n rules.add(rule);\r\n }\r\n }\r\n return rules;\r\n}\r\n\r\nfunction ruleDfs(rule: ast.AbstractRule, visitedSet: Set, allTerminals: boolean): void {\r\n visitedSet.add(rule.name);\r\n streamAllContents(rule).forEach(node => {\r\n if (ast.isRuleCall(node) || (allTerminals && ast.isTerminalRuleCall(node))) {\r\n const refRule = node.rule.ref;\r\n if (refRule && !visitedSet.has(refRule.name)) {\r\n ruleDfs(refRule, visitedSet, allTerminals);\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Determines the grammar expression used to parse a cross-reference (usually a reference to a terminal rule).\r\n * A cross-reference can declare this expression explicitly in the form `[Type : Terminal]`, but if `Terminal`\r\n * is omitted, this function attempts to infer it from the name of the referenced `Type` (using `findNameAssignment`).\r\n *\r\n * Returns the grammar expression used to parse the given cross-reference, or `undefined` if it is not declared\r\n * and cannot be inferred.\r\n */\r\nexport function getCrossReferenceTerminal(crossRef: ast.CrossReference): ast.AbstractElement | undefined {\r\n if (crossRef.terminal) {\r\n return crossRef.terminal;\r\n } else if (crossRef.type.ref) {\r\n const nameAssigment = findNameAssignment(crossRef.type.ref);\r\n return nameAssigment?.terminal;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Determines whether the given terminal rule represents a comment. This is true if the rule is marked\r\n * as `hidden` and it does not match white space. This means every hidden token (i.e. excluded from the AST)\r\n * that contains visible characters is considered a comment.\r\n */\r\nexport function isCommentTerminal(terminalRule: ast.TerminalRule): boolean {\r\n return terminalRule.hidden && !isWhitespace(terminalRegex(terminalRule));\r\n}\r\n\r\n/**\r\n * Find all CST nodes within the given node that contribute to the specified property.\r\n *\r\n * @param node A CST node in which to look for property assignments. If this is undefined, the result is an empty array.\r\n * @param property A property name of the constructed AST node. If this is undefined, the result is an empty array.\r\n */\r\nexport function findNodesForProperty(node: CstNode | undefined, property: string | undefined): CstNode[] {\r\n if (!node || !property) {\r\n return [];\r\n }\r\n return findNodesForPropertyInternal(node, property, node.astNode, true);\r\n}\r\n\r\n/**\r\n * Find a single CST node within the given node that contributes to the specified property.\r\n *\r\n * @param node A CST node in which to look for property assignments. If this is undefined, the result is `undefined`.\r\n * @param property A property name of the constructed AST node. If this is undefined, the result is `undefined`.\r\n * @param index If no index is specified or the index is less than zero, the first found node is returned. If the\r\n * specified index exceeds the number of assignments to the property, the last found node is returned. Otherwise,\r\n * the node with the specified index is returned.\r\n */\r\nexport function findNodeForProperty(node: CstNode | undefined, property: string | undefined, index?: number): CstNode | undefined {\r\n if (!node || !property) {\r\n return undefined;\r\n }\r\n const nodes = findNodesForPropertyInternal(node, property, node.astNode, true);\r\n if (nodes.length === 0) {\r\n return undefined;\r\n }\r\n if (index !== undefined) {\r\n index = Math.max(0, Math.min(index, nodes.length - 1));\r\n } else {\r\n index = 0;\r\n }\r\n return nodes[index];\r\n}\r\n\r\nfunction findNodesForPropertyInternal(node: CstNode, property: string, element: AstNode | undefined, first: boolean): CstNode[] {\r\n if (!first) {\r\n const nodeFeature = getContainerOfType(node.grammarSource, ast.isAssignment);\r\n if (nodeFeature && nodeFeature.feature === property) {\r\n return [node];\r\n }\r\n }\r\n if (isCompositeCstNode(node) && node.astNode === element) {\r\n return node.content.flatMap(e => findNodesForPropertyInternal(e, property, element, false));\r\n }\r\n return [];\r\n}\r\n\r\n/**\r\n * Find all CST nodes within the given node that correspond to the specified keyword.\r\n *\r\n * @param node A CST node in which to look for keywords. If this is undefined, the result is an empty array.\r\n * @param keyword A keyword as specified in the grammar.\r\n */\r\nexport function findNodesForKeyword(node: CstNode | undefined, keyword: string): CstNode[] {\r\n if (!node) {\r\n return [];\r\n }\r\n return findNodesForKeywordInternal(node, keyword, node?.astNode);\r\n}\r\n\r\n/**\r\n * Find a single CST node within the given node that corresponds to the specified keyword.\r\n *\r\n * @param node A CST node in which to look for keywords. If this is undefined, the result is `undefined`.\r\n * @param keyword A keyword as specified in the grammar.\r\n * @param index If no index is specified or the index is less than zero, the first found node is returned. If the\r\n * specified index exceeds the number of keyword occurrences, the last found node is returned. Otherwise,\r\n * the node with the specified index is returned.\r\n */\r\nexport function findNodeForKeyword(node: CstNode | undefined, keyword: string, index?: number): CstNode | undefined {\r\n if (!node) {\r\n return undefined;\r\n }\r\n const nodes = findNodesForKeywordInternal(node, keyword, node?.astNode);\r\n if (nodes.length === 0) {\r\n return undefined;\r\n }\r\n if (index !== undefined) {\r\n index = Math.max(0, Math.min(index, nodes.length - 1));\r\n } else {\r\n index = 0;\r\n }\r\n return nodes[index];\r\n}\r\n\r\nexport function findNodesForKeywordInternal(node: CstNode, keyword: string, element: AstNode | undefined): CstNode[] {\r\n if (node.astNode !== element) {\r\n return [];\r\n }\r\n if (ast.isKeyword(node.grammarSource) && node.grammarSource.value === keyword) {\r\n return [node];\r\n }\r\n const treeIterator = streamCst(node).iterator();\r\n let result: IteratorResult;\r\n const keywordNodes: CstNode[] = [];\r\n do {\r\n result = treeIterator.next();\r\n if (!result.done) {\r\n const childNode = result.value;\r\n if (childNode.astNode === element) {\r\n if (ast.isKeyword(childNode.grammarSource) && childNode.grammarSource.value === keyword) {\r\n keywordNodes.push(childNode);\r\n }\r\n } else {\r\n treeIterator.prune();\r\n }\r\n }\r\n } while (!result.done);\r\n return keywordNodes;\r\n}\r\n\r\n/**\r\n * If the given CST node was parsed in the context of a property assignment, the respective `Assignment` grammar\r\n * node is returned. If no assignment is found, the result is `undefined`.\r\n *\r\n * @param cstNode A CST node for which to find a property assignment.\r\n */\r\nexport function findAssignment(cstNode: CstNode): ast.Assignment | undefined {\r\n const astNode = cstNode.astNode;\r\n // Only search until the ast node of the parent cst node is no longer the original ast node\r\n // This would make us jump to a preceding rule call, which contains only unrelated assignments\r\n while (astNode === cstNode.container?.astNode) {\r\n const assignment = getContainerOfType(cstNode.grammarSource, ast.isAssignment);\r\n if (assignment) {\r\n return assignment;\r\n }\r\n cstNode = cstNode.container;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Find an assignment to the `name` property for the given grammar type. This requires the `type` to be inferred\r\n * from a parser rule, and that rule must contain an assignment to the `name` property. In all other cases,\r\n * this function returns `undefined`.\r\n */\r\nexport function findNameAssignment(type: ast.AbstractType): ast.Assignment | undefined {\r\n let startNode: AstNode = type;\r\n if (ast.isInferredType(startNode)) {\r\n // for inferred types, the location to start searching for the name-assignment is different\r\n if (ast.isAction(startNode.$container)) {\r\n // a type which is explicitly inferred by an action: investigate the sibbling of the Action node, i.e. start searching at the Action's parent\r\n startNode = startNode.$container.$container!;\r\n } else if (ast.isParserRule(startNode.$container)) {\r\n // investigate the parser rule with the explicitly inferred type\r\n startNode = startNode.$container;\r\n } else {\r\n assertUnreachable(startNode.$container);\r\n }\r\n }\r\n return findNameAssignmentInternal(type, startNode, new Map());\r\n}\r\n\r\nfunction findNameAssignmentInternal(type: ast.AbstractType, startNode: AstNode, cache: Map): ast.Assignment | undefined {\r\n // the cache is only required to prevent infinite loops\r\n function go(node: AstNode, refType: ast.AbstractType): ast.Assignment | undefined {\r\n let childAssignment: ast.Assignment | undefined = undefined;\r\n const parentAssignment = getContainerOfType(node, ast.isAssignment);\r\n // No parent assignment implies unassigned rule call\r\n if (!parentAssignment) {\r\n childAssignment = findNameAssignmentInternal(refType, refType, cache);\r\n }\r\n cache.set(type, childAssignment);\r\n return childAssignment;\r\n }\r\n\r\n if (cache.has(type)) {\r\n return cache.get(type);\r\n }\r\n cache.set(type, undefined);\r\n for (const node of streamAllContents(startNode)) {\r\n if (ast.isAssignment(node) && node.feature.toLowerCase() === 'name') {\r\n cache.set(type, node);\r\n return node;\r\n } else if (ast.isRuleCall(node) && ast.isParserRule(node.rule.ref)) {\r\n return go(node, node.rule.ref);\r\n } else if (ast.isSimpleType(node) && node.typeRef?.ref) {\r\n return go(node, node.typeRef.ref);\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getActionAtElement(element: ast.AbstractElement): ast.Action | undefined {\r\n const parent = element.$container;\r\n if (ast.isGroup(parent)) {\r\n const elements = parent.elements;\r\n const index = elements.indexOf(element);\r\n for (let i = index - 1; i >= 0; i--) {\r\n const item = elements[i];\r\n if (ast.isAction(item)) {\r\n return item;\r\n } else {\r\n const action = streamAllContents(elements[i]).find(ast.isAction);\r\n if (action) {\r\n return action;\r\n }\r\n }\r\n }\r\n }\r\n if (ast.isAbstractElement(parent)) {\r\n return getActionAtElement(parent);\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport type Cardinality = '?' | '*' | '+' | undefined;\r\nexport type Operator = '=' | '+=' | '?=' | undefined;\r\n\r\nexport function isOptionalCardinality(cardinality?: Cardinality, element?: ast.AbstractElement): boolean {\r\n return cardinality === '?' || cardinality === '*' || (ast.isGroup(element) && Boolean(element.guardCondition));\r\n}\r\n\r\nexport function isArrayCardinality(cardinality?: Cardinality): boolean {\r\n return cardinality === '*' || cardinality === '+';\r\n}\r\n\r\nexport function isArrayOperator(operator?: Operator): boolean {\r\n return operator === '+=';\r\n}\r\n\r\n/**\r\n * Determines whether the given parser rule is a _data type rule_, meaning that it has a\r\n * primitive return type like `number`, `boolean`, etc.\r\n */\r\nexport function isDataTypeRule(rule: ast.ParserRule): boolean {\r\n return isDataTypeRuleInternal(rule, new Set());\r\n}\r\n\r\nfunction isDataTypeRuleInternal(rule: ast.ParserRule, visited: Set): boolean {\r\n if (visited.has(rule)) {\r\n return true;\r\n } else {\r\n visited.add(rule);\r\n }\r\n for (const node of streamAllContents(rule)) {\r\n if (ast.isRuleCall(node)) {\r\n if (!node.rule.ref) {\r\n // RuleCall to unresolved rule. Don't assume `rule` is a DataType rule.\r\n return false;\r\n }\r\n if (ast.isParserRule(node.rule.ref) && !isDataTypeRuleInternal(node.rule.ref, visited)) {\r\n return false;\r\n }\r\n } else if (ast.isAssignment(node)) {\r\n return false;\r\n } else if (ast.isAction(node)) {\r\n return false;\r\n }\r\n }\r\n return Boolean(rule.definition);\r\n}\r\n\r\nexport function isDataType(type: ast.Type): boolean {\r\n return isDataTypeInternal(type.type, new Set());\r\n}\r\n\r\nfunction isDataTypeInternal(type: ast.TypeDefinition, visited: Set): boolean {\r\n if (visited.has(type)) {\r\n return true;\r\n } else {\r\n visited.add(type);\r\n }\r\n if (ast.isArrayType(type)) {\r\n return false;\r\n } else if (ast.isReferenceType(type)) {\r\n return false;\r\n } else if (ast.isUnionType(type)) {\r\n return type.types.every(e => isDataTypeInternal(e, visited));\r\n } else if (ast.isSimpleType(type)) {\r\n if (type.primitiveType !== undefined) {\r\n return true;\r\n } else if (type.stringType !== undefined) {\r\n return true;\r\n } else if (type.typeRef !== undefined) {\r\n const ref = type.typeRef.ref;\r\n if (ast.isType(ref)) {\r\n return isDataTypeInternal(ref.type, visited);\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nexport function getExplicitRuleType(rule: ast.ParserRule): string | undefined {\r\n if (rule.inferredType) {\r\n return rule.inferredType.name;\r\n } else if (rule.dataType) {\r\n return rule.dataType;\r\n } else if (rule.returnType) {\r\n const refType = rule.returnType.ref;\r\n if (refType) {\r\n // check if we need to check Action as return type\r\n if (ast.isParserRule(refType)) {\r\n return refType.name;\r\n } else if (ast.isInterface(refType) || ast.isType(refType)) {\r\n return refType.name;\r\n }\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getTypeName(type: ast.AbstractType | ast.Action): string {\r\n if (ast.isParserRule(type)) {\r\n return isDataTypeRule(type) ? type.name : getExplicitRuleType(type) ?? type.name;\r\n } else if (ast.isInterface(type) || ast.isType(type) || ast.isReturnType(type)) {\r\n return type.name;\r\n } else if (ast.isAction(type)) {\r\n const actionType = getActionType(type);\r\n if (actionType) {\r\n return actionType;\r\n }\r\n } else if (ast.isInferredType(type)) {\r\n return type.name;\r\n }\r\n throw new Error('Cannot get name of Unknown Type');\r\n}\r\n\r\nexport function getActionType(action: ast.Action): string | undefined {\r\n if (action.inferredType) {\r\n return action.inferredType.name;\r\n } else if (action.type?.ref) {\r\n return getTypeName(action.type.ref);\r\n }\r\n return undefined; // not inferring and not referencing a valid type\r\n}\r\n\r\n/**\r\n * This function is used at development time (for code generation and the internal type system) to get the type of the AST node produced by the given rule.\r\n * For data type rules, the name of the rule is returned,\r\n * e.g. \"INT_value returns number: MY_INT;\" returns \"INT_value\".\r\n * @param rule the given rule\r\n * @returns the name of the AST node type of the rule\r\n */\r\nexport function getRuleTypeName(rule: ast.AbstractRule): string {\r\n if (ast.isTerminalRule(rule)) {\r\n return rule.type?.name ?? 'string';\r\n } else {\r\n return isDataTypeRule(rule) ? rule.name : getExplicitRuleType(rule) ?? rule.name;\r\n }\r\n}\r\n\r\n/**\r\n * This function is used at runtime to get the actual type of the values produced by the given rule at runtime.\r\n * For data type rules, the name of the declared return type of the rule is returned (if any),\r\n * e.g. \"INT_value returns number: MY_INT;\" returns \"number\".\r\n * @param rule the given rule\r\n * @returns the name of the type of the produced values of the rule at runtime\r\n */\r\nexport function getRuleType(rule: ast.AbstractRule): string {\r\n if (ast.isTerminalRule(rule)) {\r\n return rule.type?.name ?? 'string';\r\n } else {\r\n return getExplicitRuleType(rule) ?? rule.name;\r\n }\r\n}\r\n\r\nexport function terminalRegex(terminalRule: ast.TerminalRule): RegExp {\r\n const flags: Flags = {\r\n s: false,\r\n i: false,\r\n u: false\r\n };\r\n const source = abstractElementToRegex(terminalRule.definition, flags);\r\n const flagText = Object.entries(flags).filter(([, value]) => value).map(([name]) => name).join('');\r\n return new RegExp(source, flagText);\r\n}\r\n\r\n// Using [\\s\\S]* allows to match everything, compared to . which doesn't match line terminators\r\nconst WILDCARD = /[\\s\\S]/.source;\r\n\r\ntype Flags = {\r\n s: boolean;\r\n i: boolean;\r\n u: boolean;\r\n}\r\n\r\nfunction abstractElementToRegex(element: ast.AbstractElement, flags?: Flags): string {\r\n if (ast.isTerminalAlternatives(element)) {\r\n return terminalAlternativesToRegex(element);\r\n } else if (ast.isTerminalGroup(element)) {\r\n return terminalGroupToRegex(element);\r\n } else if (ast.isCharacterRange(element)) {\r\n return characterRangeToRegex(element);\r\n } else if (ast.isTerminalRuleCall(element)) {\r\n const rule = element.rule.ref;\r\n if (!rule) {\r\n throw new Error('Missing rule reference.');\r\n }\r\n return withCardinality(abstractElementToRegex(rule.definition), {\r\n cardinality: element.cardinality,\r\n lookahead: element.lookahead\r\n });\r\n } else if (ast.isNegatedToken(element)) {\r\n return negateTokenToRegex(element);\r\n } else if (ast.isUntilToken(element)) {\r\n return untilTokenToRegex(element);\r\n } else if (ast.isRegexToken(element)) {\r\n const lastSlash = element.regex.lastIndexOf('/');\r\n const source = element.regex.substring(1, lastSlash);\r\n const regexFlags = element.regex.substring(lastSlash + 1);\r\n if (flags) {\r\n flags.i = regexFlags.includes('i');\r\n flags.s = regexFlags.includes('s');\r\n flags.u = regexFlags.includes('u');\r\n }\r\n return withCardinality(source, {\r\n cardinality: element.cardinality,\r\n lookahead: element.lookahead,\r\n wrap: false\r\n });\r\n } else if (ast.isWildcard(element)) {\r\n return withCardinality(WILDCARD, {\r\n cardinality: element.cardinality,\r\n lookahead: element.lookahead\r\n });\r\n } else {\r\n throw new Error(`Invalid terminal element: ${element?.$type}`);\r\n }\r\n}\r\n\r\nfunction terminalAlternativesToRegex(alternatives: ast.TerminalAlternatives): string {\r\n return withCardinality(alternatives.elements.map(e => abstractElementToRegex(e)).join('|'), {\r\n cardinality: alternatives.cardinality,\r\n lookahead: alternatives.lookahead\r\n });\r\n}\r\n\r\nfunction terminalGroupToRegex(group: ast.TerminalGroup): string {\r\n return withCardinality(group.elements.map(e => abstractElementToRegex(e)).join(''), {\r\n cardinality: group.cardinality,\r\n lookahead: group.lookahead\r\n });\r\n}\r\n\r\nfunction untilTokenToRegex(until: ast.UntilToken): string {\r\n return withCardinality(`${WILDCARD}*?${abstractElementToRegex(until.terminal)}`, {\r\n cardinality: until.cardinality,\r\n lookahead: until.lookahead\r\n });\r\n}\r\n\r\nfunction negateTokenToRegex(negate: ast.NegatedToken): string {\r\n return withCardinality(`(?!${abstractElementToRegex(negate.terminal)})${WILDCARD}*?`, {\r\n cardinality: negate.cardinality,\r\n lookahead: negate.lookahead\r\n });\r\n}\r\n\r\nfunction characterRangeToRegex(range: ast.CharacterRange): string {\r\n if (range.right) {\r\n return withCardinality(`[${keywordToRegex(range.left)}-${keywordToRegex(range.right)}]`, {\r\n cardinality: range.cardinality,\r\n lookahead: range.lookahead,\r\n wrap: false\r\n });\r\n }\r\n return withCardinality(keywordToRegex(range.left), {\r\n cardinality: range.cardinality,\r\n lookahead: range.lookahead,\r\n wrap: false\r\n });\r\n}\r\n\r\nfunction keywordToRegex(keyword: ast.Keyword): string {\r\n return escapeRegExp(keyword.value);\r\n}\r\n\r\nfunction withCardinality(regex: string, options: {\r\n cardinality?: string\r\n wrap?: boolean\r\n lookahead?: string\r\n}): string {\r\n if (options.wrap !== false || options.lookahead) {\r\n regex = `(${options.lookahead ?? ''}${regex})`;\r\n }\r\n if (options.cardinality) {\r\n return `${regex}${options.cardinality}`;\r\n }\r\n return regex;\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { CstNode } from '../syntax-tree.js';\r\n\r\nexport class ErrorWithLocation extends Error {\r\n constructor(node: CstNode | undefined, message: string) {\r\n super(node ? `${message} at ${node.range.start.line}:${node.range.start.character}` : message);\r\n }\r\n}\r\n\r\nexport function assertUnreachable(_: never): never {\r\n throw new Error('Error! The input value was not handled.');\r\n}\r\n", "/******************************************************************************\r\n * This file was generated by langium-cli 3.3.0.\r\n * DO NOT EDIT MANUALLY!\r\n ******************************************************************************/\r\n\r\n/* eslint-disable */\r\nimport type { AstNode, Reference, ReferenceInfo, TypeMetaData } from '../../syntax-tree.js';\r\nimport { AbstractAstReflection } from '../../syntax-tree.js';\r\n\r\nexport const LangiumGrammarTerminals = {\r\n ID: /\\^?[_a-zA-Z][\\w_]*/,\r\n STRING: /\"(\\\\.|[^\"\\\\])*\"|'(\\\\.|[^'\\\\])*'/,\r\n NUMBER: /NaN|-?((\\d*\\.\\d+|\\d+)([Ee][+-]?\\d+)?|Infinity)/,\r\n RegexLiteral: /\\/(?![*+?])(?:[^\\r\\n\\[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*\\])+\\/[a-z]*/,\r\n WS: /\\s+/,\r\n ML_COMMENT: /\\/\\*[\\s\\S]*?\\*\\//,\r\n SL_COMMENT: /\\/\\/[^\\n\\r]*/,\r\n};\r\n\r\nexport type LangiumGrammarTerminalNames = keyof typeof LangiumGrammarTerminals;\r\n\r\nexport type LangiumGrammarKeywordNames = \r\n | \"!\"\r\n | \"&\"\r\n | \"(\"\r\n | \")\"\r\n | \"*\"\r\n | \"+\"\r\n | \"+=\"\r\n | \",\"\r\n | \"->\"\r\n | \".\"\r\n | \"..\"\r\n | \":\"\r\n | \";\"\r\n | \"<\"\r\n | \"=\"\r\n | \"=>\"\r\n | \">\"\r\n | \"?\"\r\n | \"?!\"\r\n | \"?;\r\n}\r\n\r\nexport const ArrayLiteral = 'ArrayLiteral';\r\n\r\nexport function isArrayLiteral(item: unknown): item is ArrayLiteral {\r\n return reflection.isInstance(item, ArrayLiteral);\r\n}\r\n\r\nexport interface ArrayType extends AstNode {\r\n readonly $container: ArrayType | ReferenceType | Type | TypeAttribute | UnionType;\r\n readonly $type: 'ArrayType';\r\n elementType: TypeDefinition;\r\n}\r\n\r\nexport const ArrayType = 'ArrayType';\r\n\r\nexport function isArrayType(item: unknown): item is ArrayType {\r\n return reflection.isInstance(item, ArrayType);\r\n}\r\n\r\nexport interface BooleanLiteral extends AstNode {\r\n readonly $container: ArrayLiteral | Conjunction | Disjunction | Group | NamedArgument | Negation | TypeAttribute;\r\n readonly $type: 'BooleanLiteral';\r\n true: boolean;\r\n}\r\n\r\nexport const BooleanLiteral = 'BooleanLiteral';\r\n\r\nexport function isBooleanLiteral(item: unknown): item is BooleanLiteral {\r\n return reflection.isInstance(item, BooleanLiteral);\r\n}\r\n\r\nexport interface Conjunction extends AstNode {\r\n readonly $container: Conjunction | Disjunction | Group | NamedArgument | Negation;\r\n readonly $type: 'Conjunction';\r\n left: Condition;\r\n right: Condition;\r\n}\r\n\r\nexport const Conjunction = 'Conjunction';\r\n\r\nexport function isConjunction(item: unknown): item is Conjunction {\r\n return reflection.isInstance(item, Conjunction);\r\n}\r\n\r\nexport interface Disjunction extends AstNode {\r\n readonly $container: Conjunction | Disjunction | Group | NamedArgument | Negation;\r\n readonly $type: 'Disjunction';\r\n left: Condition;\r\n right: Condition;\r\n}\r\n\r\nexport const Disjunction = 'Disjunction';\r\n\r\nexport function isDisjunction(item: unknown): item is Disjunction {\r\n return reflection.isInstance(item, Disjunction);\r\n}\r\n\r\nexport interface Grammar extends AstNode {\r\n readonly $type: 'Grammar';\r\n definesHiddenTokens: boolean;\r\n hiddenTokens: Array>;\r\n imports: Array;\r\n interfaces: Array;\r\n isDeclared: boolean;\r\n name?: string;\r\n rules: Array;\r\n types: Array;\r\n usedGrammars: Array>;\r\n}\r\n\r\nexport const Grammar = 'Grammar';\r\n\r\nexport function isGrammar(item: unknown): item is Grammar {\r\n return reflection.isInstance(item, Grammar);\r\n}\r\n\r\nexport interface GrammarImport extends AstNode {\r\n readonly $container: Grammar;\r\n readonly $type: 'GrammarImport';\r\n path: string;\r\n}\r\n\r\nexport const GrammarImport = 'GrammarImport';\r\n\r\nexport function isGrammarImport(item: unknown): item is GrammarImport {\r\n return reflection.isInstance(item, GrammarImport);\r\n}\r\n\r\nexport interface InferredType extends AstNode {\r\n readonly $container: Action | ParserRule;\r\n readonly $type: 'InferredType';\r\n name: string;\r\n}\r\n\r\nexport const InferredType = 'InferredType';\r\n\r\nexport function isInferredType(item: unknown): item is InferredType {\r\n return reflection.isInstance(item, InferredType);\r\n}\r\n\r\nexport interface Interface extends AstNode {\r\n readonly $container: Grammar;\r\n readonly $type: 'Interface';\r\n attributes: Array;\r\n name: string;\r\n superTypes: Array>;\r\n}\r\n\r\nexport const Interface = 'Interface';\r\n\r\nexport function isInterface(item: unknown): item is Interface {\r\n return reflection.isInstance(item, Interface);\r\n}\r\n\r\nexport interface NamedArgument extends AstNode {\r\n readonly $container: RuleCall;\r\n readonly $type: 'NamedArgument';\r\n calledByName: boolean;\r\n parameter?: Reference;\r\n value: Condition;\r\n}\r\n\r\nexport const NamedArgument = 'NamedArgument';\r\n\r\nexport function isNamedArgument(item: unknown): item is NamedArgument {\r\n return reflection.isInstance(item, NamedArgument);\r\n}\r\n\r\nexport interface Negation extends AstNode {\r\n readonly $container: Conjunction | Disjunction | Group | NamedArgument | Negation;\r\n readonly $type: 'Negation';\r\n value: Condition;\r\n}\r\n\r\nexport const Negation = 'Negation';\r\n\r\nexport function isNegation(item: unknown): item is Negation {\r\n return reflection.isInstance(item, Negation);\r\n}\r\n\r\nexport interface NumberLiteral extends AstNode {\r\n readonly $container: ArrayLiteral | TypeAttribute;\r\n readonly $type: 'NumberLiteral';\r\n value: number;\r\n}\r\n\r\nexport const NumberLiteral = 'NumberLiteral';\r\n\r\nexport function isNumberLiteral(item: unknown): item is NumberLiteral {\r\n return reflection.isInstance(item, NumberLiteral);\r\n}\r\n\r\nexport interface Parameter extends AstNode {\r\n readonly $container: ParserRule;\r\n readonly $type: 'Parameter';\r\n name: string;\r\n}\r\n\r\nexport const Parameter = 'Parameter';\r\n\r\nexport function isParameter(item: unknown): item is Parameter {\r\n return reflection.isInstance(item, Parameter);\r\n}\r\n\r\nexport interface ParameterReference extends AstNode {\r\n readonly $container: Conjunction | Disjunction | Group | NamedArgument | Negation;\r\n readonly $type: 'ParameterReference';\r\n parameter: Reference;\r\n}\r\n\r\nexport const ParameterReference = 'ParameterReference';\r\n\r\nexport function isParameterReference(item: unknown): item is ParameterReference {\r\n return reflection.isInstance(item, ParameterReference);\r\n}\r\n\r\nexport interface ParserRule extends AstNode {\r\n readonly $container: Grammar;\r\n readonly $type: 'ParserRule';\r\n dataType?: PrimitiveType;\r\n definesHiddenTokens: boolean;\r\n definition: AbstractElement;\r\n entry: boolean;\r\n fragment: boolean;\r\n hiddenTokens: Array>;\r\n inferredType?: InferredType;\r\n name: string;\r\n parameters: Array;\r\n returnType?: Reference;\r\n wildcard: boolean;\r\n}\r\n\r\nexport const ParserRule = 'ParserRule';\r\n\r\nexport function isParserRule(item: unknown): item is ParserRule {\r\n return reflection.isInstance(item, ParserRule);\r\n}\r\n\r\nexport interface ReferenceType extends AstNode {\r\n readonly $container: ArrayType | ReferenceType | Type | TypeAttribute | UnionType;\r\n readonly $type: 'ReferenceType';\r\n referenceType: TypeDefinition;\r\n}\r\n\r\nexport const ReferenceType = 'ReferenceType';\r\n\r\nexport function isReferenceType(item: unknown): item is ReferenceType {\r\n return reflection.isInstance(item, ReferenceType);\r\n}\r\n\r\nexport interface ReturnType extends AstNode {\r\n readonly $container: TerminalRule;\r\n readonly $type: 'ReturnType';\r\n name: PrimitiveType | string;\r\n}\r\n\r\nexport const ReturnType = 'ReturnType';\r\n\r\nexport function isReturnType(item: unknown): item is ReturnType {\r\n return reflection.isInstance(item, ReturnType);\r\n}\r\n\r\nexport interface SimpleType extends AstNode {\r\n readonly $container: ArrayType | ReferenceType | Type | TypeAttribute | UnionType;\r\n readonly $type: 'SimpleType';\r\n primitiveType?: PrimitiveType;\r\n stringType?: string;\r\n typeRef?: Reference;\r\n}\r\n\r\nexport const SimpleType = 'SimpleType';\r\n\r\nexport function isSimpleType(item: unknown): item is SimpleType {\r\n return reflection.isInstance(item, SimpleType);\r\n}\r\n\r\nexport interface StringLiteral extends AstNode {\r\n readonly $container: ArrayLiteral | TypeAttribute;\r\n readonly $type: 'StringLiteral';\r\n value: string;\r\n}\r\n\r\nexport const StringLiteral = 'StringLiteral';\r\n\r\nexport function isStringLiteral(item: unknown): item is StringLiteral {\r\n return reflection.isInstance(item, StringLiteral);\r\n}\r\n\r\nexport interface TerminalRule extends AstNode {\r\n readonly $container: Grammar;\r\n readonly $type: 'TerminalRule';\r\n definition: AbstractElement;\r\n fragment: boolean;\r\n hidden: boolean;\r\n name: string;\r\n type?: ReturnType;\r\n}\r\n\r\nexport const TerminalRule = 'TerminalRule';\r\n\r\nexport function isTerminalRule(item: unknown): item is TerminalRule {\r\n return reflection.isInstance(item, TerminalRule);\r\n}\r\n\r\nexport interface Type extends AstNode {\r\n readonly $container: Grammar;\r\n readonly $type: 'Type';\r\n name: string;\r\n type: TypeDefinition;\r\n}\r\n\r\nexport const Type = 'Type';\r\n\r\nexport function isType(item: unknown): item is Type {\r\n return reflection.isInstance(item, Type);\r\n}\r\n\r\nexport interface TypeAttribute extends AstNode {\r\n readonly $container: Interface;\r\n readonly $type: 'TypeAttribute';\r\n defaultValue?: ValueLiteral;\r\n isOptional: boolean;\r\n name: FeatureName;\r\n type: TypeDefinition;\r\n}\r\n\r\nexport const TypeAttribute = 'TypeAttribute';\r\n\r\nexport function isTypeAttribute(item: unknown): item is TypeAttribute {\r\n return reflection.isInstance(item, TypeAttribute);\r\n}\r\n\r\nexport interface UnionType extends AstNode {\r\n readonly $container: ArrayType | ReferenceType | Type | TypeAttribute | UnionType;\r\n readonly $type: 'UnionType';\r\n types: Array;\r\n}\r\n\r\nexport const UnionType = 'UnionType';\r\n\r\nexport function isUnionType(item: unknown): item is UnionType {\r\n return reflection.isInstance(item, UnionType);\r\n}\r\n\r\nexport interface Action extends AbstractElement {\r\n readonly $type: 'Action';\r\n feature?: FeatureName;\r\n inferredType?: InferredType;\r\n operator?: '+=' | '=';\r\n type?: Reference;\r\n}\r\n\r\nexport const Action = 'Action';\r\n\r\nexport function isAction(item: unknown): item is Action {\r\n return reflection.isInstance(item, Action);\r\n}\r\n\r\nexport interface Alternatives extends AbstractElement {\r\n readonly $type: 'Alternatives';\r\n elements: Array;\r\n}\r\n\r\nexport const Alternatives = 'Alternatives';\r\n\r\nexport function isAlternatives(item: unknown): item is Alternatives {\r\n return reflection.isInstance(item, Alternatives);\r\n}\r\n\r\nexport interface Assignment extends AbstractElement {\r\n readonly $type: 'Assignment';\r\n feature: FeatureName;\r\n operator: '+=' | '=' | '?=';\r\n terminal: AbstractElement;\r\n}\r\n\r\nexport const Assignment = 'Assignment';\r\n\r\nexport function isAssignment(item: unknown): item is Assignment {\r\n return reflection.isInstance(item, Assignment);\r\n}\r\n\r\nexport interface CharacterRange extends AbstractElement {\r\n readonly $type: 'CharacterRange';\r\n left: Keyword;\r\n right?: Keyword;\r\n}\r\n\r\nexport const CharacterRange = 'CharacterRange';\r\n\r\nexport function isCharacterRange(item: unknown): item is CharacterRange {\r\n return reflection.isInstance(item, CharacterRange);\r\n}\r\n\r\nexport interface CrossReference extends AbstractElement {\r\n readonly $type: 'CrossReference';\r\n deprecatedSyntax: boolean;\r\n terminal?: AbstractElement;\r\n type: Reference;\r\n}\r\n\r\nexport const CrossReference = 'CrossReference';\r\n\r\nexport function isCrossReference(item: unknown): item is CrossReference {\r\n return reflection.isInstance(item, CrossReference);\r\n}\r\n\r\nexport interface EndOfFile extends AbstractElement {\r\n readonly $type: 'EndOfFile';\r\n}\r\n\r\nexport const EndOfFile = 'EndOfFile';\r\n\r\nexport function isEndOfFile(item: unknown): item is EndOfFile {\r\n return reflection.isInstance(item, EndOfFile);\r\n}\r\n\r\nexport interface Group extends AbstractElement {\r\n readonly $type: 'Group';\r\n elements: Array;\r\n guardCondition?: Condition;\r\n}\r\n\r\nexport const Group = 'Group';\r\n\r\nexport function isGroup(item: unknown): item is Group {\r\n return reflection.isInstance(item, Group);\r\n}\r\n\r\nexport interface Keyword extends AbstractElement {\r\n readonly $container: CharacterRange;\r\n readonly $type: 'Keyword';\r\n value: string;\r\n}\r\n\r\nexport const Keyword = 'Keyword';\r\n\r\nexport function isKeyword(item: unknown): item is Keyword {\r\n return reflection.isInstance(item, Keyword);\r\n}\r\n\r\nexport interface NegatedToken extends AbstractElement {\r\n readonly $type: 'NegatedToken';\r\n terminal: AbstractElement;\r\n}\r\n\r\nexport const NegatedToken = 'NegatedToken';\r\n\r\nexport function isNegatedToken(item: unknown): item is NegatedToken {\r\n return reflection.isInstance(item, NegatedToken);\r\n}\r\n\r\nexport interface RegexToken extends AbstractElement {\r\n readonly $type: 'RegexToken';\r\n regex: string;\r\n}\r\n\r\nexport const RegexToken = 'RegexToken';\r\n\r\nexport function isRegexToken(item: unknown): item is RegexToken {\r\n return reflection.isInstance(item, RegexToken);\r\n}\r\n\r\nexport interface RuleCall extends AbstractElement {\r\n readonly $type: 'RuleCall';\r\n arguments: Array;\r\n rule: Reference;\r\n}\r\n\r\nexport const RuleCall = 'RuleCall';\r\n\r\nexport function isRuleCall(item: unknown): item is RuleCall {\r\n return reflection.isInstance(item, RuleCall);\r\n}\r\n\r\nexport interface TerminalAlternatives extends AbstractElement {\r\n readonly $type: 'TerminalAlternatives';\r\n elements: Array;\r\n}\r\n\r\nexport const TerminalAlternatives = 'TerminalAlternatives';\r\n\r\nexport function isTerminalAlternatives(item: unknown): item is TerminalAlternatives {\r\n return reflection.isInstance(item, TerminalAlternatives);\r\n}\r\n\r\nexport interface TerminalGroup extends AbstractElement {\r\n readonly $type: 'TerminalGroup';\r\n elements: Array;\r\n}\r\n\r\nexport const TerminalGroup = 'TerminalGroup';\r\n\r\nexport function isTerminalGroup(item: unknown): item is TerminalGroup {\r\n return reflection.isInstance(item, TerminalGroup);\r\n}\r\n\r\nexport interface TerminalRuleCall extends AbstractElement {\r\n readonly $type: 'TerminalRuleCall';\r\n rule: Reference;\r\n}\r\n\r\nexport const TerminalRuleCall = 'TerminalRuleCall';\r\n\r\nexport function isTerminalRuleCall(item: unknown): item is TerminalRuleCall {\r\n return reflection.isInstance(item, TerminalRuleCall);\r\n}\r\n\r\nexport interface UnorderedGroup extends AbstractElement {\r\n readonly $type: 'UnorderedGroup';\r\n elements: Array;\r\n}\r\n\r\nexport const UnorderedGroup = 'UnorderedGroup';\r\n\r\nexport function isUnorderedGroup(item: unknown): item is UnorderedGroup {\r\n return reflection.isInstance(item, UnorderedGroup);\r\n}\r\n\r\nexport interface UntilToken extends AbstractElement {\r\n readonly $type: 'UntilToken';\r\n terminal: AbstractElement;\r\n}\r\n\r\nexport const UntilToken = 'UntilToken';\r\n\r\nexport function isUntilToken(item: unknown): item is UntilToken {\r\n return reflection.isInstance(item, UntilToken);\r\n}\r\n\r\nexport interface Wildcard extends AbstractElement {\r\n readonly $type: 'Wildcard';\r\n}\r\n\r\nexport const Wildcard = 'Wildcard';\r\n\r\nexport function isWildcard(item: unknown): item is Wildcard {\r\n return reflection.isInstance(item, Wildcard);\r\n}\r\n\r\nexport type LangiumGrammarAstType = {\r\n AbstractElement: AbstractElement\r\n AbstractRule: AbstractRule\r\n AbstractType: AbstractType\r\n Action: Action\r\n Alternatives: Alternatives\r\n ArrayLiteral: ArrayLiteral\r\n ArrayType: ArrayType\r\n Assignment: Assignment\r\n BooleanLiteral: BooleanLiteral\r\n CharacterRange: CharacterRange\r\n Condition: Condition\r\n Conjunction: Conjunction\r\n CrossReference: CrossReference\r\n Disjunction: Disjunction\r\n EndOfFile: EndOfFile\r\n Grammar: Grammar\r\n GrammarImport: GrammarImport\r\n Group: Group\r\n InferredType: InferredType\r\n Interface: Interface\r\n Keyword: Keyword\r\n NamedArgument: NamedArgument\r\n NegatedToken: NegatedToken\r\n Negation: Negation\r\n NumberLiteral: NumberLiteral\r\n Parameter: Parameter\r\n ParameterReference: ParameterReference\r\n ParserRule: ParserRule\r\n ReferenceType: ReferenceType\r\n RegexToken: RegexToken\r\n ReturnType: ReturnType\r\n RuleCall: RuleCall\r\n SimpleType: SimpleType\r\n StringLiteral: StringLiteral\r\n TerminalAlternatives: TerminalAlternatives\r\n TerminalGroup: TerminalGroup\r\n TerminalRule: TerminalRule\r\n TerminalRuleCall: TerminalRuleCall\r\n Type: Type\r\n TypeAttribute: TypeAttribute\r\n TypeDefinition: TypeDefinition\r\n UnionType: UnionType\r\n UnorderedGroup: UnorderedGroup\r\n UntilToken: UntilToken\r\n ValueLiteral: ValueLiteral\r\n Wildcard: Wildcard\r\n}\r\n\r\nexport class LangiumGrammarAstReflection extends AbstractAstReflection {\r\n\r\n getAllTypes(): string[] {\r\n return [AbstractElement, AbstractRule, AbstractType, Action, Alternatives, ArrayLiteral, ArrayType, Assignment, BooleanLiteral, CharacterRange, Condition, Conjunction, CrossReference, Disjunction, EndOfFile, Grammar, GrammarImport, Group, InferredType, Interface, Keyword, NamedArgument, NegatedToken, Negation, NumberLiteral, Parameter, ParameterReference, ParserRule, ReferenceType, RegexToken, ReturnType, RuleCall, SimpleType, StringLiteral, TerminalAlternatives, TerminalGroup, TerminalRule, TerminalRuleCall, Type, TypeAttribute, TypeDefinition, UnionType, UnorderedGroup, UntilToken, ValueLiteral, Wildcard];\r\n }\r\n\r\n protected override computeIsSubtype(subtype: string, supertype: string): boolean {\r\n switch (subtype) {\r\n case Action:\r\n case Alternatives:\r\n case Assignment:\r\n case CharacterRange:\r\n case CrossReference:\r\n case EndOfFile:\r\n case Group:\r\n case Keyword:\r\n case NegatedToken:\r\n case RegexToken:\r\n case RuleCall:\r\n case TerminalAlternatives:\r\n case TerminalGroup:\r\n case TerminalRuleCall:\r\n case UnorderedGroup:\r\n case UntilToken:\r\n case Wildcard: {\r\n return this.isSubtype(AbstractElement, supertype);\r\n }\r\n case ArrayLiteral:\r\n case NumberLiteral:\r\n case StringLiteral: {\r\n return this.isSubtype(ValueLiteral, supertype);\r\n }\r\n case ArrayType:\r\n case ReferenceType:\r\n case SimpleType:\r\n case UnionType: {\r\n return this.isSubtype(TypeDefinition, supertype);\r\n }\r\n case BooleanLiteral: {\r\n return this.isSubtype(Condition, supertype) || this.isSubtype(ValueLiteral, supertype);\r\n }\r\n case Conjunction:\r\n case Disjunction:\r\n case Negation:\r\n case ParameterReference: {\r\n return this.isSubtype(Condition, supertype);\r\n }\r\n case InferredType:\r\n case Interface:\r\n case Type: {\r\n return this.isSubtype(AbstractType, supertype);\r\n }\r\n case ParserRule: {\r\n return this.isSubtype(AbstractRule, supertype) || this.isSubtype(AbstractType, supertype);\r\n }\r\n case TerminalRule: {\r\n return this.isSubtype(AbstractRule, supertype);\r\n }\r\n default: {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n getReferenceType(refInfo: ReferenceInfo): string {\r\n const referenceId = `${refInfo.container.$type}:${refInfo.property}`;\r\n switch (referenceId) {\r\n case 'Action:type':\r\n case 'CrossReference:type':\r\n case 'Interface:superTypes':\r\n case 'ParserRule:returnType':\r\n case 'SimpleType:typeRef': {\r\n return AbstractType;\r\n }\r\n case 'Grammar:hiddenTokens':\r\n case 'ParserRule:hiddenTokens':\r\n case 'RuleCall:rule': {\r\n return AbstractRule;\r\n }\r\n case 'Grammar:usedGrammars': {\r\n return Grammar;\r\n }\r\n case 'NamedArgument:parameter':\r\n case 'ParameterReference:parameter': {\r\n return Parameter;\r\n }\r\n case 'TerminalRuleCall:rule': {\r\n return TerminalRule;\r\n }\r\n default: {\r\n throw new Error(`${referenceId} is not a valid reference id.`);\r\n }\r\n }\r\n }\r\n\r\n getTypeMetaData(type: string): TypeMetaData {\r\n switch (type) {\r\n case AbstractElement: {\r\n return {\r\n name: AbstractElement,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case ArrayLiteral: {\r\n return {\r\n name: ArrayLiteral,\r\n properties: [\r\n { name: 'elements', defaultValue: [] }\r\n ]\r\n };\r\n }\r\n case ArrayType: {\r\n return {\r\n name: ArrayType,\r\n properties: [\r\n { name: 'elementType' }\r\n ]\r\n };\r\n }\r\n case BooleanLiteral: {\r\n return {\r\n name: BooleanLiteral,\r\n properties: [\r\n { name: 'true', defaultValue: false }\r\n ]\r\n };\r\n }\r\n case Conjunction: {\r\n return {\r\n name: Conjunction,\r\n properties: [\r\n { name: 'left' },\r\n { name: 'right' }\r\n ]\r\n };\r\n }\r\n case Disjunction: {\r\n return {\r\n name: Disjunction,\r\n properties: [\r\n { name: 'left' },\r\n { name: 'right' }\r\n ]\r\n };\r\n }\r\n case Grammar: {\r\n return {\r\n name: Grammar,\r\n properties: [\r\n { name: 'definesHiddenTokens', defaultValue: false },\r\n { name: 'hiddenTokens', defaultValue: [] },\r\n { name: 'imports', defaultValue: [] },\r\n { name: 'interfaces', defaultValue: [] },\r\n { name: 'isDeclared', defaultValue: false },\r\n { name: 'name' },\r\n { name: 'rules', defaultValue: [] },\r\n { name: 'types', defaultValue: [] },\r\n { name: 'usedGrammars', defaultValue: [] }\r\n ]\r\n };\r\n }\r\n case GrammarImport: {\r\n return {\r\n name: GrammarImport,\r\n properties: [\r\n { name: 'path' }\r\n ]\r\n };\r\n }\r\n case InferredType: {\r\n return {\r\n name: InferredType,\r\n properties: [\r\n { name: 'name' }\r\n ]\r\n };\r\n }\r\n case Interface: {\r\n return {\r\n name: Interface,\r\n properties: [\r\n { name: 'attributes', defaultValue: [] },\r\n { name: 'name' },\r\n { name: 'superTypes', defaultValue: [] }\r\n ]\r\n };\r\n }\r\n case NamedArgument: {\r\n return {\r\n name: NamedArgument,\r\n properties: [\r\n { name: 'calledByName', defaultValue: false },\r\n { name: 'parameter' },\r\n { name: 'value' }\r\n ]\r\n };\r\n }\r\n case Negation: {\r\n return {\r\n name: Negation,\r\n properties: [\r\n { name: 'value' }\r\n ]\r\n };\r\n }\r\n case NumberLiteral: {\r\n return {\r\n name: NumberLiteral,\r\n properties: [\r\n { name: 'value' }\r\n ]\r\n };\r\n }\r\n case Parameter: {\r\n return {\r\n name: Parameter,\r\n properties: [\r\n { name: 'name' }\r\n ]\r\n };\r\n }\r\n case ParameterReference: {\r\n return {\r\n name: ParameterReference,\r\n properties: [\r\n { name: 'parameter' }\r\n ]\r\n };\r\n }\r\n case ParserRule: {\r\n return {\r\n name: ParserRule,\r\n properties: [\r\n { name: 'dataType' },\r\n { name: 'definesHiddenTokens', defaultValue: false },\r\n { name: 'definition' },\r\n { name: 'entry', defaultValue: false },\r\n { name: 'fragment', defaultValue: false },\r\n { name: 'hiddenTokens', defaultValue: [] },\r\n { name: 'inferredType' },\r\n { name: 'name' },\r\n { name: 'parameters', defaultValue: [] },\r\n { name: 'returnType' },\r\n { name: 'wildcard', defaultValue: false }\r\n ]\r\n };\r\n }\r\n case ReferenceType: {\r\n return {\r\n name: ReferenceType,\r\n properties: [\r\n { name: 'referenceType' }\r\n ]\r\n };\r\n }\r\n case ReturnType: {\r\n return {\r\n name: ReturnType,\r\n properties: [\r\n { name: 'name' }\r\n ]\r\n };\r\n }\r\n case SimpleType: {\r\n return {\r\n name: SimpleType,\r\n properties: [\r\n { name: 'primitiveType' },\r\n { name: 'stringType' },\r\n { name: 'typeRef' }\r\n ]\r\n };\r\n }\r\n case StringLiteral: {\r\n return {\r\n name: StringLiteral,\r\n properties: [\r\n { name: 'value' }\r\n ]\r\n };\r\n }\r\n case TerminalRule: {\r\n return {\r\n name: TerminalRule,\r\n properties: [\r\n { name: 'definition' },\r\n { name: 'fragment', defaultValue: false },\r\n { name: 'hidden', defaultValue: false },\r\n { name: 'name' },\r\n { name: 'type' }\r\n ]\r\n };\r\n }\r\n case Type: {\r\n return {\r\n name: Type,\r\n properties: [\r\n { name: 'name' },\r\n { name: 'type' }\r\n ]\r\n };\r\n }\r\n case TypeAttribute: {\r\n return {\r\n name: TypeAttribute,\r\n properties: [\r\n { name: 'defaultValue' },\r\n { name: 'isOptional', defaultValue: false },\r\n { name: 'name' },\r\n { name: 'type' }\r\n ]\r\n };\r\n }\r\n case UnionType: {\r\n return {\r\n name: UnionType,\r\n properties: [\r\n { name: 'types', defaultValue: [] }\r\n ]\r\n };\r\n }\r\n case Action: {\r\n return {\r\n name: Action,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'feature' },\r\n { name: 'inferredType' },\r\n { name: 'lookahead' },\r\n { name: 'operator' },\r\n { name: 'type' }\r\n ]\r\n };\r\n }\r\n case Alternatives: {\r\n return {\r\n name: Alternatives,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'elements', defaultValue: [] },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case Assignment: {\r\n return {\r\n name: Assignment,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'feature' },\r\n { name: 'lookahead' },\r\n { name: 'operator' },\r\n { name: 'terminal' }\r\n ]\r\n };\r\n }\r\n case CharacterRange: {\r\n return {\r\n name: CharacterRange,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'left' },\r\n { name: 'lookahead' },\r\n { name: 'right' }\r\n ]\r\n };\r\n }\r\n case CrossReference: {\r\n return {\r\n name: CrossReference,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'deprecatedSyntax', defaultValue: false },\r\n { name: 'lookahead' },\r\n { name: 'terminal' },\r\n { name: 'type' }\r\n ]\r\n };\r\n }\r\n case EndOfFile: {\r\n return {\r\n name: EndOfFile,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case Group: {\r\n return {\r\n name: Group,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'elements', defaultValue: [] },\r\n { name: 'guardCondition' },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case Keyword: {\r\n return {\r\n name: Keyword,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'value' }\r\n ]\r\n };\r\n }\r\n case NegatedToken: {\r\n return {\r\n name: NegatedToken,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'terminal' }\r\n ]\r\n };\r\n }\r\n case RegexToken: {\r\n return {\r\n name: RegexToken,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'regex' }\r\n ]\r\n };\r\n }\r\n case RuleCall: {\r\n return {\r\n name: RuleCall,\r\n properties: [\r\n { name: 'arguments', defaultValue: [] },\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'rule' }\r\n ]\r\n };\r\n }\r\n case TerminalAlternatives: {\r\n return {\r\n name: TerminalAlternatives,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'elements', defaultValue: [] },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case TerminalGroup: {\r\n return {\r\n name: TerminalGroup,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'elements', defaultValue: [] },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case TerminalRuleCall: {\r\n return {\r\n name: TerminalRuleCall,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'rule' }\r\n ]\r\n };\r\n }\r\n case UnorderedGroup: {\r\n return {\r\n name: UnorderedGroup,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'elements', defaultValue: [] },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case UntilToken: {\r\n return {\r\n name: UntilToken,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'terminal' }\r\n ]\r\n };\r\n }\r\n case Wildcard: {\r\n return {\r\n name: Wildcard,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n default: {\r\n return {\r\n name: type,\r\n properties: []\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport const reflection = new LangiumGrammarAstReflection();\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { Range } from 'vscode-languageserver-types';\r\nimport type { AstNode, AstReflection, CstNode, GenericAstNode, Mutable, PropertyType, Reference, ReferenceInfo } from '../syntax-tree.js';\r\nimport type { Stream, TreeStream } from './stream.js';\r\nimport type { LangiumDocument } from '../workspace/documents.js';\r\nimport { isAstNode, isReference } from '../syntax-tree.js';\r\nimport { DONE_RESULT, stream, StreamImpl, TreeStreamImpl } from './stream.js';\r\nimport { inRange } from './cst-utils.js';\r\n\r\n/**\r\n * Link the `$container` and other related properties of every AST node that is directly contained\r\n * in the given `node`.\r\n */\r\nexport function linkContentToContainer(node: AstNode): void {\r\n for (const [name, value] of Object.entries(node)) {\r\n if (!name.startsWith('$')) {\r\n if (Array.isArray(value)) {\r\n value.forEach((item, index) => {\r\n if (isAstNode(item)) {\r\n (item as Mutable).$container = node;\r\n (item as Mutable).$containerProperty = name;\r\n (item as Mutable).$containerIndex = index;\r\n }\r\n });\r\n } else if (isAstNode(value)) {\r\n (value as Mutable).$container = node;\r\n (value as Mutable).$containerProperty = name;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Walk along the hierarchy of containers from the given AST node to the root and return the first\r\n * node that matches the type predicate. If the start node itself matches, it is returned.\r\n * If no container matches, `undefined` is returned.\r\n */\r\nexport function getContainerOfType(node: AstNode | undefined, typePredicate: (n: AstNode) => n is T): T | undefined {\r\n let item = node;\r\n while (item) {\r\n if (typePredicate(item)) {\r\n return item;\r\n }\r\n item = item.$container;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Walk along the hierarchy of containers from the given AST node to the root and check for existence\r\n * of a container that matches the given predicate. The start node is included in the checks.\r\n */\r\nexport function hasContainerOfType(node: AstNode | undefined, predicate: (n: AstNode) => boolean): boolean {\r\n let item = node;\r\n while (item) {\r\n if (predicate(item)) {\r\n return true;\r\n }\r\n item = item.$container;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Retrieve the document in which the given AST node is contained. A reference to the document is\r\n * usually held by the root node of the AST.\r\n *\r\n * @throws an error if the node is not contained in a document.\r\n */\r\nexport function getDocument(node: AstNode): LangiumDocument {\r\n const rootNode = findRootNode(node);\r\n const result = rootNode.$document;\r\n if (!result) {\r\n throw new Error('AST node has no document.');\r\n }\r\n return result as LangiumDocument;\r\n}\r\n\r\n/**\r\n * Returns the root node of the given AST node by following the `$container` references.\r\n */\r\nexport function findRootNode(node: AstNode): AstNode {\r\n while (node.$container) {\r\n node = node.$container;\r\n }\r\n return node;\r\n}\r\n\r\nexport interface AstStreamOptions {\r\n /**\r\n * Optional target range that the nodes in the stream need to intersect\r\n */\r\n range?: Range\r\n}\r\n\r\n/**\r\n * Create a stream of all AST nodes that are directly contained in the given node. This includes\r\n * single-valued as well as multi-valued (array) properties.\r\n */\r\nexport function streamContents(node: AstNode, options?: AstStreamOptions): Stream {\r\n if (!node) {\r\n throw new Error('Node must be an AstNode.');\r\n }\r\n const range = options?.range;\r\n type State = { keys: string[], keyIndex: number, arrayIndex: number };\r\n return new StreamImpl(() => ({\r\n keys: Object.keys(node),\r\n keyIndex: 0,\r\n arrayIndex: 0\r\n }), state => {\r\n while (state.keyIndex < state.keys.length) {\r\n const property = state.keys[state.keyIndex];\r\n if (!property.startsWith('$')) {\r\n const value = (node as GenericAstNode)[property];\r\n if (isAstNode(value)) {\r\n state.keyIndex++;\r\n if (isAstNodeInRange(value, range)) {\r\n return { done: false, value };\r\n }\r\n } else if (Array.isArray(value)) {\r\n while (state.arrayIndex < value.length) {\r\n const index = state.arrayIndex++;\r\n const element = value[index];\r\n if (isAstNode(element) && isAstNodeInRange(element, range)) {\r\n return { done: false, value: element };\r\n }\r\n }\r\n state.arrayIndex = 0;\r\n }\r\n }\r\n state.keyIndex++;\r\n }\r\n return DONE_RESULT;\r\n });\r\n}\r\n\r\n/**\r\n * Create a stream of all AST nodes that are directly and indirectly contained in the given root node.\r\n * This does not include the root node itself.\r\n */\r\nexport function streamAllContents(root: AstNode, options?: AstStreamOptions): TreeStream {\r\n if (!root) {\r\n throw new Error('Root node must be an AstNode.');\r\n }\r\n return new TreeStreamImpl(root, node => streamContents(node, options));\r\n}\r\n\r\n/**\r\n * Create a stream of all AST nodes that are directly and indirectly contained in the given root node,\r\n * including the root node itself.\r\n */\r\nexport function streamAst(root: AstNode, options?: AstStreamOptions): TreeStream {\r\n if (!root) {\r\n throw new Error('Root node must be an AstNode.');\r\n } else if (options?.range && !isAstNodeInRange(root, options.range)) {\r\n // Return an empty stream if the root node isn't in range\r\n return new TreeStreamImpl(root, () => []);\r\n }\r\n return new TreeStreamImpl(root, node => streamContents(node, options), { includeRoot: true });\r\n}\r\n\r\nfunction isAstNodeInRange(astNode: AstNode, range?: Range): boolean {\r\n if (!range) {\r\n return true;\r\n }\r\n const nodeRange = astNode.$cstNode?.range;\r\n if (!nodeRange) {\r\n return false;\r\n }\r\n return inRange(nodeRange, range);\r\n}\r\n\r\n/**\r\n * Create a stream of all cross-references that are held by the given AST node. This includes\r\n * single-valued as well as multi-valued (array) properties.\r\n */\r\nexport function streamReferences(node: AstNode): Stream {\r\n type State = { keys: string[], keyIndex: number, arrayIndex: number };\r\n return new StreamImpl(() => ({\r\n keys: Object.keys(node),\r\n keyIndex: 0,\r\n arrayIndex: 0\r\n }), state => {\r\n while (state.keyIndex < state.keys.length) {\r\n const property = state.keys[state.keyIndex];\r\n if (!property.startsWith('$')) {\r\n const value = (node as GenericAstNode)[property];\r\n if (isReference(value)) {\r\n state.keyIndex++;\r\n return { done: false, value: { reference: value, container: node, property } };\r\n } else if (Array.isArray(value)) {\r\n while (state.arrayIndex < value.length) {\r\n const index = state.arrayIndex++;\r\n const element = value[index];\r\n if (isReference(element)) {\r\n return { done: false, value: { reference: element, container: node, property, index } };\r\n }\r\n }\r\n state.arrayIndex = 0;\r\n }\r\n }\r\n state.keyIndex++;\r\n }\r\n return DONE_RESULT;\r\n });\r\n}\r\n\r\n/**\r\n * Returns a Stream of references to the target node from the AstNode tree\r\n *\r\n * @param targetNode AstNode we are looking for\r\n * @param lookup AstNode where we search for references. If not provided, the root node of the document is used as the default value\r\n */\r\nexport function findLocalReferences(targetNode: AstNode, lookup = getDocument(targetNode).parseResult.value): Stream {\r\n const refs: Reference[] = [];\r\n streamAst(lookup).forEach(node => {\r\n streamReferences(node).forEach(refInfo => {\r\n if (refInfo.reference.ref === targetNode) {\r\n refs.push(refInfo.reference);\r\n }\r\n });\r\n });\r\n return stream(refs);\r\n}\r\n\r\n/**\r\n * Assigns all mandatory AST properties to the specified node.\r\n *\r\n * @param reflection Reflection object used to gather mandatory properties for the node.\r\n * @param node Specified node is modified in place and properties are directly assigned.\r\n */\r\nexport function assignMandatoryProperties(reflection: AstReflection, node: AstNode): void {\r\n const typeMetaData = reflection.getTypeMetaData(node.$type);\r\n const genericNode = node as GenericAstNode;\r\n for (const property of typeMetaData.properties) {\r\n // Only set the value if the property is not already set and if it has a default value\r\n if (property.defaultValue !== undefined && genericNode[property.name] === undefined) {\r\n genericNode[property.name] = copyDefaultValue(property.defaultValue);\r\n }\r\n }\r\n}\r\n\r\nfunction copyDefaultValue(propertyType: PropertyType): PropertyType {\r\n if (Array.isArray(propertyType)) {\r\n return [...propertyType.map(copyDefaultValue)];\r\n } else {\r\n return propertyType;\r\n }\r\n}\r\n\r\n/**\r\n * Creates a deep copy of the specified AST node.\r\n * The resulting copy will only contain semantically relevant information, such as the `$type` property and AST properties.\r\n *\r\n * References are copied without resolved cross reference. The specified function is used to rebuild them.\r\n */\r\nexport function copyAstNode(node: T, buildReference: (node: AstNode, property: string, refNode: CstNode | undefined, refText: string) => Reference): T {\r\n const copy: GenericAstNode = { $type: node.$type };\r\n\r\n for (const [name, value] of Object.entries(node)) {\r\n if (!name.startsWith('$')) {\r\n if (isAstNode(value)) {\r\n copy[name] = copyAstNode(value, buildReference);\r\n } else if (isReference(value)) {\r\n copy[name] = buildReference(\r\n copy,\r\n name,\r\n value.$refNode,\r\n value.$refText\r\n );\r\n } else if (Array.isArray(value)) {\r\n const copiedArray: unknown[] = [];\r\n for (const element of value) {\r\n if (isAstNode(element)) {\r\n copiedArray.push(copyAstNode(element, buildReference));\r\n } else if (isReference(element)) {\r\n copiedArray.push(\r\n buildReference(\r\n copy,\r\n name,\r\n element.$refNode,\r\n element.$refText\r\n )\r\n );\r\n } else {\r\n copiedArray.push(element);\r\n }\r\n }\r\n copy[name] = copiedArray;\r\n } else {\r\n copy[name] = value;\r\n }\r\n }\r\n }\r\n\r\n linkContentToContainer(copy);\r\n return copy as unknown as T;\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { Set, Group, Character, IRegExpAST } from '@chevrotain/regexp-to-ast';\r\nimport { RegExpParser, BaseRegExpVisitor } from '@chevrotain/regexp-to-ast';\r\n\r\nexport const NEWLINE_REGEXP = /\\r?\\n/gm;\r\n\r\nconst regexpParser = new RegExpParser();\r\n\r\n/**\r\n * This class is in charge of heuristically identifying start/end tokens of terminals.\r\n *\r\n * The way this works is by doing the following:\r\n * 1. Traverse the regular expression in the \"start state\"\r\n * 2. Add any encountered sets/single characters to the \"start regexp\"\r\n * 3. Once we encounter any variable-length content (i.e. with quantifiers such as +/?/*), we enter the \"end state\"\r\n * 4. In the end state, any sets/single characters are added to an \"end stack\".\r\n * 5. If we re-encounter any variable-length content we reset the end stack\r\n * 6. We continue visiting the regex until the end, reseting the end stack and rebuilding it as necessary\r\n *\r\n * After traversing a regular expression the `startRegexp/endRegexp` properties allow access to the stored start/end of the terminal\r\n */\r\nclass TerminalRegExpVisitor extends BaseRegExpVisitor {\r\n\r\n private isStarting = true;\r\n startRegexp: string;\r\n private endRegexpStack: string[] = [];\r\n multiline = false;\r\n regex: string;\r\n\r\n get endRegex(): string {\r\n return this.endRegexpStack.join('');\r\n }\r\n\r\n reset(regex: string): void {\r\n this.multiline = false;\r\n this.regex = regex;\r\n this.startRegexp = '';\r\n this.isStarting = true;\r\n this.endRegexpStack = [];\r\n }\r\n\r\n override visitGroup(node: Group) {\r\n if (node.quantifier) {\r\n this.isStarting = false;\r\n this.endRegexpStack = [];\r\n }\r\n }\r\n\r\n override visitCharacter(node: Character): void {\r\n const char = String.fromCharCode(node.value);\r\n if (!this.multiline && char === '\\n') {\r\n this.multiline = true;\r\n }\r\n if (node.quantifier) {\r\n this.isStarting = false;\r\n this.endRegexpStack = [];\r\n } else {\r\n const escapedChar = escapeRegExp(char);\r\n this.endRegexpStack.push(escapedChar);\r\n if (this.isStarting) {\r\n this.startRegexp += escapedChar;\r\n }\r\n }\r\n }\r\n\r\n override visitSet(node: Set): void {\r\n if (!this.multiline) {\r\n const set = this.regex.substring(node.loc.begin, node.loc.end);\r\n const regex = new RegExp(set);\r\n this.multiline = Boolean('\\n'.match(regex));\r\n }\r\n if (node.quantifier) {\r\n this.isStarting = false;\r\n this.endRegexpStack = [];\r\n } else {\r\n const set = this.regex.substring(node.loc.begin, node.loc.end);\r\n this.endRegexpStack.push(set);\r\n if (this.isStarting) {\r\n this.startRegexp += set;\r\n }\r\n }\r\n }\r\n\r\n override visitChildren(node: IRegExpAST): void {\r\n if (node.type === 'Group') {\r\n // Ignore children of groups with quantifier (+/*/?)\r\n // These groups are unrelated to start/end tokens of terminals\r\n const group = node as Group;\r\n if (group.quantifier) {\r\n return;\r\n }\r\n }\r\n super.visitChildren(node);\r\n }\r\n}\r\n\r\nconst visitor = new TerminalRegExpVisitor();\r\n\r\nexport function getTerminalParts(regexp: RegExp | string): Array<{ start: string, end: string }> {\r\n try {\r\n if (typeof regexp !== 'string') {\r\n regexp = regexp.source;\r\n }\r\n regexp = `/${regexp}/`;\r\n const pattern = regexpParser.pattern(regexp);\r\n const parts: Array<{ start: string, end: string }> = [];\r\n for (const alternative of pattern.value.value) {\r\n visitor.reset(regexp);\r\n visitor.visit(alternative);\r\n parts.push({\r\n start: visitor.startRegexp,\r\n end: visitor.endRegex\r\n });\r\n }\r\n return parts;\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nexport function isMultilineComment(regexp: RegExp | string): boolean {\r\n try {\r\n if (typeof regexp === 'string') {\r\n regexp = new RegExp(regexp);\r\n }\r\n regexp = regexp.toString();\r\n visitor.reset(regexp);\r\n // Parsing the pattern might fail (since it's user code)\r\n visitor.visit(regexpParser.pattern(regexp));\r\n return visitor.multiline;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * A set of all characters that are considered whitespace by the '\\s' RegExp character class.\r\n * Taken from [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions/Character_classes).\r\n */\r\nexport const whitespaceCharacters = (\r\n '\\f\\n\\r\\t\\v\\u0020\\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007' +\r\n '\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff').split('');\r\n\r\nexport function isWhitespace(value: RegExp | string): boolean {\r\n const regexp = typeof value === 'string' ? new RegExp(value) : value;\r\n return whitespaceCharacters.some((ws) => regexp.test(ws));\r\n}\r\n\r\nexport function escapeRegExp(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\nexport function getCaseInsensitivePattern(keyword: string): string {\r\n return Array.prototype.map.call(keyword, letter =>\r\n /\\w/.test(letter) ? `[${letter.toLowerCase()}${letter.toUpperCase()}]` : escapeRegExp(letter)\r\n ).join('');\r\n}\r\n\r\n/**\r\n * Determines whether the given input has a partial match with the specified regex.\r\n * @param regex The regex to partially match against\r\n * @param input The input string\r\n * @returns Whether any match exists.\r\n */\r\nexport function partialMatches(regex: RegExp | string, input: string): boolean {\r\n const partial = partialRegExp(regex);\r\n const match = input.match(partial);\r\n return !!match && match[0].length > 0;\r\n}\r\n\r\n/**\r\n * Builds a partial regex from the input regex. A partial regex is able to match incomplete input strings. E.g.\r\n * a partial regex constructed from `/ab/` is able to match the string `a` without needing a following `b` character. However it won't match `b` alone.\r\n * @param regex The input regex to be converted.\r\n * @returns A partial regex constructed from the input regex.\r\n */\r\nexport function partialRegExp(regex: RegExp | string): RegExp {\r\n if (typeof regex === 'string') {\r\n regex = new RegExp(regex);\r\n }\r\n const re = regex, source = regex.source;\r\n let i = 0;\r\n\r\n function process() {\r\n let result = '',\r\n tmp;\r\n\r\n function appendRaw(nbChars: number) {\r\n result += source.substr(i, nbChars);\r\n i += nbChars;\r\n }\r\n\r\n function appendOptional(nbChars: number) {\r\n result += '(?:' + source.substr(i, nbChars) + '|$)';\r\n i += nbChars;\r\n }\r\n\r\n while (i < source.length) {\r\n switch (source[i]) {\r\n case '\\\\':\r\n switch (source[i + 1]) {\r\n case 'c':\r\n appendOptional(3);\r\n break;\r\n case 'x':\r\n appendOptional(4);\r\n break;\r\n case 'u':\r\n if (re.unicode) {\r\n if (source[i + 2] === '{') {\r\n appendOptional(source.indexOf('}', i) - i + 1);\r\n } else {\r\n appendOptional(6);\r\n }\r\n } else {\r\n appendOptional(2);\r\n }\r\n break;\r\n case 'p':\r\n case 'P':\r\n if (re.unicode) {\r\n appendOptional(source.indexOf('}', i) - i + 1);\r\n } else {\r\n appendOptional(2);\r\n }\r\n break;\r\n case 'k':\r\n appendOptional(source.indexOf('>', i) - i + 1);\r\n break;\r\n default:\r\n appendOptional(2);\r\n break;\r\n }\r\n break;\r\n\r\n case '[':\r\n tmp = /\\[(?:\\\\.|.)*?\\]/g;\r\n tmp.lastIndex = i;\r\n tmp = tmp.exec(source) || [];\r\n appendOptional(tmp[0].length);\r\n break;\r\n\r\n case '|':\r\n case '^':\r\n case '$':\r\n case '*':\r\n case '+':\r\n case '?':\r\n appendRaw(1);\r\n break;\r\n case '{':\r\n tmp = /\\{\\d+,?\\d*\\}/g;\r\n tmp.lastIndex = i;\r\n tmp = tmp.exec(source);\r\n if (tmp) {\r\n appendRaw(tmp[0].length);\r\n } else {\r\n appendOptional(1);\r\n }\r\n break;\r\n case '(':\r\n if (source[i + 1] === '?') {\r\n switch (source[i + 2]) {\r\n case ':':\r\n result += '(?:';\r\n i += 3;\r\n result += process() + '|$)';\r\n break;\r\n case '=':\r\n result += '(?=';\r\n i += 3;\r\n result += process() + ')';\r\n break;\r\n case '!':\r\n tmp = i;\r\n i += 3;\r\n process();\r\n result += source.substr(tmp, i - tmp);\r\n break;\r\n case '<':\r\n switch (source[i + 3]) {\r\n case '=':\r\n case '!':\r\n tmp = i;\r\n i += 4;\r\n process();\r\n result += source.substr(tmp, i - tmp);\r\n break;\r\n default:\r\n appendRaw(source.indexOf('>', i) - i + 1);\r\n result += process() + '|$)';\r\n break;\r\n }\r\n break;\r\n }\r\n } else {\r\n appendRaw(1);\r\n result += process() + '|$)';\r\n }\r\n break;\r\n case ')':\r\n ++i;\r\n return result;\r\n default:\r\n appendOptional(1);\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n return new RegExp(process(), regex.flags);\r\n}\r\n", "import type { Character, IRegExpAST, RegExpFlags } from \"../types\";\n\nexport function cc(char: string): number {\n return char.charCodeAt(0);\n}\n\nexport function insertToSet(item: T | T[], set: T[]) {\n if (Array.isArray(item)) {\n item.forEach(function (subItem) {\n set.push(subItem);\n });\n } else {\n set.push(item);\n }\n}\n\nexport function addFlag(\n flagObj: RegExpFlags,\n flagKey: keyof Omit,\n) {\n if (flagObj[flagKey] === true) {\n throw \"duplicate flag \" + flagKey;\n }\n\n const x: boolean = flagObj[flagKey];\n flagObj[flagKey] = true;\n}\n\nexport function ASSERT_EXISTS(obj: any): obj is T {\n // istanbul ignore next\n if (obj === undefined) {\n throw Error(\"Internal Error - Should never get here!\");\n }\n return true;\n}\n\n// istanbul ignore next\nexport function ASSERT_NEVER_REACH_HERE(): any {\n throw Error(\"Internal Error - Should never get here!\");\n}\n\nexport function isCharacter(obj: { type: string }): obj is Character {\n return obj[\"type\"] === \"Character\";\n}\n", "import { cc } from \"./utils.js\";\n\nexport const digitsCharCodes: number[] = [];\nfor (let i = cc(\"0\"); i <= cc(\"9\"); i++) {\n digitsCharCodes.push(i);\n}\n\nexport const wordCharCodes: number[] = [cc(\"_\")].concat(digitsCharCodes);\nfor (let i = cc(\"a\"); i <= cc(\"z\"); i++) {\n wordCharCodes.push(i);\n}\n\nfor (let i = cc(\"A\"); i <= cc(\"Z\"); i++) {\n wordCharCodes.push(i);\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#character-classes\nexport const whitespaceCodes: number[] = [\n cc(\" \"),\n cc(\"\\f\"),\n cc(\"\\n\"),\n cc(\"\\r\"),\n cc(\"\\t\"),\n cc(\"\\v\"),\n cc(\"\\t\"),\n cc(\"\\u00a0\"),\n cc(\"\\u1680\"),\n cc(\"\\u2000\"),\n cc(\"\\u2001\"),\n cc(\"\\u2002\"),\n cc(\"\\u2003\"),\n cc(\"\\u2004\"),\n cc(\"\\u2005\"),\n cc(\"\\u2006\"),\n cc(\"\\u2007\"),\n cc(\"\\u2008\"),\n cc(\"\\u2009\"),\n cc(\"\\u200a\"),\n cc(\"\\u2028\"),\n cc(\"\\u2029\"),\n cc(\"\\u202f\"),\n cc(\"\\u205f\"),\n cc(\"\\u3000\"),\n cc(\"\\ufeff\"),\n];\n", "import type {\n Alternative,\n Assertion,\n Atom,\n Character,\n Disjunction,\n Group,\n GroupBackReference,\n Location,\n Quantifier,\n Range,\n RegExpFlags,\n RegExpPattern,\n Set,\n Term,\n} from \"../types\";\nimport {\n addFlag,\n ASSERT_EXISTS,\n ASSERT_NEVER_REACH_HERE,\n cc,\n insertToSet,\n isCharacter,\n} from \"./utils.js\";\nimport {\n digitsCharCodes,\n whitespaceCodes,\n wordCharCodes,\n} from \"./character-classes.js\";\n\n// consts and utilities\nconst hexDigitPattern = /[0-9a-fA-F]/;\nconst decimalPattern = /[0-9]/;\nconst decimalPatternNoZero = /[1-9]/;\n\n// https://hackernoon.com/the-madness-of-parsing-real-world-javascript-regexps-d9ee336df983\n// https://www.ecma-international.org/ecma-262/8.0/index.html#prod-Pattern\nexport class RegExpParser {\n protected idx: number = 0;\n protected input: string = \"\";\n protected groupIdx: number = 0;\n\n protected saveState() {\n return {\n idx: this.idx,\n input: this.input,\n groupIdx: this.groupIdx,\n };\n }\n\n protected restoreState(newState: {\n idx: number;\n input: string;\n groupIdx: number;\n }) {\n this.idx = newState.idx;\n this.input = newState.input;\n this.groupIdx = newState.groupIdx;\n }\n\n public pattern(input: string): RegExpPattern {\n // parser state\n this.idx = 0;\n this.input = input;\n this.groupIdx = 0;\n\n this.consumeChar(\"/\");\n const value = this.disjunction();\n this.consumeChar(\"/\");\n\n const flags: RegExpFlags = {\n type: \"Flags\",\n loc: { begin: this.idx, end: input.length },\n global: false,\n ignoreCase: false,\n multiLine: false,\n unicode: false,\n sticky: false,\n };\n\n while (this.isRegExpFlag()) {\n switch (this.popChar()) {\n case \"g\":\n addFlag(flags, \"global\");\n break;\n case \"i\":\n addFlag(flags, \"ignoreCase\");\n break;\n case \"m\":\n addFlag(flags, \"multiLine\");\n break;\n case \"u\":\n addFlag(flags, \"unicode\");\n break;\n case \"y\":\n addFlag(flags, \"sticky\");\n break;\n }\n }\n\n if (this.idx !== this.input.length) {\n throw Error(\"Redundant input: \" + this.input.substring(this.idx));\n }\n return {\n type: \"Pattern\",\n flags: flags,\n value: value,\n loc: this.loc(0),\n };\n }\n\n protected disjunction(): Disjunction {\n const alts = [];\n const begin = this.idx;\n\n alts.push(this.alternative());\n\n while (this.peekChar() === \"|\") {\n this.consumeChar(\"|\");\n alts.push(this.alternative());\n }\n\n return { type: \"Disjunction\", value: alts, loc: this.loc(begin) };\n }\n\n protected alternative(): Alternative {\n const terms = [];\n const begin = this.idx;\n\n while (this.isTerm()) {\n terms.push(this.term());\n }\n\n return { type: \"Alternative\", value: terms, loc: this.loc(begin) };\n }\n\n protected term(): Term {\n if (this.isAssertion()) {\n return this.assertion();\n } else {\n return this.atom();\n }\n }\n\n protected assertion(): Assertion {\n const begin = this.idx;\n switch (this.popChar()) {\n case \"^\":\n return {\n type: \"StartAnchor\",\n loc: this.loc(begin),\n };\n case \"$\":\n return { type: \"EndAnchor\", loc: this.loc(begin) };\n // '\\b' or '\\B'\n case \"\\\\\":\n switch (this.popChar()) {\n case \"b\":\n return {\n type: \"WordBoundary\",\n loc: this.loc(begin),\n };\n case \"B\":\n return {\n type: \"NonWordBoundary\",\n loc: this.loc(begin),\n };\n }\n // istanbul ignore next\n throw Error(\"Invalid Assertion Escape\");\n // '(?=' or '(?!'\n case \"(\":\n this.consumeChar(\"?\");\n\n let type: \"Lookahead\" | \"NegativeLookahead\" | undefined;\n switch (this.popChar()) {\n case \"=\":\n type = \"Lookahead\";\n break;\n case \"!\":\n type = \"NegativeLookahead\";\n break;\n }\n ASSERT_EXISTS(type);\n\n const disjunction = this.disjunction();\n\n this.consumeChar(\")\");\n\n return {\n type: type!,\n value: disjunction,\n loc: this.loc(begin),\n };\n }\n // istanbul ignore next\n return ASSERT_NEVER_REACH_HERE();\n }\n\n protected quantifier(\n isBacktracking: boolean = false,\n ): Quantifier | undefined {\n let range: Partial | undefined = undefined;\n const begin = this.idx;\n switch (this.popChar()) {\n case \"*\":\n range = {\n atLeast: 0,\n atMost: Infinity,\n };\n break;\n case \"+\":\n range = {\n atLeast: 1,\n atMost: Infinity,\n };\n break;\n case \"?\":\n range = {\n atLeast: 0,\n atMost: 1,\n };\n break;\n case \"{\":\n const atLeast = this.integerIncludingZero();\n switch (this.popChar()) {\n case \"}\":\n range = {\n atLeast: atLeast,\n atMost: atLeast,\n };\n break;\n case \",\":\n let atMost;\n if (this.isDigit()) {\n atMost = this.integerIncludingZero();\n range = {\n atLeast: atLeast,\n atMost: atMost,\n };\n } else {\n range = {\n atLeast: atLeast,\n atMost: Infinity,\n };\n }\n this.consumeChar(\"}\");\n break;\n }\n // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n // causes severe performance degradations\n if (isBacktracking === true && range === undefined) {\n return undefined;\n }\n ASSERT_EXISTS(range);\n break;\n }\n\n // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n // causes severe performance degradations\n if (isBacktracking === true && range === undefined) {\n return undefined;\n }\n\n // istanbul ignore else\n if (ASSERT_EXISTS(range)) {\n if (this.peekChar(0) === \"?\") {\n this.consumeChar(\"?\");\n range.greedy = false;\n } else {\n range.greedy = true;\n }\n\n range.type = \"Quantifier\";\n range.loc = this.loc(begin);\n return range as Quantifier;\n }\n }\n\n protected atom(): Atom {\n let atom: Omit | undefined;\n const begin = this.idx;\n switch (this.peekChar()) {\n case \".\":\n atom = this.dotAll();\n break;\n case \"\\\\\":\n atom = this.atomEscape();\n break;\n case \"[\":\n atom = this.characterClass();\n break;\n case \"(\":\n atom = this.group();\n break;\n }\n\n if (atom === undefined && this.isPatternCharacter()) {\n atom = this.patternCharacter();\n }\n\n // istanbul ignore else\n if (ASSERT_EXISTS(atom)) {\n atom.loc = this.loc(begin);\n\n if (this.isQuantifier()) {\n atom.quantifier = this.quantifier();\n }\n\n return atom;\n }\n\n // istanbul ignore next\n return ASSERT_NEVER_REACH_HERE();\n }\n\n protected dotAll(): Omit {\n this.consumeChar(\".\");\n return {\n type: \"Set\",\n complement: true,\n value: [cc(\"\\n\"), cc(\"\\r\"), cc(\"\\u2028\"), cc(\"\\u2029\")],\n };\n }\n\n protected atomEscape(): Omit {\n this.consumeChar(\"\\\\\");\n\n switch (this.peekChar()) {\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\":\n return this.decimalEscapeAtom();\n case \"d\":\n case \"D\":\n case \"s\":\n case \"S\":\n case \"w\":\n case \"W\":\n return this.characterClassEscape();\n case \"f\":\n case \"n\":\n case \"r\":\n case \"t\":\n case \"v\":\n return this.controlEscapeAtom();\n case \"c\":\n return this.controlLetterEscapeAtom();\n case \"0\":\n return this.nulCharacterAtom();\n case \"x\":\n return this.hexEscapeSequenceAtom();\n case \"u\":\n return this.regExpUnicodeEscapeSequenceAtom();\n default:\n return this.identityEscapeAtom();\n }\n }\n\n protected decimalEscapeAtom(): Omit {\n const value = this.positiveInteger();\n\n return { type: \"GroupBackReference\", value: value };\n }\n\n protected characterClassEscape(): Omit {\n let set: (number | Range)[] | undefined;\n let complement = false;\n switch (this.popChar()) {\n case \"d\":\n set = digitsCharCodes;\n break;\n case \"D\":\n set = digitsCharCodes;\n complement = true;\n break;\n case \"s\":\n set = whitespaceCodes;\n break;\n case \"S\":\n set = whitespaceCodes;\n complement = true;\n break;\n case \"w\":\n set = wordCharCodes;\n break;\n case \"W\":\n set = wordCharCodes;\n complement = true;\n break;\n }\n\n // istanbul ignore else\n if (ASSERT_EXISTS(set)) {\n return { type: \"Set\", value: set, complement: complement };\n }\n // istanbul ignore next\n return ASSERT_NEVER_REACH_HERE();\n }\n\n protected controlEscapeAtom(): Omit {\n let escapeCode;\n switch (this.popChar()) {\n case \"f\":\n escapeCode = cc(\"\\f\");\n break;\n case \"n\":\n escapeCode = cc(\"\\n\");\n break;\n case \"r\":\n escapeCode = cc(\"\\r\");\n break;\n case \"t\":\n escapeCode = cc(\"\\t\");\n break;\n case \"v\":\n escapeCode = cc(\"\\v\");\n break;\n }\n\n // istanbul ignore else\n if (ASSERT_EXISTS(escapeCode)) {\n return { type: \"Character\", value: escapeCode };\n }\n // istanbul ignore next\n return ASSERT_NEVER_REACH_HERE();\n }\n\n protected controlLetterEscapeAtom(): Omit {\n this.consumeChar(\"c\");\n const letter = this.popChar();\n if (/[a-zA-Z]/.test(letter) === false) {\n throw Error(\"Invalid \");\n }\n\n const letterCode = letter.toUpperCase().charCodeAt(0) - 64;\n return { type: \"Character\", value: letterCode };\n }\n\n protected nulCharacterAtom(): Omit {\n // TODO implement '[lookahead \u2209 DecimalDigit]'\n // TODO: for the deprecated octal escape sequence\n this.consumeChar(\"0\");\n return { type: \"Character\", value: cc(\"\\0\") };\n }\n\n protected hexEscapeSequenceAtom(): Omit {\n this.consumeChar(\"x\");\n return this.parseHexDigits(2);\n }\n\n protected regExpUnicodeEscapeSequenceAtom(): Omit {\n this.consumeChar(\"u\");\n return this.parseHexDigits(4);\n }\n\n protected identityEscapeAtom(): Omit {\n // TODO: implement \"SourceCharacter but not UnicodeIDContinue\"\n // // http://unicode.org/reports/tr31/#Specific_Character_Adjustments\n const escapedChar = this.popChar();\n return { type: \"Character\", value: cc(escapedChar) };\n }\n\n protected classPatternCharacterAtom(): Omit {\n switch (this.peekChar()) {\n // istanbul ignore next\n case \"\\n\":\n // istanbul ignore next\n case \"\\r\":\n // istanbul ignore next\n case \"\\u2028\":\n // istanbul ignore next\n case \"\\u2029\":\n // istanbul ignore next\n case \"\\\\\":\n // istanbul ignore next\n case \"]\":\n throw Error(\"TBD\");\n default:\n const nextChar = this.popChar();\n return { type: \"Character\", value: cc(nextChar) };\n }\n }\n\n protected characterClass(): Omit {\n const set: (number | Range)[] = [];\n let complement = false;\n this.consumeChar(\"[\");\n if (this.peekChar(0) === \"^\") {\n this.consumeChar(\"^\");\n complement = true;\n }\n\n while (this.isClassAtom()) {\n const from = this.classAtom();\n const isFromSingleChar = from.type === \"Character\";\n if (isCharacter(from) && this.isRangeDash()) {\n this.consumeChar(\"-\");\n const to = this.classAtom();\n const isToSingleChar = to.type === \"Character\";\n\n // a range can only be used when both sides are single characters\n if (isCharacter(to)) {\n if (to.value < from.value) {\n throw Error(\"Range out of order in character class\");\n }\n set.push({ from: from.value, to: to.value });\n } else {\n // literal dash\n insertToSet(from.value, set);\n set.push(cc(\"-\"));\n insertToSet(to.value, set);\n }\n } else {\n insertToSet(from.value, set);\n }\n }\n\n this.consumeChar(\"]\");\n\n return { type: \"Set\", complement: complement, value: set };\n }\n\n protected classAtom(): Omit {\n switch (this.peekChar()) {\n // istanbul ignore next\n case \"]\":\n // istanbul ignore next\n case \"\\n\":\n // istanbul ignore next\n case \"\\r\":\n // istanbul ignore next\n case \"\\u2028\":\n // istanbul ignore next\n case \"\\u2029\":\n throw Error(\"TBD\");\n case \"\\\\\":\n return this.classEscape();\n default:\n return this.classPatternCharacterAtom();\n }\n }\n\n protected classEscape(): Omit {\n this.consumeChar(\"\\\\\");\n switch (this.peekChar()) {\n // Matches a backspace.\n // (Not to be confused with \\b word boundary outside characterClass)\n case \"b\":\n this.consumeChar(\"b\");\n return { type: \"Character\", value: cc(\"\\u0008\") };\n case \"d\":\n case \"D\":\n case \"s\":\n case \"S\":\n case \"w\":\n case \"W\":\n return this.characterClassEscape();\n case \"f\":\n case \"n\":\n case \"r\":\n case \"t\":\n case \"v\":\n return this.controlEscapeAtom();\n case \"c\":\n return this.controlLetterEscapeAtom();\n case \"0\":\n return this.nulCharacterAtom();\n case \"x\":\n return this.hexEscapeSequenceAtom();\n case \"u\":\n return this.regExpUnicodeEscapeSequenceAtom();\n default:\n return this.identityEscapeAtom();\n }\n }\n\n protected group(): Omit {\n let capturing = true;\n this.consumeChar(\"(\");\n switch (this.peekChar(0)) {\n case \"?\":\n this.consumeChar(\"?\");\n this.consumeChar(\":\");\n capturing = false;\n break;\n default:\n this.groupIdx++;\n break;\n }\n const value = this.disjunction();\n this.consumeChar(\")\");\n\n const groupAst: Omit = {\n type: \"Group\",\n capturing: capturing,\n value: value,\n };\n\n if (capturing) {\n groupAst[\"idx\"] = this.groupIdx;\n }\n\n return groupAst;\n }\n\n protected positiveInteger(): number {\n let number = this.popChar();\n\n // istanbul ignore next - can't ever get here due to previous lookahead checks\n // still implementing this error checking in case this ever changes.\n if (decimalPatternNoZero.test(number) === false) {\n throw Error(\"Expecting a positive integer\");\n }\n\n while (decimalPattern.test(this.peekChar(0))) {\n number += this.popChar();\n }\n\n return parseInt(number, 10);\n }\n\n protected integerIncludingZero(): number {\n let number = this.popChar();\n if (decimalPattern.test(number) === false) {\n throw Error(\"Expecting an integer\");\n }\n\n while (decimalPattern.test(this.peekChar(0))) {\n number += this.popChar();\n }\n\n return parseInt(number, 10);\n }\n\n protected patternCharacter(): Omit {\n const nextChar = this.popChar();\n switch (nextChar) {\n // istanbul ignore next\n case \"\\n\":\n // istanbul ignore next\n case \"\\r\":\n // istanbul ignore next\n case \"\\u2028\":\n // istanbul ignore next\n case \"\\u2029\":\n // istanbul ignore next\n case \"^\":\n // istanbul ignore next\n case \"$\":\n // istanbul ignore next\n case \"\\\\\":\n // istanbul ignore next\n case \".\":\n // istanbul ignore next\n case \"*\":\n // istanbul ignore next\n case \"+\":\n // istanbul ignore next\n case \"?\":\n // istanbul ignore next\n case \"(\":\n // istanbul ignore next\n case \")\":\n // istanbul ignore next\n case \"[\":\n // istanbul ignore next\n case \"|\":\n // istanbul ignore next\n throw Error(\"TBD\");\n default:\n return { type: \"Character\", value: cc(nextChar) };\n }\n }\n protected isRegExpFlag(): boolean {\n switch (this.peekChar(0)) {\n case \"g\":\n case \"i\":\n case \"m\":\n case \"u\":\n case \"y\":\n return true;\n default:\n return false;\n }\n }\n\n protected isRangeDash(): boolean {\n return this.peekChar() === \"-\" && this.isClassAtom(1);\n }\n\n protected isDigit(): boolean {\n return decimalPattern.test(this.peekChar(0));\n }\n\n protected isClassAtom(howMuch = 0): boolean {\n switch (this.peekChar(howMuch)) {\n case \"]\":\n case \"\\n\":\n case \"\\r\":\n case \"\\u2028\":\n case \"\\u2029\":\n return false;\n default:\n return true;\n }\n }\n\n protected isTerm() {\n return this.isAtom() || this.isAssertion();\n }\n\n protected isAtom(): boolean {\n if (this.isPatternCharacter()) {\n return true;\n }\n\n switch (this.peekChar(0)) {\n case \".\":\n case \"\\\\\": // atomEscape\n case \"[\": // characterClass\n // TODO: isAtom must be called before isAssertion - disambiguate\n case \"(\": // group\n return true;\n default:\n return false;\n }\n }\n\n protected isAssertion(): boolean {\n switch (this.peekChar(0)) {\n case \"^\":\n case \"$\":\n return true;\n // '\\b' or '\\B'\n case \"\\\\\":\n switch (this.peekChar(1)) {\n case \"b\":\n case \"B\":\n return true;\n default:\n return false;\n }\n // '(?=' or '(?!'\n case \"(\":\n return (\n this.peekChar(1) === \"?\" &&\n (this.peekChar(2) === \"=\" || this.peekChar(2) === \"!\")\n );\n default:\n return false;\n }\n }\n\n protected isQuantifier(): boolean {\n const prevState = this.saveState();\n try {\n return this.quantifier(true) !== undefined;\n } catch (e) {\n return false;\n } finally {\n this.restoreState(prevState);\n }\n }\n\n protected isPatternCharacter(): boolean {\n switch (this.peekChar()) {\n case \"^\":\n case \"$\":\n case \"\\\\\":\n case \".\":\n case \"*\":\n case \"+\":\n case \"?\":\n case \"(\":\n case \")\":\n case \"[\":\n case \"|\":\n case \"/\":\n case \"\\n\":\n case \"\\r\":\n case \"\\u2028\":\n case \"\\u2029\":\n return false;\n default:\n return true;\n }\n }\n\n protected parseHexDigits(howMany: number): Omit {\n let hexString = \"\";\n for (let i = 0; i < howMany; i++) {\n const hexChar = this.popChar();\n if (hexDigitPattern.test(hexChar) === false) {\n throw Error(\"Expecting a HexDecimal digits\");\n }\n hexString += hexChar;\n }\n const charCode = parseInt(hexString, 16);\n return { type: \"Character\", value: charCode };\n }\n\n protected peekChar(howMuch = 0): string {\n return this.input[this.idx + howMuch];\n }\n\n protected popChar(): string {\n const nextChar = this.peekChar(0);\n this.consumeChar(undefined);\n return nextChar;\n }\n\n protected consumeChar(char: string | undefined): void {\n if (char !== undefined && this.input[this.idx] !== char) {\n throw Error(\n \"Expected: '\" +\n char +\n \"' but found: '\" +\n this.input[this.idx] +\n \"' at offset: \" +\n this.idx,\n );\n }\n\n if (this.idx >= this.input.length) {\n throw Error(\"Unexpected end of input\");\n }\n this.idx++;\n }\n\n protected loc(begin: number): Location {\n return { begin: begin, end: this.idx };\n }\n}\n", "import type {\n Alternative,\n Assertion,\n Character,\n Disjunction,\n Group,\n GroupBackReference,\n IRegExpAST,\n Quantifier,\n RegExpAstPart,\n RegExpFlags,\n RegExpPattern,\n Set,\n} from \"../types\";\n\nexport class BaseRegExpVisitor {\n public visitChildren(node: IRegExpAST) {\n for (const key in node) {\n const child = (node as any)[key];\n /* istanbul ignore else */\n if (node.hasOwnProperty(key)) {\n if (child.type !== undefined) {\n this.visit(child);\n } else if (Array.isArray(child)) {\n child.forEach((subChild) => {\n this.visit(subChild);\n }, this);\n }\n }\n }\n }\n\n public visit(node: RegExpAstPart): void {\n switch (node.type) {\n case \"Pattern\":\n this.visitPattern(node);\n break;\n case \"Flags\":\n this.visitFlags(node);\n break;\n case \"Disjunction\":\n this.visitDisjunction(node);\n break;\n case \"Alternative\":\n this.visitAlternative(node);\n break;\n case \"StartAnchor\":\n this.visitStartAnchor(node);\n break;\n case \"EndAnchor\":\n this.visitEndAnchor(node);\n break;\n case \"WordBoundary\":\n this.visitWordBoundary(node);\n break;\n case \"NonWordBoundary\":\n this.visitNonWordBoundary(node);\n break;\n case \"Lookahead\":\n this.visitLookahead(node);\n break;\n case \"NegativeLookahead\":\n this.visitNegativeLookahead(node);\n break;\n case \"Character\":\n this.visitCharacter(node);\n break;\n case \"Set\":\n this.visitSet(node);\n break;\n case \"Group\":\n this.visitGroup(node);\n break;\n case \"GroupBackReference\":\n this.visitGroupBackReference(node);\n break;\n case \"Quantifier\":\n this.visitQuantifier(node);\n break;\n }\n\n this.visitChildren(node);\n }\n\n public visitPattern(node: RegExpPattern): void {}\n\n public visitFlags(node: RegExpFlags): void {}\n\n public visitDisjunction(node: Disjunction): void {}\n\n public visitAlternative(node: Alternative): void {}\n\n // Assertion\n public visitStartAnchor(node: Assertion): void {}\n\n public visitEndAnchor(node: Assertion): void {}\n\n public visitWordBoundary(node: Assertion): void {}\n\n public visitNonWordBoundary(node: Assertion): void {}\n\n public visitLookahead(node: Assertion): void {}\n\n public visitNegativeLookahead(node: Assertion): void {}\n\n // atoms\n public visitCharacter(node: Character): void {}\n\n public visitSet(node: Set): void {}\n\n public visitGroup(node: Group): void {}\n\n public visitGroupBackReference(node: GroupBackReference): void {}\n\n public visitQuantifier(node: Quantifier): void {}\n}\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport { DefaultNameRegexp } from '../utils/cst-utils.js';\r\nimport { isCommentTerminal, terminalRegex } from '../utils/grammar-utils.js';\r\nimport { isMultilineComment } from '../utils/regexp-utils.js';\r\nimport { isTerminalRule } from './generated/ast.js';\r\n\r\nexport interface GrammarConfig {\r\n /**\r\n * Lists all rule names which are classified as multiline comment rules\r\n */\r\n multilineCommentRules: string[]\r\n /**\r\n * A regular expression which matches characters of names\r\n */\r\n nameRegexp: RegExp\r\n}\r\n\r\n/**\r\n * Create the default grammar configuration (used by `createDefaultModule`). This can be overridden in a\r\n * language-specific module.\r\n */\r\nexport function createGrammarConfig(services: LangiumCoreServices): GrammarConfig {\r\n const rules: string[] = [];\r\n const grammar = services.Grammar;\r\n for (const rule of grammar.rules) {\r\n if (isTerminalRule(rule) && isCommentTerminal(rule) && isMultilineComment(terminalRegex(rule))) {\r\n rules.push(rule.name);\r\n }\r\n }\r\n return {\r\n multilineCommentRules: rules,\r\n nameRegexp: DefaultNameRegexp\r\n };\r\n}\r\n", "export function PRINT_ERROR(msg: string) {\n /* istanbul ignore else - can't override global.console in node.js */\n if (console && console.error) {\n console.error(`Error: ${msg}`);\n }\n}\n\nexport function PRINT_WARNING(msg: string) {\n /* istanbul ignore else - can't override global.console in node.js*/\n if (console && console.warn) {\n // TODO: modify docs accordingly\n console.warn(`Warning: ${msg}`);\n }\n}\n", "export function timer(func: () => T): { time: number; value: T } {\n const start = new Date().getTime();\n const val = func();\n const end = new Date().getTime();\n const total = end - start;\n return { time: total, value: val };\n}\n", "// based on: https://github.com/petkaantonov/bluebird/blob/b97c0d2d487e8c5076e8bd897e0dcd4622d31846/src/util.js#L201-L216\nexport function toFastProperties(toBecomeFast: any) {\n function FakeConstructor() {}\n\n // If our object is used as a constructor, it would receive\n FakeConstructor.prototype = toBecomeFast;\n const fakeInstance = new (FakeConstructor as any)();\n\n function fakeAccess() {\n return typeof fakeInstance.bar;\n }\n\n // help V8 understand this is a \"real\" prototype by actually using\n // the fake instance.\n fakeAccess();\n fakeAccess();\n\n // Always true condition to suppress the Firefox warning of unreachable\n // code after a return statement.\n if (1) return toBecomeFast;\n\n // Eval prevents optimization of this method (even though this is dead code)\n // - https://esbuild.github.io/content-types/#direct-eval\n /* istanbul ignore next */\n // tslint:disable-next-line\n (0, eval)(toBecomeFast);\n}\n", "import { assign, forEach, isRegExp, isString, map, pickBy } from \"lodash-es\";\nimport type {\n IGASTVisitor,\n IProduction,\n IProductionWithOccurrence,\n ISerializedGast,\n TokenType,\n} from \"@chevrotain/types\";\n\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction tokenLabel(tokType: TokenType): string {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n } else {\n return tokType.name;\n }\n}\n\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction hasTokenLabel(\n obj: TokenType,\n): obj is TokenType & Pick, \"LABEL\"> {\n return isString(obj.LABEL) && obj.LABEL !== \"\";\n}\n\nexport abstract class AbstractProduction\n implements IProduction\n{\n public get definition(): T[] {\n return this._definition;\n }\n public set definition(value: T[]) {\n this._definition = value;\n }\n\n constructor(protected _definition: T[]) {}\n\n accept(visitor: IGASTVisitor): void {\n visitor.visit(this);\n forEach(this.definition, (prod) => {\n prod.accept(visitor);\n });\n }\n}\n\nexport class NonTerminal\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public nonTerminalName!: string;\n public label?: string;\n public referencedRule!: Rule;\n public idx: number = 1;\n\n constructor(options: {\n nonTerminalName: string;\n label?: string;\n referencedRule?: Rule;\n idx?: number;\n }) {\n super([]);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n\n set definition(definition: IProduction[]) {\n // immutable\n }\n\n get definition(): IProduction[] {\n if (this.referencedRule !== undefined) {\n return this.referencedRule.definition;\n }\n return [];\n }\n\n accept(visitor: IGASTVisitor): void {\n visitor.visit(this);\n // don't visit children of a reference, we will get cyclic infinite loops if we do so\n }\n}\n\nexport class Rule extends AbstractProduction {\n public name!: string;\n public orgText: string = \"\";\n\n constructor(options: {\n name: string;\n definition: IProduction[];\n orgText?: string;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class Alternative extends AbstractProduction {\n public ignoreAmbiguities: boolean = false;\n\n constructor(options: {\n definition: IProduction[];\n ignoreAmbiguities?: boolean;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class Option\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public idx: number = 1;\n public maxLookahead?: number;\n\n constructor(options: {\n definition: IProduction[];\n idx?: number;\n maxLookahead?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class RepetitionMandatory\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public idx: number = 1;\n public maxLookahead?: number;\n\n constructor(options: {\n definition: IProduction[];\n idx?: number;\n maxLookahead?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class RepetitionMandatoryWithSeparator\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public separator!: TokenType;\n public idx: number = 1;\n public maxLookahead?: number;\n\n constructor(options: {\n definition: IProduction[];\n separator: TokenType;\n idx?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class Repetition\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public separator!: TokenType;\n public idx: number = 1;\n public maxLookahead?: number;\n\n constructor(options: {\n definition: IProduction[];\n idx?: number;\n maxLookahead?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class RepetitionWithSeparator\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public separator!: TokenType;\n public idx: number = 1;\n public maxLookahead?: number;\n\n constructor(options: {\n definition: IProduction[];\n separator: TokenType;\n idx?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class Alternation\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public idx: number = 1;\n public ignoreAmbiguities: boolean = false;\n public hasPredicates: boolean = false;\n public maxLookahead?: number;\n\n public get definition(): Alternative[] {\n return this._definition;\n }\n public set definition(value: Alternative[]) {\n this._definition = value;\n }\n\n constructor(options: {\n definition: Alternative[];\n idx?: number;\n ignoreAmbiguities?: boolean;\n hasPredicates?: boolean;\n maxLookahead?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class Terminal implements IProductionWithOccurrence {\n public terminalType!: TokenType;\n public label?: string;\n public idx: number = 1;\n\n constructor(options: {\n terminalType: TokenType;\n label?: string;\n idx?: number;\n }) {\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n\n accept(visitor: IGASTVisitor): void {\n visitor.visit(this);\n }\n}\n\nexport interface ISerializedBasic extends ISerializedGast {\n type:\n | \"Alternative\"\n | \"Option\"\n | \"RepetitionMandatory\"\n | \"Repetition\"\n | \"Alternation\";\n idx?: number;\n}\n\nexport interface ISerializedGastRule extends ISerializedGast {\n type: \"Rule\";\n name: string;\n orgText: string;\n}\n\nexport interface ISerializedNonTerminal extends ISerializedGast {\n type: \"NonTerminal\";\n name: string;\n label?: string;\n idx: number;\n}\n\nexport interface ISerializedTerminal extends ISerializedGast {\n type: \"Terminal\";\n name: string;\n terminalLabel?: string;\n label?: string;\n pattern?: string;\n idx: number;\n}\n\nexport interface ISerializedTerminalWithSeparator extends ISerializedGast {\n type: \"RepetitionMandatoryWithSeparator\" | \"RepetitionWithSeparator\";\n idx: number;\n separator: ISerializedTerminal;\n}\n\nexport type ISerializedGastAny =\n | ISerializedBasic\n | ISerializedGastRule\n | ISerializedNonTerminal\n | ISerializedTerminal\n | ISerializedTerminalWithSeparator;\n\nexport function serializeGrammar(topRules: Rule[]): ISerializedGast[] {\n return map(topRules, serializeProduction);\n}\n\nexport function serializeProduction(node: IProduction): ISerializedGast {\n function convertDefinition(definition: IProduction[]): ISerializedGast[] {\n return map(definition, serializeProduction);\n }\n /* istanbul ignore else */\n if (node instanceof NonTerminal) {\n const serializedNonTerminal: ISerializedNonTerminal = {\n type: \"NonTerminal\",\n name: node.nonTerminalName,\n idx: node.idx,\n };\n\n if (isString(node.label)) {\n serializedNonTerminal.label = node.label;\n }\n\n return serializedNonTerminal;\n } else if (node instanceof Alternative) {\n return {\n type: \"Alternative\",\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof Option) {\n return {\n type: \"Option\",\n idx: node.idx,\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof RepetitionMandatory) {\n return {\n type: \"RepetitionMandatory\",\n idx: node.idx,\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof RepetitionMandatoryWithSeparator) {\n return {\n type: \"RepetitionMandatoryWithSeparator\",\n idx: node.idx,\n separator: (\n serializeProduction(new Terminal({ terminalType: node.separator }))\n ),\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof RepetitionWithSeparator) {\n return {\n type: \"RepetitionWithSeparator\",\n idx: node.idx,\n separator: (\n serializeProduction(new Terminal({ terminalType: node.separator }))\n ),\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof Repetition) {\n return {\n type: \"Repetition\",\n idx: node.idx,\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof Alternation) {\n return {\n type: \"Alternation\",\n idx: node.idx,\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof Terminal) {\n const serializedTerminal = {\n type: \"Terminal\",\n name: node.terminalType.name,\n label: tokenLabel(node.terminalType),\n idx: node.idx,\n };\n\n if (isString(node.label)) {\n serializedTerminal.terminalLabel = node.label;\n }\n\n const pattern = node.terminalType.PATTERN;\n if (node.terminalType.PATTERN) {\n serializedTerminal.pattern = isRegExp(pattern)\n ? (pattern).source\n : pattern;\n }\n\n return serializedTerminal;\n } else if (node instanceof Rule) {\n return {\n type: \"Rule\",\n name: node.name,\n orgText: node.orgText,\n definition: convertDefinition(node.definition),\n };\n /* c8 ignore next 3 */\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n", "import {\n Alternation,\n Alternative,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Rule,\n Terminal,\n} from \"./model.js\";\nimport type { IProduction } from \"@chevrotain/types\";\n\nexport abstract class GAstVisitor {\n public visit(node: IProduction): any {\n const nodeAny: any = node;\n switch (nodeAny.constructor) {\n case NonTerminal:\n return this.visitNonTerminal(nodeAny);\n case Alternative:\n return this.visitAlternative(nodeAny);\n case Option:\n return this.visitOption(nodeAny);\n case RepetitionMandatory:\n return this.visitRepetitionMandatory(nodeAny);\n case RepetitionMandatoryWithSeparator:\n return this.visitRepetitionMandatoryWithSeparator(nodeAny);\n case RepetitionWithSeparator:\n return this.visitRepetitionWithSeparator(nodeAny);\n case Repetition:\n return this.visitRepetition(nodeAny);\n case Alternation:\n return this.visitAlternation(nodeAny);\n case Terminal:\n return this.visitTerminal(nodeAny);\n case Rule:\n return this.visitRule(nodeAny);\n /* c8 ignore next 2 */\n default:\n throw Error(\"non exhaustive match\");\n }\n }\n\n /* c8 ignore next */\n public visitNonTerminal(node: NonTerminal): any {}\n\n /* c8 ignore next */\n public visitAlternative(node: Alternative): any {}\n\n /* c8 ignore next */\n public visitOption(node: Option): any {}\n\n /* c8 ignore next */\n public visitRepetition(node: Repetition): any {}\n\n /* c8 ignore next */\n public visitRepetitionMandatory(node: RepetitionMandatory): any {}\n\n /* c8 ignore next 3 */\n public visitRepetitionMandatoryWithSeparator(\n node: RepetitionMandatoryWithSeparator,\n ): any {}\n\n /* c8 ignore next */\n public visitRepetitionWithSeparator(node: RepetitionWithSeparator): any {}\n\n /* c8 ignore next */\n public visitAlternation(node: Alternation): any {}\n\n /* c8 ignore next */\n public visitTerminal(node: Terminal): any {}\n\n /* c8 ignore next */\n public visitRule(node: Rule): any {}\n}\n", "import { every, includes, some } from \"lodash-es\";\nimport {\n AbstractProduction,\n Alternation,\n Alternative,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Rule,\n Terminal,\n} from \"./model.js\";\nimport type { IProduction, IProductionWithOccurrence } from \"@chevrotain/types\";\n\nexport function isSequenceProd(\n prod: IProduction,\n): prod is { definition: IProduction[] } & IProduction {\n return (\n prod instanceof Alternative ||\n prod instanceof Option ||\n prod instanceof Repetition ||\n prod instanceof RepetitionMandatory ||\n prod instanceof RepetitionMandatoryWithSeparator ||\n prod instanceof RepetitionWithSeparator ||\n prod instanceof Terminal ||\n prod instanceof Rule\n );\n}\n\nexport function isOptionalProd(\n prod: IProduction,\n alreadyVisited: NonTerminal[] = [],\n): boolean {\n const isDirectlyOptional =\n prod instanceof Option ||\n prod instanceof Repetition ||\n prod instanceof RepetitionWithSeparator;\n if (isDirectlyOptional) {\n return true;\n }\n\n // note that this can cause infinite loop if one optional empty TOP production has a cyclic dependency with another\n // empty optional top rule\n // may be indirectly optional ((A?B?C?) | (D?E?F?))\n if (prod instanceof Alternation) {\n // for OR its enough for just one of the alternatives to be optional\n return some((prod).definition, (subProd: IProduction) => {\n return isOptionalProd(subProd, alreadyVisited);\n });\n } else if (prod instanceof NonTerminal && includes(alreadyVisited, prod)) {\n // avoiding stack overflow due to infinite recursion\n return false;\n } else if (prod instanceof AbstractProduction) {\n if (prod instanceof NonTerminal) {\n alreadyVisited.push(prod);\n }\n return every(\n (prod).definition,\n (subProd: IProduction) => {\n return isOptionalProd(subProd, alreadyVisited);\n },\n );\n } else {\n return false;\n }\n}\n\nexport function isBranchingProd(\n prod: IProduction,\n): prod is { definition: IProduction[] } & IProduction {\n return prod instanceof Alternation;\n}\n\nexport function getProductionDslName(prod: IProductionWithOccurrence): string {\n /* istanbul ignore else */\n if (prod instanceof NonTerminal) {\n return \"SUBRULE\";\n } else if (prod instanceof Option) {\n return \"OPTION\";\n } else if (prod instanceof Alternation) {\n return \"OR\";\n } else if (prod instanceof RepetitionMandatory) {\n return \"AT_LEAST_ONE\";\n } else if (prod instanceof RepetitionMandatoryWithSeparator) {\n return \"AT_LEAST_ONE_SEP\";\n } else if (prod instanceof RepetitionWithSeparator) {\n return \"MANY_SEP\";\n } else if (prod instanceof Repetition) {\n return \"MANY\";\n } else if (prod instanceof Terminal) {\n return \"CONSUME\";\n /* c8 ignore next 3 */\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n", "import { drop, forEach } from \"lodash-es\";\nimport {\n Alternation,\n Alternative,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Terminal,\n} from \"@chevrotain/gast\";\nimport { IProduction } from \"@chevrotain/types\";\n\n/**\n * A Grammar Walker that computes the \"remaining\" grammar \"after\" a productions in the grammar.\n */\nexport abstract class RestWalker {\n walk(prod: { definition: IProduction[] }, prevRest: any[] = []): void {\n forEach(prod.definition, (subProd: IProduction, index) => {\n const currRest = drop(prod.definition, index + 1);\n /* istanbul ignore else */\n if (subProd instanceof NonTerminal) {\n this.walkProdRef(subProd, currRest, prevRest);\n } else if (subProd instanceof Terminal) {\n this.walkTerminal(subProd, currRest, prevRest);\n } else if (subProd instanceof Alternative) {\n this.walkFlat(subProd, currRest, prevRest);\n } else if (subProd instanceof Option) {\n this.walkOption(subProd, currRest, prevRest);\n } else if (subProd instanceof RepetitionMandatory) {\n this.walkAtLeastOne(subProd, currRest, prevRest);\n } else if (subProd instanceof RepetitionMandatoryWithSeparator) {\n this.walkAtLeastOneSep(subProd, currRest, prevRest);\n } else if (subProd instanceof RepetitionWithSeparator) {\n this.walkManySep(subProd, currRest, prevRest);\n } else if (subProd instanceof Repetition) {\n this.walkMany(subProd, currRest, prevRest);\n } else if (subProd instanceof Alternation) {\n this.walkOr(subProd, currRest, prevRest);\n } else {\n throw Error(\"non exhaustive match\");\n }\n });\n }\n\n walkTerminal(\n terminal: Terminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {}\n\n walkProdRef(\n refProd: NonTerminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {}\n\n walkFlat(\n flatProd: Alternative,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABCDEF => after the D the rest is EF\n const fullOrRest = currRest.concat(prevRest);\n this.walk(flatProd, fullOrRest);\n }\n\n walkOption(\n optionProd: Option,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC(DE)?F => after the (DE)? the rest is F\n const fullOrRest = currRest.concat(prevRest);\n this.walk(optionProd, fullOrRest);\n }\n\n walkAtLeastOne(\n atLeastOneProd: RepetitionMandatory,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC(DE)+F => after the (DE)+ the rest is (DE)?F\n const fullAtLeastOneRest: IProduction[] = [\n new Option({ definition: atLeastOneProd.definition }),\n ].concat(currRest, prevRest);\n this.walk(atLeastOneProd, fullAtLeastOneRest);\n }\n\n walkAtLeastOneSep(\n atLeastOneSepProd: RepetitionMandatoryWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC DE(,DE)* F => after the (,DE)+ the rest is (,DE)?F\n const fullAtLeastOneSepRest = restForRepetitionWithSeparator(\n atLeastOneSepProd,\n currRest,\n prevRest,\n );\n this.walk(atLeastOneSepProd, fullAtLeastOneSepRest);\n }\n\n walkMany(\n manyProd: Repetition,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC(DE)*F => after the (DE)* the rest is (DE)?F\n const fullManyRest: IProduction[] = [\n new Option({ definition: manyProd.definition }),\n ].concat(currRest, prevRest);\n this.walk(manyProd, fullManyRest);\n }\n\n walkManySep(\n manySepProd: RepetitionWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC (DE(,DE)*)? F => after the (,DE)* the rest is (,DE)?F\n const fullManySepRest = restForRepetitionWithSeparator(\n manySepProd,\n currRest,\n prevRest,\n );\n this.walk(manySepProd, fullManySepRest);\n }\n\n walkOr(\n orProd: Alternation,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC(D|E|F)G => when finding the (D|E|F) the rest is G\n const fullOrRest = currRest.concat(prevRest);\n // walk all different alternatives\n forEach(orProd.definition, (alt) => {\n // wrapping each alternative in a single definition wrapper\n // to avoid errors in computing the rest of that alternative in the invocation to computeInProdFollows\n // (otherwise for OR([alt1,alt2]) alt2 will be considered in 'rest' of alt1\n const prodWrapper = new Alternative({ definition: [alt] });\n this.walk(prodWrapper, fullOrRest);\n });\n }\n}\n\nfunction restForRepetitionWithSeparator(\n repSepProd: RepetitionWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n) {\n const repSepRest = [\n new Option({\n definition: [\n new Terminal({ terminalType: repSepProd.separator }) as IProduction,\n ].concat(repSepProd.definition),\n }) as IProduction,\n ];\n const fullRepSepRest: IProduction[] = repSepRest.concat(currRest, prevRest);\n return fullRepSepRest;\n}\n", "import { flatten, map, uniq } from \"lodash-es\";\nimport {\n isBranchingProd,\n isOptionalProd,\n isSequenceProd,\n NonTerminal,\n Terminal,\n} from \"@chevrotain/gast\";\nimport { IProduction, TokenType } from \"@chevrotain/types\";\n\nexport function first(prod: IProduction): TokenType[] {\n /* istanbul ignore else */\n if (prod instanceof NonTerminal) {\n // this could in theory cause infinite loops if\n // (1) prod A refs prod B.\n // (2) prod B refs prod A\n // (3) AB can match the empty set\n // in other words a cycle where everything is optional so the first will keep\n // looking ahead for the next optional part and will never exit\n // currently there is no safeguard for this unique edge case because\n // (1) not sure a grammar in which this can happen is useful for anything (productive)\n return first((prod).referencedRule);\n } else if (prod instanceof Terminal) {\n return firstForTerminal(prod);\n } else if (isSequenceProd(prod)) {\n return firstForSequence(prod);\n } else if (isBranchingProd(prod)) {\n return firstForBranching(prod);\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n\nexport function firstForSequence(prod: {\n definition: IProduction[];\n}): TokenType[] {\n let firstSet: TokenType[] = [];\n const seq = prod.definition;\n let nextSubProdIdx = 0;\n let hasInnerProdsRemaining = seq.length > nextSubProdIdx;\n let currSubProd;\n // so we enter the loop at least once (if the definition is not empty\n let isLastInnerProdOptional = true;\n // scan a sequence until it's end or until we have found a NONE optional production in it\n while (hasInnerProdsRemaining && isLastInnerProdOptional) {\n currSubProd = seq[nextSubProdIdx];\n isLastInnerProdOptional = isOptionalProd(currSubProd);\n firstSet = firstSet.concat(first(currSubProd));\n nextSubProdIdx = nextSubProdIdx + 1;\n hasInnerProdsRemaining = seq.length > nextSubProdIdx;\n }\n\n return uniq(firstSet);\n}\n\nexport function firstForBranching(prod: {\n definition: IProduction[];\n}): TokenType[] {\n const allAlternativesFirsts: TokenType[][] = map(\n prod.definition,\n (innerProd) => {\n return first(innerProd);\n },\n );\n return uniq(flatten(allAlternativesFirsts));\n}\n\nexport function firstForTerminal(terminal: Terminal): TokenType[] {\n return [terminal.terminalType];\n}\n", "// TODO: can this be removed? where is it used?\nexport const IN = \"_~IN~_\";\n", "import { RestWalker } from \"./rest.js\";\nimport { first } from \"./first.js\";\nimport { assign, forEach } from \"lodash-es\";\nimport { IN } from \"../constants.js\";\nimport { Alternative, NonTerminal, Rule, Terminal } from \"@chevrotain/gast\";\nimport { IProduction, TokenType } from \"@chevrotain/types\";\n\n// This ResyncFollowsWalker computes all of the follows required for RESYNC\n// (skipping reference production).\nexport class ResyncFollowsWalker extends RestWalker {\n public follows: Record = {};\n\n constructor(private topProd: Rule) {\n super();\n }\n\n startWalking(): Record {\n this.walk(this.topProd);\n return this.follows;\n }\n\n walkTerminal(\n terminal: Terminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // do nothing! just like in the public sector after 13:00\n }\n\n walkProdRef(\n refProd: NonTerminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n const followName =\n buildBetweenProdsFollowPrefix(refProd.referencedRule, refProd.idx) +\n this.topProd.name;\n const fullRest: IProduction[] = currRest.concat(prevRest);\n const restProd = new Alternative({ definition: fullRest });\n const t_in_topProd_follows = first(restProd);\n this.follows[followName] = t_in_topProd_follows;\n }\n}\n\nexport function computeAllProdsFollows(\n topProductions: Rule[],\n): Record {\n const reSyncFollows = {};\n\n forEach(topProductions, (topProd) => {\n const currRefsFollow = new ResyncFollowsWalker(topProd).startWalking();\n assign(reSyncFollows, currRefsFollow);\n });\n return reSyncFollows;\n}\n\nexport function buildBetweenProdsFollowPrefix(\n inner: Rule,\n occurenceInParent: number,\n): string {\n return inner.name + occurenceInParent + IN;\n}\n\nexport function buildInProdFollowPrefix(terminal: Terminal): string {\n const terminalName = terminal.terminalType.name;\n return terminalName + terminal.idx + IN;\n}\n", "import {\n Alternative,\n Assertion,\n Atom,\n Disjunction,\n RegExpParser,\n RegExpPattern,\n} from \"@chevrotain/regexp-to-ast\";\n\nlet regExpAstCache: { [regex: string]: RegExpPattern } = {};\nconst regExpParser = new RegExpParser();\n\n// this should be moved to regexp-to-ast\nexport type ASTNode =\n | RegExpPattern\n | Disjunction\n | Alternative\n | Assertion\n | Atom;\n\nexport function getRegExpAst(regExp: RegExp): RegExpPattern {\n const regExpStr = regExp.toString();\n if (regExpAstCache.hasOwnProperty(regExpStr)) {\n return regExpAstCache[regExpStr];\n } else {\n const regExpAst = regExpParser.pattern(regExpStr);\n regExpAstCache[regExpStr] = regExpAst;\n return regExpAst;\n }\n}\n\nexport function clearRegExpParserCache() {\n regExpAstCache = {};\n}\n", "import {\n Alternative,\n Atom,\n BaseRegExpVisitor,\n Character,\n Disjunction,\n Group,\n Set,\n} from \"@chevrotain/regexp-to-ast\";\nimport { every, find, forEach, includes, isArray, values } from \"lodash-es\";\nimport { PRINT_ERROR, PRINT_WARNING } from \"@chevrotain/utils\";\nimport { ASTNode, getRegExpAst } from \"./reg_exp_parser.js\";\nimport { charCodeToOptimizedIndex, minOptimizationVal } from \"./lexer.js\";\n\nconst complementErrorMessage =\n \"Complement Sets are not supported for first char optimization\";\nexport const failedOptimizationPrefixMsg =\n 'Unable to use \"first char\" lexer optimizations:\\n';\n\nexport function getOptimizedStartCodesIndices(\n regExp: RegExp,\n ensureOptimizations = false,\n): number[] {\n try {\n const ast = getRegExpAst(regExp);\n const firstChars = firstCharOptimizedIndices(\n ast.value,\n {},\n ast.flags.ignoreCase,\n );\n return firstChars;\n } catch (e) {\n /* istanbul ignore next */\n // Testing this relies on the regexp-to-ast library having a bug... */\n // TODO: only the else branch needs to be ignored, try to fix with newer prettier / tsc\n if (e.message === complementErrorMessage) {\n if (ensureOptimizations) {\n PRINT_WARNING(\n `${failedOptimizationPrefixMsg}` +\n `\\tUnable to optimize: < ${regExp.toString()} >\\n` +\n \"\\tComplement Sets cannot be automatically optimized.\\n\" +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.\",\n );\n }\n } else {\n let msgSuffix = \"\";\n if (ensureOptimizations) {\n msgSuffix =\n \"\\n\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.\";\n }\n PRINT_ERROR(\n `${failedOptimizationPrefixMsg}\\n` +\n `\\tFailed parsing: < ${regExp.toString()} >\\n` +\n `\\tUsing the @chevrotain/regexp-to-ast library\\n` +\n \"\\tPlease open an issue at: https://github.com/chevrotain/chevrotain/issues\" +\n msgSuffix,\n );\n }\n }\n\n return [];\n}\n\nexport function firstCharOptimizedIndices(\n ast: ASTNode,\n result: { [charCode: number]: number },\n ignoreCase: boolean,\n): number[] {\n switch (ast.type) {\n case \"Disjunction\":\n for (let i = 0; i < ast.value.length; i++) {\n firstCharOptimizedIndices(ast.value[i], result, ignoreCase);\n }\n break;\n case \"Alternative\":\n const terms = ast.value;\n for (let i = 0; i < terms.length; i++) {\n const term = terms[i];\n\n // skip terms that cannot effect the first char results\n switch (term.type) {\n case \"EndAnchor\":\n // A group back reference cannot affect potential starting char.\n // because if a back reference is the first production than automatically\n // the group being referenced has had to come BEFORE so its codes have already been added\n case \"GroupBackReference\":\n // assertions do not affect potential starting codes\n case \"Lookahead\":\n case \"NegativeLookahead\":\n case \"StartAnchor\":\n case \"WordBoundary\":\n case \"NonWordBoundary\":\n continue;\n }\n\n const atom = term;\n switch (atom.type) {\n case \"Character\":\n addOptimizedIdxToResult(atom.value, result, ignoreCase);\n break;\n case \"Set\":\n if (atom.complement === true) {\n throw Error(complementErrorMessage);\n }\n forEach(atom.value, (code) => {\n if (typeof code === \"number\") {\n addOptimizedIdxToResult(code, result, ignoreCase);\n } else {\n // range\n const range = code as any;\n // cannot optimize when ignoreCase is\n if (ignoreCase === true) {\n for (\n let rangeCode = range.from;\n rangeCode <= range.to;\n rangeCode++\n ) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n }\n // Optimization (2 orders of magnitude less work for very large ranges)\n else {\n // handle unoptimized values\n for (\n let rangeCode = range.from;\n rangeCode <= range.to && rangeCode < minOptimizationVal;\n rangeCode++\n ) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n\n // Less common charCode where we optimize for faster init time, by using larger \"buckets\"\n if (range.to >= minOptimizationVal) {\n const minUnOptVal =\n range.from >= minOptimizationVal\n ? range.from\n : minOptimizationVal;\n const maxUnOptVal = range.to;\n const minOptIdx = charCodeToOptimizedIndex(minUnOptVal);\n const maxOptIdx = charCodeToOptimizedIndex(maxUnOptVal);\n\n for (\n let currOptIdx = minOptIdx;\n currOptIdx <= maxOptIdx;\n currOptIdx++\n ) {\n result[currOptIdx] = currOptIdx;\n }\n }\n }\n }\n });\n break;\n case \"Group\":\n firstCharOptimizedIndices(atom.value, result, ignoreCase);\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"Non Exhaustive Match\");\n }\n\n // reached a mandatory production, no more **start** codes can be found on this alternative\n const isOptionalQuantifier =\n atom.quantifier !== undefined && atom.quantifier.atLeast === 0;\n if (\n // A group may be optional due to empty contents /(?:)/\n // or if everything inside it is optional /((a)?)/\n (atom.type === \"Group\" && isWholeOptional(atom) === false) ||\n // If this term is not a group it may only be optional if it has an optional quantifier\n (atom.type !== \"Group\" && isOptionalQuantifier === false)\n ) {\n break;\n }\n }\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"non exhaustive match!\");\n }\n\n // console.log(Object.keys(result).length)\n return values(result);\n}\n\nfunction addOptimizedIdxToResult(\n code: number,\n result: { [charCode: number]: number },\n ignoreCase: boolean,\n) {\n const optimizedCharIdx = charCodeToOptimizedIndex(code);\n result[optimizedCharIdx] = optimizedCharIdx;\n\n if (ignoreCase === true) {\n handleIgnoreCase(code, result);\n }\n}\n\nfunction handleIgnoreCase(\n code: number,\n result: { [charCode: number]: number },\n) {\n const char = String.fromCharCode(code);\n const upperChar = char.toUpperCase();\n /* istanbul ignore else */\n if (upperChar !== char) {\n const optimizedCharIdx = charCodeToOptimizedIndex(upperChar.charCodeAt(0));\n result[optimizedCharIdx] = optimizedCharIdx;\n } else {\n const lowerChar = char.toLowerCase();\n if (lowerChar !== char) {\n const optimizedCharIdx = charCodeToOptimizedIndex(\n lowerChar.charCodeAt(0),\n );\n result[optimizedCharIdx] = optimizedCharIdx;\n }\n }\n}\n\nfunction findCode(setNode: Set, targetCharCodes: number[]) {\n return find(setNode.value, (codeOrRange) => {\n if (typeof codeOrRange === \"number\") {\n return includes(targetCharCodes, codeOrRange);\n } else {\n // range\n const range = codeOrRange;\n return (\n find(\n targetCharCodes,\n (targetCode) => range.from <= targetCode && targetCode <= range.to,\n ) !== undefined\n );\n }\n });\n}\n\nfunction isWholeOptional(ast: any): boolean {\n const quantifier = (ast as Atom).quantifier;\n if (quantifier && quantifier.atLeast === 0) {\n return true;\n }\n\n if (!ast.value) {\n return false;\n }\n\n return isArray(ast.value)\n ? every(ast.value, isWholeOptional)\n : isWholeOptional(ast.value);\n}\n\nclass CharCodeFinder extends BaseRegExpVisitor {\n found: boolean = false;\n\n constructor(private targetCharCodes: number[]) {\n super();\n }\n\n visitChildren(node: ASTNode) {\n // No need to keep looking...\n if (this.found === true) {\n return;\n }\n\n // switch lookaheads as they do not actually consume any characters thus\n // finding a charCode at lookahead context does not mean that regexp can actually contain it in a match.\n switch (node.type) {\n case \"Lookahead\":\n this.visitLookahead(node);\n return;\n case \"NegativeLookahead\":\n this.visitNegativeLookahead(node);\n return;\n }\n\n super.visitChildren(node);\n }\n\n visitCharacter(node: Character) {\n if (includes(this.targetCharCodes, node.value)) {\n this.found = true;\n }\n }\n\n visitSet(node: Set) {\n if (node.complement) {\n if (findCode(node, this.targetCharCodes) === undefined) {\n this.found = true;\n }\n } else {\n if (findCode(node, this.targetCharCodes) !== undefined) {\n this.found = true;\n }\n }\n }\n}\n\nexport function canMatchCharCode(\n charCodes: number[],\n pattern: RegExp | string,\n) {\n if (pattern instanceof RegExp) {\n const ast = getRegExpAst(pattern);\n const charCodeFinder = new CharCodeFinder(charCodes);\n charCodeFinder.visit(ast);\n return charCodeFinder.found;\n } else {\n return (\n find(pattern, (char) => {\n return includes(charCodes, (char).charCodeAt(0));\n }) !== undefined\n );\n }\n}\n", "import { BaseRegExpVisitor } from \"@chevrotain/regexp-to-ast\";\nimport {\n IRegExpExec,\n Lexer,\n LexerDefinitionErrorType,\n} from \"./lexer_public.js\";\nimport {\n compact,\n defaults,\n difference,\n filter,\n find,\n first,\n flatten,\n forEach,\n has,\n includes,\n indexOf,\n isArray,\n isEmpty,\n isFunction,\n isRegExp,\n isString,\n isUndefined,\n keys,\n map,\n reduce,\n reject,\n values,\n} from \"lodash-es\";\nimport { PRINT_ERROR } from \"@chevrotain/utils\";\nimport {\n canMatchCharCode,\n failedOptimizationPrefixMsg,\n getOptimizedStartCodesIndices,\n} from \"./reg_exp.js\";\nimport {\n ILexerDefinitionError,\n ILineTerminatorsTester,\n IMultiModeLexerDefinition,\n IToken,\n TokenType,\n} from \"@chevrotain/types\";\nimport { getRegExpAst } from \"./reg_exp_parser.js\";\n\nconst PATTERN = \"PATTERN\";\nexport const DEFAULT_MODE = \"defaultMode\";\nexport const MODES = \"modes\";\n\nexport interface IPatternConfig {\n pattern: IRegExpExec | string;\n longerAlt: number[] | undefined;\n canLineTerminator: boolean;\n isCustom: boolean;\n short: number | false;\n group: string | undefined | false;\n push: string | undefined;\n pop: boolean;\n tokenType: TokenType;\n tokenTypeIdx: number;\n}\n\nexport interface IAnalyzeResult {\n patternIdxToConfig: IPatternConfig[];\n charCodeToPatternIdxToConfig: { [charCode: number]: IPatternConfig[] };\n emptyGroups: { [groupName: string]: IToken[] };\n hasCustom: boolean;\n canBeOptimized: boolean;\n}\n\nexport let SUPPORT_STICKY =\n typeof (new RegExp(\"(?:)\")).sticky === \"boolean\";\n\nexport function disableSticky() {\n SUPPORT_STICKY = false;\n}\n\nexport function enableSticky() {\n SUPPORT_STICKY = true;\n}\n\nexport function analyzeTokenTypes(\n tokenTypes: TokenType[],\n options: {\n positionTracking?: \"full\" | \"onlyStart\" | \"onlyOffset\";\n ensureOptimizations?: boolean;\n lineTerminatorCharacters?: (number | string)[];\n // TODO: should `useSticky` be an argument here?\n useSticky?: boolean;\n safeMode?: boolean;\n tracer?: (msg: string, action: () => void) => void;\n },\n): IAnalyzeResult {\n options = defaults(options, {\n useSticky: SUPPORT_STICKY,\n debug: false as boolean,\n safeMode: false as boolean,\n positionTracking: \"full\",\n lineTerminatorCharacters: [\"\\r\", \"\\n\"],\n tracer: (msg: string, action: Function) => action(),\n });\n\n const tracer = options.tracer!;\n\n tracer(\"initCharCodeToOptimizedIndexMap\", () => {\n initCharCodeToOptimizedIndexMap();\n });\n\n let onlyRelevantTypes: TokenType[];\n tracer(\"Reject Lexer.NA\", () => {\n onlyRelevantTypes = reject(tokenTypes, (currType) => {\n return currType[PATTERN] === Lexer.NA;\n });\n });\n\n let hasCustom = false;\n let allTransformedPatterns: (IRegExpExec | string)[];\n tracer(\"Transform Patterns\", () => {\n hasCustom = false;\n allTransformedPatterns = map(\n onlyRelevantTypes,\n (currType): IRegExpExec | string => {\n const currPattern = currType[PATTERN];\n\n /* istanbul ignore else */\n if (isRegExp(currPattern)) {\n const regExpSource = currPattern.source;\n if (\n regExpSource.length === 1 &&\n // only these regExp meta characters which can appear in a length one regExp\n regExpSource !== \"^\" &&\n regExpSource !== \"$\" &&\n regExpSource !== \".\" &&\n !currPattern.ignoreCase\n ) {\n return regExpSource;\n } else if (\n regExpSource.length === 2 &&\n regExpSource[0] === \"\\\\\" &&\n // not a meta character\n !includes(\n [\n \"d\",\n \"D\",\n \"s\",\n \"S\",\n \"t\",\n \"r\",\n \"n\",\n \"t\",\n \"0\",\n \"c\",\n \"b\",\n \"B\",\n \"f\",\n \"v\",\n \"w\",\n \"W\",\n ],\n regExpSource[1],\n )\n ) {\n // escaped meta Characters: /\\+/ /\\[/\n // or redundant escaping: /\\a/\n // without the escaping \"\\\"\n return regExpSource[1];\n } else {\n return options.useSticky\n ? addStickyFlag(currPattern)\n : addStartOfInput(currPattern);\n }\n } else if (isFunction(currPattern)) {\n hasCustom = true;\n // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n return { exec: currPattern };\n } else if (typeof currPattern === \"object\") {\n hasCustom = true;\n // ICustomPattern\n return currPattern;\n } else if (typeof currPattern === \"string\") {\n if (currPattern.length === 1) {\n return currPattern;\n } else {\n const escapedRegExpString = currPattern.replace(\n /[\\\\^$.*+?()[\\]{}|]/g,\n \"\\\\$&\",\n );\n const wrappedRegExp = new RegExp(escapedRegExpString);\n return options.useSticky\n ? addStickyFlag(wrappedRegExp)\n : addStartOfInput(wrappedRegExp);\n }\n } else {\n throw Error(\"non exhaustive match\");\n }\n },\n );\n });\n\n let patternIdxToType: number[];\n let patternIdxToGroup: (string | undefined | false)[];\n let patternIdxToLongerAltIdxArr: (number[] | undefined)[];\n let patternIdxToPushMode: (string | undefined)[];\n let patternIdxToPopMode: boolean[];\n tracer(\"misc mapping\", () => {\n patternIdxToType = map(\n onlyRelevantTypes,\n (currType) => currType.tokenTypeIdx!,\n );\n\n patternIdxToGroup = map(onlyRelevantTypes, (clazz: any) => {\n const groupName = clazz.GROUP;\n /* istanbul ignore next */\n if (groupName === Lexer.SKIPPED) {\n return undefined;\n } else if (isString(groupName)) {\n return groupName;\n } else if (isUndefined(groupName)) {\n return false;\n } else {\n throw Error(\"non exhaustive match\");\n }\n });\n\n patternIdxToLongerAltIdxArr = map(onlyRelevantTypes, (clazz: any) => {\n const longerAltType = clazz.LONGER_ALT;\n\n if (longerAltType) {\n const longerAltIdxArr = isArray(longerAltType)\n ? map(longerAltType, (type: any) => indexOf(onlyRelevantTypes, type))\n : [indexOf(onlyRelevantTypes, longerAltType)];\n return longerAltIdxArr;\n }\n });\n\n patternIdxToPushMode = map(\n onlyRelevantTypes,\n (clazz: any) => clazz.PUSH_MODE,\n );\n\n patternIdxToPopMode = map(onlyRelevantTypes, (clazz: any) =>\n has(clazz, \"POP_MODE\"),\n );\n });\n\n let patternIdxToCanLineTerminator: boolean[];\n tracer(\"Line Terminator Handling\", () => {\n const lineTerminatorCharCodes = getCharCodes(\n options.lineTerminatorCharacters!,\n );\n patternIdxToCanLineTerminator = map(onlyRelevantTypes, (tokType) => false);\n if (options.positionTracking !== \"onlyOffset\") {\n patternIdxToCanLineTerminator = map(onlyRelevantTypes, (tokType) => {\n if (has(tokType, \"LINE_BREAKS\")) {\n return !!tokType.LINE_BREAKS;\n } else {\n return (\n checkLineBreaksIssues(tokType, lineTerminatorCharCodes) === false &&\n canMatchCharCode(\n lineTerminatorCharCodes,\n tokType.PATTERN as RegExp | string,\n )\n );\n }\n });\n }\n });\n\n let patternIdxToIsCustom: boolean[];\n let patternIdxToShort: (number | false)[];\n let emptyGroups!: { [groupName: string]: IToken[] };\n let patternIdxToConfig!: IPatternConfig[];\n tracer(\"Misc Mapping #2\", () => {\n patternIdxToIsCustom = map(onlyRelevantTypes, isCustomPattern);\n patternIdxToShort = map(allTransformedPatterns, isShortPattern);\n\n emptyGroups = reduce(\n onlyRelevantTypes,\n (acc, clazz: any) => {\n const groupName = clazz.GROUP;\n if (isString(groupName) && !(groupName === Lexer.SKIPPED)) {\n acc[groupName] = [];\n }\n return acc;\n },\n {} as { [groupName: string]: IToken[] },\n );\n\n patternIdxToConfig = map(\n allTransformedPatterns,\n (x, idx): IPatternConfig => {\n return {\n pattern: allTransformedPatterns[idx],\n longerAlt: patternIdxToLongerAltIdxArr[idx],\n canLineTerminator: patternIdxToCanLineTerminator[idx],\n isCustom: patternIdxToIsCustom[idx],\n short: patternIdxToShort[idx],\n group: patternIdxToGroup[idx],\n push: patternIdxToPushMode[idx],\n pop: patternIdxToPopMode[idx],\n tokenTypeIdx: patternIdxToType[idx],\n tokenType: onlyRelevantTypes[idx],\n };\n },\n );\n });\n\n let canBeOptimized = true;\n let charCodeToPatternIdxToConfig: { [charCode: number]: IPatternConfig[] } =\n [];\n\n if (!options.safeMode) {\n tracer(\"First Char Optimization\", () => {\n charCodeToPatternIdxToConfig = reduce(\n onlyRelevantTypes,\n (result, currTokType, idx) => {\n if (typeof currTokType.PATTERN === \"string\") {\n const charCode = currTokType.PATTERN.charCodeAt(0);\n const optimizedIdx = charCodeToOptimizedIndex(charCode);\n addToMapOfArrays(result, optimizedIdx, patternIdxToConfig[idx]);\n } else if (isArray(currTokType.START_CHARS_HINT)) {\n let lastOptimizedIdx: number;\n forEach(currTokType.START_CHARS_HINT, (charOrInt) => {\n const charCode =\n typeof charOrInt === \"string\"\n ? charOrInt.charCodeAt(0)\n : charOrInt;\n const currOptimizedIdx = charCodeToOptimizedIndex(charCode);\n // Avoid adding the config multiple times\n /* istanbul ignore else */\n // - Difficult to check this scenario effects as it is only a performance\n // optimization that does not change correctness\n if (lastOptimizedIdx !== currOptimizedIdx) {\n lastOptimizedIdx = currOptimizedIdx;\n addToMapOfArrays(\n result,\n currOptimizedIdx,\n patternIdxToConfig[idx],\n );\n }\n });\n } else if (isRegExp(currTokType.PATTERN)) {\n if (currTokType.PATTERN.unicode) {\n canBeOptimized = false;\n if (options.ensureOptimizations) {\n PRINT_ERROR(\n `${failedOptimizationPrefixMsg}` +\n `\\tUnable to analyze < ${currTokType.PATTERN.toString()} > pattern.\\n` +\n \"\\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\\n\" +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE\",\n );\n }\n } else {\n const optimizedCodes = getOptimizedStartCodesIndices(\n currTokType.PATTERN,\n options.ensureOptimizations,\n );\n /* istanbul ignore if */\n // start code will only be empty given an empty regExp or failure of regexp-to-ast library\n // the first should be a different validation and the second cannot be tested.\n if (isEmpty(optimizedCodes)) {\n // we cannot understand what codes may start possible matches\n // The optimization correctness requires knowing start codes for ALL patterns.\n // Not actually sure this is an error, no debug message\n canBeOptimized = false;\n }\n forEach(optimizedCodes, (code) => {\n addToMapOfArrays(result, code, patternIdxToConfig[idx]);\n });\n }\n } else {\n if (options.ensureOptimizations) {\n PRINT_ERROR(\n `${failedOptimizationPrefixMsg}` +\n `\\tTokenType: <${currTokType.name}> is using a custom token pattern without providing parameter.\\n` +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE\",\n );\n }\n canBeOptimized = false;\n }\n\n return result;\n },\n [] as { [charCode: number]: IPatternConfig[] },\n );\n });\n }\n\n return {\n emptyGroups: emptyGroups,\n patternIdxToConfig: patternIdxToConfig,\n charCodeToPatternIdxToConfig: charCodeToPatternIdxToConfig,\n hasCustom: hasCustom,\n canBeOptimized: canBeOptimized,\n };\n}\n\nexport function validatePatterns(\n tokenTypes: TokenType[],\n validModesNames: string[],\n): ILexerDefinitionError[] {\n let errors: ILexerDefinitionError[] = [];\n\n const missingResult = findMissingPatterns(tokenTypes);\n errors = errors.concat(missingResult.errors);\n\n const invalidResult = findInvalidPatterns(missingResult.valid);\n const validTokenTypes = invalidResult.valid;\n errors = errors.concat(invalidResult.errors);\n\n errors = errors.concat(validateRegExpPattern(validTokenTypes));\n\n errors = errors.concat(findInvalidGroupType(validTokenTypes));\n\n errors = errors.concat(\n findModesThatDoNotExist(validTokenTypes, validModesNames),\n );\n\n errors = errors.concat(findUnreachablePatterns(validTokenTypes));\n\n return errors;\n}\n\nfunction validateRegExpPattern(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n let errors: ILexerDefinitionError[] = [];\n const withRegExpPatterns = filter(tokenTypes, (currTokType) =>\n isRegExp(currTokType[PATTERN]),\n );\n\n errors = errors.concat(findEndOfInputAnchor(withRegExpPatterns));\n\n errors = errors.concat(findStartOfInputAnchor(withRegExpPatterns));\n\n errors = errors.concat(findUnsupportedFlags(withRegExpPatterns));\n\n errors = errors.concat(findDuplicatePatterns(withRegExpPatterns));\n\n errors = errors.concat(findEmptyMatchRegExps(withRegExpPatterns));\n\n return errors;\n}\n\nexport interface ILexerFilterResult {\n errors: ILexerDefinitionError[];\n valid: TokenType[];\n}\n\nexport function findMissingPatterns(\n tokenTypes: TokenType[],\n): ILexerFilterResult {\n const tokenTypesWithMissingPattern = filter(tokenTypes, (currType) => {\n return !has(currType, PATTERN);\n });\n\n const errors = map(tokenTypesWithMissingPattern, (currType) => {\n return {\n message:\n \"Token Type: ->\" +\n currType.name +\n \"<- missing static 'PATTERN' property\",\n type: LexerDefinitionErrorType.MISSING_PATTERN,\n tokenTypes: [currType],\n };\n });\n\n const valid = difference(tokenTypes, tokenTypesWithMissingPattern);\n return { errors, valid };\n}\n\nexport function findInvalidPatterns(\n tokenTypes: TokenType[],\n): ILexerFilterResult {\n const tokenTypesWithInvalidPattern = filter(tokenTypes, (currType) => {\n const pattern = currType[PATTERN];\n return (\n !isRegExp(pattern) &&\n !isFunction(pattern) &&\n !has(pattern, \"exec\") &&\n !isString(pattern)\n );\n });\n\n const errors = map(tokenTypesWithInvalidPattern, (currType) => {\n return {\n message:\n \"Token Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' can only be a RegExp, a\" +\n \" Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.\",\n type: LexerDefinitionErrorType.INVALID_PATTERN,\n tokenTypes: [currType],\n };\n });\n\n const valid = difference(tokenTypes, tokenTypesWithInvalidPattern);\n return { errors, valid };\n}\n\nconst end_of_input = /[^\\\\][$]/;\n\nexport function findEndOfInputAnchor(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n class EndAnchorFinder extends BaseRegExpVisitor {\n found = false;\n\n visitEndAnchor(node: unknown) {\n this.found = true;\n }\n }\n\n const invalidRegex = filter(tokenTypes, (currType) => {\n const pattern = currType.PATTERN;\n\n try {\n const regexpAst = getRegExpAst(pattern as RegExp);\n const endAnchorVisitor = new EndAnchorFinder();\n endAnchorVisitor.visit(regexpAst);\n\n return endAnchorVisitor.found;\n } catch (e) {\n // old behavior in case of runtime exceptions with regexp-to-ast.\n /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n return end_of_input.test((pattern as RegExp).source);\n }\n });\n\n const errors = map(invalidRegex, (currType) => {\n return {\n message:\n \"Unexpected RegExp Anchor Error:\\n\" +\n \"\\tToken Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' cannot contain end of input anchor '$'\\n\" +\n \"\\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\" +\n \"\\tfor details.\",\n type: LexerDefinitionErrorType.EOI_ANCHOR_FOUND,\n tokenTypes: [currType],\n };\n });\n\n return errors;\n}\n\nexport function findEmptyMatchRegExps(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n const matchesEmptyString = filter(tokenTypes, (currType) => {\n const pattern = currType.PATTERN as RegExp;\n return pattern.test(\"\");\n });\n\n const errors = map(matchesEmptyString, (currType) => {\n return {\n message:\n \"Token Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' must not match an empty string\",\n type: LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,\n tokenTypes: [currType],\n };\n });\n\n return errors;\n}\n\nconst start_of_input = /[^\\\\[][\\^]|^\\^/;\n\nexport function findStartOfInputAnchor(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n class StartAnchorFinder extends BaseRegExpVisitor {\n found = false;\n\n visitStartAnchor(node: unknown) {\n this.found = true;\n }\n }\n\n const invalidRegex = filter(tokenTypes, (currType) => {\n const pattern = currType.PATTERN as RegExp;\n try {\n const regexpAst = getRegExpAst(pattern);\n const startAnchorVisitor = new StartAnchorFinder();\n startAnchorVisitor.visit(regexpAst);\n\n return startAnchorVisitor.found;\n } catch (e) {\n // old behavior in case of runtime exceptions with regexp-to-ast.\n /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n return start_of_input.test(pattern.source);\n }\n });\n\n const errors = map(invalidRegex, (currType) => {\n return {\n message:\n \"Unexpected RegExp Anchor Error:\\n\" +\n \"\\tToken Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' cannot contain start of input anchor '^'\\n\" +\n \"\\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\" +\n \"\\tfor details.\",\n type: LexerDefinitionErrorType.SOI_ANCHOR_FOUND,\n tokenTypes: [currType],\n };\n });\n\n return errors;\n}\n\nexport function findUnsupportedFlags(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n const invalidFlags = filter(tokenTypes, (currType) => {\n const pattern = currType[PATTERN];\n return pattern instanceof RegExp && (pattern.multiline || pattern.global);\n });\n\n const errors = map(invalidFlags, (currType) => {\n return {\n message:\n \"Token Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' may NOT contain global('g') or multiline('m')\",\n type: LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,\n tokenTypes: [currType],\n };\n });\n\n return errors;\n}\n\n// This can only test for identical duplicate RegExps, not semantically equivalent ones.\nexport function findDuplicatePatterns(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n const found: TokenType[] = [];\n let identicalPatterns = map(tokenTypes, (outerType: any) => {\n return reduce(\n tokenTypes,\n (result, innerType) => {\n if (\n outerType.PATTERN.source === (innerType.PATTERN as RegExp).source &&\n !includes(found, innerType) &&\n innerType.PATTERN !== Lexer.NA\n ) {\n // this avoids duplicates in the result, each Token Type may only appear in one \"set\"\n // in essence we are creating Equivalence classes on equality relation.\n found.push(innerType);\n result.push(innerType);\n return result;\n }\n return result;\n },\n [] as TokenType[],\n );\n });\n\n identicalPatterns = compact(identicalPatterns);\n\n const duplicatePatterns = filter(identicalPatterns, (currIdenticalSet) => {\n return currIdenticalSet.length > 1;\n });\n\n const errors = map(duplicatePatterns, (setOfIdentical: any) => {\n const tokenTypeNames = map(setOfIdentical, (currType: any) => {\n return currType.name;\n });\n\n const dupPatternSrc = (first(setOfIdentical)).PATTERN;\n return {\n message:\n `The same RegExp pattern ->${dupPatternSrc}<-` +\n `has been used in all of the following Token Types: ${tokenTypeNames.join(\n \", \",\n )} <-`,\n type: LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,\n tokenTypes: setOfIdentical,\n };\n });\n\n return errors;\n}\n\nexport function findInvalidGroupType(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n const invalidTypes = filter(tokenTypes, (clazz: any) => {\n if (!has(clazz, \"GROUP\")) {\n return false;\n }\n const group = clazz.GROUP;\n\n return group !== Lexer.SKIPPED && group !== Lexer.NA && !isString(group);\n });\n\n const errors = map(invalidTypes, (currType) => {\n return {\n message:\n \"Token Type: ->\" +\n currType.name +\n \"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String\",\n type: LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,\n tokenTypes: [currType],\n };\n });\n\n return errors;\n}\n\nexport function findModesThatDoNotExist(\n tokenTypes: TokenType[],\n validModes: string[],\n): ILexerDefinitionError[] {\n const invalidModes = filter(tokenTypes, (clazz: any) => {\n return (\n clazz.PUSH_MODE !== undefined && !includes(validModes, clazz.PUSH_MODE)\n );\n });\n\n const errors = map(invalidModes, (tokType) => {\n const msg =\n `Token Type: ->${tokType.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${tokType.PUSH_MODE}<-` +\n `which does not exist`;\n return {\n message: msg,\n type: LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,\n tokenTypes: [tokType],\n };\n });\n\n return errors;\n}\n\nexport function findUnreachablePatterns(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n const errors: ILexerDefinitionError[] = [];\n\n const canBeTested = reduce(\n tokenTypes,\n (result, tokType, idx) => {\n const pattern = tokType.PATTERN;\n\n if (pattern === Lexer.NA) {\n return result;\n }\n\n // a more comprehensive validation for all forms of regExps would require\n // deeper regExp analysis capabilities\n if (isString(pattern)) {\n result.push({ str: pattern, idx, tokenType: tokType });\n } else if (isRegExp(pattern) && noMetaChar(pattern)) {\n result.push({ str: pattern.source, idx, tokenType: tokType });\n }\n return result;\n },\n [] as { str: string; idx: number; tokenType: TokenType }[],\n );\n\n forEach(tokenTypes, (tokType, testIdx) => {\n forEach(canBeTested, ({ str, idx, tokenType }) => {\n if (testIdx < idx && testTokenType(str, tokType.PATTERN)) {\n const msg =\n `Token: ->${tokenType.name}<- can never be matched.\\n` +\n `Because it appears AFTER the Token Type ->${tokType.name}<-` +\n `in the lexer's definition.\\n` +\n `See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;\n errors.push({\n message: msg,\n type: LexerDefinitionErrorType.UNREACHABLE_PATTERN,\n tokenTypes: [tokType, tokenType],\n });\n }\n });\n });\n\n return errors;\n}\n\nfunction testTokenType(str: string, pattern: any): boolean {\n /* istanbul ignore else */\n if (isRegExp(pattern)) {\n const regExpArray = pattern.exec(str);\n return regExpArray !== null && regExpArray.index === 0;\n } else if (isFunction(pattern)) {\n // maintain the API of custom patterns\n return pattern(str, 0, [], {});\n } else if (has(pattern, \"exec\")) {\n // maintain the API of custom patterns\n return pattern.exec(str, 0, [], {});\n } else if (typeof pattern === \"string\") {\n return pattern === str;\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n\nfunction noMetaChar(regExp: RegExp): boolean {\n //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n const metaChars = [\n \".\",\n \"\\\\\",\n \"[\",\n \"]\",\n \"|\",\n \"^\",\n \"$\",\n \"(\",\n \")\",\n \"?\",\n \"*\",\n \"+\",\n \"{\",\n ];\n return (\n find(metaChars, (char) => regExp.source.indexOf(char) !== -1) === undefined\n );\n}\n\nexport function addStartOfInput(pattern: RegExp): RegExp {\n const flags = pattern.ignoreCase ? \"i\" : \"\";\n // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n return new RegExp(`^(?:${pattern.source})`, flags);\n}\n\nexport function addStickyFlag(pattern: RegExp): RegExp {\n const flags = pattern.ignoreCase ? \"iy\" : \"y\";\n // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n return new RegExp(`${pattern.source}`, flags);\n}\n\nexport function performRuntimeChecks(\n lexerDefinition: IMultiModeLexerDefinition,\n trackLines: boolean,\n lineTerminatorCharacters: (number | string)[],\n): ILexerDefinitionError[] {\n const errors: ILexerDefinitionError[] = [];\n\n // some run time checks to help the end users.\n if (!has(lexerDefinition, DEFAULT_MODE)) {\n errors.push({\n message:\n \"A MultiMode Lexer cannot be initialized without a <\" +\n DEFAULT_MODE +\n \"> property in its definition\\n\",\n type: LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE,\n });\n }\n if (!has(lexerDefinition, MODES)) {\n errors.push({\n message:\n \"A MultiMode Lexer cannot be initialized without a <\" +\n MODES +\n \"> property in its definition\\n\",\n type: LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY,\n });\n }\n\n if (\n has(lexerDefinition, MODES) &&\n has(lexerDefinition, DEFAULT_MODE) &&\n !has(lexerDefinition.modes, lexerDefinition.defaultMode)\n ) {\n errors.push({\n message:\n `A MultiMode Lexer cannot be initialized with a ${DEFAULT_MODE}: <${lexerDefinition.defaultMode}>` +\n `which does not exist\\n`,\n type: LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST,\n });\n }\n\n if (has(lexerDefinition, MODES)) {\n forEach(lexerDefinition.modes, (currModeValue, currModeName) => {\n forEach(currModeValue, (currTokType, currIdx) => {\n if (isUndefined(currTokType)) {\n errors.push({\n message:\n `A Lexer cannot be initialized using an undefined Token Type. Mode:` +\n `<${currModeName}> at index: <${currIdx}>\\n`,\n type: LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED,\n });\n } else if (has(currTokType, \"LONGER_ALT\")) {\n const longerAlt = isArray(currTokType.LONGER_ALT)\n ? currTokType.LONGER_ALT\n : [currTokType.LONGER_ALT];\n forEach(longerAlt, (currLongerAlt) => {\n if (\n !isUndefined(currLongerAlt) &&\n !includes(currModeValue, currLongerAlt)\n ) {\n errors.push({\n message: `A MultiMode Lexer cannot be initialized with a longer_alt <${currLongerAlt.name}> on token <${currTokType.name}> outside of mode <${currModeName}>\\n`,\n type: LexerDefinitionErrorType.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE,\n });\n }\n });\n }\n });\n });\n }\n\n return errors;\n}\n\nexport function performWarningRuntimeChecks(\n lexerDefinition: IMultiModeLexerDefinition,\n trackLines: boolean,\n lineTerminatorCharacters: (number | string)[],\n): ILexerDefinitionError[] {\n const warnings = [];\n let hasAnyLineBreak = false;\n const allTokenTypes = compact(flatten(values(lexerDefinition.modes)));\n\n const concreteTokenTypes = reject(\n allTokenTypes,\n (currType) => currType[PATTERN] === Lexer.NA,\n );\n const terminatorCharCodes = getCharCodes(lineTerminatorCharacters);\n if (trackLines) {\n forEach(concreteTokenTypes, (tokType) => {\n const currIssue = checkLineBreaksIssues(tokType, terminatorCharCodes);\n if (currIssue !== false) {\n const message = buildLineBreakIssueMessage(tokType, currIssue);\n const warningDescriptor = {\n message,\n type: currIssue.issue,\n tokenType: tokType,\n };\n warnings.push(warningDescriptor);\n } else {\n // we don't want to attempt to scan if the user explicitly specified the line_breaks option.\n if (has(tokType, \"LINE_BREAKS\")) {\n if (tokType.LINE_BREAKS === true) {\n hasAnyLineBreak = true;\n }\n } else {\n if (\n canMatchCharCode(terminatorCharCodes, tokType.PATTERN as RegExp)\n ) {\n hasAnyLineBreak = true;\n }\n }\n }\n });\n }\n\n if (trackLines && !hasAnyLineBreak) {\n warnings.push({\n message:\n \"Warning: No LINE_BREAKS Found.\\n\" +\n \"\\tThis Lexer has been defined to track line and column information,\\n\" +\n \"\\tBut none of the Token Types can be identified as matching a line terminator.\\n\" +\n \"\\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \\n\" +\n \"\\tfor details.\",\n type: LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS,\n });\n }\n return warnings;\n}\n\nexport function cloneEmptyGroups(emptyGroups: {\n [groupName: string]: IToken;\n}): { [groupName: string]: IToken } {\n const clonedResult: any = {};\n const groupKeys = keys(emptyGroups);\n\n forEach(groupKeys, (currKey) => {\n const currGroupValue = emptyGroups[currKey];\n\n /* istanbul ignore else */\n if (isArray(currGroupValue)) {\n clonedResult[currKey] = [];\n } else {\n throw Error(\"non exhaustive match\");\n }\n });\n\n return clonedResult;\n}\n\n// TODO: refactor to avoid duplication\nexport function isCustomPattern(tokenType: TokenType): boolean {\n const pattern = tokenType.PATTERN;\n /* istanbul ignore else */\n if (isRegExp(pattern)) {\n return false;\n } else if (isFunction(pattern)) {\n // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n return true;\n } else if (has(pattern, \"exec\")) {\n // ICustomPattern\n return true;\n } else if (isString(pattern)) {\n return false;\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n\nexport function isShortPattern(pattern: any): number | false {\n if (isString(pattern) && pattern.length === 1) {\n return pattern.charCodeAt(0);\n } else {\n return false;\n }\n}\n\n/**\n * Faster than using a RegExp for default newline detection during lexing.\n */\nexport const LineTerminatorOptimizedTester: ILineTerminatorsTester = {\n // implements /\\n|\\r\\n?/g.test\n test: function (text) {\n const len = text.length;\n for (let i = this.lastIndex; i < len; i++) {\n const c = text.charCodeAt(i);\n if (c === 10) {\n this.lastIndex = i + 1;\n return true;\n } else if (c === 13) {\n if (text.charCodeAt(i + 1) === 10) {\n this.lastIndex = i + 2;\n } else {\n this.lastIndex = i + 1;\n }\n return true;\n }\n }\n return false;\n },\n\n lastIndex: 0,\n};\n\nfunction checkLineBreaksIssues(\n tokType: TokenType,\n lineTerminatorCharCodes: number[],\n):\n | {\n issue:\n | LexerDefinitionErrorType.IDENTIFY_TERMINATOR\n | LexerDefinitionErrorType.CUSTOM_LINE_BREAK;\n errMsg?: string;\n }\n | false {\n if (has(tokType, \"LINE_BREAKS\")) {\n // if the user explicitly declared the line_breaks option we will respect their choice\n // and assume it is correct.\n return false;\n } else {\n /* istanbul ignore else */\n if (isRegExp(tokType.PATTERN)) {\n try {\n // TODO: why is the casting suddenly needed?\n canMatchCharCode(lineTerminatorCharCodes, tokType.PATTERN as RegExp);\n } catch (e) {\n /* istanbul ignore next - to test this we would have to mock to throw an error */\n return {\n issue: LexerDefinitionErrorType.IDENTIFY_TERMINATOR,\n errMsg: (e as Error).message,\n };\n }\n return false;\n } else if (isString(tokType.PATTERN)) {\n // string literal patterns can always be analyzed to detect line terminator usage\n return false;\n } else if (isCustomPattern(tokType)) {\n // custom token types\n return { issue: LexerDefinitionErrorType.CUSTOM_LINE_BREAK };\n } else {\n throw Error(\"non exhaustive match\");\n }\n }\n}\n\nexport function buildLineBreakIssueMessage(\n tokType: TokenType,\n details: {\n issue:\n | LexerDefinitionErrorType.IDENTIFY_TERMINATOR\n | LexerDefinitionErrorType.CUSTOM_LINE_BREAK;\n errMsg?: string;\n },\n): string {\n /* istanbul ignore else */\n if (details.issue === LexerDefinitionErrorType.IDENTIFY_TERMINATOR) {\n return (\n \"Warning: unable to identify line terminator usage in pattern.\\n\" +\n `\\tThe problem is in the <${tokType.name}> Token Type\\n` +\n `\\t Root cause: ${details.errMsg}.\\n` +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR\"\n );\n } else if (details.issue === LexerDefinitionErrorType.CUSTOM_LINE_BREAK) {\n return (\n \"Warning: A Custom Token Pattern should specify the option.\\n\" +\n `\\tThe problem is in the <${tokType.name}> Token Type\\n` +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK\"\n );\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n\nfunction getCharCodes(charsOrCodes: (number | string)[]): number[] {\n const charCodes = map(charsOrCodes, (numOrString) => {\n if (isString(numOrString)) {\n return numOrString.charCodeAt(0);\n } else {\n return numOrString;\n }\n });\n\n return charCodes;\n}\n\nfunction addToMapOfArrays(\n map: Record,\n key: number,\n value: T,\n): void {\n if (map[key] === undefined) {\n map[key] = [value];\n } else {\n map[key].push(value);\n }\n}\n\nexport const minOptimizationVal = 256;\n\n/**\n * We are mapping charCode above ASCI (256) into buckets each in the size of 256.\n * This is because ASCI are the most common start chars so each one of those will get its own\n * possible token configs vector.\n *\n * Tokens starting with charCodes \"above\" ASCI are uncommon, so we can \"afford\"\n * to place these into buckets of possible token configs, What we gain from\n * this is avoiding the case of creating an optimization 'charCodeToPatternIdxToConfig'\n * which would contain 10,000+ arrays of small size (e.g unicode Identifiers scenario).\n * Our 'charCodeToPatternIdxToConfig' max size will now be:\n * 256 + (2^16 / 2^8) - 1 === 511\n *\n * note the hack for fast division integer part extraction\n * See: https://stackoverflow.com/a/4228528\n */\nlet charCodeToOptimizedIdxMap: number[] = [];\nexport function charCodeToOptimizedIndex(charCode: number): number {\n return charCode < minOptimizationVal\n ? charCode\n : charCodeToOptimizedIdxMap[charCode];\n}\n\n/**\n * This is a compromise between cold start / hot running performance\n * Creating this array takes ~3ms on a modern machine,\n * But if we perform the computation at runtime as needed the CSS Lexer benchmark\n * performance degrades by ~10%\n *\n * TODO: Perhaps it should be lazy initialized only if a charCode > 255 is used.\n */\nfunction initCharCodeToOptimizedIndexMap() {\n if (isEmpty(charCodeToOptimizedIdxMap)) {\n charCodeToOptimizedIdxMap = new Array(65536);\n for (let i = 0; i < 65536; i++) {\n charCodeToOptimizedIdxMap[i] = i > 255 ? 255 + ~~(i / 255) : i;\n }\n }\n}\n", "import {\n clone,\n compact,\n difference,\n flatten,\n forEach,\n has,\n includes,\n isArray,\n isEmpty,\n map,\n} from \"lodash-es\";\nimport { IToken, TokenType } from \"@chevrotain/types\";\n\nexport function tokenStructuredMatcher(\n tokInstance: IToken,\n tokConstructor: TokenType,\n) {\n const instanceType = tokInstance.tokenTypeIdx;\n if (instanceType === tokConstructor.tokenTypeIdx) {\n return true;\n } else {\n return (\n tokConstructor.isParent === true &&\n tokConstructor.categoryMatchesMap![instanceType] === true\n );\n }\n}\n\n// Optimized tokenMatcher in case our grammar does not use token categories\n// Being so tiny it is much more likely to be in-lined and this avoid the function call overhead\nexport function tokenStructuredMatcherNoCategories(\n token: IToken,\n tokType: TokenType,\n) {\n return token.tokenTypeIdx === tokType.tokenTypeIdx;\n}\n\nexport let tokenShortNameIdx = 1;\nexport const tokenIdxToClass: { [tokenIdx: number]: TokenType } = {};\n\nexport function augmentTokenTypes(tokenTypes: TokenType[]): void {\n // collect the parent Token Types as well.\n const tokenTypesAndParents = expandCategories(tokenTypes);\n\n // add required tokenType and categoryMatches properties\n assignTokenDefaultProps(tokenTypesAndParents);\n\n // fill up the categoryMatches\n assignCategoriesMapProp(tokenTypesAndParents);\n assignCategoriesTokensProp(tokenTypesAndParents);\n\n forEach(tokenTypesAndParents, (tokType) => {\n tokType.isParent = tokType.categoryMatches!.length > 0;\n });\n}\n\nexport function expandCategories(tokenTypes: TokenType[]): TokenType[] {\n let result = clone(tokenTypes);\n\n let categories = tokenTypes;\n let searching = true;\n while (searching) {\n categories = compact(\n flatten(map(categories, (currTokType) => currTokType.CATEGORIES)),\n );\n\n const newCategories = difference(categories, result);\n\n result = result.concat(newCategories);\n\n if (isEmpty(newCategories)) {\n searching = false;\n } else {\n categories = newCategories;\n }\n }\n return result;\n}\n\nexport function assignTokenDefaultProps(tokenTypes: TokenType[]): void {\n forEach(tokenTypes, (currTokType) => {\n if (!hasShortKeyProperty(currTokType)) {\n tokenIdxToClass[tokenShortNameIdx] = currTokType;\n (currTokType).tokenTypeIdx = tokenShortNameIdx++;\n }\n\n // CATEGORIES? : TokenType | TokenType[]\n if (\n hasCategoriesProperty(currTokType) &&\n !isArray(currTokType.CATEGORIES)\n // &&\n // !isUndefined(currTokType.CATEGORIES.PATTERN)\n ) {\n currTokType.CATEGORIES = [currTokType.CATEGORIES as unknown as TokenType];\n }\n\n if (!hasCategoriesProperty(currTokType)) {\n currTokType.CATEGORIES = [];\n }\n\n if (!hasExtendingTokensTypesProperty(currTokType)) {\n currTokType.categoryMatches = [];\n }\n\n if (!hasExtendingTokensTypesMapProperty(currTokType)) {\n currTokType.categoryMatchesMap = {};\n }\n });\n}\n\nexport function assignCategoriesTokensProp(tokenTypes: TokenType[]): void {\n forEach(tokenTypes, (currTokType) => {\n // avoid duplications\n currTokType.categoryMatches = [];\n forEach(currTokType.categoryMatchesMap!, (val, key) => {\n currTokType.categoryMatches!.push(\n tokenIdxToClass[key as unknown as number].tokenTypeIdx!,\n );\n });\n });\n}\n\nexport function assignCategoriesMapProp(tokenTypes: TokenType[]): void {\n forEach(tokenTypes, (currTokType) => {\n singleAssignCategoriesToksMap([], currTokType);\n });\n}\n\nexport function singleAssignCategoriesToksMap(\n path: TokenType[],\n nextNode: TokenType,\n): void {\n forEach(path, (pathNode) => {\n nextNode.categoryMatchesMap![pathNode.tokenTypeIdx!] = true;\n });\n\n forEach(nextNode.CATEGORIES, (nextCategory) => {\n const newPath = path.concat(nextNode);\n // avoids infinite loops due to cyclic categories.\n if (!includes(newPath, nextCategory)) {\n singleAssignCategoriesToksMap(newPath, nextCategory);\n }\n });\n}\n\nexport function hasShortKeyProperty(tokType: TokenType): boolean {\n return has(tokType, \"tokenTypeIdx\");\n}\n\nexport function hasCategoriesProperty(tokType: TokenType): boolean {\n return has(tokType, \"CATEGORIES\");\n}\n\nexport function hasExtendingTokensTypesProperty(tokType: TokenType): boolean {\n return has(tokType, \"categoryMatches\");\n}\n\nexport function hasExtendingTokensTypesMapProperty(\n tokType: TokenType,\n): boolean {\n return has(tokType, \"categoryMatchesMap\");\n}\n\nexport function isTokenType(tokType: TokenType): boolean {\n return has(tokType, \"tokenTypeIdx\");\n}\n", "import { ILexerErrorMessageProvider, IToken } from \"@chevrotain/types\";\n\nexport const defaultLexerErrorProvider: ILexerErrorMessageProvider = {\n buildUnableToPopLexerModeMessage(token: IToken): string {\n return `Unable to pop Lexer Mode after encountering Token ->${token.image}<- The Mode Stack is empty`;\n },\n\n buildUnexpectedCharactersMessage(\n fullText: string,\n startOffset: number,\n length: number,\n line?: number,\n column?: number,\n ): string {\n return (\n `unexpected character: ->${fullText.charAt(\n startOffset,\n )}<- at offset: ${startOffset},` + ` skipped ${length} characters.`\n );\n },\n};\n", "import {\n analyzeTokenTypes,\n charCodeToOptimizedIndex,\n cloneEmptyGroups,\n DEFAULT_MODE,\n IAnalyzeResult,\n IPatternConfig,\n LineTerminatorOptimizedTester,\n performRuntimeChecks,\n performWarningRuntimeChecks,\n SUPPORT_STICKY,\n validatePatterns,\n} from \"./lexer.js\";\nimport {\n assign,\n clone,\n forEach,\n identity,\n isArray,\n isEmpty,\n isUndefined,\n keys,\n last,\n map,\n noop,\n reduce,\n reject,\n} from \"lodash-es\";\nimport { PRINT_WARNING, timer, toFastProperties } from \"@chevrotain/utils\";\nimport { augmentTokenTypes } from \"./tokens.js\";\nimport {\n CustomPatternMatcherFunc,\n CustomPatternMatcherReturn,\n ILexerConfig,\n ILexerDefinitionError,\n ILexingError,\n IMultiModeLexerDefinition,\n IToken,\n TokenType,\n} from \"@chevrotain/types\";\nimport { defaultLexerErrorProvider } from \"./lexer_errors_public.js\";\nimport { clearRegExpParserCache } from \"./reg_exp_parser.js\";\n\nexport interface ILexingResult {\n tokens: IToken[];\n groups: { [groupName: string]: IToken[] };\n errors: ILexingError[];\n}\n\nexport enum LexerDefinitionErrorType {\n MISSING_PATTERN,\n INVALID_PATTERN,\n EOI_ANCHOR_FOUND,\n UNSUPPORTED_FLAGS_FOUND,\n DUPLICATE_PATTERNS_FOUND,\n INVALID_GROUP_TYPE_FOUND,\n PUSH_MODE_DOES_NOT_EXIST,\n MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE,\n MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY,\n MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST,\n LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED,\n SOI_ANCHOR_FOUND,\n EMPTY_MATCH_PATTERN,\n NO_LINE_BREAKS_FLAGS,\n UNREACHABLE_PATTERN,\n IDENTIFY_TERMINATOR,\n CUSTOM_LINE_BREAK,\n MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE,\n}\n\nexport interface IRegExpExec {\n exec: CustomPatternMatcherFunc;\n}\n\nconst DEFAULT_LEXER_CONFIG: Required = {\n deferDefinitionErrorsHandling: false,\n positionTracking: \"full\",\n lineTerminatorsPattern: /\\n|\\r\\n?/g,\n lineTerminatorCharacters: [\"\\n\", \"\\r\"],\n ensureOptimizations: false,\n safeMode: false,\n errorMessageProvider: defaultLexerErrorProvider,\n traceInitPerf: false,\n skipValidations: false,\n recoveryEnabled: true,\n};\n\nObject.freeze(DEFAULT_LEXER_CONFIG);\n\nexport class Lexer {\n public static SKIPPED =\n \"This marks a skipped Token pattern, this means each token identified by it will\" +\n \"be consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.\";\n\n public static NA = /NOT_APPLICABLE/;\n public lexerDefinitionErrors: ILexerDefinitionError[] = [];\n public lexerDefinitionWarning: ILexerDefinitionError[] = [];\n\n protected patternIdxToConfig: Record = {};\n protected charCodeToPatternIdxToConfig: {\n [modeName: string]: { [charCode: number]: IPatternConfig[] };\n } = {};\n\n protected modes: string[] = [];\n protected defaultMode!: string;\n protected emptyGroups: { [groupName: string]: IToken } = {};\n\n private config: Required;\n private trackStartLines: boolean = true;\n private trackEndLines: boolean = true;\n private hasCustom: boolean = false;\n private canModeBeOptimized: Record = {};\n\n private traceInitPerf!: boolean | number;\n private traceInitMaxIdent!: number;\n private traceInitIndent: number;\n\n constructor(\n protected lexerDefinition: TokenType[] | IMultiModeLexerDefinition,\n config: ILexerConfig = DEFAULT_LEXER_CONFIG,\n ) {\n if (typeof config === \"boolean\") {\n throw Error(\n \"The second argument to the Lexer constructor is now an ILexerConfig Object.\\n\" +\n \"a boolean 2nd argument is no longer supported\",\n );\n }\n\n // todo: defaults func?\n this.config = assign({}, DEFAULT_LEXER_CONFIG, config) as any;\n\n const traceInitVal = this.config.traceInitPerf;\n if (traceInitVal === true) {\n this.traceInitMaxIdent = Infinity;\n this.traceInitPerf = true;\n } else if (typeof traceInitVal === \"number\") {\n this.traceInitMaxIdent = traceInitVal;\n this.traceInitPerf = true;\n }\n this.traceInitIndent = -1;\n\n this.TRACE_INIT(\"Lexer Constructor\", () => {\n let actualDefinition!: IMultiModeLexerDefinition;\n let hasOnlySingleMode = true;\n this.TRACE_INIT(\"Lexer Config handling\", () => {\n if (\n this.config.lineTerminatorsPattern ===\n DEFAULT_LEXER_CONFIG.lineTerminatorsPattern\n ) {\n // optimized built-in implementation for the defaults definition of lineTerminators\n this.config.lineTerminatorsPattern = LineTerminatorOptimizedTester;\n } else {\n if (\n this.config.lineTerminatorCharacters ===\n DEFAULT_LEXER_CONFIG.lineTerminatorCharacters\n ) {\n throw Error(\n \"Error: Missing property on the Lexer config.\\n\" +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS\",\n );\n }\n }\n\n if (config.safeMode && config.ensureOptimizations) {\n throw Error(\n '\"safeMode\" and \"ensureOptimizations\" flags are mutually exclusive.',\n );\n }\n\n this.trackStartLines = /full|onlyStart/i.test(\n this.config.positionTracking,\n );\n this.trackEndLines = /full/i.test(this.config.positionTracking);\n\n // Convert SingleModeLexerDefinition into a IMultiModeLexerDefinition.\n if (isArray(lexerDefinition)) {\n actualDefinition = {\n modes: { defaultMode: clone(lexerDefinition) },\n defaultMode: DEFAULT_MODE,\n };\n } else {\n // no conversion needed, input should already be a IMultiModeLexerDefinition\n hasOnlySingleMode = false;\n actualDefinition = clone(lexerDefinition);\n }\n });\n\n if (this.config.skipValidations === false) {\n this.TRACE_INIT(\"performRuntimeChecks\", () => {\n this.lexerDefinitionErrors = this.lexerDefinitionErrors.concat(\n performRuntimeChecks(\n actualDefinition,\n this.trackStartLines,\n this.config.lineTerminatorCharacters,\n ),\n );\n });\n\n this.TRACE_INIT(\"performWarningRuntimeChecks\", () => {\n this.lexerDefinitionWarning = this.lexerDefinitionWarning.concat(\n performWarningRuntimeChecks(\n actualDefinition,\n this.trackStartLines,\n this.config.lineTerminatorCharacters,\n ),\n );\n });\n }\n\n // for extra robustness to avoid throwing an none informative error message\n actualDefinition.modes = actualDefinition.modes\n ? actualDefinition.modes\n : {};\n\n // an error of undefined TokenTypes will be detected in \"performRuntimeChecks\" above.\n // this transformation is to increase robustness in the case of partially invalid lexer definition.\n forEach(actualDefinition.modes, (currModeValue, currModeName) => {\n actualDefinition.modes[currModeName] = reject(\n currModeValue,\n (currTokType) => isUndefined(currTokType),\n );\n });\n\n const allModeNames = keys(actualDefinition.modes);\n\n forEach(\n actualDefinition.modes,\n (currModDef: TokenType[], currModName) => {\n this.TRACE_INIT(`Mode: <${currModName}> processing`, () => {\n this.modes.push(currModName);\n\n if (this.config.skipValidations === false) {\n this.TRACE_INIT(`validatePatterns`, () => {\n this.lexerDefinitionErrors = this.lexerDefinitionErrors.concat(\n validatePatterns(currModDef, allModeNames),\n );\n });\n }\n\n // If definition errors were encountered, the analysis phase may fail unexpectedly/\n // Considering a lexer with definition errors may never be used, there is no point\n // to performing the analysis anyhow...\n if (isEmpty(this.lexerDefinitionErrors)) {\n augmentTokenTypes(currModDef);\n\n let currAnalyzeResult!: IAnalyzeResult;\n this.TRACE_INIT(`analyzeTokenTypes`, () => {\n currAnalyzeResult = analyzeTokenTypes(currModDef, {\n lineTerminatorCharacters:\n this.config.lineTerminatorCharacters,\n positionTracking: config.positionTracking,\n ensureOptimizations: config.ensureOptimizations,\n safeMode: config.safeMode,\n tracer: this.TRACE_INIT,\n });\n });\n\n this.patternIdxToConfig[currModName] =\n currAnalyzeResult.patternIdxToConfig;\n\n this.charCodeToPatternIdxToConfig[currModName] =\n currAnalyzeResult.charCodeToPatternIdxToConfig;\n\n this.emptyGroups = assign(\n {},\n this.emptyGroups,\n currAnalyzeResult.emptyGroups,\n ) as any;\n\n this.hasCustom = currAnalyzeResult.hasCustom || this.hasCustom;\n\n this.canModeBeOptimized[currModName] =\n currAnalyzeResult.canBeOptimized;\n }\n });\n },\n );\n\n this.defaultMode = actualDefinition.defaultMode;\n\n if (\n !isEmpty(this.lexerDefinitionErrors) &&\n !this.config.deferDefinitionErrorsHandling\n ) {\n const allErrMessages = map(this.lexerDefinitionErrors, (error) => {\n return error.message;\n });\n const allErrMessagesString = allErrMessages.join(\n \"-----------------------\\n\",\n );\n throw new Error(\n \"Errors detected in definition of Lexer:\\n\" + allErrMessagesString,\n );\n }\n\n // Only print warning if there are no errors, This will avoid pl\n forEach(this.lexerDefinitionWarning, (warningDescriptor) => {\n PRINT_WARNING(warningDescriptor.message);\n });\n\n this.TRACE_INIT(\"Choosing sub-methods implementations\", () => {\n // Choose the relevant internal implementations for this specific parser.\n // These implementations should be in-lined by the JavaScript engine\n // to provide optimal performance in each scenario.\n if (SUPPORT_STICKY) {\n this.chopInput = identity;\n this.match = this.matchWithTest;\n } else {\n this.updateLastIndex = noop;\n this.match = this.matchWithExec;\n }\n\n if (hasOnlySingleMode) {\n this.handleModes = noop;\n }\n\n if (this.trackStartLines === false) {\n this.computeNewColumn = identity;\n }\n\n if (this.trackEndLines === false) {\n this.updateTokenEndLineColumnLocation = noop;\n }\n\n if (/full/i.test(this.config.positionTracking)) {\n this.createTokenInstance = this.createFullToken;\n } else if (/onlyStart/i.test(this.config.positionTracking)) {\n this.createTokenInstance = this.createStartOnlyToken;\n } else if (/onlyOffset/i.test(this.config.positionTracking)) {\n this.createTokenInstance = this.createOffsetOnlyToken;\n } else {\n throw Error(\n `Invalid config option: \"${this.config.positionTracking}\"`,\n );\n }\n\n if (this.hasCustom) {\n this.addToken = this.addTokenUsingPush;\n this.handlePayload = this.handlePayloadWithCustom;\n } else {\n this.addToken = this.addTokenUsingMemberAccess;\n this.handlePayload = this.handlePayloadNoCustom;\n }\n });\n\n this.TRACE_INIT(\"Failed Optimization Warnings\", () => {\n const unOptimizedModes = reduce(\n this.canModeBeOptimized,\n (cannotBeOptimized, canBeOptimized, modeName) => {\n if (canBeOptimized === false) {\n cannotBeOptimized.push(modeName);\n }\n return cannotBeOptimized;\n },\n [] as string[],\n );\n\n if (config.ensureOptimizations && !isEmpty(unOptimizedModes)) {\n throw Error(\n `Lexer Modes: < ${unOptimizedModes.join(\n \", \",\n )} > cannot be optimized.\\n` +\n '\\t Disable the \"ensureOptimizations\" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\\n' +\n \"\\t Or inspect the console log for details on how to resolve these issues.\",\n );\n }\n });\n\n this.TRACE_INIT(\"clearRegExpParserCache\", () => {\n clearRegExpParserCache();\n });\n\n this.TRACE_INIT(\"toFastProperties\", () => {\n toFastProperties(this);\n });\n });\n }\n\n public tokenize(\n text: string,\n initialMode: string = this.defaultMode,\n ): ILexingResult {\n if (!isEmpty(this.lexerDefinitionErrors)) {\n const allErrMessages = map(this.lexerDefinitionErrors, (error) => {\n return error.message;\n });\n const allErrMessagesString = allErrMessages.join(\n \"-----------------------\\n\",\n );\n throw new Error(\n \"Unable to Tokenize because Errors detected in definition of Lexer:\\n\" +\n allErrMessagesString,\n );\n }\n\n return this.tokenizeInternal(text, initialMode);\n }\n\n // There is quite a bit of duplication between this and \"tokenizeInternalLazy\"\n // This is intentional due to performance considerations.\n // this method also used quite a bit of `!` none null assertions because it is too optimized\n // for `tsc` to always understand it is \"safe\"\n private tokenizeInternal(text: string, initialMode: string): ILexingResult {\n let i,\n j,\n k,\n matchAltImage,\n longerAlt,\n matchedImage: string | null,\n payload,\n altPayload,\n imageLength,\n group,\n tokType,\n newToken: IToken,\n errLength,\n droppedChar,\n msg,\n match;\n const orgText = text;\n const orgLength = orgText.length;\n let offset = 0;\n let matchedTokensIndex = 0;\n // initializing the tokensArray to the \"guessed\" size.\n // guessing too little will still reduce the number of array re-sizes on pushes.\n // guessing too large (Tested by guessing x4 too large) may cost a bit more of memory\n // but would still have a faster runtime by avoiding (All but one) array resizing.\n const guessedNumberOfTokens = this.hasCustom\n ? 0 // will break custom token pattern APIs the matchedTokens array will contain undefined elements.\n : Math.floor(text.length / 10);\n const matchedTokens = new Array(guessedNumberOfTokens);\n const errors: ILexingError[] = [];\n let line = this.trackStartLines ? 1 : undefined;\n let column = this.trackStartLines ? 1 : undefined;\n const groups: any = cloneEmptyGroups(this.emptyGroups);\n const trackLines = this.trackStartLines;\n const lineTerminatorPattern = this.config.lineTerminatorsPattern;\n\n let currModePatternsLength = 0;\n let patternIdxToConfig: IPatternConfig[] = [];\n let currCharCodeToPatternIdxToConfig: {\n [charCode: number]: IPatternConfig[];\n } = [];\n\n const modeStack: string[] = [];\n\n const emptyArray: IPatternConfig[] = [];\n Object.freeze(emptyArray);\n let getPossiblePatterns!: (charCode: number) => IPatternConfig[];\n\n function getPossiblePatternsSlow() {\n return patternIdxToConfig;\n }\n\n function getPossiblePatternsOptimized(charCode: number): IPatternConfig[] {\n const optimizedCharIdx = charCodeToOptimizedIndex(charCode);\n const possiblePatterns =\n currCharCodeToPatternIdxToConfig[optimizedCharIdx];\n if (possiblePatterns === undefined) {\n return emptyArray;\n } else {\n return possiblePatterns;\n }\n }\n\n const pop_mode = (popToken: IToken) => {\n // TODO: perhaps avoid this error in the edge case there is no more input?\n if (\n modeStack.length === 1 &&\n // if we have both a POP_MODE and a PUSH_MODE this is in-fact a \"transition\"\n // So no error should occur.\n popToken.tokenType.PUSH_MODE === undefined\n ) {\n // if we try to pop the last mode there lexer will no longer have ANY mode.\n // thus the pop is ignored, an error will be created and the lexer will continue parsing in the previous mode.\n const msg =\n this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(\n popToken,\n );\n\n errors.push({\n offset: popToken.startOffset,\n line: popToken.startLine,\n column: popToken.startColumn,\n length: popToken.image.length,\n message: msg,\n });\n } else {\n modeStack.pop();\n const newMode = last(modeStack)!;\n patternIdxToConfig = this.patternIdxToConfig[newMode];\n currCharCodeToPatternIdxToConfig =\n this.charCodeToPatternIdxToConfig[newMode];\n currModePatternsLength = patternIdxToConfig.length;\n const modeCanBeOptimized =\n this.canModeBeOptimized[newMode] && this.config.safeMode === false;\n\n if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n getPossiblePatterns = getPossiblePatternsOptimized;\n } else {\n getPossiblePatterns = getPossiblePatternsSlow;\n }\n }\n };\n\n function push_mode(this: Lexer, newMode: string) {\n modeStack.push(newMode);\n currCharCodeToPatternIdxToConfig =\n this.charCodeToPatternIdxToConfig[newMode];\n\n patternIdxToConfig = this.patternIdxToConfig[newMode];\n currModePatternsLength = patternIdxToConfig.length;\n\n currModePatternsLength = patternIdxToConfig.length;\n const modeCanBeOptimized =\n this.canModeBeOptimized[newMode] && this.config.safeMode === false;\n\n if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n getPossiblePatterns = getPossiblePatternsOptimized;\n } else {\n getPossiblePatterns = getPossiblePatternsSlow;\n }\n }\n\n // this pattern seems to avoid a V8 de-optimization, although that de-optimization does not\n // seem to matter performance wise.\n push_mode.call(this, initialMode);\n\n let currConfig!: IPatternConfig;\n\n const recoveryEnabled = this.config.recoveryEnabled;\n\n while (offset < orgLength) {\n matchedImage = null;\n\n const nextCharCode = orgText.charCodeAt(offset);\n const chosenPatternIdxToConfig = getPossiblePatterns(nextCharCode);\n const chosenPatternsLength = chosenPatternIdxToConfig.length;\n\n for (i = 0; i < chosenPatternsLength; i++) {\n currConfig = chosenPatternIdxToConfig[i];\n const currPattern = currConfig.pattern;\n payload = null;\n\n // manually in-lined because > 600 chars won't be in-lined in V8\n const singleCharCode = currConfig.short;\n if (singleCharCode !== false) {\n if (nextCharCode === singleCharCode) {\n // single character string\n matchedImage = currPattern as string;\n }\n } else if (currConfig.isCustom === true) {\n match = (currPattern as IRegExpExec).exec(\n orgText,\n offset,\n matchedTokens,\n groups,\n );\n if (match !== null) {\n matchedImage = match[0];\n if ((match as CustomPatternMatcherReturn).payload !== undefined) {\n payload = (match as CustomPatternMatcherReturn).payload;\n }\n } else {\n matchedImage = null;\n }\n } else {\n this.updateLastIndex(currPattern as RegExp, offset);\n matchedImage = this.match(currPattern as RegExp, text, offset);\n }\n\n if (matchedImage !== null) {\n // even though this pattern matched we must try a another longer alternative.\n // this can be used to prioritize keywords over identifiers\n longerAlt = currConfig.longerAlt;\n if (longerAlt !== undefined) {\n // TODO: micro optimize, avoid extra prop access\n // by saving/linking longerAlt on the original config?\n const longerAltLength = longerAlt.length;\n for (k = 0; k < longerAltLength; k++) {\n const longerAltConfig = patternIdxToConfig[longerAlt[k]];\n const longerAltPattern = longerAltConfig.pattern;\n altPayload = null;\n\n // single Char can never be a longer alt so no need to test it.\n // manually in-lined because > 600 chars won't be in-lined in V8\n if (longerAltConfig.isCustom === true) {\n match = (longerAltPattern as IRegExpExec).exec(\n orgText,\n offset,\n matchedTokens,\n groups,\n );\n if (match !== null) {\n matchAltImage = match[0];\n if (\n (match as CustomPatternMatcherReturn).payload !== undefined\n ) {\n altPayload = (match as CustomPatternMatcherReturn).payload;\n }\n } else {\n matchAltImage = null;\n }\n } else {\n this.updateLastIndex(longerAltPattern as RegExp, offset);\n matchAltImage = this.match(\n longerAltPattern as RegExp,\n text,\n offset,\n );\n }\n\n if (matchAltImage && matchAltImage.length > matchedImage.length) {\n matchedImage = matchAltImage;\n payload = altPayload;\n currConfig = longerAltConfig;\n // Exit the loop early after matching one of the longer alternatives\n // The first matched alternative takes precedence\n break;\n }\n }\n }\n break;\n }\n }\n\n // successful match\n if (matchedImage !== null) {\n imageLength = matchedImage.length;\n group = currConfig.group;\n if (group !== undefined) {\n tokType = currConfig.tokenTypeIdx;\n // TODO: \"offset + imageLength\" and the new column may be computed twice in case of \"full\" location information inside\n // createFullToken method\n newToken = this.createTokenInstance(\n matchedImage,\n offset,\n tokType,\n currConfig.tokenType,\n line,\n column,\n imageLength,\n );\n\n this.handlePayload(newToken, payload);\n\n // TODO: optimize NOOP in case there are no special groups?\n if (group === false) {\n matchedTokensIndex = this.addToken(\n matchedTokens,\n matchedTokensIndex,\n newToken,\n );\n } else {\n groups[group].push(newToken);\n }\n }\n text = this.chopInput(text, imageLength);\n offset = offset + imageLength;\n\n // TODO: with newlines the column may be assigned twice\n column = this.computeNewColumn(column!, imageLength);\n\n if (trackLines === true && currConfig.canLineTerminator === true) {\n let numOfLTsInMatch = 0;\n let foundTerminator;\n let lastLTEndOffset: number;\n lineTerminatorPattern.lastIndex = 0;\n do {\n foundTerminator = lineTerminatorPattern.test(matchedImage);\n if (foundTerminator === true) {\n lastLTEndOffset = lineTerminatorPattern.lastIndex - 1;\n numOfLTsInMatch++;\n }\n } while (foundTerminator === true);\n\n if (numOfLTsInMatch !== 0) {\n line = line! + numOfLTsInMatch;\n column = imageLength - lastLTEndOffset!;\n this.updateTokenEndLineColumnLocation(\n newToken!,\n group!,\n lastLTEndOffset!,\n numOfLTsInMatch,\n line,\n column,\n imageLength,\n );\n }\n }\n // will be NOOP if no modes present\n this.handleModes(currConfig, pop_mode, push_mode, newToken!);\n } else {\n // error recovery, drop characters until we identify a valid token's start point\n const errorStartOffset = offset;\n const errorLine = line;\n const errorColumn = column;\n let foundResyncPoint = recoveryEnabled === false;\n\n while (foundResyncPoint === false && offset < orgLength) {\n // Identity Func (when sticky flag is enabled)\n text = this.chopInput(text, 1);\n offset++;\n for (j = 0; j < currModePatternsLength; j++) {\n const currConfig = patternIdxToConfig[j];\n const currPattern = currConfig.pattern;\n\n // manually in-lined because > 600 chars won't be in-lined in V8\n const singleCharCode = currConfig.short;\n if (singleCharCode !== false) {\n if (orgText.charCodeAt(offset) === singleCharCode) {\n // single character string\n foundResyncPoint = true;\n }\n } else if (currConfig.isCustom === true) {\n foundResyncPoint =\n (currPattern as IRegExpExec).exec(\n orgText,\n offset,\n matchedTokens,\n groups,\n ) !== null;\n } else {\n this.updateLastIndex(currPattern as RegExp, offset);\n foundResyncPoint = (currPattern as RegExp).exec(text) !== null;\n }\n\n if (foundResyncPoint === true) {\n break;\n }\n }\n }\n\n errLength = offset - errorStartOffset;\n column = this.computeNewColumn(column!, errLength);\n // at this point we either re-synced or reached the end of the input text\n msg = this.config.errorMessageProvider.buildUnexpectedCharactersMessage(\n orgText,\n errorStartOffset,\n errLength,\n errorLine,\n errorColumn,\n );\n errors.push({\n offset: errorStartOffset,\n line: errorLine,\n column: errorColumn,\n length: errLength,\n message: msg,\n });\n\n if (recoveryEnabled === false) {\n break;\n }\n }\n }\n\n // if we do have custom patterns which push directly into the\n // TODO: custom tokens should not push directly??\n if (!this.hasCustom) {\n // if we guessed a too large size for the tokens array this will shrink it to the right size.\n matchedTokens.length = matchedTokensIndex;\n }\n\n return {\n tokens: matchedTokens,\n groups: groups,\n errors: errors,\n };\n }\n\n private handleModes(\n config: IPatternConfig,\n pop_mode: (tok: IToken) => void,\n push_mode: (this: Lexer, pushMode: string) => void,\n newToken: IToken,\n ) {\n if (config.pop === true) {\n // need to save the PUSH_MODE property as if the mode is popped\n // patternIdxToPopMode is updated to reflect the new mode after popping the stack\n const pushMode = config.push;\n pop_mode(newToken);\n if (pushMode !== undefined) {\n push_mode.call(this, pushMode);\n }\n } else if (config.push !== undefined) {\n push_mode.call(this, config.push);\n }\n }\n\n private chopInput(text: string, length: number): string {\n return text.substring(length);\n }\n\n private updateLastIndex(regExp: RegExp, newLastIndex: number): void {\n regExp.lastIndex = newLastIndex;\n }\n\n // TODO: decrease this under 600 characters? inspect stripping comments option in TSC compiler\n private updateTokenEndLineColumnLocation(\n newToken: IToken,\n group: string | false,\n lastLTIdx: number,\n numOfLTsInMatch: number,\n line: number,\n column: number,\n imageLength: number,\n ): void {\n let lastCharIsLT, fixForEndingInLT;\n if (group !== undefined) {\n // a none skipped multi line Token, need to update endLine/endColumn\n lastCharIsLT = lastLTIdx === imageLength - 1;\n fixForEndingInLT = lastCharIsLT ? -1 : 0;\n if (!(numOfLTsInMatch === 1 && lastCharIsLT === true)) {\n // if a token ends in a LT that last LT only affects the line numbering of following Tokens\n newToken.endLine = line + fixForEndingInLT;\n // the last LT in a token does not affect the endColumn either as the [columnStart ... columnEnd)\n // inclusive to exclusive range.\n newToken.endColumn = column - 1 + -fixForEndingInLT;\n }\n // else single LT in the last character of a token, no need to modify the endLine/EndColumn\n }\n }\n\n private computeNewColumn(oldColumn: number, imageLength: number) {\n return oldColumn + imageLength;\n }\n\n // Place holder, will be replaced by the correct variant according to the locationTracking option at runtime.\n /* istanbul ignore next - place holder */\n private createTokenInstance!: (...args: any[]) => IToken;\n\n private createOffsetOnlyToken(\n image: string,\n startOffset: number,\n tokenTypeIdx: number,\n tokenType: TokenType,\n ) {\n return {\n image,\n startOffset,\n tokenTypeIdx,\n tokenType,\n };\n }\n\n private createStartOnlyToken(\n image: string,\n startOffset: number,\n tokenTypeIdx: number,\n tokenType: TokenType,\n startLine: number,\n startColumn: number,\n ) {\n return {\n image,\n startOffset,\n startLine,\n startColumn,\n tokenTypeIdx,\n tokenType,\n };\n }\n\n private createFullToken(\n image: string,\n startOffset: number,\n tokenTypeIdx: number,\n tokenType: TokenType,\n startLine: number,\n startColumn: number,\n imageLength: number,\n ): IToken {\n return {\n image,\n startOffset,\n endOffset: startOffset + imageLength - 1,\n startLine,\n endLine: startLine,\n startColumn,\n endColumn: startColumn + imageLength - 1,\n tokenTypeIdx,\n tokenType,\n };\n }\n\n // Place holder, will be replaced by the correct variant according to the locationTracking option at runtime.\n /* istanbul ignore next - place holder */\n private addToken!: (\n tokenVector: IToken[],\n index: number,\n tokenToAdd: IToken,\n ) => number;\n\n private addTokenUsingPush(\n tokenVector: IToken[],\n index: number,\n tokenToAdd: IToken,\n ): number {\n tokenVector.push(tokenToAdd);\n return index;\n }\n\n private addTokenUsingMemberAccess(\n tokenVector: IToken[],\n index: number,\n tokenToAdd: IToken,\n ): number {\n tokenVector[index] = tokenToAdd;\n index++;\n return index;\n }\n\n // Place holder, will be replaced by the correct variant according to the hasCustom flag option at runtime.\n private handlePayload: (token: IToken, payload: any) => void;\n\n private handlePayloadNoCustom(token: IToken, payload: any): void {}\n\n private handlePayloadWithCustom(token: IToken, payload: any): void {\n if (payload !== null) {\n token.payload = payload;\n }\n }\n\n // place holder to be replaced with chosen alternative at runtime\n private match!: (\n pattern: RegExp,\n text: string,\n offset: number,\n ) => string | null;\n\n private matchWithTest(\n pattern: RegExp,\n text: string,\n offset: number,\n ): string | null {\n const found = pattern.test(text);\n if (found === true) {\n return text.substring(offset, pattern.lastIndex);\n }\n return null;\n }\n\n private matchWithExec(pattern: RegExp, text: string): string | null {\n const regExpArray = pattern.exec(text);\n return regExpArray !== null ? regExpArray[0] : null;\n }\n\n // Duplicated from the parser's perf trace trait to allow future extraction\n // of the lexer to a separate package.\n TRACE_INIT = (phaseDesc: string, phaseImpl: () => T): T => {\n // No need to optimize this using NOOP pattern because\n // It is not called in a hot spot...\n if (this.traceInitPerf === true) {\n this.traceInitIndent++;\n const indent = new Array(this.traceInitIndent + 1).join(\"\\t\");\n if (this.traceInitIndent < this.traceInitMaxIdent) {\n console.log(`${indent}--> <${phaseDesc}>`);\n }\n const { time, value } = timer(phaseImpl);\n /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n const traceMethod = time > 10 ? console.warn : console.log;\n if (this.traceInitIndent < this.traceInitMaxIdent) {\n traceMethod(`${indent}<-- <${phaseDesc}> time: ${time}ms`);\n }\n this.traceInitIndent--;\n return value;\n } else {\n return phaseImpl();\n }\n };\n}\n", "import { has, isString, isUndefined } from \"lodash-es\";\nimport { Lexer } from \"./lexer_public.js\";\nimport { augmentTokenTypes, tokenStructuredMatcher } from \"./tokens.js\";\nimport { IToken, ITokenConfig, TokenType } from \"@chevrotain/types\";\n\nexport function tokenLabel(tokType: TokenType): string {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n } else {\n return tokType.name;\n }\n}\n\nexport function tokenName(tokType: TokenType): string {\n return tokType.name;\n}\n\nexport function hasTokenLabel(\n obj: TokenType,\n): obj is TokenType & Pick, \"LABEL\"> {\n return isString(obj.LABEL) && obj.LABEL !== \"\";\n}\n\nconst PARENT = \"parent\";\nconst CATEGORIES = \"categories\";\nconst LABEL = \"label\";\nconst GROUP = \"group\";\nconst PUSH_MODE = \"push_mode\";\nconst POP_MODE = \"pop_mode\";\nconst LONGER_ALT = \"longer_alt\";\nconst LINE_BREAKS = \"line_breaks\";\nconst START_CHARS_HINT = \"start_chars_hint\";\n\nexport function createToken(config: ITokenConfig): TokenType {\n return createTokenInternal(config);\n}\n\nfunction createTokenInternal(config: ITokenConfig): TokenType {\n const pattern = config.pattern;\n\n const tokenType: TokenType = {};\n tokenType.name = config.name;\n\n if (!isUndefined(pattern)) {\n tokenType.PATTERN = pattern;\n }\n\n if (has(config, PARENT)) {\n throw (\n \"The parent property is no longer supported.\\n\" +\n \"See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.\"\n );\n }\n\n if (has(config, CATEGORIES)) {\n // casting to ANY as this will be fixed inside `augmentTokenTypes``\n tokenType.CATEGORIES = config[CATEGORIES];\n }\n\n augmentTokenTypes([tokenType]);\n\n if (has(config, LABEL)) {\n tokenType.LABEL = config[LABEL];\n }\n\n if (has(config, GROUP)) {\n tokenType.GROUP = config[GROUP];\n }\n\n if (has(config, POP_MODE)) {\n tokenType.POP_MODE = config[POP_MODE];\n }\n\n if (has(config, PUSH_MODE)) {\n tokenType.PUSH_MODE = config[PUSH_MODE];\n }\n\n if (has(config, LONGER_ALT)) {\n tokenType.LONGER_ALT = config[LONGER_ALT];\n }\n\n if (has(config, LINE_BREAKS)) {\n tokenType.LINE_BREAKS = config[LINE_BREAKS];\n }\n\n if (has(config, START_CHARS_HINT)) {\n tokenType.START_CHARS_HINT = config[START_CHARS_HINT];\n }\n\n return tokenType;\n}\n\nexport const EOF = createToken({ name: \"EOF\", pattern: Lexer.NA });\naugmentTokenTypes([EOF]);\n\nexport function createTokenInstance(\n tokType: TokenType,\n image: string,\n startOffset: number,\n endOffset: number,\n startLine: number,\n endLine: number,\n startColumn: number,\n endColumn: number,\n): IToken {\n return {\n image,\n startOffset,\n endOffset,\n startLine,\n endLine,\n startColumn,\n endColumn,\n tokenTypeIdx: (tokType).tokenTypeIdx,\n tokenType: tokType,\n };\n}\n\nexport function tokenMatcher(token: IToken, tokType: TokenType): boolean {\n return tokenStructuredMatcher(token, tokType);\n}\n", "import { hasTokenLabel, tokenLabel } from \"../scan/tokens_public.js\";\nimport { first, map, reduce } from \"lodash-es\";\nimport {\n Alternation,\n getProductionDslName,\n NonTerminal,\n Rule,\n Terminal,\n} from \"@chevrotain/gast\";\nimport {\n IParserErrorMessageProvider,\n IProductionWithOccurrence,\n TokenType,\n} from \"@chevrotain/types\";\nimport {\n IGrammarResolverErrorMessageProvider,\n IGrammarValidatorErrorMessageProvider,\n} from \"./grammar/types.js\";\n\nexport const defaultParserErrorProvider: IParserErrorMessageProvider = {\n buildMismatchTokenMessage({ expected, actual, previous, ruleName }): string {\n const hasLabel = hasTokenLabel(expected);\n const expectedMsg = hasLabel\n ? `--> ${tokenLabel(expected)} <--`\n : `token of type --> ${expected.name} <--`;\n\n const msg = `Expecting ${expectedMsg} but found --> '${actual.image}' <--`;\n\n return msg;\n },\n\n buildNotAllInputParsedMessage({ firstRedundant, ruleName }): string {\n return \"Redundant input, expecting EOF but found: \" + firstRedundant.image;\n },\n\n buildNoViableAltMessage({\n expectedPathsPerAlt,\n actual,\n previous,\n customUserDescription,\n ruleName,\n }): string {\n const errPrefix = \"Expecting: \";\n // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n const actualText = first(actual)!.image;\n const errSuffix = \"\\nbut found: '\" + actualText + \"'\";\n\n if (customUserDescription) {\n return errPrefix + customUserDescription + errSuffix;\n } else {\n const allLookAheadPaths = reduce(\n expectedPathsPerAlt,\n (result, currAltPaths) => result.concat(currAltPaths),\n [] as TokenType[][],\n );\n const nextValidTokenSequences = map(\n allLookAheadPaths,\n (currPath) =>\n `[${map(currPath, (currTokenType) => tokenLabel(currTokenType)).join(\n \", \",\n )}]`,\n );\n const nextValidSequenceItems = map(\n nextValidTokenSequences,\n (itemMsg, idx) => ` ${idx + 1}. ${itemMsg}`,\n );\n const calculatedDescription = `one of these possible Token sequences:\\n${nextValidSequenceItems.join(\n \"\\n\",\n )}`;\n\n return errPrefix + calculatedDescription + errSuffix;\n }\n },\n\n buildEarlyExitMessage({\n expectedIterationPaths,\n actual,\n customUserDescription,\n ruleName,\n }): string {\n const errPrefix = \"Expecting: \";\n // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n const actualText = first(actual)!.image;\n const errSuffix = \"\\nbut found: '\" + actualText + \"'\";\n\n if (customUserDescription) {\n return errPrefix + customUserDescription + errSuffix;\n } else {\n const nextValidTokenSequences = map(\n expectedIterationPaths,\n (currPath) =>\n `[${map(currPath, (currTokenType) => tokenLabel(currTokenType)).join(\n \",\",\n )}]`,\n );\n const calculatedDescription =\n `expecting at least one iteration which starts with one of these possible Token sequences::\\n ` +\n `<${nextValidTokenSequences.join(\" ,\")}>`;\n\n return errPrefix + calculatedDescription + errSuffix;\n }\n },\n};\n\nObject.freeze(defaultParserErrorProvider);\n\nexport const defaultGrammarResolverErrorProvider: IGrammarResolverErrorMessageProvider =\n {\n buildRuleNotFoundError(\n topLevelRule: Rule,\n undefinedRule: NonTerminal,\n ): string {\n const msg =\n \"Invalid grammar, reference to a rule which is not defined: ->\" +\n undefinedRule.nonTerminalName +\n \"<-\\n\" +\n \"inside top level rule: ->\" +\n topLevelRule.name +\n \"<-\";\n return msg;\n },\n };\n\nexport const defaultGrammarValidatorErrorProvider: IGrammarValidatorErrorMessageProvider =\n {\n buildDuplicateFoundError(\n topLevelRule: Rule,\n duplicateProds: IProductionWithOccurrence[],\n ): string {\n function getExtraProductionArgument(\n prod: IProductionWithOccurrence,\n ): string {\n if (prod instanceof Terminal) {\n return prod.terminalType.name;\n } else if (prod instanceof NonTerminal) {\n return prod.nonTerminalName;\n } else {\n return \"\";\n }\n }\n\n const topLevelName = topLevelRule.name;\n const duplicateProd = first(duplicateProds)!;\n const index = duplicateProd.idx;\n const dslName = getProductionDslName(duplicateProd);\n const extraArgument = getExtraProductionArgument(duplicateProd);\n\n const hasExplicitIndex = index > 0;\n let msg = `->${dslName}${hasExplicitIndex ? index : \"\"}<- ${\n extraArgument ? `with argument: ->${extraArgument}<-` : \"\"\n }\n appears more than once (${\n duplicateProds.length\n } times) in the top level rule: ->${topLevelName}<-. \n For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \n `;\n\n // white space trimming time! better to trim afterwards as it allows to use WELL formatted multi line template strings...\n msg = msg.replace(/[ \\t]+/g, \" \");\n msg = msg.replace(/\\s\\s+/g, \"\\n\");\n\n return msg;\n },\n\n buildNamespaceConflictError(rule: Rule): string {\n const errMsg =\n `Namespace conflict found in grammar.\\n` +\n `The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${rule.name}>.\\n` +\n `To resolve this make sure each Terminal and Non-Terminal names are unique\\n` +\n `This is easy to accomplish by using the convention that Terminal names start with an uppercase letter\\n` +\n `and Non-Terminal names start with a lower case letter.`;\n\n return errMsg;\n },\n\n buildAlternationPrefixAmbiguityError(options: {\n topLevelRule: Rule;\n prefixPath: TokenType[];\n ambiguityIndices: number[];\n alternation: Alternation;\n }): string {\n const pathMsg = map(options.prefixPath, (currTok) =>\n tokenLabel(currTok),\n ).join(\", \");\n const occurrence =\n options.alternation.idx === 0 ? \"\" : options.alternation.idx;\n const errMsg =\n `Ambiguous alternatives: <${options.ambiguityIndices.join(\n \" ,\",\n )}> due to common lookahead prefix\\n` +\n `in inside <${options.topLevelRule.name}> Rule,\\n` +\n `<${pathMsg}> may appears as a prefix path in all these alternatives.\\n` +\n `See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\\n` +\n `For Further details.`;\n\n return errMsg;\n },\n\n buildAlternationAmbiguityError(options: {\n topLevelRule: Rule;\n prefixPath: TokenType[];\n ambiguityIndices: number[];\n alternation: Alternation;\n }): string {\n const pathMsg = map(options.prefixPath, (currtok) =>\n tokenLabel(currtok),\n ).join(\", \");\n const occurrence =\n options.alternation.idx === 0 ? \"\" : options.alternation.idx;\n let currMessage =\n `Ambiguous Alternatives Detected: <${options.ambiguityIndices.join(\n \" ,\",\n )}> in ` +\n ` inside <${options.topLevelRule.name}> Rule,\\n` +\n `<${pathMsg}> may appears as a prefix path in all these alternatives.\\n`;\n\n currMessage =\n currMessage +\n `See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\\n` +\n `For Further details.`;\n return currMessage;\n },\n\n buildEmptyRepetitionError(options: {\n topLevelRule: Rule;\n repetition: IProductionWithOccurrence;\n }): string {\n let dslName = getProductionDslName(options.repetition);\n if (options.repetition.idx !== 0) {\n dslName += options.repetition.idx;\n }\n\n const errMsg =\n `The repetition <${dslName}> within Rule <${options.topLevelRule.name}> can never consume any tokens.\\n` +\n `This could lead to an infinite loop.`;\n\n return errMsg;\n },\n\n // TODO: remove - `errors_public` from nyc.config.js exclude\n // once this method is fully removed from this file\n buildTokenNameError(options: {\n tokenType: TokenType;\n expectedPattern: RegExp;\n }): string {\n /* istanbul ignore next */\n return \"deprecated\";\n },\n\n buildEmptyAlternationError(options: {\n topLevelRule: Rule;\n alternation: Alternation;\n emptyChoiceIdx: number;\n }): string {\n const errMsg =\n `Ambiguous empty alternative: <${options.emptyChoiceIdx + 1}>` +\n ` in inside <${options.topLevelRule.name}> Rule.\\n` +\n `Only the last alternative may be an empty alternative.`;\n\n return errMsg;\n },\n\n buildTooManyAlternativesError(options: {\n topLevelRule: Rule;\n alternation: Alternation;\n }): string {\n const errMsg =\n `An Alternation cannot have more than 256 alternatives:\\n` +\n ` inside <${\n options.topLevelRule.name\n }> Rule.\\n has ${\n options.alternation.definition.length + 1\n } alternatives.`;\n\n return errMsg;\n },\n\n buildLeftRecursionError(options: {\n topLevelRule: Rule;\n leftRecursionPath: Rule[];\n }): string {\n const ruleName = options.topLevelRule.name;\n const pathNames = map(\n options.leftRecursionPath,\n (currRule) => currRule.name,\n );\n const leftRecursivePath = `${ruleName} --> ${pathNames\n .concat([ruleName])\n .join(\" --> \")}`;\n const errMsg =\n `Left Recursion found in grammar.\\n` +\n `rule: <${ruleName}> can be invoked from itself (directly or indirectly)\\n` +\n `without consuming any Tokens. The grammar path that causes this is: \\n ${leftRecursivePath}\\n` +\n ` To fix this refactor your grammar to remove the left recursion.\\n` +\n `see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`;\n\n return errMsg;\n },\n\n // TODO: remove - `errors_public` from nyc.config.js exclude\n // once this method is fully removed from this file\n buildInvalidRuleNameError(options: {\n topLevelRule: Rule;\n expectedPattern: RegExp;\n }): string {\n /* istanbul ignore next */\n return \"deprecated\";\n },\n\n buildDuplicateRuleNameError(options: {\n topLevelRule: Rule | string;\n grammarName: string;\n }): string {\n let ruleName;\n if (options.topLevelRule instanceof Rule) {\n ruleName = options.topLevelRule.name;\n } else {\n ruleName = options.topLevelRule;\n }\n\n const errMsg = `Duplicate definition, rule: ->${ruleName}<- is already defined in the grammar: ->${options.grammarName}<-`;\n\n return errMsg;\n },\n };\n", "import {\n IParserUnresolvedRefDefinitionError,\n ParserDefinitionErrorType,\n} from \"../parser/parser.js\";\nimport { forEach, values } from \"lodash-es\";\nimport { GAstVisitor, NonTerminal, Rule } from \"@chevrotain/gast\";\nimport {\n IGrammarResolverErrorMessageProvider,\n IParserDefinitionError,\n} from \"./types.js\";\n\nexport function resolveGrammar(\n topLevels: Record,\n errMsgProvider: IGrammarResolverErrorMessageProvider,\n): IParserDefinitionError[] {\n const refResolver = new GastRefResolverVisitor(topLevels, errMsgProvider);\n refResolver.resolveRefs();\n return refResolver.errors;\n}\n\nexport class GastRefResolverVisitor extends GAstVisitor {\n public errors: IParserUnresolvedRefDefinitionError[] = [];\n private currTopLevel: Rule;\n\n constructor(\n private nameToTopRule: Record,\n private errMsgProvider: IGrammarResolverErrorMessageProvider,\n ) {\n super();\n }\n\n public resolveRefs(): void {\n forEach(values(this.nameToTopRule), (prod) => {\n this.currTopLevel = prod;\n prod.accept(this);\n });\n }\n\n public visitNonTerminal(node: NonTerminal): void {\n const ref = this.nameToTopRule[node.nonTerminalName];\n\n if (!ref) {\n const msg = this.errMsgProvider.buildRuleNotFoundError(\n this.currTopLevel,\n node,\n );\n this.errors.push({\n message: msg,\n type: ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,\n ruleName: this.currTopLevel.name,\n unresolvedRefName: node.nonTerminalName,\n });\n } else {\n node.referencedRule = ref;\n }\n }\n}\n", "import {\n clone,\n drop,\n dropRight,\n first as _first,\n forEach,\n isEmpty,\n last,\n} from \"lodash-es\";\nimport { first } from \"./first.js\";\nimport { RestWalker } from \"./rest.js\";\nimport { TokenMatcher } from \"../parser/parser.js\";\nimport {\n Alternation,\n Alternative,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Rule,\n Terminal,\n} from \"@chevrotain/gast\";\nimport {\n IGrammarPath,\n IProduction,\n ISyntacticContentAssistPath,\n IToken,\n ITokenGrammarPath,\n TokenType,\n} from \"@chevrotain/types\";\n\nexport abstract class AbstractNextPossibleTokensWalker extends RestWalker {\n protected possibleTokTypes: TokenType[] = [];\n protected ruleStack: string[];\n protected occurrenceStack: number[];\n\n protected nextProductionName = \"\";\n protected nextProductionOccurrence = 0;\n protected found = false;\n protected isAtEndOfPath = false;\n\n constructor(\n protected topProd: Rule,\n protected path: IGrammarPath,\n ) {\n super();\n }\n\n startWalking(): TokenType[] {\n this.found = false;\n\n if (this.path.ruleStack[0] !== this.topProd.name) {\n throw Error(\"The path does not start with the walker's top Rule!\");\n }\n\n // immutable for the win\n this.ruleStack = clone(this.path.ruleStack).reverse(); // intelij bug requires assertion\n this.occurrenceStack = clone(this.path.occurrenceStack).reverse(); // intelij bug requires assertion\n\n // already verified that the first production is valid, we now seek the 2nd production\n this.ruleStack.pop();\n this.occurrenceStack.pop();\n\n this.updateExpectedNext();\n this.walk(this.topProd);\n\n return this.possibleTokTypes;\n }\n\n walk(\n prod: { definition: IProduction[] },\n prevRest: IProduction[] = [],\n ): void {\n // stop scanning once we found the path\n if (!this.found) {\n super.walk(prod, prevRest);\n }\n }\n\n walkProdRef(\n refProd: NonTerminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // found the next production, need to keep walking in it\n if (\n refProd.referencedRule.name === this.nextProductionName &&\n refProd.idx === this.nextProductionOccurrence\n ) {\n const fullRest = currRest.concat(prevRest);\n this.updateExpectedNext();\n this.walk(refProd.referencedRule, fullRest);\n }\n }\n\n updateExpectedNext(): void {\n // need to consume the Terminal\n if (isEmpty(this.ruleStack)) {\n // must reset nextProductionXXX to avoid walking down another Top Level production while what we are\n // really seeking is the last Terminal...\n this.nextProductionName = \"\";\n this.nextProductionOccurrence = 0;\n this.isAtEndOfPath = true;\n } else {\n this.nextProductionName = this.ruleStack.pop()!;\n this.nextProductionOccurrence = this.occurrenceStack.pop()!;\n }\n }\n}\n\nexport class NextAfterTokenWalker extends AbstractNextPossibleTokensWalker {\n private nextTerminalName = \"\";\n private nextTerminalOccurrence = 0;\n\n constructor(\n topProd: Rule,\n protected path: ITokenGrammarPath,\n ) {\n super(topProd, path);\n this.nextTerminalName = this.path.lastTok.name;\n this.nextTerminalOccurrence = this.path.lastTokOccurrence;\n }\n\n walkTerminal(\n terminal: Terminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (\n this.isAtEndOfPath &&\n terminal.terminalType.name === this.nextTerminalName &&\n terminal.idx === this.nextTerminalOccurrence &&\n !this.found\n ) {\n const fullRest = currRest.concat(prevRest);\n const restProd = new Alternative({ definition: fullRest });\n this.possibleTokTypes = first(restProd);\n this.found = true;\n }\n }\n}\n\nexport type AlternativesFirstTokens = TokenType[][];\n\nexport interface IFirstAfterRepetition {\n token: TokenType | undefined;\n occurrence: number | undefined;\n isEndOfRule: boolean | undefined;\n}\n\n/**\n * This walker only \"walks\" a single \"TOP\" level in the Grammar Ast, this means\n * it never \"follows\" production refs\n */\nexport class AbstractNextTerminalAfterProductionWalker extends RestWalker {\n protected result: IFirstAfterRepetition = {\n token: undefined,\n occurrence: undefined,\n isEndOfRule: undefined,\n };\n\n constructor(\n protected topRule: Rule,\n protected occurrence: number,\n ) {\n super();\n }\n\n startWalking(): IFirstAfterRepetition {\n this.walk(this.topRule);\n return this.result;\n }\n}\n\nexport class NextTerminalAfterManyWalker extends AbstractNextTerminalAfterProductionWalker {\n walkMany(\n manyProd: Repetition,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (manyProd.idx === this.occurrence) {\n const firstAfterMany = _first(currRest.concat(prevRest));\n this.result.isEndOfRule = firstAfterMany === undefined;\n if (firstAfterMany instanceof Terminal) {\n this.result.token = firstAfterMany.terminalType;\n this.result.occurrence = firstAfterMany.idx;\n }\n } else {\n super.walkMany(manyProd, currRest, prevRest);\n }\n }\n}\n\nexport class NextTerminalAfterManySepWalker extends AbstractNextTerminalAfterProductionWalker {\n walkManySep(\n manySepProd: RepetitionWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (manySepProd.idx === this.occurrence) {\n const firstAfterManySep = _first(currRest.concat(prevRest));\n this.result.isEndOfRule = firstAfterManySep === undefined;\n if (firstAfterManySep instanceof Terminal) {\n this.result.token = firstAfterManySep.terminalType;\n this.result.occurrence = firstAfterManySep.idx;\n }\n } else {\n super.walkManySep(manySepProd, currRest, prevRest);\n }\n }\n}\n\nexport class NextTerminalAfterAtLeastOneWalker extends AbstractNextTerminalAfterProductionWalker {\n walkAtLeastOne(\n atLeastOneProd: RepetitionMandatory,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (atLeastOneProd.idx === this.occurrence) {\n const firstAfterAtLeastOne = _first(currRest.concat(prevRest));\n this.result.isEndOfRule = firstAfterAtLeastOne === undefined;\n if (firstAfterAtLeastOne instanceof Terminal) {\n this.result.token = firstAfterAtLeastOne.terminalType;\n this.result.occurrence = firstAfterAtLeastOne.idx;\n }\n } else {\n super.walkAtLeastOne(atLeastOneProd, currRest, prevRest);\n }\n }\n}\n\n// TODO: reduce code duplication in the AfterWalkers\nexport class NextTerminalAfterAtLeastOneSepWalker extends AbstractNextTerminalAfterProductionWalker {\n walkAtLeastOneSep(\n atleastOneSepProd: RepetitionMandatoryWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (atleastOneSepProd.idx === this.occurrence) {\n const firstAfterfirstAfterAtLeastOneSep = _first(\n currRest.concat(prevRest),\n );\n this.result.isEndOfRule = firstAfterfirstAfterAtLeastOneSep === undefined;\n if (firstAfterfirstAfterAtLeastOneSep instanceof Terminal) {\n this.result.token = firstAfterfirstAfterAtLeastOneSep.terminalType;\n this.result.occurrence = firstAfterfirstAfterAtLeastOneSep.idx;\n }\n } else {\n super.walkAtLeastOneSep(atleastOneSepProd, currRest, prevRest);\n }\n }\n}\n\nexport interface PartialPathAndSuffixes {\n partialPath: TokenType[];\n suffixDef: IProduction[];\n}\n\nexport function possiblePathsFrom(\n targetDef: IProduction[],\n maxLength: number,\n currPath: TokenType[] = [],\n): PartialPathAndSuffixes[] {\n // avoid side effects\n currPath = clone(currPath);\n let result: PartialPathAndSuffixes[] = [];\n let i = 0;\n\n // TODO: avoid inner funcs\n function remainingPathWith(nextDef: IProduction[]) {\n return nextDef.concat(drop(targetDef, i + 1));\n }\n\n // TODO: avoid inner funcs\n function getAlternativesForProd(definition: IProduction[]) {\n const alternatives = possiblePathsFrom(\n remainingPathWith(definition),\n maxLength,\n currPath,\n );\n return result.concat(alternatives);\n }\n\n /**\n * Mandatory productions will halt the loop as the paths computed from their recursive calls will already contain the\n * following (rest) of the targetDef.\n *\n * For optional productions (Option/Repetition/...) the loop will continue to represent the paths that do not include the\n * the optional production.\n */\n while (currPath.length < maxLength && i < targetDef.length) {\n const prod = targetDef[i];\n\n /* istanbul ignore else */\n if (prod instanceof Alternative) {\n return getAlternativesForProd(prod.definition);\n } else if (prod instanceof NonTerminal) {\n return getAlternativesForProd(prod.definition);\n } else if (prod instanceof Option) {\n result = getAlternativesForProd(prod.definition);\n } else if (prod instanceof RepetitionMandatory) {\n const newDef = prod.definition.concat([\n new Repetition({\n definition: prod.definition,\n }),\n ]);\n return getAlternativesForProd(newDef);\n } else if (prod instanceof RepetitionMandatoryWithSeparator) {\n const newDef = [\n new Alternative({ definition: prod.definition }),\n new Repetition({\n definition: [new Terminal({ terminalType: prod.separator })].concat(\n prod.definition,\n ),\n }),\n ];\n return getAlternativesForProd(newDef);\n } else if (prod instanceof RepetitionWithSeparator) {\n const newDef = prod.definition.concat([\n new Repetition({\n definition: [new Terminal({ terminalType: prod.separator })].concat(\n prod.definition,\n ),\n }),\n ]);\n result = getAlternativesForProd(newDef);\n } else if (prod instanceof Repetition) {\n const newDef = prod.definition.concat([\n new Repetition({\n definition: prod.definition,\n }),\n ]);\n result = getAlternativesForProd(newDef);\n } else if (prod instanceof Alternation) {\n forEach(prod.definition, (currAlt) => {\n // TODO: this is a limited check for empty alternatives\n // It would prevent a common case of infinite loops during parser initialization.\n // However **in-directly** empty alternatives may still cause issues.\n if (isEmpty(currAlt.definition) === false) {\n result = getAlternativesForProd(currAlt.definition);\n }\n });\n return result;\n } else if (prod instanceof Terminal) {\n currPath.push(prod.terminalType);\n } else {\n throw Error(\"non exhaustive match\");\n }\n\n i++;\n }\n result.push({\n partialPath: currPath,\n suffixDef: drop(targetDef, i),\n });\n\n return result;\n}\n\ninterface IPathToExamine {\n idx: number;\n def: IProduction[];\n ruleStack: string[];\n occurrenceStack: number[];\n}\n\nexport function nextPossibleTokensAfter(\n initialDef: IProduction[],\n tokenVector: IToken[],\n tokMatcher: TokenMatcher,\n maxLookAhead: number,\n): ISyntacticContentAssistPath[] {\n const EXIT_NON_TERMINAL: any = \"EXIT_NONE_TERMINAL\";\n // to avoid creating a new Array each time.\n const EXIT_NON_TERMINAL_ARR = [EXIT_NON_TERMINAL];\n const EXIT_ALTERNATIVE: any = \"EXIT_ALTERNATIVE\";\n let foundCompletePath = false;\n\n const tokenVectorLength = tokenVector.length;\n const minimalAlternativesIndex = tokenVectorLength - maxLookAhead - 1;\n\n const result: ISyntacticContentAssistPath[] = [];\n\n const possiblePaths: IPathToExamine[] = [];\n possiblePaths.push({\n idx: -1,\n def: initialDef,\n ruleStack: [],\n occurrenceStack: [],\n });\n\n while (!isEmpty(possiblePaths)) {\n const currPath = possiblePaths.pop()!;\n\n // skip alternatives if no more results can be found (assuming deterministic grammar with fixed lookahead)\n if (currPath === EXIT_ALTERNATIVE) {\n if (\n foundCompletePath &&\n last(possiblePaths)!.idx <= minimalAlternativesIndex\n ) {\n // remove irrelevant alternative\n possiblePaths.pop();\n }\n continue;\n }\n\n const currDef = currPath.def;\n const currIdx = currPath.idx;\n const currRuleStack = currPath.ruleStack;\n const currOccurrenceStack = currPath.occurrenceStack;\n\n // For Example: an empty path could exist in a valid grammar in the case of an EMPTY_ALT\n if (isEmpty(currDef)) {\n continue;\n }\n\n const prod = currDef[0];\n /* istanbul ignore else */\n if (prod === EXIT_NON_TERMINAL) {\n const nextPath = {\n idx: currIdx,\n def: drop(currDef),\n ruleStack: dropRight(currRuleStack),\n occurrenceStack: dropRight(currOccurrenceStack),\n };\n possiblePaths.push(nextPath);\n } else if (prod instanceof Terminal) {\n /* istanbul ignore else */\n if (currIdx < tokenVectorLength - 1) {\n const nextIdx = currIdx + 1;\n const actualToken = tokenVector[nextIdx];\n if (tokMatcher!(actualToken, prod.terminalType)) {\n const nextPath = {\n idx: nextIdx,\n def: drop(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPath);\n }\n // end of the line\n } else if (currIdx === tokenVectorLength - 1) {\n // IGNORE ABOVE ELSE\n result.push({\n nextTokenType: prod.terminalType,\n nextTokenOccurrence: prod.idx,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n });\n foundCompletePath = true;\n } else {\n throw Error(\"non exhaustive match\");\n }\n } else if (prod instanceof NonTerminal) {\n const newRuleStack = clone(currRuleStack);\n newRuleStack.push(prod.nonTerminalName);\n\n const newOccurrenceStack = clone(currOccurrenceStack);\n newOccurrenceStack.push(prod.idx);\n\n const nextPath = {\n idx: currIdx,\n def: prod.definition.concat(EXIT_NON_TERMINAL_ARR, drop(currDef)),\n ruleStack: newRuleStack,\n occurrenceStack: newOccurrenceStack,\n };\n possiblePaths.push(nextPath);\n } else if (prod instanceof Option) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n const nextPathWithout = {\n idx: currIdx,\n def: drop(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWithout);\n // required marker to avoid backtracking paths whose higher priority alternatives already matched\n possiblePaths.push(EXIT_ALTERNATIVE);\n\n const nextPathWith = {\n idx: currIdx,\n def: prod.definition.concat(drop(currDef)),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWith);\n } else if (prod instanceof RepetitionMandatory) {\n // TODO:(THE NEW operators here take a while...) (convert once?)\n const secondIteration = new Repetition({\n definition: prod.definition,\n idx: prod.idx,\n });\n const nextDef = prod.definition.concat([secondIteration], drop(currDef));\n const nextPath = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPath);\n } else if (prod instanceof RepetitionMandatoryWithSeparator) {\n // TODO:(THE NEW operators here take a while...) (convert once?)\n const separatorGast = new Terminal({\n terminalType: prod.separator,\n });\n const secondIteration = new Repetition({\n definition: [separatorGast].concat(prod.definition),\n idx: prod.idx,\n });\n const nextDef = prod.definition.concat([secondIteration], drop(currDef));\n const nextPath = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPath);\n } else if (prod instanceof RepetitionWithSeparator) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n const nextPathWithout = {\n idx: currIdx,\n def: drop(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWithout);\n // required marker to avoid backtracking paths whose higher priority alternatives already matched\n possiblePaths.push(EXIT_ALTERNATIVE);\n\n const separatorGast = new Terminal({\n terminalType: prod.separator,\n });\n const nthRepetition = new Repetition({\n definition: [separatorGast].concat(prod.definition),\n idx: prod.idx,\n });\n const nextDef = prod.definition.concat([nthRepetition], drop(currDef));\n const nextPathWith = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWith);\n } else if (prod instanceof Repetition) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n const nextPathWithout = {\n idx: currIdx,\n def: drop(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWithout);\n // required marker to avoid backtracking paths whose higher priority alternatives already matched\n possiblePaths.push(EXIT_ALTERNATIVE);\n\n // TODO: an empty repetition will cause infinite loops here, will the parser detect this in selfAnalysis?\n const nthRepetition = new Repetition({\n definition: prod.definition,\n idx: prod.idx,\n });\n const nextDef = prod.definition.concat([nthRepetition], drop(currDef));\n const nextPathWith = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWith);\n } else if (prod instanceof Alternation) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n for (let i = prod.definition.length - 1; i >= 0; i--) {\n const currAlt: any = prod.definition[i];\n const currAltPath = {\n idx: currIdx,\n def: currAlt.definition.concat(drop(currDef)),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(currAltPath);\n possiblePaths.push(EXIT_ALTERNATIVE);\n }\n } else if (prod instanceof Alternative) {\n possiblePaths.push({\n idx: currIdx,\n def: prod.definition.concat(drop(currDef)),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n });\n } else if (prod instanceof Rule) {\n // last because we should only encounter at most a single one of these per invocation.\n possiblePaths.push(\n expandTopLevelRule(prod, currIdx, currRuleStack, currOccurrenceStack),\n );\n } else {\n throw Error(\"non exhaustive match\");\n }\n }\n return result;\n}\n\nfunction expandTopLevelRule(\n topRule: Rule,\n currIdx: number,\n currRuleStack: string[],\n currOccurrenceStack: number[],\n): IPathToExamine {\n const newRuleStack = clone(currRuleStack);\n newRuleStack.push(topRule.name);\n\n const newCurrOccurrenceStack = clone(currOccurrenceStack);\n // top rule is always assumed to have been called with occurrence index 1\n newCurrOccurrenceStack.push(1);\n\n return {\n idx: currIdx,\n def: topRule.definition,\n ruleStack: newRuleStack,\n occurrenceStack: newCurrOccurrenceStack,\n };\n}\n", "import { every, flatten, forEach, has, isEmpty, map, reduce } from \"lodash-es\";\nimport { possiblePathsFrom } from \"./interpreter.js\";\nimport { RestWalker } from \"./rest.js\";\nimport { Predicate, TokenMatcher } from \"../parser/parser.js\";\nimport {\n tokenStructuredMatcher,\n tokenStructuredMatcherNoCategories,\n} from \"../../scan/tokens.js\";\nimport {\n Alternation,\n Alternative as AlternativeGAST,\n GAstVisitor,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n} from \"@chevrotain/gast\";\nimport {\n BaseParser,\n IOrAlt,\n IProduction,\n IProductionWithOccurrence,\n LookaheadProductionType,\n LookaheadSequence,\n Rule,\n TokenType,\n} from \"@chevrotain/types\";\n\nexport enum PROD_TYPE {\n OPTION,\n REPETITION,\n REPETITION_MANDATORY,\n REPETITION_MANDATORY_WITH_SEPARATOR,\n REPETITION_WITH_SEPARATOR,\n ALTERNATION,\n}\n\nexport function getProdType(\n prod: IProduction | LookaheadProductionType,\n): PROD_TYPE {\n /* istanbul ignore else */\n if (prod instanceof Option || prod === \"Option\") {\n return PROD_TYPE.OPTION;\n } else if (prod instanceof Repetition || prod === \"Repetition\") {\n return PROD_TYPE.REPETITION;\n } else if (\n prod instanceof RepetitionMandatory ||\n prod === \"RepetitionMandatory\"\n ) {\n return PROD_TYPE.REPETITION_MANDATORY;\n } else if (\n prod instanceof RepetitionMandatoryWithSeparator ||\n prod === \"RepetitionMandatoryWithSeparator\"\n ) {\n return PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR;\n } else if (\n prod instanceof RepetitionWithSeparator ||\n prod === \"RepetitionWithSeparator\"\n ) {\n return PROD_TYPE.REPETITION_WITH_SEPARATOR;\n } else if (prod instanceof Alternation || prod === \"Alternation\") {\n return PROD_TYPE.ALTERNATION;\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n\nexport function getLookaheadPaths(options: {\n occurrence: number;\n rule: Rule;\n prodType: LookaheadProductionType;\n maxLookahead: number;\n}): LookaheadSequence[] {\n const { occurrence, rule, prodType, maxLookahead } = options;\n const type = getProdType(prodType);\n if (type === PROD_TYPE.ALTERNATION) {\n return getLookaheadPathsForOr(occurrence, rule, maxLookahead);\n } else {\n return getLookaheadPathsForOptionalProd(\n occurrence,\n rule,\n type,\n maxLookahead,\n );\n }\n}\n\nexport function buildLookaheadFuncForOr(\n occurrence: number,\n ruleGrammar: Rule,\n maxLookahead: number,\n hasPredicates: boolean,\n dynamicTokensEnabled: boolean,\n laFuncBuilder: Function,\n): (orAlts?: IOrAlt[]) => number | undefined {\n const lookAheadPaths = getLookaheadPathsForOr(\n occurrence,\n ruleGrammar,\n maxLookahead,\n );\n\n const tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokenStructuredMatcherNoCategories\n : tokenStructuredMatcher;\n\n return laFuncBuilder(\n lookAheadPaths,\n hasPredicates,\n tokenMatcher,\n dynamicTokensEnabled,\n );\n}\n\n/**\n * When dealing with an Optional production (OPTION/MANY/2nd iteration of AT_LEAST_ONE/...) we need to compare\n * the lookahead \"inside\" the production and the lookahead immediately \"after\" it in the same top level rule (context free).\n *\n * Example: given a production:\n * ABC(DE)?DF\n *\n * The optional '(DE)?' should only be entered if we see 'DE'. a single Token 'D' is not sufficient to distinguish between the two\n * alternatives.\n *\n * @returns A Lookahead function which will return true IFF the parser should parse the Optional production.\n */\nexport function buildLookaheadFuncForOptionalProd(\n occurrence: number,\n ruleGrammar: Rule,\n k: number,\n dynamicTokensEnabled: boolean,\n prodType: PROD_TYPE,\n lookaheadBuilder: (\n lookAheadSequence: LookaheadSequence,\n tokenMatcher: TokenMatcher,\n dynamicTokensEnabled: boolean,\n ) => () => boolean,\n): () => boolean {\n const lookAheadPaths = getLookaheadPathsForOptionalProd(\n occurrence,\n ruleGrammar,\n prodType,\n k,\n );\n\n const tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokenStructuredMatcherNoCategories\n : tokenStructuredMatcher;\n\n return lookaheadBuilder(\n lookAheadPaths[0],\n tokenMatcher,\n dynamicTokensEnabled,\n );\n}\n\nexport type Alternative = TokenType[][];\n\nexport function buildAlternativesLookAheadFunc(\n alts: LookaheadSequence[],\n hasPredicates: boolean,\n tokenMatcher: TokenMatcher,\n dynamicTokensEnabled: boolean,\n): (orAlts: IOrAlt[]) => number | undefined {\n const numOfAlts = alts.length;\n const areAllOneTokenLookahead = every(alts, (currAlt) => {\n return every(currAlt, (currPath) => {\n return currPath.length === 1;\n });\n });\n\n // This version takes into account the predicates as well.\n if (hasPredicates) {\n /**\n * @returns {number} - The chosen alternative index\n */\n return function (\n this: BaseParser,\n orAlts: IOrAlt[],\n ): number | undefined {\n // unfortunately the predicates must be extracted every single time\n // as they cannot be cached due to references to parameters(vars) which are no longer valid.\n // note that in the common case of no predicates, no cpu time will be wasted on this (see else block)\n const predicates: (Predicate | undefined)[] = map(\n orAlts,\n (currAlt) => currAlt.GATE,\n );\n\n for (let t = 0; t < numOfAlts; t++) {\n const currAlt = alts[t];\n const currNumOfPaths = currAlt.length;\n\n const currPredicate = predicates[t];\n if (currPredicate !== undefined && currPredicate.call(this) === false) {\n // if the predicate does not match there is no point in checking the paths\n continue;\n }\n nextPath: for (let j = 0; j < currNumOfPaths; j++) {\n const currPath = currAlt[j];\n const currPathLength = currPath.length;\n for (let i = 0; i < currPathLength; i++) {\n const nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n } else if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead. These Optimizations cannot work if dynamically defined Tokens are used.\n const singleTokenAlts = map(alts, (currAlt) => {\n return flatten(currAlt);\n });\n\n const choiceToAlt = reduce(\n singleTokenAlts,\n (result, currAlt, idx) => {\n forEach(currAlt, (currTokType) => {\n if (!has(result, currTokType.tokenTypeIdx!)) {\n result[currTokType.tokenTypeIdx!] = idx;\n }\n forEach(currTokType.categoryMatches!, (currExtendingType) => {\n if (!has(result, currExtendingType)) {\n result[currExtendingType] = idx;\n }\n });\n });\n return result;\n },\n {} as Record,\n );\n\n /**\n * @returns {number} - The chosen alternative index\n */\n return function (this: BaseParser): number {\n const nextToken = this.LA(1);\n return choiceToAlt[nextToken.tokenTypeIdx];\n };\n } else {\n // optimized lookahead without needing to check the predicates at all.\n // this causes code duplication which is intentional to improve performance.\n /**\n * @returns {number} - The chosen alternative index\n */\n return function (this: BaseParser): number | undefined {\n for (let t = 0; t < numOfAlts; t++) {\n const currAlt = alts[t];\n const currNumOfPaths = currAlt.length;\n nextPath: for (let j = 0; j < currNumOfPaths; j++) {\n const currPath = currAlt[j];\n const currPathLength = currPath.length;\n for (let i = 0; i < currPathLength; i++) {\n const nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n }\n}\n\nexport function buildSingleAlternativeLookaheadFunction(\n alt: LookaheadSequence,\n tokenMatcher: TokenMatcher,\n dynamicTokensEnabled: boolean,\n): () => boolean {\n const areAllOneTokenLookahead = every(alt, (currPath) => {\n return currPath.length === 1;\n });\n\n const numOfPaths = alt.length;\n\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead.\n if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n const singleTokensTypes = flatten(alt);\n\n if (\n singleTokensTypes.length === 1 &&\n isEmpty((singleTokensTypes[0]).categoryMatches)\n ) {\n const expectedTokenType = singleTokensTypes[0];\n const expectedTokenUniqueKey = (expectedTokenType).tokenTypeIdx;\n\n return function (this: BaseParser): boolean {\n return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey;\n };\n } else {\n const choiceToAlt = reduce(\n singleTokensTypes,\n (result, currTokType, idx) => {\n result[currTokType.tokenTypeIdx!] = true;\n forEach(currTokType.categoryMatches!, (currExtendingType) => {\n result[currExtendingType] = true;\n });\n return result;\n },\n [] as boolean[],\n );\n\n return function (this: BaseParser): boolean {\n const nextToken = this.LA(1);\n return choiceToAlt[nextToken.tokenTypeIdx] === true;\n };\n }\n } else {\n return function (this: BaseParser): boolean {\n nextPath: for (let j = 0; j < numOfPaths; j++) {\n const currPath = alt[j];\n const currPathLength = currPath.length;\n for (let i = 0; i < currPathLength; i++) {\n const nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n return true;\n }\n\n // none of the paths matched\n return false;\n };\n }\n}\n\nclass RestDefinitionFinderWalker extends RestWalker {\n private restDef: IProduction[];\n\n constructor(\n private topProd: Rule,\n private targetOccurrence: number,\n private targetProdType: PROD_TYPE,\n ) {\n super();\n }\n\n startWalking(): IProduction[] {\n this.walk(this.topProd);\n return this.restDef;\n }\n\n private checkIsTarget(\n node: IProductionWithOccurrence,\n expectedProdType: PROD_TYPE,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): boolean {\n if (\n node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdType\n ) {\n this.restDef = currRest.concat(prevRest);\n return true;\n }\n // performance optimization, do not iterate over the entire Grammar ast after we have found the target\n return false;\n }\n\n walkOption(\n optionProd: Option,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (!this.checkIsTarget(optionProd, PROD_TYPE.OPTION, currRest, prevRest)) {\n super.walkOption(optionProd, currRest, prevRest);\n }\n }\n\n walkAtLeastOne(\n atLeastOneProd: RepetitionMandatory,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (\n !this.checkIsTarget(\n atLeastOneProd,\n PROD_TYPE.REPETITION_MANDATORY,\n currRest,\n prevRest,\n )\n ) {\n super.walkOption(atLeastOneProd, currRest, prevRest);\n }\n }\n\n walkAtLeastOneSep(\n atLeastOneSepProd: RepetitionMandatoryWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (\n !this.checkIsTarget(\n atLeastOneSepProd,\n PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,\n currRest,\n prevRest,\n )\n ) {\n super.walkOption(atLeastOneSepProd, currRest, prevRest);\n }\n }\n\n walkMany(\n manyProd: Repetition,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (\n !this.checkIsTarget(manyProd, PROD_TYPE.REPETITION, currRest, prevRest)\n ) {\n super.walkOption(manyProd, currRest, prevRest);\n }\n }\n\n walkManySep(\n manySepProd: RepetitionWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (\n !this.checkIsTarget(\n manySepProd,\n PROD_TYPE.REPETITION_WITH_SEPARATOR,\n currRest,\n prevRest,\n )\n ) {\n super.walkOption(manySepProd, currRest, prevRest);\n }\n }\n}\n\n/**\n * Returns the definition of a target production in a top level level rule.\n */\nclass InsideDefinitionFinderVisitor extends GAstVisitor {\n public result: IProduction[] = [];\n\n constructor(\n private targetOccurrence: number,\n private targetProdType: PROD_TYPE,\n private targetRef?: any,\n ) {\n super();\n }\n\n private checkIsTarget(\n node: { definition: IProduction[] } & IProductionWithOccurrence,\n expectedProdName: PROD_TYPE,\n ): void {\n if (\n node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdName &&\n (this.targetRef === undefined || node === this.targetRef)\n ) {\n this.result = node.definition;\n }\n }\n\n public visitOption(node: Option): void {\n this.checkIsTarget(node, PROD_TYPE.OPTION);\n }\n\n public visitRepetition(node: Repetition): void {\n this.checkIsTarget(node, PROD_TYPE.REPETITION);\n }\n\n public visitRepetitionMandatory(node: RepetitionMandatory): void {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY);\n }\n\n public visitRepetitionMandatoryWithSeparator(\n node: RepetitionMandatoryWithSeparator,\n ): void {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR);\n }\n\n public visitRepetitionWithSeparator(node: RepetitionWithSeparator): void {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_WITH_SEPARATOR);\n }\n\n public visitAlternation(node: Alternation): void {\n this.checkIsTarget(node, PROD_TYPE.ALTERNATION);\n }\n}\n\nfunction initializeArrayOfArrays(size: number): any[][] {\n const result = new Array(size);\n for (let i = 0; i < size; i++) {\n result[i] = [];\n }\n return result;\n}\n\n/**\n * A sort of hash function between a Path in the grammar and a string.\n * Note that this returns multiple \"hashes\" to support the scenario of token categories.\n * - A single path with categories may match multiple **actual** paths.\n */\nfunction pathToHashKeys(path: TokenType[]): string[] {\n let keys = [\"\"];\n for (let i = 0; i < path.length; i++) {\n const tokType = path[i];\n const longerKeys = [];\n for (let j = 0; j < keys.length; j++) {\n const currShorterKey = keys[j];\n longerKeys.push(currShorterKey + \"_\" + tokType.tokenTypeIdx);\n for (let t = 0; t < tokType.categoryMatches!.length; t++) {\n const categoriesKeySuffix = \"_\" + tokType.categoryMatches![t];\n longerKeys.push(currShorterKey + categoriesKeySuffix);\n }\n }\n keys = longerKeys;\n }\n return keys;\n}\n\n/**\n * Imperative style due to being called from a hot spot\n */\nfunction isUniquePrefixHash(\n altKnownPathsKeys: Record[],\n searchPathKeys: string[],\n idx: number,\n): boolean {\n for (\n let currAltIdx = 0;\n currAltIdx < altKnownPathsKeys.length;\n currAltIdx++\n ) {\n // We only want to test vs the other alternatives\n if (currAltIdx === idx) {\n continue;\n }\n const otherAltKnownPathsKeys = altKnownPathsKeys[currAltIdx];\n for (let searchIdx = 0; searchIdx < searchPathKeys.length; searchIdx++) {\n const searchKey = searchPathKeys[searchIdx];\n if (otherAltKnownPathsKeys[searchKey] === true) {\n return false;\n }\n }\n }\n // None of the SearchPathKeys were found in any of the other alternatives\n return true;\n}\n\nexport function lookAheadSequenceFromAlternatives(\n altsDefs: IProduction[],\n k: number,\n): LookaheadSequence[] {\n const partialAlts = map(altsDefs, (currAlt) =>\n possiblePathsFrom([currAlt], 1),\n );\n const finalResult = initializeArrayOfArrays(partialAlts.length);\n const altsHashes = map(partialAlts, (currAltPaths) => {\n const dict: { [key: string]: boolean } = {};\n forEach(currAltPaths, (item) => {\n const keys = pathToHashKeys(item.partialPath);\n forEach(keys, (currKey) => {\n dict[currKey] = true;\n });\n });\n return dict;\n });\n let newData = partialAlts;\n\n // maxLookahead loop\n for (let pathLength = 1; pathLength <= k; pathLength++) {\n const currDataset = newData;\n newData = initializeArrayOfArrays(currDataset.length);\n\n // alternatives loop\n for (let altIdx = 0; altIdx < currDataset.length; altIdx++) {\n const currAltPathsAndSuffixes = currDataset[altIdx];\n // paths in current alternative loop\n for (\n let currPathIdx = 0;\n currPathIdx < currAltPathsAndSuffixes.length;\n currPathIdx++\n ) {\n const currPathPrefix = currAltPathsAndSuffixes[currPathIdx].partialPath;\n const suffixDef = currAltPathsAndSuffixes[currPathIdx].suffixDef;\n const prefixKeys = pathToHashKeys(currPathPrefix);\n const isUnique = isUniquePrefixHash(altsHashes, prefixKeys, altIdx);\n // End of the line for this path.\n if (isUnique || isEmpty(suffixDef) || currPathPrefix.length === k) {\n const currAltResult = finalResult[altIdx];\n // TODO: Can we implement a containsPath using Maps/Dictionaries?\n if (containsPath(currAltResult, currPathPrefix) === false) {\n currAltResult.push(currPathPrefix);\n // Update all new keys for the current path.\n for (let j = 0; j < prefixKeys.length; j++) {\n const currKey = prefixKeys[j];\n altsHashes[altIdx][currKey] = true;\n }\n }\n }\n // Expand longer paths\n else {\n const newPartialPathsAndSuffixes = possiblePathsFrom(\n suffixDef,\n pathLength + 1,\n currPathPrefix,\n );\n newData[altIdx] = newData[altIdx].concat(newPartialPathsAndSuffixes);\n\n // Update keys for new known paths\n forEach(newPartialPathsAndSuffixes, (item) => {\n const prefixKeys = pathToHashKeys(item.partialPath);\n forEach(prefixKeys, (key) => {\n altsHashes[altIdx][key] = true;\n });\n });\n }\n }\n }\n }\n\n return finalResult;\n}\n\nexport function getLookaheadPathsForOr(\n occurrence: number,\n ruleGrammar: Rule,\n k: number,\n orProd?: Alternation,\n): LookaheadSequence[] {\n const visitor = new InsideDefinitionFinderVisitor(\n occurrence,\n PROD_TYPE.ALTERNATION,\n orProd,\n );\n ruleGrammar.accept(visitor);\n return lookAheadSequenceFromAlternatives(visitor.result, k);\n}\n\nexport function getLookaheadPathsForOptionalProd(\n occurrence: number,\n ruleGrammar: Rule,\n prodType: PROD_TYPE,\n k: number,\n): LookaheadSequence[] {\n const insideDefVisitor = new InsideDefinitionFinderVisitor(\n occurrence,\n prodType,\n );\n ruleGrammar.accept(insideDefVisitor);\n const insideDef = insideDefVisitor.result;\n\n const afterDefWalker = new RestDefinitionFinderWalker(\n ruleGrammar,\n occurrence,\n prodType,\n );\n const afterDef = afterDefWalker.startWalking();\n\n const insideFlat = new AlternativeGAST({ definition: insideDef });\n const afterFlat = new AlternativeGAST({ definition: afterDef });\n\n return lookAheadSequenceFromAlternatives([insideFlat, afterFlat], k);\n}\n\nexport function containsPath(\n alternative: Alternative,\n searchPath: TokenType[],\n): boolean {\n compareOtherPath: for (let i = 0; i < alternative.length; i++) {\n const otherPath = alternative[i];\n if (otherPath.length !== searchPath.length) {\n continue;\n }\n for (let j = 0; j < otherPath.length; j++) {\n const searchTok = searchPath[j];\n const otherTok = otherPath[j];\n\n const matchingTokens =\n searchTok === otherTok ||\n otherTok.categoryMatchesMap![searchTok.tokenTypeIdx!] !== undefined;\n if (matchingTokens === false) {\n continue compareOtherPath;\n }\n }\n return true;\n }\n\n return false;\n}\n\nexport function isStrictPrefixOfPath(\n prefix: TokenType[],\n other: TokenType[],\n): boolean {\n return (\n prefix.length < other.length &&\n every(prefix, (tokType, idx) => {\n const otherTokType = other[idx];\n return (\n tokType === otherTokType ||\n otherTokType.categoryMatchesMap![tokType.tokenTypeIdx!]\n );\n })\n );\n}\n\nexport function areTokenCategoriesNotUsed(\n lookAheadPaths: LookaheadSequence[],\n): boolean {\n return every(lookAheadPaths, (singleAltPaths) =>\n every(singleAltPaths, (singlePath) =>\n every(singlePath, (token) => isEmpty(token.categoryMatches!)),\n ),\n );\n}\n", "import {\n clone,\n compact,\n difference,\n drop,\n dropRight,\n filter,\n first,\n flatMap,\n flatten,\n forEach,\n groupBy,\n includes,\n isEmpty,\n map,\n pickBy,\n reduce,\n reject,\n values,\n} from \"lodash-es\";\nimport {\n IParserAmbiguousAlternativesDefinitionError,\n IParserDuplicatesDefinitionError,\n IParserEmptyAlternativeDefinitionError,\n ParserDefinitionErrorType,\n} from \"../parser/parser.js\";\nimport {\n Alternation,\n Alternative as AlternativeGAST,\n GAstVisitor,\n getProductionDslName,\n isOptionalProd,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Terminal,\n} from \"@chevrotain/gast\";\nimport {\n Alternative,\n containsPath,\n getLookaheadPathsForOptionalProd,\n getLookaheadPathsForOr,\n getProdType,\n isStrictPrefixOfPath,\n} from \"./lookahead.js\";\nimport { nextPossibleTokensAfter } from \"./interpreter.js\";\nimport {\n ILookaheadStrategy,\n IProduction,\n IProductionWithOccurrence,\n Rule,\n TokenType,\n} from \"@chevrotain/types\";\nimport {\n IGrammarValidatorErrorMessageProvider,\n IParserDefinitionError,\n} from \"./types.js\";\nimport { tokenStructuredMatcher } from \"../../scan/tokens.js\";\n\nexport function validateLookahead(options: {\n lookaheadStrategy: ILookaheadStrategy;\n rules: Rule[];\n tokenTypes: TokenType[];\n grammarName: string;\n}): IParserDefinitionError[] {\n const lookaheadValidationErrorMessages = options.lookaheadStrategy.validate({\n rules: options.rules,\n tokenTypes: options.tokenTypes,\n grammarName: options.grammarName,\n });\n return map(lookaheadValidationErrorMessages, (errorMessage) => ({\n type: ParserDefinitionErrorType.CUSTOM_LOOKAHEAD_VALIDATION,\n ...errorMessage,\n }));\n}\n\nexport function validateGrammar(\n topLevels: Rule[],\n tokenTypes: TokenType[],\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n grammarName: string,\n): IParserDefinitionError[] {\n const duplicateErrors: IParserDefinitionError[] = flatMap(\n topLevels,\n (currTopLevel) =>\n validateDuplicateProductions(currTopLevel, errMsgProvider),\n );\n\n const termsNamespaceConflictErrors = checkTerminalAndNoneTerminalsNameSpace(\n topLevels,\n tokenTypes,\n errMsgProvider,\n );\n\n const tooManyAltsErrors = flatMap(topLevels, (curRule) =>\n validateTooManyAlts(curRule, errMsgProvider),\n );\n\n const duplicateRulesError = flatMap(topLevels, (curRule) =>\n validateRuleDoesNotAlreadyExist(\n curRule,\n topLevels,\n grammarName,\n errMsgProvider,\n ),\n );\n\n return duplicateErrors.concat(\n termsNamespaceConflictErrors,\n tooManyAltsErrors,\n duplicateRulesError,\n );\n}\n\nfunction validateDuplicateProductions(\n topLevelRule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserDuplicatesDefinitionError[] {\n const collectorVisitor = new OccurrenceValidationCollector();\n topLevelRule.accept(collectorVisitor);\n const allRuleProductions = collectorVisitor.allProductions;\n\n const productionGroups = groupBy(\n allRuleProductions,\n identifyProductionForDuplicates,\n );\n\n const duplicates: any = pickBy(productionGroups, (currGroup) => {\n return currGroup.length > 1;\n });\n\n const errors = map(values(duplicates), (currDuplicates: any) => {\n const firstProd: any = first(currDuplicates);\n const msg = errMsgProvider.buildDuplicateFoundError(\n topLevelRule,\n currDuplicates,\n );\n const dslName = getProductionDslName(firstProd);\n const defError: IParserDuplicatesDefinitionError = {\n message: msg,\n type: ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,\n ruleName: topLevelRule.name,\n dslName: dslName,\n occurrence: firstProd.idx,\n };\n\n const param = getExtraProductionArgument(firstProd);\n if (param) {\n defError.parameter = param;\n }\n\n return defError;\n });\n return errors;\n}\n\nexport function identifyProductionForDuplicates(\n prod: IProductionWithOccurrence,\n): string {\n return `${getProductionDslName(prod)}_#_${\n prod.idx\n }_#_${getExtraProductionArgument(prod)}`;\n}\n\nfunction getExtraProductionArgument(prod: IProductionWithOccurrence): string {\n if (prod instanceof Terminal) {\n return prod.terminalType.name;\n } else if (prod instanceof NonTerminal) {\n return prod.nonTerminalName;\n } else {\n return \"\";\n }\n}\n\nexport class OccurrenceValidationCollector extends GAstVisitor {\n public allProductions: IProductionWithOccurrence[] = [];\n\n public visitNonTerminal(subrule: NonTerminal): void {\n this.allProductions.push(subrule);\n }\n\n public visitOption(option: Option): void {\n this.allProductions.push(option);\n }\n\n public visitRepetitionWithSeparator(manySep: RepetitionWithSeparator): void {\n this.allProductions.push(manySep);\n }\n\n public visitRepetitionMandatory(atLeastOne: RepetitionMandatory): void {\n this.allProductions.push(atLeastOne);\n }\n\n public visitRepetitionMandatoryWithSeparator(\n atLeastOneSep: RepetitionMandatoryWithSeparator,\n ): void {\n this.allProductions.push(atLeastOneSep);\n }\n\n public visitRepetition(many: Repetition): void {\n this.allProductions.push(many);\n }\n\n public visitAlternation(or: Alternation): void {\n this.allProductions.push(or);\n }\n\n public visitTerminal(terminal: Terminal): void {\n this.allProductions.push(terminal);\n }\n}\n\nexport function validateRuleDoesNotAlreadyExist(\n rule: Rule,\n allRules: Rule[],\n className: string,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserDefinitionError[] {\n const errors = [];\n const occurrences = reduce(\n allRules,\n (result, curRule) => {\n if (curRule.name === rule.name) {\n return result + 1;\n }\n return result;\n },\n 0,\n );\n if (occurrences > 1) {\n const errMsg = errMsgProvider.buildDuplicateRuleNameError({\n topLevelRule: rule,\n grammarName: className,\n });\n errors.push({\n message: errMsg,\n type: ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n ruleName: rule.name,\n });\n }\n\n return errors;\n}\n\n// TODO: is there anyway to get only the rule names of rules inherited from the super grammars?\n// This is not part of the IGrammarErrorProvider because the validation cannot be performed on\n// The grammar structure, only at runtime.\nexport function validateRuleIsOverridden(\n ruleName: string,\n definedRulesNames: string[],\n className: string,\n): IParserDefinitionError[] {\n const errors = [];\n let errMsg;\n\n if (!includes(definedRulesNames, ruleName)) {\n errMsg =\n `Invalid rule override, rule: ->${ruleName}<- cannot be overridden in the grammar: ->${className}<-` +\n `as it is not defined in any of the super grammars `;\n errors.push({\n message: errMsg,\n type: ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,\n ruleName: ruleName,\n });\n }\n\n return errors;\n}\n\nexport function validateNoLeftRecursion(\n topRule: Rule,\n currRule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n path: Rule[] = [],\n): IParserDefinitionError[] {\n const errors: IParserDefinitionError[] = [];\n const nextNonTerminals = getFirstNoneTerminal(currRule.definition);\n if (isEmpty(nextNonTerminals)) {\n return [];\n } else {\n const ruleName = topRule.name;\n const foundLeftRecursion = includes(nextNonTerminals, topRule);\n if (foundLeftRecursion) {\n errors.push({\n message: errMsgProvider.buildLeftRecursionError({\n topLevelRule: topRule,\n leftRecursionPath: path,\n }),\n type: ParserDefinitionErrorType.LEFT_RECURSION,\n ruleName: ruleName,\n });\n }\n\n // we are only looking for cyclic paths leading back to the specific topRule\n // other cyclic paths are ignored, we still need this difference to avoid infinite loops...\n const validNextSteps = difference(nextNonTerminals, path.concat([topRule]));\n const errorsFromNextSteps = flatMap(validNextSteps, (currRefRule) => {\n const newPath = clone(path);\n newPath.push(currRefRule);\n return validateNoLeftRecursion(\n topRule,\n currRefRule,\n errMsgProvider,\n newPath,\n );\n });\n\n return errors.concat(errorsFromNextSteps);\n }\n}\n\nexport function getFirstNoneTerminal(definition: IProduction[]): Rule[] {\n let result: Rule[] = [];\n if (isEmpty(definition)) {\n return result;\n }\n const firstProd = first(definition);\n\n /* istanbul ignore else */\n if (firstProd instanceof NonTerminal) {\n result.push(firstProd.referencedRule);\n } else if (\n firstProd instanceof AlternativeGAST ||\n firstProd instanceof Option ||\n firstProd instanceof RepetitionMandatory ||\n firstProd instanceof RepetitionMandatoryWithSeparator ||\n firstProd instanceof RepetitionWithSeparator ||\n firstProd instanceof Repetition\n ) {\n result = result.concat(\n getFirstNoneTerminal(firstProd.definition),\n );\n } else if (firstProd instanceof Alternation) {\n // each sub definition in alternation is a FLAT\n result = flatten(\n map(firstProd.definition, (currSubDef) =>\n getFirstNoneTerminal((currSubDef).definition),\n ),\n );\n } else if (firstProd instanceof Terminal) {\n // nothing to see, move along\n } else {\n throw Error(\"non exhaustive match\");\n }\n\n const isFirstOptional = isOptionalProd(firstProd);\n const hasMore = definition.length > 1;\n if (isFirstOptional && hasMore) {\n const rest = drop(definition);\n return result.concat(getFirstNoneTerminal(rest));\n } else {\n return result;\n }\n}\n\nclass OrCollector extends GAstVisitor {\n public alternations: Alternation[] = [];\n\n public visitAlternation(node: Alternation): void {\n this.alternations.push(node);\n }\n}\n\nexport function validateEmptyOrAlternative(\n topLevelRule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserEmptyAlternativeDefinitionError[] {\n const orCollector = new OrCollector();\n topLevelRule.accept(orCollector);\n const ors = orCollector.alternations;\n\n const errors = flatMap(\n ors,\n (currOr) => {\n const exceptLast = dropRight(currOr.definition);\n return flatMap(exceptLast, (currAlternative, currAltIdx) => {\n const possibleFirstInAlt = nextPossibleTokensAfter(\n [currAlternative],\n [],\n tokenStructuredMatcher,\n 1,\n );\n if (isEmpty(possibleFirstInAlt)) {\n return [\n {\n message: errMsgProvider.buildEmptyAlternationError({\n topLevelRule: topLevelRule,\n alternation: currOr,\n emptyChoiceIdx: currAltIdx,\n }),\n type: ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,\n ruleName: topLevelRule.name,\n occurrence: currOr.idx,\n alternative: currAltIdx + 1,\n },\n ];\n } else {\n return [];\n }\n });\n },\n );\n\n return errors;\n}\n\nexport function validateAmbiguousAlternationAlternatives(\n topLevelRule: Rule,\n globalMaxLookahead: number,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserAmbiguousAlternativesDefinitionError[] {\n const orCollector = new OrCollector();\n topLevelRule.accept(orCollector);\n let ors = orCollector.alternations;\n\n // New Handling of ignoring ambiguities\n // - https://github.com/chevrotain/chevrotain/issues/869\n ors = reject(ors, (currOr) => currOr.ignoreAmbiguities === true);\n\n const errors = flatMap(ors, (currOr: Alternation) => {\n const currOccurrence = currOr.idx;\n const actualMaxLookahead = currOr.maxLookahead || globalMaxLookahead;\n const alternatives = getLookaheadPathsForOr(\n currOccurrence,\n topLevelRule,\n actualMaxLookahead,\n currOr,\n );\n const altsAmbiguityErrors = checkAlternativesAmbiguities(\n alternatives,\n currOr,\n topLevelRule,\n errMsgProvider,\n );\n const altsPrefixAmbiguityErrors = checkPrefixAlternativesAmbiguities(\n alternatives,\n currOr,\n topLevelRule,\n errMsgProvider,\n );\n\n return altsAmbiguityErrors.concat(altsPrefixAmbiguityErrors);\n });\n\n return errors;\n}\n\nexport class RepetitionCollector extends GAstVisitor {\n public allProductions: (IProductionWithOccurrence & {\n maxLookahead?: number;\n })[] = [];\n\n public visitRepetitionWithSeparator(manySep: RepetitionWithSeparator): void {\n this.allProductions.push(manySep);\n }\n\n public visitRepetitionMandatory(atLeastOne: RepetitionMandatory): void {\n this.allProductions.push(atLeastOne);\n }\n\n public visitRepetitionMandatoryWithSeparator(\n atLeastOneSep: RepetitionMandatoryWithSeparator,\n ): void {\n this.allProductions.push(atLeastOneSep);\n }\n\n public visitRepetition(many: Repetition): void {\n this.allProductions.push(many);\n }\n}\n\nexport function validateTooManyAlts(\n topLevelRule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserDefinitionError[] {\n const orCollector = new OrCollector();\n topLevelRule.accept(orCollector);\n const ors = orCollector.alternations;\n\n const errors = flatMap(ors, (currOr) => {\n if (currOr.definition.length > 255) {\n return [\n {\n message: errMsgProvider.buildTooManyAlternativesError({\n topLevelRule: topLevelRule,\n alternation: currOr,\n }),\n type: ParserDefinitionErrorType.TOO_MANY_ALTS,\n ruleName: topLevelRule.name,\n occurrence: currOr.idx,\n },\n ];\n } else {\n return [];\n }\n });\n\n return errors;\n}\n\nexport function validateSomeNonEmptyLookaheadPath(\n topLevelRules: Rule[],\n maxLookahead: number,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserDefinitionError[] {\n const errors: IParserDefinitionError[] = [];\n forEach(topLevelRules, (currTopRule) => {\n const collectorVisitor = new RepetitionCollector();\n currTopRule.accept(collectorVisitor);\n const allRuleProductions = collectorVisitor.allProductions;\n forEach(allRuleProductions, (currProd) => {\n const prodType = getProdType(currProd);\n const actualMaxLookahead = currProd.maxLookahead || maxLookahead;\n const currOccurrence = currProd.idx;\n const paths = getLookaheadPathsForOptionalProd(\n currOccurrence,\n currTopRule,\n prodType,\n actualMaxLookahead,\n );\n const pathsInsideProduction = paths[0];\n if (isEmpty(flatten(pathsInsideProduction))) {\n const errMsg = errMsgProvider.buildEmptyRepetitionError({\n topLevelRule: currTopRule,\n repetition: currProd,\n });\n errors.push({\n message: errMsg,\n type: ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,\n ruleName: currTopRule.name,\n });\n }\n });\n });\n\n return errors;\n}\n\nexport interface IAmbiguityDescriptor {\n alts: number[];\n path: TokenType[];\n}\n\nfunction checkAlternativesAmbiguities(\n alternatives: Alternative[],\n alternation: Alternation,\n rule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserAmbiguousAlternativesDefinitionError[] {\n const foundAmbiguousPaths: Alternative = [];\n const identicalAmbiguities = reduce(\n alternatives,\n (result, currAlt, currAltIdx) => {\n // ignore (skip) ambiguities with this alternative\n if (alternation.definition[currAltIdx].ignoreAmbiguities === true) {\n return result;\n }\n\n forEach(currAlt, (currPath) => {\n const altsCurrPathAppearsIn = [currAltIdx];\n forEach(alternatives, (currOtherAlt, currOtherAltIdx) => {\n if (\n currAltIdx !== currOtherAltIdx &&\n containsPath(currOtherAlt, currPath) &&\n // ignore (skip) ambiguities with this \"other\" alternative\n alternation.definition[currOtherAltIdx].ignoreAmbiguities !== true\n ) {\n altsCurrPathAppearsIn.push(currOtherAltIdx);\n }\n });\n\n if (\n altsCurrPathAppearsIn.length > 1 &&\n !containsPath(foundAmbiguousPaths, currPath)\n ) {\n foundAmbiguousPaths.push(currPath);\n result.push({\n alts: altsCurrPathAppearsIn,\n path: currPath,\n });\n }\n });\n return result;\n },\n [] as { alts: number[]; path: TokenType[] }[],\n );\n\n const currErrors = map(identicalAmbiguities, (currAmbDescriptor) => {\n const ambgIndices = map(\n currAmbDescriptor.alts,\n (currAltIdx) => currAltIdx + 1,\n );\n\n const currMessage = errMsgProvider.buildAlternationAmbiguityError({\n topLevelRule: rule,\n alternation: alternation,\n ambiguityIndices: ambgIndices,\n prefixPath: currAmbDescriptor.path,\n });\n\n return {\n message: currMessage,\n type: ParserDefinitionErrorType.AMBIGUOUS_ALTS,\n ruleName: rule.name,\n occurrence: alternation.idx,\n alternatives: currAmbDescriptor.alts,\n };\n });\n\n return currErrors;\n}\n\nexport function checkPrefixAlternativesAmbiguities(\n alternatives: Alternative[],\n alternation: Alternation,\n rule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserAmbiguousAlternativesDefinitionError[] {\n // flatten\n const pathsAndIndices = reduce(\n alternatives,\n (result, currAlt, idx) => {\n const currPathsAndIdx = map(currAlt, (currPath) => {\n return { idx: idx, path: currPath };\n });\n return result.concat(currPathsAndIdx);\n },\n [] as { idx: number; path: TokenType[] }[],\n );\n\n const errors = compact(\n flatMap(pathsAndIndices, (currPathAndIdx) => {\n const alternativeGast = alternation.definition[currPathAndIdx.idx];\n // ignore (skip) ambiguities with this alternative\n if (alternativeGast.ignoreAmbiguities === true) {\n return [];\n }\n const targetIdx = currPathAndIdx.idx;\n const targetPath = currPathAndIdx.path;\n\n const prefixAmbiguitiesPathsAndIndices = filter(\n pathsAndIndices,\n (searchPathAndIdx) => {\n // prefix ambiguity can only be created from lower idx (higher priority) path\n return (\n // ignore (skip) ambiguities with this \"other\" alternative\n alternation.definition[searchPathAndIdx.idx].ignoreAmbiguities !==\n true &&\n searchPathAndIdx.idx < targetIdx &&\n // checking for strict prefix because identical lookaheads\n // will be be detected using a different validation.\n isStrictPrefixOfPath(searchPathAndIdx.path, targetPath)\n );\n },\n );\n\n const currPathPrefixErrors = map(\n prefixAmbiguitiesPathsAndIndices,\n (currAmbPathAndIdx): IParserAmbiguousAlternativesDefinitionError => {\n const ambgIndices = [currAmbPathAndIdx.idx + 1, targetIdx + 1];\n const occurrence = alternation.idx === 0 ? \"\" : alternation.idx;\n\n const message = errMsgProvider.buildAlternationPrefixAmbiguityError({\n topLevelRule: rule,\n alternation: alternation,\n ambiguityIndices: ambgIndices,\n prefixPath: currAmbPathAndIdx.path,\n });\n return {\n message: message,\n type: ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS,\n ruleName: rule.name,\n occurrence: occurrence,\n alternatives: ambgIndices,\n };\n },\n );\n\n return currPathPrefixErrors;\n }),\n );\n\n return errors;\n}\n\nfunction checkTerminalAndNoneTerminalsNameSpace(\n topLevels: Rule[],\n tokenTypes: TokenType[],\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserDefinitionError[] {\n const errors: IParserDefinitionError[] = [];\n\n const tokenNames = map(tokenTypes, (currToken) => currToken.name);\n\n forEach(topLevels, (currRule) => {\n const currRuleName = currRule.name;\n if (includes(tokenNames, currRuleName)) {\n const errMsg = errMsgProvider.buildNamespaceConflictError(currRule);\n\n errors.push({\n message: errMsg,\n type: ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,\n ruleName: currRuleName,\n });\n }\n });\n\n return errors;\n}\n", "import { Rule } from \"@chevrotain/gast\";\nimport { defaults, forEach } from \"lodash-es\";\nimport { resolveGrammar as orgResolveGrammar } from \"../resolver.js\";\nimport { validateGrammar as orgValidateGrammar } from \"../checks.js\";\nimport {\n defaultGrammarResolverErrorProvider,\n defaultGrammarValidatorErrorProvider,\n} from \"../../errors_public.js\";\nimport { TokenType } from \"@chevrotain/types\";\nimport {\n IGrammarResolverErrorMessageProvider,\n IGrammarValidatorErrorMessageProvider,\n IParserDefinitionError,\n} from \"../types.js\";\n\ntype ResolveGrammarOpts = {\n rules: Rule[];\n errMsgProvider?: IGrammarResolverErrorMessageProvider;\n};\nexport function resolveGrammar(\n options: ResolveGrammarOpts,\n): IParserDefinitionError[] {\n const actualOptions: Required = defaults(options, {\n errMsgProvider: defaultGrammarResolverErrorProvider,\n });\n\n const topRulesTable: { [ruleName: string]: Rule } = {};\n forEach(options.rules, (rule) => {\n topRulesTable[rule.name] = rule;\n });\n return orgResolveGrammar(topRulesTable, actualOptions.errMsgProvider);\n}\n\nexport function validateGrammar(options: {\n rules: Rule[];\n tokenTypes: TokenType[];\n grammarName: string;\n errMsgProvider: IGrammarValidatorErrorMessageProvider;\n}): IParserDefinitionError[] {\n options = defaults(options, {\n errMsgProvider: defaultGrammarValidatorErrorProvider,\n });\n\n return orgValidateGrammar(\n options.rules,\n options.tokenTypes,\n options.errMsgProvider,\n options.grammarName,\n );\n}\n", "import { includes } from \"lodash-es\";\nimport {\n IRecognitionException,\n IRecognizerContext,\n IToken,\n} from \"@chevrotain/types\";\n\nconst MISMATCHED_TOKEN_EXCEPTION = \"MismatchedTokenException\";\nconst NO_VIABLE_ALT_EXCEPTION = \"NoViableAltException\";\nconst EARLY_EXIT_EXCEPTION = \"EarlyExitException\";\nconst NOT_ALL_INPUT_PARSED_EXCEPTION = \"NotAllInputParsedException\";\n\nconst RECOGNITION_EXCEPTION_NAMES = [\n MISMATCHED_TOKEN_EXCEPTION,\n NO_VIABLE_ALT_EXCEPTION,\n EARLY_EXIT_EXCEPTION,\n NOT_ALL_INPUT_PARSED_EXCEPTION,\n];\n\nObject.freeze(RECOGNITION_EXCEPTION_NAMES);\n\n// hacks to bypass no support for custom Errors in javascript/typescript\nexport function isRecognitionException(error: Error) {\n // can't do instanceof on hacked custom js exceptions\n return includes(RECOGNITION_EXCEPTION_NAMES, error.name);\n}\n\nabstract class RecognitionException\n extends Error\n implements IRecognitionException\n{\n context: IRecognizerContext;\n resyncedTokens: IToken[] = [];\n\n protected constructor(\n message: string,\n public token: IToken,\n ) {\n super(message);\n\n // fix prototype chain when typescript target is ES5\n Object.setPrototypeOf(this, new.target.prototype);\n\n /* istanbul ignore next - V8 workaround to remove constructor from stacktrace when typescript target is ES5 */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport class MismatchedTokenException extends RecognitionException {\n constructor(\n message: string,\n token: IToken,\n public previousToken: IToken,\n ) {\n super(message, token);\n this.name = MISMATCHED_TOKEN_EXCEPTION;\n }\n}\n\nexport class NoViableAltException extends RecognitionException {\n constructor(\n message: string,\n token: IToken,\n public previousToken: IToken,\n ) {\n super(message, token);\n this.name = NO_VIABLE_ALT_EXCEPTION;\n }\n}\n\nexport class NotAllInputParsedException extends RecognitionException {\n constructor(message: string, token: IToken) {\n super(message, token);\n this.name = NOT_ALL_INPUT_PARSED_EXCEPTION;\n }\n}\n\nexport class EarlyExitException extends RecognitionException {\n constructor(\n message: string,\n token: IToken,\n public previousToken: IToken,\n ) {\n super(message, token);\n this.name = EARLY_EXIT_EXCEPTION;\n }\n}\n", "import {\n createTokenInstance,\n EOF,\n tokenMatcher,\n} from \"../../../scan/tokens_public.js\";\nimport {\n AbstractNextTerminalAfterProductionWalker,\n IFirstAfterRepetition,\n} from \"../../grammar/interpreter.js\";\nimport {\n clone,\n dropRight,\n find,\n flatten,\n has,\n includes,\n isEmpty,\n map,\n} from \"lodash-es\";\nimport {\n IParserConfig,\n IToken,\n ITokenGrammarPath,\n TokenType,\n} from \"@chevrotain/types\";\nimport { MismatchedTokenException } from \"../../exceptions_public.js\";\nimport { IN } from \"../../constants.js\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser.js\";\n\nexport const EOF_FOLLOW_KEY: any = {};\n\nexport interface IFollowKey {\n ruleName: string;\n idxInCallingRule: number;\n inRule: string;\n}\n\nexport const IN_RULE_RECOVERY_EXCEPTION = \"InRuleRecoveryException\";\n\nexport class InRuleRecoveryException extends Error {\n constructor(message: string) {\n super(message);\n this.name = IN_RULE_RECOVERY_EXCEPTION;\n }\n}\n\n/**\n * This trait is responsible for the error recovery and fault tolerant logic\n */\nexport class Recoverable {\n recoveryEnabled: boolean;\n firstAfterRepMap: Record;\n resyncFollows: Record;\n\n initRecoverable(config: IParserConfig) {\n this.firstAfterRepMap = {};\n this.resyncFollows = {};\n\n this.recoveryEnabled = has(config, \"recoveryEnabled\")\n ? (config.recoveryEnabled as boolean) // assumes end user provides the correct config value/type\n : DEFAULT_PARSER_CONFIG.recoveryEnabled;\n\n // performance optimization, NOOP will be inlined which\n // effectively means that this optional feature does not exist\n // when not used.\n if (this.recoveryEnabled) {\n this.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n }\n }\n\n public getTokenToInsert(tokType: TokenType): IToken {\n const tokToInsert = createTokenInstance(\n tokType,\n \"\",\n NaN,\n NaN,\n NaN,\n NaN,\n NaN,\n NaN,\n );\n tokToInsert.isInsertedInRecovery = true;\n return tokToInsert;\n }\n\n public canTokenTypeBeInsertedInRecovery(tokType: TokenType): boolean {\n return true;\n }\n\n public canTokenTypeBeDeletedInRecovery(tokType: TokenType): boolean {\n return true;\n }\n\n tryInRepetitionRecovery(\n this: MixedInParser,\n grammarRule: Function,\n grammarRuleArgs: any[],\n lookAheadFunc: () => boolean,\n expectedTokType: TokenType,\n ): void {\n // TODO: can the resyncTokenType be cached?\n const reSyncTokType = this.findReSyncTokenType();\n const savedLexerState = this.exportLexerState();\n const resyncedTokens: IToken[] = [];\n let passedResyncPoint = false;\n\n const nextTokenWithoutResync = this.LA(1);\n let currToken = this.LA(1);\n\n const generateErrorMessage = () => {\n const previousToken = this.LA(0);\n // we are preemptively re-syncing before an error has been detected, therefor we must reproduce\n // the error that would have been thrown\n const msg = this.errorMessageProvider.buildMismatchTokenMessage({\n expected: expectedTokType,\n actual: nextTokenWithoutResync,\n previous: previousToken,\n ruleName: this.getCurrRuleFullName(),\n });\n const error = new MismatchedTokenException(\n msg,\n nextTokenWithoutResync,\n this.LA(0),\n );\n // the first token here will be the original cause of the error, this is not part of the resyncedTokens property.\n error.resyncedTokens = dropRight(resyncedTokens);\n this.SAVE_ERROR(error);\n };\n\n while (!passedResyncPoint) {\n // re-synced to a point where we can safely exit the repetition/\n if (this.tokenMatcher(currToken, expectedTokType)) {\n generateErrorMessage();\n return; // must return here to avoid reverting the inputIdx\n } else if (lookAheadFunc.call(this)) {\n // we skipped enough tokens so we can resync right back into another iteration of the repetition grammar rule\n generateErrorMessage();\n // recursive invocation in other to support multiple re-syncs in the same top level repetition grammar rule\n grammarRule.apply(this, grammarRuleArgs);\n return; // must return here to avoid reverting the inputIdx\n } else if (this.tokenMatcher(currToken, reSyncTokType)) {\n passedResyncPoint = true;\n } else {\n currToken = this.SKIP_TOKEN();\n this.addToResyncTokens(currToken, resyncedTokens);\n }\n }\n\n // we were unable to find a CLOSER point to resync inside the Repetition, reset the state.\n // The parsing exception we were trying to prevent will happen in the NEXT parsing step. it may be handled by\n // \"between rules\" resync recovery later in the flow.\n this.importLexerState(savedLexerState);\n }\n\n shouldInRepetitionRecoveryBeTried(\n this: MixedInParser,\n expectTokAfterLastMatch: TokenType,\n nextTokIdx: number,\n notStuck: boolean | undefined,\n ): boolean {\n // Edge case of arriving from a MANY repetition which is stuck\n // Attempting recovery in this case could cause an infinite loop\n if (notStuck === false) {\n return false;\n }\n\n // no need to recover, next token is what we expect...\n if (this.tokenMatcher(this.LA(1), expectTokAfterLastMatch)) {\n return false;\n }\n\n // error recovery is disabled during backtracking as it can make the parser ignore a valid grammar path\n // and prefer some backtracking path that includes recovered errors.\n if (this.isBackTracking()) {\n return false;\n }\n\n // if we can perform inRule recovery (single token insertion or deletion) we always prefer that recovery algorithm\n // because if it works, it makes the least amount of changes to the input stream (greedy algorithm)\n //noinspection RedundantIfStatementJS\n if (\n this.canPerformInRuleRecovery(\n expectTokAfterLastMatch,\n this.getFollowsForInRuleRecovery(expectTokAfterLastMatch, nextTokIdx),\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n // Error Recovery functionality\n getFollowsForInRuleRecovery(\n this: MixedInParser,\n tokType: TokenType,\n tokIdxInRule: number,\n ): TokenType[] {\n const grammarPath = this.getCurrentGrammarPath(tokType, tokIdxInRule);\n const follows = this.getNextPossibleTokenTypes(grammarPath);\n return follows;\n }\n\n tryInRuleRecovery(\n this: MixedInParser,\n expectedTokType: TokenType,\n follows: TokenType[],\n ): IToken {\n if (this.canRecoverWithSingleTokenInsertion(expectedTokType, follows)) {\n const tokToInsert = this.getTokenToInsert(expectedTokType);\n return tokToInsert;\n }\n\n if (this.canRecoverWithSingleTokenDeletion(expectedTokType)) {\n const nextTok = this.SKIP_TOKEN();\n this.consumeToken();\n return nextTok;\n }\n\n throw new InRuleRecoveryException(\"sad sad panda\");\n }\n\n canPerformInRuleRecovery(\n this: MixedInParser,\n expectedToken: TokenType,\n follows: TokenType[],\n ): boolean {\n return (\n this.canRecoverWithSingleTokenInsertion(expectedToken, follows) ||\n this.canRecoverWithSingleTokenDeletion(expectedToken)\n );\n }\n\n canRecoverWithSingleTokenInsertion(\n this: MixedInParser,\n expectedTokType: TokenType,\n follows: TokenType[],\n ): boolean {\n if (!this.canTokenTypeBeInsertedInRecovery(expectedTokType)) {\n return false;\n }\n\n // must know the possible following tokens to perform single token insertion\n if (isEmpty(follows)) {\n return false;\n }\n\n const mismatchedTok = this.LA(1);\n const isMisMatchedTokInFollows =\n find(follows, (possibleFollowsTokType: TokenType) => {\n return this.tokenMatcher(mismatchedTok, possibleFollowsTokType);\n }) !== undefined;\n\n return isMisMatchedTokInFollows;\n }\n\n canRecoverWithSingleTokenDeletion(\n this: MixedInParser,\n expectedTokType: TokenType,\n ): boolean {\n if (!this.canTokenTypeBeDeletedInRecovery(expectedTokType)) {\n return false;\n }\n\n const isNextTokenWhatIsExpected = this.tokenMatcher(\n this.LA(2),\n expectedTokType,\n );\n return isNextTokenWhatIsExpected;\n }\n\n isInCurrentRuleReSyncSet(\n this: MixedInParser,\n tokenTypeIdx: TokenType,\n ): boolean {\n const followKey = this.getCurrFollowKey();\n const currentRuleReSyncSet = this.getFollowSetFromFollowKey(followKey);\n return includes(currentRuleReSyncSet, tokenTypeIdx);\n }\n\n findReSyncTokenType(this: MixedInParser): TokenType {\n const allPossibleReSyncTokTypes = this.flattenFollowSet();\n // this loop will always terminate as EOF is always in the follow stack and also always (virtually) in the input\n let nextToken = this.LA(1);\n let k = 2;\n while (true) {\n const foundMatch = find(allPossibleReSyncTokTypes, (resyncTokType) => {\n const canMatch = tokenMatcher(nextToken, resyncTokType);\n return canMatch;\n });\n if (foundMatch !== undefined) {\n return foundMatch;\n }\n nextToken = this.LA(k);\n k++;\n }\n }\n\n getCurrFollowKey(this: MixedInParser): IFollowKey {\n // the length is at least one as we always add the ruleName to the stack before invoking the rule.\n if (this.RULE_STACK.length === 1) {\n return EOF_FOLLOW_KEY;\n }\n const currRuleShortName = this.getLastExplicitRuleShortName();\n const currRuleIdx = this.getLastExplicitRuleOccurrenceIndex();\n const prevRuleShortName = this.getPreviousExplicitRuleShortName();\n\n return {\n ruleName: this.shortRuleNameToFullName(currRuleShortName),\n idxInCallingRule: currRuleIdx,\n inRule: this.shortRuleNameToFullName(prevRuleShortName),\n };\n }\n\n buildFullFollowKeyStack(this: MixedInParser): IFollowKey[] {\n const explicitRuleStack = this.RULE_STACK;\n const explicitOccurrenceStack = this.RULE_OCCURRENCE_STACK;\n\n return map(explicitRuleStack, (ruleName, idx) => {\n if (idx === 0) {\n return EOF_FOLLOW_KEY;\n }\n return {\n ruleName: this.shortRuleNameToFullName(ruleName),\n idxInCallingRule: explicitOccurrenceStack[idx],\n inRule: this.shortRuleNameToFullName(explicitRuleStack[idx - 1]),\n };\n });\n }\n\n flattenFollowSet(this: MixedInParser): TokenType[] {\n const followStack = map(this.buildFullFollowKeyStack(), (currKey) => {\n return this.getFollowSetFromFollowKey(currKey);\n });\n return flatten(followStack);\n }\n\n getFollowSetFromFollowKey(\n this: MixedInParser,\n followKey: IFollowKey,\n ): TokenType[] {\n if (followKey === EOF_FOLLOW_KEY) {\n return [EOF];\n }\n\n const followName =\n followKey.ruleName + followKey.idxInCallingRule + IN + followKey.inRule;\n\n return this.resyncFollows[followName];\n }\n\n // It does not make any sense to include a virtual EOF token in the list of resynced tokens\n // as EOF does not really exist and thus does not contain any useful information (line/column numbers)\n addToResyncTokens(\n this: MixedInParser,\n token: IToken,\n resyncTokens: IToken[],\n ): IToken[] {\n if (!this.tokenMatcher(token, EOF)) {\n resyncTokens.push(token);\n }\n return resyncTokens;\n }\n\n reSyncTo(this: MixedInParser, tokType: TokenType): IToken[] {\n const resyncedTokens: IToken[] = [];\n let nextTok = this.LA(1);\n while (this.tokenMatcher(nextTok, tokType) === false) {\n nextTok = this.SKIP_TOKEN();\n this.addToResyncTokens(nextTok, resyncedTokens);\n }\n // the last token is not part of the error.\n return dropRight(resyncedTokens);\n }\n\n attemptInRepetitionRecovery(\n this: MixedInParser,\n prodFunc: Function,\n args: any[],\n lookaheadFunc: () => boolean,\n dslMethodIdx: number,\n prodOccurrence: number,\n nextToksWalker: typeof AbstractNextTerminalAfterProductionWalker,\n notStuck?: boolean,\n ): void {\n // by default this is a NO-OP\n // The actual implementation is with the function(not method) below\n }\n\n getCurrentGrammarPath(\n this: MixedInParser,\n tokType: TokenType,\n tokIdxInRule: number,\n ): ITokenGrammarPath {\n const pathRuleStack: string[] = this.getHumanReadableRuleStack();\n const pathOccurrenceStack: number[] = clone(this.RULE_OCCURRENCE_STACK);\n const grammarPath: any = {\n ruleStack: pathRuleStack,\n occurrenceStack: pathOccurrenceStack,\n lastTok: tokType,\n lastTokOccurrence: tokIdxInRule,\n };\n\n return grammarPath;\n }\n getHumanReadableRuleStack(this: MixedInParser): string[] {\n return map(this.RULE_STACK, (currShortName) =>\n this.shortRuleNameToFullName(currShortName),\n );\n }\n}\n\nexport function attemptInRepetitionRecovery(\n this: MixedInParser,\n prodFunc: Function,\n args: any[],\n lookaheadFunc: () => boolean,\n dslMethodIdx: number,\n prodOccurrence: number,\n nextToksWalker: typeof AbstractNextTerminalAfterProductionWalker,\n notStuck?: boolean,\n): void {\n const key = this.getKeyForAutomaticLookahead(dslMethodIdx, prodOccurrence);\n let firstAfterRepInfo = this.firstAfterRepMap[key];\n if (firstAfterRepInfo === undefined) {\n const currRuleName = this.getCurrRuleFullName();\n const ruleGrammar = this.getGAstProductions()[currRuleName];\n const walker: AbstractNextTerminalAfterProductionWalker =\n new nextToksWalker(ruleGrammar, prodOccurrence);\n firstAfterRepInfo = walker.startWalking();\n this.firstAfterRepMap[key] = firstAfterRepInfo;\n }\n\n let expectTokAfterLastMatch = firstAfterRepInfo.token;\n let nextTokIdx = firstAfterRepInfo.occurrence;\n const isEndOfRule = firstAfterRepInfo.isEndOfRule;\n\n // special edge case of a TOP most repetition after which the input should END.\n // this will force an attempt for inRule recovery in that scenario.\n if (\n this.RULE_STACK.length === 1 &&\n isEndOfRule &&\n expectTokAfterLastMatch === undefined\n ) {\n expectTokAfterLastMatch = EOF;\n nextTokIdx = 1;\n }\n\n // We don't have anything to re-sync to...\n // this condition was extracted from `shouldInRepetitionRecoveryBeTried` to act as a type-guard\n if (expectTokAfterLastMatch === undefined || nextTokIdx === undefined) {\n return;\n }\n\n if (\n this.shouldInRepetitionRecoveryBeTried(\n expectTokAfterLastMatch,\n nextTokIdx,\n notStuck,\n )\n ) {\n // TODO: performance optimization: instead of passing the original args here, we modify\n // the args param (or create a new one) and make sure the lookahead func is explicitly provided\n // to avoid searching the cache for it once more.\n this.tryInRepetitionRecovery(\n prodFunc,\n args,\n lookaheadFunc,\n expectTokAfterLastMatch,\n );\n }\n}\n", "// Lookahead keys are 32Bit integers in the form\n// TTTTTTTT-ZZZZZZZZZZZZ-YYYY-XXXXXXXX\n// XXXX -> Occurrence Index bitmap.\n// YYYY -> DSL Method Type bitmap.\n// ZZZZZZZZZZZZZZZ -> Rule short Index bitmap.\n// TTTTTTTTT -> alternation alternative index bitmap\n\nexport const BITS_FOR_METHOD_TYPE = 4;\nexport const BITS_FOR_OCCURRENCE_IDX = 8;\nexport const BITS_FOR_RULE_IDX = 12;\n// TODO: validation, this means that there may at most 2^8 --> 256 alternatives for an alternation.\nexport const BITS_FOR_ALT_IDX = 8;\n\n// short string used as part of mapping keys.\n// being short improves the performance when composing KEYS for maps out of these\n// The 5 - 8 bits (16 possible values, are reserved for the DSL method indices)\nexport const OR_IDX = 1 << BITS_FOR_OCCURRENCE_IDX;\nexport const OPTION_IDX = 2 << BITS_FOR_OCCURRENCE_IDX;\nexport const MANY_IDX = 3 << BITS_FOR_OCCURRENCE_IDX;\nexport const AT_LEAST_ONE_IDX = 4 << BITS_FOR_OCCURRENCE_IDX;\nexport const MANY_SEP_IDX = 5 << BITS_FOR_OCCURRENCE_IDX;\nexport const AT_LEAST_ONE_SEP_IDX = 6 << BITS_FOR_OCCURRENCE_IDX;\n\n// this actually returns a number, but it is always used as a string (object prop key)\nexport function getKeyForAutomaticLookahead(\n ruleIdx: number,\n dslMethodIdx: number,\n occurrence: number,\n): number {\n return occurrence | dslMethodIdx | ruleIdx;\n}\n\nconst BITS_START_FOR_ALT_IDX = 32 - BITS_FOR_ALT_IDX;\n", "import {\n ILookaheadStrategy,\n ILookaheadValidationError,\n IOrAlt,\n OptionalProductionType,\n Rule,\n TokenType,\n} from \"@chevrotain/types\";\nimport { flatMap, isEmpty } from \"lodash-es\";\nimport { defaultGrammarValidatorErrorProvider } from \"../errors_public.js\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser/parser.js\";\nimport {\n validateAmbiguousAlternationAlternatives,\n validateEmptyOrAlternative,\n validateNoLeftRecursion,\n validateSomeNonEmptyLookaheadPath,\n} from \"./checks.js\";\nimport {\n buildAlternativesLookAheadFunc,\n buildLookaheadFuncForOptionalProd,\n buildLookaheadFuncForOr,\n buildSingleAlternativeLookaheadFunction,\n getProdType,\n} from \"./lookahead.js\";\nimport { IParserDefinitionError } from \"./types.js\";\n\nexport class LLkLookaheadStrategy implements ILookaheadStrategy {\n readonly maxLookahead: number;\n\n constructor(options?: { maxLookahead?: number }) {\n this.maxLookahead =\n options?.maxLookahead ?? DEFAULT_PARSER_CONFIG.maxLookahead;\n }\n\n validate(options: {\n rules: Rule[];\n tokenTypes: TokenType[];\n grammarName: string;\n }): ILookaheadValidationError[] {\n const leftRecursionErrors = this.validateNoLeftRecursion(options.rules);\n\n if (isEmpty(leftRecursionErrors)) {\n const emptyAltErrors = this.validateEmptyOrAlternatives(options.rules);\n const ambiguousAltsErrors = this.validateAmbiguousAlternationAlternatives(\n options.rules,\n this.maxLookahead,\n );\n const emptyRepetitionErrors = this.validateSomeNonEmptyLookaheadPath(\n options.rules,\n this.maxLookahead,\n );\n const allErrors = [\n ...leftRecursionErrors,\n ...emptyAltErrors,\n ...ambiguousAltsErrors,\n ...emptyRepetitionErrors,\n ];\n return allErrors;\n }\n return leftRecursionErrors;\n }\n\n validateNoLeftRecursion(rules: Rule[]): IParserDefinitionError[] {\n return flatMap(rules, (currTopRule) =>\n validateNoLeftRecursion(\n currTopRule,\n currTopRule,\n defaultGrammarValidatorErrorProvider,\n ),\n );\n }\n\n validateEmptyOrAlternatives(rules: Rule[]): IParserDefinitionError[] {\n return flatMap(rules, (currTopRule) =>\n validateEmptyOrAlternative(\n currTopRule,\n defaultGrammarValidatorErrorProvider,\n ),\n );\n }\n\n validateAmbiguousAlternationAlternatives(\n rules: Rule[],\n maxLookahead: number,\n ): IParserDefinitionError[] {\n return flatMap(rules, (currTopRule) =>\n validateAmbiguousAlternationAlternatives(\n currTopRule,\n maxLookahead,\n defaultGrammarValidatorErrorProvider,\n ),\n );\n }\n\n validateSomeNonEmptyLookaheadPath(\n rules: Rule[],\n maxLookahead: number,\n ): IParserDefinitionError[] {\n return validateSomeNonEmptyLookaheadPath(\n rules,\n maxLookahead,\n defaultGrammarValidatorErrorProvider,\n );\n }\n\n buildLookaheadForAlternation(options: {\n prodOccurrence: number;\n rule: Rule;\n maxLookahead: number;\n hasPredicates: boolean;\n dynamicTokensEnabled: boolean;\n }): (orAlts?: IOrAlt[] | undefined) => number | undefined {\n return buildLookaheadFuncForOr(\n options.prodOccurrence,\n options.rule,\n options.maxLookahead,\n options.hasPredicates,\n options.dynamicTokensEnabled,\n buildAlternativesLookAheadFunc,\n );\n }\n\n buildLookaheadForOptional(options: {\n prodOccurrence: number;\n prodType: OptionalProductionType;\n rule: Rule;\n maxLookahead: number;\n dynamicTokensEnabled: boolean;\n }): () => boolean {\n return buildLookaheadFuncForOptionalProd(\n options.prodOccurrence,\n options.rule,\n options.maxLookahead,\n options.dynamicTokensEnabled,\n getProdType(options.prodType),\n buildSingleAlternativeLookaheadFunction,\n );\n }\n}\n", "import { forEach, has } from \"lodash-es\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser.js\";\nimport {\n ILookaheadStrategy,\n IParserConfig,\n OptionalProductionType,\n} from \"@chevrotain/types\";\nimport {\n AT_LEAST_ONE_IDX,\n AT_LEAST_ONE_SEP_IDX,\n getKeyForAutomaticLookahead,\n MANY_IDX,\n MANY_SEP_IDX,\n OPTION_IDX,\n OR_IDX,\n} from \"../../grammar/keys.js\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport {\n Alternation,\n GAstVisitor,\n getProductionDslName,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Rule,\n} from \"@chevrotain/gast\";\nimport { LLkLookaheadStrategy } from \"../../grammar/llk_lookahead.js\";\n\n/**\n * Trait responsible for the lookahead related utilities and optimizations.\n */\nexport class LooksAhead {\n maxLookahead: number;\n lookAheadFuncsCache: any;\n dynamicTokensEnabled: boolean;\n lookaheadStrategy: ILookaheadStrategy;\n\n initLooksAhead(config: IParserConfig) {\n this.dynamicTokensEnabled = has(config, \"dynamicTokensEnabled\")\n ? (config.dynamicTokensEnabled as boolean) // assumes end user provides the correct config value/type\n : DEFAULT_PARSER_CONFIG.dynamicTokensEnabled;\n\n this.maxLookahead = has(config, \"maxLookahead\")\n ? (config.maxLookahead as number) // assumes end user provides the correct config value/type\n : DEFAULT_PARSER_CONFIG.maxLookahead;\n\n this.lookaheadStrategy = has(config, \"lookaheadStrategy\")\n ? (config.lookaheadStrategy as ILookaheadStrategy) // assumes end user provides the correct config value/type\n : new LLkLookaheadStrategy({ maxLookahead: this.maxLookahead });\n\n this.lookAheadFuncsCache = new Map();\n }\n\n preComputeLookaheadFunctions(this: MixedInParser, rules: Rule[]): void {\n forEach(rules, (currRule) => {\n this.TRACE_INIT(`${currRule.name} Rule Lookahead`, () => {\n const {\n alternation,\n repetition,\n option,\n repetitionMandatory,\n repetitionMandatoryWithSeparator,\n repetitionWithSeparator,\n } = collectMethods(currRule);\n\n forEach(alternation, (currProd) => {\n const prodIdx = currProd.idx === 0 ? \"\" : currProd.idx;\n this.TRACE_INIT(`${getProductionDslName(currProd)}${prodIdx}`, () => {\n const laFunc = this.lookaheadStrategy.buildLookaheadForAlternation({\n prodOccurrence: currProd.idx,\n rule: currRule,\n maxLookahead: currProd.maxLookahead || this.maxLookahead,\n hasPredicates: currProd.hasPredicates,\n dynamicTokensEnabled: this.dynamicTokensEnabled,\n });\n\n const key = getKeyForAutomaticLookahead(\n this.fullRuleNameToShort[currRule.name],\n OR_IDX,\n currProd.idx,\n );\n this.setLaFuncCache(key, laFunc);\n });\n });\n\n forEach(repetition, (currProd) => {\n this.computeLookaheadFunc(\n currRule,\n currProd.idx,\n MANY_IDX,\n \"Repetition\",\n currProd.maxLookahead,\n getProductionDslName(currProd),\n );\n });\n\n forEach(option, (currProd) => {\n this.computeLookaheadFunc(\n currRule,\n currProd.idx,\n OPTION_IDX,\n \"Option\",\n currProd.maxLookahead,\n getProductionDslName(currProd),\n );\n });\n\n forEach(repetitionMandatory, (currProd) => {\n this.computeLookaheadFunc(\n currRule,\n currProd.idx,\n AT_LEAST_ONE_IDX,\n \"RepetitionMandatory\",\n currProd.maxLookahead,\n getProductionDslName(currProd),\n );\n });\n\n forEach(repetitionMandatoryWithSeparator, (currProd) => {\n this.computeLookaheadFunc(\n currRule,\n currProd.idx,\n AT_LEAST_ONE_SEP_IDX,\n \"RepetitionMandatoryWithSeparator\",\n currProd.maxLookahead,\n getProductionDslName(currProd),\n );\n });\n\n forEach(repetitionWithSeparator, (currProd) => {\n this.computeLookaheadFunc(\n currRule,\n currProd.idx,\n MANY_SEP_IDX,\n \"RepetitionWithSeparator\",\n currProd.maxLookahead,\n getProductionDslName(currProd),\n );\n });\n });\n });\n }\n\n computeLookaheadFunc(\n this: MixedInParser,\n rule: Rule,\n prodOccurrence: number,\n prodKey: number,\n prodType: OptionalProductionType,\n prodMaxLookahead: number | undefined,\n dslMethodName: string,\n ): void {\n this.TRACE_INIT(\n `${dslMethodName}${prodOccurrence === 0 ? \"\" : prodOccurrence}`,\n () => {\n const laFunc = this.lookaheadStrategy.buildLookaheadForOptional({\n prodOccurrence,\n rule,\n maxLookahead: prodMaxLookahead || this.maxLookahead,\n dynamicTokensEnabled: this.dynamicTokensEnabled,\n prodType,\n });\n const key = getKeyForAutomaticLookahead(\n this.fullRuleNameToShort[rule.name],\n prodKey,\n prodOccurrence,\n );\n this.setLaFuncCache(key, laFunc);\n },\n );\n }\n\n // this actually returns a number, but it is always used as a string (object prop key)\n getKeyForAutomaticLookahead(\n this: MixedInParser,\n dslMethodIdx: number,\n occurrence: number,\n ): number {\n const currRuleShortName: any = this.getLastExplicitRuleShortName();\n return getKeyForAutomaticLookahead(\n currRuleShortName,\n dslMethodIdx,\n occurrence,\n );\n }\n\n getLaFuncFromCache(this: MixedInParser, key: number): Function {\n return this.lookAheadFuncsCache.get(key);\n }\n\n /* istanbul ignore next */\n setLaFuncCache(this: MixedInParser, key: number, value: Function): void {\n this.lookAheadFuncsCache.set(key, value);\n }\n}\n\nclass DslMethodsCollectorVisitor extends GAstVisitor {\n public dslMethods: {\n option: Option[];\n alternation: Alternation[];\n repetition: Repetition[];\n repetitionWithSeparator: RepetitionWithSeparator[];\n repetitionMandatory: RepetitionMandatory[];\n repetitionMandatoryWithSeparator: RepetitionMandatoryWithSeparator[];\n } = {\n option: [],\n alternation: [],\n repetition: [],\n repetitionWithSeparator: [],\n repetitionMandatory: [],\n repetitionMandatoryWithSeparator: [],\n };\n\n reset() {\n this.dslMethods = {\n option: [],\n alternation: [],\n repetition: [],\n repetitionWithSeparator: [],\n repetitionMandatory: [],\n repetitionMandatoryWithSeparator: [],\n };\n }\n\n public visitOption(option: Option): void {\n this.dslMethods.option.push(option);\n }\n\n public visitRepetitionWithSeparator(manySep: RepetitionWithSeparator): void {\n this.dslMethods.repetitionWithSeparator.push(manySep);\n }\n\n public visitRepetitionMandatory(atLeastOne: RepetitionMandatory): void {\n this.dslMethods.repetitionMandatory.push(atLeastOne);\n }\n\n public visitRepetitionMandatoryWithSeparator(\n atLeastOneSep: RepetitionMandatoryWithSeparator,\n ): void {\n this.dslMethods.repetitionMandatoryWithSeparator.push(atLeastOneSep);\n }\n\n public visitRepetition(many: Repetition): void {\n this.dslMethods.repetition.push(many);\n }\n\n public visitAlternation(or: Alternation): void {\n this.dslMethods.alternation.push(or);\n }\n}\n\nconst collectorVisitor = new DslMethodsCollectorVisitor();\nexport function collectMethods(rule: Rule): {\n option: Option[];\n alternation: Alternation[];\n repetition: Repetition[];\n repetitionWithSeparator: RepetitionWithSeparator[];\n repetitionMandatory: RepetitionMandatory[];\n repetitionMandatoryWithSeparator: RepetitionMandatoryWithSeparator[];\n} {\n collectorVisitor.reset();\n rule.accept(collectorVisitor);\n const dslMethods = collectorVisitor.dslMethods;\n // avoid uncleaned references\n collectorVisitor.reset();\n return dslMethods;\n}\n", "import { CstNode, CstNodeLocation, IToken } from \"@chevrotain/types\";\n\n/**\n * This nodeLocation tracking is not efficient and should only be used\n * when error recovery is enabled or the Token Vector contains virtual Tokens\n * (e.g, Python Indent/Outdent)\n * As it executes the calculation for every single terminal/nonTerminal\n * and does not rely on the fact the token vector is **sorted**\n */\nexport function setNodeLocationOnlyOffset(\n currNodeLocation: CstNodeLocation,\n newLocationInfo: Required>,\n): void {\n // First (valid) update for this cst node\n if (isNaN(currNodeLocation.startOffset) === true) {\n // assumption1: Token location information is either NaN or a valid number\n // assumption2: Token location information is fully valid if it exist\n // (both start/end offsets exist and are numbers).\n currNodeLocation.startOffset = newLocationInfo.startOffset;\n currNodeLocation.endOffset = newLocationInfo.endOffset;\n }\n // Once the startOffset has been updated with a valid number it should never receive\n // any farther updates as the Token vector is sorted.\n // We still have to check this this condition for every new possible location info\n // because with error recovery enabled we may encounter invalid tokens (NaN location props)\n else if (currNodeLocation.endOffset! < newLocationInfo.endOffset === true) {\n currNodeLocation.endOffset = newLocationInfo.endOffset;\n }\n}\n\n/**\n * This nodeLocation tracking is not efficient and should only be used\n * when error recovery is enabled or the Token Vector contains virtual Tokens\n * (e.g, Python Indent/Outdent)\n * As it executes the calculation for every single terminal/nonTerminal\n * and does not rely on the fact the token vector is **sorted**\n */\nexport function setNodeLocationFull(\n currNodeLocation: CstNodeLocation,\n newLocationInfo: CstNodeLocation,\n): void {\n // First (valid) update for this cst node\n if (isNaN(currNodeLocation.startOffset) === true) {\n // assumption1: Token location information is either NaN or a valid number\n // assumption2: Token location information is fully valid if it exist\n // (all start/end props exist and are numbers).\n currNodeLocation.startOffset = newLocationInfo.startOffset;\n currNodeLocation.startColumn = newLocationInfo.startColumn;\n currNodeLocation.startLine = newLocationInfo.startLine;\n currNodeLocation.endOffset = newLocationInfo.endOffset;\n currNodeLocation.endColumn = newLocationInfo.endColumn;\n currNodeLocation.endLine = newLocationInfo.endLine;\n }\n // Once the start props has been updated with a valid number it should never receive\n // any farther updates as the Token vector is sorted.\n // We still have to check this this condition for every new possible location info\n // because with error recovery enabled we may encounter invalid tokens (NaN location props)\n else if (currNodeLocation.endOffset! < newLocationInfo.endOffset! === true) {\n currNodeLocation.endOffset = newLocationInfo.endOffset;\n currNodeLocation.endColumn = newLocationInfo.endColumn;\n currNodeLocation.endLine = newLocationInfo.endLine;\n }\n}\n\nexport function addTerminalToCst(\n node: CstNode,\n token: IToken,\n tokenTypeName: string,\n): void {\n if (node.children[tokenTypeName] === undefined) {\n node.children[tokenTypeName] = [token];\n } else {\n node.children[tokenTypeName].push(token);\n }\n}\n\nexport function addNoneTerminalToCst(\n node: CstNode,\n ruleName: string,\n ruleResult: any,\n): void {\n if (node.children[ruleName] === undefined) {\n node.children[ruleName] = [ruleResult];\n } else {\n node.children[ruleName].push(ruleResult);\n }\n}\n", "const NAME = \"name\";\n\nexport function defineNameProp(obj: {}, nameValue: string): void {\n Object.defineProperty(obj, NAME, {\n enumerable: false,\n configurable: true,\n writable: false,\n value: nameValue,\n });\n}\n", "import {\n compact,\n filter,\n forEach,\n isArray,\n isEmpty,\n isFunction,\n isUndefined,\n keys,\n map,\n} from \"lodash-es\";\nimport { defineNameProp } from \"../../lang/lang_extensions.js\";\nimport { CstNode, ICstVisitor } from \"@chevrotain/types\";\n\nexport function defaultVisit(ctx: any, param: IN): void {\n const childrenNames = keys(ctx);\n const childrenNamesLength = childrenNames.length;\n for (let i = 0; i < childrenNamesLength; i++) {\n const currChildName = childrenNames[i];\n const currChildArray = ctx[currChildName];\n const currChildArrayLength = currChildArray.length;\n for (let j = 0; j < currChildArrayLength; j++) {\n const currChild: any = currChildArray[j];\n // distinction between Tokens Children and CstNode children\n if (currChild.tokenTypeIdx === undefined) {\n this[currChild.name](currChild.children, param);\n }\n }\n }\n // defaultVisit does not support generic out param\n}\n\nexport function createBaseSemanticVisitorConstructor(\n grammarName: string,\n ruleNames: string[],\n): {\n new (...args: any[]): ICstVisitor;\n} {\n const derivedConstructor: any = function () {};\n\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n defineNameProp(derivedConstructor, grammarName + \"BaseSemantics\");\n\n const semanticProto = {\n visit: function (cstNode: CstNode | CstNode[], param: any) {\n // enables writing more concise visitor methods when CstNode has only a single child\n if (isArray(cstNode)) {\n // A CST Node's children dictionary can never have empty arrays as values\n // If a key is defined there will be at least one element in the corresponding value array.\n cstNode = cstNode[0];\n }\n\n // enables passing optional CstNodes concisely.\n if (isUndefined(cstNode)) {\n return undefined;\n }\n\n return this[cstNode.name](cstNode.children, param);\n },\n\n validateVisitor: function () {\n const semanticDefinitionErrors = validateVisitor(this, ruleNames);\n if (!isEmpty(semanticDefinitionErrors)) {\n const errorMessages = map(\n semanticDefinitionErrors,\n (currDefError) => currDefError.msg,\n );\n throw Error(\n `Errors Detected in CST Visitor <${this.constructor.name}>:\\n\\t` +\n `${errorMessages.join(\"\\n\\n\").replace(/\\n/g, \"\\n\\t\")}`,\n );\n }\n },\n };\n\n derivedConstructor.prototype = semanticProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n\n derivedConstructor._RULE_NAMES = ruleNames;\n\n return derivedConstructor;\n}\n\nexport function createBaseVisitorConstructorWithDefaults(\n grammarName: string,\n ruleNames: string[],\n baseConstructor: Function,\n): {\n new (...args: any[]): ICstVisitor;\n} {\n const derivedConstructor: any = function () {};\n\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n defineNameProp(derivedConstructor, grammarName + \"BaseSemanticsWithDefaults\");\n\n const withDefaultsProto = Object.create(baseConstructor.prototype);\n forEach(ruleNames, (ruleName) => {\n withDefaultsProto[ruleName] = defaultVisit;\n });\n\n derivedConstructor.prototype = withDefaultsProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n\n return derivedConstructor;\n}\n\nexport enum CstVisitorDefinitionError {\n REDUNDANT_METHOD,\n MISSING_METHOD,\n}\n\nexport interface IVisitorDefinitionError {\n msg: string;\n type: CstVisitorDefinitionError;\n methodName: string;\n}\n\nexport function validateVisitor(\n visitorInstance: ICstVisitor,\n ruleNames: string[],\n): IVisitorDefinitionError[] {\n const missingErrors = validateMissingCstMethods(visitorInstance, ruleNames);\n\n return missingErrors;\n}\n\nexport function validateMissingCstMethods(\n visitorInstance: ICstVisitor,\n ruleNames: string[],\n): IVisitorDefinitionError[] {\n const missingRuleNames = filter(ruleNames, (currRuleName) => {\n return isFunction((visitorInstance as any)[currRuleName]) === false;\n });\n\n const errors: IVisitorDefinitionError[] = map(\n missingRuleNames,\n (currRuleName) => {\n return {\n msg: `Missing visitor method: <${currRuleName}> on ${(\n visitorInstance.constructor.name\n )} CST Visitor.`,\n type: CstVisitorDefinitionError.MISSING_METHOD,\n methodName: currRuleName,\n };\n },\n );\n\n return compact(errors);\n}\n", "import {\n addNoneTerminalToCst,\n addTerminalToCst,\n setNodeLocationFull,\n setNodeLocationOnlyOffset,\n} from \"../../cst/cst.js\";\nimport { has, isUndefined, keys, noop } from \"lodash-es\";\nimport {\n createBaseSemanticVisitorConstructor,\n createBaseVisitorConstructorWithDefaults,\n} from \"../../cst/cst_visitor.js\";\nimport {\n CstNode,\n CstNodeLocation,\n ICstVisitor,\n IParserConfig,\n IToken,\n nodeLocationTrackingOptions,\n} from \"@chevrotain/types\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser.js\";\n\n/**\n * This trait is responsible for the CST building logic.\n */\nexport class TreeBuilder {\n outputCst: boolean;\n CST_STACK: CstNode[];\n baseCstVisitorConstructor: Function;\n baseCstVisitorWithDefaultsConstructor: Function;\n\n // dynamically assigned Methods\n setNodeLocationFromNode: (\n nodeLocation: CstNodeLocation,\n locationInformation: CstNodeLocation,\n ) => void;\n setNodeLocationFromToken: (\n nodeLocation: CstNodeLocation,\n locationInformation: CstNodeLocation,\n ) => void;\n cstPostRule: (this: MixedInParser, ruleCstNode: CstNode) => void;\n\n setInitialNodeLocation: (cstNode: CstNode) => void;\n nodeLocationTracking: nodeLocationTrackingOptions;\n\n initTreeBuilder(this: MixedInParser, config: IParserConfig) {\n this.CST_STACK = [];\n\n // outputCst is no longer exposed/defined in the pubic API\n this.outputCst = (config as any).outputCst;\n\n this.nodeLocationTracking = has(config, \"nodeLocationTracking\")\n ? (config.nodeLocationTracking as nodeLocationTrackingOptions) // assumes end user provides the correct config value/type\n : DEFAULT_PARSER_CONFIG.nodeLocationTracking;\n\n if (!this.outputCst) {\n this.cstInvocationStateUpdate = noop;\n this.cstFinallyStateUpdate = noop;\n this.cstPostTerminal = noop;\n this.cstPostNonTerminal = noop;\n this.cstPostRule = noop;\n } else {\n if (/full/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = setNodeLocationFull;\n this.setNodeLocationFromNode = setNodeLocationFull;\n this.cstPostRule = noop;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRecovery;\n } else {\n this.setNodeLocationFromToken = noop;\n this.setNodeLocationFromNode = noop;\n this.cstPostRule = this.cstPostRuleFull;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRegular;\n }\n } else if (/onlyOffset/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = setNodeLocationOnlyOffset;\n this.setNodeLocationFromNode = setNodeLocationOnlyOffset;\n this.cstPostRule = noop;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRecovery;\n } else {\n this.setNodeLocationFromToken = noop;\n this.setNodeLocationFromNode = noop;\n this.cstPostRule = this.cstPostRuleOnlyOffset;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRegular;\n }\n } else if (/none/i.test(this.nodeLocationTracking)) {\n this.setNodeLocationFromToken = noop;\n this.setNodeLocationFromNode = noop;\n this.cstPostRule = noop;\n this.setInitialNodeLocation = noop;\n } else {\n throw Error(\n `Invalid config option: \"${config.nodeLocationTracking}\"`,\n );\n }\n }\n }\n\n setInitialNodeLocationOnlyOffsetRecovery(\n this: MixedInParser,\n cstNode: any,\n ): void {\n cstNode.location = {\n startOffset: NaN,\n endOffset: NaN,\n };\n }\n\n setInitialNodeLocationOnlyOffsetRegular(\n this: MixedInParser,\n cstNode: any,\n ): void {\n cstNode.location = {\n // without error recovery the starting Location of a new CstNode is guaranteed\n // To be the next Token's startOffset (for valid inputs).\n // For invalid inputs there won't be any CSTOutput so this potential\n // inaccuracy does not matter\n startOffset: this.LA(1).startOffset,\n endOffset: NaN,\n };\n }\n\n setInitialNodeLocationFullRecovery(this: MixedInParser, cstNode: any): void {\n cstNode.location = {\n startOffset: NaN,\n startLine: NaN,\n startColumn: NaN,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN,\n };\n }\n\n /**\n * @see setInitialNodeLocationOnlyOffsetRegular for explanation why this work\n\n * @param cstNode\n */\n setInitialNodeLocationFullRegular(this: MixedInParser, cstNode: any): void {\n const nextToken = this.LA(1);\n cstNode.location = {\n startOffset: nextToken.startOffset,\n startLine: nextToken.startLine,\n startColumn: nextToken.startColumn,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN,\n };\n }\n\n cstInvocationStateUpdate(this: MixedInParser, fullRuleName: string): void {\n const cstNode: CstNode = {\n name: fullRuleName,\n children: Object.create(null),\n };\n\n this.setInitialNodeLocation(cstNode);\n this.CST_STACK.push(cstNode);\n }\n\n cstFinallyStateUpdate(this: MixedInParser): void {\n this.CST_STACK.pop();\n }\n\n cstPostRuleFull(this: MixedInParser, ruleCstNode: CstNode): void {\n // casts to `required` are safe because `cstPostRuleFull` should only be invoked when full location is enabled\n const prevToken = this.LA(0) as Required;\n const loc = ruleCstNode.location as Required;\n\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n loc.endLine = prevToken.endLine;\n loc.endColumn = prevToken.endColumn;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n loc.startLine = NaN;\n loc.startColumn = NaN;\n }\n }\n\n cstPostRuleOnlyOffset(this: MixedInParser, ruleCstNode: CstNode): void {\n const prevToken = this.LA(0);\n // `location' is not null because `cstPostRuleOnlyOffset` will only be invoked when location tracking is enabled.\n const loc = ruleCstNode.location!;\n\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n }\n }\n\n cstPostTerminal(\n this: MixedInParser,\n key: string,\n consumedToken: IToken,\n ): void {\n const rootCst = this.CST_STACK[this.CST_STACK.length - 1];\n addTerminalToCst(rootCst, consumedToken, key);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromToken(rootCst.location!, consumedToken);\n }\n\n cstPostNonTerminal(\n this: MixedInParser,\n ruleCstResult: CstNode,\n ruleName: string,\n ): void {\n const preCstNode = this.CST_STACK[this.CST_STACK.length - 1];\n addNoneTerminalToCst(preCstNode, ruleName, ruleCstResult);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromNode(preCstNode.location!, ruleCstResult.location!);\n }\n\n getBaseCstVisitorConstructor(\n this: MixedInParser,\n ): {\n new (...args: any[]): ICstVisitor;\n } {\n if (isUndefined(this.baseCstVisitorConstructor)) {\n const newBaseCstVisitorConstructor = createBaseSemanticVisitorConstructor(\n this.className,\n keys(this.gastProductionsCache),\n );\n this.baseCstVisitorConstructor = newBaseCstVisitorConstructor;\n return newBaseCstVisitorConstructor;\n }\n\n return this.baseCstVisitorConstructor;\n }\n\n getBaseCstVisitorConstructorWithDefaults(\n this: MixedInParser,\n ): {\n new (...args: any[]): ICstVisitor;\n } {\n if (isUndefined(this.baseCstVisitorWithDefaultsConstructor)) {\n const newConstructor = createBaseVisitorConstructorWithDefaults(\n this.className,\n keys(this.gastProductionsCache),\n this.getBaseCstVisitorConstructor(),\n );\n this.baseCstVisitorWithDefaultsConstructor = newConstructor;\n return newConstructor;\n }\n\n return this.baseCstVisitorWithDefaultsConstructor;\n }\n\n getLastExplicitRuleShortName(this: MixedInParser): number {\n const ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 1];\n }\n\n getPreviousExplicitRuleShortName(this: MixedInParser): number {\n const ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 2];\n }\n\n getLastExplicitRuleOccurrenceIndex(this: MixedInParser): number {\n const occurrenceStack = this.RULE_OCCURRENCE_STACK;\n return occurrenceStack[occurrenceStack.length - 1];\n }\n}\n", "import { END_OF_FILE } from \"../parser.js\";\nimport { IToken } from \"@chevrotain/types\";\nimport { MixedInParser } from \"./parser_traits.js\";\n\n/**\n * Trait responsible abstracting over the interaction with Lexer output (Token vector).\n *\n * This could be generalized to support other kinds of lexers, e.g.\n * - Just in Time Lexing / Lexer-Less parsing.\n * - Streaming Lexer.\n */\nexport class LexerAdapter {\n tokVector: IToken[];\n tokVectorLength: number;\n currIdx: number;\n\n initLexerAdapter() {\n this.tokVector = [];\n this.tokVectorLength = 0;\n this.currIdx = -1;\n }\n\n set input(newInput: IToken[]) {\n // @ts-ignore - `this parameter` not supported in setters/getters\n // - https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters\n if (this.selfAnalysisDone !== true) {\n throw Error(\n `Missing invocation at the end of the Parser's constructor.`,\n );\n }\n // @ts-ignore - `this parameter` not supported in setters/getters\n // - https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters\n this.reset();\n this.tokVector = newInput;\n this.tokVectorLength = newInput.length;\n }\n\n get input(): IToken[] {\n return this.tokVector;\n }\n\n // skips a token and returns the next token\n SKIP_TOKEN(this: MixedInParser): IToken {\n if (this.currIdx <= this.tokVector.length - 2) {\n this.consumeToken();\n return this.LA(1);\n } else {\n return END_OF_FILE;\n }\n }\n\n // Lexer (accessing Token vector) related methods which can be overridden to implement lazy lexers\n // or lexers dependent on parser context.\n LA(this: MixedInParser, howMuch: number): IToken {\n const soughtIdx = this.currIdx + howMuch;\n if (soughtIdx < 0 || this.tokVectorLength <= soughtIdx) {\n return END_OF_FILE;\n } else {\n return this.tokVector[soughtIdx];\n }\n }\n\n consumeToken(this: MixedInParser) {\n this.currIdx++;\n }\n\n exportLexerState(this: MixedInParser): number {\n return this.currIdx;\n }\n\n importLexerState(this: MixedInParser, newState: number) {\n this.currIdx = newState;\n }\n\n resetLexerState(this: MixedInParser): void {\n this.currIdx = -1;\n }\n\n moveToTerminatedState(this: MixedInParser): void {\n this.currIdx = this.tokVector.length - 1;\n }\n\n getLexerPosition(this: MixedInParser): number {\n return this.exportLexerState();\n }\n}\n", "import {\n AtLeastOneSepMethodOpts,\n ConsumeMethodOpts,\n DSLMethodOpts,\n DSLMethodOptsWithErr,\n GrammarAction,\n IOrAlt,\n IRuleConfig,\n ISerializedGast,\n IToken,\n ManySepMethodOpts,\n OrMethodOpts,\n SubruleMethodOpts,\n TokenType,\n} from \"@chevrotain/types\";\nimport { includes, values } from \"lodash-es\";\nimport { isRecognitionException } from \"../../exceptions_public.js\";\nimport { DEFAULT_RULE_CONFIG, ParserDefinitionErrorType } from \"../parser.js\";\nimport { defaultGrammarValidatorErrorProvider } from \"../../errors_public.js\";\nimport { validateRuleIsOverridden } from \"../../grammar/checks.js\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport { Rule, serializeGrammar } from \"@chevrotain/gast\";\nimport { IParserDefinitionError } from \"../../grammar/types.js\";\nimport { ParserMethodInternal } from \"../types.js\";\n\n/**\n * This trait is responsible for implementing the public API\n * for defining Chevrotain parsers, i.e:\n * - CONSUME\n * - RULE\n * - OPTION\n * - ...\n */\nexport class RecognizerApi {\n ACTION(this: MixedInParser, impl: () => T): T {\n return impl.call(this);\n }\n\n consume(\n this: MixedInParser,\n idx: number,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, idx, options);\n }\n\n subrule(\n this: MixedInParser,\n idx: number,\n ruleToCall: ParserMethodInternal,\n options?: SubruleMethodOpts,\n ): R {\n return this.subruleInternal(ruleToCall, idx, options);\n }\n\n option(\n this: MixedInParser,\n idx: number,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, idx);\n }\n\n or(\n this: MixedInParser,\n idx: number,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n ): any {\n return this.orInternal(altsOrOpts, idx);\n }\n\n many(\n this: MixedInParser,\n idx: number,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n return this.manyInternal(idx, actionORMethodDef);\n }\n\n atLeastOne(\n this: MixedInParser,\n idx: number,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n return this.atLeastOneInternal(idx, actionORMethodDef);\n }\n\n CONSUME(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 0, options);\n }\n\n CONSUME1(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 1, options);\n }\n\n CONSUME2(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 2, options);\n }\n\n CONSUME3(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 3, options);\n }\n\n CONSUME4(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 4, options);\n }\n\n CONSUME5(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 5, options);\n }\n\n CONSUME6(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 6, options);\n }\n\n CONSUME7(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 7, options);\n }\n\n CONSUME8(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 8, options);\n }\n\n CONSUME9(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 9, options);\n }\n\n SUBRULE(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n options?: SubruleMethodOpts,\n ): R {\n return this.subruleInternal(ruleToCall, 0, options);\n }\n\n SUBRULE1(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n options?: SubruleMethodOpts,\n ): R {\n return this.subruleInternal(ruleToCall, 1, options);\n }\n\n SUBRULE2(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n options?: SubruleMethodOpts,\n ): R {\n return this.subruleInternal(ruleToCall, 2, options);\n }\n\n SUBRULE3(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n options?: SubruleMethodOpts,\n ): R {\n return this.subruleInternal(ruleToCall, 3, options);\n }\n\n SUBRULE4(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n options?: SubruleMethodOpts,\n ): R {\n return this.subruleInternal(ruleToCall, 4, options);\n }\n\n SUBRULE5(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n options?: SubruleMethodOpts,\n ): R {\n return this.subruleInternal(ruleToCall, 5, options);\n }\n\n SUBRULE6(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n options?: SubruleMethodOpts,\n ): R {\n return this.subruleInternal(ruleToCall, 6, options);\n }\n\n SUBRULE7(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n options?: SubruleMethodOpts,\n ): R {\n return this.subruleInternal(ruleToCall, 7, options);\n }\n\n SUBRULE8(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n options?: SubruleMethodOpts,\n ): R {\n return this.subruleInternal(ruleToCall, 8, options);\n }\n\n SUBRULE9(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n options?: SubruleMethodOpts,\n ): R {\n return this.subruleInternal(ruleToCall, 9, options);\n }\n\n OPTION(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 0);\n }\n\n OPTION1(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 1);\n }\n\n OPTION2(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 2);\n }\n\n OPTION3(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 3);\n }\n\n OPTION4(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 4);\n }\n\n OPTION5(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 5);\n }\n\n OPTION6(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 6);\n }\n\n OPTION7(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 7);\n }\n\n OPTION8(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 8);\n }\n\n OPTION9(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 9);\n }\n\n OR(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n ): T {\n return this.orInternal(altsOrOpts, 0);\n }\n\n OR1(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n ): T {\n return this.orInternal(altsOrOpts, 1);\n }\n\n OR2(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n ): T {\n return this.orInternal(altsOrOpts, 2);\n }\n\n OR3(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n ): T {\n return this.orInternal(altsOrOpts, 3);\n }\n\n OR4(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n ): T {\n return this.orInternal(altsOrOpts, 4);\n }\n\n OR5(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n ): T {\n return this.orInternal(altsOrOpts, 5);\n }\n\n OR6(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n ): T {\n return this.orInternal(altsOrOpts, 6);\n }\n\n OR7(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n ): T {\n return this.orInternal(altsOrOpts, 7);\n }\n\n OR8(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n ): T {\n return this.orInternal(altsOrOpts, 8);\n }\n\n OR9(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n ): T {\n return this.orInternal(altsOrOpts, 9);\n }\n\n MANY(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n this.manyInternal(0, actionORMethodDef);\n }\n\n MANY1(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n this.manyInternal(1, actionORMethodDef);\n }\n\n MANY2(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n this.manyInternal(2, actionORMethodDef);\n }\n\n MANY3(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n this.manyInternal(3, actionORMethodDef);\n }\n\n MANY4(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n this.manyInternal(4, actionORMethodDef);\n }\n\n MANY5(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n this.manyInternal(5, actionORMethodDef);\n }\n\n MANY6(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n this.manyInternal(6, actionORMethodDef);\n }\n\n MANY7(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n this.manyInternal(7, actionORMethodDef);\n }\n\n MANY8(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n this.manyInternal(8, actionORMethodDef);\n }\n\n MANY9(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n this.manyInternal(9, actionORMethodDef);\n }\n\n MANY_SEP(this: MixedInParser, options: ManySepMethodOpts): void {\n this.manySepFirstInternal(0, options);\n }\n\n MANY_SEP1(this: MixedInParser, options: ManySepMethodOpts): void {\n this.manySepFirstInternal(1, options);\n }\n\n MANY_SEP2(this: MixedInParser, options: ManySepMethodOpts): void {\n this.manySepFirstInternal(2, options);\n }\n\n MANY_SEP3(this: MixedInParser, options: ManySepMethodOpts): void {\n this.manySepFirstInternal(3, options);\n }\n\n MANY_SEP4(this: MixedInParser, options: ManySepMethodOpts): void {\n this.manySepFirstInternal(4, options);\n }\n\n MANY_SEP5(this: MixedInParser, options: ManySepMethodOpts): void {\n this.manySepFirstInternal(5, options);\n }\n\n MANY_SEP6(this: MixedInParser, options: ManySepMethodOpts): void {\n this.manySepFirstInternal(6, options);\n }\n\n MANY_SEP7(this: MixedInParser, options: ManySepMethodOpts): void {\n this.manySepFirstInternal(7, options);\n }\n\n MANY_SEP8(this: MixedInParser, options: ManySepMethodOpts): void {\n this.manySepFirstInternal(8, options);\n }\n\n MANY_SEP9(this: MixedInParser, options: ManySepMethodOpts): void {\n this.manySepFirstInternal(9, options);\n }\n\n AT_LEAST_ONE(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n this.atLeastOneInternal(0, actionORMethodDef);\n }\n\n AT_LEAST_ONE1(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n return this.atLeastOneInternal(1, actionORMethodDef);\n }\n\n AT_LEAST_ONE2(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n this.atLeastOneInternal(2, actionORMethodDef);\n }\n\n AT_LEAST_ONE3(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n this.atLeastOneInternal(3, actionORMethodDef);\n }\n\n AT_LEAST_ONE4(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n this.atLeastOneInternal(4, actionORMethodDef);\n }\n\n AT_LEAST_ONE5(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n this.atLeastOneInternal(5, actionORMethodDef);\n }\n\n AT_LEAST_ONE6(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n this.atLeastOneInternal(6, actionORMethodDef);\n }\n\n AT_LEAST_ONE7(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n this.atLeastOneInternal(7, actionORMethodDef);\n }\n\n AT_LEAST_ONE8(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n this.atLeastOneInternal(8, actionORMethodDef);\n }\n\n AT_LEAST_ONE9(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n this.atLeastOneInternal(9, actionORMethodDef);\n }\n\n AT_LEAST_ONE_SEP(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts,\n ): void {\n this.atLeastOneSepFirstInternal(0, options);\n }\n\n AT_LEAST_ONE_SEP1(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts,\n ): void {\n this.atLeastOneSepFirstInternal(1, options);\n }\n\n AT_LEAST_ONE_SEP2(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts,\n ): void {\n this.atLeastOneSepFirstInternal(2, options);\n }\n\n AT_LEAST_ONE_SEP3(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts,\n ): void {\n this.atLeastOneSepFirstInternal(3, options);\n }\n\n AT_LEAST_ONE_SEP4(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts,\n ): void {\n this.atLeastOneSepFirstInternal(4, options);\n }\n\n AT_LEAST_ONE_SEP5(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts,\n ): void {\n this.atLeastOneSepFirstInternal(5, options);\n }\n\n AT_LEAST_ONE_SEP6(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts,\n ): void {\n this.atLeastOneSepFirstInternal(6, options);\n }\n\n AT_LEAST_ONE_SEP7(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts,\n ): void {\n this.atLeastOneSepFirstInternal(7, options);\n }\n\n AT_LEAST_ONE_SEP8(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts,\n ): void {\n this.atLeastOneSepFirstInternal(8, options);\n }\n\n AT_LEAST_ONE_SEP9(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts,\n ): void {\n this.atLeastOneSepFirstInternal(9, options);\n }\n\n RULE(\n this: MixedInParser,\n name: string,\n implementation: (...implArgs: any[]) => T,\n config: IRuleConfig = DEFAULT_RULE_CONFIG,\n ): (idxInCallingRule?: number, ...args: any[]) => T | any {\n if (includes(this.definedRulesNames, name)) {\n const errMsg =\n defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({\n topLevelRule: name,\n grammarName: this.className,\n });\n\n const error = {\n message: errMsg,\n type: ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n ruleName: name,\n };\n this.definitionErrors.push(error);\n }\n\n this.definedRulesNames.push(name);\n\n const ruleImplementation = this.defineRule(name, implementation, config);\n (this as any)[name] = ruleImplementation;\n return ruleImplementation;\n }\n\n OVERRIDE_RULE(\n this: MixedInParser,\n name: string,\n impl: (...implArgs: any[]) => T,\n config: IRuleConfig = DEFAULT_RULE_CONFIG,\n ): (idxInCallingRule?: number, ...args: any[]) => T {\n const ruleErrors: IParserDefinitionError[] = validateRuleIsOverridden(\n name,\n this.definedRulesNames,\n this.className,\n );\n this.definitionErrors = this.definitionErrors.concat(ruleErrors);\n\n const ruleImplementation = this.defineRule(name, impl, config);\n (this as any)[name] = ruleImplementation;\n return ruleImplementation;\n }\n\n BACKTRACK(\n this: MixedInParser,\n grammarRule: (...args: any[]) => T,\n args?: any[],\n ): () => boolean {\n return function () {\n // save org state\n this.isBackTrackingStack.push(1);\n const orgState = this.saveRecogState();\n try {\n grammarRule.apply(this, args);\n // if no exception was thrown we have succeed parsing the rule.\n return true;\n } catch (e) {\n if (isRecognitionException(e)) {\n return false;\n } else {\n throw e;\n }\n } finally {\n this.reloadRecogState(orgState);\n this.isBackTrackingStack.pop();\n }\n };\n }\n\n // GAST export APIs\n public getGAstProductions(this: MixedInParser): Record {\n return this.gastProductionsCache;\n }\n\n public getSerializedGastProductions(this: MixedInParser): ISerializedGast[] {\n return serializeGrammar(values(this.gastProductionsCache));\n }\n}\n", "import {\n AtLeastOneSepMethodOpts,\n ConsumeMethodOpts,\n DSLMethodOpts,\n DSLMethodOptsWithErr,\n GrammarAction,\n IOrAlt,\n IParserConfig,\n IRuleConfig,\n IToken,\n ManySepMethodOpts,\n OrMethodOpts,\n ParserMethod,\n SubruleMethodOpts,\n TokenType,\n TokenTypeDictionary,\n TokenVocabulary,\n} from \"@chevrotain/types\";\nimport {\n clone,\n every,\n flatten,\n has,\n isArray,\n isEmpty,\n isObject,\n reduce,\n uniq,\n values,\n} from \"lodash-es\";\nimport {\n AT_LEAST_ONE_IDX,\n AT_LEAST_ONE_SEP_IDX,\n BITS_FOR_METHOD_TYPE,\n BITS_FOR_OCCURRENCE_IDX,\n MANY_IDX,\n MANY_SEP_IDX,\n OPTION_IDX,\n OR_IDX,\n} from \"../../grammar/keys.js\";\nimport {\n isRecognitionException,\n MismatchedTokenException,\n NotAllInputParsedException,\n} from \"../../exceptions_public.js\";\nimport { PROD_TYPE } from \"../../grammar/lookahead.js\";\nimport {\n AbstractNextTerminalAfterProductionWalker,\n NextTerminalAfterAtLeastOneSepWalker,\n NextTerminalAfterAtLeastOneWalker,\n NextTerminalAfterManySepWalker,\n NextTerminalAfterManyWalker,\n} from \"../../grammar/interpreter.js\";\nimport { DEFAULT_RULE_CONFIG, IParserState, TokenMatcher } from \"../parser.js\";\nimport { IN_RULE_RECOVERY_EXCEPTION } from \"./recoverable.js\";\nimport { EOF } from \"../../../scan/tokens_public.js\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport {\n augmentTokenTypes,\n isTokenType,\n tokenStructuredMatcher,\n tokenStructuredMatcherNoCategories,\n} from \"../../../scan/tokens.js\";\nimport { Rule } from \"@chevrotain/gast\";\nimport { ParserMethodInternal } from \"../types.js\";\n\n/**\n * This trait is responsible for the runtime parsing engine\n * Used by the official API (recognizer_api.ts)\n */\nexport class RecognizerEngine {\n isBackTrackingStack: boolean[];\n className: string;\n RULE_STACK: number[];\n RULE_OCCURRENCE_STACK: number[];\n definedRulesNames: string[];\n tokensMap: { [fqn: string]: TokenType };\n gastProductionsCache: Record;\n shortRuleNameToFull: Record;\n fullRuleNameToShort: Record;\n // The shortName Index must be coded \"after\" the first 8bits to enable building unique lookahead keys\n ruleShortNameIdx: number;\n tokenMatcher: TokenMatcher;\n subruleIdx: number;\n\n initRecognizerEngine(\n tokenVocabulary: TokenVocabulary,\n config: IParserConfig,\n ) {\n this.className = this.constructor.name;\n // TODO: would using an ES6 Map or plain object be faster (CST building scenario)\n this.shortRuleNameToFull = {};\n this.fullRuleNameToShort = {};\n this.ruleShortNameIdx = 256;\n this.tokenMatcher = tokenStructuredMatcherNoCategories;\n this.subruleIdx = 0;\n\n this.definedRulesNames = [];\n this.tokensMap = {};\n this.isBackTrackingStack = [];\n this.RULE_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n this.gastProductionsCache = {};\n\n if (has(config, \"serializedGrammar\")) {\n throw Error(\n \"The Parser's configuration can no longer contain a property.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\\n\" +\n \"\\tFor Further details.\",\n );\n }\n\n if (isArray(tokenVocabulary)) {\n // This only checks for Token vocabularies provided as arrays.\n // That is good enough because the main objective is to detect users of pre-V4.0 APIs\n // rather than all edge cases of empty Token vocabularies.\n if (isEmpty(tokenVocabulary as any[])) {\n throw Error(\n \"A Token Vocabulary cannot be empty.\\n\" +\n \"\\tNote that the first argument for the parser constructor\\n\" +\n \"\\tis no longer a Token vector (since v4.0).\",\n );\n }\n\n if (typeof (tokenVocabulary as any[])[0].startOffset === \"number\") {\n throw Error(\n \"The Parser constructor no longer accepts a token vector as the first argument.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\\n\" +\n \"\\tFor Further details.\",\n );\n }\n }\n\n if (isArray(tokenVocabulary)) {\n this.tokensMap = reduce(\n tokenVocabulary,\n (acc, tokType: TokenType) => {\n acc[tokType.name] = tokType;\n return acc;\n },\n {} as { [tokenName: string]: TokenType },\n );\n } else if (\n has(tokenVocabulary, \"modes\") &&\n every(flatten(values((tokenVocabulary).modes)), isTokenType)\n ) {\n const allTokenTypes = flatten(values((tokenVocabulary).modes));\n const uniqueTokens = uniq(allTokenTypes);\n this.tokensMap = reduce(\n uniqueTokens,\n (acc, tokType: TokenType) => {\n acc[tokType.name] = tokType;\n return acc;\n },\n {} as { [tokenName: string]: TokenType },\n );\n } else if (isObject(tokenVocabulary)) {\n this.tokensMap = clone(tokenVocabulary as TokenTypeDictionary);\n } else {\n throw new Error(\n \" argument must be An Array of Token constructors,\" +\n \" A dictionary of Token constructors or an IMultiModeLexerDefinition\",\n );\n }\n\n // always add EOF to the tokenNames -> constructors map. it is useful to assure all the input has been\n // parsed with a clear error message (\"expecting EOF but found ...\")\n this.tokensMap[\"EOF\"] = EOF;\n\n const allTokenTypes = has(tokenVocabulary, \"modes\")\n ? flatten(values((tokenVocabulary).modes))\n : values(tokenVocabulary);\n const noTokenCategoriesUsed = every(allTokenTypes, (tokenConstructor) =>\n isEmpty(tokenConstructor.categoryMatches),\n );\n\n this.tokenMatcher = noTokenCategoriesUsed\n ? tokenStructuredMatcherNoCategories\n : tokenStructuredMatcher;\n\n // Because ES2015+ syntax should be supported for creating Token classes\n // We cannot assume that the Token classes were created using the \"extendToken\" utilities\n // Therefore we must augment the Token classes both on Lexer initialization and on Parser initialization\n augmentTokenTypes(values(this.tokensMap));\n }\n\n defineRule(\n this: MixedInParser,\n ruleName: string,\n impl: (...args: ARGS) => R,\n config: IRuleConfig,\n ): ParserMethodInternal {\n if (this.selfAnalysisDone) {\n throw Error(\n `Grammar rule <${ruleName}> may not be defined after the 'performSelfAnalysis' method has been called'\\n` +\n `Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`,\n );\n }\n const resyncEnabled: boolean = has(config, \"resyncEnabled\")\n ? (config.resyncEnabled as boolean) // assumes end user provides the correct config value/type\n : DEFAULT_RULE_CONFIG.resyncEnabled;\n const recoveryValueFunc = has(config, \"recoveryValueFunc\")\n ? (config.recoveryValueFunc as () => R) // assumes end user provides the correct config value/type\n : DEFAULT_RULE_CONFIG.recoveryValueFunc;\n\n // performance optimization: Use small integers as keys for the longer human readable \"full\" rule names.\n // this greatly improves Map access time (as much as 8% for some performance benchmarks).\n const shortName =\n this.ruleShortNameIdx << (BITS_FOR_METHOD_TYPE + BITS_FOR_OCCURRENCE_IDX);\n\n this.ruleShortNameIdx++;\n this.shortRuleNameToFull[shortName] = ruleName;\n this.fullRuleNameToShort[ruleName] = shortName;\n\n let invokeRuleWithTry: ParserMethod;\n\n // Micro optimization, only check the condition **once** on rule definition\n // instead of **every single** rule invocation.\n if (this.outputCst === true) {\n invokeRuleWithTry = function invokeRuleWithTry(\n this: MixedInParser,\n ...args: ARGS\n ): R {\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n impl.apply(this, args);\n const cst = this.CST_STACK[this.CST_STACK.length - 1];\n this.cstPostRule(cst);\n return cst as unknown as R;\n } catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc) as R;\n } finally {\n this.ruleFinallyStateUpdate();\n }\n };\n } else {\n invokeRuleWithTry = function invokeRuleWithTryCst(\n this: MixedInParser,\n ...args: ARGS\n ): R {\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n return impl.apply(this, args);\n } catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc) as R;\n } finally {\n this.ruleFinallyStateUpdate();\n }\n };\n }\n\n const wrappedGrammarRule: ParserMethodInternal = Object.assign(\n invokeRuleWithTry as any,\n { ruleName, originalGrammarAction: impl },\n );\n\n return wrappedGrammarRule;\n }\n\n invokeRuleCatch(\n this: MixedInParser,\n e: Error,\n resyncEnabledConfig: boolean,\n recoveryValueFunc: Function,\n ): unknown {\n const isFirstInvokedRule = this.RULE_STACK.length === 1;\n // note the reSync is always enabled for the first rule invocation, because we must always be able to\n // reSync with EOF and just output some INVALID ParseTree\n // during backtracking reSync recovery is disabled, otherwise we can't be certain the backtracking\n // path is really the most valid one\n const reSyncEnabled =\n resyncEnabledConfig && !this.isBackTracking() && this.recoveryEnabled;\n\n if (isRecognitionException(e)) {\n const recogError: any = e;\n if (reSyncEnabled) {\n const reSyncTokType = this.findReSyncTokenType();\n if (this.isInCurrentRuleReSyncSet(reSyncTokType)) {\n recogError.resyncedTokens = this.reSyncTo(reSyncTokType);\n if (this.outputCst) {\n const partialCstResult: any =\n this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n return partialCstResult;\n } else {\n return recoveryValueFunc(e);\n }\n } else {\n if (this.outputCst) {\n const partialCstResult: any =\n this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n recogError.partialCstResult = partialCstResult;\n }\n // to be handled Further up the call stack\n throw recogError;\n }\n } else if (isFirstInvokedRule) {\n // otherwise a Redundant input error will be created as well and we cannot guarantee that this is indeed the case\n this.moveToTerminatedState();\n // the parser should never throw one of its own errors outside its flow.\n // even if error recovery is disabled\n return recoveryValueFunc(e);\n } else {\n // to be recovered Further up the call stack\n throw recogError;\n }\n } else {\n // some other Error type which we don't know how to handle (for example a built in JavaScript Error)\n throw e;\n }\n }\n\n // Implementation of parsing DSL\n optionInternal(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n occurrence: number,\n ): OUT | undefined {\n const key = this.getKeyForAutomaticLookahead(OPTION_IDX, occurrence);\n return this.optionInternalLogic(actionORMethodDef, occurrence, key);\n }\n\n optionInternalLogic(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n occurrence: number,\n key: number,\n ): OUT | undefined {\n let lookAheadFunc = this.getLaFuncFromCache(key);\n let action: GrammarAction;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n const predicate = actionORMethodDef.GATE;\n // predicate present\n if (predicate !== undefined) {\n const orgLookaheadFunction = lookAheadFunc;\n lookAheadFunc = () => {\n return predicate.call(this) && orgLookaheadFunction.call(this);\n };\n }\n } else {\n action = actionORMethodDef;\n }\n\n if (lookAheadFunc.call(this) === true) {\n return action.call(this);\n }\n return undefined;\n }\n\n atLeastOneInternal(\n this: MixedInParser,\n prodOccurrence: number,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n const laKey = this.getKeyForAutomaticLookahead(\n AT_LEAST_ONE_IDX,\n prodOccurrence,\n );\n return this.atLeastOneInternalLogic(\n prodOccurrence,\n actionORMethodDef,\n laKey,\n );\n }\n\n atLeastOneInternalLogic(\n this: MixedInParser,\n prodOccurrence: number,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n key: number,\n ): void {\n let lookAheadFunc = this.getLaFuncFromCache(key);\n let action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n const predicate = actionORMethodDef.GATE;\n // predicate present\n if (predicate !== undefined) {\n const orgLookaheadFunction = lookAheadFunc;\n lookAheadFunc = () => {\n return predicate.call(this) && orgLookaheadFunction.call(this);\n };\n }\n } else {\n action = actionORMethodDef;\n }\n\n if ((lookAheadFunc).call(this) === true) {\n let notStuck = this.doSingleRepetition(action);\n while (\n (lookAheadFunc).call(this) === true &&\n notStuck === true\n ) {\n notStuck = this.doSingleRepetition(action);\n }\n } else {\n throw this.raiseEarlyExitException(\n prodOccurrence,\n PROD_TYPE.REPETITION_MANDATORY,\n (>actionORMethodDef).ERR_MSG,\n );\n }\n\n // note that while it may seem that this can cause an error because by using a recursive call to\n // AT_LEAST_ONE we change the grammar to AT_LEAST_TWO, AT_LEAST_THREE ... , the possible recursive call\n // from the tryInRepetitionRecovery(...) will only happen IFF there really are TWO/THREE/.... items.\n\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(\n this.atLeastOneInternal,\n [prodOccurrence, actionORMethodDef],\n lookAheadFunc,\n AT_LEAST_ONE_IDX,\n prodOccurrence,\n NextTerminalAfterAtLeastOneWalker,\n );\n }\n\n atLeastOneSepFirstInternal(\n this: MixedInParser,\n prodOccurrence: number,\n options: AtLeastOneSepMethodOpts,\n ): void {\n const laKey = this.getKeyForAutomaticLookahead(\n AT_LEAST_ONE_SEP_IDX,\n prodOccurrence,\n );\n this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, laKey);\n }\n\n atLeastOneSepFirstInternalLogic(\n this: MixedInParser,\n prodOccurrence: number,\n options: AtLeastOneSepMethodOpts,\n key: number,\n ): void {\n const action = options.DEF;\n const separator = options.SEP;\n\n const firstIterationLookaheadFunc = this.getLaFuncFromCache(key);\n\n // 1st iteration\n if (firstIterationLookaheadFunc.call(this) === true) {\n (>action).call(this);\n\n // TODO: Optimization can move this function construction into \"attemptInRepetitionRecovery\"\n // because it is only needed in error recovery scenarios.\n const separatorLookAheadFunc = () => {\n return this.tokenMatcher(this.LA(1), separator);\n };\n\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n // No need for checking infinite loop here due to consuming the separator.\n (>action).call(this);\n }\n\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(\n this.repetitionSepSecondInternal,\n [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n NextTerminalAfterAtLeastOneSepWalker,\n ],\n separatorLookAheadFunc,\n AT_LEAST_ONE_SEP_IDX,\n prodOccurrence,\n NextTerminalAfterAtLeastOneSepWalker,\n );\n } else {\n throw this.raiseEarlyExitException(\n prodOccurrence,\n PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,\n options.ERR_MSG,\n );\n }\n }\n\n manyInternal(\n this: MixedInParser,\n prodOccurrence: number,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n const laKey = this.getKeyForAutomaticLookahead(MANY_IDX, prodOccurrence);\n return this.manyInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n }\n\n manyInternalLogic(\n this: MixedInParser,\n prodOccurrence: number,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n key: number,\n ) {\n let lookaheadFunction = this.getLaFuncFromCache(key);\n let action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n const predicate = actionORMethodDef.GATE;\n // predicate present\n if (predicate !== undefined) {\n const orgLookaheadFunction = lookaheadFunction;\n lookaheadFunction = () => {\n return predicate.call(this) && orgLookaheadFunction.call(this);\n };\n }\n } else {\n action = actionORMethodDef;\n }\n\n let notStuck = true;\n while (lookaheadFunction.call(this) === true && notStuck === true) {\n notStuck = this.doSingleRepetition(action);\n }\n\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(\n this.manyInternal,\n [prodOccurrence, actionORMethodDef],\n lookaheadFunction,\n MANY_IDX,\n prodOccurrence,\n NextTerminalAfterManyWalker,\n // The notStuck parameter is only relevant when \"attemptInRepetitionRecovery\"\n // is invoked from manyInternal, in the MANY_SEP case and AT_LEAST_ONE[_SEP]\n // An infinite loop cannot occur as:\n // - Either the lookahead is guaranteed to consume something (Single Token Separator)\n // - AT_LEAST_ONE by definition is guaranteed to consume something (or error out).\n notStuck,\n );\n }\n\n manySepFirstInternal(\n this: MixedInParser,\n prodOccurrence: number,\n options: ManySepMethodOpts,\n ): void {\n const laKey = this.getKeyForAutomaticLookahead(\n MANY_SEP_IDX,\n prodOccurrence,\n );\n this.manySepFirstInternalLogic(prodOccurrence, options, laKey);\n }\n\n manySepFirstInternalLogic(\n this: MixedInParser,\n prodOccurrence: number,\n options: ManySepMethodOpts,\n key: number,\n ): void {\n const action = options.DEF;\n const separator = options.SEP;\n const firstIterationLaFunc = this.getLaFuncFromCache(key);\n\n // 1st iteration\n if (firstIterationLaFunc.call(this) === true) {\n action.call(this);\n\n const separatorLookAheadFunc = () => {\n return this.tokenMatcher(this.LA(1), separator);\n };\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n // No need for checking infinite loop here due to consuming the separator.\n action.call(this);\n }\n\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(\n this.repetitionSepSecondInternal,\n [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n NextTerminalAfterManySepWalker,\n ],\n separatorLookAheadFunc,\n MANY_SEP_IDX,\n prodOccurrence,\n NextTerminalAfterManySepWalker,\n );\n }\n }\n\n repetitionSepSecondInternal(\n this: MixedInParser,\n prodOccurrence: number,\n separator: TokenType,\n separatorLookAheadFunc: () => boolean,\n action: GrammarAction,\n nextTerminalAfterWalker: typeof AbstractNextTerminalAfterProductionWalker,\n ): void {\n while (separatorLookAheadFunc()) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n action.call(this);\n }\n\n // we can only arrive to this function after an error\n // has occurred (hence the name 'second') so the following\n // IF will always be entered, its possible to remove it...\n // however it is kept to avoid confusion and be consistent.\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n /* istanbul ignore else */\n this.attemptInRepetitionRecovery(\n this.repetitionSepSecondInternal,\n [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n nextTerminalAfterWalker,\n ],\n separatorLookAheadFunc,\n AT_LEAST_ONE_SEP_IDX,\n prodOccurrence,\n nextTerminalAfterWalker,\n );\n }\n\n doSingleRepetition(this: MixedInParser, action: Function): any {\n const beforeIteration = this.getLexerPosition();\n action.call(this);\n const afterIteration = this.getLexerPosition();\n\n // This boolean will indicate if this repetition progressed\n // or if we are \"stuck\" (potential infinite loop in the repetition).\n return afterIteration > beforeIteration;\n }\n\n orInternal(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n occurrence: number,\n ): T {\n const laKey = this.getKeyForAutomaticLookahead(OR_IDX, occurrence);\n const alts = isArray(altsOrOpts) ? altsOrOpts : altsOrOpts.DEF;\n\n const laFunc = this.getLaFuncFromCache(laKey);\n const altIdxToTake = laFunc.call(this, alts);\n if (altIdxToTake !== undefined) {\n const chosenAlternative: any = alts[altIdxToTake];\n return chosenAlternative.ALT.call(this);\n }\n this.raiseNoAltException(\n occurrence,\n (altsOrOpts as OrMethodOpts).ERR_MSG,\n );\n }\n\n ruleFinallyStateUpdate(this: MixedInParser): void {\n this.RULE_STACK.pop();\n this.RULE_OCCURRENCE_STACK.pop();\n\n // NOOP when cst is disabled\n this.cstFinallyStateUpdate();\n\n if (this.RULE_STACK.length === 0 && this.isAtEndOfInput() === false) {\n const firstRedundantTok = this.LA(1);\n const errMsg = this.errorMessageProvider.buildNotAllInputParsedMessage({\n firstRedundant: firstRedundantTok,\n ruleName: this.getCurrRuleFullName(),\n });\n this.SAVE_ERROR(\n new NotAllInputParsedException(errMsg, firstRedundantTok),\n );\n }\n }\n\n subruleInternal(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n idx: number,\n options?: SubruleMethodOpts,\n ): R {\n let ruleResult;\n try {\n const args = options !== undefined ? options.ARGS : undefined;\n this.subruleIdx = idx;\n ruleResult = ruleToCall.apply(this, args);\n this.cstPostNonTerminal(\n ruleResult,\n options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleToCall.ruleName,\n );\n return ruleResult;\n } catch (e) {\n throw this.subruleInternalError(e, options, ruleToCall.ruleName);\n }\n }\n\n subruleInternalError(\n this: MixedInParser,\n e: any,\n options: SubruleMethodOpts | undefined,\n ruleName: string,\n ): void {\n if (isRecognitionException(e) && e.partialCstResult !== undefined) {\n this.cstPostNonTerminal(\n e.partialCstResult,\n options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleName,\n );\n\n delete e.partialCstResult;\n }\n throw e;\n }\n\n consumeInternal(\n this: MixedInParser,\n tokType: TokenType,\n idx: number,\n options: ConsumeMethodOpts | undefined,\n ): IToken {\n let consumedToken!: IToken;\n try {\n const nextToken = this.LA(1);\n if (this.tokenMatcher(nextToken, tokType) === true) {\n this.consumeToken();\n consumedToken = nextToken;\n } else {\n this.consumeInternalError(tokType, nextToken, options);\n }\n } catch (eFromConsumption) {\n consumedToken = this.consumeInternalRecovery(\n tokType,\n idx,\n eFromConsumption,\n );\n }\n\n this.cstPostTerminal(\n options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : tokType.name,\n consumedToken,\n );\n return consumedToken;\n }\n\n consumeInternalError(\n this: MixedInParser,\n tokType: TokenType,\n nextToken: IToken,\n options: ConsumeMethodOpts | undefined,\n ): void {\n let msg;\n const previousToken = this.LA(0);\n if (options !== undefined && options.ERR_MSG) {\n msg = options.ERR_MSG;\n } else {\n msg = this.errorMessageProvider.buildMismatchTokenMessage({\n expected: tokType,\n actual: nextToken,\n previous: previousToken,\n ruleName: this.getCurrRuleFullName(),\n });\n }\n throw this.SAVE_ERROR(\n new MismatchedTokenException(msg, nextToken, previousToken),\n );\n }\n\n consumeInternalRecovery(\n this: MixedInParser,\n tokType: TokenType,\n idx: number,\n eFromConsumption: Error,\n ): IToken {\n // no recovery allowed during backtracking, otherwise backtracking may recover invalid syntax and accept it\n // but the original syntax could have been parsed successfully without any backtracking + recovery\n if (\n this.recoveryEnabled &&\n // TODO: more robust checking of the exception type. Perhaps Typescript extending expressions?\n eFromConsumption.name === \"MismatchedTokenException\" &&\n !this.isBackTracking()\n ) {\n const follows = this.getFollowsForInRuleRecovery(tokType, idx);\n try {\n return this.tryInRuleRecovery(tokType, follows);\n } catch (eFromInRuleRecovery) {\n if (eFromInRuleRecovery.name === IN_RULE_RECOVERY_EXCEPTION) {\n // failed in RuleRecovery.\n // throw the original error in order to trigger reSync error recovery\n throw eFromConsumption;\n } else {\n throw eFromInRuleRecovery;\n }\n }\n } else {\n throw eFromConsumption;\n }\n }\n\n saveRecogState(this: MixedInParser): IParserState {\n // errors is a getter which will clone the errors array\n const savedErrors = this.errors;\n const savedRuleStack = clone(this.RULE_STACK);\n return {\n errors: savedErrors,\n lexerState: this.exportLexerState(),\n RULE_STACK: savedRuleStack,\n CST_STACK: this.CST_STACK,\n };\n }\n\n reloadRecogState(this: MixedInParser, newState: IParserState) {\n this.errors = newState.errors;\n this.importLexerState(newState.lexerState);\n this.RULE_STACK = newState.RULE_STACK;\n }\n\n ruleInvocationStateUpdate(\n this: MixedInParser,\n shortName: number,\n fullName: string,\n idxInCallingRule: number,\n ): void {\n this.RULE_OCCURRENCE_STACK.push(idxInCallingRule);\n this.RULE_STACK.push(shortName);\n // NOOP when cst is disabled\n this.cstInvocationStateUpdate(fullName);\n }\n\n isBackTracking(this: MixedInParser): boolean {\n return this.isBackTrackingStack.length !== 0;\n }\n\n getCurrRuleFullName(this: MixedInParser): string {\n const shortName = this.getLastExplicitRuleShortName();\n return this.shortRuleNameToFull[shortName];\n }\n\n shortRuleNameToFullName(this: MixedInParser, shortName: number) {\n return this.shortRuleNameToFull[shortName];\n }\n\n public isAtEndOfInput(this: MixedInParser): boolean {\n return this.tokenMatcher(this.LA(1), EOF);\n }\n\n public reset(this: MixedInParser): void {\n this.resetLexerState();\n this.subruleIdx = 0;\n this.isBackTrackingStack = [];\n this.errors = [];\n this.RULE_STACK = [];\n // TODO: extract a specific reset for TreeBuilder trait\n this.CST_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n }\n}\n", "import {\n IParserConfig,\n IParserErrorMessageProvider,\n IRecognitionException,\n} from \"@chevrotain/types\";\nimport {\n EarlyExitException,\n isRecognitionException,\n NoViableAltException,\n} from \"../../exceptions_public.js\";\nimport { clone, has } from \"lodash-es\";\nimport {\n getLookaheadPathsForOptionalProd,\n getLookaheadPathsForOr,\n PROD_TYPE,\n} from \"../../grammar/lookahead.js\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser.js\";\n\n/**\n * Trait responsible for runtime parsing errors.\n */\nexport class ErrorHandler {\n _errors: IRecognitionException[];\n errorMessageProvider: IParserErrorMessageProvider;\n\n initErrorHandler(config: IParserConfig) {\n this._errors = [];\n this.errorMessageProvider = has(config, \"errorMessageProvider\")\n ? (config.errorMessageProvider as IParserErrorMessageProvider) // assumes end user provides the correct config value/type\n : DEFAULT_PARSER_CONFIG.errorMessageProvider;\n }\n\n SAVE_ERROR(\n this: MixedInParser,\n error: IRecognitionException,\n ): IRecognitionException {\n if (isRecognitionException(error)) {\n error.context = {\n ruleStack: this.getHumanReadableRuleStack(),\n ruleOccurrenceStack: clone(this.RULE_OCCURRENCE_STACK),\n };\n this._errors.push(error);\n return error;\n } else {\n throw Error(\n \"Trying to save an Error which is not a RecognitionException\",\n );\n }\n }\n\n get errors(): IRecognitionException[] {\n return clone(this._errors);\n }\n\n set errors(newErrors: IRecognitionException[]) {\n this._errors = newErrors;\n }\n\n // TODO: consider caching the error message computed information\n raiseEarlyExitException(\n this: MixedInParser,\n occurrence: number,\n prodType: PROD_TYPE,\n userDefinedErrMsg: string | undefined,\n ): never {\n const ruleName = this.getCurrRuleFullName();\n const ruleGrammar = this.getGAstProductions()[ruleName];\n const lookAheadPathsPerAlternative = getLookaheadPathsForOptionalProd(\n occurrence,\n ruleGrammar,\n prodType,\n this.maxLookahead,\n );\n const insideProdPaths = lookAheadPathsPerAlternative[0];\n const actualTokens = [];\n for (let i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n const msg = this.errorMessageProvider.buildEarlyExitMessage({\n expectedIterationPaths: insideProdPaths,\n actual: actualTokens,\n previous: this.LA(0),\n customUserDescription: userDefinedErrMsg,\n ruleName: ruleName,\n });\n\n throw this.SAVE_ERROR(new EarlyExitException(msg, this.LA(1), this.LA(0)));\n }\n\n // TODO: consider caching the error message computed information\n raiseNoAltException(\n this: MixedInParser,\n occurrence: number,\n errMsgTypes: string | undefined,\n ): never {\n const ruleName = this.getCurrRuleFullName();\n const ruleGrammar = this.getGAstProductions()[ruleName];\n // TODO: getLookaheadPathsForOr can be slow for large enough maxLookahead and certain grammars, consider caching ?\n const lookAheadPathsPerAlternative = getLookaheadPathsForOr(\n occurrence,\n ruleGrammar,\n this.maxLookahead,\n );\n\n const actualTokens = [];\n for (let i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n const previousToken = this.LA(0);\n\n const errMsg = this.errorMessageProvider.buildNoViableAltMessage({\n expectedPathsPerAlt: lookAheadPathsPerAlternative,\n actual: actualTokens,\n previous: previousToken,\n customUserDescription: errMsgTypes,\n ruleName: this.getCurrRuleFullName(),\n });\n\n throw this.SAVE_ERROR(\n new NoViableAltException(errMsg, this.LA(1), previousToken),\n );\n }\n}\n", "import {\n ISyntacticContentAssistPath,\n IToken,\n ITokenGrammarPath,\n TokenType,\n} from \"@chevrotain/types\";\nimport {\n NextAfterTokenWalker,\n nextPossibleTokensAfter,\n} from \"../../grammar/interpreter.js\";\nimport { first, isUndefined } from \"lodash-es\";\nimport { MixedInParser } from \"./parser_traits.js\";\n\nexport class ContentAssist {\n initContentAssist() {}\n\n public computeContentAssist(\n this: MixedInParser,\n startRuleName: string,\n precedingInput: IToken[],\n ): ISyntacticContentAssistPath[] {\n const startRuleGast = this.gastProductionsCache[startRuleName];\n\n if (isUndefined(startRuleGast)) {\n throw Error(`Rule ->${startRuleName}<- does not exist in this grammar.`);\n }\n\n return nextPossibleTokensAfter(\n [startRuleGast],\n precedingInput,\n this.tokenMatcher,\n this.maxLookahead,\n );\n }\n\n // TODO: should this be a member method or a utility? it does not have any state or usage of 'this'...\n // TODO: should this be more explicitly part of the public API?\n public getNextPossibleTokenTypes(\n this: MixedInParser,\n grammarPath: ITokenGrammarPath,\n ): TokenType[] {\n const topRuleName = first(grammarPath.ruleStack)!;\n const gastProductions = this.getGAstProductions();\n const topProduction = gastProductions[topRuleName];\n const nextPossibleTokenTypes = new NextAfterTokenWalker(\n topProduction,\n grammarPath,\n ).startWalking();\n return nextPossibleTokenTypes;\n }\n}\n", "import {\n AtLeastOneSepMethodOpts,\n ConsumeMethodOpts,\n CstNode,\n DSLMethodOpts,\n DSLMethodOptsWithErr,\n GrammarAction,\n IOrAlt,\n IParserConfig,\n IProduction,\n IToken,\n ManySepMethodOpts,\n OrMethodOpts,\n SubruleMethodOpts,\n TokenType,\n} from \"@chevrotain/types\";\nimport {\n forEach,\n has,\n isArray,\n isFunction,\n last as peek,\n some,\n} from \"lodash-es\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport {\n Alternation,\n Alternative,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Rule,\n Terminal,\n} from \"@chevrotain/gast\";\nimport { Lexer } from \"../../../scan/lexer_public.js\";\nimport {\n augmentTokenTypes,\n hasShortKeyProperty,\n} from \"../../../scan/tokens.js\";\nimport {\n createToken,\n createTokenInstance,\n} from \"../../../scan/tokens_public.js\";\nimport { END_OF_FILE } from \"../parser.js\";\nimport { BITS_FOR_OCCURRENCE_IDX } from \"../../grammar/keys.js\";\nimport { ParserMethodInternal } from \"../types.js\";\n\ntype ProdWithDef = IProduction & { definition?: IProduction[] };\nconst RECORDING_NULL_OBJECT = {\n description: \"This Object indicates the Parser is during Recording Phase\",\n};\nObject.freeze(RECORDING_NULL_OBJECT);\n\nconst HANDLE_SEPARATOR = true;\nconst MAX_METHOD_IDX = Math.pow(2, BITS_FOR_OCCURRENCE_IDX) - 1;\n\nconst RFT = createToken({ name: \"RECORDING_PHASE_TOKEN\", pattern: Lexer.NA });\naugmentTokenTypes([RFT]);\nconst RECORDING_PHASE_TOKEN = createTokenInstance(\n RFT,\n \"This IToken indicates the Parser is in Recording Phase\\n\\t\" +\n \"\" +\n \"See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details\",\n // Using \"-1\" instead of NaN (as in EOF) because an actual number is less likely to\n // cause errors if the output of LA or CONSUME would be (incorrectly) used during the recording phase.\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n);\nObject.freeze(RECORDING_PHASE_TOKEN);\n\nconst RECORDING_PHASE_CSTNODE: CstNode = {\n name:\n \"This CSTNode indicates the Parser is in Recording Phase\\n\\t\" +\n \"See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details\",\n children: {},\n};\n\n/**\n * This trait handles the creation of the GAST structure for Chevrotain Grammars\n */\nexport class GastRecorder {\n recordingProdStack: ProdWithDef[];\n RECORDING_PHASE: boolean;\n\n initGastRecorder(this: MixedInParser, config: IParserConfig): void {\n this.recordingProdStack = [];\n this.RECORDING_PHASE = false;\n }\n\n enableRecording(this: MixedInParser): void {\n this.RECORDING_PHASE = true;\n\n this.TRACE_INIT(\"Enable Recording\", () => {\n /**\n * Warning Dark Voodoo Magic upcoming!\n * We are \"replacing\" the public parsing DSL methods API\n * With **new** alternative implementations on the Parser **instance**\n *\n * So far this is the only way I've found to avoid performance regressions during parsing time.\n * - Approx 30% performance regression was measured on Chrome 75 Canary when attempting to replace the \"internal\"\n * implementations directly instead.\n */\n for (let i = 0; i < 10; i++) {\n const idx = i > 0 ? i : \"\";\n this[`CONSUME${idx}` as \"CONSUME\"] = function (arg1, arg2) {\n return this.consumeInternalRecord(arg1, i, arg2);\n };\n this[`SUBRULE${idx}` as \"SUBRULE\"] = function (arg1, arg2) {\n return this.subruleInternalRecord(arg1, i, arg2) as any;\n };\n this[`OPTION${idx}` as \"OPTION\"] = function (arg1) {\n return this.optionInternalRecord(arg1, i);\n };\n this[`OR${idx}` as \"OR\"] = function (arg1) {\n return this.orInternalRecord(arg1, i);\n };\n this[`MANY${idx}` as \"MANY\"] = function (arg1) {\n this.manyInternalRecord(i, arg1);\n };\n this[`MANY_SEP${idx}` as \"MANY_SEP\"] = function (arg1) {\n this.manySepFirstInternalRecord(i, arg1);\n };\n this[`AT_LEAST_ONE${idx}` as \"AT_LEAST_ONE\"] = function (arg1) {\n this.atLeastOneInternalRecord(i, arg1);\n };\n this[`AT_LEAST_ONE_SEP${idx}` as \"AT_LEAST_ONE_SEP\"] = function (arg1) {\n this.atLeastOneSepFirstInternalRecord(i, arg1);\n };\n }\n\n // DSL methods with the idx(suffix) as an argument\n this[`consume`] = function (idx, arg1, arg2) {\n return this.consumeInternalRecord(arg1, idx, arg2);\n };\n this[`subrule`] = function (idx, arg1, arg2) {\n return this.subruleInternalRecord(arg1, idx, arg2) as any;\n };\n this[`option`] = function (idx, arg1) {\n return this.optionInternalRecord(arg1, idx);\n };\n this[`or`] = function (idx, arg1) {\n return this.orInternalRecord(arg1, idx);\n };\n this[`many`] = function (idx, arg1) {\n this.manyInternalRecord(idx, arg1);\n };\n this[`atLeastOne`] = function (idx, arg1) {\n this.atLeastOneInternalRecord(idx, arg1);\n };\n\n this.ACTION = this.ACTION_RECORD;\n this.BACKTRACK = this.BACKTRACK_RECORD;\n this.LA = this.LA_RECORD;\n });\n }\n\n disableRecording(this: MixedInParser) {\n this.RECORDING_PHASE = false;\n // By deleting these **instance** properties, any future invocation\n // will be deferred to the original methods on the **prototype** object\n // This seems to get rid of any incorrect optimizations that V8 may\n // do during the recording phase.\n this.TRACE_INIT(\"Deleting Recording methods\", () => {\n const that: any = this;\n\n for (let i = 0; i < 10; i++) {\n const idx = i > 0 ? i : \"\";\n delete that[`CONSUME${idx}`];\n delete that[`SUBRULE${idx}`];\n delete that[`OPTION${idx}`];\n delete that[`OR${idx}`];\n delete that[`MANY${idx}`];\n delete that[`MANY_SEP${idx}`];\n delete that[`AT_LEAST_ONE${idx}`];\n delete that[`AT_LEAST_ONE_SEP${idx}`];\n }\n\n delete that[`consume`];\n delete that[`subrule`];\n delete that[`option`];\n delete that[`or`];\n delete that[`many`];\n delete that[`atLeastOne`];\n\n delete that.ACTION;\n delete that.BACKTRACK;\n delete that.LA;\n });\n }\n\n // Parser methods are called inside an ACTION?\n // Maybe try/catch/finally on ACTIONS while disabling the recorders state changes?\n // @ts-expect-error -- noop place holder\n ACTION_RECORD(this: MixedInParser, impl: () => T): T {\n // NO-OP during recording\n }\n\n // Executing backtracking logic will break our recording logic assumptions\n BACKTRACK_RECORD(\n grammarRule: (...args: any[]) => T,\n args?: any[],\n ): () => boolean {\n return () => true;\n }\n\n // LA is part of the official API and may be used for custom lookahead logic\n // by end users who may forget to wrap it in ACTION or inside a GATE\n LA_RECORD(howMuch: number): IToken {\n // We cannot use the RECORD_PHASE_TOKEN here because someone may depend\n // On LA return EOF at the end of the input so an infinite loop may occur.\n return END_OF_FILE;\n }\n\n topLevelRuleRecord(name: string, def: Function): Rule {\n try {\n const newTopLevelRule = new Rule({ definition: [], name: name });\n newTopLevelRule.name = name;\n this.recordingProdStack.push(newTopLevelRule);\n def.call(this);\n this.recordingProdStack.pop();\n return newTopLevelRule;\n } catch (originalError) {\n if (originalError.KNOWN_RECORDER_ERROR !== true) {\n try {\n originalError.message =\n originalError.message +\n '\\n\\t This error was thrown during the \"grammar recording phase\" For more info see:\\n\\t' +\n \"https://chevrotain.io/docs/guide/internals.html#grammar-recording\";\n } catch (mutabilityError) {\n // We may not be able to modify the original error object\n throw originalError;\n }\n }\n throw originalError;\n }\n }\n\n // Implementation of parsing DSL\n optionInternalRecord(\n this: MixedInParser,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n occurrence: number,\n ): OUT {\n return recordProd.call(this, Option, actionORMethodDef, occurrence);\n }\n\n atLeastOneInternalRecord(\n this: MixedInParser,\n occurrence: number,\n actionORMethodDef: GrammarAction | DSLMethodOptsWithErr,\n ): void {\n recordProd.call(this, RepetitionMandatory, actionORMethodDef, occurrence);\n }\n\n atLeastOneSepFirstInternalRecord(\n this: MixedInParser,\n occurrence: number,\n options: AtLeastOneSepMethodOpts,\n ): void {\n recordProd.call(\n this,\n RepetitionMandatoryWithSeparator,\n options,\n occurrence,\n HANDLE_SEPARATOR,\n );\n }\n\n manyInternalRecord(\n this: MixedInParser,\n occurrence: number,\n actionORMethodDef: GrammarAction | DSLMethodOpts,\n ): void {\n recordProd.call(this, Repetition, actionORMethodDef, occurrence);\n }\n\n manySepFirstInternalRecord(\n this: MixedInParser,\n occurrence: number,\n options: ManySepMethodOpts,\n ): void {\n recordProd.call(\n this,\n RepetitionWithSeparator,\n options,\n occurrence,\n HANDLE_SEPARATOR,\n );\n }\n\n orInternalRecord(\n this: MixedInParser,\n altsOrOpts: IOrAlt[] | OrMethodOpts,\n occurrence: number,\n ): T {\n return recordOrProd.call(this, altsOrOpts, occurrence);\n }\n\n subruleInternalRecord(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal,\n occurrence: number,\n options?: SubruleMethodOpts,\n ): R | CstNode {\n assertMethodIdxIsValid(occurrence);\n if (!ruleToCall || has(ruleToCall, \"ruleName\") === false) {\n const error: any = new Error(\n ` argument is invalid` +\n ` expecting a Parser method reference but got: <${JSON.stringify(\n ruleToCall,\n )}>` +\n `\\n inside top level rule: <${\n (this.recordingProdStack[0]).name\n }>`,\n );\n error.KNOWN_RECORDER_ERROR = true;\n throw error;\n }\n\n const prevProd: any = peek(this.recordingProdStack);\n const ruleName = ruleToCall.ruleName;\n const newNoneTerminal = new NonTerminal({\n idx: occurrence,\n nonTerminalName: ruleName,\n label: options?.LABEL,\n // The resolving of the `referencedRule` property will be done once all the Rule's GASTs have been created\n referencedRule: undefined,\n });\n prevProd.definition.push(newNoneTerminal);\n\n return this.outputCst\n ? RECORDING_PHASE_CSTNODE\n : RECORDING_NULL_OBJECT;\n }\n\n consumeInternalRecord(\n this: MixedInParser,\n tokType: TokenType,\n occurrence: number,\n options?: ConsumeMethodOpts,\n ): IToken {\n assertMethodIdxIsValid(occurrence);\n if (!hasShortKeyProperty(tokType)) {\n const error: any = new Error(\n ` argument is invalid` +\n ` expecting a TokenType reference but got: <${JSON.stringify(\n tokType,\n )}>` +\n `\\n inside top level rule: <${\n (this.recordingProdStack[0]).name\n }>`,\n );\n error.KNOWN_RECORDER_ERROR = true;\n throw error;\n }\n const prevProd: any = peek(this.recordingProdStack);\n const newNoneTerminal = new Terminal({\n idx: occurrence,\n terminalType: tokType,\n label: options?.LABEL,\n });\n prevProd.definition.push(newNoneTerminal);\n\n return RECORDING_PHASE_TOKEN;\n }\n}\n\nfunction recordProd(\n prodConstructor: any,\n mainProdArg: any,\n occurrence: number,\n handleSep: boolean = false,\n): any {\n assertMethodIdxIsValid(occurrence);\n const prevProd: any = peek(this.recordingProdStack);\n const grammarAction = isFunction(mainProdArg) ? mainProdArg : mainProdArg.DEF;\n\n const newProd = new prodConstructor({ definition: [], idx: occurrence });\n if (handleSep) {\n newProd.separator = mainProdArg.SEP;\n }\n if (has(mainProdArg, \"MAX_LOOKAHEAD\")) {\n newProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD;\n }\n\n this.recordingProdStack.push(newProd);\n grammarAction.call(this);\n prevProd.definition.push(newProd);\n this.recordingProdStack.pop();\n\n return RECORDING_NULL_OBJECT;\n}\n\nfunction recordOrProd(mainProdArg: any, occurrence: number): any {\n assertMethodIdxIsValid(occurrence);\n const prevProd: any = peek(this.recordingProdStack);\n // Only an array of alternatives\n const hasOptions = isArray(mainProdArg) === false;\n const alts: IOrAlt[] =\n hasOptions === false ? mainProdArg : mainProdArg.DEF;\n\n const newOrProd = new Alternation({\n definition: [],\n idx: occurrence,\n ignoreAmbiguities: hasOptions && mainProdArg.IGNORE_AMBIGUITIES === true,\n });\n if (has(mainProdArg, \"MAX_LOOKAHEAD\")) {\n newOrProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD;\n }\n\n const hasPredicates = some(alts, (currAlt: any) => isFunction(currAlt.GATE));\n newOrProd.hasPredicates = hasPredicates;\n\n prevProd.definition.push(newOrProd);\n\n forEach(alts, (currAlt) => {\n const currAltFlat = new Alternative({ definition: [] });\n newOrProd.definition.push(currAltFlat);\n if (has(currAlt, \"IGNORE_AMBIGUITIES\")) {\n currAltFlat.ignoreAmbiguities = currAlt.IGNORE_AMBIGUITIES as boolean; // assumes end user provides the correct config value/type\n }\n // **implicit** ignoreAmbiguities due to usage of gate\n else if (has(currAlt, \"GATE\")) {\n currAltFlat.ignoreAmbiguities = true;\n }\n this.recordingProdStack.push(currAltFlat);\n currAlt.ALT.call(this);\n this.recordingProdStack.pop();\n });\n return RECORDING_NULL_OBJECT;\n}\n\nfunction getIdxSuffix(idx: number): string {\n return idx === 0 ? \"\" : `${idx}`;\n}\n\nfunction assertMethodIdxIsValid(idx: number): void {\n if (idx < 0 || idx > MAX_METHOD_IDX) {\n const error: any = new Error(\n // The stack trace will contain all the needed details\n `Invalid DSL Method idx value: <${idx}>\\n\\t` +\n `Idx value must be a none negative value smaller than ${\n MAX_METHOD_IDX + 1\n }`,\n );\n error.KNOWN_RECORDER_ERROR = true;\n throw error;\n }\n}\n", "import { IParserConfig } from \"@chevrotain/types\";\nimport { has } from \"lodash-es\";\nimport { timer } from \"@chevrotain/utils\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser.js\";\n\n/**\n * Trait responsible for runtime parsing errors.\n */\nexport class PerformanceTracer {\n traceInitPerf: boolean | number;\n traceInitMaxIdent: number;\n traceInitIndent: number;\n\n initPerformanceTracer(config: IParserConfig) {\n if (has(config, \"traceInitPerf\")) {\n const userTraceInitPerf = config.traceInitPerf;\n const traceIsNumber = typeof userTraceInitPerf === \"number\";\n this.traceInitMaxIdent = traceIsNumber\n ? userTraceInitPerf\n : Infinity;\n this.traceInitPerf = traceIsNumber\n ? userTraceInitPerf > 0\n : (userTraceInitPerf as boolean); // assumes end user provides the correct config value/type\n } else {\n this.traceInitMaxIdent = 0;\n this.traceInitPerf = DEFAULT_PARSER_CONFIG.traceInitPerf;\n }\n\n this.traceInitIndent = -1;\n }\n\n TRACE_INIT(this: MixedInParser, phaseDesc: string, phaseImpl: () => T): T {\n // No need to optimize this using NOOP pattern because\n // It is not called in a hot spot...\n if (this.traceInitPerf === true) {\n this.traceInitIndent++;\n const indent = new Array(this.traceInitIndent + 1).join(\"\\t\");\n if (this.traceInitIndent < this.traceInitMaxIdent) {\n console.log(`${indent}--> <${phaseDesc}>`);\n }\n const { time, value } = timer(phaseImpl);\n /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n const traceMethod = time > 10 ? console.warn : console.log;\n if (this.traceInitIndent < this.traceInitMaxIdent) {\n traceMethod(`${indent}<-- <${phaseDesc}> time: ${time}ms`);\n }\n this.traceInitIndent--;\n return value;\n } else {\n return phaseImpl();\n }\n }\n}\n", "export function applyMixins(derivedCtor: any, baseCtors: any[]) {\n baseCtors.forEach((baseCtor) => {\n const baseProto = baseCtor.prototype;\n Object.getOwnPropertyNames(baseProto).forEach((propName) => {\n if (propName === \"constructor\") {\n return;\n }\n\n const basePropDescriptor = Object.getOwnPropertyDescriptor(\n baseProto,\n propName,\n );\n // Handle Accessors\n if (\n basePropDescriptor &&\n (basePropDescriptor.get || basePropDescriptor.set)\n ) {\n Object.defineProperty(\n derivedCtor.prototype,\n propName,\n basePropDescriptor,\n );\n } else {\n derivedCtor.prototype[propName] = baseCtor.prototype[propName];\n }\n });\n });\n}\n", "import { clone, forEach, has, isEmpty, map, values } from \"lodash-es\";\nimport { toFastProperties } from \"@chevrotain/utils\";\nimport { computeAllProdsFollows } from \"../grammar/follow.js\";\nimport { createTokenInstance, EOF } from \"../../scan/tokens_public.js\";\nimport {\n defaultGrammarValidatorErrorProvider,\n defaultParserErrorProvider,\n} from \"../errors_public.js\";\nimport {\n resolveGrammar,\n validateGrammar,\n} from \"../grammar/gast/gast_resolver_public.js\";\nimport {\n CstNode,\n IParserConfig,\n IRecognitionException,\n IRuleConfig,\n IToken,\n TokenType,\n TokenVocabulary,\n} from \"@chevrotain/types\";\nimport { Recoverable } from \"./traits/recoverable.js\";\nimport { LooksAhead } from \"./traits/looksahead.js\";\nimport { TreeBuilder } from \"./traits/tree_builder.js\";\nimport { LexerAdapter } from \"./traits/lexer_adapter.js\";\nimport { RecognizerApi } from \"./traits/recognizer_api.js\";\nimport { RecognizerEngine } from \"./traits/recognizer_engine.js\";\n\nimport { ErrorHandler } from \"./traits/error_handler.js\";\nimport { MixedInParser } from \"./traits/parser_traits.js\";\nimport { ContentAssist } from \"./traits/context_assist.js\";\nimport { GastRecorder } from \"./traits/gast_recorder.js\";\nimport { PerformanceTracer } from \"./traits/perf_tracer.js\";\nimport { applyMixins } from \"./utils/apply_mixins.js\";\nimport { IParserDefinitionError } from \"../grammar/types.js\";\nimport { Rule } from \"@chevrotain/gast\";\nimport { IParserConfigInternal, ParserMethodInternal } from \"./types.js\";\nimport { validateLookahead } from \"../grammar/checks.js\";\n\nexport const END_OF_FILE = createTokenInstance(\n EOF,\n \"\",\n NaN,\n NaN,\n NaN,\n NaN,\n NaN,\n NaN,\n);\nObject.freeze(END_OF_FILE);\n\nexport type TokenMatcher = (token: IToken, tokType: TokenType) => boolean;\n\nexport const DEFAULT_PARSER_CONFIG: Required<\n Omit\n> = Object.freeze({\n recoveryEnabled: false,\n maxLookahead: 3,\n dynamicTokensEnabled: false,\n outputCst: true,\n errorMessageProvider: defaultParserErrorProvider,\n nodeLocationTracking: \"none\",\n traceInitPerf: false,\n skipValidations: false,\n});\n\nexport const DEFAULT_RULE_CONFIG: Required> = Object.freeze({\n recoveryValueFunc: () => undefined,\n resyncEnabled: true,\n});\n\nexport enum ParserDefinitionErrorType {\n INVALID_RULE_NAME = 0,\n DUPLICATE_RULE_NAME = 1,\n INVALID_RULE_OVERRIDE = 2,\n DUPLICATE_PRODUCTIONS = 3,\n UNRESOLVED_SUBRULE_REF = 4,\n LEFT_RECURSION = 5,\n NONE_LAST_EMPTY_ALT = 6,\n AMBIGUOUS_ALTS = 7,\n CONFLICT_TOKENS_RULES_NAMESPACE = 8,\n INVALID_TOKEN_NAME = 9,\n NO_NON_EMPTY_LOOKAHEAD = 10,\n AMBIGUOUS_PREFIX_ALTS = 11,\n TOO_MANY_ALTS = 12,\n CUSTOM_LOOKAHEAD_VALIDATION = 13,\n}\n\nexport interface IParserDuplicatesDefinitionError\n extends IParserDefinitionError {\n dslName: string;\n occurrence: number;\n parameter?: string;\n}\n\nexport interface IParserEmptyAlternativeDefinitionError\n extends IParserDefinitionError {\n occurrence: number;\n alternative: number;\n}\n\nexport interface IParserAmbiguousAlternativesDefinitionError\n extends IParserDefinitionError {\n occurrence: number | string;\n alternatives: number[];\n}\n\nexport interface IParserUnresolvedRefDefinitionError\n extends IParserDefinitionError {\n unresolvedRefName: string;\n}\n\nexport interface IParserState {\n errors: IRecognitionException[];\n lexerState: any;\n RULE_STACK: number[];\n CST_STACK: CstNode[];\n}\n\nexport type Predicate = () => boolean;\n\nexport function EMPTY_ALT(): () => undefined;\nexport function EMPTY_ALT(value: T): () => T;\nexport function EMPTY_ALT(value: any = undefined) {\n return function () {\n return value;\n };\n}\n\nexport class Parser {\n // Set this flag to true if you don't want the Parser to throw error when problems in it's definition are detected.\n // (normally during the parser's constructor).\n // This is a design time flag, it will not affect the runtime error handling of the parser, just design time errors,\n // for example: duplicate rule names, referencing an unresolved subrule, ect...\n // This flag should not be enabled during normal usage, it is used in special situations, for example when\n // needing to display the parser definition errors in some GUI(online playground).\n static DEFER_DEFINITION_ERRORS_HANDLING: boolean = false;\n\n /**\n * @deprecated use the **instance** method with the same name instead\n */\n static performSelfAnalysis(parserInstance: Parser): void {\n throw Error(\n \"The **static** `performSelfAnalysis` method has been deprecated.\" +\n \"\\t\\nUse the **instance** method with the same name instead.\",\n );\n }\n\n public performSelfAnalysis(this: MixedInParser): void {\n this.TRACE_INIT(\"performSelfAnalysis\", () => {\n let defErrorsMsgs;\n\n this.selfAnalysisDone = true;\n const className = this.className;\n\n this.TRACE_INIT(\"toFastProps\", () => {\n // Without this voodoo magic the parser would be x3-x4 slower\n // It seems it is better to invoke `toFastProperties` **before**\n // Any manipulations of the `this` object done during the recording phase.\n toFastProperties(this);\n });\n\n this.TRACE_INIT(\"Grammar Recording\", () => {\n try {\n this.enableRecording();\n // Building the GAST\n forEach(this.definedRulesNames, (currRuleName) => {\n const wrappedRule = (this as any)[\n currRuleName\n ] as ParserMethodInternal;\n const originalGrammarAction = wrappedRule[\"originalGrammarAction\"];\n let recordedRuleGast!: Rule;\n this.TRACE_INIT(`${currRuleName} Rule`, () => {\n recordedRuleGast = this.topLevelRuleRecord(\n currRuleName,\n originalGrammarAction,\n );\n });\n this.gastProductionsCache[currRuleName] = recordedRuleGast;\n });\n } finally {\n this.disableRecording();\n }\n });\n\n let resolverErrors: IParserDefinitionError[] = [];\n this.TRACE_INIT(\"Grammar Resolving\", () => {\n resolverErrors = resolveGrammar({\n rules: values(this.gastProductionsCache),\n });\n this.definitionErrors = this.definitionErrors.concat(resolverErrors);\n });\n\n this.TRACE_INIT(\"Grammar Validations\", () => {\n // only perform additional grammar validations IFF no resolving errors have occurred.\n // as unresolved grammar may lead to unhandled runtime exceptions in the follow up validations.\n if (isEmpty(resolverErrors) && this.skipValidations === false) {\n const validationErrors = validateGrammar({\n rules: values(this.gastProductionsCache),\n tokenTypes: values(this.tokensMap),\n errMsgProvider: defaultGrammarValidatorErrorProvider,\n grammarName: className,\n });\n const lookaheadValidationErrors = validateLookahead({\n lookaheadStrategy: this.lookaheadStrategy,\n rules: values(this.gastProductionsCache),\n tokenTypes: values(this.tokensMap),\n grammarName: className,\n });\n this.definitionErrors = this.definitionErrors.concat(\n validationErrors,\n lookaheadValidationErrors,\n );\n }\n });\n\n // this analysis may fail if the grammar is not perfectly valid\n if (isEmpty(this.definitionErrors)) {\n // The results of these computations are not needed unless error recovery is enabled.\n if (this.recoveryEnabled) {\n this.TRACE_INIT(\"computeAllProdsFollows\", () => {\n const allFollows = computeAllProdsFollows(\n values(this.gastProductionsCache),\n );\n this.resyncFollows = allFollows;\n });\n }\n\n this.TRACE_INIT(\"ComputeLookaheadFunctions\", () => {\n this.lookaheadStrategy.initialize?.({\n rules: values(this.gastProductionsCache),\n });\n this.preComputeLookaheadFunctions(values(this.gastProductionsCache));\n });\n }\n\n if (\n !Parser.DEFER_DEFINITION_ERRORS_HANDLING &&\n !isEmpty(this.definitionErrors)\n ) {\n defErrorsMsgs = map(\n this.definitionErrors,\n (defError) => defError.message,\n );\n throw new Error(\n `Parser Definition Errors detected:\\n ${defErrorsMsgs.join(\n \"\\n-------------------------------\\n\",\n )}`,\n );\n }\n });\n }\n\n definitionErrors: IParserDefinitionError[] = [];\n selfAnalysisDone = false;\n protected skipValidations: boolean;\n\n constructor(tokenVocabulary: TokenVocabulary, config: IParserConfig) {\n const that: MixedInParser = this as any;\n that.initErrorHandler(config);\n that.initLexerAdapter();\n that.initLooksAhead(config);\n that.initRecognizerEngine(tokenVocabulary, config);\n that.initRecoverable(config);\n that.initTreeBuilder(config);\n that.initContentAssist();\n that.initGastRecorder(config);\n that.initPerformanceTracer(config);\n\n if (has(config, \"ignoredIssues\")) {\n throw new Error(\n \"The IParserConfig property has been deprecated.\\n\\t\" +\n \"Please use the flag on the relevant DSL method instead.\\n\\t\" +\n \"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\\n\\t\" +\n \"For further details.\",\n );\n }\n\n this.skipValidations = has(config, \"skipValidations\")\n ? (config.skipValidations as boolean) // casting assumes the end user passing the correct type\n : DEFAULT_PARSER_CONFIG.skipValidations;\n }\n}\n\napplyMixins(Parser, [\n Recoverable,\n LooksAhead,\n TreeBuilder,\n LexerAdapter,\n RecognizerEngine,\n RecognizerApi,\n ErrorHandler,\n ContentAssist,\n GastRecorder,\n PerformanceTracer,\n]);\n\nexport class CstParser extends Parser {\n constructor(\n tokenVocabulary: TokenVocabulary,\n config: IParserConfigInternal = DEFAULT_PARSER_CONFIG,\n ) {\n const configClone = clone(config);\n configClone.outputCst = true;\n super(tokenVocabulary, configClone);\n }\n}\n\nexport class EmbeddedActionsParser extends Parser {\n constructor(\n tokenVocabulary: TokenVocabulary,\n config: IParserConfigInternal = DEFAULT_PARSER_CONFIG,\n ) {\n const configClone = clone(config);\n configClone.outputCst = false;\n super(tokenVocabulary, configClone);\n }\n}\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport map from \"lodash-es/map.js\"\r\nimport filter from \"lodash-es/filter.js\"\r\nimport {\r\n IProduction,\r\n IProductionWithOccurrence,\r\n TokenType,\r\n Alternation,\r\n NonTerminal,\r\n Rule,\r\n Option,\r\n RepetitionMandatory,\r\n Repetition,\r\n Terminal,\r\n Alternative,\r\n RepetitionWithSeparator,\r\n RepetitionMandatoryWithSeparator,\r\n LookaheadProductionType\r\n} from \"chevrotain\"\r\n\r\nexport function buildATNKey(rule: Rule, type: LookaheadProductionType, occurrence: number): string {\r\n return `${rule.name}_${type}_${occurrence}`;\r\n}\r\n\r\nexport interface ATN {\r\n decisionMap: Record\r\n states: ATNState[]\r\n decisionStates: DecisionState[]\r\n ruleToStartState: Map\r\n ruleToStopState: Map\r\n}\r\n\r\nexport const ATN_INVALID_TYPE = 0\r\nexport const ATN_BASIC = 1\r\nexport const ATN_RULE_START = 2\r\nexport const ATN_PLUS_BLOCK_START = 4\r\nexport const ATN_STAR_BLOCK_START = 5\r\n// Currently unused as the ATN is not used for lexing\r\nexport const ATN_TOKEN_START = 6\r\nexport const ATN_RULE_STOP = 7\r\nexport const ATN_BLOCK_END = 8\r\nexport const ATN_STAR_LOOP_BACK = 9\r\nexport const ATN_STAR_LOOP_ENTRY = 10\r\nexport const ATN_PLUS_LOOP_BACK = 11\r\nexport const ATN_LOOP_END = 12\r\n\r\nexport type ATNState =\r\n | BasicState\r\n | BasicBlockStartState\r\n | PlusBlockStartState\r\n | PlusLoopbackState\r\n | StarBlockStartState\r\n | StarLoopbackState\r\n | StarLoopEntryState\r\n | BlockEndState\r\n | RuleStartState\r\n | RuleStopState\r\n | LoopEndState\r\n\r\nexport interface ATNBaseState {\r\n atn: ATN\r\n production: IProductionWithOccurrence\r\n stateNumber: number\r\n rule: Rule\r\n epsilonOnlyTransitions: boolean\r\n transitions: Transition[]\r\n nextTokenWithinRule: number[]\r\n}\r\n\r\nexport interface BasicState extends ATNBaseState {\r\n type: typeof ATN_BASIC\r\n}\r\n\r\nexport interface BlockStartState extends DecisionState {\r\n end: BlockEndState\r\n}\r\n\r\nexport interface BasicBlockStartState extends BlockStartState {\r\n type: typeof ATN_BASIC\r\n}\r\n\r\nexport interface PlusBlockStartState extends BlockStartState {\r\n loopback: PlusLoopbackState\r\n type: typeof ATN_PLUS_BLOCK_START\r\n}\r\n\r\nexport interface PlusLoopbackState extends DecisionState {\r\n type: typeof ATN_PLUS_LOOP_BACK\r\n}\r\n\r\nexport interface StarBlockStartState extends BlockStartState {\r\n type: typeof ATN_STAR_BLOCK_START\r\n}\r\n\r\nexport interface StarLoopbackState extends ATNBaseState {\r\n type: typeof ATN_STAR_LOOP_BACK\r\n}\r\n\r\nexport interface StarLoopEntryState extends DecisionState {\r\n loopback: StarLoopbackState\r\n type: typeof ATN_STAR_LOOP_ENTRY\r\n}\r\n\r\nexport interface BlockEndState extends ATNBaseState {\r\n start: BlockStartState\r\n type: typeof ATN_BLOCK_END\r\n}\r\n\r\nexport interface DecisionState extends ATNBaseState {\r\n decision: number\r\n}\r\n\r\nexport interface LoopEndState extends ATNBaseState {\r\n loopback: ATNState\r\n type: typeof ATN_LOOP_END\r\n}\r\n\r\nexport interface RuleStartState extends ATNBaseState {\r\n stop: RuleStopState\r\n type: typeof ATN_RULE_START\r\n}\r\n\r\nexport interface RuleStopState extends ATNBaseState {\r\n type: typeof ATN_RULE_STOP\r\n}\r\n\r\nexport interface Transition {\r\n target: ATNState\r\n isEpsilon(): boolean\r\n}\r\n\r\nexport abstract class AbstractTransition implements Transition {\r\n target: ATNState\r\n\r\n constructor(target: ATNState) {\r\n this.target = target\r\n }\r\n\r\n isEpsilon() {\r\n return false\r\n }\r\n}\r\n\r\nexport class AtomTransition extends AbstractTransition {\r\n tokenType: TokenType\r\n\r\n constructor(target: ATNState, tokenType: TokenType) {\r\n super(target)\r\n this.tokenType = tokenType\r\n }\r\n}\r\n\r\nexport class EpsilonTransition extends AbstractTransition {\r\n constructor(target: ATNState) {\r\n super(target)\r\n }\r\n\r\n isEpsilon() {\r\n return true\r\n }\r\n}\r\n\r\nexport class RuleTransition extends AbstractTransition {\r\n rule: Rule\r\n followState: ATNState\r\n\r\n constructor(ruleStart: RuleStartState, rule: Rule, followState: ATNState) {\r\n super(ruleStart)\r\n this.rule = rule\r\n this.followState = followState\r\n }\r\n\r\n isEpsilon() {\r\n return true\r\n }\r\n}\r\n\r\ninterface ATNHandle {\r\n left: ATNState\r\n right: ATNState\r\n}\r\n\r\nexport function createATN(rules: Rule[]): ATN {\r\n const atn: ATN = {\r\n decisionMap: {},\r\n decisionStates: [],\r\n ruleToStartState: new Map(),\r\n ruleToStopState: new Map(),\r\n states: []\r\n }\r\n createRuleStartAndStopATNStates(atn, rules)\r\n const ruleLength = rules.length\r\n for (let i = 0; i < ruleLength; i++) {\r\n const rule = rules[i]\r\n const ruleBlock = block(atn, rule, rule)\r\n if (ruleBlock === undefined) {\r\n continue\r\n }\r\n buildRuleHandle(atn, rule, ruleBlock)\r\n }\r\n return atn\r\n}\r\n\r\nfunction createRuleStartAndStopATNStates(atn: ATN, rules: Rule[]): void {\r\n const ruleLength = rules.length\r\n for (let i = 0; i < ruleLength; i++) {\r\n const rule = rules[i]\r\n const start = newState(atn, rule, undefined, {\r\n type: ATN_RULE_START\r\n })\r\n const stop = newState(atn, rule, undefined, {\r\n type: ATN_RULE_STOP\r\n })\r\n start.stop = stop\r\n atn.ruleToStartState.set(rule, start)\r\n atn.ruleToStopState.set(rule, stop)\r\n }\r\n}\r\n\r\nfunction atom(\r\n atn: ATN,\r\n rule: Rule,\r\n production: IProduction\r\n): ATNHandle | undefined {\r\n if (production instanceof Terminal) {\r\n return tokenRef(atn, rule, production.terminalType, production)\r\n } else if (production instanceof NonTerminal) {\r\n return ruleRef(atn, rule, production)\r\n } else if (production instanceof Alternation) {\r\n return alternation(atn, rule, production)\r\n } else if (production instanceof Option) {\r\n return option(atn, rule, production)\r\n } else if (production instanceof Repetition) {\r\n return repetition(atn, rule, production)\r\n } else if (production instanceof RepetitionWithSeparator) {\r\n return repetitionSep(atn, rule, production)\r\n } else if (production instanceof RepetitionMandatory) {\r\n return repetitionMandatory(atn, rule, production)\r\n } else if (production instanceof RepetitionMandatoryWithSeparator) {\r\n return repetitionMandatorySep(atn, rule, production)\r\n } else {\r\n return block(atn, rule, production as Alternative)\r\n }\r\n}\r\n\r\nfunction repetition(atn: ATN, rule: Rule, repetition: Repetition): ATNHandle {\r\n const starState = newState(atn, rule, repetition, {\r\n type: ATN_STAR_BLOCK_START\r\n })\r\n defineDecisionState(atn, starState)\r\n const handle = makeAlts(\r\n atn,\r\n rule,\r\n starState,\r\n repetition,\r\n block(atn, rule, repetition)\r\n )\r\n return star(atn, rule, repetition, handle)\r\n}\r\n\r\nfunction repetitionSep(\r\n atn: ATN,\r\n rule: Rule,\r\n repetition: RepetitionWithSeparator\r\n): ATNHandle {\r\n const starState = newState(atn, rule, repetition, {\r\n type: ATN_STAR_BLOCK_START\r\n })\r\n defineDecisionState(atn, starState)\r\n const handle = makeAlts(\r\n atn,\r\n rule,\r\n starState,\r\n repetition,\r\n block(atn, rule, repetition)\r\n )\r\n const sep = tokenRef(atn, rule, repetition.separator, repetition)\r\n return star(atn, rule, repetition, handle, sep)\r\n}\r\n\r\nfunction repetitionMandatory(\r\n atn: ATN,\r\n rule: Rule,\r\n repetition: RepetitionMandatory\r\n): ATNHandle {\r\n const plusState = newState(atn, rule, repetition, {\r\n type: ATN_PLUS_BLOCK_START\r\n })\r\n defineDecisionState(atn, plusState)\r\n const handle = makeAlts(\r\n atn,\r\n rule,\r\n plusState,\r\n repetition,\r\n block(atn, rule, repetition)\r\n )\r\n return plus(atn, rule, repetition, handle)\r\n}\r\n\r\nfunction repetitionMandatorySep(\r\n atn: ATN,\r\n rule: Rule,\r\n repetition: RepetitionMandatoryWithSeparator\r\n): ATNHandle {\r\n const plusState = newState(atn, rule, repetition, {\r\n type: ATN_PLUS_BLOCK_START\r\n })\r\n defineDecisionState(atn, plusState)\r\n const handle = makeAlts(\r\n atn,\r\n rule,\r\n plusState,\r\n repetition,\r\n block(atn, rule, repetition)\r\n )\r\n const sep = tokenRef(atn, rule, repetition.separator, repetition)\r\n return plus(atn, rule, repetition, handle, sep)\r\n}\r\n\r\nfunction alternation(\r\n atn: ATN,\r\n rule: Rule,\r\n alternation: Alternation\r\n): ATNHandle {\r\n const start = newState(atn, rule, alternation, {\r\n type: ATN_BASIC\r\n })\r\n defineDecisionState(atn, start)\r\n const alts = map(alternation.definition, (e) => atom(atn, rule, e))\r\n const handle = makeAlts(atn, rule, start, alternation, ...alts)\r\n return handle\r\n}\r\n\r\nfunction option(atn: ATN, rule: Rule, option: Option): ATNHandle {\r\n const start = newState(atn, rule, option, {\r\n type: ATN_BASIC\r\n })\r\n defineDecisionState(atn, start)\r\n const handle = makeAlts(atn, rule, start, option, block(atn, rule, option))\r\n return optional(atn, rule, option, handle)\r\n}\r\n\r\nfunction block(\r\n atn: ATN,\r\n rule: Rule,\r\n block: { definition: IProduction[] }\r\n): ATNHandle | undefined {\r\n const handles = filter(\r\n map(block.definition, (e) => atom(atn, rule, e)),\r\n (e) => e !== undefined\r\n ) as ATNHandle[]\r\n if (handles.length === 1) {\r\n return handles[0]\r\n } else if (handles.length === 0) {\r\n return undefined\r\n } else {\r\n return makeBlock(atn, handles)\r\n }\r\n}\r\n\r\nfunction plus(\r\n atn: ATN,\r\n rule: Rule,\r\n plus: IProductionWithOccurrence,\r\n handle: ATNHandle,\r\n sep?: ATNHandle\r\n): ATNHandle {\r\n const blkStart = handle.left as PlusBlockStartState\r\n const blkEnd = handle.right\r\n\r\n const loop = newState(atn, rule, plus, {\r\n type: ATN_PLUS_LOOP_BACK\r\n })\r\n defineDecisionState(atn, loop)\r\n const end = newState(atn, rule, plus, {\r\n type: ATN_LOOP_END\r\n })\r\n blkStart.loopback = loop\r\n end.loopback = loop\r\n atn.decisionMap[buildATNKey(rule, sep ? 'RepetitionMandatoryWithSeparator' : 'RepetitionMandatory', plus.idx)] = loop;\r\n epsilon(blkEnd, loop) // block can see loop back\r\n\r\n // Depending on whether we have a separator we put the exit transition at index 1 or 0\r\n // This influences the chosen option in the lookahead DFA\r\n if (sep === undefined) {\r\n epsilon(loop, blkStart) // loop back to start\r\n epsilon(loop, end) // exit\r\n } else {\r\n epsilon(loop, end) // exit\r\n // loop back to start with separator\r\n epsilon(loop, sep.left)\r\n epsilon(sep.right, blkStart)\r\n }\r\n\r\n return {\r\n left: blkStart,\r\n right: end\r\n }\r\n}\r\n\r\nfunction star(\r\n atn: ATN,\r\n rule: Rule,\r\n star: IProductionWithOccurrence,\r\n handle: ATNHandle,\r\n sep?: ATNHandle\r\n): ATNHandle {\r\n const start = handle.left\r\n const end = handle.right\r\n\r\n const entry = newState(atn, rule, star, {\r\n type: ATN_STAR_LOOP_ENTRY\r\n })\r\n defineDecisionState(atn, entry)\r\n const loopEnd = newState(atn, rule, star, {\r\n type: ATN_LOOP_END\r\n })\r\n const loop = newState(atn, rule, star, {\r\n type: ATN_STAR_LOOP_BACK\r\n })\r\n entry.loopback = loop\r\n loopEnd.loopback = loop\r\n\r\n epsilon(entry, start) // loop enter edge (alt 2)\r\n epsilon(entry, loopEnd) // bypass loop edge (alt 1)\r\n epsilon(end, loop) // block end hits loop back\r\n\r\n if (sep !== undefined) {\r\n epsilon(loop, loopEnd) // end loop\r\n // loop back to start of handle using separator\r\n epsilon(loop, sep.left)\r\n epsilon(sep.right, start)\r\n } else {\r\n epsilon(loop, entry) // loop back to entry/exit decision\r\n }\r\n\r\n atn.decisionMap[buildATNKey(rule, sep ? 'RepetitionWithSeparator' : 'Repetition', star.idx)] = entry;\r\n return {\r\n left: entry,\r\n right: loopEnd\r\n }\r\n}\r\n\r\nfunction optional(atn: ATN, rule: Rule, optional: Option, handle: ATNHandle): ATNHandle {\r\n const start = handle.left as DecisionState\r\n const end = handle.right\r\n\r\n epsilon(start, end)\r\n\r\n atn.decisionMap[buildATNKey(rule, 'Option', optional.idx)] = start;\r\n return handle\r\n}\r\n\r\nfunction defineDecisionState(atn: ATN, state: DecisionState): number {\r\n atn.decisionStates.push(state)\r\n state.decision = atn.decisionStates.length - 1\r\n return state.decision\r\n}\r\n\r\nfunction makeAlts(\r\n atn: ATN,\r\n rule: Rule,\r\n start: BlockStartState,\r\n production: IProductionWithOccurrence,\r\n ...alts: (ATNHandle | undefined)[]\r\n): ATNHandle {\r\n const end = newState(atn, rule, production, {\r\n type: ATN_BLOCK_END,\r\n start\r\n })\r\n start.end = end\r\n for (const alt of alts) {\r\n if (alt !== undefined) {\r\n // hook alts up to decision block\r\n epsilon(start, alt.left)\r\n epsilon(alt.right, end)\r\n } else {\r\n epsilon(start, end)\r\n }\r\n }\r\n\r\n const handle: ATNHandle = {\r\n left: start as ATNState,\r\n right: end\r\n }\r\n atn.decisionMap[buildATNKey(rule, getProdType(production), production.idx)] = start\r\n return handle\r\n}\r\n\r\nfunction getProdType(production: IProduction): LookaheadProductionType {\r\n if (production instanceof Alternation) {\r\n return 'Alternation';\r\n } else if (production instanceof Option) {\r\n return 'Option';\r\n } else if (production instanceof Repetition) {\r\n return 'Repetition';\r\n } else if (production instanceof RepetitionWithSeparator) {\r\n return 'RepetitionWithSeparator';\r\n } else if (production instanceof RepetitionMandatory) {\r\n return 'RepetitionMandatory';\r\n } else if (production instanceof RepetitionMandatoryWithSeparator) {\r\n return 'RepetitionMandatoryWithSeparator';\r\n } else {\r\n throw new Error('Invalid production type encountered');\r\n }\r\n}\r\n\r\nfunction makeBlock(atn: ATN, alts: ATNHandle[]): ATNHandle {\r\n const altsLength = alts.length\r\n for (let i = 0; i < altsLength - 1; i++) {\r\n const handle = alts[i]\r\n let transition: Transition | undefined\r\n if (handle.left.transitions.length === 1) {\r\n transition = handle.left.transitions[0]\r\n }\r\n const isRuleTransition = transition instanceof RuleTransition\r\n const ruleTransition = transition as RuleTransition\r\n const next = alts[i + 1].left\r\n if (\r\n handle.left.type === ATN_BASIC &&\r\n handle.right.type === ATN_BASIC &&\r\n transition !== undefined &&\r\n ((isRuleTransition && ruleTransition.followState === handle.right) ||\r\n transition.target === handle.right)\r\n ) {\r\n // we can avoid epsilon edge to next element\r\n if (isRuleTransition) {\r\n ruleTransition.followState = next\r\n } else {\r\n transition.target = next\r\n }\r\n removeState(atn, handle.right) // we skipped over this state\r\n } else {\r\n // need epsilon if previous block's right end node is complex\r\n epsilon(handle.right, next)\r\n }\r\n }\r\n\r\n const first = alts[0]\r\n const last = alts[altsLength - 1]\r\n return {\r\n left: first.left,\r\n right: last.right\r\n }\r\n}\r\n\r\nfunction tokenRef(\r\n atn: ATN,\r\n rule: Rule,\r\n tokenType: TokenType,\r\n production: IProductionWithOccurrence\r\n): ATNHandle {\r\n const left = newState(atn, rule, production, {\r\n type: ATN_BASIC\r\n })\r\n const right = newState(atn, rule, production, {\r\n type: ATN_BASIC\r\n })\r\n addTransition(left, new AtomTransition(right, tokenType))\r\n return {\r\n left,\r\n right\r\n }\r\n}\r\n\r\nfunction ruleRef(\r\n atn: ATN,\r\n currentRule: Rule,\r\n nonTerminal: NonTerminal\r\n): ATNHandle {\r\n const rule = nonTerminal.referencedRule\r\n const start = atn.ruleToStartState.get(rule)!\r\n const left = newState(atn, currentRule, nonTerminal, {\r\n type: ATN_BASIC\r\n })\r\n const right = newState(atn, currentRule, nonTerminal, {\r\n type: ATN_BASIC\r\n })\r\n\r\n const call = new RuleTransition(start, rule, right)\r\n addTransition(left, call)\r\n\r\n return {\r\n left,\r\n right\r\n }\r\n}\r\n\r\nfunction buildRuleHandle(atn: ATN, rule: Rule, block: ATNHandle): ATNHandle {\r\n const start = atn.ruleToStartState.get(rule)!\r\n epsilon(start, block.left)\r\n const stop = atn.ruleToStopState.get(rule)!\r\n epsilon(block.right, stop)\r\n const handle: ATNHandle = {\r\n left: start,\r\n right: stop\r\n }\r\n return handle\r\n}\r\n\r\nfunction epsilon(a: ATNBaseState, b: ATNBaseState): void {\r\n const transition = new EpsilonTransition(b as ATNState)\r\n addTransition(a, transition)\r\n}\r\n\r\nfunction newState(\r\n atn: ATN,\r\n rule: Rule,\r\n production: IProductionWithOccurrence | undefined,\r\n partial: Partial\r\n): T {\r\n const t: T = {\r\n atn,\r\n production,\r\n epsilonOnlyTransitions: false,\r\n rule,\r\n transitions: [],\r\n nextTokenWithinRule: [],\r\n stateNumber: atn.states.length,\r\n ...partial\r\n } as unknown as T\r\n atn.states.push(t)\r\n return t\r\n}\r\n\r\nfunction addTransition(state: ATNBaseState, transition: Transition) {\r\n // A single ATN state can only contain epsilon transitions or non-epsilon transitions\r\n // Because they are never mixed, only setting the property for the first transition is fine\r\n if (state.transitions.length === 0) {\r\n state.epsilonOnlyTransitions = transition.isEpsilon()\r\n }\r\n state.transitions.push(transition)\r\n}\r\n\r\nfunction removeState(atn: ATN, state: ATNState): void {\r\n atn.states.splice(atn.states.indexOf(state), 1)\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport map from \"lodash-es/map.js\"\r\nimport { ATNState, DecisionState } from \"./atn.js\"\r\n\r\nexport interface DFA {\r\n start?: DFAState\r\n states: Record\r\n decision: number\r\n atnStartState: DecisionState\r\n}\r\n\r\nexport interface DFAState {\r\n configs: ATNConfigSet\r\n edges: Record\r\n isAcceptState: boolean\r\n prediction: number\r\n}\r\n\r\nexport const DFA_ERROR = {} as DFAState\r\n\r\nexport interface ATNConfig {\r\n state: ATNState\r\n alt: number\r\n stack: ATNState[]\r\n}\r\n\r\nexport class ATNConfigSet {\r\n private map: Record = {}\r\n private configs: ATNConfig[] = []\r\n\r\n uniqueAlt: number | undefined\r\n\r\n get size(): number {\r\n return this.configs.length\r\n }\r\n\r\n finalize(): void {\r\n // Empties the map to free up memory\r\n this.map = {}\r\n }\r\n\r\n add(config: ATNConfig): void {\r\n const key = getATNConfigKey(config)\r\n // Only add configs which don't exist in our map already\r\n // While this does not influence the actual algorithm, adding them anyway would massively increase memory consumption\r\n if (!(key in this.map)) {\r\n this.map[key] = this.configs.length\r\n this.configs.push(config)\r\n }\r\n }\r\n\r\n get elements(): readonly ATNConfig[] {\r\n return this.configs\r\n }\r\n\r\n get alts(): number[] {\r\n return map(this.configs, (e) => e.alt)\r\n }\r\n\r\n get key(): string {\r\n let value = \"\"\r\n for (const k in this.map) {\r\n value += k + \":\"\r\n }\r\n return value\r\n }\r\n}\r\n\r\nexport function getATNConfigKey(config: ATNConfig, alt = true) {\r\n return `${alt ? `a${config.alt}` : \"\"}s${\r\n config.state.stateNumber\r\n }:${config.stack.map((e) => e.stateNumber.toString()).join(\"_\")}`\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport {\r\n IToken,\r\n TokenType,\r\n tokenMatcher,\r\n tokenLabel,\r\n Rule,\r\n IProductionWithOccurrence,\r\n NonTerminal,\r\n Alternation,\r\n Option,\r\n RepetitionMandatory,\r\n RepetitionMandatoryWithSeparator,\r\n RepetitionWithSeparator,\r\n Repetition,\r\n Terminal,\r\n BaseParser,\r\n LLkLookaheadStrategy,\r\n ILookaheadValidationError,\r\n IOrAlt,\r\n getLookaheadPaths,\r\n OptionalProductionType\r\n} from \"chevrotain\";\r\nimport {\r\n ATN,\r\n ATNState,\r\n ATN_RULE_STOP,\r\n AtomTransition,\r\n buildATNKey,\r\n createATN,\r\n DecisionState,\r\n EpsilonTransition,\r\n RuleTransition,\r\n Transition\r\n} from \"./atn.js\";\r\nimport {\r\n ATNConfig,\r\n ATNConfigSet,\r\n DFA,\r\n DFAState,\r\n DFA_ERROR,\r\n getATNConfigKey\r\n} from \"./dfa.js\";\r\nimport min from \"lodash-es/min.js\";\r\nimport flatMap from \"lodash-es/flatMap.js\";\r\nimport uniqBy from \"lodash-es/uniqBy.js\";\r\nimport map from \"lodash-es/map.js\";\r\nimport flatten from \"lodash-es/flatten.js\";\r\nimport forEach from \"lodash-es/forEach.js\";\r\nimport isEmpty from \"lodash-es/isEmpty.js\";\r\nimport reduce from \"lodash-es/reduce.js\";\r\n\r\ntype DFACache = (predicateSet: PredicateSet) => DFA\r\n\r\nexport type AmbiguityReport = (message: string) => void;\r\n\r\nfunction createDFACache(startState: DecisionState, decision: number): DFACache {\r\n const map: Record = {}\r\n return (predicateSet) => {\r\n const key = predicateSet.toString()\r\n let existing = map[key]\r\n if (existing !== undefined) {\r\n return existing\r\n } else {\r\n existing = {\r\n atnStartState: startState,\r\n decision,\r\n states: {}\r\n }\r\n map[key] = existing\r\n return existing\r\n }\r\n }\r\n}\r\n\r\nclass PredicateSet {\r\n private predicates: boolean[] = []\r\n\r\n is(index: number): boolean {\r\n return index >= this.predicates.length || this.predicates[index]\r\n }\r\n\r\n set(index: number, value: boolean) {\r\n this.predicates[index] = value\r\n }\r\n\r\n toString(): string {\r\n let value = \"\"\r\n const size = this.predicates.length\r\n for (let i = 0; i < size; i++) {\r\n value += this.predicates[i] === true ? \"1\" : \"0\"\r\n }\r\n return value\r\n }\r\n}\r\n\r\ninterface AdaptivePredictError {\r\n tokenPath: IToken[]\r\n possibleTokenTypes: TokenType[]\r\n actualToken: IToken\r\n}\r\n\r\nconst EMPTY_PREDICATES = new PredicateSet()\r\n\r\nexport interface LLStarLookaheadOptions {\r\n logging?: AmbiguityReport\r\n}\r\n\r\nexport class LLStarLookaheadStrategy extends LLkLookaheadStrategy {\r\n\r\n private atn: ATN;\r\n private dfas: DFACache[];\r\n private logging: AmbiguityReport;\r\n\r\n constructor(options?: LLStarLookaheadOptions) {\r\n super();\r\n this.logging = options?.logging ?? ((message) => console.log(message));\r\n }\r\n\r\n override initialize(options: { rules: Rule[] }): void {\r\n this.atn = createATN(options.rules);\r\n this.dfas = initATNSimulator(this.atn);\r\n }\r\n\r\n override validateAmbiguousAlternationAlternatives(): ILookaheadValidationError[] {\r\n return [];\r\n }\r\n\r\n override validateEmptyOrAlternatives(): ILookaheadValidationError[] {\r\n return [];\r\n }\r\n\r\n override buildLookaheadForAlternation(options: {\r\n prodOccurrence: number;\r\n rule: Rule;\r\n maxLookahead: number;\r\n hasPredicates: boolean;\r\n dynamicTokensEnabled: boolean\r\n }): (this: BaseParser, orAlts?: IOrAlt[] | undefined) => number | undefined {\r\n const { prodOccurrence, rule, hasPredicates, dynamicTokensEnabled } = options;\r\n const dfas = this.dfas;\r\n const logging = this.logging;\r\n const key = buildATNKey(rule, 'Alternation', prodOccurrence);\r\n const decisionState = this.atn.decisionMap[key];\r\n const decisionIndex = decisionState.decision;\r\n const partialAlts: (TokenType | undefined)[][] = map(\r\n getLookaheadPaths({\r\n maxLookahead: 1,\r\n occurrence: prodOccurrence,\r\n prodType: \"Alternation\",\r\n rule: rule\r\n }),\r\n (currAlt) => map(currAlt, (path) => path[0])\r\n )\r\n\r\n if (isLL1Sequence(partialAlts, false) && !dynamicTokensEnabled) {\r\n const choiceToAlt = reduce(\r\n partialAlts,\r\n (result, currAlt, idx) => {\r\n forEach(currAlt, (currTokType) => {\r\n if (currTokType) {\r\n result[currTokType.tokenTypeIdx!] = idx\r\n forEach(currTokType.categoryMatches!, (currExtendingType) => {\r\n result[currExtendingType] = idx\r\n })\r\n }\r\n })\r\n return result\r\n },\r\n {} as Record\r\n )\r\n\r\n if (hasPredicates) {\r\n return function (this: BaseParser, orAlts) {\r\n const nextToken = this.LA(1)\r\n const prediction: number | undefined = choiceToAlt[nextToken.tokenTypeIdx]\r\n if (orAlts !== undefined && prediction !== undefined) {\r\n const gate = orAlts[prediction]?.GATE\r\n if (gate !== undefined && gate.call(this) === false) {\r\n return undefined;\r\n }\r\n }\r\n return prediction\r\n }\r\n } else {\r\n return function (this: BaseParser): number | undefined {\r\n const nextToken = this.LA(1)\r\n return choiceToAlt[nextToken.tokenTypeIdx];\r\n }\r\n }\r\n } else if (hasPredicates) {\r\n return function (this: BaseParser, orAlts) {\r\n const predicates = new PredicateSet()\r\n const length = orAlts === undefined ? 0 : orAlts.length\r\n for (let i = 0; i < length; i++) {\r\n const gate = orAlts?.[i].GATE\r\n predicates.set(i, gate === undefined || gate.call(this))\r\n }\r\n const result = adaptivePredict.call(this, dfas, decisionIndex, predicates, logging);\r\n return typeof result === 'number' ? result : undefined;\r\n }\r\n } else {\r\n return function (this: BaseParser) {\r\n const result = adaptivePredict.call(this, dfas, decisionIndex, EMPTY_PREDICATES, logging);\r\n return typeof result === 'number' ? result : undefined;\r\n }\r\n }\r\n }\r\n\r\n override buildLookaheadForOptional(options: {\r\n prodOccurrence: number;\r\n prodType: OptionalProductionType;\r\n rule: Rule;\r\n maxLookahead: number;\r\n dynamicTokensEnabled: boolean\r\n }): (this: BaseParser) => boolean {\r\n const { prodOccurrence, rule, prodType, dynamicTokensEnabled } = options;\r\n const dfas = this.dfas;\r\n const logging = this.logging;\r\n const key = buildATNKey(rule, prodType, prodOccurrence);\r\n const decisionState = this.atn.decisionMap[key];\r\n const decisionIndex = decisionState.decision;\r\n const alts = map(\r\n getLookaheadPaths({\r\n maxLookahead: 1,\r\n occurrence: prodOccurrence,\r\n prodType,\r\n rule\r\n }),\r\n (e) => {\r\n return map(e, (g) => g[0])\r\n }\r\n )\r\n \r\n if (isLL1Sequence(alts) && alts[0][0] && !dynamicTokensEnabled) {\r\n const alt = alts[0]\r\n const singleTokensTypes = flatten(alt)\r\n \r\n if (\r\n singleTokensTypes.length === 1 &&\r\n isEmpty(singleTokensTypes[0].categoryMatches)\r\n ) {\r\n const expectedTokenType = singleTokensTypes[0]\r\n const expectedTokenUniqueKey = expectedTokenType.tokenTypeIdx\r\n \r\n return function (this: BaseParser): boolean {\r\n return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey\r\n }\r\n } else {\r\n const choiceToAlt = reduce(\r\n singleTokensTypes,\r\n (result, currTokType) => {\r\n if (currTokType !== undefined) {\r\n result[currTokType.tokenTypeIdx!] = true\r\n forEach(currTokType.categoryMatches, (currExtendingType) => {\r\n result[currExtendingType] = true\r\n })\r\n }\r\n return result\r\n },\r\n {} as Record\r\n )\r\n \r\n return function (this: BaseParser): boolean {\r\n const nextToken = this.LA(1)\r\n return choiceToAlt[nextToken.tokenTypeIdx] === true\r\n }\r\n }\r\n }\r\n return function (this: BaseParser) {\r\n const result = adaptivePredict.call(this, dfas, decisionIndex, EMPTY_PREDICATES, logging)\r\n return typeof result === \"object\" ? false : result === 0;\r\n }\r\n }\r\n\r\n}\r\n\r\nfunction isLL1Sequence(sequences: (TokenType | undefined)[][], allowEmpty = true): boolean {\r\n const fullSet = new Set()\r\n\r\n for (const alt of sequences) {\r\n const altSet = new Set()\r\n for (const tokType of alt) {\r\n if (tokType === undefined) {\r\n if (allowEmpty) {\r\n // Epsilon production encountered\r\n break\r\n } else {\r\n return false;\r\n }\r\n }\r\n const indices = [tokType.tokenTypeIdx!].concat(tokType.categoryMatches!)\r\n for (const index of indices) {\r\n if (fullSet.has(index)) {\r\n if (!altSet.has(index)) {\r\n return false\r\n }\r\n } else {\r\n fullSet.add(index)\r\n altSet.add(index)\r\n }\r\n }\r\n }\r\n }\r\n return true\r\n}\r\n\r\nfunction initATNSimulator(atn: ATN): DFACache[] {\r\n const decisionLength = atn.decisionStates.length\r\n const decisionToDFA: DFACache[] = Array(decisionLength)\r\n for (let i = 0; i < decisionLength; i++) {\r\n decisionToDFA[i] = createDFACache(atn.decisionStates[i], i)\r\n }\r\n return decisionToDFA;\r\n}\r\n\r\nfunction adaptivePredict(\r\n this: BaseParser,\r\n dfaCaches: DFACache[],\r\n decision: number,\r\n predicateSet: PredicateSet,\r\n logging: AmbiguityReport\r\n): number | AdaptivePredictError {\r\n const dfa = dfaCaches[decision](predicateSet)\r\n let start = dfa.start\r\n if (start === undefined) {\r\n const closure = computeStartState(dfa.atnStartState as ATNState)\r\n start = addDFAState(dfa, newDFAState(closure))\r\n dfa.start = start\r\n }\r\n\r\n const alt = performLookahead.apply(this, [dfa, start, predicateSet, logging])\r\n return alt\r\n}\r\n\r\nfunction performLookahead(\r\n this: BaseParser,\r\n dfa: DFA,\r\n s0: DFAState,\r\n predicateSet: PredicateSet,\r\n logging: AmbiguityReport\r\n): number | AdaptivePredictError {\r\n let previousD = s0\r\n\r\n let i = 1\r\n const path: IToken[] = []\r\n let t = this.LA(i++)\r\n\r\n while (true) {\r\n let d = getExistingTargetState(previousD, t)\r\n if (d === undefined) {\r\n d = computeLookaheadTarget.apply(this, [dfa, previousD, t, i, predicateSet, logging])\r\n }\r\n\r\n if (d === DFA_ERROR) {\r\n return buildAdaptivePredictError(path, previousD, t)\r\n }\r\n\r\n if (d.isAcceptState === true) {\r\n return d.prediction\r\n }\r\n\r\n previousD = d\r\n path.push(t)\r\n t = this.LA(i++)\r\n }\r\n}\r\n\r\nfunction computeLookaheadTarget(\r\n this: BaseParser,\r\n dfa: DFA,\r\n previousD: DFAState,\r\n token: IToken,\r\n lookahead: number,\r\n predicateSet: PredicateSet,\r\n logging: AmbiguityReport\r\n): DFAState {\r\n const reach = computeReachSet(previousD.configs, token, predicateSet)\r\n if (reach.size === 0) {\r\n addDFAEdge(dfa, previousD, token, DFA_ERROR)\r\n return DFA_ERROR\r\n }\r\n\r\n let newState = newDFAState(reach)\r\n const predictedAlt = getUniqueAlt(reach, predicateSet)\r\n\r\n if (predictedAlt !== undefined) {\r\n newState.isAcceptState = true\r\n newState.prediction = predictedAlt\r\n newState.configs.uniqueAlt = predictedAlt\r\n } else if (hasConflictTerminatingPrediction(reach)) {\r\n const prediction = min(reach.alts)!\r\n newState.isAcceptState = true\r\n newState.prediction = prediction\r\n newState.configs.uniqueAlt = prediction\r\n reportLookaheadAmbiguity.apply(this, [dfa, lookahead, reach.alts, logging])\r\n }\r\n\r\n newState = addDFAEdge(dfa, previousD, token, newState)\r\n return newState\r\n}\r\n\r\nfunction reportLookaheadAmbiguity(\r\n this: BaseParser,\r\n dfa: DFA,\r\n lookahead: number,\r\n ambiguityIndices: number[],\r\n logging: AmbiguityReport\r\n) {\r\n const prefixPath: TokenType[] = []\r\n for (let i = 1; i <= lookahead; i++) {\r\n prefixPath.push(this.LA(i).tokenType)\r\n }\r\n const atnState = dfa.atnStartState\r\n const topLevelRule = atnState.rule\r\n const production = atnState.production\r\n const message = buildAmbiguityError({\r\n topLevelRule,\r\n ambiguityIndices,\r\n production,\r\n prefixPath\r\n })\r\n logging(message)\r\n}\r\n\r\nfunction buildAmbiguityError(options: {\r\n topLevelRule: Rule\r\n prefixPath: TokenType[]\r\n ambiguityIndices: number[]\r\n production: IProductionWithOccurrence\r\n}): string {\r\n const pathMsg = map(options.prefixPath, (currtok) =>\r\n tokenLabel(currtok)\r\n ).join(\", \")\r\n const occurrence =\r\n options.production.idx === 0 ? \"\" : options.production.idx\r\n let currMessage =\r\n `Ambiguous Alternatives Detected: <${options.ambiguityIndices.join(\r\n \", \"\r\n )}> in <${getProductionDslName(options.production)}${occurrence}>` +\r\n ` inside <${options.topLevelRule.name}> Rule,\\n` +\r\n `<${pathMsg}> may appears as a prefix path in all these alternatives.\\n`\r\n\r\n currMessage =\r\n currMessage +\r\n `See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\\n` +\r\n `For Further details.`\r\n return currMessage\r\n}\r\n\r\nfunction getProductionDslName(prod: IProductionWithOccurrence): string {\r\n if (prod instanceof NonTerminal) {\r\n return \"SUBRULE\"\r\n } else if (prod instanceof Option) {\r\n return \"OPTION\"\r\n } else if (prod instanceof Alternation) {\r\n return \"OR\"\r\n } else if (prod instanceof RepetitionMandatory) {\r\n return \"AT_LEAST_ONE\"\r\n } else if (prod instanceof RepetitionMandatoryWithSeparator) {\r\n return \"AT_LEAST_ONE_SEP\"\r\n } else if (prod instanceof RepetitionWithSeparator) {\r\n return \"MANY_SEP\"\r\n } else if (prod instanceof Repetition) {\r\n return \"MANY\"\r\n } else if (prod instanceof Terminal) {\r\n return \"CONSUME\"\r\n } else {\r\n throw Error(\"non exhaustive match\")\r\n }\r\n}\r\n\r\nfunction buildAdaptivePredictError(\r\n path: IToken[],\r\n previous: DFAState,\r\n current: IToken\r\n): AdaptivePredictError {\r\n const nextTransitions = flatMap(\r\n previous.configs.elements,\r\n (e) => e.state.transitions\r\n )\r\n const nextTokenTypes = uniqBy(\r\n nextTransitions\r\n .filter((e): e is AtomTransition => e instanceof AtomTransition)\r\n .map((e) => e.tokenType),\r\n (e) => e.tokenTypeIdx\r\n )\r\n return {\r\n actualToken: current,\r\n possibleTokenTypes: nextTokenTypes,\r\n tokenPath: path\r\n }\r\n}\r\n\r\nfunction getExistingTargetState(\r\n state: DFAState,\r\n token: IToken\r\n): DFAState | undefined {\r\n return state.edges[token.tokenTypeIdx]\r\n}\r\n\r\nfunction computeReachSet(\r\n configs: ATNConfigSet,\r\n token: IToken,\r\n predicateSet: PredicateSet\r\n): ATNConfigSet {\r\n const intermediate = new ATNConfigSet()\r\n const skippedStopStates: ATNConfig[] = []\r\n\r\n for (const c of configs.elements) {\r\n if (predicateSet.is(c.alt) === false) {\r\n continue\r\n }\r\n if (c.state.type === ATN_RULE_STOP) {\r\n skippedStopStates.push(c)\r\n continue\r\n }\r\n const transitionLength = c.state.transitions.length\r\n for (let i = 0; i < transitionLength; i++) {\r\n const transition = c.state.transitions[i]\r\n const target = getReachableTarget(transition, token)\r\n if (target !== undefined) {\r\n intermediate.add({\r\n state: target,\r\n alt: c.alt,\r\n stack: c.stack\r\n })\r\n }\r\n }\r\n }\r\n\r\n let reach: ATNConfigSet | undefined\r\n\r\n if (skippedStopStates.length === 0 && intermediate.size === 1) {\r\n reach = intermediate\r\n }\r\n\r\n if (reach === undefined) {\r\n reach = new ATNConfigSet()\r\n for (const c of intermediate.elements) {\r\n closure(c, reach)\r\n }\r\n }\r\n\r\n if (skippedStopStates.length > 0 && !hasConfigInRuleStopState(reach)) {\r\n for (const c of skippedStopStates) {\r\n reach.add(c)\r\n }\r\n }\r\n\r\n return reach\r\n}\r\n\r\nfunction getReachableTarget(\r\n transition: Transition,\r\n token: IToken\r\n): ATNState | undefined {\r\n if (\r\n transition instanceof AtomTransition &&\r\n tokenMatcher(token, transition.tokenType)\r\n ) {\r\n return transition.target\r\n }\r\n return undefined\r\n}\r\n\r\nfunction getUniqueAlt(\r\n configs: ATNConfigSet,\r\n predicateSet: PredicateSet\r\n): number | undefined {\r\n let alt: number | undefined\r\n for (const c of configs.elements) {\r\n if (predicateSet.is(c.alt) === true) {\r\n if (alt === undefined) {\r\n alt = c.alt\r\n } else if (alt !== c.alt) {\r\n return undefined\r\n }\r\n }\r\n }\r\n return alt\r\n}\r\n\r\nfunction newDFAState(closure: ATNConfigSet): DFAState {\r\n return {\r\n configs: closure,\r\n edges: {},\r\n isAcceptState: false,\r\n prediction: -1\r\n }\r\n}\r\n\r\nfunction addDFAEdge(\r\n dfa: DFA,\r\n from: DFAState,\r\n token: IToken,\r\n to: DFAState\r\n): DFAState {\r\n to = addDFAState(dfa, to)\r\n from.edges[token.tokenTypeIdx] = to\r\n return to\r\n}\r\n\r\nfunction addDFAState(dfa: DFA, state: DFAState): DFAState {\r\n if (state === DFA_ERROR) {\r\n return state\r\n }\r\n // Repetitions have the same config set\r\n // Therefore, storing the key of the config in a map allows us to create a loop in our DFA\r\n const mapKey = state.configs.key\r\n const existing = dfa.states[mapKey]\r\n if (existing !== undefined) {\r\n return existing\r\n }\r\n state.configs.finalize()\r\n dfa.states[mapKey] = state\r\n return state\r\n}\r\n\r\nfunction computeStartState(atnState: ATNState): ATNConfigSet {\r\n const configs = new ATNConfigSet()\r\n\r\n const numberOfTransitions = atnState.transitions.length\r\n for (let i = 0; i < numberOfTransitions; i++) {\r\n const target = atnState.transitions[i].target\r\n const config: ATNConfig = {\r\n state: target,\r\n alt: i,\r\n stack: []\r\n }\r\n closure(config, configs)\r\n }\r\n\r\n return configs\r\n}\r\n\r\nfunction closure(config: ATNConfig, configs: ATNConfigSet): void {\r\n const p = config.state\r\n\r\n if (p.type === ATN_RULE_STOP) {\r\n if (config.stack.length > 0) {\r\n const atnStack = [...config.stack]\r\n const followState = atnStack.pop()!\r\n const followConfig: ATNConfig = {\r\n state: followState,\r\n alt: config.alt,\r\n stack: atnStack\r\n }\r\n closure(followConfig, configs)\r\n } else {\r\n // Dipping into outer context, simply add the config\r\n // This will stop computation once every config is at the rule stop state\r\n configs.add(config)\r\n }\r\n return\r\n }\r\n\r\n if (!p.epsilonOnlyTransitions) {\r\n configs.add(config)\r\n }\r\n\r\n const transitionLength = p.transitions.length\r\n for (let i = 0; i < transitionLength; i++) {\r\n const transition = p.transitions[i]\r\n const c = getEpsilonTarget(config, transition)\r\n\r\n if (c !== undefined) {\r\n closure(c, configs)\r\n }\r\n }\r\n}\r\n\r\nfunction getEpsilonTarget(\r\n config: ATNConfig,\r\n transition: Transition\r\n): ATNConfig | undefined {\r\n if (transition instanceof EpsilonTransition) {\r\n return {\r\n state: transition.target,\r\n alt: config.alt,\r\n stack: config.stack\r\n }\r\n } else if (transition instanceof RuleTransition) {\r\n const stack = [...config.stack, transition.followState]\r\n return {\r\n state: transition.target,\r\n alt: config.alt,\r\n stack\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nfunction hasConfigInRuleStopState(configs: ATNConfigSet): boolean {\r\n for (const c of configs.elements) {\r\n if (c.state.type === ATN_RULE_STOP) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n\r\nfunction allConfigsInRuleStopStates(configs: ATNConfigSet): boolean {\r\n for (const c of configs.elements) {\r\n if (c.state.type !== ATN_RULE_STOP) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nfunction hasConflictTerminatingPrediction(configs: ATNConfigSet): boolean {\r\n if (allConfigsInRuleStopStates(configs)) {\r\n return true\r\n }\r\n const altSets = getConflictingAltSets(configs.elements)\r\n const heuristic =\r\n hasConflictingAltSet(altSets) && !hasStateAssociatedWithOneAlt(altSets)\r\n return heuristic\r\n}\r\n\r\nfunction getConflictingAltSets(\r\n configs: readonly ATNConfig[]\r\n): Map> {\r\n const configToAlts = new Map>()\r\n for (const c of configs) {\r\n const key = getATNConfigKey(c, false)\r\n let alts = configToAlts.get(key)\r\n if (alts === undefined) {\r\n alts = {}\r\n configToAlts.set(key, alts)\r\n }\r\n alts[c.alt] = true\r\n }\r\n return configToAlts\r\n}\r\n\r\nfunction hasConflictingAltSet(\r\n altSets: Map>\r\n): boolean {\r\n for (const value of Array.from(altSets.values())) {\r\n if (Object.keys(value).length > 1) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n\r\nfunction hasStateAssociatedWithOneAlt(\r\n altSets: Map>\r\n): boolean {\r\n for (const value of Array.from(altSets.values())) {\r\n if (Object.keys(value).length === 1) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nexport var DocumentUri;\n(function (DocumentUri) {\n function is(value) {\n return typeof value === 'string';\n }\n DocumentUri.is = is;\n})(DocumentUri || (DocumentUri = {}));\nexport var URI;\n(function (URI) {\n function is(value) {\n return typeof value === 'string';\n }\n URI.is = is;\n})(URI || (URI = {}));\nexport var integer;\n(function (integer) {\n integer.MIN_VALUE = -2147483648;\n integer.MAX_VALUE = 2147483647;\n function is(value) {\n return typeof value === 'number' && integer.MIN_VALUE <= value && value <= integer.MAX_VALUE;\n }\n integer.is = is;\n})(integer || (integer = {}));\nexport var uinteger;\n(function (uinteger) {\n uinteger.MIN_VALUE = 0;\n uinteger.MAX_VALUE = 2147483647;\n function is(value) {\n return typeof value === 'number' && uinteger.MIN_VALUE <= value && value <= uinteger.MAX_VALUE;\n }\n uinteger.is = is;\n})(uinteger || (uinteger = {}));\n/**\n * The Position namespace provides helper functions to work with\n * {@link Position} literals.\n */\nexport var Position;\n(function (Position) {\n /**\n * Creates a new Position literal from the given line and character.\n * @param line The position's line.\n * @param character The position's character.\n */\n function create(line, character) {\n if (line === Number.MAX_VALUE) {\n line = uinteger.MAX_VALUE;\n }\n if (character === Number.MAX_VALUE) {\n character = uinteger.MAX_VALUE;\n }\n return { line, character };\n }\n Position.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Position} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Is.uinteger(candidate.line) && Is.uinteger(candidate.character);\n }\n Position.is = is;\n})(Position || (Position = {}));\n/**\n * The Range namespace provides helper functions to work with\n * {@link Range} literals.\n */\nexport var Range;\n(function (Range) {\n function create(one, two, three, four) {\n if (Is.uinteger(one) && Is.uinteger(two) && Is.uinteger(three) && Is.uinteger(four)) {\n return { start: Position.create(one, two), end: Position.create(three, four) };\n }\n else if (Position.is(one) && Position.is(two)) {\n return { start: one, end: two };\n }\n else {\n throw new Error(`Range#create called with invalid arguments[${one}, ${two}, ${three}, ${four}]`);\n }\n }\n Range.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Range} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end);\n }\n Range.is = is;\n})(Range || (Range = {}));\n/**\n * The Location namespace provides helper functions to work with\n * {@link Location} literals.\n */\nexport var Location;\n(function (Location) {\n /**\n * Creates a Location literal.\n * @param uri The location's uri.\n * @param range The location's range.\n */\n function create(uri, range) {\n return { uri, range };\n }\n Location.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Location} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri));\n }\n Location.is = is;\n})(Location || (Location = {}));\n/**\n * The LocationLink namespace provides helper functions to work with\n * {@link LocationLink} literals.\n */\nexport var LocationLink;\n(function (LocationLink) {\n /**\n * Creates a LocationLink literal.\n * @param targetUri The definition's uri.\n * @param targetRange The full range of the definition.\n * @param targetSelectionRange The span of the symbol definition at the target.\n * @param originSelectionRange The span of the symbol being defined in the originating source file.\n */\n function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) {\n return { targetUri, targetRange, targetSelectionRange, originSelectionRange };\n }\n LocationLink.create = create;\n /**\n * Checks whether the given literal conforms to the {@link LocationLink} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri)\n && Range.is(candidate.targetSelectionRange)\n && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange));\n }\n LocationLink.is = is;\n})(LocationLink || (LocationLink = {}));\n/**\n * The Color namespace provides helper functions to work with\n * {@link Color} literals.\n */\nexport var Color;\n(function (Color) {\n /**\n * Creates a new Color literal.\n */\n function create(red, green, blue, alpha) {\n return {\n red,\n green,\n blue,\n alpha,\n };\n }\n Color.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Color} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.numberRange(candidate.red, 0, 1)\n && Is.numberRange(candidate.green, 0, 1)\n && Is.numberRange(candidate.blue, 0, 1)\n && Is.numberRange(candidate.alpha, 0, 1);\n }\n Color.is = is;\n})(Color || (Color = {}));\n/**\n * The ColorInformation namespace provides helper functions to work with\n * {@link ColorInformation} literals.\n */\nexport var ColorInformation;\n(function (ColorInformation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(range, color) {\n return {\n range,\n color,\n };\n }\n ColorInformation.create = create;\n /**\n * Checks whether the given literal conforms to the {@link ColorInformation} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && Color.is(candidate.color);\n }\n ColorInformation.is = is;\n})(ColorInformation || (ColorInformation = {}));\n/**\n * The Color namespace provides helper functions to work with\n * {@link ColorPresentation} literals.\n */\nexport var ColorPresentation;\n(function (ColorPresentation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(label, textEdit, additionalTextEdits) {\n return {\n label,\n textEdit,\n additionalTextEdits,\n };\n }\n ColorPresentation.create = create;\n /**\n * Checks whether the given literal conforms to the {@link ColorInformation} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.label)\n && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate))\n && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is));\n }\n ColorPresentation.is = is;\n})(ColorPresentation || (ColorPresentation = {}));\n/**\n * A set of predefined range kinds.\n */\nexport var FoldingRangeKind;\n(function (FoldingRangeKind) {\n /**\n * Folding range for a comment\n */\n FoldingRangeKind.Comment = 'comment';\n /**\n * Folding range for an import or include\n */\n FoldingRangeKind.Imports = 'imports';\n /**\n * Folding range for a region (e.g. `#region`)\n */\n FoldingRangeKind.Region = 'region';\n})(FoldingRangeKind || (FoldingRangeKind = {}));\n/**\n * The folding range namespace provides helper functions to work with\n * {@link FoldingRange} literals.\n */\nexport var FoldingRange;\n(function (FoldingRange) {\n /**\n * Creates a new FoldingRange literal.\n */\n function create(startLine, endLine, startCharacter, endCharacter, kind, collapsedText) {\n const result = {\n startLine,\n endLine\n };\n if (Is.defined(startCharacter)) {\n result.startCharacter = startCharacter;\n }\n if (Is.defined(endCharacter)) {\n result.endCharacter = endCharacter;\n }\n if (Is.defined(kind)) {\n result.kind = kind;\n }\n if (Is.defined(collapsedText)) {\n result.collapsedText = collapsedText;\n }\n return result;\n }\n FoldingRange.create = create;\n /**\n * Checks whether the given literal conforms to the {@link FoldingRange} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.uinteger(candidate.startLine) && Is.uinteger(candidate.startLine)\n && (Is.undefined(candidate.startCharacter) || Is.uinteger(candidate.startCharacter))\n && (Is.undefined(candidate.endCharacter) || Is.uinteger(candidate.endCharacter))\n && (Is.undefined(candidate.kind) || Is.string(candidate.kind));\n }\n FoldingRange.is = is;\n})(FoldingRange || (FoldingRange = {}));\n/**\n * The DiagnosticRelatedInformation namespace provides helper functions to work with\n * {@link DiagnosticRelatedInformation} literals.\n */\nexport var DiagnosticRelatedInformation;\n(function (DiagnosticRelatedInformation) {\n /**\n * Creates a new DiagnosticRelatedInformation literal.\n */\n function create(location, message) {\n return {\n location,\n message\n };\n }\n DiagnosticRelatedInformation.create = create;\n /**\n * Checks whether the given literal conforms to the {@link DiagnosticRelatedInformation} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message);\n }\n DiagnosticRelatedInformation.is = is;\n})(DiagnosticRelatedInformation || (DiagnosticRelatedInformation = {}));\n/**\n * The diagnostic's severity.\n */\nexport var DiagnosticSeverity;\n(function (DiagnosticSeverity) {\n /**\n * Reports an error.\n */\n DiagnosticSeverity.Error = 1;\n /**\n * Reports a warning.\n */\n DiagnosticSeverity.Warning = 2;\n /**\n * Reports an information.\n */\n DiagnosticSeverity.Information = 3;\n /**\n * Reports a hint.\n */\n DiagnosticSeverity.Hint = 4;\n})(DiagnosticSeverity || (DiagnosticSeverity = {}));\n/**\n * The diagnostic tags.\n *\n * @since 3.15.0\n */\nexport var DiagnosticTag;\n(function (DiagnosticTag) {\n /**\n * Unused or unnecessary code.\n *\n * Clients are allowed to render diagnostics with this tag faded out instead of having\n * an error squiggle.\n */\n DiagnosticTag.Unnecessary = 1;\n /**\n * Deprecated or obsolete code.\n *\n * Clients are allowed to rendered diagnostics with this tag strike through.\n */\n DiagnosticTag.Deprecated = 2;\n})(DiagnosticTag || (DiagnosticTag = {}));\n/**\n * The CodeDescription namespace provides functions to deal with descriptions for diagnostic codes.\n *\n * @since 3.16.0\n */\nexport var CodeDescription;\n(function (CodeDescription) {\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.href);\n }\n CodeDescription.is = is;\n})(CodeDescription || (CodeDescription = {}));\n/**\n * The Diagnostic namespace provides helper functions to work with\n * {@link Diagnostic} literals.\n */\nexport var Diagnostic;\n(function (Diagnostic) {\n /**\n * Creates a new Diagnostic literal.\n */\n function create(range, message, severity, code, source, relatedInformation) {\n let result = { range, message };\n if (Is.defined(severity)) {\n result.severity = severity;\n }\n if (Is.defined(code)) {\n result.code = code;\n }\n if (Is.defined(source)) {\n result.source = source;\n }\n if (Is.defined(relatedInformation)) {\n result.relatedInformation = relatedInformation;\n }\n return result;\n }\n Diagnostic.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Diagnostic} interface.\n */\n function is(value) {\n var _a;\n let candidate = value;\n return Is.defined(candidate)\n && Range.is(candidate.range)\n && Is.string(candidate.message)\n && (Is.number(candidate.severity) || Is.undefined(candidate.severity))\n && (Is.integer(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code))\n && (Is.undefined(candidate.codeDescription) || (Is.string((_a = candidate.codeDescription) === null || _a === void 0 ? void 0 : _a.href)))\n && (Is.string(candidate.source) || Is.undefined(candidate.source))\n && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is));\n }\n Diagnostic.is = is;\n})(Diagnostic || (Diagnostic = {}));\n/**\n * The Command namespace provides helper functions to work with\n * {@link Command} literals.\n */\nexport var Command;\n(function (Command) {\n /**\n * Creates a new Command literal.\n */\n function create(title, command, ...args) {\n let result = { title, command };\n if (Is.defined(args) && args.length > 0) {\n result.arguments = args;\n }\n return result;\n }\n Command.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Command} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command);\n }\n Command.is = is;\n})(Command || (Command = {}));\n/**\n * The TextEdit namespace provides helper function to create replace,\n * insert and delete edits more easily.\n */\nexport var TextEdit;\n(function (TextEdit) {\n /**\n * Creates a replace text edit.\n * @param range The range of text to be replaced.\n * @param newText The new text.\n */\n function replace(range, newText) {\n return { range, newText };\n }\n TextEdit.replace = replace;\n /**\n * Creates an insert text edit.\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n */\n function insert(position, newText) {\n return { range: { start: position, end: position }, newText };\n }\n TextEdit.insert = insert;\n /**\n * Creates a delete text edit.\n * @param range The range of text to be deleted.\n */\n function del(range) {\n return { range, newText: '' };\n }\n TextEdit.del = del;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate)\n && Is.string(candidate.newText)\n && Range.is(candidate.range);\n }\n TextEdit.is = is;\n})(TextEdit || (TextEdit = {}));\nexport var ChangeAnnotation;\n(function (ChangeAnnotation) {\n function create(label, needsConfirmation, description) {\n const result = { label };\n if (needsConfirmation !== undefined) {\n result.needsConfirmation = needsConfirmation;\n }\n if (description !== undefined) {\n result.description = description;\n }\n return result;\n }\n ChangeAnnotation.create = create;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.label) &&\n (Is.boolean(candidate.needsConfirmation) || candidate.needsConfirmation === undefined) &&\n (Is.string(candidate.description) || candidate.description === undefined);\n }\n ChangeAnnotation.is = is;\n})(ChangeAnnotation || (ChangeAnnotation = {}));\nexport var ChangeAnnotationIdentifier;\n(function (ChangeAnnotationIdentifier) {\n function is(value) {\n const candidate = value;\n return Is.string(candidate);\n }\n ChangeAnnotationIdentifier.is = is;\n})(ChangeAnnotationIdentifier || (ChangeAnnotationIdentifier = {}));\nexport var AnnotatedTextEdit;\n(function (AnnotatedTextEdit) {\n /**\n * Creates an annotated replace text edit.\n *\n * @param range The range of text to be replaced.\n * @param newText The new text.\n * @param annotation The annotation.\n */\n function replace(range, newText, annotation) {\n return { range, newText, annotationId: annotation };\n }\n AnnotatedTextEdit.replace = replace;\n /**\n * Creates an annotated insert text edit.\n *\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n * @param annotation The annotation.\n */\n function insert(position, newText, annotation) {\n return { range: { start: position, end: position }, newText, annotationId: annotation };\n }\n AnnotatedTextEdit.insert = insert;\n /**\n * Creates an annotated delete text edit.\n *\n * @param range The range of text to be deleted.\n * @param annotation The annotation.\n */\n function del(range, annotation) {\n return { range, newText: '', annotationId: annotation };\n }\n AnnotatedTextEdit.del = del;\n function is(value) {\n const candidate = value;\n return TextEdit.is(candidate) && (ChangeAnnotation.is(candidate.annotationId) || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n AnnotatedTextEdit.is = is;\n})(AnnotatedTextEdit || (AnnotatedTextEdit = {}));\n/**\n * The TextDocumentEdit namespace provides helper function to create\n * an edit that manipulates a text document.\n */\nexport var TextDocumentEdit;\n(function (TextDocumentEdit) {\n /**\n * Creates a new `TextDocumentEdit`\n */\n function create(textDocument, edits) {\n return { textDocument, edits };\n }\n TextDocumentEdit.create = create;\n function is(value) {\n let candidate = value;\n return Is.defined(candidate)\n && OptionalVersionedTextDocumentIdentifier.is(candidate.textDocument)\n && Array.isArray(candidate.edits);\n }\n TextDocumentEdit.is = is;\n})(TextDocumentEdit || (TextDocumentEdit = {}));\nexport var CreateFile;\n(function (CreateFile) {\n function create(uri, options, annotation) {\n let result = {\n kind: 'create',\n uri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n CreateFile.create = create;\n function is(value) {\n let candidate = value;\n return candidate && candidate.kind === 'create' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n CreateFile.is = is;\n})(CreateFile || (CreateFile = {}));\nexport var RenameFile;\n(function (RenameFile) {\n function create(oldUri, newUri, options, annotation) {\n let result = {\n kind: 'rename',\n oldUri,\n newUri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n RenameFile.create = create;\n function is(value) {\n let candidate = value;\n return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n RenameFile.is = is;\n})(RenameFile || (RenameFile = {}));\nexport var DeleteFile;\n(function (DeleteFile) {\n function create(uri, options, annotation) {\n let result = {\n kind: 'delete',\n uri\n };\n if (options !== undefined && (options.recursive !== undefined || options.ignoreIfNotExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n DeleteFile.create = create;\n function is(value) {\n let candidate = value;\n return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.recursive === undefined || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === undefined || Is.boolean(candidate.options.ignoreIfNotExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n DeleteFile.is = is;\n})(DeleteFile || (DeleteFile = {}));\nexport var WorkspaceEdit;\n(function (WorkspaceEdit) {\n function is(value) {\n let candidate = value;\n return candidate &&\n (candidate.changes !== undefined || candidate.documentChanges !== undefined) &&\n (candidate.documentChanges === undefined || candidate.documentChanges.every((change) => {\n if (Is.string(change.kind)) {\n return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change);\n }\n else {\n return TextDocumentEdit.is(change);\n }\n }));\n }\n WorkspaceEdit.is = is;\n})(WorkspaceEdit || (WorkspaceEdit = {}));\nclass TextEditChangeImpl {\n constructor(edits, changeAnnotations) {\n this.edits = edits;\n this.changeAnnotations = changeAnnotations;\n }\n insert(position, newText, annotation) {\n let edit;\n let id;\n if (annotation === undefined) {\n edit = TextEdit.insert(position, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.insert(position, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.insert(position, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n }\n replace(range, newText, annotation) {\n let edit;\n let id;\n if (annotation === undefined) {\n edit = TextEdit.replace(range, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.replace(range, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.replace(range, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n }\n delete(range, annotation) {\n let edit;\n let id;\n if (annotation === undefined) {\n edit = TextEdit.del(range);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.del(range, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.del(range, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n }\n add(edit) {\n this.edits.push(edit);\n }\n all() {\n return this.edits;\n }\n clear() {\n this.edits.splice(0, this.edits.length);\n }\n assertChangeAnnotations(value) {\n if (value === undefined) {\n throw new Error(`Text edit change is not configured to manage change annotations.`);\n }\n }\n}\n/**\n * A helper class\n */\nclass ChangeAnnotations {\n constructor(annotations) {\n this._annotations = annotations === undefined ? Object.create(null) : annotations;\n this._counter = 0;\n this._size = 0;\n }\n all() {\n return this._annotations;\n }\n get size() {\n return this._size;\n }\n manage(idOrAnnotation, annotation) {\n let id;\n if (ChangeAnnotationIdentifier.is(idOrAnnotation)) {\n id = idOrAnnotation;\n }\n else {\n id = this.nextId();\n annotation = idOrAnnotation;\n }\n if (this._annotations[id] !== undefined) {\n throw new Error(`Id ${id} is already in use.`);\n }\n if (annotation === undefined) {\n throw new Error(`No annotation provided for id ${id}`);\n }\n this._annotations[id] = annotation;\n this._size++;\n return id;\n }\n nextId() {\n this._counter++;\n return this._counter.toString();\n }\n}\n/**\n * A workspace change helps constructing changes to a workspace.\n */\nexport class WorkspaceChange {\n constructor(workspaceEdit) {\n this._textEditChanges = Object.create(null);\n if (workspaceEdit !== undefined) {\n this._workspaceEdit = workspaceEdit;\n if (workspaceEdit.documentChanges) {\n this._changeAnnotations = new ChangeAnnotations(workspaceEdit.changeAnnotations);\n workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n workspaceEdit.documentChanges.forEach((change) => {\n if (TextDocumentEdit.is(change)) {\n const textEditChange = new TextEditChangeImpl(change.edits, this._changeAnnotations);\n this._textEditChanges[change.textDocument.uri] = textEditChange;\n }\n });\n }\n else if (workspaceEdit.changes) {\n Object.keys(workspaceEdit.changes).forEach((key) => {\n const textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]);\n this._textEditChanges[key] = textEditChange;\n });\n }\n }\n else {\n this._workspaceEdit = {};\n }\n }\n /**\n * Returns the underlying {@link WorkspaceEdit} literal\n * use to be returned from a workspace edit operation like rename.\n */\n get edit() {\n this.initDocumentChanges();\n if (this._changeAnnotations !== undefined) {\n if (this._changeAnnotations.size === 0) {\n this._workspaceEdit.changeAnnotations = undefined;\n }\n else {\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n }\n return this._workspaceEdit;\n }\n getTextEditChange(key) {\n if (OptionalVersionedTextDocumentIdentifier.is(key)) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n const textDocument = { uri: key.uri, version: key.version };\n let result = this._textEditChanges[textDocument.uri];\n if (!result) {\n const edits = [];\n const textDocumentEdit = {\n textDocument,\n edits\n };\n this._workspaceEdit.documentChanges.push(textDocumentEdit);\n result = new TextEditChangeImpl(edits, this._changeAnnotations);\n this._textEditChanges[textDocument.uri] = result;\n }\n return result;\n }\n else {\n this.initChanges();\n if (this._workspaceEdit.changes === undefined) {\n throw new Error('Workspace edit is not configured for normal text edit changes.');\n }\n let result = this._textEditChanges[key];\n if (!result) {\n let edits = [];\n this._workspaceEdit.changes[key] = edits;\n result = new TextEditChangeImpl(edits);\n this._textEditChanges[key] = result;\n }\n return result;\n }\n }\n initDocumentChanges() {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._changeAnnotations = new ChangeAnnotations();\n this._workspaceEdit.documentChanges = [];\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n }\n initChanges() {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._workspaceEdit.changes = Object.create(null);\n }\n }\n createFile(uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n let annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n let operation;\n let id;\n if (annotation === undefined) {\n operation = CreateFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = CreateFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n }\n renameFile(oldUri, newUri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n let annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n let operation;\n let id;\n if (annotation === undefined) {\n operation = RenameFile.create(oldUri, newUri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = RenameFile.create(oldUri, newUri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n }\n deleteFile(uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n let annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n let operation;\n let id;\n if (annotation === undefined) {\n operation = DeleteFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = DeleteFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n }\n}\n/**\n * The TextDocumentIdentifier namespace provides helper functions to work with\n * {@link TextDocumentIdentifier} literals.\n */\nexport var TextDocumentIdentifier;\n(function (TextDocumentIdentifier) {\n /**\n * Creates a new TextDocumentIdentifier literal.\n * @param uri The document's uri.\n */\n function create(uri) {\n return { uri };\n }\n TextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the {@link TextDocumentIdentifier} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri);\n }\n TextDocumentIdentifier.is = is;\n})(TextDocumentIdentifier || (TextDocumentIdentifier = {}));\n/**\n * The VersionedTextDocumentIdentifier namespace provides helper functions to work with\n * {@link VersionedTextDocumentIdentifier} literals.\n */\nexport var VersionedTextDocumentIdentifier;\n(function (VersionedTextDocumentIdentifier) {\n /**\n * Creates a new VersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param version The document's version.\n */\n function create(uri, version) {\n return { uri, version };\n }\n VersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the {@link VersionedTextDocumentIdentifier} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.integer(candidate.version);\n }\n VersionedTextDocumentIdentifier.is = is;\n})(VersionedTextDocumentIdentifier || (VersionedTextDocumentIdentifier = {}));\n/**\n * The OptionalVersionedTextDocumentIdentifier namespace provides helper functions to work with\n * {@link OptionalVersionedTextDocumentIdentifier} literals.\n */\nexport var OptionalVersionedTextDocumentIdentifier;\n(function (OptionalVersionedTextDocumentIdentifier) {\n /**\n * Creates a new OptionalVersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param version The document's version.\n */\n function create(uri, version) {\n return { uri, version };\n }\n OptionalVersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the {@link OptionalVersionedTextDocumentIdentifier} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.integer(candidate.version));\n }\n OptionalVersionedTextDocumentIdentifier.is = is;\n})(OptionalVersionedTextDocumentIdentifier || (OptionalVersionedTextDocumentIdentifier = {}));\n/**\n * The TextDocumentItem namespace provides helper functions to work with\n * {@link TextDocumentItem} literals.\n */\nexport var TextDocumentItem;\n(function (TextDocumentItem) {\n /**\n * Creates a new TextDocumentItem literal.\n * @param uri The document's uri.\n * @param languageId The document's language identifier.\n * @param version The document's version number.\n * @param text The document's text.\n */\n function create(uri, languageId, version, text) {\n return { uri, languageId, version, text };\n }\n TextDocumentItem.create = create;\n /**\n * Checks whether the given literal conforms to the {@link TextDocumentItem} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.integer(candidate.version) && Is.string(candidate.text);\n }\n TextDocumentItem.is = is;\n})(TextDocumentItem || (TextDocumentItem = {}));\n/**\n * Describes the content type that a client supports in various\n * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.\n *\n * Please note that `MarkupKinds` must not start with a `$`. This kinds\n * are reserved for internal usage.\n */\nexport var MarkupKind;\n(function (MarkupKind) {\n /**\n * Plain text is supported as a content format\n */\n MarkupKind.PlainText = 'plaintext';\n /**\n * Markdown is supported as a content format\n */\n MarkupKind.Markdown = 'markdown';\n /**\n * Checks whether the given value is a value of the {@link MarkupKind} type.\n */\n function is(value) {\n const candidate = value;\n return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown;\n }\n MarkupKind.is = is;\n})(MarkupKind || (MarkupKind = {}));\nexport var MarkupContent;\n(function (MarkupContent) {\n /**\n * Checks whether the given value conforms to the {@link MarkupContent} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value);\n }\n MarkupContent.is = is;\n})(MarkupContent || (MarkupContent = {}));\n/**\n * The kind of a completion entry.\n */\nexport var CompletionItemKind;\n(function (CompletionItemKind) {\n CompletionItemKind.Text = 1;\n CompletionItemKind.Method = 2;\n CompletionItemKind.Function = 3;\n CompletionItemKind.Constructor = 4;\n CompletionItemKind.Field = 5;\n CompletionItemKind.Variable = 6;\n CompletionItemKind.Class = 7;\n CompletionItemKind.Interface = 8;\n CompletionItemKind.Module = 9;\n CompletionItemKind.Property = 10;\n CompletionItemKind.Unit = 11;\n CompletionItemKind.Value = 12;\n CompletionItemKind.Enum = 13;\n CompletionItemKind.Keyword = 14;\n CompletionItemKind.Snippet = 15;\n CompletionItemKind.Color = 16;\n CompletionItemKind.File = 17;\n CompletionItemKind.Reference = 18;\n CompletionItemKind.Folder = 19;\n CompletionItemKind.EnumMember = 20;\n CompletionItemKind.Constant = 21;\n CompletionItemKind.Struct = 22;\n CompletionItemKind.Event = 23;\n CompletionItemKind.Operator = 24;\n CompletionItemKind.TypeParameter = 25;\n})(CompletionItemKind || (CompletionItemKind = {}));\n/**\n * Defines whether the insert text in a completion item should be interpreted as\n * plain text or a snippet.\n */\nexport var InsertTextFormat;\n(function (InsertTextFormat) {\n /**\n * The primary text to be inserted is treated as a plain string.\n */\n InsertTextFormat.PlainText = 1;\n /**\n * The primary text to be inserted is treated as a snippet.\n *\n * A snippet can define tab stops and placeholders with `$1`, `$2`\n * and `${3:foo}`. `$0` defines the final tab stop, it defaults to\n * the end of the snippet. Placeholders with equal identifiers are linked,\n * that is typing in one will update others too.\n *\n * See also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax\n */\n InsertTextFormat.Snippet = 2;\n})(InsertTextFormat || (InsertTextFormat = {}));\n/**\n * Completion item tags are extra annotations that tweak the rendering of a completion\n * item.\n *\n * @since 3.15.0\n */\nexport var CompletionItemTag;\n(function (CompletionItemTag) {\n /**\n * Render a completion as obsolete, usually using a strike-out.\n */\n CompletionItemTag.Deprecated = 1;\n})(CompletionItemTag || (CompletionItemTag = {}));\n/**\n * The InsertReplaceEdit namespace provides functions to deal with insert / replace edits.\n *\n * @since 3.16.0\n */\nexport var InsertReplaceEdit;\n(function (InsertReplaceEdit) {\n /**\n * Creates a new insert / replace edit\n */\n function create(newText, insert, replace) {\n return { newText, insert, replace };\n }\n InsertReplaceEdit.create = create;\n /**\n * Checks whether the given literal conforms to the {@link InsertReplaceEdit} interface.\n */\n function is(value) {\n const candidate = value;\n return candidate && Is.string(candidate.newText) && Range.is(candidate.insert) && Range.is(candidate.replace);\n }\n InsertReplaceEdit.is = is;\n})(InsertReplaceEdit || (InsertReplaceEdit = {}));\n/**\n * How whitespace and indentation is handled during completion\n * item insertion.\n *\n * @since 3.16.0\n */\nexport var InsertTextMode;\n(function (InsertTextMode) {\n /**\n * The insertion or replace strings is taken as it is. If the\n * value is multi line the lines below the cursor will be\n * inserted using the indentation defined in the string value.\n * The client will not apply any kind of adjustments to the\n * string.\n */\n InsertTextMode.asIs = 1;\n /**\n * The editor adjusts leading whitespace of new lines so that\n * they match the indentation up to the cursor of the line for\n * which the item is accepted.\n *\n * Consider a line like this: <2tabs><3tabs>foo. Accepting a\n * multi line completion item is indented using 2 tabs and all\n * following lines inserted will be indented using 2 tabs as well.\n */\n InsertTextMode.adjustIndentation = 2;\n})(InsertTextMode || (InsertTextMode = {}));\nexport var CompletionItemLabelDetails;\n(function (CompletionItemLabelDetails) {\n function is(value) {\n const candidate = value;\n return candidate && (Is.string(candidate.detail) || candidate.detail === undefined) &&\n (Is.string(candidate.description) || candidate.description === undefined);\n }\n CompletionItemLabelDetails.is = is;\n})(CompletionItemLabelDetails || (CompletionItemLabelDetails = {}));\n/**\n * The CompletionItem namespace provides functions to deal with\n * completion items.\n */\nexport var CompletionItem;\n(function (CompletionItem) {\n /**\n * Create a completion item and seed it with a label.\n * @param label The completion item's label\n */\n function create(label) {\n return { label };\n }\n CompletionItem.create = create;\n})(CompletionItem || (CompletionItem = {}));\n/**\n * The CompletionList namespace provides functions to deal with\n * completion lists.\n */\nexport var CompletionList;\n(function (CompletionList) {\n /**\n * Creates a new completion list.\n *\n * @param items The completion items.\n * @param isIncomplete The list is not complete.\n */\n function create(items, isIncomplete) {\n return { items: items ? items : [], isIncomplete: !!isIncomplete };\n }\n CompletionList.create = create;\n})(CompletionList || (CompletionList = {}));\nexport var MarkedString;\n(function (MarkedString) {\n /**\n * Creates a marked string from plain text.\n *\n * @param plainText The plain text.\n */\n function fromPlainText(plainText) {\n return plainText.replace(/[\\\\`*_{}[\\]()#+\\-.!]/g, '\\\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash\n }\n MarkedString.fromPlainText = fromPlainText;\n /**\n * Checks whether the given value conforms to the {@link MarkedString} type.\n */\n function is(value) {\n const candidate = value;\n return Is.string(candidate) || (Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value));\n }\n MarkedString.is = is;\n})(MarkedString || (MarkedString = {}));\nexport var Hover;\n(function (Hover) {\n /**\n * Checks whether the given value conforms to the {@link Hover} interface.\n */\n function is(value) {\n let candidate = value;\n return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) ||\n MarkedString.is(candidate.contents) ||\n Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === undefined || Range.is(value.range));\n }\n Hover.is = is;\n})(Hover || (Hover = {}));\n/**\n * The ParameterInformation namespace provides helper functions to work with\n * {@link ParameterInformation} literals.\n */\nexport var ParameterInformation;\n(function (ParameterInformation) {\n /**\n * Creates a new parameter information literal.\n *\n * @param label A label string.\n * @param documentation A doc string.\n */\n function create(label, documentation) {\n return documentation ? { label, documentation } : { label };\n }\n ParameterInformation.create = create;\n})(ParameterInformation || (ParameterInformation = {}));\n/**\n * The SignatureInformation namespace provides helper functions to work with\n * {@link SignatureInformation} literals.\n */\nexport var SignatureInformation;\n(function (SignatureInformation) {\n function create(label, documentation, ...parameters) {\n let result = { label };\n if (Is.defined(documentation)) {\n result.documentation = documentation;\n }\n if (Is.defined(parameters)) {\n result.parameters = parameters;\n }\n else {\n result.parameters = [];\n }\n return result;\n }\n SignatureInformation.create = create;\n})(SignatureInformation || (SignatureInformation = {}));\n/**\n * A document highlight kind.\n */\nexport var DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n /**\n * A textual occurrence.\n */\n DocumentHighlightKind.Text = 1;\n /**\n * Read-access of a symbol, like reading a variable.\n */\n DocumentHighlightKind.Read = 2;\n /**\n * Write-access of a symbol, like writing to a variable.\n */\n DocumentHighlightKind.Write = 3;\n})(DocumentHighlightKind || (DocumentHighlightKind = {}));\n/**\n * DocumentHighlight namespace to provide helper functions to work with\n * {@link DocumentHighlight} literals.\n */\nexport var DocumentHighlight;\n(function (DocumentHighlight) {\n /**\n * Create a DocumentHighlight object.\n * @param range The range the highlight applies to.\n * @param kind The highlight kind\n */\n function create(range, kind) {\n let result = { range };\n if (Is.number(kind)) {\n result.kind = kind;\n }\n return result;\n }\n DocumentHighlight.create = create;\n})(DocumentHighlight || (DocumentHighlight = {}));\n/**\n * A symbol kind.\n */\nexport var SymbolKind;\n(function (SymbolKind) {\n SymbolKind.File = 1;\n SymbolKind.Module = 2;\n SymbolKind.Namespace = 3;\n SymbolKind.Package = 4;\n SymbolKind.Class = 5;\n SymbolKind.Method = 6;\n SymbolKind.Property = 7;\n SymbolKind.Field = 8;\n SymbolKind.Constructor = 9;\n SymbolKind.Enum = 10;\n SymbolKind.Interface = 11;\n SymbolKind.Function = 12;\n SymbolKind.Variable = 13;\n SymbolKind.Constant = 14;\n SymbolKind.String = 15;\n SymbolKind.Number = 16;\n SymbolKind.Boolean = 17;\n SymbolKind.Array = 18;\n SymbolKind.Object = 19;\n SymbolKind.Key = 20;\n SymbolKind.Null = 21;\n SymbolKind.EnumMember = 22;\n SymbolKind.Struct = 23;\n SymbolKind.Event = 24;\n SymbolKind.Operator = 25;\n SymbolKind.TypeParameter = 26;\n})(SymbolKind || (SymbolKind = {}));\n/**\n * Symbol tags are extra annotations that tweak the rendering of a symbol.\n *\n * @since 3.16\n */\nexport var SymbolTag;\n(function (SymbolTag) {\n /**\n * Render a symbol as obsolete, usually using a strike-out.\n */\n SymbolTag.Deprecated = 1;\n})(SymbolTag || (SymbolTag = {}));\nexport var SymbolInformation;\n(function (SymbolInformation) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the location of the symbol.\n * @param uri The resource of the location of symbol.\n * @param containerName The name of the symbol containing the symbol.\n */\n function create(name, kind, range, uri, containerName) {\n let result = {\n name,\n kind,\n location: { uri, range }\n };\n if (containerName) {\n result.containerName = containerName;\n }\n return result;\n }\n SymbolInformation.create = create;\n})(SymbolInformation || (SymbolInformation = {}));\nexport var WorkspaceSymbol;\n(function (WorkspaceSymbol) {\n /**\n * Create a new workspace symbol.\n *\n * @param name The name of the symbol.\n * @param kind The kind of the symbol.\n * @param uri The resource of the location of the symbol.\n * @param range An options range of the location.\n * @returns A WorkspaceSymbol.\n */\n function create(name, kind, uri, range) {\n return range !== undefined\n ? { name, kind, location: { uri, range } }\n : { name, kind, location: { uri } };\n }\n WorkspaceSymbol.create = create;\n})(WorkspaceSymbol || (WorkspaceSymbol = {}));\nexport var DocumentSymbol;\n(function (DocumentSymbol) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param detail The detail of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the symbol.\n * @param selectionRange The selectionRange of the symbol.\n * @param children Children of the symbol.\n */\n function create(name, detail, kind, range, selectionRange, children) {\n let result = {\n name,\n detail,\n kind,\n range,\n selectionRange\n };\n if (children !== undefined) {\n result.children = children;\n }\n return result;\n }\n DocumentSymbol.create = create;\n /**\n * Checks whether the given literal conforms to the {@link DocumentSymbol} interface.\n */\n function is(value) {\n let candidate = value;\n return candidate &&\n Is.string(candidate.name) && Is.number(candidate.kind) &&\n Range.is(candidate.range) && Range.is(candidate.selectionRange) &&\n (candidate.detail === undefined || Is.string(candidate.detail)) &&\n (candidate.deprecated === undefined || Is.boolean(candidate.deprecated)) &&\n (candidate.children === undefined || Array.isArray(candidate.children)) &&\n (candidate.tags === undefined || Array.isArray(candidate.tags));\n }\n DocumentSymbol.is = is;\n})(DocumentSymbol || (DocumentSymbol = {}));\n/**\n * A set of predefined code action kinds\n */\nexport var CodeActionKind;\n(function (CodeActionKind) {\n /**\n * Empty kind.\n */\n CodeActionKind.Empty = '';\n /**\n * Base kind for quickfix actions: 'quickfix'\n */\n CodeActionKind.QuickFix = 'quickfix';\n /**\n * Base kind for refactoring actions: 'refactor'\n */\n CodeActionKind.Refactor = 'refactor';\n /**\n * Base kind for refactoring extraction actions: 'refactor.extract'\n *\n * Example extract actions:\n *\n * - Extract method\n * - Extract function\n * - Extract variable\n * - Extract interface from class\n * - ...\n */\n CodeActionKind.RefactorExtract = 'refactor.extract';\n /**\n * Base kind for refactoring inline actions: 'refactor.inline'\n *\n * Example inline actions:\n *\n * - Inline function\n * - Inline variable\n * - Inline constant\n * - ...\n */\n CodeActionKind.RefactorInline = 'refactor.inline';\n /**\n * Base kind for refactoring rewrite actions: 'refactor.rewrite'\n *\n * Example rewrite actions:\n *\n * - Convert JavaScript function to class\n * - Add or remove parameter\n * - Encapsulate field\n * - Make method static\n * - Move method to base class\n * - ...\n */\n CodeActionKind.RefactorRewrite = 'refactor.rewrite';\n /**\n * Base kind for source actions: `source`\n *\n * Source code actions apply to the entire file.\n */\n CodeActionKind.Source = 'source';\n /**\n * Base kind for an organize imports source action: `source.organizeImports`\n */\n CodeActionKind.SourceOrganizeImports = 'source.organizeImports';\n /**\n * Base kind for auto-fix source actions: `source.fixAll`.\n *\n * Fix all actions automatically fix errors that have a clear fix that do not require user input.\n * They should not suppress errors or perform unsafe fixes such as generating new types or classes.\n *\n * @since 3.15.0\n */\n CodeActionKind.SourceFixAll = 'source.fixAll';\n})(CodeActionKind || (CodeActionKind = {}));\n/**\n * The reason why code actions were requested.\n *\n * @since 3.17.0\n */\nexport var CodeActionTriggerKind;\n(function (CodeActionTriggerKind) {\n /**\n * Code actions were explicitly requested by the user or by an extension.\n */\n CodeActionTriggerKind.Invoked = 1;\n /**\n * Code actions were requested automatically.\n *\n * This typically happens when current selection in a file changes, but can\n * also be triggered when file content changes.\n */\n CodeActionTriggerKind.Automatic = 2;\n})(CodeActionTriggerKind || (CodeActionTriggerKind = {}));\n/**\n * The CodeActionContext namespace provides helper functions to work with\n * {@link CodeActionContext} literals.\n */\nexport var CodeActionContext;\n(function (CodeActionContext) {\n /**\n * Creates a new CodeActionContext literal.\n */\n function create(diagnostics, only, triggerKind) {\n let result = { diagnostics };\n if (only !== undefined && only !== null) {\n result.only = only;\n }\n if (triggerKind !== undefined && triggerKind !== null) {\n result.triggerKind = triggerKind;\n }\n return result;\n }\n CodeActionContext.create = create;\n /**\n * Checks whether the given literal conforms to the {@link CodeActionContext} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is)\n && (candidate.only === undefined || Is.typedArray(candidate.only, Is.string))\n && (candidate.triggerKind === undefined || candidate.triggerKind === CodeActionTriggerKind.Invoked || candidate.triggerKind === CodeActionTriggerKind.Automatic);\n }\n CodeActionContext.is = is;\n})(CodeActionContext || (CodeActionContext = {}));\nexport var CodeAction;\n(function (CodeAction) {\n function create(title, kindOrCommandOrEdit, kind) {\n let result = { title };\n let checkKind = true;\n if (typeof kindOrCommandOrEdit === 'string') {\n checkKind = false;\n result.kind = kindOrCommandOrEdit;\n }\n else if (Command.is(kindOrCommandOrEdit)) {\n result.command = kindOrCommandOrEdit;\n }\n else {\n result.edit = kindOrCommandOrEdit;\n }\n if (checkKind && kind !== undefined) {\n result.kind = kind;\n }\n return result;\n }\n CodeAction.create = create;\n function is(value) {\n let candidate = value;\n return candidate && Is.string(candidate.title) &&\n (candidate.diagnostics === undefined || Is.typedArray(candidate.diagnostics, Diagnostic.is)) &&\n (candidate.kind === undefined || Is.string(candidate.kind)) &&\n (candidate.edit !== undefined || candidate.command !== undefined) &&\n (candidate.command === undefined || Command.is(candidate.command)) &&\n (candidate.isPreferred === undefined || Is.boolean(candidate.isPreferred)) &&\n (candidate.edit === undefined || WorkspaceEdit.is(candidate.edit));\n }\n CodeAction.is = is;\n})(CodeAction || (CodeAction = {}));\n/**\n * The CodeLens namespace provides helper functions to work with\n * {@link CodeLens} literals.\n */\nexport var CodeLens;\n(function (CodeLens) {\n /**\n * Creates a new CodeLens literal.\n */\n function create(range, data) {\n let result = { range };\n if (Is.defined(data)) {\n result.data = data;\n }\n return result;\n }\n CodeLens.create = create;\n /**\n * Checks whether the given literal conforms to the {@link CodeLens} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command));\n }\n CodeLens.is = is;\n})(CodeLens || (CodeLens = {}));\n/**\n * The FormattingOptions namespace provides helper functions to work with\n * {@link FormattingOptions} literals.\n */\nexport var FormattingOptions;\n(function (FormattingOptions) {\n /**\n * Creates a new FormattingOptions literal.\n */\n function create(tabSize, insertSpaces) {\n return { tabSize, insertSpaces };\n }\n FormattingOptions.create = create;\n /**\n * Checks whether the given literal conforms to the {@link FormattingOptions} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.uinteger(candidate.tabSize) && Is.boolean(candidate.insertSpaces);\n }\n FormattingOptions.is = is;\n})(FormattingOptions || (FormattingOptions = {}));\n/**\n * The DocumentLink namespace provides helper functions to work with\n * {@link DocumentLink} literals.\n */\nexport var DocumentLink;\n(function (DocumentLink) {\n /**\n * Creates a new DocumentLink literal.\n */\n function create(range, target, data) {\n return { range, target, data };\n }\n DocumentLink.create = create;\n /**\n * Checks whether the given literal conforms to the {@link DocumentLink} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target));\n }\n DocumentLink.is = is;\n})(DocumentLink || (DocumentLink = {}));\n/**\n * The SelectionRange namespace provides helper function to work with\n * SelectionRange literals.\n */\nexport var SelectionRange;\n(function (SelectionRange) {\n /**\n * Creates a new SelectionRange\n * @param range the range.\n * @param parent an optional parent.\n */\n function create(range, parent) {\n return { range, parent };\n }\n SelectionRange.create = create;\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent));\n }\n SelectionRange.is = is;\n})(SelectionRange || (SelectionRange = {}));\n/**\n * A set of predefined token types. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nexport var SemanticTokenTypes;\n(function (SemanticTokenTypes) {\n SemanticTokenTypes[\"namespace\"] = \"namespace\";\n /**\n * Represents a generic type. Acts as a fallback for types which can't be mapped to\n * a specific type like class or enum.\n */\n SemanticTokenTypes[\"type\"] = \"type\";\n SemanticTokenTypes[\"class\"] = \"class\";\n SemanticTokenTypes[\"enum\"] = \"enum\";\n SemanticTokenTypes[\"interface\"] = \"interface\";\n SemanticTokenTypes[\"struct\"] = \"struct\";\n SemanticTokenTypes[\"typeParameter\"] = \"typeParameter\";\n SemanticTokenTypes[\"parameter\"] = \"parameter\";\n SemanticTokenTypes[\"variable\"] = \"variable\";\n SemanticTokenTypes[\"property\"] = \"property\";\n SemanticTokenTypes[\"enumMember\"] = \"enumMember\";\n SemanticTokenTypes[\"event\"] = \"event\";\n SemanticTokenTypes[\"function\"] = \"function\";\n SemanticTokenTypes[\"method\"] = \"method\";\n SemanticTokenTypes[\"macro\"] = \"macro\";\n SemanticTokenTypes[\"keyword\"] = \"keyword\";\n SemanticTokenTypes[\"modifier\"] = \"modifier\";\n SemanticTokenTypes[\"comment\"] = \"comment\";\n SemanticTokenTypes[\"string\"] = \"string\";\n SemanticTokenTypes[\"number\"] = \"number\";\n SemanticTokenTypes[\"regexp\"] = \"regexp\";\n SemanticTokenTypes[\"operator\"] = \"operator\";\n /**\n * @since 3.17.0\n */\n SemanticTokenTypes[\"decorator\"] = \"decorator\";\n})(SemanticTokenTypes || (SemanticTokenTypes = {}));\n/**\n * A set of predefined token modifiers. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nexport var SemanticTokenModifiers;\n(function (SemanticTokenModifiers) {\n SemanticTokenModifiers[\"declaration\"] = \"declaration\";\n SemanticTokenModifiers[\"definition\"] = \"definition\";\n SemanticTokenModifiers[\"readonly\"] = \"readonly\";\n SemanticTokenModifiers[\"static\"] = \"static\";\n SemanticTokenModifiers[\"deprecated\"] = \"deprecated\";\n SemanticTokenModifiers[\"abstract\"] = \"abstract\";\n SemanticTokenModifiers[\"async\"] = \"async\";\n SemanticTokenModifiers[\"modification\"] = \"modification\";\n SemanticTokenModifiers[\"documentation\"] = \"documentation\";\n SemanticTokenModifiers[\"defaultLibrary\"] = \"defaultLibrary\";\n})(SemanticTokenModifiers || (SemanticTokenModifiers = {}));\n/**\n * @since 3.16.0\n */\nexport var SemanticTokens;\n(function (SemanticTokens) {\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && (candidate.resultId === undefined || typeof candidate.resultId === 'string') &&\n Array.isArray(candidate.data) && (candidate.data.length === 0 || typeof candidate.data[0] === 'number');\n }\n SemanticTokens.is = is;\n})(SemanticTokens || (SemanticTokens = {}));\n/**\n * The InlineValueText namespace provides functions to deal with InlineValueTexts.\n *\n * @since 3.17.0\n */\nexport var InlineValueText;\n(function (InlineValueText) {\n /**\n * Creates a new InlineValueText literal.\n */\n function create(range, text) {\n return { range, text };\n }\n InlineValueText.create = create;\n function is(value) {\n const candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.string(candidate.text);\n }\n InlineValueText.is = is;\n})(InlineValueText || (InlineValueText = {}));\n/**\n * The InlineValueVariableLookup namespace provides functions to deal with InlineValueVariableLookups.\n *\n * @since 3.17.0\n */\nexport var InlineValueVariableLookup;\n(function (InlineValueVariableLookup) {\n /**\n * Creates a new InlineValueText literal.\n */\n function create(range, variableName, caseSensitiveLookup) {\n return { range, variableName, caseSensitiveLookup };\n }\n InlineValueVariableLookup.create = create;\n function is(value) {\n const candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.boolean(candidate.caseSensitiveLookup)\n && (Is.string(candidate.variableName) || candidate.variableName === undefined);\n }\n InlineValueVariableLookup.is = is;\n})(InlineValueVariableLookup || (InlineValueVariableLookup = {}));\n/**\n * The InlineValueEvaluatableExpression namespace provides functions to deal with InlineValueEvaluatableExpression.\n *\n * @since 3.17.0\n */\nexport var InlineValueEvaluatableExpression;\n(function (InlineValueEvaluatableExpression) {\n /**\n * Creates a new InlineValueEvaluatableExpression literal.\n */\n function create(range, expression) {\n return { range, expression };\n }\n InlineValueEvaluatableExpression.create = create;\n function is(value) {\n const candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range)\n && (Is.string(candidate.expression) || candidate.expression === undefined);\n }\n InlineValueEvaluatableExpression.is = is;\n})(InlineValueEvaluatableExpression || (InlineValueEvaluatableExpression = {}));\n/**\n * The InlineValueContext namespace provides helper functions to work with\n * {@link InlineValueContext} literals.\n *\n * @since 3.17.0\n */\nexport var InlineValueContext;\n(function (InlineValueContext) {\n /**\n * Creates a new InlineValueContext literal.\n */\n function create(frameId, stoppedLocation) {\n return { frameId, stoppedLocation };\n }\n InlineValueContext.create = create;\n /**\n * Checks whether the given literal conforms to the {@link InlineValueContext} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.defined(candidate) && Range.is(value.stoppedLocation);\n }\n InlineValueContext.is = is;\n})(InlineValueContext || (InlineValueContext = {}));\n/**\n * Inlay hint kinds.\n *\n * @since 3.17.0\n */\nexport var InlayHintKind;\n(function (InlayHintKind) {\n /**\n * An inlay hint that for a type annotation.\n */\n InlayHintKind.Type = 1;\n /**\n * An inlay hint that is for a parameter.\n */\n InlayHintKind.Parameter = 2;\n function is(value) {\n return value === 1 || value === 2;\n }\n InlayHintKind.is = is;\n})(InlayHintKind || (InlayHintKind = {}));\nexport var InlayHintLabelPart;\n(function (InlayHintLabelPart) {\n function create(value) {\n return { value };\n }\n InlayHintLabelPart.create = create;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate)\n && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip))\n && (candidate.location === undefined || Location.is(candidate.location))\n && (candidate.command === undefined || Command.is(candidate.command));\n }\n InlayHintLabelPart.is = is;\n})(InlayHintLabelPart || (InlayHintLabelPart = {}));\nexport var InlayHint;\n(function (InlayHint) {\n function create(position, label, kind) {\n const result = { position, label };\n if (kind !== undefined) {\n result.kind = kind;\n }\n return result;\n }\n InlayHint.create = create;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Position.is(candidate.position)\n && (Is.string(candidate.label) || Is.typedArray(candidate.label, InlayHintLabelPart.is))\n && (candidate.kind === undefined || InlayHintKind.is(candidate.kind))\n && (candidate.textEdits === undefined) || Is.typedArray(candidate.textEdits, TextEdit.is)\n && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip))\n && (candidate.paddingLeft === undefined || Is.boolean(candidate.paddingLeft))\n && (candidate.paddingRight === undefined || Is.boolean(candidate.paddingRight));\n }\n InlayHint.is = is;\n})(InlayHint || (InlayHint = {}));\nexport var StringValue;\n(function (StringValue) {\n function createSnippet(value) {\n return { kind: 'snippet', value };\n }\n StringValue.createSnippet = createSnippet;\n})(StringValue || (StringValue = {}));\nexport var InlineCompletionItem;\n(function (InlineCompletionItem) {\n function create(insertText, filterText, range, command) {\n return { insertText, filterText, range, command };\n }\n InlineCompletionItem.create = create;\n})(InlineCompletionItem || (InlineCompletionItem = {}));\nexport var InlineCompletionList;\n(function (InlineCompletionList) {\n function create(items) {\n return { items };\n }\n InlineCompletionList.create = create;\n})(InlineCompletionList || (InlineCompletionList = {}));\n/**\n * Describes how an {@link InlineCompletionItemProvider inline completion provider} was triggered.\n *\n * @since 3.18.0\n * @proposed\n */\nexport var InlineCompletionTriggerKind;\n(function (InlineCompletionTriggerKind) {\n /**\n * Completion was triggered explicitly by a user gesture.\n */\n InlineCompletionTriggerKind.Invoked = 0;\n /**\n * Completion was triggered automatically while editing.\n */\n InlineCompletionTriggerKind.Automatic = 1;\n})(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {}));\nexport var SelectedCompletionInfo;\n(function (SelectedCompletionInfo) {\n function create(range, text) {\n return { range, text };\n }\n SelectedCompletionInfo.create = create;\n})(SelectedCompletionInfo || (SelectedCompletionInfo = {}));\nexport var InlineCompletionContext;\n(function (InlineCompletionContext) {\n function create(triggerKind, selectedCompletionInfo) {\n return { triggerKind, selectedCompletionInfo };\n }\n InlineCompletionContext.create = create;\n})(InlineCompletionContext || (InlineCompletionContext = {}));\nexport var WorkspaceFolder;\n(function (WorkspaceFolder) {\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && URI.is(candidate.uri) && Is.string(candidate.name);\n }\n WorkspaceFolder.is = is;\n})(WorkspaceFolder || (WorkspaceFolder = {}));\nexport const EOL = ['\\n', '\\r\\n', '\\r'];\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nexport var TextDocument;\n(function (TextDocument) {\n /**\n * Creates a new ITextDocument literal from the given uri and content.\n * @param uri The document's uri.\n * @param languageId The document's language Id.\n * @param version The document's version.\n * @param content The document's content.\n */\n function create(uri, languageId, version, content) {\n return new FullTextDocument(uri, languageId, version, content);\n }\n TextDocument.create = create;\n /**\n * Checks whether the given literal conforms to the {@link ITextDocument} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.uinteger(candidate.lineCount)\n && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false;\n }\n TextDocument.is = is;\n function applyEdits(document, edits) {\n let text = document.getText();\n let sortedEdits = mergeSort(edits, (a, b) => {\n let diff = a.range.start.line - b.range.start.line;\n if (diff === 0) {\n return a.range.start.character - b.range.start.character;\n }\n return diff;\n });\n let lastModifiedOffset = text.length;\n for (let i = sortedEdits.length - 1; i >= 0; i--) {\n let e = sortedEdits[i];\n let startOffset = document.offsetAt(e.range.start);\n let endOffset = document.offsetAt(e.range.end);\n if (endOffset <= lastModifiedOffset) {\n text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);\n }\n else {\n throw new Error('Overlapping edit');\n }\n lastModifiedOffset = startOffset;\n }\n return text;\n }\n TextDocument.applyEdits = applyEdits;\n function mergeSort(data, compare) {\n if (data.length <= 1) {\n // sorted\n return data;\n }\n const p = (data.length / 2) | 0;\n const left = data.slice(0, p);\n const right = data.slice(p);\n mergeSort(left, compare);\n mergeSort(right, compare);\n let leftIdx = 0;\n let rightIdx = 0;\n let i = 0;\n while (leftIdx < left.length && rightIdx < right.length) {\n let ret = compare(left[leftIdx], right[rightIdx]);\n if (ret <= 0) {\n // smaller_equal -> take left to preserve order\n data[i++] = left[leftIdx++];\n }\n else {\n // greater -> take right\n data[i++] = right[rightIdx++];\n }\n }\n while (leftIdx < left.length) {\n data[i++] = left[leftIdx++];\n }\n while (rightIdx < right.length) {\n data[i++] = right[rightIdx++];\n }\n return data;\n }\n})(TextDocument || (TextDocument = {}));\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nclass FullTextDocument {\n constructor(uri, languageId, version, content) {\n this._uri = uri;\n this._languageId = languageId;\n this._version = version;\n this._content = content;\n this._lineOffsets = undefined;\n }\n get uri() {\n return this._uri;\n }\n get languageId() {\n return this._languageId;\n }\n get version() {\n return this._version;\n }\n getText(range) {\n if (range) {\n let start = this.offsetAt(range.start);\n let end = this.offsetAt(range.end);\n return this._content.substring(start, end);\n }\n return this._content;\n }\n update(event, version) {\n this._content = event.text;\n this._version = version;\n this._lineOffsets = undefined;\n }\n getLineOffsets() {\n if (this._lineOffsets === undefined) {\n let lineOffsets = [];\n let text = this._content;\n let isLineStart = true;\n for (let i = 0; i < text.length; i++) {\n if (isLineStart) {\n lineOffsets.push(i);\n isLineStart = false;\n }\n let ch = text.charAt(i);\n isLineStart = (ch === '\\r' || ch === '\\n');\n if (ch === '\\r' && i + 1 < text.length && text.charAt(i + 1) === '\\n') {\n i++;\n }\n }\n if (isLineStart && text.length > 0) {\n lineOffsets.push(text.length);\n }\n this._lineOffsets = lineOffsets;\n }\n return this._lineOffsets;\n }\n positionAt(offset) {\n offset = Math.max(Math.min(offset, this._content.length), 0);\n let lineOffsets = this.getLineOffsets();\n let low = 0, high = lineOffsets.length;\n if (high === 0) {\n return Position.create(0, offset);\n }\n while (low < high) {\n let mid = Math.floor((low + high) / 2);\n if (lineOffsets[mid] > offset) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n // low is the least x for which the line offset is larger than the current offset\n // or array.length if no line offset is larger than the current offset\n let line = low - 1;\n return Position.create(line, offset - lineOffsets[line]);\n }\n offsetAt(position) {\n let lineOffsets = this.getLineOffsets();\n if (position.line >= lineOffsets.length) {\n return this._content.length;\n }\n else if (position.line < 0) {\n return 0;\n }\n let lineOffset = lineOffsets[position.line];\n let nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;\n return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);\n }\n get lineCount() {\n return this.getLineOffsets().length;\n }\n}\nvar Is;\n(function (Is) {\n const toString = Object.prototype.toString;\n function defined(value) {\n return typeof value !== 'undefined';\n }\n Is.defined = defined;\n function undefined(value) {\n return typeof value === 'undefined';\n }\n Is.undefined = undefined;\n function boolean(value) {\n return value === true || value === false;\n }\n Is.boolean = boolean;\n function string(value) {\n return toString.call(value) === '[object String]';\n }\n Is.string = string;\n function number(value) {\n return toString.call(value) === '[object Number]';\n }\n Is.number = number;\n function numberRange(value, min, max) {\n return toString.call(value) === '[object Number]' && min <= value && value <= max;\n }\n Is.numberRange = numberRange;\n function integer(value) {\n return toString.call(value) === '[object Number]' && -2147483648 <= value && value <= 2147483647;\n }\n Is.integer = integer;\n function uinteger(value) {\n return toString.call(value) === '[object Number]' && 0 <= value && value <= 2147483647;\n }\n Is.uinteger = uinteger;\n function func(value) {\n return toString.call(value) === '[object Function]';\n }\n Is.func = func;\n function objectLiteral(value) {\n // Strictly speaking class instances pass this check as well. Since the LSP\n // doesn't use classes we ignore this for now. If we do we need to add something\n // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`\n return value !== null && typeof value === 'object';\n }\n Is.objectLiteral = objectLiteral;\n function typedArray(value, check) {\n return Array.isArray(value) && value.every(check);\n }\n Is.typedArray = typedArray;\n})(Is || (Is = {}));\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { IToken, TokenType } from 'chevrotain';\r\nimport type { Range } from 'vscode-languageserver-types';\r\nimport type { AbstractElement } from '../languages/generated/ast.js';\r\nimport type { AstNode, CompositeCstNode, CstNode, LeafCstNode, RootCstNode } from '../syntax-tree.js';\r\nimport { Position } from 'vscode-languageserver-types';\r\nimport { tokenToRange } from '../utils/cst-utils.js';\r\n\r\nexport class CstNodeBuilder {\r\n\r\n private rootNode!: RootCstNodeImpl;\r\n private nodeStack: CompositeCstNodeImpl[] = [];\r\n\r\n get current(): CompositeCstNodeImpl {\r\n return this.nodeStack[this.nodeStack.length - 1] ?? this.rootNode;\r\n }\r\n\r\n buildRootNode(input: string): RootCstNode {\r\n this.rootNode = new RootCstNodeImpl(input);\r\n this.rootNode.root = this.rootNode;\r\n this.nodeStack = [this.rootNode];\r\n return this.rootNode;\r\n }\r\n\r\n buildCompositeNode(feature: AbstractElement): CompositeCstNode {\r\n const compositeNode = new CompositeCstNodeImpl();\r\n compositeNode.grammarSource = feature;\r\n compositeNode.root = this.rootNode;\r\n this.current.content.push(compositeNode);\r\n this.nodeStack.push(compositeNode);\r\n return compositeNode;\r\n }\r\n\r\n buildLeafNode(token: IToken, feature?: AbstractElement): LeafCstNode {\r\n const leafNode = new LeafCstNodeImpl(token.startOffset, token.image.length, tokenToRange(token), token.tokenType, !feature);\r\n leafNode.grammarSource = feature;\r\n leafNode.root = this.rootNode;\r\n this.current.content.push(leafNode);\r\n return leafNode;\r\n }\r\n\r\n removeNode(node: CstNode): void {\r\n const parent = node.container;\r\n if (parent) {\r\n const index = parent.content.indexOf(node);\r\n if (index >= 0) {\r\n parent.content.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n addHiddenNodes(tokens: IToken[]): void {\r\n const nodes: LeafCstNode[] = [];\r\n for (const token of tokens) {\r\n const leafNode = new LeafCstNodeImpl(token.startOffset, token.image.length, tokenToRange(token), token.tokenType, true);\r\n leafNode.root = this.rootNode;\r\n nodes.push(leafNode);\r\n }\r\n let current: CompositeCstNode = this.current;\r\n let added = false;\r\n // If we are within a composite node, we add the hidden nodes to the content\r\n if (current.content.length > 0) {\r\n current.content.push(...nodes);\r\n return;\r\n }\r\n // Otherwise we are at a newly created node\r\n // Instead of adding the hidden nodes here, we search for the first parent node with content\r\n while (current.container) {\r\n const index = current.container.content.indexOf(current);\r\n if (index > 0) {\r\n // Add the hidden nodes before the current node\r\n current.container.content.splice(index, 0, ...nodes);\r\n added = true;\r\n break;\r\n }\r\n current = current.container;\r\n }\r\n // If we arrive at the root node, we add the hidden nodes at the beginning\r\n // This is the case if the hidden nodes are the first nodes in the tree\r\n if (!added) {\r\n this.rootNode.content.unshift(...nodes);\r\n }\r\n }\r\n\r\n construct(item: { $type: string | symbol | undefined, $cstNode: CstNode }): void {\r\n const current: CstNode = this.current;\r\n // The specified item could be a datatype ($type is symbol) or a fragment ($type is undefined)\r\n // Only if the $type is a string, we actually assign the element\r\n if (typeof item.$type === 'string') {\r\n this.current.astNode = item;\r\n }\r\n item.$cstNode = current;\r\n const node = this.nodeStack.pop();\r\n // Empty composite nodes are not valid\r\n // Simply remove the node from the tree\r\n if (node?.content.length === 0) {\r\n this.removeNode(node);\r\n }\r\n }\r\n}\r\n\r\nexport abstract class AbstractCstNode implements CstNode {\r\n abstract get offset(): number;\r\n abstract get length(): number;\r\n abstract get end(): number;\r\n abstract get range(): Range;\r\n\r\n container?: CompositeCstNode;\r\n grammarSource?: AbstractElement;\r\n root: RootCstNode;\r\n private _astNode?: AstNode;\r\n\r\n /** @deprecated use `container` instead. */\r\n get parent(): CompositeCstNode | undefined {\r\n return this.container;\r\n }\r\n\r\n /** @deprecated use `grammarSource` instead. */\r\n get feature(): AbstractElement | undefined {\r\n return this.grammarSource;\r\n }\r\n\r\n get hidden(): boolean {\r\n return false;\r\n }\r\n\r\n get astNode(): AstNode {\r\n const node = typeof this._astNode?.$type === 'string' ? this._astNode : this.container?.astNode;\r\n if (!node) {\r\n throw new Error('This node has no associated AST element');\r\n }\r\n return node;\r\n }\r\n\r\n set astNode(value: AstNode | undefined) {\r\n this._astNode = value;\r\n }\r\n\r\n /** @deprecated use `astNode` instead. */\r\n get element(): AstNode {\r\n return this.astNode;\r\n }\r\n\r\n get text(): string {\r\n return this.root.fullText.substring(this.offset, this.end);\r\n }\r\n}\r\n\r\nexport class LeafCstNodeImpl extends AbstractCstNode implements LeafCstNode {\r\n get offset(): number {\r\n return this._offset;\r\n }\r\n\r\n get length(): number {\r\n return this._length;\r\n }\r\n\r\n get end(): number {\r\n return this._offset + this._length;\r\n }\r\n\r\n override get hidden(): boolean {\r\n return this._hidden;\r\n }\r\n\r\n get tokenType(): TokenType {\r\n return this._tokenType;\r\n }\r\n\r\n get range(): Range {\r\n return this._range;\r\n }\r\n\r\n private _hidden: boolean;\r\n private _offset: number;\r\n private _length: number;\r\n private _range: Range;\r\n private _tokenType: TokenType;\r\n\r\n constructor(offset: number, length: number, range: Range, tokenType: TokenType, hidden = false) {\r\n super();\r\n this._hidden = hidden;\r\n this._offset = offset;\r\n this._tokenType = tokenType;\r\n this._length = length;\r\n this._range = range;\r\n }\r\n}\r\n\r\nexport class CompositeCstNodeImpl extends AbstractCstNode implements CompositeCstNode {\r\n readonly content: CstNode[] = new CstNodeContainer(this);\r\n private _rangeCache?: Range;\r\n\r\n /** @deprecated use `content` instead. */\r\n get children(): CstNode[] {\r\n return this.content;\r\n }\r\n\r\n get offset(): number {\r\n return this.firstNonHiddenNode?.offset ?? 0;\r\n }\r\n\r\n get length(): number {\r\n return this.end - this.offset;\r\n }\r\n\r\n get end(): number {\r\n return this.lastNonHiddenNode?.end ?? 0;\r\n }\r\n\r\n get range(): Range {\r\n const firstNode = this.firstNonHiddenNode;\r\n const lastNode = this.lastNonHiddenNode;\r\n if (firstNode && lastNode) {\r\n if (this._rangeCache === undefined) {\r\n const { range: firstRange } = firstNode;\r\n const { range: lastRange } = lastNode;\r\n this._rangeCache = { start: firstRange.start, end: lastRange.end.line < firstRange.start.line ? firstRange.start : lastRange.end };\r\n }\r\n return this._rangeCache;\r\n } else {\r\n return { start: Position.create(0, 0), end: Position.create(0, 0) };\r\n }\r\n }\r\n\r\n private get firstNonHiddenNode(): CstNode | undefined {\r\n for (const child of this.content) {\r\n if (!child.hidden) {\r\n return child;\r\n }\r\n }\r\n return this.content[0];\r\n }\r\n\r\n private get lastNonHiddenNode(): CstNode | undefined {\r\n for (let i = this.content.length - 1; i >= 0; i--) {\r\n const child = this.content[i];\r\n if (!child.hidden) {\r\n return child;\r\n }\r\n }\r\n return this.content[this.content.length - 1];\r\n }\r\n}\r\n\r\nclass CstNodeContainer extends Array {\r\n readonly parent: CompositeCstNode;\r\n\r\n constructor(parent: CompositeCstNode) {\r\n super();\r\n this.parent = parent;\r\n Object.setPrototypeOf(this, CstNodeContainer.prototype);\r\n }\r\n\r\n override push(...items: CstNode[]): number {\r\n this.addParents(items);\r\n return super.push(...items);\r\n }\r\n\r\n override unshift(...items: CstNode[]): number {\r\n this.addParents(items);\r\n return super.unshift(...items);\r\n }\r\n\r\n override splice(start: number, count: number, ...items: CstNode[]): CstNode[] {\r\n this.addParents(items);\r\n return super.splice(start, count, ...items);\r\n }\r\n\r\n private addParents(items: CstNode[]): void {\r\n for (const item of items) {\r\n (item).container = this.parent;\r\n }\r\n }\r\n}\r\n\r\nexport class RootCstNodeImpl extends CompositeCstNodeImpl implements RootCstNode {\r\n private _text = '';\r\n\r\n override get text(): string {\r\n return this._text.substring(this.offset, this.end);\r\n }\r\n\r\n get fullText(): string {\r\n return this._text;\r\n }\r\n\r\n constructor(input?: string) {\r\n super();\r\n this._text = input ?? '';\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport type { DSLMethodOpts, ILexingError, IOrAlt, IParserErrorMessageProvider, IRecognitionException, IToken, TokenType, TokenVocabulary } from 'chevrotain';\r\nimport type { AbstractElement, Action, Assignment, ParserRule } from '../languages/generated/ast.js';\r\nimport type { Linker } from '../references/linker.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstReflection, CompositeCstNode, CstNode } from '../syntax-tree.js';\r\nimport type { Lexer, LexerResult } from './lexer.js';\r\nimport type { IParserConfig } from './parser-config.js';\r\nimport type { ValueConverter } from './value-converter.js';\r\nimport { defaultParserErrorProvider, EmbeddedActionsParser, LLkLookaheadStrategy } from 'chevrotain';\r\nimport { LLStarLookaheadStrategy } from 'chevrotain-allstar';\r\nimport { isAssignment, isCrossReference, isKeyword } from '../languages/generated/ast.js';\r\nimport { getExplicitRuleType, isDataTypeRule } from '../utils/grammar-utils.js';\r\nimport { assignMandatoryProperties, getContainerOfType, linkContentToContainer } from '../utils/ast-utils.js';\r\nimport { CstNodeBuilder } from './cst-node-builder.js';\r\nimport type { LexingReport } from './token-builder.js';\r\n\r\nexport type ParseResult = {\r\n value: T,\r\n parserErrors: IRecognitionException[],\r\n lexerErrors: ILexingError[],\r\n lexerReport?: LexingReport\r\n}\r\n\r\nexport const DatatypeSymbol = Symbol('Datatype');\r\n\r\ninterface DataTypeNode {\r\n $cstNode: CompositeCstNode\r\n /** Instead of a string, this node is uniquely identified by the `Datatype` symbol */\r\n $type: symbol\r\n /** Used as a storage for all parsed terminals, keywords and sub-datatype rules */\r\n value: string\r\n}\r\n\r\nfunction isDataTypeNode(node: { $type: string | symbol | undefined }): node is DataTypeNode {\r\n return node.$type === DatatypeSymbol;\r\n}\r\n\r\ntype RuleResult = (args: Args) => any;\r\n\r\ntype Args = Record;\r\n\r\ntype RuleImpl = (args: Args) => any;\r\n\r\ninterface AssignmentElement {\r\n assignment?: Assignment\r\n isCrossRef: boolean\r\n}\r\n\r\n/**\r\n * Base interface for all parsers. Mainly used by the `parser-builder-base.ts` to perform work on different kinds of parsers.\r\n * The main use cases are:\r\n * * AST parser: Based on a string, create an AST for the current grammar\r\n * * Completion parser: Based on a partial string, identify the current position of the input within the grammar\r\n */\r\nexport interface BaseParser {\r\n /**\r\n * Adds a new parser rule to the parser\r\n */\r\n rule(rule: ParserRule, impl: RuleImpl): RuleResult;\r\n /**\r\n * Returns the executable rule function for the specified rule name\r\n */\r\n getRule(name: string): RuleResult | undefined;\r\n /**\r\n * Performs alternatives parsing (the `|` operation in EBNF/Langium)\r\n */\r\n alternatives(idx: number, choices: Array>): void;\r\n /**\r\n * Parses the callback as optional (the `?` operation in EBNF/Langium)\r\n */\r\n optional(idx: number, callback: DSLMethodOpts): void;\r\n /**\r\n * Parses the callback 0 or more times (the `*` operation in EBNF/Langium)\r\n */\r\n many(idx: number, callback: DSLMethodOpts): void;\r\n /**\r\n * Parses the callback 1 or more times (the `+` operation in EBNF/Langium)\r\n */\r\n atLeastOne(idx: number, callback: DSLMethodOpts): void;\r\n /**\r\n * Consumes a specific token type from the token input stream.\r\n * Requires a unique index within the rule for a specific token type.\r\n */\r\n consume(idx: number, tokenType: TokenType, feature: AbstractElement): void;\r\n /**\r\n * Invokes the executable function for a given parser rule.\r\n * Requires a unique index within the rule for a specific sub rule.\r\n * Arguments can be supplied to the rule invocation for semantic predicates\r\n */\r\n subrule(idx: number, rule: RuleResult, fragment: boolean, feature: AbstractElement, args: Args): void;\r\n /**\r\n * Executes a grammar action that modifies the currently active AST node\r\n */\r\n action($type: string, action: Action): void;\r\n /**\r\n * Finishes construction of the current AST node. Only used by the AST parser.\r\n */\r\n construct(): unknown;\r\n /**\r\n * Whether the parser is currently actually in use or in \"recording mode\".\r\n * Recording mode is activated once when the parser is analyzing itself.\r\n * During this phase, no input exists and therefore no AST should be constructed\r\n */\r\n isRecording(): boolean;\r\n /**\r\n * Current state of the unordered groups\r\n */\r\n get unorderedGroups(): Map;\r\n /**\r\n * The rule stack indicates the indices of rules that are currently invoked,\r\n * in order of their invocation.\r\n */\r\n getRuleStack(): number[];\r\n}\r\n\r\nconst ruleSuffix = '\\u200B';\r\nconst withRuleSuffix = (name: string): string => name.endsWith(ruleSuffix) ? name : name + ruleSuffix;\r\n\r\nexport abstract class AbstractLangiumParser implements BaseParser {\r\n\r\n protected readonly lexer: Lexer;\r\n protected readonly wrapper: ChevrotainWrapper;\r\n protected _unorderedGroups: Map = new Map();\r\n\r\n protected allRules = new Map();\r\n protected mainRule!: RuleResult;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.lexer = services.parser.Lexer;\r\n const tokens = this.lexer.definition;\r\n const production = services.LanguageMetaData.mode === 'production';\r\n this.wrapper = new ChevrotainWrapper(tokens, {\r\n ...services.parser.ParserConfig,\r\n skipValidations: production,\r\n errorMessageProvider: services.parser.ParserErrorMessageProvider\r\n });\r\n }\r\n\r\n alternatives(idx: number, choices: Array>): void {\r\n this.wrapper.wrapOr(idx, choices);\r\n }\r\n\r\n optional(idx: number, callback: DSLMethodOpts): void {\r\n this.wrapper.wrapOption(idx, callback);\r\n }\r\n\r\n many(idx: number, callback: DSLMethodOpts): void {\r\n this.wrapper.wrapMany(idx, callback);\r\n }\r\n\r\n atLeastOne(idx: number, callback: DSLMethodOpts): void {\r\n this.wrapper.wrapAtLeastOne(idx, callback);\r\n }\r\n\r\n abstract rule(rule: ParserRule, impl: RuleImpl): RuleResult;\r\n abstract consume(idx: number, tokenType: TokenType, feature: AbstractElement): void;\r\n abstract subrule(idx: number, rule: RuleResult, fragment: boolean, feature: AbstractElement, args: Args): void;\r\n abstract action($type: string, action: Action): void;\r\n abstract construct(): unknown;\r\n\r\n getRule(name: string): RuleResult | undefined {\r\n return this.allRules.get(name);\r\n }\r\n\r\n isRecording(): boolean {\r\n return this.wrapper.IS_RECORDING;\r\n }\r\n\r\n get unorderedGroups(): Map {\r\n return this._unorderedGroups;\r\n }\r\n\r\n getRuleStack(): number[] {\r\n return (this.wrapper as any).RULE_STACK;\r\n }\r\n\r\n finalize(): void {\r\n this.wrapper.wrapSelfAnalysis();\r\n }\r\n}\r\n\r\nexport interface ParserOptions {\r\n rule?: string\r\n}\r\n\r\nexport class LangiumParser extends AbstractLangiumParser {\r\n private readonly linker: Linker;\r\n private readonly converter: ValueConverter;\r\n private readonly astReflection: AstReflection;\r\n private readonly nodeBuilder = new CstNodeBuilder();\r\n private lexerResult?: LexerResult;\r\n private stack: any[] = [];\r\n private assignmentMap = new Map();\r\n\r\n private get current(): any {\r\n return this.stack[this.stack.length - 1];\r\n }\r\n\r\n constructor(services: LangiumCoreServices) {\r\n super(services);\r\n this.linker = services.references.Linker;\r\n this.converter = services.parser.ValueConverter;\r\n this.astReflection = services.shared.AstReflection;\r\n }\r\n\r\n rule(rule: ParserRule, impl: RuleImpl): RuleResult {\r\n const type = this.computeRuleType(rule);\r\n const ruleMethod = this.wrapper.DEFINE_RULE(withRuleSuffix(rule.name), this.startImplementation(type, impl).bind(this));\r\n this.allRules.set(rule.name, ruleMethod);\r\n if (rule.entry) {\r\n this.mainRule = ruleMethod;\r\n }\r\n return ruleMethod;\r\n }\r\n\r\n private computeRuleType(rule: ParserRule): string | symbol | undefined {\r\n if (rule.fragment) {\r\n return undefined;\r\n } else if (isDataTypeRule(rule)) {\r\n return DatatypeSymbol;\r\n } else {\r\n const explicit = getExplicitRuleType(rule);\r\n return explicit ?? rule.name;\r\n }\r\n }\r\n\r\n parse(input: string, options: ParserOptions = {}): ParseResult {\r\n this.nodeBuilder.buildRootNode(input);\r\n const lexerResult = this.lexerResult = this.lexer.tokenize(input);\r\n this.wrapper.input = lexerResult.tokens;\r\n const ruleMethod = options.rule ? this.allRules.get(options.rule) : this.mainRule;\r\n if (!ruleMethod) {\r\n throw new Error(options.rule ? `No rule found with name '${options.rule}'` : 'No main rule available.');\r\n }\r\n const result = ruleMethod.call(this.wrapper, {});\r\n this.nodeBuilder.addHiddenNodes(lexerResult.hidden);\r\n this.unorderedGroups.clear();\r\n this.lexerResult = undefined;\r\n return {\r\n value: result,\r\n lexerErrors: lexerResult.errors,\r\n lexerReport: lexerResult.report,\r\n parserErrors: this.wrapper.errors\r\n };\r\n }\r\n\r\n private startImplementation($type: string | symbol | undefined, implementation: RuleImpl): RuleImpl {\r\n return (args) => {\r\n // Only create a new AST node in case the calling rule is not a fragment rule\r\n const createNode = !this.isRecording() && $type !== undefined;\r\n if (createNode) {\r\n const node: any = { $type };\r\n this.stack.push(node);\r\n if ($type === DatatypeSymbol) {\r\n node.value = '';\r\n }\r\n }\r\n let result: unknown;\r\n try {\r\n result = implementation(args);\r\n } catch (err) {\r\n result = undefined;\r\n }\r\n if (result === undefined && createNode) {\r\n result = this.construct();\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n private extractHiddenTokens(token: IToken): IToken[] {\r\n const hiddenTokens = this.lexerResult!.hidden;\r\n if (!hiddenTokens.length) {\r\n return [];\r\n }\r\n const offset = token.startOffset;\r\n for (let i = 0; i < hiddenTokens.length; i++) {\r\n const token = hiddenTokens[i];\r\n if (token.startOffset > offset) {\r\n return hiddenTokens.splice(0, i);\r\n }\r\n }\r\n return hiddenTokens.splice(0, hiddenTokens.length);\r\n }\r\n\r\n consume(idx: number, tokenType: TokenType, feature: AbstractElement): void {\r\n const token = this.wrapper.wrapConsume(idx, tokenType);\r\n if (!this.isRecording() && this.isValidToken(token)) {\r\n const hiddenTokens = this.extractHiddenTokens(token);\r\n this.nodeBuilder.addHiddenNodes(hiddenTokens);\r\n const leafNode = this.nodeBuilder.buildLeafNode(token, feature);\r\n const { assignment, isCrossRef } = this.getAssignment(feature);\r\n const current = this.current;\r\n if (assignment) {\r\n const convertedValue = isKeyword(feature) ? token.image : this.converter.convert(token.image, leafNode);\r\n this.assign(assignment.operator, assignment.feature, convertedValue, leafNode, isCrossRef);\r\n } else if (isDataTypeNode(current)) {\r\n let text = token.image;\r\n if (!isKeyword(feature)) {\r\n text = this.converter.convert(text, leafNode).toString();\r\n }\r\n current.value += text;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Most consumed parser tokens are valid. However there are two cases in which they are not valid:\r\n *\r\n * 1. They were inserted during error recovery by the parser. These tokens don't really exist and should not be further processed\r\n * 2. They contain invalid token ranges. This might include the special EOF token, or other tokens produced by invalid token builders.\r\n */\r\n private isValidToken(token: IToken): boolean {\r\n return !token.isInsertedInRecovery && !isNaN(token.startOffset) && typeof token.endOffset === 'number' && !isNaN(token.endOffset);\r\n }\r\n\r\n subrule(idx: number, rule: RuleResult, fragment: boolean, feature: AbstractElement, args: Args): void {\r\n let cstNode: CompositeCstNode | undefined;\r\n if (!this.isRecording() && !fragment) {\r\n // We only want to create a new CST node if the subrule actually creates a new AST node.\r\n // In other cases like calls of fragment rules the current CST/AST is populated further.\r\n // Note that skipping this initialization and leaving cstNode unassigned also skips the subrule assignment later on.\r\n // This is intended, as fragment rules only enrich the current AST node\r\n cstNode = this.nodeBuilder.buildCompositeNode(feature);\r\n }\r\n const subruleResult = this.wrapper.wrapSubrule(idx, rule, args) as any;\r\n if (!this.isRecording() && cstNode && cstNode.length > 0) {\r\n this.performSubruleAssignment(subruleResult, feature, cstNode);\r\n }\r\n }\r\n\r\n private performSubruleAssignment(result: any, feature: AbstractElement, cstNode: CompositeCstNode): void {\r\n const { assignment, isCrossRef } = this.getAssignment(feature);\r\n if (assignment) {\r\n this.assign(assignment.operator, assignment.feature, result, cstNode, isCrossRef);\r\n } else if (!assignment) {\r\n // If we call a subrule without an assignment we either:\r\n // 1. append the result of the subrule (data type rule)\r\n // 2. override the current object with the newly parsed object\r\n // If the current element is an AST node and the result of the subrule\r\n // is a data type rule, we can safely discard the results.\r\n const current = this.current;\r\n if (isDataTypeNode(current)) {\r\n current.value += result.toString();\r\n } else if (typeof result === 'object' && result) {\r\n const object = this.assignWithoutOverride(result, current);\r\n const newItem = object;\r\n this.stack.pop();\r\n this.stack.push(newItem);\r\n }\r\n }\r\n }\r\n\r\n action($type: string, action: Action): void {\r\n if (!this.isRecording()) {\r\n let last = this.current;\r\n if (action.feature && action.operator) {\r\n last = this.construct();\r\n this.nodeBuilder.removeNode(last.$cstNode);\r\n const node = this.nodeBuilder.buildCompositeNode(action);\r\n node.content.push(last.$cstNode);\r\n const newItem = { $type };\r\n this.stack.push(newItem);\r\n this.assign(action.operator, action.feature, last, last.$cstNode, false);\r\n } else {\r\n last.$type = $type;\r\n }\r\n }\r\n }\r\n\r\n construct(): unknown {\r\n if (this.isRecording()) {\r\n return undefined;\r\n }\r\n const obj = this.current;\r\n linkContentToContainer(obj);\r\n this.nodeBuilder.construct(obj);\r\n this.stack.pop();\r\n if (isDataTypeNode(obj)) {\r\n return this.converter.convert(obj.value, obj.$cstNode);\r\n } else {\r\n assignMandatoryProperties(this.astReflection, obj);\r\n }\r\n return obj;\r\n }\r\n\r\n private getAssignment(feature: AbstractElement): AssignmentElement {\r\n if (!this.assignmentMap.has(feature)) {\r\n const assignment = getContainerOfType(feature, isAssignment);\r\n this.assignmentMap.set(feature, {\r\n assignment: assignment,\r\n isCrossRef: assignment ? isCrossReference(assignment.terminal) : false\r\n });\r\n }\r\n return this.assignmentMap.get(feature)!;\r\n }\r\n\r\n private assign(operator: string, feature: string, value: unknown, cstNode: CstNode, isCrossRef: boolean): void {\r\n const obj = this.current;\r\n let item: unknown;\r\n if (isCrossRef && typeof value === 'string') {\r\n item = this.linker.buildReference(obj, feature, cstNode, value);\r\n } else {\r\n item = value;\r\n }\r\n switch (operator) {\r\n case '=': {\r\n obj[feature] = item;\r\n break;\r\n }\r\n case '?=': {\r\n obj[feature] = true;\r\n break;\r\n }\r\n case '+=': {\r\n if (!Array.isArray(obj[feature])) {\r\n obj[feature] = [];\r\n }\r\n obj[feature].push(item);\r\n }\r\n }\r\n }\r\n\r\n private assignWithoutOverride(target: any, source: any): any {\r\n for (const [name, existingValue] of Object.entries(source)) {\r\n const newValue = target[name];\r\n if (newValue === undefined) {\r\n target[name] = existingValue;\r\n } else if (Array.isArray(newValue) && Array.isArray(existingValue)) {\r\n existingValue.push(...newValue);\r\n target[name] = existingValue;\r\n }\r\n }\r\n // The target was parsed from a unassigned subrule\r\n // After the subrule construction, it received a cst node\r\n // This CST node will later be overriden by the cst node builder\r\n // To prevent references to stale AST nodes in the CST,\r\n // we need to remove the reference here\r\n const targetCstNode = target.$cstNode;\r\n if (targetCstNode) {\r\n targetCstNode.astNode = undefined;\r\n target.$cstNode = undefined;\r\n }\r\n return target;\r\n }\r\n\r\n get definitionErrors(): IParserDefinitionError[] {\r\n return this.wrapper.definitionErrors;\r\n }\r\n}\r\n\r\nexport interface IParserDefinitionError {\r\n message: string\r\n type: number\r\n ruleName?: string\r\n}\r\n\r\nexport abstract class AbstractParserErrorMessageProvider implements IParserErrorMessageProvider {\r\n\r\n buildMismatchTokenMessage(options: {\r\n expected: TokenType\r\n actual: IToken\r\n previous: IToken\r\n ruleName: string\r\n }): string {\r\n return defaultParserErrorProvider.buildMismatchTokenMessage(options);\r\n }\r\n\r\n buildNotAllInputParsedMessage(options: {\r\n firstRedundant: IToken\r\n ruleName: string\r\n }): string {\r\n return defaultParserErrorProvider.buildNotAllInputParsedMessage(options);\r\n }\r\n\r\n buildNoViableAltMessage(options: {\r\n expectedPathsPerAlt: TokenType[][][]\r\n actual: IToken[]\r\n previous: IToken\r\n customUserDescription: string\r\n ruleName: string\r\n }): string {\r\n return defaultParserErrorProvider.buildNoViableAltMessage(options);\r\n }\r\n\r\n buildEarlyExitMessage(options: {\r\n expectedIterationPaths: TokenType[][]\r\n actual: IToken[]\r\n previous: IToken\r\n customUserDescription: string\r\n ruleName: string\r\n }): string {\r\n return defaultParserErrorProvider.buildEarlyExitMessage(options);\r\n }\r\n\r\n}\r\n\r\nexport class LangiumParserErrorMessageProvider extends AbstractParserErrorMessageProvider {\r\n\r\n override buildMismatchTokenMessage({ expected, actual }: {\r\n expected: TokenType\r\n actual: IToken\r\n previous: IToken\r\n ruleName: string\r\n }): string {\r\n const expectedMsg = expected.LABEL\r\n ? '`' + expected.LABEL + '`'\r\n : expected.name.endsWith(':KW')\r\n ? `keyword '${expected.name.substring(0, expected.name.length - 3)}'`\r\n : `token of type '${expected.name}'`;\r\n return `Expecting ${expectedMsg} but found \\`${actual.image}\\`.`;\r\n }\r\n\r\n override buildNotAllInputParsedMessage({ firstRedundant }: {\r\n firstRedundant: IToken\r\n ruleName: string\r\n }): string {\r\n return `Expecting end of file but found \\`${firstRedundant.image}\\`.`;\r\n }\r\n}\r\n\r\nexport interface CompletionParserResult {\r\n tokens: IToken[]\r\n elementStack: AbstractElement[]\r\n tokenIndex: number\r\n}\r\n\r\nexport class LangiumCompletionParser extends AbstractLangiumParser {\r\n private tokens: IToken[] = [];\r\n\r\n private elementStack: AbstractElement[] = [];\r\n private lastElementStack: AbstractElement[] = [];\r\n private nextTokenIndex = 0;\r\n private stackSize = 0;\r\n\r\n action(): void {\r\n // NOOP\r\n }\r\n\r\n construct(): unknown {\r\n // NOOP\r\n return undefined;\r\n }\r\n\r\n parse(input: string): CompletionParserResult {\r\n this.resetState();\r\n const tokens = this.lexer.tokenize(input, { mode: 'partial' });\r\n this.tokens = tokens.tokens;\r\n this.wrapper.input = [...this.tokens];\r\n this.mainRule.call(this.wrapper, {});\r\n this.unorderedGroups.clear();\r\n return {\r\n tokens: this.tokens,\r\n elementStack: [...this.lastElementStack],\r\n tokenIndex: this.nextTokenIndex\r\n };\r\n }\r\n\r\n rule(rule: ParserRule, impl: RuleImpl): RuleResult {\r\n const ruleMethod = this.wrapper.DEFINE_RULE(withRuleSuffix(rule.name), this.startImplementation(impl).bind(this));\r\n this.allRules.set(rule.name, ruleMethod);\r\n if (rule.entry) {\r\n this.mainRule = ruleMethod;\r\n }\r\n return ruleMethod;\r\n }\r\n\r\n private resetState(): void {\r\n this.elementStack = [];\r\n this.lastElementStack = [];\r\n this.nextTokenIndex = 0;\r\n this.stackSize = 0;\r\n }\r\n\r\n private startImplementation(implementation: RuleImpl): RuleImpl {\r\n return (args) => {\r\n const size = this.keepStackSize();\r\n try {\r\n implementation(args);\r\n } finally {\r\n this.resetStackSize(size);\r\n }\r\n };\r\n }\r\n\r\n private removeUnexpectedElements(): void {\r\n this.elementStack.splice(this.stackSize);\r\n }\r\n\r\n keepStackSize(): number {\r\n const size = this.elementStack.length;\r\n this.stackSize = size;\r\n return size;\r\n }\r\n\r\n resetStackSize(size: number): void {\r\n this.removeUnexpectedElements();\r\n this.stackSize = size;\r\n }\r\n\r\n consume(idx: number, tokenType: TokenType, feature: AbstractElement): void {\r\n this.wrapper.wrapConsume(idx, tokenType);\r\n if (!this.isRecording()) {\r\n this.lastElementStack = [...this.elementStack, feature];\r\n this.nextTokenIndex = this.currIdx + 1;\r\n }\r\n }\r\n\r\n subrule(idx: number, rule: RuleResult, fragment: boolean, feature: AbstractElement, args: Args): void {\r\n this.before(feature);\r\n this.wrapper.wrapSubrule(idx, rule, args);\r\n this.after(feature);\r\n }\r\n\r\n before(element: AbstractElement): void {\r\n if (!this.isRecording()) {\r\n this.elementStack.push(element);\r\n }\r\n }\r\n\r\n after(element: AbstractElement): void {\r\n if (!this.isRecording()) {\r\n const index = this.elementStack.lastIndexOf(element);\r\n if (index >= 0) {\r\n this.elementStack.splice(index);\r\n }\r\n }\r\n }\r\n\r\n get currIdx(): number {\r\n return (this.wrapper as any).currIdx;\r\n }\r\n}\r\n\r\nconst defaultConfig: IParserConfig = {\r\n recoveryEnabled: true,\r\n nodeLocationTracking: 'full',\r\n skipValidations: true,\r\n errorMessageProvider: new LangiumParserErrorMessageProvider()\r\n};\r\n\r\n/**\r\n * This class wraps the embedded actions parser of chevrotain and exposes protected methods.\r\n * This way, we can build the `LangiumParser` as a composition.\r\n */\r\nclass ChevrotainWrapper extends EmbeddedActionsParser {\r\n\r\n // This array is set in the base implementation of Chevrotain.\r\n definitionErrors: IParserDefinitionError[];\r\n\r\n constructor(tokens: TokenVocabulary, config: IParserConfig) {\r\n const useDefaultLookahead = config && 'maxLookahead' in config;\r\n super(tokens, {\r\n ...defaultConfig,\r\n lookaheadStrategy: useDefaultLookahead\r\n ? new LLkLookaheadStrategy({ maxLookahead: config.maxLookahead })\r\n : new LLStarLookaheadStrategy({\r\n // If validations are skipped, don't log the lookahead warnings\r\n logging: config.skipValidations ? () => { } : undefined\r\n }),\r\n ...config,\r\n });\r\n }\r\n\r\n get IS_RECORDING(): boolean {\r\n return this.RECORDING_PHASE;\r\n }\r\n\r\n DEFINE_RULE(name: string, impl: RuleImpl): RuleResult {\r\n return this.RULE(name, impl);\r\n }\r\n\r\n wrapSelfAnalysis(): void {\r\n this.performSelfAnalysis();\r\n }\r\n\r\n wrapConsume(idx: number, tokenType: TokenType): IToken {\r\n return this.consume(idx, tokenType);\r\n }\r\n\r\n wrapSubrule(idx: number, rule: RuleResult, args: Args): unknown {\r\n return this.subrule(idx, rule, {\r\n ARGS: [args]\r\n });\r\n }\r\n\r\n wrapOr(idx: number, choices: Array>): void {\r\n this.or(idx, choices);\r\n }\r\n\r\n wrapOption(idx: number, callback: DSLMethodOpts): void {\r\n this.option(idx, callback);\r\n }\r\n\r\n wrapMany(idx: number, callback: DSLMethodOpts): void {\r\n this.many(idx, callback);\r\n }\r\n\r\n wrapAtLeastOne(idx: number, callback: DSLMethodOpts): void {\r\n this.atLeastOne(idx, callback);\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { IOrAlt, TokenType, TokenTypeDictionary } from 'chevrotain';\r\nimport type { AbstractElement, Action, Alternatives, Condition, CrossReference, Grammar, Group, Keyword, NamedArgument, ParserRule, RuleCall, UnorderedGroup } from '../languages/generated/ast.js';\r\nimport type { BaseParser } from './langium-parser.js';\r\nimport type { AstNode } from '../syntax-tree.js';\r\nimport type { Cardinality } from '../utils/grammar-utils.js';\r\nimport { EMPTY_ALT, EOF } from 'chevrotain';\r\nimport { isAction, isAlternatives, isEndOfFile, isAssignment, isConjunction, isCrossReference, isDisjunction, isGroup, isKeyword, isNegation, isParameterReference, isParserRule, isRuleCall, isTerminalRule, isUnorderedGroup, isBooleanLiteral } from '../languages/generated/ast.js';\r\nimport { assertUnreachable, ErrorWithLocation } from '../utils/errors.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport { findNameAssignment, getAllReachableRules, getTypeName } from '../utils/grammar-utils.js';\r\n\r\ntype RuleContext = {\r\n optional: number,\r\n consume: number,\r\n subrule: number,\r\n many: number,\r\n or: number\r\n} & ParserContext;\r\n\r\ntype ParserContext = {\r\n parser: BaseParser\r\n tokens: TokenTypeDictionary\r\n ruleNames: Map\r\n}\r\n\r\ntype Rule = (args: Args) => unknown;\r\n\r\ntype Args = Record;\r\n\r\ntype Predicate = (args: Args) => boolean;\r\n\r\ntype Method = (args: Args) => void;\r\n\r\nexport function createParser(grammar: Grammar, parser: T, tokens: TokenTypeDictionary): T {\r\n const parserContext: ParserContext = {\r\n parser,\r\n tokens,\r\n ruleNames: new Map()\r\n };\r\n buildRules(parserContext, grammar);\r\n return parser;\r\n}\r\n\r\nfunction buildRules(parserContext: ParserContext, grammar: Grammar): void {\r\n const reachable = getAllReachableRules(grammar, false);\r\n const parserRules = stream(grammar.rules).filter(isParserRule).filter(rule => reachable.has(rule));\r\n for (const rule of parserRules) {\r\n const ctx: RuleContext = {\r\n ...parserContext,\r\n consume: 1,\r\n optional: 1,\r\n subrule: 1,\r\n many: 1,\r\n or: 1\r\n };\r\n parserContext.parser.rule(rule, buildElement(ctx, rule.definition));\r\n }\r\n}\r\n\r\nfunction buildElement(ctx: RuleContext, element: AbstractElement, ignoreGuard = false): Method {\r\n let method: Method;\r\n if (isKeyword(element)) {\r\n method = buildKeyword(ctx, element);\r\n } else if (isAction(element)) {\r\n method = buildAction(ctx, element);\r\n } else if (isAssignment(element)) {\r\n method = buildElement(ctx, element.terminal);\r\n } else if (isCrossReference(element)) {\r\n method = buildCrossReference(ctx, element);\r\n } else if (isRuleCall(element)) {\r\n method = buildRuleCall(ctx, element);\r\n } else if (isAlternatives(element)) {\r\n method = buildAlternatives(ctx, element);\r\n } else if (isUnorderedGroup(element)) {\r\n method = buildUnorderedGroup(ctx, element);\r\n } else if (isGroup(element)) {\r\n method = buildGroup(ctx, element);\r\n } else if(isEndOfFile(element)) {\r\n const idx = ctx.consume++;\r\n method = () => ctx.parser.consume(idx, EOF, element);\r\n } else {\r\n throw new ErrorWithLocation(element.$cstNode, `Unexpected element type: ${element.$type}`);\r\n }\r\n return wrap(ctx, ignoreGuard ? undefined : getGuardCondition(element), method, element.cardinality);\r\n}\r\n\r\nfunction buildAction(ctx: RuleContext, action: Action): Method {\r\n const actionType = getTypeName(action);\r\n return () => ctx.parser.action(actionType, action);\r\n}\r\n\r\nfunction buildRuleCall(ctx: RuleContext, ruleCall: RuleCall): Method {\r\n const rule = ruleCall.rule.ref;\r\n if (isParserRule(rule)) {\r\n const idx = ctx.subrule++;\r\n const fragment = rule.fragment;\r\n const predicate = ruleCall.arguments.length > 0 ? buildRuleCallPredicate(rule, ruleCall.arguments) : () => ({});\r\n return (args) => ctx.parser.subrule(idx, getRule(ctx, rule), fragment, ruleCall, predicate(args));\r\n } else if (isTerminalRule(rule)) {\r\n const idx = ctx.consume++;\r\n const method = getToken(ctx, rule.name);\r\n return () => ctx.parser.consume(idx, method, ruleCall);\r\n } else if (!rule) {\r\n throw new ErrorWithLocation(ruleCall.$cstNode, `Undefined rule: ${ruleCall.rule.$refText}`);\r\n } else {\r\n assertUnreachable(rule);\r\n }\r\n}\r\n\r\nfunction buildRuleCallPredicate(rule: ParserRule, namedArgs: NamedArgument[]): (args: Args) => Args {\r\n const predicates = namedArgs.map(e => buildPredicate(e.value));\r\n return (args) => {\r\n const ruleArgs: Args = {};\r\n for (let i = 0; i < predicates.length; i++) {\r\n const ruleTarget = rule.parameters[i];\r\n const predicate = predicates[i];\r\n ruleArgs[ruleTarget.name] = predicate(args);\r\n }\r\n return ruleArgs;\r\n };\r\n}\r\n\r\ninterface PredicatedMethod {\r\n ALT: Method,\r\n GATE?: Predicate\r\n}\r\n\r\nfunction buildPredicate(condition: Condition): Predicate {\r\n if (isDisjunction(condition)) {\r\n const left = buildPredicate(condition.left);\r\n const right = buildPredicate(condition.right);\r\n return (args) => (left(args) || right(args));\r\n } else if (isConjunction(condition)) {\r\n const left = buildPredicate(condition.left);\r\n const right = buildPredicate(condition.right);\r\n return (args) => (left(args) && right(args));\r\n } else if (isNegation(condition)) {\r\n const value = buildPredicate(condition.value);\r\n return (args) => !value(args);\r\n } else if (isParameterReference(condition)) {\r\n const name = condition.parameter.ref!.name;\r\n return (args) => args !== undefined && args[name] === true;\r\n } else if (isBooleanLiteral(condition)) {\r\n const value = Boolean(condition.true);\r\n return () => value;\r\n }\r\n assertUnreachable(condition);\r\n}\r\n\r\nfunction buildAlternatives(ctx: RuleContext, alternatives: Alternatives): Method {\r\n if (alternatives.elements.length === 1) {\r\n return buildElement(ctx, alternatives.elements[0]);\r\n } else {\r\n const methods: PredicatedMethod[] = [];\r\n\r\n for (const element of alternatives.elements) {\r\n const predicatedMethod: PredicatedMethod = {\r\n // Since we handle the guard condition in the alternative already\r\n // We can ignore the group guard condition inside\r\n ALT: buildElement(ctx, element, true)\r\n };\r\n const guard = getGuardCondition(element);\r\n if (guard) {\r\n predicatedMethod.GATE = buildPredicate(guard);\r\n }\r\n methods.push(predicatedMethod);\r\n }\r\n\r\n const idx = ctx.or++;\r\n return (args) => ctx.parser.alternatives(idx, methods.map(method => {\r\n const alt: IOrAlt = {\r\n ALT: () => method.ALT(args)\r\n };\r\n const gate = method.GATE;\r\n if (gate) {\r\n alt.GATE = () => gate(args);\r\n }\r\n return alt;\r\n }));\r\n }\r\n}\r\n\r\nfunction buildUnorderedGroup(ctx: RuleContext, group: UnorderedGroup): Method {\r\n if (group.elements.length === 1) {\r\n return buildElement(ctx, group.elements[0]);\r\n }\r\n const methods: PredicatedMethod[] = [];\r\n\r\n for (const element of group.elements) {\r\n const predicatedMethod: PredicatedMethod = {\r\n // Since we handle the guard condition in the alternative already\r\n // We can ignore the group guard condition inside\r\n ALT: buildElement(ctx, element, true)\r\n };\r\n const guard = getGuardCondition(element);\r\n if (guard) {\r\n predicatedMethod.GATE = buildPredicate(guard);\r\n }\r\n methods.push(predicatedMethod);\r\n }\r\n\r\n const orIdx = ctx.or++;\r\n\r\n const idFunc = (groupIdx: number, lParser: BaseParser) => {\r\n const stackId = lParser.getRuleStack().join('-');\r\n return `uGroup_${groupIdx}_${stackId}`;\r\n };\r\n const alternatives: Method = (args) => ctx.parser.alternatives(orIdx, methods.map((method, idx) => {\r\n const alt: IOrAlt = { ALT: () => true };\r\n const parser = ctx.parser;\r\n alt.ALT = () => {\r\n method.ALT(args);\r\n if (!parser.isRecording()) {\r\n const key = idFunc(orIdx, parser);\r\n if (!parser.unorderedGroups.get(key)) {\r\n // init after clear state\r\n parser.unorderedGroups.set(key, []);\r\n }\r\n const groupState = parser.unorderedGroups.get(key)!;\r\n if (typeof groupState?.[idx] === 'undefined') {\r\n // Not accessed yet\r\n groupState[idx] = true;\r\n }\r\n }\r\n };\r\n const gate = method.GATE;\r\n if (gate) {\r\n alt.GATE = () => gate(args);\r\n } else {\r\n alt.GATE = () => {\r\n const trackedAlternatives = parser.unorderedGroups.get(idFunc(orIdx, parser));\r\n const allow = !trackedAlternatives?.[idx];\r\n return allow;\r\n };\r\n }\r\n return alt;\r\n }));\r\n const wrapped = wrap(ctx, getGuardCondition(group), alternatives, '*');\r\n return (args) => {\r\n wrapped(args);\r\n if (!ctx.parser.isRecording()) {\r\n ctx.parser.unorderedGroups.delete(idFunc(orIdx, ctx.parser));\r\n }\r\n };\r\n}\r\n\r\nfunction buildGroup(ctx: RuleContext, group: Group): Method {\r\n const methods = group.elements.map(e => buildElement(ctx, e));\r\n return (args) => methods.forEach(method => method(args));\r\n}\r\n\r\nfunction getGuardCondition(element: AbstractElement): Condition | undefined {\r\n if (isGroup(element)) {\r\n return element.guardCondition;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction buildCrossReference(ctx: RuleContext, crossRef: CrossReference, terminal = crossRef.terminal): Method {\r\n if (!terminal) {\r\n if (!crossRef.type.ref) {\r\n throw new Error('Could not resolve reference to type: ' + crossRef.type.$refText);\r\n }\r\n const assignment = findNameAssignment(crossRef.type.ref);\r\n const assignTerminal = assignment?.terminal;\r\n if (!assignTerminal) {\r\n throw new Error('Could not find name assignment for type: ' + getTypeName(crossRef.type.ref));\r\n }\r\n return buildCrossReference(ctx, crossRef, assignTerminal);\r\n } else if (isRuleCall(terminal) && isParserRule(terminal.rule.ref)) {\r\n // The terminal is a data type rule here. Everything else will result in a validation error.\r\n const rule = terminal.rule.ref;\r\n const idx = ctx.subrule++;\r\n return (args) => ctx.parser.subrule(idx, getRule(ctx, rule), false, crossRef, args);\r\n } else if (isRuleCall(terminal) && isTerminalRule(terminal.rule.ref)) {\r\n const idx = ctx.consume++;\r\n const terminalRule = getToken(ctx, terminal.rule.ref.name);\r\n return () => ctx.parser.consume(idx, terminalRule, crossRef);\r\n } else if (isKeyword(terminal)) {\r\n const idx = ctx.consume++;\r\n const keyword = getToken(ctx, terminal.value);\r\n return () => ctx.parser.consume(idx, keyword, crossRef);\r\n }\r\n else {\r\n throw new Error('Could not build cross reference parser');\r\n }\r\n}\r\n\r\nfunction buildKeyword(ctx: RuleContext, keyword: Keyword): Method {\r\n const idx = ctx.consume++;\r\n const token = ctx.tokens[keyword.value];\r\n if (!token) {\r\n throw new Error('Could not find token for keyword: ' + keyword.value);\r\n }\r\n return () => ctx.parser.consume(idx, token, keyword);\r\n}\r\n\r\nfunction wrap(ctx: RuleContext, guard: Condition | undefined, method: Method, cardinality: Cardinality): Method {\r\n const gate = guard && buildPredicate(guard);\r\n\r\n if (!cardinality) {\r\n if (gate) {\r\n const idx = ctx.or++;\r\n return (args) => ctx.parser.alternatives(idx, [\r\n {\r\n ALT: () => method(args),\r\n GATE: () => gate(args)\r\n },\r\n {\r\n ALT: EMPTY_ALT(),\r\n GATE: () => !gate(args)\r\n }\r\n ]);\r\n } else {\r\n return method;\r\n }\r\n }\r\n\r\n if (cardinality === '*') {\r\n const idx = ctx.many++;\r\n return (args) => ctx.parser.many(idx, {\r\n DEF: () => method(args),\r\n GATE: gate ? () => gate(args) : undefined\r\n });\r\n } else if (cardinality === '+') {\r\n const idx = ctx.many++;\r\n if (gate) {\r\n const orIdx = ctx.or++;\r\n // In the case of a guard condition for the `+` group\r\n // We combine it with an empty alternative\r\n // If the condition returns true, it needs to parse at least a single iteration\r\n // If its false, it is not allowed to parse anything\r\n return (args) => ctx.parser.alternatives(orIdx, [\r\n {\r\n ALT: () => ctx.parser.atLeastOne(idx, {\r\n DEF: () => method(args)\r\n }),\r\n GATE: () => gate(args)\r\n },\r\n {\r\n ALT: EMPTY_ALT(),\r\n GATE: () => !gate(args)\r\n }\r\n ]);\r\n } else {\r\n return (args) => ctx.parser.atLeastOne(idx, {\r\n DEF: () => method(args),\r\n });\r\n }\r\n } else if (cardinality === '?') {\r\n const idx = ctx.optional++;\r\n return (args) => ctx.parser.optional(idx, {\r\n DEF: () => method(args),\r\n GATE: gate ? () => gate(args) : undefined\r\n });\r\n } else {\r\n assertUnreachable(cardinality);\r\n }\r\n}\r\n\r\nfunction getRule(ctx: ParserContext, element: ParserRule | AbstractElement): Rule {\r\n const name = getRuleName(ctx, element);\r\n const rule = ctx.parser.getRule(name);\r\n if (!rule) throw new Error(`Rule \"${name}\" not found.\"`);\r\n return rule;\r\n}\r\n\r\nfunction getRuleName(ctx: ParserContext, element: ParserRule | AbstractElement): string {\r\n if (isParserRule(element)) {\r\n return element.name;\r\n } else if (ctx.ruleNames.has(element)) {\r\n return ctx.ruleNames.get(element)!;\r\n } else {\r\n let item: AstNode = element;\r\n let parent: AstNode = item.$container!;\r\n let ruleName: string = element.$type;\r\n while (!isParserRule(parent)) {\r\n if (isGroup(parent) || isAlternatives(parent) || isUnorderedGroup(parent)) {\r\n const index = parent.elements.indexOf(item as AbstractElement);\r\n ruleName = index.toString() + ':' + ruleName;\r\n }\r\n item = parent;\r\n parent = parent.$container!;\r\n }\r\n const rule = parent as ParserRule;\r\n ruleName = rule.name + ':' + ruleName;\r\n ctx.ruleNames.set(element, ruleName);\r\n return ruleName;\r\n }\r\n}\r\n\r\nfunction getToken(ctx: ParserContext, name: string): TokenType {\r\n const token = ctx.tokens[name];\r\n if (!token) throw new Error(`Token \"${name}\" not found.\"`);\r\n return token;\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport { LangiumCompletionParser } from './langium-parser.js';\r\nimport { createParser } from './parser-builder-base.js';\r\n\r\nexport function createCompletionParser(services: LangiumCoreServices): LangiumCompletionParser {\r\n const grammar = services.Grammar;\r\n const lexer = services.parser.Lexer;\r\n const parser = new LangiumCompletionParser(services);\r\n createParser(grammar, parser, lexer.definition);\r\n parser.finalize();\r\n return parser;\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport { LangiumParser } from './langium-parser.js';\r\nimport { createParser } from './parser-builder-base.js';\r\n\r\n/**\r\n * Create and finalize a Langium parser. The parser rules are derived from the grammar, which is\r\n * available at `services.Grammar`.\r\n */\r\nexport function createLangiumParser(services: LangiumCoreServices): LangiumParser {\r\n const parser = prepareLangiumParser(services);\r\n parser.finalize();\r\n return parser;\r\n}\r\n\r\n/**\r\n * Create a Langium parser without finalizing it. This is used to extract more detailed error\r\n * information when the parser is initially validated.\r\n */\r\nexport function prepareLangiumParser(services: LangiumCoreServices): LangiumParser {\r\n const grammar = services.Grammar;\r\n const lexer = services.parser.Lexer;\r\n const parser = new LangiumParser(services);\r\n return createParser(grammar, parser, lexer.definition);\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { CustomPatternMatcherFunc, ILexingError, TokenPattern, TokenType, TokenVocabulary } from 'chevrotain';\r\nimport type { AbstractRule, Grammar, Keyword, TerminalRule } from '../languages/generated/ast.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport { Lexer } from 'chevrotain';\r\nimport { isKeyword, isParserRule, isTerminalRule } from '../languages/generated/ast.js';\r\nimport { streamAllContents } from '../utils/ast-utils.js';\r\nimport { getAllReachableRules, terminalRegex } from '../utils/grammar-utils.js';\r\nimport { getCaseInsensitivePattern, isWhitespace, partialMatches } from '../utils/regexp-utils.js';\r\nimport { stream } from '../utils/stream.js';\r\n\r\nexport interface TokenBuilderOptions {\r\n caseInsensitive?: boolean\r\n}\r\n\r\nexport interface TokenBuilder {\r\n buildTokens(grammar: Grammar, options?: TokenBuilderOptions): TokenVocabulary;\r\n /**\r\n * Produces a lexing report for the given text that was just tokenized using the tokens provided by this builder.\r\n *\r\n * @param text The text that was tokenized.\r\n */\r\n flushLexingReport?(text: string): LexingReport;\r\n}\r\n\r\n/**\r\n * A custom lexing report that can be produced by the token builder during the lexing process.\r\n * Adopters need to ensure that the any custom fields are serializable so they can be sent across worker threads.\r\n */\r\nexport interface LexingReport {\r\n diagnostics: LexingDiagnostic[];\r\n}\r\n\r\nexport type LexingDiagnosticSeverity = 'error' | 'warning' | 'info' | 'hint';\r\n\r\nexport interface LexingDiagnostic extends ILexingError {\r\n severity?: LexingDiagnosticSeverity;\r\n}\r\n\r\nexport class DefaultTokenBuilder implements TokenBuilder {\r\n /**\r\n * The list of diagnostics stored during the lexing process of a single text.\r\n */\r\n protected diagnostics: LexingDiagnostic[] = [];\r\n\r\n buildTokens(grammar: Grammar, options?: TokenBuilderOptions): TokenVocabulary {\r\n const reachableRules = stream(getAllReachableRules(grammar, false));\r\n const terminalTokens: TokenType[] = this.buildTerminalTokens(reachableRules);\r\n const tokens: TokenType[] = this.buildKeywordTokens(reachableRules, terminalTokens, options);\r\n\r\n terminalTokens.forEach(terminalToken => {\r\n const pattern = terminalToken.PATTERN;\r\n if (typeof pattern === 'object' && pattern && 'test' in pattern && isWhitespace(pattern)) {\r\n tokens.unshift(terminalToken);\r\n } else {\r\n tokens.push(terminalToken);\r\n }\r\n });\r\n // We don't need to add the EOF token explicitly.\r\n // It is automatically available at the end of the token stream.\r\n return tokens;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n flushLexingReport(text: string): LexingReport {\r\n return { diagnostics: this.popDiagnostics() };\r\n }\r\n\r\n protected popDiagnostics(): LexingDiagnostic[] {\r\n const diagnostics = [...this.diagnostics];\r\n this.diagnostics = [];\r\n return diagnostics;\r\n }\r\n\r\n protected buildTerminalTokens(rules: Stream): TokenType[] {\r\n return rules.filter(isTerminalRule).filter(e => !e.fragment)\r\n .map(terminal => this.buildTerminalToken(terminal)).toArray();\r\n }\r\n\r\n protected buildTerminalToken(terminal: TerminalRule): TokenType {\r\n const regex = terminalRegex(terminal);\r\n const pattern = this.requiresCustomPattern(regex) ? this.regexPatternFunction(regex) : regex;\r\n const tokenType: TokenType = {\r\n name: terminal.name,\r\n PATTERN: pattern,\r\n };\r\n if (typeof pattern === 'function') {\r\n tokenType.LINE_BREAKS = true;\r\n }\r\n if (terminal.hidden) {\r\n // Only skip tokens that are able to accept whitespace\r\n tokenType.GROUP = isWhitespace(regex) ? Lexer.SKIPPED : 'hidden';\r\n }\r\n return tokenType;\r\n }\r\n\r\n protected requiresCustomPattern(regex: RegExp): boolean {\r\n if (regex.flags.includes('u') || regex.flags.includes('s')) {\r\n // Unicode and dotall regexes are not supported by Chevrotain.\r\n return true;\r\n } else if (regex.source.includes('?<=') || regex.source.includes('? {\r\n stickyRegex.lastIndex = offset;\r\n const execResult = stickyRegex.exec(text);\r\n return execResult;\r\n };\r\n }\r\n\r\n protected buildKeywordTokens(rules: Stream, terminalTokens: TokenType[], options?: TokenBuilderOptions): TokenType[] {\r\n return rules\r\n // We filter by parser rules, since keywords in terminal rules get transformed into regex and are not actual tokens\r\n .filter(isParserRule)\r\n .flatMap(rule => streamAllContents(rule).filter(isKeyword))\r\n .distinct(e => e.value).toArray()\r\n // Sort keywords by descending length\r\n .sort((a, b) => b.value.length - a.value.length)\r\n .map(keyword => this.buildKeywordToken(keyword, terminalTokens, Boolean(options?.caseInsensitive)));\r\n }\r\n\r\n protected buildKeywordToken(keyword: Keyword, terminalTokens: TokenType[], caseInsensitive: boolean): TokenType {\r\n const keywordPattern = this.buildKeywordPattern(keyword, caseInsensitive);\r\n const tokenType: TokenType = {\r\n name: keyword.value,\r\n PATTERN: keywordPattern,\r\n LONGER_ALT: this.findLongerAlt(keyword, terminalTokens)\r\n };\r\n\r\n if (typeof keywordPattern === 'function') {\r\n tokenType.LINE_BREAKS = true;\r\n }\r\n\r\n return tokenType;\r\n }\r\n\r\n protected buildKeywordPattern(keyword: Keyword, caseInsensitive: boolean): TokenPattern {\r\n return caseInsensitive ?\r\n new RegExp(getCaseInsensitivePattern(keyword.value)) :\r\n keyword.value;\r\n }\r\n\r\n protected findLongerAlt(keyword: Keyword, terminalTokens: TokenType[]): TokenType[] {\r\n return terminalTokens.reduce((longerAlts: TokenType[], token) => {\r\n const pattern = token?.PATTERN as RegExp;\r\n if (pattern?.source && partialMatches('^' + pattern.source + '$', keyword.value)) {\r\n longerAlts.push(token);\r\n }\r\n return longerAlts;\r\n }, []);\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { AbstractElement, AbstractRule } from '../languages/generated/ast.js';\r\nimport type { CstNode } from '../syntax-tree.js';\r\nimport { isCrossReference, isRuleCall } from '../languages/generated/ast.js';\r\nimport { getCrossReferenceTerminal, getRuleType } from '../utils/grammar-utils.js';\r\n\r\n/**\r\n * Language-specific service for converting string values from the source text format into a value to be held in the AST.\r\n */\r\nexport interface ValueConverter {\r\n /**\r\n * Converts a string value from the source text format into a value to be held in the AST.\r\n */\r\n convert(input: string, cstNode: CstNode): ValueType;\r\n}\r\n\r\nexport type ValueType = string | number | boolean | bigint | Date;\r\n\r\nexport class DefaultValueConverter implements ValueConverter {\r\n\r\n convert(input: string, cstNode: CstNode): ValueType {\r\n let feature: AbstractElement | undefined = cstNode.grammarSource;\r\n if (isCrossReference(feature)) {\r\n feature = getCrossReferenceTerminal(feature);\r\n }\r\n if (isRuleCall(feature)) {\r\n const rule = feature.rule.ref;\r\n if (!rule) {\r\n throw new Error('This cst node was not parsed by a rule.');\r\n }\r\n return this.runConverter(rule, input, cstNode);\r\n }\r\n return input;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected runConverter(rule: AbstractRule, input: string, cstNode: CstNode): ValueType {\r\n switch (rule.name.toUpperCase()) {\r\n case 'INT': return ValueConverter.convertInt(input);\r\n case 'STRING': return ValueConverter.convertString(input);\r\n case 'ID': return ValueConverter.convertID(input);\r\n }\r\n switch (getRuleType(rule)?.toLowerCase()) {\r\n case 'number': return ValueConverter.convertNumber(input);\r\n case 'boolean': return ValueConverter.convertBoolean(input);\r\n case 'bigint': return ValueConverter.convertBigint(input);\r\n case 'date': return ValueConverter.convertDate(input);\r\n default: return input;\r\n }\r\n }\r\n}\r\n\r\nexport namespace ValueConverter {\r\n\r\n export function convertString(input: string): string {\r\n let result = '';\r\n for (let i = 1; i < input.length - 1; i++) {\r\n const c = input.charAt(i);\r\n if (c === '\\\\') {\r\n const c1 = input.charAt(++i);\r\n result += convertEscapeCharacter(c1);\r\n } else {\r\n result += c;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n function convertEscapeCharacter(char: string): string {\r\n switch (char) {\r\n case 'b': return '\\b';\r\n case 'f': return '\\f';\r\n case 'n': return '\\n';\r\n case 'r': return '\\r';\r\n case 't': return '\\t';\r\n case 'v': return '\\v';\r\n case '0': return '\\0';\r\n default: return char;\r\n }\r\n }\r\n\r\n export function convertID(input: string): string {\r\n if (input.charAt(0) === '^') {\r\n return input.substring(1);\r\n } else {\r\n return input;\r\n }\r\n }\r\n\r\n export function convertInt(input: string): number {\r\n return parseInt(input);\r\n }\r\n\r\n export function convertBigint(input: string): bigint {\r\n return BigInt(input);\r\n }\r\n\r\n export function convertDate(input: string): Date {\r\n return new Date(input);\r\n }\r\n\r\n export function convertNumber(input: string): number {\r\n return Number(input);\r\n }\r\n\r\n export function convertBoolean(input: string): boolean {\r\n return input.toLowerCase() === 'true';\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2024 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n// eslint-disable-next-line no-restricted-imports\r\nexport * from 'vscode-jsonrpc/lib/common/cancellation.js';\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { CancellationToken, CancellationTokenSource, type AbstractCancellationTokenSource } from '../utils/cancellation.js';\r\n\r\nexport type MaybePromise = T | Promise\r\n\r\n/**\r\n * Delays the execution of the current code to the next tick of the event loop.\r\n * Don't call this method directly in a tight loop to prevent too many promises from being created.\r\n */\r\nexport function delayNextTick(): Promise {\r\n return new Promise(resolve => {\r\n // In case we are running in a non-node environment, `setImmediate` isn't available.\r\n // Using `setTimeout` of the browser API accomplishes the same result.\r\n if (typeof setImmediate === 'undefined') {\r\n setTimeout(resolve, 0);\r\n } else {\r\n setImmediate(resolve);\r\n }\r\n });\r\n}\r\n\r\nlet lastTick = 0;\r\nlet globalInterruptionPeriod = 10;\r\n\r\n/**\r\n * Reset the global interruption period and create a cancellation token source.\r\n */\r\nexport function startCancelableOperation(): AbstractCancellationTokenSource {\r\n lastTick = performance.now();\r\n return new CancellationTokenSource();\r\n}\r\n\r\n/**\r\n * Change the period duration for `interruptAndCheck` to the given number of milliseconds.\r\n * The default value is 10ms.\r\n */\r\nexport function setInterruptionPeriod(period: number): void {\r\n globalInterruptionPeriod = period;\r\n}\r\n\r\n/**\r\n * This symbol may be thrown in an asynchronous context by any Langium service that receives\r\n * a `CancellationToken`. This means that the promise returned by such a service is rejected with\r\n * this symbol as rejection reason.\r\n */\r\nexport const OperationCancelled = Symbol('OperationCancelled');\r\n\r\n/**\r\n * Use this in a `catch` block to check whether the thrown object indicates that the operation\r\n * has been cancelled.\r\n */\r\nexport function isOperationCancelled(err: unknown): err is typeof OperationCancelled {\r\n return err === OperationCancelled;\r\n}\r\n\r\n/**\r\n * This function does two things:\r\n * 1. Check the elapsed time since the last call to this function or to `startCancelableOperation`. If the predefined\r\n * period (configured with `setInterruptionPeriod`) is exceeded, execution is delayed with `delayNextTick`.\r\n * 2. If the predefined period is not met yet or execution is resumed after an interruption, the given cancellation\r\n * token is checked, and if cancellation is requested, `OperationCanceled` is thrown.\r\n *\r\n * All services in Langium that receive a `CancellationToken` may potentially call this function, so the\r\n * `CancellationToken` must be caught (with an `async` try-catch block or a `catch` callback attached to\r\n * the promise) to avoid that event being exposed as an error.\r\n */\r\nexport async function interruptAndCheck(token: CancellationToken): Promise {\r\n if (token === CancellationToken.None) {\r\n // Early exit in case cancellation was disabled by the caller\r\n return;\r\n }\r\n const current = performance.now();\r\n if (current - lastTick >= globalInterruptionPeriod) {\r\n lastTick = current;\r\n await delayNextTick();\r\n // prevent calling delayNextTick every iteration of loop\r\n // where delayNextTick takes up the majority or all of the\r\n // globalInterruptionPeriod itself\r\n lastTick = performance.now();\r\n }\r\n if (token.isCancellationRequested) {\r\n throw OperationCancelled;\r\n }\r\n}\r\n\r\n/**\r\n * Simple implementation of the deferred pattern.\r\n * An object that exposes a promise and functions to resolve and reject it.\r\n */\r\nexport class Deferred {\r\n resolve: (value: T) => this;\r\n reject: (err?: unknown) => this;\r\n\r\n promise = new Promise((resolve, reject) => {\r\n this.resolve = (arg) => {\r\n resolve(arg);\r\n return this;\r\n };\r\n this.reject = (err) => {\r\n reject(err);\r\n return this;\r\n };\r\n });\r\n}\r\n", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nclass FullTextDocument {\n constructor(uri, languageId, version, content) {\n this._uri = uri;\n this._languageId = languageId;\n this._version = version;\n this._content = content;\n this._lineOffsets = undefined;\n }\n get uri() {\n return this._uri;\n }\n get languageId() {\n return this._languageId;\n }\n get version() {\n return this._version;\n }\n getText(range) {\n if (range) {\n const start = this.offsetAt(range.start);\n const end = this.offsetAt(range.end);\n return this._content.substring(start, end);\n }\n return this._content;\n }\n update(changes, version) {\n for (const change of changes) {\n if (FullTextDocument.isIncremental(change)) {\n // makes sure start is before end\n const range = getWellformedRange(change.range);\n // update content\n const startOffset = this.offsetAt(range.start);\n const endOffset = this.offsetAt(range.end);\n this._content = this._content.substring(0, startOffset) + change.text + this._content.substring(endOffset, this._content.length);\n // update the offsets\n const startLine = Math.max(range.start.line, 0);\n const endLine = Math.max(range.end.line, 0);\n let lineOffsets = this._lineOffsets;\n const addedLineOffsets = computeLineOffsets(change.text, false, startOffset);\n if (endLine - startLine === addedLineOffsets.length) {\n for (let i = 0, len = addedLineOffsets.length; i < len; i++) {\n lineOffsets[i + startLine + 1] = addedLineOffsets[i];\n }\n }\n else {\n if (addedLineOffsets.length < 10000) {\n lineOffsets.splice(startLine + 1, endLine - startLine, ...addedLineOffsets);\n }\n else { // avoid too many arguments for splice\n this._lineOffsets = lineOffsets = lineOffsets.slice(0, startLine + 1).concat(addedLineOffsets, lineOffsets.slice(endLine + 1));\n }\n }\n const diff = change.text.length - (endOffset - startOffset);\n if (diff !== 0) {\n for (let i = startLine + 1 + addedLineOffsets.length, len = lineOffsets.length; i < len; i++) {\n lineOffsets[i] = lineOffsets[i] + diff;\n }\n }\n }\n else if (FullTextDocument.isFull(change)) {\n this._content = change.text;\n this._lineOffsets = undefined;\n }\n else {\n throw new Error('Unknown change event received');\n }\n }\n this._version = version;\n }\n getLineOffsets() {\n if (this._lineOffsets === undefined) {\n this._lineOffsets = computeLineOffsets(this._content, true);\n }\n return this._lineOffsets;\n }\n positionAt(offset) {\n offset = Math.max(Math.min(offset, this._content.length), 0);\n const lineOffsets = this.getLineOffsets();\n let low = 0, high = lineOffsets.length;\n if (high === 0) {\n return { line: 0, character: offset };\n }\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (lineOffsets[mid] > offset) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n // low is the least x for which the line offset is larger than the current offset\n // or array.length if no line offset is larger than the current offset\n const line = low - 1;\n offset = this.ensureBeforeEOL(offset, lineOffsets[line]);\n return { line, character: offset - lineOffsets[line] };\n }\n offsetAt(position) {\n const lineOffsets = this.getLineOffsets();\n if (position.line >= lineOffsets.length) {\n return this._content.length;\n }\n else if (position.line < 0) {\n return 0;\n }\n const lineOffset = lineOffsets[position.line];\n if (position.character <= 0) {\n return lineOffset;\n }\n const nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;\n const offset = Math.min(lineOffset + position.character, nextLineOffset);\n return this.ensureBeforeEOL(offset, lineOffset);\n }\n ensureBeforeEOL(offset, lineOffset) {\n while (offset > lineOffset && isEOL(this._content.charCodeAt(offset - 1))) {\n offset--;\n }\n return offset;\n }\n get lineCount() {\n return this.getLineOffsets().length;\n }\n static isIncremental(event) {\n const candidate = event;\n return candidate !== undefined && candidate !== null &&\n typeof candidate.text === 'string' && candidate.range !== undefined &&\n (candidate.rangeLength === undefined || typeof candidate.rangeLength === 'number');\n }\n static isFull(event) {\n const candidate = event;\n return candidate !== undefined && candidate !== null &&\n typeof candidate.text === 'string' && candidate.range === undefined && candidate.rangeLength === undefined;\n }\n}\nexport var TextDocument;\n(function (TextDocument) {\n /**\n * Creates a new text document.\n *\n * @param uri The document's uri.\n * @param languageId The document's language Id.\n * @param version The document's initial version number.\n * @param content The document's content.\n */\n function create(uri, languageId, version, content) {\n return new FullTextDocument(uri, languageId, version, content);\n }\n TextDocument.create = create;\n /**\n * Updates a TextDocument by modifying its content.\n *\n * @param document the document to update. Only documents created by TextDocument.create are valid inputs.\n * @param changes the changes to apply to the document.\n * @param version the changes version for the document.\n * @returns The updated TextDocument. Note: That's the same document instance passed in as first parameter.\n *\n */\n function update(document, changes, version) {\n if (document instanceof FullTextDocument) {\n document.update(changes, version);\n return document;\n }\n else {\n throw new Error('TextDocument.update: document must be created by TextDocument.create');\n }\n }\n TextDocument.update = update;\n function applyEdits(document, edits) {\n const text = document.getText();\n const sortedEdits = mergeSort(edits.map(getWellformedEdit), (a, b) => {\n const diff = a.range.start.line - b.range.start.line;\n if (diff === 0) {\n return a.range.start.character - b.range.start.character;\n }\n return diff;\n });\n let lastModifiedOffset = 0;\n const spans = [];\n for (const e of sortedEdits) {\n const startOffset = document.offsetAt(e.range.start);\n if (startOffset < lastModifiedOffset) {\n throw new Error('Overlapping edit');\n }\n else if (startOffset > lastModifiedOffset) {\n spans.push(text.substring(lastModifiedOffset, startOffset));\n }\n if (e.newText.length) {\n spans.push(e.newText);\n }\n lastModifiedOffset = document.offsetAt(e.range.end);\n }\n spans.push(text.substr(lastModifiedOffset));\n return spans.join('');\n }\n TextDocument.applyEdits = applyEdits;\n})(TextDocument || (TextDocument = {}));\nfunction mergeSort(data, compare) {\n if (data.length <= 1) {\n // sorted\n return data;\n }\n const p = (data.length / 2) | 0;\n const left = data.slice(0, p);\n const right = data.slice(p);\n mergeSort(left, compare);\n mergeSort(right, compare);\n let leftIdx = 0;\n let rightIdx = 0;\n let i = 0;\n while (leftIdx < left.length && rightIdx < right.length) {\n const ret = compare(left[leftIdx], right[rightIdx]);\n if (ret <= 0) {\n // smaller_equal -> take left to preserve order\n data[i++] = left[leftIdx++];\n }\n else {\n // greater -> take right\n data[i++] = right[rightIdx++];\n }\n }\n while (leftIdx < left.length) {\n data[i++] = left[leftIdx++];\n }\n while (rightIdx < right.length) {\n data[i++] = right[rightIdx++];\n }\n return data;\n}\nfunction computeLineOffsets(text, isAtLineStart, textOffset = 0) {\n const result = isAtLineStart ? [textOffset] : [];\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (isEOL(ch)) {\n if (ch === 13 /* CharCode.CarriageReturn */ && i + 1 < text.length && text.charCodeAt(i + 1) === 10 /* CharCode.LineFeed */) {\n i++;\n }\n result.push(textOffset + i + 1);\n }\n }\n return result;\n}\nfunction isEOL(char) {\n return char === 13 /* CharCode.CarriageReturn */ || char === 10 /* CharCode.LineFeed */;\n}\nfunction getWellformedRange(range) {\n const start = range.start;\n const end = range.end;\n if (start.line > end.line || (start.line === end.line && start.character > end.character)) {\n return { start: end, end: start };\n }\n return range;\n}\nfunction getWellformedEdit(textEdit) {\n const range = getWellformedRange(textEdit.range);\n if (range !== textEdit.range) {\n return { newText: textEdit.newText, range };\n }\n return textEdit;\n}\n", "// 'path' module extracted from Node.js v8.11.1 (only the posix part)\n// transplited with Babel\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction assertPath(path) {\n if (typeof path !== 'string') {\n throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));\n }\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path, allowAboveRoot) {\n var res = '';\n var lastSegmentLength = 0;\n var lastSlash = -1;\n var dots = 0;\n var code;\n for (var i = 0; i <= path.length; ++i) {\n if (i < path.length)\n code = path.charCodeAt(i);\n else if (code === 47 /*/*/)\n break;\n else\n code = 47 /*/*/;\n if (code === 47 /*/*/) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {\n if (res.length > 2) {\n var lastSlashIndex = res.lastIndexOf('/');\n if (lastSlashIndex !== res.length - 1) {\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n } else if (res.length === 2 || res.length === 1) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0)\n res += '/..';\n else\n res = '..';\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0)\n res += '/' + path.slice(lastSlash + 1, i);\n else\n res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === 46 /*.*/ && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\n\nfunction _format(sep, pathObject) {\n var dir = pathObject.dir || pathObject.root;\n var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n if (!dir) {\n return base;\n }\n if (dir === pathObject.root) {\n return dir + base;\n }\n return dir + sep + base;\n}\n\nvar posix = {\n // path.resolve([from ...], to)\n resolve: function resolve() {\n var resolvedPath = '';\n var resolvedAbsolute = false;\n var cwd;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path;\n if (i >= 0)\n path = arguments[i];\n else {\n if (cwd === undefined)\n cwd = process.cwd();\n path = cwd;\n }\n\n assertPath(path);\n\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n if (resolvedAbsolute) {\n if (resolvedPath.length > 0)\n return '/' + resolvedPath;\n else\n return '/';\n } else if (resolvedPath.length > 0) {\n return resolvedPath;\n } else {\n return '.';\n }\n },\n\n normalize: function normalize(path) {\n assertPath(path);\n\n if (path.length === 0) return '.';\n\n var isAbsolute = path.charCodeAt(0) === 47 /*/*/;\n var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;\n\n // Normalize the path\n path = normalizeStringPosix(path, !isAbsolute);\n\n if (path.length === 0 && !isAbsolute) path = '.';\n if (path.length > 0 && trailingSeparator) path += '/';\n\n if (isAbsolute) return '/' + path;\n return path;\n },\n\n isAbsolute: function isAbsolute(path) {\n assertPath(path);\n return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;\n },\n\n join: function join() {\n if (arguments.length === 0)\n return '.';\n var joined;\n for (var i = 0; i < arguments.length; ++i) {\n var arg = arguments[i];\n assertPath(arg);\n if (arg.length > 0) {\n if (joined === undefined)\n joined = arg;\n else\n joined += '/' + arg;\n }\n }\n if (joined === undefined)\n return '.';\n return posix.normalize(joined);\n },\n\n relative: function relative(from, to) {\n assertPath(from);\n assertPath(to);\n\n if (from === to) return '';\n\n from = posix.resolve(from);\n to = posix.resolve(to);\n\n if (from === to) return '';\n\n // Trim any leading backslashes\n var fromStart = 1;\n for (; fromStart < from.length; ++fromStart) {\n if (from.charCodeAt(fromStart) !== 47 /*/*/)\n break;\n }\n var fromEnd = from.length;\n var fromLen = fromEnd - fromStart;\n\n // Trim any leading backslashes\n var toStart = 1;\n for (; toStart < to.length; ++toStart) {\n if (to.charCodeAt(toStart) !== 47 /*/*/)\n break;\n }\n var toEnd = to.length;\n var toLen = toEnd - toStart;\n\n // Compare paths to find the longest common path from root\n var length = fromLen < toLen ? fromLen : toLen;\n var lastCommonSep = -1;\n var i = 0;\n for (; i <= length; ++i) {\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === 47 /*/*/) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='/foo/bar'; to='/foo/bar/baz'\n return to.slice(toStart + i + 1);\n } else if (i === 0) {\n // We get here if `from` is the root\n // For example: from='/'; to='/foo'\n return to.slice(toStart + i);\n }\n } else if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === 47 /*/*/) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='/foo/bar/baz'; to='/foo/bar'\n lastCommonSep = i;\n } else if (i === 0) {\n // We get here if `to` is the root.\n // For example: from='/foo'; to='/'\n lastCommonSep = 0;\n }\n }\n break;\n }\n var fromCode = from.charCodeAt(fromStart + i);\n var toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode)\n break;\n else if (fromCode === 47 /*/*/)\n lastCommonSep = i;\n }\n\n var out = '';\n // Generate the relative path based on the path difference between `to`\n // and `from`\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {\n if (out.length === 0)\n out += '..';\n else\n out += '/..';\n }\n }\n\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts\n if (out.length > 0)\n return out + to.slice(toStart + lastCommonSep);\n else {\n toStart += lastCommonSep;\n if (to.charCodeAt(toStart) === 47 /*/*/)\n ++toStart;\n return to.slice(toStart);\n }\n },\n\n _makeLong: function _makeLong(path) {\n return path;\n },\n\n dirname: function dirname(path) {\n assertPath(path);\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) return '//';\n return path.slice(0, end);\n },\n\n basename: function basename(path, ext) {\n if (ext !== undefined && typeof ext !== 'string') throw new TypeError('\"ext\" argument must be a string');\n assertPath(path);\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext.length === path.length && ext === path) return '';\n var extIdx = ext.length - 1;\n var firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n } else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n\n if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;\n return path.slice(start, end);\n } else {\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n }\n },\n\n extname: function extname(path) {\n assertPath(path);\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n },\n\n format: function format(pathObject) {\n if (pathObject === null || typeof pathObject !== 'object') {\n throw new TypeError('The \"pathObject\" argument must be of type Object. Received type ' + typeof pathObject);\n }\n return _format('/', pathObject);\n },\n\n parse: function parse(path) {\n assertPath(path);\n\n var ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) return ret;\n var code = path.charCodeAt(0);\n var isAbsolute = code === 47 /*/*/;\n var start;\n if (isAbsolute) {\n ret.root = '/';\n start = 1;\n } else {\n start = 0;\n }\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n var i = path.length - 1;\n\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n\n // Get non-dir info\n for (; i >= start; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);\n }\n } else {\n if (startPart === 0 && isAbsolute) {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n\n if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';\n\n return ret;\n },\n\n sep: '/',\n delimiter: ':',\n win32: null,\n posix: null\n};\n\nposix.posix = posix;\n\nmodule.exports = posix;\n", "// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n", "// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};", "__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))", "// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n\n// !!!!!\n// SEE https://github.com/microsoft/vscode/blob/master/src/vs/base/common/platform.ts\n// !!!!!\n\ndeclare const process: { platform: 'win32' };\ndeclare const navigator: { userAgent: string };\n\nexport let isWindows: boolean;\n\nif (typeof process === 'object') {\n\tisWindows = process.platform === 'win32';\n} else if (typeof navigator === 'object') {\n\tlet userAgent = navigator.userAgent;\n\tisWindows = userAgent.indexOf('Windows') >= 0;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n\nimport { CharCode } from './charCode'\nimport { isWindows } from './platform';\n\nconst _schemePattern = /^\\w[\\w\\d+.-]*$/;\nconst _singleSlashStart = /^\\//;\nconst _doubleSlashStart = /^\\/\\//;\n\nfunction _validateUri(ret: URI, _strict?: boolean): void {\n\n\t// scheme, must be set\n\tif (!ret.scheme && _strict) {\n\t\tthrow new Error(`[UriError]: Scheme is missing: {scheme: \"\", authority: \"${ret.authority}\", path: \"${ret.path}\", query: \"${ret.query}\", fragment: \"${ret.fragment}\"}`);\n\t}\n\n\t// scheme, https://tools.ietf.org/html/rfc3986#section-3.1\n\t// ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n\tif (ret.scheme && !_schemePattern.test(ret.scheme)) {\n\t\tthrow new Error('[UriError]: Scheme contains illegal characters.');\n\t}\n\n\t// path, http://tools.ietf.org/html/rfc3986#section-3.3\n\t// If a URI contains an authority component, then the path component\n\t// must either be empty or begin with a slash (\"/\") character. If a URI\n\t// does not contain an authority component, then the path cannot begin\n\t// with two slash characters (\"//\").\n\tif (ret.path) {\n\t\tif (ret.authority) {\n\t\t\tif (!_singleSlashStart.test(ret.path)) {\n\t\t\t\tthrow new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash (\"/\") character');\n\t\t\t}\n\t\t} else {\n\t\t\tif (_doubleSlashStart.test(ret.path)) {\n\t\t\t\tthrow new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters (\"//\")');\n\t\t\t}\n\t\t}\n\t}\n}\n\n// for a while we allowed uris *without* schemes and this is the migration\n// for them, e.g. an uri without scheme and without strict-mode warns and falls\n// back to the file-scheme. that should cause the least carnage and still be a\n// clear warning\nfunction _schemeFix(scheme: string, _strict: boolean): string {\n\tif (!scheme && !_strict) {\n\t\treturn 'file';\n\t}\n\treturn scheme;\n}\n\n// implements a bit of https://tools.ietf.org/html/rfc3986#section-5\nfunction _referenceResolution(scheme: string, path: string): string {\n\n\t// the slash-character is our 'default base' as we don't\n\t// support constructing URIs relative to other URIs. This\n\t// also means that we alter and potentially break paths.\n\t// see https://tools.ietf.org/html/rfc3986#section-5.1.4\n\tswitch (scheme) {\n\t\tcase 'https':\n\t\tcase 'http':\n\t\tcase 'file':\n\t\t\tif (!path) {\n\t\t\t\tpath = _slash;\n\t\t\t} else if (path[0] !== _slash) {\n\t\t\t\tpath = _slash + path;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\treturn path;\n}\n\nconst _empty = '';\nconst _slash = '/';\nconst _regexp = /^(([^:/?#]+?):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/;\n\n/**\n * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986.\n * This class is a simple parser which creates the basic component parts\n * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation\n * and encoding.\n *\n * ```txt\n * foo://example.com:8042/over/there?name=ferret#nose\n * \\_/ \\______________/\\_________/ \\_________/ \\__/\n * | | | | |\n * scheme authority path query fragment\n * | _____________________|__\n * / \\ / \\\n * urn:example:animal:ferret:nose\n * ```\n */\nexport class URI implements UriComponents {\n\n\tstatic isUri(thing: any): thing is URI {\n\t\tif (thing instanceof URI) {\n\t\t\treturn true;\n\t\t}\n\t\tif (!thing) {\n\t\t\treturn false;\n\t\t}\n\t\treturn typeof (thing).authority === 'string'\n\t\t\t&& typeof (thing).fragment === 'string'\n\t\t\t&& typeof (thing).path === 'string'\n\t\t\t&& typeof (thing).query === 'string'\n\t\t\t&& typeof (thing).scheme === 'string'\n\t\t\t&& typeof (thing).fsPath === 'string'\n\t\t\t&& typeof (thing).with === 'function'\n\t\t\t&& typeof (thing).toString === 'function';\n\t}\n\n\t/**\n\t * scheme is the 'http' part of 'http://www.example.com/some/path?query#fragment'.\n\t * The part before the first colon.\n\t */\n\treadonly scheme: string;\n\n\t/**\n\t * authority is the 'www.example.com' part of 'http://www.example.com/some/path?query#fragment'.\n\t * The part between the first double slashes and the next slash.\n\t */\n\treadonly authority: string;\n\n\t/**\n\t * path is the '/some/path' part of 'http://www.example.com/some/path?query#fragment'.\n\t */\n\treadonly path: string;\n\n\t/**\n\t * query is the 'query' part of 'http://www.example.com/some/path?query#fragment'.\n\t */\n\treadonly query: string;\n\n\t/**\n\t * fragment is the 'fragment' part of 'http://www.example.com/some/path?query#fragment'.\n\t */\n\treadonly fragment: string;\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(scheme: string, authority?: string, path?: string, query?: string, fragment?: string, _strict?: boolean);\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(components: UriComponents);\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(schemeOrData: string | UriComponents, authority?: string, path?: string, query?: string, fragment?: string, _strict: boolean = false) {\n\n\t\tif (typeof schemeOrData === 'object') {\n\t\t\tthis.scheme = schemeOrData.scheme || _empty;\n\t\t\tthis.authority = schemeOrData.authority || _empty;\n\t\t\tthis.path = schemeOrData.path || _empty;\n\t\t\tthis.query = schemeOrData.query || _empty;\n\t\t\tthis.fragment = schemeOrData.fragment || _empty;\n\t\t\t// no validation because it's this URI\n\t\t\t// that creates uri components.\n\t\t\t// _validateUri(this);\n\t\t} else {\n\t\t\tthis.scheme = _schemeFix(schemeOrData, _strict);\n\t\t\tthis.authority = authority || _empty;\n\t\t\tthis.path = _referenceResolution(this.scheme, path || _empty);\n\t\t\tthis.query = query || _empty;\n\t\t\tthis.fragment = fragment || _empty;\n\n\t\t\t_validateUri(this, _strict);\n\t\t}\n\t}\n\n\t// ---- filesystem path -----------------------\n\n\t/**\n\t * Returns a string representing the corresponding file system path of this URI.\n\t * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the\n\t * platform specific path separator.\n\t *\n\t * * Will *not* validate the path for invalid characters and semantics.\n\t * * Will *not* look at the scheme of this URI.\n\t * * The result shall *not* be used for display purposes but for accessing a file on disk.\n\t *\n\t *\n\t * The *difference* to `URI#path` is the use of the platform specific separator and the handling\n\t * of UNC paths. See the below sample of a file-uri with an authority (UNC path).\n\t *\n\t * ```ts\n\t\tconst u = URI.parse('file://server/c$/folder/file.txt')\n\t\tu.authority === 'server'\n\t\tu.path === '/shares/c$/file.txt'\n\t\tu.fsPath === '\\\\server\\c$\\folder\\file.txt'\n\t```\n\t *\n\t * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path,\n\t * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working\n\t * with URIs that represent files on disk (`file` scheme).\n\t */\n\tget fsPath(): string {\n\t\t// if (this.scheme !== 'file') {\n\t\t// \tconsole.warn(`[UriError] calling fsPath with scheme ${this.scheme}`);\n\t\t// }\n\t\treturn uriToFsPath(this, false);\n\t}\n\n\t// ---- modify to new -------------------------\n\n\twith(change: { scheme?: string; authority?: string | null; path?: string | null; query?: string | null; fragment?: string | null }): URI {\n\n\t\tif (!change) {\n\t\t\treturn this;\n\t\t}\n\n\t\tlet { scheme, authority, path, query, fragment } = change;\n\t\tif (scheme === undefined) {\n\t\t\tscheme = this.scheme;\n\t\t} else if (scheme === null) {\n\t\t\tscheme = _empty;\n\t\t}\n\t\tif (authority === undefined) {\n\t\t\tauthority = this.authority;\n\t\t} else if (authority === null) {\n\t\t\tauthority = _empty;\n\t\t}\n\t\tif (path === undefined) {\n\t\t\tpath = this.path;\n\t\t} else if (path === null) {\n\t\t\tpath = _empty;\n\t\t}\n\t\tif (query === undefined) {\n\t\t\tquery = this.query;\n\t\t} else if (query === null) {\n\t\t\tquery = _empty;\n\t\t}\n\t\tif (fragment === undefined) {\n\t\t\tfragment = this.fragment;\n\t\t} else if (fragment === null) {\n\t\t\tfragment = _empty;\n\t\t}\n\n\t\tif (scheme === this.scheme\n\t\t\t&& authority === this.authority\n\t\t\t&& path === this.path\n\t\t\t&& query === this.query\n\t\t\t&& fragment === this.fragment) {\n\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new Uri(scheme, authority, path, query, fragment);\n\t}\n\n\t// ---- parse & validate ------------------------\n\n\t/**\n\t * Creates a new URI from a string, e.g. `http://www.example.com/some/path`,\n\t * `file:///usr/home`, or `scheme:with/path`.\n\t *\n\t * @param value A string which represents an URI (see `URI#toString`).\n\t */\n\tstatic parse(value: string, _strict: boolean = false): URI {\n\t\tconst match = _regexp.exec(value);\n\t\tif (!match) {\n\t\t\treturn new Uri(_empty, _empty, _empty, _empty, _empty);\n\t\t}\n\t\treturn new Uri(\n\t\t\tmatch[2] || _empty,\n\t\t\tpercentDecode(match[4] || _empty),\n\t\t\tpercentDecode(match[5] || _empty),\n\t\t\tpercentDecode(match[7] || _empty),\n\t\t\tpercentDecode(match[9] || _empty),\n\t\t\t_strict\n\t\t);\n\t}\n\n\t/**\n\t * Creates a new URI from a file system path, e.g. `c:\\my\\files`,\n\t * `/usr/home`, or `\\\\server\\share\\some\\path`.\n\t *\n\t * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument\n\t * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as**\n\t * `URI.parse('file://' + path)` because the path might contain characters that are\n\t * interpreted (# and ?). See the following sample:\n\t * ```ts\n\tconst good = URI.file('/coding/c#/project1');\n\tgood.scheme === 'file';\n\tgood.path === '/coding/c#/project1';\n\tgood.fragment === '';\n\tconst bad = URI.parse('file://' + '/coding/c#/project1');\n\tbad.scheme === 'file';\n\tbad.path === '/coding/c'; // path is now broken\n\tbad.fragment === '/project1';\n\t```\n\t *\n\t * @param path A file system path (see `URI#fsPath`)\n\t */\n\tstatic file(path: string): URI {\n\n\t\tlet authority = _empty;\n\n\t\t// normalize to fwd-slashes on windows,\n\t\t// on other systems bwd-slashes are valid\n\t\t// filename character, eg /f\\oo/ba\\r.txt\n\t\tif (isWindows) {\n\t\t\tpath = path.replace(/\\\\/g, _slash);\n\t\t}\n\n\t\t// check for authority as used in UNC shares\n\t\t// or use the path as given\n\t\tif (path[0] === _slash && path[1] === _slash) {\n\t\t\tconst idx = path.indexOf(_slash, 2);\n\t\t\tif (idx === -1) {\n\t\t\t\tauthority = path.substring(2);\n\t\t\t\tpath = _slash;\n\t\t\t} else {\n\t\t\t\tauthority = path.substring(2, idx);\n\t\t\t\tpath = path.substring(idx) || _slash;\n\t\t\t}\n\t\t}\n\n\t\treturn new Uri('file', authority, path, _empty, _empty);\n\t}\n\n\tstatic from(components: { scheme: string; authority?: string; path?: string; query?: string; fragment?: string }): URI {\n\t\tconst result = new Uri(\n\t\t\tcomponents.scheme,\n\t\t\tcomponents.authority,\n\t\t\tcomponents.path,\n\t\t\tcomponents.query,\n\t\t\tcomponents.fragment,\n\t\t);\n\t\t_validateUri(result, true);\n\t\treturn result;\n\t}\n\n\t// ---- printing/externalize ---------------------------\n\n\t/**\n\t * Creates a string representation for this URI. It's guaranteed that calling\n\t * `URI.parse` with the result of this function creates an URI which is equal\n\t * to this URI.\n\t *\n\t * * The result shall *not* be used for display purposes but for externalization or transport.\n\t * * The result will be encoded using the percentage encoding and encoding happens mostly\n\t * ignore the scheme-specific encoding rules.\n\t *\n\t * @param skipEncoding Do not encode the result, default is `false`\n\t */\n\ttoString(skipEncoding: boolean = false): string {\n\t\treturn _asFormatted(this, skipEncoding);\n\t}\n\n\ttoJSON(): UriComponents {\n\t\treturn this;\n\t}\n\n\tstatic revive(data: UriComponents | URI): URI;\n\tstatic revive(data: UriComponents | URI | undefined): URI | undefined;\n\tstatic revive(data: UriComponents | URI | null): URI | null;\n\tstatic revive(data: UriComponents | URI | undefined | null): URI | undefined | null;\n\tstatic revive(data: UriComponents | URI | undefined | null): URI | undefined | null {\n\t\tif (!data) {\n\t\t\treturn data;\n\t\t} else if (data instanceof URI) {\n\t\t\treturn data;\n\t\t} else {\n\t\t\tconst result = new Uri(data);\n\t\t\tresult._formatted = (data).external;\n\t\t\tresult._fsPath = (data)._sep === _pathSepMarker ? (data).fsPath : null;\n\t\t\treturn result;\n\t\t}\n\t}\n}\n\nexport interface UriComponents {\n\tscheme: string;\n\tauthority: string;\n\tpath: string;\n\tquery: string;\n\tfragment: string;\n}\n\ninterface UriState extends UriComponents {\n\t$mid: number;\n\texternal: string;\n\tfsPath: string;\n\t_sep: 1 | undefined;\n}\n\nconst _pathSepMarker = isWindows ? 1 : undefined;\n\n// This class exists so that URI is compatible with vscode.Uri (API).\nclass Uri extends URI {\n\n\t_formatted: string | null = null;\n\t_fsPath: string | null = null;\n\n\toverride get fsPath(): string {\n\t\tif (!this._fsPath) {\n\t\t\tthis._fsPath = uriToFsPath(this, false);\n\t\t}\n\t\treturn this._fsPath;\n\t}\n\n\toverride toString(skipEncoding: boolean = false): string {\n\t\tif (!skipEncoding) {\n\t\t\tif (!this._formatted) {\n\t\t\t\tthis._formatted = _asFormatted(this, false);\n\t\t\t}\n\t\t\treturn this._formatted;\n\t\t} else {\n\t\t\t// we don't cache that\n\t\t\treturn _asFormatted(this, true);\n\t\t}\n\t}\n\n\toverride toJSON(): UriComponents {\n\t\tconst res = {\n\t\t\t$mid: 1\n\t\t};\n\t\t// cached state\n\t\tif (this._fsPath) {\n\t\t\tres.fsPath = this._fsPath;\n\t\t\tres._sep = _pathSepMarker;\n\t\t}\n\t\tif (this._formatted) {\n\t\t\tres.external = this._formatted;\n\t\t}\n\t\t// uri components\n\t\tif (this.path) {\n\t\t\tres.path = this.path;\n\t\t}\n\t\tif (this.scheme) {\n\t\t\tres.scheme = this.scheme;\n\t\t}\n\t\tif (this.authority) {\n\t\t\tres.authority = this.authority;\n\t\t}\n\t\tif (this.query) {\n\t\t\tres.query = this.query;\n\t\t}\n\t\tif (this.fragment) {\n\t\t\tres.fragment = this.fragment;\n\t\t}\n\t\treturn res;\n\t}\n}\n\n// reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2\nconst encodeTable: { [ch: number]: string } = {\n\t[CharCode.Colon]: '%3A', // gen-delims\n\t[CharCode.Slash]: '%2F',\n\t[CharCode.QuestionMark]: '%3F',\n\t[CharCode.Hash]: '%23',\n\t[CharCode.OpenSquareBracket]: '%5B',\n\t[CharCode.CloseSquareBracket]: '%5D',\n\t[CharCode.AtSign]: '%40',\n\n\t[CharCode.ExclamationMark]: '%21', // sub-delims\n\t[CharCode.DollarSign]: '%24',\n\t[CharCode.Ampersand]: '%26',\n\t[CharCode.SingleQuote]: '%27',\n\t[CharCode.OpenParen]: '%28',\n\t[CharCode.CloseParen]: '%29',\n\t[CharCode.Asterisk]: '%2A',\n\t[CharCode.Plus]: '%2B',\n\t[CharCode.Comma]: '%2C',\n\t[CharCode.Semicolon]: '%3B',\n\t[CharCode.Equals]: '%3D',\n\n\t[CharCode.Space]: '%20',\n};\n\nfunction encodeURIComponentFast(uriComponent: string, isPath: boolean, isAuthority: boolean): string {\n\tlet res: string | undefined = undefined;\n\tlet nativeEncodePos = -1;\n\n\tfor (let pos = 0; pos < uriComponent.length; pos++) {\n\t\tconst code = uriComponent.charCodeAt(pos);\n\n\t\t// unreserved characters: https://tools.ietf.org/html/rfc3986#section-2.3\n\t\tif (\n\t\t\t(code >= CharCode.a && code <= CharCode.z)\n\t\t\t|| (code >= CharCode.A && code <= CharCode.Z)\n\t\t\t|| (code >= CharCode.Digit0 && code <= CharCode.Digit9)\n\t\t\t|| code === CharCode.Dash\n\t\t\t|| code === CharCode.Period\n\t\t\t|| code === CharCode.Underline\n\t\t\t|| code === CharCode.Tilde\n\t\t\t|| (isPath && code === CharCode.Slash)\n\t\t\t|| (isAuthority && code === CharCode.OpenSquareBracket)\n\t\t\t|| (isAuthority && code === CharCode.CloseSquareBracket)\n\t\t\t|| (isAuthority && code === CharCode.Colon)\n\t\t) {\n\t\t\t// check if we are delaying native encode\n\t\t\tif (nativeEncodePos !== -1) {\n\t\t\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n\t\t\t\tnativeEncodePos = -1;\n\t\t\t}\n\t\t\t// check if we write into a new string (by default we try to return the param)\n\t\t\tif (res !== undefined) {\n\t\t\t\tres += uriComponent.charAt(pos);\n\t\t\t}\n\n\t\t} else {\n\t\t\t// encoding needed, we need to allocate a new string\n\t\t\tif (res === undefined) {\n\t\t\t\tres = uriComponent.substr(0, pos);\n\t\t\t}\n\n\t\t\t// check with default table first\n\t\t\tconst escaped = encodeTable[code];\n\t\t\tif (escaped !== undefined) {\n\n\t\t\t\t// check if we are delaying native encode\n\t\t\t\tif (nativeEncodePos !== -1) {\n\t\t\t\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n\t\t\t\t\tnativeEncodePos = -1;\n\t\t\t\t}\n\n\t\t\t\t// append escaped variant to result\n\t\t\t\tres += escaped;\n\n\t\t\t} else if (nativeEncodePos === -1) {\n\t\t\t\t// use native encode only when needed\n\t\t\t\tnativeEncodePos = pos;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (nativeEncodePos !== -1) {\n\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos));\n\t}\n\n\treturn res !== undefined ? res : uriComponent;\n}\n\nfunction encodeURIComponentMinimal(path: string): string {\n\tlet res: string | undefined = undefined;\n\tfor (let pos = 0; pos < path.length; pos++) {\n\t\tconst code = path.charCodeAt(pos);\n\t\tif (code === CharCode.Hash || code === CharCode.QuestionMark) {\n\t\t\tif (res === undefined) {\n\t\t\t\tres = path.substr(0, pos);\n\t\t\t}\n\t\t\tres += encodeTable[code];\n\t\t} else {\n\t\t\tif (res !== undefined) {\n\t\t\t\tres += path[pos];\n\t\t\t}\n\t\t}\n\t}\n\treturn res !== undefined ? res : path;\n}\n\n/**\n * Compute `fsPath` for the given uri\n */\nexport function uriToFsPath(uri: URI, keepDriveLetterCasing: boolean): string {\n\n\tlet value: string;\n\tif (uri.authority && uri.path.length > 1 && uri.scheme === 'file') {\n\t\t// unc path: file://shares/c$/far/boo\n\t\tvalue = `//${uri.authority}${uri.path}`;\n\t} else if (\n\t\turi.path.charCodeAt(0) === CharCode.Slash\n\t\t&& (uri.path.charCodeAt(1) >= CharCode.A && uri.path.charCodeAt(1) <= CharCode.Z || uri.path.charCodeAt(1) >= CharCode.a && uri.path.charCodeAt(1) <= CharCode.z)\n\t\t&& uri.path.charCodeAt(2) === CharCode.Colon\n\t) {\n\t\tif (!keepDriveLetterCasing) {\n\t\t\t// windows drive letter: file:///c:/far/boo\n\t\t\tvalue = uri.path[1].toLowerCase() + uri.path.substr(2);\n\t\t} else {\n\t\t\tvalue = uri.path.substr(1);\n\t\t}\n\t} else {\n\t\t// other path\n\t\tvalue = uri.path;\n\t}\n\tif (isWindows) {\n\t\tvalue = value.replace(/\\//g, '\\\\');\n\t}\n\treturn value;\n}\n\n/**\n * Create the external version of a uri\n */\nfunction _asFormatted(uri: URI, skipEncoding: boolean): string {\n\n\tconst encoder = !skipEncoding\n\t\t? encodeURIComponentFast\n\t\t: encodeURIComponentMinimal;\n\n\tlet res = '';\n\tlet { scheme, authority, path, query, fragment } = uri;\n\tif (scheme) {\n\t\tres += scheme;\n\t\tres += ':';\n\t}\n\tif (authority || scheme === 'file') {\n\t\tres += _slash;\n\t\tres += _slash;\n\t}\n\tif (authority) {\n\t\tlet idx = authority.indexOf('@');\n\t\tif (idx !== -1) {\n\t\t\t// @\n\t\t\tconst userinfo = authority.substr(0, idx);\n\t\t\tauthority = authority.substr(idx + 1);\n\t\t\tidx = userinfo.lastIndexOf(':');\n\t\t\tif (idx === -1) {\n\t\t\t\tres += encoder(userinfo, false, false);\n\t\t\t} else {\n\t\t\t\t// :@\n\t\t\t\tres += encoder(userinfo.substr(0, idx), false, false);\n\t\t\t\tres += ':';\n\t\t\t\tres += encoder(userinfo.substr(idx + 1), false, true);\n\t\t\t}\n\t\t\tres += '@';\n\t\t}\n\t\tauthority = authority.toLowerCase();\n\t\tidx = authority.lastIndexOf(':');\n\t\tif (idx === -1) {\n\t\t\tres += encoder(authority, false, true);\n\t\t} else {\n\t\t\t// :\n\t\t\tres += encoder(authority.substr(0, idx), false, true);\n\t\t\tres += authority.substr(idx);\n\t\t}\n\t}\n\tif (path) {\n\t\t// lower-case windows drive letters in /C:/fff or C:/fff\n\t\tif (path.length >= 3 && path.charCodeAt(0) === CharCode.Slash && path.charCodeAt(2) === CharCode.Colon) {\n\t\t\tconst code = path.charCodeAt(1);\n\t\t\tif (code >= CharCode.A && code <= CharCode.Z) {\n\t\t\t\tpath = `/${String.fromCharCode(code + 32)}:${path.substr(3)}`; // \"/c:\".length === 3\n\t\t\t}\n\t\t} else if (path.length >= 2 && path.charCodeAt(1) === CharCode.Colon) {\n\t\t\tconst code = path.charCodeAt(0);\n\t\t\tif (code >= CharCode.A && code <= CharCode.Z) {\n\t\t\t\tpath = `${String.fromCharCode(code + 32)}:${path.substr(2)}`; // \"/c:\".length === 3\n\t\t\t}\n\t\t}\n\t\t// encode the rest of the path\n\t\tres += encoder(path, true, false);\n\t}\n\tif (query) {\n\t\tres += '?';\n\t\tres += encoder(query, false, false);\n\t}\n\tif (fragment) {\n\t\tres += '#';\n\t\tres += !skipEncoding ? encodeURIComponentFast(fragment, false, false) : fragment;\n\t}\n\treturn res;\n}\n\n// --- decode\n\nfunction decodeURIComponentGraceful(str: string): string {\n\ttry {\n\t\treturn decodeURIComponent(str);\n\t} catch {\n\t\tif (str.length > 3) {\n\t\t\treturn str.substr(0, 3) + decodeURIComponentGraceful(str.substr(3));\n\t\t} else {\n\t\t\treturn str;\n\t\t}\n\t}\n}\n\nconst _rEncodedAsHex = /(%[0-9A-Za-z][0-9A-Za-z])+/g;\n\nfunction percentDecode(str: string): string {\n\tif (!str.match(_rEncodedAsHex)) {\n\t\treturn str;\n\t}\n\treturn str.replace(_rEncodedAsHex, (match) => decodeURIComponentGraceful(match));\n}\n\n/**\n * Mapped-type that replaces all occurrences of URI with UriComponents\n */\nexport type UriDto = { [K in keyof T]: T[K] extends URI\n\t? UriComponents\n\t: UriDto };\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n'use strict';\n\nimport { CharCode } from './charCode';\nimport { URI } from './uri';\nimport * as nodePath from 'path';\n\nconst posixPath = nodePath.posix || nodePath;\nconst slash = '/';\n\nexport namespace Utils {\n\n /**\n * Joins one or more input paths to the path of URI. \n * '/' is used as the directory separation character. \n * \n * The resolved path will be normalized. That means:\n * - all '..' and '.' segments are resolved.\n * - multiple, sequential occurences of '/' are replaced by a single instance of '/'.\n * - trailing separators are preserved.\n * \n * @param uri The input URI.\n * @param paths The paths to be joined with the path of URI.\n * @returns A URI with the joined path. All other properties of the URI (scheme, authority, query, fragments, ...) will be taken from the input URI.\n */\n export function joinPath(uri: URI, ...paths: string[]): URI {\n return uri.with({ path: posixPath.join(uri.path, ...paths) });\n }\n\n\n /**\n * Resolves one or more paths against the path of a URI. \n * '/' is used as the directory separation character. \n * \n * The resolved path will be normalized. That means:\n * - all '..' and '.' segments are resolved. \n * - multiple, sequential occurences of '/' are replaced by a single instance of '/'.\n * - trailing separators are removed.\n * \n * @param uri The input URI.\n * @param paths The paths to resolve against the path of URI.\n * @returns A URI with the resolved path. All other properties of the URI (scheme, authority, query, fragments, ...) will be taken from the input URI.\n */\n export function resolvePath(uri: URI, ...paths: string[]): URI {\n let path = uri.path; \n let slashAdded = false;\n if (path[0] !== slash) {\n path = slash + path; // make the path abstract: for posixPath.resolve the first segments has to be absolute or cwd is used.\n slashAdded = true;\n }\n let resolvedPath = posixPath.resolve(path, ...paths);\n if (slashAdded && resolvedPath[0] === slash && !uri.authority) {\n resolvedPath = resolvedPath.substring(1);\n }\n return uri.with({ path: resolvedPath });\n }\n\n /**\n * Returns a URI where the path is the directory name of the input uri, similar to the Unix dirname command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The orignal URI is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The last segment of the URIs path.\n */\n export function dirname(uri: URI): URI {\n if (uri.path.length === 0 || uri.path === slash) {\n return uri;\n }\n let path = posixPath.dirname(uri.path);\n if (path.length === 1 && path.charCodeAt(0) === CharCode.Period) {\n path = '';\n }\n return uri.with({ path });\n }\n\n /**\n * Returns the last segment of the path of a URI, similar to the Unix basename command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The empty string is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The base name of the URIs path.\n */\n export function basename(uri: URI): string {\n return posixPath.basename(uri.path);\n }\n\n /**\n * Returns the extension name of the path of a URI, similar to the Unix extname command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The empty string is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The extension name of the URIs path.\n */\n export function extname(uri: URI): string {\n return posixPath.extname(uri.path);\n }\n}", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { URI, Utils } from 'vscode-uri';\r\n\r\nexport { URI };\r\n\r\nexport namespace UriUtils {\r\n\r\n export const basename = Utils.basename;\r\n export const dirname = Utils.dirname;\r\n export const extname = Utils.extname;\r\n export const joinPath = Utils.joinPath;\r\n export const resolvePath = Utils.resolvePath;\r\n\r\n export function equals(a?: URI | string, b?: URI | string): boolean {\r\n return a?.toString() === b?.toString();\r\n }\r\n\r\n export function relative(from: URI | string, to: URI | string): string {\r\n const fromPath = typeof from === 'string' ? from : from.path;\r\n const toPath = typeof to === 'string' ? to : to.path;\r\n const fromParts = fromPath.split('/').filter(e => e.length > 0);\r\n const toParts = toPath.split('/').filter(e => e.length > 0);\r\n let i = 0;\r\n for (; i < fromParts.length; i++) {\r\n if (fromParts[i] !== toParts[i]) {\r\n break;\r\n }\r\n }\r\n const backPart = '../'.repeat(fromParts.length - i);\r\n const toPart = toParts.slice(i).join('/');\r\n return backPart + toPart;\r\n }\r\n\r\n export function normalize(uri: URI | string): string {\r\n return URI.parse(uri.toString()).toString();\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n/**\r\n * Re-export 'TextDocument' from 'vscode-languageserver-textdocument' for convenience,\r\n * including both type _and_ symbol (namespace), as we here and there also refer to the symbol,\r\n * the overhead is very small, just a few kilobytes.\r\n * Everything else of that package (at the time contributing) is also defined\r\n * in 'vscode-languageserver-protocol' or 'vscode-languageserver-types'.\r\n */\r\nexport { TextDocument } from 'vscode-languageserver-textdocument';\r\n\r\nimport type { Diagnostic, Range } from 'vscode-languageserver-types';\r\nimport type { FileSystemProvider } from './file-system-provider.js';\r\nimport type { ParseResult, ParserOptions } from '../parser/langium-parser.js';\r\nimport type { ServiceRegistry } from '../service-registry.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription, Mutable, Reference } from '../syntax-tree.js';\r\nimport type { MultiMap } from '../utils/collections.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport { TextDocument } from './documents.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport { URI } from '../utils/uri-utils.js';\r\n\r\n/**\r\n * A Langium document holds the parse result (AST and CST) and any additional state that is derived\r\n * from the AST, e.g. the result of scope precomputation.\r\n */\r\nexport interface LangiumDocument {\r\n /** The Uniform Resource Identifier (URI) of the document */\r\n readonly uri: URI;\r\n /** The text document used to convert between offsets and positions */\r\n readonly textDocument: TextDocument;\r\n /** The current state of the document */\r\n state: DocumentState;\r\n /** The parse result holds the Abstract Syntax Tree (AST) and potentially also parser / lexer errors */\r\n parseResult: ParseResult;\r\n /** Result of the scope precomputation phase */\r\n precomputedScopes?: PrecomputedScopes;\r\n /** An array of all cross-references found in the AST while linking */\r\n references: Reference[];\r\n /** Result of the validation phase */\r\n diagnostics?: Diagnostic[]\r\n}\r\n\r\n/**\r\n * A document is subject to several phases that are run in predefined order. Any state value implies that\r\n * smaller state values are finished as well.\r\n */\r\nexport enum DocumentState {\r\n /**\r\n * The text content has changed and needs to be parsed again. The AST held by this outdated\r\n * document instance is no longer valid.\r\n */\r\n Changed = 0,\r\n /**\r\n * An AST has been created from the text content. The document structure can be traversed,\r\n * but cross-references cannot be resolved yet. If necessary, the structure can be manipulated\r\n * at this stage as a preprocessing step.\r\n */\r\n Parsed = 1,\r\n /**\r\n * The `IndexManager` service has processed AST nodes of this document. This means the\r\n * exported symbols are available in the global scope and can be resolved from other documents.\r\n */\r\n IndexedContent = 2,\r\n /**\r\n * The `ScopeComputation` service has processed this document. This means the local symbols\r\n * are stored in a MultiMap so they can be looked up by the `ScopeProvider` service.\r\n * Once a document has reached this state, you may follow every reference - it will lazily\r\n * resolve its `ref` property and yield either the target AST node or `undefined` in case\r\n * the target is not in scope.\r\n */\r\n ComputedScopes = 3,\r\n /**\r\n * The `Linker` service has processed this document. All outgoing references have been\r\n * resolved or marked as erroneous.\r\n */\r\n Linked = 4,\r\n /**\r\n * The `IndexManager` service has processed AST node references of this document. This is\r\n * necessary to determine which documents are affected by a change in one of the workspace\r\n * documents.\r\n */\r\n IndexedReferences = 5,\r\n /**\r\n * The `DocumentValidator` service has processed this document. The language server listens\r\n * to the results of this phase and sends diagnostics to the client.\r\n */\r\n Validated = 6\r\n}\r\n\r\n/**\r\n * Result of the scope precomputation phase (`ScopeComputation` service).\r\n * It maps every AST node to the set of symbols that are visible in the subtree of that node.\r\n */\r\nexport type PrecomputedScopes = MultiMap\r\n\r\nexport interface DocumentSegment {\r\n readonly range: Range\r\n readonly offset: number\r\n readonly length: number\r\n readonly end: number\r\n}\r\n\r\n/**\r\n * Surrogate definition of the `TextDocuments` interface from the `vscode-languageserver` package.\r\n * No implementation object is expected to be offered by `LangiumCoreServices`, but only by `LangiumLSPServices`.\r\n */\r\nexport type TextDocumentProvider = {\r\n get(uri: string | URI): TextDocument | undefined\r\n}\r\n\r\n/**\r\n * Shared service for creating `LangiumDocument` instances.\r\n *\r\n * Register a custom implementation if special (additional) behavior is required for your language(s).\r\n * Note: If you specialize {@link fromString} or {@link fromTextDocument} you probably might want to\r\n * specialize {@link update}, too!\r\n */\r\nexport interface LangiumDocumentFactory {\r\n /**\r\n * Create a Langium document from a `TextDocument` (usually associated with a file).\r\n */\r\n fromTextDocument(textDocument: TextDocument, uri?: URI, options?: ParserOptions): LangiumDocument;\r\n /**\r\n * Create a Langium document from a `TextDocument` asynchronously. This action can be cancelled if a cancellable parser implementation has been provided.\r\n */\r\n fromTextDocument(textDocument: TextDocument, uri: URI | undefined, cancellationToken: CancellationToken): Promise>;\r\n\r\n /**\r\n * Create an Langium document from an in-memory string.\r\n */\r\n fromString(text: string, uri: URI, options?: ParserOptions): LangiumDocument;\r\n /**\r\n * Create a Langium document from an in-memory string asynchronously. This action can be cancelled if a cancellable parser implementation has been provided.\r\n */\r\n fromString(text: string, uri: URI, cancellationToken: CancellationToken): Promise>;\r\n\r\n /**\r\n * Create an Langium document from a model that has been constructed in memory.\r\n */\r\n fromModel(model: T, uri: URI): LangiumDocument;\r\n\r\n /**\r\n * Create an Langium document from a specified `URI`. The factory will use the `FileSystemAccess` service to read the file.\r\n */\r\n fromUri(uri: URI, cancellationToken?: CancellationToken): Promise>;\r\n\r\n /**\r\n * Update the given document after changes in the corresponding textual representation.\r\n * Method is called by the document builder after it has been requested to build an existing\r\n * document and the document's state is {@link DocumentState.Changed}.\r\n * The text parsing is expected to be done the same way as in {@link fromTextDocument}\r\n * and {@link fromString}.\r\n */\r\n update(document: LangiumDocument, cancellationToken: CancellationToken): Promise>\r\n}\r\n\r\nexport class DefaultLangiumDocumentFactory implements LangiumDocumentFactory {\r\n\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n protected readonly textDocuments?: TextDocumentProvider;\r\n protected readonly fileSystemProvider: FileSystemProvider;\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.serviceRegistry = services.ServiceRegistry;\r\n this.textDocuments = services.workspace.TextDocuments;\r\n this.fileSystemProvider = services.workspace.FileSystemProvider;\r\n }\r\n\r\n async fromUri(uri: URI, cancellationToken = CancellationToken.None): Promise> {\r\n const content = await this.fileSystemProvider.readFile(uri);\r\n return this.createAsync(uri, content, cancellationToken);\r\n }\r\n\r\n fromTextDocument(textDocument: TextDocument, uri?: URI, options?: ParserOptions): LangiumDocument;\r\n fromTextDocument(textDocument: TextDocument, uri: URI | undefined, cancellationToken: CancellationToken): Promise>;\r\n fromTextDocument(textDocument: TextDocument, uri?: URI, token?: CancellationToken | ParserOptions): LangiumDocument | Promise> {\r\n uri = uri ?? URI.parse(textDocument.uri);\r\n if (CancellationToken.is(token)) {\r\n return this.createAsync(uri, textDocument, token);\r\n } else {\r\n return this.create(uri, textDocument, token);\r\n }\r\n }\r\n\r\n fromString(text: string, uri: URI, options?: ParserOptions): LangiumDocument;\r\n fromString(text: string, uri: URI, cancellationToken: CancellationToken): Promise>;\r\n fromString(text: string, uri: URI, token?: CancellationToken | ParserOptions): LangiumDocument | Promise> {\r\n if (CancellationToken.is(token)) {\r\n return this.createAsync(uri, text, token);\r\n } else {\r\n return this.create(uri, text, token);\r\n }\r\n }\r\n\r\n fromModel(model: T, uri: URI): LangiumDocument {\r\n return this.create(uri, { $model: model });\r\n }\r\n\r\n protected create(uri: URI, content: string | TextDocument | { $model: T }, options?: ParserOptions): LangiumDocument {\r\n if (typeof content === 'string') {\r\n const parseResult = this.parse(uri, content, options);\r\n return this.createLangiumDocument(parseResult, uri, undefined, content);\r\n\r\n } else if ('$model' in content) {\r\n const parseResult = { value: content.$model, parserErrors: [], lexerErrors: [] };\r\n return this.createLangiumDocument(parseResult, uri);\r\n\r\n } else {\r\n const parseResult = this.parse(uri, content.getText(), options);\r\n return this.createLangiumDocument(parseResult, uri, content);\r\n }\r\n }\r\n\r\n protected async createAsync(uri: URI, content: string | TextDocument, cancelToken: CancellationToken): Promise> {\r\n if (typeof content === 'string') {\r\n const parseResult = await this.parseAsync(uri, content, cancelToken);\r\n return this.createLangiumDocument(parseResult, uri, undefined, content);\r\n } else {\r\n const parseResult = await this.parseAsync(uri, content.getText(), cancelToken);\r\n return this.createLangiumDocument(parseResult, uri, content);\r\n }\r\n }\r\n\r\n /**\r\n * Create a LangiumDocument from a given parse result.\r\n *\r\n * A TextDocument is created on demand if it is not provided as argument here. Usually this\r\n * should not be necessary because the main purpose of the TextDocument is to convert between\r\n * text ranges and offsets, which is done solely in LSP request handling.\r\n *\r\n * With the introduction of {@link update} below this method is supposed to be mainly called\r\n * during workspace initialization and on addition/recognition of new files, while changes in\r\n * existing documents are processed via {@link update}.\r\n */\r\n protected createLangiumDocument(parseResult: ParseResult, uri: URI, textDocument?: TextDocument, text?: string): LangiumDocument {\r\n let document: LangiumDocument;\r\n if (textDocument) {\r\n document = {\r\n parseResult,\r\n uri,\r\n state: DocumentState.Parsed,\r\n references: [],\r\n textDocument\r\n };\r\n } else {\r\n const textDocumentGetter = this.createTextDocumentGetter(uri, text);\r\n document = {\r\n parseResult,\r\n uri,\r\n state: DocumentState.Parsed,\r\n references: [],\r\n get textDocument() {\r\n return textDocumentGetter();\r\n }\r\n };\r\n }\r\n (parseResult.value as Mutable).$document = document;\r\n return document;\r\n }\r\n\r\n async update(document: Mutable>, cancellationToken: CancellationToken): Promise> {\r\n // The CST full text property contains the original text that was used to create the AST.\r\n const oldText = document.parseResult.value.$cstNode?.root.fullText;\r\n const textDocument = this.textDocuments?.get(document.uri.toString());\r\n const text = textDocument ? textDocument.getText() : await this.fileSystemProvider.readFile(document.uri);\r\n\r\n if (textDocument) {\r\n Object.defineProperty(\r\n document,\r\n 'textDocument',\r\n {\r\n value: textDocument\r\n }\r\n );\r\n } else {\r\n const textDocumentGetter = this.createTextDocumentGetter(document.uri, text);\r\n Object.defineProperty(\r\n document,\r\n 'textDocument',\r\n {\r\n get: textDocumentGetter\r\n }\r\n );\r\n }\r\n\r\n // Some of these documents can be pretty large, so parsing them again can be quite expensive.\r\n // Therefore, we only parse if the text has actually changed.\r\n if (oldText !== text) {\r\n document.parseResult = await this.parseAsync(document.uri, text, cancellationToken);\r\n (document.parseResult.value as Mutable).$document = document;\r\n }\r\n document.state = DocumentState.Parsed;\r\n return document;\r\n }\r\n\r\n protected parse(uri: URI, text: string, options?: ParserOptions): ParseResult {\r\n const services = this.serviceRegistry.getServices(uri);\r\n return services.parser.LangiumParser.parse(text, options);\r\n }\r\n\r\n protected parseAsync(uri: URI, text: string, cancellationToken: CancellationToken): Promise> {\r\n const services = this.serviceRegistry.getServices(uri);\r\n return services.parser.AsyncParser.parse(text, cancellationToken);\r\n }\r\n\r\n protected createTextDocumentGetter(uri: URI, text?: string): () => TextDocument {\r\n const serviceRegistry = this.serviceRegistry;\r\n let textDoc: TextDocument | undefined = undefined;\r\n return () => {\r\n return textDoc ??= TextDocument.create(\r\n uri.toString(), serviceRegistry.getServices(uri).LanguageMetaData.languageId, 0, text ?? ''\r\n );\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Shared service for managing Langium documents.\r\n */\r\nexport interface LangiumDocuments {\r\n\r\n /**\r\n * A stream of all documents managed under this service.\r\n */\r\n readonly all: Stream\r\n\r\n /**\r\n * Manage a new document under this service.\r\n * @throws an error if a document with the same URI is already present.\r\n */\r\n addDocument(document: LangiumDocument): void;\r\n\r\n /**\r\n * Retrieve the document with the given URI, if present. Otherwise returns `undefined`.\r\n */\r\n getDocument(uri: URI): LangiumDocument | undefined;\r\n\r\n /**\r\n * Retrieve the document with the given URI. If not present, a new one will be created using the file system access.\r\n * The new document will be added to the list of documents managed under this service.\r\n */\r\n getOrCreateDocument(uri: URI, cancellationToken?: CancellationToken): Promise;\r\n\r\n /**\r\n * Creates a new document with the given URI and text content.\r\n * The new document is automatically added to this service and can be retrieved using {@link getDocument}.\r\n *\r\n * @throws an error if a document with the same URI is already present.\r\n */\r\n createDocument(uri: URI, text: string): LangiumDocument;\r\n\r\n /**\r\n * Creates a new document with the given URI and text content asynchronously.\r\n * The process can be interrupted with a cancellation token.\r\n * The new document is automatically added to this service and can be retrieved using {@link getDocument}.\r\n *\r\n * @throws an error if a document with the same URI is already present.\r\n */\r\n createDocument(uri: URI, text: string, cancellationToken: CancellationToken): Promise;\r\n\r\n /**\r\n * Returns `true` if a document with the given URI is managed under this service.\r\n */\r\n hasDocument(uri: URI): boolean;\r\n\r\n /**\r\n * Flag the document with the given URI as `Changed`, if present, meaning that its content\r\n * is no longer valid. The content (parseResult) stays untouched, while internal data may\r\n * be dropped to reduce memory footprint.\r\n *\r\n * @returns the affected {@link LangiumDocument} if existing for convenience\r\n */\r\n invalidateDocument(uri: URI): LangiumDocument | undefined;\r\n\r\n /**\r\n * Remove the document with the given URI, if present, and mark it as `Changed`, meaning\r\n * that its content is no longer valid. The next call to `getOrCreateDocument` with the same\r\n * URI will create a new document instance.\r\n *\r\n * @returns the affected {@link LangiumDocument} if existing for convenience\r\n */\r\n deleteDocument(uri: URI): LangiumDocument | undefined;\r\n}\r\n\r\nexport class DefaultLangiumDocuments implements LangiumDocuments {\r\n\r\n protected readonly langiumDocumentFactory: LangiumDocumentFactory;\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n\r\n protected readonly documentMap: Map = new Map();\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.langiumDocumentFactory = services.workspace.LangiumDocumentFactory;\r\n this.serviceRegistry = services.ServiceRegistry;\r\n }\r\n\r\n get all(): Stream {\r\n return stream(this.documentMap.values());\r\n }\r\n\r\n addDocument(document: LangiumDocument): void {\r\n const uriString = document.uri.toString();\r\n if (this.documentMap.has(uriString)) {\r\n throw new Error(`A document with the URI '${uriString}' is already present.`);\r\n }\r\n this.documentMap.set(uriString, document);\r\n }\r\n\r\n getDocument(uri: URI): LangiumDocument | undefined {\r\n const uriString = uri.toString();\r\n return this.documentMap.get(uriString);\r\n }\r\n\r\n async getOrCreateDocument(uri: URI, cancellationToken?: CancellationToken): Promise {\r\n let document = this.getDocument(uri);\r\n if (document) {\r\n return document;\r\n }\r\n document = await this.langiumDocumentFactory.fromUri(uri, cancellationToken);\r\n this.addDocument(document);\r\n return document;\r\n }\r\n\r\n createDocument(uri: URI, text: string): LangiumDocument;\r\n createDocument(uri: URI, text: string, cancellationToken: CancellationToken): Promise;\r\n createDocument(uri: URI, text: string, cancellationToken?: CancellationToken): LangiumDocument | Promise {\r\n if (cancellationToken) {\r\n return this.langiumDocumentFactory.fromString(text, uri, cancellationToken).then(document => {\r\n this.addDocument(document);\r\n return document;\r\n });\r\n } else {\r\n const document = this.langiumDocumentFactory.fromString(text, uri);\r\n this.addDocument(document);\r\n return document;\r\n }\r\n }\r\n\r\n hasDocument(uri: URI): boolean {\r\n return this.documentMap.has(uri.toString());\r\n }\r\n\r\n invalidateDocument(uri: URI): LangiumDocument | undefined {\r\n const uriString = uri.toString();\r\n const langiumDoc = this.documentMap.get(uriString);\r\n if (langiumDoc) {\r\n const linker = this.serviceRegistry.getServices(uri).references.Linker;\r\n linker.unlink(langiumDoc);\r\n langiumDoc.state = DocumentState.Changed;\r\n langiumDoc.precomputedScopes = undefined;\r\n langiumDoc.diagnostics = undefined;\r\n }\r\n return langiumDoc;\r\n }\r\n\r\n deleteDocument(uri: URI): LangiumDocument | undefined {\r\n const uriString = uri.toString();\r\n const langiumDoc = this.documentMap.get(uriString);\r\n if (langiumDoc) {\r\n langiumDoc.state = DocumentState.Changed;\r\n this.documentMap.delete(uriString);\r\n }\r\n return langiumDoc;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription, AstReflection, CstNode, LinkingError, Reference, ReferenceInfo } from '../syntax-tree.js';\r\nimport type { AstNodeLocator } from '../workspace/ast-node-locator.js';\r\nimport type { LangiumDocument, LangiumDocuments } from '../workspace/documents.js';\r\nimport type { ScopeProvider } from './scope-provider.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { isAstNode, isAstNodeDescription, isLinkingError } from '../syntax-tree.js';\r\nimport { findRootNode, streamAst, streamReferences } from '../utils/ast-utils.js';\r\nimport { interruptAndCheck } from '../utils/promise-utils.js';\r\nimport { DocumentState } from '../workspace/documents.js';\r\n\r\n/**\r\n * Language-specific service for resolving cross-references in the AST.\r\n */\r\nexport interface Linker {\r\n\r\n /**\r\n * Links all cross-references within the specified document. The default implementation loads only target\r\n * elements from documents that are present in the `LangiumDocuments` service. The linked references are\r\n * stored in the document's `references` property.\r\n *\r\n * @param document A LangiumDocument that shall be linked.\r\n * @param cancelToken A token for cancelling the operation.\r\n *\r\n * @throws `OperationCancelled` if a cancellation event is detected\r\n */\r\n link(document: LangiumDocument, cancelToken?: CancellationToken): Promise;\r\n\r\n /**\r\n * Unlinks all references within the specified document and removes them from the list of `references`.\r\n *\r\n * @param document A LangiumDocument that shall be unlinked.\r\n */\r\n unlink(document: LangiumDocument): void;\r\n\r\n /**\r\n * Determines a candidate AST node description for linking the given reference.\r\n *\r\n * @param refInfo Information about the reference.\r\n */\r\n getCandidate(refInfo: ReferenceInfo): AstNodeDescription | LinkingError;\r\n\r\n /**\r\n * Creates a cross reference node being aware of its containing AstNode, the corresponding CstNode,\r\n * the cross reference text denoting the target AstNode being already extracted of the document text,\r\n * as well as the unique cross reference identifier.\r\n *\r\n * Default behavior:\r\n * - The returned Reference's 'ref' property pointing to the target AstNode is populated lazily on its\r\n * first visit.\r\n * - If the target AstNode cannot be resolved on the first visit, an error indicator will be installed\r\n * and further resolution attempts will *not* be performed.\r\n *\r\n * @param node The containing AST node\r\n * @param property The AST node property being referenced\r\n * @param refNode The corresponding CST node\r\n * @param refText The cross reference text denoting the target AstNode\r\n * @returns the desired Reference node, whose behavior wrt. resolving the cross reference is implementation specific.\r\n */\r\n buildReference(node: AstNode, property: string, refNode: CstNode | undefined, refText: string): Reference;\r\n\r\n}\r\n\r\nconst ref_resolving = Symbol('ref_resolving');\r\n\r\ninterface DefaultReference extends Reference {\r\n _ref?: AstNode | LinkingError | typeof ref_resolving;\r\n _nodeDescription?: AstNodeDescription;\r\n}\r\n\r\nexport class DefaultLinker implements Linker {\r\n protected readonly reflection: AstReflection;\r\n protected readonly scopeProvider: ScopeProvider;\r\n protected readonly astNodeLocator: AstNodeLocator;\r\n protected readonly langiumDocuments: () => LangiumDocuments;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.reflection = services.shared.AstReflection;\r\n this.langiumDocuments = () => services.shared.workspace.LangiumDocuments;\r\n this.scopeProvider = services.references.ScopeProvider;\r\n this.astNodeLocator = services.workspace.AstNodeLocator;\r\n }\r\n\r\n async link(document: LangiumDocument, cancelToken = CancellationToken.None): Promise {\r\n for (const node of streamAst(document.parseResult.value)) {\r\n await interruptAndCheck(cancelToken);\r\n streamReferences(node).forEach(ref => this.doLink(ref, document));\r\n }\r\n }\r\n\r\n protected doLink(refInfo: ReferenceInfo, document: LangiumDocument): void {\r\n const ref = refInfo.reference as DefaultReference;\r\n // The reference may already have been resolved lazily by accessing its `ref` property.\r\n if (ref._ref === undefined) {\r\n ref._ref = ref_resolving;\r\n try {\r\n const description = this.getCandidate(refInfo);\r\n if (isLinkingError(description)) {\r\n ref._ref = description;\r\n } else {\r\n ref._nodeDescription = description;\r\n if (this.langiumDocuments().hasDocument(description.documentUri)) {\r\n // The target document is already loaded\r\n const linkedNode = this.loadAstNode(description);\r\n ref._ref = linkedNode ?? this.createLinkingError(refInfo, description);\r\n } else {\r\n // Try to load the target AST node later using the already provided description\r\n ref._ref = undefined;\r\n }\r\n }\r\n } catch (err) {\r\n console.error(`An error occurred while resolving reference to '${ref.$refText}':`, err);\r\n const errorMessage = (err as Error).message ?? String(err);\r\n ref._ref = {\r\n ...refInfo,\r\n message: `An error occurred while resolving reference to '${ref.$refText}': ${errorMessage}`\r\n };\r\n }\r\n // Add the reference to the document's array of references\r\n // Only add if the reference has been not been resolved earlier\r\n // Otherwise we end up with duplicates\r\n // See also implementation of `buildReference`\r\n document.references.push(ref);\r\n }\r\n }\r\n\r\n unlink(document: LangiumDocument): void {\r\n for (const ref of document.references) {\r\n delete (ref as DefaultReference)._ref;\r\n delete (ref as DefaultReference)._nodeDescription;\r\n }\r\n document.references = [];\r\n }\r\n\r\n getCandidate(refInfo: ReferenceInfo): AstNodeDescription | LinkingError {\r\n const scope = this.scopeProvider.getScope(refInfo);\r\n const description = scope.getElement(refInfo.reference.$refText);\r\n return description ?? this.createLinkingError(refInfo);\r\n }\r\n\r\n buildReference(node: AstNode, property: string, refNode: CstNode | undefined, refText: string): Reference {\r\n // See behavior description in doc of Linker, update that on changes in here.\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const linker = this;\r\n const reference: DefaultReference = {\r\n $refNode: refNode,\r\n $refText: refText,\r\n\r\n get ref() {\r\n if (isAstNode(this._ref)) {\r\n // Most frequent case: the target is already resolved.\r\n return this._ref;\r\n } else if (isAstNodeDescription(this._nodeDescription)) {\r\n // A candidate has been found before, but it is not loaded yet.\r\n const linkedNode = linker.loadAstNode(this._nodeDescription);\r\n this._ref = linkedNode ??\r\n linker.createLinkingError({ reference, container: node, property }, this._nodeDescription);\r\n } else if (this._ref === undefined) {\r\n // The reference has not been linked yet, so do that now.\r\n this._ref = ref_resolving;\r\n const document = findRootNode(node).$document;\r\n const refData = linker.getLinkedNode({ reference, container: node, property });\r\n if (refData.error && document && document.state < DocumentState.ComputedScopes) {\r\n // Document scope is not ready, don't set `this._ref` so linker can retry later.\r\n return this._ref = undefined;\r\n }\r\n this._ref = refData.node ?? refData.error;\r\n this._nodeDescription = refData.descr;\r\n document?.references.push(this);\r\n } else if (this._ref === ref_resolving) {\r\n throw new Error(`Cyclic reference resolution detected: ${linker.astNodeLocator.getAstNodePath(node)}/${property} (symbol '${refText}')`);\r\n }\r\n return isAstNode(this._ref) ? this._ref : undefined;\r\n },\r\n get $nodeDescription() {\r\n return this._nodeDescription;\r\n },\r\n get error() {\r\n return isLinkingError(this._ref) ? this._ref : undefined;\r\n }\r\n };\r\n return reference;\r\n }\r\n\r\n protected getLinkedNode(refInfo: ReferenceInfo): { node?: AstNode, descr?: AstNodeDescription, error?: LinkingError } {\r\n try {\r\n const description = this.getCandidate(refInfo);\r\n if (isLinkingError(description)) {\r\n return { error: description };\r\n }\r\n const linkedNode = this.loadAstNode(description);\r\n if (linkedNode) {\r\n return { node: linkedNode, descr: description };\r\n }\r\n else {\r\n return {\r\n descr: description,\r\n error:\r\n this.createLinkingError(refInfo, description)\r\n };\r\n }\r\n } catch (err) {\r\n console.error(`An error occurred while resolving reference to '${refInfo.reference.$refText}':`, err);\r\n const errorMessage = (err as Error).message ?? String(err);\r\n return {\r\n error: {\r\n ...refInfo,\r\n message: `An error occurred while resolving reference to '${refInfo.reference.$refText}': ${errorMessage}`\r\n }\r\n };\r\n }\r\n }\r\n\r\n protected loadAstNode(nodeDescription: AstNodeDescription): AstNode | undefined {\r\n if (nodeDescription.node) {\r\n return nodeDescription.node;\r\n }\r\n const doc = this.langiumDocuments().getDocument(nodeDescription.documentUri);\r\n if (!doc) {\r\n return undefined;\r\n }\r\n return this.astNodeLocator.getAstNode(doc.parseResult.value, nodeDescription.path);\r\n }\r\n\r\n protected createLinkingError(refInfo: ReferenceInfo, targetDescription?: AstNodeDescription): LinkingError {\r\n // Check whether the document is sufficiently processed by the DocumentBuilder. If not, this is a hint for a bug\r\n // in the language implementation.\r\n const document = findRootNode(refInfo.container).$document;\r\n if (document && document.state < DocumentState.ComputedScopes) {\r\n console.warn(`Attempted reference resolution before document reached ComputedScopes state (${document.uri}).`);\r\n }\r\n const referenceType = this.reflection.getReferenceType(refInfo);\r\n return {\r\n ...refInfo,\r\n message: `Could not resolve reference to ${referenceType} named '${refInfo.reference.$refText}'.`,\r\n targetDescription\r\n };\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { AstNode, CstNode } from '../syntax-tree.js';\r\nimport { findNodeForProperty } from '../utils/grammar-utils.js';\r\n\r\nexport interface NamedAstNode extends AstNode {\r\n name: string;\r\n}\r\n\r\nexport function isNamed(node: AstNode): node is NamedAstNode {\r\n return typeof (node as NamedAstNode).name === 'string';\r\n}\r\n\r\n/**\r\n * Utility service for retrieving the `name` of an `AstNode` or the `CstNode` containing a `name`.\r\n */\r\nexport interface NameProvider {\r\n /**\r\n * Returns the `name` of a given AstNode.\r\n * @param node Specified `AstNode` whose name node shall be retrieved.\r\n */\r\n getName(node: AstNode): string | undefined;\r\n /**\r\n * Returns the `CstNode` which contains the parsed value of the `name` assignment.\r\n * @param node Specified `AstNode` whose name node shall be retrieved.\r\n */\r\n getNameNode(node: AstNode): CstNode | undefined;\r\n}\r\n\r\nexport class DefaultNameProvider implements NameProvider {\r\n getName(node: AstNode): string | undefined {\r\n if (isNamed(node)) {\r\n return node.name;\r\n }\r\n return undefined;\r\n }\r\n\r\n getNameNode(node: AstNode): CstNode | undefined {\r\n return findNodeForProperty(node.$cstNode, 'name');\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, CstNode, GenericAstNode } from '../syntax-tree.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport type { ReferenceDescription } from '../workspace/ast-descriptions.js';\r\nimport type { AstNodeLocator } from '../workspace/ast-node-locator.js';\r\nimport type { IndexManager } from '../workspace/index-manager.js';\r\nimport type { NameProvider } from './name-provider.js';\r\nimport type { URI } from '../utils/uri-utils.js';\r\nimport { findAssignment } from '../utils/grammar-utils.js';\r\nimport { isReference } from '../syntax-tree.js';\r\nimport { getDocument } from '../utils/ast-utils.js';\r\nimport { isChildNode, toDocumentSegment } from '../utils/cst-utils.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport { UriUtils } from '../utils/uri-utils.js';\r\n\r\n/**\r\n * Language-specific service for finding references and declaration of a given `CstNode`.\r\n */\r\nexport interface References {\r\n\r\n /**\r\n * If the CstNode is a reference node the target CstNode will be returned.\r\n * If the CstNode is a significant node of the CstNode this CstNode will be returned.\r\n *\r\n * @param sourceCstNode CstNode that points to a AstNode\r\n */\r\n findDeclaration(sourceCstNode: CstNode): AstNode | undefined;\r\n\r\n /**\r\n * If the CstNode is a reference node the target CstNode will be returned.\r\n * If the CstNode is a significant node of the CstNode this CstNode will be returned.\r\n *\r\n * @param sourceCstNode CstNode that points to a AstNode\r\n */\r\n findDeclarationNode(sourceCstNode: CstNode): CstNode | undefined;\r\n\r\n /**\r\n * Finds all references to the target node as references (local references) or reference descriptions.\r\n *\r\n * @param targetNode Specified target node whose references should be returned\r\n */\r\n findReferences(targetNode: AstNode, options: FindReferencesOptions): Stream;\r\n}\r\n\r\nexport interface FindReferencesOptions {\r\n /**\r\n * @deprecated Since v1.2.0. Please use `documentUri` instead.\r\n */\r\n onlyLocal?: boolean;\r\n /**\r\n * When set, the `findReferences` method will only return references/declarations from the specified document.\r\n */\r\n documentUri?: URI;\r\n /**\r\n * Whether the returned list of references should include the declaration.\r\n */\r\n includeDeclaration?: boolean;\r\n}\r\n\r\nexport class DefaultReferences implements References {\r\n protected readonly nameProvider: NameProvider;\r\n protected readonly index: IndexManager;\r\n protected readonly nodeLocator: AstNodeLocator;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.nameProvider = services.references.NameProvider;\r\n this.index = services.shared.workspace.IndexManager;\r\n this.nodeLocator = services.workspace.AstNodeLocator;\r\n }\r\n\r\n findDeclaration(sourceCstNode: CstNode): AstNode | undefined {\r\n if (sourceCstNode) {\r\n const assignment = findAssignment(sourceCstNode);\r\n const nodeElem = sourceCstNode.astNode;\r\n if (assignment && nodeElem) {\r\n const reference = (nodeElem as GenericAstNode)[assignment.feature];\r\n\r\n if (isReference(reference)) {\r\n return reference.ref;\r\n } else if (Array.isArray(reference)) {\r\n for (const ref of reference) {\r\n if (isReference(ref) && ref.$refNode\r\n && ref.$refNode.offset <= sourceCstNode.offset\r\n && ref.$refNode.end >= sourceCstNode.end) {\r\n return ref.ref;\r\n }\r\n }\r\n }\r\n }\r\n if (nodeElem) {\r\n const nameNode = this.nameProvider.getNameNode(nodeElem);\r\n // Only return the targeted node in case the targeted cst node is the name node or part of it\r\n if (nameNode && (nameNode === sourceCstNode || isChildNode(sourceCstNode, nameNode))) {\r\n return nodeElem;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n findDeclarationNode(sourceCstNode: CstNode): CstNode | undefined {\r\n const astNode = this.findDeclaration(sourceCstNode);\r\n if (astNode?.$cstNode) {\r\n const targetNode = this.nameProvider.getNameNode(astNode);\r\n return targetNode ?? astNode.$cstNode;\r\n }\r\n return undefined;\r\n }\r\n\r\n findReferences(targetNode: AstNode, options: FindReferencesOptions): Stream {\r\n const refs: ReferenceDescription[] = [];\r\n if (options.includeDeclaration) {\r\n const ref = this.getReferenceToSelf(targetNode);\r\n if (ref) {\r\n refs.push(ref);\r\n }\r\n }\r\n let indexReferences = this.index.findAllReferences(targetNode, this.nodeLocator.getAstNodePath(targetNode));\r\n if (options.documentUri) {\r\n indexReferences = indexReferences.filter(ref => UriUtils.equals(ref.sourceUri, options.documentUri));\r\n }\r\n refs.push(...indexReferences);\r\n return stream(refs);\r\n }\r\n\r\n protected getReferenceToSelf(targetNode: AstNode): ReferenceDescription | undefined {\r\n const nameNode = this.nameProvider.getNameNode(targetNode);\r\n if (nameNode) {\r\n const doc = getDocument(targetNode);\r\n const path = this.nodeLocator.getAstNodePath(targetNode);\r\n return {\r\n sourceUri: doc.uri,\r\n sourcePath: path,\r\n targetUri: doc.uri,\r\n targetPath: path,\r\n segment: toDocumentSegment(nameNode),\r\n local: true\r\n };\r\n }\r\n return undefined;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { Stream } from './stream.js';\r\nimport { Reduction, stream } from './stream.js';\r\n\r\n/**\r\n * A multimap is a variation of a Map that has potentially multiple values for every key.\r\n */\r\nexport class MultiMap {\r\n\r\n private map = new Map();\r\n\r\n constructor()\r\n constructor(elements: Array<[K, V]>)\r\n constructor(elements?: Array<[K, V]>) {\r\n if (elements) {\r\n for (const [key, value] of elements) {\r\n this.add(key, value);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The total number of values in the multimap.\r\n */\r\n get size(): number {\r\n return Reduction.sum(stream(this.map.values()).map(a => a.length));\r\n }\r\n\r\n /**\r\n * Clear all entries in the multimap.\r\n */\r\n clear(): void {\r\n this.map.clear();\r\n }\r\n\r\n /**\r\n * Operates differently depending on whether a `value` is given:\r\n * * With a value, this method deletes the specific key / value pair from the multimap.\r\n * * Without a value, all values associated with the given key are deleted.\r\n *\r\n * @returns `true` if a value existed and has been removed, or `false` if the specified\r\n * key / value does not exist.\r\n */\r\n delete(key: K, value?: V): boolean {\r\n if (value === undefined) {\r\n return this.map.delete(key);\r\n } else {\r\n const values = this.map.get(key);\r\n if (values) {\r\n const index = values.indexOf(value);\r\n if (index >= 0) {\r\n if (values.length === 1) {\r\n this.map.delete(key);\r\n } else {\r\n values.splice(index, 1);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Returns an array of all values associated with the given key. If no value exists,\r\n * an empty array is returned.\r\n *\r\n * _Note:_ The returned array is assumed not to be modified. Use the `set` method to add a\r\n * value and `delete` to remove a value from the multimap.\r\n */\r\n get(key: K): readonly V[] {\r\n return this.map.get(key) ?? [];\r\n }\r\n\r\n /**\r\n * Operates differently depending on whether a `value` is given:\r\n * * With a value, this method returns `true` if the specific key / value pair is present in the multimap.\r\n * * Without a value, this method returns `true` if the given key is present in the multimap.\r\n */\r\n has(key: K, value?: V): boolean {\r\n if (value === undefined) {\r\n return this.map.has(key);\r\n } else {\r\n const values = this.map.get(key);\r\n if (values) {\r\n return values.indexOf(value) >= 0;\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Add the given key / value pair to the multimap.\r\n */\r\n add(key: K, value: V): this {\r\n if (this.map.has(key)) {\r\n this.map.get(key)!.push(value);\r\n } else {\r\n this.map.set(key, [value]);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Add the given set of key / value pairs to the multimap.\r\n */\r\n addAll(key: K, values: Iterable): this {\r\n if (this.map.has(key)) {\r\n this.map.get(key)!.push(...values);\r\n } else {\r\n this.map.set(key, Array.from(values));\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Invokes the given callback function for every key / value pair in the multimap.\r\n */\r\n forEach(callbackfn: (value: V, key: K, map: this) => void): void {\r\n this.map.forEach((array, key) =>\r\n array.forEach(value => callbackfn(value, key, this))\r\n );\r\n }\r\n\r\n /**\r\n * Returns an iterator of key, value pairs for every entry in the map.\r\n */\r\n [Symbol.iterator](): Iterator<[K, V]> {\r\n return this.entries().iterator();\r\n }\r\n\r\n /**\r\n * Returns a stream of key, value pairs for every entry in the map.\r\n */\r\n entries(): Stream<[K, V]> {\r\n return stream(this.map.entries())\r\n .flatMap(([key, array]) => array.map(value => [key, value] as [K, V]));\r\n }\r\n\r\n /**\r\n * Returns a stream of keys in the map.\r\n */\r\n keys(): Stream {\r\n return stream(this.map.keys());\r\n }\r\n\r\n /**\r\n * Returns a stream of values in the map.\r\n */\r\n values(): Stream {\r\n return stream(this.map.values()).flat();\r\n }\r\n\r\n /**\r\n * Returns a stream of key, value set pairs for every key in the map.\r\n */\r\n entriesGroupedByKey(): Stream<[K, V[]]> {\r\n return stream(this.map.entries());\r\n }\r\n\r\n}\r\n\r\nexport class BiMap {\r\n\r\n private map = new Map();\r\n private inverse = new Map();\r\n\r\n get size(): number {\r\n return this.map.size;\r\n }\r\n\r\n constructor()\r\n constructor(elements: Array<[K, V]>)\r\n constructor(elements?: Array<[K, V]>) {\r\n if (elements) {\r\n for (const [key, value] of elements) {\r\n this.set(key, value);\r\n }\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.map.clear();\r\n this.inverse.clear();\r\n }\r\n\r\n set(key: K, value: V): this {\r\n this.map.set(key, value);\r\n this.inverse.set(value, key);\r\n return this;\r\n }\r\n\r\n get(key: K): V | undefined {\r\n return this.map.get(key);\r\n }\r\n\r\n getKey(value: V): K | undefined {\r\n return this.inverse.get(value);\r\n }\r\n\r\n delete(key: K): boolean {\r\n const value = this.map.get(key);\r\n if (value !== undefined) {\r\n this.map.delete(key);\r\n this.inverse.delete(value);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021-2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription } from '../syntax-tree.js';\r\nimport type { AstNodeDescriptionProvider } from '../workspace/ast-descriptions.js';\r\nimport type { LangiumDocument, PrecomputedScopes } from '../workspace/documents.js';\r\nimport type { NameProvider } from './name-provider.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { streamAllContents, streamContents } from '../utils/ast-utils.js';\r\nimport { MultiMap } from '../utils/collections.js';\r\nimport { interruptAndCheck } from '../utils/promise-utils.js';\r\n\r\n/**\r\n * Language-specific service for precomputing global and local scopes. The service methods are executed\r\n * as the first and second phase in the `DocumentBuilder`.\r\n */\r\nexport interface ScopeComputation {\r\n\r\n /**\r\n * Creates descriptions of all AST nodes that shall be exported into the _global_ scope from the given\r\n * document. These descriptions are gathered by the `IndexManager` and stored in the global index so\r\n * they can be referenced from other documents.\r\n *\r\n * _Note:_ You should not resolve any cross-references in this service method. Cross-reference resolution\r\n * depends on the scope computation phase to be completed (`computeScope` method), which runs after the\r\n * initial indexing where this method is used.\r\n *\r\n * @param document The document from which to gather exported AST nodes.\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n computeExports(document: LangiumDocument, cancelToken?: CancellationToken): Promise;\r\n\r\n /**\r\n * Precomputes the _local_ scopes for a document, which are necessary for the default way of\r\n * resolving references to symbols in the same document. The result is a multimap assigning a\r\n * set of AST node descriptions to every level of the AST. These data are used by the `ScopeProvider`\r\n * service to determine which target nodes are visible in the context of a specific cross-reference.\r\n *\r\n * _Note:_ You should not resolve any cross-references in this service method. Cross-reference\r\n * resolution depends on the scope computation phase to be completed.\r\n *\r\n * @param document The document in which to compute scopes.\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n computeLocalScopes(document: LangiumDocument, cancelToken?: CancellationToken): Promise;\r\n\r\n}\r\n\r\n/**\r\n * The default scope computation creates and collectes descriptions of the AST nodes to be exported into the\r\n * _global_ scope from the given document. By default those are the document's root AST node and its directly\r\n * contained child nodes.\r\n *\r\n * Besides, it gathers all AST nodes that have a name (according to the `NameProvider` service) and includes them\r\n * in the local scope of their particular container nodes. As a result, for every cross-reference in the AST,\r\n * target elements from the same level (siblings) and further up towards the root (parents and siblings of parents)\r\n * are visible. Elements being nested inside lower levels (children, children of siblings and parents' siblings)\r\n * are _invisible_ by default, but that can be changed by customizing this service.\r\n */\r\nexport class DefaultScopeComputation implements ScopeComputation {\r\n\r\n protected readonly nameProvider: NameProvider;\r\n protected readonly descriptions: AstNodeDescriptionProvider;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.nameProvider = services.references.NameProvider;\r\n this.descriptions = services.workspace.AstNodeDescriptionProvider;\r\n }\r\n\r\n async computeExports(document: LangiumDocument, cancelToken = CancellationToken.None): Promise {\r\n return this.computeExportsForNode(document.parseResult.value, document, undefined, cancelToken);\r\n }\r\n\r\n /**\r\n * Creates {@link AstNodeDescription AstNodeDescriptions} for the given {@link AstNode parentNode} and its children.\r\n * The list of children to be considered is determined by the function parameter {@link children}.\r\n * By default only the direct children of {@link parentNode} are visited, nested nodes are not exported.\r\n *\r\n * @param parentNode AST node to be exported, i.e., of which an {@link AstNodeDescription} shall be added to the returned list.\r\n * @param document The document containing the AST node to be exported.\r\n * @param children A function called with {@link parentNode} as single argument and returning an {@link Iterable} supplying the children to be visited, which must be directly or transitively contained in {@link parentNode}.\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCancelled` if a user action occurs during execution.\r\n * @returns A list of {@link AstNodeDescription AstNodeDescriptions} to be published to index.\r\n */\r\n async computeExportsForNode(parentNode: AstNode, document: LangiumDocument, children: (root: AstNode) => Iterable = streamContents, cancelToken: CancellationToken = CancellationToken.None): Promise {\r\n const exports: AstNodeDescription[] = [];\r\n\r\n this.exportNode(parentNode, exports, document);\r\n for (const node of children(parentNode)) {\r\n await interruptAndCheck(cancelToken);\r\n this.exportNode(node, exports, document);\r\n }\r\n return exports;\r\n }\r\n\r\n /**\r\n * Add a single node to the list of exports if it has a name. Override this method to change how\r\n * symbols are exported, e.g. by modifying their exported name.\r\n */\r\n protected exportNode(node: AstNode, exports: AstNodeDescription[], document: LangiumDocument): void {\r\n const name = this.nameProvider.getName(node);\r\n if (name) {\r\n exports.push(this.descriptions.createDescription(node, name, document));\r\n }\r\n }\r\n\r\n async computeLocalScopes(document: LangiumDocument, cancelToken = CancellationToken.None): Promise {\r\n const rootNode = document.parseResult.value;\r\n const scopes = new MultiMap();\r\n // Here we navigate the full AST - local scopes shall be available in the whole document\r\n for (const node of streamAllContents(rootNode)) {\r\n await interruptAndCheck(cancelToken);\r\n this.processNode(node, document, scopes);\r\n }\r\n return scopes;\r\n }\r\n\r\n /**\r\n * Process a single node during scopes computation. The default implementation makes the node visible\r\n * in the subtree of its container (if the node has a name). Override this method to change this,\r\n * e.g. by increasing the visibility to a higher level in the AST.\r\n */\r\n protected processNode(node: AstNode, document: LangiumDocument, scopes: PrecomputedScopes): void {\r\n const container = node.$container;\r\n if (container) {\r\n const name = this.nameProvider.getName(node);\r\n if (name) {\r\n scopes.add(container, this.descriptions.createDescription(node, name, document));\r\n }\r\n }\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { AstNodeDescription } from '../syntax-tree.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport { EMPTY_STREAM, stream } from '../utils/stream.js';\r\n\r\n/**\r\n * A scope describes what target elements are visible from a specific cross-reference context.\r\n */\r\nexport interface Scope {\r\n\r\n /**\r\n * Find a target element matching the given name. If no element is found, `undefined` is returned.\r\n * If multiple matching elements are present, the selection of the returned element should be done\r\n * according to the semantics of your language. Usually it is the element that is most closely defined.\r\n *\r\n * @param name Name of the cross-reference target as it appears in the source text.\r\n */\r\n getElement(name: string): AstNodeDescription | undefined;\r\n\r\n /**\r\n * Create a stream of all elements in the scope. This is used to compute completion proposals to be\r\n * shown in the editor.\r\n */\r\n getAllElements(): Stream;\r\n\r\n}\r\n\r\nexport interface ScopeOptions {\r\n caseInsensitive?: boolean;\r\n}\r\n\r\n/**\r\n * The default scope implementation is based on a `Stream`. It has an optional _outer scope_ describing\r\n * the next level of elements, which are queried when a target element is not found in the stream provided\r\n * to this scope.\r\n */\r\nexport class StreamScope implements Scope {\r\n readonly elements: Stream;\r\n readonly outerScope?: Scope;\r\n readonly caseInsensitive: boolean;\r\n\r\n constructor(elements: Stream, outerScope?: Scope, options?: ScopeOptions) {\r\n this.elements = elements;\r\n this.outerScope = outerScope;\r\n this.caseInsensitive = options?.caseInsensitive ?? false;\r\n }\r\n\r\n getAllElements(): Stream {\r\n if (this.outerScope) {\r\n return this.elements.concat(this.outerScope.getAllElements());\r\n } else {\r\n return this.elements;\r\n }\r\n }\r\n\r\n getElement(name: string): AstNodeDescription | undefined {\r\n const local = this.caseInsensitive\r\n ? this.elements.find(e => e.name.toLowerCase() === name.toLowerCase())\r\n : this.elements.find(e => e.name === name);\r\n if (local) {\r\n return local;\r\n }\r\n if (this.outerScope) {\r\n return this.outerScope.getElement(name);\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\nexport class MapScope implements Scope {\r\n readonly elements: Map;\r\n readonly outerScope?: Scope;\r\n readonly caseInsensitive: boolean;\r\n\r\n constructor(elements: Iterable, outerScope?: Scope, options?: ScopeOptions) {\r\n this.elements = new Map();\r\n this.caseInsensitive = options?.caseInsensitive ?? false;\r\n for (const element of elements) {\r\n const name = this.caseInsensitive\r\n ? element.name.toLowerCase()\r\n : element.name;\r\n this.elements.set(name, element);\r\n }\r\n this.outerScope = outerScope;\r\n }\r\n\r\n getElement(name: string): AstNodeDescription | undefined {\r\n const localName = this.caseInsensitive ? name.toLowerCase() : name;\r\n const local = this.elements.get(localName);\r\n if (local) {\r\n return local;\r\n }\r\n if (this.outerScope) {\r\n return this.outerScope.getElement(name);\r\n }\r\n return undefined;\r\n }\r\n\r\n getAllElements(): Stream {\r\n let elementStream = stream(this.elements.values());\r\n if (this.outerScope) {\r\n elementStream = elementStream.concat(this.outerScope.getAllElements());\r\n }\r\n return elementStream;\r\n }\r\n\r\n}\r\n\r\nexport const EMPTY_SCOPE: Scope = {\r\n getElement(): undefined {\r\n return undefined;\r\n },\r\n getAllElements(): Stream {\r\n return EMPTY_STREAM;\r\n }\r\n};\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { Disposable } from './disposable.js';\r\nimport type { URI } from './uri-utils.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport type { DocumentState } from '../workspace/documents.js';\r\n\r\nexport abstract class DisposableCache implements Disposable {\r\n\r\n protected toDispose: Disposable[] = [];\r\n protected isDisposed = false;\r\n\r\n onDispose(disposable: Disposable): void {\r\n this.toDispose.push(disposable);\r\n }\r\n\r\n dispose(): void {\r\n this.throwIfDisposed();\r\n this.clear();\r\n this.isDisposed = true;\r\n this.toDispose.forEach(disposable => disposable.dispose());\r\n }\r\n\r\n protected throwIfDisposed(): void {\r\n if (this.isDisposed) {\r\n throw new Error('This cache has already been disposed');\r\n }\r\n }\r\n\r\n abstract clear(): void;\r\n}\r\n\r\nexport class SimpleCache extends DisposableCache {\r\n protected readonly cache = new Map();\r\n\r\n has(key: K): boolean {\r\n this.throwIfDisposed();\r\n return this.cache.has(key);\r\n }\r\n\r\n set(key: K, value: V): void {\r\n this.throwIfDisposed();\r\n this.cache.set(key, value);\r\n }\r\n\r\n get(key: K): V | undefined;\r\n get(key: K, provider: () => V): V;\r\n get(key: K, provider?: () => V): V | undefined {\r\n this.throwIfDisposed();\r\n if (this.cache.has(key)) {\r\n return this.cache.get(key);\r\n } else if (provider) {\r\n const value = provider();\r\n this.cache.set(key, value);\r\n return value;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n delete(key: K): boolean {\r\n this.throwIfDisposed();\r\n return this.cache.delete(key);\r\n }\r\n\r\n clear(): void {\r\n this.throwIfDisposed();\r\n this.cache.clear();\r\n }\r\n}\r\n\r\nexport class ContextCache extends DisposableCache {\r\n\r\n private readonly cache = new Map>();\r\n private readonly converter: (input: Context) => ContextKey | Context;\r\n\r\n constructor(converter?: (input: Context) => ContextKey) {\r\n super();\r\n this.converter = converter ?? (value => value);\r\n }\r\n\r\n has(contextKey: Context, key: Key): boolean {\r\n this.throwIfDisposed();\r\n return this.cacheForContext(contextKey).has(key);\r\n }\r\n\r\n set(contextKey: Context, key: Key, value: Value): void {\r\n this.throwIfDisposed();\r\n this.cacheForContext(contextKey).set(key, value);\r\n }\r\n\r\n get(contextKey: Context, key: Key): Value | undefined;\r\n get(contextKey: Context, key: Key, provider: () => Value): Value;\r\n get(contextKey: Context, key: Key, provider?: () => Value): Value | undefined {\r\n this.throwIfDisposed();\r\n const contextCache = this.cacheForContext(contextKey);\r\n if (contextCache.has(key)) {\r\n return contextCache.get(key);\r\n } else if (provider) {\r\n const value = provider();\r\n contextCache.set(key, value);\r\n return value;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n delete(contextKey: Context, key: Key): boolean {\r\n this.throwIfDisposed();\r\n return this.cacheForContext(contextKey).delete(key);\r\n }\r\n\r\n clear(): void;\r\n clear(contextKey: Context): void;\r\n clear(contextKey?: Context): void {\r\n this.throwIfDisposed();\r\n if (contextKey) {\r\n const mapKey = this.converter(contextKey);\r\n this.cache.delete(mapKey);\r\n } else {\r\n this.cache.clear();\r\n }\r\n }\r\n\r\n protected cacheForContext(contextKey: Context): Map {\r\n const mapKey = this.converter(contextKey);\r\n let documentCache = this.cache.get(mapKey);\r\n if (!documentCache) {\r\n documentCache = new Map();\r\n this.cache.set(mapKey, documentCache);\r\n }\r\n return documentCache;\r\n }\r\n}\r\n\r\n/**\r\n * Every key/value pair in this cache is scoped to a document.\r\n * If this document is changed or deleted, all associated key/value pairs are deleted.\r\n */\r\nexport class DocumentCache extends ContextCache {\r\n\r\n /**\r\n * Creates a new document cache.\r\n *\r\n * @param sharedServices Service container instance to hook into document lifecycle events.\r\n * @param state Optional document state on which the cache should evict.\r\n * If not provided, the cache will evict on `DocumentBuilder#onUpdate`.\r\n * *Deleted* documents are considered in both cases.\r\n *\r\n * Providing a state here will use `DocumentBuilder#onDocumentPhase` instead,\r\n * which triggers on all documents that have been affected by this change, assuming that the\r\n * state is `DocumentState.Linked` or a later state.\r\n */\r\n constructor(sharedServices: LangiumSharedCoreServices, state?: DocumentState) {\r\n super(uri => uri.toString());\r\n if (state) {\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onDocumentPhase(state, document => {\r\n this.clear(document.uri.toString());\r\n }));\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onUpdate((_changed, deleted) => {\r\n for (const uri of deleted) { // react only on deleted documents\r\n this.clear(uri);\r\n }\r\n }));\r\n } else {\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onUpdate((changed, deleted) => {\r\n const allUris = changed.concat(deleted); // react on both changed and deleted documents\r\n for (const uri of allUris) {\r\n this.clear(uri);\r\n }\r\n }));\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Every key/value pair in this cache is scoped to the whole workspace.\r\n * If any document in the workspace is added, changed or deleted, the whole cache is evicted.\r\n */\r\nexport class WorkspaceCache extends SimpleCache {\r\n\r\n /**\r\n * Creates a new workspace cache.\r\n *\r\n * @param sharedServices Service container instance to hook into document lifecycle events.\r\n * @param state Optional document state on which the cache should evict.\r\n * If not provided, the cache will evict on `DocumentBuilder#onUpdate`.\r\n * *Deleted* documents are considered in both cases.\r\n */\r\n constructor(sharedServices: LangiumSharedCoreServices, state?: DocumentState) {\r\n super();\r\n if (state) {\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onBuildPhase(state, () => {\r\n this.clear();\r\n }));\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onUpdate((_changed, deleted) => {\r\n if (deleted.length > 0) { // react only on deleted documents\r\n this.clear();\r\n }\r\n }));\r\n } else {\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onUpdate(() => { // react on both changed and deleted documents\r\n this.clear();\r\n }));\r\n }\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021-2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription, AstReflection, ReferenceInfo } from '../syntax-tree.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport type { AstNodeDescriptionProvider } from '../workspace/ast-descriptions.js';\r\nimport type { IndexManager } from '../workspace/index-manager.js';\r\nimport type { NameProvider } from './name-provider.js';\r\nimport type { Scope, ScopeOptions} from './scope.js';\r\nimport { MapScope, StreamScope } from './scope.js';\r\nimport { getDocument } from '../utils/ast-utils.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport { WorkspaceCache } from '../utils/caching.js';\r\n\r\n/**\r\n * Language-specific service for determining the scope of target elements visible in a specific cross-reference context.\r\n */\r\nexport interface ScopeProvider {\r\n\r\n /**\r\n * Return a scope describing what elements are visible for the given AST node and cross-reference\r\n * identifier.\r\n *\r\n * @param context Information about the reference for which a scope is requested.\r\n */\r\n getScope(context: ReferenceInfo): Scope;\r\n\r\n}\r\n\r\nexport class DefaultScopeProvider implements ScopeProvider {\r\n\r\n protected readonly reflection: AstReflection;\r\n protected readonly nameProvider: NameProvider;\r\n protected readonly descriptions: AstNodeDescriptionProvider;\r\n protected readonly indexManager: IndexManager;\r\n\r\n protected readonly globalScopeCache: WorkspaceCache;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.reflection = services.shared.AstReflection;\r\n this.nameProvider = services.references.NameProvider;\r\n this.descriptions = services.workspace.AstNodeDescriptionProvider;\r\n this.indexManager = services.shared.workspace.IndexManager;\r\n this.globalScopeCache = new WorkspaceCache(services.shared);\r\n }\r\n\r\n getScope(context: ReferenceInfo): Scope {\r\n const scopes: Array> = [];\r\n const referenceType = this.reflection.getReferenceType(context);\r\n\r\n const precomputed = getDocument(context.container).precomputedScopes;\r\n if (precomputed) {\r\n let currentNode: AstNode | undefined = context.container;\r\n do {\r\n const allDescriptions = precomputed.get(currentNode);\r\n if (allDescriptions.length > 0) {\r\n scopes.push(stream(allDescriptions).filter(\r\n desc => this.reflection.isSubtype(desc.type, referenceType)));\r\n }\r\n currentNode = currentNode.$container;\r\n } while (currentNode);\r\n }\r\n\r\n let result: Scope = this.getGlobalScope(referenceType, context);\r\n for (let i = scopes.length - 1; i >= 0; i--) {\r\n result = this.createScope(scopes[i], result);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a scope for the given collection of AST node descriptions.\r\n */\r\n protected createScope(elements: Iterable, outerScope?: Scope, options?: ScopeOptions): Scope {\r\n return new StreamScope(stream(elements), outerScope, options);\r\n }\r\n\r\n /**\r\n * Create a scope for the given collection of AST nodes, which need to be transformed into respective\r\n * descriptions first. This is done using the `NameProvider` and `AstNodeDescriptionProvider` services.\r\n */\r\n protected createScopeForNodes(elements: Iterable, outerScope?: Scope, options?: ScopeOptions): Scope {\r\n const s = stream(elements).map(e => {\r\n const name = this.nameProvider.getName(e);\r\n if (name) {\r\n return this.descriptions.createDescription(e, name);\r\n }\r\n return undefined;\r\n }).nonNullable();\r\n return new StreamScope(s, outerScope, options);\r\n }\r\n\r\n /**\r\n * Create a global scope filtered for the given reference type.\r\n */\r\n protected getGlobalScope(referenceType: string, _context: ReferenceInfo): Scope {\r\n return this.globalScopeCache.get(referenceType, () => new MapScope(this.indexManager.allElements(referenceType)));\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { URI } from 'vscode-uri';\r\nimport type { CommentProvider } from '../documentation/comment-provider.js';\r\nimport type { NameProvider } from '../references/name-provider.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, CstNode, GenericAstNode, Mutable, Reference } from '../syntax-tree.js';\r\nimport { isAstNode, isReference } from '../syntax-tree.js';\r\nimport { getDocument } from '../utils/ast-utils.js';\r\nimport { findNodesForProperty } from '../utils/grammar-utils.js';\r\nimport type { AstNodeLocator } from '../workspace/ast-node-locator.js';\r\nimport type { DocumentSegment, LangiumDocument, LangiumDocuments } from '../workspace/documents.js';\r\n\r\nexport interface JsonSerializeOptions {\r\n /** The space parameter for `JSON.stringify`, controlling whether and how to pretty-print the output. */\r\n space?: string | number;\r\n /** Whether to include the `$refText` property for references (the name used to identify the target node). */\r\n refText?: boolean;\r\n /** Whether to include the `$sourceText` property, which holds the full source text from which an AST node was parsed. */\r\n sourceText?: boolean;\r\n /** Whether to include the `$textRegion` property, which holds information to trace AST node properties to their respective source text regions. */\r\n textRegions?: boolean;\r\n /** Whether to include the `$comment` property, which holds comments according to the CommentProvider service. */\r\n comments?: boolean;\r\n /** The replacer parameter for `JSON.stringify`; the default replacer given as parameter should be used to apply basic replacements. */\r\n replacer?: (key: string, value: unknown, defaultReplacer: (key: string, value: unknown) => unknown) => unknown\r\n /** Used to convert and serialize URIs when the target of a cross-reference is in a different document. */\r\n uriConverter?: (uri: URI, reference: Reference) => string\r\n}\r\n\r\nexport interface JsonDeserializeOptions {\r\n /** Used to parse and convert URIs when the target of a cross-reference is in a different document. */\r\n uriConverter?: (uri: string) => URI\r\n}\r\n\r\n/**\r\n * {@link AstNode}s that may carry information on their definition area within the DSL text.\r\n */\r\nexport interface AstNodeWithTextRegion extends AstNode {\r\n $sourceText?: string;\r\n $textRegion?: AstNodeRegionWithAssignments;\r\n}\r\n\r\n/**\r\n * {@link AstNode}s that may carry a semantically relevant comment.\r\n */\r\nexport interface AstNodeWithComment extends AstNode {\r\n $comment?: string;\r\n}\r\n\r\nexport function isAstNodeWithComment(node: AstNode): node is AstNodeWithComment {\r\n return typeof (node as AstNodeWithComment).$comment === 'string';\r\n}\r\n\r\n/**\r\n * A {@link DocumentSegment} representing the definition area of an AstNode within the DSL text.\r\n * Usually contains text region information on all assigned property values of the AstNode,\r\n * and may contain the defining file's URI as string.\r\n */\r\nexport interface AstNodeRegionWithAssignments extends DocumentSegment {\r\n /**\r\n * A record containing an entry for each assigned property of the AstNode.\r\n * The key is equal to the property name and the value is an array of the property values'\r\n * text regions, regardless of whether the property is a single value or list property.\r\n */\r\n assignments?: Record;\r\n /**\r\n * The AstNode defining file's URI as string\r\n */\r\n documentURI?: string;\r\n}\r\n\r\n/**\r\n * Utility service for transforming an `AstNode` into a JSON string and vice versa.\r\n */\r\nexport interface JsonSerializer {\r\n /**\r\n * Serialize an `AstNode` into a JSON `string`.\r\n * @param node The `AstNode` to be serialized.\r\n * @param options Serialization options\r\n */\r\n serialize(node: AstNode, options?: JsonSerializeOptions): string;\r\n /**\r\n * Deserialize (parse) a JSON `string` into an `AstNode`.\r\n */\r\n deserialize(content: string, options?: JsonDeserializeOptions): T;\r\n}\r\n\r\n/**\r\n * A cross-reference in the serialized JSON representation of an AstNode.\r\n */\r\ninterface IntermediateReference {\r\n /** URI pointing to the target element. This is either `#${path}` if the target is in the same document, or `${documentURI}#${path}` otherwise. */\r\n $ref?: string\r\n /** The actual text used to look up the reference target in the surrounding scope. */\r\n $refText?: string\r\n /** If any problem occurred while resolving the reference, it is described by this property. */\r\n $error?: string\r\n}\r\n\r\nfunction isIntermediateReference(obj: unknown): obj is IntermediateReference {\r\n return typeof obj === 'object' && !!obj && ('$ref' in obj || '$error' in obj);\r\n}\r\n\r\nexport class DefaultJsonSerializer implements JsonSerializer {\r\n\r\n /** The set of AstNode properties to be ignored by the serializer. */\r\n ignoreProperties = new Set(['$container', '$containerProperty', '$containerIndex', '$document', '$cstNode']);\r\n\r\n /** The document that is currently processed by the serializer; this is used by the replacer function. */\r\n protected currentDocument: LangiumDocument | undefined;\r\n\r\n protected readonly langiumDocuments: LangiumDocuments;\r\n protected readonly astNodeLocator: AstNodeLocator;\r\n protected readonly nameProvider: NameProvider;\r\n protected readonly commentProvider: CommentProvider;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.langiumDocuments = services.shared.workspace.LangiumDocuments;\r\n this.astNodeLocator = services.workspace.AstNodeLocator;\r\n this.nameProvider = services.references.NameProvider;\r\n this.commentProvider = services.documentation.CommentProvider;\r\n }\r\n\r\n serialize(node: AstNode, options?: JsonSerializeOptions): string {\r\n const serializeOptions = options ?? {};\r\n const specificReplacer = options?.replacer;\r\n const defaultReplacer = (key: string, value: unknown) => this.replacer(key, value, serializeOptions);\r\n const replacer = specificReplacer ? (key: string, value: unknown) => specificReplacer(key, value, defaultReplacer) : defaultReplacer;\r\n\r\n try {\r\n this.currentDocument = getDocument(node);\r\n return JSON.stringify(node, replacer, options?.space);\r\n } finally {\r\n this.currentDocument = undefined;\r\n }\r\n }\r\n\r\n deserialize(content: string, options?: JsonDeserializeOptions): T {\r\n const deserializeOptions = options ?? {};\r\n const root = JSON.parse(content);\r\n this.linkNode(root, root, deserializeOptions);\r\n return root;\r\n }\r\n\r\n protected replacer(key: string, value: unknown, { refText, sourceText, textRegions, comments, uriConverter }: JsonSerializeOptions): unknown {\r\n if (this.ignoreProperties.has(key)) {\r\n return undefined;\r\n } else if (isReference(value)) {\r\n const refValue = value.ref;\r\n const $refText = refText ? value.$refText : undefined;\r\n if (refValue) {\r\n const targetDocument = getDocument(refValue);\r\n let targetUri = '';\r\n if (this.currentDocument && this.currentDocument !== targetDocument) {\r\n if (uriConverter) {\r\n targetUri = uriConverter(targetDocument.uri, value);\r\n } else {\r\n targetUri = targetDocument.uri.toString();\r\n }\r\n }\r\n const targetPath = this.astNodeLocator.getAstNodePath(refValue);\r\n return {\r\n $ref: `${targetUri}#${targetPath}`,\r\n $refText\r\n } satisfies IntermediateReference;\r\n } else {\r\n return {\r\n $error: value.error?.message ?? 'Could not resolve reference',\r\n $refText\r\n } satisfies IntermediateReference;\r\n }\r\n } else if (isAstNode(value)) {\r\n let astNode: AstNodeWithTextRegion | undefined = undefined;\r\n if (textRegions) {\r\n astNode = this.addAstNodeRegionWithAssignmentsTo({ ...value });\r\n if ((!key || value.$document) && astNode?.$textRegion) {\r\n // The document URI is added to the root node of the resulting JSON tree\r\n astNode.$textRegion.documentURI = this.currentDocument?.uri.toString();\r\n }\r\n }\r\n if (sourceText && !key) {\r\n astNode ??= { ...value };\r\n astNode.$sourceText = value.$cstNode?.text;\r\n }\r\n if (comments) {\r\n astNode ??= { ...value };\r\n const comment = this.commentProvider.getComment(value);\r\n if (comment) {\r\n (astNode as AstNodeWithComment).$comment = comment.replace(/\\r/g, '');\r\n }\r\n }\r\n return astNode ?? value;\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n protected addAstNodeRegionWithAssignmentsTo(node: AstNodeWithTextRegion) {\r\n const createDocumentSegment: (cstNode: CstNode) => AstNodeRegionWithAssignments = cstNode => {\r\n offset: cstNode.offset,\r\n end: cstNode.end,\r\n length: cstNode.length,\r\n range: cstNode.range,\r\n };\r\n\r\n if (node.$cstNode) {\r\n const textRegion = node.$textRegion = createDocumentSegment(node.$cstNode);\r\n const assignments: Record = textRegion.assignments = {};\r\n\r\n Object.keys(node).filter(key => !key.startsWith('$')).forEach(key => {\r\n const propertyAssignments = findNodesForProperty(node.$cstNode, key).map(createDocumentSegment);\r\n if (propertyAssignments.length !== 0) {\r\n assignments[key] = propertyAssignments;\r\n }\r\n });\r\n\r\n return node;\r\n }\r\n return undefined;\r\n }\r\n\r\n protected linkNode(node: GenericAstNode, root: AstNode, options: JsonDeserializeOptions, container?: AstNode, containerProperty?: string, containerIndex?: number) {\r\n for (const [propertyName, item] of Object.entries(node)) {\r\n if (Array.isArray(item)) {\r\n for (let index = 0; index < item.length; index++) {\r\n const element = item[index];\r\n if (isIntermediateReference(element)) {\r\n item[index] = this.reviveReference(node, propertyName, root, element, options);\r\n } else if (isAstNode(element)) {\r\n this.linkNode(element as GenericAstNode, root, options, node, propertyName, index);\r\n }\r\n }\r\n } else if (isIntermediateReference(item)) {\r\n node[propertyName] = this.reviveReference(node, propertyName, root, item, options);\r\n } else if (isAstNode(item)) {\r\n this.linkNode(item as GenericAstNode, root, options, node, propertyName);\r\n }\r\n }\r\n const mutable = node as Mutable;\r\n mutable.$container = container;\r\n mutable.$containerProperty = containerProperty;\r\n mutable.$containerIndex = containerIndex;\r\n }\r\n\r\n protected reviveReference(container: AstNode, property: string, root: AstNode, reference: IntermediateReference, options: JsonDeserializeOptions): Reference | undefined {\r\n let refText = reference.$refText;\r\n let error = reference.$error;\r\n if (reference.$ref) {\r\n const ref = this.getRefNode(root, reference.$ref, options.uriConverter);\r\n if (isAstNode(ref)) {\r\n if (!refText) {\r\n refText = this.nameProvider.getName(ref);\r\n }\r\n return {\r\n $refText: refText ?? '',\r\n ref\r\n };\r\n } else {\r\n error = ref;\r\n }\r\n }\r\n if (error) {\r\n const ref: Mutable = {\r\n $refText: refText ?? ''\r\n };\r\n ref.error = {\r\n container,\r\n property,\r\n message: error,\r\n reference: ref\r\n };\r\n return ref;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n protected getRefNode(root: AstNode, uri: string, uriConverter?: (uri: string) => URI): AstNode | string {\r\n try {\r\n const fragmentIndex = uri.indexOf('#');\r\n if (fragmentIndex === 0) {\r\n const node = this.astNodeLocator.getAstNode(root, uri.substring(1));\r\n if (!node) {\r\n return 'Could not resolve path: ' + uri;\r\n }\r\n return node;\r\n }\r\n if (fragmentIndex < 0) {\r\n const documentUri = uriConverter ? uriConverter(uri) : URI.parse(uri);\r\n const document = this.langiumDocuments.getDocument(documentUri);\r\n if (!document) {\r\n return 'Could not find document for URI: ' + uri;\r\n }\r\n return document.parseResult.value;\r\n }\r\n const documentUri = uriConverter ? uriConverter(uri.substring(0, fragmentIndex)) : URI.parse(uri.substring(0, fragmentIndex));\r\n const document = this.langiumDocuments.getDocument(documentUri);\r\n if (!document) {\r\n return 'Could not find document for URI: ' + uri;\r\n }\r\n if (fragmentIndex === uri.length - 1) {\r\n return document.parseResult.value;\r\n }\r\n const node = this.astNodeLocator.getAstNode(document.parseResult.value, uri.substring(fragmentIndex + 1));\r\n if (!node) {\r\n return 'Could not resolve URI: ' + uri;\r\n }\r\n return node;\r\n } catch (err) {\r\n return String(err);\r\n }\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices, LangiumSharedCoreServices } from './services.js';\r\nimport type { TextDocumentProvider } from './workspace/documents.js';\r\nimport { UriUtils, type URI } from './utils/uri-utils.js';\r\n\r\n/**\r\n * The service registry provides access to the language-specific {@link LangiumCoreServices} optionally including LSP-related services.\r\n * These are resolved via the URI of a text document.\r\n */\r\nexport interface ServiceRegistry {\r\n\r\n /**\r\n * Register a language via its injected services.\r\n */\r\n register(language: LangiumCoreServices): void;\r\n\r\n /**\r\n * Retrieve the language-specific services for the given URI. In case only one language is\r\n * registered, it may be used regardless of the URI format.\r\n */\r\n getServices(uri: URI): LangiumCoreServices;\r\n\r\n /**\r\n * Check whether services are available for the given URI.\r\n */\r\n hasServices(uri: URI): boolean;\r\n\r\n /**\r\n * The full set of registered language services.\r\n */\r\n readonly all: readonly LangiumCoreServices[];\r\n}\r\n\r\n/**\r\n * Generic registry for Langium services, but capable of being used with extending service sets as well (such as the lsp-complete LangiumCoreServices set)\r\n */\r\nexport class DefaultServiceRegistry implements ServiceRegistry {\r\n\r\n protected singleton?: LangiumCoreServices;\r\n protected readonly languageIdMap = new Map();\r\n protected readonly fileExtensionMap = new Map();\r\n\r\n /**\r\n * @deprecated Use the new `fileExtensionMap` (or `languageIdMap`) property instead.\r\n */\r\n protected get map(): Map | undefined {\r\n return this.fileExtensionMap;\r\n }\r\n\r\n protected readonly textDocuments?: TextDocumentProvider;\r\n\r\n constructor(services?: LangiumSharedCoreServices) {\r\n this.textDocuments = services?.workspace.TextDocuments;\r\n }\r\n\r\n register(language: LangiumCoreServices): void {\r\n const data = language.LanguageMetaData;\r\n for (const ext of data.fileExtensions) {\r\n if (this.fileExtensionMap.has(ext)) {\r\n console.warn(`The file extension ${ext} is used by multiple languages. It is now assigned to '${data.languageId}'.`);\r\n }\r\n this.fileExtensionMap.set(ext, language);\r\n }\r\n this.languageIdMap.set(data.languageId, language);\r\n if (this.languageIdMap.size === 1) {\r\n this.singleton = language;\r\n } else {\r\n this.singleton = undefined;\r\n }\r\n }\r\n\r\n getServices(uri: URI): LangiumCoreServices {\r\n if (this.singleton !== undefined) {\r\n return this.singleton;\r\n }\r\n if (this.languageIdMap.size === 0) {\r\n throw new Error('The service registry is empty. Use `register` to register the services of a language.');\r\n }\r\n const languageId = this.textDocuments?.get(uri)?.languageId;\r\n if (languageId !== undefined) {\r\n const services = this.languageIdMap.get(languageId);\r\n if (services) {\r\n return services;\r\n }\r\n }\r\n const ext = UriUtils.extname(uri);\r\n const services = this.fileExtensionMap.get(ext);\r\n if (!services) {\r\n if (languageId) {\r\n throw new Error(`The service registry contains no services for the extension '${ext}' for language '${languageId}'.`);\r\n } else {\r\n throw new Error(`The service registry contains no services for the extension '${ext}'.`);\r\n }\r\n }\r\n return services;\r\n }\r\n\r\n hasServices(uri: URI): boolean {\r\n try {\r\n this.getServices(uri);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n get all(): readonly LangiumCoreServices[] {\r\n return Array.from(this.languageIdMap.values());\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { CodeDescription, DiagnosticRelatedInformation, DiagnosticTag, integer, Range } from 'vscode-languageserver-types';\r\nimport { assertUnreachable } from '../index.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstReflection, Properties } from '../syntax-tree.js';\r\nimport type { CancellationToken } from '../utils/cancellation.js';\r\nimport { MultiMap } from '../utils/collections.js';\r\nimport type { MaybePromise } from '../utils/promise-utils.js';\r\nimport { isOperationCancelled } from '../utils/promise-utils.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport type { DocumentSegment } from '../workspace/documents.js';\r\n\r\nexport type DiagnosticInfo> = {\r\n /** The AST node to which the diagnostic is attached. */\r\n node: N;\r\n /** If a property name is given, the diagnostic is restricted to the corresponding text region. */\r\n property?: P;\r\n /** If the value of a keyword is given, the diagnostic will appear at its corresponding text region */\r\n keyword?: string;\r\n /** In case of a multi-value property (array), an index can be given to select a specific element. */\r\n index?: number;\r\n /** If you want to create a diagnostic independent to any property, use the range property. */\r\n range?: Range;\r\n /** The diagnostic's code, which usually appear in the user interface. */\r\n code?: integer | string;\r\n /** An optional property to describe the error code. */\r\n codeDescription?: CodeDescription;\r\n /** Additional metadata about the diagnostic. */\r\n tags?: DiagnosticTag[];\r\n /** An array of related diagnostic information, e.g. when symbol-names within a scope collide all definitions can be marked via this property. */\r\n relatedInformation?: DiagnosticRelatedInformation[];\r\n /** A data entry field that is preserved between a `textDocument/publishDiagnostics` notification and `textDocument/codeAction` request. */\r\n data?: unknown;\r\n}\r\n\r\n/**\r\n * Shape of information commonly used in the `data` field of diagnostics.\r\n */\r\nexport interface DiagnosticData {\r\n /** Diagnostic code for identifying which code action to apply. This code is _not_ shown in the user interface. */\r\n code: string\r\n /** Specifies where to apply the code action in the form of a `DocumentSegment`. */\r\n actionSegment?: DocumentSegment\r\n /** Specifies where to apply the code action in the form of a `Range`. */\r\n actionRange?: Range\r\n}\r\n\r\n/**\r\n * Create DiagnosticData for a given diagnostic code. The result can be put into the `data` field of a DiagnosticInfo.\r\n */\r\nexport function diagnosticData(code: string): DiagnosticData {\r\n return { code };\r\n}\r\n\r\nexport type ValidationSeverity = 'error' | 'warning' | 'info' | 'hint';\r\n\r\nexport type ValidationAcceptor = (severity: ValidationSeverity, message: string, info: DiagnosticInfo) => void\r\n\r\nexport type ValidationCheck = (node: T, accept: ValidationAcceptor, cancelToken: CancellationToken) => MaybePromise;\r\n\r\n/**\r\n * A utility type for describing functions which will be called once before or after all the AstNodes of an AST/Langium document are validated.\r\n *\r\n * The AST is represented by its root AstNode.\r\n *\r\n * The given validation acceptor helps to report some early or lately detected issues.\r\n *\r\n * The 'categories' indicate, which validation categories are executed for all the AstNodes.\r\n * This helps to tailor the preparations/tear-down logic to the actually executed checks on the nodes.\r\n *\r\n * It is recommended to support interrupts during long-running logic with 'interruptAndCheck(cancelToken)'.\r\n */\r\nexport type ValidationPreparation = (rootNode: AstNode, accept: ValidationAcceptor, categories: ValidationCategory[], cancelToken: CancellationToken) => MaybePromise;\r\n\r\n/**\r\n * A utility type for associating non-primitive AST types to corresponding validation checks. For example:\r\n *\r\n * ```ts\r\n * const checks: ValidationChecks = {\r\n * State: validator.checkStateNameStartsWithCapital\r\n * };\r\n * ```\r\n *\r\n * If an AST type does not extend AstNode, e.g. if it describes a union of string literals, that type's name must not occur as a key in objects of type `ValidationCheck<...>`.\r\n *\r\n * @param T a type definition mapping language specific type names (keys) to the corresponding types (values)\r\n */\r\nexport type ValidationChecks = {\r\n [K in keyof T]?: T[K] extends AstNode ? ValidationCheck | Array> : never\r\n} & {\r\n AstNode?: ValidationCheck | Array>;\r\n}\r\n\r\n/**\r\n * `fast` checks can be executed after every document change (i.e. as the user is typing). If a check\r\n * is too slow it can delay the response to document changes, yielding bad user experience. By marking\r\n * it as `slow`, it will be skipped for normal as-you-type validation. Then it's up to you when to\r\n * schedule these long-running checks: after the fast checks are done, or after saving a document,\r\n * or with an explicit command, etc.\r\n *\r\n * `built-in` checks are errors produced by the lexer, the parser, or the linker. They cannot be used\r\n * for custom validation checks.\r\n */\r\nexport type ValidationCategory = 'fast' | 'slow' | 'built-in'\r\n\r\nexport namespace ValidationCategory {\r\n export const all: readonly ValidationCategory[] = ['fast', 'slow', 'built-in'];\r\n}\r\n\r\ntype ValidationCheckEntry = {\r\n check: ValidationCheck\r\n category: ValidationCategory\r\n}\r\n\r\n/**\r\n * Manages a set of `ValidationCheck`s to be applied when documents are validated.\r\n */\r\nexport class ValidationRegistry {\r\n private readonly entries = new MultiMap();\r\n private readonly reflection: AstReflection;\r\n\r\n private entriesBefore: ValidationPreparation[] = [];\r\n private entriesAfter: ValidationPreparation[] = [];\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.reflection = services.shared.AstReflection;\r\n }\r\n\r\n /**\r\n * Register a set of validation checks. Each value in the record can be either a single validation check (i.e. a function)\r\n * or an array of validation checks.\r\n *\r\n * @param checksRecord Set of validation checks to register.\r\n * @param category Optional category for the validation checks (defaults to `'fast'`).\r\n * @param thisObj Optional object to be used as `this` when calling the validation check functions.\r\n */\r\n register(checksRecord: ValidationChecks, thisObj: ThisParameterType = this, category: ValidationCategory = 'fast'): void {\r\n if (category === 'built-in') {\r\n throw new Error(\"The 'built-in' category is reserved for lexer, parser, and linker errors.\");\r\n }\r\n for (const [type, ch] of Object.entries(checksRecord)) {\r\n const callbacks = ch as ValidationCheck | ValidationCheck[];\r\n if (Array.isArray(callbacks)) {\r\n for (const check of callbacks) {\r\n const entry: ValidationCheckEntry = {\r\n check: this.wrapValidationException(check, thisObj),\r\n category\r\n };\r\n this.addEntry(type, entry);\r\n }\r\n } else if (typeof callbacks === 'function') {\r\n const entry: ValidationCheckEntry = {\r\n check: this.wrapValidationException(callbacks, thisObj),\r\n category\r\n };\r\n this.addEntry(type, entry);\r\n } else {\r\n assertUnreachable(callbacks);\r\n }\r\n }\r\n }\r\n\r\n protected wrapValidationException(check: ValidationCheck, thisObj: unknown): ValidationCheck {\r\n return async (node, accept, cancelToken) => {\r\n await this.handleException(() => check.call(thisObj, node, accept, cancelToken), 'An error occurred during validation', accept, node);\r\n };\r\n }\r\n\r\n protected async handleException(functionality: () => MaybePromise, messageContext: string, accept: ValidationAcceptor, node: AstNode): Promise {\r\n try {\r\n await functionality();\r\n } catch (err) {\r\n if (isOperationCancelled(err)) {\r\n throw err;\r\n }\r\n console.error(`${messageContext}:`, err);\r\n if (err instanceof Error && err.stack) {\r\n console.error(err.stack);\r\n }\r\n const messageDetails = err instanceof Error ? err.message : String(err);\r\n accept('error', `${messageContext}: ${messageDetails}`, { node });\r\n }\r\n }\r\n\r\n protected addEntry(type: string, entry: ValidationCheckEntry): void {\r\n if (type === 'AstNode') {\r\n this.entries.add('AstNode', entry);\r\n return;\r\n }\r\n for (const subtype of this.reflection.getAllSubTypes(type)) {\r\n this.entries.add(subtype, entry);\r\n }\r\n }\r\n\r\n getChecks(type: string, categories?: ValidationCategory[]): Stream {\r\n let checks = stream(this.entries.get(type))\r\n .concat(this.entries.get('AstNode'));\r\n if (categories) {\r\n checks = checks.filter(entry => categories.includes(entry.category));\r\n }\r\n return checks.map(entry => entry.check);\r\n }\r\n\r\n /**\r\n * Register logic which will be executed once before validating all the nodes of an AST/Langium document.\r\n * This helps to prepare or initialize some information which are required or reusable for the following checks on the AstNodes.\r\n *\r\n * As an example, for validating unique fully-qualified names of nodes in the AST,\r\n * here the map for mapping names to nodes could be established.\r\n * During the usual checks on the nodes, they are put into this map with their name.\r\n *\r\n * Note that this approach makes validations stateful, which is relevant e.g. when cancelling the validation.\r\n * Therefore it is recommended to clear stored information\r\n * _before_ validating an AST to validate each AST unaffected from other ASTs\r\n * AND _after_ validating the AST to free memory by information which are no longer used.\r\n *\r\n * @param checkBefore a set-up function which will be called once before actually validating an AST\r\n * @param thisObj Optional object to be used as `this` when calling the validation check functions.\r\n */\r\n registerBeforeDocument(checkBefore: ValidationPreparation, thisObj: ThisParameterType = this): void {\r\n this.entriesBefore.push(this.wrapPreparationException(checkBefore, 'An error occurred during set-up of the validation', thisObj));\r\n }\r\n\r\n /**\r\n * Register logic which will be executed once after validating all the nodes of an AST/Langium document.\r\n * This helps to finally evaluate information which are collected during the checks on the AstNodes.\r\n *\r\n * As an example, for validating unique fully-qualified names of nodes in the AST,\r\n * here the map with all the collected nodes and their names is checked\r\n * and validation hints are created for all nodes with the same name.\r\n *\r\n * Note that this approach makes validations stateful, which is relevant e.g. when cancelling the validation.\r\n * Therefore it is recommended to clear stored information\r\n * _before_ validating an AST to validate each AST unaffected from other ASTs\r\n * AND _after_ validating the AST to free memory by information which are no longer used.\r\n *\r\n * @param checkBefore a set-up function which will be called once before actually validating an AST\r\n * @param thisObj Optional object to be used as `this` when calling the validation check functions.\r\n */\r\n registerAfterDocument(checkAfter: ValidationPreparation, thisObj: ThisParameterType = this): void {\r\n this.entriesAfter.push(this.wrapPreparationException(checkAfter, 'An error occurred during tear-down of the validation', thisObj));\r\n }\r\n\r\n protected wrapPreparationException(check: ValidationPreparation, messageContext: string, thisObj: unknown): ValidationPreparation {\r\n return async (rootNode, accept, categories, cancelToken) => {\r\n await this.handleException(() => check.call(thisObj, rootNode, accept, categories, cancelToken), messageContext, accept, rootNode);\r\n };\r\n }\r\n\r\n get checksBefore(): ValidationPreparation[] {\r\n return this.entriesBefore;\r\n }\r\n\r\n get checksAfter(): ValidationPreparation[] {\r\n return this.entriesAfter;\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { MismatchedTokenException } from 'chevrotain';\r\nimport type { DiagnosticSeverity, Position, Range, Diagnostic } from 'vscode-languageserver-types';\r\nimport type { LanguageMetaData } from '../languages/language-meta-data.js';\r\nimport type { ParseResult } from '../parser/langium-parser.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, CstNode } from '../syntax-tree.js';\r\nimport type { LangiumDocument } from '../workspace/documents.js';\r\nimport type { DiagnosticData, DiagnosticInfo, ValidationAcceptor, ValidationCategory, ValidationRegistry, ValidationSeverity } from './validation-registry.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { findNodeForKeyword, findNodeForProperty } from '../utils/grammar-utils.js';\r\nimport { streamAst } from '../utils/ast-utils.js';\r\nimport { tokenToRange } from '../utils/cst-utils.js';\r\nimport { interruptAndCheck, isOperationCancelled } from '../utils/promise-utils.js';\r\nimport { diagnosticData } from './validation-registry.js';\r\nimport type { LexingDiagnostic, LexingDiagnosticSeverity } from '../parser/token-builder.js';\r\n\r\nexport interface ValidationOptions {\r\n /**\r\n * If this is set, only the checks associated with these categories are executed; otherwise\r\n * all checks are executed. The default category if not specified to the registry is `'fast'`.\r\n */\r\n categories?: ValidationCategory[];\r\n /** If true, no further diagnostics are reported if there are lexing errors. */\r\n stopAfterLexingErrors?: boolean\r\n /** If true, no further diagnostics are reported if there are parsing errors. */\r\n stopAfterParsingErrors?: boolean\r\n /** If true, no further diagnostics are reported if there are linking errors. */\r\n stopAfterLinkingErrors?: boolean\r\n}\r\n\r\n/**\r\n * Language-specific service for validating `LangiumDocument`s.\r\n */\r\nexport interface DocumentValidator {\r\n /**\r\n * Validates the whole specified document.\r\n *\r\n * @param document specified document to validate\r\n * @param options options to control the validation process\r\n * @param cancelToken allows to cancel the current operation\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n validateDocument(document: LangiumDocument, options?: ValidationOptions, cancelToken?: CancellationToken): Promise;\r\n}\r\n\r\nexport class DefaultDocumentValidator implements DocumentValidator {\r\n\r\n protected readonly validationRegistry: ValidationRegistry;\r\n protected readonly metadata: LanguageMetaData;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.validationRegistry = services.validation.ValidationRegistry;\r\n this.metadata = services.LanguageMetaData;\r\n }\r\n\r\n async validateDocument(document: LangiumDocument, options: ValidationOptions = {}, cancelToken = CancellationToken.None): Promise {\r\n const parseResult = document.parseResult;\r\n const diagnostics: Diagnostic[] = [];\r\n\r\n await interruptAndCheck(cancelToken);\r\n\r\n if (!options.categories || options.categories.includes('built-in')) {\r\n this.processLexingErrors(parseResult, diagnostics, options);\r\n if (options.stopAfterLexingErrors && diagnostics.some(d => d.data?.code === DocumentValidator.LexingError)) {\r\n return diagnostics;\r\n }\r\n\r\n this.processParsingErrors(parseResult, diagnostics, options);\r\n if (options.stopAfterParsingErrors && diagnostics.some(d => d.data?.code === DocumentValidator.ParsingError)) {\r\n return diagnostics;\r\n }\r\n\r\n this.processLinkingErrors(document, diagnostics, options);\r\n if (options.stopAfterLinkingErrors && diagnostics.some(d => d.data?.code === DocumentValidator.LinkingError)) {\r\n return diagnostics;\r\n }\r\n }\r\n\r\n // Process custom validations\r\n try {\r\n diagnostics.push(...await this.validateAst(parseResult.value, options, cancelToken));\r\n } catch (err) {\r\n if (isOperationCancelled(err)) {\r\n throw err;\r\n }\r\n console.error('An error occurred during validation:', err);\r\n }\r\n\r\n await interruptAndCheck(cancelToken);\r\n\r\n return diagnostics;\r\n }\r\n\r\n protected processLexingErrors(parseResult: ParseResult, diagnostics: Diagnostic[], _options: ValidationOptions): void {\r\n const lexerDiagnostics = [...parseResult.lexerErrors, ...parseResult.lexerReport?.diagnostics ?? []] as LexingDiagnostic[];\r\n for (const lexerDiagnostic of lexerDiagnostics) {\r\n const severity = lexerDiagnostic.severity ?? 'error';\r\n const diagnostic: Diagnostic = {\r\n severity: toDiagnosticSeverity(severity),\r\n range: {\r\n start: {\r\n line: lexerDiagnostic.line! - 1,\r\n character: lexerDiagnostic.column! - 1\r\n },\r\n end: {\r\n line: lexerDiagnostic.line! - 1,\r\n character: lexerDiagnostic.column! + lexerDiagnostic.length - 1\r\n }\r\n },\r\n message: lexerDiagnostic.message,\r\n data: toDiagnosticData(severity),\r\n source: this.getSource()\r\n };\r\n diagnostics.push(diagnostic);\r\n }\r\n }\r\n\r\n protected processParsingErrors(parseResult: ParseResult, diagnostics: Diagnostic[], _options: ValidationOptions): void {\r\n for (const parserError of parseResult.parserErrors) {\r\n let range: Range | undefined = undefined;\r\n // We can run into the chevrotain error recovery here\r\n // The token contained in the parser error might be automatically inserted\r\n // In this case every position value will be `NaN`\r\n if (isNaN(parserError.token.startOffset)) {\r\n // Some special parser error types contain a `previousToken`\r\n // We can simply append our diagnostic to that token\r\n if ('previousToken' in parserError) {\r\n const token = (parserError as MismatchedTokenException).previousToken;\r\n if (!isNaN(token.startOffset)) {\r\n const position: Position = { line: token.endLine! - 1, character: token.endColumn! };\r\n range = { start: position, end: position};\r\n } else {\r\n // No valid prev token. Might be empty document or containing only hidden tokens.\r\n // Point to document start\r\n const position: Position = { line: 0, character: 0 };\r\n range = { start: position, end: position};\r\n }\r\n }\r\n } else {\r\n range = tokenToRange(parserError.token);\r\n }\r\n if (range) {\r\n const diagnostic: Diagnostic = {\r\n severity: toDiagnosticSeverity('error'),\r\n range,\r\n message: parserError.message,\r\n data: diagnosticData(DocumentValidator.ParsingError),\r\n source: this.getSource()\r\n };\r\n diagnostics.push(diagnostic);\r\n }\r\n }\r\n }\r\n\r\n protected processLinkingErrors(document: LangiumDocument, diagnostics: Diagnostic[], _options: ValidationOptions): void {\r\n for (const reference of document.references) {\r\n const linkingError = reference.error;\r\n if (linkingError) {\r\n const info: DiagnosticInfo = {\r\n node: linkingError.container,\r\n property: linkingError.property,\r\n index: linkingError.index,\r\n data: {\r\n code: DocumentValidator.LinkingError,\r\n containerType: linkingError.container.$type,\r\n property: linkingError.property,\r\n refText: linkingError.reference.$refText\r\n } satisfies LinkingErrorData\r\n };\r\n diagnostics.push(this.toDiagnostic('error', linkingError.message, info));\r\n }\r\n }\r\n }\r\n\r\n protected async validateAst(rootNode: AstNode, options: ValidationOptions, cancelToken = CancellationToken.None): Promise {\r\n const validationItems: Diagnostic[] = [];\r\n const acceptor: ValidationAcceptor = (severity: ValidationSeverity, message: string, info: DiagnosticInfo) => {\r\n validationItems.push(this.toDiagnostic(severity, message, info));\r\n };\r\n\r\n await this.validateAstBefore(rootNode, options, acceptor, cancelToken);\r\n await this.validateAstNodes(rootNode, options, acceptor, cancelToken);\r\n await this.validateAstAfter(rootNode, options, acceptor, cancelToken);\r\n\r\n return validationItems;\r\n }\r\n\r\n protected async validateAstBefore(rootNode: AstNode, options: ValidationOptions, acceptor: ValidationAcceptor, cancelToken = CancellationToken.None): Promise {\r\n const checksBefore = this.validationRegistry.checksBefore;\r\n for (const checkBefore of checksBefore) {\r\n await interruptAndCheck(cancelToken);\r\n await checkBefore(rootNode, acceptor, options.categories ?? [], cancelToken);\r\n }\r\n }\r\n\r\n protected async validateAstNodes(rootNode: AstNode, options: ValidationOptions, acceptor: ValidationAcceptor, cancelToken = CancellationToken.None): Promise {\r\n await Promise.all(streamAst(rootNode).map(async node => {\r\n await interruptAndCheck(cancelToken);\r\n const checks = this.validationRegistry.getChecks(node.$type, options.categories);\r\n for (const check of checks) {\r\n await check(node, acceptor, cancelToken);\r\n }\r\n }));\r\n }\r\n\r\n protected async validateAstAfter(rootNode: AstNode, options: ValidationOptions, acceptor: ValidationAcceptor, cancelToken = CancellationToken.None): Promise {\r\n const checksAfter = this.validationRegistry.checksAfter;\r\n for (const checkAfter of checksAfter) {\r\n await interruptAndCheck(cancelToken);\r\n await checkAfter(rootNode, acceptor, options.categories ?? [], cancelToken);\r\n }\r\n }\r\n\r\n protected toDiagnostic(severity: ValidationSeverity, message: string, info: DiagnosticInfo): Diagnostic {\r\n return {\r\n message,\r\n range: getDiagnosticRange(info),\r\n severity: toDiagnosticSeverity(severity),\r\n code: info.code,\r\n codeDescription: info.codeDescription,\r\n tags: info.tags,\r\n relatedInformation: info.relatedInformation,\r\n data: info.data,\r\n source: this.getSource()\r\n };\r\n }\r\n\r\n protected getSource(): string | undefined {\r\n return this.metadata.languageId;\r\n }\r\n}\r\n\r\nexport function getDiagnosticRange(info: DiagnosticInfo): Range {\r\n if (info.range) {\r\n return info.range;\r\n }\r\n let cstNode: CstNode | undefined;\r\n if (typeof info.property === 'string') {\r\n cstNode = findNodeForProperty(info.node.$cstNode, info.property, info.index);\r\n } else if (typeof info.keyword === 'string') {\r\n cstNode = findNodeForKeyword(info.node.$cstNode, info.keyword, info.index);\r\n }\r\n cstNode ??= info.node.$cstNode;\r\n if (!cstNode) {\r\n return {\r\n start: { line: 0, character: 0 },\r\n end: { line: 0, character: 0 }\r\n };\r\n }\r\n return cstNode.range;\r\n}\r\n\r\n/**\r\n * Transforms the diagnostic severity from the {@link LexingDiagnosticSeverity} format to LSP's `DiagnosticSeverity` format.\r\n *\r\n * @param severity The lexing diagnostic severity\r\n * @returns Diagnostic severity according to `vscode-languageserver-types/lib/esm/main.js#DiagnosticSeverity`\r\n */\r\nexport function toDiagnosticSeverity(severity: LexingDiagnosticSeverity): DiagnosticSeverity {\r\n switch (severity) {\r\n case 'error':\r\n return 1 satisfies typeof DiagnosticSeverity.Error;\r\n case 'warning':\r\n return 2 satisfies typeof DiagnosticSeverity.Warning;\r\n case 'info':\r\n return 3 satisfies typeof DiagnosticSeverity.Information;\r\n case 'hint':\r\n return 4 satisfies typeof DiagnosticSeverity.Hint;\r\n default:\r\n throw new Error('Invalid diagnostic severity: ' + severity);\r\n }\r\n}\r\n\r\nexport function toDiagnosticData(severity: LexingDiagnosticSeverity): DiagnosticData {\r\n switch (severity) {\r\n case 'error':\r\n return diagnosticData(DocumentValidator.LexingError);\r\n case 'warning':\r\n return diagnosticData(DocumentValidator.LexingWarning);\r\n case 'info':\r\n return diagnosticData(DocumentValidator.LexingInfo);\r\n case 'hint':\r\n return diagnosticData(DocumentValidator.LexingHint);\r\n default:\r\n throw new Error('Invalid diagnostic severity: ' + severity);\r\n }\r\n}\r\n\r\nexport namespace DocumentValidator {\r\n export const LexingError = 'lexing-error';\r\n export const LexingWarning = 'lexing-warning';\r\n export const LexingInfo = 'lexing-info';\r\n export const LexingHint = 'lexing-hint';\r\n export const ParsingError = 'parsing-error';\r\n export const LinkingError = 'linking-error';\r\n}\r\n\r\nexport interface LinkingErrorData extends DiagnosticData {\r\n containerType: string\r\n property: string\r\n refText: string\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { URI } from '../utils/uri-utils.js';\r\nimport type { NameProvider } from '../references/name-provider.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription, ReferenceInfo } from '../syntax-tree.js';\r\nimport type { AstNodeLocator } from './ast-node-locator.js';\r\nimport type { DocumentSegment, LangiumDocument } from './documents.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { isLinkingError } from '../syntax-tree.js';\r\nimport { getDocument, streamAst, streamReferences } from '../utils/ast-utils.js';\r\nimport { toDocumentSegment } from '../utils/cst-utils.js';\r\nimport { interruptAndCheck } from '../utils/promise-utils.js';\r\nimport { UriUtils } from '../utils/uri-utils.js';\r\n\r\n/**\r\n * Language-specific service for creating descriptions of AST nodes to be used for cross-reference resolutions.\r\n */\r\nexport interface AstNodeDescriptionProvider {\r\n\r\n /**\r\n * Create a description for the given AST node. This service method is typically used while indexing\r\n * the contents of a document and during scope computation.\r\n *\r\n * @param node An AST node.\r\n * @param name The name to be used to refer to the AST node. By default, this is determined by the\r\n * `NameProvider` service, but alternative names may be provided according to the semantics\r\n * of your language.\r\n * @param document The document containing the AST node. If omitted, it is taken from the root AST node.\r\n */\r\n createDescription(node: AstNode, name: string | undefined, document?: LangiumDocument): AstNodeDescription;\r\n\r\n}\r\n\r\nexport class DefaultAstNodeDescriptionProvider implements AstNodeDescriptionProvider {\r\n\r\n protected readonly astNodeLocator: AstNodeLocator;\r\n protected readonly nameProvider: NameProvider;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.astNodeLocator = services.workspace.AstNodeLocator;\r\n this.nameProvider = services.references.NameProvider;\r\n }\r\n\r\n createDescription(node: AstNode, name: string | undefined, document?: LangiumDocument): AstNodeDescription {\r\n const doc = document ?? getDocument(node);\r\n name ??= this.nameProvider.getName(node);\r\n const path = this.astNodeLocator.getAstNodePath(node);\r\n if (!name) {\r\n throw new Error(`Node at path ${path} has no name.`);\r\n }\r\n let nameNodeSegment: DocumentSegment | undefined;\r\n const nameSegmentGetter = () => nameNodeSegment ??= toDocumentSegment(this.nameProvider.getNameNode(node) ?? node.$cstNode);\r\n return {\r\n node,\r\n name,\r\n get nameSegment() {\r\n return nameSegmentGetter();\r\n },\r\n selectionSegment: toDocumentSegment(node.$cstNode),\r\n type: node.$type,\r\n documentUri: doc.uri,\r\n path\r\n };\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Describes a cross-reference within a document or between two documents.\r\n */\r\nexport interface ReferenceDescription {\r\n /** URI of the document that holds a reference */\r\n sourceUri: URI\r\n /** Path to AstNode that holds a reference */\r\n sourcePath: string\r\n /** Target document uri */\r\n targetUri: URI\r\n /** Path to the target AstNode inside the document */\r\n targetPath: string\r\n /** Segment of the reference text. */\r\n segment: DocumentSegment\r\n /** Marks a local reference i.e. a cross reference inside a document. */\r\n local?: boolean\r\n}\r\n\r\n/**\r\n * Language-specific service to create descriptions of all cross-references in a document. These are used by the `IndexManager`\r\n * to determine which documents are affected and should be rebuilt when a document is changed.\r\n */\r\nexport interface ReferenceDescriptionProvider {\r\n /**\r\n * Create descriptions of all cross-references found in the given document. These descriptions are\r\n * gathered by the `IndexManager` and stored in the global index so they can be considered when\r\n * a document change is reported by the client.\r\n *\r\n * @param document The document in which to gather cross-references.\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n createDescriptions(document: LangiumDocument, cancelToken?: CancellationToken): Promise;\r\n}\r\n\r\nexport class DefaultReferenceDescriptionProvider implements ReferenceDescriptionProvider {\r\n\r\n protected readonly nodeLocator: AstNodeLocator;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.nodeLocator = services.workspace.AstNodeLocator;\r\n }\r\n\r\n async createDescriptions(document: LangiumDocument, cancelToken = CancellationToken.None): Promise {\r\n const descr: ReferenceDescription[] = [];\r\n const rootNode = document.parseResult.value;\r\n for (const astNode of streamAst(rootNode)) {\r\n await interruptAndCheck(cancelToken);\r\n streamReferences(astNode).filter(refInfo => !isLinkingError(refInfo)).forEach(refInfo => {\r\n // TODO: Consider logging a warning or throw an exception when DocumentState is < than Linked\r\n const description = this.createDescription(refInfo);\r\n if (description) {\r\n descr.push(description);\r\n }\r\n });\r\n }\r\n return descr;\r\n }\r\n\r\n protected createDescription(refInfo: ReferenceInfo): ReferenceDescription | undefined {\r\n const targetNodeDescr = refInfo.reference.$nodeDescription;\r\n const refCstNode = refInfo.reference.$refNode;\r\n if (!targetNodeDescr || !refCstNode) {\r\n return undefined;\r\n }\r\n const docUri = getDocument(refInfo.container).uri;\r\n return {\r\n sourceUri: docUri,\r\n sourcePath: this.nodeLocator.getAstNodePath(refInfo.container),\r\n targetUri: targetNodeDescr.documentUri,\r\n targetPath: targetNodeDescr.path,\r\n segment: toDocumentSegment(refCstNode),\r\n local: UriUtils.equals(targetNodeDescr.documentUri, docUri)\r\n };\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { AstNode } from '../syntax-tree.js';\r\n\r\n/**\r\n * Language-specific service for locating an `AstNode` in a document.\r\n */\r\nexport interface AstNodeLocator {\r\n\r\n /**\r\n * Creates a path represented by a `string` that identifies an `AstNode` inside its document.\r\n * It must be possible to retrieve exactly the same `AstNode` from the document using this path.\r\n *\r\n * @param node The `AstNode` for which to create the path.\r\n * @returns a path represented by a `string` that identifies `node` inside its document.\r\n * @see AstNodeLocator.getAstNode\r\n */\r\n getAstNodePath(node: AstNode): string;\r\n\r\n /**\r\n * Locates an `AstNode` inside another node by following the given path.\r\n *\r\n * @param node Parent element.\r\n * @param path Describes how to locate the `AstNode` inside the given `node`.\r\n * @returns The `AstNode` located under the given path, or `undefined` if the path cannot be resolved.\r\n * @see AstNodeLocator.getAstNodePath\r\n */\r\n getAstNode(node: AstNode, path: string): T | undefined;\r\n\r\n}\r\n\r\nexport class DefaultAstNodeLocator implements AstNodeLocator {\r\n protected segmentSeparator = '/';\r\n protected indexSeparator = '@';\r\n\r\n getAstNodePath(node: AstNode): string {\r\n if (node.$container) {\r\n const containerPath = this.getAstNodePath(node.$container);\r\n const newSegment = this.getPathSegment(node);\r\n const nodePath = containerPath + this.segmentSeparator + newSegment;\r\n return nodePath;\r\n }\r\n return '';\r\n }\r\n\r\n protected getPathSegment({ $containerProperty, $containerIndex }: AstNode): string {\r\n if (!$containerProperty) {\r\n throw new Error(\"Missing '$containerProperty' in AST node.\");\r\n }\r\n if ($containerIndex !== undefined) {\r\n return $containerProperty + this.indexSeparator + $containerIndex;\r\n }\r\n return $containerProperty;\r\n }\r\n\r\n getAstNode(node: AstNode, path: string): T | undefined {\r\n const segments = path.split(this.segmentSeparator);\r\n return segments.reduce((previousValue, currentValue) => {\r\n if (!previousValue || currentValue.length === 0) {\r\n return previousValue;\r\n }\r\n const propertyIndex = currentValue.indexOf(this.indexSeparator);\r\n if (propertyIndex > 0) {\r\n const property = currentValue.substring(0, propertyIndex);\r\n const arrayIndex = parseInt(currentValue.substring(propertyIndex + 1));\r\n const array = (previousValue as unknown as Record)[property];\r\n return array?.[arrayIndex];\r\n }\r\n return (previousValue as unknown as Record)[currentValue];\r\n }, node) as T;\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2024 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n// eslint-disable-next-line no-restricted-imports\r\nexport * from 'vscode-jsonrpc/lib/common/events.js';\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { Emitter } from '../utils/event.js';\r\nimport type {\r\n ConfigurationItem,\r\n DidChangeConfigurationParams,\r\n DidChangeConfigurationRegistrationOptions,\r\n Disposable,\r\n Event,\r\n InitializeParams,\r\n InitializedParams\r\n} from 'vscode-languageserver-protocol';\r\nimport type { ServiceRegistry } from '../service-registry.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport { Deferred } from '../utils/promise-utils.js';\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nexport interface ConfigurationProvider {\r\n\r\n /**\r\n * A promise that resolves when the configuration provider is ready to be used.\r\n */\r\n readonly ready: Promise;\r\n\r\n /**\r\n * When used in a language server context, this method is called when the server receives\r\n * the `initialize` request.\r\n */\r\n initialize(params: InitializeParams): void;\r\n\r\n /**\r\n * When used in a language server context, this method is called when the server receives\r\n * the `initialized` notification.\r\n */\r\n initialized(params: ConfigurationInitializedParams): Promise;\r\n\r\n /**\r\n * Returns a configuration value stored for the given language.\r\n *\r\n * @param language The language id\r\n * @param configuration Configuration name\r\n */\r\n getConfiguration(language: string, configuration: string): Promise;\r\n\r\n /**\r\n * Updates the cached configurations using the `change` notification parameters.\r\n *\r\n * @param change The parameters of a change configuration notification.\r\n * `settings` property of the change object could be expressed as `Record>`\r\n */\r\n updateConfiguration(change: DidChangeConfigurationParams): void;\r\n\r\n /**\r\n * Get notified after a configuration section has been updated.\r\n */\r\n onConfigurationSectionUpdate(callback: ConfigurationSectionUpdateListener): Disposable\r\n}\r\n\r\nexport interface ConfigurationInitializedParams extends InitializedParams {\r\n register?: (params: DidChangeConfigurationRegistrationOptions) => void,\r\n fetchConfiguration?: (configuration: ConfigurationItem[]) => Promise\r\n}\r\n\r\nexport interface ConfigurationSectionUpdate {\r\n /**\r\n * The name of the configuration section that has been updated.\r\n */\r\n section: string;\r\n\r\n /**\r\n * The updated configuration section.\r\n */\r\n configuration: any;\r\n}\r\n\r\nexport type ConfigurationSectionUpdateListener = (update: ConfigurationSectionUpdate) => void;\r\n\r\n/**\r\n * Base configuration provider for building up other configuration providers\r\n */\r\nexport class DefaultConfigurationProvider implements ConfigurationProvider {\r\n\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n protected readonly _ready = new Deferred();\r\n protected settings: Record> = {};\r\n protected workspaceConfig = false;\r\n protected onConfigurationSectionUpdateEmitter = new Emitter();\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.serviceRegistry = services.ServiceRegistry;\r\n }\r\n\r\n get ready(): Promise {\r\n return this._ready.promise;\r\n }\r\n\r\n initialize(params: InitializeParams): void {\r\n this.workspaceConfig = params.capabilities.workspace?.configuration ?? false;\r\n }\r\n\r\n async initialized(params: ConfigurationInitializedParams): Promise {\r\n if (this.workspaceConfig) {\r\n if (params.register) {\r\n // params.register(...) is a function to be provided by the calling language server for the sake of\r\n // decoupling this implementation from the concrete LSP implementations, specifically the LSP Connection\r\n\r\n const languages = this.serviceRegistry.all;\r\n params.register({\r\n // Listen to configuration changes for all languages\r\n section: languages.map(lang => this.toSectionName(lang.LanguageMetaData.languageId))\r\n });\r\n }\r\n\r\n if (params.fetchConfiguration) {\r\n // params.fetchConfiguration(...) is a function to be provided by the calling language server for the sake of\r\n // decoupling this implementation from the concrete LSP implementations, specifically the LSP Connection\r\n const configToUpdate = this.serviceRegistry.all.map(lang => {\r\n // Fetch the configuration changes for all languages\r\n section: this.toSectionName(lang.LanguageMetaData.languageId)\r\n });\r\n\r\n // get workspace configurations (default scope URI)\r\n const configs = await params.fetchConfiguration(configToUpdate);\r\n configToUpdate.forEach((conf, idx) => {\r\n this.updateSectionConfiguration(conf.section!, configs[idx]);\r\n });\r\n }\r\n }\r\n this._ready.resolve();\r\n }\r\n\r\n /**\r\n * Updates the cached configurations using the `change` notification parameters.\r\n *\r\n * @param change The parameters of a change configuration notification.\r\n * `settings` property of the change object could be expressed as `Record>`\r\n */\r\n updateConfiguration(change: DidChangeConfigurationParams): void {\r\n if (!change.settings) {\r\n return;\r\n }\r\n Object.keys(change.settings).forEach(section => {\r\n const configuration = change.settings[section];\r\n this.updateSectionConfiguration(section, configuration);\r\n this.onConfigurationSectionUpdateEmitter.fire({ section, configuration });\r\n });\r\n }\r\n\r\n protected updateSectionConfiguration(section: string, configuration: any): void {\r\n this.settings[section] = configuration;\r\n }\r\n\r\n /**\r\n * Returns a configuration value stored for the given language.\r\n *\r\n * @param language The language id\r\n * @param configuration Configuration name\r\n */\r\n async getConfiguration(language: string, configuration: string): Promise {\r\n await this.ready;\r\n\r\n const sectionName = this.toSectionName(language);\r\n if (this.settings[sectionName]) {\r\n return this.settings[sectionName][configuration];\r\n }\r\n }\r\n\r\n protected toSectionName(languageId: string): string {\r\n return `${languageId}`;\r\n }\r\n\r\n get onConfigurationSectionUpdate(): Event {\r\n return this.onConfigurationSectionUpdateEmitter.event;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nexport interface Disposable {\r\n /**\r\n * Dispose this object.\r\n */\r\n dispose(): void;\r\n}\r\n\r\nexport interface AsyncDisposable {\r\n /**\r\n * Dispose this object.\r\n */\r\n dispose(): Promise;\r\n}\r\n\r\nexport namespace Disposable {\r\n export function create(callback: () => Promise): AsyncDisposable;\r\n export function create(callback: () => void): Disposable;\r\n export function create(callback: () => void | Promise): Disposable | AsyncDisposable {\r\n return {\r\n dispose: async () => await callback()\r\n };\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { Disposable } from '../utils/disposable.js';\r\nimport type { ServiceRegistry } from '../service-registry.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport type { AstNode } from '../syntax-tree.js';\r\nimport type { MaybePromise } from '../utils/promise-utils.js';\r\nimport type { Deferred } from '../utils/promise-utils.js';\r\nimport type { ValidationOptions } from '../validation/document-validator.js';\r\nimport type { IndexManager } from '../workspace/index-manager.js';\r\nimport type { LangiumDocument, LangiumDocuments, LangiumDocumentFactory, TextDocumentProvider } from './documents.js';\r\nimport { MultiMap } from '../utils/collections.js';\r\nimport { OperationCancelled, interruptAndCheck, isOperationCancelled } from '../utils/promise-utils.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport type { URI } from '../utils/uri-utils.js';\r\nimport { ValidationCategory } from '../validation/validation-registry.js';\r\nimport { DocumentState } from './documents.js';\r\n\r\nexport interface BuildOptions {\r\n /**\r\n * Control the validation phase with this option:\r\n * - `true` enables all validation checks and forces revalidating the documents\r\n * - `false` or `undefined` disables all validation checks\r\n * - An object runs only the necessary validation checks; the `categories` property restricts this to a specific subset\r\n */\r\n validation?: boolean | ValidationOptions\r\n}\r\n\r\nexport interface DocumentBuildState {\r\n /** Whether a document has completed its last build process. */\r\n completed: boolean\r\n /** The options used for the last build process. */\r\n options: BuildOptions\r\n /** Additional information about the last build result. */\r\n result?: {\r\n validationChecks?: ValidationCategory[]\r\n }\r\n}\r\n\r\n/**\r\n * Shared-service for building and updating `LangiumDocument`s.\r\n */\r\nexport interface DocumentBuilder {\r\n\r\n /** The options used for rebuilding documents after an update. */\r\n updateBuildOptions: BuildOptions;\r\n\r\n /**\r\n * Execute all necessary build steps for the given documents.\r\n *\r\n * @param documents Set of documents to be built.\r\n * @param options Options for the document builder.\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n build(documents: Array>, options?: BuildOptions, cancelToken?: CancellationToken): Promise;\r\n\r\n /**\r\n * This method is called when a document change is detected. It updates the state of all\r\n * affected documents, including those with references to the changed ones, so they are rebuilt.\r\n *\r\n * @param changed URIs of changed or created documents\r\n * @param deleted URIs of deleted documents\r\n * @param cancelToken allows to cancel the current operation\r\n * @throws `OperationCancelled` if cancellation is detected during execution\r\n */\r\n update(changed: URI[], deleted: URI[], cancelToken?: CancellationToken): Promise;\r\n\r\n /**\r\n * Notify the given callback when a document update was triggered, but before any document\r\n * is rebuilt. Listeners to this event should not perform any long-running task.\r\n */\r\n onUpdate(callback: DocumentUpdateListener): Disposable;\r\n\r\n /**\r\n * Notify the given callback when a set of documents has been built reaching the specified target state.\r\n */\r\n onBuildPhase(targetState: DocumentState, callback: DocumentBuildListener): Disposable;\r\n\r\n /**\r\n * Notify the specified callback when a document has been built reaching the specified target state.\r\n * Unlike {@link onBuildPhase} the listener is called for every single document.\r\n *\r\n * There are two main advantages compared to {@link onBuildPhase}:\r\n * 1. If the build is cancelled, {@link onDocumentPhase} will still fire for documents that have reached a specific state.\r\n * Meanwhile, {@link onBuildPhase} won't fire for that state.\r\n * 2. The {@link DocumentBuilder} ensures that all {@link DocumentPhaseListener} instances are called for a built document.\r\n * Even if the build is cancelled before those listeners were called.\r\n */\r\n onDocumentPhase(targetState: DocumentState, callback: DocumentPhaseListener): Disposable;\r\n\r\n /**\r\n * Wait until the workspace has reached the specified state for all documents.\r\n *\r\n * @param state The desired state. The promise won't resolve until all documents have reached this state\r\n * @param cancelToken Optionally allows to cancel the wait operation, disposing any listeners in the process\r\n * @throws `OperationCancelled` if cancellation has been requested before the state has been reached\r\n */\r\n waitUntil(state: DocumentState, cancelToken?: CancellationToken): Promise;\r\n\r\n /**\r\n * Wait until the document specified by the {@link uri} has reached the specified state.\r\n *\r\n * @param state The desired state. The promise won't resolve until the document has reached this state.\r\n * @param uri The specified URI that points to the document. If the URI does not exist, the promise will resolve once the workspace has reached the specified state.\r\n * @param cancelToken Optionally allows to cancel the wait operation, disposing any listeners in the process.\r\n * @return The URI of the document that has reached the desired state, or `undefined` if the document does not exist.\r\n * @throws `OperationCancelled` if cancellation has been requested before the state has been reached\r\n */\r\n waitUntil(state: DocumentState, uri?: URI, cancelToken?: CancellationToken): Promise;\r\n}\r\n\r\nexport type DocumentUpdateListener = (changed: URI[], deleted: URI[]) => void | Promise\r\nexport type DocumentBuildListener = (built: LangiumDocument[], cancelToken: CancellationToken) => void | Promise\r\nexport type DocumentPhaseListener = (built: LangiumDocument, cancelToken: CancellationToken) => void | Promise\r\nexport class DefaultDocumentBuilder implements DocumentBuilder {\r\n\r\n updateBuildOptions: BuildOptions = {\r\n // Default: run only the built-in validation checks and those in the _fast_ category (includes those without category)\r\n validation: {\r\n categories: ['built-in', 'fast']\r\n }\r\n };\r\n\r\n protected readonly langiumDocuments: LangiumDocuments;\r\n protected readonly langiumDocumentFactory: LangiumDocumentFactory;\r\n protected readonly textDocuments: TextDocumentProvider | undefined;\r\n protected readonly indexManager: IndexManager;\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n protected readonly updateListeners: DocumentUpdateListener[] = [];\r\n protected readonly buildPhaseListeners = new MultiMap();\r\n protected readonly documentPhaseListeners = new MultiMap();\r\n protected readonly buildState = new Map();\r\n protected readonly documentBuildWaiters = new Map>();\r\n protected currentState = DocumentState.Changed;\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.langiumDocuments = services.workspace.LangiumDocuments;\r\n this.langiumDocumentFactory = services.workspace.LangiumDocumentFactory;\r\n this.textDocuments = services.workspace.TextDocuments;\r\n this.indexManager = services.workspace.IndexManager;\r\n this.serviceRegistry = services.ServiceRegistry;\r\n }\r\n\r\n async build(documents: Array>, options: BuildOptions = {}, cancelToken = CancellationToken.None): Promise {\r\n for (const document of documents) {\r\n const key = document.uri.toString();\r\n if (document.state === DocumentState.Validated) {\r\n if (typeof options.validation === 'boolean' && options.validation) {\r\n // Force re-running all validation checks\r\n document.state = DocumentState.IndexedReferences;\r\n document.diagnostics = undefined;\r\n this.buildState.delete(key);\r\n } else if (typeof options.validation === 'object') {\r\n const buildState = this.buildState.get(key);\r\n const previousCategories = buildState?.result?.validationChecks;\r\n if (previousCategories) {\r\n // Validation with explicit options was requested for a document that has already been partly validated.\r\n // In this case, we need to merge the previous validation categories with the new ones.\r\n const newCategories = options.validation.categories ?? ValidationCategory.all as ValidationCategory[];\r\n const categories = newCategories.filter(c => !previousCategories.includes(c));\r\n if (categories.length > 0) {\r\n this.buildState.set(key, {\r\n completed: false,\r\n options: {\r\n validation: {\r\n ...options.validation,\r\n categories\r\n }\r\n },\r\n result: buildState.result\r\n });\r\n document.state = DocumentState.IndexedReferences;\r\n }\r\n }\r\n }\r\n } else {\r\n // Default: forget any previous build options\r\n this.buildState.delete(key);\r\n }\r\n }\r\n this.currentState = DocumentState.Changed;\r\n await this.emitUpdate(documents.map(e => e.uri), []);\r\n await this.buildDocuments(documents, options, cancelToken);\r\n }\r\n\r\n async update(changed: URI[], deleted: URI[], cancelToken = CancellationToken.None): Promise {\r\n this.currentState = DocumentState.Changed;\r\n // Remove all metadata of documents that are reported as deleted\r\n for (const deletedUri of deleted) {\r\n this.langiumDocuments.deleteDocument(deletedUri);\r\n this.buildState.delete(deletedUri.toString());\r\n this.indexManager.remove(deletedUri);\r\n }\r\n // Set the state of all changed documents to `Changed` so they are completely rebuilt\r\n for (const changedUri of changed) {\r\n const invalidated = this.langiumDocuments.invalidateDocument(changedUri);\r\n if (!invalidated) {\r\n // We create an unparsed, invalid document.\r\n // This will be parsed as soon as we reach the first document builder phase.\r\n // This allows to cancel the parsing process later in case we need it.\r\n const newDocument = this.langiumDocumentFactory.fromModel({ $type: 'INVALID' }, changedUri);\r\n newDocument.state = DocumentState.Changed;\r\n this.langiumDocuments.addDocument(newDocument);\r\n }\r\n this.buildState.delete(changedUri.toString());\r\n }\r\n // Set the state of all documents that should be relinked to `ComputedScopes` (if not already lower)\r\n const allChangedUris = stream(changed).concat(deleted).map(uri => uri.toString()).toSet();\r\n this.langiumDocuments.all\r\n .filter(doc => !allChangedUris.has(doc.uri.toString()) && this.shouldRelink(doc, allChangedUris))\r\n .forEach(doc => {\r\n const linker = this.serviceRegistry.getServices(doc.uri).references.Linker;\r\n linker.unlink(doc);\r\n doc.state = Math.min(doc.state, DocumentState.ComputedScopes);\r\n doc.diagnostics = undefined;\r\n });\r\n // Notify listeners of the update\r\n await this.emitUpdate(changed, deleted);\r\n // Only allow interrupting the execution after all state changes are done\r\n await interruptAndCheck(cancelToken);\r\n\r\n // Collect and sort all documents that we should rebuild\r\n const rebuildDocuments = this.sortDocuments(\r\n this.langiumDocuments.all\r\n .filter(doc =>\r\n // This includes those that were reported as changed and those that we selected for relinking\r\n doc.state < DocumentState.Linked\r\n // This includes those for which a previous build has been cancelled\r\n || !this.buildState.get(doc.uri.toString())?.completed\r\n )\r\n .toArray()\r\n );\r\n await this.buildDocuments(rebuildDocuments, this.updateBuildOptions, cancelToken);\r\n }\r\n\r\n protected async emitUpdate(changed: URI[], deleted: URI[]): Promise {\r\n await Promise.all(this.updateListeners.map(listener => listener(changed, deleted)));\r\n }\r\n\r\n /**\r\n * Sort the given documents by priority. By default, documents with an open text document are prioritized.\r\n * This is useful to ensure that visible documents show their diagnostics before all other documents.\r\n *\r\n * This improves the responsiveness in large workspaces as users usually don't care about diagnostics\r\n * in files that are currently not opened in the editor.\r\n */\r\n protected sortDocuments(documents: LangiumDocument[]): LangiumDocument[] {\r\n let left = 0;\r\n let right = documents.length - 1;\r\n\r\n while (left < right) {\r\n while (left < documents.length && this.hasTextDocument(documents[left])) {\r\n left++;\r\n }\r\n\r\n while (right >= 0 && !this.hasTextDocument(documents[right])) {\r\n right--;\r\n }\r\n\r\n if (left < right) {\r\n [documents[left], documents[right]] = [documents[right], documents[left]];\r\n }\r\n }\r\n\r\n return documents;\r\n }\r\n\r\n private hasTextDocument(doc: LangiumDocument): boolean {\r\n return Boolean(this.textDocuments?.get(doc.uri));\r\n }\r\n\r\n /**\r\n * Check whether the given document should be relinked after changes were found in the given URIs.\r\n */\r\n protected shouldRelink(document: LangiumDocument, changedUris: Set): boolean {\r\n // Relink documents with linking errors -- maybe those references can be resolved now\r\n if (document.references.some(ref => ref.error !== undefined)) {\r\n return true;\r\n }\r\n // Check whether the document is affected by any of the changed URIs\r\n return this.indexManager.isAffected(document, changedUris);\r\n }\r\n\r\n onUpdate(callback: DocumentUpdateListener): Disposable {\r\n this.updateListeners.push(callback);\r\n return Disposable.create(() => {\r\n const index = this.updateListeners.indexOf(callback);\r\n if (index >= 0) {\r\n this.updateListeners.splice(index, 1);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Build the given documents by stepping through all build phases. If a document's state indicates\r\n * that a certain build phase is already done, the phase is skipped for that document.\r\n *\r\n * @param documents The documents to build.\r\n * @param options the {@link BuildOptions} to use.\r\n * @param cancelToken A cancellation token that can be used to cancel the build.\r\n * @returns A promise that resolves when the build is done.\r\n */\r\n protected async buildDocuments(documents: LangiumDocument[], options: BuildOptions, cancelToken: CancellationToken): Promise {\r\n this.prepareBuild(documents, options);\r\n // 0. Parse content\r\n await this.runCancelable(documents, DocumentState.Parsed, cancelToken, doc =>\r\n this.langiumDocumentFactory.update(doc, cancelToken)\r\n );\r\n // 1. Index content\r\n await this.runCancelable(documents, DocumentState.IndexedContent, cancelToken, doc =>\r\n this.indexManager.updateContent(doc, cancelToken)\r\n );\r\n // 2. Compute scopes\r\n await this.runCancelable(documents, DocumentState.ComputedScopes, cancelToken, async doc => {\r\n const scopeComputation = this.serviceRegistry.getServices(doc.uri).references.ScopeComputation;\r\n doc.precomputedScopes = await scopeComputation.computeLocalScopes(doc, cancelToken);\r\n });\r\n // 3. Linking\r\n await this.runCancelable(documents, DocumentState.Linked, cancelToken, doc => {\r\n const linker = this.serviceRegistry.getServices(doc.uri).references.Linker;\r\n return linker.link(doc, cancelToken);\r\n });\r\n // 4. Index references\r\n await this.runCancelable(documents, DocumentState.IndexedReferences, cancelToken, doc =>\r\n this.indexManager.updateReferences(doc, cancelToken)\r\n );\r\n // 5. Validation\r\n const toBeValidated = documents.filter(doc => this.shouldValidate(doc));\r\n await this.runCancelable(toBeValidated, DocumentState.Validated, cancelToken, doc =>\r\n this.validate(doc, cancelToken)\r\n );\r\n\r\n // If we've made it to this point without being cancelled, we can mark the build state as completed.\r\n for (const doc of documents) {\r\n const state = this.buildState.get(doc.uri.toString());\r\n if (state) {\r\n state.completed = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Runs prior to beginning the build process to update the {@link DocumentBuildState} for each document\r\n *\r\n * @param documents collection of documents to be built\r\n * @param options the {@link BuildOptions} to use\r\n */\r\n protected prepareBuild(documents: LangiumDocument[], options: BuildOptions): void {\r\n for (const doc of documents) {\r\n const key = doc.uri.toString();\r\n const state = this.buildState.get(key);\r\n // If the document has no previous build state, we set it. If it has one, but it's already marked\r\n // as completed, we overwrite it. If the previous build was not completed, we keep its state\r\n // and continue where it was cancelled.\r\n if (!state || state.completed) {\r\n this.buildState.set(key, {\r\n completed: false,\r\n options,\r\n result: state?.result\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Runs a cancelable operation on a set of documents to bring them to a specified {@link DocumentState}.\r\n *\r\n * @param documents The array of documents to process.\r\n * @param targetState The target {@link DocumentState} to bring the documents to.\r\n * @param cancelToken A token that can be used to cancel the operation.\r\n * @param callback A function to be called for each document.\r\n * @returns A promise that resolves when all documents have been processed or the operation is canceled.\r\n * @throws Will throw `OperationCancelled` if the operation is canceled via a `CancellationToken`.\r\n */\r\n protected async runCancelable(documents: LangiumDocument[], targetState: DocumentState, cancelToken: CancellationToken,\r\n callback: (document: LangiumDocument) => MaybePromise): Promise {\r\n const filtered = documents.filter(doc => doc.state < targetState);\r\n for (const document of filtered) {\r\n await interruptAndCheck(cancelToken);\r\n await callback(document);\r\n document.state = targetState;\r\n await this.notifyDocumentPhase(document, targetState, cancelToken);\r\n }\r\n\r\n // Do not use `filtered` here, as that will miss documents that have previously reached the current target state\r\n // For example, this happens in case the cancellation triggers between the processing of two documents\r\n // Or files that were picked up during the workspace initialization\r\n const targetStateDocs = documents.filter(doc => doc.state === targetState);\r\n await this.notifyBuildPhase(targetStateDocs, targetState, cancelToken);\r\n this.currentState = targetState;\r\n }\r\n\r\n onBuildPhase(targetState: DocumentState, callback: DocumentBuildListener): Disposable {\r\n this.buildPhaseListeners.add(targetState, callback);\r\n return Disposable.create(() => {\r\n this.buildPhaseListeners.delete(targetState, callback);\r\n });\r\n }\r\n\r\n onDocumentPhase(targetState: DocumentState, callback: DocumentPhaseListener): Disposable {\r\n this.documentPhaseListeners.add(targetState, callback);\r\n return Disposable.create(() => {\r\n this.documentPhaseListeners.delete(targetState, callback);\r\n });\r\n }\r\n\r\n waitUntil(state: DocumentState, cancelToken?: CancellationToken): Promise;\r\n waitUntil(state: DocumentState, uri?: URI, cancelToken?: CancellationToken): Promise;\r\n waitUntil(state: DocumentState, uriOrToken?: URI | CancellationToken, cancelToken?: CancellationToken): Promise {\r\n let uri: URI | undefined = undefined;\r\n if (uriOrToken && 'path' in uriOrToken) {\r\n uri = uriOrToken;\r\n } else {\r\n cancelToken = uriOrToken;\r\n }\r\n cancelToken ??= CancellationToken.None;\r\n if (uri) {\r\n const document = this.langiumDocuments.getDocument(uri);\r\n if (document && document.state > state) {\r\n return Promise.resolve(uri);\r\n }\r\n }\r\n if (this.currentState >= state) {\r\n return Promise.resolve(undefined);\r\n } else if (cancelToken.isCancellationRequested) {\r\n return Promise.reject(OperationCancelled);\r\n }\r\n return new Promise((resolve, reject) => {\r\n const buildDisposable = this.onBuildPhase(state, () => {\r\n buildDisposable.dispose();\r\n cancelDisposable.dispose();\r\n if (uri) {\r\n const document = this.langiumDocuments.getDocument(uri);\r\n resolve(document?.uri);\r\n } else {\r\n resolve(undefined);\r\n }\r\n });\r\n const cancelDisposable = cancelToken!.onCancellationRequested(() => {\r\n buildDisposable.dispose();\r\n cancelDisposable.dispose();\r\n reject(OperationCancelled);\r\n });\r\n });\r\n }\r\n\r\n protected async notifyDocumentPhase(document: LangiumDocument, state: DocumentState, cancelToken: CancellationToken): Promise {\r\n const listeners = this.documentPhaseListeners.get(state);\r\n const listenersCopy = listeners.slice();\r\n for (const listener of listenersCopy) {\r\n try {\r\n await listener(document, cancelToken);\r\n } catch (err) {\r\n // Ignore cancellation errors\r\n // We want to finish the listeners before throwing\r\n if (!isOperationCancelled(err)) {\r\n throw err;\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected async notifyBuildPhase(documents: LangiumDocument[], state: DocumentState, cancelToken: CancellationToken): Promise {\r\n if (documents.length === 0) {\r\n // Don't notify when no document has been processed\r\n return;\r\n }\r\n const listeners = this.buildPhaseListeners.get(state);\r\n const listenersCopy = listeners.slice();\r\n for (const listener of listenersCopy) {\r\n await interruptAndCheck(cancelToken);\r\n await listener(documents, cancelToken);\r\n }\r\n }\r\n\r\n /**\r\n * Determine whether the given document should be validated during a build. The default\r\n * implementation checks the `validation` property of the build options. If it's set to `true`\r\n * or a `ValidationOptions` object, the document is included in the validation phase.\r\n */\r\n protected shouldValidate(document: LangiumDocument): boolean {\r\n return Boolean(this.getBuildOptions(document).validation);\r\n }\r\n\r\n /**\r\n * Run validation checks on the given document and store the resulting diagnostics in the document.\r\n * If the document already contains diagnostics, the new ones are added to the list.\r\n */\r\n protected async validate(document: LangiumDocument, cancelToken: CancellationToken): Promise {\r\n const validator = this.serviceRegistry.getServices(document.uri).validation.DocumentValidator;\r\n const validationSetting = this.getBuildOptions(document).validation;\r\n const options = typeof validationSetting === 'object' ? validationSetting : undefined;\r\n const diagnostics = await validator.validateDocument(document, options, cancelToken);\r\n if (document.diagnostics) {\r\n document.diagnostics.push(...diagnostics);\r\n } else {\r\n document.diagnostics = diagnostics;\r\n }\r\n\r\n // Store information about the executed validation in the build state\r\n const state = this.buildState.get(document.uri.toString());\r\n if (state) {\r\n state.result ??= {};\r\n const newCategories = options?.categories ?? ValidationCategory.all;\r\n if (state.result.validationChecks) {\r\n state.result.validationChecks.push(...newCategories);\r\n } else {\r\n state.result.validationChecks = [...newCategories];\r\n }\r\n }\r\n }\r\n\r\n protected getBuildOptions(document: LangiumDocument): BuildOptions {\r\n return this.buildState.get(document.uri.toString())?.options ?? {};\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { ServiceRegistry } from '../service-registry.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription, AstReflection } from '../syntax-tree.js';\r\nimport { getDocument } from '../utils/ast-utils.js';\r\nimport { ContextCache } from '../utils/caching.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport type { URI } from '../utils/uri-utils.js';\r\nimport { UriUtils } from '../utils/uri-utils.js';\r\nimport type { ReferenceDescription } from './ast-descriptions.js';\r\nimport type { LangiumDocument, LangiumDocuments } from './documents.js';\r\n\r\n/**\r\n * The index manager is responsible for keeping metadata about symbols and cross-references\r\n * in the workspace. It is used to look up symbols in the global scope, mostly during linking\r\n * and completion. This service is shared between all languages of a language server.\r\n */\r\nexport interface IndexManager {\r\n\r\n /**\r\n * Removes the specified document URI from the index.\r\n * Necessary when documents are deleted and not referenceable anymore.\r\n *\r\n * @param uri The URI of the document for which index data shall be removed\r\n */\r\n remove(uri: URI): void;\r\n\r\n /**\r\n * Updates the information about the exportable content of a document inside the index.\r\n *\r\n * @param document Document to be updated\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n updateContent(document: LangiumDocument, cancelToken?: CancellationToken): Promise;\r\n\r\n /**\r\n * Updates the information about the cross-references of a document inside the index.\r\n *\r\n * @param document Document to be updated\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n updateReferences(document: LangiumDocument, cancelToken?: CancellationToken): Promise;\r\n\r\n /**\r\n * Determine whether the given document could be affected by changes of the documents\r\n * identified by the given URIs (second parameter). The document is typically regarded as\r\n * affected if it contains a reference to any of the changed files.\r\n *\r\n * @param document Document to check whether it's affected\r\n * @param changedUris URIs of the changed documents\r\n */\r\n isAffected(document: LangiumDocument, changedUris: Set): boolean;\r\n\r\n /**\r\n * Compute a list of all exported elements, optionally filtered using a type identifier and document URIs.\r\n *\r\n * @param nodeType The type to filter with, or `undefined` to return descriptions of all types.\r\n * @param uris If specified, only returns elements from the given URIs.\r\n * @returns a `Stream` containing all globally visible nodes (of a given type).\r\n */\r\n allElements(nodeType?: string, uris?: Set): Stream;\r\n\r\n /**\r\n * Returns all known references that are pointing to the given `targetNode`.\r\n *\r\n * @param targetNode the `AstNode` to look up references for\r\n * @param astNodePath the path that points to the `targetNode` inside the document. See also `AstNodeLocator`\r\n *\r\n * @returns a `Stream` of references that are targeting the `targetNode`\r\n */\r\n findAllReferences(targetNode: AstNode, astNodePath: string): Stream;\r\n\r\n}\r\n\r\nexport class DefaultIndexManager implements IndexManager {\r\n\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n protected readonly documents: LangiumDocuments;\r\n protected readonly astReflection: AstReflection;\r\n\r\n /**\r\n * The symbol index stores all `AstNodeDescription` items exported by a document.\r\n * The key used in this map is the string representation of the specific document URI.\r\n */\r\n protected readonly symbolIndex = new Map();\r\n /**\r\n * This is a cache for the `allElements()` method.\r\n * It caches the descriptions from `symbolIndex` grouped by types.\r\n */\r\n protected readonly symbolByTypeIndex = new ContextCache();\r\n /**\r\n * This index keeps track of all `ReferenceDescription` items exported by a document.\r\n * This is used to compute which elements are affected by a document change\r\n * and for finding references to an AST node.\r\n */\r\n protected readonly referenceIndex = new Map();\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.documents = services.workspace.LangiumDocuments;\r\n this.serviceRegistry = services.ServiceRegistry;\r\n this.astReflection = services.AstReflection;\r\n }\r\n\r\n findAllReferences(targetNode: AstNode, astNodePath: string): Stream {\r\n const targetDocUri = getDocument(targetNode).uri;\r\n const result: ReferenceDescription[] = [];\r\n this.referenceIndex.forEach(docRefs => {\r\n docRefs.forEach(refDescr => {\r\n if (UriUtils.equals(refDescr.targetUri, targetDocUri) && refDescr.targetPath === astNodePath) {\r\n result.push(refDescr);\r\n }\r\n });\r\n });\r\n return stream(result);\r\n }\r\n\r\n allElements(nodeType?: string, uris?: Set): Stream {\r\n let documentUris = stream(this.symbolIndex.keys());\r\n if (uris) {\r\n documentUris = documentUris.filter(uri => !uris || uris.has(uri));\r\n }\r\n return documentUris\r\n .map(uri => this.getFileDescriptions(uri, nodeType))\r\n .flat();\r\n }\r\n\r\n protected getFileDescriptions(uri: string, nodeType?: string): AstNodeDescription[] {\r\n if (!nodeType) {\r\n return this.symbolIndex.get(uri) ?? [];\r\n }\r\n const descriptions = this.symbolByTypeIndex.get(uri, nodeType, () => {\r\n const allFileDescriptions = this.symbolIndex.get(uri) ?? [];\r\n return allFileDescriptions.filter(e => this.astReflection.isSubtype(e.type, nodeType));\r\n });\r\n return descriptions;\r\n }\r\n\r\n remove(uri: URI): void {\r\n const uriString = uri.toString();\r\n this.symbolIndex.delete(uriString);\r\n this.symbolByTypeIndex.clear(uriString);\r\n this.referenceIndex.delete(uriString);\r\n }\r\n\r\n async updateContent(document: LangiumDocument, cancelToken = CancellationToken.None): Promise {\r\n const services = this.serviceRegistry.getServices(document.uri);\r\n const exports = await services.references.ScopeComputation.computeExports(document, cancelToken);\r\n const uri = document.uri.toString();\r\n this.symbolIndex.set(uri, exports);\r\n this.symbolByTypeIndex.clear(uri);\r\n }\r\n\r\n async updateReferences(document: LangiumDocument, cancelToken = CancellationToken.None): Promise {\r\n const services = this.serviceRegistry.getServices(document.uri);\r\n const indexData = await services.workspace.ReferenceDescriptionProvider.createDescriptions(document, cancelToken);\r\n this.referenceIndex.set(document.uri.toString(), indexData);\r\n }\r\n\r\n isAffected(document: LangiumDocument, changedUris: Set): boolean {\r\n const references = this.referenceIndex.get(document.uri.toString());\r\n if (!references) {\r\n return false;\r\n }\r\n return references.some(ref => !ref.local && changedUris.has(ref.targetUri.toString()));\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { InitializeParams, InitializedParams } from 'vscode-languageserver-protocol';\r\nimport type { WorkspaceFolder } from 'vscode-languageserver-types';\r\nimport type { ServiceRegistry } from '../service-registry.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { Deferred, interruptAndCheck } from '../utils/promise-utils.js';\r\nimport { URI, UriUtils } from '../utils/uri-utils.js';\r\nimport type { BuildOptions, DocumentBuilder } from './document-builder.js';\r\nimport type { LangiumDocument, LangiumDocuments } from './documents.js';\r\nimport type { FileSystemNode, FileSystemProvider } from './file-system-provider.js';\r\nimport type { WorkspaceLock } from './workspace-lock.js';\r\n\r\n// export type WorkspaceFolder from 'vscode-languageserver-types' for convenience,\r\n// is supposed to avoid confusion as 'WorkspaceFolder' might accidentally be imported via 'vscode-languageclient'\r\nexport type { WorkspaceFolder };\r\n\r\n/**\r\n * The workspace manager is responsible for finding source files in the workspace.\r\n * This service is shared between all languages of a language server.\r\n */\r\nexport interface WorkspaceManager {\r\n\r\n /** The options used for the initial workspace build. */\r\n initialBuildOptions: BuildOptions | undefined;\r\n\r\n /**\r\n * A promise that resolves when the workspace manager is ready to be used.\r\n * Use this to ensure that the workspace manager has finished its initialization.\r\n */\r\n readonly ready: Promise;\r\n\r\n /**\r\n * The workspace folders of the current workspace.\r\n * Available only after the `ready` promise resolves.\r\n */\r\n get workspaceFolders(): readonly WorkspaceFolder[] | undefined;\r\n\r\n /**\r\n * When used in a language server context, this method is called when the server receives\r\n * the `initialize` request.\r\n */\r\n initialize(params: InitializeParams): void;\r\n\r\n /**\r\n * When used in a language server context, this method is called when the server receives\r\n * the `initialized` notification.\r\n */\r\n initialized(params: InitializedParams): Promise;\r\n\r\n /**\r\n * Does the initial indexing of workspace folders.\r\n * Collects information about exported and referenced AstNodes in\r\n * each language file and stores it locally.\r\n *\r\n * @param folders The set of workspace folders to be indexed.\r\n * @param cancelToken A cancellation token that can be used to cancel the operation.\r\n *\r\n * @throws OperationCancelled if a cancellation event has been detected\r\n */\r\n initializeWorkspace(folders: WorkspaceFolder[], cancelToken?: CancellationToken): Promise;\r\n\r\n}\r\n\r\nexport class DefaultWorkspaceManager implements WorkspaceManager {\r\n\r\n initialBuildOptions: BuildOptions = {};\r\n\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n protected readonly langiumDocuments: LangiumDocuments;\r\n protected readonly documentBuilder: DocumentBuilder;\r\n protected readonly fileSystemProvider: FileSystemProvider;\r\n protected readonly mutex: WorkspaceLock;\r\n protected readonly _ready = new Deferred();\r\n protected folders?: WorkspaceFolder[];\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.serviceRegistry = services.ServiceRegistry;\r\n this.langiumDocuments = services.workspace.LangiumDocuments;\r\n this.documentBuilder = services.workspace.DocumentBuilder;\r\n this.fileSystemProvider = services.workspace.FileSystemProvider;\r\n this.mutex = services.workspace.WorkspaceLock;\r\n }\r\n\r\n get ready(): Promise {\r\n return this._ready.promise;\r\n }\r\n\r\n get workspaceFolders(): readonly WorkspaceFolder[] | undefined {\r\n return this.folders;\r\n }\r\n\r\n initialize(params: InitializeParams): void {\r\n this.folders = params.workspaceFolders ?? undefined;\r\n }\r\n\r\n initialized(_params: InitializedParams): Promise {\r\n // Initialize the workspace even if there are no workspace folders\r\n // We still want to load additional documents (language library or similar) during initialization\r\n return this.mutex.write(token => this.initializeWorkspace(this.folders ?? [], token));\r\n }\r\n\r\n async initializeWorkspace(folders: WorkspaceFolder[], cancelToken = CancellationToken.None): Promise {\r\n const documents = await this.performStartup(folders);\r\n // Only after creating all documents do we check whether we need to cancel the initialization\r\n // The document builder will later pick up on all unprocessed documents\r\n await interruptAndCheck(cancelToken);\r\n await this.documentBuilder.build(documents, this.initialBuildOptions, cancelToken);\r\n }\r\n\r\n /**\r\n * Performs the uninterruptable startup sequence of the workspace manager.\r\n * This methods loads all documents in the workspace and other documents and returns them.\r\n */\r\n protected async performStartup(folders: WorkspaceFolder[]): Promise {\r\n const fileExtensions = this.serviceRegistry.all.flatMap(e => e.LanguageMetaData.fileExtensions);\r\n const documents: LangiumDocument[] = [];\r\n const collector = (document: LangiumDocument) => {\r\n documents.push(document);\r\n if (!this.langiumDocuments.hasDocument(document.uri)) {\r\n this.langiumDocuments.addDocument(document);\r\n }\r\n };\r\n // Even though we don't await the initialization of the workspace manager,\r\n // we can still assume that all library documents and file documents are loaded by the time we start building documents.\r\n // The mutex prevents anything from performing a workspace build until we check the cancellation token\r\n await this.loadAdditionalDocuments(folders, collector);\r\n await Promise.all(\r\n folders.map(wf => [wf, this.getRootFolder(wf)] as [WorkspaceFolder, URI])\r\n .map(async entry => this.traverseFolder(...entry, fileExtensions, collector))\r\n );\r\n this._ready.resolve();\r\n return documents;\r\n }\r\n\r\n /**\r\n * Load all additional documents that shall be visible in the context of the given workspace\r\n * folders and add them to the collector. This can be used to include built-in libraries of\r\n * your language, which can be either loaded from provided files or constructed in memory.\r\n */\r\n protected loadAdditionalDocuments(_folders: WorkspaceFolder[], _collector: (document: LangiumDocument) => void): Promise {\r\n return Promise.resolve();\r\n }\r\n\r\n /**\r\n * Determine the root folder of the source documents in the given workspace folder.\r\n * The default implementation returns the URI of the workspace folder, but you can override\r\n * this to return a subfolder like `src` instead.\r\n */\r\n protected getRootFolder(workspaceFolder: WorkspaceFolder): URI {\r\n return URI.parse(workspaceFolder.uri);\r\n }\r\n\r\n /**\r\n * Traverse the file system folder identified by the given URI and its subfolders. All\r\n * contained files that match the file extensions are added to the collector.\r\n */\r\n protected async traverseFolder(workspaceFolder: WorkspaceFolder, folderPath: URI, fileExtensions: string[], collector: (document: LangiumDocument) => void): Promise {\r\n const content = await this.fileSystemProvider.readDirectory(folderPath);\r\n await Promise.all(content.map(async entry => {\r\n if (this.includeEntry(workspaceFolder, entry, fileExtensions)) {\r\n if (entry.isDirectory) {\r\n await this.traverseFolder(workspaceFolder, entry.uri, fileExtensions, collector);\r\n } else if (entry.isFile) {\r\n const document = await this.langiumDocuments.getOrCreateDocument(entry.uri);\r\n collector(document);\r\n }\r\n }\r\n }));\r\n }\r\n\r\n /**\r\n * Determine whether the given folder entry shall be included while indexing the workspace.\r\n */\r\n protected includeEntry(_workspaceFolder: WorkspaceFolder, entry: FileSystemNode, fileExtensions: string[]): boolean {\r\n const name = UriUtils.basename(entry.uri);\r\n if (name.startsWith('.')) {\r\n return false;\r\n }\r\n if (entry.isDirectory) {\r\n return name !== 'node_modules' && name !== 'out';\r\n } else if (entry.isFile) {\r\n const extname = UriUtils.extname(entry.uri);\r\n return fileExtensions.includes(extname);\r\n }\r\n return false;\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { ILexerErrorMessageProvider, ILexingError, IMultiModeLexerDefinition, IToken, TokenType, TokenTypeDictionary, TokenVocabulary } from 'chevrotain';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport { Lexer as ChevrotainLexer, defaultLexerErrorProvider } from 'chevrotain';\r\nimport type { LexingReport, TokenBuilder } from './token-builder.js';\r\n\r\nexport class DefaultLexerErrorMessageProvider implements ILexerErrorMessageProvider {\r\n\r\n buildUnexpectedCharactersMessage(fullText: string, startOffset: number, length: number, line?: number, column?: number): string {\r\n return defaultLexerErrorProvider.buildUnexpectedCharactersMessage(fullText, startOffset, length, line, column);\r\n }\r\n\r\n buildUnableToPopLexerModeMessage(token: IToken): string {\r\n return defaultLexerErrorProvider.buildUnableToPopLexerModeMessage(token);\r\n }\r\n}\r\n\r\nexport interface LexerResult {\r\n /**\r\n * A list of all tokens that were lexed from the input.\r\n *\r\n * Note that Langium requires the optional properties\r\n * `startLine`, `startColumn`, `endOffset`, `endLine` and `endColumn` to be set on each token.\r\n */\r\n tokens: IToken[];\r\n /**\r\n * Contains hidden tokens, usually comments.\r\n */\r\n hidden: IToken[];\r\n errors: ILexingError[];\r\n report?: LexingReport;\r\n}\r\n\r\nexport type TokenizeMode = 'full' | 'partial';\r\n\r\nexport interface TokenizeOptions {\r\n mode?: TokenizeMode;\r\n}\r\n\r\nexport const DEFAULT_TOKENIZE_OPTIONS: TokenizeOptions = { mode: 'full' };\r\n\r\nexport interface Lexer {\r\n readonly definition: TokenTypeDictionary;\r\n tokenize(text: string, options?: TokenizeOptions): LexerResult;\r\n}\r\n\r\nexport class DefaultLexer implements Lexer {\r\n\r\n protected readonly tokenBuilder: TokenBuilder;\r\n protected readonly errorMessageProvider: ILexerErrorMessageProvider;\r\n protected tokenTypes: TokenTypeDictionary;\r\n protected chevrotainLexer: ChevrotainLexer;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.errorMessageProvider = services.parser.LexerErrorMessageProvider;\r\n this.tokenBuilder = services.parser.TokenBuilder;\r\n const tokens = this.tokenBuilder.buildTokens(services.Grammar, {\r\n caseInsensitive: services.LanguageMetaData.caseInsensitive\r\n });\r\n this.tokenTypes = this.toTokenTypeDictionary(tokens);\r\n const lexerTokens = isTokenTypeDictionary(tokens) ? Object.values(tokens) : tokens;\r\n const production = services.LanguageMetaData.mode === 'production';\r\n this.chevrotainLexer = new ChevrotainLexer(lexerTokens, {\r\n positionTracking: 'full',\r\n skipValidations: production,\r\n errorMessageProvider: this.errorMessageProvider\r\n });\r\n }\r\n\r\n get definition(): TokenTypeDictionary {\r\n return this.tokenTypes;\r\n }\r\n\r\n tokenize(text: string, _options: TokenizeOptions = DEFAULT_TOKENIZE_OPTIONS): LexerResult {\r\n const chevrotainResult = this.chevrotainLexer.tokenize(text);\r\n return {\r\n tokens: chevrotainResult.tokens,\r\n errors: chevrotainResult.errors,\r\n hidden: chevrotainResult.groups.hidden ?? [],\r\n report: this.tokenBuilder.flushLexingReport?.(text)\r\n };\r\n }\r\n\r\n protected toTokenTypeDictionary(buildTokens: TokenVocabulary): TokenTypeDictionary {\r\n if (isTokenTypeDictionary(buildTokens)) return buildTokens;\r\n const tokens = isIMultiModeLexerDefinition(buildTokens) ? Object.values(buildTokens.modes).flat() : buildTokens;\r\n const res: TokenTypeDictionary = {};\r\n tokens.forEach(token => res[token.name] = token);\r\n return res;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a check whether the given TokenVocabulary is TokenType array\r\n */\r\nexport function isTokenTypeArray(tokenVocabulary: TokenVocabulary): tokenVocabulary is TokenType[] {\r\n return Array.isArray(tokenVocabulary) && (tokenVocabulary.length === 0 || 'name' in tokenVocabulary[0]);\r\n}\r\n\r\n/**\r\n * Returns a check whether the given TokenVocabulary is IMultiModeLexerDefinition\r\n */\r\nexport function isIMultiModeLexerDefinition(tokenVocabulary: TokenVocabulary): tokenVocabulary is IMultiModeLexerDefinition {\r\n return tokenVocabulary && 'modes' in tokenVocabulary && 'defaultMode' in tokenVocabulary;\r\n}\r\n\r\n/**\r\n * Returns a check whether the given TokenVocabulary is TokenTypeDictionary\r\n */\r\nexport function isTokenTypeDictionary(tokenVocabulary: TokenVocabulary): tokenVocabulary is TokenTypeDictionary {\r\n return !isTokenTypeArray(tokenVocabulary) && !isIMultiModeLexerDefinition(tokenVocabulary);\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { Position, Range } from 'vscode-languageserver-types';\r\nimport type { CstNode } from '../syntax-tree.js';\r\nimport { NEWLINE_REGEXP, escapeRegExp } from '../utils/regexp-utils.js';\r\nimport { URI } from '../utils/uri-utils.js';\r\n\r\nexport interface JSDocComment extends JSDocValue {\r\n readonly elements: JSDocElement[]\r\n getTag(name: string): JSDocTag | undefined\r\n getTags(name: string): JSDocTag[]\r\n}\r\n\r\nexport type JSDocElement = JSDocParagraph | JSDocTag;\r\n\r\nexport type JSDocInline = JSDocTag | JSDocLine;\r\n\r\nexport interface JSDocValue {\r\n /**\r\n * Represents the range that this JSDoc element occupies.\r\n * If the JSDoc was parsed from a `CstNode`, the range will represent the location in the source document.\r\n */\r\n readonly range: Range\r\n /**\r\n * Renders this JSDoc element to a plain text representation.\r\n */\r\n toString(): string\r\n /**\r\n * Renders this JSDoc element to a markdown representation.\r\n *\r\n * @param options Rendering options to customize the markdown result.\r\n */\r\n toMarkdown(options?: JSDocRenderOptions): string\r\n}\r\n\r\nexport interface JSDocParagraph extends JSDocValue {\r\n readonly inlines: JSDocInline[]\r\n}\r\n\r\nexport interface JSDocLine extends JSDocValue {\r\n readonly text: string\r\n}\r\n\r\nexport interface JSDocTag extends JSDocValue {\r\n readonly name: string\r\n readonly content: JSDocParagraph\r\n readonly inline: boolean\r\n}\r\n\r\nexport interface JSDocParseOptions {\r\n /**\r\n * The start symbol of your comment format. Defaults to `/**`.\r\n */\r\n readonly start?: RegExp | string\r\n /**\r\n * The symbol that start a line of your comment format. Defaults to `*`.\r\n */\r\n readonly line?: RegExp | string\r\n /**\r\n * The end symbol of your comment format. Defaults to `*\\/`.\r\n */\r\n readonly end?: RegExp | string\r\n}\r\n\r\nexport interface JSDocRenderOptions {\r\n /**\r\n * Determines the style for rendering tags. Defaults to `italic`.\r\n */\r\n tag?: 'plain' | 'italic' | 'bold' | 'bold-italic'\r\n /**\r\n * Determines the default for rendering `@link` tags. Defaults to `plain`.\r\n */\r\n link?: 'code' | 'plain'\r\n /**\r\n * Custom tag rendering function.\r\n * Return a markdown formatted tag or `undefined` to fall back to the default rendering.\r\n */\r\n renderTag?(tag: JSDocTag): string | undefined\r\n /**\r\n * Custom link rendering function. Accepts a link target and a display value for the link.\r\n * Return a markdown formatted link with the format `[$display]($link)` or `undefined` if the link is not a valid target.\r\n */\r\n renderLink?(link: string, display: string): string | undefined\r\n}\r\n\r\n/**\r\n * Parses a JSDoc from a `CstNode` containing a comment.\r\n *\r\n * @param node A `CstNode` from a parsed Langium document.\r\n * @param options Parsing options specialized to your language. See {@link JSDocParseOptions}.\r\n */\r\nexport function parseJSDoc(node: CstNode, options?: JSDocParseOptions): JSDocComment;\r\n/**\r\n * Parses a JSDoc from a string comment.\r\n *\r\n * @param content A string containing the source of the JSDoc comment.\r\n * @param start The start position the comment occupies in the source document.\r\n * @param options Parsing options specialized to your language. See {@link JSDocParseOptions}.\r\n */\r\nexport function parseJSDoc(content: string, start?: Position, options?: JSDocParseOptions): JSDocComment;\r\nexport function parseJSDoc(node: CstNode | string, start?: Position | JSDocParseOptions, options?: JSDocParseOptions): JSDocComment {\r\n let opts: JSDocParseOptions | undefined;\r\n let position: Position | undefined;\r\n if (typeof node === 'string') {\r\n position = start as Position | undefined;\r\n opts = options as JSDocParseOptions | undefined;\r\n } else {\r\n position = node.range.start;\r\n opts = start as JSDocParseOptions | undefined;\r\n }\r\n if (!position) {\r\n position = Position.create(0, 0);\r\n }\r\n\r\n const lines = getLines(node);\r\n const normalizedOptions = normalizeOptions(opts);\r\n\r\n const tokens = tokenize({\r\n lines,\r\n position,\r\n options: normalizedOptions\r\n });\r\n\r\n return parseJSDocComment({\r\n index: 0,\r\n tokens,\r\n position\r\n });\r\n}\r\n\r\nexport function isJSDoc(node: CstNode | string, options?: JSDocParseOptions): boolean {\r\n const normalizedOptions = normalizeOptions(options);\r\n const lines = getLines(node);\r\n if (lines.length === 0) {\r\n return false;\r\n }\r\n\r\n const first = lines[0];\r\n const last = lines[lines.length - 1];\r\n const firstRegex = normalizedOptions.start;\r\n const lastRegex = normalizedOptions.end;\r\n\r\n return Boolean(firstRegex?.exec(first)) && Boolean(lastRegex?.exec(last));\r\n}\r\n\r\nfunction getLines(node: CstNode | string): string[] {\r\n let content = '';\r\n if (typeof node === 'string') {\r\n content = node;\r\n } else {\r\n content = node.text;\r\n }\r\n const lines = content.split(NEWLINE_REGEXP);\r\n return lines;\r\n}\r\n\r\n// Tokenization\r\n\r\ninterface JSDocToken {\r\n type: 'text' | 'tag' | 'inline-tag' | 'break'\r\n content: string\r\n range: Range\r\n}\r\n\r\nconst tagRegex = /\\s*(@([\\p{L}][\\p{L}\\p{N}]*)?)/uy;\r\nconst inlineTagRegex = /\\{(@[\\p{L}][\\p{L}\\p{N}]*)(\\s*)([^\\r\\n}]+)?\\}/gu;\r\n\r\nfunction tokenize(context: TokenizationContext): JSDocToken[] {\r\n const tokens: JSDocToken[] = [];\r\n let currentLine = context.position.line;\r\n let currentCharacter = context.position.character;\r\n for (let i = 0; i < context.lines.length; i++) {\r\n const first = i === 0;\r\n const last = i === context.lines.length - 1;\r\n let line = context.lines[i];\r\n let index = 0;\r\n\r\n if (first && context.options.start) {\r\n const match = context.options.start?.exec(line);\r\n if (match) {\r\n index = match.index + match[0].length;\r\n }\r\n } else {\r\n const match = context.options.line?.exec(line);\r\n if (match) {\r\n index = match.index + match[0].length;\r\n }\r\n }\r\n if (last) {\r\n const match = context.options.end?.exec(line);\r\n if (match) {\r\n line = line.substring(0, match.index);\r\n }\r\n }\r\n\r\n line = line.substring(0, lastCharacter(line));\r\n const whitespaceEnd = skipWhitespace(line, index);\r\n\r\n if (whitespaceEnd >= line.length) {\r\n // Only create a break token when we already have previous tokens\r\n if (tokens.length > 0) {\r\n const position = Position.create(currentLine, currentCharacter);\r\n tokens.push({\r\n type: 'break',\r\n content: '',\r\n range: Range.create(position, position)\r\n });\r\n }\r\n } else {\r\n tagRegex.lastIndex = index;\r\n const tagMatch = tagRegex.exec(line);\r\n if (tagMatch) {\r\n const fullMatch = tagMatch[0];\r\n const value = tagMatch[1];\r\n const start = Position.create(currentLine, currentCharacter + index);\r\n const end = Position.create(currentLine, currentCharacter + index + fullMatch.length);\r\n tokens.push({\r\n type: 'tag',\r\n content: value,\r\n range: Range.create(start, end)\r\n });\r\n index += fullMatch.length;\r\n index = skipWhitespace(line, index);\r\n }\r\n\r\n if (index < line.length) {\r\n const rest = line.substring(index);\r\n const inlineTagMatches = Array.from(rest.matchAll(inlineTagRegex));\r\n tokens.push(...buildInlineTokens(inlineTagMatches, rest, currentLine, currentCharacter + index));\r\n }\r\n }\r\n\r\n currentLine++;\r\n currentCharacter = 0;\r\n }\r\n\r\n // Remove last break token if there is one\r\n if (tokens.length > 0 && tokens[tokens.length - 1].type === 'break') {\r\n return tokens.slice(0, -1);\r\n }\r\n\r\n return tokens;\r\n}\r\n\r\nfunction buildInlineTokens(tags: RegExpMatchArray[], line: string, lineIndex: number, characterIndex: number): JSDocToken[] {\r\n const tokens: JSDocToken[] = [];\r\n\r\n if (tags.length === 0) {\r\n const start = Position.create(lineIndex, characterIndex);\r\n const end = Position.create(lineIndex, characterIndex + line.length);\r\n tokens.push({\r\n type: 'text',\r\n content: line,\r\n range: Range.create(start, end)\r\n });\r\n } else {\r\n let lastIndex = 0;\r\n for (const match of tags) {\r\n const matchIndex = match.index!;\r\n const startContent = line.substring(lastIndex, matchIndex);\r\n if (startContent.length > 0) {\r\n tokens.push({\r\n type: 'text',\r\n content: line.substring(lastIndex, matchIndex),\r\n range: Range.create(\r\n Position.create(lineIndex, lastIndex + characterIndex),\r\n Position.create(lineIndex, matchIndex + characterIndex)\r\n )\r\n });\r\n }\r\n let offset = startContent.length + 1;\r\n const tagName = match[1];\r\n tokens.push({\r\n type: 'inline-tag',\r\n content: tagName,\r\n range: Range.create(\r\n Position.create(lineIndex, lastIndex + offset + characterIndex),\r\n Position.create(lineIndex, lastIndex + offset + tagName.length + characterIndex)\r\n )\r\n });\r\n offset += tagName.length;\r\n if (match.length === 4) {\r\n offset += match[2].length;\r\n const value = match[3];\r\n tokens.push({\r\n type: 'text',\r\n content: value,\r\n range: Range.create(\r\n Position.create(lineIndex, lastIndex + offset + characterIndex),\r\n Position.create(lineIndex, lastIndex + offset + value.length + characterIndex)\r\n )\r\n });\r\n } else {\r\n tokens.push({\r\n type: 'text',\r\n content: '',\r\n range: Range.create(\r\n Position.create(lineIndex, lastIndex + offset + characterIndex),\r\n Position.create(lineIndex, lastIndex + offset + characterIndex)\r\n )\r\n });\r\n }\r\n lastIndex = matchIndex + match[0].length;\r\n }\r\n const endContent = line.substring(lastIndex);\r\n if (endContent.length > 0) {\r\n tokens.push({\r\n type: 'text',\r\n content: endContent,\r\n range: Range.create(\r\n Position.create(lineIndex, lastIndex + characterIndex),\r\n Position.create(lineIndex, lastIndex + characterIndex + endContent.length)\r\n )\r\n });\r\n }\r\n }\r\n\r\n return tokens;\r\n}\r\n\r\nconst nonWhitespaceRegex = /\\S/;\r\nconst whitespaceEndRegex = /\\s*$/;\r\n\r\nfunction skipWhitespace(line: string, index: number): number {\r\n const match = line.substring(index).match(nonWhitespaceRegex);\r\n if (match) {\r\n return index + match.index!;\r\n } else {\r\n return line.length;\r\n }\r\n}\r\n\r\nfunction lastCharacter(line: string): number | undefined {\r\n const match = line.match(whitespaceEndRegex);\r\n if (match && typeof match.index === 'number') {\r\n return match.index;\r\n }\r\n return undefined;\r\n}\r\n\r\n// Parsing\r\n\r\nfunction parseJSDocComment(context: ParseContext): JSDocComment {\r\n const startPosition: Position = Position.create(context.position.line, context.position.character);\r\n if (context.tokens.length === 0) {\r\n return new JSDocCommentImpl([], Range.create(startPosition, startPosition));\r\n }\r\n const elements: JSDocElement[] = [];\r\n while (context.index < context.tokens.length) {\r\n const element = parseJSDocElement(context, elements[elements.length - 1]);\r\n if (element) {\r\n elements.push(element);\r\n }\r\n }\r\n const start = elements[0]?.range.start ?? startPosition;\r\n const end = elements[elements.length - 1]?.range.end ?? startPosition;\r\n return new JSDocCommentImpl(elements, Range.create(start, end));\r\n}\r\n\r\nfunction parseJSDocElement(context: ParseContext, last?: JSDocElement): JSDocElement | undefined {\r\n const next = context.tokens[context.index];\r\n if (next.type === 'tag') {\r\n return parseJSDocTag(context, false);\r\n } else if (next.type === 'text' || next.type === 'inline-tag') {\r\n return parseJSDocText(context);\r\n } else {\r\n appendEmptyLine(next, last);\r\n context.index++;\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction appendEmptyLine(token: JSDocToken, element?: JSDocElement): void {\r\n if (element) {\r\n const line = new JSDocLineImpl('', token.range);\r\n if ('inlines' in element) {\r\n element.inlines.push(line);\r\n } else {\r\n element.content.inlines.push(line);\r\n }\r\n }\r\n}\r\n\r\nfunction parseJSDocText(context: ParseContext): JSDocParagraph {\r\n let token = context.tokens[context.index];\r\n const firstToken = token;\r\n let lastToken = token;\r\n const lines: JSDocInline[] = [];\r\n while (token && token.type !== 'break' && token.type !== 'tag') {\r\n lines.push(parseJSDocInline(context));\r\n lastToken = token;\r\n token = context.tokens[context.index];\r\n }\r\n return new JSDocTextImpl(lines, Range.create(firstToken.range.start, lastToken.range.end));\r\n}\r\n\r\nfunction parseJSDocInline(context: ParseContext): JSDocInline {\r\n const token = context.tokens[context.index];\r\n if (token.type === 'inline-tag') {\r\n return parseJSDocTag(context, true);\r\n } else {\r\n return parseJSDocLine(context);\r\n }\r\n}\r\n\r\nfunction parseJSDocTag(context: ParseContext, inline: boolean): JSDocTag {\r\n const tagToken = context.tokens[context.index++];\r\n const name = tagToken.content.substring(1);\r\n const nextToken = context.tokens[context.index];\r\n if (nextToken?.type === 'text') {\r\n if (inline) {\r\n const docLine = parseJSDocLine(context);\r\n return new JSDocTagImpl(\r\n name,\r\n new JSDocTextImpl([docLine], docLine.range),\r\n inline,\r\n Range.create(tagToken.range.start, docLine.range.end)\r\n );\r\n } else {\r\n const textDoc = parseJSDocText(context);\r\n return new JSDocTagImpl(\r\n name,\r\n textDoc,\r\n inline,\r\n Range.create(tagToken.range.start, textDoc.range.end)\r\n );\r\n }\r\n } else {\r\n const range = tagToken.range;\r\n return new JSDocTagImpl(name, new JSDocTextImpl([], range), inline, range);\r\n }\r\n}\r\n\r\nfunction parseJSDocLine(context: ParseContext): JSDocLine {\r\n const token = context.tokens[context.index++];\r\n return new JSDocLineImpl(token.content, token.range);\r\n}\r\n\r\ninterface NormalizedOptions {\r\n start?: RegExp\r\n end?: RegExp\r\n line?: RegExp\r\n}\r\n\r\ninterface TokenizationContext {\r\n position: Position\r\n lines: string[]\r\n options: NormalizedOptions\r\n}\r\n\r\ninterface ParseContext {\r\n position: Position\r\n tokens: JSDocToken[]\r\n index: number\r\n}\r\n\r\nfunction normalizeOptions(options?: JSDocParseOptions): NormalizedOptions {\r\n if (!options) {\r\n return normalizeOptions({\r\n start: '/**',\r\n end: '*/',\r\n line: '*'\r\n });\r\n }\r\n const { start, end, line } = options;\r\n return {\r\n start: normalizeOption(start, true),\r\n end: normalizeOption(end, false),\r\n line: normalizeOption(line, true)\r\n };\r\n}\r\n\r\nfunction normalizeOption(option: RegExp | string | undefined, start: boolean): RegExp | undefined {\r\n if (typeof option === 'string' || typeof option === 'object') {\r\n const escaped = typeof option === 'string' ? escapeRegExp(option) : option.source;\r\n if (start) {\r\n return new RegExp(`^\\\\s*${escaped}`);\r\n } else {\r\n return new RegExp(`\\\\s*${escaped}\\\\s*$`);\r\n }\r\n } else {\r\n return option;\r\n }\r\n}\r\n\r\nclass JSDocCommentImpl implements JSDocComment {\r\n\r\n readonly elements: JSDocElement[];\r\n readonly range: Range;\r\n\r\n constructor(elements: JSDocElement[], range: Range) {\r\n this.elements = elements;\r\n this.range = range;\r\n }\r\n\r\n getTag(name: string): JSDocTag | undefined {\r\n return this.getAllTags().find(e => e.name === name);\r\n }\r\n\r\n getTags(name: string): JSDocTag[] {\r\n return this.getAllTags().filter(e => e.name === name);\r\n }\r\n\r\n private getAllTags(): JSDocTag[] {\r\n return this.elements.filter((e): e is JSDocTag => 'name' in e);\r\n }\r\n\r\n toString(): string {\r\n let value = '';\r\n for (const element of this.elements) {\r\n if (value.length === 0) {\r\n value = element.toString();\r\n } else {\r\n const text = element.toString();\r\n value += fillNewlines(value) + text;\r\n }\r\n }\r\n return value.trim();\r\n }\r\n\r\n toMarkdown(options?: JSDocRenderOptions): string {\r\n let value = '';\r\n for (const element of this.elements) {\r\n if (value.length === 0) {\r\n value = element.toMarkdown(options);\r\n } else {\r\n const text = element.toMarkdown(options);\r\n value += fillNewlines(value) + text;\r\n }\r\n }\r\n return value.trim();\r\n }\r\n}\r\n\r\nclass JSDocTagImpl implements JSDocTag {\r\n name: string;\r\n content: JSDocParagraph;\r\n range: Range;\r\n inline: boolean;\r\n\r\n constructor(name: string, content: JSDocParagraph, inline: boolean, range: Range) {\r\n this.name = name;\r\n this.content = content;\r\n this.inline = inline;\r\n this.range = range;\r\n }\r\n\r\n toString(): string {\r\n let text = `@${this.name}`;\r\n const content = this.content.toString();\r\n if (this.content.inlines.length === 1) {\r\n text = `${text} ${content}`;\r\n } else if (this.content.inlines.length > 1) {\r\n text = `${text}\\n${content}`;\r\n }\r\n if (this.inline) {\r\n // Inline tags are surrounded by curly braces\r\n return `{${text}}`;\r\n } else {\r\n return text;\r\n }\r\n }\r\n\r\n toMarkdown(options?: JSDocRenderOptions): string {\r\n return options?.renderTag?.(this) ?? this.toMarkdownDefault(options);\r\n }\r\n\r\n private toMarkdownDefault(options?: JSDocRenderOptions): string {\r\n const content = this.content.toMarkdown(options);\r\n if (this.inline) {\r\n const rendered = renderInlineTag(this.name, content, options ?? {});\r\n if (typeof rendered === 'string') {\r\n return rendered;\r\n }\r\n }\r\n let marker = '';\r\n if (options?.tag === 'italic' || options?.tag === undefined) {\r\n marker = '*';\r\n } else if (options?.tag === 'bold') {\r\n marker = '**';\r\n } else if (options?.tag === 'bold-italic') {\r\n marker = '***';\r\n }\r\n let text = `${marker}@${this.name}${marker}`;\r\n if (this.content.inlines.length === 1) {\r\n text = `${text} \u2014 ${content}`;\r\n } else if (this.content.inlines.length > 1) {\r\n text = `${text}\\n${content}`;\r\n }\r\n if (this.inline) {\r\n // Inline tags are surrounded by curly braces\r\n return `{${text}}`;\r\n } else {\r\n return text;\r\n }\r\n }\r\n}\r\n\r\nfunction renderInlineTag(tag: string, content: string, options: JSDocRenderOptions): string | undefined {\r\n if (tag === 'linkplain' || tag === 'linkcode' || tag === 'link') {\r\n const index = content.indexOf(' ');\r\n let display = content;\r\n if (index > 0) {\r\n const displayStart = skipWhitespace(content, index);\r\n display = content.substring(displayStart);\r\n content = content.substring(0, index);\r\n }\r\n if (tag === 'linkcode' || (tag === 'link' && options.link === 'code')) {\r\n // Surround the display value in a markdown inline code block\r\n display = `\\`${display}\\``;\r\n }\r\n const renderedLink = options.renderLink?.(content, display) ?? renderLinkDefault(content, display);\r\n return renderedLink;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction renderLinkDefault(content: string, display: string): string {\r\n try {\r\n URI.parse(content, true);\r\n return `[${display}](${content})`;\r\n } catch {\r\n return content;\r\n }\r\n}\r\n\r\nclass JSDocTextImpl implements JSDocParagraph {\r\n inlines: JSDocInline[];\r\n range: Range;\r\n\r\n constructor(lines: JSDocInline[], range: Range) {\r\n this.inlines = lines;\r\n this.range = range;\r\n }\r\n\r\n toString(): string {\r\n let text = '';\r\n for (let i = 0; i < this.inlines.length; i++) {\r\n const inline = this.inlines[i];\r\n const next = this.inlines[i + 1];\r\n text += inline.toString();\r\n if (next && next.range.start.line > inline.range.start.line) {\r\n text += '\\n';\r\n }\r\n }\r\n return text;\r\n }\r\n\r\n toMarkdown(options?: JSDocRenderOptions): string {\r\n let text = '';\r\n for (let i = 0; i < this.inlines.length; i++) {\r\n const inline = this.inlines[i];\r\n const next = this.inlines[i + 1];\r\n text += inline.toMarkdown(options);\r\n if (next && next.range.start.line > inline.range.start.line) {\r\n text += '\\n';\r\n }\r\n }\r\n return text;\r\n }\r\n}\r\n\r\nclass JSDocLineImpl implements JSDocLine {\r\n text: string;\r\n range: Range;\r\n\r\n constructor(text: string, range: Range) {\r\n this.text = text;\r\n this.range = range;\r\n }\r\n\r\n toString(): string {\r\n return this.text;\r\n }\r\n toMarkdown(): string {\r\n return this.text;\r\n }\r\n\r\n}\r\n\r\nfunction fillNewlines(text: string): string {\r\n if (text.endsWith('\\n')) {\r\n return '\\n';\r\n } else {\r\n return '\\n\\n';\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription } from '../syntax-tree.js';\r\nimport type { IndexManager } from '../workspace/index-manager.js';\r\nimport type { CommentProvider } from './comment-provider.js';\r\nimport type { JSDocTag } from './jsdoc.js';\r\nimport { getDocument } from '../utils/ast-utils.js';\r\nimport { isJSDoc, parseJSDoc } from './jsdoc.js';\r\n\r\n/**\r\n * Provides documentation for AST nodes.\r\n */\r\nexport interface DocumentationProvider {\r\n /**\r\n * Returns a markdown documentation string for the specified AST node.\r\n *\r\n * The default implementation `JSDocDocumentationProvider` will inspect the comment associated with the specified node.\r\n */\r\n getDocumentation(node: AstNode): string | undefined;\r\n}\r\n\r\nexport class JSDocDocumentationProvider implements DocumentationProvider {\r\n\r\n protected readonly indexManager: IndexManager;\r\n protected readonly commentProvider: CommentProvider;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.indexManager = services.shared.workspace.IndexManager;\r\n this.commentProvider = services.documentation.CommentProvider;\r\n }\r\n\r\n getDocumentation(node: AstNode): string | undefined {\r\n const comment = this.commentProvider.getComment(node);\r\n if (comment && isJSDoc(comment)) {\r\n const parsedJSDoc = parseJSDoc(comment);\r\n return parsedJSDoc.toMarkdown({\r\n renderLink: (link, display) => {\r\n return this.documentationLinkRenderer(node, link, display);\r\n },\r\n renderTag: (tag) => {\r\n return this.documentationTagRenderer(node, tag);\r\n }\r\n });\r\n }\r\n return undefined;\r\n }\r\n\r\n protected documentationLinkRenderer(node: AstNode, name: string, display: string): string | undefined {\r\n const description = this.findNameInPrecomputedScopes(node, name) ?? this.findNameInGlobalScope(node, name);\r\n if (description && description.nameSegment) {\r\n const line = description.nameSegment.range.start.line + 1;\r\n const character = description.nameSegment.range.start.character + 1;\r\n const uri = description.documentUri.with({ fragment: `L${line},${character}` });\r\n return `[${display}](${uri.toString()})`;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n protected documentationTagRenderer(_node: AstNode, _tag: JSDocTag): string | undefined {\r\n // Fall back to the default tag rendering\r\n return undefined;\r\n }\r\n\r\n protected findNameInPrecomputedScopes(node: AstNode, name: string): AstNodeDescription | undefined {\r\n const document = getDocument(node);\r\n const precomputed = document.precomputedScopes;\r\n if (!precomputed) {\r\n return undefined;\r\n }\r\n let currentNode: AstNode | undefined = node;\r\n do {\r\n const allDescriptions = precomputed.get(currentNode);\r\n const description = allDescriptions.find(e => e.name === name);\r\n if (description) {\r\n return description;\r\n }\r\n currentNode = currentNode.$container;\r\n } while (currentNode);\r\n\r\n return undefined;\r\n }\r\n\r\n protected findNameInGlobalScope(node: AstNode, name: string): AstNodeDescription | undefined {\r\n const description = this.indexManager.allElements().find(e => e.name === name);\r\n return description;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { GrammarConfig } from '../languages/grammar-config.js';\r\nimport { isAstNodeWithComment } from '../serializer/json-serializer.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode } from '../syntax-tree.js';\r\nimport { findCommentNode } from '../utils/cst-utils.js';\r\n\r\n/**\r\n * Provides comments for AST nodes.\r\n */\r\nexport interface CommentProvider {\r\n /**\r\n * Returns the comment associated with the specified AST node.\r\n * @param node The AST node to get the comment for.\r\n * @returns The comment associated with the specified AST node or `undefined` if there is no comment.\r\n */\r\n getComment(node: AstNode): string | undefined;\r\n}\r\n\r\nexport class DefaultCommentProvider implements CommentProvider {\r\n protected readonly grammarConfig: () => GrammarConfig;\r\n constructor(services: LangiumCoreServices) {\r\n this.grammarConfig = () => services.parser.GrammarConfig;\r\n }\r\n getComment(node: AstNode): string | undefined {\r\n if(isAstNodeWithComment(node)) {\r\n return node.$comment;\r\n }\r\n return findCommentNode(node.$cstNode, this.grammarConfig().multilineCommentRules)?.text;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { CancellationToken } from '../utils/cancellation.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode } from '../syntax-tree.js';\r\nimport type { LangiumParser, ParseResult } from './langium-parser.js';\r\nimport type { Hydrator } from '../serializer/hydrator.js';\r\nimport type { Event } from '../utils/event.js';\r\nimport { Deferred, OperationCancelled } from '../utils/promise-utils.js';\r\nimport { Emitter } from '../utils/event.js';\r\n\r\n/**\r\n * Async parser that allows cancellation of the current parsing process.\r\n *\r\n * @remarks\r\n * The sync parser implementation is blocking the event loop, which can become quite problematic for large files.\r\n * The default implementation is not actually async. It just wraps the sync parser in a promise. A real implementation would create worker threads or web workers to offload the parsing work.\r\n */\r\nexport interface AsyncParser {\r\n /**\r\n * Parses the given text and returns the parse result.\r\n *\r\n * @param text The text to parse.\r\n * @param cancelToken A cancellation token that can be used to cancel the parsing process.\r\n * @returns A promise that resolves to the parse result.\r\n *\r\n * @throws `OperationCancelled` if the parsing process is cancelled.\r\n */\r\n parse(text: string, cancelToken: CancellationToken): Promise>;\r\n}\r\n\r\n/**\r\n * Default implementation of the async parser which simply wraps the sync parser in a promise.\r\n *\r\n * @remarks\r\n * A real implementation would create worker threads or web workers to offload the parsing work.\r\n */\r\nexport class DefaultAsyncParser implements AsyncParser {\r\n\r\n protected readonly syncParser: LangiumParser;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.syncParser = services.parser.LangiumParser;\r\n }\r\n\r\n parse(text: string, _cancelToken: CancellationToken): Promise> {\r\n return Promise.resolve(this.syncParser.parse(text));\r\n }\r\n}\r\n\r\nexport abstract class AbstractThreadedAsyncParser implements AsyncParser {\r\n\r\n /**\r\n * The thread count determines how many threads are used to parse files in parallel.\r\n * The default value is 8. Decreasing this value increases startup performance, but decreases parallel parsing performance.\r\n */\r\n protected threadCount = 8;\r\n /**\r\n * The termination delay determines how long the parser waits for a thread to finish after a cancellation request.\r\n * The default value is 200(ms).\r\n */\r\n protected terminationDelay = 200;\r\n protected workerPool: ParserWorker[] = [];\r\n protected queue: Array> = [];\r\n\r\n protected readonly hydrator: Hydrator;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.hydrator = services.serializer.Hydrator;\r\n }\r\n\r\n protected initializeWorkers(): void {\r\n while (this.workerPool.length < this.threadCount) {\r\n const worker = this.createWorker();\r\n worker.onReady(() => {\r\n if (this.queue.length > 0) {\r\n const deferred = this.queue.shift();\r\n if (deferred) {\r\n worker.lock();\r\n deferred.resolve(worker);\r\n }\r\n }\r\n });\r\n this.workerPool.push(worker);\r\n }\r\n }\r\n\r\n async parse(text: string, cancelToken: CancellationToken): Promise> {\r\n const worker = await this.acquireParserWorker(cancelToken);\r\n const deferred = new Deferred>();\r\n let timeout: NodeJS.Timeout | undefined;\r\n // If the cancellation token is requested, we wait for a certain time before terminating the worker.\r\n // Since the cancellation token lives longer than the parsing process, we need to dispose the event listener.\r\n // Otherwise, we might accidentally terminate the worker after the parsing process has finished.\r\n const cancellation = cancelToken.onCancellationRequested(() => {\r\n timeout = setTimeout(() => {\r\n this.terminateWorker(worker);\r\n }, this.terminationDelay);\r\n });\r\n worker.parse(text).then(result => {\r\n const hydrated = this.hydrator.hydrate(result);\r\n deferred.resolve(hydrated);\r\n }).catch(err => {\r\n deferred.reject(err);\r\n }).finally(() => {\r\n cancellation.dispose();\r\n clearTimeout(timeout);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n protected terminateWorker(worker: ParserWorker): void {\r\n worker.terminate();\r\n const index = this.workerPool.indexOf(worker);\r\n if (index >= 0) {\r\n this.workerPool.splice(index, 1);\r\n }\r\n }\r\n\r\n protected async acquireParserWorker(cancelToken: CancellationToken): Promise {\r\n this.initializeWorkers();\r\n for (const worker of this.workerPool) {\r\n if (worker.ready) {\r\n worker.lock();\r\n return worker;\r\n }\r\n }\r\n const deferred = new Deferred();\r\n cancelToken.onCancellationRequested(() => {\r\n const index = this.queue.indexOf(deferred);\r\n if (index >= 0) {\r\n this.queue.splice(index, 1);\r\n }\r\n deferred.reject(OperationCancelled);\r\n });\r\n this.queue.push(deferred);\r\n return deferred.promise;\r\n }\r\n\r\n protected abstract createWorker(): ParserWorker;\r\n}\r\n\r\nexport type WorkerMessagePost = (message: unknown) => void;\r\nexport type WorkerMessageCallback = (cb: (message: unknown) => void) => void;\r\n\r\nexport class ParserWorker {\r\n\r\n protected readonly sendMessage: WorkerMessagePost;\r\n protected readonly _terminate: () => void;\r\n protected readonly onReadyEmitter = new Emitter();\r\n\r\n protected deferred = new Deferred();\r\n protected _ready = true;\r\n protected _parsing = false;\r\n\r\n get ready(): boolean {\r\n return this._ready;\r\n }\r\n\r\n get onReady(): Event {\r\n return this.onReadyEmitter.event;\r\n }\r\n\r\n constructor(sendMessage: WorkerMessagePost, onMessage: WorkerMessageCallback, onError: WorkerMessageCallback, terminate: () => void) {\r\n this.sendMessage = sendMessage;\r\n this._terminate = terminate;\r\n onMessage(result => {\r\n const parseResult = result as ParseResult;\r\n this.deferred.resolve(parseResult);\r\n this.unlock();\r\n });\r\n onError(error => {\r\n this.deferred.reject(error);\r\n this.unlock();\r\n });\r\n }\r\n\r\n terminate(): void {\r\n this.deferred.reject(OperationCancelled);\r\n this._terminate();\r\n }\r\n\r\n lock(): void {\r\n this._ready = false;\r\n }\r\n\r\n unlock(): void {\r\n this._parsing = false;\r\n this._ready = true;\r\n this.onReadyEmitter.fire();\r\n }\r\n\r\n parse(text: string): Promise {\r\n if (this._parsing) {\r\n throw new Error('Parser worker is busy');\r\n }\r\n this._parsing = true;\r\n this.deferred = new Deferred();\r\n this.sendMessage(text);\r\n return this.deferred.promise;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { type AbstractCancellationTokenSource, CancellationToken, CancellationTokenSource } from '../utils/cancellation.js';\r\nimport { Deferred, isOperationCancelled, startCancelableOperation, type MaybePromise } from '../utils/promise-utils.js';\r\n\r\n/**\r\n * Utility service to execute mutually exclusive actions.\r\n */\r\nexport interface WorkspaceLock {\r\n /**\r\n * Performs a single async action, like initializing the workspace or processing document changes.\r\n * Only one action will be executed at a time.\r\n *\r\n * When another action is queued up, the token provided for the action will be cancelled.\r\n * Assuming the action makes use of this token, the next action only has to wait for the current action to finish cancellation.\r\n */\r\n write(action: (token: CancellationToken) => MaybePromise): Promise;\r\n\r\n /**\r\n * Performs a single action, like computing completion results or providing workspace symbols.\r\n * Read actions will only be executed after all write actions have finished. They will be executed in parallel if possible.\r\n *\r\n * If a write action is currently running, the read action will be queued up and executed afterwards.\r\n * If a new write action is queued up while a read action is waiting, the write action will receive priority and will be handled before the read action.\r\n *\r\n * Note that read actions are not allowed to modify anything in the workspace. Please use {@link write} instead.\r\n */\r\n read(action: () => MaybePromise): Promise;\r\n\r\n /**\r\n * Cancels the last queued write action. All previous write actions already have been cancelled.\r\n */\r\n cancelWrite(): void;\r\n}\r\n\r\ntype LockAction = (token: CancellationToken) => MaybePromise;\r\n\r\ninterface LockEntry {\r\n action: LockAction;\r\n deferred: Deferred;\r\n cancellationToken: CancellationToken;\r\n}\r\n\r\nexport class DefaultWorkspaceLock implements WorkspaceLock {\r\n\r\n private previousTokenSource: AbstractCancellationTokenSource = new CancellationTokenSource();\r\n private writeQueue: LockEntry[] = [];\r\n private readQueue: LockEntry[] = [];\r\n private done = true;\r\n\r\n write(action: (token: CancellationToken) => MaybePromise): Promise {\r\n this.cancelWrite();\r\n const tokenSource = startCancelableOperation();\r\n this.previousTokenSource = tokenSource;\r\n return this.enqueue(this.writeQueue, action, tokenSource.token);\r\n }\r\n\r\n read(action: () => MaybePromise): Promise {\r\n return this.enqueue(this.readQueue, action);\r\n }\r\n\r\n private enqueue(queue: LockEntry[], action: LockAction, cancellationToken = CancellationToken.None): Promise {\r\n const deferred = new Deferred();\r\n const entry: LockEntry = {\r\n action,\r\n deferred,\r\n cancellationToken\r\n };\r\n queue.push(entry);\r\n this.performNextOperation();\r\n return deferred.promise as Promise;\r\n }\r\n\r\n private async performNextOperation(): Promise {\r\n if (!this.done) {\r\n return;\r\n }\r\n const entries: LockEntry[] = [];\r\n if (this.writeQueue.length > 0) {\r\n // Just perform the next write action\r\n entries.push(this.writeQueue.shift()!);\r\n } else if (this.readQueue.length > 0) {\r\n // Empty the read queue and perform all actions in parallel\r\n entries.push(...this.readQueue.splice(0, this.readQueue.length));\r\n } else {\r\n return;\r\n }\r\n this.done = false;\r\n await Promise.all(entries.map(async ({ action, deferred, cancellationToken }) => {\r\n try {\r\n // Move the execution of the action to the next event loop tick via `Promise.resolve()`\r\n const result = await Promise.resolve().then(() => action(cancellationToken));\r\n deferred.resolve(result);\r\n } catch (err) {\r\n if (isOperationCancelled(err)) {\r\n // If the operation was cancelled, we don't want to reject the promise\r\n deferred.resolve(undefined);\r\n } else {\r\n deferred.reject(err);\r\n }\r\n }\r\n }));\r\n this.done = true;\r\n this.performNextOperation();\r\n }\r\n\r\n cancelWrite(): void {\r\n this.previousTokenSource.cancel();\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2024 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport type { TokenType } from 'chevrotain';\r\nimport { CompositeCstNodeImpl, LeafCstNodeImpl, RootCstNodeImpl } from '../parser/cst-node-builder.js';\r\nimport { isAbstractElement, type AbstractElement, type Grammar } from '../languages/generated/ast.js';\r\nimport type { Linker } from '../references/linker.js';\r\nimport type { Lexer } from '../parser/lexer.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { ParseResult } from '../parser/langium-parser.js';\r\nimport type { Reference, AstNode, CstNode, LeafCstNode, GenericAstNode, Mutable, RootCstNode } from '../syntax-tree.js';\r\nimport { isRootCstNode, isCompositeCstNode, isLeafCstNode, isAstNode, isReference } from '../syntax-tree.js';\r\nimport { streamAst } from '../utils/ast-utils.js';\r\nimport { BiMap } from '../utils/collections.js';\r\nimport { streamCst } from '../utils/cst-utils.js';\r\nimport type { LexingReport } from '../parser/token-builder.js';\r\n\r\n/**\r\n * The hydrator service is responsible for allowing AST parse results to be sent across worker threads.\r\n */\r\nexport interface Hydrator {\r\n /**\r\n * Converts a parse result to a plain object. The resulting object can be sent across worker threads.\r\n */\r\n dehydrate(result: ParseResult): ParseResult;\r\n /**\r\n * Converts a plain object to a parse result. The included AST node can then be used in the main thread.\r\n * Calling this method on objects that have not been dehydrated first will result in undefined behavior.\r\n */\r\n hydrate(result: ParseResult): ParseResult;\r\n}\r\n\r\nexport interface DehydrateContext {\r\n astNodes: Map;\r\n cstNodes: Map;\r\n}\r\n\r\nexport interface HydrateContext {\r\n astNodes: Map;\r\n cstNodes: Map;\r\n}\r\n\r\nexport class DefaultHydrator implements Hydrator {\r\n\r\n protected readonly grammar: Grammar;\r\n protected readonly lexer: Lexer;\r\n protected readonly linker: Linker;\r\n\r\n protected readonly grammarElementIdMap = new BiMap();\r\n protected readonly tokenTypeIdMap = new BiMap();\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.grammar = services.Grammar;\r\n this.lexer = services.parser.Lexer;\r\n this.linker = services.references.Linker;\r\n }\r\n\r\n dehydrate(result: ParseResult): ParseResult {\r\n return {\r\n lexerErrors: result.lexerErrors,\r\n lexerReport: result.lexerReport ? this.dehydrateLexerReport(result.lexerReport) : undefined,\r\n // We need to create shallow copies of the errors\r\n // The original errors inherit from the `Error` class, which is not transferable across worker threads\r\n parserErrors: result.parserErrors.map(e => ({ ...e, message: e.message })),\r\n value: this.dehydrateAstNode(result.value, this.createDehyrationContext(result.value))\r\n };\r\n }\r\n\r\n protected dehydrateLexerReport(lexerReport: LexingReport): LexingReport {\r\n // By default, lexer reports are serializable\r\n return lexerReport;\r\n }\r\n\r\n protected createDehyrationContext(node: AstNode): DehydrateContext {\r\n const astNodes = new Map();\r\n const cstNodes = new Map();\r\n for (const astNode of streamAst(node)) {\r\n astNodes.set(astNode, {});\r\n }\r\n if (node.$cstNode) {\r\n for (const cstNode of streamCst(node.$cstNode)) {\r\n cstNodes.set(cstNode, {});\r\n }\r\n }\r\n return {\r\n astNodes,\r\n cstNodes\r\n };\r\n }\r\n\r\n protected dehydrateAstNode(node: AstNode, context: DehydrateContext): object {\r\n const obj = context.astNodes.get(node) as Record;\r\n obj.$type = node.$type;\r\n obj.$containerIndex = node.$containerIndex;\r\n obj.$containerProperty = node.$containerProperty;\r\n if (node.$cstNode !== undefined) {\r\n obj.$cstNode = this.dehydrateCstNode(node.$cstNode, context);\r\n }\r\n for (const [name, value] of Object.entries(node)) {\r\n if (name.startsWith('$')) {\r\n continue;\r\n }\r\n if (Array.isArray(value)) {\r\n const arr: any[] = [];\r\n obj[name] = arr;\r\n for (const item of value) {\r\n if (isAstNode(item)) {\r\n arr.push(this.dehydrateAstNode(item, context));\r\n } else if (isReference(item)) {\r\n arr.push(this.dehydrateReference(item, context));\r\n } else {\r\n arr.push(item);\r\n }\r\n }\r\n } else if (isAstNode(value)) {\r\n obj[name] = this.dehydrateAstNode(value, context);\r\n } else if (isReference(value)) {\r\n obj[name] = this.dehydrateReference(value, context);\r\n } else if (value !== undefined) {\r\n obj[name] = value;\r\n }\r\n }\r\n return obj;\r\n }\r\n\r\n protected dehydrateReference(reference: Reference, context: DehydrateContext): any {\r\n const obj: Record = {};\r\n obj.$refText = reference.$refText;\r\n if (reference.$refNode) {\r\n obj.$refNode = context.cstNodes.get(reference.$refNode);\r\n }\r\n return obj;\r\n }\r\n\r\n protected dehydrateCstNode(node: CstNode, context: DehydrateContext): any {\r\n const cstNode = context.cstNodes.get(node) as Record;\r\n if (isRootCstNode(node)) {\r\n cstNode.fullText = node.fullText;\r\n } else {\r\n // Note: This returns undefined for hidden nodes (i.e. comments)\r\n cstNode.grammarSource = this.getGrammarElementId(node.grammarSource);\r\n }\r\n cstNode.hidden = node.hidden;\r\n cstNode.astNode = context.astNodes.get(node.astNode);\r\n if (isCompositeCstNode(node)) {\r\n cstNode.content = node.content.map(child => this.dehydrateCstNode(child, context));\r\n } else if (isLeafCstNode(node)) {\r\n cstNode.tokenType = node.tokenType.name;\r\n cstNode.offset = node.offset;\r\n cstNode.length = node.length;\r\n cstNode.startLine = node.range.start.line;\r\n cstNode.startColumn = node.range.start.character;\r\n cstNode.endLine = node.range.end.line;\r\n cstNode.endColumn = node.range.end.character;\r\n }\r\n return cstNode;\r\n }\r\n\r\n hydrate(result: ParseResult): ParseResult {\r\n const node = result.value;\r\n const context = this.createHydrationContext(node);\r\n if ('$cstNode' in node) {\r\n this.hydrateCstNode(node.$cstNode, context);\r\n }\r\n return {\r\n lexerErrors: result.lexerErrors,\r\n lexerReport: result.lexerReport,\r\n parserErrors: result.parserErrors,\r\n value: this.hydrateAstNode(node, context) as T\r\n };\r\n }\r\n\r\n protected createHydrationContext(node: any): HydrateContext {\r\n const astNodes = new Map();\r\n const cstNodes = new Map();\r\n for (const astNode of streamAst(node)) {\r\n astNodes.set(astNode, {} as AstNode);\r\n }\r\n let root: RootCstNode;\r\n if (node.$cstNode) {\r\n for (const cstNode of streamCst(node.$cstNode)) {\r\n let cst: Mutable | undefined;\r\n if ('fullText' in cstNode) {\r\n cst = new RootCstNodeImpl(cstNode.fullText as string);\r\n root = cst as RootCstNode;\r\n } else if ('content' in cstNode) {\r\n cst = new CompositeCstNodeImpl();\r\n } else if ('tokenType' in cstNode) {\r\n cst = this.hydrateCstLeafNode(cstNode);\r\n }\r\n if (cst) {\r\n cstNodes.set(cstNode, cst);\r\n cst.root = root!;\r\n }\r\n }\r\n }\r\n return {\r\n astNodes,\r\n cstNodes\r\n };\r\n }\r\n\r\n protected hydrateAstNode(node: any, context: HydrateContext): AstNode {\r\n const astNode = context.astNodes.get(node) as Mutable;\r\n astNode.$type = node.$type;\r\n astNode.$containerIndex = node.$containerIndex;\r\n astNode.$containerProperty = node.$containerProperty;\r\n if (node.$cstNode) {\r\n astNode.$cstNode = context.cstNodes.get(node.$cstNode);\r\n }\r\n for (const [name, value] of Object.entries(node)) {\r\n if (name.startsWith('$')) {\r\n continue;\r\n }\r\n if (Array.isArray(value)) {\r\n const arr: unknown[] = [];\r\n astNode[name] = arr;\r\n for (const item of value) {\r\n if (isAstNode(item)) {\r\n arr.push(this.setParent(this.hydrateAstNode(item, context), astNode));\r\n } else if (isReference(item)) {\r\n arr.push(this.hydrateReference(item, astNode, name, context));\r\n } else {\r\n arr.push(item);\r\n }\r\n }\r\n } else if (isAstNode(value)) {\r\n astNode[name] = this.setParent(this.hydrateAstNode(value, context), astNode);\r\n } else if (isReference(value)) {\r\n astNode[name] = this.hydrateReference(value, astNode, name, context);\r\n } else if (value !== undefined) {\r\n astNode[name] = value;\r\n }\r\n }\r\n return astNode;\r\n }\r\n\r\n protected setParent(node: any, parent: any): any {\r\n node.$container = parent as AstNode;\r\n return node;\r\n }\r\n\r\n protected hydrateReference(reference: any, node: AstNode, name: string, context: HydrateContext): Reference {\r\n return this.linker.buildReference(node, name, context.cstNodes.get(reference.$refNode)!, reference.$refText);\r\n }\r\n\r\n protected hydrateCstNode(cstNode: any, context: HydrateContext, num = 0): CstNode {\r\n const cstNodeObj = context.cstNodes.get(cstNode) as Mutable;\r\n if (typeof cstNode.grammarSource === 'number') {\r\n cstNodeObj.grammarSource = this.getGrammarElement(cstNode.grammarSource);\r\n }\r\n cstNodeObj.astNode = context.astNodes.get(cstNode.astNode)!;\r\n if (isCompositeCstNode(cstNodeObj)) {\r\n for (const child of cstNode.content) {\r\n const hydrated = this.hydrateCstNode(child, context, num++);\r\n cstNodeObj.content.push(hydrated);\r\n }\r\n }\r\n return cstNodeObj;\r\n }\r\n\r\n protected hydrateCstLeafNode(cstNode: any): LeafCstNode {\r\n const tokenType = this.getTokenType(cstNode.tokenType);\r\n const offset = cstNode.offset;\r\n const length = cstNode.length;\r\n const startLine = cstNode.startLine;\r\n const startColumn = cstNode.startColumn;\r\n const endLine = cstNode.endLine;\r\n const endColumn = cstNode.endColumn;\r\n const hidden = cstNode.hidden;\r\n const node = new LeafCstNodeImpl(\r\n offset,\r\n length,\r\n {\r\n start: {\r\n line: startLine,\r\n character: startColumn\r\n },\r\n end: {\r\n line: endLine,\r\n character: endColumn\r\n }\r\n },\r\n tokenType,\r\n hidden\r\n );\r\n return node;\r\n }\r\n\r\n protected getTokenType(name: string): TokenType {\r\n return this.lexer.definition[name];\r\n }\r\n\r\n protected getGrammarElementId(node: AbstractElement | undefined): number | undefined {\r\n if (!node) {\r\n return undefined;\r\n }\r\n if (this.grammarElementIdMap.size === 0) {\r\n this.createGrammarElementIdMap();\r\n }\r\n return this.grammarElementIdMap.get(node);\r\n }\r\n\r\n protected getGrammarElement(id: number): AbstractElement | undefined {\r\n if (this.grammarElementIdMap.size === 0) {\r\n this.createGrammarElementIdMap();\r\n }\r\n const element = this.grammarElementIdMap.getKey(id);\r\n return element;\r\n }\r\n\r\n protected createGrammarElementIdMap(): void {\r\n let id = 0;\r\n for (const element of streamAst(this.grammar)) {\r\n if (isAbstractElement(element)) {\r\n this.grammarElementIdMap.set(element, id++);\r\n }\r\n }\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n******************************************************************************/\r\n\r\nimport type { Module } from './dependency-injection.js';\r\nimport type { LangiumDefaultCoreServices, LangiumDefaultSharedCoreServices, LangiumCoreServices, LangiumSharedCoreServices } from './services.js';\r\nimport type { FileSystemProvider } from './workspace/file-system-provider.js';\r\nimport { createGrammarConfig } from './languages/grammar-config.js';\r\nimport { createCompletionParser } from './parser/completion-parser-builder.js';\r\nimport { createLangiumParser } from './parser/langium-parser-builder.js';\r\nimport { DefaultTokenBuilder } from './parser/token-builder.js';\r\nimport { DefaultValueConverter } from './parser/value-converter.js';\r\nimport { DefaultLinker } from './references/linker.js';\r\nimport { DefaultNameProvider } from './references/name-provider.js';\r\nimport { DefaultReferences } from './references/references.js';\r\nimport { DefaultScopeComputation } from './references/scope-computation.js';\r\nimport { DefaultScopeProvider } from './references/scope-provider.js';\r\nimport { DefaultJsonSerializer } from './serializer/json-serializer.js';\r\nimport { DefaultServiceRegistry } from './service-registry.js';\r\nimport { DefaultDocumentValidator } from './validation/document-validator.js';\r\nimport { ValidationRegistry } from './validation/validation-registry.js';\r\nimport { DefaultAstNodeDescriptionProvider, DefaultReferenceDescriptionProvider } from './workspace/ast-descriptions.js';\r\nimport { DefaultAstNodeLocator } from './workspace/ast-node-locator.js';\r\nimport { DefaultConfigurationProvider } from './workspace/configuration.js';\r\nimport { DefaultDocumentBuilder } from './workspace/document-builder.js';\r\nimport { DefaultLangiumDocumentFactory, DefaultLangiumDocuments } from './workspace/documents.js';\r\nimport { DefaultIndexManager } from './workspace/index-manager.js';\r\nimport { DefaultWorkspaceManager } from './workspace/workspace-manager.js';\r\nimport { DefaultLexer, DefaultLexerErrorMessageProvider } from './parser/lexer.js';\r\nimport { JSDocDocumentationProvider } from './documentation/documentation-provider.js';\r\nimport { DefaultCommentProvider } from './documentation/comment-provider.js';\r\nimport { LangiumParserErrorMessageProvider } from './parser/langium-parser.js';\r\nimport { DefaultAsyncParser } from './parser/async-parser.js';\r\nimport { DefaultWorkspaceLock } from './workspace/workspace-lock.js';\r\nimport { DefaultHydrator } from './serializer/hydrator.js';\r\n\r\n/**\r\n * Context required for creating the default language-specific dependency injection module.\r\n */\r\nexport interface DefaultCoreModuleContext {\r\n shared: LangiumSharedCoreServices;\r\n}\r\n\r\n/**\r\n * Creates a dependency injection module configuring the default core services.\r\n * This is a set of services that are dedicated to a specific language.\r\n */\r\nexport function createDefaultCoreModule(context: DefaultCoreModuleContext): Module {\r\n return {\r\n documentation: {\r\n CommentProvider: (services) => new DefaultCommentProvider(services),\r\n DocumentationProvider: (services) => new JSDocDocumentationProvider(services)\r\n },\r\n parser: {\r\n AsyncParser: (services) => new DefaultAsyncParser(services),\r\n GrammarConfig: (services) => createGrammarConfig(services),\r\n LangiumParser: (services) => createLangiumParser(services),\r\n CompletionParser: (services) => createCompletionParser(services),\r\n ValueConverter: () => new DefaultValueConverter(),\r\n TokenBuilder: () => new DefaultTokenBuilder(),\r\n Lexer: (services) => new DefaultLexer(services),\r\n ParserErrorMessageProvider: () => new LangiumParserErrorMessageProvider(),\r\n LexerErrorMessageProvider: () => new DefaultLexerErrorMessageProvider()\r\n },\r\n workspace: {\r\n AstNodeLocator: () => new DefaultAstNodeLocator(),\r\n AstNodeDescriptionProvider: (services) => new DefaultAstNodeDescriptionProvider(services),\r\n ReferenceDescriptionProvider: (services) => new DefaultReferenceDescriptionProvider(services)\r\n },\r\n references: {\r\n Linker: (services) => new DefaultLinker(services),\r\n NameProvider: () => new DefaultNameProvider(),\r\n ScopeProvider: (services) => new DefaultScopeProvider(services),\r\n ScopeComputation: (services) => new DefaultScopeComputation(services),\r\n References: (services) => new DefaultReferences(services)\r\n },\r\n serializer: {\r\n Hydrator: (services) => new DefaultHydrator(services),\r\n JsonSerializer: (services) => new DefaultJsonSerializer(services)\r\n },\r\n validation: {\r\n DocumentValidator: (services) => new DefaultDocumentValidator(services),\r\n ValidationRegistry: (services) => new ValidationRegistry(services)\r\n },\r\n shared: () => context.shared\r\n };\r\n}\r\n\r\n/**\r\n * Context required for creating the default shared dependency injection module.\r\n */\r\nexport interface DefaultSharedCoreModuleContext {\r\n /**\r\n * Factory function to create a {@link FileSystemProvider}.\r\n *\r\n * Langium exposes an `EmptyFileSystem` and `NodeFileSystem`, exported through `langium/node`.\r\n * When running Langium as part of a vscode language server or a Node.js app, using the `NodeFileSystem` is recommended,\r\n * the `EmptyFileSystem` in every other use case.\r\n */\r\n fileSystemProvider: (services: LangiumSharedCoreServices) => FileSystemProvider;\r\n}\r\n\r\n/**\r\n * Creates a dependency injection module configuring the default shared core services.\r\n * This is the set of services that are shared between multiple languages.\r\n */\r\nexport function createDefaultSharedCoreModule(context: DefaultSharedCoreModuleContext): Module {\r\n return {\r\n ServiceRegistry: (services) => new DefaultServiceRegistry(services),\r\n workspace: {\r\n LangiumDocuments: (services) => new DefaultLangiumDocuments(services),\r\n LangiumDocumentFactory: (services) => new DefaultLangiumDocumentFactory(services),\r\n DocumentBuilder: (services) => new DefaultDocumentBuilder(services),\r\n IndexManager: (services) => new DefaultIndexManager(services),\r\n WorkspaceManager: (services) => new DefaultWorkspaceManager(services),\r\n FileSystemProvider: (services) => context.fileSystemProvider(services),\r\n WorkspaceLock: () => new DefaultWorkspaceLock(),\r\n ConfigurationProvider: (services) => new DefaultConfigurationProvider(services)\r\n }\r\n };\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * A `Module` is a description of possibly grouped service factories.\r\n *\r\n * Given a type I = { group: { service: A } },\r\n * Module := { group: { service: (injector: I) => A } }\r\n *\r\n * Making `I` available during the creation of `I` allows us to create cyclic\r\n * dependencies.\r\n */\r\nexport type Module = {\r\n [K in keyof T]: Module | ((injector: I) => T[K])\r\n}\r\n\r\nexport namespace Module {\r\n export const merge = (m1: Module, m2: Module) => (_merge(_merge({}, m1), m2) as Module);\r\n}\r\n\r\n/**\r\n * Given a set of modules, the inject function returns a lazily evaluated injector\r\n * that injects dependencies into the requested service when it is requested the\r\n * first time. Subsequent requests will return the same service.\r\n *\r\n * In the case of cyclic dependencies, an Error will be thrown. This can be fixed\r\n * by injecting a provider `() => T` instead of a `T`.\r\n *\r\n * Please note that the arguments may be objects or arrays. However, the result will\r\n * be an object. Using it with for..of will have no effect.\r\n *\r\n * @param module1 first Module\r\n * @param module2 (optional) second Module\r\n * @param module3 (optional) third Module\r\n * @param module4 (optional) fourth Module\r\n * @param module5 (optional) fifth Module\r\n * @param module6 (optional) sixth Module\r\n * @param module7 (optional) seventh Module\r\n * @param module8 (optional) eighth Module\r\n * @param module9 (optional) ninth Module\r\n * @returns a new object of type I\r\n */\r\nexport function inject(\r\n module1: Module, module2?: Module, module3?: Module, module4?: Module, module5?: Module, module6?: Module, module7?: Module, module8?: Module, module9?: Module\r\n): I {\r\n const module = [module1, module2, module3, module4, module5, module6, module7, module8, module9].reduce(_merge, {}) as Module;\r\n return _inject(module);\r\n}\r\n\r\nconst isProxy = Symbol('isProxy');\r\n\r\n/**\r\n * Eagerly load all services in the given dependency injection container. This is sometimes\r\n * necessary because services can register event listeners in their constructors.\r\n */\r\nexport function eagerLoad(item: T): T {\r\n if (item && (item as any)[isProxy]) {\r\n for (const value of Object.values(item)) {\r\n eagerLoad(value);\r\n }\r\n }\r\n return item;\r\n}\r\n\r\n/**\r\n * Helper function that returns an injector by creating a proxy.\r\n * Invariant: injector is of type I. If injector is undefined, then T = I.\r\n */\r\nfunction _inject(module: Module, injector?: any): T {\r\n const proxy: any = new Proxy({} as any, {\r\n deleteProperty: () => false,\r\n set: () => {\r\n throw new Error('Cannot set property on injected service container');\r\n },\r\n get: (obj, prop) => {\r\n if (prop === isProxy) {\r\n return true;\r\n } else {\r\n return _resolve(obj, prop, module, injector || proxy);\r\n }\r\n },\r\n getOwnPropertyDescriptor: (obj, prop) => (_resolve(obj, prop, module, injector || proxy), Object.getOwnPropertyDescriptor(obj, prop)), // used by for..in\r\n has: (_, prop) => prop in module, // used by ..in..\r\n ownKeys: () => [...Object.getOwnPropertyNames(module)] // used by for..in\r\n });\r\n return proxy;\r\n}\r\n\r\n/**\r\n * Internally used to tag a requested dependency, directly before calling the factory.\r\n * This allows us to find cycles during instance creation.\r\n */\r\nconst __requested__ = Symbol();\r\n\r\n/**\r\n * Returns the value `obj[prop]`. If the value does not exist, yet, it is resolved from\r\n * the module description. The result of service factories is cached. Groups are\r\n * recursively proxied.\r\n *\r\n * @param obj an object holding all group proxies and services\r\n * @param prop the key of a value within obj\r\n * @param module an object containing groups and service factories\r\n * @param injector the first level proxy that provides access to all values\r\n * @returns the requested value `obj[prop]`\r\n * @throws Error if a dependency cycle is detected\r\n */\r\nfunction _resolve(obj: any, prop: string | symbol | number, module: Module, injector: I): T[keyof T] | undefined {\r\n if (prop in obj) {\r\n if (obj[prop] instanceof Error) {\r\n throw new Error('Construction failure. Please make sure that your dependencies are constructable.', {cause: obj[prop]});\r\n }\r\n if (obj[prop] === __requested__) {\r\n throw new Error('Cycle detected. Please make \"' + String(prop) + '\" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');\r\n }\r\n return obj[prop];\r\n } else if (prop in module) {\r\n const value: Module | ((injector: I) => T[keyof T]) = module[prop as keyof T];\r\n obj[prop] = __requested__;\r\n try {\r\n obj[prop] = (typeof value === 'function') ? value(injector) : _inject(value, injector);\r\n } catch (error) {\r\n obj[prop] = error instanceof Error ? error : undefined;\r\n throw error;\r\n }\r\n return obj[prop];\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Performs a deep-merge of two modules by writing source entries into the target module.\r\n *\r\n * @param target the module which is written\r\n * @param source the module which is read\r\n * @returns the target module\r\n */\r\nfunction _merge(target: Module, source?: Module): Module {\r\n if (source) {\r\n for (const [key, value2] of Object.entries(source)) {\r\n if (value2 !== undefined) {\r\n const value1 = target[key];\r\n if (value1 !== null && value2 !== null && typeof value1 === 'object' && typeof value2 === 'object') {\r\n target[key] = _merge(value1, value2);\r\n } else {\r\n target[key] = value2;\r\n }\r\n }\r\n }\r\n }\r\n return target;\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2024 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { CustomPatternMatcherFunc, TokenType, IToken, IMultiModeLexerDefinition, TokenVocabulary } from 'chevrotain';\r\nimport type { Grammar, TerminalRule } from '../languages/generated/ast.js';\r\nimport type { LexingReport, TokenBuilderOptions } from './token-builder.js';\r\nimport type { LexerResult, TokenizeOptions } from './lexer.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport { createToken, createTokenInstance, Lexer } from 'chevrotain';\r\nimport { DefaultTokenBuilder } from './token-builder.js';\r\nimport { DEFAULT_TOKENIZE_OPTIONS, DefaultLexer, isTokenTypeArray } from './lexer.js';\r\n\r\ntype IndentationAwareDelimiter = [begin: TokenName, end: TokenName];\r\n\r\nexport interface IndentationTokenBuilderOptions {\r\n /**\r\n * The name of the token used to denote indentation in the grammar.\r\n * A possible definition in the grammar could look like this:\r\n * ```langium\r\n * terminal INDENT: ':synthetic-indent:';\r\n * ```\r\n *\r\n * @default 'INDENT'\r\n */\r\n indentTokenName: TerminalName;\r\n /**\r\n * The name of the token used to denote deindentation in the grammar.\r\n * A possible definition in the grammar could look like this:\r\n * ```langium\r\n * terminal DEDENT: ':synthetic-dedent:';\r\n * ```\r\n *\r\n * @default 'DEDENT'\r\n */\r\n dedentTokenName: TerminalName;\r\n /**\r\n * The name of the token used to denote whitespace other than indentation and newlines in the grammar.\r\n * A possible definition in the grammar could look like this:\r\n * ```langium\r\n * hidden terminal WS: /[ \\t]+/;\r\n * ```\r\n *\r\n * @default 'WS'\r\n */\r\n whitespaceTokenName: TerminalName;\r\n /**\r\n * The delimiter tokens inside of which indentation should be ignored and treated as normal whitespace.\r\n * For example, Python doesn't treat any whitespace between `(` and `)` as significant.\r\n *\r\n * Can be either terminal tokens or keyword tokens.\r\n *\r\n * @default []\r\n */\r\n ignoreIndentationDelimiters: Array>\r\n}\r\n\r\nexport const indentationBuilderDefaultOptions: IndentationTokenBuilderOptions = {\r\n indentTokenName: 'INDENT',\r\n dedentTokenName: 'DEDENT',\r\n whitespaceTokenName: 'WS',\r\n ignoreIndentationDelimiters: [],\r\n};\r\n\r\nexport enum LexingMode {\r\n REGULAR = 'indentation-sensitive',\r\n IGNORE_INDENTATION = 'ignore-indentation',\r\n}\r\n\r\nexport interface IndentationLexingReport extends LexingReport {\r\n /** Dedent tokens that are necessary to close the remaining indents. */\r\n remainingDedents: IToken[];\r\n}\r\n\r\n/**\r\n * A token builder that is sensitive to indentation in the input text.\r\n * It will generate tokens for indentation and dedentation based on the indentation level.\r\n *\r\n * The first generic parameter corresponds to the names of terminal tokens,\r\n * while the second one corresponds to the names of keyword tokens.\r\n * Both parameters are optional and can be imported from `./generated/ast.js`.\r\n *\r\n * Inspired by https://github.com/chevrotain/chevrotain/blob/master/examples/lexer/python_indentation/python_indentation.js\r\n */\r\nexport class IndentationAwareTokenBuilder extends DefaultTokenBuilder {\r\n /**\r\n * The stack stores all the previously matched indentation levels to understand how deeply the next tokens are nested.\r\n * The stack is valid for lexing\r\n */\r\n protected indentationStack: number[] = [0];\r\n\r\n readonly options: IndentationTokenBuilderOptions;\r\n\r\n /**\r\n * The token type to be used for indentation tokens\r\n */\r\n readonly indentTokenType: TokenType;\r\n\r\n /**\r\n * The token type to be used for dedentation tokens\r\n */\r\n readonly dedentTokenType: TokenType;\r\n\r\n /**\r\n * A regular expression to match a series of tabs and/or spaces.\r\n * Override this to customize what the indentation is allowed to consist of.\r\n */\r\n protected whitespaceRegExp = /[ \\t]+/y;\r\n\r\n constructor(options: Partial, NoInfer>> = indentationBuilderDefaultOptions as IndentationTokenBuilderOptions) {\r\n super();\r\n this.options = {\r\n ...indentationBuilderDefaultOptions as IndentationTokenBuilderOptions,\r\n ...options,\r\n };\r\n\r\n this.indentTokenType = createToken({\r\n name: this.options.indentTokenName,\r\n pattern: this.indentMatcher.bind(this),\r\n line_breaks: false,\r\n });\r\n\r\n this.dedentTokenType = createToken({\r\n name: this.options.dedentTokenName,\r\n pattern: this.dedentMatcher.bind(this),\r\n line_breaks: false,\r\n });\r\n }\r\n\r\n override buildTokens(grammar: Grammar, options?: TokenBuilderOptions | undefined): TokenVocabulary {\r\n const tokenTypes = super.buildTokens(grammar, options);\r\n if (!isTokenTypeArray(tokenTypes)) {\r\n throw new Error('Invalid tokens built by default builder');\r\n }\r\n\r\n const { indentTokenName, dedentTokenName, whitespaceTokenName, ignoreIndentationDelimiters } = this.options;\r\n\r\n // Rearrange tokens because whitespace (which is ignored) goes to the beginning by default, consuming indentation as well\r\n // Order should be: dedent, indent, spaces\r\n let dedent: TokenType | undefined;\r\n let indent: TokenType | undefined;\r\n let ws: TokenType | undefined;\r\n const otherTokens: TokenType[] = [];\r\n for (const tokenType of tokenTypes) {\r\n for (const [begin, end] of ignoreIndentationDelimiters) {\r\n if (tokenType.name === begin) {\r\n tokenType.PUSH_MODE = LexingMode.IGNORE_INDENTATION;\r\n } else if (tokenType.name === end) {\r\n tokenType.POP_MODE = true;\r\n }\r\n }\r\n if (tokenType.name === dedentTokenName) {\r\n dedent = tokenType;\r\n } else if (tokenType.name === indentTokenName) {\r\n indent = tokenType;\r\n } else if (tokenType.name === whitespaceTokenName) {\r\n ws = tokenType;\r\n } else {\r\n otherTokens.push(tokenType);\r\n }\r\n }\r\n if (!dedent || !indent || !ws) {\r\n throw new Error('Some indentation/whitespace tokens not found!');\r\n }\r\n\r\n if (ignoreIndentationDelimiters.length > 0) {\r\n const multiModeLexerDef: IMultiModeLexerDefinition = {\r\n modes: {\r\n [LexingMode.REGULAR]: [dedent, indent, ...otherTokens, ws],\r\n [LexingMode.IGNORE_INDENTATION]: [...otherTokens, ws],\r\n },\r\n defaultMode: LexingMode.REGULAR,\r\n };\r\n return multiModeLexerDef;\r\n } else {\r\n return [dedent, indent, ws, ...otherTokens];\r\n }\r\n }\r\n\r\n override flushLexingReport(text: string): IndentationLexingReport {\r\n const result = super.flushLexingReport(text);\r\n return {\r\n ...result,\r\n remainingDedents: this.flushRemainingDedents(text),\r\n };\r\n }\r\n\r\n /**\r\n * Helper function to check if the current position is the start of a new line.\r\n *\r\n * @param text The full input string.\r\n * @param offset The current position at which to check\r\n * @returns Whether the current position is the start of a new line\r\n */\r\n protected isStartOfLine(text: string, offset: number): boolean {\r\n return offset === 0 || '\\r\\n'.includes(text[offset - 1]);\r\n }\r\n\r\n /**\r\n * A helper function used in matching both indents and dedents.\r\n *\r\n * @param text The full input string.\r\n * @param offset The current position at which to attempt a match\r\n * @param tokens Previously scanned tokens\r\n * @param groups Token Groups\r\n * @returns The current and previous indentation levels and the matched whitespace\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected matchWhitespace(text: string, offset: number, tokens: IToken[], groups: Record): { currIndentLevel: number, prevIndentLevel: number, match: RegExpExecArray | null } {\r\n this.whitespaceRegExp.lastIndex = offset;\r\n const match = this.whitespaceRegExp.exec(text);\r\n return {\r\n currIndentLevel: match?.[0].length ?? 0,\r\n prevIndentLevel: this.indentationStack.at(-1)!,\r\n match,\r\n };\r\n }\r\n\r\n /**\r\n * Helper function to create an instance of an indentation token.\r\n *\r\n * @param tokenType Indent or dedent token type\r\n * @param text Full input string, used to calculate the line number\r\n * @param image The original image of the token (tabs or spaces)\r\n * @param offset Current position in the input string\r\n * @returns The indentation token instance\r\n */\r\n protected createIndentationTokenInstance(tokenType: TokenType, text: string, image: string, offset: number): IToken {\r\n const lineNumber = this.getLineNumber(text, offset);\r\n return createTokenInstance(\r\n tokenType,\r\n image,\r\n offset, offset + image.length,\r\n lineNumber, lineNumber,\r\n 1, image.length,\r\n );\r\n }\r\n\r\n /**\r\n * Helper function to get the line number at a given offset.\r\n *\r\n * @param text Full input string, used to calculate the line number\r\n * @param offset Current position in the input string\r\n * @returns The line number at the given offset\r\n */\r\n protected getLineNumber(text: string, offset: number): number {\r\n return text.substring(0, offset).split(/\\r\\n|\\r|\\n/).length;\r\n }\r\n\r\n /**\r\n * A custom pattern for matching indents\r\n *\r\n * @param text The full input string.\r\n * @param offset The offset at which to attempt a match\r\n * @param tokens Previously scanned tokens\r\n * @param groups Token Groups\r\n */\r\n protected indentMatcher(text: string, offset: number, tokens: IToken[], groups: Record): ReturnType {\r\n if (!this.isStartOfLine(text, offset)) {\r\n return null;\r\n }\r\n\r\n const { currIndentLevel, prevIndentLevel, match } = this.matchWhitespace(text, offset, tokens, groups);\r\n\r\n if (currIndentLevel <= prevIndentLevel) {\r\n // shallower indentation (should be matched by dedent)\r\n // or same indentation level (should be matched by whitespace and ignored)\r\n return null;\r\n }\r\n\r\n this.indentationStack.push(currIndentLevel);\r\n\r\n return match;\r\n }\r\n\r\n /**\r\n * A custom pattern for matching dedents\r\n *\r\n * @param text The full input string.\r\n * @param offset The offset at which to attempt a match\r\n * @param tokens Previously scanned tokens\r\n * @param groups Token Groups\r\n */\r\n protected dedentMatcher(text: string, offset: number, tokens: IToken[], groups: Record): ReturnType {\r\n if (!this.isStartOfLine(text, offset)) {\r\n return null;\r\n }\r\n\r\n const { currIndentLevel, prevIndentLevel, match } = this.matchWhitespace(text, offset, tokens, groups);\r\n\r\n if (currIndentLevel >= prevIndentLevel) {\r\n // bigger indentation (should be matched by indent)\r\n // or same indentation level (should be matched by whitespace and ignored)\r\n return null;\r\n }\r\n\r\n const matchIndentIndex = this.indentationStack.lastIndexOf(currIndentLevel);\r\n\r\n // Any dedent must match some previous indentation level.\r\n if (matchIndentIndex === -1) {\r\n this.diagnostics.push({\r\n severity: 'error',\r\n message: `Invalid dedent level ${currIndentLevel} at offset: ${offset}. Current indentation stack: ${this.indentationStack}`,\r\n offset,\r\n length: match?.[0]?.length ?? 0,\r\n line: this.getLineNumber(text, offset),\r\n column: 1\r\n });\r\n return null;\r\n }\r\n\r\n const numberOfDedents = this.indentationStack.length - matchIndentIndex - 1;\r\n const newlinesBeforeDedent = text.substring(0, offset).match(/[\\r\\n]+$/)?.[0].length ?? 1;\r\n\r\n for (let i = 0; i < numberOfDedents; i++) {\r\n const token = this.createIndentationTokenInstance(\r\n this.dedentTokenType,\r\n text,\r\n '', // Dedents are 0-width tokens\r\n offset - (newlinesBeforeDedent - 1), // Place the dedent after the first new line character\r\n );\r\n tokens.push(token);\r\n this.indentationStack.pop();\r\n }\r\n\r\n // Token already added, let the dedentation now be consumed as whitespace (if any) and ignored\r\n return null;\r\n }\r\n\r\n protected override buildTerminalToken(terminal: TerminalRule): TokenType {\r\n const tokenType = super.buildTerminalToken(terminal);\r\n const { indentTokenName, dedentTokenName, whitespaceTokenName } = this.options;\r\n\r\n if (tokenType.name === indentTokenName) {\r\n return this.indentTokenType;\r\n } else if (tokenType.name === dedentTokenName) {\r\n return this.dedentTokenType;\r\n } else if (tokenType.name === whitespaceTokenName) {\r\n return createToken({\r\n name: whitespaceTokenName,\r\n pattern: this.whitespaceRegExp,\r\n group: Lexer.SKIPPED,\r\n });\r\n }\r\n return tokenType;\r\n }\r\n\r\n /**\r\n * Resets the indentation stack between different runs of the lexer\r\n *\r\n * @param text Full text that was tokenized\r\n * @returns Remaining dedent tokens to match all previous indents at the end of the file\r\n */\r\n flushRemainingDedents(text: string): IToken[] {\r\n const remainingDedents: IToken[] = [];\r\n while (this.indentationStack.length > 1) {\r\n remainingDedents.push(\r\n this.createIndentationTokenInstance(this.dedentTokenType, text, '', text.length)\r\n );\r\n this.indentationStack.pop();\r\n }\r\n\r\n this.indentationStack = [0];\r\n return remainingDedents;\r\n }\r\n}\r\n\r\n/**\r\n * A lexer that is aware of indentation in the input text.\r\n * The only purpose of this lexer is to reset the internal state of the {@link IndentationAwareTokenBuilder}\r\n * between the tokenization of different text inputs.\r\n *\r\n * In your module, you can override the default lexer with this one as such:\r\n * ```ts\r\n * parser: {\r\n * TokenBuilder: () => new IndentationAwareTokenBuilder(),\r\n * Lexer: (services) => new IndentationAwareLexer(services),\r\n * }\r\n * ```\r\n */\r\nexport class IndentationAwareLexer extends DefaultLexer {\r\n\r\n protected readonly indentationTokenBuilder: IndentationAwareTokenBuilder;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n super(services);\r\n if (services.parser.TokenBuilder instanceof IndentationAwareTokenBuilder) {\r\n this.indentationTokenBuilder = services.parser.TokenBuilder;\r\n } else {\r\n throw new Error('IndentationAwareLexer requires an accompanying IndentationAwareTokenBuilder');\r\n }\r\n }\r\n\r\n override tokenize(text: string, options: TokenizeOptions = DEFAULT_TOKENIZE_OPTIONS): LexerResult {\r\n const result = super.tokenize(text);\r\n\r\n // consuming all remaining dedents and remove them as they might not be serializable\r\n const report = result.report as IndentationLexingReport;\r\n if (options?.mode === 'full') {\r\n // auto-complete document with remaining dedents\r\n result.tokens.push(...report.remainingDedents);\r\n }\r\n report.remainingDedents = [];\r\n\r\n // remove any \"indent-dedent\" pair with an empty body as these are typically\r\n // added by comments or lines with just whitespace but have no real value\r\n const { indentTokenType, dedentTokenType } = this.indentationTokenBuilder;\r\n // Use tokenTypeIdx for fast comparison\r\n const indentTokenIdx = indentTokenType.tokenTypeIdx;\r\n const dedentTokenIdx = dedentTokenType.tokenTypeIdx;\r\n const cleanTokens: IToken[] = [];\r\n const length = result.tokens.length - 1;\r\n for (let i = 0; i < length; i++) {\r\n const token = result.tokens[i];\r\n const nextToken = result.tokens[i + 1];\r\n if (token.tokenTypeIdx === indentTokenIdx && nextToken.tokenTypeIdx === dedentTokenIdx) {\r\n i++;\r\n continue;\r\n }\r\n\r\n cleanTokens.push(token);\r\n }\r\n // Push last token separately\r\n if (length >= 0) {\r\n cleanTokens.push(result.tokens[length]);\r\n }\r\n result.tokens = cleanTokens;\r\n\r\n return result;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nexport * from './caching.js';\r\nexport * from './event.js';\r\nexport * from './collections.js';\r\nexport * from './disposable.js';\r\nexport * from './errors.js';\r\nexport * from './grammar-loader.js';\r\nexport * from './promise-utils.js';\r\nexport * from './stream.js';\r\nexport * from './uri-utils.js';\r\n\r\nimport * as AstUtils from './ast-utils.js';\r\nimport * as Cancellation from './cancellation.js';\r\nimport * as CstUtils from './cst-utils.js';\r\nimport * as GrammarUtils from './grammar-utils.js';\r\nimport * as RegExpUtils from './regexp-utils.js';\r\nexport { AstUtils, Cancellation, CstUtils, GrammarUtils, RegExpUtils };\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { URI } from '../utils/uri-utils.js';\r\n\r\nexport interface FileSystemNode {\r\n readonly isFile: boolean;\r\n readonly isDirectory: boolean;\r\n readonly uri: URI;\r\n}\r\n\r\nexport type FileSystemFilter = (node: FileSystemNode) => boolean;\r\n\r\n/**\r\n * Provides methods to interact with an abstract file system. The default implementation is based on the node.js `fs` API.\r\n */\r\nexport interface FileSystemProvider {\r\n /**\r\n * Reads a document asynchronously from a given URI.\r\n * @returns The string content of the file with the specified URI.\r\n */\r\n readFile(uri: URI): Promise;\r\n /**\r\n * Reads the directory information for the given URI.\r\n * @returns The list of file system entries that are contained within the specified directory.\r\n */\r\n readDirectory(uri: URI): Promise;\r\n}\r\n\r\nexport class EmptyFileSystemProvider implements FileSystemProvider {\r\n\r\n readFile(): Promise {\r\n throw new Error('No file system is available.');\r\n }\r\n\r\n async readDirectory(): Promise {\r\n return [];\r\n }\r\n\r\n}\r\n\r\nexport const EmptyFileSystem = {\r\n fileSystemProvider: () => new EmptyFileSystemProvider()\r\n};\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { createDefaultCoreModule, createDefaultSharedCoreModule } from '../default-module.js';\r\nimport type { Module } from '../dependency-injection.js';\r\nimport { inject } from '../dependency-injection.js';\r\nimport * as ast from '../languages/generated/ast.js';\r\nimport type { LangiumCoreServices, LangiumSharedCoreServices, PartialLangiumCoreServices, PartialLangiumSharedCoreServices } from '../services.js';\r\nimport type { Mutable } from '../syntax-tree.js';\r\nimport { EmptyFileSystem } from '../workspace/file-system-provider.js';\r\nimport { URI } from './uri-utils.js';\r\n\r\nconst minimalGrammarModule: Module = {\r\n Grammar: () => undefined as unknown as ast.Grammar,\r\n LanguageMetaData: () => ({\r\n caseInsensitive: false,\r\n fileExtensions: ['.langium'],\r\n languageId: 'langium'\r\n })\r\n};\r\n\r\nconst minimalSharedGrammarModule: Module = {\r\n AstReflection: () => new ast.LangiumGrammarAstReflection()\r\n};\r\n\r\nfunction createMinimalGrammarServices(): LangiumCoreServices {\r\n const shared = inject(\r\n createDefaultSharedCoreModule(EmptyFileSystem),\r\n minimalSharedGrammarModule\r\n );\r\n const grammar = inject(\r\n createDefaultCoreModule({ shared }),\r\n minimalGrammarModule\r\n );\r\n shared.ServiceRegistry.register(grammar);\r\n return grammar;\r\n}\r\n\r\n/**\r\n * Load a Langium grammar for your language from a JSON string. This is used by several services,\r\n * most notably the parser builder which interprets the grammar to create a parser.\r\n */\r\nexport function loadGrammarFromJson(json: string): ast.Grammar {\r\n const services = createMinimalGrammarServices();\r\n const astNode = services.serializer.JsonSerializer.deserialize(json) as Mutable;\r\n services.shared.workspace.LangiumDocumentFactory.fromModel(astNode, URI.parse(`memory://${astNode.name ?? 'grammar'}.langium`));\r\n return astNode;\r\n}\r\n", "var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/language/generated/ast.ts\nimport { AbstractAstReflection } from \"langium\";\nvar Statement = \"Statement\";\nvar Architecture = \"Architecture\";\nfunction isArchitecture(item) {\n return reflection.isInstance(item, Architecture);\n}\n__name(isArchitecture, \"isArchitecture\");\nvar Axis = \"Axis\";\nvar Branch = \"Branch\";\nfunction isBranch(item) {\n return reflection.isInstance(item, Branch);\n}\n__name(isBranch, \"isBranch\");\nvar Checkout = \"Checkout\";\nvar CherryPicking = \"CherryPicking\";\nvar ClassDefStatement = \"ClassDefStatement\";\nvar Commit = \"Commit\";\nfunction isCommit(item) {\n return reflection.isInstance(item, Commit);\n}\n__name(isCommit, \"isCommit\");\nvar Curve = \"Curve\";\nvar Edge = \"Edge\";\nvar Entry = \"Entry\";\nvar GitGraph = \"GitGraph\";\nfunction isGitGraph(item) {\n return reflection.isInstance(item, GitGraph);\n}\n__name(isGitGraph, \"isGitGraph\");\nvar Group = \"Group\";\nvar Info = \"Info\";\nfunction isInfo(item) {\n return reflection.isInstance(item, Info);\n}\n__name(isInfo, \"isInfo\");\nvar Item = \"Item\";\nvar Junction = \"Junction\";\nvar Merge = \"Merge\";\nfunction isMerge(item) {\n return reflection.isInstance(item, Merge);\n}\n__name(isMerge, \"isMerge\");\nvar Option = \"Option\";\nvar Packet = \"Packet\";\nfunction isPacket(item) {\n return reflection.isInstance(item, Packet);\n}\n__name(isPacket, \"isPacket\");\nvar PacketBlock = \"PacketBlock\";\nfunction isPacketBlock(item) {\n return reflection.isInstance(item, PacketBlock);\n}\n__name(isPacketBlock, \"isPacketBlock\");\nvar Pie = \"Pie\";\nfunction isPie(item) {\n return reflection.isInstance(item, Pie);\n}\n__name(isPie, \"isPie\");\nvar PieSection = \"PieSection\";\nfunction isPieSection(item) {\n return reflection.isInstance(item, PieSection);\n}\n__name(isPieSection, \"isPieSection\");\nvar Radar = \"Radar\";\nvar Service = \"Service\";\nvar Treemap = \"Treemap\";\nfunction isTreemap(item) {\n return reflection.isInstance(item, Treemap);\n}\n__name(isTreemap, \"isTreemap\");\nvar TreemapRow = \"TreemapRow\";\nvar Direction = \"Direction\";\nvar Leaf = \"Leaf\";\nvar Section = \"Section\";\nvar MermaidAstReflection = class extends AbstractAstReflection {\n static {\n __name(this, \"MermaidAstReflection\");\n }\n getAllTypes() {\n return [Architecture, Axis, Branch, Checkout, CherryPicking, ClassDefStatement, Commit, Curve, Direction, Edge, Entry, GitGraph, Group, Info, Item, Junction, Leaf, Merge, Option, Packet, PacketBlock, Pie, PieSection, Radar, Section, Service, Statement, Treemap, TreemapRow];\n }\n computeIsSubtype(subtype, supertype) {\n switch (subtype) {\n case Branch:\n case Checkout:\n case CherryPicking:\n case Commit:\n case Merge: {\n return this.isSubtype(Statement, supertype);\n }\n case Direction: {\n return this.isSubtype(GitGraph, supertype);\n }\n case Leaf:\n case Section: {\n return this.isSubtype(Item, supertype);\n }\n default: {\n return false;\n }\n }\n }\n getReferenceType(refInfo) {\n const referenceId = `${refInfo.container.$type}:${refInfo.property}`;\n switch (referenceId) {\n case \"Entry:axis\": {\n return Axis;\n }\n default: {\n throw new Error(`${referenceId} is not a valid reference id.`);\n }\n }\n }\n getTypeMetaData(type) {\n switch (type) {\n case Architecture: {\n return {\n name: Architecture,\n properties: [\n { name: \"accDescr\" },\n { name: \"accTitle\" },\n { name: \"edges\", defaultValue: [] },\n { name: \"groups\", defaultValue: [] },\n { name: \"junctions\", defaultValue: [] },\n { name: \"services\", defaultValue: [] },\n { name: \"title\" }\n ]\n };\n }\n case Axis: {\n return {\n name: Axis,\n properties: [\n { name: \"label\" },\n { name: \"name\" }\n ]\n };\n }\n case Branch: {\n return {\n name: Branch,\n properties: [\n { name: \"name\" },\n { name: \"order\" }\n ]\n };\n }\n case Checkout: {\n return {\n name: Checkout,\n properties: [\n { name: \"branch\" }\n ]\n };\n }\n case CherryPicking: {\n return {\n name: CherryPicking,\n properties: [\n { name: \"id\" },\n { name: \"parent\" },\n { name: \"tags\", defaultValue: [] }\n ]\n };\n }\n case ClassDefStatement: {\n return {\n name: ClassDefStatement,\n properties: [\n { name: \"className\" },\n { name: \"styleText\" }\n ]\n };\n }\n case Commit: {\n return {\n name: Commit,\n properties: [\n { name: \"id\" },\n { name: \"message\" },\n { name: \"tags\", defaultValue: [] },\n { name: \"type\" }\n ]\n };\n }\n case Curve: {\n return {\n name: Curve,\n properties: [\n { name: \"entries\", defaultValue: [] },\n { name: \"label\" },\n { name: \"name\" }\n ]\n };\n }\n case Edge: {\n return {\n name: Edge,\n properties: [\n { name: \"lhsDir\" },\n { name: \"lhsGroup\", defaultValue: false },\n { name: \"lhsId\" },\n { name: \"lhsInto\", defaultValue: false },\n { name: \"rhsDir\" },\n { name: \"rhsGroup\", defaultValue: false },\n { name: \"rhsId\" },\n { name: \"rhsInto\", defaultValue: false },\n { name: \"title\" }\n ]\n };\n }\n case Entry: {\n return {\n name: Entry,\n properties: [\n { name: \"axis\" },\n { name: \"value\" }\n ]\n };\n }\n case GitGraph: {\n return {\n name: GitGraph,\n properties: [\n { name: \"accDescr\" },\n { name: \"accTitle\" },\n { name: \"statements\", defaultValue: [] },\n { name: \"title\" }\n ]\n };\n }\n case Group: {\n return {\n name: Group,\n properties: [\n { name: \"icon\" },\n { name: \"id\" },\n { name: \"in\" },\n { name: \"title\" }\n ]\n };\n }\n case Info: {\n return {\n name: Info,\n properties: [\n { name: \"accDescr\" },\n { name: \"accTitle\" },\n { name: \"title\" }\n ]\n };\n }\n case Item: {\n return {\n name: Item,\n properties: [\n { name: \"classSelector\" },\n { name: \"name\" }\n ]\n };\n }\n case Junction: {\n return {\n name: Junction,\n properties: [\n { name: \"id\" },\n { name: \"in\" }\n ]\n };\n }\n case Merge: {\n return {\n name: Merge,\n properties: [\n { name: \"branch\" },\n { name: \"id\" },\n { name: \"tags\", defaultValue: [] },\n { name: \"type\" }\n ]\n };\n }\n case Option: {\n return {\n name: Option,\n properties: [\n { name: \"name\" },\n { name: \"value\", defaultValue: false }\n ]\n };\n }\n case Packet: {\n return {\n name: Packet,\n properties: [\n { name: \"accDescr\" },\n { name: \"accTitle\" },\n { name: \"blocks\", defaultValue: [] },\n { name: \"title\" }\n ]\n };\n }\n case PacketBlock: {\n return {\n name: PacketBlock,\n properties: [\n { name: \"bits\" },\n { name: \"end\" },\n { name: \"label\" },\n { name: \"start\" }\n ]\n };\n }\n case Pie: {\n return {\n name: Pie,\n properties: [\n { name: \"accDescr\" },\n { name: \"accTitle\" },\n { name: \"sections\", defaultValue: [] },\n { name: \"showData\", defaultValue: false },\n { name: \"title\" }\n ]\n };\n }\n case PieSection: {\n return {\n name: PieSection,\n properties: [\n { name: \"label\" },\n { name: \"value\" }\n ]\n };\n }\n case Radar: {\n return {\n name: Radar,\n properties: [\n { name: \"accDescr\" },\n { name: \"accTitle\" },\n { name: \"axes\", defaultValue: [] },\n { name: \"curves\", defaultValue: [] },\n { name: \"options\", defaultValue: [] },\n { name: \"title\" }\n ]\n };\n }\n case Service: {\n return {\n name: Service,\n properties: [\n { name: \"icon\" },\n { name: \"iconText\" },\n { name: \"id\" },\n { name: \"in\" },\n { name: \"title\" }\n ]\n };\n }\n case Treemap: {\n return {\n name: Treemap,\n properties: [\n { name: \"accDescr\" },\n { name: \"accTitle\" },\n { name: \"title\" },\n { name: \"TreemapRows\", defaultValue: [] }\n ]\n };\n }\n case TreemapRow: {\n return {\n name: TreemapRow,\n properties: [\n { name: \"indent\" },\n { name: \"item\" }\n ]\n };\n }\n case Direction: {\n return {\n name: Direction,\n properties: [\n { name: \"accDescr\" },\n { name: \"accTitle\" },\n { name: \"dir\" },\n { name: \"statements\", defaultValue: [] },\n { name: \"title\" }\n ]\n };\n }\n case Leaf: {\n return {\n name: Leaf,\n properties: [\n { name: \"classSelector\" },\n { name: \"name\" },\n { name: \"value\" }\n ]\n };\n }\n case Section: {\n return {\n name: Section,\n properties: [\n { name: \"classSelector\" },\n { name: \"name\" }\n ]\n };\n }\n default: {\n return {\n name: type,\n properties: []\n };\n }\n }\n }\n};\nvar reflection = new MermaidAstReflection();\n\n// src/language/generated/grammar.ts\nimport { loadGrammarFromJson } from \"langium\";\nvar loadedInfoGrammar;\nvar InfoGrammar = /* @__PURE__ */ __name(() => loadedInfoGrammar ?? (loadedInfoGrammar = loadGrammarFromJson(`{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Info\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Info\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Keyword\",\"value\":\"info\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"showInfo\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[],\"cardinality\":\"*\"}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[],\"cardinality\":\"?\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|'([^'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"interfaces\":[],\"types\":[],\"usedGrammars\":[]}`)), \"InfoGrammar\");\nvar loadedPacketGrammar;\nvar PacketGrammar = /* @__PURE__ */ __name(() => loadedPacketGrammar ?? (loadedPacketGrammar = loadGrammarFromJson(`{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Packet\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Packet\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"packet\"},{\"$type\":\"Keyword\",\"value\":\"packet-beta\"}]},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"blocks\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"PacketBlock\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"start\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"-\"},{\"$type\":\"Assignment\",\"feature\":\"end\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}}],\"cardinality\":\"?\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"+\"},{\"$type\":\"Assignment\",\"feature\":\"bits\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}}]}]},{\"$type\":\"Keyword\",\"value\":\":\"},{\"$type\":\"Assignment\",\"feature\":\"label\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|'([^'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"interfaces\":[],\"types\":[],\"usedGrammars\":[]}`)), \"PacketGrammar\");\nvar loadedPieGrammar;\nvar PieGrammar = /* @__PURE__ */ __name(() => loadedPieGrammar ?? (loadedPieGrammar = loadGrammarFromJson(`{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Pie\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Pie\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Keyword\",\"value\":\"pie\"},{\"$type\":\"Assignment\",\"feature\":\"showData\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"showData\"},\"cardinality\":\"?\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"sections\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"},\"arguments\":[]}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"PieSection\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"label\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@14\"},\"arguments\":[]}},{\"$type\":\"Keyword\",\"value\":\":\"},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT_PIE\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/-?[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT_PIE\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/-?(0|[1-9][0-9]*)(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER_PIE\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|'([^'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"interfaces\":[],\"types\":[],\"usedGrammars\":[]}`)), \"PieGrammar\");\nvar loadedArchitectureGrammar;\nvar ArchitectureGrammar = /* @__PURE__ */ __name(() => loadedArchitectureGrammar ?? (loadedArchitectureGrammar = loadGrammarFromJson(`{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Architecture\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Architecture\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@23\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Keyword\",\"value\":\"architecture-beta\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@23\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"Statement\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"groups\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"services\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"junctions\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"edges\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"LeftPort\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\":\"},{\"$type\":\"Assignment\",\"feature\":\"lhsDir\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"RightPort\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"rhsDir\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}},{\"$type\":\"Keyword\",\"value\":\":\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"Arrow\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"lhsInto\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"--\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"-\"},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@29\"},\"arguments\":[]}},{\"$type\":\"Keyword\",\"value\":\"-\"}]}]},{\"$type\":\"Assignment\",\"feature\":\"rhsInto\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Group\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"group\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"icon\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@28\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@29\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"in\"},{\"$type\":\"Assignment\",\"feature\":\"in\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Service\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"service\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"iconText\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@21\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"icon\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@28\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@29\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"in\"},{\"$type\":\"Assignment\",\"feature\":\"in\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Junction\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"junction\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"in\"},{\"$type\":\"Assignment\",\"feature\":\"in\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Edge\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"lhsId\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"lhsGroup\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"rhsId\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"rhsGroup\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"ARROW_DIRECTION\",\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"L\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"R\"}}]},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"T\"}}]},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"B\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ARROW_GROUP\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\{group\\\\\\\\}/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ARROW_INTO\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/<|>/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@23\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|'([^'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"name\":\"ARCH_ICON\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\([\\\\\\\\w-:]+\\\\\\\\)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ARCH_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\[[\\\\\\\\w ]+\\\\\\\\]/\"},\"fragment\":false,\"hidden\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"interfaces\":[],\"types\":[],\"usedGrammars\":[]}`)), \"ArchitectureGrammar\");\nvar loadedGitGraphGrammar;\nvar GitGraphGrammar = /* @__PURE__ */ __name(() => loadedGitGraphGrammar ?? (loadedGitGraphGrammar = loadGrammarFromJson(`{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"GitGraph\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"GitGraph\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"gitGraph\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"gitGraph\"},{\"$type\":\"Keyword\",\"value\":\":\"}]},{\"$type\":\"Keyword\",\"value\":\"gitGraph:\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"gitGraph\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]},{\"$type\":\"Keyword\",\"value\":\":\"}]}]},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"statements\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Statement\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Direction\",\"definition\":{\"$type\":\"Assignment\",\"feature\":\"dir\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"LR\"},{\"$type\":\"Keyword\",\"value\":\"TB\"},{\"$type\":\"Keyword\",\"value\":\"BT\"}]}},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Commit\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"commit\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"id:\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"msg:\",\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"message\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"tag:\"},{\"$type\":\"Assignment\",\"feature\":\"tags\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"type:\"},{\"$type\":\"Assignment\",\"feature\":\"type\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"NORMAL\"},{\"$type\":\"Keyword\",\"value\":\"REVERSE\"},{\"$type\":\"Keyword\",\"value\":\"HIGHLIGHT\"}]}}]}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Branch\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"branch\"},{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@24\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"order:\"},{\"$type\":\"Assignment\",\"feature\":\"order\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Merge\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"merge\"},{\"$type\":\"Assignment\",\"feature\":\"branch\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@24\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}]}},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"id:\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"tag:\"},{\"$type\":\"Assignment\",\"feature\":\"tags\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"type:\"},{\"$type\":\"Assignment\",\"feature\":\"type\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"NORMAL\"},{\"$type\":\"Keyword\",\"value\":\"REVERSE\"},{\"$type\":\"Keyword\",\"value\":\"HIGHLIGHT\"}]}}]}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Checkout\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"checkout\"},{\"$type\":\"Keyword\",\"value\":\"switch\"}]},{\"$type\":\"Assignment\",\"feature\":\"branch\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@24\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"CherryPicking\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"cherry-pick\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"id:\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"tag:\"},{\"$type\":\"Assignment\",\"feature\":\"tags\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"parent:\"},{\"$type\":\"Assignment\",\"feature\":\"parent\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@14\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|'([^'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"name\":\"REFERENCE\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\w([-\\\\\\\\./\\\\\\\\w]*[-\\\\\\\\w])?/\"},\"fragment\":false,\"hidden\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"interfaces\":[],\"types\":[],\"usedGrammars\":[]}`)), \"GitGraphGrammar\");\nvar loadedRadarGrammar;\nvar RadarGrammar = /* @__PURE__ */ __name(() => loadedRadarGrammar ?? (loadedRadarGrammar = loadGrammarFromJson(`{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Radar\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Radar\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"radar-beta\"},{\"$type\":\"Keyword\",\"value\":\"radar-beta:\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"radar-beta\"},{\"$type\":\"Keyword\",\"value\":\":\"}]}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"axis\"},{\"$type\":\"Assignment\",\"feature\":\"axes\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"Assignment\",\"feature\":\"axes\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"curve\"},{\"$type\":\"Assignment\",\"feature\":\"curves\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"Assignment\",\"feature\":\"curves\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"options\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"Assignment\",\"feature\":\"options\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"Label\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"[\"},{\"$type\":\"Assignment\",\"feature\":\"label\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"},\"arguments\":[]}},{\"$type\":\"Keyword\",\"value\":\"]\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Axis\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[],\"cardinality\":\"?\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Curve\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[],\"cardinality\":\"?\"},{\"$type\":\"Keyword\",\"value\":\"{\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]},{\"$type\":\"Keyword\",\"value\":\"}\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"Entries\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]}}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"}]}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"DetailedEntry\",\"returnType\":{\"$ref\":\"#/interfaces@0\"},\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"axis\",\"operator\":\"=\",\"terminal\":{\"$type\":\"CrossReference\",\"type\":{\"$ref\":\"#/rules@2\"},\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[]},\"deprecatedSyntax\":false}},{\"$type\":\"Keyword\",\"value\":\":\",\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"NumberEntry\",\"returnType\":{\"$ref\":\"#/interfaces@0\"},\"definition\":{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Option\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"showLegend\"}},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"ticks\"}},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"max\"}},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"min\"}},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"graticule\"}},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}}]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"GRATICULE\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"circle\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"polygon\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@14\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|'([^'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false}],\"interfaces\":[{\"$type\":\"Interface\",\"name\":\"Entry\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"axis\",\"isOptional\":true,\"type\":{\"$type\":\"ReferenceType\",\"referenceType\":{\"$type\":\"SimpleType\",\"typeRef\":{\"$ref\":\"#/rules@2\"}}}},{\"$type\":\"TypeAttribute\",\"name\":\"value\",\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"number\"},\"isOptional\":false}],\"superTypes\":[]}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"types\":[],\"usedGrammars\":[]}`)), \"RadarGrammar\");\nvar loadedTreemapGrammar;\nvar TreemapGrammar = /* @__PURE__ */ __name(() => loadedTreemapGrammar ?? (loadedTreemapGrammar = loadGrammarFromJson(`{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Treemap\",\"rules\":[{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]}}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Treemap\",\"returnType\":{\"$ref\":\"#/interfaces@4\"},\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@0\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"TreemapRows\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@14\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"TREEMAP_KEYWORD\",\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"treemap-beta\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"treemap\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"CLASS_DEF\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/classDef\\\\\\\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\\\\\\\s+([^;\\\\\\\\r\\\\\\\\n]*))?(?:;)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STYLE_SEPARATOR\",\"definition\":{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\":::\"}},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"SEPARATOR\",\"definition\":{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\":\"}},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"COMMA\",\"definition\":{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\",\"}},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WS\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[ \\\\\\\\t]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"ML_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\%\\\\\\\\%[^\\\\\\\\n]*/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"NL\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false},{\"$type\":\"ParserRule\",\"name\":\"TreemapRow\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"indent\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"item\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"},\"arguments\":[]}]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"ClassDef\",\"dataType\":\"string\",\"definition\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Item\",\"returnType\":{\"$ref\":\"#/interfaces@0\"},\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Section\",\"returnType\":{\"$ref\":\"#/interfaces@1\"},\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@23\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"classSelector\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}}],\"cardinality\":\"?\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Leaf\",\"returnType\":{\"$ref\":\"#/interfaces@2\"},\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@23\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[],\"cardinality\":\"?\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[],\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"classSelector\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}}],\"cardinality\":\"?\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"INDENTATION\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[ \\\\\\\\t]{1,}/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID2\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[a-zA-Z_][a-zA-Z0-9_]*/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER2\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9_\\\\\\\\.\\\\\\\\,]+/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"ParserRule\",\"name\":\"MyNumber\",\"dataType\":\"number\",\"definition\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@21\"},\"arguments\":[]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING2\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"[^\\\\\"]*\\\\\"|'[^']*'/\"},\"fragment\":false,\"hidden\":false}],\"interfaces\":[{\"$type\":\"Interface\",\"name\":\"Item\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"name\",\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"},\"isOptional\":false},{\"$type\":\"TypeAttribute\",\"name\":\"classSelector\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}}],\"superTypes\":[]},{\"$type\":\"Interface\",\"name\":\"Section\",\"superTypes\":[{\"$ref\":\"#/interfaces@0\"}],\"attributes\":[]},{\"$type\":\"Interface\",\"name\":\"Leaf\",\"superTypes\":[{\"$ref\":\"#/interfaces@0\"}],\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"value\",\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"number\"},\"isOptional\":false}]},{\"$type\":\"Interface\",\"name\":\"ClassDefStatement\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"className\",\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"},\"isOptional\":false},{\"$type\":\"TypeAttribute\",\"name\":\"styleText\",\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"},\"isOptional\":false}],\"superTypes\":[]},{\"$type\":\"Interface\",\"name\":\"Treemap\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"TreemapRows\",\"type\":{\"$type\":\"ArrayType\",\"elementType\":{\"$type\":\"SimpleType\",\"typeRef\":{\"$ref\":\"#/rules@14\"}}},\"isOptional\":false},{\"$type\":\"TypeAttribute\",\"name\":\"title\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"accTitle\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"accDescr\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}}],\"superTypes\":[]}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"imports\":[],\"types\":[],\"usedGrammars\":[],\"$comment\":\"/**\\\\n * Treemap grammar for Langium\\\\n * Converted from mindmap grammar\\\\n *\\\\n * The ML_COMMENT and NL hidden terminals handle whitespace, comments, and newlines\\\\n * before the treemap keyword, allowing for empty lines and comments before the\\\\n * treemap declaration.\\\\n */\"}`)), \"TreemapGrammar\");\n\n// src/language/generated/module.ts\nvar InfoLanguageMetaData = {\n languageId: \"info\",\n fileExtensions: [\".mmd\", \".mermaid\"],\n caseInsensitive: false,\n mode: \"production\"\n};\nvar PacketLanguageMetaData = {\n languageId: \"packet\",\n fileExtensions: [\".mmd\", \".mermaid\"],\n caseInsensitive: false,\n mode: \"production\"\n};\nvar PieLanguageMetaData = {\n languageId: \"pie\",\n fileExtensions: [\".mmd\", \".mermaid\"],\n caseInsensitive: false,\n mode: \"production\"\n};\nvar ArchitectureLanguageMetaData = {\n languageId: \"architecture\",\n fileExtensions: [\".mmd\", \".mermaid\"],\n caseInsensitive: false,\n mode: \"production\"\n};\nvar GitGraphLanguageMetaData = {\n languageId: \"gitGraph\",\n fileExtensions: [\".mmd\", \".mermaid\"],\n caseInsensitive: false,\n mode: \"production\"\n};\nvar RadarLanguageMetaData = {\n languageId: \"radar\",\n fileExtensions: [\".mmd\", \".mermaid\"],\n caseInsensitive: false,\n mode: \"production\"\n};\nvar TreemapLanguageMetaData = {\n languageId: \"treemap\",\n fileExtensions: [\".mmd\", \".mermaid\"],\n caseInsensitive: false,\n mode: \"production\"\n};\nvar MermaidGeneratedSharedModule = {\n AstReflection: /* @__PURE__ */ __name(() => new MermaidAstReflection(), \"AstReflection\")\n};\nvar InfoGeneratedModule = {\n Grammar: /* @__PURE__ */ __name(() => InfoGrammar(), \"Grammar\"),\n LanguageMetaData: /* @__PURE__ */ __name(() => InfoLanguageMetaData, \"LanguageMetaData\"),\n parser: {}\n};\nvar PacketGeneratedModule = {\n Grammar: /* @__PURE__ */ __name(() => PacketGrammar(), \"Grammar\"),\n LanguageMetaData: /* @__PURE__ */ __name(() => PacketLanguageMetaData, \"LanguageMetaData\"),\n parser: {}\n};\nvar PieGeneratedModule = {\n Grammar: /* @__PURE__ */ __name(() => PieGrammar(), \"Grammar\"),\n LanguageMetaData: /* @__PURE__ */ __name(() => PieLanguageMetaData, \"LanguageMetaData\"),\n parser: {}\n};\nvar ArchitectureGeneratedModule = {\n Grammar: /* @__PURE__ */ __name(() => ArchitectureGrammar(), \"Grammar\"),\n LanguageMetaData: /* @__PURE__ */ __name(() => ArchitectureLanguageMetaData, \"LanguageMetaData\"),\n parser: {}\n};\nvar GitGraphGeneratedModule = {\n Grammar: /* @__PURE__ */ __name(() => GitGraphGrammar(), \"Grammar\"),\n LanguageMetaData: /* @__PURE__ */ __name(() => GitGraphLanguageMetaData, \"LanguageMetaData\"),\n parser: {}\n};\nvar RadarGeneratedModule = {\n Grammar: /* @__PURE__ */ __name(() => RadarGrammar(), \"Grammar\"),\n LanguageMetaData: /* @__PURE__ */ __name(() => RadarLanguageMetaData, \"LanguageMetaData\"),\n parser: {}\n};\nvar TreemapGeneratedModule = {\n Grammar: /* @__PURE__ */ __name(() => TreemapGrammar(), \"Grammar\"),\n LanguageMetaData: /* @__PURE__ */ __name(() => TreemapLanguageMetaData, \"LanguageMetaData\"),\n parser: {}\n};\n\n// src/language/common/valueConverter.ts\nimport { DefaultValueConverter } from \"langium\";\n\n// src/language/common/matcher.ts\nvar accessibilityDescrRegex = /accDescr(?:[\\t ]*:([^\\n\\r]*)|\\s*{([^}]*)})/;\nvar accessibilityTitleRegex = /accTitle[\\t ]*:([^\\n\\r]*)/;\nvar titleRegex = /title([\\t ][^\\n\\r]*|)/;\n\n// src/language/common/valueConverter.ts\nvar rulesRegexes = {\n ACC_DESCR: accessibilityDescrRegex,\n ACC_TITLE: accessibilityTitleRegex,\n TITLE: titleRegex\n};\nvar AbstractMermaidValueConverter = class extends DefaultValueConverter {\n static {\n __name(this, \"AbstractMermaidValueConverter\");\n }\n runConverter(rule, input, cstNode) {\n let value = this.runCommonConverter(rule, input, cstNode);\n if (value === void 0) {\n value = this.runCustomConverter(rule, input, cstNode);\n }\n if (value === void 0) {\n return super.runConverter(rule, input, cstNode);\n }\n return value;\n }\n runCommonConverter(rule, input, _cstNode) {\n const regex = rulesRegexes[rule.name];\n if (regex === void 0) {\n return void 0;\n }\n const match = regex.exec(input);\n if (match === null) {\n return void 0;\n }\n if (match[1] !== void 0) {\n return match[1].trim().replace(/[\\t ]{2,}/gm, \" \");\n }\n if (match[2] !== void 0) {\n return match[2].replace(/^\\s*/gm, \"\").replace(/\\s+$/gm, \"\").replace(/[\\t ]{2,}/gm, \" \").replace(/[\\n\\r]{2,}/gm, \"\\n\");\n }\n return void 0;\n }\n};\nvar CommonValueConverter = class extends AbstractMermaidValueConverter {\n static {\n __name(this, \"CommonValueConverter\");\n }\n runCustomConverter(_rule, _input, _cstNode) {\n return void 0;\n }\n};\n\n// src/language/common/tokenBuilder.ts\nimport { DefaultTokenBuilder } from \"langium\";\nvar AbstractMermaidTokenBuilder = class extends DefaultTokenBuilder {\n static {\n __name(this, \"AbstractMermaidTokenBuilder\");\n }\n constructor(keywords) {\n super();\n this.keywords = new Set(keywords);\n }\n buildKeywordTokens(rules, terminalTokens, options) {\n const tokenTypes = super.buildKeywordTokens(rules, terminalTokens, options);\n tokenTypes.forEach((tokenType) => {\n if (this.keywords.has(tokenType.name) && tokenType.PATTERN !== void 0) {\n tokenType.PATTERN = new RegExp(tokenType.PATTERN.toString() + \"(?:(?=%%)|(?!\\\\S))\");\n }\n });\n return tokenTypes;\n }\n};\nvar CommonTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"CommonTokenBuilder\");\n }\n};\n\nexport {\n __name,\n Statement,\n Architecture,\n isArchitecture,\n Branch,\n isBranch,\n Commit,\n isCommit,\n GitGraph,\n isGitGraph,\n Info,\n isInfo,\n Merge,\n isMerge,\n Packet,\n isPacket,\n PacketBlock,\n isPacketBlock,\n Pie,\n isPie,\n PieSection,\n isPieSection,\n Radar,\n Treemap,\n isTreemap,\n MermaidGeneratedSharedModule,\n InfoGeneratedModule,\n PacketGeneratedModule,\n PieGeneratedModule,\n ArchitectureGeneratedModule,\n GitGraphGeneratedModule,\n RadarGeneratedModule,\n TreemapGeneratedModule,\n AbstractMermaidValueConverter,\n CommonValueConverter,\n AbstractMermaidTokenBuilder,\n CommonTokenBuilder\n};\n"], + "mappings": "qdAAA,IAAAA,GAAAC,GAAAC,IAAA,cAKA,OAAO,eAAeA,GAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,IAAIC,GACJ,SAASC,IAAM,CACX,GAAID,KAAS,OACT,MAAM,IAAI,MAAM,wCAAwC,EAE5D,OAAOA,EACX,CALSE,EAAAD,GAAA,QAMR,SAAUA,EAAK,CACZ,SAASE,EAAQC,EAAK,CAClB,GAAIA,IAAQ,OACR,MAAM,IAAI,MAAM,uCAAuC,EAE3DJ,GAAOI,CACX,CALSF,EAAAC,EAAA,WAMTF,EAAI,QAAUE,CAClB,GAAGF,KAAQA,GAAM,CAAC,EAAE,EACpBF,GAAQ,QAAUE,KCtBlB,IAAAI,GAAAC,GAAAC,IAAA,cAKA,OAAO,eAAeA,GAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5DA,GAAQ,YAAcA,GAAQ,MAAQA,GAAQ,KAAOA,GAAQ,MAAQA,GAAQ,OAASA,GAAQ,OAASA,GAAQ,QAAU,OACzH,SAASC,GAAQC,EAAO,CACpB,OAAOA,IAAU,IAAQA,IAAU,EACvC,CAFSC,EAAAF,GAAA,WAGTD,GAAQ,QAAUC,GAClB,SAASG,GAAOF,EAAO,CACnB,OAAO,OAAOA,GAAU,UAAYA,aAAiB,MACzD,CAFSC,EAAAC,GAAA,UAGTJ,GAAQ,OAASI,GACjB,SAASC,GAAOH,EAAO,CACnB,OAAO,OAAOA,GAAU,UAAYA,aAAiB,MACzD,CAFSC,EAAAE,GAAA,UAGTL,GAAQ,OAASK,GACjB,SAASC,GAAMJ,EAAO,CAClB,OAAOA,aAAiB,KAC5B,CAFSC,EAAAG,GAAA,SAGTN,GAAQ,MAAQM,GAChB,SAASC,GAAKL,EAAO,CACjB,OAAO,OAAOA,GAAU,UAC5B,CAFSC,EAAAI,GAAA,QAGTP,GAAQ,KAAOO,GACf,SAASC,GAAMN,EAAO,CAClB,OAAO,MAAM,QAAQA,CAAK,CAC9B,CAFSC,EAAAK,GAAA,SAGTR,GAAQ,MAAQQ,GAChB,SAASC,GAAYP,EAAO,CACxB,OAAOM,GAAMN,CAAK,GAAKA,EAAM,MAAMQ,GAAQN,GAAOM,CAAI,CAAC,CAC3D,CAFSP,EAAAM,GAAA,eAGTT,GAAQ,YAAcS,KClCtB,IAAAE,GAAAC,GAAAC,IAAA,cAKA,OAAO,eAAeA,GAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5DA,GAAQ,QAAUA,GAAQ,MAAQ,OAClC,IAAMC,GAAQ,KACVC,IACH,SAAUA,EAAO,CACd,IAAMC,EAAc,CAAE,SAAU,CAAE,CAAE,EACpCD,EAAM,KAAO,UAAY,CAAE,OAAOC,CAAa,CACnD,GAAGD,KAAUF,GAAQ,MAAQE,GAAQ,CAAC,EAAE,EACxC,IAAME,GAAN,KAAmB,CAbnB,MAamB,CAAAC,EAAA,qBACf,IAAIC,EAAUC,EAAU,KAAMC,EAAQ,CAC7B,KAAK,aACN,KAAK,WAAa,CAAC,EACnB,KAAK,UAAY,CAAC,GAEtB,KAAK,WAAW,KAAKF,CAAQ,EAC7B,KAAK,UAAU,KAAKC,CAAO,EACvB,MAAM,QAAQC,CAAM,GACpBA,EAAO,KAAK,CAAE,QAASH,EAAA,IAAM,KAAK,OAAOC,EAAUC,CAAO,EAAnC,UAAqC,CAAC,CAErE,CACA,OAAOD,EAAUC,EAAU,KAAM,CAC7B,GAAI,CAAC,KAAK,WACN,OAEJ,IAAIE,EAAoC,GACxC,QAAS,EAAI,EAAGC,EAAM,KAAK,WAAW,OAAQ,EAAIA,EAAK,IACnD,GAAI,KAAK,WAAW,CAAC,IAAMJ,EACvB,GAAI,KAAK,UAAU,CAAC,IAAMC,EAAS,CAE/B,KAAK,WAAW,OAAO,EAAG,CAAC,EAC3B,KAAK,UAAU,OAAO,EAAG,CAAC,EAC1B,MACJ,MAEIE,EAAoC,GAIhD,GAAIA,EACA,MAAM,IAAI,MAAM,mFAAmF,CAE3G,CACA,UAAUE,EAAM,CACZ,GAAI,CAAC,KAAK,WACN,MAAO,CAAC,EAEZ,IAAMC,EAAM,CAAC,EAAGC,EAAY,KAAK,WAAW,MAAM,CAAC,EAAGC,EAAW,KAAK,UAAU,MAAM,CAAC,EACvF,QAASC,EAAI,EAAGL,EAAMG,EAAU,OAAQE,EAAIL,EAAKK,IAC7C,GAAI,CACAH,EAAI,KAAKC,EAAUE,CAAC,EAAE,MAAMD,EAASC,CAAC,EAAGJ,CAAI,CAAC,CAClD,OACOK,EAAG,IAEFf,GAAM,SAAS,EAAE,QAAQ,MAAMe,CAAC,CACxC,CAEJ,OAAOJ,CACX,CACA,SAAU,CACN,MAAO,CAAC,KAAK,YAAc,KAAK,WAAW,SAAW,CAC1D,CACA,SAAU,CACN,KAAK,WAAa,OAClB,KAAK,UAAY,MACrB,CACJ,EACMK,GAAN,MAAMC,CAAQ,CAvEd,MAuEc,CAAAb,EAAA,gBACV,YAAYc,EAAU,CAClB,KAAK,SAAWA,CACpB,CAKA,IAAI,OAAQ,CACR,OAAK,KAAK,SACN,KAAK,OAAS,CAACC,EAAUC,EAAUC,IAAgB,CAC1C,KAAK,aACN,KAAK,WAAa,IAAIlB,IAEtB,KAAK,UAAY,KAAK,SAAS,oBAAsB,KAAK,WAAW,QAAQ,GAC7E,KAAK,SAAS,mBAAmB,IAAI,EAEzC,KAAK,WAAW,IAAIgB,EAAUC,CAAQ,EACtC,IAAME,EAAS,CACX,QAASlB,EAAA,IAAM,CACN,KAAK,aAIV,KAAK,WAAW,OAAOe,EAAUC,CAAQ,EACzCE,EAAO,QAAUL,EAAQ,MACrB,KAAK,UAAY,KAAK,SAAS,sBAAwB,KAAK,WAAW,QAAQ,GAC/E,KAAK,SAAS,qBAAqB,IAAI,EAE/C,EAVS,UAWb,EACA,OAAI,MAAM,QAAQI,CAAW,GACzBA,EAAY,KAAKC,CAAM,EAEpBA,CACX,GAEG,KAAK,MAChB,CAKA,KAAKC,EAAO,CACJ,KAAK,YACL,KAAK,WAAW,OAAO,KAAK,KAAK,WAAYA,CAAK,CAE1D,CACA,SAAU,CACF,KAAK,aACL,KAAK,WAAW,QAAQ,EACxB,KAAK,WAAa,OAE1B,CACJ,EACAxB,GAAQ,QAAUiB,GAClBA,GAAQ,MAAQ,UAAY,CAAE,IC/H9B,IAAAQ,GAAAC,GAAAC,IAAA,cAKA,OAAO,eAAeA,GAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5DA,GAAQ,wBAA0BA,GAAQ,kBAAoB,OAC9D,IAAMC,GAAQ,KACRC,GAAK,KACLC,GAAW,KACbC,IACH,SAAUA,EAAmB,CAC1BA,EAAkB,KAAO,OAAO,OAAO,CACnC,wBAAyB,GACzB,wBAAyBD,GAAS,MAAM,IAC5C,CAAC,EACDC,EAAkB,UAAY,OAAO,OAAO,CACxC,wBAAyB,GACzB,wBAAyBD,GAAS,MAAM,IAC5C,CAAC,EACD,SAASE,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAOC,IAAcA,IAAcH,EAAkB,MAC9CG,IAAcH,EAAkB,WAC/BF,GAAG,QAAQK,EAAU,uBAAuB,GAAK,CAAC,CAACA,EAAU,wBACzE,CALSC,EAAAH,EAAA,MAMTD,EAAkB,GAAKC,CAC3B,GAAGD,KAAsBJ,GAAQ,kBAAoBI,GAAoB,CAAC,EAAE,EAC5E,IAAMK,GAAgB,OAAO,OAAO,SAAUC,EAAUC,EAAS,CAC7D,IAAMC,KAAaX,GAAM,SAAS,EAAE,MAAM,WAAWS,EAAS,KAAKC,CAAO,EAAG,CAAC,EAC9E,MAAO,CAAE,SAAU,CAAEC,EAAO,QAAQ,CAAG,CAAE,CAC7C,CAAC,EACKC,GAAN,KAAmB,CAhCnB,MAgCmB,CAAAL,EAAA,qBACf,aAAc,CACV,KAAK,aAAe,EACxB,CACA,QAAS,CACA,KAAK,eACN,KAAK,aAAe,GAChB,KAAK,WACL,KAAK,SAAS,KAAK,MAAS,EAC5B,KAAK,QAAQ,GAGzB,CACA,IAAI,yBAA0B,CAC1B,OAAO,KAAK,YAChB,CACA,IAAI,yBAA0B,CAC1B,OAAI,KAAK,aACEC,IAEN,KAAK,WACN,KAAK,SAAW,IAAIN,GAAS,SAE1B,KAAK,SAAS,MACzB,CACA,SAAU,CACF,KAAK,WACL,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAW,OAExB,CACJ,EACMW,GAAN,KAA8B,CAhE9B,MAgE8B,CAAAN,EAAA,gCAC1B,IAAI,OAAQ,CACR,OAAK,KAAK,SAGN,KAAK,OAAS,IAAIK,IAEf,KAAK,MAChB,CACA,QAAS,CACA,KAAK,OAON,KAAK,OAAO,OAAO,EAHnB,KAAK,OAAST,GAAkB,SAKxC,CACA,SAAU,CACD,KAAK,OAID,KAAK,kBAAkBS,IAE5B,KAAK,OAAO,QAAQ,EAJpB,KAAK,OAAST,GAAkB,IAMxC,CACJ,EACAJ,GAAQ,wBAA0Bc,KC/FlC,IAAAC,GAAA,GAAAC,GAAAD,GAAA,2BAAAE,GAAA,oBAAAC,GAAA,0BAAAC,GAAA,uCAAAC,GAAA,gCAAAC,GAAA,aAAAC,GAAA,UAAAC,GAAA,iBAAAC,EAAA,yBAAAC,GAAA,iBAAAC,GAAA,mBAAAC,GAAA,aAAAC,GAAA,6BAAAC,GAAA,gBAAAC,GAAA,mBAAAC,GAAA,sCAAAC,GAAA,0BAAAC,GAAA,uBAAAC,GAAA,2BAAAC,GAAA,iCAAAC,GAAA,2BAAAC,GAAA,6BAAAC,GAAA,oBAAAC,GAAA,wBAAAC,GAAA,0BAAAC,GAAA,kCAAAC,GAAA,4BAAAC,GAAA,iBAAAC,GAAA,qCAAAC,GAAA,kBAAAC,GAAA,wBAAAC,GAAA,wCAAAC,GAAA,sBAAAC,GAAA,4BAAAC,GAAA,yBAAAC,GAAA,2BAAAC,GAAA,wBAAAC,GAAA,0BAAAC,GAAA,yBAAAC,GAAA,4BAAAC,GAAA,aAAAC,GAAA,eAAAC,GAAA,oBAAAC,GAAA,kBAAAC,GAAA,kBAAAC,EAAA,sBAAAC,GAAA,gBAAAC,GAAA,iBAAAC,GAAA,oBAAAC,GAAA,4BAAAC,GAAA,sBAAAC,GAAA,eAAAC,GAAA,iBAAAC,GAAA,0BAAAC,GAAA,iCAAAC,GAAA,+BAAAC,GAAA,4BAAAC,GAAA,kBAAAC,GAAA,sCAAAC,GAAA,oBAAAC,GAAA,eAAAC,GAAA,aAAAC,GAAA,WAAAC,GAAA,aAAAC,GAAA,uBAAAC,GAAA,iBAAAC,GAAA,cAAAC,GAAA,gBAAAC,GAAA,oBAAAC,GAAA,gBAAAC,GAAA,eAAAC,GAAA,gBAAAC,GAAA,iBAAAC,GAAA,mBAAAC,GAAA,QAAAC,GAAA,aAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,sBAAAC,GAAA,2BAAAC,GAAA,4BAAAC,GAAA,kCAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,iBAAAC,GAAA,kBAAAC,GAAA,mBAAAC,GAAA,cAAAC,GAAA,uBAAAC,GAAA,qCAAAC,GAAA,WAAAC,GAAA,sBAAAC,GAAA,cAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,uBAAAC,GAAA,gCAAAC,GAAA,YAAAC,GAAA,kBAAAC,GAAA,mBAAAC,GAAA,YAAAC,GAAA,yBAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,qBAAAC,GAAA,0BAAAC,GAAA,wBAAAC,GAAA,eAAAC,GAAA,yBAAAC,GAAA,0BAAAC,GAAA,6BAAAC,GAAA,WAAAC,EAAA,qBAAAC,GAAA,yBAAAC,KCAA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,uBAAAE,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,oBAAAC,GAAA,gCAAAC,GAAA,yBAAAC,GAAA,6BAAAC,GAAA,eAAAC,GAAA,qBAAAC,GAAA,gBAAAC,GAAA,oBAAAC,GAAA,qBAAAC,GAAA,YAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,cAAAC,GAAA,sBAAAC,GAAA,iBAAAC,KC6BM,SAAUC,GAAUC,EAAY,CAClC,OAAO,OAAOA,GAAQ,UAAYA,IAAQ,MAAQ,OAAQA,EAAgB,OAAU,QACxF,CAFgBC,EAAAF,GAAA,aAoCV,SAAUG,GAAYF,EAAY,CACpC,OAAO,OAAOA,GAAQ,UAAYA,IAAQ,MAAQ,OAAQA,EAAkB,UAAa,QAC7F,CAFgBC,EAAAC,GAAA,eAgCV,SAAUC,GAAqBH,EAAY,CAC7C,OAAO,OAAOA,GAAQ,UAAYA,IAAQ,MACnC,OAAQA,EAA2B,MAAS,UAC5C,OAAQA,EAA2B,MAAS,UAC5C,OAAQA,EAA2B,MAAS,QACvD,CALgBC,EAAAE,GAAA,wBA0BV,SAAUC,GAAeJ,EAAY,CACvC,OAAO,OAAOA,GAAQ,UAAYA,IAAQ,MACnCD,GAAWC,EAAqB,SAAS,GACzCE,GAAaF,EAAqB,SAAS,GAC3C,OAAQA,EAAqB,SAAY,QACpD,CALgBC,EAAAG,GAAA,kBAwBV,IAAgBC,GAAhB,KAAqC,CAnJ3C,MAmJ2C,CAAAJ,EAAA,8BAA3C,aAAA,CAEc,KAAA,SAAgE,CAAA,EAChE,KAAA,YAAoD,CAAA,CA6ClE,CAtCI,WAAWK,EAAeC,EAAY,CAClC,OAAOR,GAAUO,CAAI,GAAK,KAAK,UAAUA,EAAK,MAAOC,CAAI,CAC7D,CAEA,UAAUC,EAAiBC,EAAiB,CACxC,GAAID,IAAYC,EACZ,MAAO,GAEX,IAAIC,EAAS,KAAK,SAASF,CAAO,EAC7BE,IACDA,EAAS,KAAK,SAASF,CAAO,EAAI,CAAA,GAEtC,IAAMG,EAAWD,EAAOD,CAAS,EACjC,GAAIE,IAAa,OACb,OAAOA,EACJ,CACH,IAAMC,EAAS,KAAK,iBAAiBJ,EAASC,CAAS,EACvD,OAAAC,EAAOD,CAAS,EAAIG,EACbA,CACX,CACJ,CAEA,eAAeL,EAAY,CACvB,IAAMI,EAAW,KAAK,YAAYJ,CAAI,EACtC,GAAII,EACA,OAAOA,EACJ,CACH,IAAME,EAAW,KAAK,YAAW,EAC3BC,EAAkB,CAAA,EACxB,QAAWC,KAAmBF,EACtB,KAAK,UAAUE,EAAiBR,CAAI,GACpCO,EAAM,KAAKC,CAAe,EAGlC,YAAK,YAAYR,CAAI,EAAIO,EAClBA,CACX,CACJ,GA8DE,SAAUE,GAAmBV,EAAa,CAC5C,OAAO,OAAOA,GAAS,UAAYA,IAAS,MAAQ,MAAM,QAASA,EAA0B,OAAO,CACxG,CAFgBL,EAAAe,GAAA,sBAWV,SAAUC,GAAcX,EAAa,CACvC,OAAO,OAAOA,GAAS,UAAYA,IAAS,MAAQ,OAAQA,EAAqB,WAAc,QACnG,CAFgBL,EAAAgB,GAAA,iBAQV,SAAUC,GAAcZ,EAAa,CACvC,OAAOU,GAAmBV,CAAI,GAAK,OAAQA,EAAqB,UAAa,QACjF,CAFgBL,EAAAiB,GAAA,iBCfV,IAAOC,GAAP,MAAOC,CAAU,CApQvB,MAoQuB,CAAAC,EAAA,mBAInB,YAAYC,EAAkBC,EAAkD,CAC5E,KAAK,QAAUD,EACf,KAAK,OAASC,CAClB,CAEA,UAAQ,CACJ,IAAMC,EAAW,CACb,MAAO,KAAK,QAAO,EACnB,KAAMH,EAAA,IAAM,KAAK,OAAOG,EAAS,KAAK,EAAhC,QACN,CAAC,OAAO,QAAQ,EAAG,IAAMA,GAE7B,OAAOA,CACX,CAEA,CAAC,OAAO,QAAQ,GAAC,CACb,OAAO,KAAK,SAAQ,CACxB,CAEA,SAAO,CAEH,MAAO,EADU,KAAK,SAAQ,EACN,KAAI,EAAG,IACnC,CAEA,OAAK,CACD,IAAMA,EAAW,KAAK,SAAQ,EAC1BC,EAAQ,EACRC,EAAOF,EAAS,KAAI,EACxB,KAAO,CAACE,EAAK,MACTD,IACAC,EAAOF,EAAS,KAAI,EAExB,OAAOC,CACX,CAEA,SAAO,CACH,IAAME,EAAc,CAAA,EACdH,EAAW,KAAK,SAAQ,EAC1BE,EACJ,GACIA,EAAOF,EAAS,KAAI,EAChBE,EAAK,QAAU,QACfC,EAAO,KAAKD,EAAK,KAAK,QAErB,CAACA,EAAK,MACf,OAAOC,CACX,CAEA,OAAK,CACD,OAAO,IAAI,IAAI,IAAI,CACvB,CAEA,MAAoBC,EAAqBC,EAAqB,CAC1D,IAAMC,EAAc,KAAK,IAAIC,GAAmB,CAC5CH,EAAQA,EAAMG,CAAO,EAAIA,EACzBF,EAAUA,EAAQE,CAAO,EAAIA,EAChC,EACD,OAAO,IAAI,IAAID,CAAW,CAC9B,CAEA,UAAQ,CACJ,OAAO,KAAK,KAAI,CACpB,CAEA,OAAWE,EAAmB,CAC1B,OAAO,IAAIZ,EACP,KAAO,CAAE,MAAO,KAAK,QAAO,EAAI,UAAW,GAAO,SAAUY,EAAM,OAAO,QAAQ,EAAC,CAAE,GACpFC,GAAQ,CACJ,IAAIN,EACJ,GAAI,CAACM,EAAM,UAAW,CAClB,EAEI,IADAN,EAAS,KAAK,OAAOM,EAAM,KAAK,EAC5B,CAACN,EAAO,KACR,OAAOA,QAEN,CAACA,EAAO,MACjBM,EAAM,UAAY,EACtB,CACA,EAEI,IADAN,EAASM,EAAM,SAAS,KAAI,EACxB,CAACN,EAAO,KACR,OAAOA,QAEN,CAACA,EAAO,MACjB,OAAOO,EACX,CAAC,CAET,CAEA,KAAKC,EAAY,IAAG,CAChB,IAAMX,EAAW,KAAK,SAAQ,EAC1BY,EAAQ,GACRT,EACAU,EAAe,GACnB,GACIV,EAASH,EAAS,KAAI,EACjBG,EAAO,OACJU,IACAD,GAASD,GAEbC,GAASE,GAASX,EAAO,KAAK,GAElCU,EAAe,SACV,CAACV,EAAO,MACjB,OAAOS,CACX,CAEA,QAAQG,EAAkBC,EAAY,EAAC,CACnC,IAAMhB,EAAW,KAAK,SAAQ,EAC1BiB,EAAQ,EACRf,EAAOF,EAAS,KAAI,EACxB,KAAO,CAACE,EAAK,MAAM,CACf,GAAIe,GAASD,GAAad,EAAK,QAAUa,EACrC,OAAOE,EAEXf,EAAOF,EAAS,KAAI,EACpBiB,GACJ,CACA,MAAO,EACX,CAeA,MAAMC,EAAgC,CAClC,IAAMlB,EAAW,KAAK,SAAQ,EAC1BE,EAAOF,EAAS,KAAI,EACxB,KAAO,CAACE,EAAK,MAAM,CACf,GAAI,CAACgB,EAAUhB,EAAK,KAAK,EACrB,MAAO,GAEXA,EAAOF,EAAS,KAAI,CACxB,CACA,MAAO,EACX,CAEA,KAAKkB,EAAgC,CACjC,IAAMlB,EAAW,KAAK,SAAQ,EAC1BE,EAAOF,EAAS,KAAI,EACxB,KAAO,CAACE,EAAK,MAAM,CACf,GAAIgB,EAAUhB,EAAK,KAAK,EACpB,MAAO,GAEXA,EAAOF,EAAS,KAAI,CACxB,CACA,MAAO,EACX,CAEA,QAAQmB,EAA6C,CACjD,IAAMnB,EAAW,KAAK,SAAQ,EAC1BiB,EAAQ,EACRf,EAAOF,EAAS,KAAI,EACxB,KAAO,CAACE,EAAK,MACTiB,EAAWjB,EAAK,MAAOe,CAAK,EAC5Bf,EAAOF,EAAS,KAAI,EACpBiB,GAER,CAEA,IAAOE,EAA2B,CAC9B,OAAO,IAAIvB,EACP,KAAK,QACJa,GAAS,CACN,GAAM,CAAE,KAAAW,EAAM,MAAAR,CAAK,EAAK,KAAK,OAAOH,CAAK,EACzC,OAAIW,EACOV,GAEA,CAAE,KAAM,GAAO,MAAOS,EAAWP,CAAK,CAAC,CAEtD,CAAC,CAET,CAKA,OAAOM,EAAgC,CACnC,OAAO,IAAItB,EACP,KAAK,QACLa,GAAQ,CACJ,IAAIN,EACJ,EAEI,IADAA,EAAS,KAAK,OAAOM,CAAK,EACtB,CAACN,EAAO,MAAQe,EAAUf,EAAO,KAAK,EACtC,OAAOA,QAEN,CAACA,EAAO,MACjB,OAAOO,EACX,CAAC,CAET,CAEA,aAAW,CACP,OAAO,KAAK,OAAO,GAAwB,GAAM,IAAI,CACzD,CAIA,OAAUS,EAA0DE,EAAgB,CAChF,IAAMrB,EAAW,KAAK,SAAQ,EAC1BsB,EAAmCD,EACnCnB,EAAOF,EAAS,KAAI,EACxB,KAAO,CAACE,EAAK,MACLoB,IAAkB,OAClBA,EAAgBpB,EAAK,MAErBoB,EAAgBH,EAAWG,EAAepB,EAAK,KAAK,EAExDA,EAAOF,EAAS,KAAI,EAExB,OAAOsB,CACX,CAIA,YAAeH,EAA0DE,EAAgB,CACrF,OAAO,KAAK,gBAAgB,KAAK,SAAQ,EAAIF,EAAYE,CAAY,CACzE,CAEU,gBAAmBrB,EAAuBmB,EAA0DE,EAAgB,CAC1H,IAAMnB,EAAOF,EAAS,KAAI,EAC1B,GAAIE,EAAK,KACL,OAAOmB,EAEX,IAAMC,EAAgB,KAAK,gBAAgBtB,EAAUmB,EAAYE,CAAY,EAC7E,OAAIC,IAAkB,OACXpB,EAAK,MAETiB,EAAWG,EAAepB,EAAK,KAAK,CAC/C,CAIA,KAAKgB,EAAgC,CACjC,IAAMlB,EAAW,KAAK,SAAQ,EAC1BE,EAAOF,EAAS,KAAI,EACxB,KAAO,CAACE,EAAK,MAAM,CACf,GAAIgB,EAAUhB,EAAK,KAAK,EACpB,OAAOA,EAAK,MAEhBA,EAAOF,EAAS,KAAI,CACxB,CAEJ,CAEA,UAAUkB,EAAgC,CACtC,IAAMlB,EAAW,KAAK,SAAQ,EAC1BiB,EAAQ,EACRf,EAAOF,EAAS,KAAI,EACxB,KAAO,CAACE,EAAK,MAAM,CACf,GAAIgB,EAAUhB,EAAK,KAAK,EACpB,OAAOe,EAEXf,EAAOF,EAAS,KAAI,EACpBiB,GACJ,CACA,MAAO,EACX,CAEA,SAASF,EAAgB,CACrB,IAAMf,EAAW,KAAK,SAAQ,EAC1BE,EAAOF,EAAS,KAAI,EACxB,KAAO,CAACE,EAAK,MAAM,CACf,GAAIA,EAAK,QAAUa,EACf,MAAO,GAEXb,EAAOF,EAAS,KAAI,CACxB,CACA,MAAO,EACX,CAEA,QAAWmB,EAAyC,CAEhD,OAAO,IAAIvB,EACP,KAAO,CAAE,KAAM,KAAK,QAAO,CAAE,GAC5Ba,GAAS,CACN,EAAG,CACC,GAAIA,EAAM,SAAU,CAChB,IAAMP,EAAOO,EAAM,SAAS,KAAI,EAChC,GAAIP,EAAK,KACLO,EAAM,SAAW,WAEjB,QAAOP,CAEf,CACA,GAAM,CAAE,KAAAkB,EAAM,MAAAR,CAAK,EAAK,KAAK,OAAOH,EAAM,IAAI,EAC9C,GAAI,CAACW,EAAM,CACP,IAAMG,EAASJ,EAAWP,CAAK,EAC/B,GAAIY,GAAWD,CAAM,EACjBd,EAAM,SAAWc,EAAO,OAAO,QAAQ,EAAC,MAExC,OAAO,CAAE,KAAM,GAAO,MAAOA,CAAM,CAE3C,CACJ,OAASd,EAAM,UACf,OAAOC,EACX,CAAC,CAET,CAEA,KAA2Be,EAAS,CAIhC,GAHIA,IAAU,SACVA,EAAQ,GAERA,GAAS,EACT,OAAO,KAEX,IAAMC,EAASD,EAAQ,EAAI,KAAK,KAAKA,EAAQ,CAAC,EAAmC,KAEjF,OAAO,IAAI7B,EACP,KAAO,CAAE,KAAM8B,EAAO,QAAO,CAAE,GAC9BjB,GAAS,CACN,EAAG,CACC,GAAIA,EAAM,SAAU,CAChB,IAAMP,EAAOO,EAAM,SAAS,KAAI,EAChC,GAAIP,EAAK,KACLO,EAAM,SAAW,WAEjB,QAAOP,CAEf,CACA,GAAM,CAAE,KAAAkB,EAAM,MAAAR,CAAK,EAAKc,EAAO,OAAOjB,EAAM,IAAI,EAChD,GAAI,CAACW,EACD,GAAII,GAAWZ,CAAK,EAChBH,EAAM,SAAWG,EAAM,OAAO,QAAQ,EAAC,MAEvC,OAAO,CAAE,KAAM,GAAO,MAAOA,CAAK,CAG9C,OAASH,EAAM,UACf,OAAOC,EACX,CAAC,CAET,CAEA,MAAI,CAEA,IAAMP,EADW,KAAK,SAAQ,EACN,KAAI,EAC5B,GAAI,CAAAA,EAAO,KAGX,OAAOA,EAAO,KAClB,CAEA,KAAKwB,EAAY,EAAC,CACd,OAAO,IAAI/B,EACP,IAAK,CACD,IAAMa,EAAQ,KAAK,QAAO,EAC1B,QAASmB,EAAI,EAAGA,EAAID,EAAWC,IAE3B,GADa,KAAK,OAAOnB,CAAK,EACrB,KACL,OAAOA,EAGf,OAAOA,CACX,EACA,KAAK,MAAM,CAEnB,CAEA,MAAMoB,EAAe,CACjB,OAAO,IAAIjC,EACP,KAAO,CAAE,KAAM,EAAG,MAAO,KAAK,QAAO,CAAE,GACvCa,IACIA,EAAM,OACFA,EAAM,KAAOoB,EACNnB,GAEJ,KAAK,OAAOD,EAAM,KAAK,EACjC,CAET,CAEA,SAAkBqB,EAAwB,CACtC,OAAO,IAAIlC,EACP,KAAO,CAAE,IAAK,IAAI,IAAgB,cAAe,KAAK,QAAO,CAAE,GAC/Da,GAAQ,CACJ,IAAIN,EACJ,EAEI,IADAA,EAAS,KAAK,OAAOM,EAAM,aAAa,EACpC,CAACN,EAAO,KAAM,CACd,IAAMS,EAAQkB,EAAKA,EAAG3B,EAAO,KAAK,EAAIA,EAAO,MAC7C,GAAI,CAACM,EAAM,IAAI,IAAIG,CAAK,EACpB,OAAAH,EAAM,IAAI,IAAIG,CAAK,EACZT,CAEf,OACK,CAACA,EAAO,MACjB,OAAOO,EACX,CAAC,CAET,CAEA,QAAiBF,EAAoBuB,EAAyB,CAC1D,IAAMC,EAAc,IAAI,IACxB,QAAWC,KAAQzB,EAAO,CACtB,IAAMI,EAAQmB,EAAMA,EAAIE,CAAI,EAAIA,EAChCD,EAAY,IAAIpB,CAAK,CACzB,CACA,OAAO,KAAK,OAAOsB,GAAI,CACnB,IAAMC,EAASJ,EAAMA,EAAIG,CAAC,EAAIA,EAC9B,MAAO,CAACF,EAAY,IAAIG,CAAM,CAClC,CAAC,CACL,GAGJ,SAASrB,GAASmB,EAAa,CAC3B,OAAI,OAAOA,GAAS,SACTA,EAEP,OAAOA,EAAS,IACT,YAGP,OAAQA,EAAa,UAAa,WAE1BA,EAAa,SAAQ,EAE1B,OAAO,UAAU,SAAS,KAAKA,CAAI,CAC9C,CAbSpC,EAAAiB,GAAA,YAeT,SAASU,GAAcY,EAAY,CAC/B,MAAO,CAAC,CAACA,GAAO,OAAQA,EAAoB,OAAO,QAAQ,GAAM,UACrE,CAFSvC,EAAA2B,GAAA,cAQF,IAAMa,GAA4B,IAAI1C,GAA2B,IAAG,GAAc,IAAMe,EAAW,EAK7FA,GAA+C,OAAO,OAAO,CAAE,KAAM,GAAM,MAAO,MAAS,CAAE,EAKpG,SAAUgB,KAAaY,EAA8C,CACvE,GAAIA,EAAY,SAAW,EAAG,CAC1B,IAAMC,EAAaD,EAAY,CAAC,EAChC,GAAIC,aAAsB5C,GACtB,OAAO4C,EAEX,GAAIf,GAAWe,CAAU,EACrB,OAAO,IAAI5C,GACP,IAAM4C,EAAW,OAAO,QAAQ,EAAC,EAChCvC,GAAaA,EAAS,KAAI,CAAE,EAGrC,GAAI,OAAOuC,EAAW,QAAW,SAC7B,OAAO,IAAI5C,GACP,KAAO,CAAE,MAAO,CAAC,GAChBc,GACOA,EAAM,MAAQ8B,EAAW,OAClB,CAAE,KAAM,GAAO,MAAOA,EAAW9B,EAAM,OAAO,CAAC,EAE/CC,EAEd,CAGb,CACA,OAAI4B,EAAY,OAAS,EAEd,IAAI3C,GACP,KAAO,CAAE,UAAW,EAAG,SAAU,CAAC,GACjCc,GAAS,CACN,EAAG,CACC,GAAIA,EAAM,SAAU,CAChB,IAAMP,EAAOO,EAAM,SAAS,KAAI,EAChC,GAAI,CAACP,EAAK,KACN,OAAOA,EAEXO,EAAM,SAAW,MACrB,CACA,GAAIA,EAAM,MAAO,CACb,GAAIA,EAAM,SAAWA,EAAM,MAAM,OAC7B,MAAO,CAAE,KAAM,GAAO,MAAOA,EAAM,MAAMA,EAAM,UAAU,CAAC,EAE9DA,EAAM,MAAQ,OACdA,EAAM,SAAW,CACrB,CACA,GAAIA,EAAM,UAAY6B,EAAY,OAAQ,CACtC,IAAMC,EAAaD,EAAY7B,EAAM,WAAW,EAC5Ce,GAAWe,CAAU,EACrB9B,EAAM,SAAW8B,EAAW,OAAO,QAAQ,EAAC,EACrCA,GAAc,OAAOA,EAAW,QAAW,WAClD9B,EAAM,MAAQ8B,EAEtB,CACJ,OAAS9B,EAAM,UAAYA,EAAM,OAASA,EAAM,UAAY6B,EAAY,QACxE,OAAO5B,EACX,CAAC,EAGF2B,EACX,CA3DgBxC,EAAA6B,EAAA,UAoFV,IAAOc,GAAP,cACM7C,EAAiE,CA7xB7E,MA6xB6E,CAAAE,EAAA,uBAGzE,YAAY4C,EAASC,EAAoCC,EAAmC,CACxF,MACI,KAAO,CACH,UAAWA,GAAS,YAAc,CAAC,CAACF,CAAI,EAAE,OAAO,QAAQ,EAAC,CAAE,EAAI,CAACC,EAASD,CAAI,EAAE,OAAO,QAAQ,EAAC,CAAE,EAClG,OAAQ,KAEZhC,GAAQ,CAKJ,IAJIA,EAAM,SACNA,EAAM,UAAU,IAAG,EACnBA,EAAM,OAAS,IAEZA,EAAM,UAAU,OAAS,GAAG,CAE/B,IAAMP,EADWO,EAAM,UAAUA,EAAM,UAAU,OAAS,CAAC,EACrC,KAAI,EAC1B,GAAIP,EAAK,KACLO,EAAM,UAAU,IAAG,MAEnB,QAAAA,EAAM,UAAU,KAAKiC,EAASxC,EAAK,KAAK,EAAE,OAAO,QAAQ,EAAC,CAAE,EACrDA,CAEf,CACA,OAAOQ,EACX,CAAC,CAET,CAES,UAAQ,CACb,IAAMV,EAAW,CACb,MAAO,KAAK,QAAO,EACnB,KAAMH,EAAA,IAAM,KAAK,OAAOG,EAAS,KAAK,EAAhC,QACN,MAAOH,EAAA,IAAK,CACRG,EAAS,MAAM,OAAS,EAC5B,EAFO,SAGP,CAAC,OAAO,QAAQ,EAAG,IAAMA,GAE7B,OAAOA,CACX,GAMa4C,IAAjB,SAAiBA,EAAS,CAKtB,SAAgBC,EAAInB,EAAsB,CACtC,OAAOA,EAAO,OAAO,CAACoB,EAAGC,IAAMD,EAAIC,EAAG,CAAC,CAC3C,CAFgBlD,EAAAgD,EAAA,OAAAD,EAAA,IAAGC,EAOnB,SAAgBG,EAAQtB,EAAsB,CAC1C,OAAOA,EAAO,OAAO,CAACoB,EAAGC,IAAMD,EAAIC,EAAG,CAAC,CAC3C,CAFgBlD,EAAAmD,EAAA,WAAAJ,EAAA,QAAOI,EAOvB,SAAgBC,EAAIvB,EAAsB,CACtC,OAAOA,EAAO,OAAO,CAACoB,EAAGC,IAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CACjD,CAFgBlD,EAAAoD,EAAA,OAAAL,EAAA,IAAGK,EAOnB,SAAgBC,EAAIxB,EAAsB,CACtC,OAAOA,EAAO,OAAO,CAACoB,EAAGC,IAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CACjD,CAFgBlD,EAAAqD,EAAA,OAAAN,EAAA,IAAGM,CAIvB,GA9BiBN,KAAAA,GAAS,CAAA,EAAA,EFxzBpB,SAAUO,GAAUC,EAAa,CACnC,OAAO,IAAIC,GAAeD,EAAME,GACxBC,GAAmBD,CAAO,EACnBA,EAAQ,QAER,CAAA,EAEZ,CAAE,YAAa,EAAI,CAAE,CAC5B,CARgBE,EAAAL,GAAA,aAaV,SAAUM,GAAWL,EAAa,CACpC,OAAOD,GAAUC,CAAI,EAAE,OAAOM,EAAa,CAC/C,CAFgBF,EAAAC,GAAA,cAOV,SAAUE,GAAYC,EAAgBC,EAAe,CACvD,KAAOD,EAAM,WAET,GADAA,EAAQA,EAAM,UACVA,IAAUC,EACV,MAAO,GAGf,MAAO,EACX,CARgBL,EAAAG,GAAA,eAUV,SAAUG,GAAaC,EAAa,CAGtC,MAAO,CACH,MAAO,CACH,UAAWA,EAAM,YAAe,EAChC,KAAMA,EAAM,UAAa,GAE7B,IAAK,CACD,UAAWA,EAAM,UACjB,KAAMA,EAAM,QAAW,GAGnC,CAbgBP,EAAAM,GAAA,gBAiBV,SAAUE,GAAkBZ,EAAc,CAC5C,GAAI,CAACA,EACD,OAEJ,GAAM,CAAE,OAAAa,EAAQ,IAAAC,EAAK,MAAAC,CAAK,EAAKf,EAC/B,MAAO,CACH,MAAAe,EACA,OAAAF,EACA,IAAAC,EACA,OAAQA,EAAMD,EAEtB,CAXgBT,EAAAQ,GAAA,qBAahB,IAAYI,IAAZ,SAAYA,EAAe,CACvBA,EAAAA,EAAA,OAAA,CAAA,EAAA,SACAA,EAAAA,EAAA,MAAA,CAAA,EAAA,QACAA,EAAAA,EAAA,aAAA,CAAA,EAAA,eACAA,EAAAA,EAAA,YAAA,CAAA,EAAA,cACAA,EAAAA,EAAA,OAAA,CAAA,EAAA,SACAA,EAAAA,EAAA,QAAA,CAAA,EAAA,SACJ,GAPYA,KAAAA,GAAe,CAAA,EAAA,EASrB,SAAUC,GAAaF,EAAcG,EAAS,CAChD,GAAIH,EAAM,IAAI,KAAOG,EAAG,MAAM,MAASH,EAAM,IAAI,OAASG,EAAG,MAAM,MAAQH,EAAM,IAAI,WAAaG,EAAG,MAAM,UACvG,OAAOF,GAAgB,OACpB,GAAID,EAAM,MAAM,KAAOG,EAAG,IAAI,MAASH,EAAM,MAAM,OAASG,EAAG,IAAI,MAAQH,EAAM,MAAM,WAAaG,EAAG,IAAI,UAC9G,OAAOF,GAAgB,MAE3B,IAAMG,EAAcJ,EAAM,MAAM,KAAOG,EAAG,MAAM,MAASH,EAAM,MAAM,OAASG,EAAG,MAAM,MAAQH,EAAM,MAAM,WAAaG,EAAG,MAAM,UAC3HE,EAAYL,EAAM,IAAI,KAAOG,EAAG,IAAI,MAASH,EAAM,IAAI,OAASG,EAAG,IAAI,MAAQH,EAAM,IAAI,WAAaG,EAAG,IAAI,UACnH,OAAIC,GAAeC,EACRJ,GAAgB,OAChBG,EACAH,GAAgB,YAChBI,EACAJ,GAAgB,aAEhBA,GAAgB,OAE/B,CAjBgBZ,EAAAa,GAAA,gBAmBV,SAAUI,GAAQN,EAAcG,EAAS,CAE3C,OADmBD,GAAaF,EAAOG,CAAE,EACrBF,GAAgB,KACxC,CAHgBZ,EAAAiB,GAAA,WAOT,IAAMC,GAAoB,eAQ3B,SAAUC,GAA4BC,EAA8BX,EAAgBY,EAAaH,GAAiB,CACpH,GAAIE,EAAS,CACT,GAAIX,EAAS,EAAG,CACZ,IAAMa,EAAcb,EAASW,EAAQ,OAC/BG,EAAeH,EAAQ,KAAK,OAAOE,CAAW,EAC/CD,EAAW,KAAKE,CAAY,GAC7Bd,GAER,CACA,OAAOe,GAAqBJ,EAASX,CAAM,CAC/C,CAEJ,CAZgBT,EAAAmB,GAAA,+BAcV,SAAUM,GAAgBL,EAA8BM,EAAsB,CAChF,GAAIN,EAAS,CACT,IAAMO,EAAWC,GAAgBR,EAAS,EAAI,EAC9C,GAAIO,GAAYE,GAAcF,EAAUD,CAAY,EAChD,OAAOC,EAEX,GAAIG,GAAcV,CAAO,EAAG,CAGxB,IAAMW,EAAWX,EAAQ,QAAQ,UAAUY,GAAK,CAACA,EAAE,MAAM,EACzD,QAAS,EAAID,EAAW,EAAG,GAAK,EAAG,IAAK,CACpC,IAAM3B,EAAQgB,EAAQ,QAAQ,CAAC,EAC/B,GAAIS,GAAczB,EAAOsB,CAAY,EACjC,OAAOtB,CAEf,CACJ,CACJ,CAEJ,CAnBgBJ,EAAAyB,GAAA,mBAqBV,SAAUI,GAAcT,EAAkBM,EAAsB,CAClE,OAAOxB,GAAckB,CAAO,GAAKM,EAAa,SAASN,EAAQ,UAAU,IAAI,CACjF,CAFgBpB,EAAA6B,GAAA,iBAcV,SAAUL,GAAqB5B,EAAea,EAAc,CAC9D,GAAIP,GAAcN,CAAI,EAClB,OAAOA,EACJ,GAAIG,GAAmBH,CAAI,EAAG,CACjC,IAAMqC,EAAeC,GAAatC,EAAMa,EAAQ,EAAK,EACrD,GAAIwB,EACA,OAAOT,GAAqBS,EAAcxB,CAAM,CAExD,CAEJ,CAVgBT,EAAAwB,GAAA,wBAsBV,SAAUW,GAAyBvC,EAAea,EAAc,CAClE,GAAIP,GAAcN,CAAI,EAClB,OAAOA,EACJ,GAAIG,GAAmBH,CAAI,EAAG,CACjC,IAAMqC,EAAeC,GAAatC,EAAMa,EAAQ,EAAI,EACpD,GAAIwB,EACA,OAAOE,GAAyBF,EAAcxB,CAAM,CAE5D,CAEJ,CAVgBT,EAAAmC,GAAA,4BAYhB,SAASD,GAAatC,EAAwBa,EAAgB2B,EAAgB,CAC1E,IAAIC,EAAO,EACPC,EAAQ1C,EAAK,QAAQ,OAAS,EAC9B2C,EAEJ,KAAOF,GAAQC,GAAO,CAClB,IAAME,EAAS,KAAK,OAAOH,EAAOC,GAAS,CAAC,EACtCG,EAAa7C,EAAK,QAAQ4C,CAAM,EAEtC,GAAIC,EAAW,QAAUhC,GAAUgC,EAAW,IAAMhC,EAEhD,OAAOgC,EAGPA,EAAW,KAAOhC,GAElB8B,EAAcH,EAAUK,EAAa,OACrCJ,EAAOG,EAAS,GAGhBF,EAAQE,EAAS,CAEzB,CAEA,OAAOD,CACX,CAzBSvC,EAAAkC,GAAA,gBA2BH,SAAUN,GAAgBhC,EAAe8C,EAAS,GAAI,CACxD,KAAO9C,EAAK,WAAW,CACnB,IAAMS,EAAST,EAAK,UAChB+C,EAAQtC,EAAO,QAAQ,QAAQT,CAAI,EACvC,KAAO+C,EAAQ,GAAG,CACdA,IACA,IAAMhB,EAAWtB,EAAO,QAAQsC,CAAK,EACrC,GAAID,GAAU,CAACf,EAAS,OACpB,OAAOA,CAEf,CACA/B,EAAOS,CACX,CAEJ,CAdgBL,EAAA4B,GAAA,mBAgBV,SAAUgB,GAAYhD,EAAe8C,EAAS,GAAI,CACpD,KAAO9C,EAAK,WAAW,CACnB,IAAMS,EAAST,EAAK,UAChB+C,EAAQtC,EAAO,QAAQ,QAAQT,CAAI,EACjCiD,EAAOxC,EAAO,QAAQ,OAAS,EACrC,KAAOsC,EAAQE,GAAM,CACjBF,IACA,IAAMG,EAAOzC,EAAO,QAAQsC,CAAK,EACjC,GAAID,GAAU,CAACI,EAAK,OAChB,OAAOA,CAEf,CACAlD,EAAOS,CACX,CAEJ,CAfgBL,EAAA4C,GAAA,eAiBV,SAAUG,GAAiBnD,EAAa,CAC1C,GAAIA,EAAK,MAAM,MAAM,YAAc,EAC/B,OAAOA,EAEX,IAAMoD,EAAOpD,EAAK,MAAM,MAAM,KAC1BiD,EAAOjD,EACP+C,EACJ,KAAO/C,EAAK,WAAW,CACnB,IAAMS,EAAST,EAAK,UACdqD,EAAYN,GAAStC,EAAO,QAAQ,QAAQT,CAAI,EAQtD,GAPIqD,IAAc,GACdrD,EAAOS,EACPsC,EAAQ,SAERA,EAAQM,EAAY,EACpBrD,EAAOS,EAAO,QAAQsC,CAAK,GAE3B/C,EAAK,MAAM,MAAM,OAASoD,EAC1B,MAEJH,EAAOjD,CACX,CACA,OAAOiD,CACX,CAvBgB7C,EAAA+C,GAAA,oBAyBV,SAAUG,GAAiBC,EAAgBzC,EAAY,CACzD,IAAM0C,EAAeC,GAAgBF,EAAOzC,CAAG,EAC/C,OAAK0C,EAGEA,EAAa,OAAO,QAAQ,MAAMA,EAAa,EAAI,EAAGA,EAAa,CAAC,EAFhE,CAAA,CAGf,CANgBpD,EAAAkD,GAAA,oBAQhB,SAASG,GAAgBC,EAAYC,EAAU,CAC3C,IAAMC,EAAWC,GAAeH,CAAC,EAC3BI,EAAWD,GAAeF,CAAC,EAC7BI,EACJ,QAASC,EAAI,EAAGA,EAAIJ,EAAS,QAAUI,EAAIF,EAAS,OAAQE,IAAK,CAC7D,IAAMC,EAAUL,EAASI,CAAC,EACpBE,EAAUJ,EAASE,CAAC,EAC1B,GAAIC,EAAQ,SAAWC,EAAQ,OAC3BH,EAAU,CACN,OAAQE,EAAQ,OAChB,EAAGA,EAAQ,MACX,EAAGC,EAAQ,WAGf,MAER,CACA,OAAOH,CACX,CAlBS3D,EAAAqD,GAAA,mBA0BT,SAASI,GAAe7D,EAAa,CACjC,IAAMmE,EAAsB,CAAA,EAC5B,KAAOnE,EAAK,WAAW,CACnB,IAAMS,EAAST,EAAK,UACd+C,EAAQtC,EAAO,QAAQ,QAAQT,CAAI,EACzCmE,EAAM,KAAK,CACP,OAAA1D,EACA,MAAAsC,EACH,EACD/C,EAAOS,CACX,CACA,OAAO0D,EAAM,QAAO,CACxB,CAZS/D,EAAAyD,GAAA,kBGnUT,IAAAO,GAAA,GAAAC,GAAAD,GAAA,oBAAAE,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,gCAAAC,GAAA,yBAAAC,GAAA,uBAAAC,GAAA,kBAAAC,GAAA,yBAAAC,GAAA,8BAAAC,GAAA,iBAAAC,GAAA,wBAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,oBAAAC,GAAA,gBAAAC,GAAA,uBAAAC,GAAA,oBAAAC,GAAA,sBAAAC,GAAA,eAAAC,GAAA,mBAAAC,GAAA,0BAAAC,GAAA,kBAAAC,KCQM,IAAOC,GAAP,cAAiC,KAAK,CAR5C,MAQ4C,CAAAC,EAAA,0BACxC,YAAYC,EAA2BC,EAAe,CAClD,MAAMD,EAAO,GAAGC,CAAO,OAAOD,EAAK,MAAM,MAAM,IAAI,IAAIA,EAAK,MAAM,MAAM,SAAS,GAAKC,CAAO,CACjG,GAGE,SAAUC,GAAkBC,EAAQ,CACtC,MAAM,IAAI,MAAM,yCAAyC,CAC7D,CAFgBJ,EAAAG,GAAA,qBCdhB,IAAAE,GAAA,GAAAC,GAAAD,GAAA,qBAAAE,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,WAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,cAAAC,GAAA,eAAAC,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,cAAAC,GAAA,gBAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,cAAAC,GAAA,YAAAC,GAAA,kBAAAC,GAAA,UAAAC,GAAA,iBAAAC,GAAA,cAAAC,GAAA,YAAAC,GAAA,gCAAAC,GAAA,4BAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,aAAAC,GAAA,kBAAAC,GAAA,cAAAC,GAAA,uBAAAC,GAAA,eAAAC,GAAA,kBAAAC,GAAA,eAAAC,GAAA,eAAAC,GAAA,aAAAC,GAAA,eAAAC,GAAA,kBAAAC,GAAA,yBAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,qBAAAC,GAAA,SAAAC,GAAA,kBAAAC,GAAA,mBAAAC,GAAA,cAAAC,GAAA,mBAAAC,GAAA,eAAAC,GAAA,iBAAAC,GAAA,aAAAC,GAAA,sBAAAC,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,aAAAC,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,iBAAAC,GAAA,qBAAAC,GAAA,qBAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,qBAAAC,GAAA,kBAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,cAAAC,GAAA,oBAAAC,GAAA,YAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,cAAAC,GAAA,oBAAAC,GAAA,mBAAAC,GAAA,eAAAC,GAAA,oBAAAC,GAAA,gBAAAC,GAAA,yBAAAC,GAAA,iBAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,eAAAC,GAAA,iBAAAC,GAAA,oBAAAC,GAAA,2BAAAC,GAAA,oBAAAC,GAAA,mBAAAC,GAAA,uBAAAC,GAAA,WAAAC,GAAA,oBAAAC,GAAA,qBAAAC,GAAA,gBAAAC,GAAA,qBAAAC,GAAA,iBAAAC,GAAA,mBAAAC,GAAA,eAAAC,GAAA,eAAAC,IASO,IAAMC,GAA0B,CACnC,GAAI,qBACJ,OAAQ,kCACR,OAAQ,iDACR,aAAc,oEACd,GAAI,MACJ,WAAY,mBACZ,WAAY,gBA6DHC,GAAe,eAEtB,SAAUC,GAAeC,EAAa,CACxC,OAAOC,EAAW,WAAWD,EAAMF,EAAY,CACnD,CAFgBI,EAAAH,GAAA,kBAMT,IAAMI,GAAe,eAEtB,SAAUC,GAAeJ,EAAa,CACxC,OAAOC,EAAW,WAAWD,EAAMG,EAAY,CACnD,CAFgBD,EAAAE,GAAA,kBAMT,IAAMC,GAAY,YAEnB,SAAUC,GAAYN,EAAa,CACrC,OAAOC,EAAW,WAAWD,EAAMK,EAAS,CAChD,CAFgBH,EAAAI,GAAA,eAMV,SAAUC,GAAcP,EAAa,CACvC,OAAOQ,GAAgBR,CAAI,GAAKA,IAAS,WAAaA,IAAS,SAAWA,IAAS,WAAaA,IAAS,SAAWA,IAAS,YAAcA,IAAS,WAAaA,IAAS,UAAYA,IAAS,UAAYA,IAAS,aAAeA,IAAS,WAAaA,IAAS,YAAcA,IAAS,QAAUA,IAAS,QAAUA,IAAS,SAAWA,IAAS,UAAYA,IAAS,QAAW,OAAOA,GAAS,UAAa,qBAAqB,KAAKA,CAAI,CAClb,CAFgBE,EAAAK,GAAA,iBAMV,SAAUC,GAAgBR,EAAa,CACzC,OAAOA,IAAS,UAAYA,IAAS,UAAYA,IAAS,WAAaA,IAAS,QAAUA,IAAS,QACvG,CAFgBE,EAAAM,GAAA,mBAMT,IAAMC,GAAiB,iBAExB,SAAUC,GAAiBV,EAAa,CAC1C,OAAOC,EAAW,WAAWD,EAAMS,EAAc,CACrD,CAFgBP,EAAAQ,GAAA,oBAMT,IAAMC,GAAe,eAEtB,SAAUC,GAAeZ,EAAa,CACxC,OAAOC,EAAW,WAAWD,EAAMW,EAAY,CACnD,CAFgBT,EAAAU,GAAA,kBAUT,IAAMC,GAAkB,kBAEzB,SAAUC,GAAkBd,EAAa,CAC3C,OAAOC,EAAW,WAAWD,EAAMa,EAAe,CACtD,CAFgBX,EAAAY,GAAA,qBAUT,IAAMC,GAAe,eAEtB,SAAUC,GAAehB,EAAa,CACxC,OAAOC,EAAW,WAAWD,EAAMe,EAAY,CACnD,CAFgBb,EAAAc,GAAA,kBAUT,IAAMC,GAAY,YAEnB,SAAUC,GAAYlB,EAAa,CACrC,OAAOC,EAAW,WAAWD,EAAMiB,EAAS,CAChD,CAFgBf,EAAAgB,GAAA,eAUT,IAAMC,GAAiB,iBAExB,SAAUC,GAAiBpB,EAAa,CAC1C,OAAOC,EAAW,WAAWD,EAAMmB,EAAc,CACrD,CAFgBjB,EAAAkB,GAAA,oBAWT,IAAMC,GAAc,cAErB,SAAUC,GAActB,EAAa,CACvC,OAAOC,EAAW,WAAWD,EAAMqB,EAAW,CAClD,CAFgBnB,EAAAoB,GAAA,iBAWT,IAAMC,GAAc,cAErB,SAAUC,GAAcxB,EAAa,CACvC,OAAOC,EAAW,WAAWD,EAAMuB,EAAW,CAClD,CAFgBrB,EAAAsB,GAAA,iBAiBT,IAAMC,GAAU,UAEjB,SAAUC,GAAU1B,EAAa,CACnC,OAAOC,EAAW,WAAWD,EAAMyB,EAAO,CAC9C,CAFgBvB,EAAAwB,GAAA,aAUT,IAAMC,GAAgB,gBAEvB,SAAUC,GAAgB5B,EAAa,CACzC,OAAOC,EAAW,WAAWD,EAAM2B,EAAa,CACpD,CAFgBzB,EAAA0B,GAAA,mBAUT,IAAMC,GAAe,eAEtB,SAAUC,GAAe9B,EAAa,CACxC,OAAOC,EAAW,WAAWD,EAAM6B,EAAY,CACnD,CAFgB3B,EAAA4B,GAAA,kBAYT,IAAMC,GAAY,YAEnB,SAAUC,GAAYhC,EAAa,CACrC,OAAOC,EAAW,WAAWD,EAAM+B,EAAS,CAChD,CAFgB7B,EAAA8B,GAAA,eAYT,IAAMC,GAAgB,gBAEvB,SAAUC,GAAgBlC,EAAa,CACzC,OAAOC,EAAW,WAAWD,EAAMiC,EAAa,CACpD,CAFgB/B,EAAAgC,GAAA,mBAUT,IAAMC,GAAW,WAElB,SAAUC,GAAWpC,EAAa,CACpC,OAAOC,EAAW,WAAWD,EAAMmC,EAAQ,CAC/C,CAFgBjC,EAAAkC,GAAA,cAUT,IAAMC,GAAgB,gBAEvB,SAAUC,GAAgBtC,EAAa,CACzC,OAAOC,EAAW,WAAWD,EAAMqC,EAAa,CACpD,CAFgBnC,EAAAoC,GAAA,mBAUT,IAAMC,GAAY,YAEnB,SAAUC,GAAYxC,EAAa,CACrC,OAAOC,EAAW,WAAWD,EAAMuC,EAAS,CAChD,CAFgBrC,EAAAsC,GAAA,eAUT,IAAMC,GAAqB,qBAE5B,SAAUC,GAAqB1C,EAAa,CAC9C,OAAOC,EAAW,WAAWD,EAAMyC,EAAkB,CACzD,CAFgBvC,EAAAwC,GAAA,wBAoBT,IAAMC,GAAa,aAEpB,SAAUC,GAAa5C,EAAa,CACtC,OAAOC,EAAW,WAAWD,EAAM2C,EAAU,CACjD,CAFgBzC,EAAA0C,GAAA,gBAUT,IAAMC,GAAgB,gBAEvB,SAAUC,GAAgB9C,EAAa,CACzC,OAAOC,EAAW,WAAWD,EAAM6C,EAAa,CACpD,CAFgB3C,EAAA4C,GAAA,mBAUT,IAAMC,GAAa,aAEpB,SAAUC,GAAahD,EAAa,CACtC,OAAOC,EAAW,WAAWD,EAAM+C,EAAU,CACjD,CAFgB7C,EAAA8C,GAAA,gBAYT,IAAMC,GAAa,aAEpB,SAAUC,GAAalD,EAAa,CACtC,OAAOC,EAAW,WAAWD,EAAMiD,EAAU,CACjD,CAFgB/C,EAAAgD,GAAA,gBAUT,IAAMC,GAAgB,gBAEvB,SAAUC,GAAgBpD,EAAa,CACzC,OAAOC,EAAW,WAAWD,EAAMmD,EAAa,CACpD,CAFgBjD,EAAAkD,GAAA,mBAcT,IAAMC,GAAe,eAEtB,SAAUC,GAAetD,EAAa,CACxC,OAAOC,EAAW,WAAWD,EAAMqD,EAAY,CACnD,CAFgBnD,EAAAoD,GAAA,kBAWT,IAAMC,GAAO,OAEd,SAAUC,GAAOxD,EAAa,CAChC,OAAOC,EAAW,WAAWD,EAAMuD,EAAI,CAC3C,CAFgBrD,EAAAsD,GAAA,UAaT,IAAMC,GAAgB,gBAEvB,SAAUC,GAAgB1D,EAAa,CACzC,OAAOC,EAAW,WAAWD,EAAMyD,EAAa,CACpD,CAFgBvD,EAAAwD,GAAA,mBAUT,IAAMC,GAAY,YAEnB,SAAUC,GAAY5D,EAAa,CACrC,OAAOC,EAAW,WAAWD,EAAM2D,EAAS,CAChD,CAFgBzD,EAAA0D,GAAA,eAYT,IAAMC,GAAS,SAEhB,SAAUC,GAAS9D,EAAa,CAClC,OAAOC,EAAW,WAAWD,EAAM6D,EAAM,CAC7C,CAFgB3D,EAAA4D,GAAA,YAST,IAAMC,GAAe,eAEtB,SAAUC,GAAehE,EAAa,CACxC,OAAOC,EAAW,WAAWD,EAAM+D,EAAY,CACnD,CAFgB7D,EAAA8D,GAAA,kBAWT,IAAMC,GAAa,aAEpB,SAAUC,GAAalE,EAAa,CACtC,OAAOC,EAAW,WAAWD,EAAMiE,EAAU,CACjD,CAFgB/D,EAAAgE,GAAA,gBAUT,IAAMC,GAAiB,iBAExB,SAAUC,GAAiBpE,EAAa,CAC1C,OAAOC,EAAW,WAAWD,EAAMmE,EAAc,CACrD,CAFgBjE,EAAAkE,GAAA,oBAWT,IAAMC,GAAiB,iBAExB,SAAUC,GAAiBtE,EAAa,CAC1C,OAAOC,EAAW,WAAWD,EAAMqE,EAAc,CACrD,CAFgBnE,EAAAoE,GAAA,oBAQT,IAAMC,GAAY,YAEnB,SAAUC,GAAYxE,EAAa,CACrC,OAAOC,EAAW,WAAWD,EAAMuE,EAAS,CAChD,CAFgBrE,EAAAsE,GAAA,eAUT,IAAMC,GAAQ,QAEf,SAAUC,GAAQ1E,EAAa,CACjC,OAAOC,EAAW,WAAWD,EAAMyE,EAAK,CAC5C,CAFgBvE,EAAAwE,GAAA,WAUT,IAAMC,GAAU,UAEjB,SAAUC,GAAU5E,EAAa,CACnC,OAAOC,EAAW,WAAWD,EAAM2E,EAAO,CAC9C,CAFgBzE,EAAA0E,GAAA,aAST,IAAMC,GAAe,eAEtB,SAAUC,GAAe9E,EAAa,CACxC,OAAOC,EAAW,WAAWD,EAAM6E,EAAY,CACnD,CAFgB3E,EAAA4E,GAAA,kBAST,IAAMC,GAAa,aAEpB,SAAUC,GAAahF,EAAa,CACtC,OAAOC,EAAW,WAAWD,EAAM+E,EAAU,CACjD,CAFgB7E,EAAA8E,GAAA,gBAUT,IAAMC,GAAW,WAElB,SAAUC,GAAWlF,EAAa,CACpC,OAAOC,EAAW,WAAWD,EAAMiF,EAAQ,CAC/C,CAFgB/E,EAAAgF,GAAA,cAST,IAAMC,GAAuB,uBAE9B,SAAUC,GAAuBpF,EAAa,CAChD,OAAOC,EAAW,WAAWD,EAAMmF,EAAoB,CAC3D,CAFgBjF,EAAAkF,GAAA,0BAST,IAAMC,GAAgB,gBAEvB,SAAUC,GAAgBtF,EAAa,CACzC,OAAOC,EAAW,WAAWD,EAAMqF,EAAa,CACpD,CAFgBnF,EAAAoF,GAAA,mBAST,IAAMC,GAAmB,mBAE1B,SAAUC,GAAmBxF,EAAa,CAC5C,OAAOC,EAAW,WAAWD,EAAMuF,EAAgB,CACvD,CAFgBrF,EAAAsF,GAAA,sBAST,IAAMC,GAAiB,iBAExB,SAAUC,GAAiB1F,EAAa,CAC1C,OAAOC,EAAW,WAAWD,EAAMyF,EAAc,CACrD,CAFgBvF,EAAAwF,GAAA,oBAST,IAAMC,GAAa,aAEpB,SAAUC,GAAa5F,EAAa,CACtC,OAAOC,EAAW,WAAWD,EAAM2F,EAAU,CACjD,CAFgBzF,EAAA0F,GAAA,gBAQT,IAAMC,GAAW,WAElB,SAAUC,GAAW9F,EAAa,CACpC,OAAOC,EAAW,WAAWD,EAAM6F,EAAQ,CAC/C,CAFgB3F,EAAA4F,GAAA,cAqDV,IAAOC,GAAP,cAA2CC,EAAqB,CArrBtE,MAqrBsE,CAAA9F,EAAA,oCAElE,aAAW,CACP,MAAO,CAACW,GAAiBf,GAAcK,GAAc0D,GAAQE,GAAchD,GAAcE,GAAWgD,GAAY9C,GAAgBgD,GAAgB9D,GAAWgB,GAAagD,GAAgB9C,GAAagD,GAAW9C,GAASE,GAAe8C,GAAO5C,GAAcE,GAAW4C,GAAS1C,GAAe4C,GAAc1C,GAAUE,GAAeE,GAAWE,GAAoBE,GAAYE,GAAekC,GAAYhC,GAAYkC,GAAUhC,GAAYE,GAAegC,GAAsBE,GAAehC,GAAckC,GAAkBhC,GAAME,GAAehD,GAAgBkD,GAAW8B,GAAgBE,GAAYhF,GAAckF,EAAQ,CACzmB,CAEmB,iBAAiBI,EAAiBC,EAAiB,CAClE,OAAQD,EAAS,CACb,KAAKpC,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACL,KAAKE,GACD,OAAO,KAAK,UAAUhF,GAAiBqF,CAAS,EAEpD,KAAKnF,GACL,KAAKsB,GACL,KAAKc,GACD,OAAO,KAAK,UAAUxC,GAAcuF,CAAS,EAEjD,KAAKjF,GACL,KAAK4B,GACL,KAAKI,GACL,KAAKU,GACD,OAAO,KAAK,UAAUlD,GAAgByF,CAAS,EAEnD,KAAK/E,GACD,OAAO,KAAK,UAAUd,GAAW6F,CAAS,GAAK,KAAK,UAAUvF,GAAcuF,CAAS,EAEzF,KAAK7E,GACL,KAAKE,GACL,KAAKY,GACL,KAAKM,GACD,OAAO,KAAK,UAAUpC,GAAW6F,CAAS,EAE9C,KAAKrE,GACL,KAAKE,GACL,KAAKwB,GACD,OAAO,KAAK,UAAUpD,GAAc+F,CAAS,EAEjD,KAAKvD,GACD,OAAO,KAAK,UAAU7C,GAAcoG,CAAS,GAAK,KAAK,UAAU/F,GAAc+F,CAAS,EAE5F,KAAK7C,GACD,OAAO,KAAK,UAAUvD,GAAcoG,CAAS,EAEjD,QACI,MAAO,EAEf,CACJ,CAEA,iBAAiBC,EAAsB,CACnC,IAAMC,EAAc,GAAGD,EAAQ,UAAU,KAAK,IAAIA,EAAQ,QAAQ,GAClE,OAAQC,EAAa,CACjB,IAAK,cACL,IAAK,sBACL,IAAK,uBACL,IAAK,wBACL,IAAK,qBACD,OAAOjG,GAEX,IAAK,uBACL,IAAK,0BACL,IAAK,gBACD,OAAOL,GAEX,IAAK,uBACD,OAAO2B,GAEX,IAAK,0BACL,IAAK,+BACD,OAAOc,GAEX,IAAK,wBACD,OAAOc,GAEX,QACI,MAAM,IAAI,MAAM,GAAG+C,CAAW,+BAA+B,CAErE,CACJ,CAEA,gBAAgBC,EAAY,CACxB,OAAQA,EAAM,CACV,KAAKxF,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAW,IAI/B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,WAAY,aAAc,CAAA,CAAE,IAIhD,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,IAIjC,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,OAAQ,aAAc,EAAK,IAI/C,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,MAAM,EACd,CAAE,KAAM,OAAO,IAI3B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,MAAM,EACd,CAAE,KAAM,OAAO,IAI3B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,sBAAuB,aAAc,EAAK,EAClD,CAAE,KAAM,eAAgB,aAAc,CAAA,CAAE,EACxC,CAAE,KAAM,UAAW,aAAc,CAAA,CAAE,EACnC,CAAE,KAAM,aAAc,aAAc,CAAA,CAAE,EACtC,CAAE,KAAM,aAAc,aAAc,EAAK,EACzC,CAAE,KAAM,MAAM,EACd,CAAE,KAAM,QAAS,aAAc,CAAA,CAAE,EACjC,CAAE,KAAM,QAAS,aAAc,CAAA,CAAE,EACjC,CAAE,KAAM,eAAgB,aAAc,CAAA,CAAE,IAIpD,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,MAAM,IAI1B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,MAAM,IAI1B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAc,aAAc,CAAA,CAAE,EACtC,CAAE,KAAM,MAAM,EACd,CAAE,KAAM,aAAc,aAAc,CAAA,CAAE,IAIlD,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,eAAgB,aAAc,EAAK,EAC3C,CAAE,KAAM,WAAW,EACnB,CAAE,KAAM,OAAO,IAI3B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,OAAO,IAI3B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,OAAO,IAI3B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,MAAM,IAI1B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,WAAW,IAI/B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,UAAU,EAClB,CAAE,KAAM,sBAAuB,aAAc,EAAK,EAClD,CAAE,KAAM,YAAY,EACpB,CAAE,KAAM,QAAS,aAAc,EAAK,EACpC,CAAE,KAAM,WAAY,aAAc,EAAK,EACvC,CAAE,KAAM,eAAgB,aAAc,CAAA,CAAE,EACxC,CAAE,KAAM,cAAc,EACtB,CAAE,KAAM,MAAM,EACd,CAAE,KAAM,aAAc,aAAc,CAAA,CAAE,EACtC,CAAE,KAAM,YAAY,EACpB,CAAE,KAAM,WAAY,aAAc,EAAK,IAInD,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,eAAe,IAInC,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,MAAM,IAI1B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,eAAe,EACvB,CAAE,KAAM,YAAY,EACpB,CAAE,KAAM,SAAS,IAI7B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,OAAO,IAI3B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,YAAY,EACpB,CAAE,KAAM,WAAY,aAAc,EAAK,EACvC,CAAE,KAAM,SAAU,aAAc,EAAK,EACrC,CAAE,KAAM,MAAM,EACd,CAAE,KAAM,MAAM,IAI1B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,MAAM,EACd,CAAE,KAAM,MAAM,IAI1B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,cAAc,EACtB,CAAE,KAAM,aAAc,aAAc,EAAK,EACzC,CAAE,KAAM,MAAM,EACd,CAAE,KAAM,MAAM,IAI1B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,QAAS,aAAc,CAAA,CAAE,IAI7C,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,SAAS,EACjB,CAAE,KAAM,cAAc,EACtB,CAAE,KAAM,WAAW,EACnB,CAAE,KAAM,UAAU,EAClB,CAAE,KAAM,MAAM,IAI1B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAY,aAAc,CAAA,CAAE,EACpC,CAAE,KAAM,WAAW,IAI/B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,SAAS,EACjB,CAAE,KAAM,WAAW,EACnB,CAAE,KAAM,UAAU,EAClB,CAAE,KAAM,UAAU,IAI9B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,MAAM,EACd,CAAE,KAAM,WAAW,EACnB,CAAE,KAAM,OAAO,IAI3B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,mBAAoB,aAAc,EAAK,EAC/C,CAAE,KAAM,WAAW,EACnB,CAAE,KAAM,UAAU,EAClB,CAAE,KAAM,MAAM,IAI1B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAW,IAI/B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAY,aAAc,CAAA,CAAE,EACpC,CAAE,KAAM,gBAAgB,EACxB,CAAE,KAAM,WAAW,IAI/B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAW,EACnB,CAAE,KAAM,OAAO,IAI3B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAW,EACnB,CAAE,KAAM,UAAU,IAI9B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAW,EACnB,CAAE,KAAM,OAAO,IAI3B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,YAAa,aAAc,CAAA,CAAE,EACrC,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAW,EACnB,CAAE,KAAM,MAAM,IAI1B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAY,aAAc,CAAA,CAAE,EACpC,CAAE,KAAM,WAAW,IAI/B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAY,aAAc,CAAA,CAAE,EACpC,CAAE,KAAM,WAAW,IAI/B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAW,EACnB,CAAE,KAAM,MAAM,IAI1B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAY,aAAc,CAAA,CAAE,EACpC,CAAE,KAAM,WAAW,IAI/B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAW,EACnB,CAAE,KAAM,UAAU,IAI9B,KAAKE,GACD,MAAO,CACH,KAAMA,GACN,WAAY,CACR,CAAE,KAAM,aAAa,EACrB,CAAE,KAAM,WAAW,IAI/B,QACI,MAAO,CACH,KAAMQ,EACN,WAAY,CAAA,EAGxB,CACJ,GAGSpG,EAAa,IAAI8F,GCrrC9B,IAAAO,GAAA,GAAAC,GAAAD,GAAA,+BAAAE,GAAA,gBAAAC,GAAA,wBAAAC,GAAA,iBAAAC,GAAA,uBAAAC,GAAA,gBAAAC,GAAA,uBAAAC,GAAA,2BAAAC,GAAA,sBAAAC,GAAA,cAAAC,GAAA,mBAAAC,GAAA,qBAAAC,KAkBM,SAAUC,GAAuBC,EAAa,CAChD,OAAW,CAACC,EAAMC,CAAK,IAAK,OAAO,QAAQF,CAAI,EACtCC,EAAK,WAAW,GAAG,IAChB,MAAM,QAAQC,CAAK,EACnBA,EAAM,QAAQ,CAACC,EAAMC,IAAS,CACtBC,GAAUF,CAAI,IACbA,EAA0B,WAAaH,EACvCG,EAA0B,mBAAqBF,EAC/CE,EAA0B,gBAAkBC,EAErD,CAAC,EACMC,GAAUH,CAAK,IACrBA,EAA2B,WAAaF,EACxCE,EAA2B,mBAAqBD,GAIjE,CAjBgBK,EAAAP,GAAA,0BAwBV,SAAUQ,GAAsCP,EAA2BQ,EAAqC,CAClH,IAAIL,EAAOH,EACX,KAAOG,GAAM,CACT,GAAIK,EAAcL,CAAI,EAClB,OAAOA,EAEXA,EAAOA,EAAK,UAChB,CAEJ,CATgBG,EAAAC,GAAA,sBAeV,SAAUE,GAAmBT,EAA2BU,EAAkC,CAC5F,IAAIP,EAAOH,EACX,KAAOG,GAAM,CACT,GAAIO,EAAUP,CAAI,EACd,MAAO,GAEXA,EAAOA,EAAK,UAChB,CACA,MAAO,EACX,CATgBG,EAAAG,GAAA,sBAiBV,SAAUE,GAAyCX,EAAa,CAElE,IAAMY,EADWC,GAAab,CAAI,EACV,UACxB,GAAI,CAACY,EACD,MAAM,IAAI,MAAM,2BAA2B,EAE/C,OAAOA,CACX,CAPgBN,EAAAK,GAAA,eAYV,SAAUE,GAAab,EAAa,CACtC,KAAOA,EAAK,YACRA,EAAOA,EAAK,WAEhB,OAAOA,CACX,CALgBM,EAAAO,GAAA,gBAkBV,SAAUC,GAAed,EAAee,EAA0B,CACpE,GAAI,CAACf,EACD,MAAM,IAAI,MAAM,0BAA0B,EAE9C,IAAMgB,EAAQD,GAAS,MAEvB,OAAO,IAAIE,GAA2B,KAAO,CACzC,KAAM,OAAO,KAAKjB,CAAI,EACtB,SAAU,EACV,WAAY,IACZkB,GAAQ,CACR,KAAOA,EAAM,SAAWA,EAAM,KAAK,QAAQ,CACvC,IAAMC,EAAWD,EAAM,KAAKA,EAAM,QAAQ,EAC1C,GAAI,CAACC,EAAS,WAAW,GAAG,EAAG,CAC3B,IAAMjB,EAASF,EAAwBmB,CAAQ,EAC/C,GAAId,GAAUH,CAAK,GAEf,GADAgB,EAAM,WACFE,GAAiBlB,EAAOc,CAAK,EAC7B,MAAO,CAAE,KAAM,GAAO,MAAAd,CAAK,UAExB,MAAM,QAAQA,CAAK,EAAG,CAC7B,KAAOgB,EAAM,WAAahB,EAAM,QAAQ,CACpC,IAAME,EAAQc,EAAM,aACdG,EAAUnB,EAAME,CAAK,EAC3B,GAAIC,GAAUgB,CAAO,GAAKD,GAAiBC,EAASL,CAAK,EACrD,MAAO,CAAE,KAAM,GAAO,MAAOK,CAAO,CAE5C,CACAH,EAAM,WAAa,CACvB,CACJ,CACAA,EAAM,UACV,CACA,OAAOI,EACX,CAAC,CACL,CAnCgBhB,EAAAQ,GAAA,kBAyCV,SAAUS,GAAkBC,EAAeT,EAA0B,CACvE,GAAI,CAACS,EACD,MAAM,IAAI,MAAM,+BAA+B,EAEnD,OAAO,IAAIC,GAAeD,EAAMxB,GAAQc,GAAed,EAAMe,CAAO,CAAC,CACzE,CALgBT,EAAAiB,GAAA,qBAWV,SAAUG,GAAUF,EAAeT,EAA0B,CAC/D,GAAKS,GAEE,GAAIT,GAAS,OAAS,CAACK,GAAiBI,EAAMT,EAAQ,KAAK,EAE9D,OAAO,IAAIU,GAAeD,EAAM,IAAM,CAAA,CAAE,MAHxC,OAAM,IAAI,MAAM,+BAA+B,EAKnD,OAAO,IAAIC,GAAeD,EAAMxB,GAAQc,GAAed,EAAMe,CAAO,EAAG,CAAE,YAAa,EAAI,CAAE,CAChG,CARgBT,EAAAoB,GAAA,aAUhB,SAASN,GAAiBO,EAAkBX,EAAa,OACrD,GAAI,CAACA,EACD,MAAO,GAEX,IAAMY,GAAYC,EAAAF,EAAQ,YAAQ,MAAAE,IAAA,OAAA,OAAAA,EAAE,MACpC,OAAKD,EAGEE,GAAQF,EAAWZ,CAAK,EAFpB,EAGf,CATSV,EAAAc,GAAA,oBAeH,SAAUW,GAAiB/B,EAAa,CAE1C,OAAO,IAAIiB,GAAiC,KAAO,CAC/C,KAAM,OAAO,KAAKjB,CAAI,EACtB,SAAU,EACV,WAAY,IACZkB,GAAQ,CACR,KAAOA,EAAM,SAAWA,EAAM,KAAK,QAAQ,CACvC,IAAMC,EAAWD,EAAM,KAAKA,EAAM,QAAQ,EAC1C,GAAI,CAACC,EAAS,WAAW,GAAG,EAAG,CAC3B,IAAMjB,EAASF,EAAwBmB,CAAQ,EAC/C,GAAIa,GAAY9B,CAAK,EACjB,OAAAgB,EAAM,WACC,CAAE,KAAM,GAAO,MAAO,CAAE,UAAWhB,EAAO,UAAWF,EAAM,SAAAmB,CAAQ,CAAE,EACzE,GAAI,MAAM,QAAQjB,CAAK,EAAG,CAC7B,KAAOgB,EAAM,WAAahB,EAAM,QAAQ,CACpC,IAAME,EAAQc,EAAM,aACdG,EAAUnB,EAAME,CAAK,EAC3B,GAAI4B,GAAYX,CAAO,EACnB,MAAO,CAAE,KAAM,GAAO,MAAO,CAAE,UAAWA,EAAS,UAAWrB,EAAM,SAAAmB,EAAU,MAAAf,CAAK,CAAE,CAE7F,CACAc,EAAM,WAAa,CACvB,CACJ,CACAA,EAAM,UACV,CACA,OAAOI,EACX,CAAC,CACL,CA7BgBhB,EAAAyB,GAAA,oBAqCV,SAAUE,GAAoBC,EAAqBC,EAASxB,GAAYuB,CAAU,EAAE,YAAY,MAAK,CACvG,IAAME,EAAoB,CAAA,EAC1B,OAAAV,GAAUS,CAAM,EAAE,QAAQnC,GAAO,CAC7B+B,GAAiB/B,CAAI,EAAE,QAAQqC,GAAU,CACjCA,EAAQ,UAAU,MAAQH,GAC1BE,EAAK,KAAKC,EAAQ,SAAS,CAEnC,CAAC,CACL,CAAC,EACMC,EAAOF,CAAI,CACtB,CAVgB9B,EAAA2B,GAAA,uBAkBV,SAAUM,GAA0BC,EAA2BxC,EAAa,CAC9E,IAAMyC,EAAeD,EAAW,gBAAgBxC,EAAK,KAAK,EACpD0C,EAAc1C,EACpB,QAAWmB,KAAYsB,EAAa,WAE5BtB,EAAS,eAAiB,QAAauB,EAAYvB,EAAS,IAAI,IAAM,SACtEuB,EAAYvB,EAAS,IAAI,EAAIwB,GAAiBxB,EAAS,YAAY,EAG/E,CATgBb,EAAAiC,GAAA,6BAWhB,SAASI,GAAiBC,EAA0B,CAChD,OAAI,MAAM,QAAQA,CAAY,EACnB,CAAC,GAAGA,EAAa,IAAID,EAAgB,CAAC,EAEtCC,CAEf,CANStC,EAAAqC,GAAA,oBAcH,SAAUE,GAAyC7C,EAAS8C,EAAsH,CACpL,IAAMC,EAAuB,CAAE,MAAO/C,EAAK,KAAK,EAEhD,OAAW,CAACC,EAAMC,CAAK,IAAK,OAAO,QAAQF,CAAI,EAC3C,GAAI,CAACC,EAAK,WAAW,GAAG,EACpB,GAAII,GAAUH,CAAK,EACf6C,EAAK9C,CAAI,EAAI4C,GAAY3C,EAAO4C,CAAc,UACvCd,GAAY9B,CAAK,EACxB6C,EAAK9C,CAAI,EAAI6C,EACTC,EACA9C,EACAC,EAAM,SACNA,EAAM,QAAQ,UAEX,MAAM,QAAQA,CAAK,EAAG,CAC7B,IAAM8C,EAAyB,CAAA,EAC/B,QAAW3B,KAAWnB,EACdG,GAAUgB,CAAO,EACjB2B,EAAY,KAAKH,GAAYxB,EAASyB,CAAc,CAAC,EAC9Cd,GAAYX,CAAO,EAC1B2B,EAAY,KACRF,EACIC,EACA9C,EACAoB,EAAQ,SACRA,EAAQ,QAAQ,CACnB,EAGL2B,EAAY,KAAK3B,CAAO,EAGhC0B,EAAK9C,CAAI,EAAI+C,CACjB,MACID,EAAK9C,CAAI,EAAIC,EAKzB,OAAAH,GAAuBgD,CAAI,EACpBA,CACX,CAzCgBzC,EAAAuC,GAAA,eCrQhB,IAAAI,GAAA,GAAAC,GAAAD,GAAA,oBAAAE,GAAA,iBAAAC,GAAA,8BAAAC,GAAA,qBAAAC,GAAA,uBAAAC,GAAA,iBAAAC,GAAA,mBAAAC,GAAA,kBAAAC,GAAA,yBAAAC,KCEM,SAAUC,EAAGC,EAAY,CAC7B,OAAOA,EAAK,WAAW,CAAC,CAC1B,CAFgBC,EAAAF,EAAA,MAIV,SAAUG,GAAeC,EAAeC,EAAQ,CAChD,MAAM,QAAQD,CAAI,EACpBA,EAAK,QAAQ,SAAUE,EAAO,CAC5BD,EAAI,KAAKC,CAAO,CAClB,CAAC,EAEDD,EAAI,KAAKD,CAAI,CAEjB,CARgBF,EAAAC,GAAA,eAUV,SAAUI,GACdC,EACAC,EAAkD,CAElD,GAAID,EAAQC,CAAO,IAAM,GACvB,KAAM,kBAAoBA,EAG5B,IAAMC,EAAaF,EAAQC,CAAO,EAClCD,EAAQC,CAAO,EAAI,EACrB,CAVgBP,EAAAK,GAAA,WAYV,SAAUI,GAA0BC,EAAQ,CAEhD,GAAIA,IAAQ,OACV,MAAM,MAAM,yCAAyC,EAEvD,MAAO,EACT,CANgBV,EAAAS,GAAA,iBASV,SAAUE,IAAuB,CACrC,MAAM,MAAM,yCAAyC,CACvD,CAFgBX,EAAAW,GAAA,2BAIV,SAAUC,GAAYF,EAAqB,CAC/C,OAAOA,EAAI,OAAY,WACzB,CAFgBV,EAAAY,GAAA,eCvCT,IAAMC,GAA4B,CAAA,EACzC,QAASC,EAAIC,EAAG,GAAG,EAAGD,GAAKC,EAAG,GAAG,EAAGD,IAClCD,GAAgB,KAAKC,CAAC,EAGjB,IAAME,GAA0B,CAACD,EAAG,GAAG,CAAC,EAAE,OAAOF,EAAe,EACvE,QAASC,EAAIC,EAAG,GAAG,EAAGD,GAAKC,EAAG,GAAG,EAAGD,IAClCE,GAAc,KAAKF,CAAC,EAGtB,QAASA,EAAIC,EAAG,GAAG,EAAGD,GAAKC,EAAG,GAAG,EAAGD,IAClCE,GAAc,KAAKF,CAAC,EAIf,IAAMG,GAA4B,CACvCF,EAAG,GAAG,EACNA,EAAG,IAAI,EACPA,EAAG;CAAI,EACPA,EAAG,IAAI,EACPA,EAAG,GAAI,EACPA,EAAG,IAAI,EACPA,EAAG,GAAI,EACPA,EAAG,MAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,EACXA,EAAG,QAAQ,GCZb,IAAMG,GAAkB,cAClBC,GAAiB,QACjBC,GAAuB,QAIhBC,GAAP,KAAmB,CArBzB,MAqByB,CAAAC,EAAA,qBAAzB,aAAA,CACY,KAAA,IAAc,EACd,KAAA,MAAgB,GAChB,KAAA,SAAmB,CA+xB/B,CA7xBY,WAAS,CACjB,MAAO,CACL,IAAK,KAAK,IACV,MAAO,KAAK,MACZ,SAAU,KAAK,SAEnB,CAEU,aAAaC,EAItB,CACC,KAAK,IAAMA,EAAS,IACpB,KAAK,MAAQA,EAAS,MACtB,KAAK,SAAWA,EAAS,QAC3B,CAEO,QAAQC,EAAa,CAE1B,KAAK,IAAM,EACX,KAAK,MAAQA,EACb,KAAK,SAAW,EAEhB,KAAK,YAAY,GAAG,EACpB,IAAMC,EAAQ,KAAK,YAAW,EAC9B,KAAK,YAAY,GAAG,EAEpB,IAAMC,EAAqB,CACzB,KAAM,QACN,IAAK,CAAE,MAAO,KAAK,IAAK,IAAKF,EAAM,MAAM,EACzC,OAAQ,GACR,WAAY,GACZ,UAAW,GACX,QAAS,GACT,OAAQ,IAGV,KAAO,KAAK,aAAY,GACtB,OAAQ,KAAK,QAAO,EAAI,CACtB,IAAK,IACHG,GAAQD,EAAO,QAAQ,EACvB,MACF,IAAK,IACHC,GAAQD,EAAO,YAAY,EAC3B,MACF,IAAK,IACHC,GAAQD,EAAO,WAAW,EAC1B,MACF,IAAK,IACHC,GAAQD,EAAO,SAAS,EACxB,MACF,IAAK,IACHC,GAAQD,EAAO,QAAQ,EACvB,MAIN,GAAI,KAAK,MAAQ,KAAK,MAAM,OAC1B,MAAM,MAAM,oBAAsB,KAAK,MAAM,UAAU,KAAK,GAAG,CAAC,EAElE,MAAO,CACL,KAAM,UACN,MAAOA,EACP,MAAOD,EACP,IAAK,KAAK,IAAI,CAAC,EAEnB,CAEU,aAAW,CACnB,IAAMG,EAAO,CAAA,EACPC,EAAQ,KAAK,IAInB,IAFAD,EAAK,KAAK,KAAK,YAAW,CAAE,EAErB,KAAK,SAAQ,IAAO,KACzB,KAAK,YAAY,GAAG,EACpBA,EAAK,KAAK,KAAK,YAAW,CAAE,EAG9B,MAAO,CAAE,KAAM,cAAe,MAAOA,EAAM,IAAK,KAAK,IAAIC,CAAK,CAAC,CACjE,CAEU,aAAW,CACnB,IAAMC,EAAQ,CAAA,EACRD,EAAQ,KAAK,IAEnB,KAAO,KAAK,OAAM,GAChBC,EAAM,KAAK,KAAK,KAAI,CAAE,EAGxB,MAAO,CAAE,KAAM,cAAe,MAAOA,EAAO,IAAK,KAAK,IAAID,CAAK,CAAC,CAClE,CAEU,MAAI,CACZ,OAAI,KAAK,YAAW,EACX,KAAK,UAAS,EAEd,KAAK,KAAI,CAEpB,CAEU,WAAS,CACjB,IAAMA,EAAQ,KAAK,IACnB,OAAQ,KAAK,QAAO,EAAI,CACtB,IAAK,IACH,MAAO,CACL,KAAM,cACN,IAAK,KAAK,IAAIA,CAAK,GAEvB,IAAK,IACH,MAAO,CAAE,KAAM,YAAa,IAAK,KAAK,IAAIA,CAAK,CAAC,EAElD,IAAK,KACH,OAAQ,KAAK,QAAO,EAAI,CACtB,IAAK,IACH,MAAO,CACL,KAAM,eACN,IAAK,KAAK,IAAIA,CAAK,GAEvB,IAAK,IACH,MAAO,CACL,KAAM,kBACN,IAAK,KAAK,IAAIA,CAAK,GAIzB,MAAM,MAAM,0BAA0B,EAExC,IAAK,IACH,KAAK,YAAY,GAAG,EAEpB,IAAIE,EACJ,OAAQ,KAAK,QAAO,EAAI,CACtB,IAAK,IACHA,EAAO,YACP,MACF,IAAK,IACHA,EAAO,oBACP,MAEJC,GAAcD,CAAI,EAElB,IAAME,EAAc,KAAK,YAAW,EAEpC,YAAK,YAAY,GAAG,EAEb,CACL,KAAMF,EACN,MAAOE,EACP,IAAK,KAAK,IAAIJ,CAAK,GAIzB,OAAOK,GAAuB,CAChC,CAEU,WACRC,EAA0B,GAAK,CAE/B,IAAIC,EACEP,EAAQ,KAAK,IACnB,OAAQ,KAAK,QAAO,EAAI,CACtB,IAAK,IACHO,EAAQ,CACN,QAAS,EACT,OAAQ,KAEV,MACF,IAAK,IACHA,EAAQ,CACN,QAAS,EACT,OAAQ,KAEV,MACF,IAAK,IACHA,EAAQ,CACN,QAAS,EACT,OAAQ,GAEV,MACF,IAAK,IACH,IAAMC,EAAU,KAAK,qBAAoB,EACzC,OAAQ,KAAK,QAAO,EAAI,CACtB,IAAK,IACHD,EAAQ,CACN,QAASC,EACT,OAAQA,GAEV,MACF,IAAK,IACH,IAAIC,EACA,KAAK,QAAO,GACdA,EAAS,KAAK,qBAAoB,EAClCF,EAAQ,CACN,QAASC,EACT,OAAQC,IAGVF,EAAQ,CACN,QAASC,EACT,OAAQ,KAGZ,KAAK,YAAY,GAAG,EACpB,MAIJ,GAAIF,IAAmB,IAAQC,IAAU,OACvC,OAEFJ,GAAcI,CAAK,EACnB,MAKJ,GAAI,EAAAD,IAAmB,IAAQC,IAAU,SAKrCJ,GAAcI,CAAK,EACrB,OAAI,KAAK,SAAS,CAAC,IAAM,KACvB,KAAK,YAAY,GAAG,EACpBA,EAAM,OAAS,IAEfA,EAAM,OAAS,GAGjBA,EAAM,KAAO,aACbA,EAAM,IAAM,KAAK,IAAIP,CAAK,EACnBO,CAEX,CAEU,MAAI,CACZ,IAAIG,EACEV,EAAQ,KAAK,IACnB,OAAQ,KAAK,SAAQ,EAAI,CACvB,IAAK,IACHU,EAAO,KAAK,OAAM,EAClB,MACF,IAAK,KACHA,EAAO,KAAK,WAAU,EACtB,MACF,IAAK,IACHA,EAAO,KAAK,eAAc,EAC1B,MACF,IAAK,IACHA,EAAO,KAAK,MAAK,EACjB,MAQJ,OALIA,IAAS,QAAa,KAAK,mBAAkB,IAC/CA,EAAO,KAAK,iBAAgB,GAI1BP,GAAoBO,CAAI,GAC1BA,EAAK,IAAM,KAAK,IAAIV,CAAK,EAErB,KAAK,aAAY,IACnBU,EAAK,WAAa,KAAK,WAAU,GAG5BA,GAIFL,GAAuB,CAChC,CAEU,QAAM,CACd,YAAK,YAAY,GAAG,EACb,CACL,KAAM,MACN,WAAY,GACZ,MAAO,CAACM,EAAG;CAAI,EAAGA,EAAG,IAAI,EAAGA,EAAG,QAAQ,EAAGA,EAAG,QAAQ,CAAC,EAE1D,CAEU,YAAU,CAGlB,OAFA,KAAK,YAAY,IAAI,EAEb,KAAK,SAAQ,EAAI,CACvB,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,OAAO,KAAK,kBAAiB,EAC/B,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,OAAO,KAAK,qBAAoB,EAClC,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,OAAO,KAAK,kBAAiB,EAC/B,IAAK,IACH,OAAO,KAAK,wBAAuB,EACrC,IAAK,IACH,OAAO,KAAK,iBAAgB,EAC9B,IAAK,IACH,OAAO,KAAK,sBAAqB,EACnC,IAAK,IACH,OAAO,KAAK,gCAA+B,EAC7C,QACE,OAAO,KAAK,mBAAkB,EAEpC,CAEU,mBAAiB,CAGzB,MAAO,CAAE,KAAM,qBAAsB,MAFvB,KAAK,gBAAe,CAEe,CACnD,CAEU,sBAAoB,CAC5B,IAAIC,EACAC,EAAa,GACjB,OAAQ,KAAK,QAAO,EAAI,CACtB,IAAK,IACHD,EAAME,GACN,MACF,IAAK,IACHF,EAAME,GACND,EAAa,GACb,MACF,IAAK,IACHD,EAAMG,GACN,MACF,IAAK,IACHH,EAAMG,GACNF,EAAa,GACb,MACF,IAAK,IACHD,EAAMI,GACN,MACF,IAAK,IACHJ,EAAMI,GACNH,EAAa,GACb,MAIJ,OAAIV,GAAcS,CAAG,EACZ,CAAE,KAAM,MAAO,MAAOA,EAAK,WAAYC,CAAU,EAGnDR,GAAuB,CAChC,CAEU,mBAAiB,CACzB,IAAIY,EACJ,OAAQ,KAAK,QAAO,EAAI,CACtB,IAAK,IACHA,EAAaN,EAAG,IAAI,EACpB,MACF,IAAK,IACHM,EAAaN,EAAG;CAAI,EACpB,MACF,IAAK,IACHM,EAAaN,EAAG,IAAI,EACpB,MACF,IAAK,IACHM,EAAaN,EAAG,GAAI,EACpB,MACF,IAAK,IACHM,EAAaN,EAAG,IAAI,EACpB,MAIJ,OAAIR,GAAcc,CAAU,EACnB,CAAE,KAAM,YAAa,MAAOA,CAAU,EAGxCZ,GAAuB,CAChC,CAEU,yBAAuB,CAC/B,KAAK,YAAY,GAAG,EACpB,IAAMa,EAAS,KAAK,QAAO,EAC3B,GAAI,WAAW,KAAKA,CAAM,IAAM,GAC9B,MAAM,MAAM,UAAU,EAIxB,MAAO,CAAE,KAAM,YAAa,MADTA,EAAO,YAAW,EAAG,WAAW,CAAC,EAAI,EACX,CAC/C,CAEU,kBAAgB,CAGxB,YAAK,YAAY,GAAG,EACb,CAAE,KAAM,YAAa,MAAOP,EAAG,IAAI,CAAC,CAC7C,CAEU,uBAAqB,CAC7B,YAAK,YAAY,GAAG,EACb,KAAK,eAAe,CAAC,CAC9B,CAEU,iCAA+B,CACvC,YAAK,YAAY,GAAG,EACb,KAAK,eAAe,CAAC,CAC9B,CAEU,oBAAkB,CAG1B,IAAMQ,EAAc,KAAK,QAAO,EAChC,MAAO,CAAE,KAAM,YAAa,MAAOR,EAAGQ,CAAW,CAAC,CACpD,CAEU,2BAAyB,CACjC,OAAQ,KAAK,SAAQ,EAAI,CAEvB,IAAK;EAEL,IAAK,KAEL,IAAK,SAEL,IAAK,SAEL,IAAK,KAEL,IAAK,IACH,MAAM,MAAM,KAAK,EACnB,QACE,IAAMC,EAAW,KAAK,QAAO,EAC7B,MAAO,CAAE,KAAM,YAAa,MAAOT,EAAGS,CAAQ,CAAC,EAErD,CAEU,gBAAc,CACtB,IAAMR,EAA0B,CAAA,EAC5BC,EAAa,GAOjB,IANA,KAAK,YAAY,GAAG,EAChB,KAAK,SAAS,CAAC,IAAM,MACvB,KAAK,YAAY,GAAG,EACpBA,EAAa,IAGR,KAAK,YAAW,GAAI,CACzB,IAAMQ,EAAO,KAAK,UAAS,EACrBC,EAAmBD,EAAK,OAAS,YACvC,GAAIE,GAAYF,CAAI,GAAK,KAAK,YAAW,EAAI,CAC3C,KAAK,YAAY,GAAG,EACpB,IAAMG,EAAK,KAAK,UAAS,EACnBC,EAAiBD,EAAG,OAAS,YAGnC,GAAID,GAAYC,CAAE,EAAG,CACnB,GAAIA,EAAG,MAAQH,EAAK,MAClB,MAAM,MAAM,uCAAuC,EAErDT,EAAI,KAAK,CAAE,KAAMS,EAAK,MAAO,GAAIG,EAAG,KAAK,CAAE,OAG3CE,GAAYL,EAAK,MAAOT,CAAG,EAC3BA,EAAI,KAAKD,EAAG,GAAG,CAAC,EAChBe,GAAYF,EAAG,MAAOZ,CAAG,OAG3Bc,GAAYL,EAAK,MAAOT,CAAG,EAI/B,YAAK,YAAY,GAAG,EAEb,CAAE,KAAM,MAAO,WAAYC,EAAY,MAAOD,CAAG,CAC1D,CAEU,WAAS,CACjB,OAAQ,KAAK,SAAQ,EAAI,CAEvB,IAAK,IAEL,IAAK;EAEL,IAAK,KAEL,IAAK,SAEL,IAAK,SACH,MAAM,MAAM,KAAK,EACnB,IAAK,KACH,OAAO,KAAK,YAAW,EACzB,QACE,OAAO,KAAK,0BAAyB,EAE3C,CAEU,aAAW,CAEnB,OADA,KAAK,YAAY,IAAI,EACb,KAAK,SAAQ,EAAI,CAGvB,IAAK,IACH,YAAK,YAAY,GAAG,EACb,CAAE,KAAM,YAAa,MAAOD,EAAG,IAAQ,CAAC,EACjD,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,OAAO,KAAK,qBAAoB,EAClC,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,OAAO,KAAK,kBAAiB,EAC/B,IAAK,IACH,OAAO,KAAK,wBAAuB,EACrC,IAAK,IACH,OAAO,KAAK,iBAAgB,EAC9B,IAAK,IACH,OAAO,KAAK,sBAAqB,EACnC,IAAK,IACH,OAAO,KAAK,gCAA+B,EAC7C,QACE,OAAO,KAAK,mBAAkB,EAEpC,CAEU,OAAK,CACb,IAAIgB,EAAY,GAEhB,OADA,KAAK,YAAY,GAAG,EACZ,KAAK,SAAS,CAAC,EAAG,CACxB,IAAK,IACH,KAAK,YAAY,GAAG,EACpB,KAAK,YAAY,GAAG,EACpBA,EAAY,GACZ,MACF,QACE,KAAK,WACL,MAEJ,IAAM/B,EAAQ,KAAK,YAAW,EAC9B,KAAK,YAAY,GAAG,EAEpB,IAAMgC,EAA+B,CACnC,KAAM,QACN,UAAWD,EACX,MAAO/B,GAGT,OAAI+B,IACFC,EAAS,IAAS,KAAK,UAGlBA,CACT,CAEU,iBAAe,CACvB,IAAIC,EAAS,KAAK,QAAO,EAIzB,GAAItC,GAAqB,KAAKsC,CAAM,IAAM,GACxC,MAAM,MAAM,8BAA8B,EAG5C,KAAOvC,GAAe,KAAK,KAAK,SAAS,CAAC,CAAC,GACzCuC,GAAU,KAAK,QAAO,EAGxB,OAAO,SAASA,EAAQ,EAAE,CAC5B,CAEU,sBAAoB,CAC5B,IAAIA,EAAS,KAAK,QAAO,EACzB,GAAIvC,GAAe,KAAKuC,CAAM,IAAM,GAClC,MAAM,MAAM,sBAAsB,EAGpC,KAAOvC,GAAe,KAAK,KAAK,SAAS,CAAC,CAAC,GACzCuC,GAAU,KAAK,QAAO,EAGxB,OAAO,SAASA,EAAQ,EAAE,CAC5B,CAEU,kBAAgB,CACxB,IAAMT,EAAW,KAAK,QAAO,EAC7B,OAAQA,EAAU,CAEhB,IAAK;EAEL,IAAK,KAEL,IAAK,SAEL,IAAK,SAEL,IAAK,IAEL,IAAK,IAEL,IAAK,KAEL,IAAK,IAEL,IAAK,IAEL,IAAK,IAEL,IAAK,IAEL,IAAK,IAEL,IAAK,IAEL,IAAK,IAEL,IAAK,IAEH,MAAM,MAAM,KAAK,EACnB,QACE,MAAO,CAAE,KAAM,YAAa,MAAOT,EAAGS,CAAQ,CAAC,EAErD,CACU,cAAY,CACpB,OAAQ,KAAK,SAAS,CAAC,EAAG,CACxB,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,MAAO,GACT,QACE,MAAO,GAEb,CAEU,aAAW,CACnB,OAAO,KAAK,SAAQ,IAAO,KAAO,KAAK,YAAY,CAAC,CACtD,CAEU,SAAO,CACf,OAAO9B,GAAe,KAAK,KAAK,SAAS,CAAC,CAAC,CAC7C,CAEU,YAAYwC,EAAU,EAAC,CAC/B,OAAQ,KAAK,SAASA,CAAO,EAAG,CAC9B,IAAK,IACL,IAAK;EACL,IAAK,KACL,IAAK,SACL,IAAK,SACH,MAAO,GACT,QACE,MAAO,GAEb,CAEU,QAAM,CACd,OAAO,KAAK,OAAM,GAAM,KAAK,YAAW,CAC1C,CAEU,QAAM,CACd,GAAI,KAAK,mBAAkB,EACzB,MAAO,GAGT,OAAQ,KAAK,SAAS,CAAC,EAAG,CACxB,IAAK,IACL,IAAK,KACL,IAAK,IAEL,IAAK,IACH,MAAO,GACT,QACE,MAAO,GAEb,CAEU,aAAW,CACnB,OAAQ,KAAK,SAAS,CAAC,EAAG,CACxB,IAAK,IACL,IAAK,IACH,MAAO,GAET,IAAK,KACH,OAAQ,KAAK,SAAS,CAAC,EAAG,CACxB,IAAK,IACL,IAAK,IACH,MAAO,GACT,QACE,MAAO,GAGb,IAAK,IACH,OACE,KAAK,SAAS,CAAC,IAAM,MACpB,KAAK,SAAS,CAAC,IAAM,KAAO,KAAK,SAAS,CAAC,IAAM,KAEtD,QACE,MAAO,GAEb,CAEU,cAAY,CACpB,IAAMC,EAAY,KAAK,UAAS,EAChC,GAAI,CACF,OAAO,KAAK,WAAW,EAAI,IAAM,YACvB,CACV,MAAO,WAEP,KAAK,aAAaA,CAAS,EAE/B,CAEU,oBAAkB,CAC1B,OAAQ,KAAK,SAAQ,EAAI,CACvB,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK;EACL,IAAK,KACL,IAAK,SACL,IAAK,SACH,MAAO,GACT,QACE,MAAO,GAEb,CAEU,eAAeC,EAAe,CACtC,IAAIC,EAAY,GAChB,QAAS,EAAI,EAAG,EAAID,EAAS,IAAK,CAChC,IAAME,EAAU,KAAK,QAAO,EAC5B,GAAI7C,GAAgB,KAAK6C,CAAO,IAAM,GACpC,MAAM,MAAM,+BAA+B,EAE7CD,GAAaC,EAGf,MAAO,CAAE,KAAM,YAAa,MADX,SAASD,EAAW,EAAE,CACI,CAC7C,CAEU,SAASH,EAAU,EAAC,CAC5B,OAAO,KAAK,MAAM,KAAK,IAAMA,CAAO,CACtC,CAEU,SAAO,CACf,IAAMV,EAAW,KAAK,SAAS,CAAC,EAChC,YAAK,YAAY,MAAS,EACnBA,CACT,CAEU,YAAYe,EAAwB,CAC5C,GAAIA,IAAS,QAAa,KAAK,MAAM,KAAK,GAAG,IAAMA,EACjD,MAAM,MACJ,cACEA,EACA,iBACA,KAAK,MAAM,KAAK,GAAG,EACnB,gBACA,KAAK,GAAG,EAId,GAAI,KAAK,KAAO,KAAK,MAAM,OACzB,MAAM,MAAM,yBAAyB,EAEvC,KAAK,KACP,CAEU,IAAInC,EAAa,CACzB,MAAO,CAAE,MAAOA,EAAO,IAAK,KAAK,GAAG,CACtC,GCvzBI,IAAOoC,GAAP,KAAwB,CAA9B,MAA8B,CAAAC,EAAA,0BACrB,cAAcC,EAAgB,CACnC,QAAWC,KAAOD,EAAM,CACtB,IAAME,EAASF,EAAaC,CAAG,EAE3BD,EAAK,eAAeC,CAAG,IACrBC,EAAM,OAAS,OACjB,KAAK,MAAMA,CAAK,EACP,MAAM,QAAQA,CAAK,GAC5BA,EAAM,QAASC,GAAY,CACzB,KAAK,MAAMA,CAAQ,CACrB,EAAG,IAAI,GAIf,CAEO,MAAMH,EAAmB,CAC9B,OAAQA,EAAK,KAAM,CACjB,IAAK,UACH,KAAK,aAAaA,CAAI,EACtB,MACF,IAAK,QACH,KAAK,WAAWA,CAAI,EACpB,MACF,IAAK,cACH,KAAK,iBAAiBA,CAAI,EAC1B,MACF,IAAK,cACH,KAAK,iBAAiBA,CAAI,EAC1B,MACF,IAAK,cACH,KAAK,iBAAiBA,CAAI,EAC1B,MACF,IAAK,YACH,KAAK,eAAeA,CAAI,EACxB,MACF,IAAK,eACH,KAAK,kBAAkBA,CAAI,EAC3B,MACF,IAAK,kBACH,KAAK,qBAAqBA,CAAI,EAC9B,MACF,IAAK,YACH,KAAK,eAAeA,CAAI,EACxB,MACF,IAAK,oBACH,KAAK,uBAAuBA,CAAI,EAChC,MACF,IAAK,YACH,KAAK,eAAeA,CAAI,EACxB,MACF,IAAK,MACH,KAAK,SAASA,CAAI,EAClB,MACF,IAAK,QACH,KAAK,WAAWA,CAAI,EACpB,MACF,IAAK,qBACH,KAAK,wBAAwBA,CAAI,EACjC,MACF,IAAK,aACH,KAAK,gBAAgBA,CAAI,EACzB,MAGJ,KAAK,cAAcA,CAAI,CACzB,CAEO,aAAaA,EAAmB,CAAS,CAEzC,WAAWA,EAAiB,CAAS,CAErC,iBAAiBA,EAAiB,CAAS,CAE3C,iBAAiBA,EAAiB,CAAS,CAG3C,iBAAiBA,EAAe,CAAS,CAEzC,eAAeA,EAAe,CAAS,CAEvC,kBAAkBA,EAAe,CAAS,CAE1C,qBAAqBA,EAAe,CAAS,CAE7C,eAAeA,EAAe,CAAS,CAEvC,uBAAuBA,EAAe,CAAS,CAG/C,eAAeA,EAAe,CAAS,CAEvC,SAASA,EAAS,CAAS,CAE3B,WAAWA,EAAW,CAAS,CAE/B,wBAAwBA,EAAwB,CAAS,CAEzD,gBAAgBA,EAAgB,CAAS,GJzG3C,IAAMI,GAAiB,UAExBC,GAAe,IAAIC,GAenBC,GAAN,cAAoCC,EAAiB,CA1BrD,MA0BqD,CAAAC,EAAA,8BAArD,aAAA,qBAEY,KAAA,WAAa,GAEb,KAAA,eAA2B,CAAA,EACnC,KAAA,UAAY,EAoEhB,CAjEI,IAAI,UAAQ,CACR,OAAO,KAAK,eAAe,KAAK,EAAE,CACtC,CAEA,MAAMC,EAAa,CACf,KAAK,UAAY,GACjB,KAAK,MAAQA,EACb,KAAK,YAAc,GACnB,KAAK,WAAa,GAClB,KAAK,eAAiB,CAAA,CAC1B,CAES,WAAWC,EAAW,CACvBA,EAAK,aACL,KAAK,WAAa,GAClB,KAAK,eAAiB,CAAA,EAE9B,CAES,eAAeA,EAAe,CACnC,IAAMC,EAAO,OAAO,aAAaD,EAAK,KAAK,EAI3C,GAHI,CAAC,KAAK,WAAaC,IAAS;IAC5B,KAAK,UAAY,IAEjBD,EAAK,WACL,KAAK,WAAa,GAClB,KAAK,eAAiB,CAAA,MACnB,CACH,IAAME,EAAcC,GAAaF,CAAI,EACrC,KAAK,eAAe,KAAKC,CAAW,EAChC,KAAK,aACL,KAAK,aAAeA,EAE5B,CACJ,CAES,SAASF,EAAS,CACvB,GAAI,CAAC,KAAK,UAAW,CACjB,IAAMI,EAAM,KAAK,MAAM,UAAUJ,EAAK,IAAI,MAAOA,EAAK,IAAI,GAAG,EACvDD,EAAQ,IAAI,OAAOK,CAAG,EAC5B,KAAK,UAAY,EAAQ;EAAK,MAAML,CAAK,CAC7C,CACA,GAAIC,EAAK,WACL,KAAK,WAAa,GAClB,KAAK,eAAiB,CAAA,MACnB,CACH,IAAMI,EAAM,KAAK,MAAM,UAAUJ,EAAK,IAAI,MAAOA,EAAK,IAAI,GAAG,EAC7D,KAAK,eAAe,KAAKI,CAAG,EACxB,KAAK,aACL,KAAK,aAAeA,EAE5B,CACJ,CAES,cAAcJ,EAAgB,CAC/BA,EAAK,OAAS,SAGAA,EACJ,YAId,MAAM,cAAcA,CAAI,CAC5B,GAGEK,GAAU,IAAIT,GAEd,SAAUU,GAAiBC,EAAuB,CACpD,GAAI,CACI,OAAOA,GAAW,WAClBA,EAASA,EAAO,QAEpBA,EAAS,IAAIA,CAAM,IACnB,IAAMC,EAAUd,GAAa,QAAQa,CAAM,EACrCE,EAA+C,CAAA,EACrD,QAAWC,KAAeF,EAAQ,MAAM,MACpCH,GAAQ,MAAME,CAAM,EACpBF,GAAQ,MAAMK,CAAW,EACzBD,EAAM,KAAK,CACP,MAAOJ,GAAQ,YACf,IAAKA,GAAQ,SAChB,EAEL,OAAOI,CACX,MAAQ,CACJ,MAAO,CAAA,CACX,CACJ,CApBgBX,EAAAQ,GAAA,oBAsBV,SAAUK,GAAmBJ,EAAuB,CACtD,GAAI,CACA,OAAI,OAAOA,GAAW,WAClBA,EAAS,IAAI,OAAOA,CAAM,GAE9BA,EAASA,EAAO,SAAQ,EACxBF,GAAQ,MAAME,CAAM,EAEpBF,GAAQ,MAAMX,GAAa,QAAQa,CAAM,CAAC,EACnCF,GAAQ,SACnB,MAAQ,CACJ,MAAO,EACX,CACJ,CAbgBP,EAAAa,GAAA,sBAmBT,IAAMC,GACT;wHAC0D,MAAM,EAAE,EAEhE,SAAUC,GAAaC,EAAsB,CAC/C,IAAMP,EAAS,OAAOO,GAAU,SAAW,IAAI,OAAOA,CAAK,EAAIA,EAC/D,OAAOF,GAAqB,KAAMG,GAAOR,EAAO,KAAKQ,CAAE,CAAC,CAC5D,CAHgBjB,EAAAe,GAAA,gBAKV,SAAUV,GAAaW,EAAa,CACtC,OAAOA,EAAM,QAAQ,sBAAuB,MAAM,CACtD,CAFgBhB,EAAAK,GAAA,gBAIV,SAAUa,GAA0BC,EAAe,CACrD,OAAO,MAAM,UAAU,IAAI,KAAKA,EAASC,GACrC,KAAK,KAAKA,CAAM,EAAI,IAAIA,EAAO,YAAW,CAAE,GAAGA,EAAO,YAAW,CAAE,IAAMf,GAAae,CAAM,CAAC,EAC/F,KAAK,EAAE,CACb,CAJgBpB,EAAAkB,GAAA,6BAYV,SAAUG,GAAepB,EAAwBqB,EAAa,CAChE,IAAMC,EAAUC,GAAcvB,CAAK,EAC7BwB,EAAQH,EAAM,MAAMC,CAAO,EACjC,MAAO,CAAC,CAACE,GAASA,EAAM,CAAC,EAAE,OAAS,CACxC,CAJgBzB,EAAAqB,GAAA,kBAYV,SAAUG,GAAcvB,EAAsB,CAC5C,OAAOA,GAAU,WACjBA,EAAQ,IAAI,OAAOA,CAAK,GAE5B,IAAMyB,EAAKzB,EAAO0B,EAAS1B,EAAM,OAC7B2B,EAAI,EAER,SAASC,GAAO,CACZ,IAAIC,EAAS,GACTC,EAEJ,SAASC,EAAUC,EAAe,CAC9BH,GAAUH,EAAO,OAAOC,EAAGK,CAAO,EAClCL,GAAKK,CACT,CAHSjC,EAAAgC,EAAA,aAKT,SAASE,EAAeD,EAAe,CACnCH,GAAU,MAAQH,EAAO,OAAOC,EAAGK,CAAO,EAAI,MAC9CL,GAAKK,CACT,CAEA,IALSjC,EAAAkC,EAAA,kBAKFN,EAAID,EAAO,QACd,OAAQA,EAAOC,CAAC,EAAG,CACf,IAAK,KACD,OAAQD,EAAOC,EAAI,CAAC,EAAG,CACnB,IAAK,IACDM,EAAe,CAAC,EAChB,MACJ,IAAK,IACDA,EAAe,CAAC,EAChB,MACJ,IAAK,IACGR,EAAG,QACCC,EAAOC,EAAI,CAAC,IAAM,IAClBM,EAAeP,EAAO,QAAQ,IAAKC,CAAC,EAAIA,EAAI,CAAC,EAE7CM,EAAe,CAAC,EAGpBA,EAAe,CAAC,EAEpB,MACJ,IAAK,IACL,IAAK,IACGR,EAAG,QACHQ,EAAeP,EAAO,QAAQ,IAAKC,CAAC,EAAIA,EAAI,CAAC,EAE7CM,EAAe,CAAC,EAEpB,MACJ,IAAK,IACDA,EAAeP,EAAO,QAAQ,IAAKC,CAAC,EAAIA,EAAI,CAAC,EAC7C,MACJ,QACIM,EAAe,CAAC,EAChB,KACR,CACA,MAEJ,IAAK,IACDH,EAAM,mBACNA,EAAI,UAAYH,EAChBG,EAAMA,EAAI,KAAKJ,CAAM,GAAK,CAAA,EAC1BO,EAAeH,EAAI,CAAC,EAAE,MAAM,EAC5B,MAEJ,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACDC,EAAU,CAAC,EACX,MACJ,IAAK,IACDD,EAAM,gBACNA,EAAI,UAAYH,EAChBG,EAAMA,EAAI,KAAKJ,CAAM,EACjBI,EACAC,EAAUD,EAAI,CAAC,EAAE,MAAM,EAEvBG,EAAe,CAAC,EAEpB,MACJ,IAAK,IACD,GAAIP,EAAOC,EAAI,CAAC,IAAM,IAClB,OAAQD,EAAOC,EAAI,CAAC,EAAG,CACnB,IAAK,IACDE,GAAU,MACVF,GAAK,EACLE,GAAUD,EAAO,EAAK,MACtB,MACJ,IAAK,IACDC,GAAU,MACVF,GAAK,EACLE,GAAUD,EAAO,EAAK,IACtB,MACJ,IAAK,IACDE,EAAMH,EACNA,GAAK,EACLC,EAAO,EACPC,GAAUH,EAAO,OAAOI,EAAKH,EAAIG,CAAG,EACpC,MACJ,IAAK,IACD,OAAQJ,EAAOC,EAAI,CAAC,EAAG,CACnB,IAAK,IACL,IAAK,IACDG,EAAMH,EACNA,GAAK,EACLC,EAAO,EACPC,GAAUH,EAAO,OAAOI,EAAKH,EAAIG,CAAG,EACpC,MACJ,QACIC,EAAUL,EAAO,QAAQ,IAAKC,CAAC,EAAIA,EAAI,CAAC,EACxCE,GAAUD,EAAO,EAAK,MACtB,KACR,CACA,KACR,MAEAG,EAAU,CAAC,EACXF,GAAUD,EAAO,EAAK,MAE1B,MACJ,IAAK,IACD,QAAED,EACKE,EACX,QACII,EAAe,CAAC,EAChB,KACR,CAGJ,OAAOJ,CACX,CA/HS,OAAA9B,EAAA6B,EAAA,WAiIF,IAAI,OAAOA,EAAO,EAAI5B,EAAM,KAAK,CAC5C,CAzIgBD,EAAAwB,GAAA,iBJnKV,SAAUW,GAAaC,EAAoB,CAC7C,OAAOA,EAAQ,MAAM,KAAK,GAASC,GAAa,CAAC,GAAK,EAAE,KAAK,CACjE,CAFgBC,EAAAH,GAAA,gBAOV,SAAUI,GAAeH,EAAoB,CAC/C,OAAOA,EAAQ,MAAM,OAAQ,GAAiCI,GAAe,CAAC,GAAK,EAAE,MAAM,CAC/F,CAFgBF,EAAAC,GAAA,kBAYV,SAAUE,GAAqBL,EAAsBM,EAAqB,CAC5E,IAAMC,EAAY,IAAI,IAChBC,EAAYT,GAAaC,CAAO,EACtC,GAAI,CAACQ,EACD,OAAO,IAAI,IAAIR,EAAQ,KAAK,EAGhC,IAAMS,EAAe,CAACD,CAA6B,EAAE,OAAOL,GAAeH,CAAO,CAAC,EACnF,QAAWU,KAAQD,EACfE,GAAQD,EAAMH,EAAWD,CAAY,EAGzC,IAAMM,EAAQ,IAAI,IAClB,QAAWF,KAAQV,EAAQ,OACnBO,EAAU,IAAIG,EAAK,IAAI,GAAUN,GAAeM,CAAI,GAAKA,EAAK,SAC9DE,EAAM,IAAIF,CAAI,EAGtB,OAAOE,CACX,CAnBgBV,EAAAG,GAAA,wBAqBhB,SAASM,GAAQD,EAAwBG,EAAyBP,EAAqB,CACnFO,EAAW,IAAIH,EAAK,IAAI,EACxBI,GAAkBJ,CAAI,EAAE,QAAQK,GAAO,CACnC,GAAQC,GAAWD,CAAI,GAAMT,GAAoBW,GAAmBF,CAAI,EAAI,CACxE,IAAMG,EAAUH,EAAK,KAAK,IACtBG,GAAW,CAACL,EAAW,IAAIK,EAAQ,IAAI,GACvCP,GAAQO,EAASL,EAAYP,CAAY,CAEjD,CACJ,CAAC,CACL,CAVSJ,EAAAS,GAAA,WAoBH,SAAUQ,GAA0BC,EAA4B,CAClE,GAAIA,EAAS,SACT,OAAOA,EAAS,SACb,GAAIA,EAAS,KAAK,IAAK,CAC1B,IAAMC,EAAgBC,GAAmBF,EAAS,KAAK,GAAG,EAC1D,OAAOC,GAAe,QAC1B,CAEJ,CARgBnB,EAAAiB,GAAA,6BAeV,SAAUI,GAAkBC,EAA8B,CAC5D,OAAOA,EAAa,QAAU,CAACC,GAAaC,GAAcF,CAAY,CAAC,CAC3E,CAFgBtB,EAAAqB,GAAA,qBAUV,SAAUI,GAAqBZ,EAA2Ba,EAA4B,CACxF,MAAI,CAACb,GAAQ,CAACa,EACH,CAAA,EAEJC,GAA6Bd,EAAMa,EAAUb,EAAK,QAAS,EAAI,CAC1E,CALgBb,EAAAyB,GAAA,wBAgBV,SAAUG,GAAoBf,EAA2Ba,EAA8BG,EAAc,CACvG,GAAI,CAAChB,GAAQ,CAACa,EACV,OAEJ,IAAMI,EAAQH,GAA6Bd,EAAMa,EAAUb,EAAK,QAAS,EAAI,EAC7E,GAAIiB,EAAM,SAAW,EAGrB,OAAID,IAAU,OACVA,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAOC,EAAM,OAAS,CAAC,CAAC,EAErDD,EAAQ,EAELC,EAAMD,CAAK,CACtB,CAdgB7B,EAAA4B,GAAA,uBAgBhB,SAASD,GAA6Bd,EAAea,EAAkBK,EAA8BC,EAAc,CAC/G,GAAI,CAACA,EAAO,CACR,IAAMC,EAAcC,GAAmBrB,EAAK,cAAmBsB,EAAY,EAC3E,GAAIF,GAAeA,EAAY,UAAYP,EACvC,MAAO,CAACb,CAAI,CAEpB,CACA,OAAIuB,GAAmBvB,CAAI,GAAKA,EAAK,UAAYkB,EACtClB,EAAK,QAAQ,QAAQwB,GAAKV,GAA6BU,EAAGX,EAAUK,EAAS,EAAK,CAAC,EAEvF,CAAA,CACX,CAXS/B,EAAA2B,GAAA,gCAmBH,SAAUW,GAAoBzB,EAA2B0B,EAAe,CAC1E,OAAK1B,EAGE2B,GAA4B3B,EAAM0B,EAAS1B,GAAM,OAAO,EAFpD,CAAA,CAGf,CALgBb,EAAAsC,GAAA,uBAgBV,SAAUG,GAAmB5B,EAA2B0B,EAAiBV,EAAc,CACzF,GAAI,CAAChB,EACD,OAEJ,IAAMiB,EAAQU,GAA4B3B,EAAM0B,EAAS1B,GAAM,OAAO,EACtE,GAAIiB,EAAM,SAAW,EAGrB,OAAID,IAAU,OACVA,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAOC,EAAM,OAAS,CAAC,CAAC,EAErDD,EAAQ,EAELC,EAAMD,CAAK,CACtB,CAdgB7B,EAAAyC,GAAA,sBAgBV,SAAUD,GAA4B3B,EAAe0B,EAAiBR,EAA4B,CACpG,GAAIlB,EAAK,UAAYkB,EACjB,MAAO,CAAA,EAEX,GAAQW,GAAU7B,EAAK,aAAa,GAAKA,EAAK,cAAc,QAAU0B,EAClE,MAAO,CAAC1B,CAAI,EAEhB,IAAM8B,EAAeC,GAAU/B,CAAI,EAAE,SAAQ,EACzCgC,EACEC,EAA0B,CAAA,EAChC,EAEI,IADAD,EAASF,EAAa,KAAI,EACtB,CAACE,EAAO,KAAM,CACd,IAAME,EAAYF,EAAO,MACrBE,EAAU,UAAYhB,EACdW,GAAUK,EAAU,aAAa,GAAKA,EAAU,cAAc,QAAUR,GAC5EO,EAAa,KAAKC,CAAS,EAG/BJ,EAAa,MAAK,CAE1B,OACK,CAACE,EAAO,MACjB,OAAOC,CACX,CAxBgB9C,EAAAwC,GAAA,+BAgCV,SAAUQ,GAAeC,EAAgB,OAC3C,IAAMC,EAAUD,EAAQ,QAGxB,KAAOC,MAAYC,EAAAF,EAAQ,aAAS,MAAAE,IAAA,OAAA,OAAAA,EAAE,UAAS,CAC3C,IAAMC,EAAalB,GAAmBe,EAAQ,cAAmBd,EAAY,EAC7E,GAAIiB,EACA,OAAOA,EAEXH,EAAUA,EAAQ,SACtB,CAEJ,CAZgBjD,EAAAgD,GAAA,kBAmBV,SAAU5B,GAAmBiC,EAAsB,CACrD,IAAIC,EAAqBD,EACzB,OAAQE,GAAeD,CAAS,IAEpBE,GAASF,EAAU,UAAU,EAEjCA,EAAYA,EAAU,WAAW,WACtBvD,GAAauD,EAAU,UAAU,EAE5CA,EAAYA,EAAU,WAEtBG,GAAkBH,EAAU,UAAU,GAGvCI,GAA2BL,EAAMC,EAAW,IAAI,GAAK,CAChE,CAfgBtD,EAAAoB,GAAA,sBAiBhB,SAASsC,GAA2BL,EAAwBC,EAAoBK,EAAwD,OAEpI,SAASC,EAAG/C,EAAegD,EAAyB,CAChD,IAAIC,EAGJ,OAFyB5B,GAAmBrB,EAAUsB,EAAY,IAG9D2B,EAAkBJ,GAA2BG,EAASA,EAASF,CAAK,GAExEA,EAAM,IAAIN,EAAMS,CAAe,EACxBA,CACX,CAEA,GAXS9D,EAAA4D,EAAA,MAWLD,EAAM,IAAIN,CAAI,EACd,OAAOM,EAAM,IAAIN,CAAI,EAEzBM,EAAM,IAAIN,EAAM,MAAS,EACzB,QAAWxC,KAAQD,GAAkB0C,CAAS,EAAG,CAC7C,GAAQnB,GAAatB,CAAI,GAAKA,EAAK,QAAQ,YAAW,IAAO,OACzD,OAAA8C,EAAM,IAAIN,EAAMxC,CAAI,EACbA,EACJ,GAAQC,GAAWD,CAAI,GAASd,GAAac,EAAK,KAAK,GAAG,EAC7D,OAAO+C,EAAG/C,EAAMA,EAAK,KAAK,GAAG,EAC1B,GAAQkD,GAAalD,CAAI,IAAK,GAAAsC,EAAAtC,EAAK,WAAO,MAAAsC,IAAA,SAAAA,EAAE,KAC/C,OAAOS,EAAG/C,EAAMA,EAAK,QAAQ,GAAG,CAExC,CAEJ,CA5BSb,EAAA0D,GAAA,8BA8BH,SAAUM,GAAmBjC,EAA4B,CAC3D,IAAMkC,EAASlC,EAAQ,WACvB,GAAQmC,GAAQD,CAAM,EAAG,CACrB,IAAME,EAAWF,EAAO,SAClBpC,EAAQsC,EAAS,QAAQpC,CAAO,EACtC,QAAS,EAAIF,EAAQ,EAAG,GAAK,EAAG,IAAK,CACjC,IAAMuC,EAAOD,EAAS,CAAC,EACvB,GAAQX,GAASY,CAAI,EACjB,OAAOA,EACJ,CACH,IAAMC,EAASzD,GAAkBuD,EAAS,CAAC,CAAC,EAAE,KAASX,EAAQ,EAC/D,GAAIa,EACA,OAAOA,CAEf,CACJ,CACJ,CACA,GAAQC,GAAkBL,CAAM,EAC5B,OAAOD,GAAmBC,CAAM,CAIxC,CAtBgBjE,EAAAgE,GAAA,sBA2BV,SAAUO,GAAsBC,EAA2BzC,EAA6B,CAC1F,OAAOyC,IAAgB,KAAOA,IAAgB,KAAYN,GAAQnC,CAAO,GAAK,EAAQA,EAAQ,cAClG,CAFgB/B,EAAAuE,GAAA,yBAIV,SAAUE,GAAmBD,EAAyB,CACxD,OAAOA,IAAgB,KAAOA,IAAgB,GAClD,CAFgBxE,EAAAyE,GAAA,sBAIV,SAAUC,GAAgBC,EAAmB,CAC/C,OAAOA,IAAa,IACxB,CAFgB3E,EAAA0E,GAAA,mBAQV,SAAUE,GAAepE,EAAoB,CAC/C,OAAOqE,GAAuBrE,EAAM,IAAI,GAAK,CACjD,CAFgBR,EAAA4E,GAAA,kBAIhB,SAASC,GAAuBrE,EAAsBsE,EAA4B,CAC9E,GAAIA,EAAQ,IAAItE,CAAI,EAChB,MAAO,GAEPsE,EAAQ,IAAItE,CAAI,EAEpB,QAAWK,KAAQD,GAAkBJ,CAAI,EACrC,GAAQM,GAAWD,CAAI,GAKnB,GAJI,CAACA,EAAK,KAAK,KAIPd,GAAac,EAAK,KAAK,GAAG,GAAK,CAACgE,GAAuBhE,EAAK,KAAK,IAAKiE,CAAO,EACjF,MAAO,OAER,IAAQ3C,GAAatB,CAAI,EAC5B,MAAO,GACJ,GAAQ2C,GAAS3C,CAAI,EACxB,MAAO,GAGf,MAAO,EAAQL,EAAK,UACxB,CAtBSR,EAAA6E,GAAA,0BAwBH,SAAUE,GAAW1B,EAAc,CACrC,OAAO2B,GAAmB3B,EAAK,KAAM,IAAI,GAAK,CAClD,CAFgBrD,EAAA+E,GAAA,cAIhB,SAASC,GAAmB3B,EAA0ByB,EAAgC,CAClF,GAAIA,EAAQ,IAAIzB,CAAI,EAChB,MAAO,GAIX,GAFIyB,EAAQ,IAAIzB,CAAI,EAEZ4B,GAAY5B,CAAI,EACpB,MAAO,GACJ,GAAQ6B,GAAgB7B,CAAI,EAC/B,MAAO,GACJ,GAAQ8B,GAAY9B,CAAI,EAC3B,OAAOA,EAAK,MAAM,MAAMhB,GAAK2C,GAAmB3C,EAAGyC,CAAO,CAAC,EACxD,GAAQf,GAAaV,CAAI,EAAG,CAC/B,GAAIA,EAAK,gBAAkB,OACvB,MAAO,GACJ,GAAIA,EAAK,aAAe,OAC3B,MAAO,GACJ,GAAIA,EAAK,UAAY,OAAW,CACnC,IAAM+B,EAAM/B,EAAK,QAAQ,IACzB,OAAQgC,GAAOD,CAAG,EACPJ,GAAmBI,EAAI,KAAMN,CAAO,EAEpC,EAEf,KACI,OAAO,EAEf,KACI,OAAO,EAEf,CA9BS9E,EAAAgF,GAAA,sBAgCH,SAAUM,GAAoB9E,EAAoB,CACpD,GAAIA,EAAK,aACL,OAAOA,EAAK,aAAa,KACtB,GAAIA,EAAK,SACZ,OAAOA,EAAK,SACT,GAAIA,EAAK,WAAY,CACxB,IAAMqD,EAAUrD,EAAK,WAAW,IAChC,GAAIqD,EAAS,CAET,GAAQ9D,GAAa8D,CAAO,EACxB,OAAOA,EAAQ,KACZ,GAAQ0B,GAAY1B,CAAO,GAASwB,GAAOxB,CAAO,EACrD,OAAOA,EAAQ,IAEvB,CACJ,CAEJ,CAjBgB7D,EAAAsF,GAAA,uBAmBV,SAAUE,GAAYnC,EAAmC,OAC3D,GAAQtD,GAAasD,CAAI,EACrB,OAAOuB,GAAevB,CAAI,EAAIA,EAAK,MAAOF,EAAAmC,GAAoBjC,CAAI,KAAC,MAAAF,IAAA,OAAAA,EAAIE,EAAK,KACzE,GAAQkC,GAAYlC,CAAI,GAASgC,GAAOhC,CAAI,GAASoC,GAAapC,CAAI,EACzE,OAAOA,EAAK,KACT,GAAQG,GAASH,CAAI,EAAG,CAC3B,IAAMqC,EAAaC,GAActC,CAAI,EACrC,GAAIqC,EACA,OAAOA,CAEf,SAAenC,GAAeF,CAAI,EAC9B,OAAOA,EAAK,KAEhB,MAAM,IAAI,MAAM,iCAAiC,CACrD,CAdgBrD,EAAAwF,GAAA,eAgBV,SAAUG,GAActB,EAAkB,OAC5C,GAAIA,EAAO,aACP,OAAOA,EAAO,aAAa,KACxB,GAAI,GAAAlB,EAAAkB,EAAO,QAAI,MAAAlB,IAAA,SAAAA,EAAE,IACpB,OAAOqC,GAAYnB,EAAO,KAAK,GAAG,CAG1C,CAPgBrE,EAAA2F,GAAA,iBAgBV,SAAUC,GAAgBpF,EAAsB,WAClD,OAAQN,GAAeM,CAAI,GAChBqF,GAAA1C,EAAA3C,EAAK,QAAI,MAAA2C,IAAA,OAAA,OAAAA,EAAE,QAAI,MAAA0C,IAAA,OAAAA,EAAI,SAEnBjB,GAAepE,CAAI,EAAIA,EAAK,MAAOsF,EAAAR,GAAoB9E,CAAI,KAAC,MAAAsF,IAAA,OAAAA,EAAItF,EAAK,IAEpF,CANgBR,EAAA4F,GAAA,mBAeV,SAAUG,GAAYvF,EAAsB,WAC9C,OAAQN,GAAeM,CAAI,GAChBqF,GAAA1C,EAAA3C,EAAK,QAAI,MAAA2C,IAAA,OAAA,OAAAA,EAAE,QAAI,MAAA0C,IAAA,OAAAA,EAAI,UAEnBC,EAAAR,GAAoB9E,CAAI,KAAC,MAAAsF,IAAA,OAAAA,EAAItF,EAAK,IAEjD,CANgBR,EAAA+F,GAAA,eAQV,SAAUvE,GAAcF,EAA8B,CACxD,IAAM0E,EAAe,CACjB,EAAG,GACH,EAAG,GACH,EAAG,IAEDC,EAASC,GAAuB5E,EAAa,WAAY0E,CAAK,EAC9DG,EAAW,OAAO,QAAQH,CAAK,EAAE,OAAO,CAAC,CAAC,CAAEI,CAAK,IAAMA,CAAK,EAAE,IAAI,CAAC,CAACC,CAAI,IAAMA,CAAI,EAAE,KAAK,EAAE,EACjG,OAAO,IAAI,OAAOJ,EAAQE,CAAQ,CACtC,CATgBnG,EAAAwB,GAAA,iBAYhB,IAAM8E,GAAW,SAAS,OAQ1B,SAASJ,GAAuBnE,EAA8BiE,EAAa,CACvE,GAAQO,GAAuBxE,CAAO,EAClC,OAAOyE,GAA4BzE,CAAO,EACvC,GAAQ0E,GAAgB1E,CAAO,EAClC,OAAO2E,GAAqB3E,CAAO,EAChC,GAAQ4E,GAAiB5E,CAAO,EACnC,OAAO6E,GAAsB7E,CAAO,EACjC,GAAQhB,GAAmBgB,CAAO,EAAG,CACxC,IAAMvB,EAAOuB,EAAQ,KAAK,IAC1B,GAAI,CAACvB,EACD,MAAM,IAAI,MAAM,yBAAyB,EAE7C,OAAOqG,GAAgBX,GAAuB1F,EAAK,UAAU,EAAG,CAC5D,YAAauB,EAAQ,YACrB,UAAWA,EAAQ,UACtB,CACL,KAAO,IAAQ+E,GAAe/E,CAAO,EACjC,OAAOgF,GAAmBhF,CAAO,EAC9B,GAAQiF,GAAajF,CAAO,EAC/B,OAAOkF,GAAkBlF,CAAO,EAC7B,GAAQmF,GAAanF,CAAO,EAAG,CAClC,IAAMoF,EAAYpF,EAAQ,MAAM,YAAY,GAAG,EACzCkE,EAASlE,EAAQ,MAAM,UAAU,EAAGoF,CAAS,EAC7CC,EAAarF,EAAQ,MAAM,UAAUoF,EAAY,CAAC,EACxD,OAAInB,IACAA,EAAM,EAAIoB,EAAW,SAAS,GAAG,EACjCpB,EAAM,EAAIoB,EAAW,SAAS,GAAG,EACjCpB,EAAM,EAAIoB,EAAW,SAAS,GAAG,GAE9BP,GAAgBZ,EAAQ,CAC3B,YAAalE,EAAQ,YACrB,UAAWA,EAAQ,UACnB,KAAM,GACT,CACL,KAAO,IAAQsF,GAAWtF,CAAO,EAC7B,OAAO8E,GAAgBP,GAAU,CAC7B,YAAavE,EAAQ,YACrB,UAAWA,EAAQ,UACtB,EAED,MAAM,IAAI,MAAM,6BAA6BA,GAAS,KAAK,EAAE,GAErE,CA1CS/B,EAAAkG,GAAA,0BA4CT,SAASM,GAA4Bc,EAAsC,CACvE,OAAOT,GAAgBS,EAAa,SAAS,IAAI,GAAKpB,GAAuB,CAAC,CAAC,EAAE,KAAK,GAAG,EAAG,CACxF,YAAaoB,EAAa,YAC1B,UAAWA,EAAa,UAC3B,CACL,CALStH,EAAAwG,GAAA,+BAOT,SAASE,GAAqBa,EAAwB,CAClD,OAAOV,GAAgBU,EAAM,SAAS,IAAI,GAAKrB,GAAuB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAG,CAChF,YAAaqB,EAAM,YACnB,UAAWA,EAAM,UACpB,CACL,CALSvH,EAAA0G,GAAA,wBAOT,SAASO,GAAkBO,EAAqB,CAC5C,OAAOX,GAAgB,GAAGP,EAAQ,KAAKJ,GAAuBsB,EAAM,QAAQ,CAAC,GAAI,CAC7E,YAAaA,EAAM,YACnB,UAAWA,EAAM,UACpB,CACL,CALSxH,EAAAiH,GAAA,qBAOT,SAASF,GAAmBU,EAAwB,CAChD,OAAOZ,GAAgB,MAAMX,GAAuBuB,EAAO,QAAQ,CAAC,IAAInB,EAAQ,KAAM,CAClF,YAAamB,EAAO,YACpB,UAAWA,EAAO,UACrB,CACL,CALSzH,EAAA+G,GAAA,sBAOT,SAASH,GAAsBc,EAAyB,CACpD,OAAIA,EAAM,MACCb,GAAgB,IAAIc,GAAeD,EAAM,IAAI,CAAC,IAAIC,GAAeD,EAAM,KAAK,CAAC,IAAK,CACrF,YAAaA,EAAM,YACnB,UAAWA,EAAM,UACjB,KAAM,GACT,EAEEb,GAAgBc,GAAeD,EAAM,IAAI,EAAG,CAC/C,YAAaA,EAAM,YACnB,UAAWA,EAAM,UACjB,KAAM,GACT,CACL,CAbS1H,EAAA4G,GAAA,yBAeT,SAASe,GAAepF,EAAoB,CACxC,OAAOqF,GAAarF,EAAQ,KAAK,CACrC,CAFSvC,EAAA2H,GAAA,kBAIT,SAASd,GAAgBgB,EAAeC,EAIvC,OAIG,OAHIA,EAAQ,OAAS,IAASA,EAAQ,aAClCD,EAAQ,KAAI1E,EAAA2E,EAAQ,aAAS,MAAA3E,IAAA,OAAAA,EAAI,EAAE,GAAG0E,CAAK,KAE3CC,EAAQ,YACD,GAAGD,CAAK,GAAGC,EAAQ,WAAW,GAElCD,CACX,CAZS7H,EAAA6G,GAAA,mBSriBH,SAAUkB,GAAoBC,EAA6B,CAC7D,IAAMC,EAAkB,CAAA,EAClBC,EAAUF,EAAS,QACzB,QAAWG,KAAQD,EAAQ,MACnBE,GAAeD,CAAI,GAAKE,GAAkBF,CAAI,GAAKG,GAAmBC,GAAcJ,CAAI,CAAC,GACzFF,EAAM,KAAKE,EAAK,IAAI,EAG5B,MAAO,CACH,sBAAuBF,EACvB,WAAYO,GAEpB,CAZgBC,EAAAV,GAAA,uBC3BV,SAAUW,GAAYC,EAAW,CAEjC,SAAW,QAAQ,OACrB,QAAQ,MAAM,UAAUA,CAAG,EAAE,CAEjC,CALgBC,EAAAF,GAAA,eAOV,SAAUG,GAAcF,EAAW,CAEnC,SAAW,QAAQ,MAErB,QAAQ,KAAK,YAAYA,CAAG,EAAE,CAElC,CANgBC,EAAAC,GAAA,iBCPV,SAAUC,GAASC,EAAa,CACpC,IAAMC,EAAQ,IAAI,KAAI,EAAG,QAAO,EAC1BC,EAAMF,EAAI,EAGhB,MAAO,CAAE,KAFG,IAAI,KAAI,EAAG,QAAO,EACVC,EACE,MAAOC,CAAG,CAClC,CANgBC,EAAAJ,GAAA,SCCV,SAAUK,GAAiBC,EAAiB,CAChD,SAASC,GAAe,CAAI,CAAnBC,EAAAD,EAAA,mBAGTA,EAAgB,UAAYD,EAC5B,IAAMG,EAAe,IAAKF,EAE1B,SAASG,GAAU,CACjB,OAAO,OAAOD,EAAa,GAC7B,CAFS,OAAAD,EAAAE,EAAA,cAMTA,EAAU,EACVA,EAAU,EAIIJ,KAMV,MAAMA,CAAY,CACxB,CAzBgBE,EAAAH,GAAA,oBCShB,SAASM,GAAWC,EAAkB,CACpC,OAAIC,GAAcD,CAAO,EAChBA,EAAQ,MAERA,EAAQ,IAEnB,CANSE,EAAAH,GAAA,cAST,SAASE,GACPE,EAAc,CAEd,OAAOC,GAASD,EAAI,KAAK,GAAKA,EAAI,QAAU,EAC9C,CAJSD,EAAAD,GAAA,iBAMH,IAAgBI,GAAhB,KAAkC,CAzBxC,MAyBwC,CAAAH,EAAA,2BAGtC,IAAW,YAAU,CACnB,OAAO,KAAK,WACd,CACA,IAAW,WAAWI,EAAU,CAC9B,KAAK,YAAcA,CACrB,CAEA,YAAsBC,EAAgB,CAAhB,KAAA,YAAAA,CAAmB,CAEzC,OAAOC,EAAqB,CAC1BA,EAAQ,MAAM,IAAI,EAClBC,EAAQ,KAAK,WAAaC,GAAQ,CAChCA,EAAK,OAAOF,CAAO,CACrB,CAAC,CACH,GAGWG,EAAP,cACIN,EAAkB,CA9C5B,MA8C4B,CAAAH,EAAA,oBAQ1B,YAAYU,EAKX,CACC,MAAM,CAAA,CAAE,EARH,KAAA,IAAc,EASnBC,GACE,KACAC,GAAOF,EAAUG,GAAMA,IAAM,MAAS,CAAC,CAE3C,CAEA,IAAI,WAAWC,EAAyB,CAExC,CAEA,IAAI,YAAU,CACZ,OAAI,KAAK,iBAAmB,OACnB,KAAK,eAAe,WAEtB,CAAA,CACT,CAEA,OAAOR,EAAqB,CAC1BA,EAAQ,MAAM,IAAI,CAEpB,GAGWS,GAAP,cAAoBZ,EAAkB,CApF5C,MAoF4C,CAAAH,EAAA,aAI1C,YAAYU,EAIX,CACC,MAAMA,EAAQ,UAAU,EAPnB,KAAA,QAAkB,GAQvBC,GACE,KACAC,GAAOF,EAAUG,GAAMA,IAAM,MAAS,CAAC,CAE3C,GAGWG,EAAP,cAA2Bb,EAAkB,CArGnD,MAqGmD,CAAAH,EAAA,oBAGjD,YAAYU,EAGX,CACC,MAAMA,EAAQ,UAAU,EANnB,KAAA,kBAA6B,GAOlCC,GACE,KACAC,GAAOF,EAAUG,GAAMA,IAAM,MAAS,CAAC,CAE3C,GAGWI,EAAP,cACId,EAAkB,CArH5B,MAqH4B,CAAAH,EAAA,eAM1B,YAAYU,EAIX,CACC,MAAMA,EAAQ,UAAU,EARnB,KAAA,IAAc,EASnBC,GACE,KACAC,GAAOF,EAAUG,GAAMA,IAAM,MAAS,CAAC,CAE3C,GAGWK,EAAP,cACIf,EAAkB,CAzI5B,MAyI4B,CAAAH,EAAA,4BAM1B,YAAYU,EAIX,CACC,MAAMA,EAAQ,UAAU,EARnB,KAAA,IAAc,EASnBC,GACE,KACAC,GAAOF,EAAUG,GAAMA,IAAM,MAAS,CAAC,CAE3C,GAGWM,EAAP,cACIhB,EAAkB,CA7J5B,MA6J4B,CAAAH,EAAA,yCAO1B,YAAYU,EAIX,CACC,MAAMA,EAAQ,UAAU,EARnB,KAAA,IAAc,EASnBC,GACE,KACAC,GAAOF,EAAUG,GAAMA,IAAM,MAAS,CAAC,CAE3C,GAGWO,EAAP,cACIjB,EAAkB,CAlL5B,MAkL4B,CAAAH,EAAA,mBAO1B,YAAYU,EAIX,CACC,MAAMA,EAAQ,UAAU,EARnB,KAAA,IAAc,EASnBC,GACE,KACAC,GAAOF,EAAUG,GAAMA,IAAM,MAAS,CAAC,CAE3C,GAGWQ,EAAP,cACIlB,EAAkB,CAvM5B,MAuM4B,CAAAH,EAAA,gCAO1B,YAAYU,EAIX,CACC,MAAMA,EAAQ,UAAU,EARnB,KAAA,IAAc,EASnBC,GACE,KACAC,GAAOF,EAAUG,GAAMA,IAAM,MAAS,CAAC,CAE3C,GAGWS,EAAP,cACInB,EAA+B,CA5NzC,MA4NyC,CAAAH,EAAA,oBAQvC,IAAW,YAAU,CACnB,OAAO,KAAK,WACd,CACA,IAAW,WAAWI,EAAoB,CACxC,KAAK,YAAcA,CACrB,CAEA,YAAYM,EAMX,CACC,MAAMA,EAAQ,UAAU,EAnBnB,KAAA,IAAc,EACd,KAAA,kBAA6B,GAC7B,KAAA,cAAyB,GAkB9BC,GACE,KACAC,GAAOF,EAAUG,GAAMA,IAAM,MAAS,CAAC,CAE3C,GAGWU,EAAP,KAAe,CA1PrB,MA0PqB,CAAAvB,EAAA,iBAKnB,YAAYU,EAIX,CANM,KAAA,IAAc,EAOnBC,GACE,KACAC,GAAOF,EAAUG,GAAMA,IAAM,MAAS,CAAC,CAE3C,CAEA,OAAOP,EAAqB,CAC1BA,EAAQ,MAAM,IAAI,CACpB,GAgDI,SAAUkB,GAAiBC,EAAgB,CAC/C,OAAOC,EAAID,EAAUE,EAAmB,CAC1C,CAFgB3B,EAAAwB,GAAA,oBAIV,SAAUG,GAAoBC,EAAiB,CACnD,SAASC,EAAkBf,EAAyB,CAClD,OAAOY,EAAIZ,EAAYa,EAAmB,CAC5C,CAEA,GAJS3B,EAAA6B,EAAA,qBAILD,aAAgBnB,EAAa,CAC/B,IAAMqB,EAAgD,CACpD,KAAM,cACN,KAAMF,EAAK,gBACX,IAAKA,EAAK,KAGZ,OAAI1B,GAAS0B,EAAK,KAAK,IACrBE,EAAsB,MAAQF,EAAK,OAG9BE,MACF,IAAIF,aAAgBZ,EACzB,MAAyB,CACvB,KAAM,cACN,WAAYa,EAAkBD,EAAK,UAAU,GAE1C,GAAIA,aAAgBX,EACzB,MAAyB,CACvB,KAAM,SACN,IAAKW,EAAK,IACV,WAAYC,EAAkBD,EAAK,UAAU,GAE1C,GAAIA,aAAgBV,EACzB,MAAyB,CACvB,KAAM,sBACN,IAAKU,EAAK,IACV,WAAYC,EAAkBD,EAAK,UAAU,GAE1C,GAAIA,aAAgBT,EACzB,MAAyC,CACvC,KAAM,mCACN,IAAKS,EAAK,IACV,UACED,GAAoB,IAAIJ,EAAS,CAAE,aAAcK,EAAK,SAAS,CAAE,CAAC,EAEpE,WAAYC,EAAkBD,EAAK,UAAU,GAE1C,GAAIA,aAAgBP,EACzB,MAAyC,CACvC,KAAM,0BACN,IAAKO,EAAK,IACV,UACED,GAAoB,IAAIJ,EAAS,CAAE,aAAcK,EAAK,SAAS,CAAE,CAAC,EAEpE,WAAYC,EAAkBD,EAAK,UAAU,GAE1C,GAAIA,aAAgBR,EACzB,MAAyB,CACvB,KAAM,aACN,IAAKQ,EAAK,IACV,WAAYC,EAAkBD,EAAK,UAAU,GAE1C,GAAIA,aAAgBN,EACzB,MAAyB,CACvB,KAAM,cACN,IAAKM,EAAK,IACV,WAAYC,EAAkBD,EAAK,UAAU,GAE1C,GAAIA,aAAgBL,EAAU,CACnC,IAAMQ,EAA0C,CAC9C,KAAM,WACN,KAAMH,EAAK,aAAa,KACxB,MAAO/B,GAAW+B,EAAK,YAAY,EACnC,IAAKA,EAAK,KAGR1B,GAAS0B,EAAK,KAAK,IACrBG,EAAmB,cAAgBH,EAAK,OAG1C,IAAMI,EAAUJ,EAAK,aAAa,QAClC,OAAIA,EAAK,aAAa,UACpBG,EAAmB,QAAUE,GAASD,CAAO,EACnCA,EAAS,OACfA,GAGCD,MACF,IAAIH,aAAgBb,GACzB,MAA4B,CAC1B,KAAM,OACN,KAAMa,EAAK,KACX,QAASA,EAAK,QACd,WAAYC,EAAkBD,EAAK,UAAU,GAI/C,MAAM,MAAM,sBAAsB,GAEtC,CA/FgB5B,EAAA2B,GAAA,uBClTV,IAAgBO,GAAhB,KAA2B,CAdjC,MAciC,CAAAC,EAAA,oBACxB,MAAMC,EAAiB,CAC5B,IAAMC,EAAeD,EACrB,OAAQC,EAAQ,YAAa,CAC3B,KAAKC,EACH,OAAO,KAAK,iBAAiBD,CAAO,EACtC,KAAKE,EACH,OAAO,KAAK,iBAAiBF,CAAO,EACtC,KAAKG,EACH,OAAO,KAAK,YAAYH,CAAO,EACjC,KAAKI,EACH,OAAO,KAAK,yBAAyBJ,CAAO,EAC9C,KAAKK,EACH,OAAO,KAAK,sCAAsCL,CAAO,EAC3D,KAAKM,EACH,OAAO,KAAK,6BAA6BN,CAAO,EAClD,KAAKO,EACH,OAAO,KAAK,gBAAgBP,CAAO,EACrC,KAAKQ,EACH,OAAO,KAAK,iBAAiBR,CAAO,EACtC,KAAKS,EACH,OAAO,KAAK,cAAcT,CAAO,EACnC,KAAKU,GACH,OAAO,KAAK,UAAUV,CAAO,EAE/B,QACE,MAAM,MAAM,sBAAsB,EAExC,CAGO,iBAAiBD,EAAiB,CAAQ,CAG1C,iBAAiBA,EAAiB,CAAQ,CAG1C,YAAYA,EAAY,CAAQ,CAGhC,gBAAgBA,EAAgB,CAAQ,CAGxC,yBAAyBA,EAAyB,CAAQ,CAG1D,sCACLA,EAAsC,CAChC,CAGD,6BAA6BA,EAA6B,CAAQ,CAGlE,iBAAiBA,EAAiB,CAAQ,CAG1C,cAAcA,EAAc,CAAQ,CAGpC,UAAUA,EAAU,CAAQ,GC1D/B,SAAUY,GACdC,EAAiB,CAEjB,OACEA,aAAgBC,GAChBD,aAAgBE,GAChBF,aAAgBG,GAChBH,aAAgBI,GAChBJ,aAAgBK,GAChBL,aAAgBM,GAChBN,aAAgBO,GAChBP,aAAgBQ,EAEpB,CAbgBC,EAAAV,GAAA,kBAeV,SAAUW,GACdV,EACAW,EAAgC,CAAA,EAAE,CAMlC,OAHEX,aAAgBE,GAChBF,aAAgBG,GAChBH,aAAgBM,EAET,GAMLN,aAAgBY,EAEXC,GAAmBb,EAAM,WAAac,GACpCJ,GAAeI,EAASH,CAAc,CAC9C,EACQX,aAAgBe,GAAeC,GAASL,EAAgBX,CAAI,EAE9D,GACEA,aAAgBiB,IACrBjB,aAAgBe,GAClBJ,EAAe,KAAKX,CAAI,EAEnBkB,GACgBlB,EAAM,WAC1Bc,GACQJ,GAAeI,EAASH,CAAc,CAC9C,GAGI,EAEX,CApCgBF,EAAAC,GAAA,kBAsCV,SAAUS,GACdnB,EAAiB,CAEjB,OAAOA,aAAgBY,CACzB,CAJgBH,EAAAU,GAAA,mBAMV,SAAUC,GAAqBpB,EAA+B,CAElE,GAAIA,aAAgBe,EAClB,MAAO,UACF,GAAIf,aAAgBE,EACzB,MAAO,SACF,GAAIF,aAAgBY,EACzB,MAAO,KACF,GAAIZ,aAAgBI,EACzB,MAAO,eACF,GAAIJ,aAAgBK,EACzB,MAAO,mBACF,GAAIL,aAAgBM,EACzB,MAAO,WACF,GAAIN,aAAgBG,EACzB,MAAO,OACF,GAAIH,aAAgBO,EACzB,MAAO,UAGP,MAAM,MAAM,sBAAsB,CAEtC,CAtBgBE,EAAAW,GAAA,wBC1DV,IAAgBC,GAAhB,KAA0B,CAjBhC,MAiBgC,CAAAC,EAAA,mBAC9B,KAAKC,EAAqCC,EAAkB,CAAA,EAAE,CAC5DC,EAAQF,EAAK,WAAY,CAACG,EAAsBC,IAAS,CACvD,IAAMC,EAAWC,GAAKN,EAAK,WAAYI,EAAQ,CAAC,EAEhD,GAAID,aAAmBI,EACrB,KAAK,YAAYJ,EAASE,EAAUJ,CAAQ,UACnCE,aAAmBK,EAC5B,KAAK,aAAaL,EAASE,EAAUJ,CAAQ,UACpCE,aAAmBM,EAC5B,KAAK,SAASN,EAASE,EAAUJ,CAAQ,UAChCE,aAAmBO,EAC5B,KAAK,WAAWP,EAASE,EAAUJ,CAAQ,UAClCE,aAAmBQ,EAC5B,KAAK,eAAeR,EAASE,EAAUJ,CAAQ,UACtCE,aAAmBS,EAC5B,KAAK,kBAAkBT,EAASE,EAAUJ,CAAQ,UACzCE,aAAmBU,EAC5B,KAAK,YAAYV,EAASE,EAAUJ,CAAQ,UACnCE,aAAmBW,EAC5B,KAAK,SAASX,EAASE,EAAUJ,CAAQ,UAChCE,aAAmBY,EAC5B,KAAK,OAAOZ,EAASE,EAAUJ,CAAQ,MAEvC,OAAM,MAAM,sBAAsB,CAEtC,CAAC,CACH,CAEA,aACEe,EACAX,EACAJ,EAAuB,CAChB,CAET,YACEgB,EACAZ,EACAJ,EAAuB,CAChB,CAET,SACEiB,EACAb,EACAJ,EAAuB,CAGvB,IAAMkB,EAAad,EAAS,OAAOJ,CAAQ,EAC3C,KAAK,KAAKiB,EAAeC,CAAU,CACrC,CAEA,WACEC,EACAf,EACAJ,EAAuB,CAGvB,IAAMkB,EAAad,EAAS,OAAOJ,CAAQ,EAC3C,KAAK,KAAKmB,EAAiBD,CAAU,CACvC,CAEA,eACEE,EACAhB,EACAJ,EAAuB,CAGvB,IAAMqB,EAAoC,CACxC,IAAIZ,EAAO,CAAE,WAAYW,EAAe,UAAU,CAAE,GACpD,OAAYhB,EAAeJ,CAAQ,EACrC,KAAK,KAAKoB,EAAgBC,CAAkB,CAC9C,CAEA,kBACEC,EACAlB,EACAJ,EAAuB,CAGvB,IAAMuB,EAAwBC,GAC5BF,EACAlB,EACAJ,CAAQ,EAEV,KAAK,KAAKsB,EAAmBC,CAAqB,CACpD,CAEA,SACEE,EACArB,EACAJ,EAAuB,CAGvB,IAAM0B,EAA8B,CAClC,IAAIjB,EAAO,CAAE,WAAYgB,EAAS,UAAU,CAAE,GAC9C,OAAYrB,EAAeJ,CAAQ,EACrC,KAAK,KAAKyB,EAAUC,CAAY,CAClC,CAEA,YACEC,EACAvB,EACAJ,EAAuB,CAGvB,IAAM4B,EAAkBJ,GACtBG,EACAvB,EACAJ,CAAQ,EAEV,KAAK,KAAK2B,EAAaC,CAAe,CACxC,CAEA,OACEC,EACAzB,EACAJ,EAAuB,CAGvB,IAAMkB,EAAad,EAAS,OAAOJ,CAAQ,EAE3CC,EAAQ4B,EAAO,WAAaC,GAAO,CAIjC,IAAMC,EAAc,IAAIvB,EAAY,CAAE,WAAY,CAACsB,CAAG,CAAC,CAAE,EACzD,KAAK,KAAKC,EAAkBb,CAAU,CACxC,CAAC,CACH,GAGF,SAASM,GACPQ,EACA5B,EACAJ,EAAuB,CAUvB,MARmB,CACjB,IAAIS,EAAO,CACT,WAAY,CACV,IAAIF,EAAS,CAAE,aAAcyB,EAAW,SAAS,CAAE,GACnD,OAAOA,EAAW,UAAU,EAC/B,GAE8C,OAAO5B,EAAUJ,CAAQ,CAE5E,CAdSF,EAAA0B,GAAA,kCC1IH,SAAUS,GAAMC,EAAiB,CAErC,GAAIA,aAAgBC,EASlB,OAAOF,GAAoBC,EAAM,cAAc,EAC1C,GAAIA,aAAgBE,EACzB,OAAOC,GAA2BH,CAAI,EACjC,GAAII,GAAeJ,CAAI,EAC5B,OAAOK,GAAiBL,CAAI,EACvB,GAAIM,GAAgBN,CAAI,EAC7B,OAAOO,GAAkBP,CAAI,EAE7B,MAAM,MAAM,sBAAsB,CAEtC,CArBgBQ,EAAAT,GAAA,SAuBV,SAAUM,GAAiBL,EAEhC,CACC,IAAIS,EAAwB,CAAA,EACtBC,EAAMV,EAAK,WACbW,EAAiB,EACjBC,EAAyBF,EAAI,OAASC,EACtCE,EAEAC,EAA0B,GAE9B,KAAOF,GAA0BE,GAC/BD,EAAcH,EAAIC,CAAc,EAChCG,EAA0BC,GAAeF,CAAW,EACpDJ,EAAWA,EAAS,OAAOV,GAAMc,CAAW,CAAC,EAC7CF,EAAiBA,EAAiB,EAClCC,EAAyBF,EAAI,OAASC,EAGxC,OAAOK,GAAKP,CAAQ,CACtB,CApBgBD,EAAAH,GAAA,oBAsBV,SAAUE,GAAkBP,EAEjC,CACC,IAAMiB,EAAuCC,EAC3ClB,EAAK,WACJmB,GACQpB,GAAMoB,CAAS,CACvB,EAEH,OAAOH,GAAKI,GAAmBH,CAAqB,CAAC,CACvD,CAVgBT,EAAAD,GAAA,qBAYV,SAAUJ,GAAiBkB,EAAkB,CACjD,MAAO,CAACA,EAAS,YAAY,CAC/B,CAFgBb,EAAAL,GAAA,oBClET,IAAMmB,GAAK,SCQZ,IAAOC,GAAP,cAAmCC,EAAU,CATnD,MASmD,CAAAC,EAAA,4BAGjD,YAAoBC,EAAa,CAC/B,MAAK,EADa,KAAA,QAAAA,EAFb,KAAA,QAAuC,CAAA,CAI9C,CAEA,cAAY,CACV,YAAK,KAAK,KAAK,OAAO,EACf,KAAK,OACd,CAEA,aACEC,EACAC,EACAC,EAAuB,CAGzB,CAEA,YACEC,EACAF,EACAC,EAAuB,CAEvB,IAAME,EACJC,GAA8BF,EAAQ,eAAgBA,EAAQ,GAAG,EACjE,KAAK,QAAQ,KACTG,EAA0BL,EAAS,OAAOC,CAAQ,EAClDK,EAAW,IAAIC,EAAY,CAAE,WAAYF,CAAQ,CAAE,EACnDG,EAAuBC,GAAMH,CAAQ,EAC3C,KAAK,QAAQH,CAAU,EAAIK,CAC7B,GAGI,SAAUE,GACdC,EAAsB,CAEtB,IAAMC,EAAgB,CAAA,EAEtB,OAAAC,EAAQF,EAAiBb,GAAW,CAClC,IAAMgB,EAAiB,IAAInB,GAAoBG,CAAO,EAAE,aAAY,EACpEiB,GAAOH,EAAeE,CAAc,CACtC,CAAC,EACMF,CACT,CAVgBf,EAAAa,GAAA,0BAYV,SAAUN,GACdY,EACAC,EAAyB,CAEzB,OAAOD,EAAM,KAAOC,EAAoBC,EAC1C,CALgBrB,EAAAO,GAAA,iCC/ChB,IAAIe,GAAqD,CAAA,EACnDC,GAAe,IAAIC,GAUnB,SAAUC,GAAaC,EAAc,CACzC,IAAMC,EAAYD,EAAO,SAAQ,EACjC,GAAIJ,GAAe,eAAeK,CAAS,EACzC,OAAOL,GAAeK,CAAS,EAC1B,CACL,IAAMC,EAAYL,GAAa,QAAQI,CAAS,EAChD,OAAAL,GAAeK,CAAS,EAAIC,EACrBA,EAEX,CATgBC,EAAAJ,GAAA,gBAWV,SAAUK,IAAsB,CACpCR,GAAiB,CAAA,CACnB,CAFgBO,EAAAC,GAAA,0BCjBhB,IAAMC,GACJ,gEACWC,GACX;EAEI,SAAUC,GACdC,EACAC,EAAsB,GAAK,CAE3B,GAAI,CACF,IAAMC,EAAMC,GAAaH,CAAM,EAM/B,OALmBI,GACjBF,EAAI,MACJ,CAAA,EACAA,EAAI,MAAM,UAAU,QAGfG,EAAG,CAIV,GAAIA,EAAE,UAAYR,GACZI,GACFK,GACE,GAAGR,EAA2B,0BACDE,EAAO,SAAQ,CAAE;;;2FAGiD,MAG9F,CACL,IAAIO,EAAY,GACZN,IACFM,EACE;;iGAGJC,GACE,GAAGV,EAA2B;qBACLE,EAAO,SAAQ,CAAE;;2EAGxCO,CAAS,GAKjB,MAAO,CAAA,CACT,CA5CgBE,EAAAV,GAAA,iCA8CV,SAAUK,GACdF,EACAQ,EACAC,EAAmB,CAEnB,OAAQT,EAAI,KAAM,CAChB,IAAK,cACH,QAAS,EAAI,EAAG,EAAIA,EAAI,MAAM,OAAQ,IACpCE,GAA0BF,EAAI,MAAM,CAAC,EAAGQ,EAAQC,CAAU,EAE5D,MACF,IAAK,cACH,IAAMC,EAAQV,EAAI,MAClB,QAAS,EAAI,EAAG,EAAIU,EAAM,OAAQ,IAAK,CACrC,IAAMC,EAAOD,EAAM,CAAC,EAGpB,OAAQC,EAAK,KAAM,CACjB,IAAK,YAIL,IAAK,qBAEL,IAAK,YACL,IAAK,oBACL,IAAK,cACL,IAAK,eACL,IAAK,kBACH,SAGJ,IAAMC,EAAOD,EACb,OAAQC,EAAK,KAAM,CACjB,IAAK,YACHC,GAAwBD,EAAK,MAAOJ,EAAQC,CAAU,EACtD,MACF,IAAK,MACH,GAAIG,EAAK,aAAe,GACtB,MAAM,MAAMjB,EAAsB,EAEpCmB,EAAQF,EAAK,MAAQG,GAAQ,CAC3B,GAAI,OAAOA,GAAS,SAClBF,GAAwBE,EAAMP,EAAQC,CAAU,MAC3C,CAEL,IAAMO,EAAQD,EAEd,GAAIN,IAAe,GACjB,QACMQ,EAAYD,EAAM,KACtBC,GAAaD,EAAM,GACnBC,IAEAJ,GAAwBI,EAAWT,EAAQC,CAAU,MAIpD,CAEH,QACMQ,EAAYD,EAAM,KACtBC,GAAaD,EAAM,IAAMC,EAAYC,GACrCD,IAEAJ,GAAwBI,EAAWT,EAAQC,CAAU,EAIvD,GAAIO,EAAM,IAAME,GAAoB,CAClC,IAAMC,EACJH,EAAM,MAAQE,GACVF,EAAM,KACNE,GACAE,EAAcJ,EAAM,GACpBK,EAAYC,GAAyBH,CAAW,EAChDI,EAAYD,GAAyBF,CAAW,EAEtD,QACMI,EAAaH,EACjBG,GAAcD,EACdC,IAEAhB,EAAOgB,CAAU,EAAIA,IAK/B,CAAC,EACD,MACF,IAAK,QACHtB,GAA0BU,EAAK,MAAOJ,EAAQC,CAAU,EACxD,MAEF,QACE,MAAM,MAAM,sBAAsB,EAItC,IAAMgB,EACJb,EAAK,aAAe,QAAaA,EAAK,WAAW,UAAY,EAC/D,GAGGA,EAAK,OAAS,SAAWc,GAAgBd,CAAI,IAAM,IAEnDA,EAAK,OAAS,SAAWa,IAAyB,GAEnD,MAGJ,MAEF,QACE,MAAM,MAAM,uBAAuB,EAIvC,OAAOE,GAAOnB,CAAM,CACtB,CAvHgBD,EAAAL,GAAA,6BAyHhB,SAASW,GACPE,EACAP,EACAC,EAAmB,CAEnB,IAAMmB,EAAmBN,GAAyBP,CAAI,EACtDP,EAAOoB,CAAgB,EAAIA,EAEvBnB,IAAe,IACjBoB,GAAiBd,EAAMP,CAAM,CAEjC,CAXSD,EAAAM,GAAA,2BAaT,SAASgB,GACPd,EACAP,EAAsC,CAEtC,IAAMsB,EAAO,OAAO,aAAaf,CAAI,EAC/BgB,EAAYD,EAAK,YAAW,EAElC,GAAIC,IAAcD,EAAM,CACtB,IAAMF,EAAmBN,GAAyBS,EAAU,WAAW,CAAC,CAAC,EACzEvB,EAAOoB,CAAgB,EAAIA,MACtB,CACL,IAAMI,EAAYF,EAAK,YAAW,EAClC,GAAIE,IAAcF,EAAM,CACtB,IAAMF,EAAmBN,GACvBU,EAAU,WAAW,CAAC,CAAC,EAEzBxB,EAAOoB,CAAgB,EAAIA,GAGjC,CAnBSrB,EAAAsB,GAAA,oBAqBT,SAASI,GAASC,EAAcC,EAAyB,CACvD,OAAOC,GAAKF,EAAQ,MAAQG,GAAe,CACzC,GAAI,OAAOA,GAAgB,SACzB,OAAOC,GAASH,EAAiBE,CAAW,EACvC,CAEL,IAAMrB,EAAaqB,EACnB,OACED,GACED,EACCI,GAAevB,EAAM,MAAQuB,GAAcA,GAAcvB,EAAM,EAAE,IAC9D,OAGZ,CAAC,CACH,CAfST,EAAA0B,GAAA,YAiBT,SAASP,GAAgB1B,EAAQ,CAC/B,IAAMwC,EAAcxC,EAAa,WACjC,OAAIwC,GAAcA,EAAW,UAAY,EAChC,GAGJxC,EAAI,MAIFyC,GAAQzC,EAAI,KAAK,EACpB0C,GAAM1C,EAAI,MAAO0B,EAAe,EAChCA,GAAgB1B,EAAI,KAAK,EALpB,EAMX,CAbSO,EAAAmB,GAAA,mBAeT,IAAMiB,GAAN,cAA6BC,EAAiB,CA5P9C,MA4P8C,CAAArC,EAAA,uBAG5C,YAAoB4B,EAAyB,CAC3C,MAAK,EADa,KAAA,gBAAAA,EAFpB,KAAA,MAAiB,EAIjB,CAEA,cAAcU,EAAa,CAEzB,GAAI,KAAK,QAAU,GAMnB,QAAQA,EAAK,KAAM,CACjB,IAAK,YACH,KAAK,eAAeA,CAAI,EACxB,OACF,IAAK,oBACH,KAAK,uBAAuBA,CAAI,EAChC,OAGJ,MAAM,cAAcA,CAAI,EAC1B,CAEA,eAAeA,EAAe,CACxBP,GAAS,KAAK,gBAAiBO,EAAK,KAAK,IAC3C,KAAK,MAAQ,GAEjB,CAEA,SAASA,EAAS,CACZA,EAAK,WACHZ,GAASY,EAAM,KAAK,eAAe,IAAM,SAC3C,KAAK,MAAQ,IAGXZ,GAASY,EAAM,KAAK,eAAe,IAAM,SAC3C,KAAK,MAAQ,GAGnB,GAGI,SAAUC,GACdC,EACAC,EAAwB,CAExB,GAAIA,aAAmB,OAAQ,CAC7B,IAAMhD,EAAMC,GAAa+C,CAAO,EAC1BC,EAAiB,IAAIN,GAAeI,CAAS,EACnD,OAAAE,EAAe,MAAMjD,CAAG,EACjBiD,EAAe,UAEtB,QACEb,GAAUY,EAAUlB,GACXQ,GAASS,EAAoBjB,EAAM,WAAW,CAAC,CAAC,CACxD,IAAM,MAGb,CAhBgBvB,EAAAuC,GAAA,oBC7PhB,IAAMI,GAAU,UACHC,GAAe,cACfC,GAAQ,QAuBVC,GACT,OAAa,IAAI,OAAO,MAAM,EAAG,QAAW,UAUxC,SAAUC,GACdC,EACAC,EAQC,CAEDA,EAAUC,GAASD,EAAS,CAC1B,UAAWE,GACX,MAAO,GACP,SAAU,GACV,iBAAkB,OAClB,yBAA0B,CAAC,KAAM;CAAI,EACrC,OAAQC,EAAA,CAACC,EAAaC,IAAqBA,EAAM,EAAzC,UACT,EAED,IAAMC,EAASN,EAAQ,OAEvBM,EAAO,kCAAmC,IAAK,CAC7CC,GAA+B,CACjC,CAAC,EAED,IAAIC,EACJF,EAAO,kBAAmB,IAAK,CAC7BE,EAAoBC,GAAOV,EAAaW,GAC/BA,EAASC,EAAO,IAAMC,GAAM,EACpC,CACH,CAAC,EAED,IAAIC,EAAY,GACZC,EACJR,EAAO,qBAAsB,IAAK,CAChCO,EAAY,GACZC,EAAyBC,EACvBP,EACCE,GAAkC,CACjC,IAAMM,EAAcN,EAASC,EAAO,EAGpC,GAAIM,GAASD,CAAW,EAAG,CACzB,IAAME,EAAeF,EAAY,OACjC,OACEE,EAAa,SAAW,GAExBA,IAAiB,KACjBA,IAAiB,KACjBA,IAAiB,KACjB,CAACF,EAAY,WAENE,EAEPA,EAAa,SAAW,GACxBA,EAAa,CAAC,IAAM,MAEpB,CAACC,GACC,CACE,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEFD,EAAa,CAAC,CAAC,EAMVA,EAAa,CAAC,EAEdlB,EAAQ,UACXoB,GAAcJ,CAAW,EACzBK,GAAgBL,CAAW,MAE5B,IAAIM,GAAWN,CAAW,EAC/B,OAAAH,EAAY,GAEL,CAAE,KAAMG,CAAW,EACrB,GAAI,OAAOA,GAAgB,SAChC,OAAAH,EAAY,GAELG,EACF,GAAI,OAAOA,GAAgB,SAAU,CAC1C,GAAIA,EAAY,SAAW,EACzB,OAAOA,EACF,CACL,IAAMO,EAAsBP,EAAY,QACtC,sBACA,MAAM,EAEFQ,EAAgB,IAAI,OAAOD,CAAmB,EACpD,OAAOvB,EAAQ,UACXoB,GAAcI,CAAa,EAC3BH,GAAgBG,CAAa,OAGnC,OAAM,MAAM,sBAAsB,EAEtC,CAAC,CAEL,CAAC,EAED,IAAIC,EACAC,EACAC,EACAC,EACAC,EACJvB,EAAO,eAAgB,IAAK,CAC1BmB,EAAmBV,EACjBP,EACCE,GAAaA,EAAS,YAAa,EAGtCgB,EAAoBX,EAAIP,EAAoBsB,GAAc,CACxD,IAAMC,EAAYD,EAAM,MAExB,GAAIC,IAAcnB,GAAM,QAEjB,IAAIoB,GAASD,CAAS,EAC3B,OAAOA,EACF,GAAIE,GAAYF,CAAS,EAC9B,MAAO,GAEP,MAAM,MAAM,sBAAsB,EAEtC,CAAC,EAEDJ,EAA8BZ,EAAIP,EAAoBsB,GAAc,CAClE,IAAMI,EAAgBJ,EAAM,WAE5B,GAAII,EAIF,OAHwBC,GAAQD,CAAa,EACzCnB,EAAImB,EAAgBE,GAAcC,GAAQ7B,EAAmB4B,CAAI,CAAC,EAClE,CAACC,GAAQ7B,EAAmB0B,CAAa,CAAC,CAGlD,CAAC,EAEDN,EAAuBb,EACrBP,EACCsB,GAAeA,EAAM,SAAS,EAGjCD,EAAsBd,EAAIP,EAAoBsB,GAC5CQ,EAAIR,EAAO,UAAU,CAAC,CAE1B,CAAC,EAED,IAAIS,EACJjC,EAAO,2BAA4B,IAAK,CACtC,IAAMkC,EAA0BC,GAC9BzC,EAAQ,wBAAyB,EAEnCuC,EAAgCxB,EAAIP,EAAoBkC,GAAY,EAAK,EACrE1C,EAAQ,mBAAqB,eAC/BuC,EAAgCxB,EAAIP,EAAoBkC,GAClDJ,EAAII,EAAS,aAAa,EACrB,CAAC,CAACA,EAAQ,YAGfC,GAAsBD,EAASF,CAAuB,IAAM,IAC5DI,GACEJ,EACAE,EAAQ,OAA0B,CAIzC,EAEL,CAAC,EAED,IAAIG,EACAC,EACAC,EACAC,EACJ1C,EAAO,kBAAmB,IAAK,CAC7BuC,EAAuB9B,EAAIP,EAAmByC,EAAe,EAC7DH,EAAoB/B,EAAID,EAAwBoC,EAAc,EAE9DH,EAAcI,GACZ3C,EACA,CAAC4C,EAAKtB,IAAc,CAClB,IAAMC,EAAYD,EAAM,MACxB,OAAIE,GAASD,CAAS,GAAOA,IAAcnB,GAAM,UAC/CwC,EAAIrB,CAAS,EAAI,CAAA,GAEZqB,CACT,EACA,CAAA,CAAuC,EAGzCJ,EAAqBjC,EACnBD,EACA,CAACuC,EAAGC,KACK,CACL,QAASxC,EAAuBwC,CAAG,EACnC,UAAW3B,EAA4B2B,CAAG,EAC1C,kBAAmBf,EAA8Be,CAAG,EACpD,SAAUT,EAAqBS,CAAG,EAClC,MAAOR,EAAkBQ,CAAG,EAC5B,MAAO5B,EAAkB4B,CAAG,EAC5B,KAAM1B,EAAqB0B,CAAG,EAC9B,IAAKzB,EAAoByB,CAAG,EAC5B,aAAc7B,EAAiB6B,CAAG,EAClC,UAAW9C,EAAkB8C,CAAG,GAEnC,CAEL,CAAC,EAED,IAAIC,EAAiB,GACjBC,EACF,CAAA,EAEF,OAAKxD,EAAQ,UACXM,EAAO,0BAA2B,IAAK,CACrCkD,EAA+BL,GAC7B3C,EACA,CAACiD,EAAQC,EAAaJ,IAAO,CAC3B,GAAI,OAAOI,EAAY,SAAY,SAAU,CAC3C,IAAMC,EAAWD,EAAY,QAAQ,WAAW,CAAC,EAC3CE,GAAeC,GAAyBF,CAAQ,EACtDG,GAAiBL,EAAQG,GAAcZ,EAAmBM,CAAG,CAAC,UACrDnB,GAAQuB,EAAY,gBAAgB,EAAG,CAChD,IAAIK,EACJC,EAAQN,EAAY,iBAAmBO,IAAa,CAClD,IAAMN,GACJ,OAAOM,IAAc,SACjBA,GAAU,WAAW,CAAC,EACtBA,GACAC,GAAmBL,GAAyBF,EAAQ,EAKtDI,IAAqBG,KACvBH,EAAmBG,GACnBJ,GACEL,EACAS,GACAlB,EAAmBM,CAAG,CAAC,EAG7B,CAAC,UACQrC,GAASyC,EAAY,OAAO,EACrC,GAAIA,EAAY,QAAQ,QACtBH,EAAiB,GACbvD,EAAQ,qBACVmE,GACE,GAAGC,EAA2B,wBACHV,EAAY,QAAQ,SAAQ,CAAE;;;gGAG2C,MAGnG,CACL,IAAMW,EAAiBC,GACrBZ,EAAY,QACZ1D,EAAQ,mBAAmB,EAKzBuE,EAAQF,CAAc,IAIxBd,EAAiB,IAEnBS,EAAQK,EAAiBG,IAAQ,CAC/BV,GAAiBL,EAAQe,GAAMxB,EAAmBM,CAAG,CAAC,CACxD,CAAC,OAGCtD,EAAQ,qBACVmE,GACE,GAAGC,EAA2B,gBACXV,EAAY,IAAI;;+FAEgE,EAGvGH,EAAiB,GAGnB,OAAOE,CACT,EACA,CAAA,CAA8C,CAElD,CAAC,EAGI,CACL,YAAaV,EACb,mBAAoBC,EACpB,6BAA8BQ,EAC9B,UAAW3C,EACX,eAAgB0C,EAEpB,CA5TgBpD,EAAAL,GAAA,qBA8TV,SAAU2E,GACd1E,EACA2E,EAAyB,CAEzB,IAAIC,EAAkC,CAAA,EAEhCC,EAAgBC,GAAoB9E,CAAU,EACpD4E,EAASA,EAAO,OAAOC,EAAc,MAAM,EAE3C,IAAME,EAAgBC,GAAoBH,EAAc,KAAK,EACvDI,EAAkBF,EAAc,MACtC,OAAAH,EAASA,EAAO,OAAOG,EAAc,MAAM,EAE3CH,EAASA,EAAO,OAAOM,GAAsBD,CAAe,CAAC,EAE7DL,EAASA,EAAO,OAAOO,GAAqBF,CAAe,CAAC,EAE5DL,EAASA,EAAO,OACdQ,GAAwBH,EAAiBN,CAAe,CAAC,EAG3DC,EAASA,EAAO,OAAOS,GAAwBJ,CAAe,CAAC,EAExDL,CACT,CAxBgBxE,EAAAsE,GAAA,oBA0BhB,SAASQ,GACPlF,EAAuB,CAEvB,IAAI4E,EAAkC,CAAA,EAChCU,EAAqBC,GAAOvF,EAAa2D,GAC7CzC,GAASyC,EAAY/C,EAAO,CAAC,CAAC,EAGhC,OAAAgE,EAASA,EAAO,OAAOY,GAAqBF,CAAkB,CAAC,EAE/DV,EAASA,EAAO,OAAOa,GAAuBH,CAAkB,CAAC,EAEjEV,EAASA,EAAO,OAAOc,GAAqBJ,CAAkB,CAAC,EAE/DV,EAASA,EAAO,OAAOe,GAAsBL,CAAkB,CAAC,EAEhEV,EAASA,EAAO,OAAOgB,GAAsBN,CAAkB,CAAC,EAEzDV,CACT,CAnBSxE,EAAA8E,GAAA,yBA0BH,SAAUJ,GACd9E,EAAuB,CAEvB,IAAM6F,EAA+BN,GAAOvF,EAAaW,GAChD,CAAC4B,EAAI5B,EAAUC,EAAO,CAC9B,EAEKgE,EAAS5D,EAAI6E,EAA+BlF,IACzC,CACL,QACE,iBACAA,EAAS,KACT,uCACF,KAAMmF,GAAyB,gBAC/B,WAAY,CAACnF,CAAQ,GAExB,EAEKoF,EAAQC,GAAWhG,EAAY6F,CAA4B,EACjE,MAAO,CAAE,OAAAjB,EAAQ,MAAAmB,CAAK,CACxB,CApBgB3F,EAAA0E,GAAA,uBAsBV,SAAUE,GACdhF,EAAuB,CAEvB,IAAMiG,EAA+BV,GAAOvF,EAAaW,GAAY,CACnE,IAAMuF,EAAUvF,EAASC,EAAO,EAChC,MACE,CAACM,GAASgF,CAAO,GACjB,CAAC3E,GAAW2E,CAAO,GACnB,CAAC3D,EAAI2D,EAAS,MAAM,GACpB,CAACjE,GAASiE,CAAO,CAErB,CAAC,EAEKtB,EAAS5D,EAAIiF,EAA+BtF,IACzC,CACL,QACE,iBACAA,EAAS,KACT,0JAEF,KAAMmF,GAAyB,gBAC/B,WAAY,CAACnF,CAAQ,GAExB,EAEKoF,EAAQC,GAAWhG,EAAYiG,CAA4B,EACjE,MAAO,CAAE,OAAArB,EAAQ,MAAAmB,CAAK,CACxB,CA3BgB3F,EAAA4E,GAAA,uBA6BhB,IAAMmB,GAAe,WAEf,SAAUX,GACdxF,EAAuB,CAEvB,MAAMoG,UAAwBC,EAAiB,CA3fjD,MA2fiD,CAAAjG,EAAA,wBAA/C,aAAA,qBACE,KAAA,MAAQ,EAKV,CAHE,eAAekG,EAAa,CAC1B,KAAK,MAAQ,EACf,EAGF,IAAMC,EAAehB,GAAOvF,EAAaW,GAAY,CACnD,IAAMuF,EAAUvF,EAAS,QAEzB,GAAI,CACF,IAAM6F,EAAYC,GAAaP,CAAiB,EAC1CQ,EAAmB,IAAIN,EAC7B,OAAAM,EAAiB,MAAMF,CAAS,EAEzBE,EAAiB,WACd,CAGV,OAAOP,GAAa,KAAMD,EAAmB,MAAM,EAEvD,CAAC,EAgBD,OAdelF,EAAIuF,EAAe5F,IACzB,CACL,QACE;iBAEAA,EAAS,KACT;gFAGF,KAAMmF,GAAyB,iBAC/B,WAAY,CAACnF,CAAQ,GAExB,CAGH,CA1CgBP,EAAAoF,GAAA,wBA4CV,SAAUI,GACd5F,EAAuB,CAEvB,IAAM2G,EAAqBpB,GAAOvF,EAAaW,GAC7BA,EAAS,QACV,KAAK,EAAE,CACvB,EAaD,OAXeK,EAAI2F,EAAqBhG,IAC/B,CACL,QACE,iBACAA,EAAS,KACT,qDACF,KAAMmF,GAAyB,oBAC/B,WAAY,CAACnF,CAAQ,GAExB,CAGH,CApBgBP,EAAAwF,GAAA,yBAsBhB,IAAMgB,GAAiB,iBAEjB,SAAUnB,GACdzF,EAAuB,CAEvB,MAAM6G,UAA0BR,EAAiB,CA/jBnD,MA+jBmD,CAAAjG,EAAA,0BAAjD,aAAA,qBACE,KAAA,MAAQ,EAKV,CAHE,iBAAiBkG,EAAa,CAC5B,KAAK,MAAQ,EACf,EAGF,IAAMC,EAAehB,GAAOvF,EAAaW,GAAY,CACnD,IAAMuF,EAAUvF,EAAS,QACzB,GAAI,CACF,IAAM6F,EAAYC,GAAaP,CAAO,EAChCY,EAAqB,IAAID,EAC/B,OAAAC,EAAmB,MAAMN,CAAS,EAE3BM,EAAmB,WAChB,CAGV,OAAOF,GAAe,KAAKV,EAAQ,MAAM,EAE7C,CAAC,EAgBD,OAdelF,EAAIuF,EAAe5F,IACzB,CACL,QACE;iBAEAA,EAAS,KACT;wFAGF,KAAMmF,GAAyB,iBAC/B,WAAY,CAACnF,CAAQ,GAExB,CAGH,CAzCgBP,EAAAqF,GAAA,0BA2CV,SAAUC,GACd1F,EAAuB,CAEvB,IAAM+G,EAAexB,GAAOvF,EAAaW,GAAY,CACnD,IAAMuF,EAAUvF,EAASC,EAAO,EAChC,OAAOsF,aAAmB,SAAWA,EAAQ,WAAaA,EAAQ,OACpE,CAAC,EAaD,OAXelF,EAAI+F,EAAepG,IACzB,CACL,QACE,iBACAA,EAAS,KACT,oEACF,KAAMmF,GAAyB,wBAC/B,WAAY,CAACnF,CAAQ,GAExB,CAGH,CApBgBP,EAAAsF,GAAA,wBAuBV,SAAUC,GACd3F,EAAuB,CAEvB,IAAMgH,EAAqB,CAAA,EACvBC,EAAoBjG,EAAIhB,EAAakH,GAChC9D,GACLpD,EACA,CAAC0D,EAAQyD,KAELD,EAAU,QAAQ,SAAYC,EAAU,QAAmB,QAC3D,CAAC/F,GAAS4F,EAAOG,CAAS,GAC1BA,EAAU,UAAYtG,GAAM,KAI5BmG,EAAM,KAAKG,CAAS,EACpBzD,EAAO,KAAKyD,CAAS,GACdzD,GAIX,CAAA,CAAiB,CAEpB,EAEDuD,EAAoBG,GAAQH,CAAiB,EAE7C,IAAMI,EAAoB9B,GAAO0B,EAAoBK,GAC5CA,EAAiB,OAAS,CAClC,EAmBD,OAjBetG,EAAIqG,EAAoBE,GAAuB,CAC5D,IAAMC,EAAiBxG,EAAIuG,EAAiB5G,GACnCA,EAAS,IACjB,EAGD,MAAO,CACL,QACE,6BAHwB8G,GAAMF,CAAc,EAAG,OAGL,wDACYC,EAAe,KACnE,IAAI,CACL,MACH,KAAM1B,GAAyB,yBAC/B,WAAYyB,EAEhB,CAAC,CAGH,CAjDgBnH,EAAAuF,GAAA,yBAmDV,SAAUR,GACdnF,EAAuB,CAEvB,IAAM0H,EAAenC,GAAOvF,EAAa+B,GAAc,CACrD,GAAI,CAACQ,EAAIR,EAAO,OAAO,EACrB,MAAO,GAET,IAAM4F,EAAQ5F,EAAM,MAEpB,OAAO4F,IAAU9G,GAAM,SAAW8G,IAAU9G,GAAM,IAAM,CAACoB,GAAS0F,CAAK,CACzE,CAAC,EAaD,OAXe3G,EAAI0G,EAAe/G,IACzB,CACL,QACE,iBACAA,EAAS,KACT,gEACF,KAAMmF,GAAyB,yBAC/B,WAAY,CAACnF,CAAQ,GAExB,CAGH,CAxBgBP,EAAA+E,GAAA,wBA0BV,SAAUC,GACdpF,EACA4H,EAAoB,CAEpB,IAAMC,EAAetC,GAAOvF,EAAa+B,GAErCA,EAAM,YAAc,QAAa,CAACX,GAASwG,EAAY7F,EAAM,SAAS,CAEzE,EAaD,OAXef,EAAI6G,EAAelF,IAIzB,CACL,QAHA,iBAAiBA,EAAQ,IAAI,8DAA8DA,EAAQ,SAAS,yBAI5G,KAAMmD,GAAyB,yBAC/B,WAAY,CAACnD,CAAO,GAEvB,CAGH,CAtBgBvC,EAAAgF,GAAA,2BAwBV,SAAUC,GACdrF,EAAuB,CAEvB,IAAM4E,EAAkC,CAAA,EAElCkD,EAAc1E,GAClBpD,EACA,CAAC0D,EAAQf,EAASY,IAAO,CACvB,IAAM2C,EAAUvD,EAAQ,QAExB,OAAIuD,IAAYrF,GAAM,KAMlBoB,GAASiE,CAAO,EAClBxC,EAAO,KAAK,CAAE,IAAKwC,EAAS,IAAA3C,EAAK,UAAWZ,CAAO,CAAE,EAC5CzB,GAASgF,CAAO,GAAK6B,GAAW7B,CAAO,GAChDxC,EAAO,KAAK,CAAE,IAAKwC,EAAQ,OAAQ,IAAA3C,EAAK,UAAWZ,CAAO,CAAE,GAEvDe,CACT,EACA,CAAA,CAA0D,EAG5D,OAAAO,EAAQjE,EAAY,CAAC2C,EAASqF,IAAW,CACvC/D,EAAQ6D,EAAa,CAAC,CAAE,IAAAG,EAAK,IAAA1E,EAAK,UAAA2E,CAAS,IAAM,CAC/C,GAAIF,EAAUzE,GAAO4E,GAAcF,EAAKtF,EAAQ,OAAO,EAAG,CACxD,IAAMtC,EACJ,YAAY6H,EAAU,IAAI;4CACmBvF,EAAQ,IAAI;8EAG3DiC,EAAO,KAAK,CACV,QAASvE,EACT,KAAMyF,GAAyB,oBAC/B,WAAY,CAACnD,EAASuF,CAAS,EAChC,EAEL,CAAC,CACH,CAAC,EAEMtD,CACT,CA5CgBxE,EAAAiF,GAAA,2BA8ChB,SAAS8C,GAAcF,EAAa/B,EAAY,CAE9C,GAAIhF,GAASgF,CAAO,EAAG,CACrB,IAAMkC,EAAclC,EAAQ,KAAK+B,CAAG,EACpC,OAAOG,IAAgB,MAAQA,EAAY,QAAU,MAChD,IAAI7G,GAAW2E,CAAO,EAE3B,OAAOA,EAAQ+B,EAAK,EAAG,CAAA,EAAI,CAAA,CAAE,EACxB,GAAI1F,EAAI2D,EAAS,MAAM,EAE5B,OAAOA,EAAQ,KAAK+B,EAAK,EAAG,CAAA,EAAI,CAAA,CAAE,EAC7B,GAAI,OAAO/B,GAAY,SAC5B,OAAOA,IAAY+B,EAEnB,MAAM,MAAM,sBAAsB,EAEtC,CAhBS7H,EAAA+H,GAAA,iBAkBT,SAASJ,GAAWM,EAAc,CAiBhC,OACEC,GAhBgB,CAChB,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAGiBC,GAASF,EAAO,OAAO,QAAQE,CAAI,IAAM,EAAE,IAAM,MAEtE,CApBSnI,EAAA2H,GAAA,cAsBH,SAAUzG,GAAgB4E,EAAe,CAC7C,IAAMsC,EAAQtC,EAAQ,WAAa,IAAM,GAGzC,OAAO,IAAI,OAAO,OAAOA,EAAQ,MAAM,IAAKsC,CAAK,CACnD,CALgBpI,EAAAkB,GAAA,mBAOV,SAAUD,GAAc6E,EAAe,CAC3C,IAAMsC,EAAQtC,EAAQ,WAAa,KAAO,IAG1C,OAAO,IAAI,OAAO,GAAGA,EAAQ,MAAM,GAAIsC,CAAK,CAC9C,CALgBpI,EAAAiB,GAAA,iBAOV,SAAUoH,GACdC,EACAC,EACAC,EAA6C,CAE7C,IAAMhE,EAAkC,CAAA,EAGxC,OAAKrC,EAAImG,EAAiBG,EAAY,GACpCjE,EAAO,KAAK,CACV,QACE,sDACAiE,GACA;EACF,KAAM/C,GAAyB,sCAChC,EAEEvD,EAAImG,EAAiBI,EAAK,GAC7BlE,EAAO,KAAK,CACV,QACE,sDACAkE,GACA;EACF,KAAMhD,GAAyB,wCAChC,EAIDvD,EAAImG,EAAiBI,EAAK,GAC1BvG,EAAImG,EAAiBG,EAAY,GACjC,CAACtG,EAAImG,EAAgB,MAAOA,EAAgB,WAAW,GAEvD9D,EAAO,KAAK,CACV,QACE,kDAAkDiE,EAAY,MAAMH,EAAgB,WAAW;EAEjG,KAAM5C,GAAyB,mDAChC,EAGCvD,EAAImG,EAAiBI,EAAK,GAC5B7E,EAAQyE,EAAgB,MAAO,CAACK,EAAeC,IAAgB,CAC7D/E,EAAQ8E,EAAe,CAACpF,EAAasF,IAAW,CAC9C,GAAI/G,GAAYyB,CAAW,EACzBiB,EAAO,KAAK,CACV,QACE,sEACIoE,CAAY,gBAAgBC,CAAO;EACzC,KAAMnD,GAAyB,0CAChC,UACQvD,EAAIoB,EAAa,YAAY,EAAG,CACzC,IAAMuF,EAAY9G,GAAQuB,EAAY,UAAU,EAC5CA,EAAY,WACZ,CAACA,EAAY,UAAU,EAC3BM,EAAQiF,EAAYC,GAAiB,CAEjC,CAACjH,GAAYiH,CAAa,GAC1B,CAAC/H,GAAS2H,EAAeI,CAAa,GAEtCvE,EAAO,KAAK,CACV,QAAS,8DAA8DuE,EAAc,IAAI,eAAexF,EAAY,IAAI,sBAAsBqF,CAAY;EAC1J,KAAMlD,GAAyB,gDAChC,CAEL,CAAC,EAEL,CAAC,CACH,CAAC,EAGIlB,CACT,CAvEgBxE,EAAAqI,GAAA,wBAyEV,SAAUW,GACdV,EACAC,EACAC,EAA6C,CAE7C,IAAMS,EAAW,CAAA,EACbC,EAAkB,GAChBC,EAAgBnC,GAAQoC,GAAQC,GAAOf,EAAgB,KAAK,CAAC,CAAC,EAE9DgB,EAAqBhJ,GACzB6I,EACC5I,GAAaA,EAASC,EAAO,IAAMC,GAAM,EAAE,EAExC8I,EAAsBjH,GAAakG,CAAwB,EACjE,OAAID,GACF1E,EAAQyF,EAAqB/G,GAAW,CACtC,IAAMiH,EAAYhH,GAAsBD,EAASgH,CAAmB,EACpE,GAAIC,IAAc,GAAO,CAEvB,IAAMC,EAAoB,CACxB,QAFcC,GAA2BnH,EAASiH,CAAS,EAG3D,KAAMA,EAAU,MAChB,UAAWjH,GAEb0G,EAAS,KAAKQ,CAAiB,OAG3BtH,EAAII,EAAS,aAAa,EACxBA,EAAQ,cAAgB,KAC1B2G,EAAkB,IAIlBzG,GAAiB8G,EAAqBhH,EAAQ,OAAiB,IAE/D2G,EAAkB,GAI1B,CAAC,EAGCX,GAAc,CAACW,GACjBD,EAAS,KAAK,CACZ,QACE;;;;eAKF,KAAMvD,GAAyB,qBAChC,EAEIuD,CACT,CAtDgBjJ,EAAAgJ,GAAA,+BAwDV,SAAUW,GAAiB/G,EAEhC,CACC,IAAMgH,EAAoB,CAAA,EACpBC,EAAYC,GAAKlH,CAAW,EAElC,OAAAiB,EAAQgG,EAAYE,GAAW,CAC7B,IAAMC,EAAiBpH,EAAYmH,CAAO,EAG1C,GAAI/H,GAAQgI,CAAc,EACxBJ,EAAaG,CAAO,EAAI,CAAA,MAExB,OAAM,MAAM,sBAAsB,CAEtC,CAAC,EAEMH,CACT,CAlBgB5J,EAAA2J,GAAA,oBAqBV,SAAU7G,GAAgBgF,EAAoB,CAClD,IAAMhC,EAAUgC,EAAU,QAE1B,GAAIhH,GAASgF,CAAO,EAClB,MAAO,GACF,GAAI3E,GAAW2E,CAAO,EAE3B,MAAO,GACF,GAAI3D,EAAI2D,EAAS,MAAM,EAE5B,MAAO,GACF,GAAIjE,GAASiE,CAAO,EACzB,MAAO,GAEP,MAAM,MAAM,sBAAsB,CAEtC,CAhBgB9F,EAAA8C,GAAA,mBAkBV,SAAUC,GAAe+C,EAAY,CACzC,OAAIjE,GAASiE,CAAO,GAAKA,EAAQ,SAAW,EACnCA,EAAQ,WAAW,CAAC,EAEpB,EAEX,CANgB9F,EAAA+C,GAAA,kBAWT,IAAMkH,GAAwD,CAEnE,KAAMjK,EAAA,SAAUkK,EAAI,CAClB,IAAMC,EAAMD,EAAK,OACjB,QAASE,EAAI,KAAK,UAAWA,EAAID,EAAKC,IAAK,CACzC,IAAMC,EAAIH,EAAK,WAAWE,CAAC,EAC3B,GAAIC,IAAM,GACR,YAAK,UAAYD,EAAI,EACd,GACF,GAAIC,IAAM,GACf,OAAIH,EAAK,WAAWE,EAAI,CAAC,IAAM,GAC7B,KAAK,UAAYA,EAAI,EAErB,KAAK,UAAYA,EAAI,EAEhB,GAGX,MAAO,EACT,EAjBM,QAmBN,UAAW,GAGb,SAAS5H,GACPD,EACAF,EAAiC,CASjC,GAAIF,EAAII,EAAS,aAAa,EAG5B,MAAO,GAGP,GAAIzB,GAASyB,EAAQ,OAAO,EAAG,CAC7B,GAAI,CAEFE,GAAiBJ,EAAyBE,EAAQ,OAAiB,QAC5D+H,EAAG,CAEV,MAAO,CACL,MAAO5E,GAAyB,oBAChC,OAAS4E,EAAY,SAGzB,MAAO,OACF,IAAIzI,GAASU,EAAQ,OAAO,EAEjC,MAAO,GACF,GAAIO,GAAgBP,CAAO,EAEhC,MAAO,CAAE,MAAOmD,GAAyB,iBAAiB,EAE1D,MAAM,MAAM,sBAAsB,EAGxC,CAvCS1F,EAAAwC,GAAA,yBAyCH,SAAUkH,GACdnH,EACAgI,EAKC,CAGD,GAAIA,EAAQ,QAAU7E,GAAyB,oBAC7C,MACE;0BAC4BnD,EAAQ,IAAI;gBACtBgI,EAAQ,MAAM;oGAG7B,GAAIA,EAAQ,QAAU7E,GAAyB,kBACpD,MACE;0BAC4BnD,EAAQ,IAAI;kGAI1C,MAAM,MAAM,sBAAsB,CAEtC,CA1BgBvC,EAAA0J,GAAA,8BA4BhB,SAASpH,GAAakI,EAAiC,CASrD,OARkB5J,EAAI4J,EAAeC,GAC/B5I,GAAS4I,CAAW,EACfA,EAAY,WAAW,CAAC,EAExBA,CAEV,CAGH,CAVSzK,EAAAsC,GAAA,gBAYT,SAASqB,GACP+G,EACAC,EACAC,EAAQ,CAEJF,EAAIC,CAAG,IAAM,OACfD,EAAIC,CAAG,EAAI,CAACC,CAAK,EAEjBF,EAAIC,CAAG,EAAE,KAAKC,CAAK,CAEvB,CAVS5K,EAAA2D,GAAA,oBAYF,IAAMkH,GAAqB,IAiB9BC,GAAsC,CAAA,EACpC,SAAUpH,GAAyBF,EAAgB,CACvD,OAAOA,EAAWqH,GACdrH,EACAsH,GAA0BtH,CAAQ,CACxC,CAJgBxD,EAAA0D,GAAA,4BAchB,SAAStD,IAA+B,CACtC,GAAIgE,EAAQ0G,EAAyB,EAAG,CACtCA,GAA4B,IAAI,MAAM,KAAK,EAC3C,QAASV,EAAI,EAAGA,EAAI,MAAOA,IACzBU,GAA0BV,CAAC,EAAIA,EAAI,IAAM,IAAM,CAAC,EAAEA,EAAI,KAAOA,EAGnE,CAPSpK,EAAAI,GAAA,mCCjoCH,SAAU2K,GACdC,EACAC,EAAyB,CAEzB,IAAMC,EAAeF,EAAY,aACjC,OAAIE,IAAiBD,EAAe,aAC3B,GAGLA,EAAe,WAAa,IAC5BA,EAAe,mBAAoBC,CAAY,IAAM,EAG3D,CAbgBC,EAAAJ,GAAA,0BAiBV,SAAUK,GACdC,EACAC,EAAkB,CAElB,OAAOD,EAAM,eAAiBC,EAAQ,YACxC,CALgBH,EAAAC,GAAA,sCAOT,IAAIG,GAAoB,EAClBC,GAAqD,CAAA,EAE5D,SAAUC,GAAkBC,EAAuB,CAEvD,IAAMC,EAAuBC,GAAiBF,CAAU,EAGxDG,GAAwBF,CAAoB,EAG5CG,GAAwBH,CAAoB,EAC5CI,GAA2BJ,CAAoB,EAE/CK,EAAQL,EAAuBL,GAAW,CACxCA,EAAQ,SAAWA,EAAQ,gBAAiB,OAAS,CACvD,CAAC,CACH,CAdgBH,EAAAM,GAAA,qBAgBV,SAAUG,GAAiBF,EAAuB,CACtD,IAAIO,EAASC,GAAMR,CAAU,EAEzBS,EAAaT,EACbU,EAAY,GAChB,KAAOA,GAAW,CAChBD,EAAaE,GACXC,GAAQC,EAAIJ,EAAaK,GAAgBA,EAAY,UAAU,CAAC,CAAC,EAGnE,IAAMC,EAAgBC,GAAWP,EAAYF,CAAM,EAEnDA,EAASA,EAAO,OAAOQ,CAAa,EAEhCE,EAAQF,CAAa,EACvBL,EAAY,GAEZD,EAAaM,EAGjB,OAAOR,CACT,CArBgBd,EAAAS,GAAA,oBAuBV,SAAUC,GAAwBH,EAAuB,CAC7DM,EAAQN,EAAac,GAAe,CAC7BI,GAAoBJ,CAAW,IAClChB,GAAgBD,EAAiB,EAAIiB,EAC/BA,EAAa,aAAejB,MAKlCsB,GAAsBL,CAAW,GACjC,CAACM,GAAQN,EAAY,UAAU,IAI/BA,EAAY,WAAa,CAACA,EAAY,UAAkC,GAGrEK,GAAsBL,CAAW,IACpCA,EAAY,WAAa,CAAA,GAGtBO,GAAgCP,CAAW,IAC9CA,EAAY,gBAAkB,CAAA,GAG3BQ,GAAmCR,CAAW,IACjDA,EAAY,mBAAqB,CAAA,EAErC,CAAC,CACH,CA7BgBrB,EAAAU,GAAA,2BA+BV,SAAUE,GAA2BL,EAAuB,CAChEM,EAAQN,EAAac,GAAe,CAElCA,EAAY,gBAAkB,CAAA,EAC9BR,EAAQQ,EAAY,mBAAqB,CAACS,EAAKC,IAAO,CACpDV,EAAY,gBAAiB,KAC3BhB,GAAgB0B,CAAwB,EAAE,YAAa,CAE3D,CAAC,CACH,CAAC,CACH,CAVgB/B,EAAAY,GAAA,8BAYV,SAAUD,GAAwBJ,EAAuB,CAC7DM,EAAQN,EAAac,GAAe,CAClCW,GAA8B,CAAA,EAAIX,CAAW,CAC/C,CAAC,CACH,CAJgBrB,EAAAW,GAAA,2BAMV,SAAUqB,GACdC,EACAC,EAAmB,CAEnBrB,EAAQoB,EAAOE,GAAY,CACzBD,EAAS,mBAAoBC,EAAS,YAAa,EAAI,EACzD,CAAC,EAEDtB,EAAQqB,EAAS,WAAaE,GAAgB,CAC5C,IAAMC,EAAUJ,EAAK,OAAOC,CAAQ,EAE/BI,GAASD,EAASD,CAAY,GACjCJ,GAA8BK,EAASD,CAAY,CAEvD,CAAC,CACH,CAfgBpC,EAAAgC,GAAA,iCAiBV,SAAUP,GAAoBtB,EAAkB,CACpD,OAAOoC,EAAIpC,EAAS,cAAc,CACpC,CAFgBH,EAAAyB,GAAA,uBAIV,SAAUC,GAAsBvB,EAAkB,CACtD,OAAOoC,EAAIpC,EAAS,YAAY,CAClC,CAFgBH,EAAA0B,GAAA,yBAIV,SAAUE,GAAgCzB,EAAkB,CAChE,OAAOoC,EAAIpC,EAAS,iBAAiB,CACvC,CAFgBH,EAAA4B,GAAA,mCAIV,SAAUC,GACd1B,EAAkB,CAElB,OAAOoC,EAAIpC,EAAS,oBAAoB,CAC1C,CAJgBH,EAAA6B,GAAA,sCAMV,SAAUW,GAAYrC,EAAkB,CAC5C,OAAOoC,EAAIpC,EAAS,cAAc,CACpC,CAFgBH,EAAAwC,GAAA,eClKT,IAAMC,GAAwD,CACnE,iCAAiCC,EAAa,CAC5C,MAAO,uDAAuDA,EAAM,KAAK,4BAC3E,EAEA,iCACEC,EACAC,EACAC,EACAC,EACAC,EAAe,CAEf,MACE,2BAA2BJ,EAAS,OAClCC,CAAW,CACZ,iBAAiBA,CAAW,aAAkBC,CAAM,cAEzD,GC8BF,IAAYG,IAAZ,SAAYA,EAAwB,CAClCA,EAAAA,EAAA,gBAAA,CAAA,EAAA,kBACAA,EAAAA,EAAA,gBAAA,CAAA,EAAA,kBACAA,EAAAA,EAAA,iBAAA,CAAA,EAAA,mBACAA,EAAAA,EAAA,wBAAA,CAAA,EAAA,0BACAA,EAAAA,EAAA,yBAAA,CAAA,EAAA,2BACAA,EAAAA,EAAA,yBAAA,CAAA,EAAA,2BACAA,EAAAA,EAAA,yBAAA,CAAA,EAAA,2BACAA,EAAAA,EAAA,sCAAA,CAAA,EAAA,wCACAA,EAAAA,EAAA,wCAAA,CAAA,EAAA,0CACAA,EAAAA,EAAA,mDAAA,CAAA,EAAA,qDACAA,EAAAA,EAAA,0CAAA,EAAA,EAAA,4CACAA,EAAAA,EAAA,iBAAA,EAAA,EAAA,mBACAA,EAAAA,EAAA,oBAAA,EAAA,EAAA,sBACAA,EAAAA,EAAA,qBAAA,EAAA,EAAA,uBACAA,EAAAA,EAAA,oBAAA,EAAA,EAAA,sBACAA,EAAAA,EAAA,oBAAA,EAAA,EAAA,sBACAA,EAAAA,EAAA,kBAAA,EAAA,EAAA,oBACAA,EAAAA,EAAA,gDAAA,EAAA,EAAA,iDACF,GAnBYA,KAAAA,GAAwB,CAAA,EAAA,EAyBpC,IAAMC,GAA+C,CACnD,8BAA+B,GAC/B,iBAAkB,OAClB,uBAAwB,YACxB,yBAA0B,CAAC;EAAM,IAAI,EACrC,oBAAqB,GACrB,SAAU,GACV,qBAAsBC,GACtB,cAAe,GACf,gBAAiB,GACjB,gBAAiB,IAGnB,OAAO,OAAOD,EAAoB,EAE5B,IAAOE,GAAP,KAAY,CAzFlB,MAyFkB,CAAAC,EAAA,cA4BhB,YACYC,EACVC,EAAuBL,GAAoB,CAE3C,GAHU,KAAA,gBAAAI,EAvBL,KAAA,sBAAiD,CAAA,EACjD,KAAA,uBAAkD,CAAA,EAE/C,KAAA,mBAAuD,CAAA,EACvD,KAAA,6BAEN,CAAA,EAEM,KAAA,MAAkB,CAAA,EAElB,KAAA,YAA+C,CAAA,EAGjD,KAAA,gBAA2B,GAC3B,KAAA,cAAyB,GACzB,KAAA,UAAqB,GACrB,KAAA,mBAA8C,CAAA,EAu0BtD,KAAA,WAAa,CAAIE,EAAmBC,IAAyB,CAG3D,GAAI,KAAK,gBAAkB,GAAM,CAC/B,KAAK,kBACL,IAAMC,EAAS,IAAI,MAAM,KAAK,gBAAkB,CAAC,EAAE,KAAK,GAAI,EACxD,KAAK,gBAAkB,KAAK,mBAC9B,QAAQ,IAAI,GAAGA,CAAM,QAAQF,CAAS,GAAG,EAE3C,GAAM,CAAE,KAAAG,EAAM,MAAAC,CAAK,EAAKC,GAAMJ,CAAS,EAEjCK,EAAcH,EAAO,GAAK,QAAQ,KAAO,QAAQ,IACvD,OAAI,KAAK,gBAAkB,KAAK,mBAC9BG,EAAY,GAAGJ,CAAM,QAAQF,CAAS,WAAWG,CAAI,IAAI,EAE3D,KAAK,kBACEC,MAEP,QAAOH,EAAS,CAEpB,EAj1BM,OAAOF,GAAW,UACpB,MAAM,MACJ;8CACiD,EAKrD,KAAK,OAASQ,GAAO,CAAA,EAAIb,GAAsBK,CAAM,EAErD,IAAMS,EAAe,KAAK,OAAO,cAC7BA,IAAiB,IACnB,KAAK,kBAAoB,IACzB,KAAK,cAAgB,IACZ,OAAOA,GAAiB,WACjC,KAAK,kBAAoBA,EACzB,KAAK,cAAgB,IAEvB,KAAK,gBAAkB,GAEvB,KAAK,WAAW,oBAAqB,IAAK,CACxC,IAAIC,EACAC,EAAoB,GACxB,KAAK,WAAW,wBAAyB,IAAK,CAC5C,GACE,KAAK,OAAO,yBACZhB,GAAqB,uBAGrB,KAAK,OAAO,uBAAyBiB,WAGnC,KAAK,OAAO,2BACZjB,GAAqB,yBAErB,MAAM,MACJ;uGAC2G,EAKjH,GAAIK,EAAO,UAAYA,EAAO,oBAC5B,MAAM,MACJ,oEAAoE,EAIxE,KAAK,gBAAkB,kBAAkB,KACvC,KAAK,OAAO,gBAAgB,EAE9B,KAAK,cAAgB,QAAQ,KAAK,KAAK,OAAO,gBAAgB,EAG1Da,GAAQd,CAAe,EACzBW,EAAmB,CACjB,MAAO,CAAE,YAAaI,GAAMf,CAAe,CAAC,EAC5C,YAAagB,KAIfJ,EAAoB,GACpBD,EAAmBI,GAAiCf,CAAe,EAEvE,CAAC,EAEG,KAAK,OAAO,kBAAoB,KAClC,KAAK,WAAW,uBAAwB,IAAK,CAC3C,KAAK,sBAAwB,KAAK,sBAAsB,OACtDiB,GACEN,EACA,KAAK,gBACL,KAAK,OAAO,wBAAwB,CACrC,CAEL,CAAC,EAED,KAAK,WAAW,8BAA+B,IAAK,CAClD,KAAK,uBAAyB,KAAK,uBAAuB,OACxDO,GACEP,EACA,KAAK,gBACL,KAAK,OAAO,wBAAwB,CACrC,CAEL,CAAC,GAIHA,EAAiB,MAAQA,EAAiB,MACtCA,EAAiB,MACjB,CAAA,EAIJQ,EAAQR,EAAiB,MAAO,CAACS,EAAeC,IAAgB,CAC9DV,EAAiB,MAAMU,CAAY,EAAIC,GACrCF,EACCG,GAAgBC,GAAYD,CAAW,CAAC,CAE7C,CAAC,EAED,IAAME,EAAeC,GAAKf,EAAiB,KAAK,EAyDhD,GAvDAQ,EACER,EAAiB,MACjB,CAACgB,EAAyBC,IAAe,CACvC,KAAK,WAAW,UAAUA,CAAW,eAAgB,IAAK,CAcxD,GAbA,KAAK,MAAM,KAAKA,CAAW,EAEvB,KAAK,OAAO,kBAAoB,IAClC,KAAK,WAAW,mBAAoB,IAAK,CACvC,KAAK,sBAAwB,KAAK,sBAAsB,OACtDC,GAAiBF,EAAYF,CAAY,CAAC,CAE9C,CAAC,EAMCK,EAAQ,KAAK,qBAAqB,EAAG,CACvCC,GAAkBJ,CAAU,EAE5B,IAAIK,EACJ,KAAK,WAAW,oBAAqB,IAAK,CACxCA,EAAoBC,GAAkBN,EAAY,CAChD,yBACE,KAAK,OAAO,yBACd,iBAAkB1B,EAAO,iBACzB,oBAAqBA,EAAO,oBAC5B,SAAUA,EAAO,SACjB,OAAQ,KAAK,WACd,CACH,CAAC,EAED,KAAK,mBAAmB2B,CAAW,EACjCI,EAAkB,mBAEpB,KAAK,6BAA6BJ,CAAW,EAC3CI,EAAkB,6BAEpB,KAAK,YAAcvB,GACjB,CAAA,EACA,KAAK,YACLuB,EAAkB,WAAW,EAG/B,KAAK,UAAYA,EAAkB,WAAa,KAAK,UAErD,KAAK,mBAAmBJ,CAAW,EACjCI,EAAkB,eAExB,CAAC,CACH,CAAC,EAGH,KAAK,YAAcrB,EAAiB,YAGlC,CAACmB,EAAQ,KAAK,qBAAqB,GACnC,CAAC,KAAK,OAAO,8BACb,CAIA,IAAMI,EAHiBC,EAAI,KAAK,sBAAwBC,GAC/CA,EAAM,OACd,EAC2C,KAC1C;CAA2B,EAE7B,MAAM,IAAI,MACR;EAA8CF,CAAoB,EAKtEf,EAAQ,KAAK,uBAAyBkB,GAAqB,CACzDC,GAAcD,EAAkB,OAAO,CACzC,CAAC,EAED,KAAK,WAAW,uCAAwC,IAAK,CAwB3D,GApBIE,IACF,KAAK,UAAiBC,GACtB,KAAK,MAAQ,KAAK,gBAElB,KAAK,gBAAkBC,GACvB,KAAK,MAAQ,KAAK,eAGhB7B,IACF,KAAK,YAAc6B,IAGjB,KAAK,kBAAoB,KAC3B,KAAK,iBAAmBD,IAGtB,KAAK,gBAAkB,KACzB,KAAK,iCAAmCC,IAGtC,QAAQ,KAAK,KAAK,OAAO,gBAAgB,EAC3C,KAAK,oBAAsB,KAAK,wBACvB,aAAa,KAAK,KAAK,OAAO,gBAAgB,EACvD,KAAK,oBAAsB,KAAK,6BACvB,cAAc,KAAK,KAAK,OAAO,gBAAgB,EACxD,KAAK,oBAAsB,KAAK,0BAEhC,OAAM,MACJ,8CAA8C,KAAK,OAAO,gBAAgB,GAAG,EAI7E,KAAK,WACP,KAAK,SAAW,KAAK,kBACrB,KAAK,cAAgB,KAAK,0BAE1B,KAAK,SAAW,KAAK,0BACrB,KAAK,cAAgB,KAAK,sBAE9B,CAAC,EAED,KAAK,WAAW,+BAAgC,IAAK,CACnD,IAAMC,EAAmBC,GACvB,KAAK,mBACL,CAACC,EAAmBC,EAAgBC,KAC9BD,IAAmB,IACrBD,EAAkB,KAAKE,CAAQ,EAE1BF,GAET,CAAA,CAAc,EAGhB,GAAI3C,EAAO,qBAAuB,CAAC6B,EAAQY,CAAgB,EACzD,MAAM,MACJ,kBAAkBA,EAAiB,KACjC,IAAI,CACL;;yEAE4E,CAGnF,CAAC,EAED,KAAK,WAAW,yBAA0B,IAAK,CAC7CK,GAAsB,CACxB,CAAC,EAED,KAAK,WAAW,mBAAoB,IAAK,CACvCC,GAAiB,IAAI,CACvB,CAAC,CACH,CAAC,CACH,CAEO,SACLC,EACAC,EAAsB,KAAK,YAAW,CAEtC,GAAI,CAACpB,EAAQ,KAAK,qBAAqB,EAAG,CAIxC,IAAMI,EAHiBC,EAAI,KAAK,sBAAwBC,GAC/CA,EAAM,OACd,EAC2C,KAC1C;CAA2B,EAE7B,MAAM,IAAI,MACR;EACEF,CAAoB,EAI1B,OAAO,KAAK,iBAAiBe,EAAMC,CAAW,CAChD,CAMQ,iBAAiBD,EAAcC,EAAmB,CACxD,IAAIC,EACFC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACIC,EAAUlB,EACVmB,EAAYD,EAAQ,OACtBE,EAAS,EACTC,GAAqB,EAKnBC,GAAwB,KAAK,UAC/B,EACA,KAAK,MAAMtB,EAAK,OAAS,EAAE,EACzBuB,GAAgB,IAAI,MAAMD,EAAqB,EAC/CE,GAAyB,CAAA,EAC3BC,GAAO,KAAK,gBAAkB,EAAI,OAClCC,EAAS,KAAK,gBAAkB,EAAI,OAClCC,EAAcC,GAAiB,KAAK,WAAW,EAC/CC,EAAa,KAAK,gBAClBC,EAAwB,KAAK,OAAO,uBAEtCC,EAAyB,EACzBC,EAAuC,CAAA,EACvCC,EAEA,CAAA,EAEEC,GAAsB,CAAA,EAEtBC,GAA+B,CAAA,EACrC,OAAO,OAAOA,EAAU,EACxB,IAAIC,GAEJ,SAASC,IAAuB,CAC9B,OAAOL,CACT,CAFSlF,EAAAuF,GAAA,2BAIT,SAASC,GAA6BC,GAAgB,CACpD,IAAMC,GAAmBC,GAAyBF,EAAQ,EACpDG,GACJT,EAAiCO,EAAgB,EACnD,OAAIE,KAAqB,OAChBP,GAEAO,EAEX,CATS5F,EAAAwF,GAAA,gCAWT,IAAMK,GAAW7F,EAAC8F,IAAoB,CAEpC,GACEV,GAAU,SAAW,GAGrBU,GAAS,UAAU,YAAc,OACjC,CAGA,IAAM5B,GACJ,KAAK,OAAO,qBAAqB,iCAC/B4B,EAAQ,EAGZpB,GAAO,KAAK,CACV,OAAQoB,GAAS,YACjB,KAAMA,GAAS,UACf,OAAQA,GAAS,YACjB,OAAQA,GAAS,MAAM,OACvB,QAAS5B,GACV,MACI,CACLkB,GAAU,IAAG,EACb,IAAMW,GAAUC,GAAKZ,EAAS,EAC9BF,EAAqB,KAAK,mBAAmBa,EAAO,EACpDZ,EACE,KAAK,6BAA6BY,EAAO,EAC3Cd,EAAyBC,EAAmB,OAC5C,IAAMe,GACJ,KAAK,mBAAmBF,EAAO,GAAK,KAAK,OAAO,WAAa,GAE3DZ,GAAoCc,GACtCX,GAAsBE,GAEtBF,GAAsBC,GAG5B,EAtCiB,YAwCjB,SAASW,GAAuBH,GAAe,CAC7CX,GAAU,KAAKW,EAAO,EACtBZ,EACE,KAAK,6BAA6BY,EAAO,EAE3Cb,EAAqB,KAAK,mBAAmBa,EAAO,EACpDd,EAAyBC,EAAmB,OAE5CD,EAAyBC,EAAmB,OAC5C,IAAMe,GACJ,KAAK,mBAAmBF,EAAO,GAAK,KAAK,OAAO,WAAa,GAE3DZ,GAAoCc,GACtCX,GAAsBE,GAEtBF,GAAsBC,EAE1B,CAjBSvF,EAAAkG,GAAA,aAqBTA,GAAU,KAAK,KAAM/C,CAAW,EAEhC,IAAIgD,GAEEC,GAAkB,KAAK,OAAO,gBAEpC,KAAO9B,EAASD,GAAW,CACzBZ,EAAe,KAEf,IAAM4C,GAAejC,EAAQ,WAAWE,CAAM,EACxCgC,GAA2BhB,GAAoBe,EAAY,EAC3DE,GAAuBD,GAAyB,OAEtD,IAAKlD,EAAI,EAAGA,EAAImD,GAAsBnD,IAAK,CACzC+C,GAAaG,GAAyBlD,CAAC,EACvC,IAAMoD,GAAcL,GAAW,QAC/BzC,EAAU,KAGV,IAAM+C,GAAiBN,GAAW,MA0BlC,GAzBIM,KAAmB,GACjBJ,KAAiBI,KAEnBhD,EAAe+C,IAERL,GAAW,WAAa,IACjChC,EAASqC,GAA4B,KACnCpC,EACAE,EACAG,GACAI,CAAM,EAEJV,IAAU,MACZV,EAAeU,EAAM,CAAC,EACjBA,EAAqC,UAAY,SACpDT,EAAWS,EAAqC,UAGlDV,EAAe,OAGjB,KAAK,gBAAgB+C,GAAuBlC,CAAM,EAClDb,EAAe,KAAK,MAAM+C,GAAuBtD,EAAMoB,CAAM,GAG3Db,IAAiB,KAAM,CAIzB,GADAD,EAAY2C,GAAW,UACnB3C,IAAc,OAAW,CAG3B,IAAMkD,GAAkBlD,EAAU,OAClC,IAAKF,EAAI,EAAGA,EAAIoD,GAAiBpD,IAAK,CACpC,IAAMqD,GAAkBzB,EAAmB1B,EAAUF,CAAC,CAAC,EACjDsD,GAAmBD,GAAgB,QA+BzC,GA9BAhD,EAAa,KAITgD,GAAgB,WAAa,IAC/BxC,EAASyC,GAAiC,KACxCxC,EACAE,EACAG,GACAI,CAAM,EAEJV,IAAU,MACZZ,EAAgBY,EAAM,CAAC,EAEpBA,EAAqC,UAAY,SAElDR,EAAcQ,EAAqC,UAGrDZ,EAAgB,OAGlB,KAAK,gBAAgBqD,GAA4BtC,CAAM,EACvDf,EAAgB,KAAK,MACnBqD,GACA1D,EACAoB,CAAM,GAINf,GAAiBA,EAAc,OAASE,EAAa,OAAQ,CAC/DA,EAAeF,EACfG,EAAUC,EACVwC,GAAaQ,GAGb,QAIN,OAKJ,GAAIlD,IAAiB,KAAM,CAoCzB,GAnCAG,EAAcH,EAAa,OAC3BI,EAAQsC,GAAW,MACftC,IAAU,SACZC,EAAUqC,GAAW,aAGrBpC,EAAW,KAAK,oBACdN,EACAa,EACAR,EACAqC,GAAW,UACXxB,GACAC,EACAhB,CAAW,EAGb,KAAK,cAAcG,EAAUL,CAAO,EAGhCG,IAAU,GACZU,GAAqB,KAAK,SACxBE,GACAF,GACAR,CAAQ,EAGVc,EAAOhB,CAAK,EAAE,KAAKE,CAAQ,GAG/Bb,EAAO,KAAK,UAAUA,EAAMU,CAAW,EACvCU,EAASA,EAASV,EAGlBgB,EAAS,KAAK,iBAAiBA,EAAShB,CAAW,EAE/CmB,IAAe,IAAQoB,GAAW,oBAAsB,GAAM,CAChE,IAAIU,GAAkB,EAClBC,GACAC,GACJ/B,EAAsB,UAAY,EAClC,GACE8B,GAAkB9B,EAAsB,KAAKvB,CAAY,EACrDqD,KAAoB,KACtBC,GAAkB/B,EAAsB,UAAY,EACpD6B,YAEKC,KAAoB,IAEzBD,KAAoB,IACtBlC,GAAOA,GAAQkC,GACfjC,EAAShB,EAAcmD,GACvB,KAAK,iCACHhD,EACAF,EACAkD,GACAF,GACAlC,GACAC,EACAhB,CAAW,GAKjB,KAAK,YAAYuC,GAAYN,GAAUK,GAAWnC,CAAS,MACtD,CAEL,IAAMiD,GAAmB1C,EACnB2C,GAAYtC,GACZuC,GAActC,EAChBuC,GAAmBf,KAAoB,GAE3C,KAAOe,KAAqB,IAAS7C,EAASD,GAI5C,IAFAnB,EAAO,KAAK,UAAUA,EAAM,CAAC,EAC7BoB,IACKjB,EAAI,EAAGA,EAAI4B,EAAwB5B,IAAK,CAC3C,IAAM8C,GAAajB,EAAmB7B,CAAC,EACjCmD,GAAcL,GAAW,QAGzBM,GAAiBN,GAAW,MAmBlC,GAlBIM,KAAmB,GACjBrC,EAAQ,WAAWE,CAAM,IAAMmC,KAEjCU,GAAmB,IAEZhB,GAAW,WAAa,GACjCgB,GACGX,GAA4B,KAC3BpC,EACAE,EACAG,GACAI,CAAM,IACF,MAER,KAAK,gBAAgB2B,GAAuBlC,CAAM,EAClD6C,GAAoBX,GAAuB,KAAKtD,CAAI,IAAM,MAGxDiE,KAAqB,GACvB,MAuBN,GAlBAnD,EAAYM,EAAS0C,GACrBpC,EAAS,KAAK,iBAAiBA,EAASZ,CAAS,EAEjDE,EAAM,KAAK,OAAO,qBAAqB,iCACrCE,EACA4C,GACAhD,EACAiD,GACAC,EAAW,EAEbxC,GAAO,KAAK,CACV,OAAQsC,GACR,KAAMC,GACN,OAAQC,GACR,OAAQlD,EACR,QAASE,EACV,EAEGkC,KAAoB,GACtB,OAON,OAAK,KAAK,YAER3B,GAAc,OAASF,IAGlB,CACL,OAAQE,GACR,OAAQI,EACR,OAAQH,GAEZ,CAEQ,YACNxE,EACA2F,EACAK,EACAnC,EAAgB,CAEhB,GAAI7D,EAAO,MAAQ,GAAM,CAGvB,IAAMkH,EAAWlH,EAAO,KACxB2F,EAAS9B,CAAQ,EACbqD,IAAa,QACflB,EAAU,KAAK,KAAMkB,CAAQ,OAEtBlH,EAAO,OAAS,QACzBgG,EAAU,KAAK,KAAMhG,EAAO,IAAI,CAEpC,CAEQ,UAAUgD,EAAcmE,EAAc,CAC5C,OAAOnE,EAAK,UAAUmE,CAAM,CAC9B,CAEQ,gBAAgBC,EAAgBC,EAAoB,CAC1DD,EAAO,UAAYC,CACrB,CAGQ,iCACNxD,EACAF,EACA2D,EACAX,EACAlC,EACAC,EACAhB,EAAmB,CAEnB,IAAI6D,EAAcC,EACd7D,IAAU,SAEZ4D,EAAeD,IAAc5D,EAAc,EAC3C8D,EAAmBD,EAAe,GAAK,EACjCZ,IAAoB,GAAKY,IAAiB,KAE9C1D,EAAS,QAAUY,EAAO+C,EAG1B3D,EAAS,UAAYa,EAAS,EAAI,CAAC8C,GAIzC,CAEQ,iBAAiBC,EAAmB/D,EAAmB,CAC7D,OAAO+D,EAAY/D,CACrB,CAMQ,sBACNgE,EACAC,EACAC,EACAC,EAAoB,CAEpB,MAAO,CACL,MAAAH,EACA,YAAAC,EACA,aAAAC,EACA,UAAAC,EAEJ,CAEQ,qBACNH,EACAC,EACAC,EACAC,EACAC,EACAC,EAAmB,CAEnB,MAAO,CACL,MAAAL,EACA,YAAAC,EACA,UAAAG,EACA,YAAAC,EACA,aAAAH,EACA,UAAAC,EAEJ,CAEQ,gBACNH,EACAC,EACAC,EACAC,EACAC,EACAC,EACArE,EAAmB,CAEnB,MAAO,CACL,MAAAgE,EACA,YAAAC,EACA,UAAWA,EAAcjE,EAAc,EACvC,UAAAoE,EACA,QAASA,EACT,YAAAC,EACA,UAAWA,EAAcrE,EAAc,EACvC,aAAAkE,EACA,UAAAC,EAEJ,CAUQ,kBACNG,EACAC,EACAC,EAAkB,CAElB,OAAAF,EAAY,KAAKE,CAAU,EACpBD,CACT,CAEQ,0BACND,EACAC,EACAC,EAAkB,CAElB,OAAAF,EAAYC,CAAK,EAAIC,EACrBD,IACOA,CACT,CAKQ,sBAAsBE,EAAe3E,EAAY,CAAS,CAE1D,wBAAwB2E,EAAe3E,EAAY,CACrDA,IAAY,OACd2E,EAAM,QAAU3E,EAEpB,CASQ,cACN4E,EACApF,EACAoB,EAAc,CAGd,OADcgE,EAAQ,KAAKpF,CAAI,IACjB,GACLA,EAAK,UAAUoB,EAAQgE,EAAQ,SAAS,EAE1C,IACT,CAEQ,cAAcA,EAAiBpF,EAAY,CACjD,IAAMqF,EAAcD,EAAQ,KAAKpF,CAAI,EACrC,OAAOqF,IAAgB,KAAOA,EAAY,CAAC,EAAI,IACjD,GAx1BcxI,GAAA,QACZ,6LAGYA,GAAA,GAAK,iBCzFf,SAAUyI,GAAWC,EAAkB,CAC3C,OAAIC,GAAcD,CAAO,EAChBA,EAAQ,MAERA,EAAQ,IAEnB,CANgBE,EAAAH,GAAA,cAYV,SAAUI,GACdC,EAAc,CAEd,OAAOC,GAASD,EAAI,KAAK,GAAKA,EAAI,QAAU,EAC9C,CAJgBE,EAAAH,GAAA,iBAMhB,IAAMI,GAAS,SACTC,GAAa,aACbC,GAAQ,QACRC,GAAQ,QACRC,GAAY,YACZC,GAAW,WACXC,GAAa,aACbC,GAAc,cACdC,GAAmB,mBAEnB,SAAUC,GAAYC,EAAoB,CAC9C,OAAOC,GAAoBD,CAAM,CACnC,CAFgBX,EAAAU,GAAA,eAIhB,SAASE,GAAoBD,EAAoB,CAC/C,IAAME,EAAUF,EAAO,QAEjBG,EAA4B,CAAA,EAOlC,GANAA,EAAU,KAAOH,EAAO,KAEnBI,GAAYF,CAAO,IACtBC,EAAU,QAAUD,GAGlBG,EAAIL,EAAQV,EAAM,EACpB,KACE;8FAKJ,OAAIe,EAAIL,EAAQT,EAAU,IAExBY,EAAU,WAAkBH,EAAOT,EAAU,GAG/Ce,GAAkB,CAACH,CAAS,CAAC,EAEzBE,EAAIL,EAAQR,EAAK,IACnBW,EAAU,MAAQH,EAAOR,EAAK,GAG5Ba,EAAIL,EAAQP,EAAK,IACnBU,EAAU,MAAQH,EAAOP,EAAK,GAG5BY,EAAIL,EAAQL,EAAQ,IACtBQ,EAAU,SAAWH,EAAOL,EAAQ,GAGlCU,EAAIL,EAAQN,EAAS,IACvBS,EAAU,UAAYH,EAAON,EAAS,GAGpCW,EAAIL,EAAQJ,EAAU,IACxBO,EAAU,WAAaH,EAAOJ,EAAU,GAGtCS,EAAIL,EAAQH,EAAW,IACzBM,EAAU,YAAcH,EAAOH,EAAW,GAGxCQ,EAAIL,EAAQF,EAAgB,IAC9BK,EAAU,iBAAmBH,EAAOF,EAAgB,GAG/CK,CACT,CArDSd,EAAAY,GAAA,uBAuDF,IAAMM,GAAMR,GAAY,CAAE,KAAM,MAAO,QAASS,GAAM,EAAE,CAAE,EACjEF,GAAkB,CAACC,EAAG,CAAC,EAEjB,SAAUE,GACdC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAiB,CAEjB,MAAO,CACL,MAAAN,EACA,YAAAC,EACA,UAAAC,EACA,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,UAAAC,EACA,aAAoBP,EAAS,aAC7B,UAAWA,EAEf,CArBgBrB,EAAAoB,GAAA,uBAuBV,SAAUS,GAAaC,EAAeT,EAAkB,CAC5D,OAAOU,GAAuBD,EAAOT,CAAO,CAC9C,CAFgBrB,EAAA6B,GAAA,gBCnGT,IAAMG,GAA0D,CACrE,0BAA0B,CAAE,SAAAC,EAAU,OAAAC,EAAQ,SAAAC,EAAU,SAAAC,CAAQ,EAAE,CAQhE,MAFY,aALKC,GAAcJ,CAAQ,EAEnC,OAAOK,GAAWL,CAAQ,CAAC,OAC3B,qBAAqBA,EAAS,IAAI,MAEF,mBAAmBC,EAAO,KAAK,OAGrE,EAEA,8BAA8B,CAAE,eAAAK,EAAgB,SAAAH,CAAQ,EAAE,CACxD,MAAO,6CAA+CG,EAAe,KACvE,EAEA,wBAAwB,CACtB,oBAAAC,EACA,OAAAN,EACA,SAAAC,EACA,sBAAAM,EACA,SAAAL,CAAQ,EACT,CACC,IAAMM,EAAY,cAGZC,EAAY;cADCC,GAAMV,CAAM,EAAG,MACgB,IAElD,GAAIO,EACF,OAAOC,EAAYD,EAAwBE,EACtC,CACL,IAAME,EAAoBC,GACxBN,EACA,CAACO,EAAQC,IAAiBD,EAAO,OAAOC,CAAY,EACpD,CAAA,CAAmB,EAEfC,EAA0BC,EAC9BL,EACCM,GACC,IAAID,EAAIC,EAAWC,GAAkBd,GAAWc,CAAa,CAAC,EAAE,KAC9D,IAAI,CACL,GAAG,EAMFC,EAAwB;EAJCH,EAC7BD,EACA,CAACK,EAASC,IAAQ,KAAKA,EAAM,CAAC,KAAKD,CAAO,EAAE,EAEkD,KAC9F;CAAI,CACL,GAED,OAAOZ,EAAYW,EAAwBV,EAE/C,EAEA,sBAAsB,CACpB,uBAAAa,EACA,OAAAtB,EACA,sBAAAO,EACA,SAAAL,CAAQ,EACT,CACC,IAAMM,EAAY,cAGZC,EAAY;cADCC,GAAMV,CAAM,EAAG,MACgB,IAElD,GAAIO,EACF,OAAOC,EAAYD,EAAwBE,EACtC,CAQL,IAAMU,EACJ;KAR8BH,EAC9BM,EACCL,GACC,IAAID,EAAIC,EAAWC,GAAkBd,GAAWc,CAAa,CAAC,EAAE,KAC9D,GAAG,CACJ,GAAG,EAIsB,KAAK,IAAI,CAAC,IAExC,OAAOV,EAAYW,EAAwBV,EAE/C,GAGF,OAAO,OAAOX,EAA0B,EAEjC,IAAMyB,GACX,CACE,uBACEC,EACAC,EAA0B,CAS1B,MANE,gEACAA,EAAc,gBACd;2BAEAD,EAAa,KACb,IAEJ,GAGSE,GACX,CACE,yBACEF,EACAG,EAA2C,CAE3C,SAASC,EACPC,EAA+B,CAE/B,OAAIA,aAAgBC,EACXD,EAAK,aAAa,KAChBA,aAAgBE,EAClBF,EAAK,gBAEL,EAEX,CAVSG,EAAAJ,EAAA,8BAYT,IAAMK,EAAeT,EAAa,KAC5BU,EAAgBxB,GAAMiB,CAAc,EACpCQ,EAAQD,EAAc,IACtBE,EAAUC,GAAqBH,CAAa,EAC5CI,EAAgBV,EAA2BM,CAAa,EAExDK,EAAmBJ,EAAQ,EAC7BK,EAAM,KAAKJ,CAAO,GAAGG,EAAmBJ,EAAQ,EAAE,MACpDG,EAAgB,oBAAoBA,CAAa,KAAO,EAC1D;4CAEcX,EAAe,MACjB,oCAAoCM,CAAY;;oBAK5D,OAAAO,EAAMA,EAAI,QAAQ,UAAW,GAAG,EAChCA,EAAMA,EAAI,QAAQ,SAAU;CAAI,EAEzBA,CACT,EAEA,4BAA4BC,EAAU,CAQpC,MANE;0EAC2EA,EAAK,IAAI;;;uDAMxF,EAEA,qCAAqCC,EAKpC,CACC,IAAMC,EAAU3B,EAAI0B,EAAQ,WAAaE,GACvCxC,GAAWwC,CAAO,CAAC,EACnB,KAAK,IAAI,EACLC,EACJH,EAAQ,YAAY,MAAQ,EAAI,GAAKA,EAAQ,YAAY,IAU3D,MARE,4BAA4BA,EAAQ,iBAAiB,KACnD,IAAI,CACL;QACQG,CAAU,aAAaH,EAAQ,aAAa,IAAI;GACrDC,CAAO;;qBAKf,EAEA,+BAA+BD,EAK9B,CACC,IAAMC,EAAU3B,EAAI0B,EAAQ,WAAaI,GACvC1C,GAAW0C,CAAO,CAAC,EACnB,KAAK,IAAI,EACLD,EACJH,EAAQ,YAAY,MAAQ,EAAI,GAAKA,EAAQ,YAAY,IACvDK,EACF,qCAAqCL,EAAQ,iBAAiB,KAC5D,IAAI,CACL,WAAWG,CAAU,aACVH,EAAQ,aAAa,IAAI;GACjCC,CAAO;EAEb,OAAAI,EACEA,EACA;sBAEKA,CACT,EAEA,0BAA0BL,EAGzB,CACC,IAAIN,EAAUC,GAAqBK,EAAQ,UAAU,EACrD,OAAIA,EAAQ,WAAW,MAAQ,IAC7BN,GAAWM,EAAQ,WAAW,KAI9B,mBAAmBN,CAAO,kBAAkBM,EAAQ,aAAa,IAAI;qCAIzE,EAIA,oBAAoBA,EAGnB,CAEC,MAAO,YACT,EAEA,2BAA2BA,EAI1B,CAMC,MAJE,iCAAiCA,EAAQ,eAAiB,CAAC,WACjDA,EAAQ,YAAY,GAAG,aAAaA,EAAQ,aAAa,IAAI;uDAI3E,EAEA,8BAA8BA,EAG7B,CASC,MAPE;KACMA,EAAQ,YAAY,GAAG,aAC3BA,EAAQ,aAAa,IACvB;OACEA,EAAQ,YAAY,WAAW,OAAS,CAC1C,gBAGJ,EAEA,wBAAwBA,EAGvB,CACC,IAAMxC,EAAWwC,EAAQ,aAAa,KAChCM,EAAYhC,EAChB0B,EAAQ,kBACPO,GAAaA,EAAS,IAAI,EAEvBC,EAAoB,GAAGhD,CAAQ,QAAQ8C,EAC1C,OAAO,CAAC9C,CAAQ,CAAC,EACjB,KAAK,OAAO,CAAC,GAQhB,MANE;SACUA,CAAQ;;GACwDgD,CAAiB;;6DAK/F,EAIA,0BAA0BR,EAGzB,CAEC,MAAO,YACT,EAEA,4BAA4BA,EAG3B,CACC,IAAIxC,EACJ,OAAIwC,EAAQ,wBAAwBS,GAClCjD,EAAWwC,EAAQ,aAAa,KAEhCxC,EAAWwC,EAAQ,aAGN,iCAAiCxC,CAAQ,2CAA2CwC,EAAQ,WAAW,IAGxH,GCxTE,SAAUU,GACdC,EACAC,EAAoD,CAEpD,IAAMC,EAAc,IAAIC,GAAuBH,EAAWC,CAAc,EACxE,OAAAC,EAAY,YAAW,EAChBA,EAAY,MACrB,CAPgBE,EAAAL,GAAA,kBASV,IAAOI,GAAP,cAAsCE,EAAW,CApBvD,MAoBuD,CAAAD,EAAA,+BAIrD,YACUE,EACAL,EAAoD,CAE5D,MAAK,EAHG,KAAA,cAAAK,EACA,KAAA,eAAAL,EALH,KAAA,OAAgD,CAAA,CAQvD,CAEO,aAAW,CAChBM,EAAQC,GAAO,KAAK,aAAa,EAAIC,GAAQ,CAC3C,KAAK,aAAeA,EACpBA,EAAK,OAAO,IAAI,CAClB,CAAC,CACH,CAEO,iBAAiBC,EAAiB,CACvC,IAAMC,EAAM,KAAK,cAAcD,EAAK,eAAe,EAEnD,GAAKC,EAYHD,EAAK,eAAiBC,MAZd,CACR,IAAMC,EAAM,KAAK,eAAe,uBAC9B,KAAK,aACLF,CAAI,EAEN,KAAK,OAAO,KAAK,CACf,QAASE,EACT,KAAMC,GAA0B,uBAChC,SAAU,KAAK,aAAa,KAC5B,kBAAmBH,EAAK,gBACzB,EAIL,GCtBI,IAAgBI,GAAhB,cAAyDC,EAAU,CAjCzE,MAiCyE,CAAAC,EAAA,yCAUvE,YACYC,EACAC,EAAkB,CAE5B,MAAK,EAHK,KAAA,QAAAD,EACA,KAAA,KAAAC,EAXF,KAAA,iBAAgC,CAAA,EAIhC,KAAA,mBAAqB,GACrB,KAAA,yBAA2B,EAC3B,KAAA,MAAQ,GACR,KAAA,cAAgB,EAO1B,CAEA,cAAY,CAGV,GAFA,KAAK,MAAQ,GAET,KAAK,KAAK,UAAU,CAAC,IAAM,KAAK,QAAQ,KAC1C,MAAM,MAAM,qDAAqD,EAInE,YAAK,UAAYC,GAAM,KAAK,KAAK,SAAS,EAAE,QAAO,EACnD,KAAK,gBAAkBA,GAAM,KAAK,KAAK,eAAe,EAAE,QAAO,EAG/D,KAAK,UAAU,IAAG,EAClB,KAAK,gBAAgB,IAAG,EAExB,KAAK,mBAAkB,EACvB,KAAK,KAAK,KAAK,OAAO,EAEf,KAAK,gBACd,CAEA,KACEC,EACAC,EAA0B,CAAA,EAAE,CAGvB,KAAK,OACR,MAAM,KAAKD,EAAMC,CAAQ,CAE7B,CAEA,YACEC,EACAC,EACAF,EAAuB,CAGvB,GACEC,EAAQ,eAAe,OAAS,KAAK,oBACrCA,EAAQ,MAAQ,KAAK,yBACrB,CACA,IAAME,EAAWD,EAAS,OAAOF,CAAQ,EACzC,KAAK,mBAAkB,EACvB,KAAK,KAAKC,EAAQ,eAAqBE,CAAQ,EAEnD,CAEA,oBAAkB,CAEZC,EAAQ,KAAK,SAAS,GAGxB,KAAK,mBAAqB,GAC1B,KAAK,yBAA2B,EAChC,KAAK,cAAgB,KAErB,KAAK,mBAAqB,KAAK,UAAU,IAAG,EAC5C,KAAK,yBAA2B,KAAK,gBAAgB,IAAG,EAE5D,GAGWC,GAAP,cAAoCZ,EAAgC,CAhH1E,MAgH0E,CAAAE,EAAA,6BAIxE,YACEC,EACUC,EAAuB,CAEjC,MAAMD,EAASC,CAAI,EAFT,KAAA,KAAAA,EALJ,KAAA,iBAAmB,GACnB,KAAA,uBAAyB,EAO/B,KAAK,iBAAmB,KAAK,KAAK,QAAQ,KAC1C,KAAK,uBAAyB,KAAK,KAAK,iBAC1C,CAEA,aACES,EACAJ,EACAF,EAAuB,CAEvB,GACE,KAAK,eACLM,EAAS,aAAa,OAAS,KAAK,kBACpCA,EAAS,MAAQ,KAAK,wBACtB,CAAC,KAAK,MACN,CACA,IAAMH,EAAWD,EAAS,OAAOF,CAAQ,EACnCO,EAAW,IAAIC,EAAY,CAAE,WAAYL,CAAQ,CAAE,EACzD,KAAK,iBAAmBM,GAAMF,CAAQ,EACtC,KAAK,MAAQ,GAEjB,GAeWG,GAAP,cAAyDhB,EAAU,CA5JzE,MA4JyE,CAAAC,EAAA,kDAOvE,YACYgB,EACAC,EAAkB,CAE5B,MAAK,EAHK,KAAA,QAAAD,EACA,KAAA,WAAAC,EARF,KAAA,OAAgC,CACxC,MAAO,OACP,WAAY,OACZ,YAAa,OAQf,CAEA,cAAY,CACV,YAAK,KAAK,KAAK,OAAO,EACf,KAAK,MACd,GAGWC,GAAP,cAA2CH,EAAyC,CAhL1F,MAgL0F,CAAAf,EAAA,oCACxF,SACEmB,EACAZ,EACAF,EAAuB,CAEvB,GAAIc,EAAS,MAAQ,KAAK,WAAY,CACpC,IAAMC,EAAiBC,GAAOd,EAAS,OAAOF,CAAQ,CAAC,EACvD,KAAK,OAAO,YAAce,IAAmB,OACzCA,aAA0BE,IAC5B,KAAK,OAAO,MAAQF,EAAe,aACnC,KAAK,OAAO,WAAaA,EAAe,UAG1C,MAAM,SAASD,EAAUZ,EAAUF,CAAQ,CAE/C,GAGWkB,GAAP,cAA8CR,EAAyC,CAnM7F,MAmM6F,CAAAf,EAAA,uCAC3F,YACEwB,EACAjB,EACAF,EAAuB,CAEvB,GAAImB,EAAY,MAAQ,KAAK,WAAY,CACvC,IAAMC,EAAoBJ,GAAOd,EAAS,OAAOF,CAAQ,CAAC,EAC1D,KAAK,OAAO,YAAcoB,IAAsB,OAC5CA,aAA6BH,IAC/B,KAAK,OAAO,MAAQG,EAAkB,aACtC,KAAK,OAAO,WAAaA,EAAkB,UAG7C,MAAM,YAAYD,EAAajB,EAAUF,CAAQ,CAErD,GAGWqB,GAAP,cAAiDX,EAAyC,CAtNhG,MAsNgG,CAAAf,EAAA,0CAC9F,eACE2B,EACApB,EACAF,EAAuB,CAEvB,GAAIsB,EAAe,MAAQ,KAAK,WAAY,CAC1C,IAAMC,EAAuBP,GAAOd,EAAS,OAAOF,CAAQ,CAAC,EAC7D,KAAK,OAAO,YAAcuB,IAAyB,OAC/CA,aAAgCN,IAClC,KAAK,OAAO,MAAQM,EAAqB,aACzC,KAAK,OAAO,WAAaA,EAAqB,UAGhD,MAAM,eAAeD,EAAgBpB,EAAUF,CAAQ,CAE3D,GAIWwB,GAAP,cAAoDd,EAAyC,CA1OnG,MA0OmG,CAAAf,EAAA,6CACjG,kBACE8B,EACAvB,EACAF,EAAuB,CAEvB,GAAIyB,EAAkB,MAAQ,KAAK,WAAY,CAC7C,IAAMC,EAAoCV,GACxCd,EAAS,OAAOF,CAAQ,CAAC,EAE3B,KAAK,OAAO,YAAc0B,IAAsC,OAC5DA,aAA6CT,IAC/C,KAAK,OAAO,MAAQS,EAAkC,aACtD,KAAK,OAAO,WAAaA,EAAkC,UAG7D,MAAM,kBAAkBD,EAAmBvB,EAAUF,CAAQ,CAEjE,GAQI,SAAU2B,GACdC,EACAC,EACAC,EAAwB,CAAA,EAAE,CAG1BA,EAAWhC,GAAMgC,CAAQ,EACzB,IAAIC,EAAmC,CAAA,EACnC,EAAI,EAGR,SAASC,EAAkBC,EAAsB,CAC/C,OAAOA,EAAQ,OAAOC,GAAKN,EAAW,EAAI,CAAC,CAAC,CAC9C,CAFSjC,EAAAqC,EAAA,qBAKT,SAASG,EAAuBC,EAAyB,CACvD,IAAMC,EAAeV,GACnBK,EAAkBI,CAAU,EAC5BP,EACAC,CAAQ,EAEV,OAAOC,EAAO,OAAOM,CAAY,CACnC,CASA,IAhBS1C,EAAAwC,EAAA,0BAgBFL,EAAS,OAASD,GAAa,EAAID,EAAU,QAAQ,CAC1D,IAAM7B,EAAO6B,EAAU,CAAC,EAGxB,GAAI7B,aAAgBS,EAClB,OAAO2B,EAAuBpC,EAAK,UAAU,EACxC,GAAIA,aAAgBuC,EACzB,OAAOH,EAAuBpC,EAAK,UAAU,EACxC,GAAIA,aAAgBwC,EACzBR,EAASI,EAAuBpC,EAAK,UAAU,UACtCA,aAAgByC,EAAqB,CAC9C,IAAMC,EAAS1C,EAAK,WAAW,OAAO,CACpC,IAAI2C,EAAW,CACb,WAAY3C,EAAK,WAClB,EACF,EACD,OAAOoC,EAAuBM,CAAM,UAC3B1C,aAAgB4C,EAAkC,CAC3D,IAAMF,EAAS,CACb,IAAIjC,EAAY,CAAE,WAAYT,EAAK,UAAU,CAAE,EAC/C,IAAI2C,EAAW,CACb,WAAY,CAAC,IAAIzB,EAAS,CAAE,aAAclB,EAAK,SAAS,CAAE,CAAC,EAAE,OACtDA,EAAK,UAAU,EAEvB,GAEH,OAAOoC,EAAuBM,CAAM,UAC3B1C,aAAgB6C,EAAyB,CAClD,IAAMH,EAAS1C,EAAK,WAAW,OAAO,CACpC,IAAI2C,EAAW,CACb,WAAY,CAAC,IAAIzB,EAAS,CAAE,aAAclB,EAAK,SAAS,CAAE,CAAC,EAAE,OACtDA,EAAK,UAAU,EAEvB,EACF,EACDgC,EAASI,EAAuBM,CAAM,UAC7B1C,aAAgB2C,EAAY,CACrC,IAAMD,EAAS1C,EAAK,WAAW,OAAO,CACpC,IAAI2C,EAAW,CACb,WAAY3C,EAAK,WAClB,EACF,EACDgC,EAASI,EAAuBM,CAAM,MACjC,IAAI1C,aAAgB8C,EACzB,OAAAC,EAAQ/C,EAAK,WAAagD,GAAW,CAI/B3C,EAAQ2C,EAAQ,UAAU,IAAM,KAClChB,EAASI,EAAuBY,EAAQ,UAAU,EAEtD,CAAC,EACMhB,EACF,GAAIhC,aAAgBkB,EACzBa,EAAS,KAAK/B,EAAK,YAAY,MAE/B,OAAM,MAAM,sBAAsB,EAGpC,IAEF,OAAAgC,EAAO,KAAK,CACV,YAAaD,EACb,UAAWI,GAAKN,EAAW,CAAC,EAC7B,EAEMG,CACT,CAnGgBpC,EAAAgC,GAAA,qBA4GV,SAAUqB,GACdC,EACAC,EACAC,EACAC,EAAoB,CAEpB,IAAMC,EAAyB,qBAEzBC,EAAwB,CAACD,CAAiB,EAC1CE,EAAwB,mBAC1BC,EAAoB,GAElBC,EAAoBP,EAAY,OAChCQ,EAA2BD,EAAoBL,EAAe,EAE9DrB,EAAwC,CAAA,EAExC4B,EAAkC,CAAA,EAQxC,IAPAA,EAAc,KAAK,CACjB,IAAK,GACL,IAAKV,EACL,UAAW,CAAA,EACX,gBAAiB,CAAA,EAClB,EAEM,CAAC7C,EAAQuD,CAAa,GAAG,CAC9B,IAAM7B,EAAW6B,EAAc,IAAG,EAGlC,GAAI7B,IAAayB,EAAkB,CAE/BC,GACAI,GAAKD,CAAa,EAAG,KAAOD,GAG5BC,EAAc,IAAG,EAEnB,SAGF,IAAME,EAAU/B,EAAS,IACnBgC,EAAUhC,EAAS,IACnBiC,EAAgBjC,EAAS,UACzBkC,EAAsBlC,EAAS,gBAGrC,GAAI1B,EAAQyD,CAAO,EACjB,SAGF,IAAM9D,EAAO8D,EAAQ,CAAC,EAEtB,GAAI9D,IAASsD,EAAmB,CAC9B,IAAMY,EAAW,CACf,IAAKH,EACL,IAAK5B,GAAK2B,CAAO,EACjB,UAAWK,GAAUH,CAAa,EAClC,gBAAiBG,GAAUF,CAAmB,GAEhDL,EAAc,KAAKM,CAAQ,UAClBlE,aAAgBkB,EAEzB,GAAI6C,EAAUL,EAAoB,EAAG,CACnC,IAAMU,EAAUL,EAAU,EACpBM,EAAclB,EAAYiB,CAAO,EACvC,GAAIhB,EAAYiB,EAAarE,EAAK,YAAY,EAAG,CAC/C,IAAMkE,EAAW,CACf,IAAKE,EACL,IAAKjC,GAAK2B,CAAO,EACjB,UAAWE,EACX,gBAAiBC,GAEnBL,EAAc,KAAKM,CAAQ,WAGpBH,IAAYL,EAAoB,EAEzC1B,EAAO,KAAK,CACV,cAAehC,EAAK,aACpB,oBAAqBA,EAAK,IAC1B,UAAWgE,EACX,gBAAiBC,EAClB,EACDR,EAAoB,OAEpB,OAAM,MAAM,sBAAsB,UAE3BzD,aAAgBuC,EAAa,CACtC,IAAM+B,EAAevE,GAAMiE,CAAa,EACxCM,EAAa,KAAKtE,EAAK,eAAe,EAEtC,IAAMuE,EAAqBxE,GAAMkE,CAAmB,EACpDM,EAAmB,KAAKvE,EAAK,GAAG,EAEhC,IAAMkE,EAAW,CACf,IAAKH,EACL,IAAK/D,EAAK,WAAW,OAAOuD,EAAuBpB,GAAK2B,CAAO,CAAC,EAChE,UAAWQ,EACX,gBAAiBC,GAEnBX,EAAc,KAAKM,CAAQ,UAClBlE,aAAgBwC,EAAQ,CAEjC,IAAMgC,EAAkB,CACtB,IAAKT,EACL,IAAK5B,GAAK2B,CAAO,EACjB,UAAWE,EACX,gBAAiBC,GAEnBL,EAAc,KAAKY,CAAe,EAElCZ,EAAc,KAAKJ,CAAgB,EAEnC,IAAMiB,EAAe,CACnB,IAAKV,EACL,IAAK/D,EAAK,WAAW,OAAOmC,GAAK2B,CAAO,CAAC,EACzC,UAAWE,EACX,gBAAiBC,GAEnBL,EAAc,KAAKa,CAAY,UACtBzE,aAAgByC,EAAqB,CAE9C,IAAMiC,EAAkB,IAAI/B,EAAW,CACrC,WAAY3C,EAAK,WACjB,IAAKA,EAAK,IACX,EACKkC,EAAUlC,EAAK,WAAW,OAAO,CAAC0E,CAAe,EAAGvC,GAAK2B,CAAO,CAAC,EACjEI,EAAW,CACf,IAAKH,EACL,IAAK7B,EACL,UAAW8B,EACX,gBAAiBC,GAEnBL,EAAc,KAAKM,CAAQ,UAClBlE,aAAgB4C,EAAkC,CAE3D,IAAM+B,EAAgB,IAAIzD,EAAS,CACjC,aAAclB,EAAK,UACpB,EACK0E,EAAkB,IAAI/B,EAAW,CACrC,WAAY,CAAMgC,CAAa,EAAE,OAAO3E,EAAK,UAAU,EACvD,IAAKA,EAAK,IACX,EACKkC,EAAUlC,EAAK,WAAW,OAAO,CAAC0E,CAAe,EAAGvC,GAAK2B,CAAO,CAAC,EACjEI,EAAW,CACf,IAAKH,EACL,IAAK7B,EACL,UAAW8B,EACX,gBAAiBC,GAEnBL,EAAc,KAAKM,CAAQ,UAClBlE,aAAgB6C,EAAyB,CAElD,IAAM2B,EAAkB,CACtB,IAAKT,EACL,IAAK5B,GAAK2B,CAAO,EACjB,UAAWE,EACX,gBAAiBC,GAEnBL,EAAc,KAAKY,CAAe,EAElCZ,EAAc,KAAKJ,CAAgB,EAEnC,IAAMmB,EAAgB,IAAIzD,EAAS,CACjC,aAAclB,EAAK,UACpB,EACK4E,EAAgB,IAAIjC,EAAW,CACnC,WAAY,CAAMgC,CAAa,EAAE,OAAO3E,EAAK,UAAU,EACvD,IAAKA,EAAK,IACX,EACKkC,EAAUlC,EAAK,WAAW,OAAO,CAAC4E,CAAa,EAAGzC,GAAK2B,CAAO,CAAC,EAC/DW,GAAe,CACnB,IAAKV,EACL,IAAK7B,EACL,UAAW8B,EACX,gBAAiBC,GAEnBL,EAAc,KAAKa,EAAY,UACtBzE,aAAgB2C,EAAY,CAErC,IAAM6B,EAAkB,CACtB,IAAKT,EACL,IAAK5B,GAAK2B,CAAO,EACjB,UAAWE,EACX,gBAAiBC,GAEnBL,EAAc,KAAKY,CAAe,EAElCZ,EAAc,KAAKJ,CAAgB,EAGnC,IAAMoB,EAAgB,IAAIjC,EAAW,CACnC,WAAY3C,EAAK,WACjB,IAAKA,EAAK,IACX,EACKkC,EAAUlC,EAAK,WAAW,OAAO,CAAC4E,CAAa,EAAGzC,GAAK2B,CAAO,CAAC,EAC/DW,EAAe,CACnB,IAAKV,EACL,IAAK7B,EACL,UAAW8B,EACX,gBAAiBC,GAEnBL,EAAc,KAAKa,CAAY,UACtBzE,aAAgB8C,EAEzB,QAAS+B,EAAI7E,EAAK,WAAW,OAAS,EAAG6E,GAAK,EAAGA,IAAK,CACpD,IAAM7B,EAAehD,EAAK,WAAW6E,CAAC,EAChCC,EAAc,CAClB,IAAKf,EACL,IAAKf,EAAQ,WAAW,OAAOb,GAAK2B,CAAO,CAAC,EAC5C,UAAWE,EACX,gBAAiBC,GAEnBL,EAAc,KAAKkB,CAAW,EAC9BlB,EAAc,KAAKJ,CAAgB,UAE5BxD,aAAgBS,EACzBmD,EAAc,KAAK,CACjB,IAAKG,EACL,IAAK/D,EAAK,WAAW,OAAOmC,GAAK2B,CAAO,CAAC,EACzC,UAAWE,EACX,gBAAiBC,EAClB,UACQjE,aAAgB+E,GAEzBnB,EAAc,KACZoB,GAAmBhF,EAAM+D,EAASC,EAAeC,CAAmB,CAAC,MAGvE,OAAM,MAAM,sBAAsB,EAGtC,OAAOjC,CACT,CAzOgBpC,EAAAqD,GAAA,2BA2OhB,SAAS+B,GACPpE,EACAmD,EACAC,EACAC,EAA6B,CAE7B,IAAMK,EAAevE,GAAMiE,CAAa,EACxCM,EAAa,KAAK1D,EAAQ,IAAI,EAE9B,IAAMqE,EAAyBlF,GAAMkE,CAAmB,EAExD,OAAAgB,EAAuB,KAAK,CAAC,EAEtB,CACL,IAAKlB,EACL,IAAKnD,EAAQ,WACb,UAAW0D,EACX,gBAAiBW,EAErB,CAnBSrF,EAAAoF,GAAA,sBC9jBT,IAAYE,IAAZ,SAAYA,EAAS,CACnBA,EAAAA,EAAA,OAAA,CAAA,EAAA,SACAA,EAAAA,EAAA,WAAA,CAAA,EAAA,aACAA,EAAAA,EAAA,qBAAA,CAAA,EAAA,uBACAA,EAAAA,EAAA,oCAAA,CAAA,EAAA,sCACAA,EAAAA,EAAA,0BAAA,CAAA,EAAA,4BACAA,EAAAA,EAAA,YAAA,CAAA,EAAA,aACF,GAPYA,KAAAA,GAAS,CAAA,EAAA,EASf,SAAUC,GACdC,EAA2C,CAG3C,GAAIA,aAAgBC,GAAUD,IAAS,SACrC,OAAOF,GAAU,OACZ,GAAIE,aAAgBE,GAAcF,IAAS,aAChD,OAAOF,GAAU,WACZ,GACLE,aAAgBG,GAChBH,IAAS,sBAET,OAAOF,GAAU,qBACZ,GACLE,aAAgBI,GAChBJ,IAAS,mCAET,OAAOF,GAAU,oCACZ,GACLE,aAAgBK,GAChBL,IAAS,0BAET,OAAOF,GAAU,0BACZ,GAAIE,aAAgBM,GAAeN,IAAS,cACjD,OAAOF,GAAU,YAEjB,MAAM,MAAM,sBAAsB,CAEtC,CA5BgBS,EAAAR,GAAA,eA8BV,SAAUS,GAAkBC,EAKjC,CACC,GAAM,CAAE,WAAAC,EAAY,KAAAC,EAAM,SAAAC,EAAU,aAAAC,CAAY,EAAKJ,EAC/CK,EAAOf,GAAYa,CAAQ,EACjC,OAAIE,IAAShB,GAAU,YACdiB,GAAuBL,EAAYC,EAAME,CAAY,EAErDG,GACLN,EACAC,EACAG,EACAD,CAAY,CAGlB,CAlBgBN,EAAAC,GAAA,qBAoBV,SAAUS,GACdP,EACAQ,EACAL,EACAM,EACAC,EACAC,EAAuB,CAEvB,IAAMC,EAAiBP,GACrBL,EACAQ,EACAL,CAAY,EAGRU,EAAeC,GAA0BF,CAAc,EACzDG,GACAC,GAEJ,OAAOL,EACLC,EACAH,EACAI,EACAH,CAAoB,CAExB,CAxBgBb,EAAAU,GAAA,2BAsCV,SAAUU,GACdjB,EACAQ,EACAU,EACAR,EACAR,EACAiB,EAIkB,CAElB,IAAMP,EAAiBN,GACrBN,EACAQ,EACAN,EACAgB,CAAC,EAGGL,EAAeC,GAA0BF,CAAc,EACzDG,GACAC,GAEJ,OAAOG,EACLP,EAAe,CAAC,EAChBC,EACAH,CAAoB,CAExB,CA5BgBb,EAAAoB,GAAA,qCAgCV,SAAUG,GACdC,EACAZ,EACAI,EACAH,EAA6B,CAE7B,IAAMY,EAAYD,EAAK,OACjBE,EAA0BC,GAAMH,EAAOI,GACpCD,GAAMC,EAAUC,GACdA,EAAS,SAAW,CAC5B,CACF,EAGD,GAAIjB,EAIF,OAAO,SAELkB,EAAqB,CAKrB,IAAMC,EAAwCC,EAC5CF,EACCF,GAAYA,EAAQ,IAAI,EAG3B,QAASK,EAAI,EAAGA,EAAIR,EAAWQ,IAAK,CAClC,IAAML,EAAUJ,EAAKS,CAAC,EAChBC,EAAiBN,EAAQ,OAEzBO,EAAgBJ,EAAWE,CAAC,EAClC,GAAI,EAAAE,IAAkB,QAAaA,EAAc,KAAK,IAAI,IAAM,IAIhEC,EAAU,QAASC,EAAI,EAAGA,EAAIH,EAAgBG,IAAK,CACjD,IAAMR,EAAWD,EAAQS,CAAC,EACpBC,EAAiBT,EAAS,OAChC,QAASU,EAAI,EAAGA,EAAID,EAAgBC,IAAK,CACvC,IAAMC,EAAY,KAAK,GAAGD,EAAI,CAAC,EAC/B,GAAIvB,EAAawB,EAAWX,EAASU,CAAC,CAAC,IAAM,GAG3C,SAASH,EAKb,OAAOH,GAOb,EACK,GAAIP,GAA2B,CAACb,EAAsB,CAG3D,IAAM4B,EAAkBT,EAAIR,EAAOI,GAC1Bc,GAAQd,CAAO,CACvB,EAEKe,EAAcC,GAClBH,EACA,CAACI,EAAQjB,EAASkB,KAChBC,EAAQnB,EAAUoB,GAAe,CAC1BC,EAAIJ,EAAQG,EAAY,YAAa,IACxCH,EAAOG,EAAY,YAAa,EAAIF,GAEtCC,EAAQC,EAAY,gBAAmBE,GAAqB,CACrDD,EAAIJ,EAAQK,CAAiB,IAChCL,EAAOK,CAAiB,EAAIJ,EAEhC,CAAC,CACH,CAAC,EACMD,GAET,CAAA,CAA4B,EAM9B,OAAO,UAAA,CACL,IAAML,EAAY,KAAK,GAAG,CAAC,EAC3B,OAAOG,EAAYH,EAAU,YAAY,CAC3C,MAOA,QAAO,UAAA,CACL,QAASP,EAAI,EAAGA,EAAIR,EAAWQ,IAAK,CAClC,IAAML,EAAUJ,EAAKS,CAAC,EAChBC,EAAiBN,EAAQ,OAC/BQ,EAAU,QAASC,EAAI,EAAGA,EAAIH,EAAgBG,IAAK,CACjD,IAAMR,EAAWD,EAAQS,CAAC,EACpBC,EAAiBT,EAAS,OAChC,QAASU,EAAI,EAAGA,EAAID,EAAgBC,IAAK,CACvC,IAAMC,EAAY,KAAK,GAAGD,EAAI,CAAC,EAC/B,GAAIvB,EAAawB,EAAWX,EAASU,CAAC,CAAC,IAAM,GAG3C,SAASH,EAKb,OAAOH,GAOb,CAEJ,CA5HgBjC,EAAAuB,GAAA,kCA8HV,SAAU4B,GACdC,EACApC,EACAH,EAA6B,CAE7B,IAAMa,EAA0BC,GAAMyB,EAAMvB,GACnCA,EAAS,SAAW,CAC5B,EAEKwB,EAAaD,EAAI,OAIvB,GAAI1B,GAA2B,CAACb,EAAsB,CACpD,IAAMyC,EAAoBZ,GAAQU,CAAG,EAErC,GACEE,EAAkB,SAAW,GAC7BC,EAAcD,EAAkB,CAAC,EAAG,eAAe,EACnD,CAEA,IAAME,EADoBF,EAAkB,CAAC,EACW,aAExD,OAAO,UAAA,CACL,OAAO,KAAK,GAAG,CAAC,EAAE,eAAiBE,CACrC,MACK,CACL,IAAMb,EAAcC,GAClBU,EACA,CAACT,EAAQG,EAAaF,KACpBD,EAAOG,EAAY,YAAa,EAAI,GACpCD,EAAQC,EAAY,gBAAmBE,GAAqB,CAC1DL,EAAOK,CAAiB,EAAI,EAC9B,CAAC,EACML,GAET,CAAA,CAAe,EAGjB,OAAO,UAAA,CACL,IAAML,EAAY,KAAK,GAAG,CAAC,EAC3B,OAAOG,EAAYH,EAAU,YAAY,IAAM,EACjD,OAGF,QAAO,UAAA,CACLJ,EAAU,QAASC,EAAI,EAAGA,EAAIgB,EAAYhB,IAAK,CAC7C,IAAMR,EAAWuB,EAAIf,CAAC,EAChBC,EAAiBT,EAAS,OAChC,QAASU,EAAI,EAAGA,EAAID,EAAgBC,IAAK,CACvC,IAAMC,EAAY,KAAK,GAAGD,EAAI,CAAC,EAC/B,GAAIvB,EAAawB,EAAWX,EAASU,CAAC,CAAC,IAAM,GAG3C,SAASH,EAIb,MAAO,GAIT,MAAO,EACT,CAEJ,CAjEgBpC,EAAAmD,GAAA,2CAmEhB,IAAMM,GAAN,cAAyCC,EAAU,CA/VnD,MA+VmD,CAAA1D,EAAA,mCAGjD,YACU2D,EACAC,EACAC,EAAyB,CAEjC,MAAK,EAJG,KAAA,QAAAF,EACA,KAAA,iBAAAC,EACA,KAAA,eAAAC,CAGV,CAEA,cAAY,CACV,YAAK,KAAK,KAAK,OAAO,EACf,KAAK,OACd,CAEQ,cACNC,EACAC,EACAC,EACAC,EAAuB,CAEvB,OACEH,EAAK,MAAQ,KAAK,kBAClB,KAAK,iBAAmBC,GAExB,KAAK,QAAUC,EAAS,OAAOC,CAAQ,EAChC,IAGF,EACT,CAEA,WACEC,EACAF,EACAC,EAAuB,CAElB,KAAK,cAAcC,EAAY3E,GAAU,OAAQyE,EAAUC,CAAQ,GACtE,MAAM,WAAWC,EAAYF,EAAUC,CAAQ,CAEnD,CAEA,eACEE,EACAH,EACAC,EAAuB,CAGpB,KAAK,cACJE,EACA5E,GAAU,qBACVyE,EACAC,CAAQ,GAGV,MAAM,WAAWE,EAAgBH,EAAUC,CAAQ,CAEvD,CAEA,kBACEG,EACAJ,EACAC,EAAuB,CAGpB,KAAK,cACJG,EACA7E,GAAU,oCACVyE,EACAC,CAAQ,GAGV,MAAM,WAAWG,EAAmBJ,EAAUC,CAAQ,CAE1D,CAEA,SACEI,EACAL,EACAC,EAAuB,CAGpB,KAAK,cAAcI,EAAU9E,GAAU,WAAYyE,EAAUC,CAAQ,GAEtE,MAAM,WAAWI,EAAUL,EAAUC,CAAQ,CAEjD,CAEA,YACEK,EACAN,EACAC,EAAuB,CAGpB,KAAK,cACJK,EACA/E,GAAU,0BACVyE,EACAC,CAAQ,GAGV,MAAM,WAAWK,EAAaN,EAAUC,CAAQ,CAEpD,GAMIM,GAAN,cAA4CC,EAAW,CA7cvD,MA6cuD,CAAAxE,EAAA,sCAGrD,YACU4D,EACAC,EACAY,EAAe,CAEvB,MAAK,EAJG,KAAA,iBAAAb,EACA,KAAA,eAAAC,EACA,KAAA,UAAAY,EALH,KAAA,OAAwB,CAAA,CAQ/B,CAEQ,cACNX,EACAY,EAA2B,CAGzBZ,EAAK,MAAQ,KAAK,kBAClB,KAAK,iBAAmBY,IACvB,KAAK,YAAc,QAAaZ,IAAS,KAAK,aAE/C,KAAK,OAASA,EAAK,WAEvB,CAEO,YAAYA,EAAY,CAC7B,KAAK,cAAcA,EAAMvE,GAAU,MAAM,CAC3C,CAEO,gBAAgBuE,EAAgB,CACrC,KAAK,cAAcA,EAAMvE,GAAU,UAAU,CAC/C,CAEO,yBAAyBuE,EAAyB,CACvD,KAAK,cAAcA,EAAMvE,GAAU,oBAAoB,CACzD,CAEO,sCACLuE,EAAsC,CAEtC,KAAK,cAAcA,EAAMvE,GAAU,mCAAmC,CACxE,CAEO,6BAA6BuE,EAA6B,CAC/D,KAAK,cAAcA,EAAMvE,GAAU,yBAAyB,CAC9D,CAEO,iBAAiBuE,EAAiB,CACvC,KAAK,cAAcA,EAAMvE,GAAU,WAAW,CAChD,GAGF,SAASoF,GAAwBC,EAAY,CAC3C,IAAM/B,EAAS,IAAI,MAAM+B,CAAI,EAC7B,QAASrC,EAAI,EAAGA,EAAIqC,EAAMrC,IACxBM,EAAON,CAAC,EAAI,CAAA,EAEd,OAAOM,CACT,CANS7C,EAAA2E,GAAA,2BAaT,SAASE,GAAeC,EAAiB,CACvC,IAAIC,EAAO,CAAC,EAAE,EACd,QAASxC,EAAI,EAAGA,EAAIuC,EAAK,OAAQvC,IAAK,CACpC,IAAMyC,EAAUF,EAAKvC,CAAC,EAChB0C,EAAa,CAAA,EACnB,QAAS5C,EAAI,EAAGA,EAAI0C,EAAK,OAAQ1C,IAAK,CACpC,IAAM6C,EAAiBH,EAAK1C,CAAC,EAC7B4C,EAAW,KAAKC,EAAiB,IAAMF,EAAQ,YAAY,EAC3D,QAAS/C,EAAI,EAAGA,EAAI+C,EAAQ,gBAAiB,OAAQ/C,IAAK,CACxD,IAAMkD,EAAsB,IAAMH,EAAQ,gBAAiB/C,CAAC,EAC5DgD,EAAW,KAAKC,EAAiBC,CAAmB,GAGxDJ,EAAOE,EAET,OAAOF,CACT,CAhBS/E,EAAA6E,GAAA,kBAqBT,SAASO,GACPC,EACAC,EACAxC,EAAW,CAEX,QACMyC,EAAa,EACjBA,EAAaF,EAAkB,OAC/BE,IACA,CAEA,GAAIA,IAAezC,EACjB,SAEF,IAAM0C,EAAyBH,EAAkBE,CAAU,EAC3D,QAASE,EAAY,EAAGA,EAAYH,EAAe,OAAQG,IAAa,CACtE,IAAMC,EAAYJ,EAAeG,CAAS,EAC1C,GAAID,EAAuBE,CAAS,IAAM,GACxC,MAAO,IAKb,MAAO,EACT,CAxBS1F,EAAAoF,GAAA,sBA0BH,SAAUO,GACdC,EACAvE,EAAS,CAET,IAAMwE,EAAc7D,EAAI4D,EAAWhE,GACjCkE,GAAkB,CAAClE,CAAO,EAAG,CAAC,CAAC,EAE3BmE,EAAcpB,GAAwBkB,EAAY,MAAM,EACxDG,EAAahE,EAAI6D,EAAcI,GAAgB,CACnD,IAAMC,EAAmC,CAAA,EACzC,OAAAnD,EAAQkD,EAAeE,GAAQ,CAC7B,IAAMpB,EAAOF,GAAesB,EAAK,WAAW,EAC5CpD,EAAQgC,EAAOqB,GAAW,CACxBF,EAAKE,CAAO,EAAI,EAClB,CAAC,CACH,CAAC,EACMF,CACT,CAAC,EACGG,EAAUR,EAGd,QAASS,EAAa,EAAGA,GAAcjF,EAAGiF,IAAc,CACtD,IAAMC,EAAcF,EACpBA,EAAU1B,GAAwB4B,EAAY,MAAM,EAGpD,QAASC,EAAS,EAAGA,EAASD,EAAY,OAAQC,IAAU,CAC1D,IAAMC,EAA0BF,EAAYC,CAAM,EAElD,QACME,EAAc,EAClBA,EAAcD,EAAwB,OACtCC,IACA,CACA,IAAMC,EAAiBF,EAAwBC,CAAW,EAAE,YACtDE,EAAYH,EAAwBC,CAAW,EAAE,UACjDG,EAAahC,GAAe8B,CAAc,EAGhD,GAFiBvB,GAAmBY,EAAYa,EAAYL,CAAM,GAElDjD,EAAQqD,CAAS,GAAKD,EAAe,SAAWtF,EAAG,CACjE,IAAMyF,EAAgBf,EAAYS,CAAM,EAExC,GAAIO,GAAaD,EAAeH,CAAc,IAAM,GAAO,CACzDG,EAAc,KAAKH,CAAc,EAEjC,QAAStE,EAAI,EAAGA,EAAIwE,EAAW,OAAQxE,IAAK,CAC1C,IAAM+D,EAAUS,EAAWxE,CAAC,EAC5B2D,EAAWQ,CAAM,EAAEJ,CAAO,EAAI,SAK/B,CACH,IAAMY,EAA6BlB,GACjCc,EACAN,EAAa,EACbK,CAAc,EAEhBN,EAAQG,CAAM,EAAIH,EAAQG,CAAM,EAAE,OAAOQ,CAA0B,EAGnEjE,EAAQiE,EAA6Bb,GAAQ,CAC3C,IAAMU,EAAahC,GAAesB,EAAK,WAAW,EAClDpD,EAAQ8D,EAAaI,GAAO,CAC1BjB,EAAWQ,CAAM,EAAES,CAAG,EAAI,EAC5B,CAAC,CACH,CAAC,KAMT,OAAOlB,CACT,CAzEgB/F,EAAA2F,GAAA,qCA2EV,SAAUnF,GACdL,EACAQ,EACAU,EACA6F,EAAoB,CAEpB,IAAMC,EAAU,IAAI5C,GAClBpE,EACAZ,GAAU,YACV2H,CAAM,EAER,OAAAvG,EAAY,OAAOwG,CAAO,EACnBxB,GAAkCwB,EAAQ,OAAQ9F,CAAC,CAC5D,CAbgBrB,EAAAQ,GAAA,0BAeV,SAAUC,GACdN,EACAQ,EACAN,EACAgB,EAAS,CAET,IAAM+F,EAAmB,IAAI7C,GAC3BpE,EACAE,CAAQ,EAEVM,EAAY,OAAOyG,CAAgB,EACnC,IAAMC,EAAYD,EAAiB,OAO7BE,EALiB,IAAI7D,GACzB9C,EACAR,EACAE,CAAQ,EAEsB,aAAY,EAEtCkH,EAAa,IAAIC,EAAgB,CAAE,WAAYH,CAAS,CAAE,EAC1DI,EAAY,IAAID,EAAgB,CAAE,WAAYF,CAAQ,CAAE,EAE9D,OAAO3B,GAAkC,CAAC4B,EAAYE,CAAS,EAAGpG,CAAC,CACrE,CAxBgBrB,EAAAS,GAAA,oCA0BV,SAAUsG,GACdW,EACAC,EAAuB,CAEvBC,EAAkB,QAASrF,EAAI,EAAGA,EAAImF,EAAY,OAAQnF,IAAK,CAC7D,IAAMsF,EAAYH,EAAYnF,CAAC,EAC/B,GAAIsF,EAAU,SAAWF,EAAW,OAGpC,SAAStF,EAAI,EAAGA,EAAIwF,EAAU,OAAQxF,IAAK,CACzC,IAAMyF,EAAYH,EAAWtF,CAAC,EACxB0F,EAAWF,EAAUxF,CAAC,EAK5B,IAFEyF,IAAcC,GACdA,EAAS,mBAAoBD,EAAU,YAAa,IAAM,UACrC,GACrB,SAASF,EAGb,MAAO,IAGT,MAAO,EACT,CAxBgB5H,EAAA+G,GAAA,gBA0BV,SAAUiB,GACdC,EACAC,EAAkB,CAElB,OACED,EAAO,OAASC,EAAM,QACtBvG,GAAMsG,EAAQ,CAACjD,EAASlC,IAAO,CAC7B,IAAMqF,EAAeD,EAAMpF,CAAG,EAC9B,OACEkC,IAAYmD,GACZA,EAAa,mBAAoBnD,EAAQ,YAAa,CAE1D,CAAC,CAEL,CAdgBhF,EAAAgI,GAAA,wBAgBV,SAAU/G,GACdF,EAAmC,CAEnC,OAAOY,GAAMZ,EAAiBqH,GAC5BzG,GAAMyG,EAAiBC,GACrB1G,GAAM0G,EAAaC,GAAU/E,EAAQ+E,EAAM,eAAgB,CAAC,CAAC,CAC9D,CAEL,CARgBtI,EAAAiB,GAAA,6BC5pBV,SAAUsH,GAAkBC,EAKjC,CACC,IAAMC,EAAmCD,EAAQ,kBAAkB,SAAS,CAC1E,MAAOA,EAAQ,MACf,WAAYA,EAAQ,WACpB,YAAaA,EAAQ,YACtB,EACD,OAAOE,EAAID,EAAmCE,GAAiB,OAAA,OAAA,CAC7D,KAAMC,GAA0B,2BAA2B,EACxDD,CAAY,CACf,CACJ,CAfgBE,EAAAN,GAAA,qBAiBV,SAAUO,GACdC,EACAC,EACAC,EACAC,EAAmB,CAEnB,IAAMC,EAA4CC,GAChDL,EACCM,GACCC,GAA6BD,EAAcJ,CAAc,CAAC,EAGxDM,EAA+BC,GACnCT,EACAC,EACAC,CAAc,EAGVQ,EAAoBL,GAAQL,EAAYW,GAC5CC,GAAoBD,EAAST,CAAc,CAAC,EAGxCW,EAAsBR,GAAQL,EAAYW,GAC9CG,GACEH,EACAX,EACAG,EACAD,CAAc,CACf,EAGH,OAAOE,EAAgB,OACrBI,EACAE,EACAG,CAAmB,CAEvB,CApCgBf,EAAAC,GAAA,mBAsChB,SAASQ,GACPQ,EACAb,EAAqD,CAErD,IAAMc,EAAmB,IAAIC,GAC7BF,EAAa,OAAOC,CAAgB,EACpC,IAAME,EAAqBF,EAAiB,eAEtCG,EAAmBC,GACvBF,EACAG,EAA+B,EAG3BC,EAAkBC,GAAOJ,EAAmBK,GACzCA,EAAU,OAAS,CAC3B,EAwBD,OAtBe7B,EAAI8B,GAAOH,CAAU,EAAII,GAAuB,CAC7D,IAAMC,EAAiBC,GAAMF,CAAc,EACrCG,EAAM3B,EAAe,yBACzBa,EACAW,CAAc,EAEVI,EAAUC,GAAqBJ,CAAS,EACxCK,EAA6C,CACjD,QAASH,EACT,KAAMhC,GAA0B,sBAChC,SAAUkB,EAAa,KACvB,QAASe,EACT,WAAYH,EAAU,KAGlBM,EAAQC,GAA2BP,CAAS,EAClD,OAAIM,IACFD,EAAS,UAAYC,GAGhBD,CACT,CAAC,CAEH,CAxCSlC,EAAAS,GAAA,gCA0CH,SAAUc,GACdc,EAA+B,CAE/B,MAAO,GAAGJ,GAAqBI,CAAI,CAAC,MAClCA,EAAK,GACP,MAAMD,GAA2BC,CAAI,CAAC,EACxC,CANgBrC,EAAAuB,GAAA,mCAQhB,SAASa,GAA2BC,EAA+B,CACjE,OAAIA,aAAgBC,EACXD,EAAK,aAAa,KAChBA,aAAgBE,EAClBF,EAAK,gBAEL,EAEX,CARSrC,EAAAoC,GAAA,8BAUH,IAAOjB,GAAP,cAA6CqB,EAAW,CAjL9D,MAiL8D,CAAAxC,EAAA,sCAA9D,aAAA,qBACS,KAAA,eAA8C,CAAA,CAmCvD,CAjCS,iBAAiByC,EAAoB,CAC1C,KAAK,eAAe,KAAKA,CAAO,CAClC,CAEO,YAAYC,EAAc,CAC/B,KAAK,eAAe,KAAKA,CAAM,CACjC,CAEO,6BAA6BC,EAAgC,CAClE,KAAK,eAAe,KAAKA,CAAO,CAClC,CAEO,yBAAyBC,EAA+B,CAC7D,KAAK,eAAe,KAAKA,CAAU,CACrC,CAEO,sCACLC,EAA+C,CAE/C,KAAK,eAAe,KAAKA,CAAa,CACxC,CAEO,gBAAgBC,EAAgB,CACrC,KAAK,eAAe,KAAKA,CAAI,CAC/B,CAEO,iBAAiBC,EAAe,CACrC,KAAK,eAAe,KAAKA,CAAE,CAC7B,CAEO,cAAcC,EAAkB,CACrC,KAAK,eAAe,KAAKA,CAAQ,CACnC,GAGI,SAAUhC,GACdiC,EACAC,EACAC,EACA/C,EAAqD,CAErD,IAAMgD,EAAS,CAAA,EAWf,GAVoBC,GAClBH,EACA,CAACI,EAAQzC,IACHA,EAAQ,OAASoC,EAAK,KACjBK,EAAS,EAEXA,EAET,CAAC,EAEe,EAAG,CACnB,IAAMC,EAASnD,EAAe,4BAA4B,CACxD,aAAc6C,EACd,YAAaE,EACd,EACDC,EAAO,KAAK,CACV,QAASG,EACT,KAAMxD,GAA0B,oBAChC,SAAUkD,EAAK,KAChB,EAGH,OAAOG,CACT,CA9BgBpD,EAAAgB,GAAA,mCAmCV,SAAUwC,GACdC,EACAC,EACAP,EAAiB,CAEjB,IAAMC,EAAS,CAAA,EACXG,EAEJ,OAAKI,GAASD,EAAmBD,CAAQ,IACvCF,EACE,kCAAkCE,CAAQ,6CAA6CN,CAAS,uDAElGC,EAAO,KAAK,CACV,QAASG,EACT,KAAMxD,GAA0B,sBAChC,SAAU0D,EACX,GAGIL,CACT,CApBgBpD,EAAAwD,GAAA,4BAsBV,SAAUI,GACdC,EACAC,EACA1D,EACA2D,EAAe,CAAA,EAAE,CAEjB,IAAMX,EAAmC,CAAA,EACnCY,EAAmBC,GAAqBH,EAAS,UAAU,EACjE,GAAII,EAAQF,CAAgB,EAC1B,MAAO,CAAA,EACF,CACL,IAAMP,EAAWI,EAAQ,KACEF,GAASK,EAAkBH,CAAO,GAE3DT,EAAO,KAAK,CACV,QAAShD,EAAe,wBAAwB,CAC9C,aAAcyD,EACd,kBAAmBE,EACpB,EACD,KAAMhE,GAA0B,eAChC,SAAU0D,EACX,EAKH,IAAMU,EAAiBC,GAAWJ,EAAkBD,EAAK,OAAO,CAACF,CAAO,CAAC,CAAC,EACpEQ,EAAsB9D,GAAQ4D,EAAiBG,GAAe,CAClE,IAAMC,EAAUC,GAAMT,CAAI,EAC1B,OAAAQ,EAAQ,KAAKD,CAAW,EACjBV,GACLC,EACAS,EACAlE,EACAmE,CAAO,CAEX,CAAC,EAED,OAAOnB,EAAO,OAAOiB,CAAmB,EAE5C,CAxCgBrE,EAAA4D,GAAA,2BA0CV,SAAUK,GAAqBQ,EAAyB,CAC5D,IAAInB,EAAiB,CAAA,EACrB,GAAIY,EAAQO,CAAU,EACpB,OAAOnB,EAET,IAAMzB,EAAYC,GAAM2C,CAAU,EAGlC,GAAI5C,aAAqBU,EACvBe,EAAO,KAAKzB,EAAU,cAAc,UAEpCA,aAAqB6C,GACrB7C,aAAqB8C,GACrB9C,aAAqB+C,GACrB/C,aAAqBgD,GACrBhD,aAAqBiD,GACrBjD,aAAqBkD,EAErBzB,EAASA,EAAO,OACdW,GAAoCpC,EAAU,UAAU,CAAC,UAElDA,aAAqBmD,EAE9B1B,EAAS2B,GACPpF,EAAIgC,EAAU,WAAaqD,GACzBjB,GAAuCiB,EAAY,UAAU,CAAC,CAC/D,UAEM,EAAArD,aAAqBS,GAG9B,MAAM,MAAM,sBAAsB,EAGpC,IAAM6C,EAAkBC,GAAevD,CAAS,EAC1CwD,EAAUZ,EAAW,OAAS,EACpC,GAAIU,GAAmBE,EAAS,CAC9B,IAAMC,EAAOC,GAAKd,CAAU,EAC5B,OAAOnB,EAAO,OAAOW,GAAqBqB,CAAI,CAAC,MAE/C,QAAOhC,CAEX,CA1CgBtD,EAAAiE,GAAA,wBA4ChB,IAAMuB,GAAN,cAA0BhD,EAAW,CAtWrC,MAsWqC,CAAAxC,EAAA,oBAArC,aAAA,qBACS,KAAA,aAA8B,CAAA,CAKvC,CAHS,iBAAiByF,EAAiB,CACvC,KAAK,aAAa,KAAKA,CAAI,CAC7B,GAGI,SAAUC,GACdzE,EACAb,EAAqD,CAErD,IAAMuF,EAAc,IAAIH,GACxBvE,EAAa,OAAO0E,CAAW,EAC/B,IAAMC,EAAMD,EAAY,aAkCxB,OAhCepF,GACbqF,EACCC,GAAU,CACT,IAAMC,EAAaC,GAAUF,EAAO,UAAU,EAC9C,OAAOtF,GAAQuF,EAAY,CAACE,EAAiBC,IAAc,CACzD,IAAMC,EAAqBC,GACzB,CAACH,CAAe,EAChB,CAAA,EACAI,GACA,CAAC,EAEH,OAAIlC,EAAQgC,CAAkB,EACrB,CACL,CACE,QAAS9F,EAAe,2BAA2B,CACjD,aAAca,EACd,YAAa4E,EACb,eAAgBI,EACjB,EACD,KAAMlG,GAA0B,oBAChC,SAAUkB,EAAa,KACvB,WAAY4E,EAAO,IACnB,YAAaI,EAAa,IAIvB,CAAA,CAEX,CAAC,CACH,CAAC,CAIL,CAzCgBjG,EAAA0F,GAAA,8BA2CV,SAAUW,GACdpF,EACAqF,EACAlG,EAAqD,CAErD,IAAMuF,EAAc,IAAIH,GACxBvE,EAAa,OAAO0E,CAAW,EAC/B,IAAIC,EAAMD,EAAY,aAItB,OAAAC,EAAMW,GAAOX,EAAMC,GAAWA,EAAO,oBAAsB,EAAI,EAEhDtF,GAAQqF,EAAMC,GAAuB,CAClD,IAAMW,EAAiBX,EAAO,IACxBY,EAAqBZ,EAAO,cAAgBS,EAC5CI,EAAeC,GACnBH,EACAvF,EACAwF,EACAZ,CAAM,EAEFe,EAAsBC,GAC1BH,EACAb,EACA5E,EACAb,CAAc,EAEV0G,EAA4BC,GAChCL,EACAb,EACA5E,EACAb,CAAc,EAGhB,OAAOwG,EAAoB,OAAOE,CAAyB,CAC7D,CAAC,CAGH,CAvCgB9G,EAAAqG,GAAA,4CAyCV,IAAOW,GAAP,cAAmCxE,EAAW,CAlcpD,MAkcoD,CAAAxC,EAAA,4BAApD,aAAA,qBACS,KAAA,eAEA,CAAA,CAmBT,CAjBS,6BAA6B2C,EAAgC,CAClE,KAAK,eAAe,KAAKA,CAAO,CAClC,CAEO,yBAAyBC,EAA+B,CAC7D,KAAK,eAAe,KAAKA,CAAU,CACrC,CAEO,sCACLC,EAA+C,CAE/C,KAAK,eAAe,KAAKA,CAAa,CACxC,CAEO,gBAAgBC,EAAgB,CACrC,KAAK,eAAe,KAAKA,CAAI,CAC/B,GAGI,SAAUhC,GACdG,EACAb,EAAqD,CAErD,IAAMuF,EAAc,IAAIH,GACxBvE,EAAa,OAAO0E,CAAW,EAC/B,IAAMC,EAAMD,EAAY,aAoBxB,OAlBepF,GAAQqF,EAAMC,GACvBA,EAAO,WAAW,OAAS,IACtB,CACL,CACE,QAASzF,EAAe,8BAA8B,CACpD,aAAca,EACd,YAAa4E,EACd,EACD,KAAM9F,GAA0B,cAChC,SAAUkB,EAAa,KACvB,WAAY4E,EAAO,MAIhB,CAAA,CAEV,CAGH,CA3BgB7F,EAAAc,GAAA,uBA6BV,SAAUmG,GACdC,EACAC,EACA/G,EAAqD,CAErD,IAAMgD,EAAmC,CAAA,EACzC,OAAAgE,EAAQF,EAAgBG,GAAe,CACrC,IAAMnG,EAAmB,IAAI8F,GAC7BK,EAAY,OAAOnG,CAAgB,EACnC,IAAME,EAAqBF,EAAiB,eAC5CkG,EAAQhG,EAAqBkG,GAAY,CACvC,IAAMC,EAAWC,GAAYF,CAAQ,EAC/Bb,EAAqBa,EAAS,cAAgBH,EAC9CX,EAAiBc,EAAS,IAO1BG,EANQC,GACZlB,EACAa,EACAE,EACAd,CAAkB,EAEgB,CAAC,EACrC,GAAIvC,EAAQe,GAAQwC,CAAqB,CAAC,EAAG,CAC3C,IAAMlE,EAASnD,EAAe,0BAA0B,CACtD,aAAciH,EACd,WAAYC,EACb,EACDlE,EAAO,KAAK,CACV,QAASG,EACT,KAAMxD,GAA0B,uBAChC,SAAUsH,EAAY,KACvB,EAEL,CAAC,CACH,CAAC,EAEMjE,CACT,CApCgBpD,EAAAiH,GAAA,qCA2ChB,SAASJ,GACPH,EACAiB,EACA1E,EACA7C,EAAqD,CAErD,IAAMwH,EAAmC,CAAA,EACnCC,EAAuBxE,GAC3BqD,EACA,CAACpD,EAAQwE,EAAS7B,KAEZ0B,EAAY,WAAW1B,CAAU,EAAE,oBAAsB,IAI7DmB,EAAQU,EAAUC,GAAY,CAC5B,IAAMC,EAAwB,CAAC/B,CAAU,EACzCmB,EAAQV,EAAc,CAACuB,EAAcC,IAAmB,CAEpDjC,IAAeiC,GACfC,GAAaF,EAAcF,CAAQ,GAEnCJ,EAAY,WAAWO,CAAe,EAAE,oBAAsB,IAE9DF,EAAsB,KAAKE,CAAe,CAE9C,CAAC,EAGCF,EAAsB,OAAS,GAC/B,CAACG,GAAaP,EAAqBG,CAAQ,IAE3CH,EAAoB,KAAKG,CAAQ,EACjCzE,EAAO,KAAK,CACV,KAAM0E,EACN,KAAMD,EACP,EAEL,CAAC,EACMzE,GAET,CAAA,CAA6C,EAyB/C,OAtBmBzD,EAAIgI,EAAuBO,GAAqB,CACjE,IAAMC,EAAcxI,EAClBuI,EAAkB,KACjBnC,GAAeA,EAAa,CAAC,EAUhC,MAAO,CACL,QARkB7F,EAAe,+BAA+B,CAChE,aAAc6C,EACd,YAAa0E,EACb,iBAAkBU,EAClB,WAAYD,EAAkB,KAC/B,EAIC,KAAMrI,GAA0B,eAChC,SAAUkD,EAAK,KACf,WAAY0E,EAAY,IACxB,aAAcS,EAAkB,KAEpC,CAAC,CAGH,CAnESpI,EAAA6G,GAAA,gCAqEH,SAAUE,GACdL,EACAiB,EACA1E,EACA7C,EAAqD,CAGrD,IAAMkI,EAAkBjF,GACtBqD,EACA,CAACpD,EAAQwE,EAASS,IAAO,CACvB,IAAMC,EAAkB3I,EAAIiI,EAAUC,IAC7B,CAAE,IAAKQ,EAAK,KAAMR,CAAQ,EAClC,EACD,OAAOzE,EAAO,OAAOkF,CAAe,CACtC,EACA,CAAA,CAA0C,EAuD5C,OApDeC,GACblI,GAAQ+H,EAAkBI,GAAkB,CAG1C,GAFwBf,EAAY,WAAWe,EAAe,GAAG,EAE7C,oBAAsB,GACxC,MAAO,CAAA,EAET,IAAMC,EAAYD,EAAe,IAC3BE,EAAaF,EAAe,KAE5BG,EAAmCC,GACvCR,EACCS,GAIGpB,EAAY,WAAWoB,EAAiB,GAAG,EAAE,oBAC3C,IACFA,EAAiB,IAAMJ,GAGvBK,GAAqBD,EAAiB,KAAMH,CAAU,CAEzD,EAyBH,OAtB6B/I,EAC3BgJ,EACCI,GAAkE,CACjE,IAAMZ,EAAc,CAACY,EAAkB,IAAM,EAAGN,EAAY,CAAC,EACvDO,EAAavB,EAAY,MAAQ,EAAI,GAAKA,EAAY,IAQ5D,MAAO,CACL,QAPcvH,EAAe,qCAAqC,CAClE,aAAc6C,EACd,YAAa0E,EACb,iBAAkBU,EAClB,WAAYY,EAAkB,KAC/B,EAGC,KAAMlJ,GAA0B,sBAChC,SAAUkD,EAAK,KACf,WAAYiG,EACZ,aAAcb,EAElB,CAAC,CAIL,CAAC,CAAC,CAIN,CAvEgBrI,EAAA+G,GAAA,sCAyEhB,SAASpG,GACPT,EACAC,EACAC,EAAqD,CAErD,IAAMgD,EAAmC,CAAA,EAEnC+F,EAAatJ,EAAIM,EAAaiJ,GAAcA,EAAU,IAAI,EAEhE,OAAAhC,EAAQlH,EAAY4D,GAAY,CAC9B,IAAMuF,EAAevF,EAAS,KAC9B,GAAIH,GAASwF,EAAYE,CAAY,EAAG,CACtC,IAAM9F,EAASnD,EAAe,4BAA4B0D,CAAQ,EAElEV,EAAO,KAAK,CACV,QAASG,EACT,KAAMxD,GAA0B,gCAChC,SAAUsJ,EACX,EAEL,CAAC,EAEMjG,CACT,CAvBSpD,EAAAW,GAAA,0CC7pBH,SAAU2I,GACdC,EAA2B,CAE3B,IAAMC,EAA8CC,GAASF,EAAS,CACpE,eAAgBG,GACjB,EAEKC,EAA8C,CAAA,EACpD,OAAAC,EAAQL,EAAQ,MAAQM,GAAQ,CAC9BF,EAAcE,EAAK,IAAI,EAAIA,CAC7B,CAAC,EACMP,GAAkBK,EAAeH,EAAc,cAAc,CACtE,CAZgBM,EAAAR,GAAA,kBAcV,SAAUS,GAAgBR,EAK/B,CACC,OAAAA,EAAUE,GAASF,EAAS,CAC1B,eAAgBS,GACjB,EAEMD,GACLR,EAAQ,MACRA,EAAQ,WACRA,EAAQ,eACRA,EAAQ,WAAW,CAEvB,CAhBgBO,EAAAC,GAAA,mBC1BhB,IAAME,GAA6B,2BAC7BC,GAA0B,uBAC1BC,GAAuB,qBACvBC,GAAiC,6BAEjCC,GAA8B,CAClCJ,GACAC,GACAC,GACAC,IAGF,OAAO,OAAOC,EAA2B,EAGnC,SAAUC,GAAuBC,EAAY,CAEjD,OAAOC,GAASH,GAA6BE,EAAM,IAAI,CACzD,CAHgBE,EAAAH,GAAA,0BAKhB,IAAeI,GAAf,cACU,KAAK,CA5Bf,MA4Be,CAAAD,EAAA,6BAMb,YACEE,EACOC,EAAa,CAEpB,MAAMD,CAAO,EAFN,KAAA,MAAAC,EAJT,KAAA,eAA2B,CAAA,EASzB,OAAO,eAAe,KAAM,WAAW,SAAS,EAG5C,MAAM,mBACR,MAAM,kBAAkB,KAAM,KAAK,WAAW,CAElD,GAGWC,GAAP,cAAwCH,EAAoB,CAlDlE,MAkDkE,CAAAD,EAAA,iCAChE,YACEE,EACAC,EACOE,EAAqB,CAE5B,MAAMH,EAASC,CAAK,EAFb,KAAA,cAAAE,EAGP,KAAK,KAAOb,EACd,GAGWc,GAAP,cAAoCL,EAAoB,CA7D9D,MA6D8D,CAAAD,EAAA,6BAC5D,YACEE,EACAC,EACOE,EAAqB,CAE5B,MAAMH,EAASC,CAAK,EAFb,KAAA,cAAAE,EAGP,KAAK,KAAOZ,EACd,GAGWc,GAAP,cAA0CN,EAAoB,CAxEpE,MAwEoE,CAAAD,EAAA,mCAClE,YAAYE,EAAiBC,EAAa,CACxC,MAAMD,EAASC,CAAK,EACpB,KAAK,KAAOR,EACd,GAGWa,GAAP,cAAkCP,EAAoB,CA/E5D,MA+E4D,CAAAD,EAAA,2BAC1D,YACEE,EACAC,EACOE,EAAqB,CAE5B,MAAMH,EAASC,CAAK,EAFb,KAAA,cAAAE,EAGP,KAAK,KAAOX,EACd,GCzDK,IAAMe,GAAsB,CAAA,EAQtBC,GAA6B,0BAE7BC,GAAP,cAAuC,KAAK,CAxClD,MAwCkD,CAAAC,EAAA,gCAChD,YAAYC,EAAe,CACzB,MAAMA,CAAO,EACb,KAAK,KAAOH,EACd,GAMWI,GAAP,KAAkB,CAlDxB,MAkDwB,CAAAF,EAAA,oBAKtB,gBAAgBG,EAAqB,CACnC,KAAK,iBAAmB,CAAA,EACxB,KAAK,cAAgB,CAAA,EAErB,KAAK,gBAAkBC,EAAID,EAAQ,iBAAiB,EAC/CA,EAAO,gBACRE,GAAsB,gBAKtB,KAAK,kBACP,KAAK,4BAA8BC,GAEvC,CAEO,iBAAiBC,EAAkB,CACxC,IAAMC,EAAcC,GAClBF,EACA,GACA,IACA,IACA,IACA,IACA,IACA,GAAG,EAEL,OAAAC,EAAY,qBAAuB,GAC5BA,CACT,CAEO,iCAAiCD,EAAkB,CACxD,MAAO,EACT,CAEO,gCAAgCA,EAAkB,CACvD,MAAO,EACT,CAEA,wBAEEG,EACAC,EACAC,EACAC,EAA0B,CAG1B,IAAMC,EAAgB,KAAK,oBAAmB,EACxCC,EAAkB,KAAK,iBAAgB,EACvCC,EAA2B,CAAA,EAC7BC,EAAoB,GAElBC,EAAyB,KAAK,GAAG,CAAC,EACpCC,EAAY,KAAK,GAAG,CAAC,EAEnBC,EAAuBpB,EAAA,IAAK,CAChC,IAAMqB,EAAgB,KAAK,GAAG,CAAC,EAGzBC,EAAM,KAAK,qBAAqB,0BAA0B,CAC9D,SAAUT,EACV,OAAQK,EACR,SAAUG,EACV,SAAU,KAAK,oBAAmB,EACnC,EACKE,EAAQ,IAAIC,GAChBF,EACAJ,EACA,KAAK,GAAG,CAAC,CAAC,EAGZK,EAAM,eAAiBE,GAAUT,CAAc,EAC/C,KAAK,WAAWO,CAAK,CACvB,EAlB6B,wBAoB7B,KAAO,CAACN,GAEN,GAAI,KAAK,aAAaE,EAAWN,CAAe,EAAG,CACjDO,EAAoB,EACpB,eACSR,EAAc,KAAK,IAAI,EAAG,CAEnCQ,EAAoB,EAEpBV,EAAY,MAAM,KAAMC,CAAe,EACvC,YACS,KAAK,aAAaQ,EAAWL,CAAa,EACnDG,EAAoB,IAEpBE,EAAY,KAAK,WAAU,EAC3B,KAAK,kBAAkBA,EAAWH,CAAc,GAOpD,KAAK,iBAAiBD,CAAe,CACvC,CAEA,kCAEEW,EACAC,EACAC,EAA6B,CAsB7B,MAlBI,EAAAA,IAAa,IAKb,KAAK,aAAa,KAAK,GAAG,CAAC,EAAGF,CAAuB,GAMrD,KAAK,eAAc,GAQrB,KAAK,yBACHA,EACA,KAAK,4BAA4BA,EAAyBC,CAAU,CAAC,EAO3E,CAGA,4BAEEpB,EACAsB,EAAoB,CAEpB,IAAMC,EAAc,KAAK,sBAAsBvB,EAASsB,CAAY,EAEpE,OADgB,KAAK,0BAA0BC,CAAW,CAE5D,CAEA,kBAEEjB,EACAkB,EAAoB,CAEpB,GAAI,KAAK,mCAAmClB,EAAiBkB,CAAO,EAElE,OADoB,KAAK,iBAAiBlB,CAAe,EAI3D,GAAI,KAAK,kCAAkCA,CAAe,EAAG,CAC3D,IAAMmB,EAAU,KAAK,WAAU,EAC/B,YAAK,aAAY,EACVA,EAGT,MAAM,IAAIjC,GAAwB,eAAe,CACnD,CAEA,yBAEEkC,EACAF,EAAoB,CAEpB,OACE,KAAK,mCAAmCE,EAAeF,CAAO,GAC9D,KAAK,kCAAkCE,CAAa,CAExD,CAEA,mCAEEpB,EACAkB,EAAoB,CAOpB,GALI,CAAC,KAAK,iCAAiClB,CAAe,GAKtDqB,EAAQH,CAAO,EACjB,MAAO,GAGT,IAAMI,EAAgB,KAAK,GAAG,CAAC,EAM/B,OAJEC,GAAKL,EAAUM,GACN,KAAK,aAAaF,EAAeE,CAAsB,CAC/D,IAAM,MAGX,CAEA,kCAEExB,EAA0B,CAE1B,OAAK,KAAK,gCAAgCA,CAAe,EAIvB,KAAK,aACrC,KAAK,GAAG,CAAC,EACTA,CAAe,EALR,EAQX,CAEA,yBAEEyB,EAAuB,CAEvB,IAAMC,EAAY,KAAK,iBAAgB,EACjCC,EAAuB,KAAK,0BAA0BD,CAAS,EACrE,OAAOE,GAASD,EAAsBF,CAAY,CACpD,CAEA,qBAAmB,CACjB,IAAMI,EAA4B,KAAK,iBAAgB,EAEnDC,EAAY,KAAK,GAAG,CAAC,EACrBC,EAAI,EACR,OAAa,CACX,IAAMC,EAAaT,GAAKM,EAA4BI,GACjCC,GAAaJ,EAAWG,CAAa,CAEvD,EACD,GAAID,IAAe,OACjB,OAAOA,EAETF,EAAY,KAAK,GAAGC,CAAC,EACrBA,IAEJ,CAEA,kBAAgB,CAEd,GAAI,KAAK,WAAW,SAAW,EAC7B,OAAO/C,GAET,IAAMmD,EAAoB,KAAK,6BAA4B,EACrDC,EAAc,KAAK,mCAAkC,EACrDC,EAAoB,KAAK,iCAAgC,EAE/D,MAAO,CACL,SAAU,KAAK,wBAAwBF,CAAiB,EACxD,iBAAkBC,EAClB,OAAQ,KAAK,wBAAwBC,CAAiB,EAE1D,CAEA,yBAAuB,CACrB,IAAMC,EAAoB,KAAK,WACzBC,EAA0B,KAAK,sBAErC,OAAOC,EAAIF,EAAmB,CAACG,EAAUC,IACnCA,IAAQ,EACH1D,GAEF,CACL,SAAU,KAAK,wBAAwByD,CAAQ,EAC/C,iBAAkBF,EAAwBG,CAAG,EAC7C,OAAQ,KAAK,wBAAwBJ,EAAkBI,EAAM,CAAC,CAAC,EAElE,CACH,CAEA,kBAAgB,CACd,IAAMC,EAAcH,EAAI,KAAK,wBAAuB,EAAKI,GAChD,KAAK,0BAA0BA,CAAO,CAC9C,EACD,OAAYC,GAAQF,CAAW,CACjC,CAEA,0BAEEjB,EAAqB,CAErB,GAAIA,IAAc1C,GAChB,MAAO,CAAC8D,EAAG,EAGb,IAAMC,EACJrB,EAAU,SAAWA,EAAU,iBAAmBsB,GAAKtB,EAAU,OAEnE,OAAO,KAAK,cAAcqB,CAAU,CACtC,CAIA,kBAEEE,EACAC,EAAsB,CAEtB,OAAK,KAAK,aAAaD,EAAOH,EAAG,GAC/BI,EAAa,KAAKD,CAAK,EAElBC,CACT,CAEA,SAA8BxD,EAAkB,CAC9C,IAAMS,EAA2B,CAAA,EAC7BgB,EAAU,KAAK,GAAG,CAAC,EACvB,KAAO,KAAK,aAAaA,EAASzB,CAAO,IAAM,IAC7CyB,EAAU,KAAK,WAAU,EACzB,KAAK,kBAAkBA,EAAShB,CAAc,EAGhD,OAAOS,GAAUT,CAAc,CACjC,CAEA,4BAEEgD,EACAC,EACAC,EACAC,EACAC,EACAC,EACAzC,EAAkB,CAIpB,CAEA,sBAEErB,EACAsB,EAAoB,CAEpB,IAAMyC,EAA0B,KAAK,0BAAyB,EACxDC,EAAgCC,GAAM,KAAK,qBAAqB,EAQtE,MAPyB,CACvB,UAAWF,EACX,gBAAiBC,EACjB,QAAShE,EACT,kBAAmBsB,EAIvB,CACA,2BAAyB,CACvB,OAAOwB,EAAI,KAAK,WAAaoB,GAC3B,KAAK,wBAAwBA,CAAa,CAAC,CAE/C,GAGI,SAAUnE,GAEd0D,EACAC,EACAC,EACAC,EACAC,EACAC,EACAzC,EAAkB,CAElB,IAAM8C,EAAM,KAAK,4BAA4BP,EAAcC,CAAc,EACrEO,EAAoB,KAAK,iBAAiBD,CAAG,EACjD,GAAIC,IAAsB,OAAW,CACnC,IAAMC,EAAe,KAAK,oBAAmB,EACvCC,EAAc,KAAK,mBAAkB,EAAGD,CAAY,EAG1DD,EADE,IAAIN,EAAeQ,EAAaT,CAAc,EACrB,aAAY,EACvC,KAAK,iBAAiBM,CAAG,EAAIC,EAG/B,IAAIjD,EAA0BiD,EAAkB,MAC5ChD,EAAagD,EAAkB,WAC7BG,EAAcH,EAAkB,YAKpC,KAAK,WAAW,SAAW,GAC3BG,GACApD,IAA4B,SAE5BA,EAA0BiC,GAC1BhC,EAAa,GAKX,EAAAD,IAA4B,QAAaC,IAAe,SAK1D,KAAK,kCACHD,EACAC,EACAC,CAAQ,GAMV,KAAK,wBACHoC,EACAC,EACAC,EACAxC,CAAuB,CAG7B,CA3DgB1B,EAAAM,GAAA,+BCrYV,SAAUyE,GACdC,EACAC,EACAC,EAAkB,CAElB,OAAOA,EAAaD,EAAeD,CACrC,CANgBG,EAAAJ,GAAA,+BCEV,IAAOK,GAAP,KAA2B,CAlBjC,MAkBiC,CAAAC,EAAA,6BAG/B,YAAYC,EAAmC,OAC7C,KAAK,cACHC,EAAAD,GAAS,gBAAY,MAAAC,IAAA,OAAAA,EAAIC,GAAsB,YACnD,CAEA,SAASF,EAIR,CACC,IAAMG,EAAsB,KAAK,wBAAwBH,EAAQ,KAAK,EAEtE,GAAII,EAAQD,CAAmB,EAAG,CAChC,IAAME,EAAiB,KAAK,4BAA4BL,EAAQ,KAAK,EAC/DM,EAAsB,KAAK,yCAC/BN,EAAQ,MACR,KAAK,YAAY,EAEbO,EAAwB,KAAK,kCACjCP,EAAQ,MACR,KAAK,YAAY,EAQnB,MANkB,CAChB,GAAGG,EACH,GAAGE,EACH,GAAGC,EACH,GAAGC,GAIP,OAAOJ,CACT,CAEA,wBAAwBK,EAAa,CACnC,OAAOC,GAAQD,EAAQE,GACrBC,GACED,EACAA,EACAE,EAAoC,CACrC,CAEL,CAEA,4BAA4BJ,EAAa,CACvC,OAAOC,GAAQD,EAAQE,GACrBG,GACEH,EACAE,EAAoC,CACrC,CAEL,CAEA,yCACEJ,EACAM,EAAoB,CAEpB,OAAOL,GAAQD,EAAQE,GACrBK,GACEL,EACAI,EACAF,EAAoC,CACrC,CAEL,CAEA,kCACEJ,EACAM,EAAoB,CAEpB,OAAOE,GACLR,EACAM,EACAF,EAAoC,CAExC,CAEA,6BAA6BZ,EAM5B,CACC,OAAOiB,GACLjB,EAAQ,eACRA,EAAQ,KACRA,EAAQ,aACRA,EAAQ,cACRA,EAAQ,qBACRkB,EAA8B,CAElC,CAEA,0BAA0BlB,EAMzB,CACC,OAAOmB,GACLnB,EAAQ,eACRA,EAAQ,KACRA,EAAQ,aACRA,EAAQ,qBACRoB,GAAYpB,EAAQ,QAAQ,EAC5BqB,EAAuC,CAE3C,GCxGI,IAAOC,GAAP,KAAiB,CAjCvB,MAiCuB,CAAAC,EAAA,mBAMrB,eAAeC,EAAqB,CAClC,KAAK,qBAAuBC,EAAID,EAAQ,sBAAsB,EACzDA,EAAO,qBACRE,GAAsB,qBAE1B,KAAK,aAAeD,EAAID,EAAQ,cAAc,EACzCA,EAAO,aACRE,GAAsB,aAE1B,KAAK,kBAAoBD,EAAID,EAAQ,mBAAmB,EACnDA,EAAO,kBACR,IAAIG,GAAqB,CAAE,aAAc,KAAK,YAAY,CAAE,EAEhE,KAAK,oBAAsB,IAAI,GACjC,CAEA,6BAAkDC,EAAa,CAC7DC,EAAQD,EAAQE,GAAY,CAC1B,KAAK,WAAW,GAAGA,EAAS,IAAI,kBAAmB,IAAK,CACtD,GAAM,CACJ,YAAAC,EACA,WAAAC,EACA,OAAAC,EACA,oBAAAC,EACA,iCAAAC,EACA,wBAAAC,CAAuB,EACrBC,GAAeP,CAAQ,EAE3BD,EAAQE,EAAcO,GAAY,CAChC,IAAMC,EAAUD,EAAS,MAAQ,EAAI,GAAKA,EAAS,IACnD,KAAK,WAAW,GAAGE,GAAqBF,CAAQ,CAAC,GAAGC,CAAO,GAAI,IAAK,CAClE,IAAME,EAAS,KAAK,kBAAkB,6BAA6B,CACjE,eAAgBH,EAAS,IACzB,KAAMR,EACN,aAAcQ,EAAS,cAAgB,KAAK,aAC5C,cAAeA,EAAS,cACxB,qBAAsB,KAAK,qBAC5B,EAEKI,EAAMC,GACV,KAAK,oBAAoBb,EAAS,IAAI,EACtC,IACAQ,EAAS,GAAG,EAEd,KAAK,eAAeI,EAAKD,CAAM,CACjC,CAAC,CACH,CAAC,EAEDZ,EAAQG,EAAaM,GAAY,CAC/B,KAAK,qBACHR,EACAQ,EAAS,IACT,IACA,aACAA,EAAS,aACTE,GAAqBF,CAAQ,CAAC,CAElC,CAAC,EAEDT,EAAQI,EAASK,GAAY,CAC3B,KAAK,qBACHR,EACAQ,EAAS,IACT,IACA,SACAA,EAAS,aACTE,GAAqBF,CAAQ,CAAC,CAElC,CAAC,EAEDT,EAAQK,EAAsBI,GAAY,CACxC,KAAK,qBACHR,EACAQ,EAAS,IACT,KACA,sBACAA,EAAS,aACTE,GAAqBF,CAAQ,CAAC,CAElC,CAAC,EAEDT,EAAQM,EAAmCG,GAAY,CACrD,KAAK,qBACHR,EACAQ,EAAS,IACT,KACA,mCACAA,EAAS,aACTE,GAAqBF,CAAQ,CAAC,CAElC,CAAC,EAEDT,EAAQO,EAA0BE,GAAY,CAC5C,KAAK,qBACHR,EACAQ,EAAS,IACT,KACA,0BACAA,EAAS,aACTE,GAAqBF,CAAQ,CAAC,CAElC,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAEA,qBAEEM,EACAC,EACAC,EACAC,EACAC,EACAC,EAAqB,CAErB,KAAK,WACH,GAAGA,CAAa,GAAGJ,IAAmB,EAAI,GAAKA,CAAc,GAC7D,IAAK,CACH,IAAMJ,EAAS,KAAK,kBAAkB,0BAA0B,CAC9D,eAAAI,EACA,KAAAD,EACA,aAAcI,GAAoB,KAAK,aACvC,qBAAsB,KAAK,qBAC3B,SAAAD,EACD,EACKL,EAAMC,GACV,KAAK,oBAAoBC,EAAK,IAAI,EAClCE,EACAD,CAAc,EAEhB,KAAK,eAAeH,EAAKD,CAAM,CACjC,CAAC,CAEL,CAGA,4BAEES,EACAC,EAAkB,CAElB,IAAMC,EAAyB,KAAK,6BAA4B,EAChE,OAAOT,GACLS,EACAF,EACAC,CAAU,CAEd,CAEA,mBAAwCT,EAAW,CACjD,OAAO,KAAK,oBAAoB,IAAIA,CAAG,CACzC,CAGA,eAAoCA,EAAaW,EAAe,CAC9D,KAAK,oBAAoB,IAAIX,EAAKW,CAAK,CACzC,GAGIC,GAAN,cAAyCC,EAAW,CAtMpD,MAsMoD,CAAAhC,EAAA,mCAApD,aAAA,qBACS,KAAA,WAOH,CACF,OAAQ,CAAA,EACR,YAAa,CAAA,EACb,WAAY,CAAA,EACZ,wBAAyB,CAAA,EACzB,oBAAqB,CAAA,EACrB,iCAAkC,CAAA,EAuCtC,CApCE,OAAK,CACH,KAAK,WAAa,CAChB,OAAQ,CAAA,EACR,YAAa,CAAA,EACb,WAAY,CAAA,EACZ,wBAAyB,CAAA,EACzB,oBAAqB,CAAA,EACrB,iCAAkC,CAAA,EAEtC,CAEO,YAAYU,EAAc,CAC/B,KAAK,WAAW,OAAO,KAAKA,CAAM,CACpC,CAEO,6BAA6BuB,EAAgC,CAClE,KAAK,WAAW,wBAAwB,KAAKA,CAAO,CACtD,CAEO,yBAAyBC,EAA+B,CAC7D,KAAK,WAAW,oBAAoB,KAAKA,CAAU,CACrD,CAEO,sCACLC,EAA+C,CAE/C,KAAK,WAAW,iCAAiC,KAAKA,CAAa,CACrE,CAEO,gBAAgBC,EAAgB,CACrC,KAAK,WAAW,WAAW,KAAKA,CAAI,CACtC,CAEO,iBAAiBC,EAAe,CACrC,KAAK,WAAW,YAAY,KAAKA,CAAE,CACrC,GAGIC,GAAmB,IAAIP,GACvB,SAAUjB,GAAeO,EAAU,CAQvCiB,GAAiB,MAAK,EACtBjB,EAAK,OAAOiB,EAAgB,EAC5B,IAAMC,EAAaD,GAAiB,WAEpC,OAAAA,GAAiB,MAAK,EACVC,CACd,CAdgBvC,EAAAc,GAAA,kBCrPV,SAAU0B,GACdC,EACAC,EAAoE,CAGhE,MAAMD,EAAiB,WAAW,IAAM,IAI1CA,EAAiB,YAAcC,EAAgB,YAC/CD,EAAiB,UAAYC,EAAgB,WAMtCD,EAAiB,UAAaC,EAAgB,YACrDD,EAAiB,UAAYC,EAAgB,UAEjD,CAnBgBC,EAAAH,GAAA,6BA4BV,SAAUI,GACdH,EACAC,EAAgC,CAG5B,MAAMD,EAAiB,WAAW,IAAM,IAI1CA,EAAiB,YAAcC,EAAgB,YAC/CD,EAAiB,YAAcC,EAAgB,YAC/CD,EAAiB,UAAYC,EAAgB,UAC7CD,EAAiB,UAAYC,EAAgB,UAC7CD,EAAiB,UAAYC,EAAgB,UAC7CD,EAAiB,QAAUC,EAAgB,SAMpCD,EAAiB,UAAaC,EAAgB,YACrDD,EAAiB,UAAYC,EAAgB,UAC7CD,EAAiB,UAAYC,EAAgB,UAC7CD,EAAiB,QAAUC,EAAgB,QAE/C,CAzBgBC,EAAAC,GAAA,uBA2BV,SAAUC,GACdC,EACAC,EACAC,EAAqB,CAEjBF,EAAK,SAASE,CAAa,IAAM,OACnCF,EAAK,SAASE,CAAa,EAAI,CAACD,CAAK,EAErCD,EAAK,SAASE,CAAa,EAAE,KAAKD,CAAK,CAE3C,CAVgBJ,EAAAE,GAAA,oBAYV,SAAUI,GACdH,EACAI,EACAC,EAAe,CAEXL,EAAK,SAASI,CAAQ,IAAM,OAC9BJ,EAAK,SAASI,CAAQ,EAAI,CAACC,CAAU,EAErCL,EAAK,SAASI,CAAQ,EAAE,KAAKC,CAAU,CAE3C,CAVgBR,EAAAM,GAAA,wBC5EhB,IAAMG,GAAO,OAEP,SAAUC,GAAeC,EAASC,EAAiB,CACvD,OAAO,eAAeD,EAAKF,GAAM,CAC/B,WAAY,GACZ,aAAc,GACd,SAAU,GACV,MAAOG,EACR,CACH,CAPgBC,EAAAH,GAAA,kBCYV,SAAUI,GAAiBC,EAAUC,EAAS,CAClD,IAAMC,EAAgBC,GAAKH,CAAG,EACxBI,EAAsBF,EAAc,OAC1C,QAAS,EAAI,EAAG,EAAIE,EAAqB,IAAK,CAC5C,IAAMC,EAAgBH,EAAc,CAAC,EAC/BI,EAAiBN,EAAIK,CAAa,EAClCE,EAAuBD,EAAe,OAC5C,QAASE,EAAI,EAAGA,EAAID,EAAsBC,IAAK,CAC7C,IAAMC,EAAiBH,EAAeE,CAAC,EAEnCC,EAAU,eAAiB,QAC7B,KAAKA,EAAU,IAAI,EAAEA,EAAU,SAAUR,CAAK,GAKtD,CAhBgBS,EAAAX,GAAA,gBAkBV,SAAUY,GACdC,EACAC,EAAmB,CAInB,IAAMC,EAA0BJ,EAAA,UAAA,CAAa,EAAb,sBAKhCK,GAAeD,EAAoBF,EAAc,eAAe,EAEhE,IAAMI,EAAgB,CACpB,MAAON,EAAA,SAAUO,EAA8BhB,EAAU,CASvD,GAPIiB,GAAQD,CAAO,IAGjBA,EAAUA,EAAQ,CAAC,GAIjB,CAAAE,GAAYF,CAAO,EAIvB,OAAO,KAAKA,EAAQ,IAAI,EAAEA,EAAQ,SAAUhB,CAAK,CACnD,EAdO,SAgBP,gBAAiBS,EAAA,UAAA,CACf,IAAMU,EAA2BC,GAAgB,KAAMR,CAAS,EAChE,GAAI,CAACS,EAAQF,CAAwB,EAAG,CACtC,IAAMG,EAAgBC,EACpBJ,EACCK,GAAiBA,EAAa,GAAG,EAEpC,MAAM,MACJ,mCAAmC,KAAK,YAAY,IAAI;GACnDF,EAAc,KAAK;;CAAM,EAAE,QAAQ,MAAO;EAAM,CAAC,EAAE,EAG9D,EAZiB,oBAenB,OAAAT,EAAmB,UAAYE,EAC/BF,EAAmB,UAAU,YAAcA,EAE3CA,EAAmB,YAAcD,EAE1BC,CACT,CAnDgBJ,EAAAC,GAAA,wCAqDV,SAAUe,GACdd,EACAC,EACAc,EAAyB,CAIzB,IAAMb,EAA0BJ,EAAA,UAAA,CAAa,EAAb,sBAKhCK,GAAeD,EAAoBF,EAAc,2BAA2B,EAE5E,IAAMgB,EAAoB,OAAO,OAAOD,EAAgB,SAAS,EACjE,OAAAE,EAAQhB,EAAYiB,GAAY,CAC9BF,EAAkBE,CAAQ,EAAI/B,EAChC,CAAC,EAEDe,EAAmB,UAAYc,EAC/Bd,EAAmB,UAAU,YAAcA,EAEpCA,CACT,CAvBgBJ,EAAAgB,GAAA,4CAyBhB,IAAYK,IAAZ,SAAYA,EAAyB,CACnCA,EAAAA,EAAA,iBAAA,CAAA,EAAA,mBACAA,EAAAA,EAAA,eAAA,CAAA,EAAA,gBACF,GAHYA,KAAAA,GAAyB,CAAA,EAAA,EAW/B,SAAUV,GACdW,EACAnB,EAAmB,CAInB,OAFsBoB,GAA0BD,EAAiBnB,CAAS,CAG5E,CAPgBH,EAAAW,GAAA,mBASV,SAAUY,GACdD,EACAnB,EAAmB,CAEnB,IAAMqB,EAAmBC,GAAOtB,EAAYuB,GACnCC,GAAYL,EAAwBI,CAAY,CAAC,IAAM,EAC/D,EAEKE,EAAoCd,EACxCU,EACCE,IACQ,CACL,IAAK,4BAA4BA,CAAY,QAC3CJ,EAAgB,YAAY,IAC7B,gBACD,KAAMD,GAA0B,eAChC,WAAYK,GAEf,EAGH,OAAOG,GAAiCD,CAAM,CAChD,CAtBgB5B,EAAAuB,GAAA,6BCzGV,IAAOO,GAAP,KAAkB,CAzBxB,MAyBwB,CAAAC,EAAA,oBAoBtB,gBAAqCC,EAAqB,CAUxD,GATA,KAAK,UAAY,CAAA,EAGjB,KAAK,UAAaA,EAAe,UAEjC,KAAK,qBAAuBC,EAAID,EAAQ,sBAAsB,EACzDA,EAAO,qBACRE,GAAsB,qBAEtB,CAAC,KAAK,UACR,KAAK,yBAA2BC,GAChC,KAAK,sBAAwBA,GAC7B,KAAK,gBAAkBA,GACvB,KAAK,mBAAqBA,GAC1B,KAAK,YAAcA,WAEf,QAAQ,KAAK,KAAK,oBAAoB,EACpC,KAAK,iBACP,KAAK,yBAA2BC,GAChC,KAAK,wBAA0BA,GAC/B,KAAK,YAAcD,GACnB,KAAK,uBAAyB,KAAK,qCAEnC,KAAK,yBAA2BA,GAChC,KAAK,wBAA0BA,GAC/B,KAAK,YAAc,KAAK,gBACxB,KAAK,uBAAyB,KAAK,2CAE5B,cAAc,KAAK,KAAK,oBAAoB,EACjD,KAAK,iBACP,KAAK,yBAAgCE,GACrC,KAAK,wBAA+BA,GACpC,KAAK,YAAcF,GACnB,KAAK,uBACH,KAAK,2CAEP,KAAK,yBAA2BA,GAChC,KAAK,wBAA0BA,GAC/B,KAAK,YAAc,KAAK,sBACxB,KAAK,uBACH,KAAK,iDAEA,QAAQ,KAAK,KAAK,oBAAoB,EAC/C,KAAK,yBAA2BA,GAChC,KAAK,wBAA0BA,GAC/B,KAAK,YAAcA,GACnB,KAAK,uBAAyBA,OAE9B,OAAM,MACJ,kDAAkDH,EAAO,oBAAoB,GAAG,CAIxF,CAEA,yCAEEM,EAAY,CAEZA,EAAQ,SAAW,CACjB,YAAa,IACb,UAAW,IAEf,CAEA,wCAEEA,EAAY,CAEZA,EAAQ,SAAW,CAKjB,YAAa,KAAK,GAAG,CAAC,EAAE,YACxB,UAAW,IAEf,CAEA,mCAAwDA,EAAY,CAClEA,EAAQ,SAAW,CACjB,YAAa,IACb,UAAW,IACX,YAAa,IACb,UAAW,IACX,QAAS,IACT,UAAW,IAEf,CAOA,kCAAuDA,EAAY,CACjE,IAAMC,EAAY,KAAK,GAAG,CAAC,EAC3BD,EAAQ,SAAW,CACjB,YAAaC,EAAU,YACvB,UAAWA,EAAU,UACrB,YAAaA,EAAU,YACvB,UAAW,IACX,QAAS,IACT,UAAW,IAEf,CAEA,yBAA8CC,EAAoB,CAChE,IAAMF,EAAmB,CACvB,KAAME,EACN,SAAU,OAAO,OAAO,IAAI,GAG9B,KAAK,uBAAuBF,CAAO,EACnC,KAAK,UAAU,KAAKA,CAAO,CAC7B,CAEA,uBAAqB,CACnB,KAAK,UAAU,IAAG,CACpB,CAEA,gBAAqCG,EAAoB,CAEvD,IAAMC,EAAY,KAAK,GAAG,CAAC,EACrBC,EAAMF,EAAY,SAIpBE,EAAI,aAAeD,EAAU,aAC/BC,EAAI,UAAYD,EAAU,UAC1BC,EAAI,QAAUD,EAAU,QACxBC,EAAI,UAAYD,EAAU,YAI1BC,EAAI,YAAc,IAClBA,EAAI,UAAY,IAChBA,EAAI,YAAc,IAEtB,CAEA,sBAA2CF,EAAoB,CAC7D,IAAMC,EAAY,KAAK,GAAG,CAAC,EAErBC,EAAMF,EAAY,SAIpBE,EAAI,aAAeD,EAAU,YAC/BC,EAAI,UAAYD,EAAU,UAI1BC,EAAI,YAAc,GAEtB,CAEA,gBAEEC,EACAC,EAAqB,CAErB,IAAMC,EAAU,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,EACxDC,GAAiBD,EAASD,EAAeD,CAAG,EAE5C,KAAK,yBAAyBE,EAAQ,SAAgBD,CAAa,CACrE,CAEA,mBAEEG,EACAC,EAAgB,CAEhB,IAAMC,EAAa,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,EAC3DC,GAAqBD,EAAYD,EAAUD,CAAa,EAExD,KAAK,wBAAwBE,EAAW,SAAWF,EAAc,QAAS,CAC5E,CAEA,8BAA4B,CAK1B,GAAII,GAAY,KAAK,yBAAyB,EAAG,CAC/C,IAAMC,EAA+BC,GACnC,KAAK,UACLC,GAAK,KAAK,oBAAoB,CAAC,EAEjC,YAAK,0BAA4BF,EAC1BA,EAGT,OAAY,KAAK,yBACnB,CAEA,0CAAwC,CAKtC,GAAID,GAAY,KAAK,qCAAqC,EAAG,CAC3D,IAAMI,EAAiBC,GACrB,KAAK,UACLF,GAAK,KAAK,oBAAoB,EAC9B,KAAK,6BAA4B,CAAE,EAErC,YAAK,sCAAwCC,EACtCA,EAGT,OAAY,KAAK,qCACnB,CAEA,8BAA4B,CAC1B,IAAME,EAAY,KAAK,WACvB,OAAOA,EAAUA,EAAU,OAAS,CAAC,CACvC,CAEA,kCAAgC,CAC9B,IAAMA,EAAY,KAAK,WACvB,OAAOA,EAAUA,EAAU,OAAS,CAAC,CACvC,CAEA,oCAAkC,CAChC,IAAMC,EAAkB,KAAK,sBAC7B,OAAOA,EAAgBA,EAAgB,OAAS,CAAC,CACnD,GCtQI,IAAOC,GAAP,KAAmB,CAXzB,MAWyB,CAAAC,EAAA,qBAKvB,kBAAgB,CACd,KAAK,UAAY,CAAA,EACjB,KAAK,gBAAkB,EACvB,KAAK,QAAU,EACjB,CAEA,IAAI,MAAMC,EAAkB,CAG1B,GAAI,KAAK,mBAAqB,GAC5B,MAAM,MACJ,kFAAkF,EAKtF,KAAK,MAAK,EACV,KAAK,UAAYA,EACjB,KAAK,gBAAkBA,EAAS,MAClC,CAEA,IAAI,OAAK,CACP,OAAO,KAAK,SACd,CAGA,YAAU,CACR,OAAI,KAAK,SAAW,KAAK,UAAU,OAAS,GAC1C,KAAK,aAAY,EACV,KAAK,GAAG,CAAC,GAETC,EAEX,CAIA,GAAwBC,EAAe,CACrC,IAAMC,EAAY,KAAK,QAAUD,EACjC,OAAIC,EAAY,GAAK,KAAK,iBAAmBA,EACpCF,GAEA,KAAK,UAAUE,CAAS,CAEnC,CAEA,cAAY,CACV,KAAK,SACP,CAEA,kBAAgB,CACd,OAAO,KAAK,OACd,CAEA,iBAAsCC,EAAgB,CACpD,KAAK,QAAUA,CACjB,CAEA,iBAAe,CACb,KAAK,QAAU,EACjB,CAEA,uBAAqB,CACnB,KAAK,QAAU,KAAK,UAAU,OAAS,CACzC,CAEA,kBAAgB,CACd,OAAO,KAAK,iBAAgB,CAC9B,GCnDI,IAAOC,GAAP,KAAoB,CAlB1B,MAkB0B,CAAAC,EAAA,sBACxB,OAA+BC,EAAa,CAC1C,OAAOA,EAAK,KAAK,IAAI,CACvB,CAEA,QAEEC,EACAC,EACAC,EAA2B,CAE3B,OAAO,KAAK,gBAAgBD,EAASD,EAAKE,CAAO,CACnD,CAEA,QAEEF,EACAG,EACAD,EAAiC,CAEjC,OAAO,KAAK,gBAAgBC,EAAYH,EAAKE,CAAO,CACtD,CAEA,OAEEF,EACAI,EAA0D,CAE1D,OAAO,KAAK,eAAeA,EAAmBJ,CAAG,CACnD,CAEA,GAEEA,EACAK,EAA6C,CAE7C,OAAO,KAAK,WAAWA,EAAYL,CAAG,CACxC,CAEA,KAEEA,EACAI,EAA0D,CAE1D,OAAO,KAAK,aAAaJ,EAAKI,CAAiB,CACjD,CAEA,WAEEJ,EACAI,EAAiE,CAEjE,OAAO,KAAK,mBAAmBJ,EAAKI,CAAiB,CACvD,CAEA,QAEEH,EACAC,EAA2B,CAE3B,OAAO,KAAK,gBAAgBD,EAAS,EAAGC,CAAO,CACjD,CAEA,SAEED,EACAC,EAA2B,CAE3B,OAAO,KAAK,gBAAgBD,EAAS,EAAGC,CAAO,CACjD,CAEA,SAEED,EACAC,EAA2B,CAE3B,OAAO,KAAK,gBAAgBD,EAAS,EAAGC,CAAO,CACjD,CAEA,SAEED,EACAC,EAA2B,CAE3B,OAAO,KAAK,gBAAgBD,EAAS,EAAGC,CAAO,CACjD,CAEA,SAEED,EACAC,EAA2B,CAE3B,OAAO,KAAK,gBAAgBD,EAAS,EAAGC,CAAO,CACjD,CAEA,SAEED,EACAC,EAA2B,CAE3B,OAAO,KAAK,gBAAgBD,EAAS,EAAGC,CAAO,CACjD,CAEA,SAEED,EACAC,EAA2B,CAE3B,OAAO,KAAK,gBAAgBD,EAAS,EAAGC,CAAO,CACjD,CAEA,SAEED,EACAC,EAA2B,CAE3B,OAAO,KAAK,gBAAgBD,EAAS,EAAGC,CAAO,CACjD,CAEA,SAEED,EACAC,EAA2B,CAE3B,OAAO,KAAK,gBAAgBD,EAAS,EAAGC,CAAO,CACjD,CAEA,SAEED,EACAC,EAA2B,CAE3B,OAAO,KAAK,gBAAgBD,EAAS,EAAGC,CAAO,CACjD,CAEA,QAEEC,EACAD,EAAiC,CAEjC,OAAO,KAAK,gBAAgBC,EAAY,EAAGD,CAAO,CACpD,CAEA,SAEEC,EACAD,EAAiC,CAEjC,OAAO,KAAK,gBAAgBC,EAAY,EAAGD,CAAO,CACpD,CAEA,SAEEC,EACAD,EAAiC,CAEjC,OAAO,KAAK,gBAAgBC,EAAY,EAAGD,CAAO,CACpD,CAEA,SAEEC,EACAD,EAAiC,CAEjC,OAAO,KAAK,gBAAgBC,EAAY,EAAGD,CAAO,CACpD,CAEA,SAEEC,EACAD,EAAiC,CAEjC,OAAO,KAAK,gBAAgBC,EAAY,EAAGD,CAAO,CACpD,CAEA,SAEEC,EACAD,EAAiC,CAEjC,OAAO,KAAK,gBAAgBC,EAAY,EAAGD,CAAO,CACpD,CAEA,SAEEC,EACAD,EAAiC,CAEjC,OAAO,KAAK,gBAAgBC,EAAY,EAAGD,CAAO,CACpD,CAEA,SAEEC,EACAD,EAAiC,CAEjC,OAAO,KAAK,gBAAgBC,EAAY,EAAGD,CAAO,CACpD,CAEA,SAEEC,EACAD,EAAiC,CAEjC,OAAO,KAAK,gBAAgBC,EAAY,EAAGD,CAAO,CACpD,CAEA,SAEEC,EACAD,EAAiC,CAEjC,OAAO,KAAK,gBAAgBC,EAAY,EAAGD,CAAO,CACpD,CAEA,OAEEE,EAA0D,CAE1D,OAAO,KAAK,eAAeA,EAAmB,CAAC,CACjD,CAEA,QAEEA,EAA0D,CAE1D,OAAO,KAAK,eAAeA,EAAmB,CAAC,CACjD,CAEA,QAEEA,EAA0D,CAE1D,OAAO,KAAK,eAAeA,EAAmB,CAAC,CACjD,CAEA,QAEEA,EAA0D,CAE1D,OAAO,KAAK,eAAeA,EAAmB,CAAC,CACjD,CAEA,QAEEA,EAA0D,CAE1D,OAAO,KAAK,eAAeA,EAAmB,CAAC,CACjD,CAEA,QAEEA,EAA0D,CAE1D,OAAO,KAAK,eAAeA,EAAmB,CAAC,CACjD,CAEA,QAEEA,EAA0D,CAE1D,OAAO,KAAK,eAAeA,EAAmB,CAAC,CACjD,CAEA,QAEEA,EAA0D,CAE1D,OAAO,KAAK,eAAeA,EAAmB,CAAC,CACjD,CAEA,QAEEA,EAA0D,CAE1D,OAAO,KAAK,eAAeA,EAAmB,CAAC,CACjD,CAEA,QAEEA,EAA0D,CAE1D,OAAO,KAAK,eAAeA,EAAmB,CAAC,CACjD,CAEA,GAEEC,EAAiD,CAEjD,OAAO,KAAK,WAAWA,EAAY,CAAC,CACtC,CAEA,IAEEA,EAAiD,CAEjD,OAAO,KAAK,WAAWA,EAAY,CAAC,CACtC,CAEA,IAEEA,EAAiD,CAEjD,OAAO,KAAK,WAAWA,EAAY,CAAC,CACtC,CAEA,IAEEA,EAAiD,CAEjD,OAAO,KAAK,WAAWA,EAAY,CAAC,CACtC,CAEA,IAEEA,EAAiD,CAEjD,OAAO,KAAK,WAAWA,EAAY,CAAC,CACtC,CAEA,IAEEA,EAAiD,CAEjD,OAAO,KAAK,WAAWA,EAAY,CAAC,CACtC,CAEA,IAEEA,EAAiD,CAEjD,OAAO,KAAK,WAAWA,EAAY,CAAC,CACtC,CAEA,IAEEA,EAAiD,CAEjD,OAAO,KAAK,WAAWA,EAAY,CAAC,CACtC,CAEA,IAEEA,EAAiD,CAEjD,OAAO,KAAK,WAAWA,EAAY,CAAC,CACtC,CAEA,IAEEA,EAAiD,CAEjD,OAAO,KAAK,WAAWA,EAAY,CAAC,CACtC,CAEA,KAEED,EAA0D,CAE1D,KAAK,aAAa,EAAGA,CAAiB,CACxC,CAEA,MAEEA,EAA0D,CAE1D,KAAK,aAAa,EAAGA,CAAiB,CACxC,CAEA,MAEEA,EAA0D,CAE1D,KAAK,aAAa,EAAGA,CAAiB,CACxC,CAEA,MAEEA,EAA0D,CAE1D,KAAK,aAAa,EAAGA,CAAiB,CACxC,CAEA,MAEEA,EAA0D,CAE1D,KAAK,aAAa,EAAGA,CAAiB,CACxC,CAEA,MAEEA,EAA0D,CAE1D,KAAK,aAAa,EAAGA,CAAiB,CACxC,CAEA,MAEEA,EAA0D,CAE1D,KAAK,aAAa,EAAGA,CAAiB,CACxC,CAEA,MAEEA,EAA0D,CAE1D,KAAK,aAAa,EAAGA,CAAiB,CACxC,CAEA,MAEEA,EAA0D,CAE1D,KAAK,aAAa,EAAGA,CAAiB,CACxC,CAEA,MAEEA,EAA0D,CAE1D,KAAK,aAAa,EAAGA,CAAiB,CACxC,CAEA,SAAmCF,EAA+B,CAChE,KAAK,qBAAqB,EAAGA,CAAO,CACtC,CAEA,UAAoCA,EAA+B,CACjE,KAAK,qBAAqB,EAAGA,CAAO,CACtC,CAEA,UAAoCA,EAA+B,CACjE,KAAK,qBAAqB,EAAGA,CAAO,CACtC,CAEA,UAAoCA,EAA+B,CACjE,KAAK,qBAAqB,EAAGA,CAAO,CACtC,CAEA,UAAoCA,EAA+B,CACjE,KAAK,qBAAqB,EAAGA,CAAO,CACtC,CAEA,UAAoCA,EAA+B,CACjE,KAAK,qBAAqB,EAAGA,CAAO,CACtC,CAEA,UAAoCA,EAA+B,CACjE,KAAK,qBAAqB,EAAGA,CAAO,CACtC,CAEA,UAAoCA,EAA+B,CACjE,KAAK,qBAAqB,EAAGA,CAAO,CACtC,CAEA,UAAoCA,EAA+B,CACjE,KAAK,qBAAqB,EAAGA,CAAO,CACtC,CAEA,UAAoCA,EAA+B,CACjE,KAAK,qBAAqB,EAAGA,CAAO,CACtC,CAEA,aAEEE,EAAiE,CAEjE,KAAK,mBAAmB,EAAGA,CAAiB,CAC9C,CAEA,cAEEA,EAAiE,CAEjE,OAAO,KAAK,mBAAmB,EAAGA,CAAiB,CACrD,CAEA,cAEEA,EAAiE,CAEjE,KAAK,mBAAmB,EAAGA,CAAiB,CAC9C,CAEA,cAEEA,EAAiE,CAEjE,KAAK,mBAAmB,EAAGA,CAAiB,CAC9C,CAEA,cAEEA,EAAiE,CAEjE,KAAK,mBAAmB,EAAGA,CAAiB,CAC9C,CAEA,cAEEA,EAAiE,CAEjE,KAAK,mBAAmB,EAAGA,CAAiB,CAC9C,CAEA,cAEEA,EAAiE,CAEjE,KAAK,mBAAmB,EAAGA,CAAiB,CAC9C,CAEA,cAEEA,EAAiE,CAEjE,KAAK,mBAAmB,EAAGA,CAAiB,CAC9C,CAEA,cAEEA,EAAiE,CAEjE,KAAK,mBAAmB,EAAGA,CAAiB,CAC9C,CAEA,cAEEA,EAAiE,CAEjE,KAAK,mBAAmB,EAAGA,CAAiB,CAC9C,CAEA,iBAEEF,EAAqC,CAErC,KAAK,2BAA2B,EAAGA,CAAO,CAC5C,CAEA,kBAEEA,EAAqC,CAErC,KAAK,2BAA2B,EAAGA,CAAO,CAC5C,CAEA,kBAEEA,EAAqC,CAErC,KAAK,2BAA2B,EAAGA,CAAO,CAC5C,CAEA,kBAEEA,EAAqC,CAErC,KAAK,2BAA2B,EAAGA,CAAO,CAC5C,CAEA,kBAEEA,EAAqC,CAErC,KAAK,2BAA2B,EAAGA,CAAO,CAC5C,CAEA,kBAEEA,EAAqC,CAErC,KAAK,2BAA2B,EAAGA,CAAO,CAC5C,CAEA,kBAEEA,EAAqC,CAErC,KAAK,2BAA2B,EAAGA,CAAO,CAC5C,CAEA,kBAEEA,EAAqC,CAErC,KAAK,2BAA2B,EAAGA,CAAO,CAC5C,CAEA,kBAEEA,EAAqC,CAErC,KAAK,2BAA2B,EAAGA,CAAO,CAC5C,CAEA,kBAEEA,EAAqC,CAErC,KAAK,2BAA2B,EAAGA,CAAO,CAC5C,CAEA,KAEEI,EACAC,EACAC,EAAyBC,GAAmB,CAE5C,GAAIC,GAAS,KAAK,kBAAmBJ,CAAI,EAAG,CAO1C,IAAMK,EAAQ,CACZ,QANAC,GAAqC,4BAA4B,CAC/D,aAAcN,EACd,YAAa,KAAK,UACnB,EAID,KAAMO,GAA0B,oBAChC,SAAUP,GAEZ,KAAK,iBAAiB,KAAKK,CAAK,EAGlC,KAAK,kBAAkB,KAAKL,CAAI,EAEhC,IAAMQ,EAAqB,KAAK,WAAWR,EAAMC,EAAgBC,CAAM,EACtE,YAAaF,CAAI,EAAIQ,EACfA,CACT,CAEA,cAEER,EACAP,EACAS,EAAyBC,GAAmB,CAE5C,IAAMM,EAAuCC,GAC3CV,EACA,KAAK,kBACL,KAAK,SAAS,EAEhB,KAAK,iBAAmB,KAAK,iBAAiB,OAAOS,CAAU,EAE/D,IAAMD,EAAqB,KAAK,WAAWR,EAAMP,EAAMS,CAAM,EAC5D,YAAaF,CAAI,EAAIQ,EACfA,CACT,CAEA,UAEEG,EACAC,EAAY,CAEZ,OAAO,UAAA,CAEL,KAAK,oBAAoB,KAAK,CAAC,EAC/B,IAAMC,EAAW,KAAK,eAAc,EACpC,GAAI,CACF,OAAAF,EAAY,MAAM,KAAMC,CAAI,EAErB,SACAE,EAAG,CACV,GAAIC,GAAuBD,CAAC,EAC1B,MAAO,GAEP,MAAMA,UAGR,KAAK,iBAAiBD,CAAQ,EAC9B,KAAK,oBAAoB,IAAG,EAEhC,CACF,CAGO,oBAAkB,CACvB,OAAO,KAAK,oBACd,CAEO,8BAA4B,CACjC,OAAOG,GAAiBC,GAAO,KAAK,oBAAoB,CAAC,CAC3D,GCvoBI,IAAOC,GAAP,KAAuB,CApD7B,MAoD6B,CAAAC,EAAA,yBAe3B,qBACEC,EACAC,EAAqB,CAiBrB,GAfA,KAAK,UAAY,KAAK,YAAY,KAElC,KAAK,oBAAsB,CAAA,EAC3B,KAAK,oBAAsB,CAAA,EAC3B,KAAK,iBAAmB,IACxB,KAAK,aAAeC,GACpB,KAAK,WAAa,EAElB,KAAK,kBAAoB,CAAA,EACzB,KAAK,UAAY,CAAA,EACjB,KAAK,oBAAsB,CAAA,EAC3B,KAAK,WAAa,CAAA,EAClB,KAAK,sBAAwB,CAAA,EAC7B,KAAK,qBAAuB,CAAA,EAExBC,EAAIF,EAAQ,mBAAmB,EACjC,MAAM,MACJ;;sBAE0B,EAI9B,GAAIG,GAAQJ,CAAe,EAAG,CAI5B,GAAIK,EAAQL,CAAwB,EAClC,MAAM,MACJ;;2CAE+C,EAInD,GAAI,OAAQA,EAA0B,CAAC,EAAE,aAAgB,SACvD,MAAM,MACJ;;sBAE0B,EAKhC,GAAII,GAAQJ,CAAe,EACzB,KAAK,UAAYM,GACfN,EACA,CAACO,EAAKC,KACJD,EAAIC,EAAQ,IAAI,EAAIA,EACbD,GAET,CAAA,CAAwC,UAG1CJ,EAAIH,EAAiB,OAAO,GAC5BS,GAAMC,GAAQC,GAAaX,EAAiB,KAAK,CAAC,EAAGY,EAAW,EAChE,CACA,IAAMC,EAAgBH,GAAQC,GAAaX,EAAiB,KAAK,CAAC,EAC5Dc,EAAeC,GAAKF,CAAa,EACvC,KAAK,UAAiBP,GACpBQ,EACA,CAACP,EAAKC,KACJD,EAAIC,EAAQ,IAAI,EAAIA,EACbD,GAET,CAAA,CAAwC,UAEjCS,GAAShB,CAAe,EACjC,KAAK,UAAYiB,GAAMjB,CAAsC,MAE7D,OAAM,IAAI,MACR,wIACuE,EAM3E,KAAK,UAAU,IAASkB,GAExB,IAAML,EAAgBV,EAAIH,EAAiB,OAAO,EAC9CU,GAAQC,GAAaX,EAAiB,KAAK,CAAC,EAC5CW,GAAOX,CAAe,EACpBmB,EAAwBV,GAAMI,EAAgBO,GAClDf,EAAQe,EAAiB,eAAe,CAAC,EAG3C,KAAK,aAAeD,EAChBjB,GACAmB,GAKJC,GAAkBX,GAAO,KAAK,SAAS,CAAC,CAC1C,CAEA,WAEEY,EACAC,EACAvB,EAAsB,CAEtB,GAAI,KAAK,iBACP,MAAM,MACJ,iBAAiBsB,CAAQ;6FACuE,EAGpG,IAAME,EAAyBtB,EAAIF,EAAQ,eAAe,EACrDA,EAAO,cACRyB,GAAoB,cAClBC,EAAoBxB,EAAIF,EAAQ,mBAAmB,EACpDA,EAAO,kBACRyB,GAAoB,kBAIlBE,EACJ,KAAK,kBAAqB,GAE5B,KAAK,mBACL,KAAK,oBAAoBA,CAAS,EAAIL,EACtC,KAAK,oBAAoBA,CAAQ,EAAIK,EAErC,IAAIC,EAIJ,OAAI,KAAK,YAAc,GACrBA,EAAoB9B,EAAA,YAEf+B,EAAU,CAEb,GAAI,CACF,KAAK,0BAA0BF,EAAWL,EAAU,KAAK,UAAU,EACnEC,EAAK,MAAM,KAAMM,CAAI,EACrB,IAAMC,EAAM,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,EACpD,YAAK,YAAYA,CAAG,EACbA,QACAC,EAAG,CACV,OAAO,KAAK,gBAAgBA,EAAGP,EAAeE,CAAiB,UAE/D,KAAK,uBAAsB,EAE/B,EAfoB,qBAiBpBE,EAAoB9B,EAAA,YAEf+B,EAAU,CAEb,GAAI,CACF,YAAK,0BAA0BF,EAAWL,EAAU,KAAK,UAAU,EAC5DC,EAAK,MAAM,KAAMM,CAAI,QACrBE,EAAG,CACV,OAAO,KAAK,gBAAgBA,EAAGP,EAAeE,CAAiB,UAE/D,KAAK,uBAAsB,EAE/B,EAZoB,wBAeoC,OAAO,OAC/DE,EACA,CAAE,SAAAN,EAAU,sBAAuBC,CAAI,CAAE,CAI7C,CAEA,gBAEE,EACAS,EACAN,EAA2B,CAE3B,IAAMO,EAAqB,KAAK,WAAW,SAAW,EAKhDC,EACJF,GAAuB,CAAC,KAAK,eAAc,GAAM,KAAK,gBAExD,GAAIG,GAAuB,CAAC,EAAG,CAC7B,IAAMC,EAAkB,EACxB,GAAIF,EAAe,CACjB,IAAMG,EAAgB,KAAK,oBAAmB,EAC9C,GAAI,KAAK,yBAAyBA,CAAa,EAE7C,GADAD,EAAW,eAAiB,KAAK,SAASC,CAAa,EACnD,KAAK,UAAW,CAClB,IAAMC,EACJ,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,EAC1C,OAAAA,EAAiB,cAAgB,GAC1BA,MAEP,QAAOZ,EAAkB,CAAC,MAEvB,CACL,GAAI,KAAK,UAAW,CAClB,IAAMY,EACJ,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,EAC1CA,EAAiB,cAAgB,GACjCF,EAAW,iBAAmBE,EAGhC,MAAMF,OAEH,IAAIH,EAET,YAAK,sBAAqB,EAGnBP,EAAkB,CAAC,EAG1B,MAAMU,OAIR,OAAM,CAEV,CAGA,eAEEG,EACAC,EAAkB,CAElB,IAAMC,EAAM,KAAK,4BAA4B,IAAYD,CAAU,EACnE,OAAO,KAAK,oBAAoBD,EAAmBC,EAAYC,CAAG,CACpE,CAEA,oBAEEF,EACAC,EACAC,EAAW,CAEX,IAAIC,EAAgB,KAAK,mBAAmBD,CAAG,EAC3CE,EACJ,GAAI,OAAOJ,GAAsB,WAAY,CAC3CI,EAASJ,EAAkB,IAC3B,IAAMK,EAAYL,EAAkB,KAEpC,GAAIK,IAAc,OAAW,CAC3B,IAAMC,EAAuBH,EAC7BA,EAAgB5C,EAAA,IACP8C,EAAU,KAAK,IAAI,GAAKC,EAAqB,KAAK,IAAI,EAD/C,uBAKlBF,EAASJ,EAGX,GAAIG,EAAc,KAAK,IAAI,IAAM,GAC/B,OAAOC,EAAO,KAAK,IAAI,CAG3B,CAEA,mBAEEG,EACAP,EAAiE,CAEjE,IAAMQ,EAAQ,KAAK,4BACjB,KACAD,CAAc,EAEhB,OAAO,KAAK,wBACVA,EACAP,EACAQ,CAAK,CAET,CAEA,wBAEED,EACAP,EACAE,EAAW,CAEX,IAAIC,EAAgB,KAAK,mBAAmBD,CAAG,EAC3CE,EACJ,GAAI,OAAOJ,GAAsB,WAAY,CAC3CI,EAASJ,EAAkB,IAC3B,IAAMK,EAAYL,EAAkB,KAEpC,GAAIK,IAAc,OAAW,CAC3B,IAAMC,EAAuBH,EAC7BA,EAAgB5C,EAAA,IACP8C,EAAU,KAAK,IAAI,GAAKC,EAAqB,KAAK,IAAI,EAD/C,uBAKlBF,EAASJ,EAGX,GAAeG,EAAe,KAAK,IAAI,IAAM,GAAM,CACjD,IAAIM,EAAW,KAAK,mBAAmBL,CAAM,EAC7C,KACaD,EAAe,KAAK,IAAI,IAAM,IACzCM,IAAa,IAEbA,EAAW,KAAK,mBAAmBL,CAAM,MAG3C,OAAM,KAAK,wBACTG,EACAG,GAAU,qBACkBV,EAAmB,OAAO,EAS1D,KAAK,4BACH,KAAK,mBACL,CAACO,EAAgBP,CAAiB,EAC7BG,EACL,KACAI,EACAI,EAAiC,CAErC,CAEA,2BAEEJ,EACAK,EAAqC,CAErC,IAAMJ,EAAQ,KAAK,4BACjB,KACAD,CAAc,EAEhB,KAAK,gCAAgCA,EAAgBK,EAASJ,CAAK,CACrE,CAEA,gCAEED,EACAK,EACAV,EAAW,CAEX,IAAME,EAASQ,EAAQ,IACjBC,EAAYD,EAAQ,IAK1B,GAHoC,KAAK,mBAAmBV,CAAG,EAG/B,KAAK,IAAI,IAAM,GAAM,CAC9BE,EAAQ,KAAK,IAAI,EAItC,IAAMU,EAAyBvD,EAAA,IACtB,KAAK,aAAa,KAAK,GAAG,CAAC,EAAGsD,CAAS,EADjB,0BAK/B,KAAO,KAAK,aAAa,KAAK,GAAG,CAAC,EAAGA,CAAS,IAAM,IAGlD,KAAK,QAAQA,CAAS,EAEDT,EAAQ,KAAK,IAAI,EAIxC,KAAK,4BACH,KAAK,4BACL,CACEG,EACAM,EACAC,EACAV,EACAW,IAEFD,EACA,KACAP,EACAQ,EAAoC,MAGtC,OAAM,KAAK,wBACTR,EACAG,GAAU,oCACVE,EAAQ,OAAO,CAGrB,CAEA,aAEEL,EACAP,EAA0D,CAE1D,IAAMQ,EAAQ,KAAK,4BAA4B,IAAUD,CAAc,EACvE,OAAO,KAAK,kBAAkBA,EAAgBP,EAAmBQ,CAAK,CACxE,CAEA,kBAEED,EACAP,EACAE,EAAW,CAEX,IAAIc,EAAoB,KAAK,mBAAmBd,CAAG,EAC/CE,EACJ,GAAI,OAAOJ,GAAsB,WAAY,CAC3CI,EAASJ,EAAkB,IAC3B,IAAMK,EAAYL,EAAkB,KAEpC,GAAIK,IAAc,OAAW,CAC3B,IAAMC,EAAuBU,EAC7BA,EAAoBzD,EAAA,IACX8C,EAAU,KAAK,IAAI,GAAKC,EAAqB,KAAK,IAAI,EAD3C,2BAKtBF,EAASJ,EAGX,IAAIS,EAAW,GACf,KAAOO,EAAkB,KAAK,IAAI,IAAM,IAAQP,IAAa,IAC3DA,EAAW,KAAK,mBAAmBL,CAAM,EAI3C,KAAK,4BACH,KAAK,aACL,CAACG,EAAgBP,CAAiB,EAC7BgB,EACL,IACAT,EACAU,GAMAR,CAAQ,CAEZ,CAEA,qBAEEF,EACAK,EAA+B,CAE/B,IAAMJ,EAAQ,KAAK,4BACjB,KACAD,CAAc,EAEhB,KAAK,0BAA0BA,EAAgBK,EAASJ,CAAK,CAC/D,CAEA,0BAEED,EACAK,EACAV,EAAW,CAEX,IAAME,EAASQ,EAAQ,IACjBC,EAAYD,EAAQ,IAI1B,GAH6B,KAAK,mBAAmBV,CAAG,EAG/B,KAAK,IAAI,IAAM,GAAM,CAC5CE,EAAO,KAAK,IAAI,EAEhB,IAAMU,EAAyBvD,EAAA,IACtB,KAAK,aAAa,KAAK,GAAG,CAAC,EAAGsD,CAAS,EADjB,0BAI/B,KAAO,KAAK,aAAa,KAAK,GAAG,CAAC,EAAGA,CAAS,IAAM,IAGlD,KAAK,QAAQA,CAAS,EAEtBT,EAAO,KAAK,IAAI,EAIlB,KAAK,4BACH,KAAK,4BACL,CACEG,EACAM,EACAC,EACAV,EACAc,IAEFJ,EACA,KACAP,EACAW,EAA8B,EAGpC,CAEA,4BAEEX,EACAM,EACAC,EACAV,EACAe,EAAyE,CAEzE,KAAOL,EAAsB,GAG3B,KAAK,QAAQD,CAAS,EACtBT,EAAO,KAAK,IAAI,EASlB,KAAK,4BACH,KAAK,4BACL,CACEG,EACAM,EACAC,EACAV,EACAe,GAEFL,EACA,KACAP,EACAY,CAAuB,CAE3B,CAEA,mBAAwCf,EAAgB,CACtD,IAAMgB,EAAkB,KAAK,iBAAgB,EAC7C,OAAAhB,EAAO,KAAK,IAAI,EACO,KAAK,iBAAgB,EAIpBgB,CAC1B,CAEA,WAEEC,EACApB,EAAkB,CAElB,IAAMO,EAAQ,KAAK,4BAA4B,IAAQP,CAAU,EAC3DqB,EAAO1D,GAAQyD,CAAU,EAAIA,EAAaA,EAAW,IAGrDE,EADS,KAAK,mBAAmBf,CAAK,EAChB,KAAK,KAAMc,CAAI,EAC3C,GAAIC,IAAiB,OAEnB,OAD+BD,EAAKC,CAAY,EACvB,IAAI,KAAK,IAAI,EAExC,KAAK,oBACHtB,EACCoB,EAAqC,OAAO,CAEjD,CAEA,wBAAsB,CAOpB,GANA,KAAK,WAAW,IAAG,EACnB,KAAK,sBAAsB,IAAG,EAG9B,KAAK,sBAAqB,EAEtB,KAAK,WAAW,SAAW,GAAK,KAAK,eAAc,IAAO,GAAO,CACnE,IAAMG,EAAoB,KAAK,GAAG,CAAC,EAC7BC,EAAS,KAAK,qBAAqB,8BAA8B,CACrE,eAAgBD,EAChB,SAAU,KAAK,oBAAmB,EACnC,EACD,KAAK,WACH,IAAIE,GAA2BD,EAAQD,CAAiB,CAAC,EAG/D,CAEA,gBAEEG,EACAC,EACAhB,EAAiC,CAEjC,IAAIiB,EACJ,GAAI,CACF,IAAMvC,EAAOsB,IAAY,OAAYA,EAAQ,KAAO,OACpD,YAAK,WAAagB,EAClBC,EAAaF,EAAW,MAAM,KAAMrC,CAAI,EACxC,KAAK,mBACHuC,EACAjB,IAAY,QAAaA,EAAQ,QAAU,OACvCA,EAAQ,MACRe,EAAW,QAAQ,EAElBE,QACArC,EAAG,CACV,MAAM,KAAK,qBAAqBA,EAAGoB,EAASe,EAAW,QAAQ,EAEnE,CAEA,qBAEE,EACAf,EACA7B,EAAgB,CAEhB,MAAIa,GAAuB,CAAC,GAAK,EAAE,mBAAqB,SACtD,KAAK,mBACH,EAAE,iBACFgB,IAAY,QAAaA,EAAQ,QAAU,OACvCA,EAAQ,MACR7B,CAAQ,EAGd,OAAO,EAAE,kBAEL,CACR,CAEA,gBAEEf,EACA4D,EACAhB,EAAsC,CAEtC,IAAIkB,EACJ,GAAI,CACF,IAAMC,EAAY,KAAK,GAAG,CAAC,EACvB,KAAK,aAAaA,EAAW/D,CAAO,IAAM,IAC5C,KAAK,aAAY,EACjB8D,EAAgBC,GAEhB,KAAK,qBAAqB/D,EAAS+D,EAAWnB,CAAO,QAEhDoB,EAAkB,CACzBF,EAAgB,KAAK,wBACnB9D,EACA4D,EACAI,CAAgB,EAIpB,YAAK,gBACHpB,IAAY,QAAaA,EAAQ,QAAU,OACvCA,EAAQ,MACR5C,EAAQ,KACZ8D,CAAa,EAERA,CACT,CAEA,qBAEE9D,EACA+D,EACAnB,EAAsC,CAEtC,IAAIqB,EACEC,EAAgB,KAAK,GAAG,CAAC,EAC/B,MAAItB,IAAY,QAAaA,EAAQ,QACnCqB,EAAMrB,EAAQ,QAEdqB,EAAM,KAAK,qBAAqB,0BAA0B,CACxD,SAAUjE,EACV,OAAQ+D,EACR,SAAUG,EACV,SAAU,KAAK,oBAAmB,EACnC,EAEG,KAAK,WACT,IAAIC,GAAyBF,EAAKF,EAAWG,CAAa,CAAC,CAE/D,CAEA,wBAEElE,EACA4D,EACAI,EAAuB,CAIvB,GACE,KAAK,iBAELA,EAAiB,OAAS,4BAC1B,CAAC,KAAK,eAAc,EACpB,CACA,IAAMI,EAAU,KAAK,4BAAiCpE,EAAS4D,CAAG,EAClE,GAAI,CACF,OAAO,KAAK,kBAAuB5D,EAASoE,CAAO,QAC5CC,EAAqB,CAC5B,MAAIA,EAAoB,OAASC,GAGzBN,EAEAK,OAIV,OAAML,CAEV,CAEA,gBAAc,CAEZ,IAAMO,EAAc,KAAK,OACnBC,EAAiB/D,GAAM,KAAK,UAAU,EAC5C,MAAO,CACL,OAAQ8D,EACR,WAAY,KAAK,iBAAgB,EACjC,WAAYC,EACZ,UAAW,KAAK,UAEpB,CAEA,iBAAsCC,EAAsB,CAC1D,KAAK,OAASA,EAAS,OACvB,KAAK,iBAAiBA,EAAS,UAAU,EACzC,KAAK,WAAaA,EAAS,UAC7B,CAEA,0BAEErD,EACAsD,EACAC,EAAwB,CAExB,KAAK,sBAAsB,KAAKA,CAAgB,EAChD,KAAK,WAAW,KAAKvD,CAAS,EAE9B,KAAK,yBAAyBsD,CAAQ,CACxC,CAEA,gBAAc,CACZ,OAAO,KAAK,oBAAoB,SAAW,CAC7C,CAEA,qBAAmB,CACjB,IAAMtD,EAAY,KAAK,6BAA4B,EACnD,OAAO,KAAK,oBAAoBA,CAAS,CAC3C,CAEA,wBAA6CA,EAAiB,CAC5D,OAAO,KAAK,oBAAoBA,CAAS,CAC3C,CAEO,gBAAc,CACnB,OAAO,KAAK,aAAa,KAAK,GAAG,CAAC,EAAGV,EAAG,CAC1C,CAEO,OAAK,CACV,KAAK,gBAAe,EACpB,KAAK,WAAa,EAClB,KAAK,oBAAsB,CAAA,EAC3B,KAAK,OAAS,CAAA,EACd,KAAK,WAAa,CAAA,EAElB,KAAK,UAAY,CAAA,EACjB,KAAK,sBAAwB,CAAA,CAC/B,GC30BI,IAAOkE,GAAP,KAAmB,CAjBzB,MAiByB,CAAAC,EAAA,qBAIvB,iBAAiBC,EAAqB,CACpC,KAAK,QAAU,CAAA,EACf,KAAK,qBAAuBC,EAAID,EAAQ,sBAAsB,EACzDA,EAAO,qBACRE,GAAsB,oBAC5B,CAEA,WAEEC,EAA4B,CAE5B,GAAIC,GAAuBD,CAAK,EAC9B,OAAAA,EAAM,QAAU,CACd,UAAW,KAAK,0BAAyB,EACzC,oBAAqBE,GAAM,KAAK,qBAAqB,GAEvD,KAAK,QAAQ,KAAKF,CAAK,EAChBA,EAEP,MAAM,MACJ,6DAA6D,CAGnE,CAEA,IAAI,QAAM,CACR,OAAOE,GAAM,KAAK,OAAO,CAC3B,CAEA,IAAI,OAAOC,EAAkC,CAC3C,KAAK,QAAUA,CACjB,CAGA,wBAEEC,EACAC,EACAC,EAAqC,CAErC,IAAMC,EAAW,KAAK,oBAAmB,EACnCC,EAAc,KAAK,mBAAkB,EAAGD,CAAQ,EAOhDE,EAN+BC,GACnCN,EACAI,EACAH,EACA,KAAK,YAAY,EAEkC,CAAC,EAChDM,EAAe,CAAA,EACrB,QAASC,EAAI,EAAGA,GAAK,KAAK,aAAcA,IACtCD,EAAa,KAAK,KAAK,GAAGC,CAAC,CAAC,EAE9B,IAAMC,EAAM,KAAK,qBAAqB,sBAAsB,CAC1D,uBAAwBJ,EACxB,OAAQE,EACR,SAAU,KAAK,GAAG,CAAC,EACnB,sBAAuBL,EACvB,SAAUC,EACX,EAED,MAAM,KAAK,WAAW,IAAIO,GAAmBD,EAAK,KAAK,GAAG,CAAC,EAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAC3E,CAGA,oBAEET,EACAW,EAA+B,CAE/B,IAAMR,EAAW,KAAK,oBAAmB,EACnCC,EAAc,KAAK,mBAAkB,EAAGD,CAAQ,EAEhDS,EAA+BC,GACnCb,EACAI,EACA,KAAK,YAAY,EAGbG,EAAe,CAAA,EACrB,QAASC,EAAI,EAAGA,GAAK,KAAK,aAAcA,IACtCD,EAAa,KAAK,KAAK,GAAGC,CAAC,CAAC,EAE9B,IAAMM,EAAgB,KAAK,GAAG,CAAC,EAEzBC,EAAS,KAAK,qBAAqB,wBAAwB,CAC/D,oBAAqBH,EACrB,OAAQL,EACR,SAAUO,EACV,sBAAuBH,EACvB,SAAU,KAAK,oBAAmB,EACnC,EAED,MAAM,KAAK,WACT,IAAIK,GAAqBD,EAAQ,KAAK,GAAG,CAAC,EAAGD,CAAa,CAAC,CAE/D,GC7GI,IAAOG,GAAP,KAAoB,CAP1B,MAO0B,CAAAC,EAAA,sBACxB,mBAAiB,CAAI,CAEd,qBAELC,EACAC,EAAwB,CAExB,IAAMC,EAAgB,KAAK,qBAAqBF,CAAa,EAE7D,GAAIG,GAAYD,CAAa,EAC3B,MAAM,MAAM,UAAUF,CAAa,oCAAoC,EAGzE,OAAOI,GACL,CAACF,CAAa,EACdD,EACA,KAAK,aACL,KAAK,YAAY,CAErB,CAIO,0BAELI,EAA8B,CAE9B,IAAMC,EAAcC,GAAMF,EAAY,SAAS,EAEzCG,EADkB,KAAK,mBAAkB,EACTF,CAAW,EAKjD,OAJ+B,IAAIG,GACjCD,EACAH,CAAW,EACX,aAAY,CAEhB,GCEF,IAAMK,GAAwB,CAC5B,YAAa,8DAEf,OAAO,OAAOA,EAAqB,EAEnC,IAAMC,GAAmB,GACnBC,GAAiB,KAAK,IAAI,EAAG,CAAuB,EAAI,EAExDC,GAAMC,GAAY,CAAE,KAAM,wBAAyB,QAASC,GAAM,EAAE,CAAE,EAC5EC,GAAkB,CAACH,EAAG,CAAC,EACvB,IAAMI,GAAwBC,GAC5BL,GACA;qFAKA,GACA,GACA,GACA,GACA,GACA,EAAE,EAEJ,OAAO,OAAOI,EAAqB,EAEnC,IAAME,GAAmC,CACvC,KACE;qFAEF,SAAU,CAAA,GAMCC,GAAP,KAAmB,CAvEzB,MAuEyB,CAAAC,EAAA,qBAIvB,iBAAsCC,EAAqB,CACzD,KAAK,mBAAqB,CAAA,EAC1B,KAAK,gBAAkB,EACzB,CAEA,iBAAe,CACb,KAAK,gBAAkB,GAEvB,KAAK,WAAW,mBAAoB,IAAK,CAUvC,QAASC,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,IAAMC,EAAMD,EAAI,EAAIA,EAAI,GACxB,KAAK,UAAUC,CAAG,EAAe,EAAI,SAAUC,EAAMC,EAAI,CACvD,OAAO,KAAK,sBAAsBD,EAAMF,EAAGG,CAAI,CACjD,EACA,KAAK,UAAUF,CAAG,EAAe,EAAI,SAAUC,EAAMC,EAAI,CACvD,OAAO,KAAK,sBAAsBD,EAAMF,EAAGG,CAAI,CACjD,EACA,KAAK,SAASF,CAAG,EAAc,EAAI,SAAUC,EAAI,CAC/C,OAAO,KAAK,qBAAqBA,EAAMF,CAAC,CAC1C,EACA,KAAK,KAAKC,CAAG,EAAU,EAAI,SAAUC,EAAI,CACvC,OAAO,KAAK,iBAAiBA,EAAMF,CAAC,CACtC,EACA,KAAK,OAAOC,CAAG,EAAY,EAAI,SAAUC,EAAI,CAC3C,KAAK,mBAAmBF,EAAGE,CAAI,CACjC,EACA,KAAK,WAAWD,CAAG,EAAgB,EAAI,SAAUC,EAAI,CACnD,KAAK,2BAA2BF,EAAGE,CAAI,CACzC,EACA,KAAK,eAAeD,CAAG,EAAoB,EAAI,SAAUC,EAAI,CAC3D,KAAK,yBAAyBF,EAAGE,CAAI,CACvC,EACA,KAAK,mBAAmBD,CAAG,EAAwB,EAAI,SAAUC,EAAI,CACnE,KAAK,iCAAiCF,EAAGE,CAAI,CAC/C,EAIF,KAAK,QAAa,SAAUD,EAAKC,EAAMC,EAAI,CACzC,OAAO,KAAK,sBAAsBD,EAAMD,EAAKE,CAAI,CACnD,EACA,KAAK,QAAa,SAAUF,EAAKC,EAAMC,EAAI,CACzC,OAAO,KAAK,sBAAsBD,EAAMD,EAAKE,CAAI,CACnD,EACA,KAAK,OAAY,SAAUF,EAAKC,EAAI,CAClC,OAAO,KAAK,qBAAqBA,EAAMD,CAAG,CAC5C,EACA,KAAK,GAAQ,SAAUA,EAAKC,EAAI,CAC9B,OAAO,KAAK,iBAAiBA,EAAMD,CAAG,CACxC,EACA,KAAK,KAAU,SAAUA,EAAKC,EAAI,CAChC,KAAK,mBAAmBD,EAAKC,CAAI,CACnC,EACA,KAAK,WAAgB,SAAUD,EAAKC,EAAI,CACtC,KAAK,yBAAyBD,EAAKC,CAAI,CACzC,EAEA,KAAK,OAAS,KAAK,cACnB,KAAK,UAAY,KAAK,iBACtB,KAAK,GAAK,KAAK,SACjB,CAAC,CACH,CAEA,kBAAgB,CACd,KAAK,gBAAkB,GAKvB,KAAK,WAAW,6BAA8B,IAAK,CACjD,IAAME,EAAY,KAElB,QAASJ,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,IAAMC,EAAMD,EAAI,EAAIA,EAAI,GACxB,OAAOI,EAAK,UAAUH,CAAG,EAAE,EAC3B,OAAOG,EAAK,UAAUH,CAAG,EAAE,EAC3B,OAAOG,EAAK,SAASH,CAAG,EAAE,EAC1B,OAAOG,EAAK,KAAKH,CAAG,EAAE,EACtB,OAAOG,EAAK,OAAOH,CAAG,EAAE,EACxB,OAAOG,EAAK,WAAWH,CAAG,EAAE,EAC5B,OAAOG,EAAK,eAAeH,CAAG,EAAE,EAChC,OAAOG,EAAK,mBAAmBH,CAAG,EAAE,EAGtC,OAAOG,EAAK,QACZ,OAAOA,EAAK,QACZ,OAAOA,EAAK,OACZ,OAAOA,EAAK,GACZ,OAAOA,EAAK,KACZ,OAAOA,EAAK,WAEZ,OAAOA,EAAK,OACZ,OAAOA,EAAK,UACZ,OAAOA,EAAK,EACd,CAAC,CACH,CAKA,cAAsCC,EAAa,CAEnD,CAGA,iBACEC,EACAC,EAAY,CAEZ,MAAO,IAAM,EACf,CAIA,UAAUC,EAAe,CAGvB,OAAOC,EACT,CAEA,mBAAmBC,EAAcC,EAAa,CAC5C,GAAI,CACF,IAAMC,EAAkB,IAAIC,GAAK,CAAE,WAAY,CAAA,EAAI,KAAMH,CAAI,CAAE,EAC/D,OAAAE,EAAgB,KAAOF,EACvB,KAAK,mBAAmB,KAAKE,CAAe,EAC5CD,EAAI,KAAK,IAAI,EACb,KAAK,mBAAmB,IAAG,EACpBC,QACAE,EAAe,CACtB,GAAIA,EAAc,uBAAyB,GACzC,GAAI,CACFA,EAAc,QACZA,EAAc,QACd;;yEAEsB,CAExB,MAAMA,EAGV,MAAMA,EAEV,CAGA,qBAEEC,EACAC,EAAkB,CAElB,OAAOC,GAAW,KAAK,KAAMC,EAAQH,EAAmBC,CAAU,CACpE,CAEA,yBAEEA,EACAD,EAAiE,CAEjEE,GAAW,KAAK,KAAME,EAAqBJ,EAAmBC,CAAU,CAC1E,CAEA,iCAEEA,EACAI,EAAqC,CAErCH,GAAW,KACT,KACAI,EACAD,EACAJ,EACA5B,EAAgB,CAEpB,CAEA,mBAEE4B,EACAD,EAA0D,CAE1DE,GAAW,KAAK,KAAMK,EAAYP,EAAmBC,CAAU,CACjE,CAEA,2BAEEA,EACAI,EAA+B,CAE/BH,GAAW,KACT,KACAM,EACAH,EACAJ,EACA5B,EAAgB,CAEpB,CAEA,iBAEEoC,EACAR,EAAkB,CAElB,OAAOS,GAAa,KAAK,KAAMD,EAAYR,CAAU,CACvD,CAEA,sBAEEU,EACAV,EACAI,EAAiC,CAGjC,GADAO,GAAuBX,CAAU,EAC7B,CAACU,GAAcE,EAAIF,EAAY,UAAU,IAAM,GAAO,CACxD,IAAMG,EAAa,IAAI,MACrB,WAAWC,GAAad,CAAU,CAAC,uEACiB,KAAK,UACrDU,CAAU,CACX;2BAEQ,KAAK,mBAAmB,CAAC,EAAG,IACrC,GAAG,EAEP,MAAAG,EAAM,qBAAuB,GACvBA,EAGR,IAAME,EAAgBC,GAAK,KAAK,kBAAkB,EAC5CC,EAAWP,EAAW,SACtBQ,EAAkB,IAAIC,EAAY,CACtC,IAAKnB,EACL,gBAAiBiB,EACjB,MAAOb,GAAS,MAEhB,eAAgB,OACjB,EACD,OAAAW,EAAS,WAAW,KAAKG,CAAe,EAEjC,KAAK,UACRtC,GACKT,EACX,CAEA,sBAEEiD,EACApB,EACAI,EAA2B,CAG3B,GADAO,GAAuBX,CAAU,EAC7B,CAACqB,GAAoBD,CAAO,EAAG,CACjC,IAAMP,EAAa,IAAI,MACrB,WAAWC,GAAad,CAAU,CAAC,mEACa,KAAK,UACjDoB,CAAO,CACR;2BAEQ,KAAK,mBAAmB,CAAC,EAAG,IACrC,GAAG,EAEP,MAAAP,EAAM,qBAAuB,GACvBA,EAER,IAAME,EAAgBC,GAAK,KAAK,kBAAkB,EAC5CE,EAAkB,IAAII,EAAS,CACnC,IAAKtB,EACL,aAAcoB,EACd,MAAOhB,GAAS,MACjB,EACD,OAAAW,EAAS,WAAW,KAAKG,CAAe,EAEjCxC,EACT,GAGF,SAASuB,GACPsB,EACAC,EACAxB,EACAyB,EAAqB,GAAK,CAE1Bd,GAAuBX,CAAU,EACjC,IAAMe,EAAgBC,GAAK,KAAK,kBAAkB,EAC5CU,EAAgBC,GAAWH,CAAW,EAAIA,EAAcA,EAAY,IAEpEI,EAAU,IAAIL,EAAgB,CAAE,WAAY,CAAA,EAAI,IAAKvB,CAAU,CAAE,EACvE,OAAIyB,IACFG,EAAQ,UAAYJ,EAAY,KAE9BZ,EAAIY,EAAa,eAAe,IAClCI,EAAQ,aAAeJ,EAAY,eAGrC,KAAK,mBAAmB,KAAKI,CAAO,EACpCF,EAAc,KAAK,IAAI,EACvBX,EAAS,WAAW,KAAKa,CAAO,EAChC,KAAK,mBAAmB,IAAG,EAEpBzD,EACT,CAxBSW,EAAAmB,GAAA,cA0BT,SAASQ,GAAae,EAAkBxB,EAAkB,CACxDW,GAAuBX,CAAU,EACjC,IAAMe,EAAgBC,GAAK,KAAK,kBAAkB,EAE5Ca,EAAaC,GAAQN,CAAW,IAAM,GACtCO,EACJF,IAAe,GAAQL,EAAcA,EAAY,IAE7CQ,EAAY,IAAIC,EAAY,CAChC,WAAY,CAAA,EACZ,IAAKjC,EACL,kBAAmB6B,GAAcL,EAAY,qBAAuB,GACrE,EACGZ,EAAIY,EAAa,eAAe,IAClCQ,EAAU,aAAeR,EAAY,eAGvC,IAAMU,EAAgBC,GAAKJ,EAAOK,GAAiBT,GAAWS,EAAQ,IAAI,CAAC,EAC3E,OAAAJ,EAAU,cAAgBE,EAE1BnB,EAAS,WAAW,KAAKiB,CAAS,EAElCK,EAAQN,EAAOK,GAAW,CACxB,IAAME,EAAc,IAAIC,EAAY,CAAE,WAAY,CAAA,CAAE,CAAE,EACtDP,EAAU,WAAW,KAAKM,CAAW,EACjC1B,EAAIwB,EAAS,oBAAoB,EACnCE,EAAY,kBAAoBF,EAAQ,mBAGjCxB,EAAIwB,EAAS,MAAM,IAC1BE,EAAY,kBAAoB,IAElC,KAAK,mBAAmB,KAAKA,CAAW,EACxCF,EAAQ,IAAI,KAAK,IAAI,EACrB,KAAK,mBAAmB,IAAG,CAC7B,CAAC,EACMjE,EACT,CArCSW,EAAA2B,GAAA,gBAuCT,SAASK,GAAa7B,EAAW,CAC/B,OAAOA,IAAQ,EAAI,GAAK,GAAGA,CAAG,EAChC,CAFSH,EAAAgC,GAAA,gBAIT,SAASH,GAAuB1B,EAAW,CACzC,GAAIA,EAAM,GAAKA,EAAMZ,GAAgB,CACnC,IAAMwC,EAAa,IAAI,MAErB,kCAAkC5B,CAAG;wDAEjCZ,GAAiB,CACnB,EAAE,EAEN,MAAAwC,EAAM,qBAAuB,GACvBA,EAEV,CAZS/B,EAAA6B,GAAA,0BClbH,IAAO6B,GAAP,KAAwB,CAR9B,MAQ8B,CAAAC,EAAA,0BAK5B,sBAAsBC,EAAqB,CACzC,GAAIC,EAAID,EAAQ,eAAe,EAAG,CAChC,IAAME,EAAoBF,EAAO,cAC3BG,EAAgB,OAAOD,GAAsB,SACnD,KAAK,kBAAoBC,EACbD,EACR,IACJ,KAAK,cAAgBC,EACjBD,EAAoB,EACnBA,OAEL,KAAK,kBAAoB,EACzB,KAAK,cAAgBE,GAAsB,cAG7C,KAAK,gBAAkB,EACzB,CAEA,WAAmCC,EAAmBC,EAAkB,CAGtE,GAAI,KAAK,gBAAkB,GAAM,CAC/B,KAAK,kBACL,IAAMC,EAAS,IAAI,MAAM,KAAK,gBAAkB,CAAC,EAAE,KAAK,GAAI,EACxD,KAAK,gBAAkB,KAAK,mBAC9B,QAAQ,IAAI,GAAGA,CAAM,QAAQF,CAAS,GAAG,EAE3C,GAAM,CAAE,KAAAG,EAAM,MAAAC,CAAK,EAAKC,GAAMJ,CAAS,EAEjCK,EAAcH,EAAO,GAAK,QAAQ,KAAO,QAAQ,IACvD,OAAI,KAAK,gBAAkB,KAAK,mBAC9BG,EAAY,GAAGJ,CAAM,QAAQF,CAAS,WAAWG,CAAI,IAAI,EAE3D,KAAK,kBACEC,MAEP,QAAOH,EAAS,CAEpB,GCpDI,SAAUM,GAAYC,EAAkBC,EAAgB,CAC5DA,EAAU,QAASC,GAAY,CAC7B,IAAMC,EAAYD,EAAS,UAC3B,OAAO,oBAAoBC,CAAS,EAAE,QAASC,GAAY,CACzD,GAAIA,IAAa,cACf,OAGF,IAAMC,EAAqB,OAAO,yBAChCF,EACAC,CAAQ,EAIRC,IACCA,EAAmB,KAAOA,EAAmB,KAE9C,OAAO,eACLL,EAAY,UACZI,EACAC,CAAkB,EAGpBL,EAAY,UAAUI,CAAQ,EAAIF,EAAS,UAAUE,CAAQ,CAEjE,CAAC,CACH,CAAC,CACH,CA3BgBE,EAAAP,GAAA,eCuCT,IAAMQ,GAAcC,GACzBC,GACA,GACA,IACA,IACA,IACA,IACA,IACA,GAAG,EAEL,OAAO,OAAOF,EAAW,EAIlB,IAAMG,GAET,OAAO,OAAO,CAChB,gBAAiB,GACjB,aAAc,EACd,qBAAsB,GACtB,UAAW,GACX,qBAAsBC,GACtB,qBAAsB,OACtB,cAAe,GACf,gBAAiB,GAClB,EAEYC,GAAkD,OAAO,OAAO,CAC3E,kBAAmBC,EAAA,IAAG,GAAH,qBACnB,cAAe,GAChB,EAEWC,IAAZ,SAAYA,EAAyB,CACnCA,EAAAA,EAAA,kBAAA,CAAA,EAAA,oBACAA,EAAAA,EAAA,oBAAA,CAAA,EAAA,sBACAA,EAAAA,EAAA,sBAAA,CAAA,EAAA,wBACAA,EAAAA,EAAA,sBAAA,CAAA,EAAA,wBACAA,EAAAA,EAAA,uBAAA,CAAA,EAAA,yBACAA,EAAAA,EAAA,eAAA,CAAA,EAAA,iBACAA,EAAAA,EAAA,oBAAA,CAAA,EAAA,sBACAA,EAAAA,EAAA,eAAA,CAAA,EAAA,iBACAA,EAAAA,EAAA,gCAAA,CAAA,EAAA,kCACAA,EAAAA,EAAA,mBAAA,CAAA,EAAA,qBACAA,EAAAA,EAAA,uBAAA,EAAA,EAAA,yBACAA,EAAAA,EAAA,sBAAA,EAAA,EAAA,wBACAA,EAAAA,EAAA,cAAA,EAAA,EAAA,gBACAA,EAAAA,EAAA,4BAAA,EAAA,EAAA,6BACF,GAfYA,KAAAA,GAAyB,CAAA,EAAA,EAoD/B,SAAUC,GAAUC,EAAa,OAAS,CAC9C,OAAO,UAAA,CACL,OAAOA,CACT,CACF,CAJgBH,EAAAE,GAAA,aAMV,IAAOE,GAAP,MAAOC,CAAM,CAjInB,MAiImB,CAAAL,EAAA,eAYjB,OAAO,oBAAoBM,EAAsB,CAC/C,MAAM,MACJ,4HAC+D,CAEnE,CAEO,qBAAmB,CACxB,KAAK,WAAW,sBAAuB,IAAK,CAC1C,IAAIC,EAEJ,KAAK,iBAAmB,GACxB,IAAMC,EAAY,KAAK,UAEvB,KAAK,WAAW,cAAe,IAAK,CAIlCC,GAAiB,IAAI,CACvB,CAAC,EAED,KAAK,WAAW,oBAAqB,IAAK,CACxC,GAAI,CACF,KAAK,gBAAe,EAEpBC,EAAQ,KAAK,kBAAoBC,GAAgB,CAI/C,IAAMC,EAHe,KACnBD,CAAY,EAE4B,sBACtCE,EACJ,KAAK,WAAW,GAAGF,CAAY,QAAS,IAAK,CAC3CE,EAAmB,KAAK,mBACtBF,EACAC,CAAqB,CAEzB,CAAC,EACD,KAAK,qBAAqBD,CAAY,EAAIE,CAC5C,CAAC,UAED,KAAK,iBAAgB,EAEzB,CAAC,EAED,IAAIC,EAA2C,CAAA,EAmD/C,GAlDA,KAAK,WAAW,oBAAqB,IAAK,CACxCA,EAAiBC,GAAe,CAC9B,MAAOC,GAAO,KAAK,oBAAoB,EACxC,EACD,KAAK,iBAAmB,KAAK,iBAAiB,OAAOF,CAAc,CACrE,CAAC,EAED,KAAK,WAAW,sBAAuB,IAAK,CAG1C,GAAIG,EAAQH,CAAc,GAAK,KAAK,kBAAoB,GAAO,CAC7D,IAAMI,EAAmBC,GAAgB,CACvC,MAAOH,GAAO,KAAK,oBAAoB,EACvC,WAAYA,GAAO,KAAK,SAAS,EACjC,eAAgBI,GAChB,YAAaZ,EACd,EACKa,EAA4BC,GAAkB,CAClD,kBAAmB,KAAK,kBACxB,MAAON,GAAO,KAAK,oBAAoB,EACvC,WAAYA,GAAO,KAAK,SAAS,EACjC,YAAaR,EACd,EACD,KAAK,iBAAmB,KAAK,iBAAiB,OAC5CU,EACAG,CAAyB,EAG/B,CAAC,EAGGJ,EAAQ,KAAK,gBAAgB,IAE3B,KAAK,iBACP,KAAK,WAAW,yBAA0B,IAAK,CAC7C,IAAMM,EAAaC,GACjBR,GAAO,KAAK,oBAAoB,CAAC,EAEnC,KAAK,cAAgBO,CACvB,CAAC,EAGH,KAAK,WAAW,4BAA6B,IAAK,UAChDE,GAAAC,EAAA,KAAK,mBAAkB,cAAU,MAAAD,IAAA,QAAAA,EAAA,KAAAC,EAAG,CAClC,MAAOV,GAAO,KAAK,oBAAoB,EACxC,EACD,KAAK,6BAA6BA,GAAO,KAAK,oBAAoB,CAAC,CACrE,CAAC,GAID,CAACX,EAAO,kCACR,CAACY,EAAQ,KAAK,gBAAgB,EAE9B,MAAAV,EAAgBoB,EACd,KAAK,iBACJC,GAAaA,EAAS,OAAO,EAE1B,IAAI,MACR;GAAwCrB,EAAc,KACpD;;CAAqC,CACtC,EAAE,CAGT,CAAC,CACH,CAMA,YAAYsB,EAAkCC,EAAqB,CAJnE,KAAA,iBAA6C,CAAA,EAC7C,KAAA,iBAAmB,GAIjB,IAAMC,EAAsB,KAW5B,GAVAA,EAAK,iBAAiBD,CAAM,EAC5BC,EAAK,iBAAgB,EACrBA,EAAK,eAAeD,CAAM,EAC1BC,EAAK,qBAAqBF,EAAiBC,CAAM,EACjDC,EAAK,gBAAgBD,CAAM,EAC3BC,EAAK,gBAAgBD,CAAM,EAC3BC,EAAK,kBAAiB,EACtBA,EAAK,iBAAiBD,CAAM,EAC5BC,EAAK,sBAAsBD,CAAM,EAE7BE,EAAIF,EAAQ,eAAe,EAC7B,MAAM,IAAI,MACR;;;sBAGwB,EAI5B,KAAK,gBAAkBE,EAAIF,EAAQ,iBAAiB,EAC/CA,EAAO,gBACRjC,GAAsB,eAC5B,GAjJOO,GAAA,iCAA4C,GAoJrD6B,GAAY7B,GAAQ,CAClB8B,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACD,EAaK,IAAOC,GAAP,cAAqCC,EAAM,CApTjD,MAoTiD,CAAAC,EAAA,8BAC/C,YACEC,EACAC,EAAgCC,GAAqB,CAErD,IAAMC,EAAcC,GAAMH,CAAM,EAChCE,EAAY,UAAY,GACxB,MAAMH,EAAiBG,CAAW,CACpC,GCnSI,SAAUE,GAAYC,EAAYC,EAA+BC,EAAkB,CACrF,MAAO,GAAGF,EAAK,IAAI,IAAIC,CAAI,IAAIC,CAAU,EAC7C,CAFgBC,EAAAJ,GAAA,eAaT,IAAMK,GAAY,EACZC,GAAiB,EACjBC,GAAuB,EACvBC,GAAuB,EAG7B,IAAMC,GAAgB,EAChBC,GAAgB,EAChBC,GAAqB,EACrBC,GAAsB,GACtBC,GAAqB,GACrBC,GAAe,GAuFNC,GAAhB,KAAkC,CAxIxC,MAwIwC,CAAAC,EAAA,2BAGpC,YAAYC,EAAgB,CACxB,KAAK,OAASA,CAClB,CAEA,WAAS,CACL,MAAO,EACX,GAGSC,GAAP,cAA8BH,EAAkB,CApJtD,MAoJsD,CAAAC,EAAA,uBAGlD,YAAYC,EAAkBE,EAAoB,CAC9C,MAAMF,CAAM,EACZ,KAAK,UAAYE,CACrB,GAGSC,GAAP,cAAiCL,EAAkB,CA7JzD,MA6JyD,CAAAC,EAAA,0BACrD,YAAYC,EAAgB,CACxB,MAAMA,CAAM,CAChB,CAEA,WAAS,CACL,MAAO,EACX,GAGSI,GAAP,cAA8BN,EAAkB,CAvKtD,MAuKsD,CAAAC,EAAA,uBAIlD,YAAYM,EAA2BC,EAAYC,EAAqB,CACpE,MAAMF,CAAS,EACf,KAAK,KAAOC,EACZ,KAAK,YAAcC,CACvB,CAEA,WAAS,CACL,MAAO,EACX,GAQE,SAAUC,GAAUC,EAAa,CACnC,IAAMC,EAAW,CACb,YAAa,CAAA,EACb,eAAgB,CAAA,EAChB,iBAAkB,IAAI,IACtB,gBAAiB,IAAI,IACrB,OAAQ,CAAA,GAEZC,GAAgCD,EAAKD,CAAK,EAC1C,IAAMG,EAAaH,EAAM,OACzB,QAASI,EAAI,EAAGA,EAAID,EAAYC,IAAK,CACjC,IAAMP,EAAOG,EAAMI,CAAC,EACdC,EAAYC,GAAML,EAAKJ,EAAMA,CAAI,EACnCQ,IAAc,QAGlBE,GAAgBN,EAAKJ,EAAMQ,CAAS,EAExC,OAAOJ,CACX,CAnBgBX,EAAAS,GAAA,aAqBhB,SAASG,GAAgCD,EAAUD,EAAa,CAC5D,IAAMG,EAAaH,EAAM,OACzB,QAASI,EAAI,EAAGA,EAAID,EAAYC,IAAK,CACjC,IAAMP,EAAOG,EAAMI,CAAC,EACdI,EAAQC,GAAyBR,EAAKJ,EAAM,OAAW,CACzD,KAAMa,GACT,EACKC,EAAOF,GAAwBR,EAAKJ,EAAM,OAAW,CACvD,KAAMd,GACT,EACDyB,EAAM,KAAOG,EACbV,EAAI,iBAAiB,IAAIJ,EAAMW,CAAK,EACpCP,EAAI,gBAAgB,IAAIJ,EAAMc,CAAI,EAE1C,CAdSrB,EAAAY,GAAA,mCAgBT,SAASU,GACLX,EACAJ,EACAgB,EAAuB,CAEvB,OAAIA,aAAsBC,EACfC,GAASd,EAAKJ,EAAMgB,EAAW,aAAcA,CAAU,EACvDA,aAAsBG,EACtBC,GAAQhB,EAAKJ,EAAMgB,CAAU,EAC7BA,aAAsBK,EACtBC,GAAYlB,EAAKJ,EAAMgB,CAAU,EACjCA,aAAsBO,EACtBC,GAAOpB,EAAKJ,EAAMgB,CAAU,EAC5BA,aAAsBS,EACtBC,GAAWtB,EAAKJ,EAAMgB,CAAU,EAChCA,aAAsBW,EACtBC,GAAcxB,EAAKJ,EAAMgB,CAAU,EACnCA,aAAsBa,EACtBC,GAAoB1B,EAAKJ,EAAMgB,CAAU,EACzCA,aAAsBe,EACtBC,GAAuB5B,EAAKJ,EAAMgB,CAAU,EAE5CP,GAAML,EAAKJ,EAAMgB,CAAyB,CAEzD,CAxBSvB,EAAAsB,GAAA,QA0BT,SAASW,GAAWtB,EAAUJ,EAAY0B,EAAsB,CAC5D,IAAMO,EAAYrB,GAA8BR,EAAKJ,EAAM0B,EAAY,CACnE,KAAMQ,GACT,EACDC,GAAoB/B,EAAK6B,CAAS,EAClC,IAAMG,EAASC,GACXjC,EACAJ,EACAiC,EACAP,EACAjB,GAAML,EAAKJ,EAAM0B,CAAU,CAAC,EAEhC,OAAOY,GAAKlC,EAAKJ,EAAM0B,EAAYU,CAAM,CAC7C,CAbS3C,EAAAiC,GAAA,cAeT,SAASE,GACLxB,EACAJ,EACA0B,EAAmC,CAEnC,IAAMO,EAAYrB,GAA8BR,EAAKJ,EAAM0B,EAAY,CACnE,KAAMQ,GACT,EACDC,GAAoB/B,EAAK6B,CAAS,EAClC,IAAMG,EAASC,GACXjC,EACAJ,EACAiC,EACAP,EACAjB,GAAML,EAAKJ,EAAM0B,CAAU,CAAC,EAE1Ba,EAAMrB,GAASd,EAAKJ,EAAM0B,EAAW,UAAWA,CAAU,EAChE,OAAOY,GAAKlC,EAAKJ,EAAM0B,EAAYU,EAAQG,CAAG,CAClD,CAlBS9C,EAAAmC,GAAA,iBAoBT,SAASE,GACL1B,EACAJ,EACA0B,EAA+B,CAE/B,IAAMc,EAAY5B,GAA8BR,EAAKJ,EAAM0B,EAAY,CACnE,KAAMe,GACT,EACDN,GAAoB/B,EAAKoC,CAAS,EAClC,IAAMJ,EAASC,GACXjC,EACAJ,EACAwC,EACAd,EACAjB,GAAML,EAAKJ,EAAM0B,CAAU,CAAC,EAEhC,OAAOgB,GAAKtC,EAAKJ,EAAM0B,EAAYU,CAAM,CAC7C,CAjBS3C,EAAAqC,GAAA,uBAmBT,SAASE,GACL5B,EACAJ,EACA0B,EAA4C,CAE5C,IAAMc,EAAY5B,GAA8BR,EAAKJ,EAAM0B,EAAY,CACnE,KAAMe,GACT,EACDN,GAAoB/B,EAAKoC,CAAS,EAClC,IAAMJ,EAASC,GACXjC,EACAJ,EACAwC,EACAd,EACAjB,GAAML,EAAKJ,EAAM0B,CAAU,CAAC,EAE1Ba,EAAMrB,GAASd,EAAKJ,EAAM0B,EAAW,UAAWA,CAAU,EAChE,OAAOgB,GAAKtC,EAAKJ,EAAM0B,EAAYU,EAAQG,CAAG,CAClD,CAlBS9C,EAAAuC,GAAA,0BAoBT,SAASV,GACLlB,EACAJ,EACAsB,EAAwB,CAExB,IAAMX,EAAQC,GAA+BR,EAAKJ,EAAMsB,EAAa,CACjE,KAAMqB,GACT,EACDR,GAAoB/B,EAAKO,CAAK,EAC9B,IAAMiC,EAAOC,EAAIvB,EAAY,WAAawB,GAAM/B,GAAKX,EAAKJ,EAAM8C,CAAC,CAAC,EAElE,OADeT,GAASjC,EAAKJ,EAAMW,EAAOW,EAAa,GAAGsB,CAAI,CAElE,CAZSnD,EAAA6B,GAAA,eAcT,SAASE,GAAOpB,EAAUJ,EAAYwB,EAAc,CAChD,IAAMb,EAAQC,GAA+BR,EAAKJ,EAAMwB,EAAQ,CAC5D,KAAMmB,GACT,EACDR,GAAoB/B,EAAKO,CAAK,EAC9B,IAAMyB,EAASC,GAASjC,EAAKJ,EAAMW,EAAOa,EAAQf,GAAML,EAAKJ,EAAMwB,CAAM,CAAC,EAC1E,OAAOuB,GAAS3C,EAAKJ,EAAMwB,EAAQY,CAAM,CAC7C,CAPS3C,EAAA+B,GAAA,UAST,SAASf,GACLL,EACAJ,EACAS,EAAoC,CAEpC,IAAMuC,EAAUC,GACZJ,EAAIpC,EAAM,WAAaqC,GAAM/B,GAAKX,EAAKJ,EAAM8C,CAAC,CAAC,EAC9CA,GAAMA,IAAM,MAAS,EAE1B,OAAIE,EAAQ,SAAW,EACZA,EAAQ,CAAC,EACTA,EAAQ,SAAW,EAC1B,OAEOE,GAAU9C,EAAK4C,CAAO,CAErC,CAhBSvD,EAAAgB,GAAA,SAkBT,SAASiC,GACLtC,EACAJ,EACA0C,EACAN,EACAG,EAAe,CAEf,IAAMY,EAAWf,EAAO,KAClBgB,EAAShB,EAAO,MAEhBiB,EAAOzC,GAA4BR,EAAKJ,EAAM0C,EAAM,CACtD,KAAMpD,GACT,EACD6C,GAAoB/B,EAAKiD,CAAI,EAC7B,IAAMC,EAAM1C,GAAuBR,EAAKJ,EAAM0C,EAAM,CAChD,KAAMnD,GACT,EACD,OAAA4D,EAAS,SAAWE,EACpBC,EAAI,SAAWD,EACfjD,EAAI,YAAYmD,GAAYvD,EAAMuC,EAAM,mCAAqC,sBAAuBG,EAAK,GAAG,CAAC,EAAIW,EACjHG,GAAQJ,EAAQC,CAAI,EAIhBd,IAAQ,QACRiB,GAAQH,EAAMF,CAAQ,EACtBK,GAAQH,EAAMC,CAAG,IAEjBE,GAAQH,EAAMC,CAAG,EAEjBE,GAAQH,EAAMd,EAAI,IAAI,EACtBiB,GAAQjB,EAAI,MAAOY,CAAQ,GAGxB,CACH,KAAMA,EACN,MAAOG,EAEf,CAtCS7D,EAAAiD,GAAA,QAwCT,SAASJ,GACLlC,EACAJ,EACAsC,EACAF,EACAG,EAAe,CAEf,IAAM5B,EAAQyB,EAAO,KACfkB,EAAMlB,EAAO,MAEbqB,EAAQ7C,GAA6BR,EAAKJ,EAAMsC,EAAM,CACxD,KAAMjD,GACT,EACD8C,GAAoB/B,EAAKqD,CAAK,EAC9B,IAAMC,EAAU9C,GAAuBR,EAAKJ,EAAMsC,EAAM,CACpD,KAAM/C,GACT,EACK8D,EAAOzC,GAA4BR,EAAKJ,EAAMsC,EAAM,CACtD,KAAMlD,GACT,EACD,OAAAqE,EAAM,SAAWJ,EACjBK,EAAQ,SAAWL,EAEnBG,GAAQC,EAAO9C,CAAK,EACpB6C,GAAQC,EAAOC,CAAO,EACtBF,GAAQF,EAAKD,CAAI,EAEbd,IAAQ,QACRiB,GAAQH,EAAMK,CAAO,EAErBF,GAAQH,EAAMd,EAAI,IAAI,EACtBiB,GAAQjB,EAAI,MAAO5B,CAAK,GAExB6C,GAAQH,EAAMI,CAAK,EAGvBrD,EAAI,YAAYmD,GAAYvD,EAAMuC,EAAM,0BAA4B,aAAcD,EAAK,GAAG,CAAC,EAAImB,EACxF,CACH,KAAMA,EACN,MAAOC,EAEf,CAzCSjE,EAAA6C,GAAA,QA2CT,SAASS,GAAS3C,EAAUJ,EAAY+C,EAAkBX,EAAiB,CACvE,IAAMzB,EAAQyB,EAAO,KACfkB,EAAMlB,EAAO,MAEnB,OAAAoB,GAAQ7C,EAAO2C,CAAG,EAElBlD,EAAI,YAAYmD,GAAYvD,EAAM,SAAU+C,EAAS,GAAG,CAAC,EAAIpC,EACtDyB,CACX,CARS3C,EAAAsD,GAAA,YAUT,SAASZ,GAAoB/B,EAAUuD,EAAoB,CACvD,OAAAvD,EAAI,eAAe,KAAKuD,CAAK,EAC7BA,EAAM,SAAWvD,EAAI,eAAe,OAAS,EACtCuD,EAAM,QACjB,CAJSlE,EAAA0C,GAAA,uBAMT,SAASE,GACLjC,EACAJ,EACAW,EACAK,KACG4B,EAA+B,CAElC,IAAMU,EAAM1C,GAAwBR,EAAKJ,EAAMgB,EAAY,CACvD,KAAM7B,GACN,MAAAwB,EACH,EACDA,EAAM,IAAM2C,EACZ,QAAWM,KAAOhB,EACVgB,IAAQ,QAERJ,GAAQ7C,EAAOiD,EAAI,IAAI,EACvBJ,GAAQI,EAAI,MAAON,CAAG,GAEtBE,GAAQ7C,EAAO2C,CAAG,EAI1B,IAAMlB,EAAoB,CACtB,KAAMzB,EACN,MAAO2C,GAEX,OAAAlD,EAAI,YAAYmD,GAAYvD,EAAM6D,GAAY7C,CAAU,EAAGA,EAAW,GAAG,CAAC,EAAIL,EACvEyB,CACX,CA5BS3C,EAAA4C,GAAA,YA8BT,SAASwB,GAAY7C,EAAuB,CACxC,GAAIA,aAAsBK,EACtB,MAAO,cACJ,GAAIL,aAAsBO,EAC7B,MAAO,SACJ,GAAIP,aAAsBS,EAC7B,MAAO,aACJ,GAAIT,aAAsBW,EAC7B,MAAO,0BACJ,GAAIX,aAAsBa,EAC7B,MAAO,sBACJ,GAAIb,aAAsBe,EAC7B,MAAO,mCAEP,MAAM,IAAI,MAAM,qCAAqC,CAE7D,CAhBStC,EAAAoE,GAAA,eAkBT,SAASX,GAAU9C,EAAUwC,EAAiB,CAC1C,IAAMkB,EAAalB,EAAK,OACxB,QAASrC,EAAI,EAAGA,EAAIuD,EAAa,EAAGvD,IAAK,CACrC,IAAM6B,EAASQ,EAAKrC,CAAC,EACjBwD,EACA3B,EAAO,KAAK,YAAY,SAAW,IACnC2B,EAAa3B,EAAO,KAAK,YAAY,CAAC,GAE1C,IAAM4B,EAAmBD,aAAsBjE,GACzCmE,EAAiBF,EACjBG,EAAOtB,EAAKrC,EAAI,CAAC,EAAE,KAErB6B,EAAO,KAAK,OAASO,IACrBP,EAAO,MAAM,OAASO,IACtBoB,IAAe,SACbC,GAAoBC,EAAe,cAAgB7B,EAAO,OACxD2B,EAAW,SAAW3B,EAAO,QAG7B4B,EACAC,EAAe,YAAcC,EAE7BH,EAAW,OAASG,EAExBC,GAAY/D,EAAKgC,EAAO,KAAK,GAG7BoB,GAAQpB,EAAO,MAAO8B,CAAI,EAIlC,IAAME,EAAQxB,EAAK,CAAC,EACdyB,EAAOzB,EAAKkB,EAAa,CAAC,EAChC,MAAO,CACH,KAAMM,EAAM,KACZ,MAAOC,EAAK,MAEpB,CArCS5E,EAAAyD,GAAA,aAuCT,SAAShC,GACLd,EACAJ,EACAJ,EACAoB,EAAqC,CAErC,IAAMsD,EAAO1D,GAAqBR,EAAKJ,EAAMgB,EAAY,CACrD,KAAM2B,GACT,EACK4B,EAAQ3D,GAAqBR,EAAKJ,EAAMgB,EAAY,CACtD,KAAM2B,GACT,EACD,OAAA6B,GAAcF,EAAM,IAAI3E,GAAe4E,EAAO3E,CAAS,CAAC,EACjD,CACH,KAAA0E,EACA,MAAAC,EAER,CAjBS9E,EAAAyB,GAAA,YAmBT,SAASE,GACLhB,EACAqE,EACAC,EAAwB,CAExB,IAAM1E,EAAO0E,EAAY,eACnB/D,EAAQP,EAAI,iBAAiB,IAAIJ,CAAI,EACrCsE,EAAO1D,GAA+BR,EAAKqE,EAAaC,EAAa,CACvE,KAAM/B,GACT,EACK4B,EAAQ3D,GAA+BR,EAAKqE,EAAaC,EAAa,CACxE,KAAM/B,GACT,EAEKgC,EAAO,IAAI7E,GAAea,EAAOX,EAAMuE,CAAK,EAClD,OAAAC,GAAcF,EAAMK,CAAI,EAEjB,CACH,KAAAL,EACA,MAAAC,EAER,CArBS9E,EAAA2B,GAAA,WAuBT,SAASV,GAAgBN,EAAUJ,EAAYS,EAAgB,CAC3D,IAAME,EAAQP,EAAI,iBAAiB,IAAIJ,CAAI,EAC3CwD,GAAQ7C,EAAOF,EAAM,IAAI,EACzB,IAAMK,EAAOV,EAAI,gBAAgB,IAAIJ,CAAI,EACzC,OAAAwD,GAAQ/C,EAAM,MAAOK,CAAI,EACC,CACtB,KAAMH,EACN,MAAOG,EAGf,CAVSrB,EAAAiB,GAAA,mBAYT,SAAS8C,GAAQoB,EAAiBC,EAAe,CAC7C,IAAMd,EAAa,IAAIlE,GAAkBgF,CAAa,EACtDL,GAAcI,EAAGb,CAAU,CAC/B,CAHStE,EAAA+D,GAAA,WAKT,SAAS5C,GACLR,EACAJ,EACAgB,EACA8D,EAAmB,CAEnB,IAAMC,EAAO,OAAA,OAAA,CACT,IAAA3E,EACA,WAAAY,EACA,uBAAwB,GACxB,KAAAhB,EACA,YAAa,CAAA,EACb,oBAAqB,CAAA,EACrB,YAAaI,EAAI,OAAO,MAAM,EAC3B0E,CAAO,EAEd,OAAA1E,EAAI,OAAO,KAAK2E,CAAC,EACVA,CACX,CAlBStF,EAAAmB,GAAA,YAoBT,SAAS4D,GAAcb,EAAqBI,EAAsB,CAG1DJ,EAAM,YAAY,SAAW,IAC7BA,EAAM,uBAAyBI,EAAW,UAAS,GAEvDJ,EAAM,YAAY,KAAKI,CAAU,CACrC,CAPStE,EAAA+E,GAAA,iBAST,SAASL,GAAY/D,EAAUuD,EAAe,CAC1CvD,EAAI,OAAO,OAAOA,EAAI,OAAO,QAAQuD,CAAK,EAAG,CAAC,CAClD,CAFSlE,EAAA0E,GAAA,eCxmBF,IAAMa,GAAY,CAAA,EAQZC,GAAP,KAAmB,CA/BzB,MA+ByB,CAAAC,EAAA,qBAAzB,aAAA,CACU,KAAA,IAA8B,CAAA,EAC9B,KAAA,QAAuB,CAAA,CAsCjC,CAlCE,IAAI,MAAI,CACN,OAAO,KAAK,QAAQ,MACtB,CAEA,UAAQ,CAEN,KAAK,IAAM,CAAA,CACb,CAEA,IAAIC,EAAiB,CACnB,IAAMC,EAAMC,GAAgBF,CAAM,EAG5BC,KAAO,KAAK,MAChB,KAAK,IAAIA,CAAG,EAAI,KAAK,QAAQ,OAC7B,KAAK,QAAQ,KAAKD,CAAM,EAE5B,CAEA,IAAI,UAAQ,CACV,OAAO,KAAK,OACd,CAEA,IAAI,MAAI,CACN,OAAOG,EAAI,KAAK,QAAU,GAAM,EAAE,GAAG,CACvC,CAEA,IAAI,KAAG,CACL,IAAIC,EAAQ,GACZ,QAAWC,KAAK,KAAK,IACnBD,GAASC,EAAI,IAEf,OAAOD,CACT,GAGI,SAAUF,GAAgBF,EAAmBM,EAAM,GAAI,CAC3D,MAAO,GAAGA,EAAM,IAAIN,EAAO,GAAG,GAAK,EAAE,IACnCA,EAAO,MAAM,WACf,IAAIA,EAAO,MAAM,IAAKO,GAAMA,EAAE,YAAY,SAAQ,CAAE,EAAE,KAAK,GAAG,CAAC,EACjE,CAJgBR,EAAAG,GAAA,mBCZhB,SAASM,GAAeC,EAA2BC,EAAgB,CAC/D,IAAMC,EAAuC,CAAA,EAC7C,OAAQC,GAAgB,CACpB,IAAMC,EAAMD,EAAa,SAAQ,EAC7BE,EAAWH,EAAIE,CAAG,EACtB,OAAIC,IAAa,SAGbA,EAAW,CACP,cAAeL,EACf,SAAAC,EACA,OAAQ,CAAA,GAEZC,EAAIE,CAAG,EAAIC,GACJA,CAEf,CACJ,CAjBSC,EAAAP,GAAA,kBAmBT,IAAMQ,GAAN,KAAkB,CAhFlB,MAgFkB,CAAAD,EAAA,qBAAlB,aAAA,CACY,KAAA,WAAwB,CAAA,CAkBpC,CAhBI,GAAGE,EAAa,CACZ,OAAOA,GAAS,KAAK,WAAW,QAAU,KAAK,WAAWA,CAAK,CACnE,CAEA,IAAIA,EAAeC,EAAc,CAC7B,KAAK,WAAWD,CAAK,EAAIC,CAC7B,CAEA,UAAQ,CACJ,IAAIA,EAAQ,GACNC,EAAO,KAAK,WAAW,OAC7B,QAASC,EAAI,EAAGA,EAAID,EAAMC,IACtBF,GAAS,KAAK,WAAWE,CAAC,IAAM,GAAO,IAAM,IAEjD,OAAOF,CACX,GASEG,GAAmB,IAAIL,GAMhBM,GAAP,cAAuCC,EAAoB,CAjHjE,MAiHiE,CAAAR,EAAA,gCAM7D,YAAYS,EAAgC,OACxC,MAAK,EACL,KAAK,SAAUC,EAAAD,GAAS,WAAO,MAAAC,IAAA,OAAAA,GAAMC,GAAY,QAAQ,IAAIA,CAAO,EACxE,CAES,WAAWF,EAA0B,CAC1C,KAAK,IAAMG,GAAUH,EAAQ,KAAK,EAClC,KAAK,KAAOI,GAAiB,KAAK,GAAG,CACzC,CAES,0CAAwC,CAC7C,MAAO,CAAA,CACX,CAES,6BAA2B,CAChC,MAAO,CAAA,CACX,CAES,6BAA6BJ,EAMrC,CACG,GAAM,CAAE,eAAAK,EAAgB,KAAAC,EAAM,cAAAC,EAAe,qBAAAC,CAAoB,EAAKR,EAChES,EAAO,KAAK,KACZC,EAAU,KAAK,QACfrB,EAAMsB,GAAYL,EAAM,cAAeD,CAAc,EAErDO,EADgB,KAAK,IAAI,YAAYvB,CAAG,EACV,SAC9BwB,EAA2CC,EAC7CC,GAAkB,CACd,aAAc,EACd,WAAYV,EACZ,SAAU,cACV,KAAMC,EACT,EACAU,GAAYF,EAAIE,EAAUC,GAASA,EAAK,CAAC,CAAC,CAAC,EAGhD,GAAIC,GAAcL,EAAa,EAAK,GAAK,CAACL,EAAsB,CAC5D,IAAMW,EAAcC,GAChBP,EACA,CAACQ,EAAQL,EAASM,KACdC,EAAQP,EAAUQ,GAAe,CACzBA,IACAH,EAAOG,EAAY,YAAa,EAAIF,EACpCC,EAAQC,EAAY,gBAAmBC,GAAqB,CACxDJ,EAAOI,CAAiB,EAAIH,CAChC,CAAC,EAET,CAAC,EACMD,GAEX,CAAA,CAA4B,EAGhC,OAAId,EACO,SAA4BmB,EAAM,OACrC,IAAMC,EAAY,KAAK,GAAG,CAAC,EACrBC,EAAiCT,EAAYQ,EAAU,YAAY,EACzE,GAAID,IAAW,QAAaE,IAAe,OAAW,CAClD,IAAMC,GAAO5B,EAAAyB,EAAOE,CAAU,KAAC,MAAA3B,IAAA,OAAA,OAAAA,EAAE,KACjC,GAAI4B,IAAS,QAAaA,EAAK,KAAK,IAAI,IAAM,GAC1C,OAGR,OAAOD,CACX,EAEO,UAAA,CACH,IAAMD,EAAY,KAAK,GAAG,CAAC,EAC3B,OAAOR,EAAYQ,EAAU,YAAY,CAC7C,MAED,QAAIpB,EACA,SAA4BmB,EAAM,CACrC,IAAMI,EAAa,IAAItC,GACjBuC,EAASL,IAAW,OAAY,EAAIA,EAAO,OACjD,QAAS9B,EAAI,EAAGA,EAAImC,EAAQnC,IAAK,CAC7B,IAAMiC,EAAOH,IAAS9B,CAAC,EAAE,KACzBkC,EAAW,IAAIlC,EAAGiC,IAAS,QAAaA,EAAK,KAAK,IAAI,CAAC,EAE3D,IAAMR,EAASW,GAAgB,KAAK,KAAMvB,EAAMG,EAAekB,EAAYpB,CAAO,EAClF,OAAO,OAAOW,GAAW,SAAWA,EAAS,MACjD,EAEO,UAAA,CACH,IAAMA,EAASW,GAAgB,KAAK,KAAMvB,EAAMG,EAAef,GAAkBa,CAAO,EACxF,OAAO,OAAOW,GAAW,SAAWA,EAAS,MACjD,CAER,CAES,0BAA0BrB,EAMlC,CACG,GAAM,CAAE,eAAAK,EAAgB,KAAAC,EAAM,SAAA2B,EAAU,qBAAAzB,CAAoB,EAAKR,EAC3DS,EAAO,KAAK,KACZC,EAAU,KAAK,QACfrB,EAAMsB,GAAYL,EAAM2B,EAAU5B,CAAc,EAEhDO,EADgB,KAAK,IAAI,YAAYvB,CAAG,EACV,SAC9B6C,EAAOpB,EACTC,GAAkB,CACd,aAAc,EACd,WAAYV,EACZ,SAAA4B,EACA,KAAA3B,EACH,EACA6B,GACQrB,EAAIqB,EAAIC,GAAMA,EAAE,CAAC,CAAC,CAC1B,EAGH,GAAIlB,GAAcgB,CAAI,GAAKA,EAAK,CAAC,EAAE,CAAC,GAAK,CAAC1B,EAAsB,CAC9D,IAAM6B,EAAMH,EAAK,CAAC,EACZI,EAAoBC,GAAQF,CAAG,EAErC,GACEC,EAAkB,SAAW,GAC7BE,EAAQF,EAAkB,CAAC,EAAE,eAAe,EAC5C,CAEA,IAAMG,EADoBH,EAAkB,CAAC,EACI,aAEjD,OAAO,UAAA,CACL,OAAO,KAAK,GAAG,CAAC,EAAE,eAAiBG,CACrC,MACK,CACL,IAAMtB,EAAcC,GAClBkB,EACA,CAACjB,EAAQG,KACHA,IAAgB,SAClBH,EAAOG,EAAY,YAAa,EAAI,GACpCD,EAAQC,EAAY,gBAAkBC,GAAqB,CACzDJ,EAAOI,CAAiB,EAAI,EAC9B,CAAC,GAEIJ,GAET,CAAA,CAA6B,EAG/B,OAAO,UAAA,CACL,IAAMM,EAAY,KAAK,GAAG,CAAC,EAC3B,OAAOR,EAAYQ,EAAU,YAAY,IAAM,EACjD,GAGJ,OAAO,UAAA,CACL,IAAMN,EAASW,GAAgB,KAAK,KAAMvB,EAAMG,EAAef,GAAkBa,CAAO,EACtF,OAAO,OAAOW,GAAW,SAAW,GAAQA,IAAW,CAC3D,CACN,GAIJ,SAASH,GAAcwB,EAAwCC,EAAa,GAAI,CAC5E,IAAMC,EAAU,IAAI,IAEpB,QAAWP,KAAOK,EAAW,CACzB,IAAMG,EAAS,IAAI,IACnB,QAAWC,KAAWT,EAAK,CACvB,GAAIS,IAAY,OAAW,CACvB,GAAIH,EAEA,MAEA,MAAO,GAGf,IAAMI,EAAU,CAACD,EAAQ,YAAa,EAAE,OAAOA,EAAQ,eAAgB,EACvE,QAAWrD,KAASsD,EAChB,GAAIH,EAAQ,IAAInD,CAAK,GACjB,GAAI,CAACoD,EAAO,IAAIpD,CAAK,EACjB,MAAO,QAGXmD,EAAQ,IAAInD,CAAK,EACjBoD,EAAO,IAAIpD,CAAK,GAKhC,MAAO,EACX,CA5BSF,EAAA2B,GAAA,iBA8BT,SAASd,GAAiB4C,EAAQ,CAC9B,IAAMC,EAAiBD,EAAI,eAAe,OACpCE,EAA4B,MAAMD,CAAc,EACtD,QAASrD,EAAI,EAAGA,EAAIqD,EAAgBrD,IAChCsD,EAActD,CAAC,EAAIZ,GAAegE,EAAI,eAAepD,CAAC,EAAGA,CAAC,EAE9D,OAAOsD,CACX,CAPS3D,EAAAa,GAAA,oBAST,SAAS4B,GAELmB,EACAjE,EACAE,EACAsB,EAAwB,CAExB,IAAM0C,EAAMD,EAAUjE,CAAQ,EAAEE,CAAY,EACxCiE,EAAQD,EAAI,MAChB,GAAIC,IAAU,OAAW,CACrB,IAAMC,EAAUC,GAAkBH,EAAI,aAAyB,EAC/DC,EAAQG,GAAYJ,EAAKK,GAAYH,CAAO,CAAC,EAC7CF,EAAI,MAAQC,EAIhB,OADYK,GAAiB,MAAM,KAAM,CAACN,EAAKC,EAAOjE,EAAcsB,CAAO,CAAC,CAEhF,CAjBSnB,EAAAyC,GAAA,mBAmBT,SAAS0B,GAELN,EACAO,EACAvE,EACAsB,EAAwB,CAExB,IAAIkD,EAAYD,EAEZ/D,EAAI,EACFqB,EAAiB,CAAA,EACnB4C,EAAI,KAAK,GAAGjE,GAAG,EAEnB,OAAa,CACT,IAAIkE,EAAIC,GAAuBH,EAAWC,CAAC,EAK3C,GAJIC,IAAM,SACNA,EAAIE,GAAuB,MAAM,KAAM,CAACZ,EAAKQ,EAAWC,EAAGjE,EAAGR,EAAcsB,CAAO,CAAC,GAGpFoD,IAAMG,GACN,OAAOC,GAA0BjD,EAAM2C,EAAWC,CAAC,EAGvD,GAAIC,EAAE,gBAAkB,GACpB,OAAOA,EAAE,WAGbF,EAAYE,EACZ7C,EAAK,KAAK4C,CAAC,EACXA,EAAI,KAAK,GAAGjE,GAAG,EAEvB,CA/BSL,EAAAmE,GAAA,oBAiCT,SAASM,GAELZ,EACAQ,EACAO,EACAC,EACAhF,EACAsB,EAAwB,CAExB,IAAM2D,EAAQC,GAAgBV,EAAU,QAASO,EAAO/E,CAAY,EACpE,GAAIiF,EAAM,OAAS,EACf,OAAAE,GAAWnB,EAAKQ,EAAWO,EAAOF,EAAS,EACpCA,GAGX,IAAIO,EAAWf,GAAYY,CAAK,EAC1BI,EAAeC,GAAaL,EAAOjF,CAAY,EAErD,GAAIqF,IAAiB,OACjBD,EAAS,cAAgB,GACzBA,EAAS,WAAaC,EACtBD,EAAS,QAAQ,UAAYC,UACtBE,GAAiCN,CAAK,EAAG,CAChD,IAAMzC,EAAagD,GAAIP,EAAM,IAAI,EACjCG,EAAS,cAAgB,GACzBA,EAAS,WAAa5C,EACtB4C,EAAS,QAAQ,UAAY5C,EAC7BiD,GAAyB,MAAM,KAAM,CAACzB,EAAKgB,EAAWC,EAAM,KAAM3D,CAAO,CAAC,EAG9E,OAAA8D,EAAWD,GAAWnB,EAAKQ,EAAWO,EAAOK,CAAQ,EAC9CA,CACX,CAhCSjF,EAAAyE,GAAA,0BAkCT,SAASa,GAELzB,EACAgB,EACAU,EACApE,EAAwB,CAExB,IAAMqE,EAA0B,CAAA,EAChC,QAASnF,EAAI,EAAGA,GAAKwE,EAAWxE,IAC5BmF,EAAW,KAAK,KAAK,GAAGnF,CAAC,EAAE,SAAS,EAExC,IAAMoF,EAAW5B,EAAI,cACf6B,EAAeD,EAAS,KACxBE,EAAaF,EAAS,WACtB9E,EAAUiF,GAAoB,CAChC,aAAAF,EACA,iBAAAH,EACA,WAAAI,EACA,WAAAH,EACH,EACDrE,EAAQR,CAAO,CACnB,CArBSX,EAAAsF,GAAA,4BAuBT,SAASM,GAAoBnF,EAK5B,CACG,IAAMoF,EAAUtE,EAAId,EAAQ,WAAaqF,GACrCC,GAAWD,CAAO,CAAC,EACrB,KAAK,IAAI,EACLE,EACFvF,EAAQ,WAAW,MAAQ,EAAI,GAAKA,EAAQ,WAAW,IACvDwF,EACA,qCAAqCxF,EAAQ,iBAAiB,KAC1D,IAAI,CACP,SAASyF,GAAqBzF,EAAQ,UAAU,CAAC,GAAGuF,CAAU,aACnDvF,EAAQ,aAAa,IAAI;GACjCoF,CAAO;EAEf,OAAAI,EACIA,EACA;sBAEGA,CACX,CAvBSjG,EAAA4F,GAAA,uBAyBT,SAASM,GAAqBC,EAA+B,CACzD,GAAIA,aAAgBC,EAChB,MAAO,UACJ,GAAID,aAAgBE,EACvB,MAAO,SACJ,GAAIF,aAAgBG,EACvB,MAAO,KACJ,GAAIH,aAAgBI,EACvB,MAAO,eACJ,GAAIJ,aAAgBK,EACvB,MAAO,mBACJ,GAAIL,aAAgBM,EACvB,MAAO,WACJ,GAAIN,aAAgBO,EACvB,MAAO,OACJ,GAAIP,aAAgBQ,EACvB,MAAO,UAEP,MAAM,MAAM,sBAAsB,CAE1C,CApBS3G,EAAAkG,GAAA,wBAsBT,SAASvB,GACLjD,EACAkF,EACAC,EAAe,CAEf,IAAMC,EAAkBC,GACpBH,EAAS,QAAQ,SAChBhE,GAAMA,EAAE,MAAM,WAAW,EAExBoE,EAAiBC,GACnBH,EACK,OAAQlE,GAA2BA,aAAasE,EAAc,EAC9D,IAAKtE,GAAMA,EAAE,SAAS,EAC1BA,GAAMA,EAAE,YAAY,EAEzB,MAAO,CACH,YAAaiE,EACb,mBAAoBG,EACpB,UAAWtF,EAEnB,CApBS1B,EAAA2E,GAAA,6BAsBT,SAASH,GACL2C,EACAvC,EAAa,CAEb,OAAOuC,EAAM,MAAMvC,EAAM,YAAY,CACzC,CALS5E,EAAAwE,GAAA,0BAOT,SAASO,GACLqC,EACAxC,EACA/E,EAA0B,CAE1B,IAAMwH,EAAe,IAAIC,GACnBC,EAAiC,CAAA,EAEvC,QAAWC,KAAKJ,EAAQ,SAAU,CAC9B,GAAIvH,EAAa,GAAG2H,EAAE,GAAG,IAAM,GAC3B,SAEJ,GAAIA,EAAE,MAAM,OAASC,GAAe,CAChCF,EAAkB,KAAKC,CAAC,EACxB,SAEJ,IAAME,EAAmBF,EAAE,MAAM,YAAY,OAC7C,QAASnH,EAAI,EAAGA,EAAIqH,EAAkBrH,IAAK,CACvC,IAAMsH,EAAaH,EAAE,MAAM,YAAYnH,CAAC,EAClCuH,EAASC,GAAmBF,EAAY/C,CAAK,EAC/CgD,IAAW,QACXP,EAAa,IAAI,CACb,MAAOO,EACP,IAAKJ,EAAE,IACP,MAAOA,EAAE,MACZ,GAKb,IAAI1C,EAMJ,GAJIyC,EAAkB,SAAW,GAAKF,EAAa,OAAS,IACxDvC,EAAQuC,GAGRvC,IAAU,OAAW,CACrBA,EAAQ,IAAIwC,GACZ,QAAWE,KAAKH,EAAa,SACzBtD,GAAQyD,EAAG1C,CAAK,EAIxB,GAAIyC,EAAkB,OAAS,GAAK,CAACO,GAAyBhD,CAAK,EAC/D,QAAW0C,KAAKD,EACZzC,EAAM,IAAI0C,CAAC,EAInB,OAAO1C,CACX,CAlDS9E,EAAA+E,GAAA,mBAoDT,SAAS8C,GACLF,EACA/C,EAAa,CAEb,GACI+C,aAAsBT,IACtBa,GAAanD,EAAO+C,EAAW,SAAS,EAExC,OAAOA,EAAW,MAG1B,CAXS3H,EAAA6H,GAAA,sBAaT,SAAS1C,GACLiC,EACAvH,EAA0B,CAE1B,IAAIiD,EACJ,QAAW0E,KAAKJ,EAAQ,SACpB,GAAIvH,EAAa,GAAG2H,EAAE,GAAG,IAAM,IAC3B,GAAI1E,IAAQ,OACRA,EAAM0E,EAAE,YACD1E,IAAQ0E,EAAE,IACjB,OAIZ,OAAO1E,CACX,CAfS9C,EAAAmF,GAAA,gBAiBT,SAASjB,GAAYH,EAAqB,CACtC,MAAO,CACH,QAASA,EACT,MAAO,CAAA,EACP,cAAe,GACf,WAAY,GAEpB,CAPS/D,EAAAkE,GAAA,eAST,SAASc,GACLnB,EACAmE,EACApD,EACAqD,EAAY,CAEZ,OAAAA,EAAKhE,GAAYJ,EAAKoE,CAAE,EACxBD,EAAK,MAAMpD,EAAM,YAAY,EAAIqD,EAC1BA,CACX,CATSjI,EAAAgF,GAAA,cAWT,SAASf,GAAYJ,EAAUsD,EAAe,CAC1C,GAAIA,IAAUzC,GACV,OAAOyC,EAIX,IAAMe,EAASf,EAAM,QAAQ,IACvBpH,EAAW8D,EAAI,OAAOqE,CAAM,EAClC,OAAInI,IAAa,OACNA,GAEXoH,EAAM,QAAQ,SAAQ,EACtBtD,EAAI,OAAOqE,CAAM,EAAIf,EACdA,EACX,CAdSnH,EAAAiE,GAAA,eAgBT,SAASD,GAAkByB,EAAkB,CACzC,IAAM2B,EAAU,IAAIE,GAEda,EAAsB1C,EAAS,YAAY,OACjD,QAASpF,EAAI,EAAGA,EAAI8H,EAAqB9H,IAAK,CAE1C,IAAM+H,EAAoB,CACtB,MAFW3C,EAAS,YAAYpF,CAAC,EAAE,OAGnC,IAAKA,EACL,MAAO,CAAA,GAEX0D,GAAQqE,EAAQhB,CAAO,EAG3B,OAAOA,CACX,CAfSpH,EAAAgE,GAAA,qBAiBT,SAASD,GAAQqE,EAAmBhB,EAAqB,CACrD,IAAMiB,EAAID,EAAO,MAEjB,GAAIC,EAAE,OAASZ,GAAe,CAC1B,GAAIW,EAAO,MAAM,OAAS,EAAG,CACzB,IAAME,EAAW,CAAC,GAAGF,EAAO,KAAK,EAE3BG,EAA0B,CAC5B,MAFgBD,EAAS,IAAG,EAG5B,IAAKF,EAAO,IACZ,MAAOE,GAEXvE,GAAQwE,EAAcnB,CAAO,OAI7BA,EAAQ,IAAIgB,CAAM,EAEtB,OAGCC,EAAE,wBACHjB,EAAQ,IAAIgB,CAAM,EAGtB,IAAMV,EAAmBW,EAAE,YAAY,OACvC,QAAS,EAAI,EAAG,EAAIX,EAAkB,IAAK,CACvC,IAAMC,EAAaU,EAAE,YAAY,CAAC,EAC5Bb,EAAIgB,GAAiBJ,EAAQT,CAAU,EAEzCH,IAAM,QACNzD,GAAQyD,EAAGJ,CAAO,EAG9B,CAlCSpH,EAAA+D,GAAA,WAoCT,SAASyE,GACLJ,EACAT,EAAsB,CAEtB,GAAIA,aAAsBc,GACtB,MAAO,CACH,MAAOd,EAAW,OAClB,IAAKS,EAAO,IACZ,MAAOA,EAAO,OAEf,GAAIT,aAAsBe,GAAgB,CAC7C,IAAMC,EAAQ,CAAC,GAAGP,EAAO,MAAOT,EAAW,WAAW,EACtD,MAAO,CACH,MAAOA,EAAW,OAClB,IAAKS,EAAO,IACZ,MAAAO,GAIZ,CAnBS3I,EAAAwI,GAAA,oBAqBT,SAASV,GAAyBV,EAAqB,CACnD,QAAWI,KAAKJ,EAAQ,SACpB,GAAII,EAAE,MAAM,OAASC,GACjB,MAAO,GAGf,MAAO,EACX,CAPSzH,EAAA8H,GAAA,4BAST,SAASc,GAA2BxB,EAAqB,CACrD,QAAWI,KAAKJ,EAAQ,SACpB,GAAII,EAAE,MAAM,OAASC,GACjB,MAAO,GAGf,MAAO,EACX,CAPSzH,EAAA4I,GAAA,8BAST,SAASxD,GAAiCgC,EAAqB,CAC3D,GAAIwB,GAA2BxB,CAAO,EAClC,MAAO,GAEX,IAAMyB,EAAUC,GAAsB1B,EAAQ,QAAQ,EAGtD,OADI2B,GAAqBF,CAAO,GAAK,CAACG,GAA6BH,CAAO,CAE9E,CARS7I,EAAAoF,GAAA,oCAUT,SAAS0D,GACL1B,EAA6B,CAE7B,IAAM6B,EAAe,IAAI,IACzB,QAAWzB,KAAKJ,EAAS,CACrB,IAAMtH,EAAMoJ,GAAgB1B,EAAG,EAAK,EAChC7E,EAAOsG,EAAa,IAAInJ,CAAG,EAC3B6C,IAAS,SACTA,EAAO,CAAA,EACPsG,EAAa,IAAInJ,EAAK6C,CAAI,GAE9BA,EAAK6E,EAAE,GAAG,EAAI,GAElB,OAAOyB,CACX,CAdSjJ,EAAA8I,GAAA,yBAgBT,SAASC,GACLF,EAA6C,CAE7C,QAAW1I,KAAS,MAAM,KAAK0I,EAAQ,OAAM,CAAE,EAC3C,GAAI,OAAO,KAAK1I,CAAK,EAAE,OAAS,EAC5B,MAAO,GAGf,MAAO,EACX,CATSH,EAAA+I,GAAA,wBAWT,SAASC,GACLH,EAA6C,CAE7C,QAAW1I,KAAS,MAAM,KAAK0I,EAAQ,OAAM,CAAE,EAC3C,GAAI,OAAO,KAAK1I,CAAK,EAAE,SAAW,EAC9B,MAAO,GAGf,MAAO,EACX,CATSH,EAAAgJ,GAAA,gCC5uBF,IAAIG,IACV,SAAUA,EAAa,CACpB,SAASC,EAAGC,EAAO,CACf,OAAO,OAAOA,GAAU,QAC5B,CAFSC,EAAAF,EAAA,MAGTD,EAAY,GAAKC,CACrB,GAAGD,KAAgBA,GAAc,CAAC,EAAE,EAC7B,IAAII,IACV,SAAUA,EAAK,CACZ,SAASH,EAAGC,EAAO,CACf,OAAO,OAAOA,GAAU,QAC5B,CAFSC,EAAAF,EAAA,MAGTG,EAAI,GAAKH,CACb,GAAGG,KAAQA,GAAM,CAAC,EAAE,EACb,IAAIC,IACV,SAAUA,EAAS,CAChBA,EAAQ,UAAY,YACpBA,EAAQ,UAAY,WACpB,SAASJ,EAAGC,EAAO,CACf,OAAO,OAAOA,GAAU,UAAYG,EAAQ,WAAaH,GAASA,GAASG,EAAQ,SACvF,CAFSF,EAAAF,EAAA,MAGTI,EAAQ,GAAKJ,CACjB,GAAGI,KAAYA,GAAU,CAAC,EAAE,EACrB,IAAIC,IACV,SAAUA,EAAU,CACjBA,EAAS,UAAY,EACrBA,EAAS,UAAY,WACrB,SAASL,EAAGC,EAAO,CACf,OAAO,OAAOA,GAAU,UAAYI,EAAS,WAAaJ,GAASA,GAASI,EAAS,SACzF,CAFSH,EAAAF,EAAA,MAGTK,EAAS,GAAKL,CAClB,GAAGK,KAAaA,GAAW,CAAC,EAAE,EAKvB,IAAIC,GACV,SAAUA,EAAU,CAMjB,SAASC,EAAOC,EAAMC,EAAW,CAC7B,OAAID,IAAS,OAAO,YAChBA,EAAOH,GAAS,WAEhBI,IAAc,OAAO,YACrBA,EAAYJ,GAAS,WAElB,CAAE,KAAAG,EAAM,UAAAC,CAAU,CAC7B,CARSP,EAAAK,EAAA,UASTD,EAAS,OAASC,EAIlB,SAASP,EAAGC,EAAO,CACf,IAAIS,EAAYT,EAChB,OAAOU,EAAG,cAAcD,CAAS,GAAKC,EAAG,SAASD,EAAU,IAAI,GAAKC,EAAG,SAASD,EAAU,SAAS,CACxG,CAHSR,EAAAF,EAAA,MAITM,EAAS,GAAKN,CAClB,GAAGM,IAAaA,EAAW,CAAC,EAAE,EAKvB,IAAIM,GACV,SAAUA,EAAO,CACd,SAASL,EAAOM,EAAKC,EAAKC,EAAOC,EAAM,CACnC,GAAIL,EAAG,SAASE,CAAG,GAAKF,EAAG,SAASG,CAAG,GAAKH,EAAG,SAASI,CAAK,GAAKJ,EAAG,SAASK,CAAI,EAC9E,MAAO,CAAE,MAAOV,EAAS,OAAOO,EAAKC,CAAG,EAAG,IAAKR,EAAS,OAAOS,EAAOC,CAAI,CAAE,EAE5E,GAAIV,EAAS,GAAGO,CAAG,GAAKP,EAAS,GAAGQ,CAAG,EACxC,MAAO,CAAE,MAAOD,EAAK,IAAKC,CAAI,EAG9B,MAAM,IAAI,MAAM,8CAA8CD,CAAG,KAAKC,CAAG,KAAKC,CAAK,KAAKC,CAAI,GAAG,CAEvG,CAVSd,EAAAK,EAAA,UAWTK,EAAM,OAASL,EAIf,SAASP,EAAGC,EAAO,CACf,IAAIS,EAAYT,EAChB,OAAOU,EAAG,cAAcD,CAAS,GAAKJ,EAAS,GAAGI,EAAU,KAAK,GAAKJ,EAAS,GAAGI,EAAU,GAAG,CACnG,CAHSR,EAAAF,EAAA,MAITY,EAAM,GAAKZ,CACf,GAAGY,IAAUA,EAAQ,CAAC,EAAE,EAKjB,IAAIK,IACV,SAAUA,EAAU,CAMjB,SAASV,EAAOW,EAAKC,EAAO,CACxB,MAAO,CAAE,IAAAD,EAAK,MAAAC,CAAM,CACxB,CAFSjB,EAAAK,EAAA,UAGTU,EAAS,OAASV,EAIlB,SAASP,EAAGC,EAAO,CACf,IAAIS,EAAYT,EAChB,OAAOU,EAAG,cAAcD,CAAS,GAAKE,EAAM,GAAGF,EAAU,KAAK,IAAMC,EAAG,OAAOD,EAAU,GAAG,GAAKC,EAAG,UAAUD,EAAU,GAAG,EAC9H,CAHSR,EAAAF,EAAA,MAITiB,EAAS,GAAKjB,CAClB,GAAGiB,KAAaA,GAAW,CAAC,EAAE,EAKvB,IAAIG,IACV,SAAUA,EAAc,CAQrB,SAASb,EAAOc,EAAWC,EAAaC,EAAsBC,EAAsB,CAChF,MAAO,CAAE,UAAAH,EAAW,YAAAC,EAAa,qBAAAC,EAAsB,qBAAAC,CAAqB,CAChF,CAFStB,EAAAK,EAAA,UAGTa,EAAa,OAASb,EAItB,SAASP,EAAGC,EAAO,CACf,IAAIS,EAAYT,EAChB,OAAOU,EAAG,cAAcD,CAAS,GAAKE,EAAM,GAAGF,EAAU,WAAW,GAAKC,EAAG,OAAOD,EAAU,SAAS,GAC/FE,EAAM,GAAGF,EAAU,oBAAoB,IACtCE,EAAM,GAAGF,EAAU,oBAAoB,GAAKC,EAAG,UAAUD,EAAU,oBAAoB,EACnG,CALSR,EAAAF,EAAA,MAMToB,EAAa,GAAKpB,CACtB,GAAGoB,KAAiBA,GAAe,CAAC,EAAE,EAK/B,IAAIK,IACV,SAAUA,EAAO,CAId,SAASlB,EAAOmB,EAAKC,EAAOC,EAAMC,EAAO,CACrC,MAAO,CACH,IAAAH,EACA,MAAAC,EACA,KAAAC,EACA,MAAAC,CACJ,CACJ,CAPS3B,EAAAK,EAAA,UAQTkB,EAAM,OAASlB,EAIf,SAASP,EAAGC,EAAO,CACf,IAAMS,EAAYT,EAClB,OAAOU,EAAG,cAAcD,CAAS,GAAKC,EAAG,YAAYD,EAAU,IAAK,EAAG,CAAC,GACjEC,EAAG,YAAYD,EAAU,MAAO,EAAG,CAAC,GACpCC,EAAG,YAAYD,EAAU,KAAM,EAAG,CAAC,GACnCC,EAAG,YAAYD,EAAU,MAAO,EAAG,CAAC,CAC/C,CANSR,EAAAF,EAAA,MAOTyB,EAAM,GAAKzB,CACf,GAAGyB,KAAUA,GAAQ,CAAC,EAAE,EAKjB,IAAIK,IACV,SAAUA,EAAkB,CAIzB,SAASvB,EAAOY,EAAOY,EAAO,CAC1B,MAAO,CACH,MAAAZ,EACA,MAAAY,CACJ,CACJ,CALS7B,EAAAK,EAAA,UAMTuB,EAAiB,OAASvB,EAI1B,SAASP,EAAGC,EAAO,CACf,IAAMS,EAAYT,EAClB,OAAOU,EAAG,cAAcD,CAAS,GAAKE,EAAM,GAAGF,EAAU,KAAK,GAAKe,GAAM,GAAGf,EAAU,KAAK,CAC/F,CAHSR,EAAAF,EAAA,MAIT8B,EAAiB,GAAK9B,CAC1B,GAAG8B,KAAqBA,GAAmB,CAAC,EAAE,EAKvC,IAAIE,IACV,SAAUA,EAAmB,CAI1B,SAASzB,EAAO0B,EAAOC,EAAUC,EAAqB,CAClD,MAAO,CACH,MAAAF,EACA,SAAAC,EACA,oBAAAC,CACJ,CACJ,CANSjC,EAAAK,EAAA,UAOTyB,EAAkB,OAASzB,EAI3B,SAASP,EAAGC,EAAO,CACf,IAAMS,EAAYT,EAClB,OAAOU,EAAG,cAAcD,CAAS,GAAKC,EAAG,OAAOD,EAAU,KAAK,IACvDC,EAAG,UAAUD,EAAU,QAAQ,GAAK0B,GAAS,GAAG1B,CAAS,KACzDC,EAAG,UAAUD,EAAU,mBAAmB,GAAKC,EAAG,WAAWD,EAAU,oBAAqB0B,GAAS,EAAE,EACnH,CALSlC,EAAAF,EAAA,MAMTgC,EAAkB,GAAKhC,CAC3B,GAAGgC,KAAsBA,GAAoB,CAAC,EAAE,EAIzC,IAAIK,IACV,SAAUA,EAAkB,CAIzBA,EAAiB,QAAU,UAI3BA,EAAiB,QAAU,UAI3BA,EAAiB,OAAS,QAC9B,GAAGA,KAAqBA,GAAmB,CAAC,EAAE,EAKvC,IAAIC,IACV,SAAUA,EAAc,CAIrB,SAAS/B,EAAOgC,EAAWC,EAASC,EAAgBC,EAAcC,EAAMC,EAAe,CACnF,IAAMC,EAAS,CACX,UAAAN,EACA,QAAAC,CACJ,EACA,OAAI7B,EAAG,QAAQ8B,CAAc,IACzBI,EAAO,eAAiBJ,GAExB9B,EAAG,QAAQ+B,CAAY,IACvBG,EAAO,aAAeH,GAEtB/B,EAAG,QAAQgC,CAAI,IACfE,EAAO,KAAOF,GAEdhC,EAAG,QAAQiC,CAAa,IACxBC,EAAO,cAAgBD,GAEpBC,CACX,CAlBS3C,EAAAK,EAAA,UAmBT+B,EAAa,OAAS/B,EAItB,SAASP,EAAGC,EAAO,CACf,IAAMS,EAAYT,EAClB,OAAOU,EAAG,cAAcD,CAAS,GAAKC,EAAG,SAASD,EAAU,SAAS,GAAKC,EAAG,SAASD,EAAU,SAAS,IACjGC,EAAG,UAAUD,EAAU,cAAc,GAAKC,EAAG,SAASD,EAAU,cAAc,KAC9EC,EAAG,UAAUD,EAAU,YAAY,GAAKC,EAAG,SAASD,EAAU,YAAY,KAC1EC,EAAG,UAAUD,EAAU,IAAI,GAAKC,EAAG,OAAOD,EAAU,IAAI,EACpE,CANSR,EAAAF,EAAA,MAOTsC,EAAa,GAAKtC,CACtB,GAAGsC,KAAiBA,GAAe,CAAC,EAAE,EAK/B,IAAIQ,IACV,SAAUA,EAA8B,CAIrC,SAASvC,EAAOwC,EAAUC,EAAS,CAC/B,MAAO,CACH,SAAAD,EACA,QAAAC,CACJ,CACJ,CALS9C,EAAAK,EAAA,UAMTuC,EAA6B,OAASvC,EAItC,SAASP,EAAGC,EAAO,CACf,IAAIS,EAAYT,EAChB,OAAOU,EAAG,QAAQD,CAAS,GAAKO,GAAS,GAAGP,EAAU,QAAQ,GAAKC,EAAG,OAAOD,EAAU,OAAO,CAClG,CAHSR,EAAAF,EAAA,MAIT8C,EAA6B,GAAK9C,CACtC,GAAG8C,KAAiCA,GAA+B,CAAC,EAAE,EAI/D,IAAIG,IACV,SAAUA,EAAoB,CAI3BA,EAAmB,MAAQ,EAI3BA,EAAmB,QAAU,EAI7BA,EAAmB,YAAc,EAIjCA,EAAmB,KAAO,CAC9B,GAAGA,KAAuBA,GAAqB,CAAC,EAAE,EAM3C,IAAIC,IACV,SAAUA,EAAe,CAOtBA,EAAc,YAAc,EAM5BA,EAAc,WAAa,CAC/B,GAAGA,KAAkBA,GAAgB,CAAC,EAAE,EAMjC,IAAIC,IACV,SAAUA,EAAiB,CACxB,SAASnD,EAAGC,EAAO,CACf,IAAMS,EAAYT,EAClB,OAAOU,EAAG,cAAcD,CAAS,GAAKC,EAAG,OAAOD,EAAU,IAAI,CAClE,CAHSR,EAAAF,EAAA,MAITmD,EAAgB,GAAKnD,CACzB,GAAGmD,KAAoBA,GAAkB,CAAC,EAAE,EAKrC,IAAIC,IACV,SAAUA,EAAY,CAInB,SAAS7C,EAAOY,EAAO6B,EAASK,EAAUC,EAAMC,EAAQC,EAAoB,CACxE,IAAIX,EAAS,CAAE,MAAA1B,EAAO,QAAA6B,CAAQ,EAC9B,OAAIrC,EAAG,QAAQ0C,CAAQ,IACnBR,EAAO,SAAWQ,GAElB1C,EAAG,QAAQ2C,CAAI,IACfT,EAAO,KAAOS,GAEd3C,EAAG,QAAQ4C,CAAM,IACjBV,EAAO,OAASU,GAEhB5C,EAAG,QAAQ6C,CAAkB,IAC7BX,EAAO,mBAAqBW,GAEzBX,CACX,CAfS3C,EAAAK,EAAA,UAgBT6C,EAAW,OAAS7C,EAIpB,SAASP,EAAGC,EAAO,CACf,IAAIwD,EACJ,IAAI/C,EAAYT,EAChB,OAAOU,EAAG,QAAQD,CAAS,GACpBE,EAAM,GAAGF,EAAU,KAAK,GACxBC,EAAG,OAAOD,EAAU,OAAO,IAC1BC,EAAG,OAAOD,EAAU,QAAQ,GAAKC,EAAG,UAAUD,EAAU,QAAQ,KAChEC,EAAG,QAAQD,EAAU,IAAI,GAAKC,EAAG,OAAOD,EAAU,IAAI,GAAKC,EAAG,UAAUD,EAAU,IAAI,KACtFC,EAAG,UAAUD,EAAU,eAAe,GAAMC,EAAG,QAAQ8C,EAAK/C,EAAU,mBAAqB,MAAQ+C,IAAO,OAAS,OAASA,EAAG,IAAI,KACnI9C,EAAG,OAAOD,EAAU,MAAM,GAAKC,EAAG,UAAUD,EAAU,MAAM,KAC5DC,EAAG,UAAUD,EAAU,kBAAkB,GAAKC,EAAG,WAAWD,EAAU,mBAAoBoC,GAA6B,EAAE,EACrI,CAXS5C,EAAAF,EAAA,MAYToD,EAAW,GAAKpD,CACpB,GAAGoD,KAAeA,GAAa,CAAC,EAAE,EAK3B,IAAIM,IACV,SAAUA,EAAS,CAIhB,SAASnD,EAAOoD,EAAOC,KAAYC,EAAM,CACrC,IAAIhB,EAAS,CAAE,MAAAc,EAAO,QAAAC,CAAQ,EAC9B,OAAIjD,EAAG,QAAQkD,CAAI,GAAKA,EAAK,OAAS,IAClChB,EAAO,UAAYgB,GAEhBhB,CACX,CANS3C,EAAAK,EAAA,UAOTmD,EAAQ,OAASnD,EAIjB,SAASP,EAAGC,EAAO,CACf,IAAIS,EAAYT,EAChB,OAAOU,EAAG,QAAQD,CAAS,GAAKC,EAAG,OAAOD,EAAU,KAAK,GAAKC,EAAG,OAAOD,EAAU,OAAO,CAC7F,CAHSR,EAAAF,EAAA,MAIT0D,EAAQ,GAAK1D,CACjB,GAAG0D,KAAYA,GAAU,CAAC,EAAE,EAKrB,IAAItB,IACV,SAAUA,EAAU,CAMjB,SAAS0B,EAAQ3C,EAAO4C,EAAS,CAC7B,MAAO,CAAE,MAAA5C,EAAO,QAAA4C,CAAQ,CAC5B,CAFS7D,EAAA4D,EAAA,WAGT1B,EAAS,QAAU0B,EAMnB,SAASE,EAAOC,EAAUF,EAAS,CAC/B,MAAO,CAAE,MAAO,CAAE,MAAOE,EAAU,IAAKA,CAAS,EAAG,QAAAF,CAAQ,CAChE,CAFS7D,EAAA8D,EAAA,UAGT5B,EAAS,OAAS4B,EAKlB,SAASE,EAAI/C,EAAO,CAChB,MAAO,CAAE,MAAAA,EAAO,QAAS,EAAG,CAChC,CAFSjB,EAAAgE,EAAA,OAGT9B,EAAS,IAAM8B,EACf,SAASlE,EAAGC,EAAO,CACf,IAAMS,EAAYT,EAClB,OAAOU,EAAG,cAAcD,CAAS,GAC1BC,EAAG,OAAOD,EAAU,OAAO,GAC3BE,EAAM,GAAGF,EAAU,KAAK,CACnC,CALSR,EAAAF,EAAA,MAMToC,EAAS,GAAKpC,CAClB,GAAGoC,KAAaA,GAAW,CAAC,EAAE,EACvB,IAAI+B,IACV,SAAUA,EAAkB,CACzB,SAAS5D,EAAO0B,EAAOmC,EAAmBC,EAAa,CACnD,IAAMxB,EAAS,CAAE,MAAAZ,CAAM,EACvB,OAAImC,IAAsB,SACtBvB,EAAO,kBAAoBuB,GAE3BC,IAAgB,SAChBxB,EAAO,YAAcwB,GAElBxB,CACX,CATS3C,EAAAK,EAAA,UAUT4D,EAAiB,OAAS5D,EAC1B,SAASP,EAAGC,EAAO,CACf,IAAMS,EAAYT,EAClB,OAAOU,EAAG,cAAcD,CAAS,GAAKC,EAAG,OAAOD,EAAU,KAAK,IAC1DC,EAAG,QAAQD,EAAU,iBAAiB,GAAKA,EAAU,oBAAsB,UAC3EC,EAAG,OAAOD,EAAU,WAAW,GAAKA,EAAU,cAAgB,OACvE,CALSR,EAAAF,EAAA,MAMTmE,EAAiB,GAAKnE,CAC1B,GAAGmE,KAAqBA,GAAmB,CAAC,EAAE,EACvC,IAAIG,IACV,SAAUA,EAA4B,CACnC,SAAStE,EAAGC,EAAO,CACf,IAAMS,EAAYT,EAClB,OAAOU,EAAG,OAAOD,CAAS,CAC9B,CAHSR,EAAAF,EAAA,MAITsE,EAA2B,GAAKtE,CACpC,GAAGsE,KAA+BA,GAA6B,CAAC,EAAE,EAC3D,IAAIC,IACV,SAAUA,EAAmB,CAQ1B,SAAST,EAAQ3C,EAAO4C,EAASS,EAAY,CACzC,MAAO,CAAE,MAAArD,EAAO,QAAA4C,EAAS,aAAcS,CAAW,CACtD,CAFStE,EAAA4D,EAAA,WAGTS,EAAkB,QAAUT,EAQ5B,SAASE,EAAOC,EAAUF,EAASS,EAAY,CAC3C,MAAO,CAAE,MAAO,CAAE,MAAOP,EAAU,IAAKA,CAAS,EAAG,QAAAF,EAAS,aAAcS,CAAW,CAC1F,CAFStE,EAAA8D,EAAA,UAGTO,EAAkB,OAASP,EAO3B,SAASE,EAAI/C,EAAOqD,EAAY,CAC5B,MAAO,CAAE,MAAArD,EAAO,QAAS,GAAI,aAAcqD,CAAW,CAC1D,CAFStE,EAAAgE,EAAA,OAGTK,EAAkB,IAAML,EACxB,SAASlE,EAAGC,EAAO,CACf,IAAMS,EAAYT,EAClB,OAAOmC,GAAS,GAAG1B,CAAS,IAAMyD,GAAiB,GAAGzD,EAAU,YAAY,GAAK4D,GAA2B,GAAG5D,EAAU,YAAY,EACzI,CAHSR,EAAAF,EAAA,MAITuE,EAAkB,GAAKvE,CAC3B,GAAGuE,KAAsBA,GAAoB,CAAC,EAAE,EAKzC,IAAIE,IACV,SAAUA,EAAkB,CAIzB,SAASlE,EAAOmE,EAAcC,EAAO,CACjC,MAAO,CAAE,aAAAD,EAAc,MAAAC,CAAM,CACjC,CAFSzE,EAAAK,EAAA,UAGTkE,EAAiB,OAASlE,EAC1B,SAASP,EAAGC,EAAO,CACf,IAAIS,EAAYT,EAChB,OAAOU,EAAG,QAAQD,CAAS,GACpBkE,GAAwC,GAAGlE,EAAU,YAAY,GACjE,MAAM,QAAQA,EAAU,KAAK,CACxC,CALSR,EAAAF,EAAA,MAMTyE,EAAiB,GAAKzE,CAC1B,GAAGyE,KAAqBA,GAAmB,CAAC,EAAE,EACvC,IAAII,IACV,SAAUA,EAAY,CACnB,SAAStE,EAAOW,EAAK4D,EAASN,EAAY,CACtC,IAAI3B,EAAS,CACT,KAAM,SACN,IAAA3B,CACJ,EACA,OAAI4D,IAAY,SAAcA,EAAQ,YAAc,QAAaA,EAAQ,iBAAmB,UACxFjC,EAAO,QAAUiC,GAEjBN,IAAe,SACf3B,EAAO,aAAe2B,GAEnB3B,CACX,CAZS3C,EAAAK,EAAA,UAaTsE,EAAW,OAAStE,EACpB,SAASP,EAAGC,EAAO,CACf,IAAIS,EAAYT,EAChB,OAAOS,GAAaA,EAAU,OAAS,UAAYC,EAAG,OAAOD,EAAU,GAAG,IAAMA,EAAU,UAAY,SAChGA,EAAU,QAAQ,YAAc,QAAaC,EAAG,QAAQD,EAAU,QAAQ,SAAS,KAAOA,EAAU,QAAQ,iBAAmB,QAAaC,EAAG,QAAQD,EAAU,QAAQ,cAAc,MAASA,EAAU,eAAiB,QAAa4D,GAA2B,GAAG5D,EAAU,YAAY,EACtS,CAJSR,EAAAF,EAAA,MAKT6E,EAAW,GAAK7E,CACpB,GAAG6E,KAAeA,GAAa,CAAC,EAAE,EAC3B,IAAIE,IACV,SAAUA,EAAY,CACnB,SAASxE,EAAOyE,EAAQC,EAAQH,EAASN,EAAY,CACjD,IAAI3B,EAAS,CACT,KAAM,SACN,OAAAmC,EACA,OAAAC,CACJ,EACA,OAAIH,IAAY,SAAcA,EAAQ,YAAc,QAAaA,EAAQ,iBAAmB,UACxFjC,EAAO,QAAUiC,GAEjBN,IAAe,SACf3B,EAAO,aAAe2B,GAEnB3B,CACX,CAbS3C,EAAAK,EAAA,UAcTwE,EAAW,OAASxE,EACpB,SAASP,EAAGC,EAAO,CACf,IAAIS,EAAYT,EAChB,OAAOS,GAAaA,EAAU,OAAS,UAAYC,EAAG,OAAOD,EAAU,MAAM,GAAKC,EAAG,OAAOD,EAAU,MAAM,IAAMA,EAAU,UAAY,SAClIA,EAAU,QAAQ,YAAc,QAAaC,EAAG,QAAQD,EAAU,QAAQ,SAAS,KAAOA,EAAU,QAAQ,iBAAmB,QAAaC,EAAG,QAAQD,EAAU,QAAQ,cAAc,MAASA,EAAU,eAAiB,QAAa4D,GAA2B,GAAG5D,EAAU,YAAY,EACtS,CAJSR,EAAAF,EAAA,MAKT+E,EAAW,GAAK/E,CACpB,GAAG+E,KAAeA,GAAa,CAAC,EAAE,EAC3B,IAAIG,IACV,SAAUA,EAAY,CACnB,SAAS3E,EAAOW,EAAK4D,EAASN,EAAY,CACtC,IAAI3B,EAAS,CACT,KAAM,SACN,IAAA3B,CACJ,EACA,OAAI4D,IAAY,SAAcA,EAAQ,YAAc,QAAaA,EAAQ,oBAAsB,UAC3FjC,EAAO,QAAUiC,GAEjBN,IAAe,SACf3B,EAAO,aAAe2B,GAEnB3B,CACX,CAZS3C,EAAAK,EAAA,UAaT2E,EAAW,OAAS3E,EACpB,SAASP,EAAGC,EAAO,CACf,IAAIS,EAAYT,EAChB,OAAOS,GAAaA,EAAU,OAAS,UAAYC,EAAG,OAAOD,EAAU,GAAG,IAAMA,EAAU,UAAY,SAChGA,EAAU,QAAQ,YAAc,QAAaC,EAAG,QAAQD,EAAU,QAAQ,SAAS,KAAOA,EAAU,QAAQ,oBAAsB,QAAaC,EAAG,QAAQD,EAAU,QAAQ,iBAAiB,MAASA,EAAU,eAAiB,QAAa4D,GAA2B,GAAG5D,EAAU,YAAY,EAC5S,CAJSR,EAAAF,EAAA,MAKTkF,EAAW,GAAKlF,CACpB,GAAGkF,KAAeA,GAAa,CAAC,EAAE,EAC3B,IAAIC,IACV,SAAUA,EAAe,CACtB,SAASnF,EAAGC,EAAO,CACf,IAAIS,EAAYT,EAChB,OAAOS,IACFA,EAAU,UAAY,QAAaA,EAAU,kBAAoB,UACjEA,EAAU,kBAAoB,QAAaA,EAAU,gBAAgB,MAAO0E,GACrEzE,EAAG,OAAOyE,EAAO,IAAI,EACdP,GAAW,GAAGO,CAAM,GAAKL,GAAW,GAAGK,CAAM,GAAKF,GAAW,GAAGE,CAAM,EAGtEX,GAAiB,GAAGW,CAAM,CAExC,EACT,CAZSlF,EAAAF,EAAA,MAaTmF,EAAc,GAAKnF,CACvB,GAAGmF,KAAkBA,GAAgB,CAAC,EAAE,EAuSjC,IAAIE,IACV,SAAUA,EAAwB,CAK/B,SAASC,EAAOC,EAAK,CACjB,MAAO,CAAE,IAAAA,CAAI,CACjB,CAFSC,EAAAF,EAAA,UAGTD,EAAuB,OAASC,EAIhC,SAASG,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,OAAOE,EAAG,QAAQD,CAAS,GAAKC,EAAG,OAAOD,EAAU,GAAG,CAC3D,CAHSH,EAAAC,EAAA,MAITJ,EAAuB,GAAKI,CAChC,GAAGJ,KAA2BA,GAAyB,CAAC,EAAE,EAKnD,IAAIQ,IACV,SAAUA,EAAiC,CAMxC,SAASP,EAAOC,EAAKO,EAAS,CAC1B,MAAO,CAAE,IAAAP,EAAK,QAAAO,CAAQ,CAC1B,CAFSN,EAAAF,EAAA,UAGTO,EAAgC,OAASP,EAIzC,SAASG,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,OAAOE,EAAG,QAAQD,CAAS,GAAKC,EAAG,OAAOD,EAAU,GAAG,GAAKC,EAAG,QAAQD,EAAU,OAAO,CAC5F,CAHSH,EAAAC,EAAA,MAITI,EAAgC,GAAKJ,CACzC,GAAGI,KAAoCA,GAAkC,CAAC,EAAE,EAKrE,IAAIE,IACV,SAAUA,EAAyC,CAMhD,SAAST,EAAOC,EAAKO,EAAS,CAC1B,MAAO,CAAE,IAAAP,EAAK,QAAAO,CAAQ,CAC1B,CAFSN,EAAAF,EAAA,UAGTS,EAAwC,OAAST,EAIjD,SAASG,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,OAAOE,EAAG,QAAQD,CAAS,GAAKC,EAAG,OAAOD,EAAU,GAAG,IAAMA,EAAU,UAAY,MAAQC,EAAG,QAAQD,EAAU,OAAO,EAC3H,CAHSH,EAAAC,EAAA,MAITM,EAAwC,GAAKN,CACjD,GAAGM,KAA4CA,GAA0C,CAAC,EAAE,EAKrF,IAAIC,IACV,SAAUA,EAAkB,CAQzB,SAASV,EAAOC,EAAKU,EAAYH,EAASI,EAAM,CAC5C,MAAO,CAAE,IAAAX,EAAK,WAAAU,EAAY,QAAAH,EAAS,KAAAI,CAAK,CAC5C,CAFSV,EAAAF,EAAA,UAGTU,EAAiB,OAASV,EAI1B,SAASG,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,OAAOE,EAAG,QAAQD,CAAS,GAAKC,EAAG,OAAOD,EAAU,GAAG,GAAKC,EAAG,OAAOD,EAAU,UAAU,GAAKC,EAAG,QAAQD,EAAU,OAAO,GAAKC,EAAG,OAAOD,EAAU,IAAI,CAC5J,CAHSH,EAAAC,EAAA,MAITO,EAAiB,GAAKP,CAC1B,GAAGO,KAAqBA,GAAmB,CAAC,EAAE,EAQvC,IAAIG,IACV,SAAUA,EAAY,CAInBA,EAAW,UAAY,YAIvBA,EAAW,SAAW,WAItB,SAASV,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAOC,IAAcQ,EAAW,WAAaR,IAAcQ,EAAW,QAC1E,CAHSX,EAAAC,EAAA,MAITU,EAAW,GAAKV,CACpB,GAAGU,KAAeA,GAAa,CAAC,EAAE,EAC3B,IAAIC,IACV,SAAUA,EAAe,CAItB,SAASX,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAOE,EAAG,cAAcF,CAAK,GAAKS,GAAW,GAAGR,EAAU,IAAI,GAAKC,EAAG,OAAOD,EAAU,KAAK,CAChG,CAHSH,EAAAC,EAAA,MAITW,EAAc,GAAKX,CACvB,GAAGW,KAAkBA,GAAgB,CAAC,EAAE,EAIjC,IAAIC,IACV,SAAUA,EAAoB,CAC3BA,EAAmB,KAAO,EAC1BA,EAAmB,OAAS,EAC5BA,EAAmB,SAAW,EAC9BA,EAAmB,YAAc,EACjCA,EAAmB,MAAQ,EAC3BA,EAAmB,SAAW,EAC9BA,EAAmB,MAAQ,EAC3BA,EAAmB,UAAY,EAC/BA,EAAmB,OAAS,EAC5BA,EAAmB,SAAW,GAC9BA,EAAmB,KAAO,GAC1BA,EAAmB,MAAQ,GAC3BA,EAAmB,KAAO,GAC1BA,EAAmB,QAAU,GAC7BA,EAAmB,QAAU,GAC7BA,EAAmB,MAAQ,GAC3BA,EAAmB,KAAO,GAC1BA,EAAmB,UAAY,GAC/BA,EAAmB,OAAS,GAC5BA,EAAmB,WAAa,GAChCA,EAAmB,SAAW,GAC9BA,EAAmB,OAAS,GAC5BA,EAAmB,MAAQ,GAC3BA,EAAmB,SAAW,GAC9BA,EAAmB,cAAgB,EACvC,GAAGA,KAAuBA,GAAqB,CAAC,EAAE,EAK3C,IAAIC,IACV,SAAUA,EAAkB,CAIzBA,EAAiB,UAAY,EAW7BA,EAAiB,QAAU,CAC/B,GAAGA,KAAqBA,GAAmB,CAAC,EAAE,EAOvC,IAAIC,IACV,SAAUA,EAAmB,CAI1BA,EAAkB,WAAa,CACnC,GAAGA,KAAsBA,GAAoB,CAAC,EAAE,EAMzC,IAAIC,IACV,SAAUA,EAAmB,CAI1B,SAASlB,EAAOmB,EAASC,EAAQC,EAAS,CACtC,MAAO,CAAE,QAAAF,EAAS,OAAAC,EAAQ,QAAAC,CAAQ,CACtC,CAFSnB,EAAAF,EAAA,UAGTkB,EAAkB,OAASlB,EAI3B,SAASG,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAOC,GAAaC,EAAG,OAAOD,EAAU,OAAO,GAAKiB,EAAM,GAAGjB,EAAU,MAAM,GAAKiB,EAAM,GAAGjB,EAAU,OAAO,CAChH,CAHSH,EAAAC,EAAA,MAITe,EAAkB,GAAKf,CAC3B,GAAGe,KAAsBA,GAAoB,CAAC,EAAE,EAOzC,IAAIK,IACV,SAAUA,EAAgB,CAQvBA,EAAe,KAAO,EAUtBA,EAAe,kBAAoB,CACvC,GAAGA,KAAmBA,GAAiB,CAAC,EAAE,EACnC,IAAIC,IACV,SAAUA,EAA4B,CACnC,SAASrB,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAOC,IAAcC,EAAG,OAAOD,EAAU,MAAM,GAAKA,EAAU,SAAW,UACpEC,EAAG,OAAOD,EAAU,WAAW,GAAKA,EAAU,cAAgB,OACvE,CAJSH,EAAAC,EAAA,MAKTqB,EAA2B,GAAKrB,CACpC,GAAGqB,KAA+BA,GAA6B,CAAC,EAAE,EAK3D,IAAIC,IACV,SAAUA,EAAgB,CAKvB,SAASzB,EAAO0B,EAAO,CACnB,MAAO,CAAE,MAAAA,CAAM,CACnB,CAFSxB,EAAAF,EAAA,UAGTyB,EAAe,OAASzB,CAC5B,GAAGyB,KAAmBA,GAAiB,CAAC,EAAE,EAKnC,IAAIE,IACV,SAAUA,EAAgB,CAOvB,SAAS3B,EAAO4B,EAAOC,EAAc,CACjC,MAAO,CAAE,MAAOD,GAAgB,CAAC,EAAG,aAAc,CAAC,CAACC,CAAa,CACrE,CAFS3B,EAAAF,EAAA,UAGT2B,EAAe,OAAS3B,CAC5B,GAAG2B,KAAmBA,GAAiB,CAAC,EAAE,EACnC,IAAIG,IACV,SAAUA,EAAc,CAMrB,SAASC,EAAcC,EAAW,CAC9B,OAAOA,EAAU,QAAQ,wBAAyB,MAAM,CAC5D,CAFS9B,EAAA6B,EAAA,iBAGTD,EAAa,cAAgBC,EAI7B,SAAS5B,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAOE,EAAG,OAAOD,CAAS,GAAMC,EAAG,cAAcD,CAAS,GAAKC,EAAG,OAAOD,EAAU,QAAQ,GAAKC,EAAG,OAAOD,EAAU,KAAK,CAC7H,CAHSH,EAAAC,EAAA,MAIT2B,EAAa,GAAK3B,CACtB,GAAG2B,KAAiBA,GAAe,CAAC,EAAE,EAC/B,IAAIG,IACV,SAAUA,EAAO,CAId,SAAS9B,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,MAAO,CAAC,CAACC,GAAaC,EAAG,cAAcD,CAAS,IAAMS,GAAc,GAAGT,EAAU,QAAQ,GACrFyB,GAAa,GAAGzB,EAAU,QAAQ,GAClCC,EAAG,WAAWD,EAAU,SAAUyB,GAAa,EAAE,KAAO1B,EAAM,QAAU,QAAakB,EAAM,GAAGlB,EAAM,KAAK,EACjH,CALSF,EAAAC,EAAA,MAMT8B,EAAM,GAAK9B,CACf,GAAG8B,KAAUA,GAAQ,CAAC,EAAE,EAKjB,IAAIC,IACV,SAAUA,EAAsB,CAO7B,SAASlC,EAAO0B,EAAOS,EAAe,CAClC,OAAOA,EAAgB,CAAE,MAAAT,EAAO,cAAAS,CAAc,EAAI,CAAE,MAAAT,CAAM,CAC9D,CAFSxB,EAAAF,EAAA,UAGTkC,EAAqB,OAASlC,CAClC,GAAGkC,KAAyBA,GAAuB,CAAC,EAAE,EAK/C,IAAIE,IACV,SAAUA,EAAsB,CAC7B,SAASpC,EAAO0B,EAAOS,KAAkBE,EAAY,CACjD,IAAIC,EAAS,CAAE,MAAAZ,CAAM,EACrB,OAAIpB,EAAG,QAAQ6B,CAAa,IACxBG,EAAO,cAAgBH,GAEvB7B,EAAG,QAAQ+B,CAAU,EACrBC,EAAO,WAAaD,EAGpBC,EAAO,WAAa,CAAC,EAElBA,CACX,CAZSpC,EAAAF,EAAA,UAaToC,EAAqB,OAASpC,CAClC,GAAGoC,KAAyBA,GAAuB,CAAC,EAAE,EAI/C,IAAIG,IACV,SAAUA,EAAuB,CAI9BA,EAAsB,KAAO,EAI7BA,EAAsB,KAAO,EAI7BA,EAAsB,MAAQ,CAClC,GAAGA,KAA0BA,GAAwB,CAAC,EAAE,EAKjD,IAAIC,IACV,SAAUA,EAAmB,CAM1B,SAASxC,EAAOyC,EAAOC,EAAM,CACzB,IAAIJ,EAAS,CAAE,MAAAG,CAAM,EACrB,OAAInC,EAAG,OAAOoC,CAAI,IACdJ,EAAO,KAAOI,GAEXJ,CACX,CANSpC,EAAAF,EAAA,UAOTwC,EAAkB,OAASxC,CAC/B,GAAGwC,KAAsBA,GAAoB,CAAC,EAAE,EAIzC,IAAIG,IACV,SAAUA,EAAY,CACnBA,EAAW,KAAO,EAClBA,EAAW,OAAS,EACpBA,EAAW,UAAY,EACvBA,EAAW,QAAU,EACrBA,EAAW,MAAQ,EACnBA,EAAW,OAAS,EACpBA,EAAW,SAAW,EACtBA,EAAW,MAAQ,EACnBA,EAAW,YAAc,EACzBA,EAAW,KAAO,GAClBA,EAAW,UAAY,GACvBA,EAAW,SAAW,GACtBA,EAAW,SAAW,GACtBA,EAAW,SAAW,GACtBA,EAAW,OAAS,GACpBA,EAAW,OAAS,GACpBA,EAAW,QAAU,GACrBA,EAAW,MAAQ,GACnBA,EAAW,OAAS,GACpBA,EAAW,IAAM,GACjBA,EAAW,KAAO,GAClBA,EAAW,WAAa,GACxBA,EAAW,OAAS,GACpBA,EAAW,MAAQ,GACnBA,EAAW,SAAW,GACtBA,EAAW,cAAgB,EAC/B,GAAGA,KAAeA,GAAa,CAAC,EAAE,EAM3B,IAAIC,IACV,SAAUA,EAAW,CAIlBA,EAAU,WAAa,CAC3B,GAAGA,KAAcA,GAAY,CAAC,EAAE,EACzB,IAAIC,IACV,SAAUA,EAAmB,CAU1B,SAAS7C,EAAO8C,EAAMJ,EAAMD,EAAOxC,EAAK8C,EAAe,CACnD,IAAIT,EAAS,CACT,KAAAQ,EACA,KAAAJ,EACA,SAAU,CAAE,IAAAzC,EAAK,MAAAwC,CAAM,CAC3B,EACA,OAAIM,IACAT,EAAO,cAAgBS,GAEpBT,CACX,CAVSpC,EAAAF,EAAA,UAWT6C,EAAkB,OAAS7C,CAC/B,GAAG6C,KAAsBA,GAAoB,CAAC,EAAE,EACzC,IAAIG,IACV,SAAUA,EAAiB,CAUxB,SAAShD,EAAO8C,EAAMJ,EAAMzC,EAAKwC,EAAO,CACpC,OAAOA,IAAU,OACX,CAAE,KAAAK,EAAM,KAAAJ,EAAM,SAAU,CAAE,IAAAzC,EAAK,MAAAwC,CAAM,CAAE,EACvC,CAAE,KAAAK,EAAM,KAAAJ,EAAM,SAAU,CAAE,IAAAzC,CAAI,CAAE,CAC1C,CAJSC,EAAAF,EAAA,UAKTgD,EAAgB,OAAShD,CAC7B,GAAGgD,KAAoBA,GAAkB,CAAC,EAAE,EACrC,IAAIC,IACV,SAAUA,EAAgB,CAWvB,SAASjD,EAAO8C,EAAMI,EAAQR,EAAMD,EAAOU,EAAgBC,EAAU,CACjE,IAAId,EAAS,CACT,KAAAQ,EACA,OAAAI,EACA,KAAAR,EACA,MAAAD,EACA,eAAAU,CACJ,EACA,OAAIC,IAAa,SACbd,EAAO,SAAWc,GAEfd,CACX,CAZSpC,EAAAF,EAAA,UAaTiD,EAAe,OAASjD,EAIxB,SAASG,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,OAAOC,GACHC,EAAG,OAAOD,EAAU,IAAI,GAAKC,EAAG,OAAOD,EAAU,IAAI,GACrDiB,EAAM,GAAGjB,EAAU,KAAK,GAAKiB,EAAM,GAAGjB,EAAU,cAAc,IAC7DA,EAAU,SAAW,QAAaC,EAAG,OAAOD,EAAU,MAAM,KAC5DA,EAAU,aAAe,QAAaC,EAAG,QAAQD,EAAU,UAAU,KACrEA,EAAU,WAAa,QAAa,MAAM,QAAQA,EAAU,QAAQ,KACpEA,EAAU,OAAS,QAAa,MAAM,QAAQA,EAAU,IAAI,EACrE,CATSH,EAAAC,EAAA,MAUT8C,EAAe,GAAK9C,CACxB,GAAG8C,KAAmBA,GAAiB,CAAC,EAAE,EAInC,IAAII,IACV,SAAUA,EAAgB,CAIvBA,EAAe,MAAQ,GAIvBA,EAAe,SAAW,WAI1BA,EAAe,SAAW,WAY1BA,EAAe,gBAAkB,mBAWjCA,EAAe,eAAiB,kBAahCA,EAAe,gBAAkB,mBAMjCA,EAAe,OAAS,SAIxBA,EAAe,sBAAwB,yBASvCA,EAAe,aAAe,eAClC,GAAGA,KAAmBA,GAAiB,CAAC,EAAE,EAMnC,IAAIC,IACV,SAAUA,EAAuB,CAI9BA,EAAsB,QAAU,EAOhCA,EAAsB,UAAY,CACtC,GAAGA,KAA0BA,GAAwB,CAAC,EAAE,EAKjD,IAAIC,IACV,SAAUA,EAAmB,CAI1B,SAASvD,EAAOwD,EAAaC,EAAMC,EAAa,CAC5C,IAAIpB,EAAS,CAAE,YAAAkB,CAAY,EAC3B,OAA0BC,GAAS,OAC/BnB,EAAO,KAAOmB,GAEeC,GAAgB,OAC7CpB,EAAO,YAAcoB,GAElBpB,CACX,CATSpC,EAAAF,EAAA,UAUTuD,EAAkB,OAASvD,EAI3B,SAASG,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,OAAOE,EAAG,QAAQD,CAAS,GAAKC,EAAG,WAAWD,EAAU,YAAasD,GAAW,EAAE,IAC1EtD,EAAU,OAAS,QAAaC,EAAG,WAAWD,EAAU,KAAMC,EAAG,MAAM,KACvED,EAAU,cAAgB,QAAaA,EAAU,cAAgBiD,GAAsB,SAAWjD,EAAU,cAAgBiD,GAAsB,UAC9J,CALSpD,EAAAC,EAAA,MAMToD,EAAkB,GAAKpD,CAC3B,GAAGoD,KAAsBA,GAAoB,CAAC,EAAE,EACzC,IAAIK,IACV,SAAUA,EAAY,CACnB,SAAS5D,EAAO6D,EAAOC,EAAqBpB,EAAM,CAC9C,IAAIJ,EAAS,CAAE,MAAAuB,CAAM,EACjBE,EAAY,GAChB,OAAI,OAAOD,GAAwB,UAC/BC,EAAY,GACZzB,EAAO,KAAOwB,GAETE,GAAQ,GAAGF,CAAmB,EACnCxB,EAAO,QAAUwB,EAGjBxB,EAAO,KAAOwB,EAEdC,GAAarB,IAAS,SACtBJ,EAAO,KAAOI,GAEXJ,CACX,CAjBSpC,EAAAF,EAAA,UAkBT4D,EAAW,OAAS5D,EACpB,SAASG,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,OAAOC,GAAaC,EAAG,OAAOD,EAAU,KAAK,IACxCA,EAAU,cAAgB,QAAaC,EAAG,WAAWD,EAAU,YAAasD,GAAW,EAAE,KACzFtD,EAAU,OAAS,QAAaC,EAAG,OAAOD,EAAU,IAAI,KACxDA,EAAU,OAAS,QAAaA,EAAU,UAAY,UACtDA,EAAU,UAAY,QAAa2D,GAAQ,GAAG3D,EAAU,OAAO,KAC/DA,EAAU,cAAgB,QAAaC,EAAG,QAAQD,EAAU,WAAW,KACvEA,EAAU,OAAS,QAAa4D,GAAc,GAAG5D,EAAU,IAAI,EACxE,CATSH,EAAAC,EAAA,MAUTyD,EAAW,GAAKzD,CACpB,GAAGyD,KAAeA,GAAa,CAAC,EAAE,EAK3B,IAAIM,IACV,SAAUA,EAAU,CAIjB,SAASlE,EAAOyC,EAAO0B,EAAM,CACzB,IAAI7B,EAAS,CAAE,MAAAG,CAAM,EACrB,OAAInC,EAAG,QAAQ6D,CAAI,IACf7B,EAAO,KAAO6B,GAEX7B,CACX,CANSpC,EAAAF,EAAA,UAOTkE,EAAS,OAASlE,EAIlB,SAASG,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,OAAOE,EAAG,QAAQD,CAAS,GAAKiB,EAAM,GAAGjB,EAAU,KAAK,IAAMC,EAAG,UAAUD,EAAU,OAAO,GAAK2D,GAAQ,GAAG3D,EAAU,OAAO,EACjI,CAHSH,EAAAC,EAAA,MAIT+D,EAAS,GAAK/D,CAClB,GAAG+D,KAAaA,GAAW,CAAC,EAAE,EAKvB,IAAIE,IACV,SAAUA,EAAmB,CAI1B,SAASpE,EAAOqE,EAASC,EAAc,CACnC,MAAO,CAAE,QAAAD,EAAS,aAAAC,CAAa,CACnC,CAFSpE,EAAAF,EAAA,UAGToE,EAAkB,OAASpE,EAI3B,SAASG,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,OAAOE,EAAG,QAAQD,CAAS,GAAKC,EAAG,SAASD,EAAU,OAAO,GAAKC,EAAG,QAAQD,EAAU,YAAY,CACvG,CAHSH,EAAAC,EAAA,MAITiE,EAAkB,GAAKjE,CAC3B,GAAGiE,KAAsBA,GAAoB,CAAC,EAAE,EAKzC,IAAIG,IACV,SAAUA,EAAc,CAIrB,SAASvE,EAAOyC,EAAO+B,EAAQL,EAAM,CACjC,MAAO,CAAE,MAAA1B,EAAO,OAAA+B,EAAQ,KAAAL,CAAK,CACjC,CAFSjE,EAAAF,EAAA,UAGTuE,EAAa,OAASvE,EAItB,SAASG,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,OAAOE,EAAG,QAAQD,CAAS,GAAKiB,EAAM,GAAGjB,EAAU,KAAK,IAAMC,EAAG,UAAUD,EAAU,MAAM,GAAKC,EAAG,OAAOD,EAAU,MAAM,EAC9H,CAHSH,EAAAC,EAAA,MAIToE,EAAa,GAAKpE,CACtB,GAAGoE,KAAiBA,GAAe,CAAC,EAAE,EAK/B,IAAIE,IACV,SAAUA,EAAgB,CAMvB,SAASzE,EAAOyC,EAAOiC,EAAQ,CAC3B,MAAO,CAAE,MAAAjC,EAAO,OAAAiC,CAAO,CAC3B,CAFSxE,EAAAF,EAAA,UAGTyE,EAAe,OAASzE,EACxB,SAASG,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,OAAOE,EAAG,cAAcD,CAAS,GAAKiB,EAAM,GAAGjB,EAAU,KAAK,IAAMA,EAAU,SAAW,QAAaoE,EAAe,GAAGpE,EAAU,MAAM,EAC5I,CAHSH,EAAAC,EAAA,MAITsE,EAAe,GAAKtE,CACxB,GAAGsE,KAAmBA,GAAiB,CAAC,EAAE,EAQnC,IAAIE,IACV,SAAUA,EAAoB,CAC3BA,EAAmB,UAAe,YAKlCA,EAAmB,KAAU,OAC7BA,EAAmB,MAAW,QAC9BA,EAAmB,KAAU,OAC7BA,EAAmB,UAAe,YAClCA,EAAmB,OAAY,SAC/BA,EAAmB,cAAmB,gBACtCA,EAAmB,UAAe,YAClCA,EAAmB,SAAc,WACjCA,EAAmB,SAAc,WACjCA,EAAmB,WAAgB,aACnCA,EAAmB,MAAW,QAC9BA,EAAmB,SAAc,WACjCA,EAAmB,OAAY,SAC/BA,EAAmB,MAAW,QAC9BA,EAAmB,QAAa,UAChCA,EAAmB,SAAc,WACjCA,EAAmB,QAAa,UAChCA,EAAmB,OAAY,SAC/BA,EAAmB,OAAY,SAC/BA,EAAmB,OAAY,SAC/BA,EAAmB,SAAc,WAIjCA,EAAmB,UAAe,WACtC,GAAGA,KAAuBA,GAAqB,CAAC,EAAE,EAQ3C,IAAIC,IACV,SAAUA,EAAwB,CAC/BA,EAAuB,YAAiB,cACxCA,EAAuB,WAAgB,aACvCA,EAAuB,SAAc,WACrCA,EAAuB,OAAY,SACnCA,EAAuB,WAAgB,aACvCA,EAAuB,SAAc,WACrCA,EAAuB,MAAW,QAClCA,EAAuB,aAAkB,eACzCA,EAAuB,cAAmB,gBAC1CA,EAAuB,eAAoB,gBAC/C,GAAGA,KAA2BA,GAAyB,CAAC,EAAE,EAInD,IAAIC,IACV,SAAUA,EAAgB,CACvB,SAAS1E,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAOE,EAAG,cAAcD,CAAS,IAAMA,EAAU,WAAa,QAAa,OAAOA,EAAU,UAAa,WACrG,MAAM,QAAQA,EAAU,IAAI,IAAMA,EAAU,KAAK,SAAW,GAAK,OAAOA,EAAU,KAAK,CAAC,GAAM,SACtG,CAJSH,EAAAC,EAAA,MAKT0E,EAAe,GAAK1E,CACxB,GAAG0E,KAAmBA,GAAiB,CAAC,EAAE,EAMnC,IAAIC,IACV,SAAUA,EAAiB,CAIxB,SAAS9E,EAAOyC,EAAO7B,EAAM,CACzB,MAAO,CAAE,MAAA6B,EAAO,KAAA7B,CAAK,CACzB,CAFSV,EAAAF,EAAA,UAGT8E,EAAgB,OAAS9E,EACzB,SAASG,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAkCC,GAAc,MAAQiB,EAAM,GAAGjB,EAAU,KAAK,GAAKC,EAAG,OAAOD,EAAU,IAAI,CACjH,CAHSH,EAAAC,EAAA,MAIT2E,EAAgB,GAAK3E,CACzB,GAAG2E,KAAoBA,GAAkB,CAAC,EAAE,EAMrC,IAAIC,IACV,SAAUA,EAA2B,CAIlC,SAAS/E,EAAOyC,EAAOuC,EAAcC,EAAqB,CACtD,MAAO,CAAE,MAAAxC,EAAO,aAAAuC,EAAc,oBAAAC,CAAoB,CACtD,CAFS/E,EAAAF,EAAA,UAGT+E,EAA0B,OAAS/E,EACnC,SAASG,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAkCC,GAAc,MAAQiB,EAAM,GAAGjB,EAAU,KAAK,GAAKC,EAAG,QAAQD,EAAU,mBAAmB,IACrHC,EAAG,OAAOD,EAAU,YAAY,GAAKA,EAAU,eAAiB,OAC5E,CAJSH,EAAAC,EAAA,MAKT4E,EAA0B,GAAK5E,CACnC,GAAG4E,KAA8BA,GAA4B,CAAC,EAAE,EAMzD,IAAIG,IACV,SAAUA,EAAkC,CAIzC,SAASlF,EAAOyC,EAAO0C,EAAY,CAC/B,MAAO,CAAE,MAAA1C,EAAO,WAAA0C,CAAW,CAC/B,CAFSjF,EAAAF,EAAA,UAGTkF,EAAiC,OAASlF,EAC1C,SAASG,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAkCC,GAAc,MAAQiB,EAAM,GAAGjB,EAAU,KAAK,IACxEC,EAAG,OAAOD,EAAU,UAAU,GAAKA,EAAU,aAAe,OACxE,CAJSH,EAAAC,EAAA,MAKT+E,EAAiC,GAAK/E,CAC1C,GAAG+E,KAAqCA,GAAmC,CAAC,EAAE,EAOvE,IAAIE,IACV,SAAUA,EAAoB,CAI3B,SAASpF,EAAOqF,EAASC,EAAiB,CACtC,MAAO,CAAE,QAAAD,EAAS,gBAAAC,CAAgB,CACtC,CAFSpF,EAAAF,EAAA,UAGToF,EAAmB,OAASpF,EAI5B,SAASG,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAOE,EAAG,QAAQD,CAAS,GAAKiB,EAAM,GAAGlB,EAAM,eAAe,CAClE,CAHSF,EAAAC,EAAA,MAITiF,EAAmB,GAAKjF,CAC5B,GAAGiF,KAAuBA,GAAqB,CAAC,EAAE,EAM3C,IAAIG,IACV,SAAUA,EAAe,CAItBA,EAAc,KAAO,EAIrBA,EAAc,UAAY,EAC1B,SAASpF,EAAGC,EAAO,CACf,OAAOA,IAAU,GAAKA,IAAU,CACpC,CAFSF,EAAAC,EAAA,MAGToF,EAAc,GAAKpF,CACvB,GAAGoF,KAAkBA,GAAgB,CAAC,EAAE,EACjC,IAAIC,IACV,SAAUA,EAAoB,CAC3B,SAASxF,EAAOI,EAAO,CACnB,MAAO,CAAE,MAAAA,CAAM,CACnB,CAFSF,EAAAF,EAAA,UAGTwF,EAAmB,OAASxF,EAC5B,SAASG,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAOE,EAAG,cAAcD,CAAS,IACzBA,EAAU,UAAY,QAAaC,EAAG,OAAOD,EAAU,OAAO,GAAKS,GAAc,GAAGT,EAAU,OAAO,KACrGA,EAAU,WAAa,QAAaoF,GAAS,GAAGpF,EAAU,QAAQ,KAClEA,EAAU,UAAY,QAAa2D,GAAQ,GAAG3D,EAAU,OAAO,EAC3E,CANSH,EAAAC,EAAA,MAOTqF,EAAmB,GAAKrF,CAC5B,GAAGqF,KAAuBA,GAAqB,CAAC,EAAE,EAC3C,IAAIE,IACV,SAAUA,EAAW,CAClB,SAAS1F,EAAO2F,EAAUjE,EAAOgB,EAAM,CACnC,IAAMJ,EAAS,CAAE,SAAAqD,EAAU,MAAAjE,CAAM,EACjC,OAAIgB,IAAS,SACTJ,EAAO,KAAOI,GAEXJ,CACX,CANSpC,EAAAF,EAAA,UAOT0F,EAAU,OAAS1F,EACnB,SAASG,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAOE,EAAG,cAAcD,CAAS,GAAKuF,EAAS,GAAGvF,EAAU,QAAQ,IAC5DC,EAAG,OAAOD,EAAU,KAAK,GAAKC,EAAG,WAAWD,EAAU,MAAOmF,GAAmB,EAAE,KAClFnF,EAAU,OAAS,QAAakF,GAAc,GAAGlF,EAAU,IAAI,IAC/DA,EAAU,YAAc,QAAcC,EAAG,WAAWD,EAAU,UAAWwF,GAAS,EAAE,IACpFxF,EAAU,UAAY,QAAaC,EAAG,OAAOD,EAAU,OAAO,GAAKS,GAAc,GAAGT,EAAU,OAAO,KACrGA,EAAU,cAAgB,QAAaC,EAAG,QAAQD,EAAU,WAAW,KACvEA,EAAU,eAAiB,QAAaC,EAAG,QAAQD,EAAU,YAAY,EACrF,CATSH,EAAAC,EAAA,MAUTuF,EAAU,GAAKvF,CACnB,GAAGuF,KAAcA,GAAY,CAAC,EAAE,EACzB,IAAII,IACV,SAAUA,EAAa,CACpB,SAASC,EAAc3F,EAAO,CAC1B,MAAO,CAAE,KAAM,UAAW,MAAAA,CAAM,CACpC,CAFSF,EAAA6F,EAAA,iBAGTD,EAAY,cAAgBC,CAChC,GAAGD,KAAgBA,GAAc,CAAC,EAAE,EAC7B,IAAIE,IACV,SAAUA,EAAsB,CAC7B,SAAShG,EAAOiG,EAAYC,EAAYzD,EAAO0D,EAAS,CACpD,MAAO,CAAE,WAAAF,EAAY,WAAAC,EAAY,MAAAzD,EAAO,QAAA0D,CAAQ,CACpD,CAFSjG,EAAAF,EAAA,UAGTgG,EAAqB,OAAShG,CAClC,GAAGgG,KAAyBA,GAAuB,CAAC,EAAE,EAC/C,IAAII,IACV,SAAUA,EAAsB,CAC7B,SAASpG,EAAO4B,EAAO,CACnB,MAAO,CAAE,MAAAA,CAAM,CACnB,CAFS1B,EAAAF,EAAA,UAGToG,EAAqB,OAASpG,CAClC,GAAGoG,KAAyBA,GAAuB,CAAC,EAAE,EAO/C,IAAIC,IACV,SAAUA,EAA6B,CAIpCA,EAA4B,QAAU,EAItCA,EAA4B,UAAY,CAC5C,GAAGA,KAAgCA,GAA8B,CAAC,EAAE,EAC7D,IAAIC,IACV,SAAUA,EAAwB,CAC/B,SAAStG,EAAOyC,EAAO7B,EAAM,CACzB,MAAO,CAAE,MAAA6B,EAAO,KAAA7B,CAAK,CACzB,CAFSV,EAAAF,EAAA,UAGTsG,EAAuB,OAAStG,CACpC,GAAGsG,KAA2BA,GAAyB,CAAC,EAAE,EACnD,IAAIC,IACV,SAAUA,EAAyB,CAChC,SAASvG,EAAO0D,EAAa8C,EAAwB,CACjD,MAAO,CAAE,YAAA9C,EAAa,uBAAA8C,CAAuB,CACjD,CAFStG,EAAAF,EAAA,UAGTuG,EAAwB,OAASvG,CACrC,GAAGuG,KAA4BA,GAA0B,CAAC,EAAE,EACrD,IAAIE,IACV,SAAUA,EAAiB,CACxB,SAAStG,EAAGC,EAAO,CACf,IAAMC,EAAYD,EAClB,OAAOE,EAAG,cAAcD,CAAS,GAAKqG,GAAI,GAAGrG,EAAU,GAAG,GAAKC,EAAG,OAAOD,EAAU,IAAI,CAC3F,CAHSH,EAAAC,EAAA,MAITsG,EAAgB,GAAKtG,CACzB,GAAGsG,KAAoBA,GAAkB,CAAC,EAAE,EAKrC,IAAIE,IACV,SAAUA,EAAc,CAQrB,SAASC,EAAOC,EAAKC,EAAYC,EAASC,EAAS,CAC/C,OAAO,IAAIC,GAAiBJ,EAAKC,EAAYC,EAASC,CAAO,CACjE,CAFSE,EAAAN,EAAA,UAGTD,EAAa,OAASC,EAItB,SAASO,EAAGC,EAAO,CACf,IAAIC,EAAYD,EAChB,MAAO,GAAAE,EAAG,QAAQD,CAAS,GAAKC,EAAG,OAAOD,EAAU,GAAG,IAAMC,EAAG,UAAUD,EAAU,UAAU,GAAKC,EAAG,OAAOD,EAAU,UAAU,IAAMC,EAAG,SAASD,EAAU,SAAS,GAC/JC,EAAG,KAAKD,EAAU,OAAO,GAAKC,EAAG,KAAKD,EAAU,UAAU,GAAKC,EAAG,KAAKD,EAAU,QAAQ,EACpG,CAJSH,EAAAC,EAAA,MAKTR,EAAa,GAAKQ,EAClB,SAASI,EAAWC,EAAUC,EAAO,CACjC,IAAIC,EAAOF,EAAS,QAAQ,EACxBG,EAAcC,EAAUH,EAAO,CAACI,EAAGC,IAAM,CACzC,IAAIC,EAAOF,EAAE,MAAM,MAAM,KAAOC,EAAE,MAAM,MAAM,KAC9C,OAAIC,IAAS,EACFF,EAAE,MAAM,MAAM,UAAYC,EAAE,MAAM,MAAM,UAE5CC,CACX,CAAC,EACGC,EAAqBN,EAAK,OAC9B,QAASO,EAAIN,EAAY,OAAS,EAAGM,GAAK,EAAGA,IAAK,CAC9C,IAAIC,EAAIP,EAAYM,CAAC,EACjBE,EAAcX,EAAS,SAASU,EAAE,MAAM,KAAK,EAC7CE,EAAYZ,EAAS,SAASU,EAAE,MAAM,GAAG,EAC7C,GAAIE,GAAaJ,EACbN,EAAOA,EAAK,UAAU,EAAGS,CAAW,EAAID,EAAE,QAAUR,EAAK,UAAUU,EAAWV,EAAK,MAAM,MAGzF,OAAM,IAAI,MAAM,kBAAkB,EAEtCM,EAAqBG,CACzB,CACA,OAAOT,CACX,CAvBSR,EAAAK,EAAA,cAwBTZ,EAAa,WAAaY,EAC1B,SAASK,EAAUS,EAAMC,EAAS,CAC9B,GAAID,EAAK,QAAU,EAEf,OAAOA,EAEX,IAAME,EAAKF,EAAK,OAAS,EAAK,EACxBG,EAAOH,EAAK,MAAM,EAAGE,CAAC,EACtBE,EAAQJ,EAAK,MAAME,CAAC,EAC1BX,EAAUY,EAAMF,CAAO,EACvBV,EAAUa,EAAOH,CAAO,EACxB,IAAII,EAAU,EACVC,EAAW,EACXV,EAAI,EACR,KAAOS,EAAUF,EAAK,QAAUG,EAAWF,EAAM,QACnCH,EAAQE,EAAKE,CAAO,EAAGD,EAAME,CAAQ,CAAC,GACrC,EAEPN,EAAKJ,GAAG,EAAIO,EAAKE,GAAS,EAI1BL,EAAKJ,GAAG,EAAIQ,EAAME,GAAU,EAGpC,KAAOD,EAAUF,EAAK,QAClBH,EAAKJ,GAAG,EAAIO,EAAKE,GAAS,EAE9B,KAAOC,EAAWF,EAAM,QACpBJ,EAAKJ,GAAG,EAAIQ,EAAME,GAAU,EAEhC,OAAON,CACX,CA/BSnB,EAAAU,EAAA,YAgCb,GAAGjB,KAAiBA,GAAe,CAAC,EAAE,EAItC,IAAMM,GAAN,KAAuB,CAjiEvB,MAiiEuB,CAAAC,EAAA,yBACnB,YAAYL,EAAKC,EAAYC,EAASC,EAAS,CAC3C,KAAK,KAAOH,EACZ,KAAK,YAAcC,EACnB,KAAK,SAAWC,EAChB,KAAK,SAAWC,EAChB,KAAK,aAAe,MACxB,CACA,IAAI,KAAM,CACN,OAAO,KAAK,IAChB,CACA,IAAI,YAAa,CACb,OAAO,KAAK,WAChB,CACA,IAAI,SAAU,CACV,OAAO,KAAK,QAChB,CACA,QAAQ4B,EAAO,CACX,GAAIA,EAAO,CACP,IAAIC,EAAQ,KAAK,SAASD,EAAM,KAAK,EACjCE,EAAM,KAAK,SAASF,EAAM,GAAG,EACjC,OAAO,KAAK,SAAS,UAAUC,EAAOC,CAAG,CAC7C,CACA,OAAO,KAAK,QAChB,CACA,OAAOC,EAAOhC,EAAS,CACnB,KAAK,SAAWgC,EAAM,KACtB,KAAK,SAAWhC,EAChB,KAAK,aAAe,MACxB,CACA,gBAAiB,CACb,GAAI,KAAK,eAAiB,OAAW,CACjC,IAAIiC,EAAc,CAAC,EACftB,EAAO,KAAK,SACZuB,EAAc,GAClB,QAAS,EAAI,EAAG,EAAIvB,EAAK,OAAQ,IAAK,CAC9BuB,IACAD,EAAY,KAAK,CAAC,EAClBC,EAAc,IAElB,IAAIC,EAAKxB,EAAK,OAAO,CAAC,EACtBuB,EAAeC,IAAO,MAAQA,IAAO;AAAA,EACjCA,IAAO,MAAQ,EAAI,EAAIxB,EAAK,QAAUA,EAAK,OAAO,EAAI,CAAC,IAAM;AAAA,GAC7D,GAER,CACIuB,GAAevB,EAAK,OAAS,GAC7BsB,EAAY,KAAKtB,EAAK,MAAM,EAEhC,KAAK,aAAesB,CACxB,CACA,OAAO,KAAK,YAChB,CACA,WAAWG,EAAQ,CACfA,EAAS,KAAK,IAAI,KAAK,IAAIA,EAAQ,KAAK,SAAS,MAAM,EAAG,CAAC,EAC3D,IAAIH,EAAc,KAAK,eAAe,EAClCI,EAAM,EAAGC,EAAOL,EAAY,OAChC,GAAIK,IAAS,EACT,OAAOC,EAAS,OAAO,EAAGH,CAAM,EAEpC,KAAOC,EAAMC,GAAM,CACf,IAAIE,EAAM,KAAK,OAAOH,EAAMC,GAAQ,CAAC,EACjCL,EAAYO,CAAG,EAAIJ,EACnBE,EAAOE,EAGPH,EAAMG,EAAM,CAEpB,CAGA,IAAIC,EAAOJ,EAAM,EACjB,OAAOE,EAAS,OAAOE,EAAML,EAASH,EAAYQ,CAAI,CAAC,CAC3D,CACA,SAASC,EAAU,CACf,IAAIT,EAAc,KAAK,eAAe,EACtC,GAAIS,EAAS,MAAQT,EAAY,OAC7B,OAAO,KAAK,SAAS,OAEpB,GAAIS,EAAS,KAAO,EACrB,MAAO,GAEX,IAAIC,EAAaV,EAAYS,EAAS,IAAI,EACtCE,EAAkBF,EAAS,KAAO,EAAIT,EAAY,OAAUA,EAAYS,EAAS,KAAO,CAAC,EAAI,KAAK,SAAS,OAC/G,OAAO,KAAK,IAAI,KAAK,IAAIC,EAAaD,EAAS,UAAWE,CAAc,EAAGD,CAAU,CACzF,CACA,IAAI,WAAY,CACZ,OAAO,KAAK,eAAe,EAAE,MACjC,CACJ,EACIpC,GACH,SAAUA,EAAI,CACX,IAAMsC,EAAW,OAAO,UAAU,SAClC,SAASC,EAAQzC,EAAO,CACpB,OAAO,OAAOA,EAAU,GAC5B,CAFSF,EAAA2C,EAAA,WAGTvC,EAAG,QAAUuC,EACb,SAASC,EAAU1C,EAAO,CACtB,OAAO,OAAOA,EAAU,GAC5B,CAFSF,EAAA4C,EAAA,aAGTxC,EAAG,UAAYwC,EACf,SAASC,EAAQ3C,EAAO,CACpB,OAAOA,IAAU,IAAQA,IAAU,EACvC,CAFSF,EAAA6C,EAAA,WAGTzC,EAAG,QAAUyC,EACb,SAASC,EAAO5C,EAAO,CACnB,OAAOwC,EAAS,KAAKxC,CAAK,IAAM,iBACpC,CAFSF,EAAA8C,EAAA,UAGT1C,EAAG,OAAS0C,EACZ,SAASC,EAAO7C,EAAO,CACnB,OAAOwC,EAAS,KAAKxC,CAAK,IAAM,iBACpC,CAFSF,EAAA+C,EAAA,UAGT3C,EAAG,OAAS2C,EACZ,SAASC,EAAY9C,EAAO+C,EAAKC,EAAK,CAClC,OAAOR,EAAS,KAAKxC,CAAK,IAAM,mBAAqB+C,GAAO/C,GAASA,GAASgD,CAClF,CAFSlD,EAAAgD,EAAA,eAGT5C,EAAG,YAAc4C,EACjB,SAASG,EAAQjD,EAAO,CACpB,OAAOwC,EAAS,KAAKxC,CAAK,IAAM,mBAAqB,aAAeA,GAASA,GAAS,UAC1F,CAFSF,EAAAmD,EAAA,WAGT/C,EAAG,QAAU+C,EACb,SAASC,EAASlD,EAAO,CACrB,OAAOwC,EAAS,KAAKxC,CAAK,IAAM,mBAAqB,GAAKA,GAASA,GAAS,UAChF,CAFSF,EAAAoD,EAAA,YAGThD,EAAG,SAAWgD,EACd,SAASC,EAAKnD,EAAO,CACjB,OAAOwC,EAAS,KAAKxC,CAAK,IAAM,mBACpC,CAFSF,EAAAqD,EAAA,QAGTjD,EAAG,KAAOiD,EACV,SAASC,EAAcpD,EAAO,CAI1B,OAAOA,IAAU,MAAQ,OAAOA,GAAU,QAC9C,CALSF,EAAAsD,EAAA,iBAMTlD,EAAG,cAAgBkD,EACnB,SAASC,EAAWrD,EAAOsD,EAAO,CAC9B,OAAO,MAAM,QAAQtD,CAAK,GAAKA,EAAM,MAAMsD,CAAK,CACpD,CAFSxD,EAAAuD,EAAA,cAGTnD,EAAG,WAAamD,CACpB,GAAGnD,IAAOA,EAAK,CAAC,EAAE,EChqEZ,IAAOqD,GAAP,KAAqB,CAb3B,MAa2B,CAAAC,EAAA,uBAA3B,aAAA,CAGY,KAAA,UAAoC,CAAA,CAwFhD,CAtFI,IAAI,SAAO,OACP,OAAOC,EAAA,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,KAAC,MAAAA,IAAA,OAAAA,EAAI,KAAK,QAC7D,CAEA,cAAcC,EAAa,CACvB,YAAK,SAAW,IAAIC,GAAgBD,CAAK,EACzC,KAAK,SAAS,KAAO,KAAK,SAC1B,KAAK,UAAY,CAAC,KAAK,QAAQ,EACxB,KAAK,QAChB,CAEA,mBAAmBE,EAAwB,CACvC,IAAMC,EAAgB,IAAIC,GAC1B,OAAAD,EAAc,cAAgBD,EAC9BC,EAAc,KAAO,KAAK,SAC1B,KAAK,QAAQ,QAAQ,KAAKA,CAAa,EACvC,KAAK,UAAU,KAAKA,CAAa,EAC1BA,CACX,CAEA,cAAcE,EAAeH,EAAyB,CAClD,IAAMI,EAAW,IAAIC,GAAgBF,EAAM,YAAaA,EAAM,MAAM,OAAQG,GAAaH,CAAK,EAAGA,EAAM,UAAW,CAACH,CAAO,EAC1H,OAAAI,EAAS,cAAgBJ,EACzBI,EAAS,KAAO,KAAK,SACrB,KAAK,QAAQ,QAAQ,KAAKA,CAAQ,EAC3BA,CACX,CAEA,WAAWG,EAAa,CACpB,IAAMC,EAASD,EAAK,UACpB,GAAIC,EAAQ,CACR,IAAMC,EAAQD,EAAO,QAAQ,QAAQD,CAAI,EACrCE,GAAS,GACTD,EAAO,QAAQ,OAAOC,EAAO,CAAC,CAEtC,CACJ,CAEA,eAAeC,EAAgB,CAC3B,IAAMC,EAAuB,CAAA,EAC7B,QAAWR,KAASO,EAAQ,CACxB,IAAMN,EAAW,IAAIC,GAAgBF,EAAM,YAAaA,EAAM,MAAM,OAAQG,GAAaH,CAAK,EAAGA,EAAM,UAAW,EAAI,EACtHC,EAAS,KAAO,KAAK,SACrBO,EAAM,KAAKP,CAAQ,CACvB,CACA,IAAIQ,EAA4B,KAAK,QACjCC,EAAQ,GAEZ,GAAID,EAAQ,QAAQ,OAAS,EAAG,CAC5BA,EAAQ,QAAQ,KAAK,GAAGD,CAAK,EAC7B,MACJ,CAGA,KAAOC,EAAQ,WAAW,CACtB,IAAMH,EAAQG,EAAQ,UAAU,QAAQ,QAAQA,CAAO,EACvD,GAAIH,EAAQ,EAAG,CAEXG,EAAQ,UAAU,QAAQ,OAAOH,EAAO,EAAG,GAAGE,CAAK,EACnDE,EAAQ,GACR,KACJ,CACAD,EAAUA,EAAQ,SACtB,CAGKC,GACD,KAAK,SAAS,QAAQ,QAAQ,GAAGF,CAAK,CAE9C,CAEA,UAAUG,EAA+D,CACrE,IAAMF,EAAmB,KAAK,QAG1B,OAAOE,EAAK,OAAU,WACtB,KAAK,QAAQ,QAAmBA,GAEpCA,EAAK,SAAWF,EAChB,IAAML,EAAO,KAAK,UAAU,IAAG,EAG3BA,GAAM,QAAQ,SAAW,GACzB,KAAK,WAAWA,CAAI,CAE5B,GAGkBQ,GAAhB,KAA+B,CA1GrC,MA0GqC,CAAAnB,EAAA,wBAYjC,IAAI,QAAM,CACN,OAAO,KAAK,SAChB,CAGA,IAAI,SAAO,CACP,OAAO,KAAK,aAChB,CAEA,IAAI,QAAM,CACN,MAAO,EACX,CAEA,IAAI,SAAO,SACP,IAAMW,EAAO,QAAOV,EAAA,KAAK,YAAQ,MAAAA,IAAA,OAAA,OAAAA,EAAE,QAAU,SAAW,KAAK,UAAWmB,EAAA,KAAK,aAAS,MAAAA,IAAA,OAAA,OAAAA,EAAE,QACxF,GAAI,CAACT,EACD,MAAM,IAAI,MAAM,yCAAyC,EAE7D,OAAOA,CACX,CAEA,IAAI,QAAQU,EAA0B,CAClC,KAAK,SAAWA,CACpB,CAGA,IAAI,SAAO,CACP,OAAO,KAAK,OAChB,CAEA,IAAI,MAAI,CACJ,OAAO,KAAK,KAAK,SAAS,UAAU,KAAK,OAAQ,KAAK,GAAG,CAC7D,GAGSZ,GAAP,cAA+BU,EAAe,CAzJpD,MAyJoD,CAAAnB,EAAA,wBAChD,IAAI,QAAM,CACN,OAAO,KAAK,OAChB,CAEA,IAAI,QAAM,CACN,OAAO,KAAK,OAChB,CAEA,IAAI,KAAG,CACH,OAAO,KAAK,QAAU,KAAK,OAC/B,CAEA,IAAa,QAAM,CACf,OAAO,KAAK,OAChB,CAEA,IAAI,WAAS,CACT,OAAO,KAAK,UAChB,CAEA,IAAI,OAAK,CACL,OAAO,KAAK,MAChB,CAQA,YAAYsB,EAAgBC,EAAgBC,EAAcC,EAAsBC,EAAS,GAAK,CAC1F,MAAK,EACL,KAAK,QAAUA,EACf,KAAK,QAAUJ,EACf,KAAK,WAAaG,EAClB,KAAK,QAAUF,EACf,KAAK,OAASC,CAClB,GAGSlB,GAAP,cAAoCa,EAAe,CAlMzD,MAkMyD,CAAAnB,EAAA,6BAAzD,aAAA,qBACa,KAAA,QAAqB,IAAI2B,GAAiB,IAAI,CAqD3D,CAjDI,IAAI,UAAQ,CACR,OAAO,KAAK,OAChB,CAEA,IAAI,QAAM,SACN,OAAOP,GAAAnB,EAAA,KAAK,sBAAkB,MAAAA,IAAA,OAAA,OAAAA,EAAE,UAAM,MAAAmB,IAAA,OAAAA,EAAI,CAC9C,CAEA,IAAI,QAAM,CACN,OAAO,KAAK,IAAM,KAAK,MAC3B,CAEA,IAAI,KAAG,SACH,OAAOA,GAAAnB,EAAA,KAAK,qBAAiB,MAAAA,IAAA,OAAA,OAAAA,EAAE,OAAG,MAAAmB,IAAA,OAAAA,EAAI,CAC1C,CAEA,IAAI,OAAK,CACL,IAAMQ,EAAY,KAAK,mBACjBC,EAAW,KAAK,kBACtB,GAAID,GAAaC,EAAU,CACvB,GAAI,KAAK,cAAgB,OAAW,CAChC,GAAM,CAAE,MAAOC,CAAU,EAAKF,EACxB,CAAE,MAAOG,CAAS,EAAKF,EAC7B,KAAK,YAAc,CAAE,MAAOC,EAAW,MAAO,IAAKC,EAAU,IAAI,KAAOD,EAAW,MAAM,KAAOA,EAAW,MAAQC,EAAU,GAAG,CACpI,CACA,OAAO,KAAK,WAChB,KACI,OAAO,CAAE,MAAOC,EAAS,OAAO,EAAG,CAAC,EAAG,IAAKA,EAAS,OAAO,EAAG,CAAC,CAAC,CAEzE,CAEA,IAAY,oBAAkB,CAC1B,QAAWC,KAAS,KAAK,QACrB,GAAI,CAACA,EAAM,OACP,OAAOA,EAGf,OAAO,KAAK,QAAQ,CAAC,CACzB,CAEA,IAAY,mBAAiB,CACzB,QAASC,EAAI,KAAK,QAAQ,OAAS,EAAGA,GAAK,EAAGA,IAAK,CAC/C,IAAMD,EAAQ,KAAK,QAAQC,CAAC,EAC5B,GAAI,CAACD,EAAM,OACP,OAAOA,CAEf,CACA,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAS,CAAC,CAC/C,GAGEN,GAAN,MAAMQ,UAAyB,KAAc,CA1P7C,MA0P6C,CAAAnC,EAAA,yBAGzC,YAAYY,EAAwB,CAChC,MAAK,EACL,KAAK,OAASA,EACd,OAAO,eAAe,KAAMuB,EAAiB,SAAS,CAC1D,CAES,QAAQC,EAAgB,CAC7B,YAAK,WAAWA,CAAK,EACd,MAAM,KAAK,GAAGA,CAAK,CAC9B,CAES,WAAWA,EAAgB,CAChC,YAAK,WAAWA,CAAK,EACd,MAAM,QAAQ,GAAGA,CAAK,CACjC,CAES,OAAOC,EAAeC,KAAkBF,EAAgB,CAC7D,YAAK,WAAWA,CAAK,EACd,MAAM,OAAOC,EAAOC,EAAO,GAAGF,CAAK,CAC9C,CAEQ,WAAWA,EAAgB,CAC/B,QAAWlB,KAAQkB,EACGlB,EAAM,UAAY,KAAK,MAEjD,GAGSf,GAAP,cAA+BG,EAAoB,CAzRzD,MAyRyD,CAAAN,EAAA,wBAGrD,IAAa,MAAI,CACb,OAAO,KAAK,MAAM,UAAU,KAAK,OAAQ,KAAK,GAAG,CACrD,CAEA,IAAI,UAAQ,CACR,OAAO,KAAK,KAChB,CAEA,YAAYE,EAAc,CACtB,MAAK,EAXD,KAAA,MAAQ,GAYZ,KAAK,MAAQA,GAAS,EAC1B,GCzQG,IAAMqC,GAAiB,OAAO,UAAU,EAU/C,SAASC,GAAeC,EAA4C,CAChE,OAAOA,EAAK,QAAUF,EAC1B,CAFSG,EAAAF,GAAA,kBAkFT,IAAMG,GAAa,SACbC,GAAiBF,EAACG,GAAyBA,EAAK,SAASF,EAAU,EAAIE,EAAOA,EAAOF,GAApE,kBAEDG,GAAhB,KAAqC,CA7H3C,MA6H2C,CAAAJ,EAAA,8BASvC,YAAYK,EAA6B,CAL/B,KAAA,iBAA2C,IAAI,IAE/C,KAAA,SAAW,IAAI,IAIrB,KAAK,MAAQA,EAAS,OAAO,MAC7B,IAAMC,EAAS,KAAK,MAAM,WACpBC,EAAaF,EAAS,iBAAiB,OAAS,aACtD,KAAK,QAAU,IAAIG,GAAkBF,EAAM,OAAA,OAAA,OAAA,OAAA,CAAA,EACpCD,EAAS,OAAO,YAAY,EAAA,CAC/B,gBAAiBE,EACjB,qBAAsBF,EAAS,OAAO,0BAA0B,CAAA,CAAA,CAExE,CAEA,aAAaI,EAAaC,EAA2B,CACjD,KAAK,QAAQ,OAAOD,EAAKC,CAAO,CACpC,CAEA,SAASD,EAAaE,EAAgC,CAClD,KAAK,QAAQ,WAAWF,EAAKE,CAAQ,CACzC,CAEA,KAAKF,EAAaE,EAAgC,CAC9C,KAAK,QAAQ,SAASF,EAAKE,CAAQ,CACvC,CAEA,WAAWF,EAAaE,EAAgC,CACpD,KAAK,QAAQ,eAAeF,EAAKE,CAAQ,CAC7C,CAQA,QAAQR,EAAY,CAChB,OAAO,KAAK,SAAS,IAAIA,CAAI,CACjC,CAEA,aAAW,CACP,OAAO,KAAK,QAAQ,YACxB,CAEA,IAAI,iBAAe,CACf,OAAO,KAAK,gBAChB,CAEA,cAAY,CACR,OAAQ,KAAK,QAAgB,UACjC,CAEA,UAAQ,CACJ,KAAK,QAAQ,iBAAgB,CACjC,GAOSS,GAAP,cAA6BR,EAAqB,CAhMxD,MAgMwD,CAAAJ,EAAA,sBASpD,IAAY,SAAO,CACf,OAAO,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,CAC3C,CAEA,YAAYK,EAA6B,CACrC,MAAMA,CAAQ,EAVD,KAAA,YAAc,IAAIQ,GAE3B,KAAA,MAAe,CAAA,EACf,KAAA,cAAgB,IAAI,IAQxB,KAAK,OAASR,EAAS,WAAW,OAClC,KAAK,UAAYA,EAAS,OAAO,eACjC,KAAK,cAAgBA,EAAS,OAAO,aACzC,CAEA,KAAKS,EAAkBC,EAAc,CACjC,IAAMC,EAAO,KAAK,gBAAgBF,CAAI,EAChCG,EAAa,KAAK,QAAQ,YAAYf,GAAeY,EAAK,IAAI,EAAG,KAAK,oBAAoBE,EAAMD,CAAI,EAAE,KAAK,IAAI,CAAC,EACtH,YAAK,SAAS,IAAID,EAAK,KAAMG,CAAU,EACnCH,EAAK,QACL,KAAK,SAAWG,GAEbA,CACX,CAEQ,gBAAgBH,EAAgB,CACpC,GAAI,CAAAA,EAAK,SAEF,IAAII,GAAeJ,CAAI,EAC1B,OAAOjB,GACJ,CACH,IAAMsB,EAAWC,GAAoBN,CAAI,EACzC,OAAOK,GAAYL,EAAK,IAC5B,EACJ,CAEA,MAAmCO,EAAeC,EAAyB,CAAA,EAAE,CACzE,KAAK,YAAY,cAAcD,CAAK,EACpC,IAAME,EAAc,KAAK,YAAc,KAAK,MAAM,SAASF,CAAK,EAChE,KAAK,QAAQ,MAAQE,EAAY,OACjC,IAAMN,EAAaK,EAAQ,KAAO,KAAK,SAAS,IAAIA,EAAQ,IAAI,EAAI,KAAK,SACzE,GAAI,CAACL,EACD,MAAM,IAAI,MAAMK,EAAQ,KAAO,4BAA4BA,EAAQ,IAAI,IAAM,yBAAyB,EAE1G,IAAME,EAASP,EAAW,KAAK,KAAK,QAAS,CAAA,CAAE,EAC/C,YAAK,YAAY,eAAeM,EAAY,MAAM,EAClD,KAAK,gBAAgB,MAAK,EAC1B,KAAK,YAAc,OACZ,CACH,MAAOC,EACP,YAAaD,EAAY,OACzB,YAAaA,EAAY,OACzB,aAAc,KAAK,QAAQ,OAEnC,CAEQ,oBAAoBE,EAAoCC,EAAwB,CACpF,OAAQC,GAAQ,CAEZ,IAAMC,EAAa,CAAC,KAAK,YAAW,GAAMH,IAAU,OACpD,GAAIG,EAAY,CACZ,IAAM7B,EAAY,CAAE,MAAA0B,CAAK,EACzB,KAAK,MAAM,KAAK1B,CAAI,EAChB0B,IAAU5B,KACVE,EAAK,MAAQ,GAErB,CACA,IAAIyB,EACJ,GAAI,CACAA,EAASE,EAAeC,CAAI,CAChC,MAAc,CACVH,EAAS,MACb,CACA,OAAIA,IAAW,QAAaI,IACxBJ,EAAS,KAAK,UAAS,GAEpBA,CACX,CACJ,CAEQ,oBAAoBK,EAAa,CACrC,IAAMC,EAAe,KAAK,YAAa,OACvC,GAAI,CAACA,EAAa,OACd,MAAO,CAAA,EAEX,IAAMC,EAASF,EAAM,YACrB,QAAS,EAAI,EAAG,EAAIC,EAAa,OAAQ,IAErC,GADcA,EAAa,CAAC,EAClB,YAAcC,EACpB,OAAOD,EAAa,OAAO,EAAG,CAAC,EAGvC,OAAOA,EAAa,OAAO,EAAGA,EAAa,MAAM,CACrD,CAEA,QAAQrB,EAAauB,EAAsBC,EAAwB,CAC/D,IAAMJ,EAAQ,KAAK,QAAQ,YAAYpB,EAAKuB,CAAS,EACrD,GAAI,CAAC,KAAK,YAAW,GAAM,KAAK,aAAaH,CAAK,EAAG,CACjD,IAAMC,EAAe,KAAK,oBAAoBD,CAAK,EACnD,KAAK,YAAY,eAAeC,CAAY,EAC5C,IAAMI,EAAW,KAAK,YAAY,cAAcL,EAAOI,CAAO,EACxD,CAAE,WAAAE,EAAY,WAAAC,CAAU,EAAK,KAAK,cAAcH,CAAO,EACvDI,EAAU,KAAK,QACrB,GAAIF,EAAY,CACZ,IAAMG,EAAiBC,GAAUN,CAAO,EAAIJ,EAAM,MAAQ,KAAK,UAAU,QAAQA,EAAM,MAAOK,CAAQ,EACtG,KAAK,OAAOC,EAAW,SAAUA,EAAW,QAASG,EAAgBJ,EAAUE,CAAU,CAC7F,SAAWtC,GAAeuC,CAAO,EAAG,CAChC,IAAIG,EAAOX,EAAM,MACZU,GAAUN,CAAO,IAClBO,EAAO,KAAK,UAAU,QAAQA,EAAMN,CAAQ,EAAE,SAAQ,GAE1DG,EAAQ,OAASG,CACrB,CACJ,CACJ,CAQQ,aAAaX,EAAa,CAC9B,MAAO,CAACA,EAAM,sBAAwB,CAAC,MAAMA,EAAM,WAAW,GAAK,OAAOA,EAAM,WAAc,UAAY,CAAC,MAAMA,EAAM,SAAS,CACpI,CAEA,QAAQpB,EAAaK,EAAkB2B,EAAmBR,EAA0BN,EAAU,CAC1F,IAAIe,EACA,CAAC,KAAK,YAAW,GAAM,CAACD,IAKxBC,EAAU,KAAK,YAAY,mBAAmBT,CAAO,GAEzD,IAAMU,EAAgB,KAAK,QAAQ,YAAYlC,EAAKK,EAAMa,CAAI,EAC1D,CAAC,KAAK,YAAW,GAAMe,GAAWA,EAAQ,OAAS,GACnD,KAAK,yBAAyBC,EAAeV,EAASS,CAAO,CAErE,CAEQ,yBAAyBlB,EAAaS,EAA0BS,EAAyB,CAC7F,GAAM,CAAE,WAAAP,EAAY,WAAAC,CAAU,EAAK,KAAK,cAAcH,CAAO,EAC7D,GAAIE,EACA,KAAK,OAAOA,EAAW,SAAUA,EAAW,QAASX,EAAQkB,EAASN,CAAU,UACzE,CAACD,EAAY,CAMpB,IAAME,EAAU,KAAK,QACrB,GAAIvC,GAAeuC,CAAO,EACtBA,EAAQ,OAASb,EAAO,SAAQ,UACzB,OAAOA,GAAW,UAAYA,EAAQ,CAE7C,IAAMoB,EADS,KAAK,sBAAsBpB,EAAQa,CAAO,EAEzD,KAAK,MAAM,IAAG,EACd,KAAK,MAAM,KAAKO,CAAO,CAC3B,CACJ,CACJ,CAEA,OAAOnB,EAAeoB,EAAc,CAChC,GAAI,CAAC,KAAK,YAAW,EAAI,CACrB,IAAIC,EAAO,KAAK,QAChB,GAAID,EAAO,SAAWA,EAAO,SAAU,CACnCC,EAAO,KAAK,UAAS,EACrB,KAAK,YAAY,WAAWA,EAAK,QAAQ,EAC5B,KAAK,YAAY,mBAAmBD,CAAM,EAClD,QAAQ,KAAKC,EAAK,QAAQ,EAC/B,IAAMF,EAAU,CAAE,MAAAnB,CAAK,EACvB,KAAK,MAAM,KAAKmB,CAAO,EACvB,KAAK,OAAOC,EAAO,SAAUA,EAAO,QAASC,EAAMA,EAAK,SAAU,EAAK,CAC3E,MACIA,EAAK,MAAQrB,CAErB,CACJ,CAEA,WAAS,CACL,GAAI,KAAK,YAAW,EAChB,OAEJ,IAAMsB,EAAM,KAAK,QAIjB,OAHAC,GAAuBD,CAAG,EAC1B,KAAK,YAAY,UAAUA,CAAG,EAC9B,KAAK,MAAM,IAAG,EACVjD,GAAeiD,CAAG,EACX,KAAK,UAAU,QAAQA,EAAI,MAAOA,EAAI,QAAQ,GAErDE,GAA0B,KAAK,cAAeF,CAAG,EAE9CA,EACX,CAEQ,cAAcd,EAAwB,CAC1C,GAAI,CAAC,KAAK,cAAc,IAAIA,CAAO,EAAG,CAClC,IAAME,EAAae,GAAmBjB,EAASkB,EAAY,EAC3D,KAAK,cAAc,IAAIlB,EAAS,CAC5B,WAAYE,EACZ,WAAYA,EAAaiB,GAAiBjB,EAAW,QAAQ,EAAI,GACpE,CACL,CACA,OAAO,KAAK,cAAc,IAAIF,CAAO,CACzC,CAEQ,OAAOoB,EAAkBpB,EAAiBqB,EAAgBZ,EAAkBN,EAAmB,CACnG,IAAMW,EAAM,KAAK,QACbQ,EAMJ,OALInB,GAAc,OAAOkB,GAAU,SAC/BC,EAAO,KAAK,OAAO,eAAeR,EAAKd,EAASS,EAASY,CAAK,EAE9DC,EAAOD,EAEHD,EAAU,CACd,IAAK,IAAK,CACNN,EAAId,CAAO,EAAIsB,EACf,KACJ,CACA,IAAK,KAAM,CACPR,EAAId,CAAO,EAAI,GACf,KACJ,CACA,IAAK,KACI,MAAM,QAAQc,EAAId,CAAO,CAAC,IAC3Bc,EAAId,CAAO,EAAI,CAAA,GAEnBc,EAAId,CAAO,EAAE,KAAKsB,CAAI,CAE9B,CACJ,CAEQ,sBAAsBC,EAAaC,EAAW,CAClD,OAAW,CAACtD,EAAMuD,CAAa,IAAK,OAAO,QAAQD,CAAM,EAAG,CACxD,IAAME,EAAWH,EAAOrD,CAAI,EACxBwD,IAAa,OACbH,EAAOrD,CAAI,EAAIuD,EACR,MAAM,QAAQC,CAAQ,GAAK,MAAM,QAAQD,CAAa,IAC7DA,EAAc,KAAK,GAAGC,CAAQ,EAC9BH,EAAOrD,CAAI,EAAIuD,EAEvB,CAMA,IAAME,EAAgBJ,EAAO,SAC7B,OAAII,IACAA,EAAc,QAAU,OACxBJ,EAAO,SAAW,QAEfA,CACX,CAEA,IAAI,kBAAgB,CAChB,OAAO,KAAK,QAAQ,gBACxB,GASkBK,GAAhB,KAAkD,CAhdxD,MAgdwD,CAAA7D,EAAA,2CAEpD,0BAA0BsB,EAKzB,CACG,OAAOwC,GAA2B,0BAA0BxC,CAAO,CACvE,CAEA,8BAA8BA,EAG7B,CACG,OAAOwC,GAA2B,8BAA8BxC,CAAO,CAC3E,CAEA,wBAAwBA,EAMvB,CACG,OAAOwC,GAA2B,wBAAwBxC,CAAO,CACrE,CAEA,sBAAsBA,EAMrB,CACG,OAAOwC,GAA2B,sBAAsBxC,CAAO,CACnE,GAISyC,GAAP,cAAiDF,EAAkC,CAxfzF,MAwfyF,CAAA7D,EAAA,0CAE5E,0BAA0B,CAAE,SAAAgE,EAAU,OAAAC,CAAM,EAKpD,CAMG,MAAO,aALaD,EAAS,MACvB,IAAMA,EAAS,MAAQ,IACvBA,EAAS,KAAK,SAAS,KAAK,EACxB,YAAYA,EAAS,KAAK,UAAU,EAAGA,EAAS,KAAK,OAAS,CAAC,CAAC,IAChE,kBAAkBA,EAAS,IAAI,GACV,gBAAgBC,EAAO,KAAK,KAC/D,CAES,8BAA8B,CAAE,eAAAC,CAAc,EAGtD,CACG,MAAO,qCAAqCA,EAAe,KAAK,KACpE,GASSC,GAAP,cAAuC/D,EAAqB,CAthBlE,MAshBkE,CAAAJ,EAAA,gCAAlE,aAAA,qBACY,KAAA,OAAmB,CAAA,EAEnB,KAAA,aAAkC,CAAA,EAClC,KAAA,iBAAsC,CAAA,EACtC,KAAA,eAAiB,EACjB,KAAA,UAAY,CAmGxB,CAjGI,QAAM,CAEN,CAEA,WAAS,CAGT,CAEA,MAAMqB,EAAa,CACf,KAAK,WAAU,EACf,IAAMf,EAAS,KAAK,MAAM,SAASe,EAAO,CAAE,KAAM,SAAS,CAAE,EAC7D,YAAK,OAASf,EAAO,OACrB,KAAK,QAAQ,MAAQ,CAAC,GAAG,KAAK,MAAM,EACpC,KAAK,SAAS,KAAK,KAAK,QAAS,CAAA,CAAE,EACnC,KAAK,gBAAgB,MAAK,EACnB,CACH,OAAQ,KAAK,OACb,aAAc,CAAC,GAAG,KAAK,gBAAgB,EACvC,WAAY,KAAK,eAEzB,CAEA,KAAKQ,EAAkBC,EAAc,CACjC,IAAME,EAAa,KAAK,QAAQ,YAAYf,GAAeY,EAAK,IAAI,EAAG,KAAK,oBAAoBC,CAAI,EAAE,KAAK,IAAI,CAAC,EAChH,YAAK,SAAS,IAAID,EAAK,KAAMG,CAAU,EACnCH,EAAK,QACL,KAAK,SAAWG,GAEbA,CACX,CAEQ,YAAU,CACd,KAAK,aAAe,CAAA,EACpB,KAAK,iBAAmB,CAAA,EACxB,KAAK,eAAiB,EACtB,KAAK,UAAY,CACrB,CAEQ,oBAAoBS,EAAwB,CAChD,OAAQC,GAAQ,CACZ,IAAMyC,EAAO,KAAK,cAAa,EAC/B,GAAI,CACA1C,EAAeC,CAAI,CACvB,SACI,KAAK,eAAeyC,CAAI,CAC5B,CACJ,CACJ,CAEQ,0BAAwB,CAC5B,KAAK,aAAa,OAAO,KAAK,SAAS,CAC3C,CAEA,eAAa,CACT,IAAMA,EAAO,KAAK,aAAa,OAC/B,YAAK,UAAYA,EACVA,CACX,CAEA,eAAeA,EAAY,CACvB,KAAK,yBAAwB,EAC7B,KAAK,UAAYA,CACrB,CAEA,QAAQ3D,EAAauB,EAAsBC,EAAwB,CAC/D,KAAK,QAAQ,YAAYxB,EAAKuB,CAAS,EAClC,KAAK,YAAW,IACjB,KAAK,iBAAmB,CAAC,GAAG,KAAK,aAAcC,CAAO,EACtD,KAAK,eAAiB,KAAK,QAAU,EAE7C,CAEA,QAAQxB,EAAaK,EAAkB2B,EAAmBR,EAA0BN,EAAU,CAC1F,KAAK,OAAOM,CAAO,EACnB,KAAK,QAAQ,YAAYxB,EAAKK,EAAMa,CAAI,EACxC,KAAK,MAAMM,CAAO,CACtB,CAEA,OAAOoC,EAAwB,CACtB,KAAK,YAAW,GACjB,KAAK,aAAa,KAAKA,CAAO,CAEtC,CAEA,MAAMA,EAAwB,CAC1B,GAAI,CAAC,KAAK,YAAW,EAAI,CACrB,IAAMC,EAAQ,KAAK,aAAa,YAAYD,CAAO,EAC/CC,GAAS,GACT,KAAK,aAAa,OAAOA,CAAK,CAEtC,CACJ,CAEA,IAAI,SAAO,CACP,OAAQ,KAAK,QAAgB,OACjC,GAGEC,GAA+B,CACjC,gBAAiB,GACjB,qBAAsB,OACtB,gBAAiB,GACjB,qBAAsB,IAAIR,IAOxBvD,GAAN,cAAgCgE,EAAqB,CA5oBrD,MA4oBqD,CAAAxE,EAAA,0BAKjD,YAAYM,EAAyBmE,EAAqB,CACtD,IAAMC,EAAsBD,GAAU,iBAAkBA,EACxD,MAAMnE,EAAM,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,CAAA,EACLiE,EAAa,EAAA,CAChB,kBAAmBG,EACb,IAAIC,GAAqB,CAAE,aAAcF,EAAO,YAAY,CAAE,EAC9D,IAAIG,GAAwB,CAE1B,QAASH,EAAO,gBAAkB,IAAK,CAAG,EAAI,OACjD,CAAC,CAAA,EACHA,CAAM,CAAA,CAEjB,CAEA,IAAI,cAAY,CACZ,OAAO,KAAK,eAChB,CAEA,YAAYtE,EAAcY,EAAc,CACpC,OAAO,KAAK,KAAKZ,EAAMY,CAAI,CAC/B,CAEA,kBAAgB,CACZ,KAAK,oBAAmB,CAC5B,CAEA,YAAYN,EAAauB,EAAoB,CACzC,OAAO,KAAK,QAAQvB,EAAKuB,CAAS,CACtC,CAEA,YAAYvB,EAAaK,EAAkBa,EAAU,CACjD,OAAO,KAAK,QAAQlB,EAAKK,EAAM,CAC3B,KAAM,CAACa,CAAI,EACd,CACL,CAEA,OAAOlB,EAAaC,EAA2B,CAC3C,KAAK,GAAGD,EAAKC,CAAO,CACxB,CAEA,WAAWD,EAAaE,EAAgC,CACpD,KAAK,OAAOF,EAAKE,CAAQ,CAC7B,CAEA,SAASF,EAAaE,EAAgC,CAClD,KAAK,KAAKF,EAAKE,CAAQ,CAC3B,CAEA,eAAeF,EAAaE,EAAgC,CACxD,KAAK,WAAWF,EAAKE,CAAQ,CACjC,GC5pBE,SAAUkE,GAAmCC,EAAkBC,EAAWC,EAA2B,CAMvG,OAAAC,GALqC,CACjC,OAAAF,EACA,OAAAC,EACA,UAAW,IAAI,KAEOF,CAAO,EAC1BC,CACX,CARgBG,EAAAL,GAAA,gBAUhB,SAASI,GAAWE,EAA8BL,EAAgB,CAC9D,IAAMM,EAAYC,GAAqBP,EAAS,EAAK,EAC/CQ,EAAcC,EAAOT,EAAQ,KAAK,EAAE,OAAOU,EAAY,EAAE,OAAOC,GAAQL,EAAU,IAAIK,CAAI,CAAC,EACjG,QAAWA,KAAQH,EAAa,CAC5B,IAAMI,EAAG,OAAA,OAAA,OAAA,OAAA,CAAA,EACFP,CAAa,EAAA,CAChB,QAAS,EACT,SAAU,EACV,QAAS,EACT,KAAM,EACN,GAAI,CAAC,CAAA,EAETA,EAAc,OAAO,KAAKM,EAAME,GAAaD,EAAKD,EAAK,UAAU,CAAC,CACtE,CACJ,CAdSP,EAAAD,GAAA,cAgBT,SAASU,GAAaD,EAAkBE,EAA0BC,EAAc,GAAK,CACjF,IAAIC,EACJ,GAAIC,GAAUH,CAAO,EACjBE,EAASE,GAAaN,EAAKE,CAAO,UAC3BK,GAASL,CAAO,EACvBE,EAASI,GAAYR,EAAKE,CAAO,UAC1BO,GAAaP,CAAO,EAC3BE,EAASH,GAAaD,EAAKE,EAAQ,QAAQ,UACpCQ,GAAiBR,CAAO,EAC/BE,EAASO,GAAoBX,EAAKE,CAAO,UAClCU,GAAWV,CAAO,EACzBE,EAASS,GAAcb,EAAKE,CAAO,UAC5BY,GAAeZ,CAAO,EAC7BE,EAASW,GAAkBf,EAAKE,CAAO,UAChCc,GAAiBd,CAAO,EAC/BE,EAASa,GAAoBjB,EAAKE,CAAO,UAClCgB,GAAQhB,CAAO,EACtBE,EAASe,GAAWnB,EAAKE,CAAO,UAC1BkB,GAAYlB,CAAO,EAAG,CAC5B,IAAMmB,EAAMrB,EAAI,UAChBI,EAASZ,EAAA,IAAMQ,EAAI,OAAO,QAAQqB,EAAKC,GAAKpB,CAAO,EAA1C,SACb,KACI,OAAM,IAAIqB,GAAkBrB,EAAQ,SAAU,4BAA4BA,EAAQ,KAAK,EAAE,EAE7F,OAAOsB,GAAKxB,EAAKG,EAAc,OAAYsB,GAAkBvB,CAAO,EAAGE,EAAQF,EAAQ,WAAW,CACtG,CAzBSV,EAAAS,GAAA,gBA2BT,SAASO,GAAYR,EAAkB0B,EAAc,CACjD,IAAMC,EAAaC,GAAYF,CAAM,EACrC,MAAO,IAAM1B,EAAI,OAAO,OAAO2B,EAAYD,CAAM,CACrD,CAHSlC,EAAAgB,GAAA,eAKT,SAASK,GAAcb,EAAkB6B,EAAkB,CACvD,IAAM9B,EAAO8B,EAAS,KAAK,IAC3B,GAAI/B,GAAaC,CAAI,EAAG,CACpB,IAAMsB,EAAMrB,EAAI,UACV8B,EAAW/B,EAAK,SAChBgC,EAAYF,EAAS,UAAU,OAAS,EAAIG,GAAuBjC,EAAM8B,EAAS,SAAS,EAAI,KAAO,CAAA,GAC5G,OAAQI,GAASjC,EAAI,OAAO,QAAQqB,EAAKa,GAAQlC,EAAKD,CAAI,EAAG+B,EAAUD,EAAUE,EAAUE,CAAI,CAAC,CACpG,SAAWE,GAAepC,CAAI,EAAG,CAC7B,IAAMsB,EAAMrB,EAAI,UACVI,EAASgC,GAASpC,EAAKD,EAAK,IAAI,EACtC,MAAO,IAAMC,EAAI,OAAO,QAAQqB,EAAKjB,EAAQyB,CAAQ,CACzD,SAAY9B,EAGRsC,GAAkBtC,CAAI,MAFtB,OAAM,IAAIwB,GAAkBM,EAAS,SAAU,mBAAmBA,EAAS,KAAK,QAAQ,EAAE,CAIlG,CAhBSrC,EAAAqB,GAAA,iBAkBT,SAASmB,GAAuBjC,EAAkBuC,EAA0B,CACxE,IAAMC,EAAaD,EAAU,IAAIE,GAAKC,GAAeD,EAAE,KAAK,CAAC,EAC7D,OAAQP,GAAQ,CACZ,IAAMS,EAAiB,CAAA,EACvB,QAASC,EAAI,EAAGA,EAAIJ,EAAW,OAAQI,IAAK,CACxC,IAAMC,EAAa7C,EAAK,WAAW4C,CAAC,EAC9BZ,EAAYQ,EAAWI,CAAC,EAC9BD,EAASE,EAAW,IAAI,EAAIb,EAAUE,CAAI,CAC9C,CACA,OAAOS,CACX,CACJ,CAXSlD,EAAAwC,GAAA,0BAkBT,SAASS,GAAeI,EAAoB,CACxC,GAAIC,GAAcD,CAAS,EAAG,CAC1B,IAAME,EAAON,GAAeI,EAAU,IAAI,EACpCG,EAAQP,GAAeI,EAAU,KAAK,EAC5C,OAAQZ,GAAUc,EAAKd,CAAI,GAAKe,EAAMf,CAAI,CAC9C,SAAWgB,GAAcJ,CAAS,EAAG,CACjC,IAAME,EAAON,GAAeI,EAAU,IAAI,EACpCG,EAAQP,GAAeI,EAAU,KAAK,EAC5C,OAAQZ,GAAUc,EAAKd,CAAI,GAAKe,EAAMf,CAAI,CAC9C,SAAWiB,GAAWL,CAAS,EAAG,CAC9B,IAAMM,EAAQV,GAAeI,EAAU,KAAK,EAC5C,OAAQZ,GAAS,CAACkB,EAAMlB,CAAI,CAChC,SAAWmB,GAAqBP,CAAS,EAAG,CACxC,IAAMQ,EAAOR,EAAU,UAAU,IAAK,KACtC,OAAQZ,GAASA,IAAS,QAAaA,EAAKoB,CAAI,IAAM,EAC1D,SAAWC,GAAiBT,CAAS,EAAG,CACpC,IAAMM,EAAQ,EAAQN,EAAU,KAChC,MAAO,IAAMM,CACjB,CACAd,GAAkBQ,CAAS,CAC/B,CApBSrD,EAAAiD,GAAA,kBAsBT,SAAS1B,GAAkBf,EAAkBuD,EAA0B,CACnE,GAAIA,EAAa,SAAS,SAAW,EACjC,OAAOtD,GAAaD,EAAKuD,EAAa,SAAS,CAAC,CAAC,EAC9C,CACH,IAAMC,EAA8B,CAAA,EAEpC,QAAWtD,KAAWqD,EAAa,SAAU,CACzC,IAAME,EAAqC,CAGvC,IAAKxD,GAAaD,EAAKE,EAAS,EAAI,GAElCwD,EAAQjC,GAAkBvB,CAAO,EACnCwD,IACAD,EAAiB,KAAOhB,GAAeiB,CAAK,GAEhDF,EAAQ,KAAKC,CAAgB,CACjC,CAEA,IAAMpC,EAAMrB,EAAI,KAChB,OAAQiC,GAASjC,EAAI,OAAO,aAAaqB,EAAKmC,EAAQ,IAAIpD,GAAS,CAC/D,IAAMuD,EAAuB,CACzB,IAAKnE,EAAA,IAAMY,EAAO,IAAI6B,CAAI,EAArB,QAEH2B,EAAOxD,EAAO,KACpB,OAAIwD,IACAD,EAAI,KAAO,IAAMC,EAAK3B,CAAI,GAEvB0B,CACX,CAAC,CAAC,CACN,CACJ,CA/BSnE,EAAAuB,GAAA,qBAiCT,SAASE,GAAoBjB,EAAkB6D,EAAqB,CAChE,GAAIA,EAAM,SAAS,SAAW,EAC1B,OAAO5D,GAAaD,EAAK6D,EAAM,SAAS,CAAC,CAAC,EAE9C,IAAML,EAA8B,CAAA,EAEpC,QAAWtD,KAAW2D,EAAM,SAAU,CAClC,IAAMJ,EAAqC,CAGvC,IAAKxD,GAAaD,EAAKE,EAAS,EAAI,GAElCwD,EAAQjC,GAAkBvB,CAAO,EACnCwD,IACAD,EAAiB,KAAOhB,GAAeiB,CAAK,GAEhDF,EAAQ,KAAKC,CAAgB,CACjC,CAEA,IAAMK,EAAQ9D,EAAI,KAEZ+D,EAASvE,EAAA,CAACwE,EAAkBC,IAAuB,CACrD,IAAMC,EAAUD,EAAQ,aAAY,EAAG,KAAK,GAAG,EAC/C,MAAO,UAAUD,CAAQ,IAAIE,CAAO,EACxC,EAHe,UAITX,EAAuB/D,EAACyC,GAASjC,EAAI,OAAO,aAAa8D,EAAON,EAAQ,IAAI,CAACpD,EAAQiB,IAAO,CAC9F,IAAMsC,EAAuB,CAAE,IAAKnE,EAAA,IAAM,GAAN,MAAU,EACxCH,EAASW,EAAI,OACnB2D,EAAI,IAAM,IAAK,CAEX,GADAvD,EAAO,IAAI6B,CAAI,EACX,CAAC5C,EAAO,YAAW,EAAI,CACvB,IAAM8E,EAAMJ,EAAOD,EAAOzE,CAAM,EAC3BA,EAAO,gBAAgB,IAAI8E,CAAG,GAE/B9E,EAAO,gBAAgB,IAAI8E,EAAK,CAAA,CAAE,EAEtC,IAAMC,EAAa/E,EAAO,gBAAgB,IAAI8E,CAAG,EAC7C,OAAOC,IAAa/C,CAAG,EAAM,MAE7B+C,EAAW/C,CAAG,EAAI,GAE1B,CACJ,EACA,IAAMuC,EAAOxD,EAAO,KACpB,OAAIwD,EACAD,EAAI,KAAO,IAAMC,EAAK3B,CAAI,EAE1B0B,EAAI,KAAO,IAAK,CACZ,IAAMU,EAAsBhF,EAAO,gBAAgB,IAAI0E,EAAOD,EAAOzE,CAAM,CAAC,EAE5E,MADc,CAACgF,IAAsBhD,CAAG,CAE5C,EAEGsC,CACX,CAAC,CAAC,EA7B2B,gBA8BvBW,EAAU9C,GAAKxB,EAAKyB,GAAkBoC,CAAK,EAAGN,EAAc,GAAG,EACrE,OAAQtB,GAAQ,CACZqC,EAAQrC,CAAI,EACPjC,EAAI,OAAO,YAAW,GACvBA,EAAI,OAAO,gBAAgB,OAAO+D,EAAOD,EAAO9D,EAAI,MAAM,CAAC,CAEnE,CACJ,CA9DSR,EAAAyB,GAAA,uBAgET,SAASE,GAAWnB,EAAkB6D,EAAY,CAC9C,IAAML,EAAUK,EAAM,SAAS,IAAIrB,GAAKvC,GAAaD,EAAKwC,CAAC,CAAC,EAC5D,OAAQP,GAASuB,EAAQ,QAAQpD,GAAUA,EAAO6B,CAAI,CAAC,CAC3D,CAHSzC,EAAA2B,GAAA,cAKT,SAASM,GAAkBvB,EAAwB,CAC/C,GAAIgB,GAAQhB,CAAO,EACf,OAAOA,EAAQ,cAGvB,CALSV,EAAAiC,GAAA,qBAOT,SAASd,GAAoBX,EAAkBuE,EAA0BC,EAAWD,EAAS,SAAQ,CACjG,GAAKC,EAUE,GAAI5D,GAAW4D,CAAQ,GAAK1E,GAAa0E,EAAS,KAAK,GAAG,EAAG,CAEhE,IAAMzE,EAAOyE,EAAS,KAAK,IACrBnD,EAAMrB,EAAI,UAChB,OAAQiC,GAASjC,EAAI,OAAO,QAAQqB,EAAKa,GAAQlC,EAAKD,CAAI,EAAG,GAAOwE,EAAUtC,CAAI,CACtF,SAAWrB,GAAW4D,CAAQ,GAAKrC,GAAeqC,EAAS,KAAK,GAAG,EAAG,CAClE,IAAMnD,EAAMrB,EAAI,UACVyE,EAAerC,GAASpC,EAAKwE,EAAS,KAAK,IAAI,IAAI,EACzD,MAAO,IAAMxE,EAAI,OAAO,QAAQqB,EAAKoD,EAAcF,CAAQ,CAC/D,SAAWlE,GAAUmE,CAAQ,EAAG,CAC5B,IAAMnD,EAAMrB,EAAI,UACV0E,EAAUtC,GAASpC,EAAKwE,EAAS,KAAK,EAC5C,MAAO,IAAMxE,EAAI,OAAO,QAAQqB,EAAKqD,EAASH,CAAQ,CAC1D,KAEI,OAAM,IAAI,MAAM,wCAAwC,MAzB7C,CACX,GAAI,CAACA,EAAS,KAAK,IACf,MAAM,IAAI,MAAM,wCAA0CA,EAAS,KAAK,QAAQ,EAEpF,IAAMI,EAAaC,GAAmBL,EAAS,KAAK,GAAG,EACjDM,EAAiBF,GAAY,SACnC,GAAI,CAACE,EACD,MAAM,IAAI,MAAM,4CAA8CjD,GAAY2C,EAAS,KAAK,GAAG,CAAC,EAEhG,OAAO5D,GAAoBX,EAAKuE,EAAUM,CAAc,CAC5D,CAiBJ,CA5BSrF,EAAAmB,GAAA,uBA8BT,SAASL,GAAaN,EAAkB0E,EAAgB,CACpD,IAAMrD,EAAMrB,EAAI,UACV8E,EAAQ9E,EAAI,OAAO0E,EAAQ,KAAK,EACtC,GAAI,CAACI,EACD,MAAM,IAAI,MAAM,qCAAuCJ,EAAQ,KAAK,EAExE,MAAO,IAAM1E,EAAI,OAAO,QAAQqB,EAAKyD,EAAOJ,CAAO,CACvD,CAPSlF,EAAAc,GAAA,gBAST,SAASkB,GAAKxB,EAAkB0D,EAA8BtD,EAAgB2E,EAAwB,CAClG,IAAMnB,EAAOF,GAASjB,GAAeiB,CAAK,EAE1C,GAAI,CAACqB,EACD,GAAInB,EAAM,CACN,IAAMvC,EAAMrB,EAAI,KAChB,OAAQiC,GAASjC,EAAI,OAAO,aAAaqB,EAAK,CAC1C,CACI,IAAK7B,EAAA,IAAMY,EAAO6B,CAAI,EAAjB,OACL,KAAMzC,EAAA,IAAMoE,EAAK3B,CAAI,EAAf,SAEV,CACI,IAAK+C,GAAS,EACd,KAAMxF,EAAA,IAAM,CAACoE,EAAK3B,CAAI,EAAhB,SAEb,CACL,KACI,QAAO7B,EAIf,GAAI2E,IAAgB,IAAK,CACrB,IAAM1D,EAAMrB,EAAI,OAChB,OAAQiC,GAASjC,EAAI,OAAO,KAAKqB,EAAK,CAClC,IAAK7B,EAAA,IAAMY,EAAO6B,CAAI,EAAjB,OACL,KAAM2B,EAAO,IAAMA,EAAK3B,CAAI,EAAI,OACnC,CACL,SAAW8C,IAAgB,IAAK,CAC5B,IAAM1D,EAAMrB,EAAI,OAChB,GAAI4D,EAAM,CACN,IAAME,EAAQ9D,EAAI,KAKlB,OAAQiC,GAASjC,EAAI,OAAO,aAAa8D,EAAO,CAC5C,CACI,IAAKtE,EAAA,IAAMQ,EAAI,OAAO,WAAWqB,EAAK,CAClC,IAAK7B,EAAA,IAAMY,EAAO6B,CAAI,EAAjB,OACR,EAFI,OAGL,KAAMzC,EAAA,IAAMoE,EAAK3B,CAAI,EAAf,SAEV,CACI,IAAK+C,GAAS,EACd,KAAMxF,EAAA,IAAM,CAACoE,EAAK3B,CAAI,EAAhB,SAEb,CACL,KACI,QAAQA,GAASjC,EAAI,OAAO,WAAWqB,EAAK,CACxC,IAAK7B,EAAA,IAAMY,EAAO6B,CAAI,EAAjB,OACR,CAET,SAAW8C,IAAgB,IAAK,CAC5B,IAAM1D,EAAMrB,EAAI,WAChB,OAAQiC,GAASjC,EAAI,OAAO,SAASqB,EAAK,CACtC,IAAK7B,EAAA,IAAMY,EAAO6B,CAAI,EAAjB,OACL,KAAM2B,EAAO,IAAMA,EAAK3B,CAAI,EAAI,OACnC,CACL,MACII,GAAkB0C,CAAW,CAErC,CA7DSvF,EAAAgC,GAAA,QA+DT,SAASU,GAAQlC,EAAoBE,EAAqC,CACtE,IAAMmD,EAAO4B,GAAYjF,EAAKE,CAAO,EAC/BH,EAAOC,EAAI,OAAO,QAAQqD,CAAI,EACpC,GAAI,CAACtD,EAAM,MAAM,IAAI,MAAM,SAASsD,CAAI,eAAe,EACvD,OAAOtD,CACX,CALSP,EAAA0C,GAAA,WAOT,SAAS+C,GAAYjF,EAAoBE,EAAqC,CAC1E,GAAIJ,GAAaI,CAAO,EACpB,OAAOA,EAAQ,KACZ,GAAIF,EAAI,UAAU,IAAIE,CAAO,EAChC,OAAOF,EAAI,UAAU,IAAIE,CAAO,EAC7B,CACH,IAAIgF,EAAgBhF,EAChBiF,EAAkBD,EAAK,WACvBE,EAAmBlF,EAAQ,MAC/B,KAAO,CAACJ,GAAaqF,CAAM,IACnBjE,GAAQiE,CAAM,GAAKrE,GAAeqE,CAAM,GAAKnE,GAAiBmE,CAAM,KAEpEC,EADcD,EAAO,SAAS,QAAQD,CAAuB,EAC5C,SAAQ,EAAK,IAAME,GAExCF,EAAOC,EACPA,EAASA,EAAO,WAGpB,OAAAC,EADaD,EACG,KAAO,IAAMC,EAC7BpF,EAAI,UAAU,IAAIE,EAASkF,CAAQ,EAC5BA,CACX,CACJ,CAtBS5F,EAAAyF,GAAA,eAwBT,SAAS7C,GAASpC,EAAoBqD,EAAY,CAC9C,IAAMyB,EAAQ9E,EAAI,OAAOqD,CAAI,EAC7B,GAAI,CAACyB,EAAO,MAAM,IAAI,MAAM,UAAUzB,CAAI,eAAe,EACzD,OAAOyB,CACX,CAJStF,EAAA4C,GAAA,YCnYH,SAAUiD,GAAuBC,EAA6B,CAChE,IAAMC,EAAUD,EAAS,QACnBE,EAAQF,EAAS,OAAO,MACxBG,EAAS,IAAIC,GAAwBJ,CAAQ,EACnD,OAAAK,GAAaJ,EAASE,EAAQD,EAAM,UAAU,EAC9CC,EAAO,SAAQ,EACRA,CACX,CAPgBG,EAAAP,GAAA,0BCIV,SAAUQ,GAAoBC,EAA6B,CAC7D,IAAMC,EAASC,GAAqBF,CAAQ,EAC5C,OAAAC,EAAO,SAAQ,EACRA,CACX,CAJgBE,EAAAJ,GAAA,uBAUV,SAAUG,GAAqBF,EAA6B,CAC9D,IAAMI,EAAUJ,EAAS,QACnBK,EAAQL,EAAS,OAAO,MACxBC,EAAS,IAAIK,GAAcN,CAAQ,EACzC,OAAOO,GAAaH,EAASH,EAAQI,EAAM,UAAU,CACzD,CALgBF,EAAAD,GAAA,wBCoBV,IAAOM,GAAP,KAA0B,CA5ChC,MA4CgC,CAAAC,EAAA,4BAAhC,aAAA,CAIc,KAAA,YAAkC,CAAA,CAmHhD,CAjHI,YAAYC,EAAkBC,EAA6B,CACvD,IAAMC,EAAiBC,EAAOC,GAAqBJ,EAAS,EAAK,CAAC,EAC5DK,EAA8B,KAAK,oBAAoBH,CAAc,EACrEI,EAAsB,KAAK,mBAAmBJ,EAAgBG,EAAgBJ,CAAO,EAE3F,OAAAI,EAAe,QAAQE,GAAgB,CACnC,IAAMC,EAAUD,EAAc,QAC1B,OAAOC,GAAY,UAAYA,GAAW,SAAUA,GAAWC,GAAaD,CAAO,EACnFF,EAAO,QAAQC,CAAa,EAE5BD,EAAO,KAAKC,CAAa,CAEjC,CAAC,EAGMD,CACX,CAGA,kBAAkBI,EAAY,CAC1B,MAAO,CAAE,YAAa,KAAK,eAAc,CAAE,CAC/C,CAEU,gBAAc,CACpB,IAAMC,EAAc,CAAC,GAAG,KAAK,WAAW,EACxC,YAAK,YAAc,CAAA,EACZA,CACX,CAEU,oBAAoBC,EAA2B,CACrD,OAAOA,EAAM,OAAOC,EAAc,EAAE,OAAOC,GAAK,CAACA,EAAE,QAAQ,EACtD,IAAIC,GAAY,KAAK,mBAAmBA,CAAQ,CAAC,EAAE,QAAO,CACnE,CAEU,mBAAmBA,EAAsB,CAC/C,IAAMC,EAAQC,GAAcF,CAAQ,EAC9BP,EAAU,KAAK,sBAAsBQ,CAAK,EAAI,KAAK,qBAAqBA,CAAK,EAAIA,EACjFE,EAAuB,CACzB,KAAMH,EAAS,KACf,QAASP,GAEb,OAAI,OAAOA,GAAY,aACnBU,EAAU,YAAc,IAExBH,EAAS,SAETG,EAAU,MAAQT,GAAaO,CAAK,EAAIG,GAAM,QAAU,UAErDD,CACX,CAEU,sBAAsBF,EAAa,CACzC,OAAIA,EAAM,MAAM,SAAS,GAAG,GAAKA,EAAM,MAAM,SAAS,GAAG,EAE9C,GACA,GAAAA,EAAM,OAAO,SAAS,KAAK,GAAKA,EAAM,OAAO,SAAS,KAAK,EAM1E,CAEU,qBAAqBA,EAAa,CACxC,IAAMI,EAAc,IAAI,OAAOJ,EAAOA,EAAM,MAAQ,GAAG,EACvD,MAAO,CAACN,EAAMW,KACVD,EAAY,UAAYC,EACLD,EAAY,KAAKV,CAAI,EAGhD,CAEU,mBAAmBE,EAA6BP,EAA6BJ,EAA6B,CAChH,OAAOW,EAEF,OAAOU,EAAY,EACnB,QAAQC,GAAQC,GAAkBD,CAAI,EAAE,OAAOE,EAAS,CAAC,EACzD,SAASX,GAAKA,EAAE,KAAK,EAAE,QAAO,EAE9B,KAAK,CAACY,EAAGC,IAAMA,EAAE,MAAM,OAASD,EAAE,MAAM,MAAM,EAC9C,IAAIE,GAAW,KAAK,kBAAkBA,EAASvB,EAAgB,EAAQJ,GAAS,eAAgB,CAAC,CAC1G,CAEU,kBAAkB2B,EAAkBvB,EAA6BwB,EAAwB,CAC/F,IAAMC,EAAiB,KAAK,oBAAoBF,EAASC,CAAe,EAClEX,EAAuB,CACzB,KAAMU,EAAQ,MACd,QAASE,EACT,WAAY,KAAK,cAAcF,EAASvB,CAAc,GAG1D,OAAI,OAAOyB,GAAmB,aAC1BZ,EAAU,YAAc,IAGrBA,CACX,CAEU,oBAAoBU,EAAkBC,EAAwB,CACpE,OAAOA,EACH,IAAI,OAAOE,GAA0BH,EAAQ,KAAK,CAAC,EACnDA,EAAQ,KAChB,CAEU,cAAcA,EAAkBvB,EAA2B,CACjE,OAAOA,EAAe,OAAO,CAAC2B,EAAyBC,IAAS,CAC5D,IAAMzB,EAAUyB,GAAO,QACvB,OAAIzB,GAAS,QAAU0B,GAAe,IAAM1B,EAAQ,OAAS,IAAKoB,EAAQ,KAAK,GAC3EI,EAAW,KAAKC,CAAK,EAElBD,CACX,EAAG,CAAA,CAAE,CACT,GC3IE,IAAOG,GAAP,KAA4B,CAvBlC,MAuBkC,CAAAC,EAAA,8BAE9B,QAAQC,EAAeC,EAAgB,CACnC,IAAIC,EAAuCD,EAAQ,cAInD,GAHIE,GAAiBD,CAAO,IACxBA,EAAUE,GAA0BF,CAAO,GAE3CG,GAAWH,CAAO,EAAG,CACrB,IAAMI,EAAOJ,EAAQ,KAAK,IAC1B,GAAI,CAACI,EACD,MAAM,IAAI,MAAM,yCAAyC,EAE7D,OAAO,KAAK,aAAaA,EAAMN,EAAOC,CAAO,CACjD,CACA,OAAOD,CACX,CAGU,aAAaM,EAAoBN,EAAeC,EAAgB,OACtE,OAAQK,EAAK,KAAK,YAAW,EAAI,CAC7B,IAAK,MAAO,OAAOC,GAAe,WAAWP,CAAK,EAClD,IAAK,SAAU,OAAOO,GAAe,cAAcP,CAAK,EACxD,IAAK,KAAM,OAAOO,GAAe,UAAUP,CAAK,CACpD,CACA,QAAQQ,EAAAC,GAAYH,CAAI,KAAC,MAAAE,IAAA,OAAA,OAAAA,EAAE,YAAW,EAAI,CACtC,IAAK,SAAU,OAAOD,GAAe,cAAcP,CAAK,EACxD,IAAK,UAAW,OAAOO,GAAe,eAAeP,CAAK,EAC1D,IAAK,SAAU,OAAOO,GAAe,cAAcP,CAAK,EACxD,IAAK,OAAQ,OAAOO,GAAe,YAAYP,CAAK,EACpD,QAAS,OAAOA,CACpB,CACJ,GAGaO,IAAjB,SAAiBA,EAAc,CAE3B,SAAgBG,EAAcV,EAAa,CACvC,IAAIW,EAAS,GACb,QAASC,EAAI,EAAGA,EAAIZ,EAAM,OAAS,EAAGY,IAAK,CACvC,IAAMC,EAAIb,EAAM,OAAOY,CAAC,EACxB,GAAIC,IAAM,KAAM,CACZ,IAAMC,EAAKd,EAAM,OAAO,EAAEY,CAAC,EAC3BD,GAAUI,EAAuBD,CAAE,CACvC,MACIH,GAAUE,CAElB,CACA,OAAOF,CACX,CAZgBZ,EAAAW,EAAA,iBAAAH,EAAA,cAAaG,EAc7B,SAASK,EAAuBC,EAAY,CACxC,OAAQA,EAAM,CACV,IAAK,IAAK,MAAO,KACjB,IAAK,IAAK,MAAO,KACjB,IAAK,IAAK,MAAO;EACjB,IAAK,IAAK,MAAO,KACjB,IAAK,IAAK,MAAO,IACjB,IAAK,IAAK,MAAO,KACjB,IAAK,IAAK,MAAO,KACjB,QAAS,OAAOA,CACpB,CACJ,CAXSjB,EAAAgB,EAAA,0BAaT,SAAgBE,EAAUjB,EAAa,CACnC,OAAIA,EAAM,OAAO,CAAC,IAAM,IACbA,EAAM,UAAU,CAAC,EAEjBA,CAEf,CANgBD,EAAAkB,EAAA,aAAAV,EAAA,UAASU,EAQzB,SAAgBC,EAAWlB,EAAa,CACpC,OAAO,SAASA,CAAK,CACzB,CAFgBD,EAAAmB,EAAA,cAAAX,EAAA,WAAUW,EAI1B,SAAgBC,EAAcnB,EAAa,CACvC,OAAO,OAAOA,CAAK,CACvB,CAFgBD,EAAAoB,EAAA,iBAAAZ,EAAA,cAAaY,EAI7B,SAAgBC,EAAYpB,EAAa,CACrC,OAAO,IAAI,KAAKA,CAAK,CACzB,CAFgBD,EAAAqB,EAAA,eAAAb,EAAA,YAAWa,EAI3B,SAAgBC,EAAcrB,EAAa,CACvC,OAAO,OAAOA,CAAK,CACvB,CAFgBD,EAAAsB,EAAA,iBAAAd,EAAA,cAAac,EAI7B,SAAgBC,EAAetB,EAAa,CACxC,OAAOA,EAAM,YAAW,IAAO,MACnC,CAFgBD,EAAAuB,EAAA,kBAAAf,EAAA,eAAce,CAIlC,GAzDiBf,KAAAA,GAAc,CAAA,EAAA,ECzD/B,IAAAgB,EAAA,GAOAC,EAAAD,EAAc,YCOR,SAAUE,IAAa,CACzB,OAAO,IAAI,QAAQC,GAAU,CAGrB,OAAO,aAAiB,IACxB,WAAWA,EAAS,CAAC,EAErB,aAAaA,CAAO,CAE5B,CAAC,CACL,CAVgBC,EAAAF,GAAA,iBAYhB,IAAIG,GAAW,EACXC,GAA2B,GAKzB,SAAUC,IAAwB,CACpC,OAAAF,GAAW,YAAY,IAAG,EACnB,IAAI,yBACf,CAHgBD,EAAAG,GAAA,4BASV,SAAUC,GAAsBC,EAAc,CAChDH,GAA2BG,CAC/B,CAFgBL,EAAAI,GAAA,yBAST,IAAME,GAAqB,OAAO,oBAAoB,EAMvD,SAAUC,GAAqBC,EAAY,CAC7C,OAAOA,IAAQF,EACnB,CAFgBN,EAAAO,GAAA,wBAehB,eAAsBE,GAAkBC,EAAwB,CAC5D,GAAIA,IAAU,oBAAkB,KAE5B,OAEJ,IAAMC,EAAU,YAAY,IAAG,EAS/B,GARIA,EAAUV,IAAYC,KACtBD,GAAWU,EACX,MAAMb,GAAa,EAInBG,GAAW,YAAY,IAAG,GAE1BS,EAAM,wBACN,MAAMJ,EAEd,CAjBsBN,EAAAS,GAAA,qBAuBhB,IAAOG,GAAP,KAAe,CA9FrB,MA8FqB,CAAAZ,EAAA,iBAArB,aAAA,CAII,KAAA,QAAU,IAAI,QAAW,CAACD,EAASc,IAAU,CACzC,KAAK,QAAWC,IACZf,EAAQe,CAAG,EACJ,MAEX,KAAK,OAAUN,IACXK,EAAOL,CAAG,EACH,KAEf,CAAC,CACL,GCvGA,IAAMO,GAAN,MAAMC,CAAiB,CALvB,MAKuB,CAAAC,EAAA,yBACnB,YAAYC,EAAKC,EAAYC,EAASC,EAAS,CAC3C,KAAK,KAAOH,EACZ,KAAK,YAAcC,EACnB,KAAK,SAAWC,EAChB,KAAK,SAAWC,EAChB,KAAK,aAAe,MACxB,CACA,IAAI,KAAM,CACN,OAAO,KAAK,IAChB,CACA,IAAI,YAAa,CACb,OAAO,KAAK,WAChB,CACA,IAAI,SAAU,CACV,OAAO,KAAK,QAChB,CACA,QAAQC,EAAO,CACX,GAAIA,EAAO,CACP,IAAMC,EAAQ,KAAK,SAASD,EAAM,KAAK,EACjCE,EAAM,KAAK,SAASF,EAAM,GAAG,EACnC,OAAO,KAAK,SAAS,UAAUC,EAAOC,CAAG,CAC7C,CACA,OAAO,KAAK,QAChB,CACA,OAAOC,EAASL,EAAS,CACrB,QAAWM,KAAUD,EACjB,GAAIT,EAAiB,cAAcU,CAAM,EAAG,CAExC,IAAMJ,EAAQK,GAAmBD,EAAO,KAAK,EAEvCE,EAAc,KAAK,SAASN,EAAM,KAAK,EACvCO,EAAY,KAAK,SAASP,EAAM,GAAG,EACzC,KAAK,SAAW,KAAK,SAAS,UAAU,EAAGM,CAAW,EAAIF,EAAO,KAAO,KAAK,SAAS,UAAUG,EAAW,KAAK,SAAS,MAAM,EAE/H,IAAMC,EAAY,KAAK,IAAIR,EAAM,MAAM,KAAM,CAAC,EACxCS,EAAU,KAAK,IAAIT,EAAM,IAAI,KAAM,CAAC,EACtCU,EAAc,KAAK,aACjBC,EAAmBC,GAAmBR,EAAO,KAAM,GAAOE,CAAW,EAC3E,GAAIG,EAAUD,IAAcG,EAAiB,OACzC,QAASE,EAAI,EAAGC,EAAMH,EAAiB,OAAQE,EAAIC,EAAKD,IACpDH,EAAYG,EAAIL,EAAY,CAAC,EAAIG,EAAiBE,CAAC,OAInDF,EAAiB,OAAS,IAC1BD,EAAY,OAAOF,EAAY,EAAGC,EAAUD,EAAW,GAAGG,CAAgB,EAG1E,KAAK,aAAeD,EAAcA,EAAY,MAAM,EAAGF,EAAY,CAAC,EAAE,OAAOG,EAAkBD,EAAY,MAAMD,EAAU,CAAC,CAAC,EAGrI,IAAMM,EAAOX,EAAO,KAAK,QAAUG,EAAYD,GAC/C,GAAIS,IAAS,EACT,QAASF,EAAIL,EAAY,EAAIG,EAAiB,OAAQG,EAAMJ,EAAY,OAAQG,EAAIC,EAAKD,IACrFH,EAAYG,CAAC,EAAIH,EAAYG,CAAC,EAAIE,CAG9C,SACSrB,EAAiB,OAAOU,CAAM,EACnC,KAAK,SAAWA,EAAO,KACvB,KAAK,aAAe,WAGpB,OAAM,IAAI,MAAM,+BAA+B,EAGvD,KAAK,SAAWN,CACpB,CACA,gBAAiB,CACb,OAAI,KAAK,eAAiB,SACtB,KAAK,aAAec,GAAmB,KAAK,SAAU,EAAI,GAEvD,KAAK,YAChB,CACA,WAAWI,EAAQ,CACfA,EAAS,KAAK,IAAI,KAAK,IAAIA,EAAQ,KAAK,SAAS,MAAM,EAAG,CAAC,EAC3D,IAAMN,EAAc,KAAK,eAAe,EACpCO,EAAM,EAAGC,EAAOR,EAAY,OAChC,GAAIQ,IAAS,EACT,MAAO,CAAE,KAAM,EAAG,UAAWF,CAAO,EAExC,KAAOC,EAAMC,GAAM,CACf,IAAMC,EAAM,KAAK,OAAOF,EAAMC,GAAQ,CAAC,EACnCR,EAAYS,CAAG,EAAIH,EACnBE,EAAOC,EAGPF,EAAME,EAAM,CAEpB,CAGA,IAAMC,EAAOH,EAAM,EACnB,OAAAD,EAAS,KAAK,gBAAgBA,EAAQN,EAAYU,CAAI,CAAC,EAChD,CAAE,KAAAA,EAAM,UAAWJ,EAASN,EAAYU,CAAI,CAAE,CACzD,CACA,SAASC,EAAU,CACf,IAAMX,EAAc,KAAK,eAAe,EACxC,GAAIW,EAAS,MAAQX,EAAY,OAC7B,OAAO,KAAK,SAAS,OAEpB,GAAIW,EAAS,KAAO,EACrB,MAAO,GAEX,IAAMC,EAAaZ,EAAYW,EAAS,IAAI,EAC5C,GAAIA,EAAS,WAAa,EACtB,OAAOC,EAEX,IAAMC,EAAkBF,EAAS,KAAO,EAAIX,EAAY,OAAUA,EAAYW,EAAS,KAAO,CAAC,EAAI,KAAK,SAAS,OAC3GL,EAAS,KAAK,IAAIM,EAAaD,EAAS,UAAWE,CAAc,EACvE,OAAO,KAAK,gBAAgBP,EAAQM,CAAU,CAClD,CACA,gBAAgBN,EAAQM,EAAY,CAChC,KAAON,EAASM,GAAcE,GAAM,KAAK,SAAS,WAAWR,EAAS,CAAC,CAAC,GACpEA,IAEJ,OAAOA,CACX,CACA,IAAI,WAAY,CACZ,OAAO,KAAK,eAAe,EAAE,MACjC,CACA,OAAO,cAAcS,EAAO,CACxB,IAAMC,EAAYD,EAClB,OAAkCC,GAAc,MAC5C,OAAOA,EAAU,MAAS,UAAYA,EAAU,QAAU,SACzDA,EAAU,cAAgB,QAAa,OAAOA,EAAU,aAAgB,SACjF,CACA,OAAO,OAAOD,EAAO,CACjB,IAAMC,EAAYD,EAClB,OAAkCC,GAAc,MAC5C,OAAOA,EAAU,MAAS,UAAYA,EAAU,QAAU,QAAaA,EAAU,cAAgB,MACzG,CACJ,EACWC,IACV,SAAUA,EAAc,CASrB,SAASC,EAAOhC,EAAKC,EAAYC,EAASC,EAAS,CAC/C,OAAO,IAAIN,GAAiBG,EAAKC,EAAYC,EAASC,CAAO,CACjE,CAFSJ,EAAAiC,EAAA,UAGTD,EAAa,OAASC,EAUtB,SAASC,EAAOC,EAAU3B,EAASL,EAAS,CACxC,GAAIgC,aAAoBrC,GACpB,OAAAqC,EAAS,OAAO3B,EAASL,CAAO,EACzBgC,EAGP,MAAM,IAAI,MAAM,sEAAsE,CAE9F,CARSnC,EAAAkC,EAAA,UASTF,EAAa,OAASE,EACtB,SAASE,EAAWD,EAAUE,EAAO,CACjC,IAAMC,EAAOH,EAAS,QAAQ,EACxBI,EAAcC,GAAUH,EAAM,IAAII,EAAiB,EAAG,CAACC,EAAGC,IAAM,CAClE,IAAMvB,EAAOsB,EAAE,MAAM,MAAM,KAAOC,EAAE,MAAM,MAAM,KAChD,OAAIvB,IAAS,EACFsB,EAAE,MAAM,MAAM,UAAYC,EAAE,MAAM,MAAM,UAE5CvB,CACX,CAAC,EACGwB,EAAqB,EACnBC,EAAQ,CAAC,EACf,QAAWC,KAAKP,EAAa,CACzB,IAAM5B,EAAcwB,EAAS,SAASW,EAAE,MAAM,KAAK,EACnD,GAAInC,EAAciC,EACd,MAAM,IAAI,MAAM,kBAAkB,EAE7BjC,EAAciC,GACnBC,EAAM,KAAKP,EAAK,UAAUM,EAAoBjC,CAAW,CAAC,EAE1DmC,EAAE,QAAQ,QACVD,EAAM,KAAKC,EAAE,OAAO,EAExBF,EAAqBT,EAAS,SAASW,EAAE,MAAM,GAAG,CACtD,CACA,OAAAD,EAAM,KAAKP,EAAK,OAAOM,CAAkB,CAAC,EACnCC,EAAM,KAAK,EAAE,CACxB,CA1BS7C,EAAAoC,EAAA,cA2BTJ,EAAa,WAAaI,CAC9B,GAAGJ,KAAiBA,GAAe,CAAC,EAAE,EACtC,SAASQ,GAAUO,EAAMC,EAAS,CAC9B,GAAID,EAAK,QAAU,EAEf,OAAOA,EAEX,IAAME,EAAKF,EAAK,OAAS,EAAK,EACxBG,EAAOH,EAAK,MAAM,EAAGE,CAAC,EACtBE,EAAQJ,EAAK,MAAME,CAAC,EAC1BT,GAAUU,EAAMF,CAAO,EACvBR,GAAUW,EAAOH,CAAO,EACxB,IAAII,EAAU,EACVC,EAAW,EACXnC,EAAI,EACR,KAAOkC,EAAUF,EAAK,QAAUG,EAAWF,EAAM,QACjCH,EAAQE,EAAKE,CAAO,EAAGD,EAAME,CAAQ,CAAC,GACvC,EAEPN,EAAK7B,GAAG,EAAIgC,EAAKE,GAAS,EAI1BL,EAAK7B,GAAG,EAAIiC,EAAME,GAAU,EAGpC,KAAOD,EAAUF,EAAK,QAClBH,EAAK7B,GAAG,EAAIgC,EAAKE,GAAS,EAE9B,KAAOC,EAAWF,EAAM,QACpBJ,EAAK7B,GAAG,EAAIiC,EAAME,GAAU,EAEhC,OAAON,CACX,CA/BS/C,EAAAwC,GAAA,aAgCT,SAASvB,GAAmBqB,EAAMgB,EAAeC,EAAa,EAAG,CAC7D,IAAMC,EAASF,EAAgB,CAACC,CAAU,EAAI,CAAC,EAC/C,QAAS,EAAI,EAAG,EAAIjB,EAAK,OAAQ,IAAK,CAClC,IAAMmB,EAAKnB,EAAK,WAAW,CAAC,EACxBT,GAAM4B,CAAE,IACJA,IAAO,IAAoC,EAAI,EAAInB,EAAK,QAAUA,EAAK,WAAW,EAAI,CAAC,IAAM,IAC7F,IAEJkB,EAAO,KAAKD,EAAa,EAAI,CAAC,EAEtC,CACA,OAAOC,CACX,CAZSxD,EAAAiB,GAAA,sBAaT,SAASY,GAAM6B,EAAM,CACjB,OAAOA,IAAS,IAAoCA,IAAS,EACjE,CAFS1D,EAAA6B,GAAA,SAGT,SAASnB,GAAmBL,EAAO,CAC/B,IAAMC,EAAQD,EAAM,MACdE,EAAMF,EAAM,IAClB,OAAIC,EAAM,KAAOC,EAAI,MAASD,EAAM,OAASC,EAAI,MAAQD,EAAM,UAAYC,EAAI,UACpE,CAAE,MAAOA,EAAK,IAAKD,CAAM,EAE7BD,CACX,CAPSL,EAAAU,GAAA,sBAQT,SAAS+B,GAAkBkB,EAAU,CACjC,IAAMtD,EAAQK,GAAmBiD,EAAS,KAAK,EAC/C,OAAItD,IAAUsD,EAAS,MACZ,CAAE,QAASA,EAAS,QAAS,MAAAtD,CAAM,EAEvCsD,CACX,CANS3D,EAAAyC,GAAA,8DCvOT,SAASmB,EAAWC,EAAAA,CAClB,GAAoB,OAATA,GAAS,SAClB,MAAM,IAAIC,UAAU,mCAAqCC,KAAKC,UAAUH,CAAAA,CAAAA,CAE5E,CAJSD,EAAAA,EAAAA,KAOT,SAASK,EAAqBJ,EAAMK,EAAAA,CAMlC,QADIC,EAJAC,EAAM,GACNC,EAAoB,EACpBC,EAAAA,GACAC,EAAO,EAEFC,EAAI,EAAGA,GAAKX,EAAKY,OAAAA,EAAUD,EAAG,CACrC,GAAIA,EAAIX,EAAKY,OACXN,EAAON,EAAKa,WAAWF,CAAAA,MACpB,CAAA,GAAIL,IAAS,GAChB,MAEAA,EAAO,EAAQ,CACjB,GAAIA,IAAS,GAAU,CACrB,GAAIG,EAAAA,IAAcE,EAAI,GAAKD,IAAS,GAE7B,GAAID,IAAcE,EAAI,GAAKD,IAAS,EAAG,CAC5C,GAAIH,EAAIK,OAAS,GAAKJ,IAAsB,GAAKD,EAAIM,WAAWN,EAAIK,OAAS,CAAA,IAAO,IAAYL,EAAIM,WAAWN,EAAIK,OAAS,CAAA,IAAO,IACjI,GAAIL,EAAIK,OAAS,EAAG,CAClB,IAAIE,EAAiBP,EAAIQ,YAAY,GAAA,EACrC,GAAID,IAAmBP,EAAIK,OAAS,EAAG,CACjCE,IADiC,IAEnCP,EAAM,GACNC,EAAoB,GAGpBA,GADAD,EAAMA,EAAIS,MAAM,EAAGF,CAAAA,GACKF,OAAS,EAAIL,EAAIQ,YAAY,GAAA,EAEvDN,EAAYE,EACZD,EAAO,EACP,QACF,CACF,SAAWH,EAAIK,SAAW,GAAKL,EAAIK,SAAW,EAAG,CAC/CL,EAAM,GACNC,EAAoB,EACpBC,EAAYE,EACZD,EAAO,EACP,QACF,EAEEL,IACEE,EAAIK,OAAS,EACfL,GAAO,MAEPA,EAAM,KACRC,EAAoB,EAExB,MACMD,EAAIK,OAAS,EACfL,GAAO,IAAMP,EAAKgB,MAAMP,EAAY,EAAGE,CAAAA,EAEvCJ,EAAMP,EAAKgB,MAAMP,EAAY,EAAGE,CAAAA,EAClCH,EAAoBG,EAAIF,EAAY,EAEtCA,EAAYE,EACZD,EAAO,CACT,MAAWJ,IAAS,IAAYI,IAArBJ,GAAqBI,EAC5BA,EAEFA,EAAAA,EAEJ,CACA,OAAOH,CACT,CA/DSH,EAAAA,EAAAA,KA6ET,IAAIa,EAAQ,CAEVC,QAASC,EAAA,UAAA,CAKP,QAFIC,EAFAC,EAAe,GACfC,EAAAA,GAGKX,EAAIY,UAAUX,OAAS,EAAGD,GAAAA,IAAM,CAAMW,EAAkBX,IAAK,CACpE,IAAIX,EACAW,GAAK,EACPX,EAAOuB,UAAUZ,CAAAA,GAEbS,IAFaT,SAGfS,EAAMI,QAAQJ,IAAAA,GAChBpB,EAAOoB,GAGTrB,EAAWC,CAAAA,EAGPA,EAAKY,SAAW,IAIpBS,EAAerB,EAAO,IAAMqB,EAC5BC,EAAmBtB,EAAKa,WAAW,CAAA,IAAO,GAC5C,CAQA,OAFAQ,EAAejB,EAAqBiB,EAAAA,CAAeC,CAAAA,EAE/CA,EACED,EAAaT,OAAS,EACjB,IAAMS,EAEN,IACAA,EAAaT,OAAS,EACxBS,EAEA,GAEX,EA1CS,WA4CTI,UAAWN,EAAA,SAAmBnB,EAAAA,CAG5B,GAFAD,EAAWC,CAAAA,EAEPA,EAAKY,SAAW,EAAG,MAAO,IAE9B,IAAIc,EAAa1B,EAAKa,WAAW,CAAA,IAAO,GACpCc,EAAoB3B,EAAKa,WAAWb,EAAKY,OAAS,CAAA,IAAO,GAQ7D,OALAZ,EAAOI,EAAqBJ,EAAAA,CAAO0B,CAAAA,GAE1Bd,SAAW,GAAMc,IAAY1B,EAAO,KACzCA,EAAKY,OAAS,GAAKe,IAAmB3B,GAAQ,KAE9C0B,EAAmB,IAAM1B,EACtBA,CACT,EAhBW,aAkBX0B,WAAYP,EAAA,SAAoBnB,EAAAA,CAE9B,OADAD,EAAWC,CAAAA,EACJA,EAAKY,OAAS,GAAKZ,EAAKa,WAAW,CAAA,IAAO,EACnD,EAHY,cAKZe,KAAMT,EAAA,UAAA,CACJ,GAAII,UAAUX,SAAW,EACvB,MAAO,IAET,QADIiB,EACKlB,EAAI,EAAGA,EAAIY,UAAUX,OAAAA,EAAUD,EAAG,CACzC,IAAImB,EAAMP,UAAUZ,CAAAA,EACpBZ,EAAW+B,CAAAA,EACPA,EAAIlB,OAAS,IACXiB,IADW,OAEbA,EAASC,EAETD,GAAU,IAAMC,EAEtB,CACA,OAAID,IAAJ,OACS,IACFZ,EAAMQ,UAAUI,CAAAA,CACzB,EAjBM,QAmBNE,SAAUZ,EAAA,SAAkBa,EAAMC,EAAAA,CAShC,GARAlC,EAAWiC,CAAAA,EACXjC,EAAWkC,CAAAA,EAEPD,IAASC,IAEbD,EAAOf,EAAMC,QAAQc,CAAAA,MACrBC,EAAKhB,EAAMC,QAAQe,CAAAA,GAEF,MAAO,GAIxB,QADIC,EAAY,EACTA,EAAYF,EAAKpB,QAClBoB,EAAKnB,WAAWqB,CAAAA,IAAe,GAAfA,EADYA,EAAAA,CASlC,QALIC,EAAUH,EAAKpB,OACfwB,EAAUD,EAAUD,EAGpBG,EAAU,EACPA,EAAUJ,EAAGrB,QACdqB,EAAGpB,WAAWwB,CAAAA,IAAa,GAAbA,EADUA,EAAAA,CAW9B,QANIC,EADQL,EAAGrB,OACKyB,EAGhBzB,EAASwB,EAAUE,EAAQF,EAAUE,EACrCC,EAAAA,GACA5B,EAAI,EACDA,GAAKC,EAAAA,EAAUD,EAAG,CACvB,GAAIA,IAAMC,EAAQ,CAChB,GAAI0B,EAAQ1B,EAAQ,CAClB,GAAIqB,EAAGpB,WAAWwB,EAAU1B,CAAAA,IAAO,GAGjC,OAAOsB,EAAGjB,MAAMqB,EAAU1B,EAAI,CAAA,EACzB,GAAIA,IAAM,EAGf,OAAOsB,EAAGjB,MAAMqB,EAAU1B,CAAAA,CAE9B,MAAWyB,EAAUxB,IACfoB,EAAKnB,WAAWqB,EAAYvB,CAAAA,IAAO,GAGrC4B,EAAgB5B,EACPA,IAAM,IAGf4B,EAAgB,IAGpB,KACF,CACA,IAAIC,EAAWR,EAAKnB,WAAWqB,EAAYvB,CAAAA,EAE3C,GAAI6B,IADSP,EAAGpB,WAAWwB,EAAU1B,CAAAA,EAEnC,MACO6B,IAAa,KACpBD,EAAgB5B,EACpB,CAEA,IAAI8B,EAAM,GAGV,IAAK9B,EAAIuB,EAAYK,EAAgB,EAAG5B,GAAKwB,EAAAA,EAAWxB,EAClDA,IAAMwB,GAAWH,EAAKnB,WAAWF,CAAAA,IAAO,KACtC8B,EAAI7B,SAAW,EACjB6B,GAAO,KAEPA,GAAO,OAMb,OAAIA,EAAI7B,OAAS,EACR6B,EAAMR,EAAGjB,MAAMqB,EAAUE,CAAAA,GAEhCF,GAAWE,EACPN,EAAGpB,WAAWwB,CAAAA,IAAa,IAAbA,EACdA,EACGJ,EAAGjB,MAAMqB,CAAAA,EAEpB,EAxFU,YA0FVK,UAAWvB,EAAA,SAAmBnB,EAAAA,CAC5B,OAAOA,CACT,EAFW,aAIX2C,QAASxB,EAAA,SAAiBnB,EAAAA,CAExB,GADAD,EAAWC,CAAAA,EACPA,EAAKY,SAAW,EAAG,MAAO,IAK9B,QAJIN,EAAON,EAAKa,WAAW,CAAA,EACvB+B,EAAUtC,IAAS,GACnBuC,EAAAA,GACAC,EAAAA,GACKnC,EAAIX,EAAKY,OAAS,EAAGD,GAAK,EAAA,EAAKA,EAEtC,IADAL,EAAON,EAAKa,WAAWF,CAAAA,KACV,IACT,GAAA,CAAKmC,EAAc,CACjBD,EAAMlC,EACN,KACF,OAGFmC,EAAAA,GAIJ,OAAID,IAAJ,GAAuBD,EAAU,IAAM,IACnCA,GAAWC,IAAQ,EAAU,KAC1B7C,EAAKgB,MAAM,EAAG6B,CAAAA,CACvB,EAvBS,WAyBTE,SAAU5B,EAAA,SAAkBnB,EAAMgD,EAAAA,CAChC,GAAIA,IAAJ,QAAwC,OAARA,GAAQ,SAAU,MAAM,IAAI/C,UAAU,iCAAA,EACtEF,EAAWC,CAAAA,EAEX,IAGIW,EAHAsC,EAAQ,EACRJ,EAAAA,GACAC,EAAAA,GAGJ,GAAIE,IAAJ,QAAyBA,EAAIpC,OAAS,GAAKoC,EAAIpC,QAAUZ,EAAKY,OAAQ,CACpE,GAAIoC,EAAIpC,SAAWZ,EAAKY,QAAUoC,IAAQhD,EAAM,MAAO,GACvD,IAAIkD,EAASF,EAAIpC,OAAS,EACtBuC,EAAAA,GACJ,IAAKxC,EAAIX,EAAKY,OAAS,EAAGD,GAAK,EAAA,EAAKA,EAAG,CACrC,IAAIL,EAAON,EAAKa,WAAWF,CAAAA,EAC3B,GAAIL,IAAS,IAGT,GAAA,CAAKwC,EAAc,CACjBG,EAAQtC,EAAI,EACZ,KACF,OAEEwC,IAFF,KAKAL,EAAAA,GACAK,EAAmBxC,EAAI,GAErBuC,GAAU,IAER5C,IAAS0C,EAAInC,WAAWqC,CAAAA,EACR,EAAZA,GADoBA,KAIxBL,EAAMlC,IAKRuC,EAAAA,GACAL,EAAMM,GAId,CAGA,OADIF,IAAUJ,EAAKA,EAAMM,EAA0BN,IAA1BM,KAAsCN,EAAM7C,EAAKY,QACnEZ,EAAKgB,MAAMiC,EAAOJ,CAAAA,CAC3B,CACE,IAAKlC,EAAIX,EAAKY,OAAS,EAAGD,GAAK,EAAA,EAAKA,EAClC,GAAIX,EAAKa,WAAWF,CAAAA,IAAO,IAGvB,GAAA,CAAKmC,EAAc,CACjBG,EAAQtC,EAAI,EACZ,KACF,OACSkC,IADT,KAIFC,EAAAA,GACAD,EAAMlC,EAAI,GAId,OAAIkC,IAAJ,GAAuB,GAChB7C,EAAKgB,MAAMiC,EAAOJ,CAAAA,CAE7B,EArEU,YAuEVO,QAASjC,EAAA,SAAiBnB,EAAAA,CACxBD,EAAWC,CAAAA,EAQX,QAPIqD,EAAAA,GACAC,EAAY,EACZT,EAAAA,GACAC,EAAAA,GAGAS,EAAc,EACT5C,EAAIX,EAAKY,OAAS,EAAGD,GAAK,EAAA,EAAKA,EAAG,CACzC,IAAIL,EAAON,EAAKa,WAAWF,CAAAA,EAC3B,GAAIL,IAAS,GASTuC,IATAvC,KAYFwC,EAAAA,GACAD,EAAMlC,EAAI,GAERL,IAAS,GAEL+C,IAFJ/C,GAGE+C,EAAW1C,EACJ4C,IAAgB,IACvBA,EAAc,GACTF,IADS,KAIlBE,EAAAA,YArBE,CAAKT,EAAc,CACjBQ,EAAY3C,EAAI,EAChB,KACF,CAoBN,CAEA,OAAI0C,IAAJ,IAAuBR,IAAnBQ,IAEAE,IAAgB,GAEhBA,IAAgB,GAAKF,IAAaR,EAAM,GAAKQ,IAAaC,EAAY,EACjE,GAEFtD,EAAKgB,MAAMqC,EAAUR,CAAAA,CAC9B,EA/CS,WAiDTW,OAAQrC,EAAA,SAAgBsC,EAAAA,CACtB,GAAIA,IAAe,MAA8B,OAAfA,GAAe,SAC/C,MAAM,IAAIxD,UAAU,mEAAA,OAA4EwD,CAAAA,EAElG,OAvVJ,SAAiBC,EAAKD,EAAAA,CACpB,IAAIE,EAAMF,EAAWE,KAAOF,EAAWG,KACnCC,EAAOJ,EAAWI,OAASJ,EAAWK,MAAQ,KAAOL,EAAWT,KAAO,IAC3E,OAAKW,EAGDA,IAAQF,EAAWG,KACdD,EAAME,EAERF,EA8UU,IA9UEE,EALVA,CAMX,GA6UmB,EAAKJ,CAAAA,CACtB,EALQ,UAORM,MAAO5C,EAAA,SAAenB,EAAAA,CACpBD,EAAWC,CAAAA,EAEX,IAAIgE,EAAM,CAAEJ,KAAM,GAAID,IAAK,GAAIE,KAAM,GAAIb,IAAK,GAAIc,KAAM,EAAA,EACxD,GAAI9D,EAAKY,SAAW,EAAG,OAAOoD,EAC9B,IAEIf,EAFA3C,EAAON,EAAKa,WAAW,CAAA,EACvBa,EAAapB,IAAS,GAEtBoB,GACFsC,EAAIJ,KAAO,IACXX,EAAQ,GAERA,EAAQ,EAaV,QAXII,EAAAA,GACAC,EAAY,EACZT,EAAAA,GACAC,EAAAA,GACAnC,EAAIX,EAAKY,OAAS,EAIlB2C,EAAc,EAGX5C,GAAKsC,EAAAA,EAAStC,EAEnB,IADAL,EAAON,EAAKa,WAAWF,CAAAA,KACV,GASTkC,IAVmBlC,KAarBmC,EAAAA,GACAD,EAAMlC,EAAI,GAERL,IAAS,GAEL+C,IAFJ/C,GAEqB+C,EAAW1C,EAAW4C,IAAgB,IAAGA,EAAc,GACnEF,IADmE,KAI9EE,EAAAA,YAlBE,CAAKT,EAAc,CACjBQ,EAAY3C,EAAI,EAChB,KACF,CAwCN,OArBI0C,IAqBJ,IArBuBR,IAAnBQ,IAEJE,IAAgB,GAEhBA,IAAgB,GAAKF,IAAaR,EAAM,GAAKQ,IAAaC,EAAY,EAChET,IADgE,KAE/BmB,EAAIH,KAAOG,EAAIF,KAA9CR,IAAc,GAAK5B,EAAkC1B,EAAKgB,MAAM,EAAG6B,CAAAA,EAAgC7C,EAAKgB,MAAMsC,EAAWT,CAAAA,IAG3HS,IAAc,GAAK5B,GACrBsC,EAAIF,KAAO9D,EAAKgB,MAAM,EAAGqC,CAAAA,EACzBW,EAAIH,KAAO7D,EAAKgB,MAAM,EAAG6B,CAAAA,IAEzBmB,EAAIF,KAAO9D,EAAKgB,MAAMsC,EAAWD,CAAAA,EACjCW,EAAIH,KAAO7D,EAAKgB,MAAMsC,EAAWT,CAAAA,GAEnCmB,EAAIhB,IAAMhD,EAAKgB,MAAMqC,EAAUR,CAAAA,GAG7BS,EAAY,EAAGU,EAAIL,IAAM3D,EAAKgB,MAAM,EAAGsC,EAAY,CAAA,EAAY5B,IAAYsC,EAAIL,IAAM,KAElFK,CACT,EA1EO,SA4EPN,IAAK,IACLO,UAAW,IACXC,MAAO,KACPjD,MAAO,IAAA,EAGTA,EAAMA,MAAQA,EAEdkD,EAAOC,QAAUnD,CAAAA,CAAAA,EC/gBboD,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,EAAAA,CAE5B,IAAIC,EAAeH,EAAyBE,CAAAA,EAC5C,GAAIC,IAAJ,OACC,OAAOA,EAAaJ,QAGrB,IAAID,EAASE,EAAyBE,CAAAA,EAAY,CAGjDH,QAAS,CAAC,CAAA,EAOX,OAHAK,EAAoBF,CAAAA,EAAUJ,EAAQA,EAAOC,QAASE,CAAAA,EAG/CH,EAAOC,OACf,CAlBSE,EAAAA,EAAAA,KCHTA,EAAoBI,EAAI,CAACN,EAASO,IAAAA,CACjC,QAAQC,KAAOD,EACXL,EAAoBO,EAAEF,EAAYC,CAAAA,GAAAA,CAASN,EAAoBO,EAAET,EAASQ,CAAAA,GAC5EE,OAAOC,eAAeX,EAASQ,EAAK,CAAEI,WAAAA,GAAkBC,IAAKN,EAAWC,CAAAA,CAAAA,CAAAA,CAE1E,ECNDN,EAAoBO,EAAI,CAACK,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,CAAAA,ECClFb,EAAoBiB,EAAKnB,GAAAA,CACH,OAAXoB,OAAW,KAAeA,OAAOC,aAC1CX,OAAOC,eAAeX,EAASoB,OAAOC,YAAa,CAAEC,MAAO,QAAA,CAAA,EAE7DZ,OAAOC,eAAeX,EAAS,aAAc,CAAEsB,MAAAA,EAAO,CAAA,CAAO,EAAA,IAAA,EAAA,CAAA,GAAA,IAAA,CCQvD,IAAIC,EAEXJ,EAAA,EAAA,CAAA,EAAAA,EAAA,EAAA,EAAA,CAAA,IAAApE,EAAA,IAAAyE,EAAA,OAAA,MAAAzE,EAAA,IAAA0E,GAAA,QAAA,CAAA,EAAuB,OAAZrE,SAAY,SACtBmE,EAAYnE,QAAQsE,WAAa,QACF,OAAdC,WAAc,WAE/BJ,EADgBI,UAAUC,UACJC,QAAQ,SAAA,GAAc,GCV7C,IAAMC,EAAiB,iBACjBC,EAAoB,MACpBC,EAAoB,QAE1B,SAASC,EAAarC,EAAUsC,EAAAA,CAG/B,GAAA,CAAKtC,EAAIuC,QAAUD,EAClB,MAAM,IAAIE,MAAM,2DAA2DxC,EAAIyC,SAAAA,aAAsBzC,EAAIhE,IAAAA,cAAkBgE,EAAI0C,KAAAA,iBAAsB1C,EAAI2C,QAAAA,IAAAA,EAK1J,GAAI3C,EAAIuC,QAAAA,CAAWL,EAAeU,KAAK5C,EAAIuC,MAAAA,EAC1C,MAAM,IAAIC,MAAM,iDAAA,EAQjB,GAAIxC,EAAIhE,MACP,GAAIgE,EAAIyC,WACP,GAAA,CAAKN,EAAkBS,KAAK5C,EAAIhE,IAAAA,EAC/B,MAAM,IAAIwG,MAAM,0IAAA,UAGbJ,EAAkBQ,KAAK5C,EAAIhE,IAAAA,EAC9B,MAAM,IAAIwG,MAAM,2HAAA,EAIpB,CA7BSH,EAAAA,EAAAA,KA+DT,IAAMQ,EAAS,GACTC,EAAS,IACTC,EAAU,+DAkBT,MAAMC,CAAAA,OAAAA,CAAAA,EAAAA,UAEZ,OAAA,MAAaC,EAAAA,CACZ,OAAIA,aAAiBD,GAAAA,CAAAA,CAGhBC,GAGoC,OAArBA,EAAOR,WAAc,UACJ,OAApBQ,EAAON,UAAa,UACJ,OAAhBM,EAAOjH,MAAS,UACC,OAAjBiH,EAAOP,OAAU,UACC,OAAlBO,EAAOV,QAAW,UACA,OAAlBU,EAAOC,QAAW,UACF,OAAhBD,EAAOE,MAAS,YACI,OAApBF,EAAOG,UAAa,UACtC,CAMSb,OAMAE,UAKAzG,KAKA0G,MAKAC,SAeT,YAAsBU,EAAsCZ,EAAoBzG,EAAe0G,EAAgBC,EAAmBL,EAAAA,GAAmB,CAExH,OAAjBe,GAAiB,UAC3BC,KAAKf,OAASc,EAAad,QAAUM,EACrCS,KAAKb,UAAYY,EAAaZ,WAAaI,EAC3CS,KAAKtH,KAAOqH,EAAarH,MAAQ6G,EACjCS,KAAKZ,MAAQW,EAAaX,OAASG,EACnCS,KAAKX,SAAWU,EAAaV,UAAYE,IAKzCS,KAAKf,QAvHR,SAAoBA,GAAgBD,GAAAA,CACnC,OAAKC,IAAWD,GAGTC,GAFC,MAGT,GAkH4Bc,EAAcf,CAAAA,EACvCgB,KAAKb,UAAYA,GAAaI,EAC9BS,KAAKtH,MAjHR,SAA8BuG,GAAgBvG,GAAAA,CAM7C,OAAQuG,GAAAA,CACP,IAAK,QACL,IAAK,OACL,IAAK,OACCvG,GAEMA,GAAK,CAAA,IAAO8G,IACtB9G,GAAO8G,EAAS9G,IAFhBA,GAAO8G,CAAAA,CAMV,OAAO9G,EACR,GA+FoCsH,KAAKf,OAAQvG,GAAQ6G,CAAAA,EACtDS,KAAKZ,MAAQA,GAASG,EACtBS,KAAKX,SAAWA,GAAYE,EAE5BR,EAAaiB,KAAMhB,CAAAA,EAErB,CA4BA,IAAA,QAAIY,CAIH,OAAOK,EAAYD,KAAAA,EAAM,CAC1B,CAIA,KAAKE,EAAAA,CAEJ,GAAA,CAAKA,EACJ,OAAOF,KAGR,GAAA,CAAI,OAAEf,EAAM,UAAEE,EAAS,KAAEzG,EAAI,MAAE0G,EAAK,SAAEC,CAAAA,EAAaa,EA2BnD,OA1BIjB,IA0BJ,OAzBCA,EAASe,KAAKf,OACJA,IAAW,OACrBA,EAASM,GAENJ,IAFMI,OAGTJ,EAAYa,KAAKb,UACPA,IAAc,OACxBA,EAAYI,GAET7G,IAFS6G,OAGZ7G,EAAOsH,KAAKtH,KACFA,IAAS,OACnBA,EAAO6G,GAEJH,IAFIG,OAGPH,EAAQY,KAAKZ,MACHA,IAAU,OACpBA,EAAQG,GAELF,IAFKE,OAGRF,EAAWW,KAAKX,SACNA,IAAa,OACvBA,EAAWE,GAGRN,IAAWe,KAAKf,QAChBE,IAAca,KAAKb,WACnBzG,IAASsH,KAAKtH,MACd0G,IAAUY,KAAKZ,OACfC,IAAaW,KAAKX,SAEdW,KAGD,IAAIG,EAAIlB,EAAQE,EAAWzG,EAAM0G,EAAOC,CAAAA,CAChD,CAUA,OAAA,MAAajB,EAAeY,EAAAA,GAAmB,CAC9C,IAAMoB,EAAQX,EAAQY,KAAKjC,CAAAA,EAC3B,OAAKgC,EAGE,IAAID,EACVC,EAAM,CAAA,GAAMb,EACZe,GAAcF,EAAM,CAAA,GAAMb,CAAAA,EAC1Be,GAAcF,EAAM,CAAA,GAAMb,CAAAA,EAC1Be,GAAcF,EAAM,CAAA,GAAMb,CAAAA,EAC1Be,GAAcF,EAAM,CAAA,GAAMb,CAAAA,EAC1BP,CAAAA,EARO,IAAImB,EAAIZ,EAAQA,EAAQA,EAAQA,EAAQA,CAAAA,CAUjD,CAuBA,OAAA,KAAY7G,EAAAA,CAEX,IAAIyG,EAAYI,EAWhB,GANIlB,IACH3F,EAAOA,EAAK6H,QAAQ,MAAOf,CAAAA,GAKxB9G,EAAK,CAAA,IAAO8G,GAAU9G,EAAK,CAAA,IAAO8G,EAAQ,CAC7C,IAAMgB,EAAM9H,EAAKiG,QAAQa,EAAQ,CAAA,EAC7BgB,IAD6B,IAEhCrB,EAAYzG,EAAK+H,UAAU,CAAA,EAC3B/H,EAAO8G,IAEPL,EAAYzG,EAAK+H,UAAU,EAAGD,CAAAA,EAC9B9H,EAAOA,EAAK+H,UAAUD,CAAAA,GAAQhB,EAAAA,CAIhC,OAAO,IAAIW,EAAI,OAAQhB,EAAWzG,EAAM6G,EAAQA,CAAAA,CACjD,CAEA,OAAA,KAAYmB,EAAAA,CACX,IAAMC,EAAS,IAAIR,EAClBO,EAAWzB,OACXyB,EAAWvB,UACXuB,EAAWhI,KACXgI,EAAWtB,MACXsB,EAAWrB,QAAAA,EAGZ,OADAN,EAAa4B,EAAAA,EAAQ,EACdA,CACR,CAeA,SAASC,EAAAA,GAAwB,CAChC,OAAOC,EAAab,KAAMY,CAAAA,CAC3B,CAEA,QAAAE,CACC,OAAOd,IACR,CAMA,OAAA,OAAce,EAAAA,CACb,GAAKA,EAEE,CAAA,GAAIA,aAAgBrB,EAC1B,OAAOqB,EACD,CACN,IAAMJ,EAAS,IAAIR,EAAIY,CAAAA,EAGvB,OAFAJ,EAAOK,WAAwBD,EAAME,SACrCN,EAAOO,QAAqBH,EAAMI,OAASC,EAA4BL,EAAMnB,OAAS,KAC/Ee,CAAAA,CAAAA,CAPP,OAAYI,CASd,CAAA,CAkBD,IAAMK,EAAiB/C,EAAY,EAAA,OAGnC,MAAM8B,UAAYT,CAAAA,OAAAA,CAAAA,EAAAA,UAEjBsB,WAA4B,KAC5BE,QAAyB,KAEzB,IAAA,QAAatB,CAIZ,OAHKI,KAAKkB,UACTlB,KAAKkB,QAAUjB,EAAYD,KAAAA,EAAM,GAE3BA,KAAKkB,OACb,CAES,SAASN,EAAAA,GAAwB,CACzC,OAAKA,EAOGC,EAAab,KAAAA,EAAM,GANrBA,KAAKgB,aACThB,KAAKgB,WAAaH,EAAab,KAAAA,EAAM,GAE/BA,KAAKgB,WAKd,CAES,QAAAF,CACR,IAAM7H,EAAgB,CACrBoI,KAAM,CAAA,EA0BP,OAvBIrB,KAAKkB,UACRjI,EAAI2G,OAASI,KAAKkB,QAClBjI,EAAIkI,KAAOC,GAERpB,KAAKgB,aACR/H,EAAIgI,SAAWjB,KAAKgB,YAGjBhB,KAAKtH,OACRO,EAAIP,KAAOsH,KAAKtH,MAEbsH,KAAKf,SACRhG,EAAIgG,OAASe,KAAKf,QAEfe,KAAKb,YACRlG,EAAIkG,UAAYa,KAAKb,WAElBa,KAAKZ,QACRnG,EAAImG,MAAQY,KAAKZ,OAEdY,KAAKX,WACRpG,EAAIoG,SAAWW,KAAKX,UAEdpG,CACR,CAAA,CAID,IAAMqI,EAAwC,CAC7C,GAAkB,MAClB,GAAkB,MAClB,GAAyB,MACzB,GAAiB,MACjB,GAA8B,MAC9B,GAA+B,MAC/B,GAAmB,MAEnB,GAA4B,MAC5B,GAAuB,MACvB,GAAsB,MACtB,GAAwB,MACxB,GAAsB,MACtB,GAAuB,MACvB,GAAqB,MACrB,GAAiB,MACjB,GAAkB,MAClB,GAAsB,MACtB,GAAmB,MAEnB,GAAkB,KAAA,EAGnB,SAASC,EAAuBC,EAAsBC,EAAiBC,EAAAA,CACtE,IAAIzI,EACA0I,EAAAA,GAEJ,QAASC,EAAM,EAAGA,EAAMJ,EAAalI,OAAQsI,IAAO,CACnD,IAAM5I,EAAOwI,EAAajI,WAAWqI,CAAAA,EAGrC,GACE5I,GAAQ,IAAcA,GAAQ,KAC3BA,GAAQ,IAAcA,GAAQ,IAC9BA,GAAQ,IAAmBA,GAAQ,IACpCA,IAAS,IACTA,IAAS,IACTA,IAAS,IACTA,IAAS,KACRyI,GAAUzI,IAAS,IACnB0I,GAAe1I,IAAS,IACxB0I,GAAe1I,IAAS,IACxB0I,GAAe1I,IAAS,GAGxB2I,IAHe3I,KAIlBC,GAAO4I,mBAAmBL,EAAaf,UAAUkB,EAAiBC,CAAAA,CAAAA,EAClED,EAAAA,IAGG1I,IAHgB,SAInBA,GAAOuI,EAAaM,OAAOF,CAAAA,OAGtB,CAEF3I,IAFE,SAGLA,EAAMuI,EAAaO,OAAO,EAAGH,CAAAA,GAI9B,IAAMI,GAAUV,EAAYtI,CAAAA,EACxBgJ,KADwBhJ,QAIvB2I,IAHDK,KAIF/I,GAAO4I,mBAAmBL,EAAaf,UAAUkB,EAAiBC,CAAAA,CAAAA,EAClED,EAAAA,IAID1I,GAAO+I,IAEGL,IAFHK,KAIPL,EAAkBC,EAAAA,CAAAA,CASrB,OAJID,IAIJ,KAHC1I,GAAO4I,mBAAmBL,EAAaf,UAAUkB,CAAAA,CAAAA,GAG3C1I,IAH2C0I,OAGvB1I,EAAMuI,CAClC,CA9DSD,EAAAA,EAAAA,KAgET,SAASU,EAA0BvJ,EAAAA,CAClC,IAAIO,EACJ,QAAS2I,EAAM,EAAGA,EAAMlJ,EAAKY,OAAQsI,IAAO,CAC3C,IAAM5I,EAAON,EAAKa,WAAWqI,CAAAA,EACzB5I,IAAS,IAAiBA,IAAS,IAClCC,IADyBD,SAE5BC,EAAMP,EAAKqJ,OAAO,EAAGH,CAAAA,GAEtB3I,GAAOqI,EAAYtI,CAAAA,GAEfC,IAFeD,SAGlBC,GAAOP,EAAKkJ,CAAAA,EAAAA,CAIf,OAAO3I,IAAP,OAA2BA,EAAMP,CAClC,CAhBSuJ,EAAAA,EAAAA,KAqBF,SAAShC,EAAYiC,EAAUC,EAAAA,CAErC,IAAI/D,EAsBJ,OAnBCA,EAFG8D,EAAI/C,WAAa+C,EAAIxJ,KAAKY,OAAS,GAAK4I,EAAIjD,SAAW,OAElD,KAAKiD,EAAI/C,SAAAA,GAAY+C,EAAIxJ,IAAAA,GAEjCwJ,EAAIxJ,KAAKa,WAAW,CAAA,IAAO,KACvB2I,EAAIxJ,KAAKa,WAAW,CAAA,GAAM,IAAc2I,EAAIxJ,KAAKa,WAAW,CAAA,GAAM,IAAc2I,EAAIxJ,KAAKa,WAAW,CAAA,GAAM,IAAc2I,EAAIxJ,KAAKa,WAAW,CAAA,GAAM,MACnJ2I,EAAIxJ,KAAKa,WAAW,CAAA,IAAO,GAEzB4I,EAIID,EAAIxJ,KAAKqJ,OAAO,CAAA,EAFhBG,EAAIxJ,KAAK,CAAA,EAAG0J,YAAAA,EAAgBF,EAAIxJ,KAAKqJ,OAAO,CAAA,EAM7CG,EAAIxJ,KAET2F,IACHD,EAAQA,EAAMmC,QAAQ,MAAO,IAAA,GAEvBnC,CACR,CAzBgB6B,EAAAA,EAAAA,KA8BhB,SAASY,EAAaqB,EAAUtB,EAAAA,CAE/B,IAAMyB,EAAWzB,EAEdqB,EADAV,EAGCtI,EAAM,GAAA,CACN,OAAEgG,EAAM,UAAEE,EAAS,KAAEzG,EAAI,MAAE0G,GAAK,SAAEC,EAAAA,EAAa6C,EASnD,GARIjD,IACHhG,GAAOgG,EACPhG,GAAO,MAEJkG,GAAaF,IAAW,UAC3BhG,GAAOuG,EACPvG,GAAOuG,GAEJL,EAAW,CACd,IAAIqB,GAAMrB,EAAUR,QAAQ,GAAA,EAC5B,GAAI6B,KAAJ,GAAgB,CAEf,IAAM8B,GAAWnD,EAAU4C,OAAO,EAAGvB,EAAAA,EACrCrB,EAAYA,EAAU4C,OAAOvB,GAAM,CAAA,EACnCA,GAAM8B,GAAS7I,YAAY,GAAA,EACvB+G,KADuB,GAE1BvH,GAAOoJ,EAAQC,GAAAA,GAAU,EAAO,GAGhCrJ,GAAOoJ,EAAQC,GAASP,OAAO,EAAGvB,EAAAA,EAAAA,GAAM,EAAO,EAC/CvH,GAAO,IACPA,GAAOoJ,EAAQC,GAASP,OAAOvB,GAAM,CAAA,EAAA,GAAI,EAAO,GAEjDvH,GAAO,GAAA,CAERkG,EAAYA,EAAUiD,YAAAA,EACtB5B,GAAMrB,EAAU1F,YAAY,GAAA,EACxB+G,KADwB,GAE3BvH,GAAOoJ,EAAQlD,EAAAA,GAAW,EAAO,GAGjClG,GAAOoJ,EAAQlD,EAAU4C,OAAO,EAAGvB,EAAAA,EAAAA,GAAM,EAAO,EAChDvH,GAAOkG,EAAU4C,OAAOvB,EAAAA,EAAAA,CAG1B,GAAI9H,EAAM,CAET,GAAIA,EAAKY,QAAU,GAAKZ,EAAKa,WAAW,CAAA,IAAO,IAAkBb,EAAKa,WAAW,CAAA,IAAO,GAAgB,CACvG,IAAMP,GAAON,EAAKa,WAAW,CAAA,EACzBP,IAAQ,IAAcA,IAAQ,KACjCN,EAAO,IAAI6J,OAAOC,aAAaxJ,GAAO,EAAA,CAAA,IAAON,EAAKqJ,OAAO,CAAA,CAAA,GAAA,SAEhDrJ,EAAKY,QAAU,GAAKZ,EAAKa,WAAW,CAAA,IAAO,GAAgB,CACrE,IAAMP,GAAON,EAAKa,WAAW,CAAA,EACzBP,IAAQ,IAAcA,IAAQ,KACjCN,EAAO,GAAG6J,OAAOC,aAAaxJ,GAAO,EAAA,CAAA,IAAON,EAAKqJ,OAAO,CAAA,CAAA,GAAA,CAI1D9I,GAAOoJ,EAAQ3J,EAAAA,GAAM,EAAM,CAAA,CAU5B,OARI0G,KACHnG,GAAO,IACPA,GAAOoJ,EAAQjD,GAAAA,GAAO,EAAO,GAE1BC,KACHpG,GAAO,IACPA,GAAQ2H,EAAgEvB,GAAjDkC,EAAuBlC,GAAAA,GAAU,EAAO,GAEzDpG,CACR,CApES4H,EAAAA,EAAAA,KAwET,SAAS4B,EAA2BC,EAAAA,CACnC,GAAA,CACC,OAAOC,mBAAmBD,CAAAA,CAAAA,MACzB,CACD,OAAIA,EAAIpJ,OAAS,EACToJ,EAAIX,OAAO,EAAG,CAAA,EAAKU,EAA2BC,EAAIX,OAAO,CAAA,CAAA,EAEzDW,CAAAA,CAGV,CAVSD,EAAAA,EAAAA,KAYT,IAAMG,EAAiB,8BAEvB,SAAStC,GAAcoC,EAAAA,CACtB,OAAKA,EAAItC,MAAMwC,CAAAA,EAGRF,EAAInC,QAAQqC,GAAiBxC,GAAUqC,EAA2BrC,CAAAA,EAAAA,EAFjEsC,CAGT,CALSpC,EAAAA,GAAAA,KAKT,IAAAuC,GAAA5E,EAAA,GAAA,ECjqBA,IAAM6E,GAAYD,GAAA,OAAkBA,GAC9BE,GAAQ,IAEP,IAAUC,IAAjB,SAAiBA,EAAAA,CAeGC,EAAAC,SAAhB,SAAyBhB,KAAaiB,EAAAA,CAClC,OAAOjB,EAAIrC,KAAK,CAAEnH,KAAMoK,GAAUxI,KAAK4H,EAAIxJ,KAAAA,GAASyK,CAAAA,CAAAA,CAAAA,CACxD,EAgBgBF,EAAAG,YAAhB,SAA4BlB,KAAaiB,EAAAA,CACrC,IAAIzK,EAAOwJ,EAAIxJ,KACX2K,EAAAA,GACA3K,EAAK,CAAA,IAAOqK,KACZrK,EAAOqK,GAAQrK,EACf2K,EAAAA,IAEJ,IAAItJ,EAAe+I,GAAUlJ,QAAQlB,EAAAA,GAASyK,CAAAA,EAI9C,OAHIE,GAActJ,EAAa,CAAA,IAAOgJ,IAAAA,CAAUb,EAAI/C,YAChDpF,EAAeA,EAAa0G,UAAU,CAAA,GAEnCyB,EAAIrC,KAAK,CAAEnH,KAAMqB,CAAAA,CAAAA,CAC5B,EAUgBkJ,EAAA5H,QAAhB,SAAwB6G,EAAAA,CACpB,GAAIA,EAAIxJ,KAAKY,SAAW,GAAK4I,EAAIxJ,OAASqK,GACtC,OAAOb,EAEX,IAAIxJ,EAAOoK,GAAUzH,QAAQ6G,EAAIxJ,IAAAA,EAIjC,OAHIA,EAAKY,SAAW,GAAKZ,EAAKa,WAAW,CAAA,IAAO,KAC5Cb,EAAO,IAEJwJ,EAAIrC,KAAK,CAAEnH,KAAAA,CAAAA,CAAAA,CACtB,EAUgBuK,EAAAxH,SAAhB,SAAyByG,EAAAA,CACrB,OAAOY,GAAUrH,SAASyG,EAAIxJ,IAAAA,CAClC,EAUgBuK,EAAAnH,QAAhB,SAAwBoG,EAAAA,CACpB,OAAOY,GAAUhH,QAAQoG,EAAIxJ,IAAAA,CACjC,CACH,GAzFgBsK,KAAAA,GAAK,CAAA,EAAA,CAAA,GAAA,EAAAM,GAAA,CAAA,GAAA,EAAA,GAAA,CAAA,IAAA5D,GAAA,MAAAsD,EAAA,EAAAM,GCJhB,IAAWC,IAAjB,SAAiBA,EAAQ,CAERA,EAAA,SAAWC,GAAM,SACjBD,EAAA,QAAUC,GAAM,QAChBD,EAAA,QAAUC,GAAM,QAChBD,EAAA,SAAWC,GAAM,SACjBD,EAAA,YAAcC,GAAM,YAEjC,SAAgBC,EAAOC,EAAkBC,EAAgB,CACrD,OAAOD,GAAG,SAAQ,IAAOC,GAAG,SAAQ,CACxC,CAFgBC,EAAAH,EAAA,UAAAF,EAAA,OAAME,EAItB,SAAgBI,EAASC,EAAoBC,EAAgB,CACzD,IAAMC,EAAW,OAAOF,GAAS,SAAWA,EAAOA,EAAK,KAClDG,EAAS,OAAOF,GAAO,SAAWA,EAAKA,EAAG,KAC1CG,EAAYF,EAAS,MAAM,GAAG,EAAE,OAAOG,GAAKA,EAAE,OAAS,CAAC,EACxDC,EAAUH,EAAO,MAAM,GAAG,EAAE,OAAOE,GAAKA,EAAE,OAAS,CAAC,EACtDE,EAAI,EACR,KAAOA,EAAIH,EAAU,QACbA,EAAUG,CAAC,IAAMD,EAAQC,CAAC,EADLA,IACzB,CAIJ,IAAMC,EAAW,MAAM,OAAOJ,EAAU,OAASG,CAAC,EAC5CE,EAASH,EAAQ,MAAMC,CAAC,EAAE,KAAK,GAAG,EACxC,OAAOC,EAAWC,CACtB,CAdgBX,EAAAC,EAAA,YAAAN,EAAA,SAAQM,EAgBxB,SAAgBW,EAAUC,EAAiB,CACvC,OAAOC,GAAI,MAAMD,EAAI,SAAQ,CAAE,EAAE,SAAQ,CAC7C,CAFgBb,EAAAY,EAAA,aAAAjB,EAAA,UAASiB,CAI7B,GAhCiBjB,KAAAA,GAAQ,CAAA,EAAA,EC2CzB,IAAYoB,GAAZ,SAAYA,EAAa,CAKrBA,EAAAA,EAAA,QAAA,CAAA,EAAA,UAMAA,EAAAA,EAAA,OAAA,CAAA,EAAA,SAKAA,EAAAA,EAAA,eAAA,CAAA,EAAA,iBAQAA,EAAAA,EAAA,eAAA,CAAA,EAAA,iBAKAA,EAAAA,EAAA,OAAA,CAAA,EAAA,SAMAA,EAAAA,EAAA,kBAAA,CAAA,EAAA,oBAKAA,EAAAA,EAAA,UAAA,CAAA,EAAA,WACJ,GAzCYA,IAAAA,EAAa,CAAA,EAAA,EA8GnB,IAAOC,GAAP,KAAoC,CAnK1C,MAmK0C,CAAAC,EAAA,sCAMtC,YAAYC,EAAmC,CAC3C,KAAK,gBAAkBA,EAAS,gBAChC,KAAK,cAAgBA,EAAS,UAAU,cACxC,KAAK,mBAAqBA,EAAS,UAAU,kBACjD,CAEA,MAAM,QAAqCC,EAAUC,EAAoB,oBAAkB,KAAI,CAC3F,IAAMC,EAAU,MAAM,KAAK,mBAAmB,SAASF,CAAG,EAC1D,OAAO,KAAK,YAAeA,EAAKE,EAASD,CAAiB,CAC9D,CAIA,iBAA8CE,EAA4BH,EAAWI,EAAyC,CAE1H,OADAJ,EAAMA,GAAOK,GAAI,MAAMF,EAAa,GAAG,EACnC,oBAAkB,GAAGC,CAAK,EACnB,KAAK,YAAeJ,EAAKG,EAAcC,CAAK,EAE5C,KAAK,OAAUJ,EAAKG,EAAcC,CAAK,CAEtD,CAIA,WAAwCE,EAAcN,EAAUI,EAAyC,CACrG,OAAI,oBAAkB,GAAGA,CAAK,EACnB,KAAK,YAAeJ,EAAKM,EAAMF,CAAK,EAEpC,KAAK,OAAUJ,EAAKM,EAAMF,CAAK,CAE9C,CAEA,UAAuCG,EAAUP,EAAQ,CACrD,OAAO,KAAK,OAAUA,EAAK,CAAE,OAAQO,CAAK,CAAE,CAChD,CAEU,OAAoCP,EAAUE,EAAgDM,EAAuB,CAC3H,GAAI,OAAON,GAAY,SAAU,CAC7B,IAAMO,EAAc,KAAK,MAAST,EAAKE,EAASM,CAAO,EACvD,OAAO,KAAK,sBAAyBC,EAAaT,EAAK,OAAWE,CAAO,CAE7E,SAAW,WAAYA,EAAS,CAC5B,IAAMO,EAAc,CAAE,MAAOP,EAAQ,OAAQ,aAAc,CAAA,EAAI,YAAa,CAAA,CAAE,EAC9E,OAAO,KAAK,sBAAyBO,EAAaT,CAAG,CAEzD,KAAO,CACH,IAAMS,EAAc,KAAK,MAAST,EAAKE,EAAQ,QAAO,EAAIM,CAAO,EACjE,OAAO,KAAK,sBAAsBC,EAAaT,EAAKE,CAAO,CAC/D,CACJ,CAEU,MAAM,YAAyCF,EAAUE,EAAgCQ,EAA8B,CAC7H,GAAI,OAAOR,GAAY,SAAU,CAC7B,IAAMO,EAAc,MAAM,KAAK,WAAcT,EAAKE,EAASQ,CAAW,EACtE,OAAO,KAAK,sBAAyBD,EAAaT,EAAK,OAAWE,CAAO,CAC7E,KAAO,CACH,IAAMO,EAAc,MAAM,KAAK,WAAcT,EAAKE,EAAQ,QAAO,EAAIQ,CAAW,EAChF,OAAO,KAAK,sBAAsBD,EAAaT,EAAKE,CAAO,CAC/D,CACJ,CAaU,sBAAmDO,EAA6BT,EAAUG,EAA6BG,EAAa,CAC1I,IAAIK,EACJ,GAAIR,EACAQ,EAAW,CACP,YAAAF,EACA,IAAAT,EACA,MAAOJ,EAAc,OACrB,WAAY,CAAA,EACZ,aAAAO,OAED,CACH,IAAMS,EAAqB,KAAK,yBAAyBZ,EAAKM,CAAI,EAClEK,EAAW,CACP,YAAAF,EACA,IAAAT,EACA,MAAOJ,EAAc,OACrB,WAAY,CAAA,EACZ,IAAI,cAAY,CACZ,OAAOgB,EAAkB,CAC7B,EAER,CACC,OAAAH,EAAY,MAA2B,UAAYE,EAC7CA,CACX,CAEA,MAAM,OAAoCA,EAAuCV,EAAoC,SAEjH,IAAMY,GAAUC,EAAAH,EAAS,YAAY,MAAM,YAAQ,MAAAG,IAAA,OAAA,OAAAA,EAAE,KAAK,SACpDX,GAAeY,EAAA,KAAK,iBAAa,MAAAA,IAAA,OAAA,OAAAA,EAAE,IAAIJ,EAAS,IAAI,SAAQ,CAAE,EAC9DL,EAAOH,EAAeA,EAAa,QAAO,EAAK,MAAM,KAAK,mBAAmB,SAASQ,EAAS,GAAG,EAExG,GAAIR,EACA,OAAO,eACHQ,EACA,eACA,CACI,MAAOR,EACV,MAEF,CACH,IAAMS,EAAqB,KAAK,yBAAyBD,EAAS,IAAKL,CAAI,EAC3E,OAAO,eACHK,EACA,eACA,CACI,IAAKC,EACR,CAET,CAIA,OAAIC,IAAYP,IACZK,EAAS,YAAc,MAAM,KAAK,WAAWA,EAAS,IAAKL,EAAML,CAAiB,EACjFU,EAAS,YAAY,MAA2B,UAAYA,GAEjEA,EAAS,MAAQf,EAAc,OACxBe,CACX,CAEU,MAAyBX,EAAUM,EAAcE,EAAuB,CAE9E,OADiB,KAAK,gBAAgB,YAAYR,CAAG,EACrC,OAAO,cAAc,MAASM,EAAME,CAAO,CAC/D,CAEU,WAA8BR,EAAUM,EAAcL,EAAoC,CAEhG,OADiB,KAAK,gBAAgB,YAAYD,CAAG,EACrC,OAAO,YAAY,MAASM,EAAML,CAAiB,CACvE,CAEU,yBAAyBD,EAAUM,EAAa,CACtD,IAAMU,EAAkB,KAAK,gBACzBC,EACJ,MAAO,IACIA,IAAAA,EAAYC,GAAa,OAC5BlB,EAAI,SAAQ,EAAIgB,EAAgB,YAAYhB,CAAG,EAAE,iBAAiB,WAAY,EAAGM,GAAQ,EAAE,EAGvG,GAuESa,GAAP,KAA8B,CAvYpC,MAuYoC,CAAArB,EAAA,gCAOhC,YAAYC,EAAmC,CAF5B,KAAA,YAA4C,IAAI,IAG/D,KAAK,uBAAyBA,EAAS,UAAU,uBACjD,KAAK,gBAAkBA,EAAS,eACpC,CAEA,IAAI,KAAG,CACH,OAAOqB,EAAO,KAAK,YAAY,OAAM,CAAE,CAC3C,CAEA,YAAYT,EAAyB,CACjC,IAAMU,EAAYV,EAAS,IAAI,SAAQ,EACvC,GAAI,KAAK,YAAY,IAAIU,CAAS,EAC9B,MAAM,IAAI,MAAM,4BAA4BA,CAAS,uBAAuB,EAEhF,KAAK,YAAY,IAAIA,EAAWV,CAAQ,CAC5C,CAEA,YAAYX,EAAQ,CAChB,IAAMqB,EAAYrB,EAAI,SAAQ,EAC9B,OAAO,KAAK,YAAY,IAAIqB,CAAS,CACzC,CAEA,MAAM,oBAAoBrB,EAAUC,EAAqC,CACrE,IAAIU,EAAW,KAAK,YAAYX,CAAG,EACnC,OAAIW,IAGJA,EAAW,MAAM,KAAK,uBAAuB,QAAQX,EAAKC,CAAiB,EAC3E,KAAK,YAAYU,CAAQ,EAClBA,EACX,CAIA,eAAeX,EAAUM,EAAcL,EAAqC,CACxE,GAAIA,EACA,OAAO,KAAK,uBAAuB,WAAWK,EAAMN,EAAKC,CAAiB,EAAE,KAAKU,IAC7E,KAAK,YAAYA,CAAQ,EAClBA,EACV,EACE,CACH,IAAMA,EAAW,KAAK,uBAAuB,WAAWL,EAAMN,CAAG,EACjE,YAAK,YAAYW,CAAQ,EAClBA,CACX,CACJ,CAEA,YAAYX,EAAQ,CAChB,OAAO,KAAK,YAAY,IAAIA,EAAI,SAAQ,CAAE,CAC9C,CAEA,mBAAmBA,EAAQ,CACvB,IAAMqB,EAAYrB,EAAI,SAAQ,EACxBsB,EAAa,KAAK,YAAY,IAAID,CAAS,EACjD,OAAIC,IACe,KAAK,gBAAgB,YAAYtB,CAAG,EAAE,WAAW,OACzD,OAAOsB,CAAU,EACxBA,EAAW,MAAQ1B,EAAc,QACjC0B,EAAW,kBAAoB,OAC/BA,EAAW,YAAc,QAEtBA,CACX,CAEA,eAAetB,EAAQ,CACnB,IAAMqB,EAAYrB,EAAI,SAAQ,EACxBsB,EAAa,KAAK,YAAY,IAAID,CAAS,EACjD,OAAIC,IACAA,EAAW,MAAQ1B,EAAc,QACjC,KAAK,YAAY,OAAOyB,CAAS,GAE9BC,CACX,GCjZJ,IAAMC,GAAgB,OAAO,eAAe,EAO/BC,GAAP,KAAoB,CA5E1B,MA4E0B,CAAAC,EAAA,sBAMtB,YAAYC,EAA6B,CACrC,KAAK,WAAaA,EAAS,OAAO,cAClC,KAAK,iBAAmB,IAAMA,EAAS,OAAO,UAAU,iBACxD,KAAK,cAAgBA,EAAS,WAAW,cACzC,KAAK,eAAiBA,EAAS,UAAU,cAC7C,CAEA,MAAM,KAAKC,EAA2BC,EAAc,oBAAkB,KAAI,CACtE,QAAWC,KAAQC,GAAUH,EAAS,YAAY,KAAK,EACnD,MAAMI,GAAkBH,CAAW,EACnCI,GAAiBH,CAAI,EAAE,QAAQI,GAAO,KAAK,OAAOA,EAAKN,CAAQ,CAAC,CAExE,CAEU,OAAOO,EAAwBP,EAAyB,OAC9D,IAAMM,EAAMC,EAAQ,UAEpB,GAAID,EAAI,OAAS,OAAW,CACxBA,EAAI,KAAOV,GACX,GAAI,CACA,IAAMY,EAAc,KAAK,aAAaD,CAAO,EAC7C,GAAIE,GAAeD,CAAW,EAC1BF,EAAI,KAAOE,UAEXF,EAAI,iBAAmBE,EACnB,KAAK,iBAAgB,EAAG,YAAYA,EAAY,WAAW,EAAG,CAE9D,IAAME,EAAa,KAAK,YAAYF,CAAW,EAC/CF,EAAI,KAAOI,GAAc,KAAK,mBAAmBH,EAASC,CAAW,CACzE,MAEIF,EAAI,KAAO,MAGvB,OAASK,EAAK,CACV,QAAQ,MAAM,mDAAmDL,EAAI,QAAQ,KAAMK,CAAG,EACtF,IAAMC,GAAeC,EAACF,EAAc,WAAO,MAAAE,IAAA,OAAAA,EAAI,OAAOF,CAAG,EACzDL,EAAI,KAAI,OAAA,OAAA,OAAA,OAAA,CAAA,EACDC,CAAO,EAAA,CACV,QAAS,mDAAmDD,EAAI,QAAQ,MAAMM,CAAY,EAAE,CAAA,CAEpG,CAKAZ,EAAS,WAAW,KAAKM,CAAG,CAChC,CACJ,CAEA,OAAON,EAAyB,CAC5B,QAAWM,KAAON,EAAS,WACvB,OAAQM,EAAyB,KACjC,OAAQA,EAAyB,iBAErCN,EAAS,WAAa,CAAA,CAC1B,CAEA,aAAaO,EAAsB,CAE/B,IAAMC,EADQ,KAAK,cAAc,SAASD,CAAO,EACvB,WAAWA,EAAQ,UAAU,QAAQ,EAC/D,OAAOC,GAAe,KAAK,mBAAmBD,CAAO,CACzD,CAEA,eAAeL,EAAeY,EAAkBC,EAA8BC,EAAe,CAGzF,IAAMC,EAAS,KACTC,EAA8B,CAChC,SAAUH,EACV,SAAUC,EAEV,IAAI,KAAG,OACH,GAAIG,GAAU,KAAK,IAAI,EAEnB,OAAO,KAAK,KACT,GAAIC,GAAqB,KAAK,gBAAgB,EAAG,CAEpD,IAAMV,EAAaO,EAAO,YAAY,KAAK,gBAAgB,EAC3D,KAAK,KAAOP,GACRO,EAAO,mBAAmB,CAAE,UAAAC,EAAW,UAAWhB,EAAM,SAAAY,CAAQ,EAAI,KAAK,gBAAgB,CACjG,SAAW,KAAK,OAAS,OAAW,CAEhC,KAAK,KAAOlB,GACZ,IAAMI,EAAWqB,GAAanB,CAAI,EAAE,UAC9BoB,EAAUL,EAAO,cAAc,CAAE,UAAAC,EAAW,UAAWhB,EAAM,SAAAY,CAAQ,CAAE,EAC7E,GAAIQ,EAAQ,OAAStB,GAAYA,EAAS,MAAQuB,EAAc,eAE5D,OAAO,KAAK,KAAO,OAEvB,KAAK,MAAOV,EAAAS,EAAQ,QAAI,MAAAT,IAAA,OAAAA,EAAIS,EAAQ,MACpC,KAAK,iBAAmBA,EAAQ,MAChCtB,GAAU,WAAW,KAAK,IAAI,CAClC,SAAW,KAAK,OAASJ,GACrB,MAAM,IAAI,MAAM,yCAAyCqB,EAAO,eAAe,eAAef,CAAI,CAAC,IAAIY,CAAQ,aAAaE,CAAO,IAAI,EAE3I,OAAOG,GAAU,KAAK,IAAI,EAAI,KAAK,KAAO,MAC9C,EACA,IAAI,kBAAgB,CAChB,OAAO,KAAK,gBAChB,EACA,IAAI,OAAK,CACL,OAAOV,GAAe,KAAK,IAAI,EAAI,KAAK,KAAO,MACnD,GAEJ,OAAOS,CACX,CAEU,cAAcX,EAAsB,OAC1C,GAAI,CACA,IAAMC,EAAc,KAAK,aAAaD,CAAO,EAC7C,GAAIE,GAAeD,CAAW,EAC1B,MAAO,CAAE,MAAOA,CAAW,EAE/B,IAAME,EAAa,KAAK,YAAYF,CAAW,EAC/C,OAAIE,EACO,CAAE,KAAMA,EAAY,MAAOF,CAAW,EAGtC,CACH,MAAOA,EACP,MACI,KAAK,mBAAmBD,EAASC,CAAW,EAG5D,OAASG,EAAK,CACV,QAAQ,MAAM,mDAAmDJ,EAAQ,UAAU,QAAQ,KAAMI,CAAG,EACpG,IAAMC,GAAeC,EAACF,EAAc,WAAO,MAAAE,IAAA,OAAAA,EAAI,OAAOF,CAAG,EACzD,MAAO,CACH,MAAK,OAAA,OAAA,OAAA,OAAA,CAAA,EACEJ,CAAO,EAAA,CACV,QAAS,mDAAmDA,EAAQ,UAAU,QAAQ,MAAMK,CAAY,EAAE,CAAA,EAGtH,CACJ,CAEU,YAAYY,EAAmC,CACrD,GAAIA,EAAgB,KAChB,OAAOA,EAAgB,KAE3B,IAAMC,EAAM,KAAK,iBAAgB,EAAG,YAAYD,EAAgB,WAAW,EAC3E,GAAKC,EAGL,OAAO,KAAK,eAAe,WAAWA,EAAI,YAAY,MAAOD,EAAgB,IAAI,CACrF,CAEU,mBAAmBjB,EAAwBmB,EAAsC,CAGvF,IAAM1B,EAAWqB,GAAad,EAAQ,SAAS,EAAE,UAC7CP,GAAYA,EAAS,MAAQuB,EAAc,gBAC3C,QAAQ,KAAK,gFAAgFvB,EAAS,GAAG,IAAI,EAEjH,IAAM2B,EAAgB,KAAK,WAAW,iBAAiBpB,CAAO,EAC9D,OAAA,OAAA,OAAA,OAAA,OAAA,CAAA,EACOA,CAAO,EAAA,CACV,QAAS,kCAAkCoB,CAAa,WAAWpB,EAAQ,UAAU,QAAQ,KAC7F,kBAAAmB,CAAiB,CAAA,CAEzB,GCtOE,SAAUE,GAAQC,EAAa,CACjC,OAAO,OAAQA,EAAsB,MAAS,QAClD,CAFgBC,EAAAF,GAAA,WAoBV,IAAOG,GAAP,KAA0B,CAjChC,MAiCgC,CAAAD,EAAA,4BAC5B,QAAQD,EAAa,CACjB,GAAID,GAAQC,CAAI,EACZ,OAAOA,EAAK,IAGpB,CAEA,YAAYA,EAAa,CACrB,OAAOG,GAAoBH,EAAK,SAAU,MAAM,CACpD,GCsBE,IAAOI,GAAP,KAAwB,CAjE9B,MAiE8B,CAAAC,EAAA,0BAK1B,YAAYC,EAA6B,CACrC,KAAK,aAAeA,EAAS,WAAW,aACxC,KAAK,MAAQA,EAAS,OAAO,UAAU,aACvC,KAAK,YAAcA,EAAS,UAAU,cAC1C,CAEA,gBAAgBC,EAAsB,CAClC,GAAIA,EAAe,CACf,IAAMC,EAAaC,GAAeF,CAAa,EACzCG,EAAWH,EAAc,QAC/B,GAAIC,GAAcE,EAAU,CACxB,IAAMC,EAAaD,EAA4BF,EAAW,OAAO,EAEjE,GAAII,GAAYD,CAAS,EACrB,OAAOA,EAAU,IACd,GAAI,MAAM,QAAQA,CAAS,GAC9B,QAAWE,KAAOF,EACd,GAAIC,GAAYC,CAAG,GAAKA,EAAI,UACrBA,EAAI,SAAS,QAAUN,EAAc,QACrCM,EAAI,SAAS,KAAON,EAAc,IACrC,OAAOM,EAAI,IAI3B,CACA,GAAIH,EAAU,CACV,IAAMI,EAAW,KAAK,aAAa,YAAYJ,CAAQ,EAEvD,GAAII,IAAaA,IAAaP,GAAiBQ,GAAYR,EAAeO,CAAQ,GAC9E,OAAOJ,CAEf,CACJ,CAEJ,CAEA,oBAAoBH,EAAsB,CACtC,IAAMS,EAAU,KAAK,gBAAgBT,CAAa,EAClD,GAAIS,GAAS,SAAU,CACnB,IAAMC,EAAa,KAAK,aAAa,YAAYD,CAAO,EACxD,OAAOC,GAAcD,EAAQ,QACjC,CAEJ,CAEA,eAAeC,EAAqBC,EAA8B,CAC9D,IAAMC,EAA+B,CAAA,EACrC,GAAID,EAAQ,mBAAoB,CAC5B,IAAML,EAAM,KAAK,mBAAmBI,CAAU,EAC1CJ,GACAM,EAAK,KAAKN,CAAG,CAErB,CACA,IAAIO,EAAkB,KAAK,MAAM,kBAAkBH,EAAY,KAAK,YAAY,eAAeA,CAAU,CAAC,EAC1G,OAAIC,EAAQ,cACRE,EAAkBA,EAAgB,OAAOP,GAAOQ,GAAS,OAAOR,EAAI,UAAWK,EAAQ,WAAW,CAAC,GAEvGC,EAAK,KAAK,GAAGC,CAAe,EACrBE,EAAOH,CAAI,CACtB,CAEU,mBAAmBF,EAAmB,CAC5C,IAAMH,EAAW,KAAK,aAAa,YAAYG,CAAU,EACzD,GAAIH,EAAU,CACV,IAAMS,EAAMC,GAAYP,CAAU,EAC5BQ,EAAO,KAAK,YAAY,eAAeR,CAAU,EACvD,MAAO,CACH,UAAWM,EAAI,IACf,WAAYE,EACZ,UAAWF,EAAI,IACf,WAAYE,EACZ,QAASC,GAAkBZ,CAAQ,EACnC,MAAO,GAEf,CAEJ,GCtIE,IAAOa,GAAP,KAAe,CAZrB,MAYqB,CAAAC,EAAA,iBAMjB,YAAYC,EAAwB,CAChC,GALI,KAAA,IAAM,IAAI,IAKVA,EACA,OAAW,CAACC,EAAKC,CAAK,IAAKF,EACvB,KAAK,IAAIC,EAAKC,CAAK,CAG/B,CAKA,IAAI,MAAI,CACJ,OAAOC,GAAU,IAAIC,EAAO,KAAK,IAAI,OAAM,CAAE,EAAE,IAAIC,GAAKA,EAAE,MAAM,CAAC,CACrE,CAKA,OAAK,CACD,KAAK,IAAI,MAAK,CAClB,CAUA,OAAOJ,EAAQC,EAAS,CACpB,GAAIA,IAAU,OACV,OAAO,KAAK,IAAI,OAAOD,CAAG,EACvB,CACH,IAAMK,EAAS,KAAK,IAAI,IAAIL,CAAG,EAC/B,GAAIK,EAAQ,CACR,IAAMC,EAAQD,EAAO,QAAQJ,CAAK,EAClC,GAAIK,GAAS,EACT,OAAID,EAAO,SAAW,EAClB,KAAK,IAAI,OAAOL,CAAG,EAEnBK,EAAO,OAAOC,EAAO,CAAC,EAEnB,EAEf,CACA,MAAO,EACX,CACJ,CASA,IAAIN,EAAM,OACN,OAAOO,EAAA,KAAK,IAAI,IAAIP,CAAG,KAAC,MAAAO,IAAA,OAAAA,EAAI,CAAA,CAChC,CAOA,IAAIP,EAAQC,EAAS,CACjB,GAAIA,IAAU,OACV,OAAO,KAAK,IAAI,IAAID,CAAG,EACpB,CACH,IAAMK,EAAS,KAAK,IAAI,IAAIL,CAAG,EAC/B,OAAIK,EACOA,EAAO,QAAQJ,CAAK,GAAK,EAE7B,EACX,CACJ,CAKA,IAAID,EAAQC,EAAQ,CAChB,OAAI,KAAK,IAAI,IAAID,CAAG,EAChB,KAAK,IAAI,IAAIA,CAAG,EAAG,KAAKC,CAAK,EAE7B,KAAK,IAAI,IAAID,EAAK,CAACC,CAAK,CAAC,EAEtB,IACX,CAKA,OAAOD,EAAQK,EAAmB,CAC9B,OAAI,KAAK,IAAI,IAAIL,CAAG,EAChB,KAAK,IAAI,IAAIA,CAAG,EAAG,KAAK,GAAGK,CAAM,EAEjC,KAAK,IAAI,IAAIL,EAAK,MAAM,KAAKK,CAAM,CAAC,EAEjC,IACX,CAKA,QAAQG,EAAiD,CACrD,KAAK,IAAI,QAAQ,CAACC,EAAOT,IACrBS,EAAM,QAAQR,GAASO,EAAWP,EAAOD,EAAK,IAAI,CAAC,CAAC,CAE5D,CAKA,CAAC,OAAO,QAAQ,GAAC,CACb,OAAO,KAAK,QAAO,EAAG,SAAQ,CAClC,CAKA,SAAO,CACH,OAAOG,EAAO,KAAK,IAAI,QAAO,CAAE,EAC3B,QAAQ,CAAC,CAACH,EAAKS,CAAK,IAAMA,EAAM,IAAIR,GAAS,CAACD,EAAKC,CAAK,CAAW,CAAC,CAC7E,CAKA,MAAI,CACA,OAAOE,EAAO,KAAK,IAAI,KAAI,CAAE,CACjC,CAKA,QAAM,CACF,OAAOA,EAAO,KAAK,IAAI,OAAM,CAAE,EAAE,KAAI,CACzC,CAKA,qBAAmB,CACf,OAAOA,EAAO,KAAK,IAAI,QAAO,CAAE,CACpC,GAISO,GAAP,KAAY,CAvKlB,MAuKkB,CAAAZ,EAAA,cAKd,IAAI,MAAI,CACJ,OAAO,KAAK,IAAI,IACpB,CAIA,YAAYC,EAAwB,CAChC,GAVI,KAAA,IAAM,IAAI,IACV,KAAA,QAAU,IAAI,IASdA,EACA,OAAW,CAACC,EAAKC,CAAK,IAAKF,EACvB,KAAK,IAAIC,EAAKC,CAAK,CAG/B,CAEA,OAAK,CACD,KAAK,IAAI,MAAK,EACd,KAAK,QAAQ,MAAK,CACtB,CAEA,IAAID,EAAQC,EAAQ,CAChB,YAAK,IAAI,IAAID,EAAKC,CAAK,EACvB,KAAK,QAAQ,IAAIA,EAAOD,CAAG,EACpB,IACX,CAEA,IAAIA,EAAM,CACN,OAAO,KAAK,IAAI,IAAIA,CAAG,CAC3B,CAEA,OAAOC,EAAQ,CACX,OAAO,KAAK,QAAQ,IAAIA,CAAK,CACjC,CAEA,OAAOD,EAAM,CACT,IAAMC,EAAQ,KAAK,IAAI,IAAID,CAAG,EAC9B,OAAIC,IAAU,QACV,KAAK,IAAI,OAAOD,CAAG,EACnB,KAAK,QAAQ,OAAOC,CAAK,EAClB,IAEJ,EACX,GCpJE,IAAOU,GAAP,KAA8B,CAjEpC,MAiEoC,CAAAC,EAAA,gCAKhC,YAAYC,EAA6B,CACrC,KAAK,aAAeA,EAAS,WAAW,aACxC,KAAK,aAAeA,EAAS,UAAU,0BAC3C,CAEA,MAAM,eAAeC,EAA2BC,EAAc,oBAAkB,KAAI,CAChF,OAAO,KAAK,sBAAsBD,EAAS,YAAY,MAAOA,EAAU,OAAWC,CAAW,CAClG,CAcA,MAAM,sBAAsBC,EAAqBF,EAAoCG,EAAiDC,GAAgBH,EAAiC,oBAAkB,KAAI,CACzM,IAAMI,EAAgC,CAAA,EAEtC,KAAK,WAAWH,EAAYG,EAASL,CAAQ,EAC7C,QAAWM,KAAQH,EAASD,CAAU,EAClC,MAAMK,GAAkBN,CAAW,EACnC,KAAK,WAAWK,EAAMD,EAASL,CAAQ,EAE3C,OAAOK,CACX,CAMU,WAAWC,EAAeD,EAA+BL,EAAyB,CACxF,IAAMQ,EAAO,KAAK,aAAa,QAAQF,CAAI,EACvCE,GACAH,EAAQ,KAAK,KAAK,aAAa,kBAAkBC,EAAME,EAAMR,CAAQ,CAAC,CAE9E,CAEA,MAAM,mBAAmBA,EAA2BC,EAAc,oBAAkB,KAAI,CACpF,IAAMQ,EAAWT,EAAS,YAAY,MAChCU,EAAS,IAAIC,GAEnB,QAAWL,KAAQM,GAAkBH,CAAQ,EACzC,MAAMF,GAAkBN,CAAW,EACnC,KAAK,YAAYK,EAAMN,EAAUU,CAAM,EAE3C,OAAOA,CACX,CAOU,YAAYJ,EAAeN,EAA2BU,EAAyB,CACrF,IAAMG,EAAYP,EAAK,WACvB,GAAIO,EAAW,CACX,IAAML,EAAO,KAAK,aAAa,QAAQF,CAAI,EACvCE,GACAE,EAAO,IAAIG,EAAW,KAAK,aAAa,kBAAkBP,EAAME,EAAMR,CAAQ,CAAC,CAEvF,CACJ,GChGE,IAAOc,GAAP,KAAkB,CAzCxB,MAyCwB,CAAAC,EAAA,oBAKpB,YAAYC,EAAsCC,EAAoBC,EAAsB,OACxF,KAAK,SAAWF,EAChB,KAAK,WAAaC,EAClB,KAAK,iBAAkBE,EAAAD,GAAS,mBAAe,MAAAC,IAAA,OAAAA,EAAI,EACvD,CAEA,gBAAc,CACV,OAAI,KAAK,WACE,KAAK,SAAS,OAAO,KAAK,WAAW,eAAc,CAAE,EAErD,KAAK,QAEpB,CAEA,WAAWC,EAAY,CACnB,IAAMC,EAAQ,KAAK,gBACb,KAAK,SAAS,KAAKC,GAAKA,EAAE,KAAK,YAAW,IAAOF,EAAK,YAAW,CAAE,EACnE,KAAK,SAAS,KAAKE,GAAKA,EAAE,OAASF,CAAI,EAC7C,GAAIC,EACA,OAAOA,EAEX,GAAI,KAAK,WACL,OAAO,KAAK,WAAW,WAAWD,CAAI,CAG9C,GAGSG,GAAP,KAAe,CA1ErB,MA0EqB,CAAAR,EAAA,iBAKjB,YAAYC,EAAwCC,EAAoBC,EAAsB,OAC1F,KAAK,SAAW,IAAI,IACpB,KAAK,iBAAkBC,EAAAD,GAAS,mBAAe,MAAAC,IAAA,OAAAA,EAAI,GACnD,QAAWK,KAAWR,EAAU,CAC5B,IAAMI,EAAO,KAAK,gBACZI,EAAQ,KAAK,YAAW,EACxBA,EAAQ,KACd,KAAK,SAAS,IAAIJ,EAAMI,CAAO,CACnC,CACA,KAAK,WAAaP,CACtB,CAEA,WAAWG,EAAY,CACnB,IAAMK,EAAY,KAAK,gBAAkBL,EAAK,YAAW,EAAKA,EACxDC,EAAQ,KAAK,SAAS,IAAII,CAAS,EACzC,GAAIJ,EACA,OAAOA,EAEX,GAAI,KAAK,WACL,OAAO,KAAK,WAAW,WAAWD,CAAI,CAG9C,CAEA,gBAAc,CACV,IAAIM,EAAgBC,EAAO,KAAK,SAAS,OAAM,CAAE,EACjD,OAAI,KAAK,aACLD,EAAgBA,EAAc,OAAO,KAAK,WAAW,eAAc,CAAE,GAElEA,CACX,GAISE,GAAqB,CAC9B,YAAU,CAEV,EACA,gBAAc,CACV,OAAOC,EACX,GC5GE,IAAgBC,GAAhB,KAA+B,CAXrC,MAWqC,CAAAC,EAAA,wBAArC,aAAA,CAEc,KAAA,UAA0B,CAAA,EAC1B,KAAA,WAAa,EAoB3B,CAlBI,UAAUC,EAAsB,CAC5B,KAAK,UAAU,KAAKA,CAAU,CAClC,CAEA,SAAO,CACH,KAAK,gBAAe,EACpB,KAAK,MAAK,EACV,KAAK,WAAa,GAClB,KAAK,UAAU,QAAQA,GAAcA,EAAW,QAAO,CAAE,CAC7D,CAEU,iBAAe,CACrB,GAAI,KAAK,WACL,MAAM,IAAI,MAAM,sCAAsC,CAE9D,GAKSC,GAAP,cAAiCH,EAAe,CApCtD,MAoCsD,CAAAC,EAAA,oBAAtD,aAAA,qBACuB,KAAA,MAAQ,IAAI,GAoCnC,CAlCI,IAAIG,EAAM,CACN,YAAK,gBAAe,EACb,KAAK,MAAM,IAAIA,CAAG,CAC7B,CAEA,IAAIA,EAAQC,EAAQ,CAChB,KAAK,gBAAe,EACpB,KAAK,MAAM,IAAID,EAAKC,CAAK,CAC7B,CAIA,IAAID,EAAQE,EAAkB,CAE1B,GADA,KAAK,gBAAe,EAChB,KAAK,MAAM,IAAIF,CAAG,EAClB,OAAO,KAAK,MAAM,IAAIA,CAAG,EACtB,GAAIE,EAAU,CACjB,IAAMD,EAAQC,EAAQ,EACtB,YAAK,MAAM,IAAIF,EAAKC,CAAK,EAClBA,CACX,KACI,OAER,CAEA,OAAOD,EAAM,CACT,YAAK,gBAAe,EACb,KAAK,MAAM,OAAOA,CAAG,CAChC,CAEA,OAAK,CACD,KAAK,gBAAe,EACpB,KAAK,MAAM,MAAK,CACpB,GAGSG,GAAP,cAAuEP,EAAe,CA3E5F,MA2E4F,CAAAC,EAAA,qBAKxF,YAAYO,EAA0C,CAClD,MAAK,EAJQ,KAAA,MAAQ,IAAI,IAKzB,KAAK,UAAYA,IAAcH,GAASA,EAC5C,CAEA,IAAII,EAAqBL,EAAQ,CAC7B,YAAK,gBAAe,EACb,KAAK,gBAAgBK,CAAU,EAAE,IAAIL,CAAG,CACnD,CAEA,IAAIK,EAAqBL,EAAUC,EAAY,CAC3C,KAAK,gBAAe,EACpB,KAAK,gBAAgBI,CAAU,EAAE,IAAIL,EAAKC,CAAK,CACnD,CAIA,IAAII,EAAqBL,EAAUE,EAAsB,CACrD,KAAK,gBAAe,EACpB,IAAMI,EAAe,KAAK,gBAAgBD,CAAU,EACpD,GAAIC,EAAa,IAAIN,CAAG,EACpB,OAAOM,EAAa,IAAIN,CAAG,EACxB,GAAIE,EAAU,CACjB,IAAMD,EAAQC,EAAQ,EACtB,OAAAI,EAAa,IAAIN,EAAKC,CAAK,EACpBA,CACX,KACI,OAER,CAEA,OAAOI,EAAqBL,EAAQ,CAChC,YAAK,gBAAe,EACb,KAAK,gBAAgBK,CAAU,EAAE,OAAOL,CAAG,CACtD,CAIA,MAAMK,EAAoB,CAEtB,GADA,KAAK,gBAAe,EAChBA,EAAY,CACZ,IAAME,EAAS,KAAK,UAAUF,CAAU,EACxC,KAAK,MAAM,OAAOE,CAAM,CAC5B,MACI,KAAK,MAAM,MAAK,CAExB,CAEU,gBAAgBF,EAAmB,CACzC,IAAME,EAAS,KAAK,UAAUF,CAAU,EACpCG,EAAgB,KAAK,MAAM,IAAID,CAAM,EACzC,OAAKC,IACDA,EAAgB,IAAI,IACpB,KAAK,MAAM,IAAID,EAAQC,CAAa,GAEjCA,CACX,GAOSC,GAAP,cAAmCN,EAAwC,CA/IjF,MA+IiF,CAAAN,EAAA,sBAc7E,YAAYa,EAA2CC,EAAqB,CACxE,MAAMC,GAAOA,EAAI,SAAQ,CAAE,EACvBD,GACA,KAAK,UAAU,KAAKD,EAAe,UAAU,gBAAgB,gBAAgBC,EAAOE,GAAW,CAC3F,KAAK,MAAMA,EAAS,IAAI,SAAQ,CAAE,CACtC,CAAC,CAAC,EACF,KAAK,UAAU,KAAKH,EAAe,UAAU,gBAAgB,SAAS,CAACI,EAAUC,IAAW,CACxF,QAAWH,KAAOG,EACd,KAAK,MAAMH,CAAG,CAEtB,CAAC,CAAC,GAEF,KAAK,UAAU,KAAKF,EAAe,UAAU,gBAAgB,SAAS,CAACM,EAASD,IAAW,CACvF,IAAME,EAAUD,EAAQ,OAAOD,CAAO,EACtC,QAAWH,KAAOK,EACd,KAAK,MAAML,CAAG,CAEtB,CAAC,CAAC,CAEV,GAOSM,GAAP,cAAoCnB,EAAiB,CAvL3D,MAuL2D,CAAAF,EAAA,uBAUvD,YAAYa,EAA2CC,EAAqB,CACxE,MAAK,EACDA,GACA,KAAK,UAAU,KAAKD,EAAe,UAAU,gBAAgB,aAAaC,EAAO,IAAK,CAClF,KAAK,MAAK,CACd,CAAC,CAAC,EACF,KAAK,UAAU,KAAKD,EAAe,UAAU,gBAAgB,SAAS,CAACI,EAAUC,IAAW,CACpFA,EAAQ,OAAS,GACjB,KAAK,MAAK,CAElB,CAAC,CAAC,GAEF,KAAK,UAAU,KAAKL,EAAe,UAAU,gBAAgB,SAAS,IAAK,CACvE,KAAK,MAAK,CACd,CAAC,CAAC,CAEV,GChLE,IAAOS,GAAP,KAA2B,CAjCjC,MAiCiC,CAAAC,EAAA,6BAS7B,YAAYC,EAA6B,CACrC,KAAK,WAAaA,EAAS,OAAO,cAClC,KAAK,aAAeA,EAAS,WAAW,aACxC,KAAK,aAAeA,EAAS,UAAU,2BACvC,KAAK,aAAeA,EAAS,OAAO,UAAU,aAC9C,KAAK,iBAAmB,IAAIC,GAA8BD,EAAS,MAAM,CAC7E,CAEA,SAASE,EAAsB,CAC3B,IAAMC,EAA4C,CAAA,EAC5CC,EAAgB,KAAK,WAAW,iBAAiBF,CAAO,EAExDG,EAAcC,GAAYJ,EAAQ,SAAS,EAAE,kBACnD,GAAIG,EAAa,CACb,IAAIE,EAAmCL,EAAQ,UAC/C,EAAG,CACC,IAAMM,EAAkBH,EAAY,IAAIE,CAAW,EAC/CC,EAAgB,OAAS,GACzBL,EAAO,KAAKM,EAAOD,CAAe,EAAE,OAChCE,GAAQ,KAAK,WAAW,UAAUA,EAAK,KAAMN,CAAa,CAAC,CAAC,EAEpEG,EAAcA,EAAY,UAC9B,OAASA,EACb,CAEA,IAAII,EAAgB,KAAK,eAAeP,EAAeF,CAAO,EAC9D,QAASU,EAAIT,EAAO,OAAS,EAAGS,GAAK,EAAGA,IACpCD,EAAS,KAAK,YAAYR,EAAOS,CAAC,EAAGD,CAAM,EAE/C,OAAOA,CACX,CAKU,YAAYE,EAAwCC,EAAoBC,EAAsB,CACpG,OAAO,IAAIC,GAAYP,EAAOI,CAAQ,EAAGC,EAAYC,CAAO,CAChE,CAMU,oBAAoBF,EAA6BC,EAAoBC,EAAsB,CACjG,IAAME,EAAIR,EAAOI,CAAQ,EAAE,IAAIK,GAAI,CAC/B,IAAMC,EAAO,KAAK,aAAa,QAAQD,CAAC,EACxC,GAAIC,EACA,OAAO,KAAK,aAAa,kBAAkBD,EAAGC,CAAI,CAG1D,CAAC,EAAE,YAAW,EACd,OAAO,IAAIH,GAAYC,EAAGH,EAAYC,CAAO,CACjD,CAKU,eAAeX,EAAuBgB,EAAuB,CACnE,OAAO,KAAK,iBAAiB,IAAIhB,EAAe,IAAM,IAAIiB,GAAS,KAAK,aAAa,YAAYjB,CAAa,CAAC,CAAC,CACpH,GC/CE,SAAUkB,GAAqBC,EAAa,CAC9C,OAAO,OAAQA,EAA4B,UAAa,QAC5D,CAFgBC,EAAAF,GAAA,wBAkDhB,SAASG,GAAwBC,EAAY,CACzC,OAAO,OAAOA,GAAQ,UAAY,CAAC,CAACA,IAAQ,SAAUA,GAAO,WAAYA,EAC7E,CAFSF,EAAAC,GAAA,2BAIH,IAAOE,GAAP,KAA4B,CA5GlC,MA4GkC,CAAAH,EAAA,8BAa9B,YAAYI,EAA6B,CAVzC,KAAA,iBAAmB,IAAI,IAAI,CAAC,aAAc,qBAAsB,kBAAmB,YAAa,UAAU,CAAC,EAWvG,KAAK,iBAAmBA,EAAS,OAAO,UAAU,iBAClD,KAAK,eAAiBA,EAAS,UAAU,eACzC,KAAK,aAAeA,EAAS,WAAW,aACxC,KAAK,gBAAkBA,EAAS,cAAc,eAClD,CAEA,UAAUL,EAAeM,EAA8B,CACnD,IAAMC,EAAmBD,GAAW,CAAA,EAC9BE,EAAmBF,GAAS,SAC5BG,EAAkBR,EAAA,CAACS,EAAaC,IAAmB,KAAK,SAASD,EAAKC,EAAOJ,CAAgB,EAA3E,mBAClBK,EAAWJ,EAAmB,CAACE,EAAaC,IAAmBH,EAAiBE,EAAKC,EAAOF,CAAe,EAAIA,EAErH,GAAI,CACA,YAAK,gBAAkBI,GAAYb,CAAI,EAChC,KAAK,UAAUA,EAAMY,EAAUN,GAAS,KAAK,CACxD,SACI,KAAK,gBAAkB,MAC3B,CACJ,CAEA,YAAyCQ,EAAiBR,EAAgC,CACtF,IAAMS,EAAqBT,GAAW,CAAA,EAChCU,EAAO,KAAK,MAAMF,CAAO,EAC/B,YAAK,SAASE,EAAMA,EAAMD,CAAkB,EACrCC,CACX,CAEU,SAASN,EAAaC,EAAgB,CAAE,QAAAM,EAAS,WAAAC,EAAY,YAAAC,EAAa,SAAAC,EAAU,aAAAC,CAAY,EAAwB,aAC9H,GAAI,MAAK,iBAAiB,IAAIX,CAAG,EAE1B,GAAIY,GAAYX,CAAK,EAAG,CAC3B,IAAMY,EAAWZ,EAAM,IACjBa,EAAWP,EAAUN,EAAM,SAAW,OAC5C,GAAIY,EAAU,CACV,IAAME,EAAiBZ,GAAYU,CAAQ,EACvCG,EAAY,GACZ,KAAK,iBAAmB,KAAK,kBAAoBD,IAC7CJ,EACAK,EAAYL,EAAaI,EAAe,IAAKd,CAAK,EAElDe,EAAYD,EAAe,IAAI,SAAQ,GAG/C,IAAME,EAAa,KAAK,eAAe,eAAeJ,CAAQ,EAC9D,MAAO,CACH,KAAM,GAAGG,CAAS,IAAIC,CAAU,GAChC,SAAAH,EAER,KACI,OAAO,CACH,QAAQI,GAAAC,EAAAlB,EAAM,SAAK,MAAAkB,IAAA,OAAA,OAAAA,EAAE,WAAO,MAAAD,IAAA,OAAAA,EAAI,8BAChC,SAAAJ,EAGZ,SAAWM,GAAUnB,CAAK,EAAG,CACzB,IAAIoB,EAYJ,GAXIZ,IACAY,EAAU,KAAK,kCAAiC,OAAA,OAAA,CAAA,EAAMpB,CAAK,CAAA,GACtD,CAACD,GAAOC,EAAM,YAAcoB,GAAS,cAEtCA,EAAQ,YAAY,aAAcC,EAAA,KAAK,mBAAe,MAAAA,IAAA,OAAA,OAAAA,EAAE,IAAI,SAAQ,IAGxEd,GAAc,CAACR,IACfqB,IAAAA,EAAO,OAAA,OAAA,CAAA,EAAUpB,CAAK,GACtBoB,EAAQ,aAAcE,EAAAtB,EAAM,YAAQ,MAAAsB,IAAA,OAAA,OAAAA,EAAE,MAEtCb,EAAU,CACVW,IAAAA,EAAO,OAAA,OAAA,CAAA,EAAUpB,CAAK,GACtB,IAAMuB,EAAU,KAAK,gBAAgB,WAAWvB,CAAK,EACjDuB,IACCH,EAA+B,SAAWG,EAAQ,QAAQ,MAAO,EAAE,EAE5E,CACA,OAAOH,GAAWpB,CACtB,KACI,QAAOA,CAEf,CAEU,kCAAkCX,EAA2B,CACnE,IAAMmC,EAA4ElC,EAAAmC,IAA4B,CAC1G,OAAQA,EAAQ,OAChB,IAAKA,EAAQ,IACb,OAAQA,EAAQ,OAChB,MAAOA,EAAQ,QAJ+D,yBAOlF,GAAIpC,EAAK,SAAU,CACf,IAAMqC,EAAarC,EAAK,YAAcmC,EAAsBnC,EAAK,QAAQ,EACnEsC,EAAiDD,EAAW,YAAc,CAAA,EAEhF,cAAO,KAAKrC,CAAI,EAAE,OAAOU,GAAO,CAACA,EAAI,WAAW,GAAG,CAAC,EAAE,QAAQA,GAAM,CAChE,IAAM6B,EAAsBC,GAAqBxC,EAAK,SAAUU,CAAG,EAAE,IAAIyB,CAAqB,EAC1FI,EAAoB,SAAW,IAC/BD,EAAY5B,CAAG,EAAI6B,EAE3B,CAAC,EAEMvC,CACX,CAEJ,CAEU,SAASA,EAAsBgB,EAAeV,EAAiCmC,EAAqBC,EAA4BC,EAAuB,CAC7J,OAAW,CAACC,EAAcC,CAAI,IAAK,OAAO,QAAQ7C,CAAI,EAClD,GAAI,MAAM,QAAQ6C,CAAI,EAClB,QAASC,EAAQ,EAAGA,EAAQD,EAAK,OAAQC,IAAS,CAC9C,IAAMC,EAAUF,EAAKC,CAAK,EACtB5C,GAAwB6C,CAAO,EAC/BF,EAAKC,CAAK,EAAI,KAAK,gBAAgB9C,EAAM4C,EAAc5B,EAAM+B,EAASzC,CAAO,EACtEwB,GAAUiB,CAAO,GACxB,KAAK,SAASA,EAA2B/B,EAAMV,EAASN,EAAM4C,EAAcE,CAAK,CAEzF,MACO5C,GAAwB2C,CAAI,EACnC7C,EAAK4C,CAAY,EAAI,KAAK,gBAAgB5C,EAAM4C,EAAc5B,EAAM6B,EAAMvC,CAAO,EAC1EwB,GAAUe,CAAI,GACrB,KAAK,SAASA,EAAwB7B,EAAMV,EAASN,EAAM4C,CAAY,EAG/E,IAAMI,EAAUhD,EAChBgD,EAAQ,WAAaP,EACrBO,EAAQ,mBAAqBN,EAC7BM,EAAQ,gBAAkBL,CAC9B,CAEU,gBAAgBF,EAAoBQ,EAAkBjC,EAAekC,EAAkC5C,EAA+B,CAC5I,IAAIW,EAAUiC,EAAU,SACpBC,EAAQD,EAAU,OACtB,GAAIA,EAAU,KAAM,CAChB,IAAME,EAAM,KAAK,WAAWpC,EAAMkC,EAAU,KAAM5C,EAAQ,YAAY,EACtE,GAAIwB,GAAUsB,CAAG,EACb,OAAKnC,IACDA,EAAU,KAAK,aAAa,QAAQmC,CAAG,GAEpC,CACH,SAAUnC,GAAW,GACrB,IAAAmC,GAGJD,EAAQC,CAEhB,CACA,GAAID,EAAO,CACP,IAAMC,EAA0B,CAC5B,SAAUnC,GAAW,IAEzB,OAAAmC,EAAI,MAAQ,CACR,UAAAX,EACA,SAAAQ,EACA,QAASE,EACT,UAAWC,GAERA,CACX,KACI,OAER,CAEU,WAAWpC,EAAeqC,EAAahC,EAAmC,CAChF,GAAI,CACA,IAAMiC,EAAgBD,EAAI,QAAQ,GAAG,EACrC,GAAIC,IAAkB,EAAG,CACrB,IAAMtD,EAAO,KAAK,eAAe,WAAWgB,EAAMqC,EAAI,UAAU,CAAC,CAAC,EAClE,OAAKrD,GACM,2BAA6BqD,CAG5C,CACA,GAAIC,EAAgB,EAAG,CACnB,IAAMC,EAAclC,EAAeA,EAAagC,CAAG,EAAIG,GAAI,MAAMH,CAAG,EAC9DI,EAAW,KAAK,iBAAiB,YAAYF,CAAW,EAC9D,OAAKE,EAGEA,EAAS,YAAY,MAFjB,oCAAsCJ,CAGrD,CACA,IAAME,EAAclC,EAAeA,EAAagC,EAAI,UAAU,EAAGC,CAAa,CAAC,EAAIE,GAAI,MAAMH,EAAI,UAAU,EAAGC,CAAa,CAAC,EACtHG,EAAW,KAAK,iBAAiB,YAAYF,CAAW,EAC9D,GAAI,CAACE,EACD,MAAO,oCAAsCJ,EAEjD,GAAIC,IAAkBD,EAAI,OAAS,EAC/B,OAAOI,EAAS,YAAY,MAEhC,IAAMzD,EAAO,KAAK,eAAe,WAAWyD,EAAS,YAAY,MAAOJ,EAAI,UAAUC,EAAgB,CAAC,CAAC,EACxG,OAAKtD,GACM,0BAA4BqD,CAG3C,OAASK,EAAK,CACV,OAAO,OAAOA,CAAG,CACrB,CACJ,GCnRE,IAAOC,GAAP,KAA6B,CAzCnC,MAyCmC,CAAAC,EAAA,+BAS/B,IAAc,KAAG,CACb,OAAO,KAAK,gBAChB,CAIA,YAAYC,EAAoC,CAZ7B,KAAA,cAAgB,IAAI,IACpB,KAAA,iBAAmB,IAAI,IAYtC,KAAK,cAAgBA,GAAU,UAAU,aAC7C,CAEA,SAASC,EAA6B,CAClC,IAAMC,EAAOD,EAAS,iBACtB,QAAWE,KAAOD,EAAK,eACf,KAAK,iBAAiB,IAAIC,CAAG,GAC7B,QAAQ,KAAK,sBAAsBA,CAAG,0DAA0DD,EAAK,UAAU,IAAI,EAEvH,KAAK,iBAAiB,IAAIC,EAAKF,CAAQ,EAE3C,KAAK,cAAc,IAAIC,EAAK,WAAYD,CAAQ,EAC5C,KAAK,cAAc,OAAS,EAC5B,KAAK,UAAYA,EAEjB,KAAK,UAAY,MAEzB,CAEA,YAAYG,EAAQ,SAChB,GAAI,KAAK,YAAc,OACnB,OAAO,KAAK,UAEhB,GAAI,KAAK,cAAc,OAAS,EAC5B,MAAM,IAAI,MAAM,uFAAuF,EAE3G,IAAMC,GAAaC,GAAAC,EAAA,KAAK,iBAAa,MAAAA,IAAA,OAAA,OAAAA,EAAE,IAAIH,CAAG,KAAC,MAAAE,IAAA,OAAA,OAAAA,EAAE,WACjD,GAAID,IAAe,OAAW,CAC1B,IAAML,EAAW,KAAK,cAAc,IAAIK,CAAU,EAClD,GAAIL,EACA,OAAOA,CAEf,CACA,IAAMG,EAAMK,GAAS,QAAQJ,CAAG,EAC1BJ,EAAW,KAAK,iBAAiB,IAAIG,CAAG,EAC9C,GAAI,CAACH,EACD,MAAIK,EACM,IAAI,MAAM,gEAAgEF,CAAG,mBAAmBE,CAAU,IAAI,EAE9G,IAAI,MAAM,gEAAgEF,CAAG,IAAI,EAG/F,OAAOH,CACX,CAEA,YAAYI,EAAQ,CAChB,GAAI,CACA,YAAK,YAAYA,CAAG,EACb,EACX,MAAQ,CACJ,MAAO,EACX,CACJ,CAEA,IAAI,KAAG,CACH,OAAO,MAAM,KAAK,KAAK,cAAc,OAAM,CAAE,CACjD,GCzDE,SAAUK,GAAeC,EAAY,CACvC,MAAO,CAAE,KAAAA,CAAI,CACjB,CAFgBC,EAAAF,GAAA,kBAuDV,IAAWG,IAAjB,SAAiBA,EAAkB,CAClBA,EAAA,IAAqC,CAAC,OAAQ,OAAQ,UAAU,CACjF,GAFiBA,KAAAA,GAAkB,CAAA,EAAA,EAY7B,IAAOC,GAAP,KAAyB,CA3H/B,MA2H+B,CAAAF,EAAA,2BAO3B,YAAYG,EAA6B,CANxB,KAAA,QAAU,IAAIC,GAGvB,KAAA,cAAyC,CAAA,EACzC,KAAA,aAAwC,CAAA,EAG5C,KAAK,WAAaD,EAAS,OAAO,aACtC,CAUA,SAAYE,EAAmCC,EAAsC,KAAMC,EAA+B,OAAM,CAC5H,GAAIA,IAAa,WACb,MAAM,IAAI,MAAM,2EAA2E,EAE/F,OAAW,CAACC,EAAMC,CAAE,IAAK,OAAO,QAAQJ,CAAY,EAAG,CACnD,IAAMK,EAAYD,EAClB,GAAI,MAAM,QAAQC,CAAS,EACvB,QAAWC,KAASD,EAAW,CAC3B,IAAME,EAA8B,CAChC,MAAO,KAAK,wBAAwBD,EAAOL,CAAO,EAClD,SAAAC,GAEJ,KAAK,SAASC,EAAMI,CAAK,CAC7B,SACO,OAAOF,GAAc,WAAY,CACxC,IAAME,EAA8B,CAChC,MAAO,KAAK,wBAAwBF,EAAWJ,CAAO,EACtD,SAAAC,GAEJ,KAAK,SAASC,EAAMI,CAAK,CAC7B,MACIC,GAAkBH,CAAS,CAEnC,CACJ,CAEU,wBAAwBC,EAAwBL,EAAgB,CACtE,MAAO,OAAOQ,EAAMC,EAAQC,IAAe,CACvC,MAAM,KAAK,gBAAgB,IAAML,EAAM,KAAKL,EAASQ,EAAMC,EAAQC,CAAW,EAAG,sCAAuCD,EAAQD,CAAI,CACxI,CACJ,CAEU,MAAM,gBAAgBG,EAAyCC,EAAwBH,EAA4BD,EAAa,CACtI,GAAI,CACA,MAAMG,EAAa,CACvB,OAASE,EAAK,CACV,GAAIC,GAAqBD,CAAG,EACxB,MAAMA,EAEV,QAAQ,MAAM,GAAGD,CAAc,IAAKC,CAAG,EACnCA,aAAe,OAASA,EAAI,OAC5B,QAAQ,MAAMA,EAAI,KAAK,EAE3B,IAAME,EAAiBF,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,EACtEJ,EAAO,QAAS,GAAGG,CAAc,KAAKG,CAAc,GAAI,CAAE,KAAAP,CAAI,CAAE,CACpE,CACJ,CAEU,SAASN,EAAcI,EAA2B,CACxD,GAAIJ,IAAS,UAAW,CACpB,KAAK,QAAQ,IAAI,UAAWI,CAAK,EACjC,MACJ,CACA,QAAWU,KAAW,KAAK,WAAW,eAAed,CAAI,EACrD,KAAK,QAAQ,IAAIc,EAASV,CAAK,CAEvC,CAEA,UAAUJ,EAAce,EAAiC,CACrD,IAAIC,EAASC,EAAO,KAAK,QAAQ,IAAIjB,CAAI,CAAC,EACrC,OAAO,KAAK,QAAQ,IAAI,SAAS,CAAC,EACvC,OAAIe,IACAC,EAASA,EAAO,OAAOZ,GAASW,EAAW,SAASX,EAAM,QAAQ,CAAC,GAEhEY,EAAO,IAAIZ,GAASA,EAAM,KAAK,CAC1C,CAkBA,uBAAuBc,EAAoCpB,EAAsC,KAAI,CACjG,KAAK,cAAc,KAAK,KAAK,yBAAyBoB,EAAa,oDAAqDpB,CAAO,CAAC,CACpI,CAkBA,sBAAsBqB,EAAmCrB,EAAsC,KAAI,CAC/F,KAAK,aAAa,KAAK,KAAK,yBAAyBqB,EAAY,uDAAwDrB,CAAO,CAAC,CACrI,CAEU,yBAAyBK,EAA8BO,EAAwBZ,EAAgB,CACrG,MAAO,OAAOsB,EAAUb,EAAQQ,EAAYP,IAAe,CACvD,MAAM,KAAK,gBAAgB,IAAML,EAAM,KAAKL,EAASsB,EAAUb,EAAQQ,EAAYP,CAAW,EAAGE,EAAgBH,EAAQa,CAAQ,CACrI,CACJ,CAEA,IAAI,cAAY,CACZ,OAAO,KAAK,aAChB,CAEA,IAAI,aAAW,CACX,OAAO,KAAK,YAChB,GClNE,IAAOC,GAAP,KAA+B,CAnDrC,MAmDqC,CAAAC,EAAA,iCAKjC,YAAYC,EAA6B,CACrC,KAAK,mBAAqBA,EAAS,WAAW,mBAC9C,KAAK,SAAWA,EAAS,gBAC7B,CAEA,MAAM,iBAAiBC,EAA2BC,EAA6B,CAAA,EAAIC,EAAc,oBAAkB,KAAI,CACnH,IAAMC,EAAcH,EAAS,YACvBI,EAA4B,CAAA,EAIlC,GAFA,MAAMC,GAAkBH,CAAW,GAE/B,CAACD,EAAQ,YAAcA,EAAQ,WAAW,SAAS,UAAU,KAC7D,KAAK,oBAAoBE,EAAaC,EAAaH,CAAO,EACtDA,EAAQ,uBAAyBG,EAAY,KAAKE,GAAI,CAAA,IAAAC,EAAC,QAAAA,EAAAD,EAAE,QAAI,MAAAC,IAAA,OAAA,OAAAA,EAAE,QAASC,GAAkB,WAAW,CAAA,IAIzG,KAAK,qBAAqBL,EAAaC,EAAaH,CAAO,EACvDA,EAAQ,wBAA0BG,EAAY,KAAKE,GAAI,CAAA,IAAAC,EAAC,QAAAA,EAAAD,EAAE,QAAI,MAAAC,IAAA,OAAA,OAAAA,EAAE,QAASC,GAAkB,YAAY,CAAA,KAI3G,KAAK,qBAAqBR,EAAUI,EAAaH,CAAO,EACpDA,EAAQ,wBAA0BG,EAAY,KAAKE,GAAI,CAAA,IAAAC,EAAC,QAAAA,EAAAD,EAAE,QAAI,MAAAC,IAAA,OAAA,OAAAA,EAAE,QAASC,GAAkB,YAAY,CAAA,IACvG,OAAOJ,EAKf,GAAI,CACAA,EAAY,KAAK,GAAG,MAAM,KAAK,YAAYD,EAAY,MAAOF,EAASC,CAAW,CAAC,CACvF,OAASO,EAAK,CACV,GAAIC,GAAqBD,CAAG,EACxB,MAAMA,EAEV,QAAQ,MAAM,uCAAwCA,CAAG,CAC7D,CAEA,aAAMJ,GAAkBH,CAAW,EAE5BE,CACX,CAEU,oBAAoBD,EAA0BC,EAA2BO,EAA2B,WAC1G,IAAMC,EAAmB,CAAC,GAAGT,EAAY,YAAa,IAAGU,GAAAN,EAAAJ,EAAY,eAAW,MAAAI,IAAA,OAAA,OAAAA,EAAE,eAAW,MAAAM,IAAA,OAAAA,EAAI,CAAA,CAAE,EACnG,QAAWC,KAAmBF,EAAkB,CAC5C,IAAMG,GAAWC,EAAAF,EAAgB,YAAQ,MAAAE,IAAA,OAAAA,EAAI,QACvCC,EAAyB,CAC3B,SAAUC,GAAqBH,CAAQ,EACvC,MAAO,CACH,MAAO,CACH,KAAMD,EAAgB,KAAQ,EAC9B,UAAWA,EAAgB,OAAU,GAEzC,IAAK,CACD,KAAMA,EAAgB,KAAQ,EAC9B,UAAWA,EAAgB,OAAUA,EAAgB,OAAS,IAGtE,QAASA,EAAgB,QACzB,KAAMK,GAAiBJ,CAAQ,EAC/B,OAAQ,KAAK,UAAS,GAE1BX,EAAY,KAAKa,CAAU,CAC/B,CACJ,CAEU,qBAAqBd,EAA0BC,EAA2BO,EAA2B,CAC3G,QAAWS,KAAejB,EAAY,aAAc,CAChD,IAAIkB,EAIJ,GAAI,MAAMD,EAAY,MAAM,WAAW,GAGnC,GAAI,kBAAmBA,EAAa,CAChC,IAAME,EAASF,EAAyC,cACxD,GAAK,MAAME,EAAM,WAAW,EAGrB,CAGH,IAAMC,EAAqB,CAAE,KAAM,EAAG,UAAW,CAAC,EAClDF,EAAQ,CAAE,MAAOE,EAAU,IAAKA,CAAQ,CAC5C,KAR+B,CAC3B,IAAMA,EAAqB,CAAE,KAAMD,EAAM,QAAW,EAAG,UAAWA,EAAM,SAAU,EAClFD,EAAQ,CAAE,MAAOE,EAAU,IAAKA,CAAQ,CAC5C,CAMJ,OAEAF,EAAQG,GAAaJ,EAAY,KAAK,EAE1C,GAAIC,EAAO,CACP,IAAMJ,EAAyB,CAC3B,SAAUC,GAAqB,OAAO,EACtC,MAAAG,EACA,QAASD,EAAY,QACrB,KAAMK,GAAejB,GAAkB,YAAY,EACnD,OAAQ,KAAK,UAAS,GAE1BJ,EAAY,KAAKa,CAAU,CAC/B,CACJ,CACJ,CAEU,qBAAqBjB,EAA2BI,EAA2BO,EAA2B,CAC5G,QAAWe,KAAa1B,EAAS,WAAY,CACzC,IAAM2B,EAAeD,EAAU,MAC/B,GAAIC,EAAc,CACd,IAAMC,EAAwC,CAC1C,KAAMD,EAAa,UACnB,SAAUA,EAAa,SACvB,MAAOA,EAAa,MACpB,KAAM,CACF,KAAMnB,GAAkB,aACxB,cAAemB,EAAa,UAAU,MACtC,SAAUA,EAAa,SACvB,QAASA,EAAa,UAAU,WAGxCvB,EAAY,KAAK,KAAK,aAAa,QAASuB,EAAa,QAASC,CAAI,CAAC,CAC3E,CACJ,CACJ,CAEU,MAAM,YAAYC,EAAmB5B,EAA4BC,EAAc,oBAAkB,KAAI,CAC3G,IAAM4B,EAAgC,CAAA,EAChCC,EAA+BjC,EAAA,CAAoBiB,EAA8BiB,EAAiBJ,IAA2B,CAC/HE,EAAgB,KAAK,KAAK,aAAaf,EAAUiB,EAASJ,CAAI,CAAC,CACnE,EAFqC,YAIrC,aAAM,KAAK,kBAAkBC,EAAU5B,EAAS8B,EAAU7B,CAAW,EACrE,MAAM,KAAK,iBAAiB2B,EAAU5B,EAAS8B,EAAU7B,CAAW,EACpE,MAAM,KAAK,iBAAiB2B,EAAU5B,EAAS8B,EAAU7B,CAAW,EAE7D4B,CACX,CAEU,MAAM,kBAAkBD,EAAmB5B,EAA4B8B,EAA8B7B,EAAc,oBAAkB,KAAI,OAC/I,IAAM+B,EAAe,KAAK,mBAAmB,aAC7C,QAAWC,KAAeD,EACtB,MAAM5B,GAAkBH,CAAW,EACnC,MAAMgC,EAAYL,EAAUE,GAAUxB,EAAAN,EAAQ,cAAU,MAAAM,IAAA,OAAAA,EAAI,CAAA,EAAIL,CAAW,CAEnF,CAEU,MAAM,iBAAiB2B,EAAmB5B,EAA4B8B,EAA8B7B,EAAc,oBAAkB,KAAI,CAC9I,MAAM,QAAQ,IAAIiC,GAAUN,CAAQ,EAAE,IAAI,MAAMO,GAAO,CACnD,MAAM/B,GAAkBH,CAAW,EACnC,IAAMmC,EAAS,KAAK,mBAAmB,UAAUD,EAAK,MAAOnC,EAAQ,UAAU,EAC/E,QAAWqC,KAASD,EAChB,MAAMC,EAAMF,EAAML,EAAU7B,CAAW,CAE/C,CAAC,CAAC,CACN,CAEU,MAAM,iBAAiB2B,EAAmB5B,EAA4B8B,EAA8B7B,EAAc,oBAAkB,KAAI,OAC9I,IAAMqC,EAAc,KAAK,mBAAmB,YAC5C,QAAWC,KAAcD,EACrB,MAAMlC,GAAkBH,CAAW,EACnC,MAAMsC,EAAWX,EAAUE,GAAUxB,EAAAN,EAAQ,cAAU,MAAAM,IAAA,OAAAA,EAAI,CAAA,EAAIL,CAAW,CAElF,CAEU,aAAgCa,EAA8BiB,EAAiBJ,EAA+B,CACpH,MAAO,CACH,QAAAI,EACA,MAAOS,GAAmBb,CAAI,EAC9B,SAAUV,GAAqBH,CAAQ,EACvC,KAAMa,EAAK,KACX,gBAAiBA,EAAK,gBACtB,KAAMA,EAAK,KACX,mBAAoBA,EAAK,mBACzB,KAAMA,EAAK,KACX,OAAQ,KAAK,UAAS,EAE9B,CAEU,WAAS,CACf,OAAO,KAAK,SAAS,UACzB,GAGE,SAAUa,GAAsCb,EAA+B,CACjF,GAAIA,EAAK,MACL,OAAOA,EAAK,MAEhB,IAAIc,EAOJ,OANI,OAAOd,EAAK,UAAa,SACzBc,EAAUC,GAAoBf,EAAK,KAAK,SAAUA,EAAK,SAAUA,EAAK,KAAK,EACpE,OAAOA,EAAK,SAAY,WAC/Bc,EAAUE,GAAmBhB,EAAK,KAAK,SAAUA,EAAK,QAASA,EAAK,KAAK,GAE7Ec,IAAAA,EAAYd,EAAK,KAAK,UACjBc,EAMEA,EAAQ,MALJ,CACH,MAAO,CAAE,KAAM,EAAG,UAAW,CAAC,EAC9B,IAAK,CAAE,KAAM,EAAG,UAAW,CAAC,EAIxC,CAlBgB5C,EAAA2C,GAAA,sBA0BV,SAAUvB,GAAqBH,EAAkC,CACnE,OAAQA,EAAU,CACd,IAAK,QACD,MAAO,GACX,IAAK,UACD,MAAO,GACX,IAAK,OACD,MAAO,GACX,IAAK,OACD,MAAO,GACX,QACI,MAAM,IAAI,MAAM,gCAAkCA,CAAQ,CAClE,CACJ,CAbgBjB,EAAAoB,GAAA,wBAeV,SAAUC,GAAiBJ,EAAkC,CAC/D,OAAQA,EAAU,CACd,IAAK,QACD,OAAOU,GAAejB,GAAkB,WAAW,EACvD,IAAK,UACD,OAAOiB,GAAejB,GAAkB,aAAa,EACzD,IAAK,OACD,OAAOiB,GAAejB,GAAkB,UAAU,EACtD,IAAK,OACD,OAAOiB,GAAejB,GAAkB,UAAU,EACtD,QACI,MAAM,IAAI,MAAM,gCAAkCO,CAAQ,CAClE,CACJ,CAbgBjB,EAAAqB,GAAA,oBAeV,IAAWX,IAAjB,SAAiBA,EAAiB,CACjBA,EAAA,YAAc,eACdA,EAAA,cAAgB,iBAChBA,EAAA,WAAa,cACbA,EAAA,WAAa,cACbA,EAAA,aAAe,gBACfA,EAAA,aAAe,eAChC,GAPiBA,KAAAA,GAAiB,CAAA,EAAA,EChQ5B,IAAOqC,GAAP,KAAwC,CAtC9C,MAsC8C,CAAAC,EAAA,0CAK1C,YAAYC,EAA6B,CACrC,KAAK,eAAiBA,EAAS,UAAU,eACzC,KAAK,aAAeA,EAAS,WAAW,YAC5C,CAEA,kBAAkBC,EAAeC,EAA0BC,EAA0B,CACjF,IAAMC,EAAMD,GAAYE,GAAYJ,CAAI,EACxCC,IAAAA,EAAS,KAAK,aAAa,QAAQD,CAAI,GACvC,IAAMK,EAAO,KAAK,eAAe,eAAeL,CAAI,EACpD,GAAI,CAACC,EACD,MAAM,IAAI,MAAM,gBAAgBI,CAAI,eAAe,EAEvD,IAAIC,EACEC,EAAoBT,EAAA,IAAK,CAAA,IAAAU,EAAA,OAACF,IAAAA,EAAoBG,IAAkBD,EAAA,KAAK,aAAa,YAAYR,CAAI,KAAC,MAAAQ,IAAA,OAAAA,EAAIR,EAAK,QAAQ,EAAC,EAAjG,qBAC1B,MAAO,CACH,KAAAA,EACA,KAAAC,EACA,IAAI,aAAW,CACX,OAAOM,EAAiB,CAC5B,EACA,iBAAkBE,GAAkBT,EAAK,QAAQ,EACjD,KAAMA,EAAK,MACX,YAAaG,EAAI,IACjB,KAAAE,EAER,GAuCSK,GAAP,KAA0C,CA3GhD,MA2GgD,CAAAZ,EAAA,4CAI5C,YAAYC,EAA6B,CACrC,KAAK,YAAcA,EAAS,UAAU,cAC1C,CAEA,MAAM,mBAAmBG,EAA2BS,EAAc,oBAAkB,KAAI,CACpF,IAAMC,EAAgC,CAAA,EAChCC,EAAWX,EAAS,YAAY,MACtC,QAAWY,KAAWC,GAAUF,CAAQ,EACpC,MAAMG,GAAkBL,CAAW,EACnCM,GAAiBH,CAAO,EAAE,OAAOI,GAAW,CAACC,GAAeD,CAAO,CAAC,EAAE,QAAQA,GAAU,CAEpF,IAAME,EAAc,KAAK,kBAAkBF,CAAO,EAC9CE,GACAR,EAAM,KAAKQ,CAAW,CAE9B,CAAC,EAEL,OAAOR,CACX,CAEU,kBAAkBM,EAAsB,CAC9C,IAAMG,EAAkBH,EAAQ,UAAU,iBACpCI,EAAaJ,EAAQ,UAAU,SACrC,GAAI,CAACG,GAAmB,CAACC,EACrB,OAEJ,IAAMC,EAASnB,GAAYc,EAAQ,SAAS,EAAE,IAC9C,MAAO,CACH,UAAWK,EACX,WAAY,KAAK,YAAY,eAAeL,EAAQ,SAAS,EAC7D,UAAWG,EAAgB,YAC3B,WAAYA,EAAgB,KAC5B,QAASZ,GAAkBa,CAAU,EACrC,MAAOE,GAAS,OAAOH,EAAgB,YAAaE,CAAM,EAElE,GC/GE,IAAOE,GAAP,KAA4B,CAnClC,MAmCkC,CAAAC,EAAA,8BAAlC,aAAA,CACc,KAAA,iBAAmB,IACnB,KAAA,eAAiB,GAuC/B,CArCI,eAAeC,EAAa,CACxB,GAAIA,EAAK,WAAY,CACjB,IAAMC,EAAgB,KAAK,eAAeD,EAAK,UAAU,EACnDE,EAAa,KAAK,eAAeF,CAAI,EAE3C,OADiBC,EAAgB,KAAK,iBAAmBC,CAE7D,CACA,MAAO,EACX,CAEU,eAAe,CAAE,mBAAAC,EAAoB,gBAAAC,CAAe,EAAW,CACrE,GAAI,CAACD,EACD,MAAM,IAAI,MAAM,2CAA2C,EAE/D,OAAIC,IAAoB,OACbD,EAAqB,KAAK,eAAiBC,EAE/CD,CACX,CAEA,WAAwCH,EAAeK,EAAY,CAE/D,OADiBA,EAAK,MAAM,KAAK,gBAAgB,EACjC,OAAO,CAACC,EAAeC,IAAgB,CACnD,GAAI,CAACD,GAAiBC,EAAa,SAAW,EAC1C,OAAOD,EAEX,IAAME,EAAgBD,EAAa,QAAQ,KAAK,cAAc,EAC9D,GAAIC,EAAgB,EAAG,CACnB,IAAMC,EAAWF,EAAa,UAAU,EAAGC,CAAa,EAClDE,EAAa,SAASH,EAAa,UAAUC,EAAgB,CAAC,CAAC,EAC/DG,EAASL,EAAuDG,CAAQ,EAC9E,OAAOE,IAAQD,CAAU,CAC7B,CACA,OAAQJ,EAAqDC,CAAY,CAC7E,EAAGP,CAAI,CACX,GC1EJ,IAAAY,GAAA,GAOAC,EAAAD,GAAc,YC8ER,IAAOE,GAAP,KAAmC,CArFzC,MAqFyC,CAAAC,EAAA,qCAQrC,YAAYC,EAAmC,CAL5B,KAAA,OAAS,IAAIC,GACtB,KAAA,SAAgD,CAAA,EAChD,KAAA,gBAAkB,GAClB,KAAA,oCAAsC,IAAI,WAGhD,KAAK,gBAAkBD,EAAS,eACpC,CAEA,IAAI,OAAK,CACL,OAAO,KAAK,OAAO,OACvB,CAEA,WAAWE,EAAwB,SAC/B,KAAK,iBAAkBC,GAAAC,EAAAF,EAAO,aAAa,aAAS,MAAAE,IAAA,OAAA,OAAAA,EAAE,iBAAa,MAAAD,IAAA,OAAAA,EAAI,EAC3E,CAEA,MAAM,YAAYD,EAAsC,CACpD,GAAI,KAAK,gBAAiB,CACtB,GAAIA,EAAO,SAAU,CAIjB,IAAMG,EAAY,KAAK,gBAAgB,IACvCH,EAAO,SAAS,CAEZ,QAASG,EAAU,IAAIC,GAAQ,KAAK,cAAcA,EAAK,iBAAiB,UAAU,CAAC,EACtF,CACL,CAEA,GAAIJ,EAAO,mBAAoB,CAG3B,IAAMK,EAAiB,KAAK,gBAAgB,IAAI,IAAID,IAA2B,CAE3E,QAAS,KAAK,cAAcA,EAAK,iBAAiB,UAAU,GAC/D,EAGKE,EAAU,MAAMN,EAAO,mBAAmBK,CAAc,EAC9DA,EAAe,QAAQ,CAACE,EAAMC,IAAO,CACjC,KAAK,2BAA2BD,EAAK,QAAUD,EAAQE,CAAG,CAAC,CAC/D,CAAC,CACL,CACJ,CACA,KAAK,OAAO,QAAO,CACvB,CAQA,oBAAoBC,EAAoC,CAC/CA,EAAO,UAGZ,OAAO,KAAKA,EAAO,QAAQ,EAAE,QAAQC,GAAU,CAC3C,IAAMC,EAAgBF,EAAO,SAASC,CAAO,EAC7C,KAAK,2BAA2BA,EAASC,CAAa,EACtD,KAAK,oCAAoC,KAAK,CAAE,QAAAD,EAAS,cAAAC,CAAa,CAAE,CAC5E,CAAC,CACL,CAEU,2BAA2BD,EAAiBC,EAAkB,CACpE,KAAK,SAASD,CAAO,EAAIC,CAC7B,CAQA,MAAM,iBAAiBC,EAAkBD,EAAqB,CAC1D,MAAM,KAAK,MAEX,IAAME,EAAc,KAAK,cAAcD,CAAQ,EAC/C,GAAI,KAAK,SAASC,CAAW,EACzB,OAAO,KAAK,SAASA,CAAW,EAAEF,CAAa,CAEvD,CAEU,cAAcG,EAAkB,CACtC,MAAO,GAAGA,CAAU,EACxB,CAEA,IAAI,8BAA4B,CAC5B,OAAO,KAAK,oCAAoC,KACpD,GC9JE,IAAWC,IAAjB,SAAiBA,EAAU,CAGvB,SAAgBC,EAAOC,EAAoC,CACvD,MAAO,CACH,QAASC,EAAA,SAAY,MAAMD,EAAQ,EAA1B,WAEjB,CAJgBC,EAAAF,EAAA,UAAAD,EAAA,OAAMC,CAK1B,GARiBD,KAAAA,GAAU,CAAA,EAAA,ECoGrB,IAAOI,GAAP,KAA6B,CAxHnC,MAwHmC,CAAAC,EAAA,+BAqB/B,YAAYC,EAAmC,CAnB/C,KAAA,mBAAmC,CAE/B,WAAY,CACR,WAAY,CAAC,WAAY,MAAM,IASpB,KAAA,gBAA4C,CAAA,EAC5C,KAAA,oBAAsB,IAAIC,GAC1B,KAAA,uBAAyB,IAAIA,GAC7B,KAAA,WAAa,IAAI,IACjB,KAAA,qBAAuB,IAAI,IACpC,KAAA,aAAeC,EAAc,QAGnC,KAAK,iBAAmBF,EAAS,UAAU,iBAC3C,KAAK,uBAAyBA,EAAS,UAAU,uBACjD,KAAK,cAAgBA,EAAS,UAAU,cACxC,KAAK,aAAeA,EAAS,UAAU,aACvC,KAAK,gBAAkBA,EAAS,eACpC,CAEA,MAAM,MAAyBG,EAAsCC,EAAwB,CAAA,EAAIC,EAAc,oBAAkB,KAAI,SACjI,QAAWC,KAAYH,EAAW,CAC9B,IAAMI,EAAMD,EAAS,IAAI,SAAQ,EACjC,GAAIA,EAAS,QAAUJ,EAAc,WACjC,GAAI,OAAOE,EAAQ,YAAe,WAAaA,EAAQ,WAEnDE,EAAS,MAAQJ,EAAc,kBAC/BI,EAAS,YAAc,OACvB,KAAK,WAAW,OAAOC,CAAG,UACnB,OAAOH,EAAQ,YAAe,SAAU,CAC/C,IAAMI,EAAa,KAAK,WAAW,IAAID,CAAG,EACpCE,GAAqBC,EAAAF,GAAY,UAAM,MAAAE,IAAA,OAAA,OAAAA,EAAE,iBAC/C,GAAID,EAAoB,CAIpB,IAAME,IADgBC,EAAAR,EAAQ,WAAW,cAAU,MAAAQ,IAAA,OAAAA,EAAIC,GAAmB,KACzC,OAAOC,GAAK,CAACL,EAAmB,SAASK,CAAC,CAAC,EACxEH,EAAW,OAAS,IACpB,KAAK,WAAW,IAAIJ,EAAK,CACrB,UAAW,GACX,QAAS,CACL,WAAU,OAAA,OAAA,OAAA,OAAA,CAAA,EACHH,EAAQ,UAAU,EAAA,CACrB,WAAAO,CAAU,CAAA,GAGlB,OAAQH,EAAW,OACtB,EACDF,EAAS,MAAQJ,EAAc,kBAEvC,CACJ,OAGA,KAAK,WAAW,OAAOK,CAAG,CAElC,CACA,KAAK,aAAeL,EAAc,QAClC,MAAM,KAAK,WAAWC,EAAU,IAAIY,GAAKA,EAAE,GAAG,EAAG,CAAA,CAAE,EACnD,MAAM,KAAK,eAAeZ,EAAWC,EAASC,CAAW,CAC7D,CAEA,MAAM,OAAOW,EAAgBC,EAAgBZ,EAAc,oBAAkB,KAAI,CAC7E,KAAK,aAAeH,EAAc,QAElC,QAAWgB,KAAcD,EACrB,KAAK,iBAAiB,eAAeC,CAAU,EAC/C,KAAK,WAAW,OAAOA,EAAW,SAAQ,CAAE,EAC5C,KAAK,aAAa,OAAOA,CAAU,EAGvC,QAAWC,KAAcH,EAAS,CAE9B,GAAI,CADgB,KAAK,iBAAiB,mBAAmBG,CAAU,EACrD,CAId,IAAMC,EAAc,KAAK,uBAAuB,UAAU,CAAE,MAAO,SAAS,EAAID,CAAU,EAC1FC,EAAY,MAAQlB,EAAc,QAClC,KAAK,iBAAiB,YAAYkB,CAAW,CACjD,CACA,KAAK,WAAW,OAAOD,EAAW,SAAQ,CAAE,CAChD,CAEA,IAAME,EAAiBC,EAAON,CAAO,EAAE,OAAOC,CAAO,EAAE,IAAIM,GAAOA,EAAI,SAAQ,CAAE,EAAE,MAAK,EACvF,KAAK,iBAAiB,IACjB,OAAOC,GAAO,CAACH,EAAe,IAAIG,EAAI,IAAI,SAAQ,CAAE,GAAK,KAAK,aAAaA,EAAKH,CAAc,CAAC,EAC/F,QAAQG,GAAM,CACI,KAAK,gBAAgB,YAAYA,EAAI,GAAG,EAAE,WAAW,OAC7D,OAAOA,CAAG,EACjBA,EAAI,MAAQ,KAAK,IAAIA,EAAI,MAAOtB,EAAc,cAAc,EAC5DsB,EAAI,YAAc,MACtB,CAAC,EAEL,MAAM,KAAK,WAAWR,EAASC,CAAO,EAEtC,MAAMQ,GAAkBpB,CAAW,EAGnC,IAAMqB,EAAmB,KAAK,cAC1B,KAAK,iBAAiB,IACjB,OAAOF,GAAM,OAEV,OAAAA,EAAI,MAAQtB,EAAc,QAEvB,EAAC,GAAAQ,EAAA,KAAK,WAAW,IAAIc,EAAI,IAAI,SAAQ,CAAE,KAAC,MAAAd,IAAA,SAAAA,EAAE,WAAS,EAEzD,QAAO,CAAE,EAElB,MAAM,KAAK,eAAegB,EAAkB,KAAK,mBAAoBrB,CAAW,CACpF,CAEU,MAAM,WAAWW,EAAgBC,EAAc,CACrD,MAAM,QAAQ,IAAI,KAAK,gBAAgB,IAAIU,GAAYA,EAASX,EAASC,CAAO,CAAC,CAAC,CACtF,CASU,cAAcd,EAA4B,CAChD,IAAIyB,EAAO,EACPC,EAAQ1B,EAAU,OAAS,EAE/B,KAAOyB,EAAOC,GAAO,CACjB,KAAOD,EAAOzB,EAAU,QAAU,KAAK,gBAAgBA,EAAUyB,CAAI,CAAC,GAClEA,IAGJ,KAAOC,GAAS,GAAK,CAAC,KAAK,gBAAgB1B,EAAU0B,CAAK,CAAC,GACvDA,IAGAD,EAAOC,IACP,CAAC1B,EAAUyB,CAAI,EAAGzB,EAAU0B,CAAK,CAAC,EAAI,CAAC1B,EAAU0B,CAAK,EAAG1B,EAAUyB,CAAI,CAAC,EAEhF,CAEA,OAAOzB,CACX,CAEQ,gBAAgBqB,EAAoB,OACxC,MAAO,GAAQ,GAAAd,EAAA,KAAK,iBAAa,MAAAA,IAAA,SAAAA,EAAE,IAAIc,EAAI,GAAG,EAClD,CAKU,aAAalB,EAA2BwB,EAAwB,CAEtE,OAAIxB,EAAS,WAAW,KAAKyB,GAAOA,EAAI,QAAU,MAAS,EAChD,GAGJ,KAAK,aAAa,WAAWzB,EAAUwB,CAAW,CAC7D,CAEA,SAASE,EAAgC,CACrC,YAAK,gBAAgB,KAAKA,CAAQ,EAC3BC,GAAW,OAAO,IAAK,CAC1B,IAAMC,EAAQ,KAAK,gBAAgB,QAAQF,CAAQ,EAC/CE,GAAS,GACT,KAAK,gBAAgB,OAAOA,EAAO,CAAC,CAE5C,CAAC,CACL,CAWU,MAAM,eAAe/B,EAA8BC,EAAuBC,EAA8B,CAC9G,KAAK,aAAaF,EAAWC,CAAO,EAEpC,MAAM,KAAK,cAAcD,EAAWD,EAAc,OAAQG,EAAamB,GACnE,KAAK,uBAAuB,OAAOA,EAAKnB,CAAW,CAAC,EAGxD,MAAM,KAAK,cAAcF,EAAWD,EAAc,eAAgBG,EAAamB,GAC3E,KAAK,aAAa,cAAcA,EAAKnB,CAAW,CAAC,EAGrD,MAAM,KAAK,cAAcF,EAAWD,EAAc,eAAgBG,EAAa,MAAMmB,GAAM,CACvF,IAAMW,EAAmB,KAAK,gBAAgB,YAAYX,EAAI,GAAG,EAAE,WAAW,iBAC9EA,EAAI,kBAAoB,MAAMW,EAAiB,mBAAmBX,EAAKnB,CAAW,CACtF,CAAC,EAED,MAAM,KAAK,cAAcF,EAAWD,EAAc,OAAQG,EAAamB,GACpD,KAAK,gBAAgB,YAAYA,EAAI,GAAG,EAAE,WAAW,OACtD,KAAKA,EAAKnB,CAAW,CACtC,EAED,MAAM,KAAK,cAAcF,EAAWD,EAAc,kBAAmBG,EAAamB,GAC9E,KAAK,aAAa,iBAAiBA,EAAKnB,CAAW,CAAC,EAGxD,IAAM+B,EAAgBjC,EAAU,OAAOqB,GAAO,KAAK,eAAeA,CAAG,CAAC,EACtE,MAAM,KAAK,cAAcY,EAAelC,EAAc,UAAWG,EAAamB,GAC1E,KAAK,SAASA,EAAKnB,CAAW,CAAC,EAInC,QAAWmB,KAAOrB,EAAW,CACzB,IAAMkC,EAAQ,KAAK,WAAW,IAAIb,EAAI,IAAI,SAAQ,CAAE,EAChDa,IACAA,EAAM,UAAY,GAE1B,CACJ,CAQU,aAAalC,EAA8BC,EAAqB,CACtE,QAAWoB,KAAOrB,EAAW,CACzB,IAAMI,EAAMiB,EAAI,IAAI,SAAQ,EACtBa,EAAQ,KAAK,WAAW,IAAI9B,CAAG,GAIjC,CAAC8B,GAASA,EAAM,YAChB,KAAK,WAAW,IAAI9B,EAAK,CACrB,UAAW,GACX,QAAAH,EACA,OAAQiC,GAAO,OAClB,CAET,CACJ,CAYU,MAAM,cAAclC,EAA8BmC,EAA4BjC,EACpF2B,EAA8D,CAC9D,IAAMO,EAAWpC,EAAU,OAAOqB,GAAOA,EAAI,MAAQc,CAAW,EAChE,QAAWhC,KAAYiC,EACnB,MAAMd,GAAkBpB,CAAW,EACnC,MAAM2B,EAAS1B,CAAQ,EACvBA,EAAS,MAAQgC,EACjB,MAAM,KAAK,oBAAoBhC,EAAUgC,EAAajC,CAAW,EAMrE,IAAMmC,EAAkBrC,EAAU,OAAOqB,GAAOA,EAAI,QAAUc,CAAW,EACzE,MAAM,KAAK,iBAAiBE,EAAiBF,EAAajC,CAAW,EACrE,KAAK,aAAeiC,CACxB,CAEA,aAAaA,EAA4BN,EAA+B,CACpE,YAAK,oBAAoB,IAAIM,EAAaN,CAAQ,EAC3CC,GAAW,OAAO,IAAK,CAC1B,KAAK,oBAAoB,OAAOK,EAAaN,CAAQ,CACzD,CAAC,CACL,CAEA,gBAAgBM,EAA4BN,EAA+B,CACvE,YAAK,uBAAuB,IAAIM,EAAaN,CAAQ,EAC9CC,GAAW,OAAO,IAAK,CAC1B,KAAK,uBAAuB,OAAOK,EAAaN,CAAQ,CAC5D,CAAC,CACL,CAIA,UAAUK,EAAsBI,EAAsCpC,EAA+B,CACjG,IAAIkB,EAOJ,GANIkB,GAAc,SAAUA,EACxBlB,EAAMkB,EAENpC,EAAcoC,EAElBpC,IAAAA,EAAgB,oBAAkB,MAC9BkB,EAAK,CACL,IAAMjB,EAAW,KAAK,iBAAiB,YAAYiB,CAAG,EACtD,GAAIjB,GAAYA,EAAS,MAAQ+B,EAC7B,OAAO,QAAQ,QAAQd,CAAG,CAElC,CACA,OAAI,KAAK,cAAgBc,EACd,QAAQ,QAAQ,MAAS,EACzBhC,EAAY,wBACZ,QAAQ,OAAOqC,EAAkB,EAErC,IAAI,QAAQ,CAACC,EAASC,IAAU,CACnC,IAAMC,EAAkB,KAAK,aAAaR,EAAO,IAAK,CAGlD,GAFAQ,EAAgB,QAAO,EACvBC,EAAiB,QAAO,EACpBvB,EAAK,CACL,IAAMjB,EAAW,KAAK,iBAAiB,YAAYiB,CAAG,EACtDoB,EAAQrC,GAAU,GAAG,CACzB,MACIqC,EAAQ,MAAS,CAEzB,CAAC,EACKG,EAAmBzC,EAAa,wBAAwB,IAAK,CAC/DwC,EAAgB,QAAO,EACvBC,EAAiB,QAAO,EACxBF,EAAOF,EAAkB,CAC7B,CAAC,CACL,CAAC,CACL,CAEU,MAAM,oBAAoBpC,EAA2B+B,EAAsBhC,EAA8B,CAE/G,IAAM0C,EADY,KAAK,uBAAuB,IAAIV,CAAK,EACvB,MAAK,EACrC,QAAWV,KAAYoB,EACnB,GAAI,CACA,MAAMpB,EAASrB,EAAUD,CAAW,CACxC,OAAS2C,EAAK,CAGV,GAAI,CAACC,GAAqBD,CAAG,EACzB,MAAMA,CAEd,CAER,CAEU,MAAM,iBAAiB7C,EAA8BkC,EAAsBhC,EAA8B,CAC/G,GAAIF,EAAU,SAAW,EAErB,OAGJ,IAAM4C,EADY,KAAK,oBAAoB,IAAIV,CAAK,EACpB,MAAK,EACrC,QAAWV,KAAYoB,EACnB,MAAMtB,GAAkBpB,CAAW,EACnC,MAAMsB,EAASxB,EAAWE,CAAW,CAE7C,CAOU,eAAeC,EAAyB,CAC9C,MAAO,EAAQ,KAAK,gBAAgBA,CAAQ,EAAE,UAClD,CAMU,MAAM,SAASA,EAA2BD,EAA8B,SAC9E,IAAM6C,EAAY,KAAK,gBAAgB,YAAY5C,EAAS,GAAG,EAAE,WAAW,kBACtE6C,EAAoB,KAAK,gBAAgB7C,CAAQ,EAAE,WACnDF,EAAU,OAAO+C,GAAsB,SAAWA,EAAoB,OACtEC,EAAc,MAAMF,EAAU,iBAAiB5C,EAAUF,EAASC,CAAW,EAC/EC,EAAS,YACTA,EAAS,YAAY,KAAK,GAAG8C,CAAW,EAExC9C,EAAS,YAAc8C,EAI3B,IAAMf,EAAQ,KAAK,WAAW,IAAI/B,EAAS,IAAI,SAAQ,CAAE,EACzD,GAAI+B,EAAO,EACP3B,EAAA2B,EAAM,UAAM,MAAA3B,IAAA,SAAZ2B,EAAM,OAAW,CAAA,GACjB,IAAMgB,GAAgBzC,EAAAR,GAAS,cAAU,MAAAQ,IAAA,OAAAA,EAAIC,GAAmB,IAC5DwB,EAAM,OAAO,iBACbA,EAAM,OAAO,iBAAiB,KAAK,GAAGgB,CAAa,EAEnDhB,EAAM,OAAO,iBAAmB,CAAC,GAAGgB,CAAa,CAEzD,CACJ,CAEU,gBAAgB/C,EAAyB,SAC/C,OAAOM,GAAAF,EAAA,KAAK,WAAW,IAAIJ,EAAS,IAAI,SAAQ,CAAE,KAAC,MAAAI,IAAA,OAAA,OAAAA,EAAE,WAAO,MAAAE,IAAA,OAAAA,EAAI,CAAA,CACpE,GCrbE,IAAO0C,GAAP,KAA0B,CAnFhC,MAmFgC,CAAAC,EAAA,4BAuB5B,YAAYC,EAAmC,CAb5B,KAAA,YAAc,IAAI,IAKlB,KAAA,kBAAoB,IAAIC,GAMxB,KAAA,eAAiB,IAAI,IAGpC,KAAK,UAAYD,EAAS,UAAU,iBACpC,KAAK,gBAAkBA,EAAS,gBAChC,KAAK,cAAgBA,EAAS,aAClC,CAEA,kBAAkBE,EAAqBC,EAAmB,CACtD,IAAMC,EAAeC,GAAYH,CAAU,EAAE,IACvCI,EAAiC,CAAA,EACvC,YAAK,eAAe,QAAQC,GAAU,CAClCA,EAAQ,QAAQC,GAAW,CACnBC,GAAS,OAAOD,EAAS,UAAWJ,CAAY,GAAKI,EAAS,aAAeL,GAC7EG,EAAO,KAAKE,CAAQ,CAE5B,CAAC,CACL,CAAC,EACME,EAAOJ,CAAM,CACxB,CAEA,YAAYK,EAAmBC,EAAkB,CAC7C,IAAIC,EAAeH,EAAO,KAAK,YAAY,KAAI,CAAE,EACjD,OAAIE,IACAC,EAAeA,EAAa,OAAOC,GAAO,CAACF,GAAQA,EAAK,IAAIE,CAAG,CAAC,GAE7DD,EACF,IAAIC,GAAO,KAAK,oBAAoBA,EAAKH,CAAQ,CAAC,EAClD,KAAI,CACb,CAEU,oBAAoBG,EAAaH,EAAiB,OACxD,OAAKA,EAGgB,KAAK,kBAAkB,IAAIG,EAAKH,EAAU,IAAK,OAEhE,QAD4BI,EAAA,KAAK,YAAY,IAAID,CAAG,KAAC,MAAAC,IAAA,OAAAA,EAAI,CAAA,GAC9B,OAAOC,GAAK,KAAK,cAAc,UAAUA,EAAE,KAAML,CAAQ,CAAC,CACzF,CAAC,GALUI,EAAA,KAAK,YAAY,IAAID,CAAG,KAAC,MAAAC,IAAA,OAAAA,EAAI,CAAA,CAO5C,CAEA,OAAOD,EAAQ,CACX,IAAMG,EAAYH,EAAI,SAAQ,EAC9B,KAAK,YAAY,OAAOG,CAAS,EACjC,KAAK,kBAAkB,MAAMA,CAAS,EACtC,KAAK,eAAe,OAAOA,CAAS,CACxC,CAEA,MAAM,cAAcC,EAA2BC,EAAc,oBAAkB,KAAI,CAE/E,IAAMC,EAAU,MADC,KAAK,gBAAgB,YAAYF,EAAS,GAAG,EAC/B,WAAW,iBAAiB,eAAeA,EAAUC,CAAW,EACzFL,EAAMI,EAAS,IAAI,SAAQ,EACjC,KAAK,YAAY,IAAIJ,EAAKM,CAAO,EACjC,KAAK,kBAAkB,MAAMN,CAAG,CACpC,CAEA,MAAM,iBAAiBI,EAA2BC,EAAc,oBAAkB,KAAI,CAElF,IAAME,EAAY,MADD,KAAK,gBAAgB,YAAYH,EAAS,GAAG,EAC7B,UAAU,6BAA6B,mBAAmBA,EAAUC,CAAW,EAChH,KAAK,eAAe,IAAID,EAAS,IAAI,SAAQ,EAAIG,CAAS,CAC9D,CAEA,WAAWH,EAA2BI,EAAwB,CAC1D,IAAMC,EAAa,KAAK,eAAe,IAAIL,EAAS,IAAI,SAAQ,CAAE,EAClE,OAAKK,EAGEA,EAAW,KAAKC,GAAO,CAACA,EAAI,OAASF,EAAY,IAAIE,EAAI,UAAU,SAAQ,CAAE,CAAC,EAF1E,EAGf,GCxGE,IAAOC,GAAP,KAA8B,CArEpC,MAqEoC,CAAAC,EAAA,gCAYhC,YAAYC,EAAmC,CAV/C,KAAA,oBAAoC,CAAA,EAOjB,KAAA,OAAS,IAAIC,GAI5B,KAAK,gBAAkBD,EAAS,gBAChC,KAAK,iBAAmBA,EAAS,UAAU,iBAC3C,KAAK,gBAAkBA,EAAS,UAAU,gBAC1C,KAAK,mBAAqBA,EAAS,UAAU,mBAC7C,KAAK,MAAQA,EAAS,UAAU,aACpC,CAEA,IAAI,OAAK,CACL,OAAO,KAAK,OAAO,OACvB,CAEA,IAAI,kBAAgB,CAChB,OAAO,KAAK,OAChB,CAEA,WAAWE,EAAwB,OAC/B,KAAK,SAAUC,EAAAD,EAAO,oBAAgB,MAAAC,IAAA,OAAAA,EAAI,MAC9C,CAEA,YAAYC,EAA0B,CAGlC,OAAO,KAAK,MAAM,MAAMC,GAAQ,CAAA,IAAAF,EAAC,OAAA,KAAK,qBAAoBA,EAAA,KAAK,WAAO,MAAAA,IAAA,OAAAA,EAAI,CAAA,EAAIE,CAAK,CAAC,CAAA,CACxF,CAEA,MAAM,oBAAoBC,EAA4BC,EAAc,oBAAkB,KAAI,CACtF,IAAMC,EAAY,MAAM,KAAK,eAAeF,CAAO,EAGnD,MAAMG,GAAkBF,CAAW,EACnC,MAAM,KAAK,gBAAgB,MAAMC,EAAW,KAAK,oBAAqBD,CAAW,CACrF,CAMU,MAAM,eAAeD,EAA0B,CACrD,IAAMI,EAAiB,KAAK,gBAAgB,IAAI,QAAQC,GAAKA,EAAE,iBAAiB,cAAc,EACxFH,EAA+B,CAAA,EAC/BI,EAAYb,EAACc,GAA6B,CAC5CL,EAAU,KAAKK,CAAQ,EAClB,KAAK,iBAAiB,YAAYA,EAAS,GAAG,GAC/C,KAAK,iBAAiB,YAAYA,CAAQ,CAElD,EALkB,aASlB,aAAM,KAAK,wBAAwBP,EAASM,CAAS,EACrD,MAAM,QAAQ,IACVN,EAAQ,IAAIQ,GAAM,CAACA,EAAI,KAAK,cAAcA,CAAE,CAAC,CAA2B,EACnE,IAAI,MAAMC,GAAS,KAAK,eAAe,GAAGA,EAAOL,EAAgBE,CAAS,CAAC,CAAC,EAErF,KAAK,OAAO,QAAO,EACZJ,CACX,CAOU,wBAAwBQ,EAA6BC,EAA+C,CAC1G,OAAO,QAAQ,QAAO,CAC1B,CAOU,cAAcC,EAAgC,CACpD,OAAOC,GAAI,MAAMD,EAAgB,GAAG,CACxC,CAMU,MAAM,eAAeA,EAAkCE,EAAiBV,EAA0BE,EAA8C,CACtJ,IAAMS,EAAU,MAAM,KAAK,mBAAmB,cAAcD,CAAU,EACtE,MAAM,QAAQ,IAAIC,EAAQ,IAAI,MAAMN,GAAQ,CACxC,GAAI,KAAK,aAAaG,EAAiBH,EAAOL,CAAc,GACxD,GAAIK,EAAM,YACN,MAAM,KAAK,eAAeG,EAAiBH,EAAM,IAAKL,EAAgBE,CAAS,UACxEG,EAAM,OAAQ,CACrB,IAAMF,EAAW,MAAM,KAAK,iBAAiB,oBAAoBE,EAAM,GAAG,EAC1EH,EAAUC,CAAQ,CACtB,EAER,CAAC,CAAC,CACN,CAKU,aAAaS,EAAmCP,EAAuBL,EAAwB,CACrG,IAAMa,EAAOC,GAAS,SAAST,EAAM,GAAG,EACxC,GAAIQ,EAAK,WAAW,GAAG,EACnB,MAAO,GAEX,GAAIR,EAAM,YACN,OAAOQ,IAAS,gBAAkBA,IAAS,MACxC,GAAIR,EAAM,OAAQ,CACrB,IAAMU,EAAUD,GAAS,QAAQT,EAAM,GAAG,EAC1C,OAAOL,EAAe,SAASe,CAAO,CAC1C,CACA,MAAO,EACX,GCpLE,IAAOC,GAAP,KAAuC,CAX7C,MAW6C,CAAAC,EAAA,yCAEzC,iCAAiCC,EAAkBC,EAAqBC,EAAgBC,EAAeC,EAAe,CAClH,OAAOC,GAA0B,iCAAiCL,EAAUC,EAAaC,EAAQC,EAAMC,CAAM,CACjH,CAEA,iCAAiCE,EAAa,CAC1C,OAAOD,GAA0B,iCAAiCC,CAAK,CAC3E,GAyBSC,GAA4C,CAAE,KAAM,MAAM,EAO1DC,GAAP,KAAmB,CAnDzB,MAmDyB,CAAAT,EAAA,qBAOrB,YAAYU,EAA6B,CACrC,KAAK,qBAAuBA,EAAS,OAAO,0BAC5C,KAAK,aAAeA,EAAS,OAAO,aACpC,IAAMC,EAAS,KAAK,aAAa,YAAYD,EAAS,QAAS,CAC3D,gBAAiBA,EAAS,iBAAiB,gBAC9C,EACD,KAAK,WAAa,KAAK,sBAAsBC,CAAM,EACnD,IAAMC,EAAcC,GAAsBF,CAAM,EAAI,OAAO,OAAOA,CAAM,EAAIA,EACtEG,EAAaJ,EAAS,iBAAiB,OAAS,aACtD,KAAK,gBAAkB,IAAIK,GAAgBH,EAAa,CACpD,iBAAkB,OAClB,gBAAiBE,EACjB,qBAAsB,KAAK,qBAC9B,CACL,CAEA,IAAI,YAAU,CACV,OAAO,KAAK,UAChB,CAEA,SAASE,EAAcC,EAA4BT,GAAwB,WACvE,IAAMU,EAAmB,KAAK,gBAAgB,SAASF,CAAI,EAC3D,MAAO,CACH,OAAQE,EAAiB,OACzB,OAAQA,EAAiB,OACzB,QAAQC,EAAAD,EAAiB,OAAO,UAAM,MAAAC,IAAA,OAAAA,EAAI,CAAA,EAC1C,QAAQC,GAAAC,EAAA,KAAK,cAAa,qBAAiB,MAAAD,IAAA,OAAA,OAAAA,EAAA,KAAAC,EAAGL,CAAI,EAE1D,CAEU,sBAAsBM,EAA4B,CACxD,GAAIT,GAAsBS,CAAW,EAAG,OAAOA,EAC/C,IAAMX,EAASY,GAA4BD,CAAW,EAAI,OAAO,OAAOA,EAAY,KAAK,EAAE,KAAI,EAAKA,EAC9FE,EAA2B,CAAA,EACjC,OAAAb,EAAO,QAAQJ,GAASiB,EAAIjB,EAAM,IAAI,EAAIA,CAAK,EACxCiB,CACX,GAME,SAAUC,GAAiBC,EAAgC,CAC7D,OAAO,MAAM,QAAQA,CAAe,IAAMA,EAAgB,SAAW,GAAK,SAAUA,EAAgB,CAAC,EACzG,CAFgB1B,EAAAyB,GAAA,oBAOV,SAAUF,GAA4BG,EAAgC,CACxE,OAAOA,GAAmB,UAAWA,GAAmB,gBAAiBA,CAC7E,CAFgB1B,EAAAuB,GAAA,+BAOV,SAAUV,GAAsBa,EAAgC,CAClE,MAAO,CAACD,GAAiBC,CAAe,GAAK,CAACH,GAA4BG,CAAe,CAC7F,CAFgB1B,EAAAa,GAAA,yBCVV,SAAUc,GAAWC,EAAwBC,EAAsCC,EAA2B,CAChH,IAAIC,EACAC,EACA,OAAOJ,GAAS,UAChBI,EAAWH,EACXE,EAAOD,IAEPE,EAAWJ,EAAK,MAAM,MACtBG,EAAOF,GAENG,IACDA,EAAWC,EAAS,OAAO,EAAG,CAAC,GAGnC,IAAMC,EAAQC,GAASP,CAAI,EACrBQ,EAAoBC,GAAiBN,CAAI,EAEzCO,EAASC,GAAS,CACpB,MAAAL,EACA,SAAAF,EACA,QAASI,EACZ,EAED,OAAOI,GAAkB,CACrB,MAAO,EACP,OAAAF,EACA,SAAAN,EACH,CACL,CA5BgBS,EAAAd,GAAA,cA8BV,SAAUe,GAAQd,EAAwBE,EAA2B,CACvE,IAAMM,EAAoBC,GAAiBP,CAAO,EAC5CI,EAAQC,GAASP,CAAI,EAC3B,GAAIM,EAAM,SAAW,EACjB,MAAO,GAGX,IAAMS,EAAQT,EAAM,CAAC,EACfU,EAAOV,EAAMA,EAAM,OAAS,CAAC,EAC7BW,EAAaT,EAAkB,MAC/BU,EAAYV,EAAkB,IAEpC,MAAO,EAAQS,GAAY,KAAKF,CAAK,GAAM,EAAQG,GAAW,KAAKF,CAAI,CAC3E,CAbgBH,EAAAC,GAAA,WAehB,SAASP,GAASP,EAAsB,CACpC,IAAImB,EAAU,GACd,OAAI,OAAOnB,GAAS,SAChBmB,EAAUnB,EAEVmB,EAAUnB,EAAK,KAELmB,EAAQ,MAAMC,EAAc,CAE9C,CATSP,EAAAN,GAAA,YAmBT,IAAMc,GAAW,kCACXC,GAAiB,iDAEvB,SAASX,GAASY,EAA4B,WAC1C,IAAMb,EAAuB,CAAA,EACzBc,EAAcD,EAAQ,SAAS,KAC/BE,EAAmBF,EAAQ,SAAS,UACxC,QAASG,EAAI,EAAGA,EAAIH,EAAQ,MAAM,OAAQG,IAAK,CAC3C,IAAMX,EAAQW,IAAM,EACdV,EAAOU,IAAMH,EAAQ,MAAM,OAAS,EACtCI,EAAOJ,EAAQ,MAAMG,CAAC,EACtBE,EAAQ,EAEZ,GAAIb,GAASQ,EAAQ,QAAQ,MAAO,CAChC,IAAMM,GAAQC,EAAAP,EAAQ,QAAQ,SAAK,MAAAO,IAAA,OAAA,OAAAA,EAAE,KAAKH,CAAI,EAC1CE,IACAD,EAAQC,EAAM,MAAQA,EAAM,CAAC,EAAE,OAEvC,KAAO,CACH,IAAMA,GAAQE,EAAAR,EAAQ,QAAQ,QAAI,MAAAQ,IAAA,OAAA,OAAAA,EAAE,KAAKJ,CAAI,EACzCE,IACAD,EAAQC,EAAM,MAAQA,EAAM,CAAC,EAAE,OAEvC,CACA,GAAIb,EAAM,CACN,IAAMa,GAAQG,EAAAT,EAAQ,QAAQ,OAAG,MAAAS,IAAA,OAAA,OAAAA,EAAE,KAAKL,CAAI,EACxCE,IACAF,EAAOA,EAAK,UAAU,EAAGE,EAAM,KAAK,EAE5C,CAKA,GAHAF,EAAOA,EAAK,UAAU,EAAGM,GAAcN,CAAI,CAAC,EACtBO,GAAeP,EAAMC,CAAK,GAE3BD,EAAK,QAEtB,GAAIjB,EAAO,OAAS,EAAG,CACnB,IAAMN,EAAWC,EAAS,OAAOmB,EAAaC,CAAgB,EAC9Df,EAAO,KAAK,CACR,KAAM,QACN,QAAS,GACT,MAAOyB,EAAM,OAAO/B,EAAUA,CAAQ,EACzC,CACL,MACG,CACHiB,GAAS,UAAYO,EACrB,IAAMQ,EAAWf,GAAS,KAAKM,CAAI,EACnC,GAAIS,EAAU,CACV,IAAMC,EAAYD,EAAS,CAAC,EACtBE,EAAQF,EAAS,CAAC,EAClBnC,EAAQI,EAAS,OAAOmB,EAAaC,EAAmBG,CAAK,EAC7DW,EAAMlC,EAAS,OAAOmB,EAAaC,EAAmBG,EAAQS,EAAU,MAAM,EACpF3B,EAAO,KAAK,CACR,KAAM,MACN,QAAS4B,EACT,MAAOH,EAAM,OAAOlC,EAAOsC,CAAG,EACjC,EACDX,GAASS,EAAU,OACnBT,EAAQM,GAAeP,EAAMC,CAAK,CACtC,CAEA,GAAIA,EAAQD,EAAK,OAAQ,CACrB,IAAMa,EAAOb,EAAK,UAAUC,CAAK,EAC3Ba,EAAmB,MAAM,KAAKD,EAAK,SAASlB,EAAc,CAAC,EACjEZ,EAAO,KAAK,GAAGgC,GAAkBD,EAAkBD,EAAMhB,EAAaC,EAAmBG,CAAK,CAAC,CACnG,CACJ,CAEAJ,IACAC,EAAmB,CACvB,CAGA,OAAIf,EAAO,OAAS,GAAKA,EAAOA,EAAO,OAAS,CAAC,EAAE,OAAS,QACjDA,EAAO,MAAM,EAAG,EAAE,EAGtBA,CACX,CA3ESG,EAAAF,GAAA,YA6ET,SAAS+B,GAAkBC,EAA0BhB,EAAciB,EAAmBC,EAAsB,CACxG,IAAMnC,EAAuB,CAAA,EAE7B,GAAIiC,EAAK,SAAW,EAAG,CACnB,IAAM1C,EAAQI,EAAS,OAAOuC,EAAWC,CAAc,EACjDN,EAAMlC,EAAS,OAAOuC,EAAWC,EAAiBlB,EAAK,MAAM,EACnEjB,EAAO,KAAK,CACR,KAAM,OACN,QAASiB,EACT,MAAOQ,EAAM,OAAOlC,EAAOsC,CAAG,EACjC,CACL,KAAO,CACH,IAAIO,EAAY,EAChB,QAAWjB,KAASc,EAAM,CACtB,IAAMI,EAAalB,EAAM,MACnBmB,EAAerB,EAAK,UAAUmB,EAAWC,CAAU,EACrDC,EAAa,OAAS,GACtBtC,EAAO,KAAK,CACR,KAAM,OACN,QAASiB,EAAK,UAAUmB,EAAWC,CAAU,EAC7C,MAAOZ,EAAM,OACT9B,EAAS,OAAOuC,EAAWE,EAAYD,CAAc,EACrDxC,EAAS,OAAOuC,EAAWG,EAAaF,CAAc,CAAC,EAE9D,EAEL,IAAII,EAASD,EAAa,OAAS,EAC7BE,EAAUrB,EAAM,CAAC,EAUvB,GATAnB,EAAO,KAAK,CACR,KAAM,aACN,QAASwC,EACT,MAAOf,EAAM,OACT9B,EAAS,OAAOuC,EAAWE,EAAYG,EAASJ,CAAc,EAC9DxC,EAAS,OAAOuC,EAAWE,EAAYG,EAASC,EAAQ,OAASL,CAAc,CAAC,EAEvF,EACDI,GAAUC,EAAQ,OACdrB,EAAM,SAAW,EAAG,CACpBoB,GAAUpB,EAAM,CAAC,EAAE,OACnB,IAAMS,EAAQT,EAAM,CAAC,EACrBnB,EAAO,KAAK,CACR,KAAM,OACN,QAAS4B,EACT,MAAOH,EAAM,OACT9B,EAAS,OAAOuC,EAAWE,EAAYG,EAASJ,CAAc,EAC9DxC,EAAS,OAAOuC,EAAWE,EAAYG,EAASX,EAAM,OAASO,CAAc,CAAC,EAErF,CACL,MACInC,EAAO,KAAK,CACR,KAAM,OACN,QAAS,GACT,MAAOyB,EAAM,OACT9B,EAAS,OAAOuC,EAAWE,EAAYG,EAASJ,CAAc,EAC9DxC,EAAS,OAAOuC,EAAWE,EAAYG,EAASJ,CAAc,CAAC,EAEtE,EAELC,EAAYC,EAAalB,EAAM,CAAC,EAAE,MACtC,CACA,IAAMsB,EAAaxB,EAAK,UAAUmB,CAAS,EACvCK,EAAW,OAAS,GACpBzC,EAAO,KAAK,CACR,KAAM,OACN,QAASyC,EACT,MAAOhB,EAAM,OACT9B,EAAS,OAAOuC,EAAWE,EAAYD,CAAc,EACrDxC,EAAS,OAAOuC,EAAWE,EAAYD,EAAiBM,EAAW,MAAM,CAAC,EAEjF,CAET,CAEA,OAAOzC,CACX,CA1ESG,EAAA6B,GAAA,qBA4ET,IAAMU,GAAqB,KACrBC,GAAqB,OAE3B,SAASnB,GAAeP,EAAcC,EAAa,CAC/C,IAAMC,EAAQF,EAAK,UAAUC,CAAK,EAAE,MAAMwB,EAAkB,EAC5D,OAAIvB,EACOD,EAAQC,EAAM,MAEdF,EAAK,MAEpB,CAPSd,EAAAqB,GAAA,kBAST,SAASD,GAAcN,EAAY,CAC/B,IAAME,EAAQF,EAAK,MAAM0B,EAAkB,EAC3C,GAAIxB,GAAS,OAAOA,EAAM,OAAU,SAChC,OAAOA,EAAM,KAGrB,CANShB,EAAAoB,GAAA,iBAUT,SAASrB,GAAkBW,EAAqB,aAC5C,IAAM+B,EAA0BjD,EAAS,OAAOkB,EAAQ,SAAS,KAAMA,EAAQ,SAAS,SAAS,EACjG,GAAIA,EAAQ,OAAO,SAAW,EAC1B,OAAO,IAAIgC,GAAiB,CAAA,EAAIpB,EAAM,OAAOmB,EAAeA,CAAa,CAAC,EAE9E,IAAME,EAA2B,CAAA,EACjC,KAAOjC,EAAQ,MAAQA,EAAQ,OAAO,QAAQ,CAC1C,IAAMkC,EAAUC,GAAkBnC,EAASiC,EAASA,EAAS,OAAS,CAAC,CAAC,EACpEC,GACAD,EAAS,KAAKC,CAAO,CAE7B,CACA,IAAMxD,GAAQ8B,GAAAD,EAAA0B,EAAS,CAAC,KAAC,MAAA1B,IAAA,OAAA,OAAAA,EAAE,MAAM,SAAK,MAAAC,IAAA,OAAAA,EAAIuB,EACpCf,GAAMoB,GAAA3B,EAAAwB,EAASA,EAAS,OAAS,CAAC,KAAC,MAAAxB,IAAA,OAAA,OAAAA,EAAE,MAAM,OAAG,MAAA2B,IAAA,OAAAA,EAAIL,EACxD,OAAO,IAAIC,GAAiBC,EAAUrB,EAAM,OAAOlC,EAAOsC,CAAG,CAAC,CAClE,CAfS1B,EAAAD,GAAA,qBAiBT,SAAS8C,GAAkBnC,EAAuBP,EAAmB,CACjE,IAAM4C,EAAOrC,EAAQ,OAAOA,EAAQ,KAAK,EACzC,GAAIqC,EAAK,OAAS,MACd,OAAOC,GAActC,EAAS,EAAK,EAChC,GAAIqC,EAAK,OAAS,QAAUA,EAAK,OAAS,aAC7C,OAAOE,GAAevC,CAAO,EAE7BwC,GAAgBH,EAAM5C,CAAI,EAC1BO,EAAQ,OAGhB,CAXSV,EAAA6C,GAAA,qBAaT,SAASK,GAAgBC,EAAmBP,EAAsB,CAC9D,GAAIA,EAAS,CACT,IAAM9B,EAAO,IAAIsC,GAAc,GAAID,EAAM,KAAK,EAC1C,YAAaP,EACbA,EAAQ,QAAQ,KAAK9B,CAAI,EAEzB8B,EAAQ,QAAQ,QAAQ,KAAK9B,CAAI,CAEzC,CACJ,CATSd,EAAAkD,GAAA,mBAWT,SAASD,GAAevC,EAAqB,CACzC,IAAIyC,EAAQzC,EAAQ,OAAOA,EAAQ,KAAK,EAClC2C,EAAaF,EACfG,EAAYH,EACV1D,EAAuB,CAAA,EAC7B,KAAO0D,GAASA,EAAM,OAAS,SAAWA,EAAM,OAAS,OACrD1D,EAAM,KAAK8D,GAAiB7C,CAAO,CAAC,EACpC4C,EAAYH,EACZA,EAAQzC,EAAQ,OAAOA,EAAQ,KAAK,EAExC,OAAO,IAAI8C,GAAc/D,EAAO6B,EAAM,OAAO+B,EAAW,MAAM,MAAOC,EAAU,MAAM,GAAG,CAAC,CAC7F,CAXStD,EAAAiD,GAAA,kBAaT,SAASM,GAAiB7C,EAAqB,CAE3C,OADcA,EAAQ,OAAOA,EAAQ,KAAK,EAChC,OAAS,aACRsC,GAActC,EAAS,EAAI,EAE3B+C,GAAe/C,CAAO,CAErC,CAPSV,EAAAuD,GAAA,oBAST,SAASP,GAActC,EAAuBgD,EAAe,CACzD,IAAMC,EAAWjD,EAAQ,OAAOA,EAAQ,OAAO,EACzCkD,EAAOD,EAAS,QAAQ,UAAU,CAAC,EACnCE,EAAYnD,EAAQ,OAAOA,EAAQ,KAAK,EAC9C,GAAImD,GAAW,OAAS,OACpB,GAAIH,EAAQ,CACR,IAAMI,EAAUL,GAAe/C,CAAO,EACtC,OAAO,IAAIqD,GACPH,EACA,IAAIJ,GAAc,CAACM,CAAO,EAAGA,EAAQ,KAAK,EAC1CJ,EACApC,EAAM,OAAOqC,EAAS,MAAM,MAAOG,EAAQ,MAAM,GAAG,CAAC,CAE7D,KAAO,CACH,IAAME,EAAUf,GAAevC,CAAO,EACtC,OAAO,IAAIqD,GACPH,EACAI,EACAN,EACApC,EAAM,OAAOqC,EAAS,MAAM,MAAOK,EAAQ,MAAM,GAAG,CAAC,CAE7D,KACG,CACH,IAAMC,EAAQN,EAAS,MACvB,OAAO,IAAII,GAAaH,EAAM,IAAIJ,GAAc,CAAA,EAAIS,CAAK,EAAGP,EAAQO,CAAK,CAC7E,CACJ,CA1BSjE,EAAAgD,GAAA,iBA4BT,SAASS,GAAe/C,EAAqB,CACzC,IAAMyC,EAAQzC,EAAQ,OAAOA,EAAQ,OAAO,EAC5C,OAAO,IAAI0C,GAAcD,EAAM,QAASA,EAAM,KAAK,CACvD,CAHSnD,EAAAyD,GAAA,kBAuBT,SAAS7D,GAAiBP,EAA2B,CACjD,GAAI,CAACA,EACD,OAAOO,GAAiB,CACpB,MAAO,MACP,IAAK,KACL,KAAM,IACT,EAEL,GAAM,CAAE,MAAAR,EAAO,IAAAsC,EAAK,KAAAZ,CAAI,EAAKzB,EAC7B,MAAO,CACH,MAAO6E,GAAgB9E,EAAO,EAAI,EAClC,IAAK8E,GAAgBxC,EAAK,EAAK,EAC/B,KAAMwC,GAAgBpD,EAAM,EAAI,EAExC,CAdSd,EAAAJ,GAAA,oBAgBT,SAASsE,GAAgBC,EAAqC/E,EAAc,CACxE,GAAI,OAAO+E,GAAW,UAAY,OAAOA,GAAW,SAAU,CAC1D,IAAMC,EAAU,OAAOD,GAAW,SAAWE,GAAaF,CAAM,EAAIA,EAAO,OAC3E,OAAI/E,EACO,IAAI,OAAO,QAAQgF,CAAO,EAAE,EAE5B,IAAI,OAAO,OAAOA,CAAO,OAAO,CAE/C,KACI,QAAOD,CAEf,CAXSnE,EAAAkE,GAAA,mBAaT,IAAMxB,GAAN,KAAsB,CAzetB,MAyesB,CAAA1C,EAAA,yBAKlB,YAAY2C,EAA0BsB,EAAY,CAC9C,KAAK,SAAWtB,EAChB,KAAK,MAAQsB,CACjB,CAEA,OAAOL,EAAY,CACf,OAAO,KAAK,WAAU,EAAG,KAAKU,GAAKA,EAAE,OAASV,CAAI,CACtD,CAEA,QAAQA,EAAY,CAChB,OAAO,KAAK,WAAU,EAAG,OAAOU,GAAKA,EAAE,OAASV,CAAI,CACxD,CAEQ,YAAU,CACd,OAAO,KAAK,SAAS,OAAQ,GAAqB,SAAU,CAAC,CACjE,CAEA,UAAQ,CACJ,IAAInC,EAAQ,GACZ,QAAWmB,KAAW,KAAK,SACvB,GAAInB,EAAM,SAAW,EACjBA,EAAQmB,EAAQ,SAAQ,MACrB,CACH,IAAM2B,EAAO3B,EAAQ,SAAQ,EAC7BnB,GAAS+C,GAAa/C,CAAK,EAAI8C,CACnC,CAEJ,OAAO9C,EAAM,KAAI,CACrB,CAEA,WAAWpC,EAA4B,CACnC,IAAIoC,EAAQ,GACZ,QAAWmB,KAAW,KAAK,SACvB,GAAInB,EAAM,SAAW,EACjBA,EAAQmB,EAAQ,WAAWvD,CAAO,MAC/B,CACH,IAAMkF,EAAO3B,EAAQ,WAAWvD,CAAO,EACvCoC,GAAS+C,GAAa/C,CAAK,EAAI8C,CACnC,CAEJ,OAAO9C,EAAM,KAAI,CACrB,GAGEsC,GAAN,KAAkB,CA1hBlB,MA0hBkB,CAAA/D,EAAA,qBAMd,YAAY4D,EAActD,EAAyBoD,EAAiBO,EAAY,CAC5E,KAAK,KAAOL,EACZ,KAAK,QAAUtD,EACf,KAAK,OAASoD,EACd,KAAK,MAAQO,CACjB,CAEA,UAAQ,CACJ,IAAIM,EAAO,IAAI,KAAK,IAAI,GAClBjE,EAAU,KAAK,QAAQ,SAAQ,EAMrC,OALI,KAAK,QAAQ,QAAQ,SAAW,EAChCiE,EAAO,GAAGA,CAAI,IAAIjE,CAAO,GAClB,KAAK,QAAQ,QAAQ,OAAS,IACrCiE,EAAO,GAAGA,CAAI;EAAKjE,CAAO,IAE1B,KAAK,OAEE,IAAIiE,CAAI,IAERA,CAEf,CAEA,WAAWlF,EAA4B,SACnC,OAAO6B,GAAAD,EAAA5B,GAAS,aAAS,MAAA4B,IAAA,OAAA,OAAAA,EAAA,KAAA5B,EAAG,IAAI,KAAC,MAAA6B,IAAA,OAAAA,EAAI,KAAK,kBAAkB7B,CAAO,CACvE,CAEQ,kBAAkBA,EAA4B,CAClD,IAAMiB,EAAU,KAAK,QAAQ,WAAWjB,CAAO,EAC/C,GAAI,KAAK,OAAQ,CACb,IAAMoF,EAAWC,GAAgB,KAAK,KAAMpE,EAASjB,GAAW,CAAA,CAAE,EAClE,GAAI,OAAOoF,GAAa,SACpB,OAAOA,CAEf,CACA,IAAIE,EAAS,GACTtF,GAAS,MAAQ,UAAYA,GAAS,MAAQ,OAC9CsF,EAAS,IACFtF,GAAS,MAAQ,OACxBsF,EAAS,KACFtF,GAAS,MAAQ,gBACxBsF,EAAS,OAEb,IAAIJ,EAAO,GAAGI,CAAM,IAAI,KAAK,IAAI,GAAGA,CAAM,GAM1C,OALI,KAAK,QAAQ,QAAQ,SAAW,EAChCJ,EAAO,GAAGA,CAAI,WAAMjE,CAAO,GACpB,KAAK,QAAQ,QAAQ,OAAS,IACrCiE,EAAO,GAAGA,CAAI;EAAKjE,CAAO,IAE1B,KAAK,OAEE,IAAIiE,CAAI,IAERA,CAEf,GAGJ,SAASG,GAAgBE,EAAatE,EAAiBjB,EAA2B,SAC9E,GAAIuF,IAAQ,aAAeA,IAAQ,YAAcA,IAAQ,OAAQ,CAC7D,IAAM7D,EAAQT,EAAQ,QAAQ,GAAG,EAC7BuE,EAAUvE,EACd,GAAIS,EAAQ,EAAG,CACX,IAAM+D,EAAezD,GAAef,EAASS,CAAK,EAClD8D,EAAUvE,EAAQ,UAAUwE,CAAY,EACxCxE,EAAUA,EAAQ,UAAU,EAAGS,CAAK,CACxC,CACA,OAAI6D,IAAQ,YAAeA,IAAQ,QAAUvF,EAAQ,OAAS,UAE1DwF,EAAU,KAAKA,CAAO,OAEL3D,GAAAD,EAAA5B,EAAQ,cAAU,MAAA4B,IAAA,OAAA,OAAAA,EAAA,KAAA5B,EAAGiB,EAASuE,CAAO,KAAC,MAAA3D,IAAA,OAAAA,EAAI6D,GAAkBzE,EAASuE,CAAO,CAErG,CAEJ,CAjBS7E,EAAA0E,GAAA,mBAmBT,SAASK,GAAkBzE,EAAiBuE,EAAe,CACvD,GAAI,CACA,OAAAG,GAAI,MAAM1E,EAAS,EAAI,EAChB,IAAIuE,CAAO,KAAKvE,CAAO,GAClC,MAAQ,CACJ,OAAOA,CACX,CACJ,CAPSN,EAAA+E,GAAA,qBAST,IAAMvB,GAAN,KAAmB,CAtnBnB,MAsnBmB,CAAAxD,EAAA,sBAIf,YAAYP,EAAsBwE,EAAY,CAC1C,KAAK,QAAUxE,EACf,KAAK,MAAQwE,CACjB,CAEA,UAAQ,CACJ,IAAIM,EAAO,GACX,QAAS1D,EAAI,EAAGA,EAAI,KAAK,QAAQ,OAAQA,IAAK,CAC1C,IAAM6C,EAAS,KAAK,QAAQ7C,CAAC,EACvBkC,EAAO,KAAK,QAAQlC,EAAI,CAAC,EAC/B0D,GAAQb,EAAO,SAAQ,EACnBX,GAAQA,EAAK,MAAM,MAAM,KAAOW,EAAO,MAAM,MAAM,OACnDa,GAAQ;EAEhB,CACA,OAAOA,CACX,CAEA,WAAWlF,EAA4B,CACnC,IAAIkF,EAAO,GACX,QAAS1D,EAAI,EAAGA,EAAI,KAAK,QAAQ,OAAQA,IAAK,CAC1C,IAAM6C,EAAS,KAAK,QAAQ7C,CAAC,EACvBkC,EAAO,KAAK,QAAQlC,EAAI,CAAC,EAC/B0D,GAAQb,EAAO,WAAWrE,CAAO,EAC7B0D,GAAQA,EAAK,MAAM,MAAM,KAAOW,EAAO,MAAM,MAAM,OACnDa,GAAQ;EAEhB,CACA,OAAOA,CACX,GAGEnB,GAAN,KAAmB,CA1pBnB,MA0pBmB,CAAApD,EAAA,sBAIf,YAAYuE,EAAcN,EAAY,CAClC,KAAK,KAAOM,EACZ,KAAK,MAAQN,CACjB,CAEA,UAAQ,CACJ,OAAO,KAAK,IAChB,CACA,YAAU,CACN,OAAO,KAAK,IAChB,GAIJ,SAASO,GAAaD,EAAY,CAC9B,OAAIA,EAAK,SAAS;CAAI,EACX;EAEA;;CAEf,CANSvE,EAAAwE,GAAA,gBClpBH,IAAOS,GAAP,KAAiC,CA1BvC,MA0BuC,CAAAC,EAAA,mCAKnC,YAAYC,EAA6B,CACrC,KAAK,aAAeA,EAAS,OAAO,UAAU,aAC9C,KAAK,gBAAkBA,EAAS,cAAc,eAClD,CAEA,iBAAiBC,EAAa,CAC1B,IAAMC,EAAU,KAAK,gBAAgB,WAAWD,CAAI,EACpD,GAAIC,GAAWC,GAAQD,CAAO,EAE1B,OADoBE,GAAWF,CAAO,EACnB,WAAW,CAC1B,WAAYH,EAAA,CAACM,EAAMC,IACR,KAAK,0BAA0BL,EAAMI,EAAMC,CAAO,EADjD,cAGZ,UAAWP,EAACQ,GACD,KAAK,yBAAyBN,EAAMM,CAAG,EADvC,aAGd,CAGT,CAEU,0BAA0BN,EAAeO,EAAcF,EAAe,OAC5E,IAAMG,GAAcC,EAAA,KAAK,4BAA4BT,EAAMO,CAAI,KAAC,MAAAE,IAAA,OAAAA,EAAI,KAAK,sBAAsBT,EAAMO,CAAI,EACzG,GAAIC,GAAeA,EAAY,YAAa,CACxC,IAAME,EAAOF,EAAY,YAAY,MAAM,MAAM,KAAO,EAClDG,EAAYH,EAAY,YAAY,MAAM,MAAM,UAAY,EAC5DI,EAAMJ,EAAY,YAAY,KAAK,CAAE,SAAU,IAAIE,CAAI,IAAIC,CAAS,EAAE,CAAE,EAC9E,MAAO,IAAIN,CAAO,KAAKO,EAAI,SAAQ,CAAE,GACzC,KACI,OAER,CAEU,yBAAyBC,EAAgBC,EAAc,CAGjE,CAEU,4BAA4Bd,EAAeO,EAAY,CAE7D,IAAMQ,EADWC,GAAYhB,CAAI,EACJ,kBAC7B,GAAI,CAACe,EACD,OAEJ,IAAIE,EAAmCjB,EACvC,EAAG,CAEC,IAAMQ,EADkBO,EAAY,IAAIE,CAAW,EACf,KAAKC,GAAKA,EAAE,OAASX,CAAI,EAC7D,GAAIC,EACA,OAAOA,EAEXS,EAAcA,EAAY,UAC9B,OAASA,EAGb,CAEU,sBAAsBjB,EAAeO,EAAY,CAEvD,OADoB,KAAK,aAAa,YAAW,EAAG,KAAKW,GAAKA,EAAE,OAASX,CAAI,CAEjF,GCnEE,IAAOY,GAAP,KAA6B,CAxBnC,MAwBmC,CAAAC,EAAA,+BAE/B,YAAYC,EAA6B,CACrC,KAAK,cAAgB,IAAMA,EAAS,OAAO,aAC/C,CACA,WAAWC,EAAa,OACpB,OAAGC,GAAqBD,CAAI,EACjBA,EAAK,UAETE,EAAAC,GAAgBH,EAAK,SAAU,KAAK,cAAa,EAAG,qBAAqB,KAAC,MAAAE,IAAA,OAAA,OAAAA,EAAE,IACvF,GCOE,IAAOE,GAAP,KAAyB,CAzC/B,MAyC+B,CAAAC,EAAA,2BAI3B,YAAYC,EAA6B,CACrC,KAAK,WAAaA,EAAS,OAAO,aACtC,CAEA,MAAyBC,EAAcC,EAA+B,CAClE,OAAO,QAAQ,QAAQ,KAAK,WAAW,MAASD,CAAI,CAAC,CACzD,GAGkBE,GAAhB,KAA2C,CAtDjD,MAsDiD,CAAAJ,EAAA,oCAiB7C,YAAYC,EAA6B,CAX/B,KAAA,YAAc,EAKd,KAAA,iBAAmB,IACnB,KAAA,WAA6B,CAAA,EAC7B,KAAA,MAAuC,CAAA,EAK7C,KAAK,SAAWA,EAAS,WAAW,QACxC,CAEU,mBAAiB,CACvB,KAAO,KAAK,WAAW,OAAS,KAAK,aAAa,CAC9C,IAAMI,EAAS,KAAK,aAAY,EAChCA,EAAO,QAAQ,IAAK,CAChB,GAAI,KAAK,MAAM,OAAS,EAAG,CACvB,IAAMC,EAAW,KAAK,MAAM,MAAK,EAC7BA,IACAD,EAAO,KAAI,EACXC,EAAS,QAAQD,CAAM,EAE/B,CACJ,CAAC,EACD,KAAK,WAAW,KAAKA,CAAM,CAC/B,CACJ,CAEA,MAAM,MAAyBH,EAAcK,EAA8B,CACvE,IAAMF,EAAS,MAAM,KAAK,oBAAoBE,CAAW,EACnDD,EAAW,IAAIE,GACjBC,EAIEC,EAAeH,EAAY,wBAAwB,IAAK,CAC1DE,EAAU,WAAW,IAAK,CACtB,KAAK,gBAAgBJ,CAAM,CAC/B,EAAG,KAAK,gBAAgB,CAC5B,CAAC,EACD,OAAAA,EAAO,MAAMH,CAAI,EAAE,KAAKS,GAAS,CAC7B,IAAMC,EAAW,KAAK,SAAS,QAAWD,CAAM,EAChDL,EAAS,QAAQM,CAAQ,CAC7B,CAAC,EAAE,MAAMC,GAAM,CACXP,EAAS,OAAOO,CAAG,CACvB,CAAC,EAAE,QAAQ,IAAK,CACZH,EAAa,QAAO,EACpB,aAAaD,CAAO,CACxB,CAAC,EACMH,EAAS,OACpB,CAEU,gBAAgBD,EAAoB,CAC1CA,EAAO,UAAS,EAChB,IAAMS,EAAQ,KAAK,WAAW,QAAQT,CAAM,EACxCS,GAAS,GACT,KAAK,WAAW,OAAOA,EAAO,CAAC,CAEvC,CAEU,MAAM,oBAAoBP,EAA8B,CAC9D,KAAK,kBAAiB,EACtB,QAAWF,KAAU,KAAK,WACtB,GAAIA,EAAO,MACP,OAAAA,EAAO,KAAI,EACJA,EAGf,IAAMC,EAAW,IAAIE,GACrB,OAAAD,EAAY,wBAAwB,IAAK,CACrC,IAAMO,EAAQ,KAAK,MAAM,QAAQR,CAAQ,EACrCQ,GAAS,GACT,KAAK,MAAM,OAAOA,EAAO,CAAC,EAE9BR,EAAS,OAAOS,EAAkB,CACtC,CAAC,EACD,KAAK,MAAM,KAAKT,CAAQ,EACjBA,EAAS,OACpB,GAQSU,GAAP,KAAmB,CArJzB,MAqJyB,CAAAhB,EAAA,qBAUrB,IAAI,OAAK,CACL,OAAO,KAAK,MAChB,CAEA,IAAI,SAAO,CACP,OAAO,KAAK,eAAe,KAC/B,CAEA,YAAYiB,EAAgCC,EAAkCC,EAAgCC,EAAqB,CAdhH,KAAA,eAAiB,IAAI,WAE9B,KAAA,SAAW,IAAIZ,GACf,KAAA,OAAS,GACT,KAAA,SAAW,GAWjB,KAAK,YAAcS,EACnB,KAAK,WAAaG,EAClBF,EAAUP,GAAS,CACf,IAAMU,EAAcV,EACpB,KAAK,SAAS,QAAQU,CAAW,EACjC,KAAK,OAAM,CACf,CAAC,EACDF,EAAQG,GAAQ,CACZ,KAAK,SAAS,OAAOA,CAAK,EAC1B,KAAK,OAAM,CACf,CAAC,CACL,CAEA,WAAS,CACL,KAAK,SAAS,OAAOP,EAAkB,EACvC,KAAK,WAAU,CACnB,CAEA,MAAI,CACA,KAAK,OAAS,EAClB,CAEA,QAAM,CACF,KAAK,SAAW,GAChB,KAAK,OAAS,GACd,KAAK,eAAe,KAAI,CAC5B,CAEA,MAAMb,EAAY,CACd,GAAI,KAAK,SACL,MAAM,IAAI,MAAM,uBAAuB,EAE3C,YAAK,SAAW,GAChB,KAAK,SAAW,IAAIM,GACpB,KAAK,YAAYN,CAAI,EACd,KAAK,SAAS,OACzB,GC7JE,IAAOqB,GAAP,KAA2B,CA/CjC,MA+CiC,CAAAC,EAAA,6BAAjC,aAAA,CAEY,KAAA,oBAAuD,IAAI,0BAC3D,KAAA,WAA0B,CAAA,EAC1B,KAAA,UAAyB,CAAA,EACzB,KAAA,KAAO,EA6DnB,CA3DI,MAAMC,EAAwD,CAC1D,KAAK,YAAW,EAChB,IAAMC,EAAcC,GAAwB,EAC5C,YAAK,oBAAsBD,EACpB,KAAK,QAAQ,KAAK,WAAYD,EAAQC,EAAY,KAAK,CAClE,CAEA,KAAQD,EAA6B,CACjC,OAAO,KAAK,QAAQ,KAAK,UAAWA,CAAM,CAC9C,CAEQ,QAAkBG,EAAoBH,EAAuBI,EAAoB,oBAAkB,KAAI,CAC3G,IAAMC,EAAW,IAAIC,GACfC,EAAmB,CACrB,OAAAP,EACA,SAAAK,EACA,kBAAAD,GAEJ,OAAAD,EAAM,KAAKI,CAAK,EAChB,KAAK,qBAAoB,EAClBF,EAAS,OACpB,CAEQ,MAAM,sBAAoB,CAC9B,GAAI,CAAC,KAAK,KACN,OAEJ,IAAMG,EAAuB,CAAA,EAC7B,GAAI,KAAK,WAAW,OAAS,EAEzBA,EAAQ,KAAK,KAAK,WAAW,MAAK,CAAG,UAC9B,KAAK,UAAU,OAAS,EAE/BA,EAAQ,KAAK,GAAG,KAAK,UAAU,OAAO,EAAG,KAAK,UAAU,MAAM,CAAC,MAE/D,QAEJ,KAAK,KAAO,GACZ,MAAM,QAAQ,IAAIA,EAAQ,IAAI,MAAO,CAAE,OAAAR,EAAQ,SAAAK,EAAU,kBAAAD,CAAiB,IAAM,CAC5E,GAAI,CAEA,IAAMK,EAAS,MAAM,QAAQ,QAAO,EAAG,KAAK,IAAMT,EAAOI,CAAiB,CAAC,EAC3EC,EAAS,QAAQI,CAAM,CAC3B,OAASC,EAAK,CACNC,GAAqBD,CAAG,EAExBL,EAAS,QAAQ,MAAS,EAE1BA,EAAS,OAAOK,CAAG,CAE3B,CACJ,CAAC,CAAC,EACF,KAAK,KAAO,GACZ,KAAK,qBAAoB,CAC7B,CAEA,aAAW,CACP,KAAK,oBAAoB,OAAM,CACnC,GCjEE,IAAOE,GAAP,KAAsB,CA/C5B,MA+C4B,CAAAC,EAAA,wBASxB,YAAYC,EAA6B,CAHtB,KAAA,oBAAsB,IAAIC,GAC1B,KAAA,eAAiB,IAAIA,GAGpC,KAAK,QAAUD,EAAS,QACxB,KAAK,MAAQA,EAAS,OAAO,MAC7B,KAAK,OAASA,EAAS,WAAW,MACtC,CAEA,UAAUE,EAA4B,CAClC,MAAO,CACH,YAAaA,EAAO,YACpB,YAAaA,EAAO,YAAc,KAAK,qBAAqBA,EAAO,WAAW,EAAI,OAGlF,aAAcA,EAAO,aAAa,IAAIC,GAAK,OAAA,OAAA,OAAA,OAAA,CAAA,EAAMA,CAAC,EAAA,CAAE,QAASA,EAAE,OAAO,CAAA,CAAG,EACzE,MAAO,KAAK,iBAAiBD,EAAO,MAAO,KAAK,wBAAwBA,EAAO,KAAK,CAAC,EAE7F,CAEU,qBAAqBE,EAAyB,CAEpD,OAAOA,CACX,CAEU,wBAAwBC,EAAa,CAC3C,IAAMC,EAAW,IAAI,IACfC,EAAW,IAAI,IACrB,QAAWC,KAAWC,GAAUJ,CAAI,EAChCC,EAAS,IAAIE,EAAS,CAAA,CAAE,EAE5B,GAAIH,EAAK,SACL,QAAWK,KAAWC,GAAUN,EAAK,QAAQ,EACzCE,EAAS,IAAIG,EAAS,CAAA,CAAE,EAGhC,MAAO,CACH,SAAAJ,EACA,SAAAC,EAER,CAEU,iBAAiBF,EAAeO,EAAyB,CAC/D,IAAMC,EAAMD,EAAQ,SAAS,IAAIP,CAAI,EACrCQ,EAAI,MAAQR,EAAK,MACjBQ,EAAI,gBAAkBR,EAAK,gBAC3BQ,EAAI,mBAAqBR,EAAK,mBAC1BA,EAAK,WAAa,SAClBQ,EAAI,SAAW,KAAK,iBAAiBR,EAAK,SAAUO,CAAO,GAE/D,OAAW,CAACE,EAAMC,CAAK,IAAK,OAAO,QAAQV,CAAI,EAC3C,GAAI,CAAAS,EAAK,WAAW,GAAG,EAGvB,GAAI,MAAM,QAAQC,CAAK,EAAG,CACtB,IAAMC,EAAa,CAAA,EACnBH,EAAIC,CAAI,EAAIE,EACZ,QAAWC,KAAQF,EACXG,GAAUD,CAAI,EACdD,EAAI,KAAK,KAAK,iBAAiBC,EAAML,CAAO,CAAC,EACtCO,GAAYF,CAAI,EACvBD,EAAI,KAAK,KAAK,mBAAmBC,EAAML,CAAO,CAAC,EAE/CI,EAAI,KAAKC,CAAI,CAGzB,MAAWC,GAAUH,CAAK,EACtBF,EAAIC,CAAI,EAAI,KAAK,iBAAiBC,EAAOH,CAAO,EACzCO,GAAYJ,CAAK,EACxBF,EAAIC,CAAI,EAAI,KAAK,mBAAmBC,EAAOH,CAAO,EAC3CG,IAAU,SACjBF,EAAIC,CAAI,EAAIC,GAGpB,OAAOF,CACX,CAEU,mBAAmBO,EAAsBR,EAAyB,CACxE,IAAMC,EAA+B,CAAA,EACrC,OAAAA,EAAI,SAAWO,EAAU,SACrBA,EAAU,WACVP,EAAI,SAAWD,EAAQ,SAAS,IAAIQ,EAAU,QAAQ,GAEnDP,CACX,CAEU,iBAAiBR,EAAeO,EAAyB,CAC/D,IAAMF,EAAUE,EAAQ,SAAS,IAAIP,CAAI,EACzC,OAAIgB,GAAchB,CAAI,EAClBK,EAAQ,SAAWL,EAAK,SAGxBK,EAAQ,cAAgB,KAAK,oBAAoBL,EAAK,aAAa,EAEvEK,EAAQ,OAASL,EAAK,OACtBK,EAAQ,QAAUE,EAAQ,SAAS,IAAIP,EAAK,OAAO,EAC/CiB,GAAmBjB,CAAI,EACvBK,EAAQ,QAAUL,EAAK,QAAQ,IAAIkB,GAAS,KAAK,iBAAiBA,EAAOX,CAAO,CAAC,EAC1EY,GAAcnB,CAAI,IACzBK,EAAQ,UAAYL,EAAK,UAAU,KACnCK,EAAQ,OAASL,EAAK,OACtBK,EAAQ,OAASL,EAAK,OACtBK,EAAQ,UAAYL,EAAK,MAAM,MAAM,KACrCK,EAAQ,YAAcL,EAAK,MAAM,MAAM,UACvCK,EAAQ,QAAUL,EAAK,MAAM,IAAI,KACjCK,EAAQ,UAAYL,EAAK,MAAM,IAAI,WAEhCK,CACX,CAEA,QAAqCR,EAA2B,CAC5D,IAAMG,EAAOH,EAAO,MACdU,EAAU,KAAK,uBAAuBP,CAAI,EAChD,MAAI,aAAcA,GACd,KAAK,eAAeA,EAAK,SAAUO,CAAO,EAEvC,CACH,YAAaV,EAAO,YACpB,YAAaA,EAAO,YACpB,aAAcA,EAAO,aACrB,MAAO,KAAK,eAAeG,EAAMO,CAAO,EAEhD,CAEU,uBAAuBP,EAAS,CACtC,IAAMC,EAAW,IAAI,IACfC,EAAW,IAAI,IACrB,QAAWC,KAAWC,GAAUJ,CAAI,EAChCC,EAAS,IAAIE,EAAS,CAAA,CAAa,EAEvC,IAAIiB,EACJ,GAAIpB,EAAK,SACL,QAAWK,KAAWC,GAAUN,EAAK,QAAQ,EAAG,CAC5C,IAAIqB,EACA,aAAchB,GACdgB,EAAM,IAAIC,GAAgBjB,EAAQ,QAAkB,EACpDe,EAAOC,GACA,YAAahB,EACpBgB,EAAM,IAAIE,GACH,cAAelB,IACtBgB,EAAM,KAAK,mBAAmBhB,CAAO,GAErCgB,IACAnB,EAAS,IAAIG,EAASgB,CAAG,EACzBA,EAAI,KAAOD,EAEnB,CAEJ,MAAO,CACH,SAAAnB,EACA,SAAAC,EAER,CAEU,eAAeF,EAAWO,EAAuB,CACvD,IAAMJ,EAAUI,EAAQ,SAAS,IAAIP,CAAI,EACzCG,EAAQ,MAAQH,EAAK,MACrBG,EAAQ,gBAAkBH,EAAK,gBAC/BG,EAAQ,mBAAqBH,EAAK,mBAC9BA,EAAK,WACLG,EAAQ,SAAWI,EAAQ,SAAS,IAAIP,EAAK,QAAQ,GAEzD,OAAW,CAACS,EAAMC,CAAK,IAAK,OAAO,QAAQV,CAAI,EAC3C,GAAI,CAAAS,EAAK,WAAW,GAAG,EAGvB,GAAI,MAAM,QAAQC,CAAK,EAAG,CACtB,IAAMC,EAAiB,CAAA,EACvBR,EAAQM,CAAI,EAAIE,EAChB,QAAWC,KAAQF,EACXG,GAAUD,CAAI,EACdD,EAAI,KAAK,KAAK,UAAU,KAAK,eAAeC,EAAML,CAAO,EAAGJ,CAAO,CAAC,EAC7DW,GAAYF,CAAI,EACvBD,EAAI,KAAK,KAAK,iBAAiBC,EAAMT,EAASM,EAAMF,CAAO,CAAC,EAE5DI,EAAI,KAAKC,CAAI,CAGzB,MAAWC,GAAUH,CAAK,EACtBP,EAAQM,CAAI,EAAI,KAAK,UAAU,KAAK,eAAeC,EAAOH,CAAO,EAAGJ,CAAO,EACpEW,GAAYJ,CAAK,EACxBP,EAAQM,CAAI,EAAI,KAAK,iBAAiBC,EAAOP,EAASM,EAAMF,CAAO,EAC5DG,IAAU,SACjBP,EAAQM,CAAI,EAAIC,GAGxB,OAAOP,CACX,CAEU,UAAUH,EAAWwB,EAAW,CACtC,OAAAxB,EAAK,WAAawB,EACXxB,CACX,CAEU,iBAAiBe,EAAgBf,EAAeS,EAAcF,EAAuB,CAC3F,OAAO,KAAK,OAAO,eAAeP,EAAMS,EAAMF,EAAQ,SAAS,IAAIQ,EAAU,QAAQ,EAAIA,EAAU,QAAQ,CAC/G,CAEU,eAAeV,EAAcE,EAAyBkB,EAAM,EAAC,CACnE,IAAMC,EAAanB,EAAQ,SAAS,IAAIF,CAAO,EAK/C,GAJI,OAAOA,EAAQ,eAAkB,WACjCqB,EAAW,cAAgB,KAAK,kBAAkBrB,EAAQ,aAAa,GAE3EqB,EAAW,QAAUnB,EAAQ,SAAS,IAAIF,EAAQ,OAAO,EACrDY,GAAmBS,CAAU,EAC7B,QAAWR,KAASb,EAAQ,QAAS,CACjC,IAAMsB,EAAW,KAAK,eAAeT,EAAOX,EAASkB,GAAK,EAC1DC,EAAW,QAAQ,KAAKC,CAAQ,CACpC,CAEJ,OAAOD,CACX,CAEU,mBAAmBrB,EAAY,CACrC,IAAMuB,EAAY,KAAK,aAAavB,EAAQ,SAAS,EAC/CwB,EAASxB,EAAQ,OACjByB,EAASzB,EAAQ,OACjB0B,EAAY1B,EAAQ,UACpB2B,EAAc3B,EAAQ,YACtB4B,EAAU5B,EAAQ,QAClB6B,EAAY7B,EAAQ,UACpB8B,EAAS9B,EAAQ,OAiBvB,OAhBa,IAAI+B,GACbP,EACAC,EACA,CACI,MAAO,CACH,KAAMC,EACN,UAAWC,GAEf,IAAK,CACD,KAAMC,EACN,UAAWC,IAGnBN,EACAO,CAAM,CAGd,CAEU,aAAa1B,EAAY,CAC/B,OAAO,KAAK,MAAM,WAAWA,CAAI,CACrC,CAEU,oBAAoBT,EAAiC,CAC3D,GAAKA,EAGL,OAAI,KAAK,oBAAoB,OAAS,GAClC,KAAK,0BAAyB,EAE3B,KAAK,oBAAoB,IAAIA,CAAI,CAC5C,CAEU,kBAAkBqC,EAAU,CAClC,OAAI,KAAK,oBAAoB,OAAS,GAClC,KAAK,0BAAyB,EAElB,KAAK,oBAAoB,OAAOA,CAAE,CAEtD,CAEU,2BAAyB,CAC/B,IAAIA,EAAK,EACT,QAAWC,KAAWlC,GAAU,KAAK,OAAO,EACpCmC,GAAkBD,CAAO,GACzB,KAAK,oBAAoB,IAAIA,EAASD,GAAI,CAGtD,GClRE,SAAUG,GAAwBC,EAAiC,CACrE,MAAO,CACH,cAAe,CACX,gBAAiBC,EAACC,GAAa,IAAIC,GAAuBD,CAAQ,EAAjD,mBACjB,sBAAuBD,EAACC,GAAa,IAAIE,GAA2BF,CAAQ,EAArD,0BAE3B,OAAQ,CACJ,YAAaD,EAACC,GAAa,IAAIG,GAAmBH,CAAQ,EAA7C,eACb,cAAeD,EAACC,GAAaI,GAAoBJ,CAAQ,EAA1C,iBACf,cAAeD,EAACC,GAAaK,GAAoBL,CAAQ,EAA1C,iBACf,iBAAkBD,EAACC,GAAaM,GAAuBN,CAAQ,EAA7C,oBAClB,eAAgBD,EAAA,IAAM,IAAIQ,GAAV,kBAChB,aAAcR,EAAA,IAAM,IAAIS,GAAV,gBACd,MAAOT,EAACC,GAAa,IAAIS,GAAaT,CAAQ,EAAvC,SACP,2BAA4BD,EAAA,IAAM,IAAIW,GAAV,8BAC5B,0BAA2BX,EAAA,IAAM,IAAIY,GAAV,8BAE/B,UAAW,CACP,eAAgBZ,EAAA,IAAM,IAAIa,GAAV,kBAChB,2BAA4Bb,EAACC,GAAa,IAAIa,GAAkCb,CAAQ,EAA5D,8BAC5B,6BAA8BD,EAACC,GAAa,IAAIc,GAAoCd,CAAQ,EAA9D,iCAElC,WAAY,CACR,OAAQD,EAACC,GAAa,IAAIe,GAAcf,CAAQ,EAAxC,UACR,aAAcD,EAAA,IAAM,IAAIiB,GAAV,gBACd,cAAejB,EAACC,GAAa,IAAIiB,GAAqBjB,CAAQ,EAA/C,iBACf,iBAAkBD,EAACC,GAAa,IAAIkB,GAAwBlB,CAAQ,EAAlD,oBAClB,WAAYD,EAACC,GAAa,IAAImB,GAAkBnB,CAAQ,EAA5C,eAEhB,WAAY,CACR,SAAUD,EAACC,GAAa,IAAIoB,GAAgBpB,CAAQ,EAA1C,YACV,eAAgBD,EAACC,GAAa,IAAIqB,GAAsBrB,CAAQ,EAAhD,mBAEpB,WAAY,CACR,kBAAmBD,EAACC,GAAa,IAAIsB,GAAyBtB,CAAQ,EAAnD,qBACnB,mBAAoBD,EAACC,GAAa,IAAIuB,GAAmBvB,CAAQ,EAA7C,uBAExB,OAAQD,EAAA,IAAMD,EAAQ,OAAd,UAEhB,CAvCgBC,EAAAF,GAAA,2BA2DV,SAAU2B,GAA8B1B,EAAuC,CACjF,MAAO,CACH,gBAAiBC,EAACC,GAAa,IAAIyB,GAAuBzB,CAAQ,EAAjD,mBACjB,UAAW,CACP,iBAAkBD,EAACC,GAAa,IAAI0B,GAAwB1B,CAAQ,EAAlD,oBAClB,uBAAwBD,EAACC,GAAa,IAAI2B,GAA8B3B,CAAQ,EAAxD,0BACxB,gBAAiBD,EAACC,GAAa,IAAI4B,GAAuB5B,CAAQ,EAAjD,mBACjB,aAAcD,EAACC,GAAa,IAAI6B,GAAoB7B,CAAQ,EAA9C,gBACd,iBAAkBD,EAACC,GAAa,IAAI8B,GAAwB9B,CAAQ,EAAlD,oBAClB,mBAAoBD,EAACC,GAAaF,EAAQ,mBAAmBE,CAAQ,EAAjD,sBACpB,cAAeD,EAAA,IAAM,IAAIgC,GAAV,iBACf,sBAAuBhC,EAACC,GAAa,IAAIgC,GAA6BhC,CAAQ,EAAvD,0BAGnC,CAdgBD,EAAAyB,GAAA,iCCvFV,IAAWS,IAAjB,SAAiBA,EAAM,CACNA,EAAA,MAAQ,CAA4BC,EAAmBC,IAAuBC,GAAOA,GAAO,CAAA,EAAIF,CAAE,EAAGC,CAAE,CACxH,GAFiBF,KAAAA,GAAM,CAAA,EAAA,EA0BjB,SAAUI,GACZC,EAAwBC,EAAyBC,EAAyBC,EAAyBC,EAAyBC,EAAyBC,EAAyBC,EAAyBC,EAAuB,CAE9N,IAAMC,EAAS,CAACT,EAASC,EAASC,EAASC,EAASC,EAASC,EAASC,EAASC,EAASC,CAAO,EAAE,OAAOV,GAAQ,CAAA,CAAE,EAClH,OAAOY,GAAQD,CAAM,CACzB,CALgBE,EAAAZ,GAAA,UAOhB,IAAMa,GAAU,OAAO,SAAS,EAM1B,SAAUC,GAAaC,EAAO,CAChC,GAAIA,GAASA,EAAaF,EAAO,EAC7B,QAAWG,KAAS,OAAO,OAAOD,CAAI,EAClCD,GAAUE,CAAK,EAGvB,OAAOD,CACX,CAPgBH,EAAAE,GAAA,aAahB,SAASH,GAAcD,EAAsBO,EAAc,CACvD,IAAMC,EAAa,IAAI,MAAM,CAAA,EAAW,CACpC,eAAgBN,EAAA,IAAM,GAAN,kBAChB,IAAKA,EAAA,IAAK,CACN,MAAM,IAAI,MAAM,mDAAmD,CACvE,EAFK,OAGL,IAAKA,EAAA,CAACO,EAAKC,IACHA,IAASP,GACF,GAEAQ,GAASF,EAAKC,EAAMV,EAAQO,GAAYC,CAAK,EAJvD,OAOL,yBAA0BN,EAAA,CAACO,EAAKC,KAAUC,GAASF,EAAKC,EAAMV,EAAQO,GAAYC,CAAK,EAAG,OAAO,yBAAyBC,EAAKC,CAAI,GAAzG,4BAC1B,IAAKR,EAAA,CAACU,EAAGF,IAASA,KAAQV,EAArB,OACL,QAASE,EAAA,IAAM,CAAC,GAAG,OAAO,oBAAoBF,CAAM,CAAC,EAA5C,WACZ,EACD,OAAOQ,CACX,CAlBSN,EAAAD,GAAA,WAwBT,IAAMY,GAAgB,OAAM,EAc5B,SAASF,GAAeF,EAAUC,EAAgCV,EAAsBO,EAAW,CAC/F,GAAIG,KAAQD,EAAK,CACb,GAAIA,EAAIC,CAAI,YAAa,MACrB,MAAM,IAAI,MAAM,mFAAoF,CAAC,MAAOD,EAAIC,CAAI,CAAC,CAAC,EAE1H,GAAID,EAAIC,CAAI,IAAMG,GACd,MAAM,IAAI,MAAM,gCAAkC,OAAOH,CAAI,EAAI,wGAAwG,EAE7K,OAAOD,EAAIC,CAAI,CACnB,SAAWA,KAAQV,EAAQ,CACvB,IAAMM,EAA+DN,EAAOU,CAAe,EAC3FD,EAAIC,CAAI,EAAIG,GACZ,GAAI,CACAJ,EAAIC,CAAI,EAAK,OAAOJ,GAAU,WAAcA,EAAMC,CAAQ,EAAIN,GAAQK,EAAOC,CAAQ,CACzF,OAASO,EAAO,CACZ,MAAAL,EAAIC,CAAI,EAAII,aAAiB,MAAQA,EAAQ,OACvCA,CACV,CACA,OAAOL,EAAIC,CAAI,CACnB,KACI,OAER,CAtBSR,EAAAS,GAAA,YA+BT,SAAStB,GAAO0B,EAAqBC,EAAoB,CACrD,GAAIA,GACA,OAAW,CAACC,EAAKC,CAAM,IAAK,OAAO,QAAQF,CAAM,EAC7C,GAAIE,IAAW,OAAW,CACtB,IAAMC,EAASJ,EAAOE,CAAG,EACrBE,IAAW,MAAQD,IAAW,MAAQ,OAAOC,GAAW,UAAY,OAAOD,GAAW,SACtFH,EAAOE,CAAG,EAAI5B,GAAO8B,EAAQD,CAAM,EAEnCH,EAAOE,CAAG,EAAIC,CAEtB,EAGR,OAAOH,CACX,CAdSb,EAAAb,GAAA,UCnFF,IAAM+B,GAAmE,CAC5E,gBAAiB,SACjB,gBAAiB,SACjB,oBAAqB,KACrB,4BAA6B,CAAA,GAGrBC,IAAZ,SAAYA,EAAU,CAClBA,EAAA,QAAA,wBACAA,EAAA,mBAAA,oBACJ,GAHYA,KAAAA,GAAU,CAAA,EAAA,EAoBhB,IAAOC,GAAP,cAAoHC,EAAmB,CAtF7I,MAsF6I,CAAAC,EAAA,qCAyBzI,YAAYC,EAA6FL,GAA0F,CAC/L,MAAK,EArBC,KAAA,iBAA6B,CAAC,CAAC,EAkB/B,KAAA,iBAAmB,UAIzB,KAAK,QAAO,OAAA,OAAA,OAAA,OAAA,CAAA,EACLA,EAA0F,EAC1FK,CAAO,EAGd,KAAK,gBAAkBC,GAAY,CAC/B,KAAM,KAAK,QAAQ,gBACnB,QAAS,KAAK,cAAc,KAAK,IAAI,EACrC,YAAa,GAChB,EAED,KAAK,gBAAkBA,GAAY,CAC/B,KAAM,KAAK,QAAQ,gBACnB,QAAS,KAAK,cAAc,KAAK,IAAI,EACrC,YAAa,GAChB,CACL,CAES,YAAYC,EAAkBF,EAAyC,CAC5E,IAAMG,EAAa,MAAM,YAAYD,EAASF,CAAO,EACrD,GAAI,CAACI,GAAiBD,CAAU,EAC5B,MAAM,IAAI,MAAM,yCAAyC,EAG7D,GAAM,CAAE,gBAAAE,EAAiB,gBAAAC,EAAiB,oBAAAC,EAAqB,4BAAAC,CAA2B,EAAK,KAAK,QAIhGC,EACAC,EACAC,EACEC,EAA2B,CAAA,EACjC,QAAWC,KAAaV,EAAY,CAChC,OAAW,CAACW,EAAOC,CAAG,IAAKP,EACnBK,EAAU,OAASC,EACnBD,EAAU,UAAYjB,GAAW,mBAC1BiB,EAAU,OAASE,IAC1BF,EAAU,SAAW,IAGzBA,EAAU,OAASP,EACnBG,EAASI,EACFA,EAAU,OAASR,EAC1BK,EAASG,EACFA,EAAU,OAASN,EAC1BI,EAAKE,EAELD,EAAY,KAAKC,CAAS,CAElC,CACA,GAAI,CAACJ,GAAU,CAACC,GAAU,CAACC,EACvB,MAAM,IAAI,MAAM,+CAA+C,EAGnE,OAAIH,EAA4B,OAAS,EACgB,CACjD,MAAO,CACH,CAACZ,GAAW,OAAO,EAAG,CAACa,EAAQC,EAAQ,GAAGE,EAAaD,CAAE,EACzD,CAACf,GAAW,kBAAkB,EAAG,CAAC,GAAGgB,EAAaD,CAAE,GAExD,YAAaf,GAAW,SAIrB,CAACa,EAAQC,EAAQC,EAAI,GAAGC,CAAW,CAElD,CAES,kBAAkBI,EAAY,CACnC,IAAMC,EAAS,MAAM,kBAAkBD,CAAI,EAC3C,OAAA,OAAA,OAAA,OAAA,OAAA,CAAA,EACOC,CAAM,EAAA,CACT,iBAAkB,KAAK,sBAAsBD,CAAI,CAAC,CAAA,CAE1D,CASU,cAAcA,EAAcE,EAAc,CAChD,OAAOA,IAAW,GAAK;EAAO,SAASF,EAAKE,EAAS,CAAC,CAAC,CAC3D,CAYU,gBAAgBF,EAAcE,EAAgBC,EAAkBC,EAAgC,OACtG,KAAK,iBAAiB,UAAYF,EAClC,IAAMG,EAAQ,KAAK,iBAAiB,KAAKL,CAAI,EAC7C,MAAO,CACH,iBAAiBM,EAAAD,IAAQ,CAAC,EAAE,UAAM,MAAAC,IAAA,OAAAA,EAAI,EACtC,gBAAiB,KAAK,iBAAiB,GAAG,EAAE,EAC5C,MAAAD,EAER,CAWU,+BAA+BR,EAAsBG,EAAcO,EAAeL,EAAc,CACtG,IAAMM,EAAa,KAAK,cAAcR,EAAME,CAAM,EAClD,OAAOO,GACHZ,EACAU,EACAL,EAAQA,EAASK,EAAM,OACvBC,EAAYA,EACZ,EAAGD,EAAM,MAAM,CAEvB,CASU,cAAcP,EAAcE,EAAc,CAChD,OAAOF,EAAK,UAAU,EAAGE,CAAM,EAAE,MAAM,YAAY,EAAE,MACzD,CAUU,cAAcF,EAAcE,EAAgBC,EAAkBC,EAAgC,CACpG,GAAI,CAAC,KAAK,cAAcJ,EAAME,CAAM,EAChC,OAAO,KAGX,GAAM,CAAE,gBAAAQ,EAAiB,gBAAAC,EAAiB,MAAAN,CAAK,EAAK,KAAK,gBAAgBL,EAAME,EAAQC,EAAQC,CAAM,EAErG,OAAIM,GAAmBC,EAGZ,MAGX,KAAK,iBAAiB,KAAKD,CAAe,EAEnCL,EACX,CAUU,cAAcL,EAAcE,EAAgBC,EAAkBC,EAAgC,aACpG,GAAI,CAAC,KAAK,cAAcJ,EAAME,CAAM,EAChC,OAAO,KAGX,GAAM,CAAE,gBAAAQ,EAAiB,gBAAAC,EAAiB,MAAAN,CAAK,EAAK,KAAK,gBAAgBL,EAAME,EAAQC,EAAQC,CAAM,EAErG,GAAIM,GAAmBC,EAGnB,OAAO,KAGX,IAAMC,EAAmB,KAAK,iBAAiB,YAAYF,CAAe,EAG1E,GAAIE,IAAqB,GACrB,YAAK,YAAY,KAAK,CAClB,SAAU,QACV,QAAS,wBAAwBF,CAAe,eAAeR,CAAM,gCAAgC,KAAK,gBAAgB,GAC1H,OAAAA,EACA,QAAQW,GAAAP,EAAAD,IAAQ,CAAC,KAAC,MAAAC,IAAA,OAAA,OAAAA,EAAE,UAAM,MAAAO,IAAA,OAAAA,EAAI,EAC9B,KAAM,KAAK,cAAcb,EAAME,CAAM,EACrC,OAAQ,EACX,EACM,KAGX,IAAMY,EAAkB,KAAK,iBAAiB,OAASF,EAAmB,EACpEG,GAAuBC,GAAAC,EAAAjB,EAAK,UAAU,EAAGE,CAAM,EAAE,MAAM,UAAU,KAAC,MAAAe,IAAA,OAAA,OAAAA,EAAG,CAAC,EAAE,UAAM,MAAAD,IAAA,OAAAA,EAAI,EAExF,QAASE,EAAI,EAAGA,EAAIJ,EAAiBI,IAAK,CACtC,IAAMC,EAAQ,KAAK,+BACf,KAAK,gBACLnB,EACA,GACAE,GAAUa,EAAuB,EAAE,EAEvCZ,EAAO,KAAKgB,CAAK,EACjB,KAAK,iBAAiB,IAAG,CAC7B,CAGA,OAAO,IACX,CAEmB,mBAAmBC,EAAsB,CACxD,IAAMvB,EAAY,MAAM,mBAAmBuB,CAAQ,EAC7C,CAAE,gBAAA/B,EAAiB,gBAAAC,EAAiB,oBAAAC,CAAmB,EAAK,KAAK,QAEvE,OAAIM,EAAU,OAASR,EACZ,KAAK,gBACLQ,EAAU,OAASP,EACnB,KAAK,gBACLO,EAAU,OAASN,EACnBN,GAAY,CACf,KAAMM,EACN,QAAS,KAAK,iBACd,MAAO8B,GAAM,QAChB,EAEExB,CACX,CAQA,sBAAsBG,EAAY,CAC9B,IAAMsB,EAA6B,CAAA,EACnC,KAAO,KAAK,iBAAiB,OAAS,GAClCA,EAAiB,KACb,KAAK,+BAA+B,KAAK,gBAAiBtB,EAAM,GAAIA,EAAK,MAAM,CAAC,EAEpF,KAAK,iBAAiB,IAAG,EAG7B,YAAK,iBAAmB,CAAC,CAAC,EACnBsB,CACX,GAgBSC,GAAP,cAAqCC,EAAY,CA9XvD,MA8XuD,CAAAzC,EAAA,8BAInD,YAAY0C,EAA6B,CAErC,GADA,MAAMA,CAAQ,EACVA,EAAS,OAAO,wBAAwB5C,GACxC,KAAK,wBAA0B4C,EAAS,OAAO,iBAE/C,OAAM,IAAI,MAAM,6EAA6E,CAErG,CAES,SAASzB,EAAchB,EAA2B0C,GAAwB,CAC/E,IAAMzB,EAAS,MAAM,SAASD,CAAI,EAG5B2B,EAAS1B,EAAO,OAClBjB,GAAS,OAAS,QAElBiB,EAAO,OAAO,KAAK,GAAG0B,EAAO,gBAAgB,EAEjDA,EAAO,iBAAmB,CAAA,EAI1B,GAAM,CAAE,gBAAAC,EAAiB,gBAAAC,CAAe,EAAK,KAAK,wBAE5CC,EAAiBF,EAAgB,aACjCG,EAAiBF,EAAgB,aACjCG,EAAwB,CAAA,EACxBC,EAAShC,EAAO,OAAO,OAAS,EACtC,QAASiB,EAAI,EAAGA,EAAIe,EAAQf,IAAK,CAC7B,IAAMC,EAAQlB,EAAO,OAAOiB,CAAC,EACvBgB,EAAYjC,EAAO,OAAOiB,EAAI,CAAC,EACrC,GAAIC,EAAM,eAAiBW,GAAkBI,EAAU,eAAiBH,EAAgB,CACpFb,IACA,QACJ,CAEAc,EAAY,KAAKb,CAAK,CAC1B,CAEA,OAAIc,GAAU,GACVD,EAAY,KAAK/B,EAAO,OAAOgC,CAAM,CAAC,EAE1ChC,EAAO,OAAS+B,EAET/B,CACX,GC/aJ,IAAAkC,EAAA,GAAAC,GAAAD,EAAA,cAAAE,GAAA,UAAAC,GAAA,iBAAAC,EAAA,iBAAAC,GAAA,aAAAC,GAAA,gBAAAC,GAAA,aAAAC,GAAA,eAAAC,GAAA,oBAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,sBAAAC,GAAA,iBAAAC,GAAA,aAAAC,GAAA,uBAAAC,GAAA,cAAAC,GAAA,gBAAAC,GAAA,gBAAAC,GAAA,eAAAC,GAAA,mBAAAC,GAAA,QAAAC,GAAA,aAAAC,GAAA,mBAAAC,GAAA,sBAAAC,GAAA,kBAAAC,GAAA,sBAAAC,GAAA,yBAAAC,GAAA,wBAAAC,GAAA,0BAAAC,GAAA,6BAAAC,GAAA,WAAAC,IAOAC,EAAAjC,EAAckC,ICyBR,IAAOC,GAAP,KAA8B,CAhCpC,MAgCoC,CAAAC,EAAA,gCAEhC,UAAQ,CACJ,MAAM,IAAI,MAAM,8BAA8B,CAClD,CAEA,MAAM,eAAa,CACf,MAAO,CAAA,CACX,GAISC,GAAkB,CAC3B,mBAAoBD,EAAA,IAAM,IAAID,GAAV,uBC9BxB,IAAMG,GAAgF,CAClF,QAASC,EAAA,IAAG,GAAH,WACT,iBAAkBA,EAAA,KAAO,CACrB,gBAAiB,GACjB,eAAgB,CAAC,UAAU,EAC3B,WAAY,YAHE,qBAOhBC,GAAkG,CACpG,cAAeD,EAAA,IAAM,IAAQE,GAAd,kBAGnB,SAASC,IAA4B,CACjC,IAAMC,EAASC,GACXC,GAA8BC,EAAe,EAC7CN,EAA0B,EAExBO,EAAUH,GACZI,GAAwB,CAAE,OAAAL,CAAM,CAAE,EAClCL,EAAoB,EAExB,OAAAK,EAAO,gBAAgB,SAASI,CAAO,EAChCA,CACX,CAXSR,EAAAG,GAAA,gCAiBH,SAAUO,GAAoBC,EAAY,OAC5C,IAAMC,EAAWT,GAA4B,EACvCU,EAAUD,EAAS,WAAW,eAAe,YAAYD,CAAI,EACnE,OAAAC,EAAS,OAAO,UAAU,uBAAuB,UAAUC,EAASC,GAAI,MAAM,aAAYC,EAAAF,EAAQ,QAAI,MAAAE,IAAA,OAAAA,EAAI,SAAS,UAAU,CAAC,EACvHF,CACX,CALgBb,EAAAU,GAAA,uB/G3BhBM,EAAAC,GAAcC,GgHlBd,IAAIC,GAAY,OAAO,eACnBC,EAASA,EAAA,CAACC,EAAQC,IAAUH,GAAUE,EAAQ,OAAQ,CAAE,MAAAC,EAAO,aAAc,EAAK,CAAC,EAA1E,UAITC,GAAY,YACZC,GAAe,eACnB,SAASC,GAAeC,EAAM,CAC5B,OAAOC,GAAW,WAAWD,EAAMF,EAAY,CACjD,CAFSJ,EAAAK,GAAA,kBAGTL,EAAOK,GAAgB,gBAAgB,EACvC,IAAIG,GAAO,OACPC,GAAS,SACb,SAASC,GAASJ,EAAM,CACtB,OAAOC,GAAW,WAAWD,EAAMG,EAAM,CAC3C,CAFST,EAAAU,GAAA,YAGTV,EAAOU,GAAU,UAAU,EAC3B,IAAIC,GAAW,WACXC,GAAgB,gBAChBC,GAAoB,oBACpBC,GAAS,SACb,SAASC,GAAST,EAAM,CACtB,OAAOC,GAAW,WAAWD,EAAMQ,EAAM,CAC3C,CAFSd,EAAAe,GAAA,YAGTf,EAAOe,GAAU,UAAU,EAC3B,IAAIC,GAAQ,QACRC,GAAO,OACPC,GAAQ,QACRC,GAAW,WACf,SAASC,GAAWd,EAAM,CACxB,OAAOC,GAAW,WAAWD,EAAMa,EAAQ,CAC7C,CAFSnB,EAAAoB,GAAA,cAGTpB,EAAOoB,GAAY,YAAY,EAC/B,IAAIC,GAAQ,QACRC,GAAO,OACX,SAASC,GAAOjB,EAAM,CACpB,OAAOC,GAAW,WAAWD,EAAMgB,EAAI,CACzC,CAFStB,EAAAuB,GAAA,UAGTvB,EAAOuB,GAAQ,QAAQ,EACvB,IAAIC,GAAO,OACPC,GAAW,WACXC,GAAQ,QACZ,SAASC,GAAQrB,EAAM,CACrB,OAAOC,GAAW,WAAWD,EAAMoB,EAAK,CAC1C,CAFS1B,EAAA2B,GAAA,WAGT3B,EAAO2B,GAAS,SAAS,EACzB,IAAIC,GAAS,SACTC,GAAS,SACb,SAASC,GAASxB,EAAM,CACtB,OAAOC,GAAW,WAAWD,EAAMuB,EAAM,CAC3C,CAFS7B,EAAA8B,GAAA,YAGT9B,EAAO8B,GAAU,UAAU,EAC3B,IAAIC,GAAc,cAClB,SAASC,GAAc1B,EAAM,CAC3B,OAAOC,GAAW,WAAWD,EAAMyB,EAAW,CAChD,CAFS/B,EAAAgC,GAAA,iBAGThC,EAAOgC,GAAe,eAAe,EACrC,IAAIC,GAAM,MACV,SAASC,GAAM5B,EAAM,CACnB,OAAOC,GAAW,WAAWD,EAAM2B,EAAG,CACxC,CAFSjC,EAAAkC,GAAA,SAGTlC,EAAOkC,GAAO,OAAO,EACrB,IAAIC,GAAa,aACjB,SAASC,GAAa9B,EAAM,CAC1B,OAAOC,GAAW,WAAWD,EAAM6B,EAAU,CAC/C,CAFSnC,EAAAoC,GAAA,gBAGTpC,EAAOoC,GAAc,cAAc,EACnC,IAAIC,GAAQ,QACRC,GAAU,UACVC,GAAU,UACd,SAASC,GAAUlC,EAAM,CACvB,OAAOC,GAAW,WAAWD,EAAMiC,EAAO,CAC5C,CAFSvC,EAAAwC,GAAA,aAGTxC,EAAOwC,GAAW,WAAW,EAC7B,IAAIC,GAAa,aACbC,GAAY,YACZC,GAAO,OACPC,GAAU,UACVC,GAAuB,cAAcC,EAAsB,CA9E/D,MA8E+D,CAAA9C,EAAA,6BAC7D,MAAO,CACLA,EAAO,KAAM,sBAAsB,CACrC,CACA,aAAc,CACZ,MAAO,CAACI,GAAcI,GAAMC,GAAQE,GAAUC,GAAeC,GAAmBC,GAAQE,GAAO0B,GAAWzB,GAAMC,GAAOC,GAAUE,GAAOC,GAAME,GAAMC,GAAUkB,GAAMjB,GAAOE,GAAQC,GAAQE,GAAaE,GAAKE,GAAYE,GAAOO,GAASN,GAASnC,GAAWoC,GAASE,EAAU,CAClR,CACA,iBAAiBM,EAASC,EAAW,CACnC,OAAQD,EAAS,CACf,KAAKtC,GACL,KAAKE,GACL,KAAKC,GACL,KAAKE,GACL,KAAKY,GACH,OAAO,KAAK,UAAUvB,GAAW6C,CAAS,EAE5C,KAAKN,GACH,OAAO,KAAK,UAAUvB,GAAU6B,CAAS,EAE3C,KAAKL,GACL,KAAKC,GACH,OAAO,KAAK,UAAUpB,GAAMwB,CAAS,EAEvC,QACE,MAAO,EAEX,CACF,CACA,iBAAiBC,EAAS,CACxB,IAAMC,EAAc,GAAGD,EAAQ,UAAU,KAAK,IAAIA,EAAQ,QAAQ,GAClE,OAAQC,EAAa,CACnB,IAAK,aACH,OAAO1C,GAET,QACE,MAAM,IAAI,MAAM,GAAG0C,CAAW,+BAA+B,CAEjE,CACF,CACA,gBAAgBC,EAAM,CACpB,OAAQA,EAAM,CACZ,KAAK/C,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,QAAS,aAAc,CAAC,CAAE,EAClC,CAAE,KAAM,SAAU,aAAc,CAAC,CAAE,EACnC,CAAE,KAAM,YAAa,aAAc,CAAC,CAAE,EACtC,CAAE,KAAM,WAAY,aAAc,CAAC,CAAE,EACrC,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKI,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,OAAQ,EAChB,CAAE,KAAM,MAAO,CACjB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,MAAO,EACf,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKE,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,QAAS,CACnB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,IAAK,EACb,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,OAAQ,aAAc,CAAC,CAAE,CACnC,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,WAAY,EACpB,CAAE,KAAM,WAAY,CACtB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,IAAK,EACb,CAAE,KAAM,SAAU,EAClB,CAAE,KAAM,OAAQ,aAAc,CAAC,CAAE,EACjC,CAAE,KAAM,MAAO,CACjB,CACF,EAEF,KAAKE,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,UAAW,aAAc,CAAC,CAAE,EACpC,CAAE,KAAM,OAAQ,EAChB,CAAE,KAAM,MAAO,CACjB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,WAAY,aAAc,EAAM,EACxC,CAAE,KAAM,OAAQ,EAChB,CAAE,KAAM,UAAW,aAAc,EAAM,EACvC,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,WAAY,aAAc,EAAM,EACxC,CAAE,KAAM,OAAQ,EAChB,CAAE,KAAM,UAAW,aAAc,EAAM,EACvC,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,MAAO,EACf,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,aAAc,aAAc,CAAC,CAAE,EACvC,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKE,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,MAAO,EACf,CAAE,KAAM,IAAK,EACb,CAAE,KAAM,IAAK,EACb,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKE,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,eAAgB,EACxB,CAAE,KAAM,MAAO,CACjB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,IAAK,EACb,CAAE,KAAM,IAAK,CACf,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,IAAK,EACb,CAAE,KAAM,OAAQ,aAAc,CAAC,CAAE,EACjC,CAAE,KAAM,MAAO,CACjB,CACF,EAEF,KAAKE,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,MAAO,EACf,CAAE,KAAM,QAAS,aAAc,EAAM,CACvC,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,SAAU,aAAc,CAAC,CAAE,EACnC,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKE,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,MAAO,EACf,CAAE,KAAM,KAAM,EACd,CAAE,KAAM,OAAQ,EAChB,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKE,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,WAAY,aAAc,CAAC,CAAE,EACrC,CAAE,KAAM,WAAY,aAAc,EAAM,EACxC,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKE,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,OAAQ,EAChB,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKE,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,OAAQ,aAAc,CAAC,CAAE,EACjC,CAAE,KAAM,SAAU,aAAc,CAAC,CAAE,EACnC,CAAE,KAAM,UAAW,aAAc,CAAC,CAAE,EACpC,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,MAAO,EACf,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,IAAK,EACb,CAAE,KAAM,IAAK,EACb,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,OAAQ,EAChB,CAAE,KAAM,cAAe,aAAc,CAAC,CAAE,CAC1C,CACF,EAEF,KAAKE,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,MAAO,CACjB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,KAAM,EACd,CAAE,KAAM,aAAc,aAAc,CAAC,CAAE,EACvC,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,eAAgB,EACxB,CAAE,KAAM,MAAO,EACf,CAAE,KAAM,OAAQ,CAClB,CACF,EAEF,KAAKC,GACH,MAAO,CACL,KAAMA,GACN,WAAY,CACV,CAAE,KAAM,eAAgB,EACxB,CAAE,KAAM,MAAO,CACjB,CACF,EAEF,QACE,MAAO,CACL,KAAMO,EACN,WAAY,CAAC,CACf,CAEJ,CACF,CACF,EACI5C,GAAa,IAAIsC,GAIjBO,GACAC,GAA8BrD,EAAO,IAAMoD,KAAsBA,GAAoBE,GAAoB,2jJAA2jJ,GAAI,aAAa,EACrrJC,GACAC,GAAgCxD,EAAO,IAAMuD,KAAwBA,GAAsBD,GAAoB,ooLAAooL,GAAI,eAAe,EACtwLG,GACAC,GAA6B1D,EAAO,IAAMyD,KAAqBA,GAAmBH,GAAoB,y4LAAy4L,GAAI,YAAY,EAC//LK,GACAC,GAAsC5D,EAAO,IAAM2D,KAA8BA,GAA4BL,GAAoB,w2WAAw2W,GAAI,qBAAqB,EAClgXO,GACAC,GAAkC9D,EAAO,IAAM6D,KAA0BA,GAAwBP,GAAoB,+qVAA+qV,GAAI,iBAAiB,EACzzVS,GACAC,GAA+BhE,EAAO,IAAM+D,KAAuBA,GAAqBT,GAAoB,urXAAurX,GAAI,cAAc,EACrzXW,GACAC,GAAiClE,EAAO,IAAMiE,KAAyBA,GAAuBX,GAAoB,u6RAAu6R,GAAI,gBAAgB,EAG7iSa,GAAuB,CACzB,WAAY,OACZ,eAAgB,CAAC,OAAQ,UAAU,EACnC,gBAAiB,GACjB,KAAM,YACR,EACIC,GAAyB,CAC3B,WAAY,SACZ,eAAgB,CAAC,OAAQ,UAAU,EACnC,gBAAiB,GACjB,KAAM,YACR,EACIC,GAAsB,CACxB,WAAY,MACZ,eAAgB,CAAC,OAAQ,UAAU,EACnC,gBAAiB,GACjB,KAAM,YACR,EACIC,GAA+B,CACjC,WAAY,eACZ,eAAgB,CAAC,OAAQ,UAAU,EACnC,gBAAiB,GACjB,KAAM,YACR,EACIC,GAA2B,CAC7B,WAAY,WACZ,eAAgB,CAAC,OAAQ,UAAU,EACnC,gBAAiB,GACjB,KAAM,YACR,EACIC,GAAwB,CAC1B,WAAY,QACZ,eAAgB,CAAC,OAAQ,UAAU,EACnC,gBAAiB,GACjB,KAAM,YACR,EACIC,GAA0B,CAC5B,WAAY,UACZ,eAAgB,CAAC,OAAQ,UAAU,EACnC,gBAAiB,GACjB,KAAM,YACR,EACIC,GAA+B,CACjC,cAA+B1E,EAAO,IAAM,IAAI6C,GAAwB,eAAe,CACzF,EACI8B,GAAsB,CACxB,QAAyB3E,EAAO,IAAMqD,GAAY,EAAG,SAAS,EAC9D,iBAAkCrD,EAAO,IAAMmE,GAAsB,kBAAkB,EACvF,OAAQ,CAAC,CACX,EACIS,GAAwB,CAC1B,QAAyB5E,EAAO,IAAMwD,GAAc,EAAG,SAAS,EAChE,iBAAkCxD,EAAO,IAAMoE,GAAwB,kBAAkB,EACzF,OAAQ,CAAC,CACX,EACIS,GAAqB,CACvB,QAAyB7E,EAAO,IAAM0D,GAAW,EAAG,SAAS,EAC7D,iBAAkC1D,EAAO,IAAMqE,GAAqB,kBAAkB,EACtF,OAAQ,CAAC,CACX,EACIS,GAA8B,CAChC,QAAyB9E,EAAO,IAAM4D,GAAoB,EAAG,SAAS,EACtE,iBAAkC5D,EAAO,IAAMsE,GAA8B,kBAAkB,EAC/F,OAAQ,CAAC,CACX,EACIS,GAA0B,CAC5B,QAAyB/E,EAAO,IAAM8D,GAAgB,EAAG,SAAS,EAClE,iBAAkC9D,EAAO,IAAMuE,GAA0B,kBAAkB,EAC3F,OAAQ,CAAC,CACX,EACIS,GAAuB,CACzB,QAAyBhF,EAAO,IAAMgE,GAAa,EAAG,SAAS,EAC/D,iBAAkChE,EAAO,IAAMwE,GAAuB,kBAAkB,EACxF,OAAQ,CAAC,CACX,EACIS,GAAyB,CAC3B,QAAyBjF,EAAO,IAAMkE,GAAe,EAAG,SAAS,EACjE,iBAAkClE,EAAO,IAAMyE,GAAyB,kBAAkB,EAC1F,OAAQ,CAAC,CACX,EAMIS,GAA0B,6CAC1BC,GAA0B,4BAC1BC,GAAa,wBAGbC,GAAe,CACjB,UAAWH,GACX,UAAWC,GACX,MAAOC,EACT,EACIE,GAAgC,cAAcC,EAAsB,CAzhBxE,MAyhBwE,CAAAvF,EAAA,sCACtE,MAAO,CACLA,EAAO,KAAM,+BAA+B,CAC9C,CACA,aAAawF,EAAMC,EAAOC,EAAS,CACjC,IAAIxF,EAAQ,KAAK,mBAAmBsF,EAAMC,EAAOC,CAAO,EAIxD,OAHIxF,IAAU,SACZA,EAAQ,KAAK,mBAAmBsF,EAAMC,EAAOC,CAAO,GAElDxF,IAAU,OACL,MAAM,aAAasF,EAAMC,EAAOC,CAAO,EAEzCxF,CACT,CACA,mBAAmBsF,EAAMC,EAAOE,EAAU,CACxC,IAAMC,EAAQP,GAAaG,EAAK,IAAI,EACpC,GAAII,IAAU,OACZ,OAEF,IAAMC,EAAQD,EAAM,KAAKH,CAAK,EAC9B,GAAII,IAAU,KAGd,IAAIA,EAAM,CAAC,IAAM,OACf,OAAOA,EAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,cAAe,GAAG,EAEnD,GAAIA,EAAM,CAAC,IAAM,OACf,OAAOA,EAAM,CAAC,EAAE,QAAQ,SAAU,EAAE,EAAE,QAAQ,SAAU,EAAE,EAAE,QAAQ,cAAe,GAAG,EAAE,QAAQ,eAAgB;AAAA,CAAI,EAGxH,CACF,EACIC,GAAuB,cAAcR,EAA8B,CAzjBvE,MAyjBuE,CAAAtF,EAAA,6BACrE,MAAO,CACLA,EAAO,KAAM,sBAAsB,CACrC,CACA,mBAAmB+F,EAAOC,EAAQL,EAAU,CAE5C,CACF,EAIIM,GAA8B,cAAcC,EAAoB,CApkBpE,MAokBoE,CAAAlG,EAAA,oCAClE,MAAO,CACLA,EAAO,KAAM,6BAA6B,CAC5C,CACA,YAAYmG,EAAU,CACpB,MAAM,EACN,KAAK,SAAW,IAAI,IAAIA,CAAQ,CAClC,CACA,mBAAmBC,EAAOC,EAAgBC,EAAS,CACjD,IAAMC,EAAa,MAAM,mBAAmBH,EAAOC,EAAgBC,CAAO,EAC1E,OAAAC,EAAW,QAASC,GAAc,CAC5B,KAAK,SAAS,IAAIA,EAAU,IAAI,GAAKA,EAAU,UAAY,SAC7DA,EAAU,QAAU,IAAI,OAAOA,EAAU,QAAQ,SAAS,EAAI,oBAAoB,EAEtF,CAAC,EACMD,CACT,CACF,EACIE,GAAqB,cAAcR,EAA4B,CAtlBnE,MAslBmE,CAAAjG,EAAA,2BACjE,MAAO,CACLA,EAAO,KAAM,oBAAoB,CACnC,CACF", + "names": ["require_ral", "__commonJSMin", "exports", "_ral", "RAL", "__name", "install", "ral", "require_is", "__commonJSMin", "exports", "boolean", "value", "__name", "string", "number", "error", "func", "array", "stringArray", "elem", "require_events", "__commonJSMin", "exports", "ral_1", "Event", "_disposable", "CallbackList", "__name", "callback", "context", "bucket", "foundCallbackWithDifferentContext", "len", "args", "ret", "callbacks", "contexts", "i", "e", "Emitter", "_Emitter", "_options", "listener", "thisArgs", "disposables", "result", "event", "require_cancellation", "__commonJSMin", "exports", "ral_1", "Is", "events_1", "CancellationToken", "is", "value", "candidate", "__name", "shortcutEvent", "callback", "context", "handle", "MutableToken", "CancellationTokenSource", "lib_exports", "__export", "AbstractAstReflection", "AbstractCstNode", "AbstractLangiumParser", "AbstractParserErrorMessageProvider", "AbstractThreadedAsyncParser", "ast_utils_exports", "BiMap", "cancellation_exports", "CompositeCstNodeImpl", "ContextCache", "CstNodeBuilder", "cst_utils_exports", "DEFAULT_TOKENIZE_OPTIONS", "DONE_RESULT", "DatatypeSymbol", "DefaultAstNodeDescriptionProvider", "DefaultAstNodeLocator", "DefaultAsyncParser", "DefaultCommentProvider", "DefaultConfigurationProvider", "DefaultDocumentBuilder", "DefaultDocumentValidator", "DefaultHydrator", "DefaultIndexManager", "DefaultJsonSerializer", "DefaultLangiumDocumentFactory", "DefaultLangiumDocuments", "DefaultLexer", "DefaultLexerErrorMessageProvider", "DefaultLinker", "DefaultNameProvider", "DefaultReferenceDescriptionProvider", "DefaultReferences", "DefaultScopeComputation", "DefaultScopeProvider", "DefaultServiceRegistry", "DefaultTokenBuilder", "DefaultValueConverter", "DefaultWorkspaceLock", "DefaultWorkspaceManager", "Deferred", "Disposable", "DisposableCache", "DocumentCache", "DocumentState", "DocumentValidator", "EMPTY_SCOPE", "EMPTY_STREAM", "EmptyFileSystem", "EmptyFileSystemProvider", "ErrorWithLocation", "ast_exports", "grammar_utils_exports", "IndentationAwareLexer", "IndentationAwareTokenBuilder", "JSDocDocumentationProvider", "LangiumCompletionParser", "LangiumParser", "LangiumParserErrorMessageProvider", "LeafCstNodeImpl", "LexingMode", "MapScope", "Module", "MultiMap", "OperationCancelled", "ParserWorker", "Reduction", "regexp_utils_exports", "RootCstNodeImpl", "SimpleCache", "StreamImpl", "StreamScope", "TextDocument", "TreeStreamImpl", "URI", "UriUtils", "ValidationCategory", "ValidationRegistry", "ValueConverter", "WorkspaceCache", "assertUnreachable", "createCompletionParser", "createDefaultCoreModule", "createDefaultSharedCoreModule", "createGrammarConfig", "createLangiumParser", "createParser", "delayNextTick", "diagnosticData", "eagerLoad", "getDiagnosticRange", "indentationBuilderDefaultOptions", "inject", "interruptAndCheck", "isAstNode", "isAstNodeDescription", "isAstNodeWithComment", "isCompositeCstNode", "isIMultiModeLexerDefinition", "isJSDoc", "isLeafCstNode", "isLinkingError", "isNamed", "isOperationCancelled", "isReference", "isRootCstNode", "isTokenTypeArray", "isTokenTypeDictionary", "loadGrammarFromJson", "parseJSDoc", "prepareLangiumParser", "setInterruptionPeriod", "startCancelableOperation", "stream", "toDiagnosticData", "toDiagnosticSeverity", "cst_utils_exports", "__export", "DefaultNameRegexp", "RangeComparison", "compareRange", "findCommentNode", "findDeclarationNodeAtOffset", "findLeafNodeAtOffset", "findLeafNodeBeforeOffset", "flattenCst", "getInteriorNodes", "getNextNode", "getPreviousNode", "getStartlineNode", "inRange", "isChildNode", "isCommentNode", "streamCst", "toDocumentSegment", "tokenToRange", "isAstNode", "obj", "__name", "isReference", "isAstNodeDescription", "isLinkingError", "AbstractAstReflection", "node", "type", "subtype", "supertype", "nested", "existing", "result", "allTypes", "types", "possibleSubType", "isCompositeCstNode", "isLeafCstNode", "isRootCstNode", "StreamImpl", "_StreamImpl", "__name", "startFn", "nextFn", "iterator", "count", "next", "result", "keyFn", "valueFn", "entryStream", "element", "other", "state", "DONE_RESULT", "separator", "value", "addSeparator", "toString", "searchElement", "fromIndex", "index", "predicate", "callbackfn", "done", "initialValue", "previousValue", "mapped", "isIterable", "depth", "stream", "skipCount", "i", "maxSize", "by", "key", "otherKeySet", "item", "e", "ownKey", "obj", "EMPTY_STREAM", "collections", "collection", "TreeStreamImpl", "root", "children", "options", "Reduction", "sum", "a", "b", "product", "min", "max", "streamCst", "node", "TreeStreamImpl", "element", "isCompositeCstNode", "__name", "flattenCst", "isLeafCstNode", "isChildNode", "child", "parent", "tokenToRange", "token", "toDocumentSegment", "offset", "end", "range", "RangeComparison", "compareRange", "to", "startInside", "endInside", "inRange", "DefaultNameRegexp", "findDeclarationNodeAtOffset", "cstNode", "nameRegexp", "localOffset", "textAtOffset", "findLeafNodeAtOffset", "findCommentNode", "commentNames", "previous", "getPreviousNode", "isCommentNode", "isRootCstNode", "endIndex", "e", "searchResult", "binarySearch", "findLeafNodeBeforeOffset", "closest", "left", "right", "closestNode", "middle", "middleNode", "hidden", "index", "getNextNode", "last", "next", "getStartlineNode", "line", "selfIndex", "getInteriorNodes", "start", "commonParent", "getCommonParent", "a", "b", "aParents", "getParentChain", "bParents", "current", "i", "aParent", "bParent", "chain", "grammar_utils_exports", "__export", "findAssignment", "findNameAssignment", "findNodeForKeyword", "findNodeForProperty", "findNodesForKeyword", "findNodesForKeywordInternal", "findNodesForProperty", "getActionAtElement", "getActionType", "getAllReachableRules", "getCrossReferenceTerminal", "getEntryRule", "getExplicitRuleType", "getHiddenRules", "getRuleType", "getRuleTypeName", "getTypeName", "isArrayCardinality", "isArrayOperator", "isCommentTerminal", "isDataType", "isDataTypeRule", "isOptionalCardinality", "terminalRegex", "ErrorWithLocation", "__name", "node", "message", "assertUnreachable", "_", "ast_exports", "__export", "AbstractElement", "AbstractRule", "AbstractType", "Action", "Alternatives", "ArrayLiteral", "ArrayType", "Assignment", "BooleanLiteral", "CharacterRange", "Condition", "Conjunction", "CrossReference", "Disjunction", "EndOfFile", "Grammar", "GrammarImport", "Group", "InferredType", "Interface", "Keyword", "LangiumGrammarAstReflection", "LangiumGrammarTerminals", "NamedArgument", "NegatedToken", "Negation", "NumberLiteral", "Parameter", "ParameterReference", "ParserRule", "ReferenceType", "RegexToken", "ReturnType", "RuleCall", "SimpleType", "StringLiteral", "TerminalAlternatives", "TerminalGroup", "TerminalRule", "TerminalRuleCall", "Type", "TypeAttribute", "TypeDefinition", "UnionType", "UnorderedGroup", "UntilToken", "ValueLiteral", "Wildcard", "isAbstractElement", "isAbstractRule", "isAbstractType", "isAction", "isAlternatives", "isArrayLiteral", "isArrayType", "isAssignment", "isBooleanLiteral", "isCharacterRange", "isCondition", "isConjunction", "isCrossReference", "isDisjunction", "isEndOfFile", "isFeatureName", "isGrammar", "isGrammarImport", "isGroup", "isInferredType", "isInterface", "isKeyword", "isNamedArgument", "isNegatedToken", "isNegation", "isNumberLiteral", "isParameter", "isParameterReference", "isParserRule", "isPrimitiveType", "isReferenceType", "isRegexToken", "isReturnType", "isRuleCall", "isSimpleType", "isStringLiteral", "isTerminalAlternatives", "isTerminalGroup", "isTerminalRule", "isTerminalRuleCall", "isType", "isTypeAttribute", "isTypeDefinition", "isUnionType", "isUnorderedGroup", "isUntilToken", "isValueLiteral", "isWildcard", "reflection", "LangiumGrammarTerminals", "AbstractRule", "isAbstractRule", "item", "reflection", "__name", "AbstractType", "isAbstractType", "Condition", "isCondition", "isFeatureName", "isPrimitiveType", "TypeDefinition", "isTypeDefinition", "ValueLiteral", "isValueLiteral", "AbstractElement", "isAbstractElement", "ArrayLiteral", "isArrayLiteral", "ArrayType", "isArrayType", "BooleanLiteral", "isBooleanLiteral", "Conjunction", "isConjunction", "Disjunction", "isDisjunction", "Grammar", "isGrammar", "GrammarImport", "isGrammarImport", "InferredType", "isInferredType", "Interface", "isInterface", "NamedArgument", "isNamedArgument", "Negation", "isNegation", "NumberLiteral", "isNumberLiteral", "Parameter", "isParameter", "ParameterReference", "isParameterReference", "ParserRule", "isParserRule", "ReferenceType", "isReferenceType", "ReturnType", "isReturnType", "SimpleType", "isSimpleType", "StringLiteral", "isStringLiteral", "TerminalRule", "isTerminalRule", "Type", "isType", "TypeAttribute", "isTypeAttribute", "UnionType", "isUnionType", "Action", "isAction", "Alternatives", "isAlternatives", "Assignment", "isAssignment", "CharacterRange", "isCharacterRange", "CrossReference", "isCrossReference", "EndOfFile", "isEndOfFile", "Group", "isGroup", "Keyword", "isKeyword", "NegatedToken", "isNegatedToken", "RegexToken", "isRegexToken", "RuleCall", "isRuleCall", "TerminalAlternatives", "isTerminalAlternatives", "TerminalGroup", "isTerminalGroup", "TerminalRuleCall", "isTerminalRuleCall", "UnorderedGroup", "isUnorderedGroup", "UntilToken", "isUntilToken", "Wildcard", "isWildcard", "LangiumGrammarAstReflection", "AbstractAstReflection", "subtype", "supertype", "refInfo", "referenceId", "type", "ast_utils_exports", "__export", "assignMandatoryProperties", "copyAstNode", "findLocalReferences", "findRootNode", "getContainerOfType", "getDocument", "hasContainerOfType", "linkContentToContainer", "streamAllContents", "streamAst", "streamContents", "streamReferences", "linkContentToContainer", "node", "name", "value", "item", "index", "isAstNode", "__name", "getContainerOfType", "typePredicate", "hasContainerOfType", "predicate", "getDocument", "result", "findRootNode", "streamContents", "options", "range", "StreamImpl", "state", "property", "isAstNodeInRange", "element", "DONE_RESULT", "streamAllContents", "root", "TreeStreamImpl", "streamAst", "astNode", "nodeRange", "_a", "inRange", "streamReferences", "isReference", "findLocalReferences", "targetNode", "lookup", "refs", "refInfo", "stream", "assignMandatoryProperties", "reflection", "typeMetaData", "genericNode", "copyDefaultValue", "propertyType", "copyAstNode", "buildReference", "copy", "copiedArray", "regexp_utils_exports", "__export", "NEWLINE_REGEXP", "escapeRegExp", "getCaseInsensitivePattern", "getTerminalParts", "isMultilineComment", "isWhitespace", "partialMatches", "partialRegExp", "whitespaceCharacters", "cc", "char", "__name", "insertToSet", "item", "set", "subItem", "addFlag", "flagObj", "flagKey", "x", "ASSERT_EXISTS", "obj", "ASSERT_NEVER_REACH_HERE", "isCharacter", "digitsCharCodes", "i", "cc", "wordCharCodes", "whitespaceCodes", "hexDigitPattern", "decimalPattern", "decimalPatternNoZero", "RegExpParser", "__name", "newState", "input", "value", "flags", "addFlag", "alts", "begin", "terms", "type", "ASSERT_EXISTS", "disjunction", "ASSERT_NEVER_REACH_HERE", "isBacktracking", "range", "atLeast", "atMost", "atom", "cc", "set", "complement", "digitsCharCodes", "whitespaceCodes", "wordCharCodes", "escapeCode", "letter", "escapedChar", "nextChar", "from", "isFromSingleChar", "isCharacter", "to", "isToSingleChar", "insertToSet", "capturing", "groupAst", "number", "howMuch", "prevState", "howMany", "hexString", "hexChar", "char", "BaseRegExpVisitor", "__name", "node", "key", "child", "subChild", "NEWLINE_REGEXP", "regexpParser", "RegExpParser", "TerminalRegExpVisitor", "BaseRegExpVisitor", "__name", "regex", "node", "char", "escapedChar", "escapeRegExp", "set", "visitor", "getTerminalParts", "regexp", "pattern", "parts", "alternative", "isMultilineComment", "whitespaceCharacters", "isWhitespace", "value", "ws", "getCaseInsensitivePattern", "keyword", "letter", "partialMatches", "input", "partial", "partialRegExp", "match", "re", "source", "i", "process", "result", "tmp", "appendRaw", "nbChars", "appendOptional", "getEntryRule", "grammar", "isParserRule", "__name", "getHiddenRules", "isTerminalRule", "getAllReachableRules", "allTerminals", "ruleNames", "entryRule", "topMostRules", "rule", "ruleDfs", "rules", "visitedSet", "streamAllContents", "node", "isRuleCall", "isTerminalRuleCall", "refRule", "getCrossReferenceTerminal", "crossRef", "nameAssigment", "findNameAssignment", "isCommentTerminal", "terminalRule", "isWhitespace", "terminalRegex", "findNodesForProperty", "property", "findNodesForPropertyInternal", "findNodeForProperty", "index", "nodes", "element", "first", "nodeFeature", "getContainerOfType", "isAssignment", "isCompositeCstNode", "e", "findNodesForKeyword", "keyword", "findNodesForKeywordInternal", "findNodeForKeyword", "isKeyword", "treeIterator", "streamCst", "result", "keywordNodes", "childNode", "findAssignment", "cstNode", "astNode", "_a", "assignment", "type", "startNode", "isInferredType", "isAction", "assertUnreachable", "findNameAssignmentInternal", "cache", "go", "refType", "childAssignment", "isSimpleType", "getActionAtElement", "parent", "isGroup", "elements", "item", "action", "isAbstractElement", "isOptionalCardinality", "cardinality", "isArrayCardinality", "isArrayOperator", "operator", "isDataTypeRule", "isDataTypeRuleInternal", "visited", "isDataType", "isDataTypeInternal", "isArrayType", "isReferenceType", "isUnionType", "ref", "isType", "getExplicitRuleType", "isInterface", "getTypeName", "isReturnType", "actionType", "getActionType", "getRuleTypeName", "_b", "_c", "getRuleType", "flags", "source", "abstractElementToRegex", "flagText", "value", "name", "WILDCARD", "isTerminalAlternatives", "terminalAlternativesToRegex", "isTerminalGroup", "terminalGroupToRegex", "isCharacterRange", "characterRangeToRegex", "withCardinality", "isNegatedToken", "negateTokenToRegex", "isUntilToken", "untilTokenToRegex", "isRegexToken", "lastSlash", "regexFlags", "isWildcard", "alternatives", "group", "until", "negate", "range", "keywordToRegex", "escapeRegExp", "regex", "options", "createGrammarConfig", "services", "rules", "grammar", "rule", "isTerminalRule", "isCommentTerminal", "isMultilineComment", "terminalRegex", "DefaultNameRegexp", "__name", "PRINT_ERROR", "msg", "__name", "PRINT_WARNING", "timer", "func", "start", "val", "__name", "toFastProperties", "toBecomeFast", "FakeConstructor", "__name", "fakeInstance", "fakeAccess", "tokenLabel", "tokType", "hasTokenLabel", "__name", "obj", "isString_default", "AbstractProduction", "value", "_definition", "visitor", "forEach_default", "prod", "NonTerminal", "options", "assign_default", "pickBy_default", "v", "definition", "Rule", "Alternative", "Option", "RepetitionMandatory", "RepetitionMandatoryWithSeparator", "Repetition", "RepetitionWithSeparator", "Alternation", "Terminal", "serializeGrammar", "topRules", "map_default", "serializeProduction", "node", "convertDefinition", "serializedNonTerminal", "serializedTerminal", "pattern", "isRegExp_default", "GAstVisitor", "__name", "node", "nodeAny", "NonTerminal", "Alternative", "Option", "RepetitionMandatory", "RepetitionMandatoryWithSeparator", "RepetitionWithSeparator", "Repetition", "Alternation", "Terminal", "Rule", "isSequenceProd", "prod", "Alternative", "Option", "Repetition", "RepetitionMandatory", "RepetitionMandatoryWithSeparator", "RepetitionWithSeparator", "Terminal", "Rule", "__name", "isOptionalProd", "alreadyVisited", "Alternation", "some_default", "subProd", "NonTerminal", "includes_default", "AbstractProduction", "every_default", "isBranchingProd", "getProductionDslName", "RestWalker", "__name", "prod", "prevRest", "forEach_default", "subProd", "index", "currRest", "drop_default", "NonTerminal", "Terminal", "Alternative", "Option", "RepetitionMandatory", "RepetitionMandatoryWithSeparator", "RepetitionWithSeparator", "Repetition", "Alternation", "terminal", "refProd", "flatProd", "fullOrRest", "optionProd", "atLeastOneProd", "fullAtLeastOneRest", "atLeastOneSepProd", "fullAtLeastOneSepRest", "restForRepetitionWithSeparator", "manyProd", "fullManyRest", "manySepProd", "fullManySepRest", "orProd", "alt", "prodWrapper", "repSepProd", "first", "prod", "NonTerminal", "Terminal", "firstForTerminal", "isSequenceProd", "firstForSequence", "isBranchingProd", "firstForBranching", "__name", "firstSet", "seq", "nextSubProdIdx", "hasInnerProdsRemaining", "currSubProd", "isLastInnerProdOptional", "isOptionalProd", "uniq_default", "allAlternativesFirsts", "map_default", "innerProd", "flatten_default", "terminal", "IN", "ResyncFollowsWalker", "RestWalker", "__name", "topProd", "terminal", "currRest", "prevRest", "refProd", "followName", "buildBetweenProdsFollowPrefix", "fullRest", "restProd", "Alternative", "t_in_topProd_follows", "first", "computeAllProdsFollows", "topProductions", "reSyncFollows", "forEach_default", "currRefsFollow", "assign_default", "inner", "occurenceInParent", "IN", "regExpAstCache", "regExpParser", "RegExpParser", "getRegExpAst", "regExp", "regExpStr", "regExpAst", "__name", "clearRegExpParserCache", "complementErrorMessage", "failedOptimizationPrefixMsg", "getOptimizedStartCodesIndices", "regExp", "ensureOptimizations", "ast", "getRegExpAst", "firstCharOptimizedIndices", "e", "PRINT_WARNING", "msgSuffix", "PRINT_ERROR", "__name", "result", "ignoreCase", "terms", "term", "atom", "addOptimizedIdxToResult", "forEach_default", "code", "range", "rangeCode", "minOptimizationVal", "minUnOptVal", "maxUnOptVal", "minOptIdx", "charCodeToOptimizedIndex", "maxOptIdx", "currOptIdx", "isOptionalQuantifier", "isWholeOptional", "values_default", "optimizedCharIdx", "handleIgnoreCase", "char", "upperChar", "lowerChar", "findCode", "setNode", "targetCharCodes", "find_default", "codeOrRange", "includes_default", "targetCode", "quantifier", "isArray_default", "every_default", "CharCodeFinder", "BaseRegExpVisitor", "node", "canMatchCharCode", "charCodes", "pattern", "charCodeFinder", "PATTERN", "DEFAULT_MODE", "MODES", "SUPPORT_STICKY", "analyzeTokenTypes", "tokenTypes", "options", "defaults_default", "SUPPORT_STICKY", "__name", "msg", "action", "tracer", "initCharCodeToOptimizedIndexMap", "onlyRelevantTypes", "reject_default", "currType", "PATTERN", "Lexer", "hasCustom", "allTransformedPatterns", "map_default", "currPattern", "isRegExp_default", "regExpSource", "includes_default", "addStickyFlag", "addStartOfInput", "isFunction_default", "escapedRegExpString", "wrappedRegExp", "patternIdxToType", "patternIdxToGroup", "patternIdxToLongerAltIdxArr", "patternIdxToPushMode", "patternIdxToPopMode", "clazz", "groupName", "isString_default", "isUndefined_default", "longerAltType", "isArray_default", "type", "indexOf_default", "has_default", "patternIdxToCanLineTerminator", "lineTerminatorCharCodes", "getCharCodes", "tokType", "checkLineBreaksIssues", "canMatchCharCode", "patternIdxToIsCustom", "patternIdxToShort", "emptyGroups", "patternIdxToConfig", "isCustomPattern", "isShortPattern", "reduce_default", "acc", "x", "idx", "canBeOptimized", "charCodeToPatternIdxToConfig", "result", "currTokType", "charCode", "optimizedIdx", "charCodeToOptimizedIndex", "addToMapOfArrays", "lastOptimizedIdx", "forEach_default", "charOrInt", "currOptimizedIdx", "PRINT_ERROR", "failedOptimizationPrefixMsg", "optimizedCodes", "getOptimizedStartCodesIndices", "isEmpty_default", "code", "validatePatterns", "validModesNames", "errors", "missingResult", "findMissingPatterns", "invalidResult", "findInvalidPatterns", "validTokenTypes", "validateRegExpPattern", "findInvalidGroupType", "findModesThatDoNotExist", "findUnreachablePatterns", "withRegExpPatterns", "filter_default", "findEndOfInputAnchor", "findStartOfInputAnchor", "findUnsupportedFlags", "findDuplicatePatterns", "findEmptyMatchRegExps", "tokenTypesWithMissingPattern", "LexerDefinitionErrorType", "valid", "difference_default", "tokenTypesWithInvalidPattern", "pattern", "end_of_input", "EndAnchorFinder", "BaseRegExpVisitor", "node", "invalidRegex", "regexpAst", "getRegExpAst", "endAnchorVisitor", "matchesEmptyString", "start_of_input", "StartAnchorFinder", "startAnchorVisitor", "invalidFlags", "found", "identicalPatterns", "outerType", "innerType", "compact_default", "duplicatePatterns", "currIdenticalSet", "setOfIdentical", "tokenTypeNames", "head_default", "invalidTypes", "group", "validModes", "invalidModes", "canBeTested", "noMetaChar", "testIdx", "str", "tokenType", "testTokenType", "regExpArray", "regExp", "find_default", "char", "flags", "performRuntimeChecks", "lexerDefinition", "trackLines", "lineTerminatorCharacters", "DEFAULT_MODE", "MODES", "currModeValue", "currModeName", "currIdx", "longerAlt", "currLongerAlt", "performWarningRuntimeChecks", "warnings", "hasAnyLineBreak", "allTokenTypes", "flatten_default", "values_default", "concreteTokenTypes", "terminatorCharCodes", "currIssue", "warningDescriptor", "buildLineBreakIssueMessage", "cloneEmptyGroups", "clonedResult", "groupKeys", "keys_default", "currKey", "currGroupValue", "LineTerminatorOptimizedTester", "text", "len", "i", "c", "e", "details", "charsOrCodes", "numOrString", "map", "key", "value", "minOptimizationVal", "charCodeToOptimizedIdxMap", "tokenStructuredMatcher", "tokInstance", "tokConstructor", "instanceType", "__name", "tokenStructuredMatcherNoCategories", "token", "tokType", "tokenShortNameIdx", "tokenIdxToClass", "augmentTokenTypes", "tokenTypes", "tokenTypesAndParents", "expandCategories", "assignTokenDefaultProps", "assignCategoriesMapProp", "assignCategoriesTokensProp", "forEach_default", "result", "clone_default", "categories", "searching", "compact_default", "flatten_default", "map_default", "currTokType", "newCategories", "difference_default", "isEmpty_default", "hasShortKeyProperty", "hasCategoriesProperty", "isArray_default", "hasExtendingTokensTypesProperty", "hasExtendingTokensTypesMapProperty", "val", "key", "singleAssignCategoriesToksMap", "path", "nextNode", "pathNode", "nextCategory", "newPath", "includes_default", "has_default", "isTokenType", "defaultLexerErrorProvider", "token", "fullText", "startOffset", "length", "line", "column", "LexerDefinitionErrorType", "DEFAULT_LEXER_CONFIG", "defaultLexerErrorProvider", "Lexer", "__name", "lexerDefinition", "config", "phaseDesc", "phaseImpl", "indent", "time", "value", "timer", "traceMethod", "assign_default", "traceInitVal", "actualDefinition", "hasOnlySingleMode", "LineTerminatorOptimizedTester", "isArray_default", "clone_default", "DEFAULT_MODE", "performRuntimeChecks", "performWarningRuntimeChecks", "forEach_default", "currModeValue", "currModeName", "reject_default", "currTokType", "isUndefined_default", "allModeNames", "keys_default", "currModDef", "currModName", "validatePatterns", "isEmpty_default", "augmentTokenTypes", "currAnalyzeResult", "analyzeTokenTypes", "allErrMessagesString", "map_default", "error", "warningDescriptor", "PRINT_WARNING", "SUPPORT_STICKY", "identity_default", "noop_default", "unOptimizedModes", "reduce_default", "cannotBeOptimized", "canBeOptimized", "modeName", "clearRegExpParserCache", "toFastProperties", "text", "initialMode", "i", "j", "k", "matchAltImage", "longerAlt", "matchedImage", "payload", "altPayload", "imageLength", "group", "tokType", "newToken", "errLength", "droppedChar", "msg", "match", "orgText", "orgLength", "offset", "matchedTokensIndex", "guessedNumberOfTokens", "matchedTokens", "errors", "line", "column", "groups", "cloneEmptyGroups", "trackLines", "lineTerminatorPattern", "currModePatternsLength", "patternIdxToConfig", "currCharCodeToPatternIdxToConfig", "modeStack", "emptyArray", "getPossiblePatterns", "getPossiblePatternsSlow", "getPossiblePatternsOptimized", "charCode", "optimizedCharIdx", "charCodeToOptimizedIndex", "possiblePatterns", "pop_mode", "popToken", "newMode", "last_default", "modeCanBeOptimized", "push_mode", "currConfig", "recoveryEnabled", "nextCharCode", "chosenPatternIdxToConfig", "chosenPatternsLength", "currPattern", "singleCharCode", "longerAltLength", "longerAltConfig", "longerAltPattern", "numOfLTsInMatch", "foundTerminator", "lastLTEndOffset", "errorStartOffset", "errorLine", "errorColumn", "foundResyncPoint", "pushMode", "length", "regExp", "newLastIndex", "lastLTIdx", "lastCharIsLT", "fixForEndingInLT", "oldColumn", "image", "startOffset", "tokenTypeIdx", "tokenType", "startLine", "startColumn", "tokenVector", "index", "tokenToAdd", "token", "pattern", "regExpArray", "tokenLabel", "tokType", "hasTokenLabel", "__name", "hasTokenLabel", "obj", "isString_default", "__name", "PARENT", "CATEGORIES", "LABEL", "GROUP", "PUSH_MODE", "POP_MODE", "LONGER_ALT", "LINE_BREAKS", "START_CHARS_HINT", "createToken", "config", "createTokenInternal", "pattern", "tokenType", "isUndefined_default", "has_default", "augmentTokenTypes", "EOF", "Lexer", "createTokenInstance", "tokType", "image", "startOffset", "endOffset", "startLine", "endLine", "startColumn", "endColumn", "tokenMatcher", "token", "tokenStructuredMatcher", "defaultParserErrorProvider", "expected", "actual", "previous", "ruleName", "hasTokenLabel", "tokenLabel", "firstRedundant", "expectedPathsPerAlt", "customUserDescription", "errPrefix", "errSuffix", "head_default", "allLookAheadPaths", "reduce_default", "result", "currAltPaths", "nextValidTokenSequences", "map_default", "currPath", "currTokenType", "calculatedDescription", "itemMsg", "idx", "expectedIterationPaths", "defaultGrammarResolverErrorProvider", "topLevelRule", "undefinedRule", "defaultGrammarValidatorErrorProvider", "duplicateProds", "getExtraProductionArgument", "prod", "Terminal", "NonTerminal", "__name", "topLevelName", "duplicateProd", "index", "dslName", "getProductionDslName", "extraArgument", "hasExplicitIndex", "msg", "rule", "options", "pathMsg", "currTok", "occurrence", "currtok", "currMessage", "pathNames", "currRule", "leftRecursivePath", "Rule", "resolveGrammar", "topLevels", "errMsgProvider", "refResolver", "GastRefResolverVisitor", "__name", "GAstVisitor", "nameToTopRule", "forEach_default", "values_default", "prod", "node", "ref", "msg", "ParserDefinitionErrorType", "AbstractNextPossibleTokensWalker", "RestWalker", "__name", "topProd", "path", "clone_default", "prod", "prevRest", "refProd", "currRest", "fullRest", "isEmpty_default", "NextAfterTokenWalker", "terminal", "restProd", "Alternative", "first", "AbstractNextTerminalAfterProductionWalker", "topRule", "occurrence", "NextTerminalAfterManyWalker", "manyProd", "firstAfterMany", "head_default", "Terminal", "NextTerminalAfterManySepWalker", "manySepProd", "firstAfterManySep", "NextTerminalAfterAtLeastOneWalker", "atLeastOneProd", "firstAfterAtLeastOne", "NextTerminalAfterAtLeastOneSepWalker", "atleastOneSepProd", "firstAfterfirstAfterAtLeastOneSep", "possiblePathsFrom", "targetDef", "maxLength", "currPath", "result", "remainingPathWith", "nextDef", "drop_default", "getAlternativesForProd", "definition", "alternatives", "NonTerminal", "Option", "RepetitionMandatory", "newDef", "Repetition", "RepetitionMandatoryWithSeparator", "RepetitionWithSeparator", "Alternation", "forEach_default", "currAlt", "nextPossibleTokensAfter", "initialDef", "tokenVector", "tokMatcher", "maxLookAhead", "EXIT_NON_TERMINAL", "EXIT_NON_TERMINAL_ARR", "EXIT_ALTERNATIVE", "foundCompletePath", "tokenVectorLength", "minimalAlternativesIndex", "possiblePaths", "last_default", "currDef", "currIdx", "currRuleStack", "currOccurrenceStack", "nextPath", "dropRight_default", "nextIdx", "actualToken", "newRuleStack", "newOccurrenceStack", "nextPathWithout", "nextPathWith", "secondIteration", "separatorGast", "nthRepetition", "i", "currAltPath", "Rule", "expandTopLevelRule", "newCurrOccurrenceStack", "PROD_TYPE", "getProdType", "prod", "Option", "Repetition", "RepetitionMandatory", "RepetitionMandatoryWithSeparator", "RepetitionWithSeparator", "Alternation", "__name", "getLookaheadPaths", "options", "occurrence", "rule", "prodType", "maxLookahead", "type", "getLookaheadPathsForOr", "getLookaheadPathsForOptionalProd", "buildLookaheadFuncForOr", "ruleGrammar", "hasPredicates", "dynamicTokensEnabled", "laFuncBuilder", "lookAheadPaths", "tokenMatcher", "areTokenCategoriesNotUsed", "tokenStructuredMatcherNoCategories", "tokenStructuredMatcher", "buildLookaheadFuncForOptionalProd", "k", "lookaheadBuilder", "buildAlternativesLookAheadFunc", "alts", "numOfAlts", "areAllOneTokenLookahead", "every_default", "currAlt", "currPath", "orAlts", "predicates", "map_default", "t", "currNumOfPaths", "currPredicate", "nextPath", "j", "currPathLength", "i", "nextToken", "singleTokenAlts", "flatten_default", "choiceToAlt", "reduce_default", "result", "idx", "forEach_default", "currTokType", "has_default", "currExtendingType", "buildSingleAlternativeLookaheadFunction", "alt", "numOfPaths", "singleTokensTypes", "isEmpty_default", "expectedTokenUniqueKey", "RestDefinitionFinderWalker", "RestWalker", "topProd", "targetOccurrence", "targetProdType", "node", "expectedProdType", "currRest", "prevRest", "optionProd", "atLeastOneProd", "atLeastOneSepProd", "manyProd", "manySepProd", "InsideDefinitionFinderVisitor", "GAstVisitor", "targetRef", "expectedProdName", "initializeArrayOfArrays", "size", "pathToHashKeys", "path", "keys", "tokType", "longerKeys", "currShorterKey", "categoriesKeySuffix", "isUniquePrefixHash", "altKnownPathsKeys", "searchPathKeys", "currAltIdx", "otherAltKnownPathsKeys", "searchIdx", "searchKey", "lookAheadSequenceFromAlternatives", "altsDefs", "partialAlts", "possiblePathsFrom", "finalResult", "altsHashes", "currAltPaths", "dict", "item", "currKey", "newData", "pathLength", "currDataset", "altIdx", "currAltPathsAndSuffixes", "currPathIdx", "currPathPrefix", "suffixDef", "prefixKeys", "currAltResult", "containsPath", "newPartialPathsAndSuffixes", "key", "orProd", "visitor", "insideDefVisitor", "insideDef", "afterDef", "insideFlat", "Alternative", "afterFlat", "alternative", "searchPath", "compareOtherPath", "otherPath", "searchTok", "otherTok", "isStrictPrefixOfPath", "prefix", "other", "otherTokType", "singleAltPaths", "singlePath", "token", "validateLookahead", "options", "lookaheadValidationErrorMessages", "map_default", "errorMessage", "ParserDefinitionErrorType", "__name", "validateGrammar", "topLevels", "tokenTypes", "errMsgProvider", "grammarName", "duplicateErrors", "flatMap_default", "currTopLevel", "validateDuplicateProductions", "termsNamespaceConflictErrors", "checkTerminalAndNoneTerminalsNameSpace", "tooManyAltsErrors", "curRule", "validateTooManyAlts", "duplicateRulesError", "validateRuleDoesNotAlreadyExist", "topLevelRule", "collectorVisitor", "OccurrenceValidationCollector", "allRuleProductions", "productionGroups", "groupBy_default", "identifyProductionForDuplicates", "duplicates", "pickBy_default", "currGroup", "values_default", "currDuplicates", "firstProd", "head_default", "msg", "dslName", "getProductionDslName", "defError", "param", "getExtraProductionArgument", "prod", "Terminal", "NonTerminal", "GAstVisitor", "subrule", "option", "manySep", "atLeastOne", "atLeastOneSep", "many", "or", "terminal", "rule", "allRules", "className", "errors", "reduce_default", "result", "errMsg", "validateRuleIsOverridden", "ruleName", "definedRulesNames", "includes_default", "validateNoLeftRecursion", "topRule", "currRule", "path", "nextNonTerminals", "getFirstNoneTerminal", "isEmpty_default", "validNextSteps", "difference_default", "errorsFromNextSteps", "currRefRule", "newPath", "clone_default", "definition", "Alternative", "Option", "RepetitionMandatory", "RepetitionMandatoryWithSeparator", "RepetitionWithSeparator", "Repetition", "Alternation", "flatten_default", "currSubDef", "isFirstOptional", "isOptionalProd", "hasMore", "rest", "drop_default", "OrCollector", "node", "validateEmptyOrAlternative", "orCollector", "ors", "currOr", "exceptLast", "dropRight_default", "currAlternative", "currAltIdx", "possibleFirstInAlt", "nextPossibleTokensAfter", "tokenStructuredMatcher", "validateAmbiguousAlternationAlternatives", "globalMaxLookahead", "reject_default", "currOccurrence", "actualMaxLookahead", "alternatives", "getLookaheadPathsForOr", "altsAmbiguityErrors", "checkAlternativesAmbiguities", "altsPrefixAmbiguityErrors", "checkPrefixAlternativesAmbiguities", "RepetitionCollector", "validateSomeNonEmptyLookaheadPath", "topLevelRules", "maxLookahead", "forEach_default", "currTopRule", "currProd", "prodType", "getProdType", "pathsInsideProduction", "getLookaheadPathsForOptionalProd", "alternation", "foundAmbiguousPaths", "identicalAmbiguities", "currAlt", "currPath", "altsCurrPathAppearsIn", "currOtherAlt", "currOtherAltIdx", "containsPath", "currAmbDescriptor", "ambgIndices", "pathsAndIndices", "idx", "currPathsAndIdx", "compact_default", "currPathAndIdx", "targetIdx", "targetPath", "prefixAmbiguitiesPathsAndIndices", "filter_default", "searchPathAndIdx", "isStrictPrefixOfPath", "currAmbPathAndIdx", "occurrence", "tokenNames", "currToken", "currRuleName", "resolveGrammar", "options", "actualOptions", "defaults_default", "defaultGrammarResolverErrorProvider", "topRulesTable", "forEach_default", "rule", "__name", "validateGrammar", "defaultGrammarValidatorErrorProvider", "MISMATCHED_TOKEN_EXCEPTION", "NO_VIABLE_ALT_EXCEPTION", "EARLY_EXIT_EXCEPTION", "NOT_ALL_INPUT_PARSED_EXCEPTION", "RECOGNITION_EXCEPTION_NAMES", "isRecognitionException", "error", "includes_default", "__name", "RecognitionException", "message", "token", "MismatchedTokenException", "previousToken", "NoViableAltException", "NotAllInputParsedException", "EarlyExitException", "EOF_FOLLOW_KEY", "IN_RULE_RECOVERY_EXCEPTION", "InRuleRecoveryException", "__name", "message", "Recoverable", "config", "has_default", "DEFAULT_PARSER_CONFIG", "attemptInRepetitionRecovery", "tokType", "tokToInsert", "createTokenInstance", "grammarRule", "grammarRuleArgs", "lookAheadFunc", "expectedTokType", "reSyncTokType", "savedLexerState", "resyncedTokens", "passedResyncPoint", "nextTokenWithoutResync", "currToken", "generateErrorMessage", "previousToken", "msg", "error", "MismatchedTokenException", "dropRight_default", "expectTokAfterLastMatch", "nextTokIdx", "notStuck", "tokIdxInRule", "grammarPath", "follows", "nextTok", "expectedToken", "isEmpty_default", "mismatchedTok", "find_default", "possibleFollowsTokType", "tokenTypeIdx", "followKey", "currentRuleReSyncSet", "includes_default", "allPossibleReSyncTokTypes", "nextToken", "k", "foundMatch", "resyncTokType", "tokenMatcher", "currRuleShortName", "currRuleIdx", "prevRuleShortName", "explicitRuleStack", "explicitOccurrenceStack", "map_default", "ruleName", "idx", "followStack", "currKey", "flatten_default", "EOF", "followName", "IN", "token", "resyncTokens", "prodFunc", "args", "lookaheadFunc", "dslMethodIdx", "prodOccurrence", "nextToksWalker", "pathRuleStack", "pathOccurrenceStack", "clone_default", "currShortName", "key", "firstAfterRepInfo", "currRuleName", "ruleGrammar", "isEndOfRule", "getKeyForAutomaticLookahead", "ruleIdx", "dslMethodIdx", "occurrence", "__name", "LLkLookaheadStrategy", "__name", "options", "_a", "DEFAULT_PARSER_CONFIG", "leftRecursionErrors", "isEmpty_default", "emptyAltErrors", "ambiguousAltsErrors", "emptyRepetitionErrors", "rules", "flatMap_default", "currTopRule", "validateNoLeftRecursion", "defaultGrammarValidatorErrorProvider", "validateEmptyOrAlternative", "maxLookahead", "validateAmbiguousAlternationAlternatives", "validateSomeNonEmptyLookaheadPath", "buildLookaheadFuncForOr", "buildAlternativesLookAheadFunc", "buildLookaheadFuncForOptionalProd", "getProdType", "buildSingleAlternativeLookaheadFunction", "LooksAhead", "__name", "config", "has_default", "DEFAULT_PARSER_CONFIG", "LLkLookaheadStrategy", "rules", "forEach_default", "currRule", "alternation", "repetition", "option", "repetitionMandatory", "repetitionMandatoryWithSeparator", "repetitionWithSeparator", "collectMethods", "currProd", "prodIdx", "getProductionDslName", "laFunc", "key", "getKeyForAutomaticLookahead", "rule", "prodOccurrence", "prodKey", "prodType", "prodMaxLookahead", "dslMethodName", "dslMethodIdx", "occurrence", "currRuleShortName", "value", "DslMethodsCollectorVisitor", "GAstVisitor", "manySep", "atLeastOne", "atLeastOneSep", "many", "or", "collectorVisitor", "dslMethods", "setNodeLocationOnlyOffset", "currNodeLocation", "newLocationInfo", "__name", "setNodeLocationFull", "addTerminalToCst", "node", "token", "tokenTypeName", "addNoneTerminalToCst", "ruleName", "ruleResult", "NAME", "defineNameProp", "obj", "nameValue", "__name", "defaultVisit", "ctx", "param", "childrenNames", "keys_default", "childrenNamesLength", "currChildName", "currChildArray", "currChildArrayLength", "j", "currChild", "__name", "createBaseSemanticVisitorConstructor", "grammarName", "ruleNames", "derivedConstructor", "defineNameProp", "semanticProto", "cstNode", "isArray_default", "isUndefined_default", "semanticDefinitionErrors", "validateVisitor", "isEmpty_default", "errorMessages", "map_default", "currDefError", "createBaseVisitorConstructorWithDefaults", "baseConstructor", "withDefaultsProto", "forEach_default", "ruleName", "CstVisitorDefinitionError", "visitorInstance", "validateMissingCstMethods", "missingRuleNames", "filter_default", "currRuleName", "isFunction_default", "errors", "compact_default", "TreeBuilder", "__name", "config", "has_default", "DEFAULT_PARSER_CONFIG", "noop_default", "setNodeLocationFull", "setNodeLocationOnlyOffset", "cstNode", "nextToken", "fullRuleName", "ruleCstNode", "prevToken", "loc", "key", "consumedToken", "rootCst", "addTerminalToCst", "ruleCstResult", "ruleName", "preCstNode", "addNoneTerminalToCst", "isUndefined_default", "newBaseCstVisitorConstructor", "createBaseSemanticVisitorConstructor", "keys_default", "newConstructor", "createBaseVisitorConstructorWithDefaults", "ruleStack", "occurrenceStack", "LexerAdapter", "__name", "newInput", "END_OF_FILE", "howMuch", "soughtIdx", "newState", "RecognizerApi", "__name", "impl", "idx", "tokType", "options", "ruleToCall", "actionORMethodDef", "altsOrOpts", "name", "implementation", "config", "DEFAULT_RULE_CONFIG", "includes_default", "error", "defaultGrammarValidatorErrorProvider", "ParserDefinitionErrorType", "ruleImplementation", "ruleErrors", "validateRuleIsOverridden", "grammarRule", "args", "orgState", "e", "isRecognitionException", "serializeGrammar", "values_default", "RecognizerEngine", "__name", "tokenVocabulary", "config", "tokenStructuredMatcherNoCategories", "has_default", "isArray_default", "isEmpty_default", "reduce_default", "acc", "tokType", "every_default", "flatten_default", "values_default", "isTokenType", "allTokenTypes", "uniqueTokens", "uniq_default", "isObject_default", "clone_default", "EOF", "noTokenCategoriesUsed", "tokenConstructor", "tokenStructuredMatcher", "augmentTokenTypes", "ruleName", "impl", "resyncEnabled", "DEFAULT_RULE_CONFIG", "recoveryValueFunc", "shortName", "invokeRuleWithTry", "args", "cst", "e", "resyncEnabledConfig", "isFirstInvokedRule", "reSyncEnabled", "isRecognitionException", "recogError", "reSyncTokType", "partialCstResult", "actionORMethodDef", "occurrence", "key", "lookAheadFunc", "action", "predicate", "orgLookaheadFunction", "prodOccurrence", "laKey", "notStuck", "PROD_TYPE", "NextTerminalAfterAtLeastOneWalker", "options", "separator", "separatorLookAheadFunc", "NextTerminalAfterAtLeastOneSepWalker", "lookaheadFunction", "NextTerminalAfterManyWalker", "NextTerminalAfterManySepWalker", "nextTerminalAfterWalker", "beforeIteration", "altsOrOpts", "alts", "altIdxToTake", "firstRedundantTok", "errMsg", "NotAllInputParsedException", "ruleToCall", "idx", "ruleResult", "consumedToken", "nextToken", "eFromConsumption", "msg", "previousToken", "MismatchedTokenException", "follows", "eFromInRuleRecovery", "IN_RULE_RECOVERY_EXCEPTION", "savedErrors", "savedRuleStack", "newState", "fullName", "idxInCallingRule", "ErrorHandler", "__name", "config", "has_default", "DEFAULT_PARSER_CONFIG", "error", "isRecognitionException", "clone_default", "newErrors", "occurrence", "prodType", "userDefinedErrMsg", "ruleName", "ruleGrammar", "insideProdPaths", "getLookaheadPathsForOptionalProd", "actualTokens", "i", "msg", "EarlyExitException", "errMsgTypes", "lookAheadPathsPerAlternative", "getLookaheadPathsForOr", "previousToken", "errMsg", "NoViableAltException", "ContentAssist", "__name", "startRuleName", "precedingInput", "startRuleGast", "isUndefined_default", "nextPossibleTokensAfter", "grammarPath", "topRuleName", "head_default", "topProduction", "NextAfterTokenWalker", "RECORDING_NULL_OBJECT", "HANDLE_SEPARATOR", "MAX_METHOD_IDX", "RFT", "createToken", "Lexer", "augmentTokenTypes", "RECORDING_PHASE_TOKEN", "createTokenInstance", "RECORDING_PHASE_CSTNODE", "GastRecorder", "__name", "config", "i", "idx", "arg1", "arg2", "that", "impl", "grammarRule", "args", "howMuch", "END_OF_FILE", "name", "def", "newTopLevelRule", "Rule", "originalError", "actionORMethodDef", "occurrence", "recordProd", "Option", "RepetitionMandatory", "options", "RepetitionMandatoryWithSeparator", "Repetition", "RepetitionWithSeparator", "altsOrOpts", "recordOrProd", "ruleToCall", "assertMethodIdxIsValid", "has_default", "error", "getIdxSuffix", "prevProd", "last_default", "ruleName", "newNoneTerminal", "NonTerminal", "tokType", "hasShortKeyProperty", "Terminal", "prodConstructor", "mainProdArg", "handleSep", "grammarAction", "isFunction_default", "newProd", "hasOptions", "isArray_default", "alts", "newOrProd", "Alternation", "hasPredicates", "some_default", "currAlt", "forEach_default", "currAltFlat", "Alternative", "PerformanceTracer", "__name", "config", "has_default", "userTraceInitPerf", "traceIsNumber", "DEFAULT_PARSER_CONFIG", "phaseDesc", "phaseImpl", "indent", "time", "value", "timer", "traceMethod", "applyMixins", "derivedCtor", "baseCtors", "baseCtor", "baseProto", "propName", "basePropDescriptor", "__name", "END_OF_FILE", "createTokenInstance", "EOF", "DEFAULT_PARSER_CONFIG", "defaultParserErrorProvider", "DEFAULT_RULE_CONFIG", "__name", "ParserDefinitionErrorType", "EMPTY_ALT", "value", "Parser", "_Parser", "parserInstance", "defErrorsMsgs", "className", "toFastProperties", "forEach_default", "currRuleName", "originalGrammarAction", "recordedRuleGast", "resolverErrors", "resolveGrammar", "values_default", "isEmpty_default", "validationErrors", "validateGrammar", "defaultGrammarValidatorErrorProvider", "lookaheadValidationErrors", "validateLookahead", "allFollows", "computeAllProdsFollows", "_b", "_a", "map_default", "defError", "tokenVocabulary", "config", "that", "has_default", "applyMixins", "Recoverable", "LooksAhead", "TreeBuilder", "LexerAdapter", "RecognizerEngine", "RecognizerApi", "ErrorHandler", "ContentAssist", "GastRecorder", "PerformanceTracer", "EmbeddedActionsParser", "Parser", "__name", "tokenVocabulary", "config", "DEFAULT_PARSER_CONFIG", "configClone", "clone_default", "buildATNKey", "rule", "type", "occurrence", "__name", "ATN_BASIC", "ATN_RULE_START", "ATN_PLUS_BLOCK_START", "ATN_STAR_BLOCK_START", "ATN_RULE_STOP", "ATN_BLOCK_END", "ATN_STAR_LOOP_BACK", "ATN_STAR_LOOP_ENTRY", "ATN_PLUS_LOOP_BACK", "ATN_LOOP_END", "AbstractTransition", "__name", "target", "AtomTransition", "tokenType", "EpsilonTransition", "RuleTransition", "ruleStart", "rule", "followState", "createATN", "rules", "atn", "createRuleStartAndStopATNStates", "ruleLength", "i", "ruleBlock", "block", "buildRuleHandle", "start", "newState", "ATN_RULE_START", "stop", "atom", "production", "Terminal", "tokenRef", "NonTerminal", "ruleRef", "Alternation", "alternation", "Option", "option", "Repetition", "repetition", "RepetitionWithSeparator", "repetitionSep", "RepetitionMandatory", "repetitionMandatory", "RepetitionMandatoryWithSeparator", "repetitionMandatorySep", "starState", "ATN_STAR_BLOCK_START", "defineDecisionState", "handle", "makeAlts", "star", "sep", "plusState", "ATN_PLUS_BLOCK_START", "plus", "ATN_BASIC", "alts", "map_default", "e", "optional", "handles", "filter_default", "makeBlock", "blkStart", "blkEnd", "loop", "end", "buildATNKey", "epsilon", "entry", "loopEnd", "state", "alt", "getProdType", "altsLength", "transition", "isRuleTransition", "ruleTransition", "next", "removeState", "first", "last", "left", "right", "addTransition", "currentRule", "nonTerminal", "call", "a", "b", "partial", "t", "DFA_ERROR", "ATNConfigSet", "__name", "config", "key", "getATNConfigKey", "map_default", "value", "k", "alt", "e", "createDFACache", "startState", "decision", "map", "predicateSet", "key", "existing", "__name", "PredicateSet", "index", "value", "size", "i", "EMPTY_PREDICATES", "LLStarLookaheadStrategy", "LLkLookaheadStrategy", "options", "_a", "message", "createATN", "initATNSimulator", "prodOccurrence", "rule", "hasPredicates", "dynamicTokensEnabled", "dfas", "logging", "buildATNKey", "decisionIndex", "partialAlts", "map_default", "getLookaheadPaths", "currAlt", "path", "isLL1Sequence", "choiceToAlt", "reduce_default", "result", "idx", "forEach_default", "currTokType", "currExtendingType", "orAlts", "nextToken", "prediction", "gate", "predicates", "length", "adaptivePredict", "prodType", "alts", "e", "g", "alt", "singleTokensTypes", "flatten_default", "isEmpty_default", "expectedTokenUniqueKey", "sequences", "allowEmpty", "fullSet", "altSet", "tokType", "indices", "atn", "decisionLength", "decisionToDFA", "dfaCaches", "dfa", "start", "closure", "computeStartState", "addDFAState", "newDFAState", "performLookahead", "s0", "previousD", "t", "d", "getExistingTargetState", "computeLookaheadTarget", "DFA_ERROR", "buildAdaptivePredictError", "token", "lookahead", "reach", "computeReachSet", "addDFAEdge", "newState", "predictedAlt", "getUniqueAlt", "hasConflictTerminatingPrediction", "min_default", "reportLookaheadAmbiguity", "ambiguityIndices", "prefixPath", "atnState", "topLevelRule", "production", "buildAmbiguityError", "pathMsg", "currtok", "tokenLabel", "occurrence", "currMessage", "getProductionDslName", "prod", "NonTerminal", "Option", "Alternation", "RepetitionMandatory", "RepetitionMandatoryWithSeparator", "RepetitionWithSeparator", "Repetition", "Terminal", "previous", "current", "nextTransitions", "flatMap_default", "nextTokenTypes", "uniqBy_default", "AtomTransition", "state", "configs", "intermediate", "ATNConfigSet", "skippedStopStates", "c", "ATN_RULE_STOP", "transitionLength", "transition", "target", "getReachableTarget", "hasConfigInRuleStopState", "tokenMatcher", "from", "to", "mapKey", "numberOfTransitions", "config", "p", "atnStack", "followConfig", "getEpsilonTarget", "EpsilonTransition", "RuleTransition", "stack", "allConfigsInRuleStopStates", "altSets", "getConflictingAltSets", "hasConflictingAltSet", "hasStateAssociatedWithOneAlt", "configToAlts", "getATNConfigKey", "DocumentUri", "is", "value", "__name", "URI", "integer", "uinteger", "Position", "create", "line", "character", "candidate", "Is", "Range", "one", "two", "three", "four", "Location", "uri", "range", "LocationLink", "targetUri", "targetRange", "targetSelectionRange", "originSelectionRange", "Color", "red", "green", "blue", "alpha", "ColorInformation", "color", "ColorPresentation", "label", "textEdit", "additionalTextEdits", "TextEdit", "FoldingRangeKind", "FoldingRange", "startLine", "endLine", "startCharacter", "endCharacter", "kind", "collapsedText", "result", "DiagnosticRelatedInformation", "location", "message", "DiagnosticSeverity", "DiagnosticTag", "CodeDescription", "Diagnostic", "severity", "code", "source", "relatedInformation", "_a", "Command", "title", "command", "args", "replace", "newText", "insert", "position", "del", "ChangeAnnotation", "needsConfirmation", "description", "ChangeAnnotationIdentifier", "AnnotatedTextEdit", "annotation", "TextDocumentEdit", "textDocument", "edits", "OptionalVersionedTextDocumentIdentifier", "CreateFile", "options", "RenameFile", "oldUri", "newUri", "DeleteFile", "WorkspaceEdit", "change", "TextDocumentIdentifier", "create", "uri", "__name", "is", "value", "candidate", "Is", "VersionedTextDocumentIdentifier", "version", "OptionalVersionedTextDocumentIdentifier", "TextDocumentItem", "languageId", "text", "MarkupKind", "MarkupContent", "CompletionItemKind", "InsertTextFormat", "CompletionItemTag", "InsertReplaceEdit", "newText", "insert", "replace", "Range", "InsertTextMode", "CompletionItemLabelDetails", "CompletionItem", "label", "CompletionList", "items", "isIncomplete", "MarkedString", "fromPlainText", "plainText", "Hover", "ParameterInformation", "documentation", "SignatureInformation", "parameters", "result", "DocumentHighlightKind", "DocumentHighlight", "range", "kind", "SymbolKind", "SymbolTag", "SymbolInformation", "name", "containerName", "WorkspaceSymbol", "DocumentSymbol", "detail", "selectionRange", "children", "CodeActionKind", "CodeActionTriggerKind", "CodeActionContext", "diagnostics", "only", "triggerKind", "Diagnostic", "CodeAction", "title", "kindOrCommandOrEdit", "checkKind", "Command", "WorkspaceEdit", "CodeLens", "data", "FormattingOptions", "tabSize", "insertSpaces", "DocumentLink", "target", "SelectionRange", "parent", "SemanticTokenTypes", "SemanticTokenModifiers", "SemanticTokens", "InlineValueText", "InlineValueVariableLookup", "variableName", "caseSensitiveLookup", "InlineValueEvaluatableExpression", "expression", "InlineValueContext", "frameId", "stoppedLocation", "InlayHintKind", "InlayHintLabelPart", "Location", "InlayHint", "position", "Position", "TextEdit", "StringValue", "createSnippet", "InlineCompletionItem", "insertText", "filterText", "command", "InlineCompletionList", "InlineCompletionTriggerKind", "SelectedCompletionInfo", "InlineCompletionContext", "selectedCompletionInfo", "WorkspaceFolder", "URI", "TextDocument", "create", "uri", "languageId", "version", "content", "FullTextDocument", "__name", "is", "value", "candidate", "Is", "applyEdits", "document", "edits", "text", "sortedEdits", "mergeSort", "a", "b", "diff", "lastModifiedOffset", "i", "e", "startOffset", "endOffset", "data", "compare", "p", "left", "right", "leftIdx", "rightIdx", "range", "start", "end", "event", "lineOffsets", "isLineStart", "ch", "offset", "low", "high", "Position", "mid", "line", "position", "lineOffset", "nextLineOffset", "toString", "defined", "undefined", "boolean", "string", "number", "numberRange", "min", "max", "integer", "uinteger", "func", "objectLiteral", "typedArray", "check", "CstNodeBuilder", "__name", "_a", "input", "RootCstNodeImpl", "feature", "compositeNode", "CompositeCstNodeImpl", "token", "leafNode", "LeafCstNodeImpl", "tokenToRange", "node", "parent", "index", "tokens", "nodes", "current", "added", "item", "AbstractCstNode", "_b", "value", "offset", "length", "range", "tokenType", "hidden", "CstNodeContainer", "firstNode", "lastNode", "firstRange", "lastRange", "Position", "child", "i", "_CstNodeContainer", "items", "start", "count", "DatatypeSymbol", "isDataTypeNode", "node", "__name", "ruleSuffix", "withRuleSuffix", "name", "AbstractLangiumParser", "services", "tokens", "production", "ChevrotainWrapper", "idx", "choices", "callback", "LangiumParser", "CstNodeBuilder", "rule", "impl", "type", "ruleMethod", "isDataTypeRule", "explicit", "getExplicitRuleType", "input", "options", "lexerResult", "result", "$type", "implementation", "args", "createNode", "token", "hiddenTokens", "offset", "tokenType", "feature", "leafNode", "assignment", "isCrossRef", "current", "convertedValue", "isKeyword", "text", "fragment", "cstNode", "subruleResult", "newItem", "action", "last", "obj", "linkContentToContainer", "assignMandatoryProperties", "getContainerOfType", "isAssignment", "isCrossReference", "operator", "value", "item", "target", "source", "existingValue", "newValue", "targetCstNode", "AbstractParserErrorMessageProvider", "defaultParserErrorProvider", "LangiumParserErrorMessageProvider", "expected", "actual", "firstRedundant", "LangiumCompletionParser", "size", "element", "index", "defaultConfig", "EmbeddedActionsParser", "config", "useDefaultLookahead", "LLkLookaheadStrategy", "LLStarLookaheadStrategy", "createParser", "grammar", "parser", "tokens", "buildRules", "__name", "parserContext", "reachable", "getAllReachableRules", "parserRules", "stream", "isParserRule", "rule", "ctx", "buildElement", "element", "ignoreGuard", "method", "isKeyword", "buildKeyword", "isAction", "buildAction", "isAssignment", "isCrossReference", "buildCrossReference", "isRuleCall", "buildRuleCall", "isAlternatives", "buildAlternatives", "isUnorderedGroup", "buildUnorderedGroup", "isGroup", "buildGroup", "isEndOfFile", "idx", "EOF", "ErrorWithLocation", "wrap", "getGuardCondition", "action", "actionType", "getTypeName", "ruleCall", "fragment", "predicate", "buildRuleCallPredicate", "args", "getRule", "isTerminalRule", "getToken", "assertUnreachable", "namedArgs", "predicates", "e", "buildPredicate", "ruleArgs", "i", "ruleTarget", "condition", "isDisjunction", "left", "right", "isConjunction", "isNegation", "value", "isParameterReference", "name", "isBooleanLiteral", "alternatives", "methods", "predicatedMethod", "guard", "alt", "gate", "group", "orIdx", "idFunc", "groupIdx", "lParser", "stackId", "key", "groupState", "trackedAlternatives", "wrapped", "crossRef", "terminal", "terminalRule", "keyword", "assignment", "findNameAssignment", "assignTerminal", "token", "cardinality", "EMPTY_ALT", "getRuleName", "item", "parent", "ruleName", "createCompletionParser", "services", "grammar", "lexer", "parser", "LangiumCompletionParser", "createParser", "__name", "createLangiumParser", "services", "parser", "prepareLangiumParser", "__name", "grammar", "lexer", "LangiumParser", "createParser", "DefaultTokenBuilder", "__name", "grammar", "options", "reachableRules", "stream", "getAllReachableRules", "terminalTokens", "tokens", "terminalToken", "pattern", "isWhitespace", "text", "diagnostics", "rules", "isTerminalRule", "e", "terminal", "regex", "terminalRegex", "tokenType", "Lexer", "stickyRegex", "offset", "isParserRule", "rule", "streamAllContents", "isKeyword", "a", "b", "keyword", "caseInsensitive", "keywordPattern", "getCaseInsensitivePattern", "longerAlts", "token", "partialMatches", "DefaultValueConverter", "__name", "input", "cstNode", "feature", "isCrossReference", "getCrossReferenceTerminal", "isRuleCall", "rule", "ValueConverter", "_a", "getRuleType", "convertString", "result", "i", "c", "c1", "convertEscapeCharacter", "char", "convertID", "convertInt", "convertBigint", "convertDate", "convertNumber", "convertBoolean", "cancellation_exports", "__reExport", "delayNextTick", "resolve", "__name", "lastTick", "globalInterruptionPeriod", "startCancelableOperation", "setInterruptionPeriod", "period", "OperationCancelled", "isOperationCancelled", "err", "interruptAndCheck", "token", "current", "Deferred", "reject", "arg", "FullTextDocument", "_FullTextDocument", "__name", "uri", "languageId", "version", "content", "range", "start", "end", "changes", "change", "getWellformedRange", "startOffset", "endOffset", "startLine", "endLine", "lineOffsets", "addedLineOffsets", "computeLineOffsets", "i", "len", "diff", "offset", "low", "high", "mid", "line", "position", "lineOffset", "nextLineOffset", "isEOL", "event", "candidate", "TextDocument", "create", "update", "document", "applyEdits", "edits", "text", "sortedEdits", "mergeSort", "getWellformedEdit", "a", "b", "lastModifiedOffset", "spans", "e", "data", "compare", "p", "left", "right", "leftIdx", "rightIdx", "isAtLineStart", "textOffset", "result", "ch", "char", "textEdit", "assertPath", "path", "TypeError", "JSON", "stringify", "normalizeStringPosix", "allowAboveRoot", "code", "res", "lastSegmentLength", "lastSlash", "dots", "i", "length", "charCodeAt", "lastSlashIndex", "lastIndexOf", "slice", "posix", "resolve", "__name", "cwd", "resolvedPath", "resolvedAbsolute", "arguments", "process", "normalize", "isAbsolute", "trailingSeparator", "join", "joined", "arg", "relative", "from", "to", "fromStart", "fromEnd", "fromLen", "toStart", "toLen", "lastCommonSep", "fromCode", "out", "_makeLong", "dirname", "hasRoot", "end", "matchedSlash", "basename", "ext", "start", "extIdx", "firstNonSlashEnd", "extname", "startDot", "startPart", "preDotState", "format", "pathObject", "sep", "dir", "root", "base", "name", "parse", "ret", "delimiter", "win32", "module", "exports", "__webpack_module_cache__", "__webpack_require__", "moduleId", "cachedModule", "__webpack_modules__", "d", "definition", "key", "o", "Object", "defineProperty", "enumerable", "get", "obj", "prop", "prototype", "hasOwnProperty", "call", "r", "Symbol", "toStringTag", "value", "isWindows", "f", "P", "platform", "navigator", "userAgent", "indexOf", "_schemePattern", "_singleSlashStart", "_doubleSlashStart", "_validateUri", "_strict", "scheme", "Error", "authority", "query", "fragment", "test", "_empty", "_slash", "_regexp", "URI", "thing", "fsPath", "with", "toString", "schemeOrData", "this", "uriToFsPath", "change", "Uri", "match", "exec", "percentDecode", "replace", "idx", "substring", "components", "result", "skipEncoding", "_asFormatted", "toJSON", "data", "_formatted", "external", "_fsPath", "_sep", "_pathSepMarker", "$mid", "encodeTable", "encodeURIComponentFast", "uriComponent", "isPath", "isAuthority", "nativeEncodePos", "pos", "encodeURIComponent", "charAt", "substr", "escaped", "encodeURIComponentMinimal", "uri", "keepDriveLetterCasing", "toLowerCase", "encoder", "userinfo", "String", "fromCharCode", "decodeURIComponentGraceful", "str", "decodeURIComponent", "_rEncodedAsHex", "A", "posixPath", "slash", "Utils", "t", "joinPath", "paths", "resolvePath", "slashAdded", "LIB", "UriUtils", "Utils", "equals", "a", "b", "__name", "relative", "from", "to", "fromPath", "toPath", "fromParts", "e", "toParts", "i", "backPart", "toPart", "normalize", "uri", "URI", "DocumentState", "DefaultLangiumDocumentFactory", "__name", "services", "uri", "cancellationToken", "content", "textDocument", "token", "URI", "text", "model", "options", "parseResult", "cancelToken", "document", "textDocumentGetter", "oldText", "_a", "_b", "serviceRegistry", "textDoc", "TextDocument", "DefaultLangiumDocuments", "stream", "uriString", "langiumDoc", "ref_resolving", "DefaultLinker", "__name", "services", "document", "cancelToken", "node", "streamAst", "interruptAndCheck", "streamReferences", "ref", "refInfo", "description", "isLinkingError", "linkedNode", "err", "errorMessage", "_a", "property", "refNode", "refText", "linker", "reference", "isAstNode", "isAstNodeDescription", "findRootNode", "refData", "DocumentState", "nodeDescription", "doc", "targetDescription", "referenceType", "isNamed", "node", "__name", "DefaultNameProvider", "findNodeForProperty", "DefaultReferences", "__name", "services", "sourceCstNode", "assignment", "findAssignment", "nodeElem", "reference", "isReference", "ref", "nameNode", "isChildNode", "astNode", "targetNode", "options", "refs", "indexReferences", "UriUtils", "stream", "doc", "getDocument", "path", "toDocumentSegment", "MultiMap", "__name", "elements", "key", "value", "Reduction", "stream", "a", "values", "index", "_a", "callbackfn", "array", "BiMap", "DefaultScopeComputation", "__name", "services", "document", "cancelToken", "parentNode", "children", "streamContents", "exports", "node", "interruptAndCheck", "name", "rootNode", "scopes", "MultiMap", "streamAllContents", "container", "StreamScope", "__name", "elements", "outerScope", "options", "_a", "name", "local", "e", "MapScope", "element", "localName", "elementStream", "stream", "EMPTY_SCOPE", "EMPTY_STREAM", "DisposableCache", "__name", "disposable", "SimpleCache", "key", "value", "provider", "ContextCache", "converter", "contextKey", "contextCache", "mapKey", "documentCache", "DocumentCache", "sharedServices", "state", "uri", "document", "_changed", "deleted", "changed", "allUris", "WorkspaceCache", "DefaultScopeProvider", "__name", "services", "WorkspaceCache", "context", "scopes", "referenceType", "precomputed", "getDocument", "currentNode", "allDescriptions", "stream", "desc", "result", "i", "elements", "outerScope", "options", "StreamScope", "s", "e", "name", "_context", "MapScope", "isAstNodeWithComment", "node", "__name", "isIntermediateReference", "obj", "DefaultJsonSerializer", "services", "options", "serializeOptions", "specificReplacer", "defaultReplacer", "key", "value", "replacer", "getDocument", "content", "deserializeOptions", "root", "refText", "sourceText", "textRegions", "comments", "uriConverter", "isReference", "refValue", "$refText", "targetDocument", "targetUri", "targetPath", "_b", "_a", "isAstNode", "astNode", "_c", "_d", "comment", "createDocumentSegment", "cstNode", "textRegion", "assignments", "propertyAssignments", "findNodesForProperty", "container", "containerProperty", "containerIndex", "propertyName", "item", "index", "element", "mutable", "property", "reference", "error", "ref", "uri", "fragmentIndex", "documentUri", "URI", "document", "err", "DefaultServiceRegistry", "__name", "services", "language", "data", "ext", "uri", "languageId", "_b", "_a", "UriUtils", "diagnosticData", "code", "__name", "ValidationCategory", "ValidationRegistry", "services", "MultiMap", "checksRecord", "thisObj", "category", "type", "ch", "callbacks", "check", "entry", "assertUnreachable", "node", "accept", "cancelToken", "functionality", "messageContext", "err", "isOperationCancelled", "messageDetails", "subtype", "categories", "checks", "stream", "checkBefore", "checkAfter", "rootNode", "DefaultDocumentValidator", "__name", "services", "document", "options", "cancelToken", "parseResult", "diagnostics", "interruptAndCheck", "d", "_a", "DocumentValidator", "err", "isOperationCancelled", "_options", "lexerDiagnostics", "_b", "lexerDiagnostic", "severity", "_c", "diagnostic", "toDiagnosticSeverity", "toDiagnosticData", "parserError", "range", "token", "position", "tokenToRange", "diagnosticData", "reference", "linkingError", "info", "rootNode", "validationItems", "acceptor", "message", "checksBefore", "checkBefore", "streamAst", "node", "checks", "check", "checksAfter", "checkAfter", "getDiagnosticRange", "cstNode", "findNodeForProperty", "findNodeForKeyword", "DefaultAstNodeDescriptionProvider", "__name", "services", "node", "name", "document", "doc", "getDocument", "path", "nameNodeSegment", "nameSegmentGetter", "_a", "toDocumentSegment", "DefaultReferenceDescriptionProvider", "cancelToken", "descr", "rootNode", "astNode", "streamAst", "interruptAndCheck", "streamReferences", "refInfo", "isLinkingError", "description", "targetNodeDescr", "refCstNode", "docUri", "UriUtils", "DefaultAstNodeLocator", "__name", "node", "containerPath", "newSegment", "$containerProperty", "$containerIndex", "path", "previousValue", "currentValue", "propertyIndex", "property", "arrayIndex", "array", "event_exports", "__reExport", "DefaultConfigurationProvider", "__name", "services", "Deferred", "params", "_b", "_a", "languages", "lang", "configToUpdate", "configs", "conf", "idx", "change", "section", "configuration", "language", "sectionName", "languageId", "Disposable", "create", "callback", "__name", "DefaultDocumentBuilder", "__name", "services", "MultiMap", "DocumentState", "documents", "options", "cancelToken", "document", "key", "buildState", "previousCategories", "_a", "categories", "_b", "ValidationCategory", "c", "e", "changed", "deleted", "deletedUri", "changedUri", "newDocument", "allChangedUris", "stream", "uri", "doc", "interruptAndCheck", "rebuildDocuments", "listener", "left", "right", "changedUris", "ref", "callback", "Disposable", "index", "scopeComputation", "toBeValidated", "state", "targetState", "filtered", "targetStateDocs", "uriOrToken", "OperationCancelled", "resolve", "reject", "buildDisposable", "cancelDisposable", "listenersCopy", "err", "isOperationCancelled", "validator", "validationSetting", "diagnostics", "newCategories", "DefaultIndexManager", "__name", "services", "ContextCache", "targetNode", "astNodePath", "targetDocUri", "getDocument", "result", "docRefs", "refDescr", "UriUtils", "stream", "nodeType", "uris", "documentUris", "uri", "_a", "e", "uriString", "document", "cancelToken", "exports", "indexData", "changedUris", "references", "ref", "DefaultWorkspaceManager", "__name", "services", "Deferred", "params", "_a", "_params", "token", "folders", "cancelToken", "documents", "interruptAndCheck", "fileExtensions", "e", "collector", "document", "wf", "entry", "_folders", "_collector", "workspaceFolder", "URI", "folderPath", "content", "_workspaceFolder", "name", "UriUtils", "extname", "DefaultLexerErrorMessageProvider", "__name", "fullText", "startOffset", "length", "line", "column", "defaultLexerErrorProvider", "token", "DEFAULT_TOKENIZE_OPTIONS", "DefaultLexer", "services", "tokens", "lexerTokens", "isTokenTypeDictionary", "production", "Lexer", "text", "_options", "chevrotainResult", "_a", "_c", "_b", "buildTokens", "isIMultiModeLexerDefinition", "res", "isTokenTypeArray", "tokenVocabulary", "parseJSDoc", "node", "start", "options", "opts", "position", "Position", "lines", "getLines", "normalizedOptions", "normalizeOptions", "tokens", "tokenize", "parseJSDocComment", "__name", "isJSDoc", "first", "last", "firstRegex", "lastRegex", "content", "NEWLINE_REGEXP", "tagRegex", "inlineTagRegex", "context", "currentLine", "currentCharacter", "i", "line", "index", "match", "_a", "_b", "_c", "lastCharacter", "skipWhitespace", "Range", "tagMatch", "fullMatch", "value", "end", "rest", "inlineTagMatches", "buildInlineTokens", "tags", "lineIndex", "characterIndex", "lastIndex", "matchIndex", "startContent", "offset", "tagName", "endContent", "nonWhitespaceRegex", "whitespaceEndRegex", "startPosition", "JSDocCommentImpl", "elements", "element", "parseJSDocElement", "_d", "next", "parseJSDocTag", "parseJSDocText", "appendEmptyLine", "token", "JSDocLineImpl", "firstToken", "lastToken", "parseJSDocInline", "JSDocTextImpl", "parseJSDocLine", "inline", "tagToken", "name", "nextToken", "docLine", "JSDocTagImpl", "textDoc", "range", "normalizeOption", "option", "escaped", "escapeRegExp", "e", "text", "fillNewlines", "rendered", "renderInlineTag", "marker", "tag", "display", "displayStart", "renderLinkDefault", "URI", "JSDocDocumentationProvider", "__name", "services", "node", "comment", "isJSDoc", "parseJSDoc", "link", "display", "tag", "name", "description", "_a", "line", "character", "uri", "_node", "_tag", "precomputed", "getDocument", "currentNode", "e", "DefaultCommentProvider", "__name", "services", "node", "isAstNodeWithComment", "_a", "findCommentNode", "DefaultAsyncParser", "__name", "services", "text", "_cancelToken", "AbstractThreadedAsyncParser", "worker", "deferred", "cancelToken", "Deferred", "timeout", "cancellation", "result", "hydrated", "err", "index", "OperationCancelled", "ParserWorker", "sendMessage", "onMessage", "onError", "terminate", "parseResult", "error", "DefaultWorkspaceLock", "__name", "action", "tokenSource", "startCancelableOperation", "queue", "cancellationToken", "deferred", "Deferred", "entry", "entries", "result", "err", "isOperationCancelled", "DefaultHydrator", "__name", "services", "BiMap", "result", "e", "lexerReport", "node", "astNodes", "cstNodes", "astNode", "streamAst", "cstNode", "streamCst", "context", "obj", "name", "value", "arr", "item", "isAstNode", "isReference", "reference", "isRootCstNode", "isCompositeCstNode", "child", "isLeafCstNode", "root", "cst", "RootCstNodeImpl", "CompositeCstNodeImpl", "parent", "num", "cstNodeObj", "hydrated", "tokenType", "offset", "length", "startLine", "startColumn", "endLine", "endColumn", "hidden", "LeafCstNodeImpl", "id", "element", "isAbstractElement", "createDefaultCoreModule", "context", "__name", "services", "DefaultCommentProvider", "JSDocDocumentationProvider", "DefaultAsyncParser", "createGrammarConfig", "createLangiumParser", "createCompletionParser", "DefaultValueConverter", "DefaultTokenBuilder", "DefaultLexer", "LangiumParserErrorMessageProvider", "DefaultLexerErrorMessageProvider", "DefaultAstNodeLocator", "DefaultAstNodeDescriptionProvider", "DefaultReferenceDescriptionProvider", "DefaultLinker", "DefaultNameProvider", "DefaultScopeProvider", "DefaultScopeComputation", "DefaultReferences", "DefaultHydrator", "DefaultJsonSerializer", "DefaultDocumentValidator", "ValidationRegistry", "createDefaultSharedCoreModule", "DefaultServiceRegistry", "DefaultLangiumDocuments", "DefaultLangiumDocumentFactory", "DefaultDocumentBuilder", "DefaultIndexManager", "DefaultWorkspaceManager", "DefaultWorkspaceLock", "DefaultConfigurationProvider", "Module", "m1", "m2", "_merge", "inject", "module1", "module2", "module3", "module4", "module5", "module6", "module7", "module8", "module9", "module", "_inject", "__name", "isProxy", "eagerLoad", "item", "value", "injector", "proxy", "obj", "prop", "_resolve", "_", "__requested__", "error", "target", "source", "key", "value2", "value1", "indentationBuilderDefaultOptions", "LexingMode", "IndentationAwareTokenBuilder", "DefaultTokenBuilder", "__name", "options", "createToken", "grammar", "tokenTypes", "isTokenTypeArray", "indentTokenName", "dedentTokenName", "whitespaceTokenName", "ignoreIndentationDelimiters", "dedent", "indent", "ws", "otherTokens", "tokenType", "begin", "end", "text", "result", "offset", "tokens", "groups", "match", "_a", "image", "lineNumber", "createTokenInstance", "currIndentLevel", "prevIndentLevel", "matchIndentIndex", "_b", "numberOfDedents", "newlinesBeforeDedent", "_d", "_c", "i", "token", "terminal", "Lexer", "remainingDedents", "IndentationAwareLexer", "DefaultLexer", "services", "DEFAULT_TOKENIZE_OPTIONS", "report", "indentTokenType", "dedentTokenType", "indentTokenIdx", "dedentTokenIdx", "cleanTokens", "length", "nextToken", "utils_exports", "__export", "ast_utils_exports", "BiMap", "cancellation_exports", "ContextCache", "cst_utils_exports", "DONE_RESULT", "Deferred", "Disposable", "DisposableCache", "DocumentCache", "EMPTY_STREAM", "ErrorWithLocation", "grammar_utils_exports", "MultiMap", "OperationCancelled", "Reduction", "regexp_utils_exports", "SimpleCache", "StreamImpl", "TreeStreamImpl", "URI", "UriUtils", "WorkspaceCache", "assertUnreachable", "delayNextTick", "interruptAndCheck", "isOperationCancelled", "loadGrammarFromJson", "setInterruptionPeriod", "startCancelableOperation", "stream", "__reExport", "event_exports", "EmptyFileSystemProvider", "__name", "EmptyFileSystem", "minimalGrammarModule", "__name", "minimalSharedGrammarModule", "LangiumGrammarAstReflection", "createMinimalGrammarServices", "shared", "inject", "createDefaultSharedCoreModule", "EmptyFileSystem", "grammar", "createDefaultCoreModule", "loadGrammarFromJson", "json", "services", "astNode", "URI", "_a", "__reExport", "lib_exports", "utils_exports", "__defProp", "__name", "target", "value", "Statement", "Architecture", "isArchitecture", "item", "reflection", "Axis", "Branch", "isBranch", "Checkout", "CherryPicking", "ClassDefStatement", "Commit", "isCommit", "Curve", "Edge", "Entry", "GitGraph", "isGitGraph", "Group", "Info", "isInfo", "Item", "Junction", "Merge", "isMerge", "Option", "Packet", "isPacket", "PacketBlock", "isPacketBlock", "Pie", "isPie", "PieSection", "isPieSection", "Radar", "Service", "Treemap", "isTreemap", "TreemapRow", "Direction", "Leaf", "Section", "MermaidAstReflection", "AbstractAstReflection", "subtype", "supertype", "refInfo", "referenceId", "type", "loadedInfoGrammar", "InfoGrammar", "loadGrammarFromJson", "loadedPacketGrammar", "PacketGrammar", "loadedPieGrammar", "PieGrammar", "loadedArchitectureGrammar", "ArchitectureGrammar", "loadedGitGraphGrammar", "GitGraphGrammar", "loadedRadarGrammar", "RadarGrammar", "loadedTreemapGrammar", "TreemapGrammar", "InfoLanguageMetaData", "PacketLanguageMetaData", "PieLanguageMetaData", "ArchitectureLanguageMetaData", "GitGraphLanguageMetaData", "RadarLanguageMetaData", "TreemapLanguageMetaData", "MermaidGeneratedSharedModule", "InfoGeneratedModule", "PacketGeneratedModule", "PieGeneratedModule", "ArchitectureGeneratedModule", "GitGraphGeneratedModule", "RadarGeneratedModule", "TreemapGeneratedModule", "accessibilityDescrRegex", "accessibilityTitleRegex", "titleRegex", "rulesRegexes", "AbstractMermaidValueConverter", "DefaultValueConverter", "rule", "input", "cstNode", "_cstNode", "regex", "match", "CommonValueConverter", "_rule", "_input", "AbstractMermaidTokenBuilder", "DefaultTokenBuilder", "keywords", "rules", "terminalTokens", "options", "tokenTypes", "tokenType", "CommonTokenBuilder"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-353K7GK5.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-353K7GK5.mjs new file mode 100644 index 0000000..83335e3 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-353K7GK5.mjs @@ -0,0 +1,3 @@ +import{f as a}from"./chunk-2XYWPRAO.mjs";import{a as o}from"./chunk-GTKDMUJJ.mjs";var t={},n={info:a(async()=>{let{createInfoServices:e}=await import("./info-NVLQJR56-7B66GPTN.mjs"),r=e().Info.parser.LangiumParser;t.info=r},"info"),packet:a(async()=>{let{createPacketServices:e}=await import("./packet-BFZMPI3H-GN4PBP3H.mjs"),r=e().Packet.parser.LangiumParser;t.packet=r},"packet"),pie:a(async()=>{let{createPieServices:e}=await import("./pie-7BOR55EZ-EOOIGJLO.mjs"),r=e().Pie.parser.LangiumParser;t.pie=r},"pie"),architecture:a(async()=>{let{createArchitectureServices:e}=await import("./architecture-U656AL7Q-3ZQKGQJL.mjs"),r=e().Architecture.parser.LangiumParser;t.architecture=r},"architecture"),gitGraph:a(async()=>{let{createGitGraphServices:e}=await import("./gitGraph-F6HP7TQM-F73VLA63.mjs"),r=e().GitGraph.parser.LangiumParser;t.gitGraph=r},"gitGraph"),radar:a(async()=>{let{createRadarServices:e}=await import("./radar-NHE76QYJ-6YWZBFZN.mjs"),r=e().Radar.parser.LangiumParser;t.radar=r},"radar"),treemap:a(async()=>{let{createTreemapServices:e}=await import("./treemap-KMMF4GRG-7ORZ52ND.mjs"),r=e().Treemap.parser.LangiumParser;t.treemap=r},"treemap")};async function p(e,r){let i=n[e];if(!i)throw new Error(`Unknown diagram type: ${e}`);t[e]||await i();let s=t[e].parse(r);if(s.lexerErrors.length>0||s.parserErrors.length>0)throw new m(s);return s.value}o(p,"parse");a(p,"parse");var m=class extends Error{static{o(this,"MermaidParseError")}constructor(e){let r=e.lexerErrors.map(c=>c.message).join(` +`),i=e.parserErrors.map(c=>c.message).join(` +`);super(`Parsing failed: ${r} ${i}`),this.result=e}static{a(this,"MermaidParseError")}};export{p as a}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-353K7GK5.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-353K7GK5.mjs.map new file mode 100644 index 0000000..58ddfa7 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-353K7GK5.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../parser/dist/mermaid-parser.core.mjs"], + "sourcesContent": ["import {\n GitGraphModule,\n createGitGraphServices\n} from \"./chunks/mermaid-parser.core/chunk-S6J4BHB3.mjs\";\nimport {\n InfoModule,\n createInfoServices\n} from \"./chunks/mermaid-parser.core/chunk-LBM3YZW2.mjs\";\nimport {\n PacketModule,\n createPacketServices\n} from \"./chunks/mermaid-parser.core/chunk-76Q3JFCE.mjs\";\nimport {\n PieModule,\n createPieServices\n} from \"./chunks/mermaid-parser.core/chunk-T53DSG4Q.mjs\";\nimport {\n ArchitectureModule,\n createArchitectureServices\n} from \"./chunks/mermaid-parser.core/chunk-O7ZBX7Z2.mjs\";\nimport {\n RadarModule,\n createRadarServices\n} from \"./chunks/mermaid-parser.core/chunk-LHMN2FUI.mjs\";\nimport {\n TreemapModule,\n createTreemapServices\n} from \"./chunks/mermaid-parser.core/chunk-FWNWRKHM.mjs\";\nimport {\n AbstractMermaidTokenBuilder,\n AbstractMermaidValueConverter,\n Architecture,\n ArchitectureGeneratedModule,\n Branch,\n Commit,\n CommonTokenBuilder,\n CommonValueConverter,\n GitGraph,\n GitGraphGeneratedModule,\n Info,\n InfoGeneratedModule,\n Merge,\n MermaidGeneratedSharedModule,\n Packet,\n PacketBlock,\n PacketGeneratedModule,\n Pie,\n PieGeneratedModule,\n PieSection,\n Radar,\n RadarGeneratedModule,\n Statement,\n Treemap,\n TreemapGeneratedModule,\n __name,\n isArchitecture,\n isBranch,\n isCommit,\n isGitGraph,\n isInfo,\n isMerge,\n isPacket,\n isPacketBlock,\n isPie,\n isPieSection,\n isTreemap\n} from \"./chunks/mermaid-parser.core/chunk-FPAJGGOC.mjs\";\n\n// src/parse.ts\nvar parsers = {};\nvar initializers = {\n info: /* @__PURE__ */ __name(async () => {\n const { createInfoServices: createInfoServices2 } = await import(\"./chunks/mermaid-parser.core/info-NVLQJR56.mjs\");\n const parser = createInfoServices2().Info.parser.LangiumParser;\n parsers.info = parser;\n }, \"info\"),\n packet: /* @__PURE__ */ __name(async () => {\n const { createPacketServices: createPacketServices2 } = await import(\"./chunks/mermaid-parser.core/packet-BFZMPI3H.mjs\");\n const parser = createPacketServices2().Packet.parser.LangiumParser;\n parsers.packet = parser;\n }, \"packet\"),\n pie: /* @__PURE__ */ __name(async () => {\n const { createPieServices: createPieServices2 } = await import(\"./chunks/mermaid-parser.core/pie-7BOR55EZ.mjs\");\n const parser = createPieServices2().Pie.parser.LangiumParser;\n parsers.pie = parser;\n }, \"pie\"),\n architecture: /* @__PURE__ */ __name(async () => {\n const { createArchitectureServices: createArchitectureServices2 } = await import(\"./chunks/mermaid-parser.core/architecture-U656AL7Q.mjs\");\n const parser = createArchitectureServices2().Architecture.parser.LangiumParser;\n parsers.architecture = parser;\n }, \"architecture\"),\n gitGraph: /* @__PURE__ */ __name(async () => {\n const { createGitGraphServices: createGitGraphServices2 } = await import(\"./chunks/mermaid-parser.core/gitGraph-F6HP7TQM.mjs\");\n const parser = createGitGraphServices2().GitGraph.parser.LangiumParser;\n parsers.gitGraph = parser;\n }, \"gitGraph\"),\n radar: /* @__PURE__ */ __name(async () => {\n const { createRadarServices: createRadarServices2 } = await import(\"./chunks/mermaid-parser.core/radar-NHE76QYJ.mjs\");\n const parser = createRadarServices2().Radar.parser.LangiumParser;\n parsers.radar = parser;\n }, \"radar\"),\n treemap: /* @__PURE__ */ __name(async () => {\n const { createTreemapServices: createTreemapServices2 } = await import(\"./chunks/mermaid-parser.core/treemap-KMMF4GRG.mjs\");\n const parser = createTreemapServices2().Treemap.parser.LangiumParser;\n parsers.treemap = parser;\n }, \"treemap\")\n};\nasync function parse(diagramType, text) {\n const initializer = initializers[diagramType];\n if (!initializer) {\n throw new Error(`Unknown diagram type: ${diagramType}`);\n }\n if (!parsers[diagramType]) {\n await initializer();\n }\n const parser = parsers[diagramType];\n const result = parser.parse(text);\n if (result.lexerErrors.length > 0 || result.parserErrors.length > 0) {\n throw new MermaidParseError(result);\n }\n return result.value;\n}\n__name(parse, \"parse\");\nvar MermaidParseError = class extends Error {\n constructor(result) {\n const lexerErrors = result.lexerErrors.map((err) => err.message).join(\"\\n\");\n const parserErrors = result.parserErrors.map((err) => err.message).join(\"\\n\");\n super(`Parsing failed: ${lexerErrors} ${parserErrors}`);\n this.result = result;\n }\n static {\n __name(this, \"MermaidParseError\");\n }\n};\nexport {\n AbstractMermaidTokenBuilder,\n AbstractMermaidValueConverter,\n Architecture,\n ArchitectureGeneratedModule,\n ArchitectureModule,\n Branch,\n Commit,\n CommonTokenBuilder,\n CommonValueConverter,\n GitGraph,\n GitGraphGeneratedModule,\n GitGraphModule,\n Info,\n InfoGeneratedModule,\n InfoModule,\n Merge,\n MermaidGeneratedSharedModule,\n MermaidParseError,\n Packet,\n PacketBlock,\n PacketGeneratedModule,\n PacketModule,\n Pie,\n PieGeneratedModule,\n PieModule,\n PieSection,\n Radar,\n RadarGeneratedModule,\n RadarModule,\n Statement,\n Treemap,\n TreemapGeneratedModule,\n TreemapModule,\n createArchitectureServices,\n createGitGraphServices,\n createInfoServices,\n createPacketServices,\n createPieServices,\n createRadarServices,\n createTreemapServices,\n isArchitecture,\n isBranch,\n isCommit,\n isGitGraph,\n isInfo,\n isMerge,\n isPacket,\n isPacketBlock,\n isPie,\n isPieSection,\n isTreemap,\n parse\n};\n"], + "mappings": "kFAqEA,IAAIA,EAAU,CAAC,EACXC,EAAe,CACjB,KAAsBC,EAAO,SAAY,CACvC,GAAM,CAAE,mBAAoBC,CAAoB,EAAI,KAAM,QAAO,8BAAgD,EAC3GC,EAASD,EAAoB,EAAE,KAAK,OAAO,cACjDH,EAAQ,KAAOI,CACjB,EAAG,MAAM,EACT,OAAwBF,EAAO,SAAY,CACzC,GAAM,CAAE,qBAAsBG,CAAsB,EAAI,KAAM,QAAO,gCAAkD,EACjHD,EAASC,EAAsB,EAAE,OAAO,OAAO,cACrDL,EAAQ,OAASI,CACnB,EAAG,QAAQ,EACX,IAAqBF,EAAO,SAAY,CACtC,GAAM,CAAE,kBAAmBI,CAAmB,EAAI,KAAM,QAAO,6BAA+C,EACxGF,EAASE,EAAmB,EAAE,IAAI,OAAO,cAC/CN,EAAQ,IAAMI,CAChB,EAAG,KAAK,EACR,aAA8BF,EAAO,SAAY,CAC/C,GAAM,CAAE,2BAA4BK,CAA4B,EAAI,KAAM,QAAO,sCAAwD,EACnIH,EAASG,EAA4B,EAAE,aAAa,OAAO,cACjEP,EAAQ,aAAeI,CACzB,EAAG,cAAc,EACjB,SAA0BF,EAAO,SAAY,CAC3C,GAAM,CAAE,uBAAwBM,CAAwB,EAAI,KAAM,QAAO,kCAAoD,EACvHJ,EAASI,EAAwB,EAAE,SAAS,OAAO,cACzDR,EAAQ,SAAWI,CACrB,EAAG,UAAU,EACb,MAAuBF,EAAO,SAAY,CACxC,GAAM,CAAE,oBAAqBO,CAAqB,EAAI,KAAM,QAAO,+BAAiD,EAC9GL,EAASK,EAAqB,EAAE,MAAM,OAAO,cACnDT,EAAQ,MAAQI,CAClB,EAAG,OAAO,EACV,QAAyBF,EAAO,SAAY,CAC1C,GAAM,CAAE,sBAAuBQ,CAAuB,EAAI,KAAM,QAAO,iCAAmD,EACpHN,EAASM,EAAuB,EAAE,QAAQ,OAAO,cACvDV,EAAQ,QAAUI,CACpB,EAAG,SAAS,CACd,EACA,eAAeO,EAAMC,EAAaC,EAAM,CACtC,IAAMC,EAAcb,EAAaW,CAAW,EAC5C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,yBAAyBF,CAAW,EAAE,EAEnDZ,EAAQY,CAAW,GACtB,MAAME,EAAY,EAGpB,IAAMC,EADSf,EAAQY,CAAW,EACZ,MAAMC,CAAI,EAChC,GAAIE,EAAO,YAAY,OAAS,GAAKA,EAAO,aAAa,OAAS,EAChE,MAAM,IAAIC,EAAkBD,CAAM,EAEpC,OAAOA,EAAO,KAChB,CAdeb,EAAAS,EAAA,SAefT,EAAOS,EAAO,OAAO,EACrB,IAAIK,EAAoB,cAAc,KAAM,CA3H5C,MA2H4C,CAAAd,EAAA,0BAC1C,YAAYa,EAAQ,CAClB,IAAME,EAAcF,EAAO,YAAY,IAAKG,GAAQA,EAAI,OAAO,EAAE,KAAK;AAAA,CAAI,EACpEC,EAAeJ,EAAO,aAAa,IAAKG,GAAQA,EAAI,OAAO,EAAE,KAAK;AAAA,CAAI,EAC5E,MAAM,mBAAmBD,CAAW,IAAIE,CAAY,EAAE,EACtD,KAAK,OAASJ,CAChB,CACA,MAAO,CACLb,EAAO,KAAM,mBAAmB,CAClC,CACF", + "names": ["parsers", "initializers", "__name", "createInfoServices2", "parser", "createPacketServices2", "createPieServices2", "createArchitectureServices2", "createGitGraphServices2", "createRadarServices2", "createTreemapServices2", "parse", "diagramType", "text", "initializer", "result", "MermaidParseError", "lexerErrors", "err", "parserErrors"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-4KE642ED.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-4KE642ED.mjs new file mode 100644 index 0000000..98acd37 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-4KE642ED.mjs @@ -0,0 +1 @@ +import{a as r}from"./chunk-GTKDMUJJ.mjs";function c(i,e){i.accDescr&&e.setAccDescription?.(i.accDescr),i.accTitle&&e.setAccTitle?.(i.accTitle),i.title&&e.setDiagramTitle?.(i.title)}r(c,"populateCommonDb");export{c as a}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-4KE642ED.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-4KE642ED.mjs.map new file mode 100644 index 0000000..5e1b266 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-4KE642ED.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagrams/common/populateCommonDb.ts"], + "sourcesContent": ["import type { DiagramAST } from '@mermaid-js/parser';\nimport type { DiagramDB } from '../../diagram-api/types.js';\n\nexport function populateCommonDb(ast: DiagramAST, db: DiagramDB) {\n if (ast.accDescr) {\n db.setAccDescription?.(ast.accDescr);\n }\n if (ast.accTitle) {\n db.setAccTitle?.(ast.accTitle);\n }\n if (ast.title) {\n db.setDiagramTitle?.(ast.title);\n }\n}\n"], + "mappings": "yCAGO,SAASA,EAAiBC,EAAiBC,EAAe,CAC3DD,EAAI,UACNC,EAAG,oBAAoBD,EAAI,QAAQ,EAEjCA,EAAI,UACNC,EAAG,cAAcD,EAAI,QAAQ,EAE3BA,EAAI,OACNC,EAAG,kBAAkBD,EAAI,KAAK,CAElC,CAVgBE,EAAAH,EAAA", + "names": ["populateCommonDb", "ast", "db", "__name"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-5V7UUW6L.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-5V7UUW6L.mjs new file mode 100644 index 0000000..96b0b03 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-5V7UUW6L.mjs @@ -0,0 +1 @@ +import{W as c}from"./chunk-KXVH62NG.mjs";import{a as i}from"./chunk-GTKDMUJJ.mjs";var u=i(t=>{let{handDrawnSeed:s}=c();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:s}},"solidStateFill"),p=i(t=>{let s=h([...t.cssCompiledStyles||[],...t.cssStyles||[],...t.labelStyle||[]]);return{stylesMap:s,stylesArray:[...s]}},"compileStyles"),h=i(t=>{let s=new Map;return t.forEach(o=>{let[n,r]=o.split(":");s.set(n.trim(),r?.trim())}),s},"styles2Map"),g=i(t=>t==="color"||t==="font-size"||t==="font-family"||t==="font-weight"||t==="font-style"||t==="text-decoration"||t==="text-align"||t==="text-transform"||t==="line-height"||t==="letter-spacing"||t==="word-spacing"||t==="text-shadow"||t==="text-overflow"||t==="white-space"||t==="word-wrap"||t==="word-break"||t==="overflow-wrap"||t==="hyphens","isLabelStyle"),m=i(t=>{let{stylesArray:s}=p(t),o=[],n=[],r=[],l=[];return s.forEach(e=>{let a=e[0];g(a)?o.push(e.join(":")+" !important"):(n.push(e.join(":")+" !important"),a.includes("stroke")&&r.push(e.join(":")+" !important"),a==="fill"&&l.push(e.join(":")+" !important"))}),{labelStyles:o.join(";"),nodeStyles:n.join(";"),stylesArray:s,borderStyles:r,backgroundStyles:l}},"styles2String"),S=i((t,s)=>{let{themeVariables:o,handDrawnSeed:n}=c(),{nodeBorder:r,mainBkg:l}=o,{stylesMap:e}=p(t);return Object.assign({roughness:.7,fill:e.get("fill")||l,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:e.get("stroke")||r,seed:n,strokeWidth:e.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0],strokeLineDash:d(e.get("stroke-dasharray"))},s)},"userNodeOverrides"),d=i(t=>{if(!t)return[0,0];let s=t.trim().split(/\s+/).map(Number);if(s.length===1){let r=isNaN(s[0])?0:s[0];return[r,r]}let o=isNaN(s[0])?0:s[0],n=isNaN(s[1])?0:s[1];return[o,n]},"getStrokeDashArray");export{u as a,p as b,g as c,m as d,S as e}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-5V7UUW6L.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-5V7UUW6L.mjs.map new file mode 100644 index 0000000..2129642 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-5V7UUW6L.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.ts"], + "sourcesContent": ["import { getConfig } from '../../../diagram-api/diagramAPI.js';\nimport type { Node } from '../../types.js';\n\n// Striped fill like start or fork nodes in state diagrams\nexport const solidStateFill = (color: string) => {\n const { handDrawnSeed } = getConfig();\n return {\n fill: color,\n hachureAngle: 120, // angle of hachure,\n hachureGap: 4,\n fillWeight: 2,\n roughness: 0.7,\n stroke: color,\n seed: handDrawnSeed,\n };\n};\n\nexport const compileStyles = (node: Node) => {\n // node.cssCompiledStyles is an array of strings in the form of 'key: value' where key is the css property and value is the value\n // the array is the styles of node from the classes it is using\n // node.cssStyles is an array of styles directly set on the node\n // concat the arrays and remove duplicates such that the values from node.cssStyles are used if there are duplicates\n const stylesMap = styles2Map([\n ...(node.cssCompiledStyles || []),\n ...(node.cssStyles || []),\n ...(node.labelStyle || []),\n ]);\n return { stylesMap, stylesArray: [...stylesMap] };\n};\n\nexport const styles2Map = (styles: string[]) => {\n const styleMap = new Map();\n styles.forEach((style) => {\n const [key, value] = style.split(':');\n styleMap.set(key.trim(), value?.trim());\n });\n return styleMap;\n};\nexport const isLabelStyle = (key: string) => {\n return (\n key === 'color' ||\n key === 'font-size' ||\n key === 'font-family' ||\n key === 'font-weight' ||\n key === 'font-style' ||\n key === 'text-decoration' ||\n key === 'text-align' ||\n key === 'text-transform' ||\n key === 'line-height' ||\n key === 'letter-spacing' ||\n key === 'word-spacing' ||\n key === 'text-shadow' ||\n key === 'text-overflow' ||\n key === 'white-space' ||\n key === 'word-wrap' ||\n key === 'word-break' ||\n key === 'overflow-wrap' ||\n key === 'hyphens'\n );\n};\nexport const styles2String = (node: Node) => {\n const { stylesArray } = compileStyles(node);\n const labelStyles: string[] = [];\n const nodeStyles: string[] = [];\n const borderStyles: string[] = [];\n const backgroundStyles: string[] = [];\n\n stylesArray.forEach((style) => {\n const key = style[0];\n if (isLabelStyle(key)) {\n labelStyles.push(style.join(':') + ' !important');\n } else {\n nodeStyles.push(style.join(':') + ' !important');\n if (key.includes('stroke')) {\n borderStyles.push(style.join(':') + ' !important');\n }\n if (key === 'fill') {\n backgroundStyles.push(style.join(':') + ' !important');\n }\n }\n });\n\n return {\n labelStyles: labelStyles.join(';'),\n nodeStyles: nodeStyles.join(';'),\n stylesArray,\n borderStyles,\n backgroundStyles,\n };\n};\n\n// Striped fill like start or fork nodes in state diagrams\n// TODO remove any\nexport const userNodeOverrides = (node: Node, options: any) => {\n const { themeVariables, handDrawnSeed } = getConfig();\n const { nodeBorder, mainBkg } = themeVariables;\n const { stylesMap } = compileStyles(node);\n\n // index the style array to a map object\n const result = Object.assign(\n {\n roughness: 0.7,\n fill: stylesMap.get('fill') || mainBkg,\n fillStyle: 'hachure', // solid fill\n fillWeight: 4,\n hachureGap: 5.2,\n stroke: stylesMap.get('stroke') || nodeBorder,\n seed: handDrawnSeed,\n strokeWidth: stylesMap.get('stroke-width')?.replace('px', '') || 1.3,\n fillLineDash: [0, 0],\n strokeLineDash: getStrokeDashArray(stylesMap.get('stroke-dasharray')),\n },\n options\n );\n return result;\n};\n\nconst getStrokeDashArray = (strokeDasharrayStyle?: string) => {\n if (!strokeDasharrayStyle) {\n return [0, 0];\n }\n const dashArray = strokeDasharrayStyle.trim().split(/\\s+/).map(Number);\n if (dashArray.length === 1) {\n const val = isNaN(dashArray[0]) ? 0 : dashArray[0];\n return [val, val];\n }\n const first = isNaN(dashArray[0]) ? 0 : dashArray[0];\n const second = isNaN(dashArray[1]) ? 0 : dashArray[1];\n return [first, second];\n};\n"], + "mappings": "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", + "names": ["solidStateFill", "__name", "color", "handDrawnSeed", "getConfig", "compileStyles", "node", "stylesMap", "styles2Map", "styles", "styleMap", "style", "key", "value", "isLabelStyle", "styles2String", "stylesArray", "labelStyles", "nodeStyles", "borderStyles", "backgroundStyles", "userNodeOverrides", "options", "themeVariables", "nodeBorder", "mainBkg", "getStrokeDashArray", "strokeDasharrayStyle", "dashArray", "val", "first", "second"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-63GW7ZVL.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-63GW7ZVL.mjs new file mode 100644 index 0000000..e4276c9 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-63GW7ZVL.mjs @@ -0,0 +1 @@ +import{a as r,b as fu,e as lu}from"./chunk-GTKDMUJJ.mjs";var Bo=fu((fr,lr)=>{"use strict";(function(t,e){typeof fr=="object"&&typeof lr<"u"?lr.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs=e()})(fr,(function(){"use strict";var t=1e3,e=6e4,n=36e5,i="millisecond",o="second",a="minute",s="hour",u="day",l="week",f="month",h="quarter",p="year",c="date",m="Invalid Date",_=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,M=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,T={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:r(function(v){var d=["th","st","nd","rd"],x=v%100;return"["+v+(d[(x-20)%10]||d[x]||d[0])+"]"},"ordinal")},k=r(function(v,d,x){var S=String(v);return!S||S.length>=d?v:""+Array(d+1-S.length).join(x)+v},"m"),I={s:k,z:r(function(v){var d=-v.utcOffset(),x=Math.abs(d),S=Math.floor(x/60),y=x%60;return(d<=0?"+":"-")+k(S,2,"0")+":"+k(y,2,"0")},"z"),m:r(function v(d,x){if(d.date()1)return v($[0])}else{var P=d.name;A[P]=d,y=P}return!S&&y&&(C=y),y||!S&&C},"t"),U=r(function(v,d){if(w(v))return v.clone();var x=typeof d=="object"?d:{};return x.date=v,x.args=arguments,new B(x)},"O"),E=I;E.l=Y,E.i=w,E.w=function(v,d){return U(v,{locale:d.$L,utc:d.$u,x:d.$x,$offset:d.$offset})};var B=(function(){function v(x){this.$L=Y(x.locale,null,!0),this.parse(x),this.$x=this.$x||x.x||{},this[O]=!0}r(v,"M");var d=v.prototype;return d.parse=function(x){this.$d=(function(S){var y=S.date,D=S.utc;if(y===null)return new Date(NaN);if(E.u(y))return new Date;if(y instanceof Date)return new Date(y);if(typeof y=="string"&&!/Z$/i.test(y)){var $=y.match(_);if($){var P=$[2]-1||0,z=($[7]||"0").substring(0,3);return D?new Date(Date.UTC($[1],P,$[3]||1,$[4]||0,$[5]||0,$[6]||0,z)):new Date($[1],P,$[3]||1,$[4]||0,$[5]||0,$[6]||0,z)}}return new Date(y)})(x),this.init()},d.init=function(){var x=this.$d;this.$y=x.getFullYear(),this.$M=x.getMonth(),this.$D=x.getDate(),this.$W=x.getDay(),this.$H=x.getHours(),this.$m=x.getMinutes(),this.$s=x.getSeconds(),this.$ms=x.getMilliseconds()},d.$utils=function(){return E},d.isValid=function(){return this.$d.toString()!==m},d.isSame=function(x,S){var y=U(x);return this.startOf(S)<=y&&y<=this.endOf(S)},d.isAfter=function(x,S){return U(x){},"trace"),debug:r((...t)=>{},"debug"),info:r((...t)=>{},"info"),warn:r((...t)=>{},"warn"),error:r((...t)=>{},"error"),fatal:r((...t)=>{},"fatal")},Wh=r(function(t="fatal"){let e=St.fatal;typeof t=="string"?t.toLowerCase()in St&&(e=St[t]):typeof t=="number"&&(e=t),pt.trace=()=>{},pt.debug=()=>{},pt.info=()=>{},pt.warn=()=>{},pt.error=()=>{},pt.fatal=()=>{},e<=St.fatal&&(pt.fatal=console.error?console.error.bind(console,mt("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",mt("FATAL"))),e<=St.error&&(pt.error=console.error?console.error.bind(console,mt("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",mt("ERROR"))),e<=St.warn&&(pt.warn=console.warn?console.warn.bind(console,mt("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",mt("WARN"))),e<=St.info&&(pt.info=console.info?console.info.bind(console,mt("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",mt("INFO"))),e<=St.debug&&(pt.debug=console.debug?console.debug.bind(console,mt("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",mt("DEBUG"))),e<=St.trace&&(pt.trace=console.debug?console.debug.bind(console,mt("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",mt("TRACE")))},"setLogLevel"),mt=r(t=>`%c${(0,qo.default)().format("ss.SSS")} : ${t} : `,"format");function Wo(t,e){let n;if(e===void 0)for(let i of t)i!=null&&(n=i)&&(n=i);else{let i=-1;for(let o of t)(o=e(o,++i,t))!=null&&(n=o)&&(n=o)}return n}r(Wo,"max");function Vo(t,e){let n;if(e===void 0)for(let i of t)i!=null&&(n>i||n===void 0&&i>=i)&&(n=i);else{let i=-1;for(let o of t)(o=e(o,++i,t))!=null&&(n>o||n===void 0&&o>=o)&&(n=o)}return n}r(Vo,"min");function Vt(t,e){return t==null||e==null?NaN:te?1:t>=e?0:NaN}r(Vt,"ascending");function cr(t,e){return t==null||e==null?NaN:et?1:e>=t?0:NaN}r(cr,"descending");function Xt(t){let e,n,i;t.length!==2?(e=Vt,n=r((u,l)=>Vt(t(u),l),"compare2"),i=r((u,l)=>t(u)-l,"delta")):(e=t===Vt||t===cr?t:cu,n=t,i=t);function o(u,l,f=0,h=u.length){if(f>>1;n(u[p],l)<0?f=p+1:h=p}while(f>>1;n(u[p],l)<=0?f=p+1:h=p}while(ff&&i(u[p-1],l)>-i(u[p],l)?p-1:p}return r(s,"center"),{left:o,center:s,right:a}}r(Xt,"bisector");function cu(){return 0}r(cu,"zero");function hr(t){return t===null?NaN:+t}r(hr,"number");var Xo=Xt(Vt),Go=Xo.right,hu=Xo.left,pu=Xt(hr).center,pr=Go;var fe=class extends Map{static{r(this,"InternMap")}constructor(e,n=xu){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),e!=null)for(let[i,o]of e)this.set(i,o)}get(e){return super.get(Zo(this,e))}has(e){return super.has(Zo(this,e))}set(e,n){return super.set(mu(this,e),n)}delete(e){return super.delete(du(this,e))}};function Zo({_intern:t,_key:e},n){let i=e(n);return t.has(i)?t.get(i):n}r(Zo,"intern_get");function mu({_intern:t,_key:e},n){let i=e(n);return t.has(i)?t.get(i):(t.set(i,n),n)}r(mu,"intern_set");function du({_intern:t,_key:e},n){let i=e(n);return t.has(i)&&(n=t.get(i),t.delete(i)),n}r(du,"intern_delete");function xu(t){return t!==null&&typeof t=="object"?t.valueOf():t}r(xu,"keyof");var _u=Math.sqrt(50),gu=Math.sqrt(10),yu=Math.sqrt(2);function cn(t,e,n){let i=(e-t)/Math.max(0,n),o=Math.floor(Math.log10(i)),a=i/Math.pow(10,o),s=a>=_u?10:a>=gu?5:a>=yu?2:1,u,l,f;return o<0?(f=Math.pow(10,-o)/s,u=Math.round(t*f),l=Math.round(e*f),u/fe&&--l,f=-f):(f=Math.pow(10,o)*s,u=Math.round(t/f),l=Math.round(e/f),u*fe&&--l),l0))return[];if(t===e)return[t];let i=e=o))return[];let u=a-o+1,l=new Array(u);if(i)if(s<0)for(let f=0;f+t(e)}r(bu,"number");function Mu(t,e){return e=Math.max(0,t.bandwidth()-e*2)/2,t.round()&&(e=Math.round(e)),n=>+t(n)+e}r(Mu,"center");function Tu(){return!this.__axis}r(Tu,"entering");function Ko(t,e){var n=[],i=null,o=null,a=6,s=6,u=3,l=typeof window<"u"&&window.devicePixelRatio>1?0:.5,f=t===dn||t===mn?-1:1,h=t===mn||t===dr?"x":"y",p=t===dn||t===xr?vu:wu;function c(m){var _=i??(e.ticks?e.ticks.apply(e,n):e.domain()),M=o??(e.tickFormat?e.tickFormat.apply(e,n):mr),T=Math.max(a,0)+u,k=e.range(),I=+k[0]+l,C=+k[k.length-1]+l,A=(e.bandwidth?Mu:bu)(e.copy(),l),O=m.selection?m.selection():m,w=O.selectAll(".domain").data([null]),Y=O.selectAll(".tick").data(_,e).order(),U=Y.exit(),E=Y.enter().append("g").attr("class","tick"),B=Y.select("line"),N=Y.select("text");w=w.merge(w.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),Y=Y.merge(E),B=B.merge(E.append("line").attr("stroke","currentColor").attr(h+"2",f*a)),N=N.merge(E.append("text").attr("fill","currentColor").attr(h,f*T).attr("dy",t===dn?"0em":t===xr?"0.71em":"0.32em")),m!==O&&(w=w.transition(m),Y=Y.transition(m),B=B.transition(m),N=N.transition(m),U=U.transition(m).attr("opacity",Qo).attr("transform",function(v){return isFinite(v=A(v))?p(v+l):this.getAttribute("transform")}),E.attr("opacity",Qo).attr("transform",function(v){var d=this.parentNode.__axis;return p((d&&isFinite(d=d(v))?d:A(v))+l)})),U.remove(),w.attr("d",t===mn||t===dr?s?"M"+f*s+","+I+"H"+l+"V"+C+"H"+f*s:"M"+l+","+I+"V"+C:s?"M"+I+","+f*s+"V"+l+"H"+C+"V"+f*s:"M"+I+","+l+"H"+C),Y.attr("opacity",1).attr("transform",function(v){return p(A(v)+l)}),B.attr(h+"2",f*a),N.attr(h,f*T).text(M),O.filter(Tu).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===dr?"start":t===mn?"end":"middle"),O.each(function(){this.__axis=A})}return r(c,"axis"),c.scale=function(m){return arguments.length?(e=m,c):e},c.ticks=function(){return n=Array.from(arguments),c},c.tickArguments=function(m){return arguments.length?(n=m==null?[]:Array.from(m),c):n.slice()},c.tickValues=function(m){return arguments.length?(i=m==null?null:Array.from(m),c):i&&i.slice()},c.tickFormat=function(m){return arguments.length?(o=m,c):o},c.tickSize=function(m){return arguments.length?(a=s=+m,c):a},c.tickSizeInner=function(m){return arguments.length?(a=+m,c):a},c.tickSizeOuter=function(m){return arguments.length?(s=+m,c):s},c.tickPadding=function(m){return arguments.length?(u=+m,c):u},c.offset=function(m){return arguments.length?(l=+m,c):l},c}r(Ko,"axis");function ku(t){return Ko(dn,t)}r(ku,"axisTop");function Su(t){return Ko(xr,t)}r(Su,"axisBottom");function Cu(){}r(Cu,"none");function It(t){return t==null?Cu:function(){return this.querySelector(t)}}r(It,"default");function _r(t){typeof t!="function"&&(t=It(t));for(var e=this._groups,n=e.length,i=new Array(n),o=0;o=C&&(C=I+1);!(O=T[C])&&++C<_;);A._next=O||null}}return s=new G(s,i),s._enter=u,s._exit=l,s}r(kr,"default");function Uu(t){return typeof t=="object"&&"length"in t?t:Array.from(t)}r(Uu,"arraylike");function Sr(){return new G(this._exit||this._groups.map(Ie),this._parents)}r(Sr,"default");function Cr(t,e,n){var i=this.enter(),o=this,a=this.exit();return typeof t=="function"?(i=t(i),i&&(i=i.selection())):i=i.append(t+""),e!=null&&(o=e(o),o&&(o=o.selection())),n==null?a.remove():n(a),i&&o?i.merge(o).order():o}r(Cr,"default");function Nr(t){for(var e=t.selection?t.selection():t,n=this._groups,i=e._groups,o=n.length,a=i.length,s=Math.min(o,a),u=new Array(o),l=0;l=0;)(s=i[o])&&(a&&s.compareDocumentPosition(a)^4&&a.parentNode.insertBefore(s,a),a=s);return this}r(Ar,"default");function Dr(t){t||(t=Lu);function e(p,c){return p&&c?t(p.__data__,c.__data__):!p-!c}r(e,"compareNode");for(var n=this._groups,i=n.length,o=new Array(i),a=0;ae?1:t>=e?0:NaN}r(Lu,"ascending");function $r(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}r($r,"default");function Or(){return Array.from(this)}r(Or,"default");function Er(){for(var t=this._groups,e=0,n=t.length;e=0&&(e=t.slice(0,n))!=="xmlns"&&(t=t.slice(n+1)),Yr.hasOwnProperty(e)?{space:Yr[e],local:t}:t}r(wt,"default");function zu(t){return function(){this.removeAttribute(t)}}r(zu,"attrRemove");function Hu(t){return function(){this.removeAttributeNS(t.space,t.local)}}r(Hu,"attrRemoveNS");function Bu(t,e){return function(){this.setAttribute(t,e)}}r(Bu,"attrConstant");function qu(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}r(qu,"attrConstantNS");function Wu(t,e){return function(){var n=e.apply(this,arguments);n==null?this.removeAttribute(t):this.setAttribute(t,n)}}r(Wu,"attrFunction");function Vu(t,e){return function(){var n=e.apply(this,arguments);n==null?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}r(Vu,"attrFunctionNS");function Fr(t,e){var n=wt(t);if(arguments.length<2){var i=this.node();return n.local?i.getAttributeNS(n.space,n.local):i.getAttribute(n)}return this.each((e==null?n.local?Hu:zu:typeof e=="function"?n.local?Vu:Wu:n.local?qu:Bu)(n,e))}r(Fr,"default");function Pe(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}r(Pe,"default");function Xu(t){return function(){this.style.removeProperty(t)}}r(Xu,"styleRemove");function Gu(t,e,n){return function(){this.style.setProperty(t,e,n)}}r(Gu,"styleConstant");function Zu(t,e,n){return function(){var i=e.apply(this,arguments);i==null?this.style.removeProperty(t):this.style.setProperty(t,i,n)}}r(Zu,"styleFunction");function Ur(t,e,n){return arguments.length>1?this.each((e==null?Xu:typeof e=="function"?Zu:Gu)(t,e,n??"")):Rt(this.node(),t)}r(Ur,"default");function Rt(t,e){return t.style.getPropertyValue(e)||Pe(t).getComputedStyle(t,null).getPropertyValue(e)}r(Rt,"styleValue");function Qu(t){return function(){delete this[t]}}r(Qu,"propertyRemove");function Ku(t,e){return function(){this[t]=e}}r(Ku,"propertyConstant");function Ju(t,e){return function(){var n=e.apply(this,arguments);n==null?delete this[t]:this[t]=n}}r(Ju,"propertyFunction");function Lr(t,e){return arguments.length>1?this.each((e==null?Qu:typeof e=="function"?Ju:Ku)(t,e)):this.node()[t]}r(Lr,"default");function Jo(t){return t.trim().split(/^|\s+/)}r(Jo,"classArray");function zr(t){return t.classList||new jo(t)}r(zr,"classList");function jo(t){this._node=t,this._names=Jo(t.getAttribute("class")||"")}r(jo,"ClassList");jo.prototype={add:r(function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},"add"),remove:r(function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},"remove"),contains:r(function(t){return this._names.indexOf(t)>=0},"contains")};function ta(t,e){for(var n=zr(t),i=-1,o=e.length;++i=0&&(n=e.slice(i+1),e=e.slice(0,i)),{type:e,name:n}})}r(gf,"parseTypenames");function yf(t){return function(){var e=this.__on;if(e){for(var n=0,i=-1,o=e.length,a;n>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?gn(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?gn(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=kf.exec(t))?new nt(e[1],e[2],e[3],1):(e=Sf.exec(t))?new nt(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=Cf.exec(t))?gn(e[1],e[2],e[3],e[4]):(e=Nf.exec(t))?gn(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=Af.exec(t))?ca(e[1],e[2]/100,e[3]/100,1):(e=Df.exec(t))?ca(e[1],e[2]/100,e[3]/100,e[4]):oa.hasOwnProperty(t)?ua(oa[t]):t==="transparent"?new nt(NaN,NaN,NaN,0):null}r(_t,"color");function ua(t){return new nt(t>>16&255,t>>8&255,t&255,1)}r(ua,"rgbn");function gn(t,e,n,i){return i<=0&&(t=e=n=NaN),new nt(t,e,n,i)}r(gn,"rgba");function ri(t){return t instanceof Yt||(t=_t(t)),t?(t=t.rgb(),new nt(t.r,t.g,t.b,t.opacity)):new nt}r(ri,"rgbConvert");function de(t,e,n,i){return arguments.length===1?ri(t):new nt(t,e,n,i??1)}r(de,"rgb");function nt(t,e,n,i){this.r=+t,this.g=+e,this.b=+n,this.opacity=+i}r(nt,"Rgb");Pt(nt,de,pe(Yt,{brighter(t){return t=t==null?vn:Math.pow(vn,t),new nt(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?Fe:Math.pow(Fe,t),new nt(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new nt(Zt(this.r),Zt(this.g),Zt(this.b),wn(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:fa,formatHex:fa,formatHex8:Ef,formatRgb:la,toString:la}));function fa(){return`#${Gt(this.r)}${Gt(this.g)}${Gt(this.b)}`}r(fa,"rgb_formatHex");function Ef(){return`#${Gt(this.r)}${Gt(this.g)}${Gt(this.b)}${Gt((isNaN(this.opacity)?1:this.opacity)*255)}`}r(Ef,"rgb_formatHex8");function la(){let t=wn(this.opacity);return`${t===1?"rgb(":"rgba("}${Zt(this.r)}, ${Zt(this.g)}, ${Zt(this.b)}${t===1?")":`, ${t})`}`}r(la,"rgb_formatRgb");function wn(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}r(wn,"clampa");function Zt(t){return Math.max(0,Math.min(255,Math.round(t)||0))}r(Zt,"clampi");function Gt(t){return t=Zt(t),(t<16?"0":"")+t.toString(16)}r(Gt,"hex");function ca(t,e,n,i){return i<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new xt(t,e,n,i)}r(ca,"hsla");function pa(t){if(t instanceof xt)return new xt(t.h,t.s,t.l,t.opacity);if(t instanceof Yt||(t=_t(t)),!t)return new xt;if(t instanceof xt)return t;t=t.rgb();var e=t.r/255,n=t.g/255,i=t.b/255,o=Math.min(e,n,i),a=Math.max(e,n,i),s=NaN,u=a-o,l=(a+o)/2;return u?(e===a?s=(n-i)/u+(n0&&l<1?0:s,new xt(s,u,l,t.opacity)}r(pa,"hslConvert");function ma(t,e,n,i){return arguments.length===1?pa(t):new xt(t,e,n,i??1)}r(ma,"hsl");function xt(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}r(xt,"Hsl");Pt(xt,ma,pe(Yt,{brighter(t){return t=t==null?vn:Math.pow(vn,t),new xt(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?Fe:Math.pow(Fe,t),new xt(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*e,o=2*n-i;return new nt(ni(t>=240?t-240:t+120,o,i),ni(t,o,i),ni(t<120?t+240:t-120,o,i),this.opacity)},clamp(){return new xt(ha(this.h),yn(this.s),yn(this.l),wn(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=wn(this.opacity);return`${t===1?"hsl(":"hsla("}${ha(this.h)}, ${yn(this.s)*100}%, ${yn(this.l)*100}%${t===1?")":`, ${t})`}`}}));function ha(t){return t=(t||0)%360,t<0?t+360:t}r(ha,"clamph");function yn(t){return Math.max(0,Math.min(1,t||0))}r(yn,"clampt");function ni(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}r(ni,"hsl2rgb");var da=Math.PI/180,xa=180/Math.PI;var bn=18,_a=.96422,ga=1,ya=.82521,va=4/29,xe=6/29,wa=3*xe*xe,If=xe*xe*xe;function ba(t){if(t instanceof Mt)return new Mt(t.l,t.a,t.b,t.opacity);if(t instanceof Nt)return Ma(t);t instanceof nt||(t=ri(t));var e=si(t.r),n=si(t.g),i=si(t.b),o=ii((.2225045*e+.7168786*n+.0606169*i)/ga),a,s;return e===n&&n===i?a=s=o:(a=ii((.4360747*e+.3850649*n+.1430804*i)/_a),s=ii((.0139322*e+.0971045*n+.7141733*i)/ya)),new Mt(116*o-16,500*(a-o),200*(o-s),t.opacity)}r(ba,"labConvert");function ui(t,e,n,i){return arguments.length===1?ba(t):new Mt(t,e,n,i??1)}r(ui,"lab");function Mt(t,e,n,i){this.l=+t,this.a=+e,this.b=+n,this.opacity=+i}r(Mt,"Lab");Pt(Mt,ui,pe(Yt,{brighter(t){return new Mt(this.l+bn*(t??1),this.a,this.b,this.opacity)},darker(t){return new Mt(this.l-bn*(t??1),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return e=_a*oi(e),t=ga*oi(t),n=ya*oi(n),new nt(ai(3.1338561*e-1.6168667*t-.4906146*n),ai(-.9787684*e+1.9161415*t+.033454*n),ai(.0719453*e-.2289914*t+1.4052427*n),this.opacity)}}));function ii(t){return t>If?Math.pow(t,1/3):t/wa+va}r(ii,"xyz2lab");function oi(t){return t>xe?t*t*t:wa*(t-va)}r(oi,"lab2xyz");function ai(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}r(ai,"lrgb2rgb");function si(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}r(si,"rgb2lrgb");function Rf(t){if(t instanceof Nt)return new Nt(t.h,t.c,t.l,t.opacity);if(t instanceof Mt||(t=ba(t)),t.a===0&&t.b===0)return new Nt(NaN,0()=>t,"default");function Ta(t,e){return function(n){return t+n*e}}r(Ta,"linear");function Pf(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(i){return Math.pow(t+i*e,n)}}r(Pf,"exponential");function ka(t,e){var n=e-t;return n?Ta(t,n>180||n<-180?n-360*Math.round(n/360):n):_e(isNaN(t)?e:t)}r(ka,"hue");function Sa(t){return(t=+t)==1?At:function(e,n){return n-e?Pf(e,n,t):_e(isNaN(e)?n:e)}}r(Sa,"gamma");function At(t,e){var n=e-t;return n?Ta(t,n):_e(isNaN(t)?e:t)}r(At,"nogamma");function Ca(t){return function(e,n){var i=t((e=Le(e)).h,(n=Le(n)).h),o=At(e.c,n.c),a=At(e.l,n.l),s=At(e.opacity,n.opacity);return function(u){return e.h=i(u),e.c=o(u),e.l=a(u),e.opacity=s(u),e+""}}}r(Ca,"hcl");var Yf=Ca(ka),Ff=Ca(At);function fi(t,e,n,i,o){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*n+(1+3*t+3*a-3*s)*i+s*o)/6}r(fi,"basis");function li(t){var e=t.length-1;return function(n){var i=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),o=t[i],a=t[i+1],s=i>0?t[i-1]:2*o-a,u=in&&(a=e.slice(n,a),u[s]?u[s]+=a:u[++s]=a),(i=i[0])===(o=o[0])?u[s]?u[s]+=o:u[++s]=o:(u[++s]=null,l.push({i:s,x:j(i,o)})),n=di.lastIndex;return n180?h+=360:h-f>180&&(f+=360),c.push({i:p.push(o(p)+"rotate(",null,i)-2,x:j(f,h)})):h&&p.push(o(p)+"rotate("+h+i)}r(s,"rotate");function u(f,h,p,c){f!==h?c.push({i:p.push(o(p)+"skewX(",null,i)-2,x:j(f,h)}):h&&p.push(o(p)+"skewX("+h+i)}r(u,"skewX");function l(f,h,p,c,m,_){if(f!==p||h!==c){var M=m.push(o(m)+"scale(",null,",",null,")");_.push({i:M-4,x:j(f,p)},{i:M-2,x:j(h,c)})}else(p!==1||c!==1)&&m.push(o(m)+"scale("+p+","+c+")")}return r(l,"scale"),function(f,h){var p=[],c=[];return f=t(f),h=t(h),a(f.translateX,f.translateY,h.translateX,h.translateY,p,c),s(f.rotate,h.rotate,p,c),u(f.skewX,h.skewX,p,c),l(f.scaleX,f.scaleY,h.scaleX,h.scaleY,p,c),f=h=null,function(m){for(var _=-1,M=c.length,T;++_=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}r(yi,"default");function Kt(t,e){if((n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var n,i=t.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+t.slice(n+1)]}r(Kt,"formatDecimalParts");function gt(t){return t=Kt(Math.abs(t)),t?t[1]:NaN}r(gt,"default");function vi(t,e){return function(n,i){for(var o=n.length,a=[],s=0,u=t[0],l=0;o>0&&u>0&&(l+u+1>i&&(u=Math.max(1,i-l)),a.push(n.substring(o-=u,o+u)),!((l+=u+1)>i));)u=t[s=(s+1)%t.length];return a.reverse().join(e)}}r(vi,"default");function wi(t){return function(e){return e.replace(/[0-9]/g,function(n){return t[+n]})}}r(wi,"default");var Bf=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Ut(t){if(!(e=Bf.exec(t)))throw new Error("invalid format: "+t);var e;return new Cn({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}r(Ut,"formatSpecifier");Ut.prototype=Cn.prototype;function Cn(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}r(Cn,"FormatSpecifier");Cn.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function bi(t){t:for(var e=t.length,n=1,i=-1,o;n0&&(i=0);break}return i>0?t.slice(0,i)+t.slice(o+1):t}r(bi,"default");var Mi;function Ti(t,e){var n=Kt(t,e);if(!n)return t+"";var i=n[0],o=n[1],a=o-(Mi=Math.max(-8,Math.min(8,Math.floor(o/3)))*3)+1,s=i.length;return a===s?i:a>s?i+new Array(a-s+1).join("0"):a>0?i.slice(0,a)+"."+i.slice(a):"0."+new Array(1-a).join("0")+Kt(t,Math.max(0,e+a-1))[0]}r(Ti,"default");function Nn(t,e){var n=Kt(t,e);if(!n)return t+"";var i=n[0],o=n[1];return o<0?"0."+new Array(-o).join("0")+i:i.length>o+1?i.slice(0,o+1)+"."+i.slice(o+1):i+new Array(o-i.length+2).join("0")}r(Nn,"default");var ki={"%":r((t,e)=>(t*100).toFixed(e),"%"),b:r(t=>Math.round(t).toString(2),"b"),c:r(t=>t+"","c"),d:yi,e:r((t,e)=>t.toExponential(e),"e"),f:r((t,e)=>t.toFixed(e),"f"),g:r((t,e)=>t.toPrecision(e),"g"),o:r(t=>Math.round(t).toString(8),"o"),p:r((t,e)=>Nn(t*100,e),"p"),r:Nn,s:Ti,X:r(t=>Math.round(t).toString(16).toUpperCase(),"X"),x:r(t=>Math.round(t).toString(16),"x")};function An(t){return t}r(An,"default");var Ra=Array.prototype.map,Pa=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];function Si(t){var e=t.grouping===void 0||t.thousands===void 0?An:vi(Ra.call(t.grouping,Number),t.thousands+""),n=t.currency===void 0?"":t.currency[0]+"",i=t.currency===void 0?"":t.currency[1]+"",o=t.decimal===void 0?".":t.decimal+"",a=t.numerals===void 0?An:wi(Ra.call(t.numerals,String)),s=t.percent===void 0?"%":t.percent+"",u=t.minus===void 0?"\u2212":t.minus+"",l=t.nan===void 0?"NaN":t.nan+"";function f(p){p=Ut(p);var c=p.fill,m=p.align,_=p.sign,M=p.symbol,T=p.zero,k=p.width,I=p.comma,C=p.precision,A=p.trim,O=p.type;O==="n"?(I=!0,O="g"):ki[O]||(C===void 0&&(C=12),A=!0,O="g"),(T||c==="0"&&m==="=")&&(T=!0,c="0",m="=");var w=M==="$"?n:M==="#"&&/[boxX]/.test(O)?"0"+O.toLowerCase():"",Y=M==="$"?i:/[%p]/.test(O)?s:"",U=ki[O],E=/[defgprs%]/.test(O);C=C===void 0?6:/[gprs]/.test(O)?Math.max(1,Math.min(21,C)):Math.max(0,Math.min(20,C));function B(N){var v=w,d=Y,x,S,y;if(O==="c")d=U(N)+d,N="";else{N=+N;var D=N<0||1/N<0;if(N=isNaN(N)?l:U(Math.abs(N),C),A&&(N=bi(N)),D&&+N==0&&_!=="+"&&(D=!1),v=(D?_==="("?_:u:_==="-"||_==="("?"":_)+v,d=(O==="s"?Pa[8+Mi/3]:"")+d+(D&&_==="("?")":""),E){for(x=-1,S=N.length;++xy||y>57){d=(y===46?o+N.slice(x+1):N.slice(x))+d,N=N.slice(0,x);break}}}I&&!T&&(N=e(N,1/0));var $=v.length+N.length+d.length,P=$>1)+v+N+d+P.slice($);break;default:N=P+v+N+d;break}return a(N)}return r(B,"format"),B.toString=function(){return p+""},B}r(f,"newFormat");function h(p,c){var m=f((p=Ut(p),p.type="f",p)),_=Math.max(-8,Math.min(8,Math.floor(gt(c)/3)))*3,M=Math.pow(10,-_),T=Pa[8+_/3];return function(k){return m(M*k)+T}}return r(h,"formatPrefix"),{format:f,formatPrefix:h}}r(Si,"default");var Dn,$n,On;Ci({thousands:",",grouping:[3],currency:["$",""]});function Ci(t){return Dn=Si(t),$n=Dn.format,On=Dn.formatPrefix,Dn}r(Ci,"defaultLocale");function En(t){return Math.max(0,-gt(Math.abs(t)))}r(En,"default");function In(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(gt(e)/3)))*3-gt(Math.abs(t)))}r(In,"default");function Rn(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,gt(e)-gt(t))+1}r(Rn,"default");function qf(t){var e=0,n=t.children,i=n&&n.length;if(!i)e=1;else for(;--i>=0;)e+=n[i].value;t.value=e}r(qf,"count");function Ni(){return this.eachAfter(qf)}r(Ni,"default");function Ai(t,e){let n=-1;for(let i of this)t.call(e,i,++n,this);return this}r(Ai,"default");function Di(t,e){for(var n=this,i=[n],o,a,s=-1;n=i.pop();)if(t.call(e,n,++s,this),o=n.children)for(a=o.length-1;a>=0;--a)i.push(o[a]);return this}r(Di,"default");function $i(t,e){for(var n=this,i=[n],o=[],a,s,u,l=-1;n=i.pop();)if(o.push(n),a=n.children)for(s=0,u=a.length;s=0;)n+=i[o].value;e.value=n})}r(Ei,"default");function Ii(t){return this.eachBefore(function(e){e.children&&e.children.sort(t)})}r(Ii,"default");function Ri(t){for(var e=this,n=Wf(e,t),i=[e];e!==n;)e=e.parent,i.push(e);for(var o=i.length;t!==n;)i.splice(o,0,t),t=t.parent;return i}r(Ri,"default");function Wf(t,e){if(t===e)return t;var n=t.ancestors(),i=e.ancestors(),o=null;for(t=n.pop(),e=i.pop();t===e;)o=t,t=n.pop(),e=i.pop();return o}r(Wf,"leastCommonAncestor");function Pi(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e}r(Pi,"default");function Yi(){return Array.from(this)}r(Yi,"default");function Fi(){var t=[];return this.eachBefore(function(e){e.children||t.push(e)}),t}r(Fi,"default");function Ui(){var t=this,e=[];return t.each(function(n){n!==t&&e.push({source:n.parent,target:n})}),e}r(Ui,"default");function*Li(){var t=this,e,n=[t],i,o,a;do for(e=n.reverse(),n=[];t=e.pop();)if(yield t,i=t.children)for(o=0,a=i.length;o=0;--u)o.push(a=s[u]=new ze(s[u])),a.parent=i,a.depth=i.depth+1;return n.eachBefore(Qf)}r(Pn,"hierarchy");function Vf(){return Pn(this).eachBefore(Zf)}r(Vf,"node_copy");function Xf(t){return t.children}r(Xf,"objectChildren");function Gf(t){return Array.isArray(t)?t[1]:null}r(Gf,"mapChildren");function Zf(t){t.data.value!==void 0&&(t.value=t.data.value),t.data=t.data.data}r(Zf,"copyData");function Qf(t){var e=0;do t.height=e;while((t=t.parent)&&t.height<++e)}r(Qf,"computeHeight");function ze(t){this.data=t,this.depth=this.height=0,this.parent=null}r(ze,"Node");ze.prototype=Pn.prototype={constructor:ze,count:Ni,each:Ai,eachAfter:$i,eachBefore:Di,find:Oi,sum:Ei,sort:Ii,path:Ri,ancestors:Pi,descendants:Yi,leaves:Fi,links:Ui,copy:Vf,[Symbol.iterator]:Li};function zi(t){t.x0=Math.round(t.x0),t.y0=Math.round(t.y0),t.x1=Math.round(t.x1),t.y1=Math.round(t.y1)}r(zi,"default");function Hi(t,e,n,i,o){for(var a=t.children,s,u=-1,l=a.length,f=t.value&&(i-e)/t.value;++uI&&(I=f),w=T*T*O,C=Math.max(I/w,w/k),C>A){T-=f;break}A=C}s.push(l={value:T,dice:m<_,children:u.slice(h,p)}),l.dice?Hi(l,n,i,o,M?i+=_*T/M:a):Bi(l,n,i,M?n+=m*T/M:o,a),M-=T,h=p}return s}r(Jf,"squarifyRatio");var Ya=r((function t(e){function n(i,o,a,s,u){Jf(e,i,o,a,s,u)}return r(n,"squarify"),n.ratio=function(i){return t((i=+i)>1?i:1)},n}),"custom")(Kf);function Fa(t){if(typeof t!="function")throw new Error;return t}r(Fa,"required");function ye(){return 0}r(ye,"constantZero");function Jt(t){return function(){return t}}r(Jt,"default");function Ua(){var t=Ya,e=!1,n=1,i=1,o=[0],a=ye,s=ye,u=ye,l=ye,f=ye;function h(c){return c.x0=c.y0=0,c.x1=n,c.y1=i,c.eachBefore(p),o=[0],e&&c.eachBefore(zi),c}r(h,"treemap");function p(c){var m=o[c.depth],_=c.x0+m,M=c.y0+m,T=c.x1-m,k=c.y1-m;T<_&&(_=T=(_+T)/2),ke&&(n=t,t=e,e=n),function(i){return Math.max(t,Math.min(e,i))}}r(jf,"clamper");function tl(t,e,n){var i=t[0],o=t[1],a=e[0],s=e[1];return o2?el:tl,l=f=null,p}r(h,"rescale");function p(c){return c==null||isNaN(c=+c)?a:(l||(l=u(t.map(i),e,n)))(i(s(c)))}return r(p,"scale"),p.invert=function(c){return s(o((f||(f=u(e,t.map(i),j)))(c)))},p.domain=function(c){return arguments.length?(t=Array.from(c,Vi),h()):t.slice()},p.range=function(c){return arguments.length?(e=Array.from(c),h()):e.slice()},p.rangeRound=function(c){return e=Array.from(c),n=Mn,h()},p.clamp=function(c){return arguments.length?(s=c?!0:ve,h()):s!==ve},p.interpolate=function(c){return arguments.length?(n=c,h()):n},p.unknown=function(c){return arguments.length?(a=c,p):a},function(c,m){return i=c,o=m,h()}}r(nl,"transformer");function Be(){return nl()(ve,ve)}r(Be,"continuous");function Gi(t,e,n,i){var o=le(t,e,n),a;switch(i=Ut(i??",f"),i.type){case"s":{var s=Math.max(Math.abs(t),Math.abs(e));return i.precision==null&&!isNaN(a=In(o,s))&&(i.precision=a),On(i,s)}case"":case"e":case"g":case"p":case"r":{i.precision==null&&!isNaN(a=Rn(o,Math.max(Math.abs(t),Math.abs(e))))&&(i.precision=a-(i.type==="e"));break}case"f":case"%":{i.precision==null&&!isNaN(a=En(o))&&(i.precision=a-(i.type==="%")*2);break}}return $n(i)}r(Gi,"tickFormat");function rl(t){var e=t.domain;return t.ticks=function(n){var i=e();return hn(i[0],i[i.length-1],n??10)},t.tickFormat=function(n,i){var o=e();return Gi(o[0],o[o.length-1],n??10,i)},t.nice=function(n){n==null&&(n=10);var i=e(),o=0,a=i.length-1,s=i[o],u=i[a],l,f,h=10;for(u0;){if(f=Ee(s,u,n),f===l)return i[o]=s,i[a]=u,e(i);if(f>0)s=Math.floor(s/f)*f,u=Math.ceil(u/f)*f;else if(f<0)s=Math.ceil(s*f)/f,u=Math.floor(u*f)/f;else break;l=f}return t},t}r(rl,"linearish");function Zi(){var t=Be();return t.copy=function(){return Yn(t,Zi())},Lt.apply(t,arguments),rl(t)}r(Zi,"linear");var Qi=new Date,Ki=new Date;function H(t,e,n,i){function o(a){return t(a=arguments.length===0?new Date:new Date(+a)),a}return r(o,"interval"),o.floor=a=>(t(a=new Date(+a)),a),o.ceil=a=>(t(a=new Date(a-1)),e(a,1),t(a),a),o.round=a=>{let s=o(a),u=o.ceil(a);return a-s(e(a=new Date(+a),s==null?1:Math.floor(s)),a),o.range=(a,s,u)=>{let l=[];if(a=o.ceil(a),u=u==null?1:Math.floor(u),!(a0))return l;let f;do l.push(f=new Date(+a)),e(a,u),t(a);while(fH(s=>{if(s>=s)for(;t(s),!a(s);)s.setTime(s-1)},(s,u)=>{if(s>=s)if(u<0)for(;++u<=0;)for(;e(s,-1),!a(s););else for(;--u>=0;)for(;e(s,1),!a(s););}),n&&(o.count=(a,s)=>(Qi.setTime(+a),Ki.setTime(+s),t(Qi),t(Ki),Math.floor(n(Qi,Ki))),o.every=a=>(a=Math.floor(a),!isFinite(a)||!(a>0)?null:a>1?o.filter(i?s=>i(s)%a===0:s=>o.count(0,s)%a===0):o)),o}r(H,"timeInterval");var jt=H(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);jt.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?H(e=>{e.setTime(Math.floor(e/t)*t)},(e,n)=>{e.setTime(+e+n*t)},(e,n)=>(n-e)/t):jt);var za=jt.range;var Tt=H(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*1e3)},(t,e)=>(e-t)/1e3,t=>t.getUTCSeconds()),Ha=Tt.range;var we=H(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getMinutes()),il=we.range,Fn=H(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getUTCMinutes()),ol=Fn.range;var be=H(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3-t.getMinutes()*6e4)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getHours()),al=be.range,Un=H(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getUTCHours()),sl=Un.range;var Dt=H(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5,t=>t.getDate()-1),ul=Dt.range,We=H(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>t.getUTCDate()-1),fl=We.range,Ln=H(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>Math.floor(t/864e5)),ll=Ln.range;function ne(t){return H(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,n)=>{e.setDate(e.getDate()+n*7)},(e,n)=>(n-e-(n.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/6048e5)}r(ne,"timeWeekday");var $t=ne(0),Me=ne(1),qa=ne(2),Wa=ne(3),zt=ne(4),Va=ne(5),Xa=ne(6),Ga=$t.range,cl=Me.range,hl=qa.range,pl=Wa.range,ml=zt.range,dl=Va.range,xl=Xa.range;function re(t){return H(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,n)=>{e.setUTCDate(e.getUTCDate()+n*7)},(e,n)=>(n-e)/6048e5)}r(re,"utcWeekday");var ie=re(0),Te=re(1),Za=re(2),Qa=re(3),Ht=re(4),Ka=re(5),Ja=re(6),ja=ie.range,_l=Te.range,gl=Za.range,yl=Qa.range,vl=Ht.range,wl=Ka.range,bl=Ja.range;var ke=H(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth()),Ml=ke.range,zn=H(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth()),Tl=zn.range;var lt=H(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());lt.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:H(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,n)=>{e.setFullYear(e.getFullYear()+n*t)});var kl=lt.range,yt=H(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());yt.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:H(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,n)=>{e.setUTCFullYear(e.getUTCFullYear()+n*t)});var Sl=yt.range;function es(t,e,n,i,o,a){let s=[[Tt,1,1e3],[Tt,5,5*1e3],[Tt,15,15*1e3],[Tt,30,30*1e3],[a,1,6e4],[a,5,5*6e4],[a,15,15*6e4],[a,30,30*6e4],[o,1,36e5],[o,3,3*36e5],[o,6,6*36e5],[o,12,12*36e5],[i,1,864e5],[i,2,2*864e5],[n,1,6048e5],[e,1,2592e6],[e,3,3*2592e6],[t,1,31536e6]];function u(f,h,p){let c=hT).right(s,c);if(m===s.length)return t.every(le(f/31536e6,h/31536e6,p));if(m===0)return jt.every(Math.max(le(f,h,p),1));let[_,M]=s[c/s[m-1][2]53)return null;"w"in g||(g.w=1),"Z"in g?(q=eo(Ve(g.y,0,1)),ut=q.getUTCDay(),q=ut>4||ut===0?Te.ceil(q):Te(q),q=We.offset(q,(g.V-1)*7),g.y=q.getUTCFullYear(),g.m=q.getUTCMonth(),g.d=q.getUTCDate()+(g.w+6)%7):(q=to(Ve(g.y,0,1)),ut=q.getDay(),q=ut>4||ut===0?Me.ceil(q):Me(q),q=Dt.offset(q,(g.V-1)*7),g.y=q.getFullYear(),g.m=q.getMonth(),g.d=q.getDate()+(g.w+6)%7)}else("W"in g||"U"in g)&&("w"in g||(g.w="u"in g?g.u%7:"W"in g?1:0),ut="Z"in g?eo(Ve(g.y,0,1)).getUTCDay():to(Ve(g.y,0,1)).getDay(),g.m=0,g.d="W"in g?(g.w+6)%7+g.W*7-(ut+5)%7:g.w+g.U*7-(ut+6)%7);return"Z"in g?(g.H+=g.Z/100|0,g.M+=g.Z%100,eo(g)):to(g)}}r(Y,"newParse");function U(b,R,F,g){for(var at=0,q=R.length,ut=F.length,ft,Wt;at=ut)return-1;if(ft=R.charCodeAt(at++),ft===37){if(ft=R.charAt(at++),Wt=O[ft in ns?R.charAt(at++):ft],!Wt||(g=Wt(b,F,g))<0)return-1}else if(ft!=F.charCodeAt(g++))return-1}return g}r(U,"parseSpecifier");function E(b,R,F){var g=f.exec(R.slice(F));return g?(b.p=h.get(g[0].toLowerCase()),F+g[0].length):-1}r(E,"parsePeriod");function B(b,R,F){var g=m.exec(R.slice(F));return g?(b.w=_.get(g[0].toLowerCase()),F+g[0].length):-1}r(B,"parseShortWeekday");function N(b,R,F){var g=p.exec(R.slice(F));return g?(b.w=c.get(g[0].toLowerCase()),F+g[0].length):-1}r(N,"parseWeekday");function v(b,R,F){var g=k.exec(R.slice(F));return g?(b.m=I.get(g[0].toLowerCase()),F+g[0].length):-1}r(v,"parseShortMonth");function d(b,R,F){var g=M.exec(R.slice(F));return g?(b.m=T.get(g[0].toLowerCase()),F+g[0].length):-1}r(d,"parseMonth");function x(b,R,F){return U(b,e,R,F)}r(x,"parseLocaleDateTime");function S(b,R,F){return U(b,n,R,F)}r(S,"parseLocaleDate");function y(b,R,F){return U(b,i,R,F)}r(y,"parseLocaleTime");function D(b){return s[b.getDay()]}r(D,"formatShortWeekday");function $(b){return a[b.getDay()]}r($,"formatWeekday");function P(b){return l[b.getMonth()]}r(P,"formatShortMonth");function z(b){return u[b.getMonth()]}r(z,"formatMonth");function W(b){return o[+(b.getHours()>=12)]}r(W,"formatPeriod");function X(b){return 1+~~(b.getMonth()/3)}r(X,"formatQuarter");function J(b){return s[b.getUTCDay()]}r(J,"formatUTCShortWeekday");function ht(b){return a[b.getUTCDay()]}r(ht,"formatUTCWeekday");function Q(b){return l[b.getUTCMonth()]}r(Q,"formatUTCShortMonth");function dt(b){return u[b.getUTCMonth()]}r(dt,"formatUTCMonth");function st(b){return o[+(b.getUTCHours()>=12)]}r(st,"formatUTCPeriod");function Z(b){return 1+~~(b.getUTCMonth()/3)}return r(Z,"formatUTCQuarter"),{format:r(function(b){var R=w(b+="",C);return R.toString=function(){return b},R},"format"),parse:r(function(b){var R=Y(b+="",!1);return R.toString=function(){return b},R},"parse"),utcFormat:r(function(b){var R=w(b+="",A);return R.toString=function(){return b},R},"utcFormat"),utcParse:r(function(b){var R=Y(b+="",!0);return R.toString=function(){return b},R},"utcParse")}}r(no,"formatLocale");var ns={"-":"",_:" ",0:"0"},tt=/^\s*\d+/,Dl=/^%/,$l=/[\\^$*+?|[\]().{}]/g;function L(t,e,n){var i=t<0?"-":"",o=(i?-t:t)+"",a=o.length;return i+(a[e.toLowerCase(),n]))}r(Ge,"formatLookup");function El(t,e,n){var i=tt.exec(e.slice(n,n+1));return i?(t.w=+i[0],n+i[0].length):-1}r(El,"parseWeekdayNumberSunday");function Il(t,e,n){var i=tt.exec(e.slice(n,n+1));return i?(t.u=+i[0],n+i[0].length):-1}r(Il,"parseWeekdayNumberMonday");function Rl(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.U=+i[0],n+i[0].length):-1}r(Rl,"parseWeekNumberSunday");function Pl(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.V=+i[0],n+i[0].length):-1}r(Pl,"parseWeekNumberISO");function Yl(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.W=+i[0],n+i[0].length):-1}r(Yl,"parseWeekNumberMonday");function rs(t,e,n){var i=tt.exec(e.slice(n,n+4));return i?(t.y=+i[0],n+i[0].length):-1}r(rs,"parseFullYear");function is(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.y=+i[0]+(+i[0]>68?1900:2e3),n+i[0].length):-1}r(is,"parseYear");function Fl(t,e,n){var i=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return i?(t.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}r(Fl,"parseZone");function Ul(t,e,n){var i=tt.exec(e.slice(n,n+1));return i?(t.q=i[0]*3-3,n+i[0].length):-1}r(Ul,"parseQuarter");function Ll(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.m=i[0]-1,n+i[0].length):-1}r(Ll,"parseMonthNumber");function os(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.d=+i[0],n+i[0].length):-1}r(os,"parseDayOfMonth");function zl(t,e,n){var i=tt.exec(e.slice(n,n+3));return i?(t.m=0,t.d=+i[0],n+i[0].length):-1}r(zl,"parseDayOfYear");function as(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.H=+i[0],n+i[0].length):-1}r(as,"parseHour24");function Hl(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.M=+i[0],n+i[0].length):-1}r(Hl,"parseMinutes");function Bl(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.S=+i[0],n+i[0].length):-1}r(Bl,"parseSeconds");function ql(t,e,n){var i=tt.exec(e.slice(n,n+3));return i?(t.L=+i[0],n+i[0].length):-1}r(ql,"parseMilliseconds");function Wl(t,e,n){var i=tt.exec(e.slice(n,n+6));return i?(t.L=Math.floor(i[0]/1e3),n+i[0].length):-1}r(Wl,"parseMicroseconds");function Vl(t,e,n){var i=Dl.exec(e.slice(n,n+1));return i?n+i[0].length:-1}r(Vl,"parseLiteralPercent");function Xl(t,e,n){var i=tt.exec(e.slice(n));return i?(t.Q=+i[0],n+i[0].length):-1}r(Xl,"parseUnixTimestamp");function Gl(t,e,n){var i=tt.exec(e.slice(n));return i?(t.s=+i[0],n+i[0].length):-1}r(Gl,"parseUnixTimestampSeconds");function ss(t,e){return L(t.getDate(),e,2)}r(ss,"formatDayOfMonth");function Zl(t,e){return L(t.getHours(),e,2)}r(Zl,"formatHour24");function Ql(t,e){return L(t.getHours()%12||12,e,2)}r(Ql,"formatHour12");function Kl(t,e){return L(1+Dt.count(lt(t),t),e,3)}r(Kl,"formatDayOfYear");function hs(t,e){return L(t.getMilliseconds(),e,3)}r(hs,"formatMilliseconds");function Jl(t,e){return hs(t,e)+"000"}r(Jl,"formatMicroseconds");function jl(t,e){return L(t.getMonth()+1,e,2)}r(jl,"formatMonthNumber");function tc(t,e){return L(t.getMinutes(),e,2)}r(tc,"formatMinutes");function ec(t,e){return L(t.getSeconds(),e,2)}r(ec,"formatSeconds");function nc(t){var e=t.getDay();return e===0?7:e}r(nc,"formatWeekdayNumberMonday");function rc(t,e){return L($t.count(lt(t)-1,t),e,2)}r(rc,"formatWeekNumberSunday");function ps(t){var e=t.getDay();return e>=4||e===0?zt(t):zt.ceil(t)}r(ps,"dISO");function ic(t,e){return t=ps(t),L(zt.count(lt(t),t)+(lt(t).getDay()===4),e,2)}r(ic,"formatWeekNumberISO");function oc(t){return t.getDay()}r(oc,"formatWeekdayNumberSunday");function ac(t,e){return L(Me.count(lt(t)-1,t),e,2)}r(ac,"formatWeekNumberMonday");function sc(t,e){return L(t.getFullYear()%100,e,2)}r(sc,"formatYear");function uc(t,e){return t=ps(t),L(t.getFullYear()%100,e,2)}r(uc,"formatYearISO");function fc(t,e){return L(t.getFullYear()%1e4,e,4)}r(fc,"formatFullYear");function lc(t,e){var n=t.getDay();return t=n>=4||n===0?zt(t):zt.ceil(t),L(t.getFullYear()%1e4,e,4)}r(lc,"formatFullYearISO");function cc(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+L(e/60|0,"0",2)+L(e%60,"0",2)}r(cc,"formatZone");function us(t,e){return L(t.getUTCDate(),e,2)}r(us,"formatUTCDayOfMonth");function hc(t,e){return L(t.getUTCHours(),e,2)}r(hc,"formatUTCHour24");function pc(t,e){return L(t.getUTCHours()%12||12,e,2)}r(pc,"formatUTCHour12");function mc(t,e){return L(1+We.count(yt(t),t),e,3)}r(mc,"formatUTCDayOfYear");function ms(t,e){return L(t.getUTCMilliseconds(),e,3)}r(ms,"formatUTCMilliseconds");function dc(t,e){return ms(t,e)+"000"}r(dc,"formatUTCMicroseconds");function xc(t,e){return L(t.getUTCMonth()+1,e,2)}r(xc,"formatUTCMonthNumber");function _c(t,e){return L(t.getUTCMinutes(),e,2)}r(_c,"formatUTCMinutes");function gc(t,e){return L(t.getUTCSeconds(),e,2)}r(gc,"formatUTCSeconds");function yc(t){var e=t.getUTCDay();return e===0?7:e}r(yc,"formatUTCWeekdayNumberMonday");function vc(t,e){return L(ie.count(yt(t)-1,t),e,2)}r(vc,"formatUTCWeekNumberSunday");function ds(t){var e=t.getUTCDay();return e>=4||e===0?Ht(t):Ht.ceil(t)}r(ds,"UTCdISO");function wc(t,e){return t=ds(t),L(Ht.count(yt(t),t)+(yt(t).getUTCDay()===4),e,2)}r(wc,"formatUTCWeekNumberISO");function bc(t){return t.getUTCDay()}r(bc,"formatUTCWeekdayNumberSunday");function Mc(t,e){return L(Te.count(yt(t)-1,t),e,2)}r(Mc,"formatUTCWeekNumberMonday");function Tc(t,e){return L(t.getUTCFullYear()%100,e,2)}r(Tc,"formatUTCYear");function kc(t,e){return t=ds(t),L(t.getUTCFullYear()%100,e,2)}r(kc,"formatUTCYearISO");function Sc(t,e){return L(t.getUTCFullYear()%1e4,e,4)}r(Sc,"formatUTCFullYear");function Cc(t,e){var n=t.getUTCDay();return t=n>=4||n===0?Ht(t):Ht.ceil(t),L(t.getUTCFullYear()%1e4,e,4)}r(Cc,"formatUTCFullYearISO");function Nc(){return"+0000"}r(Nc,"formatUTCZone");function fs(){return"%"}r(fs,"formatLiteralPercent");function ls(t){return+t}r(ls,"formatUnixTimestamp");function cs(t){return Math.floor(+t/1e3)}r(cs,"formatUnixTimestampSeconds");var Se,Hn,xs,_s,gs;ro({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function ro(t){return Se=no(t),Hn=Se.format,xs=Se.parse,_s=Se.utcFormat,gs=Se.utcParse,Se}r(ro,"defaultLocale");function io(t,e){t=t.slice();var n=0,i=t.length-1,o=t[n],a=t[i],s;return a1?0:t<-1?Ce:Math.acos(t)}r(bs,"acos");function uo(t){return t>=1?Ze:t<=-1?-Ze:Math.asin(t)}r(uo,"asin");var fo=Math.PI,lo=2*fo,ae=1e-6,Oc=lo-ae;function Ms(t){this._+=t[0];for(let e=1,n=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return Ms;let n=10**e;return function(i){this._+=i[0];for(let o=1,a=i.length;oae)if(!(Math.abs(p*l-f*h)>ae)||!a)this._append`L${this._x1=e},${this._y1=n}`;else{let m=i-s,_=o-u,M=l*l+f*f,T=m*m+_*_,k=Math.sqrt(M),I=Math.sqrt(c),C=a*Math.tan((fo-Math.acos((M+c-T)/(2*k*I)))/2),A=C/I,O=C/k;Math.abs(A-1)>ae&&this._append`L${e+A*h},${n+A*p}`,this._append`A${a},${a},0,0,${+(p*m>h*_)},${this._x1=e+O*l},${this._y1=n+O*f}`}}arc(e,n,i,o,a,s){if(e=+e,n=+n,i=+i,s=!!s,i<0)throw new Error(`negative radius: ${i}`);let u=i*Math.cos(o),l=i*Math.sin(o),f=e+u,h=n+l,p=1^s,c=s?o-a:a-o;this._x1===null?this._append`M${f},${h}`:(Math.abs(this._x1-f)>ae||Math.abs(this._y1-h)>ae)&&this._append`L${f},${h}`,i&&(c<0&&(c=c%lo+lo),c>Oc?this._append`A${i},${i},0,1,${p},${e-u},${n-l}A${i},${i},0,1,${p},${this._x1=f},${this._y1=h}`:c>ae&&this._append`A${i},${i},0,${+(c>=fo)},${p},${this._x1=e+i*Math.cos(a)},${this._y1=n+i*Math.sin(a)}`)}rect(e,n,i,o){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}h${i=+i}v${+o}h${-i}Z`}toString(){return this._}};function Ts(){return new se}r(Ts,"path");Ts.prototype=se.prototype;function qn(t){let e=3;return t.digits=function(n){if(!arguments.length)return e;if(n==null)e=null;else{let i=Math.floor(n);if(!(i>=0))throw new RangeError(`invalid digits: ${n}`);e=i}return t},()=>new se(e)}r(qn,"withPath");function Ic(t){return t.innerRadius}r(Ic,"arcInnerRadius");function Rc(t){return t.outerRadius}r(Rc,"arcOuterRadius");function Pc(t){return t.startAngle}r(Pc,"arcStartAngle");function Yc(t){return t.endAngle}r(Yc,"arcEndAngle");function Fc(t){return t&&t.padAngle}r(Fc,"arcPadAngle");function Uc(t,e,n,i,o,a,s,u){var l=n-t,f=i-e,h=s-o,p=u-a,c=p*l-h*f;if(!(c*cx*x+S*S&&(U=B,E=N),{cx:U,cy:E,x01:-h,y01:-p,x11:U*(o/O-1),y11:E*(o/O-1)}}r(Wn,"cornerTangents");function ks(){var t=Ic,e=Rc,n=V(0),i=null,o=Pc,a=Yc,s=Fc,u=null,l=qn(f);function f(){var h,p,c=+t.apply(this,arguments),m=+e.apply(this,arguments),_=o.apply(this,arguments)-Ze,M=a.apply(this,arguments)-Ze,T=so(M-_),k=M>_;if(u||(u=h=l()),met))u.moveTo(0,0);else if(T>Ne-et)u.moveTo(m*Bt(_),m*vt(_)),u.arc(0,0,m,_,M,!k),c>et&&(u.moveTo(c*Bt(M),c*vt(M)),u.arc(0,0,c,M,_,k));else{var I=_,C=M,A=_,O=M,w=T,Y=T,U=s.apply(this,arguments)/2,E=U>et&&(i?+i.apply(this,arguments):oe(c*c+m*m)),B=Bn(so(m-c)/2,+n.apply(this,arguments)),N=B,v=B,d,x;if(E>et){var S=uo(E/c*vt(U)),y=uo(E/m*vt(U));(w-=S*2)>et?(S*=k?1:-1,A+=S,O-=S):(w=0,A=O=(_+M)/2),(Y-=y*2)>et?(y*=k?1:-1,I+=y,C-=y):(Y=0,I=C=(_+M)/2)}var D=m*Bt(I),$=m*vt(I),P=c*Bt(O),z=c*vt(O);if(B>et){var W=m*Bt(C),X=m*vt(C),J=c*Bt(A),ht=c*vt(A),Q;if(Tet?v>et?(d=Wn(J,ht,D,$,m,v,k),x=Wn(W,X,P,z,m,v,k),u.moveTo(d.cx+d.x01,d.cy+d.y01),vet)||!(w>et)?u.lineTo(P,z):N>et?(d=Wn(P,z,W,X,c,-N,k),x=Wn(D,$,J,ht,c,-N,k),u.lineTo(d.cx+d.x01,d.cy+d.y01),Nt?1:e>=t?0:NaN}r(co,"default");function ho(t){return t}r(ho,"default");function Ds(){var t=ho,e=co,n=null,i=V(0),o=V(Ne),a=V(0);function s(u){var l,f=(u=Qe(u)).length,h,p,c=0,m=new Array(f),_=new Array(f),M=+i.apply(this,arguments),T=Math.min(Ne,Math.max(-Ne,o.apply(this,arguments)-M)),k,I=Math.min(Math.abs(T)/f,a.apply(this,arguments)),C=I*(T<0?-1:1),A;for(l=0;l0&&(c+=A);for(e!=null?m.sort(function(O,w){return e(_[O],_[w])}):n!=null&&m.sort(function(O,w){return n(u[O],u[w])}),l=0,p=c?(T-f*C)/c:0;l0?A*p:0)+C,_[h]={data:u[h],index:l,value:A,startAngle:M,endAngle:k,padAngle:I};return _}return r(s,"pie"),s.value=function(u){return arguments.length?(t=typeof u=="function"?u:V(+u),s):t},s.sortValues=function(u){return arguments.length?(e=u,n=null,s):e},s.sort=function(u){return arguments.length?(n=u,e=null,s):n},s.startAngle=function(u){return arguments.length?(i=typeof u=="function"?u:V(+u),s):i},s.endAngle=function(u){return arguments.length?(o=typeof u=="function"?u:V(+u),s):o},s.padAngle=function(u){return arguments.length?(a=typeof u=="function"?u:V(+u),s):a},s}r(Ds,"default");var Xn=class{static{r(this,"Bump")}constructor(e,n){this._context=e,this._x=n}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,n){switch(e=+e,n=+n,this._point){case 0:{this._point=1,this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,n,e,n):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+n)/2,e,this._y0,e,n);break}}this._x0=e,this._y0=n}};function Lc(t){return new Xn(t,!0)}r(Lc,"bumpX");function zc(t){return new Xn(t,!1)}r(zc,"bumpY");function Ae(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}r(Ae,"point");function Ke(t){this._context=t}r(Ke,"Basis");Ke.prototype={areaStart:r(function(){this._line=0},"areaStart"),areaEnd:r(function(){this._line=NaN},"areaEnd"),lineStart:r(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:r(function(){switch(this._point){case 3:Ae(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:r(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Ae(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};function $s(t){return new Ke(t)}r($s,"default");function ct(){}r(ct,"default");function Os(t){this._context=t}r(Os,"BasisClosed");Os.prototype={areaStart:ct,areaEnd:ct,lineStart:r(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},"lineStart"),lineEnd:r(function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},"lineEnd"),point:r(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:Ae(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};function Es(t){return new Os(t)}r(Es,"default");function Is(t){this._context=t}r(Is,"BasisOpen");Is.prototype={areaStart:r(function(){this._line=0},"areaStart"),areaEnd:r(function(){this._line=NaN},"areaEnd"),lineStart:r(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:r(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:r(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,i=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,i):this._context.moveTo(n,i);break;case 3:this._point=4;default:Ae(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};function Rs(t){return new Is(t)}r(Rs,"default");function Ps(t,e){this._basis=new Ke(t),this._beta=e}r(Ps,"Bundle");Ps.prototype={lineStart:r(function(){this._x=[],this._y=[],this._basis.lineStart()},"lineStart"),lineEnd:r(function(){var t=this._x,e=this._y,n=t.length-1;if(n>0)for(var i=t[0],o=e[0],a=t[n]-i,s=e[n]-o,u=-1,l;++u<=n;)l=u/n,this._basis.point(this._beta*t[u]+(1-this._beta)*(i+l*a),this._beta*e[u]+(1-this._beta)*(o+l*s));this._x=this._y=null,this._basis.lineEnd()},"lineEnd"),point:r(function(t,e){this._x.push(+t),this._y.push(+e)},"point")};var Hc=r((function t(e){function n(i){return e===1?new Ke(i):new Ps(i,e)}return r(n,"bundle"),n.beta=function(i){return t(+i)},n}),"custom")(.85);function De(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}r(De,"point");function Gn(t,e){this._context=t,this._k=(1-e)/6}r(Gn,"Cardinal");Gn.prototype={areaStart:r(function(){this._line=0},"areaStart"),areaEnd:r(function(){this._line=NaN},"areaEnd"),lineStart:r(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:r(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:De(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:r(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:De(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};var Bc=r((function t(e){function n(i){return new Gn(i,e)}return r(n,"cardinal"),n.tension=function(i){return t(+i)},n}),"custom")(0);function Zn(t,e){this._context=t,this._k=(1-e)/6}r(Zn,"CardinalClosed");Zn.prototype={areaStart:ct,areaEnd:ct,lineStart:r(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},"lineStart"),lineEnd:r(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:r(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:De(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};var qc=r((function t(e){function n(i){return new Zn(i,e)}return r(n,"cardinal"),n.tension=function(i){return t(+i)},n}),"custom")(0);function Qn(t,e){this._context=t,this._k=(1-e)/6}r(Qn,"CardinalOpen");Qn.prototype={areaStart:r(function(){this._line=0},"areaStart"),areaEnd:r(function(){this._line=NaN},"areaEnd"),lineStart:r(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:r(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:r(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:De(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};var Wc=r((function t(e){function n(i){return new Qn(i,e)}return r(n,"cardinal"),n.tension=function(i){return t(+i)},n}),"custom")(0);function Je(t,e,n){var i=t._x1,o=t._y1,a=t._x2,s=t._y2;if(t._l01_a>et){var u=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,l=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*u-t._x0*t._l12_2a+t._x2*t._l01_2a)/l,o=(o*u-t._y0*t._l12_2a+t._y2*t._l01_2a)/l}if(t._l23_a>et){var f=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,h=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*f+t._x1*t._l23_2a-e*t._l12_2a)/h,s=(s*f+t._y1*t._l23_2a-n*t._l12_2a)/h}t._context.bezierCurveTo(i,o,a,s,t._x2,t._y2)}r(Je,"point");function Ys(t,e){this._context=t,this._alpha=e}r(Ys,"CatmullRom");Ys.prototype={areaStart:r(function(){this._line=0},"areaStart"),areaEnd:r(function(){this._line=NaN},"areaEnd"),lineStart:r(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:r(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:r(function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Je(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};var Vc=r((function t(e){function n(i){return e?new Ys(i,e):new Gn(i,0)}return r(n,"catmullRom"),n.alpha=function(i){return t(+i)},n}),"custom")(.5);function Fs(t,e){this._context=t,this._alpha=e}r(Fs,"CatmullRomClosed");Fs.prototype={areaStart:ct,areaEnd:ct,lineStart:r(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:r(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:r(function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Je(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};var Xc=r((function t(e){function n(i){return e?new Fs(i,e):new Zn(i,0)}return r(n,"catmullRom"),n.alpha=function(i){return t(+i)},n}),"custom")(.5);function Us(t,e){this._context=t,this._alpha=e}r(Us,"CatmullRomOpen");Us.prototype={areaStart:r(function(){this._line=0},"areaStart"),areaEnd:r(function(){this._line=NaN},"areaEnd"),lineStart:r(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:r(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:r(function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Je(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};var Gc=r((function t(e){function n(i){return e?new Us(i,e):new Qn(i,0)}return r(n,"catmullRom"),n.alpha=function(i){return t(+i)},n}),"custom")(.5);function Ls(t){this._context=t}r(Ls,"LinearClosed");Ls.prototype={areaStart:ct,areaEnd:ct,lineStart:r(function(){this._point=0},"lineStart"),lineEnd:r(function(){this._point&&this._context.closePath()},"lineEnd"),point:r(function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))},"point")};function zs(t){return new Ls(t)}r(zs,"default");function Hs(t){return t<0?-1:1}r(Hs,"sign");function Bs(t,e,n){var i=t._x1-t._x0,o=e-t._x1,a=(t._y1-t._y0)/(i||o<0&&-0),s=(n-t._y1)/(o||i<0&&-0),u=(a*o+s*i)/(i+o);return(Hs(a)+Hs(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(u))||0}r(Bs,"slope3");function qs(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}r(qs,"slope2");function po(t,e,n){var i=t._x0,o=t._y0,a=t._x1,s=t._y1,u=(a-i)/3;t._context.bezierCurveTo(i+u,o+u*e,a-u,s-u*n,a,s)}r(po,"point");function Kn(t){this._context=t}r(Kn,"MonotoneX");Kn.prototype={areaStart:r(function(){this._line=0},"areaStart"),areaEnd:r(function(){this._line=NaN},"areaEnd"),lineStart:r(function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},"lineStart"),lineEnd:r(function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:po(this,this._t0,qs(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:r(function(t,e){var n=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,po(this,qs(this,n=Bs(this,t,e)),n);break;default:po(this,this._t0,n=Bs(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=n}},"point")};function Ws(t){this._context=new Vs(t)}r(Ws,"MonotoneY");(Ws.prototype=Object.create(Kn.prototype)).point=function(t,e){Kn.prototype.point.call(this,e,t)};function Vs(t){this._context=t}r(Vs,"ReflectContext");Vs.prototype={moveTo:r(function(t,e){this._context.moveTo(e,t)},"moveTo"),closePath:r(function(){this._context.closePath()},"closePath"),lineTo:r(function(t,e){this._context.lineTo(e,t)},"lineTo"),bezierCurveTo:r(function(t,e,n,i,o,a){this._context.bezierCurveTo(e,t,i,n,a,o)},"bezierCurveTo")};function Zc(t){return new Kn(t)}r(Zc,"monotoneX");function Qc(t){return new Ws(t)}r(Qc,"monotoneY");function Gs(t){this._context=t}r(Gs,"Natural");Gs.prototype={areaStart:r(function(){this._line=0},"areaStart"),areaEnd:r(function(){this._line=NaN},"areaEnd"),lineStart:r(function(){this._x=[],this._y=[]},"lineStart"),lineEnd:r(function(){var t=this._x,e=this._y,n=t.length;if(n)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),n===2)this._context.lineTo(t[1],e[1]);else for(var i=Xs(t),o=Xs(e),a=0,s=1;s=0;--e)o[e]=(s[e]-o[e+1])/a[e];for(a[n-1]=(t[n]+o[n-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},"lineEnd"),point:r(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}break}}this._x=t,this._y=e},"point")};function Qs(t){return new Jn(t,.5)}r(Qs,"default");function Kc(t){return new Jn(t,0)}r(Kc,"stepBefore");function Jc(t){return new Jn(t,1)}r(Jc,"stepAfter");var jc={value:r(()=>{},"value")};function Js(){for(var t=0,e=arguments.length,n={},i;t=0&&(i=n.slice(o+1),n=n.slice(0,o)),n&&!e.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:i}})}r(th,"parseTypenames");jn.prototype=Js.prototype={constructor:jn,on:r(function(t,e){var n=this._,i=th(t+"",n),o,a=-1,s=i.length;if(arguments.length<2){for(;++a0)for(var n=new Array(o),i=0,o,a;i=0&&t._call.call(void 0,e),t=t._next;--$e}r(nu,"timerFlush");function js(){ue=(er=nn.now())+nr,$e=tn=0;try{nu()}finally{$e=0,ih(),ue=0}}r(js,"wake");function rh(){var t=nn.now(),e=t-er;e>tu&&(nr-=e,er=t)}r(rh,"poke");function ih(){for(var t,e=tr,n,i=1/0;e;)e._call?(i>e._time&&(i=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:tr=n);en=t,xo(i)}r(ih,"nap");function xo(t){if(!$e){tn&&(tn=clearTimeout(tn));var e=t-ue;e>24?(t<1/0&&(tn=setTimeout(js,t-nn.now()-nr)),je&&(je=clearInterval(je))):(je||(er=nn.now(),je=setInterval(rh,tu)),$e=1,eu(js))}}r(xo,"sleep");function an(t,e,n){var i=new rn;return e=e==null?0:+e,i.restart(o=>{i.stop(),t(o+e)},e,n),i}r(an,"default");var oh=mo("start","end","cancel","interrupt"),ah=[],ou=0,ru=1,or=2,ir=3,iu=4,ar=5,sn=6;function Ot(t,e,n,i,o,a){var s=t.__transition;if(!s)t.__transition={};else if(n in s)return;sh(t,n,{name:e,index:i,group:o,on:oh,tween:ah,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:ou})}r(Ot,"default");function un(t,e){var n=K(t,e);if(n.state>ou)throw new Error("too late; already scheduled");return n}r(un,"init");function it(t,e){var n=K(t,e);if(n.state>ir)throw new Error("too late; already running");return n}r(it,"set");function K(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}r(K,"get");function sh(t,e,n){var i=t.__transition,o;i[e]=n,n.timer=rr(a,0,n.time);function a(f){n.state=ru,n.timer.restart(s,n.delay,n.time),n.delay<=f&&s(f-n.delay)}r(a,"schedule");function s(f){var h,p,c,m;if(n.state!==ru)return l();for(h in i)if(m=i[h],m.name===n.name){if(m.state===ir)return an(s);m.state===iu?(m.state=sn,m.timer.stop(),m.on.call("interrupt",t,t.__data__,m.index,m.group),delete i[h]):+hor&&i.state=0&&(e=e.slice(0,n)),!e||e==="start"})}r(Sh,"start");function Ch(t,e,n){var i,o,a=Sh(e)?un:it;return function(){var s=a(this,t),u=s.on;u!==i&&(o=(i=u).copy()).on(e,n),s.on=o}}r(Ch,"onFunction");function Co(t,e){var n=this._id;return arguments.length<2?K(this.node(),n).on.on(t):this.each(Ch(n,t,e))}r(Co,"default");function Nh(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}r(Nh,"removeFunction");function No(){return this.on("end.remove",Nh(this._id))}r(No,"default");function Ao(t){var e=this._name,n=this._id;typeof t!="function"&&(t=It(t));for(var i=this._groups,o=i.length,a=new Array(o),s=0;s=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t) = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\nexport const log: Record = {\n trace: (..._args: any[]) => {},\n debug: (..._args: any[]) => {},\n info: (..._args: any[]) => {},\n warn: (..._args: any[]) => {},\n error: (..._args: any[]) => {},\n fatal: (..._args: any[]) => {},\n};\n\n/**\n * Sets a log level\n *\n * @param level - The level to set the logging to. Default is `\"fatal\"`\n */\nexport const setLogLevel = function (level: keyof typeof LEVELS | number = 'fatal') {\n let numericLevel: number = LEVELS.fatal;\n if (typeof level === 'string') {\n if (level.toLowerCase() in LEVELS) {\n numericLevel = LEVELS[level];\n }\n } else if (typeof level === 'number') {\n numericLevel = level;\n }\n log.trace = () => {};\n log.debug = () => {};\n log.info = () => {};\n log.warn = () => {};\n log.error = () => {};\n log.fatal = () => {};\n\n if (numericLevel <= LEVELS.fatal) {\n log.fatal = console.error\n ? console.error.bind(console, format('FATAL'), 'color: orange')\n : console.log.bind(console, '\\x1b[35m', format('FATAL'));\n }\n if (numericLevel <= LEVELS.error) {\n log.error = console.error\n ? console.error.bind(console, format('ERROR'), 'color: orange')\n : console.log.bind(console, '\\x1b[31m', format('ERROR'));\n }\n if (numericLevel <= LEVELS.warn) {\n log.warn = console.warn\n ? console.warn.bind(console, format('WARN'), 'color: orange')\n : console.log.bind(console, `\\x1b[33m`, format('WARN'));\n }\n if (numericLevel <= LEVELS.info) {\n log.info = console.info\n ? console.info.bind(console, format('INFO'), 'color: lightblue')\n : console.log.bind(console, '\\x1b[34m', format('INFO'));\n }\n if (numericLevel <= LEVELS.debug) {\n log.debug = console.debug\n ? console.debug.bind(console, format('DEBUG'), 'color: lightgreen')\n : console.log.bind(console, '\\x1b[32m', format('DEBUG'));\n }\n if (numericLevel <= LEVELS.trace) {\n log.trace = console.debug\n ? console.debug.bind(console, format('TRACE'), 'color: lightgreen')\n : console.log.bind(console, '\\x1b[32m', format('TRACE'));\n }\n};\n\n/**\n * Returns a format with the timestamp and the log level\n *\n * @param level - The level for the log format\n * @returns The format with the timestamp and log level\n */\nconst format = (level: Uppercase): string => {\n const time = dayjs().format('ss.SSS');\n return `%c${time} : ${level} : `;\n};\n", "export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n", "export default function min(values, valueof) {\n let min;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n }\n return min;\n}\n", "export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n", "export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n", "import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can\u2019t do this\n // for a comparator (except for specific, known comparators) because we can\u2019t\n // tell if the comparator is symmetric, and an asymmetric comparator can\u2019t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n", "export default function number(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n", "import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n", "export class InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nexport class InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n", "const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nexport default function ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nexport function tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n", "export default function range(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n", "export default function(x) {\n return x;\n}\n", "import identity from \"./identity.js\";\n\nvar top = 1,\n right = 2,\n bottom = 3,\n left = 4,\n epsilon = 1e-6;\n\nfunction translateX(x) {\n return \"translate(\" + x + \",0)\";\n}\n\nfunction translateY(y) {\n return \"translate(0,\" + y + \")\";\n}\n\nfunction number(scale) {\n return d => +scale(d);\n}\n\nfunction center(scale, offset) {\n offset = Math.max(0, scale.bandwidth() - offset * 2) / 2;\n if (scale.round()) offset = Math.round(offset);\n return d => +scale(d) + offset;\n}\n\nfunction entering() {\n return !this.__axis;\n}\n\nfunction axis(orient, scale) {\n var tickArguments = [],\n tickValues = null,\n tickFormat = null,\n tickSizeInner = 6,\n tickSizeOuter = 6,\n tickPadding = 3,\n offset = typeof window !== \"undefined\" && window.devicePixelRatio > 1 ? 0 : 0.5,\n k = orient === top || orient === left ? -1 : 1,\n x = orient === left || orient === right ? \"x\" : \"y\",\n transform = orient === top || orient === bottom ? translateX : translateY;\n\n function axis(context) {\n var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n spacing = Math.max(tickSizeInner, 0) + tickPadding,\n range = scale.range(),\n range0 = +range[0] + offset,\n range1 = +range[range.length - 1] + offset,\n position = (scale.bandwidth ? center : number)(scale.copy(), offset),\n selection = context.selection ? context.selection() : context,\n path = selection.selectAll(\".domain\").data([null]),\n tick = selection.selectAll(\".tick\").data(values, scale).order(),\n tickExit = tick.exit(),\n tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n line = tick.select(\"line\"),\n text = tick.select(\"text\");\n\n path = path.merge(path.enter().insert(\"path\", \".tick\")\n .attr(\"class\", \"domain\")\n .attr(\"stroke\", \"currentColor\"));\n\n tick = tick.merge(tickEnter);\n\n line = line.merge(tickEnter.append(\"line\")\n .attr(\"stroke\", \"currentColor\")\n .attr(x + \"2\", k * tickSizeInner));\n\n text = text.merge(tickEnter.append(\"text\")\n .attr(\"fill\", \"currentColor\")\n .attr(x, k * spacing)\n .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n\n if (context !== selection) {\n path = path.transition(context);\n tick = tick.transition(context);\n line = line.transition(context);\n text = text.transition(context);\n\n tickExit = tickExit.transition(context)\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute(\"transform\"); });\n\n tickEnter\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); });\n }\n\n tickExit.remove();\n\n path\n .attr(\"d\", orient === left || orient === right\n ? (tickSizeOuter ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H\" + offset + \"V\" + range1 + \"H\" + k * tickSizeOuter : \"M\" + offset + \",\" + range0 + \"V\" + range1)\n : (tickSizeOuter ? \"M\" + range0 + \",\" + k * tickSizeOuter + \"V\" + offset + \"H\" + range1 + \"V\" + k * tickSizeOuter : \"M\" + range0 + \",\" + offset + \"H\" + range1));\n\n tick\n .attr(\"opacity\", 1)\n .attr(\"transform\", function(d) { return transform(position(d) + offset); });\n\n line\n .attr(x + \"2\", k * tickSizeInner);\n\n text\n .attr(x, k * spacing)\n .text(format);\n\n selection.filter(entering)\n .attr(\"fill\", \"none\")\n .attr(\"font-size\", 10)\n .attr(\"font-family\", \"sans-serif\")\n .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n\n selection\n .each(function() { this.__axis = position; });\n }\n\n axis.scale = function(_) {\n return arguments.length ? (scale = _, axis) : scale;\n };\n\n axis.ticks = function() {\n return tickArguments = Array.from(arguments), axis;\n };\n\n axis.tickArguments = function(_) {\n return arguments.length ? (tickArguments = _ == null ? [] : Array.from(_), axis) : tickArguments.slice();\n };\n\n axis.tickValues = function(_) {\n return arguments.length ? (tickValues = _ == null ? null : Array.from(_), axis) : tickValues && tickValues.slice();\n };\n\n axis.tickFormat = function(_) {\n return arguments.length ? (tickFormat = _, axis) : tickFormat;\n };\n\n axis.tickSize = function(_) {\n return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeInner = function(_) {\n return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeOuter = function(_) {\n return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n };\n\n axis.tickPadding = function(_) {\n return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n };\n\n axis.offset = function(_) {\n return arguments.length ? (offset = +_, axis) : offset;\n };\n\n return axis;\n}\n\nexport function axisTop(scale) {\n return axis(top, scale);\n}\n\nexport function axisRight(scale) {\n return axis(right, scale);\n}\n\nexport function axisBottom(scale) {\n return axis(bottom, scale);\n}\n\nexport function axisLeft(scale) {\n return axis(left, scale);\n}\n", "function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n", "import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n", "// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don\u2019t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n", "function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n", "import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n", "export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n", "import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n", "import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n", "import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n", "export default function(update) {\n return new Array(update.length);\n}\n", "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n", "export default function(x) {\n return function() {\n return x;\n };\n}\n", "import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don\u2019t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn\u2019t worried about \u201Clive\u201D collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don\u2019t; we\u2019d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n", "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n", "export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n", "import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n", "export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n", "import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n", "export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n", "export default function() {\n return Array.from(this);\n}\n", "export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n", "export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n", "export default function() {\n return !this.node();\n}\n", "export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n", "export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n", "import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n", "import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n", "export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n", "import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n", "function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n", "function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n", "function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n", "function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n", "function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n", "function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n", "import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n", "import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n", "import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n", "function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n", "function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n", "export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n", "function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n", "import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n", "export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n", "import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n", "import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n", "export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n", "import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n", "export const radians = Math.PI / 180;\nexport const degrees = 180 / Math.PI;\n", "import define, {extend} from \"./define.js\";\nimport {Color, rgbConvert, Rgb} from \"./color.js\";\nimport {degrees, radians} from \"./math.js\";\n\n// https://observablehq.com/@mbostock/lab-and-rgb\nconst K = 18,\n Xn = 0.96422,\n Yn = 1,\n Zn = 0.82521,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n if (o instanceof Hcl) return hcl2lab(o);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = rgb2lrgb(o.r),\n g = rgb2lrgb(o.g),\n b = rgb2lrgb(o.b),\n y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n if (r === g && g === b) x = z = y; else {\n x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n }\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nexport function gray(l, opacity) {\n return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nexport default function lab(l, a, b, opacity) {\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nexport function Lab(l, a, b, opacity) {\n this.l = +l;\n this.a = +a;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Lab, lab, extend(Color, {\n brighter(k) {\n return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n darker(k) {\n return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n rgb() {\n var y = (this.l + 16) / 116,\n x = isNaN(this.a) ? y : y + this.a / 500,\n z = isNaN(this.b) ? y : y - this.b / 200;\n x = Xn * lab2xyz(x);\n y = Yn * lab2xyz(y);\n z = Zn * lab2xyz(z);\n return new Rgb(\n lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n this.opacity\n );\n }\n}));\n\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n if (!(o instanceof Lab)) o = labConvert(o);\n if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n var h = Math.atan2(o.b, o.a) * degrees;\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nexport function lch(l, c, h, opacity) {\n return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function hcl(h, c, l, opacity) {\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function Hcl(h, c, l, opacity) {\n this.h = +h;\n this.c = +c;\n this.l = +l;\n this.opacity = +opacity;\n}\n\nfunction hcl2lab(o) {\n if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n var h = o.h * radians;\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n}\n\ndefine(Hcl, hcl, extend(Color, {\n brighter(k) {\n return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n },\n darker(k) {\n return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n },\n rgb() {\n return hcl2lab(this).rgb();\n }\n}));\n", "export default x => () => x;\n", "import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n", "import {hcl as colorHcl} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction hcl(hue) {\n return function(start, end) {\n var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),\n c = color(start.c, end.c),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.c = c(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hcl(hue);\nexport var hclLong = hcl(color);\n", "export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", "import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", "import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n", "export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n", "import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n", "export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n", "export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n", "import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n", "import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n", "import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n", "export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n", "var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n", "import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n", "import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n", "export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, \u00B1Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n", "import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n", "export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n", "export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n", "// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n", "// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n", "import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n", "import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n", "import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n", "export default function(x) {\n return x;\n}\n", "import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"\u00B5\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"\u2212\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer \u201Cvalue\u201D part that can be\n // grouped, and fractional or exponential \u201Csuffix\u201D part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n", "import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n", "import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n", "import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n", "import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n", "function count(node) {\n var sum = 0,\n children = node.children,\n i = children && children.length;\n if (!i) sum = 1;\n else while (--i >= 0) sum += children[i].value;\n node.value = sum;\n}\n\nexport default function() {\n return this.eachAfter(count);\n}\n", "export default function(callback, that) {\n let index = -1;\n for (const node of this) {\n callback.call(that, node, ++index, this);\n }\n return this;\n}\n", "export default function(callback, that) {\n var node = this, nodes = [node], children, i, index = -1;\n while (node = nodes.pop()) {\n callback.call(that, node, ++index, this);\n if (children = node.children) {\n for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n }\n return this;\n}\n", "export default function(callback, that) {\n var node = this, nodes = [node], next = [], children, i, n, index = -1;\n while (node = nodes.pop()) {\n next.push(node);\n if (children = node.children) {\n for (i = 0, n = children.length; i < n; ++i) {\n nodes.push(children[i]);\n }\n }\n }\n while (node = next.pop()) {\n callback.call(that, node, ++index, this);\n }\n return this;\n}\n", "export default function(callback, that) {\n let index = -1;\n for (const node of this) {\n if (callback.call(that, node, ++index, this)) {\n return node;\n }\n }\n}\n", "export default function(value) {\n return this.eachAfter(function(node) {\n var sum = +value(node.data) || 0,\n children = node.children,\n i = children && children.length;\n while (--i >= 0) sum += children[i].value;\n node.value = sum;\n });\n}\n", "export default function(compare) {\n return this.eachBefore(function(node) {\n if (node.children) {\n node.children.sort(compare);\n }\n });\n}\n", "export default function(end) {\n var start = this,\n ancestor = leastCommonAncestor(start, end),\n nodes = [start];\n while (start !== ancestor) {\n start = start.parent;\n nodes.push(start);\n }\n var k = nodes.length;\n while (end !== ancestor) {\n nodes.splice(k, 0, end);\n end = end.parent;\n }\n return nodes;\n}\n\nfunction leastCommonAncestor(a, b) {\n if (a === b) return a;\n var aNodes = a.ancestors(),\n bNodes = b.ancestors(),\n c = null;\n a = aNodes.pop();\n b = bNodes.pop();\n while (a === b) {\n c = a;\n a = aNodes.pop();\n b = bNodes.pop();\n }\n return c;\n}\n", "export default function() {\n var node = this, nodes = [node];\n while (node = node.parent) {\n nodes.push(node);\n }\n return nodes;\n}\n", "export default function() {\n return Array.from(this);\n}\n", "export default function() {\n var leaves = [];\n this.eachBefore(function(node) {\n if (!node.children) {\n leaves.push(node);\n }\n });\n return leaves;\n}\n", "export default function() {\n var root = this, links = [];\n root.each(function(node) {\n if (node !== root) { // Don\u2019t include the root\u2019s parent, if any.\n links.push({source: node.parent, target: node});\n }\n });\n return links;\n}\n", "export default function*() {\n var node = this, current, next = [node], children, i, n;\n do {\n current = next.reverse(), next = [];\n while (node = current.pop()) {\n yield node;\n if (children = node.children) {\n for (i = 0, n = children.length; i < n; ++i) {\n next.push(children[i]);\n }\n }\n }\n } while (next.length);\n}\n", "import node_count from \"./count.js\";\nimport node_each from \"./each.js\";\nimport node_eachBefore from \"./eachBefore.js\";\nimport node_eachAfter from \"./eachAfter.js\";\nimport node_find from \"./find.js\";\nimport node_sum from \"./sum.js\";\nimport node_sort from \"./sort.js\";\nimport node_path from \"./path.js\";\nimport node_ancestors from \"./ancestors.js\";\nimport node_descendants from \"./descendants.js\";\nimport node_leaves from \"./leaves.js\";\nimport node_links from \"./links.js\";\nimport node_iterator from \"./iterator.js\";\n\nexport default function hierarchy(data, children) {\n if (data instanceof Map) {\n data = [undefined, data];\n if (children === undefined) children = mapChildren;\n } else if (children === undefined) {\n children = objectChildren;\n }\n\n var root = new Node(data),\n node,\n nodes = [root],\n child,\n childs,\n i,\n n;\n\n while (node = nodes.pop()) {\n if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) {\n node.children = childs;\n for (i = n - 1; i >= 0; --i) {\n nodes.push(child = childs[i] = new Node(childs[i]));\n child.parent = node;\n child.depth = node.depth + 1;\n }\n }\n }\n\n return root.eachBefore(computeHeight);\n}\n\nfunction node_copy() {\n return hierarchy(this).eachBefore(copyData);\n}\n\nfunction objectChildren(d) {\n return d.children;\n}\n\nfunction mapChildren(d) {\n return Array.isArray(d) ? d[1] : null;\n}\n\nfunction copyData(node) {\n if (node.data.value !== undefined) node.value = node.data.value;\n node.data = node.data.data;\n}\n\nexport function computeHeight(node) {\n var height = 0;\n do node.height = height;\n while ((node = node.parent) && (node.height < ++height));\n}\n\nexport function Node(data) {\n this.data = data;\n this.depth =\n this.height = 0;\n this.parent = null;\n}\n\nNode.prototype = hierarchy.prototype = {\n constructor: Node,\n count: node_count,\n each: node_each,\n eachAfter: node_eachAfter,\n eachBefore: node_eachBefore,\n find: node_find,\n sum: node_sum,\n sort: node_sort,\n path: node_path,\n ancestors: node_ancestors,\n descendants: node_descendants,\n leaves: node_leaves,\n links: node_links,\n copy: node_copy,\n [Symbol.iterator]: node_iterator\n};\n", "export default function(node) {\n node.x0 = Math.round(node.x0);\n node.y0 = Math.round(node.y0);\n node.x1 = Math.round(node.x1);\n node.y1 = Math.round(node.y1);\n}\n", "export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n node,\n i = -1,\n n = nodes.length,\n k = parent.value && (x1 - x0) / parent.value;\n\n while (++i < n) {\n node = nodes[i], node.y0 = y0, node.y1 = y1;\n node.x0 = x0, node.x1 = x0 += node.value * k;\n }\n}\n", "export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n node,\n i = -1,\n n = nodes.length,\n k = parent.value && (y1 - y0) / parent.value;\n\n while (++i < n) {\n node = nodes[i], node.x0 = x0, node.x1 = x1;\n node.y0 = y0, node.y1 = y0 += node.value * k;\n }\n}\n", "import treemapDice from \"./dice.js\";\nimport treemapSlice from \"./slice.js\";\n\nexport var phi = (1 + Math.sqrt(5)) / 2;\n\nexport function squarifyRatio(ratio, parent, x0, y0, x1, y1) {\n var rows = [],\n nodes = parent.children,\n row,\n nodeValue,\n i0 = 0,\n i1 = 0,\n n = nodes.length,\n dx, dy,\n value = parent.value,\n sumValue,\n minValue,\n maxValue,\n newRatio,\n minRatio,\n alpha,\n beta;\n\n while (i0 < n) {\n dx = x1 - x0, dy = y1 - y0;\n\n // Find the next non-empty node.\n do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);\n minValue = maxValue = sumValue;\n alpha = Math.max(dy / dx, dx / dy) / (value * ratio);\n beta = sumValue * sumValue * alpha;\n minRatio = Math.max(maxValue / beta, beta / minValue);\n\n // Keep adding nodes while the aspect ratio maintains or improves.\n for (; i1 < n; ++i1) {\n sumValue += nodeValue = nodes[i1].value;\n if (nodeValue < minValue) minValue = nodeValue;\n if (nodeValue > maxValue) maxValue = nodeValue;\n beta = sumValue * sumValue * alpha;\n newRatio = Math.max(maxValue / beta, beta / minValue);\n if (newRatio > minRatio) { sumValue -= nodeValue; break; }\n minRatio = newRatio;\n }\n\n // Position and record the row orientation.\n rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});\n if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);\n else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);\n value -= sumValue, i0 = i1;\n }\n\n return rows;\n}\n\nexport default (function custom(ratio) {\n\n function squarify(parent, x0, y0, x1, y1) {\n squarifyRatio(ratio, parent, x0, y0, x1, y1);\n }\n\n squarify.ratio = function(x) {\n return custom((x = +x) > 1 ? x : 1);\n };\n\n return squarify;\n})(phi);\n", "export function optional(f) {\n return f == null ? null : required(f);\n}\n\nexport function required(f) {\n if (typeof f !== \"function\") throw new Error;\n return f;\n}\n", "export function constantZero() {\n return 0;\n}\n\nexport default function(x) {\n return function() {\n return x;\n };\n}\n", "import roundNode from \"./round.js\";\nimport squarify from \"./squarify.js\";\nimport {required} from \"../accessors.js\";\nimport constant, {constantZero} from \"../constant.js\";\n\nexport default function() {\n var tile = squarify,\n round = false,\n dx = 1,\n dy = 1,\n paddingStack = [0],\n paddingInner = constantZero,\n paddingTop = constantZero,\n paddingRight = constantZero,\n paddingBottom = constantZero,\n paddingLeft = constantZero;\n\n function treemap(root) {\n root.x0 =\n root.y0 = 0;\n root.x1 = dx;\n root.y1 = dy;\n root.eachBefore(positionNode);\n paddingStack = [0];\n if (round) root.eachBefore(roundNode);\n return root;\n }\n\n function positionNode(node) {\n var p = paddingStack[node.depth],\n x0 = node.x0 + p,\n y0 = node.y0 + p,\n x1 = node.x1 - p,\n y1 = node.y1 - p;\n if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n node.x0 = x0;\n node.y0 = y0;\n node.x1 = x1;\n node.y1 = y1;\n if (node.children) {\n p = paddingStack[node.depth + 1] = paddingInner(node) / 2;\n x0 += paddingLeft(node) - p;\n y0 += paddingTop(node) - p;\n x1 -= paddingRight(node) - p;\n y1 -= paddingBottom(node) - p;\n if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n tile(node, x0, y0, x1, y1);\n }\n }\n\n treemap.round = function(x) {\n return arguments.length ? (round = !!x, treemap) : round;\n };\n\n treemap.size = function(x) {\n return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];\n };\n\n treemap.tile = function(x) {\n return arguments.length ? (tile = required(x), treemap) : tile;\n };\n\n treemap.padding = function(x) {\n return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();\n };\n\n treemap.paddingInner = function(x) {\n return arguments.length ? (paddingInner = typeof x === \"function\" ? x : constant(+x), treemap) : paddingInner;\n };\n\n treemap.paddingOuter = function(x) {\n return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();\n };\n\n treemap.paddingTop = function(x) {\n return arguments.length ? (paddingTop = typeof x === \"function\" ? x : constant(+x), treemap) : paddingTop;\n };\n\n treemap.paddingRight = function(x) {\n return arguments.length ? (paddingRight = typeof x === \"function\" ? x : constant(+x), treemap) : paddingRight;\n };\n\n treemap.paddingBottom = function(x) {\n return arguments.length ? (paddingBottom = typeof x === \"function\" ? x : constant(+x), treemap) : paddingBottom;\n };\n\n treemap.paddingLeft = function(x) {\n return arguments.length ? (paddingLeft = typeof x === \"function\" ? x : constant(+x), treemap) : paddingLeft;\n };\n\n return treemap;\n}\n", "export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n", "import {InternMap} from \"d3-array\";\nimport {initRange} from \"./init.js\";\n\nexport const implicit = Symbol(\"implicit\");\n\nexport default function ordinal() {\n var index = new InternMap(),\n domain = [],\n range = [],\n unknown = implicit;\n\n function scale(d) {\n let i = index.get(d);\n if (i === undefined) {\n if (unknown !== implicit) return unknown;\n index.set(d, i = domain.push(d) - 1);\n }\n return range[i % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = new InternMap();\n for (const value of _) {\n if (index.has(value)) continue;\n index.set(value, domain.push(value) - 1);\n }\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal(domain, range).unknown(unknown);\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n", "export default function constants(x) {\n return function() {\n return x;\n };\n}\n", "export default function number(x) {\n return +x;\n}\n", "import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous() {\n return transformer()(identity, identity);\n}\n", "import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n", "import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n", "const t0 = new Date, t1 = new Date;\n\nexport function timeInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n }\n\n interval.floor = (date) => {\n return floori(date = new Date(+date)), date;\n };\n\n interval.ceil = (date) => {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = (date) => {\n const d0 = interval(date), d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = (date, step) => {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = (start, stop, step) => {\n const range = [];\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n let previous;\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = (test) => {\n return timeInterval((date) => {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, (date, step) => {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = (start, end) => {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = (step) => {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? (d) => field(d) % step === 0\n : (d) => interval.count(0, d) % step === 0);\n };\n }\n\n return interval;\n}\n", "import {timeInterval} from \"./interval.js\";\n\nexport const millisecond = timeInterval(() => {\n // noop\n}, (date, step) => {\n date.setTime(+date + step);\n}, (start, end) => {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = (k) => {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return timeInterval((date) => {\n date.setTime(Math.floor(date / k) * k);\n }, (date, step) => {\n date.setTime(+date + step * k);\n }, (start, end) => {\n return (end - start) / k;\n });\n};\n\nexport const milliseconds = millisecond.range;\n", "import {timeInterval} from \"./interval.js\";\nimport {durationSecond} from \"./duration.js\";\n\nexport const second = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds());\n}, (date, step) => {\n date.setTime(+date + step * durationSecond);\n}, (start, end) => {\n return (end - start) / durationSecond;\n}, (date) => {\n return date.getUTCSeconds();\n});\n\nexport const seconds = second.range;\n", "import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeMinute = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getMinutes();\n});\n\nexport const timeMinutes = timeMinute.range;\n\nexport const utcMinute = timeInterval((date) => {\n date.setUTCSeconds(0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getUTCMinutes();\n});\n\nexport const utcMinutes = utcMinute.range;\n", "import {timeInterval} from \"./interval.js\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeHour = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getHours();\n});\n\nexport const timeHours = timeHour.range;\n\nexport const utcHour = timeInterval((date) => {\n date.setUTCMinutes(0, 0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getUTCHours();\n});\n\nexport const utcHours = utcHour.range;\n", "import {timeInterval} from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nexport const timeDay = timeInterval(\n date => date.setHours(0, 0, 0, 0),\n (date, step) => date.setDate(date.getDate() + step),\n (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay,\n date => date.getDate() - 1\n);\n\nexport const timeDays = timeDay.range;\n\nexport const utcDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return date.getUTCDate() - 1;\n});\n\nexport const utcDays = utcDay.range;\n\nexport const unixDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return Math.floor(date / durationDay);\n});\n\nexport const unixDays = unixDay.range;\n", "import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction timeWeekday(i) {\n return timeInterval((date) => {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setDate(date.getDate() + step * 7);\n }, (start, end) => {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport const timeSunday = timeWeekday(0);\nexport const timeMonday = timeWeekday(1);\nexport const timeTuesday = timeWeekday(2);\nexport const timeWednesday = timeWeekday(3);\nexport const timeThursday = timeWeekday(4);\nexport const timeFriday = timeWeekday(5);\nexport const timeSaturday = timeWeekday(6);\n\nexport const timeSundays = timeSunday.range;\nexport const timeMondays = timeMonday.range;\nexport const timeTuesdays = timeTuesday.range;\nexport const timeWednesdays = timeWednesday.range;\nexport const timeThursdays = timeThursday.range;\nexport const timeFridays = timeFriday.range;\nexport const timeSaturdays = timeSaturday.range;\n\nfunction utcWeekday(i) {\n return timeInterval((date) => {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, (start, end) => {\n return (end - start) / durationWeek;\n });\n}\n\nexport const utcSunday = utcWeekday(0);\nexport const utcMonday = utcWeekday(1);\nexport const utcTuesday = utcWeekday(2);\nexport const utcWednesday = utcWeekday(3);\nexport const utcThursday = utcWeekday(4);\nexport const utcFriday = utcWeekday(5);\nexport const utcSaturday = utcWeekday(6);\n\nexport const utcSundays = utcSunday.range;\nexport const utcMondays = utcMonday.range;\nexport const utcTuesdays = utcTuesday.range;\nexport const utcWednesdays = utcWednesday.range;\nexport const utcThursdays = utcThursday.range;\nexport const utcFridays = utcFriday.range;\nexport const utcSaturdays = utcSaturday.range;\n", "import {timeInterval} from \"./interval.js\";\n\nexport const timeMonth = timeInterval((date) => {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setMonth(date.getMonth() + step);\n}, (start, end) => {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, (date) => {\n return date.getMonth();\n});\n\nexport const timeMonths = timeMonth.range;\n\nexport const utcMonth = timeInterval((date) => {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, (start, end) => {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, (date) => {\n return date.getUTCMonth();\n});\n\nexport const utcMonths = utcMonth.range;\n", "import {timeInterval} from \"./interval.js\";\n\nexport const timeYear = timeInterval((date) => {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setFullYear(date.getFullYear() + step);\n}, (start, end) => {\n return end.getFullYear() - start.getFullYear();\n}, (date) => {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\ntimeYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport const timeYears = timeYear.range;\n\nexport const utcYear = timeInterval((date) => {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, (start, end) => {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, (date) => {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport const utcYears = utcYear.range;\n", "import {bisector, tickStep} from \"d3-array\";\nimport {durationDay, durationHour, durationMinute, durationMonth, durationSecond, durationWeek, durationYear} from \"./duration.js\";\nimport {millisecond} from \"./millisecond.js\";\nimport {second} from \"./second.js\";\nimport {timeMinute, utcMinute} from \"./minute.js\";\nimport {timeHour, utcHour} from \"./hour.js\";\nimport {timeDay, unixDay} from \"./day.js\";\nimport {timeSunday, utcSunday} from \"./week.js\";\nimport {timeMonth, utcMonth} from \"./month.js\";\nimport {timeYear, utcYear} from \"./year.js\";\n\nfunction ticker(year, month, week, day, hour, minute) {\n\n const tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function ticks(start, stop, count) {\n const reverse = stop < start;\n if (reverse) [start, stop] = [stop, start];\n const interval = count && typeof count.range === \"function\" ? count : tickInterval(start, stop, count);\n const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop\n return reverse ? ticks.reverse() : ticks;\n }\n\n function tickInterval(start, stop, count) {\n const target = Math.abs(stop - start) / count;\n const i = bisector(([,, step]) => step).right(tickIntervals, target);\n if (i === tickIntervals.length) return year.every(tickStep(start / durationYear, stop / durationYear, count));\n if (i === 0) return millisecond.every(Math.max(tickStep(start, stop, count), 1));\n const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n return t.every(step);\n }\n\n return [ticks, tickInterval];\n}\n\nconst [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\nconst [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n\nexport {utcTicks, utcTickInterval, timeTicks, timeTickInterval};\n", "import {\n timeDay,\n timeSunday,\n timeMonday,\n timeThursday,\n timeYear,\n utcDay,\n utcSunday,\n utcMonday,\n utcThursday,\n utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"g\": formatYearISO,\n \"G\": formatFullYearISO,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"q\": formatQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"g\": formatUTCYearISO,\n \"G\": formatUTCFullYearISO,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"q\": formatUTCQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"g\": parseYear,\n \"G\": parseFullYear,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"q\": parseQuarter,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, Z) {\n return function(string) {\n var d = newDate(1900, undefined, 1),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n\n // If this is utcParse, never use the local timezone.\n if (Z && !(\"Z\" in d)) d.Z = 0;\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // If the month was not specified, inherit from the quarter.\n if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return localDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatQuarter(d) {\n return 1 + ~~(d.getMonth() / 3);\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n function formatUTCQuarter(d) {\n return 1 + ~~(d.getUTCMonth() / 3);\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", false);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier += \"\", true);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n return new Map(names.map((name, i) => [name.toLowerCase(), i]));\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction dISO(d) {\n var day = d.getDay();\n return (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n}\n\nfunction formatWeekNumberISO(d, p) {\n d = dISO(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatYearISO(d, p) {\n d = dISO(d);\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatFullYearISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction UTCdISO(d) {\n var day = d.getUTCDay();\n return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n d = UTCdISO(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCYearISO(d, p) {\n d = UTCdISO(d);\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCFullYearISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n", "import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}\n", "export default function nice(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}\n", "import {timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeTicks, timeTickInterval} from \"d3-time\";\nimport {timeFormat} from \"d3-time-format\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport nice from \"./nice.js\";\n\nfunction date(t) {\n return new Date(t);\n}\n\nfunction number(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\n\nexport function calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format) {\n var scale = continuous(),\n invert = scale.invert,\n domain = scale.domain;\n\n var formatMillisecond = format(\".%L\"),\n formatSecond = format(\":%S\"),\n formatMinute = format(\"%I:%M\"),\n formatHour = format(\"%I %p\"),\n formatDay = format(\"%a %d\"),\n formatWeek = format(\"%b %d\"),\n formatMonth = format(\"%B\"),\n formatYear = format(\"%Y\");\n\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond\n : minute(date) < date ? formatSecond\n : hour(date) < date ? formatMinute\n : day(date) < date ? formatHour\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n : year(date) < date ? formatMonth\n : formatYear)(date);\n }\n\n scale.invert = function(y) {\n return new Date(invert(y));\n };\n\n scale.domain = function(_) {\n return arguments.length ? domain(Array.from(_, number)) : domain().map(date);\n };\n\n scale.ticks = function(interval) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], interval == null ? 10 : interval);\n };\n\n scale.tickFormat = function(count, specifier) {\n return specifier == null ? tickFormat : format(specifier);\n };\n\n scale.nice = function(interval) {\n var d = domain();\n if (!interval || typeof interval.range !== \"function\") interval = tickInterval(d[0], d[d.length - 1], interval == null ? 10 : interval);\n return interval ? domain(nice(d, interval)) : scale;\n };\n\n scale.copy = function() {\n return copy(scale, calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format));\n };\n\n return scale;\n}\n\nexport default function time() {\n return initRange.apply(calendar(timeTicks, timeTickInterval, timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);\n}\n", "import {range as sequence} from \"d3-array\";\nimport {initRange} from \"./init.js\";\nimport ordinal from \"./ordinal.js\";\n\nexport default function band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n r0 = 0,\n r1 = 1,\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n\n delete scale.unknown;\n\n function rescale() {\n var n = domain().length,\n reverse = r1 < r0,\n start = reverse ? r1 : r0,\n stop = reverse ? r0 : r1;\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = sequence(n).map(function(i) { return start + step * i; });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.range = function(_) {\n return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1];\n };\n\n scale.rangeRound = function(_) {\n return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale();\n };\n\n scale.bandwidth = function() {\n return bandwidth;\n };\n\n scale.step = function() {\n return step;\n };\n\n scale.round = function(_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n\n scale.padding = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\n };\n\n scale.paddingInner = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\n };\n\n scale.paddingOuter = function(_) {\n return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\n };\n\n scale.align = function(_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n\n scale.copy = function() {\n return band(domain(), [r0, r1])\n .round(round)\n .paddingInner(paddingInner)\n .paddingOuter(paddingOuter)\n .align(align);\n };\n\n return initRange.apply(rescale(), arguments);\n}\n\nfunction pointish(scale) {\n var copy = scale.copy;\n\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n\n scale.copy = function() {\n return pointish(copy());\n };\n\n return scale;\n}\n\nexport function point() {\n return pointish(band.apply(null, arguments).paddingInner(1));\n}\n", "export default function(specifier) {\n var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;\n while (i < n) colors[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n return colors;\n}\n", "import colors from \"../colors.js\";\n\nexport default colors(\"4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab\");\n", "export default function(x) {\n return function constant() {\n return x;\n };\n}\n", "export const abs = Math.abs;\nexport const atan2 = Math.atan2;\nexport const cos = Math.cos;\nexport const max = Math.max;\nexport const min = Math.min;\nexport const sin = Math.sin;\nexport const sqrt = Math.sqrt;\n\nexport const epsilon = 1e-12;\nexport const pi = Math.PI;\nexport const halfPi = pi / 2;\nexport const tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n", "const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nexport class Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n this._append = digits == null ? append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We\u2019re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nexport function path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n return new Path(+digits);\n}\n", "import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n", "import constant from \"./constant.js\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math.js\";\nimport {withPath} from \"./path.js\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null,\n path = withPath(arc);\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 \u2265 r0, da1 \u2265 da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle. If this\n // intersection fails, it\u2019s probably because the arc is too small, so\n // disable the corner radius entirely.\n if (da < pi) {\n if (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10)) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n } else {\n rc0 = rc1 = 0;\n }\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector\u2019s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it\u2019s a circular sector?\n // Or perhaps it\u2019s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector\u2019s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n", "function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // falls through\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n", "export var slice = Array.prototype.slice;\n\nexport default function(x) {\n return typeof x === \"object\" && \"length\" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n", "export function x(p) {\n return p[0];\n}\n\nexport function y(p) {\n return p[1];\n}\n", "import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport {withPath} from \"./path.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function(x, y) {\n var defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null,\n path = withPath(line);\n\n x = typeof x === \"function\" ? x : (x === undefined) ? pointX : constant(x);\n y = typeof y === \"function\" ? y : (y === undefined) ? pointY : constant(y);\n\n function line(data) {\n var i,\n n = (data = array(data)).length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n };\n\n line.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n}\n", "export default function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n", "export default function(d) {\n return d;\n}\n", "import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport descending from \"./descending.js\";\nimport identity from \"./identity.js\";\nimport {tau} from \"./math.js\";\n\nexport default function() {\n var value = identity,\n sortValues = descending,\n sort = null,\n startAngle = constant(0),\n endAngle = constant(tau),\n padAngle = constant(0);\n\n function pie(data) {\n var i,\n n = (data = array(data)).length,\n j,\n k,\n sum = 0,\n index = new Array(n),\n arcs = new Array(n),\n a0 = +startAngle.apply(this, arguments),\n da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n a1,\n p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n pa = p * (da < 0 ? -1 : 1),\n v;\n\n for (i = 0; i < n; ++i) {\n if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n sum += v;\n }\n }\n\n // Optionally sort the arcs by previously-computed values or by data.\n if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\n // Compute the arcs! They are stored in the original data's order.\n for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n data: data[j],\n index: i,\n value: v,\n startAngle: a0,\n endAngle: a1,\n padAngle: p\n };\n }\n\n return arcs;\n }\n\n pie.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), pie) : value;\n };\n\n pie.sortValues = function(_) {\n return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n };\n\n pie.sort = function(_) {\n return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n };\n\n pie.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : startAngle;\n };\n\n pie.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : endAngle;\n };\n\n pie.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : padAngle;\n };\n\n return pie;\n}\n", "import pointRadial from \"../pointRadial.js\";\n\nclass Bump {\n constructor(context, x) {\n this._context = context;\n this._x = x;\n }\n areaStart() {\n this._line = 0;\n }\n areaEnd() {\n this._line = NaN;\n }\n lineStart() {\n this._point = 0;\n }\n lineEnd() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n }\n point(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: {\n this._point = 1;\n if (this._line) this._context.lineTo(x, y);\n else this._context.moveTo(x, y);\n break;\n }\n case 1: this._point = 2; // falls through\n default: {\n if (this._x) this._context.bezierCurveTo(this._x0 = (this._x0 + x) / 2, this._y0, this._x0, y, x, y);\n else this._context.bezierCurveTo(this._x0, this._y0 = (this._y0 + y) / 2, x, this._y0, x, y);\n break;\n }\n }\n this._x0 = x, this._y0 = y;\n }\n}\n\nclass BumpRadial {\n constructor(context) {\n this._context = context;\n }\n lineStart() {\n this._point = 0;\n }\n lineEnd() {}\n point(x, y) {\n x = +x, y = +y;\n if (this._point === 0) {\n this._point = 1;\n } else {\n const p0 = pointRadial(this._x0, this._y0);\n const p1 = pointRadial(this._x0, this._y0 = (this._y0 + y) / 2);\n const p2 = pointRadial(x, this._y0);\n const p3 = pointRadial(x, y);\n this._context.moveTo(...p0);\n this._context.bezierCurveTo(...p1, ...p2, ...p3);\n }\n this._x0 = x, this._y0 = y;\n }\n}\n\nexport function bumpX(context) {\n return new Bump(context, true);\n}\n\nexport function bumpY(context) {\n return new Bump(context, false);\n}\n\nexport function bumpRadial(context) {\n return new BumpRadial(context);\n}\n", "export function point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nexport function Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // falls through\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // falls through\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new Basis(context);\n}\n", "export default function() {}\n", "import noop from \"../noop.js\";\nimport {point} from \"./basis.js\";\n\nfunction BasisClosed(context) {\n this._context = context;\n}\n\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisClosed(context);\n}\n", "import {point} from \"./basis.js\";\n\nfunction BasisOpen(context) {\n this._context = context;\n}\n\nBasisOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n case 3: this._point = 4; // falls through\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisOpen(context);\n}\n", "import {Basis} from \"./basis.js\";\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nexport default (function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85);\n", "export function point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nexport function Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // falls through\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n", "import noop from \"../noop.js\";\nimport {point} from \"./cardinal.js\";\n\nexport function CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n", "import {point} from \"./cardinal.js\";\n\nexport function CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // falls through\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n", "import {epsilon} from \"../math.js\";\nimport {Cardinal} from \"./cardinal.js\";\n\nexport function point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // falls through\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n", "import {CardinalClosed} from \"./cardinalClosed.js\";\nimport noop from \"../noop.js\";\nimport {point} from \"./catmullRom.js\";\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n", "import {CardinalOpen} from \"./cardinalOpen.js\";\nimport {point} from \"./catmullRom.js\";\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // falls through\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n", "import noop from \"../noop.js\";\n\nfunction LinearClosed(context) {\n this._context = context;\n}\n\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._point) this._context.closePath();\n },\n point: function(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);\n else this._point = 1, this._context.moveTo(x, y);\n }\n};\n\nexport default function(context) {\n return new LinearClosed(context);\n}\n", "function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic B\u00E9zier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n", "function Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nexport default function(context) {\n return new Natural(context);\n}\n", "function Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // falls through\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nexport default function(context) {\n return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n return new Step(context, 1);\n}\n", "var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n", "var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we\u2019ve set an alarm, if we haven\u2019t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n", "import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n", "import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n", "import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we\u2019re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we\u2019re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n", "import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n", "import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n", "import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n", "import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n", "import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n", "import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n", "import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n", "import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n", "function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n", "import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n", "import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n", "import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n", "import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n", "function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n", "import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n", "function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n", "import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n", "import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n", "import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n", "export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n", "import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n", "import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n", "import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {pointer, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport BrushEvent from \"./event.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nconst {abs, max, min} = Math;\n\nfunction number1(e) {\n return [+e[0], +e[1]];\n}\n\nfunction number2(e) {\n return [number1(e[0]), number1(e[1])];\n}\n\nvar X = {\n name: \"x\",\n handles: [\"w\", \"e\"].map(type),\n input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"w\", \"e\", \"s\", \"nw\", \"ne\", \"sw\", \"se\"].map(type),\n input: function(xy) { return xy == null ? null : number2(xy); },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n if (svg.hasAttribute(\"viewBox\")) {\n svg = svg.viewBox.baseVal;\n return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\n }\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\n// Like d3.local, but with the name \u201C__brush\u201D rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n touchable = defaultTouchable,\n keys = true,\n listeners = dispatch(\"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .on(\"mousedown.brush\", started)\n .filter(touchable)\n .on(\"touchstart.brush\", started)\n .on(\"touchmove.brush\", touchmoved)\n .on(\"touchend.brush touchcancel.brush\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n brush.move = function(group, selection, event) {\n if (group.tween) {\n group\n .on(\"start.brush\", function(event) { emitter(this, arguments).beforestart().start(event); })\n .on(\"interrupt.brush end.brush\", function(event) { emitter(this, arguments).end(event); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && selection1 === null ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 !== null && selection1 !== null ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 === null ? null : selection1;\n redraw.call(that);\n emit.start(event).brush(event).end(event);\n });\n }\n };\n\n brush.clear = function(group, event) {\n brush.move(group, null, event);\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args, clean) {\n var emit = that.__brush.emitter;\n return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean);\n }\n\n function Emitter(that, args, clean) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n this.clean = clean;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function(event, mode) {\n if (this.starting) this.starting = false, this.emit(\"start\", event, mode);\n else this.emit(\"brush\", event);\n return this;\n },\n brush: function(event, mode) {\n this.emit(\"brush\", event, mode);\n return this;\n },\n end: function(event, mode) {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\", event, mode);\n return this;\n },\n emit: function(type, event, mode) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new BrushEvent(type, {\n sourceEvent: event,\n target: brush,\n selection: dim.output(this.state.selection),\n mode,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function started(event) {\n if (touchending && !event.touches) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (keys && event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx = 0,\n dy = 0,\n moving,\n shifting = signX && signY && keys && event.shiftKey,\n lockX,\n lockY,\n points = Array.from(event.touches || [event], t => {\n const i = t.identifier;\n t = pointer(t, that);\n t.point0 = t.slice();\n t.identifier = i;\n return t;\n });\n\n interrupt(that);\n var emit = emitter(that, arguments, true).beforestart();\n\n if (type === \"overlay\") {\n if (selection) moving = true;\n const pts = [points[0], points[1] || points[0]];\n state.selection = selection = [[\n w0 = dim === Y ? W : min(pts[0][0], pts[1][0]),\n n0 = dim === X ? N : min(pts[0][1], pts[1][1])\n ], [\n e0 = dim === Y ? E : max(pts[0][0], pts[1][0]),\n s0 = dim === X ? S : max(pts[0][1], pts[1][1])\n ]];\n if (points.length > 1) move(event);\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n if (event.touches) {\n emit.moved = moved;\n emit.ended = ended;\n } else {\n var view = select(event.view)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n if (keys) view\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n\n dragDisable(event.view);\n }\n\n redraw.call(that);\n emit.start(event, mode.name);\n\n function moved(event) {\n for (const p of event.changedTouches || [event]) {\n for (const d of points)\n if (d.identifier === p.identifier) d.cur = pointer(p, that);\n }\n if (shifting && !lockX && !lockY && points.length === 1) {\n const point = points[0];\n if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1]))\n lockY = true;\n else\n lockX = true;\n }\n for (const point of points)\n if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1];\n moving = true;\n noevent(event);\n move(event);\n }\n\n function move(event) {\n const point = points[0], point0 = point.point0;\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (points[1]) {\n if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1;\n if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1;\n } else {\n if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n }\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX));\n if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush(event, mode.name);\n }\n }\n\n function ended(event) {\n nopropagation(event);\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end(event, mode.name);\n }\n\n function keydowned(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move(event);\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n\n function keyupped(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move(event);\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move(event);\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n }\n\n function touchmoved(event) {\n emitter(this, arguments).moved(event);\n }\n\n function touchended(event) {\n emitter(this, arguments).ended(event);\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = number2(extent.apply(this, arguments));\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant(number2(_)), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), brush) : touchable;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.keyModifiers = function(_) {\n return arguments.length ? (keys = !!_, brush) : keys;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n", "export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n"], + "mappings": "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", + "names": ["require_dayjs_min", "__commonJSMin", "exports", "module", "r", "i", "s", "u", "a", "o", "c", "f", "h", "d", "l", "$", "y", "M", "__name", "t", "e", "n", "m", "v", "g", "D", "p", "S", "_", "w", "O", "b", "k", "import_dayjs", "LEVELS", "log", "__name", "_args", "setLogLevel", "level", "numericLevel", "format", "dayjs", "max", "values", "valueof", "value", "index", "__name", "min", "values", "valueof", "value", "index", "__name", "ascending", "a", "b", "__name", "descending", "a", "b", "__name", "bisector", "f", "compare1", "compare2", "delta", "ascending", "__name", "d", "x", "descending", "zero", "left", "a", "lo", "hi", "mid", "right", "center", "i", "number", "x", "__name", "ascendingBisect", "bisector", "ascending", "bisectRight", "bisectLeft", "bisectCenter", "number", "bisect_default", "InternMap", "__name", "entries", "key", "keyof", "value", "intern_get", "intern_set", "intern_delete", "intern_get", "_intern", "_key", "value", "key", "__name", "intern_set", "intern_delete", "keyof", "e10", "e5", "e2", "tickSpec", "start", "stop", "count", "step", "power", "error", "factor", "i1", "i2", "inc", "__name", "ticks", "reverse", "n", "i", "tickIncrement", "tickStep", "range", "start", "stop", "step", "n", "__name", "identity_default", "x", "__name", "top", "right", "bottom", "left", "epsilon", "translateX", "x", "__name", "translateY", "y", "number", "scale", "d", "center", "offset", "entering", "axis", "orient", "tickArguments", "tickValues", "tickFormat", "tickSizeInner", "tickSizeOuter", "tickPadding", "k", "transform", "context", "values", "format", "identity_default", "spacing", "range", "range0", "range1", "position", "selection", "path", "tick", "tickExit", "tickEnter", "line", "text", "p", "_", "axisTop", "axisBottom", "scale", "axis", "bottom", "__name", "none", "__name", "selector_default", "selector", "select_default", "select", "selector_default", "groups", "m", "subgroups", "j", "group", "n", "subgroup", "node", "subnode", "i", "Selection", "__name", "array", "x", "__name", "empty", "__name", "selectorAll_default", "selector", "arrayAll", "select", "array", "__name", "selectAll_default", "selectorAll_default", "groups", "m", "subgroups", "parents", "j", "group", "n", "node", "i", "Selection", "matcher_default", "selector", "__name", "childMatcher", "node", "find", "childFind", "match", "__name", "childFirst", "selectChild_default", "childMatcher", "filter", "children", "__name", "childrenFilter", "match", "selectChildren_default", "childMatcher", "filter_default", "match", "matcher_default", "groups", "m", "subgroups", "j", "group", "n", "subgroup", "node", "i", "Selection", "__name", "sparse_default", "update", "__name", "enter_default", "Selection", "sparse_default", "__name", "EnterNode", "parent", "datum", "child", "next", "selector", "constant_default", "x", "__name", "bindIndex", "parent", "group", "enter", "update", "exit", "data", "i", "node", "groupLength", "dataLength", "EnterNode", "__name", "bindKey", "key", "nodeByKeyValue", "keyValues", "keyValue", "datum", "data_default", "value", "bind", "parents", "groups", "constant_default", "m", "j", "arraylike", "enterGroup", "updateGroup", "exitGroup", "i0", "i1", "previous", "next", "Selection", "exit_default", "Selection", "sparse_default", "__name", "join_default", "onenter", "onupdate", "onexit", "enter", "update", "exit", "__name", "merge_default", "context", "selection", "groups0", "groups1", "m0", "m1", "m", "merges", "j", "group0", "group1", "n", "merge", "node", "i", "Selection", "__name", "order_default", "groups", "j", "m", "group", "i", "next", "node", "__name", "sort_default", "compare", "ascending", "compareNode", "a", "b", "__name", "groups", "m", "sortgroups", "j", "group", "n", "sortgroup", "node", "i", "Selection", "call_default", "callback", "__name", "nodes_default", "__name", "node_default", "groups", "j", "m", "group", "i", "n", "node", "__name", "size_default", "size", "node", "__name", "empty_default", "__name", "each_default", "callback", "groups", "j", "m", "group", "i", "n", "node", "__name", "xhtml", "namespaces_default", "namespace_default", "name", "prefix", "i", "namespaces_default", "__name", "attrRemove", "name", "__name", "attrRemoveNS", "fullname", "attrConstant", "value", "attrConstantNS", "attrFunction", "v", "attrFunctionNS", "attr_default", "namespace_default", "node", "window_default", "node", "__name", "styleRemove", "name", "__name", "styleConstant", "value", "priority", "styleFunction", "v", "style_default", "styleValue", "node", "window_default", "propertyRemove", "name", "__name", "propertyConstant", "value", "propertyFunction", "v", "property_default", "classArray", "string", "__name", "classList", "node", "ClassList", "name", "i", "classedAdd", "names", "list", "n", "classedRemove", "classedTrue", "classedFalse", "classedFunction", "value", "classed_default", "textRemove", "__name", "textConstant", "value", "textFunction", "v", "text_default", "htmlRemove", "__name", "htmlConstant", "value", "htmlFunction", "v", "html_default", "raise", "__name", "raise_default", "lower", "__name", "lower_default", "creatorInherit", "name", "document", "uri", "xhtml", "__name", "creatorFixed", "fullname", "creator_default", "namespace_default", "append_default", "name", "create", "creator_default", "__name", "constantNull", "__name", "insert_default", "name", "before", "create", "creator_default", "select", "selector_default", "remove", "parent", "__name", "remove_default", "selection_cloneShallow", "clone", "parent", "__name", "selection_cloneDeep", "clone_default", "deep", "datum_default", "value", "__name", "contextListener", "listener", "event", "__name", "parseTypenames", "typenames", "t", "name", "onRemove", "typename", "on", "j", "m", "o", "onAdd", "value", "options", "on_default", "i", "n", "dispatchEvent", "node", "type", "params", "window", "window_default", "event", "__name", "dispatchConstant", "dispatchFunction", "dispatch_default", "iterator_default", "groups", "j", "m", "group", "i", "n", "node", "__name", "root", "Selection", "groups", "parents", "__name", "selection", "selection_selection", "select_default", "selectAll_default", "selectChild_default", "selectChildren_default", "filter_default", "data_default", "enter_default", "exit_default", "join_default", "merge_default", "order_default", "sort_default", "call_default", "nodes_default", "node_default", "size_default", "empty_default", "each_default", "attr_default", "style_default", "property_default", "classed_default", "text_default", "html_default", "raise_default", "lower_default", "append_default", "insert_default", "remove_default", "clone_default", "datum_default", "on_default", "dispatch_default", "iterator_default", "selection_default", "select_default", "selector", "Selection", "root", "__name", "define_default", "constructor", "factory", "prototype", "__name", "extend", "parent", "definition", "key", "Color", "__name", "darker", "brighter", "reI", "reN", "reP", "reHex", "reRgbInteger", "reRgbPercent", "reRgbaInteger", "reRgbaPercent", "reHslPercent", "reHslaPercent", "named", "define_default", "color", "channels", "color_formatHex", "color_formatHex8", "color_formatHsl", "color_formatRgb", "hslConvert", "format", "m", "l", "rgbn", "Rgb", "rgba", "hsla", "n", "r", "g", "b", "a", "rgbConvert", "o", "rgb", "opacity", "extend", "k", "clampi", "clampa", "rgb_formatHex", "rgb_formatHex8", "rgb_formatRgb", "hex", "value", "h", "s", "Hsl", "min", "max", "hsl", "m2", "m1", "hsl2rgb", "clamph", "clampt", "radians", "degrees", "K", "Xn", "Yn", "Zn", "t0", "t1", "t2", "t3", "labConvert", "o", "Lab", "Hcl", "hcl2lab", "Rgb", "rgbConvert", "r", "rgb2lrgb", "g", "b", "y", "xyz2lab", "x", "z", "__name", "lab", "l", "a", "b", "opacity", "labConvert", "Lab", "__name", "define_default", "extend", "Color", "k", "K", "y", "x", "z", "Xn", "lab2xyz", "Yn", "Zn", "Rgb", "lrgb2rgb", "xyz2lab", "t3", "t2", "t0", "t1", "rgb2lrgb", "hclConvert", "o", "Hcl", "h", "degrees", "hcl", "h", "c", "l", "opacity", "hclConvert", "Hcl", "__name", "hcl2lab", "o", "Lab", "radians", "define_default", "extend", "Color", "k", "K", "constant_default", "__name", "x", "linear", "a", "d", "t", "__name", "exponential", "b", "y", "hue", "constant_default", "gamma", "nogamma", "hcl", "hue", "start", "end", "h", "c", "nogamma", "l", "opacity", "t", "__name", "hcl_default", "hclLong", "basis", "t1", "v0", "v1", "v2", "v3", "t2", "t3", "__name", "basis_default", "values", "n", "t", "basisClosed_default", "values", "n", "t", "v0", "v1", "v2", "v3", "basis", "__name", "rgb_default", "__name", "rgbGamma", "y", "color", "gamma", "rgb", "start", "end", "r", "g", "b", "opacity", "nogamma", "t", "rgbSpline", "spline", "colors", "i", "rgbBasis", "basis_default", "rgbBasisClosed", "basisClosed_default", "numberArray_default", "a", "b", "c", "i", "t", "__name", "isNumberArray", "x", "genericArray", "a", "b", "nb", "na", "x", "c", "i", "value_default", "t", "__name", "date_default", "a", "b", "d", "t", "__name", "number_default", "a", "b", "t", "__name", "object_default", "a", "b", "i", "c", "k", "value_default", "t", "__name", "reA", "reB", "zero", "b", "__name", "one", "t", "string_default", "a", "bi", "am", "bm", "bs", "i", "s", "q", "number_default", "o", "value_default", "a", "b", "t", "c", "constant_default", "number_default", "color", "rgb_default", "string_default", "date_default", "isNumberArray", "numberArray_default", "genericArray", "object_default", "__name", "round_default", "a", "b", "t", "__name", "degrees", "identity", "decompose_default", "a", "b", "c", "d", "e", "f", "scaleX", "scaleY", "skewX", "__name", "svgNode", "parseCss", "value", "m", "identity", "decompose_default", "__name", "parseSvg", "interpolateTransform", "parse", "pxComma", "pxParen", "degParen", "pop", "s", "__name", "translate", "xa", "ya", "xb", "yb", "q", "i", "number_default", "rotate", "a", "b", "skewX", "scale", "t", "n", "o", "interpolateTransformCss", "parseCss", "interpolateTransformSvg", "parseSvg", "formatDecimal_default", "x", "__name", "formatDecimalParts", "p", "i", "coefficient", "exponent_default", "x", "formatDecimalParts", "__name", "formatGroup_default", "grouping", "thousands", "value", "width", "i", "t", "j", "g", "length", "__name", "formatNumerals_default", "numerals", "value", "i", "__name", "re", "formatSpecifier", "specifier", "match", "FormatSpecifier", "__name", "formatTrim_default", "s", "out", "n", "i", "i0", "i1", "__name", "prefixExponent", "formatPrefixAuto_default", "x", "p", "d", "formatDecimalParts", "coefficient", "exponent", "i", "n", "__name", "formatRounded_default", "x", "p", "d", "formatDecimalParts", "coefficient", "exponent", "__name", "formatTypes_default", "__name", "x", "p", "formatDecimal_default", "formatRounded_default", "formatPrefixAuto_default", "identity_default", "x", "__name", "map", "prefixes", "locale_default", "locale", "group", "identity_default", "formatGroup_default", "currencyPrefix", "currencySuffix", "decimal", "numerals", "formatNumerals_default", "percent", "minus", "nan", "newFormat", "specifier", "formatSpecifier", "fill", "align", "sign", "symbol", "zero", "width", "comma", "precision", "trim", "type", "formatTypes_default", "prefix", "suffix", "formatType", "maybeSuffix", "format", "value", "valuePrefix", "valueSuffix", "i", "n", "c", "valueNegative", "formatTrim_default", "prefixExponent", "length", "padding", "__name", "formatPrefix", "f", "e", "exponent_default", "k", "locale", "format", "formatPrefix", "defaultLocale", "definition", "locale_default", "__name", "precisionFixed_default", "step", "exponent_default", "__name", "precisionPrefix_default", "step", "value", "exponent_default", "__name", "precisionRound_default", "step", "max", "exponent_default", "__name", "count", "node", "sum", "children", "__name", "count_default", "each_default", "callback", "that", "index", "node", "__name", "eachBefore_default", "callback", "that", "node", "nodes", "children", "i", "index", "__name", "eachAfter_default", "callback", "that", "node", "nodes", "next", "children", "i", "n", "index", "__name", "find_default", "callback", "that", "index", "node", "__name", "sum_default", "value", "node", "sum", "children", "i", "__name", "sort_default", "compare", "node", "__name", "path_default", "end", "start", "ancestor", "leastCommonAncestor", "nodes", "k", "__name", "a", "b", "aNodes", "bNodes", "c", "ancestors_default", "node", "nodes", "__name", "descendants_default", "__name", "leaves_default", "leaves", "node", "__name", "links_default", "root", "links", "node", "__name", "iterator_default", "node", "current", "next", "children", "i", "n", "__name", "hierarchy", "data", "children", "mapChildren", "objectChildren", "root", "Node", "node", "nodes", "child", "childs", "i", "n", "computeHeight", "__name", "node_copy", "copyData", "d", "height", "count_default", "each_default", "eachAfter_default", "eachBefore_default", "find_default", "sum_default", "sort_default", "path_default", "ancestors_default", "descendants_default", "leaves_default", "links_default", "iterator_default", "round_default", "node", "__name", "dice_default", "parent", "x0", "y0", "x1", "y1", "nodes", "node", "i", "n", "k", "__name", "slice_default", "parent", "x0", "y0", "x1", "y1", "nodes", "node", "i", "n", "k", "__name", "phi", "squarifyRatio", "ratio", "parent", "x0", "y0", "x1", "y1", "rows", "nodes", "row", "nodeValue", "i0", "i1", "n", "dx", "dy", "value", "sumValue", "minValue", "maxValue", "newRatio", "minRatio", "alpha", "beta", "dice_default", "slice_default", "__name", "squarify_default", "custom", "squarify", "x", "required", "f", "__name", "constantZero", "__name", "constant_default", "x", "treemap_default", "tile", "squarify_default", "round", "dx", "dy", "paddingStack", "paddingInner", "constantZero", "paddingTop", "paddingRight", "paddingBottom", "paddingLeft", "treemap", "root", "positionNode", "round_default", "__name", "node", "p", "x0", "y0", "x1", "y1", "x", "required", "constant_default", "initRange", "domain", "range", "__name", "implicit", "ordinal", "index", "InternMap", "domain", "range", "unknown", "scale", "d", "i", "__name", "_", "value", "initRange", "constants", "x", "__name", "number", "x", "__name", "unit", "identity", "x", "__name", "normalize", "a", "b", "constants", "clamper", "t", "bimap", "domain", "range", "interpolate", "d0", "d1", "r0", "r1", "polymap", "j", "d", "r", "i", "bisect_default", "copy", "source", "target", "transformer", "value_default", "transform", "untransform", "unknown", "clamp", "piecewise", "output", "input", "rescale", "n", "scale", "y", "number_default", "_", "number", "round_default", "u", "continuous", "tickFormat", "start", "stop", "count", "specifier", "step", "tickStep", "precision", "formatSpecifier", "value", "precisionPrefix_default", "formatPrefix", "precisionRound_default", "precisionFixed_default", "format", "__name", "linearish", "scale", "domain", "count", "d", "ticks", "specifier", "tickFormat", "i0", "i1", "start", "stop", "prestep", "step", "maxIter", "tickIncrement", "__name", "linear", "continuous", "copy", "initRange", "t0", "t1", "timeInterval", "floori", "offseti", "count", "field", "interval", "date", "__name", "d0", "d1", "step", "start", "stop", "range", "previous", "test", "end", "d", "millisecond", "timeInterval", "date", "step", "start", "end", "k", "milliseconds", "second", "timeInterval", "date", "step", "start", "end", "seconds", "timeMinute", "timeInterval", "date", "step", "start", "end", "timeMinutes", "utcMinute", "utcMinutes", "timeHour", "timeInterval", "date", "step", "start", "end", "timeHours", "utcHour", "utcHours", "timeDay", "timeInterval", "date", "step", "start", "end", "timeDays", "utcDay", "utcDays", "unixDay", "unixDays", "timeWeekday", "i", "timeInterval", "date", "step", "start", "end", "__name", "timeSunday", "timeMonday", "timeTuesday", "timeWednesday", "timeThursday", "timeFriday", "timeSaturday", "timeSundays", "timeMondays", "timeTuesdays", "timeWednesdays", "timeThursdays", "timeFridays", "timeSaturdays", "utcWeekday", "utcSunday", "utcMonday", "utcTuesday", "utcWednesday", "utcThursday", "utcFriday", "utcSaturday", "utcSundays", "utcMondays", "utcTuesdays", "utcWednesdays", "utcThursdays", "utcFridays", "utcSaturdays", "timeMonth", "timeInterval", "date", "step", "start", "end", "timeMonths", "utcMonth", "utcMonths", "timeYear", "timeInterval", "date", "step", "start", "end", "k", "timeYears", "utcYear", "utcYears", "ticker", "year", "month", "week", "day", "hour", "minute", "tickIntervals", "second", "ticks", "start", "stop", "count", "reverse", "interval", "tickInterval", "__name", "target", "i", "bisector", "step", "tickStep", "millisecond", "t", "utcTicks", "utcTickInterval", "utcYear", "utcMonth", "utcSunday", "unixDay", "utcHour", "utcMinute", "timeTicks", "timeTickInterval", "timeYear", "timeMonth", "timeSunday", "timeDay", "timeHour", "timeMinute", "localDate", "d", "date", "__name", "utcDate", "newDate", "y", "m", "formatLocale", "locale", "locale_dateTime", "locale_date", "locale_time", "locale_periods", "locale_weekdays", "locale_shortWeekdays", "locale_months", "locale_shortMonths", "periodRe", "formatRe", "periodLookup", "formatLookup", "weekdayRe", "weekdayLookup", "shortWeekdayRe", "shortWeekdayLookup", "monthRe", "monthLookup", "shortMonthRe", "shortMonthLookup", "formats", "formatShortWeekday", "formatWeekday", "formatShortMonth", "formatMonth", "formatDayOfMonth", "formatMicroseconds", "formatYearISO", "formatFullYearISO", "formatHour24", "formatHour12", "formatDayOfYear", "formatMilliseconds", "formatMonthNumber", "formatMinutes", "formatPeriod", "formatQuarter", "formatUnixTimestamp", "formatUnixTimestampSeconds", "formatSeconds", "formatWeekdayNumberMonday", "formatWeekNumberSunday", "formatWeekNumberISO", "formatWeekdayNumberSunday", "formatWeekNumberMonday", "formatYear", "formatFullYear", "formatZone", "formatLiteralPercent", "utcFormats", "formatUTCShortWeekday", "formatUTCWeekday", "formatUTCShortMonth", "formatUTCMonth", "formatUTCDayOfMonth", "formatUTCMicroseconds", "formatUTCYearISO", "formatUTCFullYearISO", "formatUTCHour24", "formatUTCHour12", "formatUTCDayOfYear", "formatUTCMilliseconds", "formatUTCMonthNumber", "formatUTCMinutes", "formatUTCPeriod", "formatUTCQuarter", "formatUTCSeconds", "formatUTCWeekdayNumberMonday", "formatUTCWeekNumberSunday", "formatUTCWeekNumberISO", "formatUTCWeekdayNumberSunday", "formatUTCWeekNumberMonday", "formatUTCYear", "formatUTCFullYear", "formatUTCZone", "parses", "parseShortWeekday", "parseWeekday", "parseShortMonth", "parseMonth", "parseLocaleDateTime", "parseDayOfMonth", "parseMicroseconds", "parseYear", "parseFullYear", "parseHour24", "parseDayOfYear", "parseMilliseconds", "parseMonthNumber", "parseMinutes", "parsePeriod", "parseQuarter", "parseUnixTimestamp", "parseUnixTimestampSeconds", "parseSeconds", "parseWeekdayNumberMonday", "parseWeekNumberSunday", "parseWeekNumberISO", "parseWeekdayNumberSunday", "parseWeekNumberMonday", "parseLocaleDate", "parseLocaleTime", "parseZone", "parseLiteralPercent", "newFormat", "specifier", "string", "i", "j", "n", "c", "pad", "format", "pads", "newParse", "Z", "parseSpecifier", "week", "day", "utcMonday", "utcDay", "timeMonday", "timeDay", "parse", "f", "p", "numberRe", "percentRe", "requoteRe", "value", "fill", "width", "sign", "length", "requote", "s", "names", "name", "timeYear", "timeSunday", "dISO", "timeThursday", "z", "utcYear", "dow", "utcSunday", "UTCdISO", "utcThursday", "locale", "timeFormat", "timeParse", "utcFormat", "utcParse", "defaultLocale", "definition", "formatLocale", "__name", "nice", "domain", "interval", "i0", "i1", "x0", "x1", "t", "__name", "date", "__name", "number", "calendar", "ticks", "tickInterval", "year", "month", "week", "day", "hour", "minute", "second", "format", "scale", "continuous", "invert", "domain", "formatMillisecond", "formatSecond", "formatMinute", "formatHour", "formatDay", "formatWeek", "formatMonth", "formatYear", "tickFormat", "y", "_", "interval", "d", "count", "specifier", "nice", "copy", "time", "initRange", "timeTicks", "timeTickInterval", "timeYear", "timeMonth", "timeSunday", "timeDay", "timeHour", "timeMinute", "timeFormat", "band", "scale", "ordinal", "domain", "ordinalRange", "r0", "r1", "step", "bandwidth", "round", "paddingInner", "paddingOuter", "align", "rescale", "n", "reverse", "start", "stop", "values", "range", "i", "__name", "_", "initRange", "colors_default", "specifier", "n", "colors", "__name", "Tableau10_default", "colors_default", "constant_default", "x", "__name", "abs", "atan2", "cos", "max", "min", "sin", "sqrt", "epsilon", "pi", "halfPi", "tau", "acos", "x", "__name", "asin", "pi", "tau", "epsilon", "tauEpsilon", "append", "strings", "i", "__name", "appendRound", "digits", "d", "k", "n", "Path", "x", "y", "x1", "y1", "x2", "y2", "r", "x0", "y0", "x21", "y21", "x01", "y01", "l01_2", "x20", "y20", "l21_2", "l20_2", "l21", "l01", "l", "t01", "t21", "a0", "a1", "ccw", "dx", "dy", "cw", "da", "w", "h", "path", "withPath", "shape", "digits", "_", "d", "Path", "__name", "arcInnerRadius", "d", "__name", "arcOuterRadius", "arcStartAngle", "arcEndAngle", "arcPadAngle", "intersect", "x0", "y0", "x1", "y1", "x2", "y2", "x3", "y3", "x10", "y10", "x32", "y32", "t", "epsilon", "cornerTangents", "r1", "rc", "cw", "x01", "y01", "lo", "sqrt", "ox", "oy", "x11", "y11", "x00", "y00", "dx", "dy", "d2", "r", "D", "max", "cx0", "cy0", "cx1", "cy1", "dx0", "dy0", "dx1", "dy1", "arc_default", "innerRadius", "outerRadius", "cornerRadius", "constant_default", "padRadius", "startAngle", "endAngle", "padAngle", "context", "path", "withPath", "arc", "buffer", "r0", "a0", "halfPi", "a1", "da", "abs", "tau", "cos", "sin", "a01", "a11", "a00", "a10", "da0", "da1", "ap", "rp", "min", "rc0", "rc1", "t0", "t1", "p0", "asin", "p1", "oc", "pi", "ax", "ay", "bx", "by", "kc", "acos", "lc", "atan2", "a", "_", "Linear", "context", "__name", "x", "y", "linear_default", "slice", "array_default", "x", "__name", "x", "p", "__name", "y", "line_default", "x", "y", "defined", "constant_default", "context", "curve", "linear_default", "output", "path", "withPath", "line", "data", "i", "n", "array_default", "d", "defined0", "buffer", "__name", "_", "descending_default", "a", "b", "__name", "identity_default", "d", "__name", "pie_default", "value", "identity_default", "sortValues", "descending_default", "sort", "startAngle", "constant_default", "endAngle", "tau", "padAngle", "pie", "data", "i", "n", "array_default", "j", "k", "sum", "index", "arcs", "a0", "da", "a1", "p", "pa", "v", "__name", "_", "Bump", "__name", "context", "x", "y", "bumpX", "context", "Bump", "__name", "bumpY", "point", "that", "x", "y", "__name", "Basis", "context", "basis_default", "noop_default", "__name", "BasisClosed", "context", "__name", "noop_default", "x", "y", "point", "basisClosed_default", "BasisOpen", "context", "__name", "x", "y", "x0", "y0", "point", "basisOpen_default", "Bundle", "context", "beta", "Basis", "__name", "x", "y", "j", "x0", "y0", "dx", "dy", "i", "t", "bundle_default", "custom", "bundle", "point", "that", "x", "y", "__name", "Cardinal", "context", "tension", "cardinal_default", "custom", "cardinal", "CardinalClosed", "context", "tension", "__name", "noop_default", "x", "y", "point", "cardinalClosed_default", "custom", "cardinal", "CardinalOpen", "context", "tension", "__name", "x", "y", "point", "cardinalOpen_default", "custom", "cardinal", "point", "that", "x", "y", "x1", "y1", "x2", "y2", "epsilon", "a", "n", "b", "m", "__name", "CatmullRom", "context", "alpha", "x23", "y23", "catmullRom_default", "custom", "catmullRom", "Cardinal", "CatmullRomClosed", "context", "alpha", "__name", "noop_default", "x", "y", "x23", "y23", "point", "catmullRomClosed_default", "custom", "catmullRom", "CardinalClosed", "CatmullRomOpen", "context", "alpha", "__name", "x", "y", "x23", "y23", "point", "catmullRomOpen_default", "custom", "catmullRom", "CardinalOpen", "LinearClosed", "context", "__name", "noop_default", "x", "y", "linearClosed_default", "sign", "x", "__name", "slope3", "that", "x2", "y2", "h0", "h1", "s0", "s1", "p", "slope2", "t", "h", "point", "t0", "t1", "x0", "y0", "x1", "y1", "dx", "MonotoneX", "context", "y", "MonotoneY", "ReflectContext", "monotoneX", "monotoneY", "Natural", "context", "__name", "x", "y", "px", "controlPoints", "py", "i0", "i1", "i", "m", "a", "b", "r", "natural_default", "Step", "context", "t", "__name", "x", "y", "x1", "step_default", "stepBefore", "stepAfter", "noop", "__name", "dispatch", "i", "n", "_", "t", "Dispatch", "parseTypenames", "typenames", "types", "name", "typename", "callback", "T", "get", "set", "copy", "type", "that", "args", "c", "dispatch_default", "frame", "timeout", "interval", "pokeDelay", "taskHead", "taskTail", "clockLast", "clockNow", "clockSkew", "clock", "setFrame", "f", "now", "clearNow", "__name", "Timer", "timer", "callback", "delay", "time", "sleep", "t", "timerFlush", "wake", "nap", "poke", "t0", "t1", "t2", "timeout_default", "callback", "delay", "time", "t", "Timer", "elapsed", "__name", "emptyOn", "dispatch_default", "emptyTween", "CREATED", "SCHEDULED", "STARTING", "STARTED", "RUNNING", "ENDING", "ENDED", "schedule_default", "node", "name", "id", "index", "group", "timing", "schedules", "create", "__name", "init", "schedule", "get", "set", "self", "tween", "timer", "elapsed", "start", "i", "j", "n", "o", "stop", "timeout_default", "tick", "t", "interrupt_default", "node", "name", "schedules", "schedule", "active", "empty", "i", "STARTING", "ENDING", "ENDED", "__name", "interrupt_default", "name", "__name", "tweenRemove", "id", "name", "tween0", "tween1", "schedule", "set", "tween", "i", "n", "__name", "tweenFunction", "value", "t", "tween_default", "get", "tweenValue", "transition", "node", "interpolate_default", "a", "b", "c", "number_default", "color", "rgb_default", "string_default", "__name", "attrRemove", "name", "__name", "attrRemoveNS", "fullname", "attrConstant", "interpolate", "value1", "string00", "string1", "interpolate0", "string0", "attrConstantNS", "attrFunction", "value", "string10", "attrFunctionNS", "attr_default", "namespace_default", "interpolateTransformSvg", "interpolate_default", "tweenValue", "attrInterpolate", "name", "i", "t", "__name", "attrInterpolateNS", "fullname", "attrTweenNS", "value", "t0", "i0", "tween", "attrTween", "attrTween_default", "key", "namespace_default", "delayFunction", "id", "value", "init", "__name", "delayConstant", "delay_default", "get", "durationFunction", "id", "value", "set", "__name", "durationConstant", "duration_default", "get", "easeConstant", "id", "value", "set", "__name", "ease_default", "get", "easeVarying", "id", "value", "v", "set", "__name", "easeVarying_default", "filter_default", "match", "matcher_default", "groups", "m", "subgroups", "j", "group", "n", "subgroup", "node", "i", "Transition", "__name", "merge_default", "transition", "groups0", "groups1", "m0", "m1", "m", "merges", "j", "group0", "group1", "n", "merge", "node", "i", "Transition", "__name", "start", "name", "t", "i", "__name", "onFunction", "id", "listener", "on0", "on1", "sit", "init", "set", "schedule", "on", "on_default", "get", "removeFunction", "id", "parent", "i", "__name", "remove_default", "select_default", "select", "name", "id", "selector_default", "groups", "m", "subgroups", "j", "group", "n", "subgroup", "node", "subnode", "i", "schedule_default", "get", "Transition", "__name", "selectAll_default", "select", "name", "id", "selectorAll_default", "groups", "m", "subgroups", "parents", "j", "group", "n", "node", "i", "children", "child", "inherit", "get", "k", "l", "schedule_default", "Transition", "__name", "Selection", "selection_default", "__name", "styleNull", "name", "interpolate", "string00", "string10", "interpolate0", "string0", "styleValue", "string1", "__name", "styleRemove", "styleConstant", "value1", "styleFunction", "value", "styleMaybeRemove", "id", "on0", "on1", "listener0", "key", "event", "remove", "schedule", "set", "on", "listener", "style_default", "priority", "interpolateTransformCss", "interpolate_default", "tweenValue", "styleInterpolate", "name", "i", "priority", "t", "__name", "styleTween", "value", "i0", "tween", "styleTween_default", "key", "textConstant", "value", "__name", "textFunction", "value1", "text_default", "tweenValue", "textInterpolate", "i", "t", "__name", "textTween", "value", "t0", "i0", "tween", "textTween_default", "key", "transition_default", "name", "id0", "id1", "newId", "groups", "m", "j", "group", "n", "node", "i", "inherit", "get", "schedule_default", "Transition", "__name", "end_default", "on0", "on1", "that", "id", "size", "resolve", "reject", "cancel", "end", "__name", "schedule", "set", "on", "id", "Transition", "groups", "parents", "name", "__name", "transition", "selection_default", "newId", "selection_prototype", "select_default", "selectAll_default", "filter_default", "merge_default", "transition_default", "on_default", "attr_default", "attrTween_default", "style_default", "styleTween_default", "text_default", "textTween_default", "remove_default", "tween_default", "delay_default", "duration_default", "ease_default", "easeVarying_default", "end_default", "cubicInOut", "__name", "defaultTiming", "cubicInOut", "inherit", "node", "id", "timing", "__name", "transition_default", "name", "Transition", "newId", "now", "groups", "m", "j", "group", "n", "i", "schedule_default", "selection_default", "interrupt_default", "transition_default", "abs", "max", "min", "number1", "e", "__name", "number2", "X", "type", "x", "xy", "Y", "y", "XY", "type", "__name", "Transform", "k", "x", "y", "__name", "point", "location", "identity", "transform", "node"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6DHVG6KC.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6DHVG6KC.mjs new file mode 100644 index 0000000..23f214e --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6DHVG6KC.mjs @@ -0,0 +1 @@ +import{a as n,b as s,c as o,d as u,e as v,f as e,g as d,j as c,o as l,q as m}from"./chunk-2XYWPRAO.mjs";import{a as t}from"./chunk-GTKDMUJJ.mjs";var C=class extends m{static{t(this,"PieTokenBuilder")}static{e(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},P=class extends l{static{t(this,"PieValueConverter")}static{e(this,"PieValueConverter")}runCustomConverter(i,r,a){if(i.name==="PIE_SECTION_LABEL")return r.replace(/"/g,"").trim()}},p={parser:{TokenBuilder:e(()=>new C,"TokenBuilder"),ValueConverter:e(()=>new P,"ValueConverter")}};function M(i=u){let r=o(s(i),d),a=o(n({shared:r}),c,p);return r.ServiceRegistry.register(a),{shared:r,Pie:a}}t(M,"createPieServices");e(M,"createPieServices");export{p as a,M as b}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6DHVG6KC.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6DHVG6KC.mjs.map new file mode 100644 index 0000000..69349a8 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6DHVG6KC.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../parser/dist/chunks/mermaid-parser.core/chunk-T53DSG4Q.mjs"], + "sourcesContent": ["import {\n AbstractMermaidTokenBuilder,\n AbstractMermaidValueConverter,\n MermaidGeneratedSharedModule,\n PieGeneratedModule,\n __name\n} from \"./chunk-FPAJGGOC.mjs\";\n\n// src/language/pie/module.ts\nimport {\n EmptyFileSystem,\n createDefaultCoreModule,\n createDefaultSharedCoreModule,\n inject\n} from \"langium\";\n\n// src/language/pie/tokenBuilder.ts\nvar PieTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"PieTokenBuilder\");\n }\n constructor() {\n super([\"pie\", \"showData\"]);\n }\n};\n\n// src/language/pie/valueConverter.ts\nvar PieValueConverter = class extends AbstractMermaidValueConverter {\n static {\n __name(this, \"PieValueConverter\");\n }\n runCustomConverter(rule, input, _cstNode) {\n if (rule.name !== \"PIE_SECTION_LABEL\") {\n return void 0;\n }\n return input.replace(/\"/g, \"\").trim();\n }\n};\n\n// src/language/pie/module.ts\nvar PieModule = {\n parser: {\n TokenBuilder: /* @__PURE__ */ __name(() => new PieTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new PieValueConverter(), \"ValueConverter\")\n }\n};\nfunction createPieServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const Pie = inject(\n createDefaultCoreModule({ shared }),\n PieGeneratedModule,\n PieModule\n );\n shared.ServiceRegistry.register(Pie);\n return { shared, Pie };\n}\n__name(createPieServices, \"createPieServices\");\n\nexport {\n PieModule,\n createPieServices\n};\n"], + "mappings": "iJAiBA,IAAIA,EAAkB,cAAcC,CAA4B,CAjBhE,MAiBgE,CAAAC,EAAA,wBAC9D,MAAO,CACLA,EAAO,KAAM,iBAAiB,CAChC,CACA,aAAc,CACZ,MAAM,CAAC,MAAO,UAAU,CAAC,CAC3B,CACF,EAGIC,EAAoB,cAAcC,CAA8B,CA3BpE,MA2BoE,CAAAF,EAAA,0BAClE,MAAO,CACLA,EAAO,KAAM,mBAAmB,CAClC,CACA,mBAAmBG,EAAMC,EAAOC,EAAU,CACxC,GAAIF,EAAK,OAAS,oBAGlB,OAAOC,EAAM,QAAQ,KAAM,EAAE,EAAE,KAAK,CACtC,CACF,EAGIE,EAAY,CACd,OAAQ,CACN,aAA8BN,EAAO,IAAM,IAAIF,EAAmB,cAAc,EAChF,eAAgCE,EAAO,IAAM,IAAIC,EAAqB,gBAAgB,CACxF,CACF,EACA,SAASM,EAAkBC,EAAUC,EAAiB,CACpD,IAAMC,EAASC,EACbC,EAA8BJ,CAAO,EACrCK,CACF,EACMC,EAAMH,EACVI,EAAwB,CAAE,OAAAL,CAAO,CAAC,EAClCM,EACAV,CACF,EACA,OAAAI,EAAO,gBAAgB,SAASI,CAAG,EAC5B,CAAE,OAAAJ,EAAQ,IAAAI,CAAI,CACvB,CAZSd,EAAAO,EAAA,qBAaTP,EAAOO,EAAmB,mBAAmB", + "names": ["PieTokenBuilder", "AbstractMermaidTokenBuilder", "__name", "PieValueConverter", "AbstractMermaidValueConverter", "rule", "input", "_cstNode", "PieModule", "createPieServices", "context", "EmptyFileSystem", "shared", "inject", "createDefaultSharedCoreModule", "MermaidGeneratedSharedModule", "Pie", "createDefaultCoreModule", "PieGeneratedModule"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6EQESGSB.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6EQESGSB.mjs new file mode 100644 index 0000000..df5abf0 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6EQESGSB.mjs @@ -0,0 +1 @@ +import{h as o}from"./chunk-63GW7ZVL.mjs";import{a as s}from"./chunk-GTKDMUJJ.mjs";var m=s((t,n)=>{let e;return n==="sandbox"&&(e=o("#i"+t)),(n==="sandbox"?o(e.nodes()[0].contentDocument.body):o("body")).select(`[id="${t}"]`)},"getDiagramElement");export{m as a}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6EQESGSB.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6EQESGSB.mjs.map new file mode 100644 index 0000000..f4e0ab5 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6EQESGSB.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/rendering-util/insertElementsForSize.js"], + "sourcesContent": ["import { select } from 'd3';\n\nexport const getDiagramElement = (id, securityLevel) => {\n let sandboxElement;\n if (securityLevel === 'sandbox') {\n sandboxElement = select('#i' + id);\n }\n const root =\n securityLevel === 'sandbox'\n ? select(sandboxElement.nodes()[0].contentDocument.body)\n : select('body');\n\n const svg = root.select(`[id=\"${id}\"]`);\n\n // Run the renderer. This is what draws the final graph.\n\n return svg;\n};\n"], + "mappings": "kFAEO,IAAMA,EAAoBC,EAAA,CAACC,EAAIC,IAAkB,CACtD,IAAIC,EACJ,OAAID,IAAkB,YACpBC,EAAiBC,EAAO,KAAOH,CAAE,IAGjCC,IAAkB,UACdE,EAAOD,EAAe,MAAM,EAAE,CAAC,EAAE,gBAAgB,IAAI,EACrDC,EAAO,MAAM,GAEF,OAAO,QAAQH,CAAE,IAAI,CAKxC,EAfiC", + "names": ["getDiagramElement", "__name", "id", "securityLevel", "sandboxElement", "select_default"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6XQQT3RD.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6XQQT3RD.mjs new file mode 100644 index 0000000..523ad2c --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6XQQT3RD.mjs @@ -0,0 +1 @@ +import{a as s,b as l,c as n,d,e as u,f as o,g as m,n as c,o as p,q as T}from"./chunk-2XYWPRAO.mjs";import{a as i}from"./chunk-GTKDMUJJ.mjs";var v=class extends T{static{i(this,"TreemapTokenBuilder")}static{o(this,"TreemapTokenBuilder")}constructor(){super(["treemap"])}},g=/classDef\s+([A-Z_a-z]\w+)(?:\s+([^\n\r;]*))?;?/,h=class extends p{static{i(this,"TreemapValueConverter")}static{o(this,"TreemapValueConverter")}runCustomConverter(r,e,t){if(r.name==="NUMBER2")return parseFloat(e.replace(/,/g,""));if(r.name==="SEPARATOR")return e.substring(1,e.length-1);if(r.name==="STRING2")return e.substring(1,e.length-1);if(r.name==="INDENTATION")return e.length;if(r.name==="ClassDef"){if(typeof e!="string")return e;let a=g.exec(e);if(a)return{$type:"ClassDefStatement",className:a[1],styleText:a[2]||void 0}}}};function f(r){let e=r.validation.TreemapValidator,t=r.validation.ValidationRegistry;if(t){let a={Treemap:e.checkSingleRoot.bind(e)};t.register(a,e)}}i(f,"registerValidationChecks");o(f,"registerValidationChecks");var C=class{static{i(this,"TreemapValidator")}static{o(this,"TreemapValidator")}checkSingleRoot(r,e){let t;for(let a of r.TreemapRows)a.item&&(t===void 0&&a.indent===void 0?t=0:a.indent===void 0?e("error","Multiple root nodes are not allowed in a treemap.",{node:a,property:"item"}):t!==void 0&&t>=parseInt(a.indent,10)&&e("error","Multiple root nodes are not allowed in a treemap.",{node:a,property:"item"}))}},V={parser:{TokenBuilder:o(()=>new v,"TokenBuilder"),ValueConverter:o(()=>new h,"ValueConverter")},validation:{TreemapValidator:o(()=>new C,"TreemapValidator")}};function M(r=d){let e=n(l(r),m),t=n(s({shared:e}),c,V);return e.ServiceRegistry.register(t),f(t),{shared:e,Treemap:t}}i(M,"createTreemapServices");o(M,"createTreemapServices");export{V as a,M as b}; diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6XQQT3RD.mjs.map b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6XQQT3RD.mjs.map new file mode 100644 index 0000000..f28b9c7 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-6XQQT3RD.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../parser/dist/chunks/mermaid-parser.core/chunk-FWNWRKHM.mjs"], + "sourcesContent": ["import {\n AbstractMermaidTokenBuilder,\n AbstractMermaidValueConverter,\n MermaidGeneratedSharedModule,\n TreemapGeneratedModule,\n __name\n} from \"./chunk-FPAJGGOC.mjs\";\n\n// src/language/treemap/module.ts\nimport {\n EmptyFileSystem,\n createDefaultCoreModule,\n createDefaultSharedCoreModule,\n inject\n} from \"langium\";\n\n// src/language/treemap/tokenBuilder.ts\nvar TreemapTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"TreemapTokenBuilder\");\n }\n constructor() {\n super([\"treemap\"]);\n }\n};\n\n// src/language/treemap/valueConverter.ts\nvar classDefRegex = /classDef\\s+([A-Z_a-z]\\w+)(?:\\s+([^\\n\\r;]*))?;?/;\nvar TreemapValueConverter = class extends AbstractMermaidValueConverter {\n static {\n __name(this, \"TreemapValueConverter\");\n }\n runCustomConverter(rule, input, _cstNode) {\n if (rule.name === \"NUMBER2\") {\n return parseFloat(input.replace(/,/g, \"\"));\n } else if (rule.name === \"SEPARATOR\") {\n return input.substring(1, input.length - 1);\n } else if (rule.name === \"STRING2\") {\n return input.substring(1, input.length - 1);\n } else if (rule.name === \"INDENTATION\") {\n return input.length;\n } else if (rule.name === \"ClassDef\") {\n if (typeof input !== \"string\") {\n return input;\n }\n const match = classDefRegex.exec(input);\n if (match) {\n return {\n $type: \"ClassDefStatement\",\n className: match[1],\n styleText: match[2] || void 0\n };\n }\n }\n return void 0;\n }\n};\n\n// src/language/treemap/treemap-validator.ts\nfunction registerValidationChecks(services) {\n const validator = services.validation.TreemapValidator;\n const registry = services.validation.ValidationRegistry;\n if (registry) {\n const checks = {\n Treemap: validator.checkSingleRoot.bind(validator)\n // Remove unused validation for TreemapRow\n };\n registry.register(checks, validator);\n }\n}\n__name(registerValidationChecks, \"registerValidationChecks\");\nvar TreemapValidator = class {\n static {\n __name(this, \"TreemapValidator\");\n }\n /**\n * Validates that a treemap has only one root node.\n * A root node is defined as a node that has no indentation.\n */\n checkSingleRoot(doc, accept) {\n let rootNodeIndentation;\n for (const row of doc.TreemapRows) {\n if (!row.item) {\n continue;\n }\n if (rootNodeIndentation === void 0 && // Check if this is a root node (no indentation)\n row.indent === void 0) {\n rootNodeIndentation = 0;\n } else if (row.indent === void 0) {\n accept(\"error\", \"Multiple root nodes are not allowed in a treemap.\", {\n node: row,\n property: \"item\"\n });\n } else if (rootNodeIndentation !== void 0 && rootNodeIndentation >= parseInt(row.indent, 10)) {\n accept(\"error\", \"Multiple root nodes are not allowed in a treemap.\", {\n node: row,\n property: \"item\"\n });\n }\n }\n }\n};\n\n// src/language/treemap/module.ts\nvar TreemapModule = {\n parser: {\n TokenBuilder: /* @__PURE__ */ __name(() => new TreemapTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new TreemapValueConverter(), \"ValueConverter\")\n },\n validation: {\n TreemapValidator: /* @__PURE__ */ __name(() => new TreemapValidator(), \"TreemapValidator\")\n }\n};\nfunction createTreemapServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const Treemap = inject(\n createDefaultCoreModule({ shared }),\n TreemapGeneratedModule,\n TreemapModule\n );\n shared.ServiceRegistry.register(Treemap);\n registerValidationChecks(Treemap);\n return { shared, Treemap };\n}\n__name(createTreemapServices, \"createTreemapServices\");\n\nexport {\n TreemapModule,\n createTreemapServices\n};\n"], + "mappings": "4IAiBA,IAAIA,EAAsB,cAAcC,CAA4B,CAjBpE,MAiBoE,CAAAC,EAAA,4BAClE,MAAO,CACLA,EAAO,KAAM,qBAAqB,CACpC,CACA,aAAc,CACZ,MAAM,CAAC,SAAS,CAAC,CACnB,CACF,EAGIC,EAAgB,iDAChBC,EAAwB,cAAcC,CAA8B,CA5BxE,MA4BwE,CAAAH,EAAA,8BACtE,MAAO,CACLA,EAAO,KAAM,uBAAuB,CACtC,CACA,mBAAmBI,EAAMC,EAAOC,EAAU,CACxC,GAAIF,EAAK,OAAS,UAChB,OAAO,WAAWC,EAAM,QAAQ,KAAM,EAAE,CAAC,EACpC,GAAID,EAAK,OAAS,YACvB,OAAOC,EAAM,UAAU,EAAGA,EAAM,OAAS,CAAC,EACrC,GAAID,EAAK,OAAS,UACvB,OAAOC,EAAM,UAAU,EAAGA,EAAM,OAAS,CAAC,EACrC,GAAID,EAAK,OAAS,cACvB,OAAOC,EAAM,OACR,GAAID,EAAK,OAAS,WAAY,CACnC,GAAI,OAAOC,GAAU,SACnB,OAAOA,EAET,IAAME,EAAQN,EAAc,KAAKI,CAAK,EACtC,GAAIE,EACF,MAAO,CACL,MAAO,oBACP,UAAWA,EAAM,CAAC,EAClB,UAAWA,EAAM,CAAC,GAAK,MACzB,CAEJ,CAEF,CACF,EAGA,SAASC,EAAyBC,EAAU,CAC1C,IAAMC,EAAYD,EAAS,WAAW,iBAChCE,EAAWF,EAAS,WAAW,mBACrC,GAAIE,EAAU,CACZ,IAAMC,EAAS,CACb,QAASF,EAAU,gBAAgB,KAAKA,CAAS,CAEnD,EACAC,EAAS,SAASC,EAAQF,CAAS,CACrC,CACF,CAVSV,EAAAQ,EAAA,4BAWTR,EAAOQ,EAA0B,0BAA0B,EAC3D,IAAIK,EAAmB,KAAM,CAvE7B,MAuE6B,CAAAb,EAAA,yBAC3B,MAAO,CACLA,EAAO,KAAM,kBAAkB,CACjC,CAKA,gBAAgBc,EAAKC,EAAQ,CAC3B,IAAIC,EACJ,QAAWC,KAAOH,EAAI,YACfG,EAAI,OAGLD,IAAwB,QAC5BC,EAAI,SAAW,OACbD,EAAsB,EACbC,EAAI,SAAW,OACxBF,EAAO,QAAS,oDAAqD,CACnE,KAAME,EACN,SAAU,MACZ,CAAC,EACQD,IAAwB,QAAUA,GAAuB,SAASC,EAAI,OAAQ,EAAE,GACzFF,EAAO,QAAS,oDAAqD,CACnE,KAAME,EACN,SAAU,MACZ,CAAC,EAGP,CACF,EAGIC,EAAgB,CAClB,OAAQ,CACN,aAA8BlB,EAAO,IAAM,IAAIF,EAAuB,cAAc,EACpF,eAAgCE,EAAO,IAAM,IAAIE,EAAyB,gBAAgB,CAC5F,EACA,WAAY,CACV,iBAAkCF,EAAO,IAAM,IAAIa,EAAoB,kBAAkB,CAC3F,CACF,EACA,SAASM,EAAsBC,EAAUC,EAAiB,CACxD,IAAMC,EAASC,EACbC,EAA8BJ,CAAO,EACrCK,CACF,EACMC,EAAUH,EACdI,EAAwB,CAAE,OAAAL,CAAO,CAAC,EAClCM,EACAV,CACF,EACA,OAAAI,EAAO,gBAAgB,SAASI,CAAO,EACvClB,EAAyBkB,CAAO,EACzB,CAAE,OAAAJ,EAAQ,QAAAI,CAAQ,CAC3B,CAbS1B,EAAAmB,EAAA,yBAcTnB,EAAOmB,EAAuB,uBAAuB", + "names": ["TreemapTokenBuilder", "AbstractMermaidTokenBuilder", "__name", "classDefRegex", "TreemapValueConverter", "AbstractMermaidValueConverter", "rule", "input", "_cstNode", "match", "registerValidationChecks", "services", "validator", "registry", "checks", "TreemapValidator", "doc", "accept", "rootNodeIndentation", "row", "TreemapModule", "createTreemapServices", "context", "EmptyFileSystem", "shared", "inject", "createDefaultSharedCoreModule", "MermaidGeneratedSharedModule", "Treemap", "createDefaultCoreModule", "TreemapGeneratedModule"] +} diff --git a/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-7SRKK4IT.mjs b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-7SRKK4IT.mjs new file mode 100644 index 0000000..12d4c51 --- /dev/null +++ b/vs-code-extension/media/mermaid/chunks/mermaid.esm.min/chunk-7SRKK4IT.mjs @@ -0,0 +1,339 @@ +import{a as v}from"./chunk-GTKDMUJJ.mjs";function Ps(r,e){(e==null||e>r.length)&&(e=r.length);for(var t=0,a=Array(e);t=r.length?{done:!0}:{done:!1,value:r[a++]}},"n"),e:v(function(l){throw l},"e"),f:n}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var i,s=!0,o=!1;return{s:v(function(){t=t.call(r)},"s"),n:v(function(){var l=t.next();return s=l.done,l},"n"),e:v(function(l){o=!0,i=l},"e"),f:v(function(){try{s||t.return==null||t.return()}finally{if(o)throw i}},"f")}}v(Dr,"_createForOfIteratorHelper");function jl(r,e,t){return(e=ev(e))in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}v(jl,"_defineProperty$1");function nc(r){if(typeof Symbol<"u"&&r[Symbol.iterator]!=null||r["@@iterator"]!=null)return Array.from(r)}v(nc,"_iterableToArray");function ic(r,e){var t=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(t!=null){var a,n,i,s,o=[],l=!0,u=!1;try{if(i=(t=t.call(r)).next,e===0){if(Object(t)!==t)return;l=!1}else for(;!(l=(a=i.call(t)).done)&&(o.push(a.value),o.length!==e);l=!0);}catch(f){u=!0,n=f}finally{try{if(!l&&t.return!=null&&(s=t.return(),Object(s)!==s))return}finally{if(u)throw n}}return o}}v(ic,"_iterableToArrayLimit");function sc(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}v(sc,"_nonIterableRest");function oc(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}v(oc,"_nonIterableSpread");function je(r,e){return rc(r)||ic(r,e)||Ys(r,e)||sc()}v(je,"_slicedToArray");function bn(r){return tc(r)||nc(r)||Ys(r)||oc()}v(bn,"_toConsumableArray");function uc(r,e){if(typeof r!="object"||!r)return r;var t=r[Symbol.toPrimitive];if(t!==void 0){var a=t.call(r,e);if(typeof a!="object")return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}v(uc,"_toPrimitive");function ev(r){var e=uc(r,"string");return typeof e=="symbol"?e:e+""}v(ev,"_toPropertyKey");function nr(r){"@babel/helpers - typeof";return nr=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},nr(r)}v(nr,"_typeof");function Ys(r,e){if(r){if(typeof r=="string")return Ps(r,e);var t={}.toString.call(r).slice(8,-1);return t==="Object"&&r.constructor&&(t=r.constructor.name),t==="Map"||t==="Set"?Array.from(r):t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?Ps(r,e):void 0}}v(Ys,"_unsupportedIterableToArray");var tr=typeof window>"u"?null:window,So=tr?tr.navigator:null;tr&&tr.document;var lc=nr(""),rv=nr({}),vc=nr(function(){}),fc=typeof HTMLElement>"u"?"undefined":nr(HTMLElement),Ia=v(function(e){return e&&e.instanceString&&Ke(e.instanceString)?e.instanceString():null},"instanceStr"),pe=v(function(e){return e!=null&&nr(e)==lc},"string"),Ke=v(function(e){return e!=null&&nr(e)===vc},"fn"),Ge=v(function(e){return!Br(e)&&(Array.isArray?Array.isArray(e):e!=null&&e instanceof Array)},"array"),Ie=v(function(e){return e!=null&&nr(e)===rv&&!Ge(e)&&e.constructor===Object},"plainObject"),cc=v(function(e){return e!=null&&nr(e)===rv},"object"),ne=v(function(e){return e!=null&&nr(e)===nr(1)&&!isNaN(e)},"number"),dc=v(function(e){return ne(e)&&Math.floor(e)===e},"integer"),wn=v(function(e){if(fc!=="undefined")return e!=null&&e instanceof HTMLElement},"htmlElement"),Br=v(function(e){return Oa(e)||tv(e)},"elementOrCollection"),Oa=v(function(e){return Ia(e)==="collection"&&e._private.single},"element"),tv=v(function(e){return Ia(e)==="collection"&&!e._private.single},"collection"),Zs=v(function(e){return Ia(e)==="core"},"core"),av=v(function(e){return Ia(e)==="stylesheet"},"stylesheet"),hc=v(function(e){return Ia(e)==="event"},"event"),lt=v(function(e){return e==null?!0:!!(e===""||e.match(/^\s+$/))},"emptyString"),gc=v(function(e){return typeof HTMLElement>"u"?!1:e instanceof HTMLElement},"domElement"),pc=v(function(e){return Ie(e)&&ne(e.x1)&&ne(e.x2)&&ne(e.y1)&&ne(e.y2)},"boundingBox"),yc=v(function(e){return cc(e)&&Ke(e.then)},"promise"),mc=v(function(){return So&&So.userAgent.match(/msie|trident|edge/i)},"ms"),Jt=v(function(e,t){t||(t=v(function(){if(arguments.length===1)return arguments[0];if(arguments.length===0)return"undefined";for(var i=[],s=0;st?1:0},"ascending"),Sc=v(function(e,t){return-1*iv(e,t)},"descending"),we=Object.assign!=null?Object.assign.bind(Object):function(r){for(var e=arguments,t=1;t1&&(p-=1),p<1/6?h+(m-h)*6*p:p<1/2?m:p<2/3?h+(m-h)*(2/3-p)*6:h}v(f,"hue2rgb");var c=new RegExp("^"+xc+"$").exec(e);if(c){if(a=parseInt(c[1]),a<0?a=(360- -1*a%360)%360:a>360&&(a=a%360),a/=360,n=parseFloat(c[2]),n<0||n>100||(n=n/100,i=parseFloat(c[3]),i<0||i>100)||(i=i/100,s=c[4],s!==void 0&&(s=parseFloat(s),s<0||s>1)))return;if(n===0)o=l=u=Math.round(i*255);else{var d=i<.5?i*(1+n):i+n-i*n,g=2*i-d;o=Math.round(255*f(g,d,a+1/3)),l=Math.round(255*f(g,d,a)),u=Math.round(255*f(g,d,a-1/3))}t=[o,l,u,s]}return t},"hsl2tuple"),Bc=v(function(e){var t,a=new RegExp("^"+bc+"$").exec(e);if(a){t=[];for(var n=[],i=1;i<=3;i++){var s=a[i];if(s[s.length-1]==="%"&&(n[i]=!0),s=parseFloat(s),n[i]&&(s=s/100*255),s<0||s>255)return;t.push(Math.floor(s))}var o=n[1]||n[2]||n[3],l=n[1]&&n[2]&&n[3];if(o&&!l)return;var u=a[4];if(u!==void 0){if(u=parseFloat(u),u<0||u>1)return;t.push(u)}}return t},"rgb2tuple"),Pc=v(function(e){return Ac[e.toLowerCase()]},"colorname2tuple"),sv=v(function(e){return(Ge(e)?e:null)||Pc(e)||kc(e)||Bc(e)||Dc(e)},"color2tuple"),Ac={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},ov=v(function(e){for(var t=e.map,a=e.keys,n=a.length,i=0;i=l||M<0||b&&I>=d}v(E,"shouldInvoke");function S(){var R=e();if(E(R))return D(R);h=setTimeout(S,T(R))}v(S,"timerExpired");function D(R){return h=void 0,w&&f?x(R):(f=c=void 0,g)}v(D,"trailingEdge");function B(){h!==void 0&&clearTimeout(h),p=0,f=m=c=h=void 0}v(B,"cancel");function P(){return h===void 0?g:D(e())}v(P,"flush");function A(){var R=e(),M=E(R);if(f=arguments,c=this,m=R,M){if(h===void 0)return C(m);if(b)return clearTimeout(h),h=setTimeout(S,l),x(m)}return h===void 0&&(h=setTimeout(S,l)),g}return v(A,"debounced"),A.cancel=B,A.flush=P,A}return v(s,"debounce"),ci=s,ci}v(Vc,"requireDebounce");var qc=Vc(),Va=Na(qc),di=tr?tr.performance:null,vv=di&&di.now?function(){return di.now()}:function(){return Date.now()},_c=(function(){if(tr){if(tr.requestAnimationFrame)return function(r){tr.requestAnimationFrame(r)};if(tr.mozRequestAnimationFrame)return function(r){tr.mozRequestAnimationFrame(r)};if(tr.webkitRequestAnimationFrame)return function(r){tr.webkitRequestAnimationFrame(r)};if(tr.msRequestAnimationFrame)return function(r){tr.msRequestAnimationFrame(r)}}return function(r){r&&setTimeout(function(){r(vv())},1e3/60)}})(),xn=v(function(e){return _c(e)},"requestAnimationFrame"),Zr=vv,kt=9261,fv=65599,Wt=5381,cv=v(function(e){for(var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:kt,a=t,n;n=e.next(),!n.done;)a=a*fv+n.value|0;return a},"hashIterableInts"),Ta=v(function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:kt;return t*fv+e|0},"hashInt"),Sa=v(function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Wt;return(t<<5)+t+e|0},"hashIntAlt"),Gc=v(function(e,t){return e*2097152+t},"combineHashes"),rt=v(function(e){return e[0]*2097152+e[1]},"combineHashesArray"),Ya=v(function(e,t){return[Ta(e[0],t[0]),Sa(e[1],t[1])]},"hashArrays"),_o=v(function(e,t){var a={value:0,done:!1},n=0,i=e.length,s={next:v(function(){return n=0;n--)e[n]===t&&e.splice(n,1)},"removeFromArray"),ro=v(function(e){e.splice(0,e.length)},"clearArray"),Jc=v(function(e,t){for(var a=0;a"u"?"undefined":nr(Set))!==ed?Set:rd,On=v(function(e,t){var a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(e===void 0||t===void 0||!Zs(e)){Ue("An element must have a core reference and parameters set");return}var n=t.group;if(n==null&&(t.data&&t.data.source!=null&&t.data.target!=null?n="edges":n="nodes"),n!=="nodes"&&n!=="edges"){Ue("An element must be of type `nodes` or `edges`; you specified `"+n+"`");return}this.length=1,this[0]=this;var i=this._private={cy:e,single:!0,data:t.data||{},position:t.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:n,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!t.selected,selectable:t.selectable===void 0?!0:!!t.selectable,locked:!!t.locked,grabbed:!1,grabbable:t.grabbable===void 0?!0:!!t.grabbable,pannable:t.pannable===void 0?n==="edges":!!t.pannable,active:!1,classes:new ta,animation:{current:[],queue:[]},rscratch:{},scratch:t.scratch||{},edges:[],children:[],parent:t.parent&&t.parent.isNode()?t.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(i.position.x==null&&(i.position.x=0),i.position.y==null&&(i.position.y=0),t.renderedPosition){var s=t.renderedPosition,o=e.pan(),l=e.zoom();i.position={x:(s.x-o.x)/l,y:(s.y-o.y)/l}}var u=[];Ge(t.classes)?u=t.classes:pe(t.classes)&&(u=t.classes.split(/\s+/));for(var f=0,c=u.length;fb?1:0},"defaultCmp"),f=v(function(y,b,w,x,C){var T;if(w==null&&(w=0),C==null&&(C=a),w<0)throw new Error("lo must be non-negative");for(x==null&&(x=y.length);wB;0<=B?D++:D--)S.push(D);return S}).apply(this).reverse(),E=[],x=0,C=T.length;xP;0<=P?++S:--S)A.push(s(y,w));return A},"nsmallest"),m=v(function(y,b,w,x){var C,T,E;for(x==null&&(x=a),C=y[w];w>b;){if(E=w-1>>1,T=y[E],x(C,T)<0){y[w]=T,w=E;continue}break}return y[w]=C},"_siftdown"),p=v(function(y,b,w){var x,C,T,E,S;for(w==null&&(w=a),C=y.length,S=b,T=y[b],x=2*b+1;x0;){var T=b.pop(),E=p(T),S=T.id();if(d[S]=E,E!==1/0)for(var D=T.neighborhood().intersect(h),B=0;B0)for(N.unshift(L);c[H];){var z=c[H];N.unshift(z.edge),N.unshift(z.node),q=z.node,H=q.id()}return o.spawn(N)},"pathTo")}},"dijkstra")},ud={kruskal:v(function(e){e=e||function(w){return 1};for(var t=this.byGroup(),a=t.nodes,n=t.edges,i=a.length,s=new Array(i),o=a,l=v(function(x){for(var C=0;C0;){if(C(),E++,x===f){for(var S=[],D=i,B=f,P=y[B];S.unshift(D),P!=null&&S.unshift(P),D=p[B],D!=null;)B=D.id(),P=y[B];return{found:!0,distance:c[x],path:this.spawn(S),steps:E}}g[x]=!0;for(var A=w._private.edges,R=0;RP&&(h[B]=P,b[B]=D,w[B]=C),!i){var A=D*f+S;!i&&h[A]>P&&(h[A]=P,b[A]=S,w[A]=C)}}}for(var R=0;R1&&arguments[1]!==void 0?arguments[1]:s,se=w(xe),he=[],ge=se;;){if(ge==null)return t.spawn();var Ce=b(ge),ye=Ce.edge,ke=Ce.pred;if(he.unshift(ge[0]),ge.same(me)&&he.length>0)break;ye!=null&&he.unshift(ye),ge=ke}return l.spawn(he)},"pathTo"),T=0;T=0;f--){var c=u[f],d=c[1],g=c[2];(t[d]===o&&t[g]===l||t[d]===l&&t[g]===o)&&u.splice(f,1)}for(var h=0;hn;){var i=Math.floor(Math.random()*t.length);t=pd(i,e,t),a--}return t},"contractUntil"),yd={kargerStein:v(function(){var e=this,t=this.byGroup(),a=t.nodes,n=t.edges;n.unmergeBy(function(N){return N.isLoop()});var i=a.length,s=n.length,o=Math.ceil(Math.pow(Math.log(i)/Math.LN2,2)),l=Math.floor(i/gd);if(i<2){Ue("At least 2 nodes are required for Karger-Stein algorithm");return}for(var u=[],f=0;f1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=1/0,i=t;i1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=-1/0,i=t;i1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=0,i=0,s=t;s1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0;n?e=e.slice(t,a):(a0&&e.splice(0,t));for(var o=0,l=e.length-1;l>=0;l--){var u=e[l];s?isFinite(u)||(e[l]=-1/0,o++):e.splice(l,1)}i&&e.sort(function(d,g){return d-g});var f=e.length,c=Math.floor(f/2);return f%2!==0?e[c+1+o]:(e[c-1+o]+e[c+o])/2},"median"),Cd=v(function(e){return Math.PI*e/180},"deg2rad"),Za=v(function(e,t){return Math.atan2(t,e)-Math.PI/2},"getAngleFromDisp"),to=Math.log2||function(r){return Math.log(r)/Math.log(2)},ao=v(function(e){return e>0?1:e<0?-1:0},"signum"),At=v(function(e,t){return Math.sqrt(Tt(e,t))},"dist"),Tt=v(function(e,t){var a=t.x-e.x,n=t.y-e.y;return a*a+n*n},"sqdist"),Td=v(function(e){for(var t=e.length,a=0,n=0;n=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(e.w!=null&&e.h!=null&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},"makeBoundingBox"),kd=v(function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},"copyBoundingBox"),Dd=v(function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},"clearBoundingBox"),Bd=v(function(e,t){e.x1=Math.min(e.x1,t.x1),e.x2=Math.max(e.x2,t.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,t.y1),e.y2=Math.max(e.y2,t.y2),e.h=e.y2-e.y1},"updateBoundingBox"),bv=v(function(e,t,a){e.x1=Math.min(e.x1,t),e.x2=Math.max(e.x2,t),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,a),e.y2=Math.max(e.y2,a),e.h=e.y2-e.y1},"expandBoundingBoxByPoint"),ln=v(function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return e.x1-=t,e.x2+=t,e.y1-=t,e.y2+=t,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBox"),vn=v(function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[0],a,n,i,s;if(t.length===1)a=n=i=s=t[0];else if(t.length===2)a=i=t[0],s=n=t[1];else if(t.length===4){var o=je(t,4);a=o[0],n=o[1],i=o[2],s=o[3]}return e.x1-=s,e.x2+=n,e.y1-=a,e.y2+=i,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBoxSides"),Ko=v(function(e,t){e.x1=t.x1,e.y1=t.y1,e.x2=t.x2,e.y2=t.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},"assignBoundingBox"),no=v(function(e,t){return!(e.x1>t.x2||t.x1>e.x2||e.x2t.y2||t.y1>e.y2)},"boundingBoxesIntersect"),it=v(function(e,t,a){return e.x1<=t&&t<=e.x2&&e.y1<=a&&a<=e.y2},"inBoundingBox"),Xo=v(function(e,t){return it(e,t.x,t.y)},"pointInBoundingBox"),wv=v(function(e,t){return it(e,t.x1,t.y1)&&it(e,t.x2,t.y2)},"boundingBoxInBoundingBox"),Pd=(pi=Math.hypot)!==null&&pi!==void 0?pi:function(r,e){return Math.sqrt(r*r+e*e)};function Ad(r,e){if(r.length<3)throw new Error("Need at least 3 vertices");var t=v(function(S,D){return{x:S.x+D.x,y:S.y+D.y}},"add"),a=v(function(S,D){return{x:S.x-D.x,y:S.y-D.y}},"sub"),n=v(function(S,D){return{x:S.x*D,y:S.y*D}},"scale"),i=v(function(S,D){return S.x*D.y-S.y*D.x},"cross"),s=v(function(S){var D=Pd(S.x,S.y);return D===0?{x:0,y:0}:{x:S.x/D,y:S.y/D}},"normalize"),o=v(function(S){for(var D=0,B=0;B7&&arguments[7]!==void 0?arguments[7]:"auto",u=l==="auto"?ft(i,s):l,f=i/2,c=s/2;u=Math.min(u,f,c);var d=u!==f,g=u!==c,h;if(d){var m=a-f+u-o,p=n-c-o,y=a+f-u+o,b=p;if(h=st(e,t,a,n,m,p,y,b,!1),h.length>0)return h}if(g){var w=a+f+o,x=n-c+u-o,C=w,T=n+c-u+o;if(h=st(e,t,a,n,w,x,C,T,!1),h.length>0)return h}if(d){var E=a-f+u-o,S=n+c+o,D=a+f-u+o,B=S;if(h=st(e,t,a,n,E,S,D,B,!1),h.length>0)return h}if(g){var P=a-f-o,A=n-c+u-o,R=P,M=n+c-u+o;if(h=st(e,t,a,n,P,A,R,M,!1),h.length>0)return h}var I;{var O=a-f+u,L=n-c+u;if(I=ma(e,t,a,n,O,L,u+o),I.length>0&&I[0]<=O&&I[1]<=L)return[I[0],I[1]]}{var N=a+f-u,q=n-c+u;if(I=ma(e,t,a,n,N,q,u+o),I.length>0&&I[0]>=N&&I[1]<=q)return[I[0],I[1]]}{var H=a+f-u,z=n+c-u;if(I=ma(e,t,a,n,H,z,u+o),I.length>0&&I[0]>=H&&I[1]>=z)return[I[0],I[1]]}{var V=a-f+u,K=n+c-u;if(I=ma(e,t,a,n,V,K,u+o),I.length>0&&I[0]<=V&&I[1]>=K)return[I[0],I[1]]}return[]},"roundRectangleIntersectLine"),Md=v(function(e,t,a,n,i,s,o){var l=o,u=Math.min(a,i),f=Math.max(a,i),c=Math.min(n,s),d=Math.max(n,s);return u-l<=e&&e<=f+l&&c-l<=t&&t<=d+l},"inLineVicinity"),Ld=v(function(e,t,a,n,i,s,o,l,u){var f={x1:Math.min(a,o,i)-u,x2:Math.max(a,o,i)+u,y1:Math.min(n,l,s)-u,y2:Math.max(n,l,s)+u};return!(ef.x2||tf.y2)},"inBezierVicinity"),Id=v(function(e,t,a,n){a-=n;var i=t*t-4*e*a;if(i<0)return[];var s=Math.sqrt(i),o=2*e,l=(-t+s)/o,u=(-t-s)/o;return[l,u]},"solveQuadratic"),Od=v(function(e,t,a,n,i){var s=1e-5;e===0&&(e=s),t/=e,a/=e,n/=e;var o,l,u,f,c,d,g,h;if(l=(3*a-t*t)/9,u=-(27*n)+t*(9*a-2*(t*t)),u/=54,o=l*l*l+u*u,i[1]=0,g=t/3,o>0){c=u+Math.sqrt(o),c=c<0?-Math.pow(-c,1/3):Math.pow(c,1/3),d=u-Math.sqrt(o),d=d<0?-Math.pow(-d,1/3):Math.pow(d,1/3),i[0]=-g+c+d,g+=(c+d)/2,i[4]=i[2]=-g,g=Math.sqrt(3)*(-d+c)/2,i[3]=g,i[5]=-g;return}if(i[5]=i[3]=0,o===0){h=u<0?-Math.pow(-u,1/3):Math.pow(u,1/3),i[0]=-g+2*h,i[4]=i[2]=-(h+g);return}l=-l,f=l*l*l,f=Math.acos(u/Math.sqrt(f)),h=2*Math.sqrt(l),i[0]=-g+h*Math.cos(f/3),i[2]=-g+h*Math.cos((f+2*Math.PI)/3),i[4]=-g+h*Math.cos((f+4*Math.PI)/3)},"solveCubic"),Nd=v(function(e,t,a,n,i,s,o,l){var u=1*a*a-4*a*i+2*a*o+4*i*i-4*i*o+o*o+n*n-4*n*s+2*n*l+4*s*s-4*s*l+l*l,f=9*a*i-3*a*a-3*a*o-6*i*i+3*i*o+9*n*s-3*n*n-3*n*l-6*s*s+3*s*l,c=3*a*a-6*a*i+a*o-a*e+2*i*i+2*i*e-o*e+3*n*n-6*n*s+n*l-n*t+2*s*s+2*s*t-l*t,d=1*a*i-a*a+a*e-i*e+n*s-n*n+n*t-s*t,g=[];Od(u,f,c,d,g);for(var h=1e-7,m=[],p=0;p<6;p+=2)Math.abs(g[p+1])=0&&g[p]<=1&&m.push(g[p]);m.push(1),m.push(0);for(var y=-1,b,w,x,C=0;C=0?xu?(e-i)*(e-i)+(t-s)*(t-s):f-d},"sqdistToFiniteLine"),kr=v(function(e,t,a){for(var n,i,s,o,l,u=0,f=0;f=e&&e>=s||n<=e&&e<=s)l=(e-n)/(s-n)*(o-i)+i,l>t&&u++;else continue;return u%2!==0},"pointInsidePolygonPoints"),Qr=v(function(e,t,a,n,i,s,o,l,u){var f=new Array(a.length),c;l[0]!=null?(c=Math.atan(l[1]/l[0]),l[0]<0?c=c+Math.PI/2:c=-c-Math.PI/2):c=l;for(var d=Math.cos(-c),g=Math.sin(-c),h=0;h0){var p=Tn(f,-u);m=Cn(p)}else m=f;return kr(e,t,m)},"pointInsidePolygon"),Fd=v(function(e,t,a,n,i,s,o,l){for(var u=new Array(a.length*2),f=0;f=0&&p<=1&&b.push(p),y>=0&&y<=1&&b.push(y),b.length===0)return[];var w=b[0]*l[0]+e,x=b[0]*l[1]+t;if(b.length>1){if(b[0]==b[1])return[w,x];var C=b[1]*l[0]+e,T=b[1]*l[1]+t;return[w,x,C,T]}else return[w,x]},"intersectLineCircle"),yi=v(function(e,t,a){return t<=e&&e<=a||a<=e&&e<=t?e:e<=t&&t<=a||a<=t&&t<=e?t:a},"midOfThree"),st=v(function(e,t,a,n,i,s,o,l,u){var f=e-i,c=a-e,d=o-i,g=t-s,h=n-t,m=l-s,p=d*g-m*f,y=c*g-h*f,b=m*c-d*h;if(b!==0){var w=p/b,x=y/b,C=.001,T=0-C,E=1+C;return T<=w&&w<=E&&T<=x&&x<=E?[e+w*c,t+w*h]:u?[e+w*c,t+w*h]:[]}else return p===0||y===0?yi(e,a,o)===o?[o,l]:yi(e,a,i)===i?[i,s]:yi(i,o,a)===a?[a,n]:[]:[]},"finiteLinesIntersect"),qd=v(function(e,t,a,n,i){var s=[],o=n/2,l=i/2,u=t,f=a;s.push({x:u+o*e[0],y:f+l*e[1]});for(var c=1;c0){var m=Tn(c,-l);g=Cn(m)}else g=c}else g=a;for(var p,y,b,w,x=0;x2){for(var h=[f[0],f[1]],m=Math.pow(h[0]-e,2)+Math.pow(h[1]-t,2),p=1;pf&&(f=x)},"set"),get:v(function(w){return u[w]},"get")},d=0;d0?I=M.edgesTo(R)[0]:I=R.edgesTo(M)[0];var O=n(I);R=R.id(),E[R]>E[P]+O&&(E[R]=E[P]+O,S.nodes.indexOf(R)<0?S.push(R):S.updateItem(R),T[R]=0,C[R]=[]),E[R]==E[P]+O&&(T[R]=T[R]+T[P],C[R].push(P))}else for(var L=0;L0;){for(var z=x.pop(),V=0;V0&&o.push(a[l]);o.length!==0&&i.push(n.collection(o))}return i},"assign"),rh=v(function(e,t){for(var a=0;a5&&arguments[5]!==void 0?arguments[5]:nh,o=n,l,u,f=0;f=2?fa(e,t,a,0,jo,ih):fa(e,t,a,0,Jo)},"euclidean"),squaredEuclidean:v(function(e,t,a){return fa(e,t,a,0,jo)},"squaredEuclidean"),manhattan:v(function(e,t,a){return fa(e,t,a,0,Jo)},"manhattan"),max:v(function(e,t,a){return fa(e,t,a,-1/0,sh)},"max")};jt["squared-euclidean"]=jt.squaredEuclidean;jt.squaredeuclidean=jt.squaredEuclidean;function zn(r,e,t,a,n,i){var s;return Ke(r)?s=r:s=jt[r]||jt.euclidean,e===0&&Ke(r)?s(n,i):s(e,t,a,n,i)}v(zn,"clusteringDistance");var oh=dr({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),so=v(function(e){return oh(e)},"setOptions"),Sn=v(function(e,t,a,n,i){var s=i!=="kMedoids",o=s?function(c){return a[c]}:function(c){return n[c](a)},l=v(function(d){return n[d](t)},"getQ"),u=a,f=t;return zn(e,n.length,o,l,u,f)},"getDist"),bi=v(function(e,t,a){for(var n=a.length,i=new Array(n),s=new Array(n),o=new Array(t),l=null,u=0;ua)return!1}return!0},"haveMatricesConverged"),vh=v(function(e,t,a){for(var n=0;no&&(o=t[u][f],l=f);i[l].push(e[u])}for(var c=0;c=i.threshold||i.mode==="dendrogram"&&e.length===1)return!1;var h=t[s],m=t[n[s]],p;i.mode==="dendrogram"?p={left:h,right:m,key:h.key}:p={value:h.value.concat(m.value),key:h.key},e[h.index]=p,e.splice(m.index,1),t[h.key]=p;for(var y=0;ya[m.key][b.key]&&(l=a[m.key][b.key])):i.linkage==="max"?(l=a[h.key][b.key],a[h.key][b.key]0&&n.push(i);return n},"findExemplars"),iu=v(function(e,t,a){for(var n=[],i=0;io&&(s=u,o=t[i*e+u])}s>0&&n.push(s)}for(var f=0;fu&&(l=f,u=c)}a[i]=s[l]}return n=iu(e,t,a),n},"assign"),su=v(function(e){for(var t=this.cy(),a=this.nodes(),n=Eh(e),i={},s=0;s=P?(A=P,P=M,R=I):M>A&&(A=M);for(var O=0;O0?1:0;E[D%n.minIterations*o+V]=K,z+=K}if(z>0&&(D>=n.minIterations-1||D==n.maxIterations-1)){for(var J=0,X=0;X1||T>1)&&(o=!0),c[w]=[],b.outgoers().forEach(function(S){S.isEdge()&&c[w].push(S.id())})}else d[w]=[void 0,b.target().id()]}):s.forEach(function(b){var w=b.id();if(b.isNode()){var x=b.degree(!0);x%2&&(l?u?o=!0:u=w:l=w),c[w]=[],b.connectedEdges().forEach(function(C){return c[w].push(C.id())})}else d[w]=[b.source().id(),b.target().id()]});var g={found:!1,trail:void 0};if(o)return g;if(u&&l)if(i){if(f&&u!=f)return g;f=u}else{if(f&&u!=f&&l!=f)return g;f||(f=u)}else f||(f=s[0].id());var h=v(function(w){for(var x=w,C=[w],T,E,S;c[x].length;)T=c[x].shift(),E=d[T][0],S=d[T][1],x!=S?(c[S]=c[S].filter(function(D){return D!=T}),x=S):!i&&x!=E&&(c[E]=c[E].filter(function(D){return D!=T}),x=E),C.unshift(T),C.unshift(x);return C},"walk"),m=[],p=[];for(p=h(f);p.length!=1;)c[p[0]].length==0?(m.unshift(s.getElementById(p.shift())),m.unshift(s.getElementById(p.shift()))):p=h(p.shift()).concat(p);m.unshift(s.getElementById(p.shift()));for(var y in c)if(c[y].length)return g;return g.found=!0,g.trail=this.spawn(m,!0),g},"hierholzer")},Ja=v(function(){var e=this,t={},a=0,n=0,i=[],s=[],o={},l=v(function(d,g){for(var h=s.length-1,m=[],p=e.spawn();s[h].x!=d||s[h].y!=g;)m.push(s.pop().edge),h--;m.push(s.pop().edge),m.forEach(function(y){var b=y.connectedNodes().intersection(e);p.merge(y),b.forEach(function(w){var x=w.id(),C=w.connectedEdges().intersection(e);p.merge(w),t[x].cutVertex?p.merge(C.filter(function(T){return T.isLoop()})):p.merge(C)})}),i.push(p)},"buildComponent"),u=v(function(d,g,h){d===h&&(n+=1),t[g]={id:a,low:a++,cutVertex:!1};var m=e.getElementById(g).connectedEdges().intersection(e);if(m.size()===0)i.push(e.spawn(e.getElementById(g)));else{var p,y,b,w;m.forEach(function(x){p=x.source().id(),y=x.target().id(),b=p===g?y:p,b!==h&&(w=x.id(),o[w]||(o[w]=!0,s.push({x:g,y:b,edge:x})),b in t?t[g].low=Math.min(t[g].low,t[b].id):(u(d,b,g),t[g].low=Math.min(t[g].low,t[b].low),t[g].id<=t[b].low&&(t[g].cutVertex=!0,l(g,b))))})}},"biconnectedSearch");e.forEach(function(c){if(c.isNode()){var d=c.id();d in t||(n=0,u(d,d),t[d].cutVertex=n>1)}});var f=Object.keys(t).filter(function(c){return t[c].cutVertex}).map(function(c){return e.getElementById(c)});return{cut:e.spawn(f),components:i}},"hopcroftTarjanBiconnected"),Ah={hopcroftTarjanBiconnected:Ja,htbc:Ja,htb:Ja,hopcroftTarjanBiconnectedComponents:Ja},ja=v(function(){var e=this,t={},a=0,n=[],i=[],s=e.spawn(e),o=v(function(u){i.push(u),t[u]={index:a,low:a++,explored:!1};var f=e.getElementById(u).connectedEdges().intersection(e);if(f.forEach(function(m){var p=m.target().id();p!==u&&(p in t||o(p),t[p].explored||(t[u].low=Math.min(t[u].low,t[p].low)))}),t[u].index===t[u].low){for(var c=e.spawn();;){var d=i.pop();if(c.merge(e.getElementById(d)),t[d].low=t[u].index,t[d].explored=!0,d===u)break}var g=c.edgesWith(c),h=c.merge(g);n.push(h),s=s.difference(h)}},"stronglyConnectedSearch");return e.forEach(function(l){if(l.isNode()){var u=l.id();u in t||o(u)}}),{cut:s,components:n}},"tarjanStronglyConnected"),Rh={tarjanStronglyConnected:ja,tsc:ja,tscc:ja,tarjanStronglyConnectedComponents:ja},Bv={};[ka,od,ud,vd,cd,hd,yd,Wd,Yt,Zt,Ms,ah,ph,wh,Dh,Ph,Ah,Rh].forEach(function(r){we(Bv,r)});var Pv=0,Av=1,Rv=2,zr=v(function(e){if(!(this instanceof zr))return new zr(e);this.id="Thenable/1.0.7",this.state=Pv,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},typeof e=="function"&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))},"api");zr.prototype={fulfill:v(function(e){return ou(this,Av,"fulfillValue",e)},"fulfill"),reject:v(function(e){return ou(this,Rv,"rejectReason",e)},"reject"),then:v(function(e,t){var a=this,n=new zr;return a.onFulfilled.push(lu(e,n,"fulfill")),a.onRejected.push(lu(t,n,"reject")),Mv(a),n.proxy},"then")};var ou=v(function(e,t,a,n){return e.state===Pv&&(e.state=t,e[a]=n,Mv(e)),e},"deliver"),Mv=v(function(e){e.state===Av?uu(e,"onFulfilled",e.fulfillValue):e.state===Rv&&uu(e,"onRejected",e.rejectReason)},"execute"),uu=v(function(e,t,a){if(e[t].length!==0){var n=e[t];e[t]=[];var i=v(function(){for(var o=0;o0},"animatedImpl")},"animated"),clearQueue:v(function(){return v(function(){var t=this,a=t.length!==void 0,n=a?t:[t],i=this._private.cy||this;if(!i.styleEnabled())return this;for(var s=0;s-1}return v(e,"listCacheHas"),_i=e,_i}v(Yh,"require_listCacheHas");var Gi,Mu;function Zh(){if(Mu)return Gi;Mu=1;var r=qn();function e(t,a){var n=this.__data__,i=r(n,t);return i<0?(++this.size,n.push([t,a])):n[i][1]=a,this}return v(e,"listCacheSet"),Gi=e,Gi}v(Zh,"require_listCacheSet");var Hi,Lu;function Qh(){if(Lu)return Hi;Lu=1;var r=Uh(),e=Kh(),t=Xh(),a=Yh(),n=Zh();function i(s){var o=-1,l=s==null?0:s.length;for(this.clear();++o-1&&a%1==0&&a0&&this.spawn(n).updateStyle().emit("class"),t},"classes"),addClass:v(function(e){return this.toggleClass(e,!0)},"addClass"),hasClass:v(function(e){var t=this[0];return t!=null&&t._private.classes.has(e)},"hasClass"),toggleClass:v(function(e,t){Ge(e)||(e=e.match(/\S+/g)||[]);for(var a=this,n=t===void 0,i=[],s=0,o=a.length;s0&&this.spawn(i).updateStyle().emit("class"),a},"toggleClass"),removeClass:v(function(e){return this.toggleClass(e,!1)},"removeClass"),flashClass:v(function(e,t){var a=this;if(t==null)t=250;else if(t===0)return a;return a.addClass(e),setTimeout(function(){a.removeClass(e)},t),a},"flashClass")};fn.className=fn.classNames=fn.classes;var Le={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:`"(?:\\\\"|[^"])*"|'(?:\\\\'|[^'])*'`,number:ar,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};Le.variable="(?:[\\w-.]|(?:\\\\"+Le.metaChar+"))+";Le.className="(?:[\\w-]|(?:\\\\"+Le.metaChar+"))+";Le.value=Le.string+"|"+Le.number;Le.id=Le.variable;(function(){var r,e,t;for(r=Le.comparatorOp.split("|"),t=0;t=0)&&e!=="="&&(Le.comparatorOp+="|\\!"+e)})();var _e=v(function(){return{checks:[]}},"newQuery"),oe={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},Ns=[{selector:":selected",matches:v(function(e){return e.selected()},"matches")},{selector:":unselected",matches:v(function(e){return!e.selected()},"matches")},{selector:":selectable",matches:v(function(e){return e.selectable()},"matches")},{selector:":unselectable",matches:v(function(e){return!e.selectable()},"matches")},{selector:":locked",matches:v(function(e){return e.locked()},"matches")},{selector:":unlocked",matches:v(function(e){return!e.locked()},"matches")},{selector:":visible",matches:v(function(e){return e.visible()},"matches")},{selector:":hidden",matches:v(function(e){return!e.visible()},"matches")},{selector:":transparent",matches:v(function(e){return e.transparent()},"matches")},{selector:":grabbed",matches:v(function(e){return e.grabbed()},"matches")},{selector:":free",matches:v(function(e){return!e.grabbed()},"matches")},{selector:":removed",matches:v(function(e){return e.removed()},"matches")},{selector:":inside",matches:v(function(e){return!e.removed()},"matches")},{selector:":grabbable",matches:v(function(e){return e.grabbable()},"matches")},{selector:":ungrabbable",matches:v(function(e){return!e.grabbable()},"matches")},{selector:":animated",matches:v(function(e){return e.animated()},"matches")},{selector:":unanimated",matches:v(function(e){return!e.animated()},"matches")},{selector:":parent",matches:v(function(e){return e.isParent()},"matches")},{selector:":childless",matches:v(function(e){return e.isChildless()},"matches")},{selector:":child",matches:v(function(e){return e.isChild()},"matches")},{selector:":orphan",matches:v(function(e){return e.isOrphan()},"matches")},{selector:":nonorphan",matches:v(function(e){return e.isChild()},"matches")},{selector:":compound",matches:v(function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()},"matches")},{selector:":loop",matches:v(function(e){return e.isLoop()},"matches")},{selector:":simple",matches:v(function(e){return e.isSimple()},"matches")},{selector:":active",matches:v(function(e){return e.active()},"matches")},{selector:":inactive",matches:v(function(e){return!e.active()},"matches")},{selector:":backgrounding",matches:v(function(e){return e.backgrounding()},"matches")},{selector:":nonbackgrounding",matches:v(function(e){return!e.backgrounding()},"matches")}].sort(function(r,e){return Sc(r.selector,e.selector)}),Bg=(function(){for(var r={},e,t=0;t0&&f.edgeCount>0)return qe("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(f.edgeCount>1)return qe("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;f.edgeCount===1&&qe("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},"parse"),Ig=v(function(){if(this.toStringCache!=null)return this.toStringCache;for(var e=v(function(f){return f??""},"clean"),t=v(function(f){return pe(f)?'"'+f+'"':e(f)},"cleanVal"),a=v(function(f){return" "+f+" "},"space"),n=v(function(f,c){var d=f.type,g=f.value;switch(d){case oe.GROUP:{var h=e(g);return h.substring(0,h.length-1)}case oe.DATA_COMPARE:{var m=f.field,p=f.operator;return"["+m+a(e(p))+t(g)+"]"}case oe.DATA_BOOL:{var y=f.operator,b=f.field;return"["+e(y)+b+"]"}case oe.DATA_EXIST:{var w=f.field;return"["+w+"]"}case oe.META_COMPARE:{var x=f.operator,C=f.field;return"[["+C+a(e(x))+t(g)+"]]"}case oe.STATE:return g;case oe.ID:return"#"+g;case oe.CLASS:return"."+g;case oe.PARENT:case oe.CHILD:return i(f.parent,c)+a(">")+i(f.child,c);case oe.ANCESTOR:case oe.DESCENDANT:return i(f.ancestor,c)+" "+i(f.descendant,c);case oe.COMPOUND_SPLIT:{var T=i(f.left,c),E=i(f.subject,c),S=i(f.right,c);return T+(T.length>0?" ":"")+E+S}case oe.TRUE:return""}},"checkToString"),i=v(function(f,c){return f.checks.reduce(function(d,g,h){return d+(c===f&&h===0?"$":"")+n(g,c)},"")},"queryToString"),s="",o=0;o1&&o=0&&(t=t.replace("!",""),c=!0),t.indexOf("@")>=0&&(t=t.replace("@",""),f=!0),(i||o||f)&&(l=!i&&!s?"":""+e,u=""+a),f&&(e=l=l.toLowerCase(),a=u=u.toLowerCase()),t){case"*=":n=l.indexOf(u)>=0;break;case"$=":n=l.indexOf(u,l.length-u.length)>=0;break;case"^=":n=l.indexOf(u)===0;break;case"=":n=e===a;break;case">":d=!0,n=e>a;break;case">=":d=!0,n=e>=a;break;case"<":d=!0,n=e0;){var f=n.shift();e(f),i.add(f.id()),o&&a(n,i,f)}return r}v(vo,"forEachCompound");function qv(r,e,t){if(t.isParent())for(var a=t._private.children,n=0;n1&&arguments[1]!==void 0?arguments[1]:!0;return vo(this,r,e,qv)};function _v(r,e,t){if(t.isChild()){var a=t._private.parent;e.has(a.id())||r.push(a)}}v(_v,"addParent");ea.forEachUp=function(r){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return vo(this,r,e,_v)};function Gg(r,e,t){_v(r,e,t),qv(r,e,t)}v(Gg,"addParentAndChildren");ea.forEachUpAndDown=function(r){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return vo(this,r,e,Gg)};ea.ancestors=ea.parents;var Pa,Gv;Pa=Gv={data:Ve.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:Ve.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:Ve.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Ve.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:Ve.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:Ve.removeData({field:"rscratch",triggerEvent:!1}),id:v(function(){var e=this[0];if(e)return e._private.data.id},"id")};Pa.attr=Pa.data;Pa.removeAttr=Pa.removeData;var Hg=Gv,Gn={};function ys(r){return function(e){var t=this;if(e===void 0&&(e=!0),t.length!==0)if(t.isNode()&&!t.removed()){for(var a=0,n=t[0],i=n._private.edges,s=0;se}),minIndegree:Ft("indegree",function(r,e){return re}),minOutdegree:Ft("outdegree",function(r,e){return re})});we(Gn,{totalDegree:v(function(e){for(var t=0,a=this.nodes(),n=0;n0,d=c;c&&(f=f[0]);var g=d?f.position():{x:0,y:0};t!==void 0?u.position(e,t+g[e]):i!==void 0&&u.position({x:i.x+g.x,y:i.y+g.y})}else{var h=a.position(),m=o?a.parent():null,p=m&&m.length>0,y=p;p&&(m=m[0]);var b=y?m.position():{x:0,y:0};return i={x:h.x-b.x,y:h.y-b.y},e===void 0?i:i[e]}else if(!s)return;return this},"relativePosition")};Nr.modelPosition=Nr.point=Nr.position;Nr.modelPositions=Nr.points=Nr.positions;Nr.renderedPoint=Nr.renderedPosition;Nr.relativePoint=Nr.relativePosition;var Wg=Hv,Qt,yt;Qt=yt={};yt.renderedBoundingBox=function(r){var e=this.boundingBox(r),t=this.cy(),a=t.zoom(),n=t.pan(),i=e.x1*a+n.x,s=e.x2*a+n.x,o=e.y1*a+n.y,l=e.y2*a+n.y;return{x1:i,x2:s,y1:o,y2:l,w:s-i,h:l-o}};yt.dirtyCompoundBoundsCache=function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();return!e.styleEnabled()||!e.hasCompoundNodes()?this:(this.forEachUp(function(t){if(t.isParent()){var a=t._private;a.compoundBoundsClean=!1,a.bbCache=null,r||t.emitAndNotify("bounds")}}),this)};yt.updateCompoundBounds=function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();if(!e.styleEnabled()||!e.hasCompoundNodes())return this;if(!r&&e.batching())return this;function t(s){if(!s.isParent())return;var o=s._private,l=s.children(),u=s.pstyle("compound-sizing-wrt-labels").value==="include",f={width:{val:s.pstyle("min-width").pfValue,left:s.pstyle("min-width-bias-left"),right:s.pstyle("min-width-bias-right")},height:{val:s.pstyle("min-height").pfValue,top:s.pstyle("min-height-bias-top"),bottom:s.pstyle("min-height-bias-bottom")}},c=l.boundingBox({includeLabels:u,includeOverlays:!1,useCache:!1}),d=o.position;(c.w===0||c.h===0)&&(c={w:s.pstyle("width").pfValue,h:s.pstyle("height").pfValue},c.x1=d.x-c.w/2,c.x2=d.x+c.w/2,c.y1=d.y-c.h/2,c.y2=d.y+c.h/2);function g(D,B,P){var A=0,R=0,M=B+P;return D>0&&M>0&&(A=B/M*D,R=P/M*D),{biasDiff:A,biasComplementDiff:R}}v(g,"computeBiasValues");function h(D,B,P,A){if(P.units==="%")switch(A){case"width":return D>0?P.pfValue*D:0;case"height":return B>0?P.pfValue*B:0;case"average":return D>0&&B>0?P.pfValue*(D+B)/2:0;case"min":return D>0&&B>0?D>B?P.pfValue*B:P.pfValue*D:0;case"max":return D>0&&B>0?D>B?P.pfValue*D:P.pfValue*B:0;default:return 0}else return P.units==="px"?P.pfValue:0}v(h,"computePaddingValues");var m=f.width.left.value;f.width.left.units==="px"&&f.width.val>0&&(m=m*100/f.width.val);var p=f.width.right.value;f.width.right.units==="px"&&f.width.val>0&&(p=p*100/f.width.val);var y=f.height.top.value;f.height.top.units==="px"&&f.height.val>0&&(y=y*100/f.height.val);var b=f.height.bottom.value;f.height.bottom.units==="px"&&f.height.val>0&&(b=b*100/f.height.val);var w=g(f.width.val-c.w,m,p),x=w.biasDiff,C=w.biasComplementDiff,T=g(f.height.val-c.h,y,b),E=T.biasDiff,S=T.biasComplementDiff;o.autoPadding=h(c.w,c.h,s.pstyle("padding"),s.pstyle("padding-relative-to").value),o.autoWidth=Math.max(c.w,f.width.val),d.x=(-x+c.x1+c.x2+C)/2,o.autoHeight=Math.max(c.h,f.height.val),d.y=(-E+c.y1+c.y2+S)/2}v(t,"update");for(var a=0;ae.x2?n:e.x2,e.y1=ae.y2?i:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},"updateBounds"),at=v(function(e,t){return t==null?e:Or(e,t.x1,t.y1,t.x2,t.y2)},"updateBoundsFromBox"),ca=v(function(e,t,a){return Sr(e,t,a)},"prefixedProperty"),en=v(function(e,t,a){if(!t.cy().headless()){var n=t._private,i=n.rstyle,s=i.arrowWidth/2,o=t.pstyle(a+"-arrow-shape").value,l,u;if(o!=="none"){a==="source"?(l=i.srcX,u=i.srcY):a==="target"?(l=i.tgtX,u=i.tgtY):(l=i.midX,u=i.midY);var f=n.arrowBounds=n.arrowBounds||{},c=f[a]=f[a]||{};c.x1=l-s,c.y1=u-s,c.x2=l+s,c.y2=u+s,c.w=c.x2-c.x1,c.h=c.y2-c.y1,ln(c,1),Or(e,c.x1,c.y1,c.x2,c.y2)}}},"updateBoundsFromArrow"),ms=v(function(e,t,a){if(!t.cy().headless()){var n;a?n=a+"-":n="";var i=t._private,s=i.rstyle,o=t.pstyle(n+"label").strValue;if(o){var l=t.pstyle("text-halign"),u=t.pstyle("text-valign"),f=ca(s,"labelWidth",a),c=ca(s,"labelHeight",a),d=ca(s,"labelX",a),g=ca(s,"labelY",a),h=t.pstyle(n+"text-margin-x").pfValue,m=t.pstyle(n+"text-margin-y").pfValue,p=t.isEdge(),y=t.pstyle(n+"text-rotation"),b=t.pstyle("text-outline-width").pfValue,w=t.pstyle("text-border-width").pfValue,x=w/2,C=t.pstyle("text-background-padding").pfValue,T=2,E=c,S=f,D=S/2,B=E/2,P,A,R,M;if(p)P=d-D,A=d+D,R=g-B,M=g+B;else{switch(l.value){case"left":P=d-S,A=d;break;case"center":P=d-D,A=d+D;break;case"right":P=d,A=d+S;break}switch(u.value){case"top":R=g-E,M=g;break;case"center":R=g-B,M=g+B;break;case"bottom":R=g,M=g+E;break}}var I=h-Math.max(b,x)-C-T,O=h+Math.max(b,x)+C+T,L=m-Math.max(b,x)-C-T,N=m+Math.max(b,x)+C+T;P+=I,A+=O,R+=L,M+=N;var q=a||"main",H=i.labelBounds,z=H[q]=H[q]||{};z.x1=P,z.y1=R,z.x2=A,z.y2=M,z.w=A-P,z.h=M-R,z.leftPad=I,z.rightPad=O,z.topPad=L,z.botPad=N;var V=p&&y.strValue==="autorotate",K=y.pfValue!=null&&y.pfValue!==0;if(V||K){var J=V?ca(i.rstyle,"labelAngle",a):y.pfValue,X=Math.cos(J),ee=Math.sin(J),te=(P+A)/2,ie=(R+M)/2;if(!p){switch(l.value){case"left":te=A;break;case"right":te=P;break}switch(u.value){case"top":ie=M;break;case"bottom":ie=R;break}}var j=v(function(Te,xe){return Te=Te-te,xe=xe-ie,{x:Te*X-xe*ee+te,y:Te*ee+xe*X+ie}},"rotate"),F=j(P,R),_=j(P,M),W=j(A,R),Z=j(A,M);P=Math.min(F.x,_.x,W.x,Z.x),A=Math.max(F.x,_.x,W.x,Z.x),R=Math.min(F.y,_.y,W.y,Z.y),M=Math.max(F.y,_.y,W.y,Z.y)}var ae=q+"Rot",de=H[ae]=H[ae]||{};de.x1=P,de.y1=R,de.x2=A,de.y2=M,de.w=A-P,de.h=M-R,Or(e,P,R,A,M),Or(i.labelBounds.all,P,R,A,M)}return e}},"updateBoundsFromLabel"),ul=v(function(e,t){if(!t.cy().headless()){var a=t.pstyle("outline-opacity").value,n=t.pstyle("outline-width").value,i=t.pstyle("outline-offset").value,s=n+i;$v(e,t,a,s,"outside",s/2)}},"updateBoundsFromOutline"),$v=v(function(e,t,a,n,i,s){if(!(a===0||n<=0||i==="inside")){var o=t.cy(),l=t.pstyle("shape").value,u=o.renderer().nodeShapes[l],f=t.position(),c=f.x,d=f.y,g=t.width(),h=t.height();if(u.hasMiterBounds){i==="center"&&(n/=2);var m=u.miterBounds(c,d,g,h,n);at(e,m)}else s!=null&&s>0&&vn(e,[s,s,s,s])}},"updateBoundsFromMiter"),$g=v(function(e,t){if(!t.cy().headless()){var a=t.pstyle("border-opacity").value,n=t.pstyle("border-width").pfValue,i=t.pstyle("border-position").value;$v(e,t,a,n,i)}},"updateBoundsFromMiterBorder"),Ug=v(function(e,t){var a=e._private.cy,n=a.styleEnabled(),i=a.headless(),s=xr(),o=e._private,l=e.isNode(),u=e.isEdge(),f,c,d,g,h,m,p=o.rstyle,y=l&&n?e.pstyle("bounds-expansion").pfValue:[0],b=v(function(Re){return Re.pstyle("display").value!=="none"},"isDisplayed"),w=!n||b(e)&&(!u||b(e.source())&&b(e.target()));if(w){var x=0,C=0;n&&t.includeOverlays&&(x=e.pstyle("overlay-opacity").value,x!==0&&(C=e.pstyle("overlay-padding").value));var T=0,E=0;n&&t.includeUnderlays&&(T=e.pstyle("underlay-opacity").value,T!==0&&(E=e.pstyle("underlay-padding").value));var S=Math.max(C,E),D=0,B=0;if(n&&(D=e.pstyle("width").pfValue,B=D/2),l&&t.includeNodes){var P=e.position();h=P.x,m=P.y;var A=e.outerWidth(),R=A/2,M=e.outerHeight(),I=M/2;f=h-R,c=h+R,d=m-I,g=m+I,Or(s,f,d,c,g),n&&ul(s,e),n&&t.includeOutlines&&!i&&ul(s,e),n&&$g(s,e)}else if(u&&t.includeEdges)if(n&&!i){var O=e.pstyle("curve-style").strValue;if(f=Math.min(p.srcX,p.midX,p.tgtX),c=Math.max(p.srcX,p.midX,p.tgtX),d=Math.min(p.srcY,p.midY,p.tgtY),g=Math.max(p.srcY,p.midY,p.tgtY),f-=B,c+=B,d-=B,g+=B,Or(s,f,d,c,g),O==="haystack"){var L=p.haystackPts;if(L&&L.length===2){if(f=L[0].x,d=L[0].y,c=L[1].x,g=L[1].y,f>c){var N=f;f=c,c=N}if(d>g){var q=d;d=g,g=q}Or(s,f-B,d-B,c+B,g+B)}}else if(O==="bezier"||O==="unbundled-bezier"||nt(O,"segments")||nt(O,"taxi")){var H;switch(O){case"bezier":case"unbundled-bezier":H=p.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":H=p.linePts;break}if(H!=null)for(var z=0;zc){var te=f;f=c,c=te}if(d>g){var ie=d;d=g,g=ie}f-=B,c+=B,d-=B,g+=B,Or(s,f,d,c,g)}if(n&&t.includeEdges&&u&&(en(s,e,"mid-source"),en(s,e,"mid-target"),en(s,e,"source"),en(s,e,"target")),n){var j=e.pstyle("ghost").value==="yes";if(j){var F=e.pstyle("ghost-offset-x").pfValue,_=e.pstyle("ghost-offset-y").pfValue;Or(s,s.x1+F,s.y1+_,s.x2+F,s.y2+_)}}var W=o.bodyBounds=o.bodyBounds||{};Ko(W,s),vn(W,y),ln(W,1),n&&(f=s.x1,c=s.x2,d=s.y1,g=s.y2,Or(s,f-S,d-S,c+S,g+S));var Z=o.overlayBounds=o.overlayBounds||{};Ko(Z,s),vn(Z,y),ln(Z,1);var ae=o.labelBounds=o.labelBounds||{};ae.all!=null?Dd(ae.all):ae.all=xr(),n&&t.includeLabels&&(t.includeMainLabels&&ms(s,e,null),u&&(t.includeSourceLabels&&ms(s,e,"source"),t.includeTargetLabels&&ms(s,e,"target")))}return s.x1=Rr(s.x1),s.y1=Rr(s.y1),s.x2=Rr(s.x2),s.y2=Rr(s.y2),s.w=Rr(s.x2-s.x1),s.h=Rr(s.y2-s.y1),s.w>0&&s.h>0&&w&&(vn(s,y),ln(s,1)),s},"boundingBoxImpl"),Uv=v(function(e){var t=0,a=v(function(s){return(s?1:0)<0&&arguments[0]!==void 0?arguments[0]:op,e=arguments.length>1?arguments[1]:void 0,t=0;t=0;o--)s(o);return this};ht.removeAllListeners=function(){return this.removeListener("*")};ht.emit=ht.trigger=function(r,e,t){var a=this.listeners,n=a.length;return this.emitting++,Ge(e)||(e=[e]),up(this,function(i,s){t!=null&&(a=[{event:s.event,type:s.type,namespace:s.namespace,callback:t}],n=a.length);for(var o=v(function(){var f=a[l];if(f.type===s.type&&(!f.namespace||f.namespace===s.namespace||f.namespace===sp)&&i.eventMatches(i.context,f,s)){var c=[s];e!=null&&Jc(c,e),i.beforeEmit(i.context,f,s),f.conf&&f.conf.one&&(i.listeners=i.listeners.filter(function(h){return h!==f}));var d=i.callbackContext(i.context,f,s),g=f.callback.apply(d,c);i.afterEmit(i.context,f,s),g===!1&&(s.stopPropagation(),s.preventDefault())}},"_loop2"),l=0;l1&&!s){var o=this.length-1,l=this[o],u=l._private.data.id;this[o]=void 0,this[e]=l,i.set(u,{ele:l,index:e})}return this.length--,this},"unmergeAt"),unmergeOne:v(function(e){e=e[0];var t=this._private,a=e._private.data.id,n=t.map,i=n.get(a);if(!i)return this;var s=i.index;return this.unmergeAt(s),this},"unmergeOne"),unmerge:v(function(e){var t=this._private.cy;if(!e)return this;if(e&&pe(e)){var a=e;e=t.mutableElements().filter(a)}for(var n=0;n=0;t--){var a=this[t];e(a)&&this.unmergeAt(t)}return this},"unmergeBy"),map:v(function(e,t){for(var a=[],n=this,i=0;ia&&(a=l,n=o)}return{value:a,ele:n}},"max"),min:v(function(e,t){for(var a=1/0,n,i=this,s=0;s=0&&i"u"?"undefined":nr(Symbol))!=e&&nr(Symbol.iterator)!=e;t&&(kn[Symbol.iterator]=function(){var a=this,n={value:void 0,done:!1},i=0,s=this.length;return jl({next:v(function(){return i1&&arguments[1]!==void 0?arguments[1]:!0,a=this[0],n=a.cy();if(n.styleEnabled()&&a){a._private.styleDirty&&(a._private.styleDirty=!1,n.style().apply(a));var i=a._private.style[e];return i??(t?n.style().getDefaultProperty(e):null)}},"parsedStyle"),numericStyle:v(function(e){var t=this[0];if(t.cy().styleEnabled()&&t){var a=t.pstyle(e);return a.pfValue!==void 0?a.pfValue:a.value}},"numericStyle"),numericStyleUnits:v(function(e){var t=this[0];if(t.cy().styleEnabled()&&t)return t.pstyle(e).units},"numericStyleUnits"),renderedStyle:v(function(e){var t=this.cy();if(!t.styleEnabled())return this;var a=this[0];if(a)return t.style().getRenderedStyle(a,e)},"renderedStyle"),style:v(function(e,t){var a=this.cy();if(!a.styleEnabled())return this;var n=!1,i=a.style();if(Ie(e)){var s=e;i.applyBypass(this,s,n),this.emitAndNotify("style")}else if(pe(e))if(t===void 0){var o=this[0];return o?i.getStylePropertyValue(o,e):void 0}else i.applyBypass(this,e,t,n),this.emitAndNotify("style");else if(e===void 0){var l=this[0];return l?i.getRawStyle(l):void 0}return this},"style"),removeStyle:v(function(e){var t=this.cy();if(!t.styleEnabled())return this;var a=!1,n=t.style(),i=this;if(e===void 0)for(var s=0;s0&&e.push(f[0]),e.push(o[0])}return this.spawn(e,!0).filter(r)},"neighborhood"),closedNeighborhood:v(function(e){return this.neighborhood().add(this).filter(e)},"closedNeighborhood"),openNeighborhood:v(function(e){return this.neighborhood(e)},"openNeighborhood")});pr.neighbourhood=pr.neighborhood;pr.closedNeighbourhood=pr.closedNeighborhood;pr.openNeighbourhood=pr.openNeighborhood;we(pr,{source:Mr(v(function(e){var t=this[0],a;return t&&(a=t._private.source||t.cy().collection()),a&&e?a.filter(e):a},"sourceImpl"),"source"),target:Mr(v(function(e){var t=this[0],a;return t&&(a=t._private.target||t.cy().collection()),a&&e?a.filter(e):a},"targetImpl"),"target"),sources:bl({attr:"source"}),targets:bl({attr:"target"})});function bl(r){return v(function(t){for(var a=[],n=0;n0);return s},"components"),component:v(function(){var e=this[0];return e.cy().mutableElements().components(e)[0]},"component")});pr.componentsOf=pr.components;var cr=v(function(e,t){var a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(e===void 0){Ue("A collection must have a reference to the core");return}var i=new Yr,s=!1;if(!t)t=[];else if(t.length>0&&Ie(t[0])&&!Oa(t[0])){s=!0;for(var o=[],l=new ta,u=0,f=t.length;u0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,t=this,a=t.cy(),n=a._private,i=[],s=[],o,l=0,u=t.length;l0){for(var q=o.length===t.length?t:new cr(a,o),H=0;H0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,t=this,a=[],n={},i=t._private.cy;function s(M){for(var I=M._private.edges,O=0;O0&&(r?P.emitAndNotify("remove"):e&&P.emit("remove"));for(var A=0;A0?A=M:P=M;while(Math.abs(R)>s&&++I=i?b(B,I):O===0?I:x(B,P,P+u)}v(C,"getTForX");var T=!1;function E(){T=!0,(r!==e||t!==a)&&w()}v(E,"precompute");var S=v(function(P){return T||E(),r===e&&t===a?P:P===0?0:P===1?1:p(C(P),e,a)},"f");S.getControlPoints=function(){return[{x:r,y:e},{x:t,y:a}]};var D="generateBezier("+[r,e,t,a]+")";return S.toString=function(){return D},S}v(mp,"generateCubicBezier");var bp=(function(){function r(a){return-a.tension*a.x-a.friction*a.v}v(r,"springAccelerationForState");function e(a,n,i){var s={x:a.x+i.dx*n,v:a.v+i.dv*n,tension:a.tension,friction:a.friction};return{dx:s.v,dv:r(s)}}v(e,"springEvaluateStateWithDerivative");function t(a,n){var i={dx:a.v,dv:r(a)},s=e(a,n*.5,i),o=e(a,n*.5,s),l=e(a,n,o),u=1/6*(i.dx+2*(s.dx+o.dx)+l.dx),f=1/6*(i.dv+2*(s.dv+o.dv)+l.dv);return a.x=a.x+u*n,a.v=a.v+f*n,a}return v(t,"springIntegrateState"),v(function a(n,i,s){var o={x:-1,v:0,tension:null,friction:null},l=[0],u=0,f=1/1e4,c=16/1e3,d,g,h;for(n=parseFloat(n)||500,i=parseFloat(i)||20,s=s||null,o.tension=n,o.friction=i,d=s!==null,d?(u=a(n,i),g=u/s*c):g=c;h=t(h||o,g),l.push(1+h.x),u+=16,Math.abs(h.x)>f&&Math.abs(h.v)>f;);return d?function(m){return l[m*(l.length-1)|0]}:u},"springRK4Factory")})(),He=v(function(e,t,a,n){var i=mp(e,t,a,n);return function(s,o,l){return s+(o-s)*i(l)}},"cubicBezier"),dn={linear:v(function(e,t,a){return e+(t-e)*a},"linear"),ease:He(.25,.1,.25,1),"ease-in":He(.42,0,1,1),"ease-out":He(0,0,.58,1),"ease-in-out":He(.42,0,.58,1),"ease-in-sine":He(.47,0,.745,.715),"ease-out-sine":He(.39,.575,.565,1),"ease-in-out-sine":He(.445,.05,.55,.95),"ease-in-quad":He(.55,.085,.68,.53),"ease-out-quad":He(.25,.46,.45,.94),"ease-in-out-quad":He(.455,.03,.515,.955),"ease-in-cubic":He(.55,.055,.675,.19),"ease-out-cubic":He(.215,.61,.355,1),"ease-in-out-cubic":He(.645,.045,.355,1),"ease-in-quart":He(.895,.03,.685,.22),"ease-out-quart":He(.165,.84,.44,1),"ease-in-out-quart":He(.77,0,.175,1),"ease-in-quint":He(.755,.05,.855,.06),"ease-out-quint":He(.23,1,.32,1),"ease-in-out-quint":He(.86,0,.07,1),"ease-in-expo":He(.95,.05,.795,.035),"ease-out-expo":He(.19,1,.22,1),"ease-in-out-expo":He(1,0,0,1),"ease-in-circ":He(.6,.04,.98,.335),"ease-out-circ":He(.075,.82,.165,1),"ease-in-out-circ":He(.785,.135,.15,.86),spring:v(function(e,t,a){if(a===0)return dn.linear;var n=bp(e,t,a);return function(i,s,o){return i+(s-i)*n(o)}},"spring"),"cubic-bezier":He};function El(r,e,t,a,n){if(a===1||e===t)return t;var i=n(e,t,a);return r==null||((r.roundValue||r.color)&&(i=Math.round(i)),r.min!==void 0&&(i=Math.max(i,r.min)),r.max!==void 0&&(i=Math.min(i,r.max))),i}v(El,"getEasedValue");function Cl(r,e){return r.pfValue!=null||r.value!=null?r.pfValue!=null&&(e==null||e.type.units!=="%")?r.pfValue:r.value:r}v(Cl,"getValue");function Vt(r,e,t,a,n){var i=n!=null?n.type:null;t<0?t=0:t>1&&(t=1);var s=Cl(r,n),o=Cl(e,n);if(ne(s)&&ne(o))return El(i,s,o,t,a);if(Ge(s)&&Ge(o)){for(var l=[],u=0;u0?(g==="spring"&&h.push(s.duration),s.easingImpl=dn[g].apply(null,h)):s.easingImpl=dn[g]}var m=s.easingImpl,p;if(s.duration===0?p=1:p=(t-l)/s.duration,s.applying&&(p=s.progress),p<0?p=0:p>1&&(p=1),s.delay==null){var y=s.startPosition,b=s.position;if(b&&n&&!r.locked()){var w={};ha(y.x,b.x)&&(w.x=Vt(y.x,b.x,p,m)),ha(y.y,b.y)&&(w.y=Vt(y.y,b.y,p,m)),r.position(w)}var x=s.startPan,C=s.pan,T=i.pan,E=C!=null&&a;E&&(ha(x.x,C.x)&&(T.x=Vt(x.x,C.x,p,m)),ha(x.y,C.y)&&(T.y=Vt(x.y,C.y,p,m)),r.emit("pan"));var S=s.startZoom,D=s.zoom,B=D!=null&&a;B&&(ha(S,D)&&(i.zoom=Da(i.minZoom,Vt(S,D,p,m),i.maxZoom)),r.emit("zoom")),(E||B)&&r.emit("viewport");var P=s.style;if(P&&P.length>0&&n){for(var A=0;A=0;E--){var S=T[E];S()}T.splice(0,T.length)},"callbacks"),b=g.length-1;b>=0;b--){var w=g[b],x=w._private;if(x.stopped){g.splice(b,1),x.hooked=!1,x.playing=!1,x.started=!1,y(x.frames);continue}!x.playing&&!x.applying||(x.playing&&x.applying&&(x.applying=!1),x.started||xp(f,w,r),wp(f,w,r,c),x.applying&&(x.applying=!1),y(x.frames),x.step!=null&&x.step(r),w.completed()&&(g.splice(b,1),x.hooked=!1,x.playing=!1,x.started=!1,y(x.completes)),m=!0)}return!c&&g.length===0&&h.length===0&&a.push(f),m}v(n,"stepOne");for(var i=!1,s=0;s0?e.notify("draw",t):e.notify("draw")),t.unmerge(a),e.emit("step")}v(Tl,"stepAll");var Ep={animate:Ve.animate(),animation:Ve.animation(),animated:Ve.animated(),clearQueue:Ve.clearQueue(),delay:Ve.delay(),delayAnimation:Ve.delayAnimation(),stop:Ve.stop(),addToAnimationPool:v(function(e){var t=this;t.styleEnabled()&&t._private.aniEles.merge(e)},"addToAnimationPool"),stopAnimationLoop:v(function(){this._private.animationsRunning=!1},"stopAnimationLoop"),startAnimationLoop:v(function(){var e=this;if(e._private.animationsRunning=!0,!e.styleEnabled())return;function t(){e._private.animationsRunning&&xn(v(function(i){Tl(i,e),t()},"animationStep"))}v(t,"headlessStep");var a=e.renderer();a&&a.beforeRender?a.beforeRender(v(function(i,s){Tl(s,e)},"rendererAnimationStep"),a.beforeRenderPriorities.animations):t()},"startAnimationLoop")},Cp={qualifierCompare:v(function(e,t){return e==null||t==null?e==null&&t==null:e.sameText(t)},"qualifierCompare"),eventMatches:v(function(e,t,a){var n=t.qualifier;return n!=null?e!==a.target&&Oa(a.target)&&n.matches(a.target):!0},"eventMatches"),addEventFields:v(function(e,t){t.cy=e,t.target=e},"addEventFields"),callbackContext:v(function(e,t,a){return t.qualifier!=null?a.target:e},"callbackContext")},an=v(function(e){return pe(e)?new ct(e):e},"argSelector"),af={createEmitter:v(function(){var e=this._private;return e.emitter||(e.emitter=new Hn(Cp,this)),this},"createEmitter"),emitter:v(function(){return this._private.emitter},"emitter"),on:v(function(e,t,a){return this.emitter().on(e,an(t),a),this},"on"),removeListener:v(function(e,t,a){return this.emitter().removeListener(e,an(t),a),this},"removeListener"),removeAllListeners:v(function(){return this.emitter().removeAllListeners(),this},"removeAllListeners"),one:v(function(e,t,a){return this.emitter().one(e,an(t),a),this},"one"),once:v(function(e,t,a){return this.emitter().one(e,an(t),a),this},"once"),emit:v(function(e,t){return this.emitter().emit(e,t),this},"emit"),emitAndNotify:v(function(e,t){return this.emit(e),this.notify(e,t),this},"emitAndNotify")};Ve.eventAliasesOn(af);var Fs={png:v(function(e){var t=this._private.renderer;return e=e||{},t.png(e)},"png"),jpg:v(function(e){var t=this._private.renderer;return e=e||{},e.bg=e.bg||"#fff",t.jpg(e)},"jpg")};Fs.jpeg=Fs.jpg;var hn={layout:v(function(e){var t=this;if(e==null){Ue("Layout options must be specified to make a layout");return}if(e.name==null){Ue("A `name` must be specified to make a layout");return}var a=e.name,n=t.extension("layout",a);if(n==null){Ue("No such layout `"+a+"` found. Did you forget to import it and `cytoscape.use()` it?");return}var i;pe(e.eles)?i=t.$(e.eles):i=e.eles!=null?e.eles:t.$();var s=new n(we({},e,{cy:t,eles:i}));return s},"layout")};hn.createLayout=hn.makeLayout=hn.layout;var Tp={notify:v(function(e,t){var a=this._private;if(this.batching()){a.batchNotifications=a.batchNotifications||{};var n=a.batchNotifications[e]=a.batchNotifications[e]||this.collection();t!=null&&n.merge(t);return}if(a.notificationsEnabled){var i=this.renderer();this.destroyed()||!i||i.notify(e,t)}},"notify"),notifications:v(function(e){var t=this._private;return e===void 0?t.notificationsEnabled:(t.notificationsEnabled=!!e,this)},"notifications"),noNotifications:v(function(e){this.notifications(!1),e(),this.notifications(!0)},"noNotifications"),batching:v(function(){return this._private.batchCount>0},"batching"),startBatch:v(function(){var e=this._private;return e.batchCount==null&&(e.batchCount=0),e.batchCount===0&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},"startBatch"),endBatch:v(function(){var e=this._private;if(e.batchCount===0)return this;if(e.batchCount--,e.batchCount===0){e.batchStyleEles.updateStyle();var t=this.renderer();Object.keys(e.batchNotifications).forEach(function(a){var n=e.batchNotifications[a];n.empty()?t.notify(a):t.notify(a,n)})}return this},"endBatch"),batch:v(function(e){return this.startBatch(),e(),this.endBatch(),this},"batch"),batchData:v(function(e){var t=this;return this.batch(function(){for(var a=Object.keys(e),n=0;n0;)t.removeChild(t.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach(function(a){var n=a._private;n.rscratch={},n.rstyle={},n.animation.current=[],n.animation.queue=[]})},"destroyRenderer"),onRender:v(function(e){return this.on("render",e)},"onRender"),offRender:v(function(e){return this.off("render",e)},"offRender")};Vs.invalidateDimensions=Vs.resize;var gn={collection:v(function(e,t){return pe(e)?this.$(e):Br(e)?e.collection():Ge(e)?(t||(t={}),new cr(this,e,t.unique,t.removed)):new cr(this)},"collection"),nodes:v(function(e){var t=this.$(function(a){return a.isNode()});return e?t.filter(e):t},"nodes"),edges:v(function(e){var t=this.$(function(a){return a.isEdge()});return e?t.filter(e):t},"edges"),$:v(function(e){var t=this._private.elements;return e?t.filter(e):t.spawnSelf()},"$"),mutableElements:v(function(){return this._private.elements},"mutableElements")};gn.elements=gn.filter=gn.$;var lr={},xa="t",kp="f";lr.apply=function(r){for(var e=this,t=e._private,a=t.cy,n=a.collection(),i=0;i0;if(d||c&&g){var h=void 0;d&&g||d?h=u.properties:g&&(h=u.mappedProperties);for(var m=0;m1&&(x=1),o.color){var T=a.valueMin[0],E=a.valueMax[0],S=a.valueMin[1],D=a.valueMax[1],B=a.valueMin[2],P=a.valueMax[2],A=a.valueMin[3]==null?1:a.valueMin[3],R=a.valueMax[3]==null?1:a.valueMax[3],M=[Math.round(T+(E-T)*x),Math.round(S+(D-S)*x),Math.round(B+(P-B)*x),Math.round(A+(R-A)*x)];i={bypass:a.bypass,name:a.name,value:M,strValue:"rgb("+M[0]+", "+M[1]+", "+M[2]+")"}}else if(o.number){var I=a.valueMin+(a.valueMax-a.valueMin)*x;i=this.parse(a.name,I,a.bypass,d)}else return!1;if(!i)return m(),!1;i.mapping=a,a=i;break}case s.data:{for(var O=a.field.split("."),L=c.data,N=0;N0&&i>0){for(var o={},l=!1,u=0;u0?r.delayAnimation(s).play().promise().then(w):w()}).then(function(){return r.animation({style:o,duration:i,easing:r.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){t.removeBypasses(r,n),r.emitAndNotify("style"),a.transitioning=!1})}else a.transitioning&&(this.removeBypasses(r,n),r.emitAndNotify("style"),a.transitioning=!1)};lr.checkTrigger=function(r,e,t,a,n,i){var s=this.properties[e],o=n(s);r.removed()||o!=null&&o(t,a,r)&&i(s)};lr.checkZOrderTrigger=function(r,e,t,a){var n=this;this.checkTrigger(r,e,t,a,function(i){return i.triggersZOrder},function(){n._private.cy.notify("zorder",r)})};lr.checkBoundsTrigger=function(r,e,t,a){this.checkTrigger(r,e,t,a,function(n){return n.triggersBounds},function(n){r.dirtyCompoundBoundsCache(),r.dirtyBoundingBoxCache()})};lr.checkConnectedEdgesBoundsTrigger=function(r,e,t,a){this.checkTrigger(r,e,t,a,function(n){return n.triggersBoundsOfConnectedEdges},function(n){r.connectedEdges().forEach(function(i){i.dirtyBoundingBoxCache()})})};lr.checkParallelEdgesBoundsTrigger=function(r,e,t,a){this.checkTrigger(r,e,t,a,function(n){return n.triggersBoundsOfParallelEdges},function(n){r.parallelEdges().forEach(function(i){i.dirtyBoundingBoxCache()})})};lr.checkTriggers=function(r,e,t,a){r.dirtyStyleCache(),this.checkZOrderTrigger(r,e,t,a),this.checkBoundsTrigger(r,e,t,a),this.checkConnectedEdgesBoundsTrigger(r,e,t,a),this.checkParallelEdgesBoundsTrigger(r,e,t,a)};var Ga={};Ga.applyBypass=function(r,e,t,a){var n=this,i=[],s=!0;if(e==="*"||e==="**"){if(t!==void 0)for(var o=0;on.length?a=a.substr(n.length):a=""}v(o,"removeSelAndBlockFromRemaining");function l(){i.length>s.length?i=i.substr(s.length):i=""}for(v(l,"removePropAndValFromRem");;){var u=a.match(/^\s*$/);if(u)break;var f=a.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!f){qe("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+a);break}n=f[0];var c=f[1];if(c!=="core"){var d=new ct(c);if(d.invalid){qe("Skipping parsing of block: Invalid selector found in string stylesheet: "+c),o();continue}}var g=f[2],h=!1;i=g;for(var m=[];;){var p=i.match(/^\s*$/);if(p)break;var y=i.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!y){qe("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+g),h=!0;break}s=y[0];var b=y[1],w=y[2],x=e.properties[b];if(!x){qe("Skipping property: Invalid property name in: "+s),l();continue}var C=t.parse(b,w);if(!C){qe("Skipping property: Invalid property definition in: "+s),l();continue}m.push({name:b,val:w}),l()}if(h){o();break}t.selector(c);for(var T=0;T=7&&e[0]==="d"&&(f=new RegExp(o.data.regex).exec(e))){if(t)return!1;var d=o.data;return{name:r,value:f,strValue:""+e,mapped:d,field:f[1],bypass:t}}else if(e.length>=10&&e[0]==="m"&&(c=new RegExp(o.mapData.regex).exec(e))){if(t||u.multiple)return!1;var g=o.mapData;if(!(u.color||u.number))return!1;var h=this.parse(r,c[4]);if(!h||h.mapped)return!1;var m=this.parse(r,c[5]);if(!m||m.mapped)return!1;if(h.pfValue===m.pfValue||h.strValue===m.strValue)return qe("`"+r+": "+e+"` is not a valid mapper because the output range is zero; converting to `"+r+": "+h.strValue+"`"),this.parse(r,h.strValue);if(u.color){var p=h.value,y=m.value,b=p[0]===y[0]&&p[1]===y[1]&&p[2]===y[2]&&(p[3]===y[3]||(p[3]==null||p[3]===1)&&(y[3]==null||y[3]===1));if(b)return!1}return{name:r,value:c,strValue:""+e,mapped:g,field:c[1],fieldMin:parseFloat(c[2]),fieldMax:parseFloat(c[3]),valueMin:h.value,valueMax:m.value,bypass:t}}}if(u.multiple&&a!=="multiple"){var w;if(l?w=e.split(/\s+/):Ge(e)?w=e:w=[e],u.evenMultiple&&w.length%2!==0)return null;for(var x=[],C=[],T=[],E="",S=!1,D=0;D0?" ":"")+B.strValue}return u.validate&&!u.validate(x,C)?null:u.singleEnum&&S?x.length===1&&pe(x[0])?{name:r,value:x[0],strValue:x[0],bypass:t}:null:{name:r,value:x,pfValue:T,strValue:E,bypass:t,units:C}}var P=v(function(){for(var j=0;ju.max||u.strictMax&&e===u.max))return null;var O={name:r,value:e,strValue:""+e+(A||""),units:A,bypass:t};return u.unitless||A!=="px"&&A!=="em"?O.pfValue=e:O.pfValue=A==="px"||!A?e:this.getEmSizeInPixels()*e,(A==="ms"||A==="s")&&(O.pfValue=A==="ms"?e:1e3*e),(A==="deg"||A==="rad")&&(O.pfValue=A==="rad"?e:Cd(e)),A==="%"&&(O.pfValue=e/100),O}else if(u.propList){var L=[],N=""+e;if(N!=="none"){for(var q=N.split(/\s*,\s*|\s+/),H=0;H0&&o>0&&!isNaN(a.w)&&!isNaN(a.h)&&a.w>0&&a.h>0){l=Math.min((s-2*t)/a.w,(o-2*t)/a.h),l=l>this._private.maxZoom?this._private.maxZoom:l,l=l=a.minZoom&&(a.maxZoom=t),this},"zoomRange"),minZoom:v(function(e){return e===void 0?this._private.minZoom:this.zoomRange({min:e})},"minZoom"),maxZoom:v(function(e){return e===void 0?this._private.maxZoom:this.zoomRange({max:e})},"maxZoom"),getZoomedViewport:v(function(e){var t=this._private,a=t.pan,n=t.zoom,i,s,o=!1;if(t.zoomingEnabled||(o=!0),ne(e)?s=e:Ie(e)&&(s=e.level,e.position!=null?i=Nn(e.position,n,a):e.renderedPosition!=null&&(i=e.renderedPosition),i!=null&&!t.panningEnabled&&(o=!0)),s=s>t.maxZoom?t.maxZoom:s,s=st.maxZoom||!t.zoomingEnabled?s=!0:(t.zoom=l,i.push("zoom"))}if(n&&(!s||!e.cancelOnFailedZoom)&&t.panningEnabled){var u=e.pan;ne(u.x)&&(t.pan.x=u.x,o=!1),ne(u.y)&&(t.pan.y=u.y,o=!1),o||i.push("pan")}return i.length>0&&(i.push("viewport"),this.emit(i.join(" ")),this.notify("viewport")),this},"viewport"),center:v(function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.emit("pan viewport"),this.notify("viewport")),this},"center"),getCenterPan:v(function(e,t){if(this._private.panningEnabled){if(pe(e)){var a=e;e=this.mutableElements().filter(a)}else Br(e)||(e=this.mutableElements());if(e.length!==0){var n=e.boundingBox(),i=this.width(),s=this.height();t=t===void 0?this._private.zoom:t;var o={x:(i-t*(n.x1+n.x2))/2,y:(s-t*(n.y1+n.y2))/2};return o}}},"getCenterPan"),reset:v(function(){return!this._private.panningEnabled||!this._private.zoomingEnabled?this:(this.viewport({pan:{x:0,y:0},zoom:1}),this)},"reset"),invalidateSize:v(function(){this._private.sizeCache=null},"invalidateSize"),size:v(function(){var e=this._private,t=e.container,a=this;return e.sizeCache=e.sizeCache||(t?(function(){var n=a.window().getComputedStyle(t),i=v(function(o){return parseFloat(n.getPropertyValue(o))},"val");return{width:t.clientWidth-i("padding-left")-i("padding-right"),height:t.clientHeight-i("padding-top")-i("padding-bottom")}})():{width:1,height:1})},"size"),width:v(function(){return this.size().width},"width"),height:v(function(){return this.size().height},"height"),extent:v(function(){var e=this._private.pan,t=this._private.zoom,a=this.renderedExtent(),n={x1:(a.x1-e.x)/t,x2:(a.x2-e.x)/t,y1:(a.y1-e.y)/t,y2:(a.y2-e.y)/t};return n.w=n.x2-n.x1,n.h=n.y2-n.y1,n},"extent"),renderedExtent:v(function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}},"renderedExtent"),multiClickDebounceTime:v(function(e){if(e)this._private.multiClickDebounceTime=e;else return this._private.multiClickDebounceTime;return this},"multiClickDebounceTime")};Mt.centre=Mt.center;Mt.autolockNodes=Mt.autolock;Mt.autoungrabifyNodes=Mt.autoungrabify;var Ra={data:Ve.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:Ve.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:Ve.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Ve.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};Ra.attr=Ra.data;Ra.removeAttr=Ra.removeData;var Ma=v(function(e){var t=this;e=we({},e);var a=e.container;a&&!wn(a)&&wn(a[0])&&(a=a[0]);var n=a?a._cyreg:null;n=n||{},n&&n.cy&&(n.cy.destroy(),n={});var i=n.readies=n.readies||[];a&&(a._cyreg=n),n.cy=t;var s=tr!==void 0&&a!==void 0&&!e.headless,o=e;o.layout=we({name:s?"grid":"null"},o.layout),o.renderer=we({name:s?"canvas":"null"},o.renderer);var l=v(function(h,m,p){return m!==void 0?m:p!==void 0?p:h},"defVal"),u=this._private={container:a,ready:!1,options:o,elements:new cr(this),listeners:[],aniEles:new cr(this),data:o.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:l(!0,o.zoomingEnabled),userZoomingEnabled:l(!0,o.userZoomingEnabled),panningEnabled:l(!0,o.panningEnabled),userPanningEnabled:l(!0,o.userPanningEnabled),boxSelectionEnabled:l(!0,o.boxSelectionEnabled),autolock:l(!1,o.autolock,o.autolockNodes),autoungrabify:l(!1,o.autoungrabify,o.autoungrabifyNodes),autounselectify:l(!1,o.autounselectify),styleEnabled:o.styleEnabled===void 0?s:o.styleEnabled,zoom:ne(o.zoom)?o.zoom:1,pan:{x:Ie(o.pan)&&ne(o.pan.x)?o.pan.x:0,y:Ie(o.pan)&&ne(o.pan.y)?o.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:l(250,o.multiClickDebounceTime)};this.createEmitter(),this.selectionType(o.selectionType),this.zoomRange({min:o.minZoom,max:o.maxZoom});var f=v(function(h,m){var p=h.some(yc);if(p)return aa.all(h).then(m);m(h)},"loadExtData");u.styleEnabled&&t.setStyle([]);var c=we({},o,o.renderer);t.initRenderer(c);var d=v(function(h,m,p){t.notifications(!1);var y=t.mutableElements();y.length>0&&y.remove(),h!=null&&(Ie(h)||Ge(h))&&t.add(h),t.one("layoutready",function(w){t.notifications(!0),t.emit(w),t.one("load",m),t.emitAndNotify("load")}).one("layoutstop",function(){t.one("done",p),t.emit("done")});var b=we({},t._private.options.layout);b.eles=t.elements(),t.layout(b).run()},"setElesAndLayout");f([o.style,o.elements],function(g){var h=g[0],m=g[1];u.styleEnabled&&t.style().append(h),d(m,function(){t.startAnimationLoop(),u.ready=!0,Ke(o.ready)&&t.on("ready",o.ready);for(var p=0;p0,o=!!r.boundingBox,l=xr(o?r.boundingBox:structuredClone(e.extent())),u;if(Br(r.roots))u=r.roots;else if(Ge(r.roots)){for(var f=[],c=0;c0;){var M=R(),I=D(M,P);if(I)M.outgoers().filter(function(me){return me.isNode()&&t.has(me)}).forEach(A);else if(I===null){qe("Detected double maximal shift for node `"+M.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}var O=0;if(r.avoidOverlap)for(var L=0;L0&&y[0].length<=3?ye/2:0),Me=2*Math.PI/y[ge].length*Ce;return ge===0&&y[0].length===1&&(ke=1),{x:W.x+ke*Math.cos(Me),y:W.y+ke*Math.sin(Me)}}else{var Ne=y[ge].length,ze=Math.max(Ne===1?0:o?(l.w-r.padding*2-Z.w)/((r.grid?de:Ne)-1):(l.w-r.padding*2-Z.w)/((r.grid?de:Ne)+1),O),Fe={x:W.x+(Ce+1-(Ne+1)/2)*ze,y:W.y+(ge+1-(X+1)/2)*ae};return Fe}},"getPositionTopBottom"),Te={downward:0,leftward:90,upward:180,rightward:-90};Object.keys(Te).indexOf(r.direction)===-1&&Ue("Invalid direction '".concat(r.direction,"' specified for breadthfirst layout. Valid values are: ").concat(Object.keys(Te).join(", ")));var xe=v(function(se){return Uc(Re(se),l,Te[r.direction])},"getPosition");return t.nodes().layoutPositions(this,r,xe),this};var Rp={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:v(function(e,t){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:v(function(e,t){return t},"transform")};function sf(r){this.options=we({},Rp,r)}v(sf,"CircleLayout");sf.prototype.run=function(){var r=this.options,e=r,t=r.cy,a=e.eles,n=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,i=a.nodes().not(":parent");e.sort&&(i=i.sort(e.sort));for(var s=xr(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:t.width(),h:t.height()}),o={x:s.x1+s.w/2,y:s.y1+s.h/2},l=e.sweep===void 0?2*Math.PI-2*Math.PI/i.length:e.sweep,u=l/Math.max(1,i.length-1),f,c=0,d=0;d1&&e.avoidOverlap){c*=1.75;var y=Math.cos(u)-Math.cos(0),b=Math.sin(u)-Math.sin(0),w=Math.sqrt(c*c/(y*y+b*b));f=Math.max(w,f)}var x=v(function(T,E){var S=e.startAngle+E*u*(n?1:-1),D=f*Math.cos(S),B=f*Math.sin(S),P={x:o.x+D,y:o.y+B};return P},"getPos");return a.nodes().layoutPositions(this,e,x),this};var Mp={fit:!0,padding:30,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:v(function(e){return e.degree()},"concentric"),levelWidth:v(function(e){return e.maxDegree()/4},"levelWidth"),animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:v(function(e,t){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:v(function(e,t){return t},"transform")};function of(r){this.options=we({},Mp,r)}v(of,"ConcentricLayout");of.prototype.run=function(){for(var r=this.options,e=r,t=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,a=r.cy,n=e.eles,i=n.nodes().not(":parent"),s=xr(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:a.width(),h:a.height()}),o={x:s.x1+s.w/2,y:s.y1+s.h/2},l=[],u=0,f=0;f0){var C=Math.abs(b[0].value-x.value);C>=p&&(b=[],y.push(b))}b.push(x)}var T=u+e.minNodeSpacing;if(!e.avoidOverlap){var E=y.length>0&&y[0].length>1,S=Math.min(s.w,s.h)/2-T,D=S/(y.length+E?1:0);T=Math.min(T,D)}for(var B=0,P=0;P1&&e.avoidOverlap){var I=Math.cos(M)-Math.cos(0),O=Math.sin(M)-Math.sin(0),L=Math.sqrt(T*T/(I*I+O*O));B=Math.max(L,B)}A.r=B,B+=T}if(e.equidistant){for(var N=0,q=0,H=0;H=r.numIter||(Vp(a,r),a.temperature=a.temperature*r.coolingFactor,a.temperature=r.animationThreshold&&i(),xn(f)}},"frame");f()}else{for(;u;)u=s(l),l++;Dl(a,r),o()}return this};Xn.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this};Xn.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};var Ip=v(function(e,t,a){for(var n=a.eles.edges(),i=a.eles.nodes(),s=xr(a.boundingBox?a.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),o={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:i.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:n.size(),temperature:a.initialTemp,clientWidth:s.w,clientHeight:s.h,boundingBox:s},l=a.eles.components(),u={},f=0;f0){o.graphSet.push(S);for(var f=0;fn.count?0:n.graph},"findLCA"),uf=v(function(e,t,a,n){var i=n.graphSet[a];if(-10)var c=n.nodeOverlap*f,d=Math.sqrt(o*o+l*l),g=c*o/d,h=c*l/d;else var m=Bn(e,o,l),p=Bn(t,-1*o,-1*l),y=p.x-m.x,b=p.y-m.y,w=y*y+b*b,d=Math.sqrt(w),c=(e.nodeRepulsion+t.nodeRepulsion)/w,g=c*y/d,h=c*b/d;e.isLocked||(e.offsetX-=g,e.offsetY-=h),t.isLocked||(t.offsetX+=g,t.offsetY+=h)}},"nodeRepulsion"),Gp=v(function(e,t,a,n){if(a>0)var i=e.maxX-t.minX;else var i=t.maxX-e.minX;if(n>0)var s=e.maxY-t.minY;else var s=t.maxY-e.minY;return i>=0&&s>=0?Math.sqrt(i*i+s*s):0},"nodesOverlap"),Bn=v(function(e,t,a){var n=e.positionX,i=e.positionY,s=e.height||1,o=e.width||1,l=a/t,u=s/o,f={};return t===0&&0a?(f.x=n,f.y=i+s/2,f):0t&&-1*u<=l&&l<=u?(f.x=n-o/2,f.y=i-o*a/2/t,f):0=u)?(f.x=n+s*t/2/a,f.y=i+s/2,f):(0>a&&(l<=-1*u||l>=u)&&(f.x=n-s*t/2/a,f.y=i-s/2),f)},"findClippingPoint"),Hp=v(function(e,t){for(var a=0;aa){var p=t.gravity*g/m,y=t.gravity*h/m;d.offsetX+=p,d.offsetY+=y}}}}},"calculateGravityForces"),$p=v(function(e,t){var a=[],n=0,i=-1;for(a.push.apply(a,e.graphSet[0]),i+=e.graphSet[0].length;n<=i;){var s=a[n++],o=e.idToIndex[s],l=e.layoutNodes[o],u=l.children;if(0a)var i={x:a*e/n,y:a*t/n};else var i={x:e,y:t};return i},"limitForce"),vf=v(function(e,t){var a=e.parentId;if(a!=null){var n=t.layoutNodes[t.idToIndex[a]],i=!1;if((n.maxX==null||e.maxX+n.padRight>n.maxX)&&(n.maxX=e.maxX+n.padRight,i=!0),(n.minX==null||e.minX-n.padLeftn.maxY)&&(n.maxY=e.maxY+n.padBottom,i=!0),(n.minY==null||e.minY-n.padTopy&&(h+=p+t.componentSpacing,g=0,m=0,p=0)}}},"separateComponents"),Xp={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:v(function(e){},"position"),sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:v(function(e,t){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:v(function(e,t){return t},"transform")};function ff(r){this.options=we({},Xp,r)}v(ff,"GridLayout");ff.prototype.run=function(){var r=this.options,e=r,t=r.cy,a=e.eles,n=a.nodes().not(":parent");e.sort&&(n=n.sort(e.sort));var i=xr(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:t.width(),h:t.height()});if(i.h===0||i.w===0)a.nodes().layoutPositions(this,e,function(K){return{x:i.x1,y:i.y1}});else{var s=n.size(),o=Math.sqrt(s*i.h/i.w),l=Math.round(o),u=Math.round(i.w/i.h*o),f=v(function(J){if(J==null)return Math.min(l,u);var X=Math.min(l,u);X==l?l=J:u=J},"small"),c=v(function(J){if(J==null)return Math.max(l,u);var X=Math.max(l,u);X==l?l=J:u=J},"large"),d=e.rows,g=e.cols!=null?e.cols:e.columns;if(d!=null&&g!=null)l=d,u=g;else if(d!=null&&g==null)l=d,u=Math.ceil(s/l);else if(d==null&&g!=null)u=g,l=Math.ceil(s/u);else if(u*l>s){var h=f(),m=c();(h-1)*m>=s?f(h-1):(m-1)*h>=s&&c(m-1)}else for(;u*l=s?c(y+1):f(p+1)}var b=i.w/u,w=i.h/l;if(e.condense&&(b=0,w=0),e.avoidOverlap)for(var x=0;x=u&&(I=0,M++)},"moveToNextCell"),L={},N=0;N(I=zd(r,e,O[L],O[L+1],O[L+2],O[L+3])))return p(E,I),!0}else if(D.edgeType==="bezier"||D.edgeType==="multibezier"||D.edgeType==="self"||D.edgeType==="compound"){for(var O=D.allpts,L=0;L+5(I=Nd(r,e,O[L],O[L+1],O[L+2],O[L+3],O[L+4],O[L+5])))return p(E,I),!0}for(var N=N||S.source,q=q||S.target,H=n.getArrowWidth(B,P),z=[{name:"source",x:D.arrowStartX,y:D.arrowStartY,angle:D.srcArrowAngle},{name:"target",x:D.arrowEndX,y:D.arrowEndY,angle:D.tgtArrowAngle},{name:"mid-source",x:D.midX,y:D.midY,angle:D.midsrcArrowAngle},{name:"mid-target",x:D.midX,y:D.midY,angle:D.midtgtArrowAngle}],L=0;L0&&(y(N),y(q))}v(b,"checkEdge");function w(E,S,D){return Sr(E,S,D)}v(w,"preprop");function x(E,S){var D=E._private,B=d,P;S?P=S+"-":P="",E.boundingBox();var A=D.labelBounds[S||"main"],R=E.pstyle(P+"label").value,M=E.pstyle("text-events").strValue==="yes";if(!(!M||!R)){var I=w(D.rscratch,"labelX",S),O=w(D.rscratch,"labelY",S),L=w(D.rscratch,"labelAngle",S),N=E.pstyle(P+"text-margin-x").pfValue,q=E.pstyle(P+"text-margin-y").pfValue,H=A.x1-B-N,z=A.x2+B-N,V=A.y1-B-q,K=A.y2+B-q;if(L){var J=Math.cos(L),X=Math.sin(L),ee=v(function(Z,ae){return Z=Z-I,ae=ae-O,{x:Z*J-ae*X+I,y:Z*X+ae*J+O}},"rotate"),te=ee(H,V),ie=ee(H,K),j=ee(z,V),F=ee(z,K),_=[te.x+N,te.y+q,j.x+N,j.y+q,F.x+N,F.y+q,ie.x+N,ie.y+q];if(kr(r,e,_))return p(E),!0}else if(it(A,r,e))return p(E),!0}}v(x,"checkLabel");for(var C=s.length-1;C>=0;C--){var T=s[C];T.isNode()?y(T)||x(T):b(T)||x(T)||x(T,"source")||x(T,"target")}return o};It.getAllInBox=function(r,e,t,a){var n=this.getCachedZSortedEles().interactive,i=this.cy.zoom(),s=2/i,o=[],l=Math.min(r,t),u=Math.max(r,t),f=Math.min(e,a),c=Math.max(e,a);r=l,t=u,e=f,a=c;var d=xr({x1:r,y1:e,x2:t,y2:a}),g=[{x:d.x1,y:d.y1},{x:d.x2,y:d.y1},{x:d.x2,y:d.y2},{x:d.x1,y:d.y2}],h=[[g[0],g[1]],[g[1],g[2]],[g[2],g[3]],[g[3],g[0]]];function m(Z,ae,de){return Sr(Z,ae,de)}v(m,"preprop");function p(Z,ae){var de=Z._private,Re=s,Te="";Z.boundingBox();var xe=de.labelBounds.main;if(!xe)return null;var me=m(de.rscratch,"labelX",ae),se=m(de.rscratch,"labelY",ae),he=m(de.rscratch,"labelAngle",ae),ge=Z.pstyle(Te+"text-margin-x").pfValue,Ce=Z.pstyle(Te+"text-margin-y").pfValue,ye=xe.x1-Re-ge,ke=xe.x2+Re-ge,Me=xe.y1-Re-Ce,Ne=xe.y2+Re-Ce;if(he){var ze=Math.cos(he),Fe=Math.sin(he),Ee=v(function(Y,k){return Y=Y-me,k=k-se,{x:Y*ze-k*Fe+me,y:Y*Fe+k*ze+se}},"rotate");return[Ee(ye,Me),Ee(ke,Me),Ee(ke,Ne),Ee(ye,Ne)]}else return[{x:ye,y:Me},{x:ke,y:Me},{x:ke,y:Ne},{x:ye,y:Ne}]}v(p,"getRotatedLabelBox");function y(Z,ae,de,Re){function Te(xe,me,se){return(se.y-xe.y)*(me.x-xe.x)>(me.y-xe.y)*(se.x-xe.x)}return v(Te,"ccw"),Te(Z,de,Re)!==Te(ae,de,Re)&&Te(Z,ae,de)!==Te(Z,ae,Re)}v(y,"doLinesIntersect");for(var b=0;b0?-(Math.PI-e.ang):Math.PI+e.ang},"invertVec"),ey=v(function(e,t,a,n,i){if(e!==Ml?Ll(t,e,qr):jp(Ar,qr),Ll(t,a,Ar),Al=qr.nx*Ar.ny-qr.ny*Ar.nx,Rl=qr.nx*Ar.nx-qr.ny*-Ar.ny,Kr=Math.asin(Math.max(-1,Math.min(1,Al))),Math.abs(Kr)<1e-6){qs=t.x,_s=t.y,St=_t=0;return}Dt=1,pn=!1,Rl<0?Kr<0?Kr=Math.PI+Kr:(Kr=Math.PI-Kr,Dt=-1,pn=!0):Kr>0&&(Dt=-1,pn=!0),t.radius!==void 0?_t=t.radius:_t=n,xt=Kr/2,nn=Math.min(qr.len/2,Ar.len/2),i?(Fr=Math.abs(Math.cos(xt)*_t/Math.sin(xt)),Fr>nn?(Fr=nn,St=Math.abs(Fr*Math.sin(xt)/Math.cos(xt))):St=_t):(Fr=Math.min(nn,_t),St=Math.abs(Fr*Math.sin(xt)/Math.cos(xt))),Gs=t.x+Ar.nx*Fr,Hs=t.y+Ar.ny*Fr,qs=Gs-Ar.ny*St*Dt,_s=Hs+Ar.nx*St*Dt,gf=t.x+qr.nx*Fr,pf=t.y+qr.ny*Fr,Ml=t},"calcCornerArc");function yf(r,e){e.radius===0?r.lineTo(e.cx,e.cy):r.arc(e.cx,e.cy,e.radius,e.startAngle,e.endAngle,e.counterClockwise)}v(yf,"drawPreparedRoundCorner");function yo(r,e,t,a){var n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0;return a===0||e.radius===0?{cx:e.x,cy:e.y,radius:0,startX:e.x,startY:e.y,stopX:e.x,stopY:e.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(ey(r,e,t,a,n),{cx:qs,cy:_s,radius:St,startX:gf,startY:pf,stopX:Gs,stopY:Hs,startAngle:qr.ang+Math.PI/2*Dt,endAngle:Ar.ang-Math.PI/2*Dt,counterClockwise:pn})}v(yo,"getRoundCorner");var La=.01,ry=Math.sqrt(2*La),mr={};mr.findMidptPtsEtc=function(r,e){var t=e.posPts,a=e.intersectionPts,n=e.vectorNormInverse,i,s=r.pstyle("source-endpoint"),o=r.pstyle("target-endpoint"),l=s.units!=null&&o.units!=null,u=v(function(C,T,E,S){var D=S-T,B=E-C,P=Math.sqrt(B*B+D*D);return{x:-D/P,y:B/P}},"recalcVectorNormInverse"),f=r.pstyle("edge-distances").value;switch(f){case"node-position":i=t;break;case"intersection":i=a;break;case"endpoints":{if(l){var c=this.manualEndptToPx(r.source()[0],s),d=je(c,2),g=d[0],h=d[1],m=this.manualEndptToPx(r.target()[0],o),p=je(m,2),y=p[0],b=p[1],w={x1:g,y1:h,x2:y,y2:b};n=u(g,h,y,b),i=w}else qe("Edge ".concat(r.id()," has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")),i=a;break}}return{midptPts:i,vectorNormInverse:n}};mr.findHaystackPoints=function(r){for(var e=0;e0?Math.max(k-G,0):Math.min(k+G,0)},"subDWH"),R=A(B,S),M=A(P,D),I=!1;b===u?y=Math.abs(R)>Math.abs(M)?n:a:b===l||b===o?(y=a,I=!0):(b===i||b===s)&&(y=n,I=!0);var O=y===a,L=O?M:R,N=O?P:B,q=ao(N),H=!1;!(I&&(x||T))&&(b===o&&N<0||b===l&&N>0||b===i&&N>0||b===s&&N<0)&&(q*=-1,L=q*Math.abs(L),H=!0);var z;if(x){var V=C<0?1+C:C;z=V*L}else{var K=C<0?L:0;z=K+C*q}var J=v(function(k){return Math.abs(k)=Math.abs(L)},"getIsTooClose"),X=J(z),ee=J(Math.abs(L)-Math.abs(z)),te=X||ee;if(te&&!H)if(O){var ie=Math.abs(N)<=d/2,j=Math.abs(B)<=g/2;if(ie){var F=(f.x1+f.x2)/2,_=f.y1,W=f.y2;t.segpts=[F,_,F,W]}else if(j){var Z=(f.y1+f.y2)/2,ae=f.x1,de=f.x2;t.segpts=[ae,Z,de,Z]}else t.segpts=[f.x1,f.y2]}else{var Re=Math.abs(N)<=c/2,Te=Math.abs(P)<=h/2;if(Re){var xe=(f.y1+f.y2)/2,me=f.x1,se=f.x2;t.segpts=[me,xe,se,xe]}else if(Te){var he=(f.x1+f.x2)/2,ge=f.y1,Ce=f.y2;t.segpts=[he,ge,he,Ce]}else t.segpts=[f.x2,f.y1]}else if(O){var ye=f.y1+z+(p?d/2*q:0),ke=f.x1,Me=f.x2;t.segpts=[ke,ye,Me,ye]}else{var Ne=f.x1+z+(p?c/2*q:0),ze=f.y1,Fe=f.y2;t.segpts=[Ne,ze,Ne,Fe]}if(t.isRound){var Ee=r.pstyle("taxi-radius").value,le=r.pstyle("radius-type").value[0]==="arc-radius";t.radii=new Array(t.segpts.length/2).fill(Ee),t.isArcRadius=new Array(t.segpts.length/2).fill(le)}};mr.tryToCorrectInvalidPoints=function(r,e){var t=r._private.rscratch;if(t.edgeType==="bezier"){var a=e.srcPos,n=e.tgtPos,i=e.srcW,s=e.srcH,o=e.tgtW,l=e.tgtH,u=e.srcShape,f=e.tgtShape,c=e.srcCornerRadius,d=e.tgtCornerRadius,g=e.srcRs,h=e.tgtRs,m=!ne(t.startX)||!ne(t.startY),p=!ne(t.arrowStartX)||!ne(t.arrowStartY),y=!ne(t.endX)||!ne(t.endY),b=!ne(t.arrowEndX)||!ne(t.arrowEndY),w=3,x=this.getArrowWidth(r.pstyle("width").pfValue,r.pstyle("arrow-scale").value)*this.arrowShapeWidth,C=w*x,T=At({x:t.ctrlpts[0],y:t.ctrlpts[1]},{x:t.startX,y:t.startY}),E=TN.poolIndex()){var q=L;L=N,N=q}var H=R.srcPos=L.position(),z=R.tgtPos=N.position(),V=R.srcW=L.outerWidth(),K=R.srcH=L.outerHeight(),J=R.tgtW=N.outerWidth(),X=R.tgtH=N.outerHeight(),ee=R.srcShape=t.nodeShapes[e.getNodeShape(L)],te=R.tgtShape=t.nodeShapes[e.getNodeShape(N)],ie=R.srcCornerRadius=L.pstyle("corner-radius").value==="auto"?"auto":L.pstyle("corner-radius").pfValue,j=R.tgtCornerRadius=N.pstyle("corner-radius").value==="auto"?"auto":N.pstyle("corner-radius").pfValue,F=R.tgtRs=N._private.rscratch,_=R.srcRs=L._private.rscratch;R.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var W=0;W=ry||(Me=Math.sqrt(Math.max(ke*ke,La)+Math.max(ye*ye,La)));var Ne=R.vector={x:ke,y:ye},ze=R.vectorNorm={x:Ne.x/Me,y:Ne.y/Me},Fe={x:-ze.y,y:ze.x};R.nodesOverlap=!ne(Me)||te.checkPoint(xe[0],xe[1],0,J,X,z.x,z.y,j,F)||ee.checkPoint(se[0],se[1],0,V,K,H.x,H.y,ie,_),R.vectorNormInverse=Fe,M={nodesOverlap:R.nodesOverlap,dirCounts:R.dirCounts,calculatedIntersection:!0,hasBezier:R.hasBezier,hasUnbundled:R.hasUnbundled,eles:R.eles,srcPos:z,srcRs:F,tgtPos:H,tgtRs:_,srcW:J,srcH:X,tgtW:V,tgtH:K,srcIntn:he,tgtIntn:me,srcShape:te,tgtShape:ee,posPts:{x1:Ce.x2,y1:Ce.y2,x2:Ce.x1,y2:Ce.y1},intersectionPts:{x1:ge.x2,y1:ge.y2,x2:ge.x1,y2:ge.y1},vector:{x:-Ne.x,y:-Ne.y},vectorNorm:{x:-ze.x,y:-ze.y},vectorNormInverse:{x:-Fe.x,y:-Fe.y}}}var Ee=Te?M:R;ae.nodesOverlap=Ee.nodesOverlap,ae.srcIntn=Ee.srcIntn,ae.tgtIntn=Ee.tgtIntn,ae.isRound=de.startsWith("round"),n&&(L.isParent()||L.isChild()||N.isParent()||N.isChild())&&(L.parents().anySame(N)||N.parents().anySame(L)||L.same(N)&&L.isParent())?e.findCompoundLoopPoints(Z,Ee,W,Re):L===N?e.findLoopPoints(Z,Ee,W,Re):de.endsWith("segments")?e.findSegmentsPoints(Z,Ee):de.endsWith("taxi")?e.findTaxiPoints(Z,Ee):de==="straight"||!Re&&R.eles.length%2===1&&W===Math.floor(R.eles.length/2)?e.findStraightEdgePoints(Z):e.findBezierPoints(Z,Ee,W,Re,Te),e.findEndpoints(Z),e.tryToCorrectInvalidPoints(Z,Ee),e.checkForInvalidEdgeWarning(Z),e.storeAllpts(Z),e.storeEdgeProjections(Z),e.calculateArrowAngles(Z),e.recalculateEdgeLabelProjections(Z),e.calculateLabelAngles(Z)}},"_loop"),E=0;E0){var xe=u,me=Tt(xe,$t(s)),se=Tt(xe,$t(Te)),he=me;if(se2){var ge=Tt(xe,{x:Te[2],y:Te[3]});ge0){var $=f,U=Tt($,$t(s)),Q=Tt($,$t(G)),ue=U;if(Q2){var re=Tt($,{x:G[2],y:G[3]});re=h||E){p={cp:x,segment:T};break}}if(p)break}var S=p.cp,D=p.segment,B=(h-y)/D.length,P=D.t1-D.t0,A=g?D.t0+P*B:D.t1-P*B;A=Da(0,A,1),e=Xt(S.p0,S.p1,S.p2,A),d=ay(S.p0,S.p1,S.p2,A);break}case"straight":case"segments":case"haystack":{for(var R=0,M,I,O,L,N=a.allpts.length,q=0;q+3=h));q+=2);var H=h-I,z=H/M;z=Da(0,z,1),e=Sd(O,L,z),d=wf(O,L);break}}s("labelX",c,e.x),s("labelY",c,e.y),s("labelAutoAngle",c,d)}},"calculateEndProjection");u("source"),u("target"),this.applyLabelDimensions(r)}};Hr.applyLabelDimensions=function(r){this.applyPrefixedLabelDimensions(r),r.isEdge()&&(this.applyPrefixedLabelDimensions(r,"source"),this.applyPrefixedLabelDimensions(r,"target"))};Hr.applyPrefixedLabelDimensions=function(r,e){var t=r._private,a=this.getLabelText(r,e),n=Pt(a,r._private.labelDimsKey);if(Sr(t.rscratch,"prefixedLabelDimsKey",e)!==n){Xr(t.rscratch,"prefixedLabelDimsKey",e,n);var i=this.calculateLabelDimensions(r,a),s=r.pstyle("line-height").pfValue,o=r.pstyle("text-wrap").strValue,l=Sr(t.rscratch,"labelWrapCachedLines",e)||[],u=o!=="wrap"?1:Math.max(l.length,1),f=i.height/u,c=f*s,d=i.width,g=i.height+(u-1)*(s-1)*f;Xr(t.rstyle,"labelWidth",e,d),Xr(t.rscratch,"labelWidth",e,d),Xr(t.rstyle,"labelHeight",e,g),Xr(t.rscratch,"labelHeight",e,g),Xr(t.rscratch,"labelLineHeight",e,c)}};Hr.getLabelText=function(r,e){var t=r._private,a=e?e+"-":"",n=r.pstyle(a+"label").strValue,i=r.pstyle("text-transform").value,s=v(function(K,J){return J?(Xr(t.rscratch,K,e,J),J):Sr(t.rscratch,K,e)},"rscratch");if(!n)return"";i=="none"||(i=="uppercase"?n=n.toUpperCase():i=="lowercase"&&(n=n.toLowerCase()));var o=r.pstyle("text-wrap").value;if(o==="wrap"){var l=s("labelKey");if(l!=null&&s("labelWrapKey")===l)return s("labelWrapCachedText");for(var u="\u200B",f=n.split(` +`),c=r.pstyle("text-max-width").pfValue,d=r.pstyle("text-overflow-wrap").value,g=d==="anywhere",h=[],m=/[\s\u200b]+|$/g,p=0;pc){var C=y.matchAll(m),T="",E=0,S=Dr(C),D;try{for(S.s();!(D=S.n()).done;){var B=D.value,P=B[0],A=y.substring(E,B.index);E=B.index+P.length;var R=T.length===0?A:T+A+P,M=this.calculateLabelDimensions(r,R),I=M.width;I<=c?T+=A+P:(T&&h.push(T),T=A+P)}}catch(V){S.e(V)}finally{S.f()}T.match(/^[\s\u200b]+$/)||h.push(T)}else h.push(y)}s("labelWrapCachedLines",h),n=s("labelWrapCachedText",h.join(` +`)),s("labelWrapKey",l)}else if(o==="ellipsis"){var O=r.pstyle("text-max-width").pfValue,L="",N="\u2026",q=!1;if(this.calculateLabelDimensions(r,n).widthO)break;L+=n[H],H===n.length-1&&(q=!0)}return q||(L+=N),L}return n};Hr.getLabelJustification=function(r){var e=r.pstyle("text-justification").strValue,t=r.pstyle("text-halign").strValue;if(e==="auto")if(r.isNode())switch(t){case"left":return"right";case"right":return"left";default:return"center"}else return"center";else return e};Hr.calculateLabelDimensions=function(r,e){var t=this,a=t.cy.window(),n=a.document,i=0,s=r.pstyle("font-style").strValue,o=r.pstyle("font-size").pfValue,l=r.pstyle("font-family").strValue,u=r.pstyle("font-weight").strValue,f=this.labelCalcCanvas,c=this.labelCalcCanvasContext;if(!f){f=this.labelCalcCanvas=n.createElement("canvas"),c=this.labelCalcCanvasContext=f.getContext("2d");var d=f.style;d.position="absolute",d.left="-9999px",d.top="-9999px",d.zIndex="-1",d.visibility="hidden",d.pointerEvents="none"}c.font="".concat(s," ").concat(u," ").concat(o,"px ").concat(l);for(var g=0,h=0,m=e.split(` +`),p=0;p1&&arguments[1]!==void 0?arguments[1]:!0;if(e.merge(s),o)for(var l=0;l=r.desktopTapThreshold2}var vr=i(k);er&&(r.hoverData.tapholdCancelled=!0);var et=v(function(){var Pr=r.hoverData.dragDelta=r.hoverData.dragDelta||[];Pr.length===0?(Pr.push(Ae[0]),Pr.push(Ae[1])):(Pr[0]+=Ae[0],Pr[1]+=Ae[1])},"updateDragDelta");$=!0,n(Be,["mousemove","vmousemove","tapdrag"],k,{x:re[0],y:re[1]});var Qe=v(function(Pr){return{originalEvent:k,type:Pr,position:{x:re[0],y:re[1]}}},"makeEvent"),$r=v(function(){r.data.bgActivePosistion=void 0,r.hoverData.selecting||U.emit(Qe("boxstart")),be[4]=1,r.hoverData.selecting=!0,r.redrawHint("select",!0),r.redraw()},"goIntoBoxMode");if(r.hoverData.which===3){if(er){var Ur=Qe("cxtdrag");ce?ce.emit(Ur):U.emit(Ur),r.hoverData.cxtDragged=!0,(!r.hoverData.cxtOver||Be!==r.hoverData.cxtOver)&&(r.hoverData.cxtOver&&r.hoverData.cxtOver.emit(Qe("cxtdragout")),r.hoverData.cxtOver=Be,Be&&Be.emit(Qe("cxtdragover")))}}else if(r.hoverData.dragging){if($=!0,U.panningEnabled()&&U.userPanningEnabled()){var Nt;if(r.hoverData.justStartedPan){var Ua=r.hoverData.mdownPos;Nt={x:(re[0]-Ua[0])*Q,y:(re[1]-Ua[1])*Q},r.hoverData.justStartedPan=!1}else Nt={x:Ae[0]*Q,y:Ae[1]*Q};U.panBy(Nt),U.emit(Qe("dragpan")),r.hoverData.dragged=!0}re=r.projectIntoViewport(k.clientX,k.clientY)}else if(be[4]==1&&(ce==null||ce.pannable())){if(er){if(!r.hoverData.dragging&&U.boxSelectionEnabled()&&(vr||!U.panningEnabled()||!U.userPanningEnabled()))$r();else if(!r.hoverData.selecting&&U.panningEnabled()&&U.userPanningEnabled()){var wt=s(ce,r.hoverData.downs);wt&&(r.hoverData.dragging=!0,r.hoverData.justStartedPan=!0,be[4]=0,r.data.bgActivePosistion=$t(fe),r.redrawHint("select",!0),r.redraw())}ce&&ce.pannable()&&ce.active()&&ce.unactivate()}}else{if(ce&&ce.pannable()&&ce.active()&&ce.unactivate(),(!ce||!ce.grabbed())&&Be!=Se&&(Se&&n(Se,["mouseout","tapdragout"],k,{x:re[0],y:re[1]}),Be&&n(Be,["mouseover","tapdragover"],k,{x:re[0],y:re[1]}),r.hoverData.last=Be),ce)if(er){if(U.boxSelectionEnabled()&&vr)ce&&ce.grabbed()&&(y(Pe),ce.emit(Qe("freeon")),Pe.emit(Qe("free")),r.dragData.didDrag&&(ce.emit(Qe("dragfreeon")),Pe.emit(Qe("dragfree")))),$r();else if(ce&&ce.grabbed()&&r.nodeIsDraggable(ce)){var Cr=!r.dragData.didDrag;Cr&&r.redrawHint("eles",!0),r.dragData.didDrag=!0,r.hoverData.draggingEles||m(Pe,{inDragLayer:!0});var gr={x:0,y:0};if(ne(Ae[0])&&ne(Ae[1])&&(gr.x+=Ae[0],gr.y+=Ae[1],Cr)){var Tr=r.hoverData.dragDelta;Tr&&ne(Tr[0])&&ne(Tr[1])&&(gr.x+=Tr[0],gr.y+=Tr[1])}r.hoverData.draggingEles=!0,Pe.silentShift(gr).emit(Qe("position")).emit(Qe("drag")),r.redrawHint("drag",!0),r.redraw()}}else et();$=!0}if(be[2]=re[0],be[3]=re[1],$)return k.stopPropagation&&k.stopPropagation(),k.preventDefault&&k.preventDefault(),!1}},"mousemoveHandler"),!1);var A,R,M;r.registerBinding(e,"mouseup",v(function(k){if(!(r.hoverData.which===1&&k.which!==1&&r.hoverData.capture)){var G=r.hoverData.capture;if(G){r.hoverData.capture=!1;var $=r.cy,U=r.projectIntoViewport(k.clientX,k.clientY),Q=r.selection,ue=r.findNearestElement(U[0],U[1],!0,!1),re=r.dragData.possibleDragElements,fe=r.hoverData.down,ve=i(k);r.data.bgActivePosistion&&(r.redrawHint("select",!0),r.redraw()),r.hoverData.tapholdCancelled=!0,r.data.bgActivePosistion=void 0,fe&&fe.unactivate();var be=v(function(Xe){return{originalEvent:k,type:Xe,position:{x:U[0],y:U[1]}}},"makeEvent");if(r.hoverData.which===3){var Be=be("cxttapend");if(fe?fe.emit(Be):$.emit(Be),!r.hoverData.cxtDragged){var Se=be("cxttap");fe?fe.emit(Se):$.emit(Se)}r.hoverData.cxtDragged=!1,r.hoverData.which=null}else if(r.hoverData.which===1){if(n(ue,["mouseup","tapend","vmouseup"],k,{x:U[0],y:U[1]}),!r.dragData.didDrag&&!r.hoverData.dragged&&!r.hoverData.selecting&&!r.hoverData.isOverThresholdDrag&&(n(fe,["click","tap","vclick"],k,{x:U[0],y:U[1]}),R=!1,k.timeStamp-M<=$.multiClickDebounceTime()?(A&&clearTimeout(A),R=!0,M=null,n(fe,["dblclick","dbltap","vdblclick"],k,{x:U[0],y:U[1]})):(A=setTimeout(function(){R||n(fe,["oneclick","onetap","voneclick"],k,{x:U[0],y:U[1]})},$.multiClickDebounceTime()),M=k.timeStamp)),fe==null&&!r.dragData.didDrag&&!r.hoverData.selecting&&!r.hoverData.dragged&&!i(k)&&($.$(t).unselect(["tapunselect"]),re.length>0&&r.redrawHint("eles",!0),r.dragData.possibleDragElements=re=$.collection()),ue==fe&&!r.dragData.didDrag&&!r.hoverData.selecting&&ue!=null&&ue._private.selectable&&(r.hoverData.dragging||($.selectionType()==="additive"||ve?ue.selected()?ue.unselect(["tapunselect"]):ue.select(["tapselect"]):ve||($.$(t).unmerge(ue).unselect(["tapunselect"]),ue.select(["tapselect"]))),r.redrawHint("eles",!0)),r.hoverData.selecting){var ce=$.collection(r.getAllInBox(Q[0],Q[1],Q[2],Q[3]));r.redrawHint("select",!0),ce.length>0&&r.redrawHint("eles",!0),$.emit(be("boxend"));var Ae=v(function(Xe){return Xe.selectable()&&!Xe.selected()},"eleWouldBeSelected");$.selectionType()==="additive"||ve||$.$(t).unmerge(ce).unselect(),ce.emit(be("box")).stdFilter(Ae).select().emit(be("boxselect")),r.redraw()}if(r.hoverData.dragging&&(r.hoverData.dragging=!1,r.redrawHint("select",!0),r.redrawHint("eles",!0),r.redraw()),!Q[4]){r.redrawHint("drag",!0),r.redrawHint("eles",!0);var Pe=fe&&fe.grabbed();y(re),Pe&&(fe.emit(be("freeon")),re.emit(be("free")),r.dragData.didDrag&&(fe.emit(be("dragfreeon")),re.emit(be("dragfree"))))}}Q[4]=0,r.hoverData.down=null,r.hoverData.cxtStarted=!1,r.hoverData.draggingEles=!1,r.hoverData.selecting=!1,r.hoverData.isOverThresholdDrag=!1,r.dragData.didDrag=!1,r.hoverData.dragged=!1,r.hoverData.dragDelta=[],r.hoverData.mdownPos=null,r.hoverData.mdownGPos=null,r.hoverData.which=null}}},"mouseupHandler"),!1);var I=[],O=4,L,N=1e5,q=v(function(k,G){for(var $=0;$=O){var U=I;if(L=q(U,5),!L){var Q=Math.abs(U[0]);L=H(U)&&Q>5}if(L)for(var ue=0;ue5&&($=ao($)*5),Se=$/-250,L&&(Se/=N,Se*=3),Se=Se*r.wheelSensitivity;var ce=k.deltaMode===1;ce&&(Se*=33);var Ae=re.zoom()*Math.pow(10,Se);k.type==="gesturechange"&&(Ae=r.gestureStartZoom*k.scale),re.zoom({level:Ae,renderedPosition:{x:Be[0],y:Be[1]}}),re.emit({type:k.type==="gesturechange"?"pinchzoom":"scrollzoom",originalEvent:k,position:{x:be[0],y:be[1]}})}}}},"wheelHandler");r.registerBinding(r.container,"wheel",z,!0),r.registerBinding(e,"scroll",v(function(k){r.scrollingPage=!0,clearTimeout(r.scrollingPageTimeout),r.scrollingPageTimeout=setTimeout(function(){r.scrollingPage=!1},250)},"scrollHandler"),!0),r.registerBinding(r.container,"gesturestart",v(function(k){r.gestureStartZoom=r.cy.zoom(),r.hasTouchStarted||k.preventDefault()},"gestureStartHandler"),!0),r.registerBinding(r.container,"gesturechange",function(Y){r.hasTouchStarted||z(Y)},!0),r.registerBinding(r.container,"mouseout",v(function(k){var G=r.projectIntoViewport(k.clientX,k.clientY);r.cy.emit({originalEvent:k,type:"mouseout",position:{x:G[0],y:G[1]}})},"mouseOutHandler"),!1),r.registerBinding(r.container,"mouseover",v(function(k){var G=r.projectIntoViewport(k.clientX,k.clientY);r.cy.emit({originalEvent:k,type:"mouseover",position:{x:G[0],y:G[1]}})},"mouseOverHandler"),!1);var V,K,J,X,ee,te,ie,j,F,_,W,Z,ae,de=v(function(k,G,$,U){return Math.sqrt(($-k)*($-k)+(U-G)*(U-G))},"distance"),Re=v(function(k,G,$,U){return($-k)*($-k)+(U-G)*(U-G)},"distanceSq"),Te;r.registerBinding(r.container,"touchstart",Te=v(function(k){if(r.hasTouchStarted=!0,!!B(k)){w(),r.touchData.capture=!0,r.data.bgActivePosistion=void 0;var G=r.cy,$=r.touchData.now,U=r.touchData.earlier;if(k.touches[0]){var Q=r.projectIntoViewport(k.touches[0].clientX,k.touches[0].clientY);$[0]=Q[0],$[1]=Q[1]}if(k.touches[1]){var Q=r.projectIntoViewport(k.touches[1].clientX,k.touches[1].clientY);$[2]=Q[0],$[3]=Q[1]}if(k.touches[2]){var Q=r.projectIntoViewport(k.touches[2].clientX,k.touches[2].clientY);$[4]=Q[0],$[5]=Q[1]}var ue=v(function(vr){return{originalEvent:k,type:vr,position:{x:$[0],y:$[1]}}},"makeEvent");if(k.touches[1]){r.touchData.singleTouchMoved=!0,y(r.dragData.touchDragEles);var re=r.findContainerClientCoords();F=re[0],_=re[1],W=re[2],Z=re[3],V=k.touches[0].clientX-F,K=k.touches[0].clientY-_,J=k.touches[1].clientX-F,X=k.touches[1].clientY-_,ae=0<=V&&V<=W&&0<=J&&J<=W&&0<=K&&K<=Z&&0<=X&&X<=Z;var fe=G.pan(),ve=G.zoom();ee=de(V,K,J,X),te=Re(V,K,J,X),ie=[(V+J)/2,(K+X)/2],j=[(ie[0]-fe.x)/ve,(ie[1]-fe.y)/ve];var be=200,Be=be*be;if(te=1){for(var br=r.touchData.startPosition=[null,null,null,null,null,null],Ze=0;Ze<$.length;Ze++)br[Ze]=U[Ze]=$[Ze];var sr=k.touches[0];r.touchData.startGPosition=[sr.clientX,sr.clientY]}}},"touchstartHandler"),!1);var xe;r.registerBinding(e,"touchmove",xe=v(function(k){var G=r.touchData.capture;if(!(!G&&!B(k))){var $=r.selection,U=r.cy,Q=r.touchData.now,ue=r.touchData.earlier,re=U.zoom();if(k.touches[0]){var fe=r.projectIntoViewport(k.touches[0].clientX,k.touches[0].clientY);Q[0]=fe[0],Q[1]=fe[1]}if(k.touches[1]){var fe=r.projectIntoViewport(k.touches[1].clientX,k.touches[1].clientY);Q[2]=fe[0],Q[3]=fe[1]}if(k.touches[2]){var fe=r.projectIntoViewport(k.touches[2].clientX,k.touches[2].clientY);Q[4]=fe[0],Q[5]=fe[1]}var ve=v(function(ec){return{originalEvent:k,type:ec,position:{x:Q[0],y:Q[1]}}},"makeEvent"),be=r.touchData.startGPosition,Be;if(G&&k.touches[0]&&be){for(var Se=[],ce=0;ce=r.touchTapThreshold2}if(G&&r.touchData.cxt){k.preventDefault();var Ze=k.touches[0].clientX-F,sr=k.touches[0].clientY-_,rr=k.touches[1].clientX-F,vr=k.touches[1].clientY-_,et=Re(Ze,sr,rr,vr),Qe=et/te,$r=150,Ur=$r*$r,Nt=1.5,Ua=Nt*Nt;if(Qe>=Ua||et>=Ur){r.touchData.cxt=!1,r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);var wt=ve("cxttapend");r.touchData.start?(r.touchData.start.unactivate().emit(wt),r.touchData.start=null):U.emit(wt)}}if(G&&r.touchData.cxt){var wt=ve("cxtdrag");r.data.bgActivePosistion=void 0,r.redrawHint("select",!0),r.touchData.start?r.touchData.start.emit(wt):U.emit(wt),r.touchData.start&&(r.touchData.start._private.grabbed=!1),r.touchData.cxtDragged=!0;var Cr=r.findNearestElement(Q[0],Q[1],!0,!0);(!r.touchData.cxtOver||Cr!==r.touchData.cxtOver)&&(r.touchData.cxtOver&&r.touchData.cxtOver.emit(ve("cxtdragout")),r.touchData.cxtOver=Cr,Cr&&Cr.emit(ve("cxtdragover")))}else if(G&&k.touches[2]&&U.boxSelectionEnabled())k.preventDefault(),r.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,r.touchData.selecting||U.emit(ve("boxstart")),r.touchData.selecting=!0,r.touchData.didSelect=!0,$[4]=1,!$||$.length===0||$[0]===void 0?($[0]=(Q[0]+Q[2]+Q[4])/3,$[1]=(Q[1]+Q[3]+Q[5])/3,$[2]=(Q[0]+Q[2]+Q[4])/3+1,$[3]=(Q[1]+Q[3]+Q[5])/3+1):($[2]=(Q[0]+Q[2]+Q[4])/3,$[3]=(Q[1]+Q[3]+Q[5])/3),r.redrawHint("select",!0),r.redraw();else if(G&&k.touches[1]&&!r.touchData.didSelect&&U.zoomingEnabled()&&U.panningEnabled()&&U.userZoomingEnabled()&&U.userPanningEnabled()){k.preventDefault(),r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);var gr=r.dragData.touchDragEles;if(gr){r.redrawHint("drag",!0);for(var Tr=0;Tr0&&!r.hoverData.draggingEles&&!r.swipePanning&&r.data.bgActivePosistion!=null&&(r.data.bgActivePosistion=void 0,r.redrawHint("select",!0),r.redraw())}},"touchmoveHandler"),!1);var me;r.registerBinding(e,"touchcancel",me=v(function(k){var G=r.touchData.start;r.touchData.capture=!1,G&&G.unactivate()},"touchcancelHandler"));var se,he,ge,Ce;if(r.registerBinding(e,"touchend",se=v(function(k){var G=r.touchData.start,$=r.touchData.capture;if($)k.touches.length===0&&(r.touchData.capture=!1),k.preventDefault();else return;var U=r.selection;r.swipePanning=!1,r.hoverData.draggingEles=!1;var Q=r.cy,ue=Q.zoom(),re=r.touchData.now,fe=r.touchData.earlier;if(k.touches[0]){var ve=r.projectIntoViewport(k.touches[0].clientX,k.touches[0].clientY);re[0]=ve[0],re[1]=ve[1]}if(k.touches[1]){var ve=r.projectIntoViewport(k.touches[1].clientX,k.touches[1].clientY);re[2]=ve[0],re[3]=ve[1]}if(k.touches[2]){var ve=r.projectIntoViewport(k.touches[2].clientX,k.touches[2].clientY);re[4]=ve[0],re[5]=ve[1]}var be=v(function(Ur){return{originalEvent:k,type:Ur,position:{x:re[0],y:re[1]}}},"makeEvent");G&&G.unactivate();var Be;if(r.touchData.cxt){if(Be=be("cxttapend"),G?G.emit(Be):Q.emit(Be),!r.touchData.cxtDragged){var Se=be("cxttap");G?G.emit(Se):Q.emit(Se)}r.touchData.start&&(r.touchData.start._private.grabbed=!1),r.touchData.cxt=!1,r.touchData.start=null,r.redraw();return}if(!k.touches[2]&&Q.boxSelectionEnabled()&&r.touchData.selecting){r.touchData.selecting=!1;var ce=Q.collection(r.getAllInBox(U[0],U[1],U[2],U[3]));U[0]=void 0,U[1]=void 0,U[2]=void 0,U[3]=void 0,U[4]=0,r.redrawHint("select",!0),Q.emit(be("boxend"));var Ae=v(function(Ur){return Ur.selectable()&&!Ur.selected()},"eleWouldBeSelected");ce.emit(be("box")).stdFilter(Ae).select().emit(be("boxselect")),ce.nonempty()&&r.redrawHint("eles",!0),r.redraw()}if(G?.unactivate(),k.touches[2])r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);else if(!k.touches[1]){if(!k.touches[0]){if(!k.touches[0]){r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);var Pe=r.dragData.touchDragEles;if(G!=null){var er=G._private.grabbed;y(Pe),r.redrawHint("drag",!0),r.redrawHint("eles",!0),er&&(G.emit(be("freeon")),Pe.emit(be("free")),r.dragData.didDrag&&(G.emit(be("dragfreeon")),Pe.emit(be("dragfree")))),n(G,["touchend","tapend","vmouseup","tapdragout"],k,{x:re[0],y:re[1]}),G.unactivate(),r.touchData.start=null}else{var Xe=r.findNearestElement(re[0],re[1],!0,!0);n(Xe,["touchend","tapend","vmouseup","tapdragout"],k,{x:re[0],y:re[1]})}var br=r.touchData.startPosition[0]-re[0],Ze=br*br,sr=r.touchData.startPosition[1]-re[1],rr=sr*sr,vr=Ze+rr,et=vr*ue*ue;r.touchData.singleTouchMoved||(G||Q.$(":selected").unselect(["tapunselect"]),n(G,["tap","vclick"],k,{x:re[0],y:re[1]}),he=!1,k.timeStamp-Ce<=Q.multiClickDebounceTime()?(ge&&clearTimeout(ge),he=!0,Ce=null,n(G,["dbltap","vdblclick"],k,{x:re[0],y:re[1]})):(ge=setTimeout(function(){he||n(G,["onetap","voneclick"],k,{x:re[0],y:re[1]})},Q.multiClickDebounceTime()),Ce=k.timeStamp)),G!=null&&!r.dragData.didDrag&&G._private.selectable&&et"u"){var ye=[],ke=v(function(k){return{clientX:k.clientX,clientY:k.clientY,force:1,identifier:k.pointerId,pageX:k.pageX,pageY:k.pageY,radiusX:k.width/2,radiusY:k.height/2,screenX:k.screenX,screenY:k.screenY,target:k.target}},"makeTouch"),Me=v(function(k){return{event:k,touch:ke(k)}},"makePointer"),Ne=v(function(k){ye.push(Me(k))},"addPointer"),ze=v(function(k){for(var G=0;G0)return V[0]}return null},"getCurveT"),h=Object.keys(d),m=0;m0?g:xv(i,s,e,t,a,n,o,l)},"intersectLine"),checkPoint:v(function(e,t,a,n,i,s,o,l){l=l==="auto"?ft(n,i):l;var u=2*l;if(Qr(e,t,this.points,s,o,n,i-u,[0,-1],a)||Qr(e,t,this.points,s,o,n-u,i,[0,-1],a))return!0;var f=n/2+2*a,c=i/2+2*a,d=[s-f,o-c,s-f,o,s+f,o,s+f,o-c];return!!(kr(e,t,d)||Bt(e,t,u,u,s+n/2-l,o+i/2-l,a)||Bt(e,t,u,u,s-n/2+l,o+i/2-l,a))},"checkPoint")}};Jr.registerNodeShapes=function(){var r=this.nodeShapes={},e=this;this.generateEllipse(),this.generatePolygon("triangle",wr(3,0)),this.generateRoundPolygon("round-triangle",wr(3,0)),this.generatePolygon("rectangle",wr(4,0)),r.square=r.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();{var t=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",t),this.generateRoundPolygon("round-diamond",t)}this.generatePolygon("pentagon",wr(5,0)),this.generateRoundPolygon("round-pentagon",wr(5,0)),this.generatePolygon("hexagon",wr(6,0)),this.generateRoundPolygon("round-hexagon",wr(6,0)),this.generatePolygon("heptagon",wr(7,0)),this.generateRoundPolygon("round-heptagon",wr(7,0)),this.generatePolygon("octagon",wr(8,0)),this.generateRoundPolygon("round-octagon",wr(8,0));var a=new Array(20);{var n=As(5,0),i=As(5,Math.PI/5),s=.5*(3-Math.sqrt(5));s*=1.57;for(var o=0;o=e.deqFastCost*x)break}else if(u){if(b>=e.deqCost*g||b>=e.deqAvgCost*d)break}else if(w>=e.deqNoDrawCost*xs)break;var C=e.deq(a,p,m);if(C.length>0)for(var T=0;T0&&(e.onDeqd(a,h),!u&&e.shouldRedraw(a,h,p,m)&&i())},"dequeue"),o=e.priority||eo;n.beforeRender(s,o(a))}},"setupDequeueingImpl")},"setupDequeueing")},iy=(function(){function r(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:En;gt(this,r),this.idsByKey=new Yr,this.keyForId=new Yr,this.cachesByLvl=new Yr,this.lvls=[],this.getKey=e,this.doesEleInvalidateKey=t}return v(r,"ElementTextureCacheLookup"),pt(r,[{key:"getIdsFor",value:v(function(t){t==null&&Ue("Can not get id list for null key");var a=this.idsByKey,n=this.idsByKey.get(t);return n||(n=new ta,a.set(t,n)),n},"getIdsFor")},{key:"addIdForKey",value:v(function(t,a){t!=null&&this.getIdsFor(t).add(a)},"addIdForKey")},{key:"deleteIdForKey",value:v(function(t,a){t!=null&&this.getIdsFor(t).delete(a)},"deleteIdForKey")},{key:"getNumberOfIdsForKey",value:v(function(t){return t==null?0:this.getIdsFor(t).size},"getNumberOfIdsForKey")},{key:"updateKeyMappingFor",value:v(function(t){var a=t.id(),n=this.keyForId.get(a),i=this.getKey(t);this.deleteIdForKey(n,a),this.addIdForKey(i,a),this.keyForId.set(a,i)},"updateKeyMappingFor")},{key:"deleteKeyMappingFor",value:v(function(t){var a=t.id(),n=this.keyForId.get(a);this.deleteIdForKey(n,a),this.keyForId.delete(a)},"deleteKeyMappingFor")},{key:"keyHasChangedFor",value:v(function(t){var a=t.id(),n=this.keyForId.get(a),i=this.getKey(t);return n!==i},"keyHasChangedFor")},{key:"isInvalid",value:v(function(t){return this.keyHasChangedFor(t)||this.doesEleInvalidateKey(t)},"isInvalid")},{key:"getCachesAt",value:v(function(t){var a=this.cachesByLvl,n=this.lvls,i=a.get(t);return i||(i=new Yr,a.set(t,i),n.push(t)),i},"getCachesAt")},{key:"getCache",value:v(function(t,a){return this.getCachesAt(a).get(t)},"getCache")},{key:"get",value:v(function(t,a){var n=this.getKey(t),i=this.getCache(n,a);return i!=null&&this.updateKeyMappingFor(t),i},"get")},{key:"getForCachedKey",value:v(function(t,a){var n=this.keyForId.get(t.id()),i=this.getCache(n,a);return i},"getForCachedKey")},{key:"hasCache",value:v(function(t,a){return this.getCachesAt(a).has(t)},"hasCache")},{key:"has",value:v(function(t,a){var n=this.getKey(t);return this.hasCache(n,a)},"has")},{key:"setCache",value:v(function(t,a,n){n.key=t,this.getCachesAt(a).set(t,n)},"setCache")},{key:"set",value:v(function(t,a,n){var i=this.getKey(t);this.setCache(i,a,n),this.updateKeyMappingFor(t)},"set")},{key:"deleteCache",value:v(function(t,a){this.getCachesAt(a).delete(t)},"deleteCache")},{key:"delete",value:v(function(t,a){var n=this.getKey(t);this.deleteCache(n,a)},"_delete")},{key:"invalidateKey",value:v(function(t){var a=this;this.lvls.forEach(function(n){return a.deleteCache(t,n)})},"invalidateKey")},{key:"invalidate",value:v(function(t){var a=t.id(),n=this.keyForId.get(a);this.deleteKeyMappingFor(t);var i=this.doesEleInvalidateKey(t);return i&&this.invalidateKey(n),i||this.getNumberOfIdsForKey(n)===0},"invalidate")}])})(),zl=25,sn=50,yn=-4,Ws=3,kf=7.99,sy=8,oy=1024,uy=1024,ly=1024,vy=.2,fy=.8,cy=10,dy=.15,hy=.1,gy=.9,py=.9,yy=100,my=1,Kt={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},by=dr({getKey:null,doesEleInvalidateKey:En,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:hv,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),wa=v(function(e,t){var a=this;a.renderer=e,a.onDequeues=[];var n=by(t);we(a,n),a.lookup=new iy(n.getKey,n.doesEleInvalidateKey),a.setupDequeueing()},"ElementTextureCache"),ir=wa.prototype;ir.reasons=Kt;ir.getTextureQueue=function(r){var e=this;return e.eleImgCaches=e.eleImgCaches||{},e.eleImgCaches[r]=e.eleImgCaches[r]||[]};ir.getRetiredTextureQueue=function(r){var e=this,t=e.eleImgCaches.retired=e.eleImgCaches.retired||{},a=t[r]=t[r]||[];return a};ir.getElementQueue=function(){var r=this,e=r.eleCacheQueue=r.eleCacheQueue||new qa(function(t,a){return a.reqs-t.reqs});return e};ir.getElementKeyToQueue=function(){var r=this,e=r.eleKeyToCacheQueue=r.eleKeyToCacheQueue||{};return e};ir.getElement=function(r,e,t,a,n){var i=this,s=this.renderer,o=s.cy.zoom(),l=this.lookup;if(!e||e.w===0||e.h===0||isNaN(e.w)||isNaN(e.h)||!r.visible()||r.removed()||!i.allowEdgeTxrCaching&&r.isEdge()||!i.allowParentTxrCaching&&r.isParent())return null;if(a==null&&(a=Math.ceil(to(o*t))),a=kf||a>Ws)return null;var u=Math.pow(2,a),f=e.h*u,c=e.w*u,d=s.eleTextBiggerThanMin(r,u);if(!this.isVisible(r,d))return null;var g=l.get(r,a);if(g&&g.invalidated&&(g.invalidated=!1,g.texture.invalidatedWidth-=g.width),g)return g;var h;if(f<=zl?h=zl:f<=sn?h=sn:h=Math.ceil(f/sn)*sn,f>ly||c>uy)return null;var m=i.getTextureQueue(h),p=m[m.length-2],y=v(function(){return i.recycleTexture(h,c)||i.addTexture(h,c)},"addNewTxr");p||(p=m[m.length-1]),p||(p=y()),p.width-p.usedWidtha;P--)D=i.getElement(r,e,t,P,Kt.downscale);B()}else return i.queueElement(r,T.level-1),T;else{var A;if(!w&&!x&&!C)for(var R=a-1;R>=yn;R--){var M=l.get(r,R);if(M){A=M;break}}if(b(A))return i.queueElement(r,a),A;p.context.translate(p.usedWidth,0),p.context.scale(u,u),this.drawElement(p.context,r,e,d,!1),p.context.scale(1/u,1/u),p.context.translate(-p.usedWidth,0)}return g={x:p.usedWidth,texture:p,level:a,scale:u,width:c,height:f,scaledLabelShown:d},p.usedWidth+=Math.ceil(c+sy),p.eleCaches.push(g),l.set(r,a,g),i.checkTextureFullness(p),g};ir.invalidateElements=function(r){for(var e=0;e=vy*r.width&&this.retireTexture(r)};ir.checkTextureFullness=function(r){var e=this,t=e.getTextureQueue(r.height);r.usedWidth/r.width>fy&&r.fullnessChecks>=cy?vt(t,r):r.fullnessChecks++};ir.retireTexture=function(r){var e=this,t=r.height,a=e.getTextureQueue(t),n=this.lookup;vt(a,r),r.retired=!0;for(var i=r.eleCaches,s=0;s=e)return s.retired=!1,s.usedWidth=0,s.invalidatedWidth=0,s.fullnessChecks=0,ro(s.eleCaches),s.context.setTransform(1,0,0,1,0,0),s.context.clearRect(0,0,s.width,s.height),vt(n,s),a.push(s),s}};ir.queueElement=function(r,e){var t=this,a=t.getElementQueue(),n=t.getElementKeyToQueue(),i=this.getKey(r),s=n[i];if(s)s.level=Math.max(s.level,e),s.eles.merge(r),s.reqs++,a.updateItem(s);else{var o={eles:r.spawn().merge(r),level:e,reqs:1,key:i};a.push(o),n[i]=o}};ir.dequeue=function(r){for(var e=this,t=e.getElementQueue(),a=e.getElementKeyToQueue(),n=[],i=e.lookup,s=0;s0;s++){var o=t.pop(),l=o.key,u=o.eles[0],f=i.hasCache(u,o.level);if(a[l]=null,f)continue;n.push(o);var c=e.getBoundingBox(u);e.getElement(u,c,r,o.level,Kt.dequeue)}return n};ir.removeFromQueue=function(r){var e=this,t=e.getElementQueue(),a=e.getElementKeyToQueue(),n=this.getKey(r),i=a[n];i!=null&&(i.eles.length===1?(i.reqs=js,t.updateItem(i),t.pop(),a[n]=null):i.eles.unmerge(r))};ir.onDequeue=function(r){this.onDequeues.push(r)};ir.offDequeue=function(r){vt(this.onDequeues,r)};ir.setupDequeueing=Sf.setupDequeueing({deqRedrawThreshold:yy,deqCost:dy,deqAvgCost:hy,deqNoDrawCost:gy,deqFastCost:py,deq:v(function(e,t,a){return e.dequeue(t,a)},"deq"),onDeqd:v(function(e,t){for(var a=0;a=xy||t>An)return null}a.validateLayersElesOrdering(t,r);var l=a.layersByLevel,u=Math.pow(2,t),f=l[t]=l[t]||[],c,d=a.levelIsComplete(t,r),g,h=v(function(){var B=v(function(I){if(a.validateLayersElesOrdering(I,r),a.levelIsComplete(I,r))return g=l[I],!0},"canUseAsTmpLvl"),P=v(function(I){if(!g)for(var O=t+I;Ea<=O&&O<=An&&!B(O);O+=I);},"checkLvls");P(1),P(-1);for(var A=f.length-1;A>=0;A--){var R=f[A];R.invalid&&vt(f,R)}},"checkTempLevels");if(!d)h();else return f;var m=v(function(){if(!c){c=xr();for(var B=0;BVl||R>Vl)return null;var M=A*R;if(M>Py)return null;var I=a.makeLayer(c,t);if(P!=null){var O=f.indexOf(P)+1;f.splice(O,0,I)}else(B.insert===void 0||B.insert)&&f.unshift(I);return I},"makeLayer");if(a.skipping&&!o)return null;for(var y=null,b=r.length/wy,w=!o,x=0;x=b||!wv(y.bb,C.boundingBox()))&&(y=p({insert:!0,after:y}),!y))return null;g||w?a.queueLayer(y,C):a.drawEleInLayer(y,C,t,e),y.eles.push(C),E[t]=y}return g||(w?null:f)};hr.getEleLevelForLayerLevel=function(r,e){return r};hr.drawEleInLayer=function(r,e,t,a){var n=this,i=this.renderer,s=r.context,o=e.boundingBox();o.w===0||o.h===0||!e.visible()||(t=n.getEleLevelForLayerLevel(t,a),i.setImgSmoothing(s,!1),i.drawCachedElement(s,e,null,null,t,Ay),i.setImgSmoothing(s,!0))};hr.levelIsComplete=function(r,e){var t=this,a=t.layersByLevel[r];if(!a||a.length===0)return!1;for(var n=0,i=0;i0||s.invalid)return!1;n+=s.eles.length}return n===e.length};hr.validateLayersElesOrdering=function(r,e){var t=this.layersByLevel[r];if(t)for(var a=0;a0){e=!0;break}}return e};hr.invalidateElements=function(r){var e=this;r.length!==0&&(e.lastInvalidationTime=Zr(),!(r.length===0||!e.haveLayers())&&e.updateElementsInLayers(r,v(function(a,n,i){e.invalidateLayer(a)},"invalAssocLayers")))};hr.invalidateLayer=function(r){if(this.lastInvalidationTime=Zr(),!r.invalid){var e=r.level,t=r.eles,a=this.layersByLevel[e];vt(a,r),r.elesQueue=[],r.invalid=!0,r.replacement&&(r.replacement.invalid=!0);for(var n=0;n3&&arguments[3]!==void 0?arguments[3]:!0,n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,i=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,o=e._private.rscratch;if(!(i&&!e.visible())&&!(o.badLine||o.allpts==null||isNaN(o.allpts[0]))){var l;t&&(l=t,r.translate(-l.x1,-l.y1));var u=i?e.pstyle("opacity").value:1,f=i?e.pstyle("line-opacity").value:1,c=e.pstyle("curve-style").value,d=e.pstyle("line-style").value,g=e.pstyle("width").pfValue,h=e.pstyle("line-cap").value,m=e.pstyle("line-outline-width").value,p=e.pstyle("line-outline-color").value,y=u*f,b=u*f,w=v(function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:y;c==="straight-triangle"?(s.eleStrokeStyle(r,e,I),s.drawEdgeTrianglePath(e,r,o.allpts)):(r.lineWidth=g,r.lineCap=h,s.eleStrokeStyle(r,e,I),s.drawEdgePath(e,r,o.allpts,d),r.lineCap="butt")},"drawLine"),x=v(function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:y;if(r.lineWidth=g+m,r.lineCap=h,m>0)s.colorStrokeStyle(r,p[0],p[1],p[2],I);else{r.lineCap="butt";return}c==="straight-triangle"?s.drawEdgeTrianglePath(e,r,o.allpts):(s.drawEdgePath(e,r,o.allpts,d),r.lineCap="butt")},"drawLineOutline"),C=v(function(){n&&s.drawEdgeOverlay(r,e)},"drawOverlay"),T=v(function(){n&&s.drawEdgeUnderlay(r,e)},"drawUnderlay"),E=v(function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:b;s.drawArrowheads(r,e,I)},"drawArrows"),S=v(function(){s.drawElementText(r,e,null,a)},"drawText");r.lineJoin="round";var D=e.pstyle("ghost").value==="yes";if(D){var B=e.pstyle("ghost-offset-x").pfValue,P=e.pstyle("ghost-offset-y").pfValue,A=e.pstyle("ghost-opacity").value,R=y*A;r.translate(B,P),w(R),E(R),r.translate(-B,-P)}else x();T(),w(),E(),C(),S(),t&&r.translate(l.x1,l.y1)}};var Pf=v(function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,a){if(a.visible()){var n=a.pstyle("".concat(e,"-opacity")).value;if(n!==0){var i=this,s=i.usePaths(),o=a._private.rscratch,l=a.pstyle("".concat(e,"-padding")).pfValue,u=2*l,f=a.pstyle("".concat(e,"-color")).value;t.lineWidth=u,o.edgeType==="self"&&!s?t.lineCap="butt":t.lineCap="round",i.colorStrokeStyle(t,f[0],f[1],f[2],n),i.drawEdgePath(a,t,o.allpts,"solid")}}}},"drawEdgeOverlayUnderlay");jr.drawEdgeOverlay=Pf("overlay");jr.drawEdgeUnderlay=Pf("underlay");jr.drawEdgePath=function(r,e,t,a){var n=r._private.rscratch,i=e,s,o=!1,l=this.usePaths(),u=r.pstyle("line-dash-pattern").pfValue,f=r.pstyle("line-dash-offset").pfValue;if(l){var c=t.join("$"),d=n.pathCacheKey&&n.pathCacheKey===c;d?(s=e=n.pathCache,o=!0):(s=e=new Path2D,n.pathCacheKey=c,n.pathCache=s)}if(i.setLineDash)switch(a){case"dotted":i.setLineDash([1,1]);break;case"dashed":i.setLineDash(u),i.lineDashOffset=f;break;case"solid":i.setLineDash([]);break}if(!o&&!n.badLine)switch(e.beginPath&&e.beginPath(),e.moveTo(t[0],t[1]),n.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var g=2;g+35&&arguments[5]!==void 0?arguments[5]:!0,s=this;if(a==null){if(i&&!s.eleTextBiggerThanMin(e))return}else if(a===!1)return;if(e.isNode()){var o=e.pstyle("label");if(!o||!o.value)return;var l=s.getLabelJustification(e);r.textAlign=l,r.textBaseline="bottom"}else{var u=e.element()._private.rscratch.badLine,f=e.pstyle("label"),c=e.pstyle("source-label"),d=e.pstyle("target-label");if(u||(!f||!f.value)&&(!c||!c.value)&&(!d||!d.value))return;r.textAlign="center",r.textBaseline="bottom"}var g=!t,h;t&&(h=t,r.translate(-h.x1,-h.y1)),n==null?(s.drawText(r,e,null,g,i),e.isEdge()&&(s.drawText(r,e,"source",g,i),s.drawText(r,e,"target",g,i))):s.drawText(r,e,n,g,i),t&&r.translate(h.x1,h.y1)};Ot.getFontCache=function(r){var e;this.fontCaches=this.fontCaches||[];for(var t=0;t2&&arguments[2]!==void 0?arguments[2]:!0,a=e.pstyle("font-style").strValue,n=e.pstyle("font-size").pfValue+"px",i=e.pstyle("font-family").strValue,s=e.pstyle("font-weight").strValue,o=t?e.effectiveOpacity()*e.pstyle("text-opacity").value:1,l=e.pstyle("text-outline-opacity").value*o,u=e.pstyle("color").value,f=e.pstyle("text-outline-color").value;r.font=a+" "+s+" "+n+" "+i,r.lineJoin="round",this.colorFillStyle(r,u[0],u[1],u[2],o),this.colorStrokeStyle(r,f[0],f[1],f[2],l)};function _y(r,e,t,a,n){var i=Math.min(a,n),s=i/2,o=e+a/2,l=t+n/2;r.beginPath(),r.arc(o,l,s,0,Math.PI*2),r.closePath()}v(_y,"circle");function Hl(r,e,t,a,n){var i=arguments.length>5&&arguments[5]!==void 0?arguments[5]:5,s=Math.min(i,a/2,n/2);r.beginPath(),r.moveTo(e+s,t),r.lineTo(e+a-s,t),r.quadraticCurveTo(e+a,t,e+a,t+s),r.lineTo(e+a,t+n-s),r.quadraticCurveTo(e+a,t+n,e+a-s,t+n),r.lineTo(e+s,t+n),r.quadraticCurveTo(e,t+n,e,t+n-s),r.lineTo(e,t+s),r.quadraticCurveTo(e,t,e+s,t),r.closePath()}v(Hl,"roundRect");Ot.getTextAngle=function(r,e){var t,a=r._private,n=a.rscratch,i=e?e+"-":"",s=r.pstyle(i+"text-rotation");if(s.strValue==="autorotate"){var o=Sr(n,"labelAngle",e);t=r.isEdge()?o:0}else s.strValue==="none"?t=0:t=s.pfValue;return t};Ot.drawText=function(r,e,t){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,i=e._private,s=i.rscratch,o=n?e.effectiveOpacity():1;if(!(n&&(o===0||e.pstyle("text-opacity").value===0))){t==="main"&&(t=null);var l=Sr(s,"labelX",t),u=Sr(s,"labelY",t),f,c,d=this.getLabelText(e,t);if(d!=null&&d!==""&&!isNaN(l)&&!isNaN(u)){this.setupTextStyle(r,e,n);var g=t?t+"-":"",h=Sr(s,"labelWidth",t),m=Sr(s,"labelHeight",t),p=e.pstyle(g+"text-margin-x").pfValue,y=e.pstyle(g+"text-margin-y").pfValue,b=e.isEdge(),w=e.pstyle("text-halign").value,x=e.pstyle("text-valign").value;b&&(w="center",x="center"),l+=p,u+=y;var C;switch(a?C=this.getTextAngle(e,t):C=0,C!==0&&(f=l,c=u,r.translate(f,c),r.rotate(C),l=0,u=0),x){case"top":break;case"center":u+=m/2;break;case"bottom":u+=m;break}var T=e.pstyle("text-background-opacity").value,E=e.pstyle("text-border-opacity").value,S=e.pstyle("text-border-width").pfValue,D=e.pstyle("text-background-padding").pfValue,B=e.pstyle("text-background-shape").strValue,P=B==="round-rectangle"||B==="roundrectangle",A=B==="circle",R=2;if(T>0||S>0&&E>0){var M=r.fillStyle,I=r.strokeStyle,O=r.lineWidth,L=e.pstyle("text-background-color").value,N=e.pstyle("text-border-color").value,q=e.pstyle("text-border-style").value,H=T>0,z=S>0&&E>0,V=l-D;switch(w){case"left":V-=h;break;case"center":V-=h/2;break}var K=u-m-D,J=h+2*D,X=m+2*D;if(H&&(r.fillStyle="rgba(".concat(L[0],",").concat(L[1],",").concat(L[2],",").concat(T*o,")")),z&&(r.strokeStyle="rgba(".concat(N[0],",").concat(N[1],",").concat(N[2],",").concat(E*o,")"),r.lineWidth=S,r.setLineDash))switch(q){case"dotted":r.setLineDash([1,1]);break;case"dashed":r.setLineDash([4,2]);break;case"double":r.lineWidth=S/4,r.setLineDash([]);break;case"solid":default:r.setLineDash([]);break}if(P?(r.beginPath(),Hl(r,V,K,J,X,R)):A?(r.beginPath(),_y(r,V,K,J,X)):(r.beginPath(),r.rect(V,K,J,X)),H&&r.fill(),z&&r.stroke(),z&&q==="double"){var ee=S/2;r.beginPath(),P?Hl(r,V+ee,K+ee,J-2*ee,X-2*ee,R):r.rect(V+ee,K+ee,J-2*ee,X-2*ee),r.stroke()}r.fillStyle=M,r.strokeStyle=I,r.lineWidth=O,r.setLineDash&&r.setLineDash([])}var te=2*e.pstyle("text-outline-width").pfValue;if(te>0&&(r.lineWidth=te),e.pstyle("text-wrap").value==="wrap"){var ie=Sr(s,"labelWrapCachedLines",t),j=Sr(s,"labelLineHeight",t),F=h/2,_=this.getLabelJustification(e);switch(_==="auto"||(w==="left"?_==="left"?l+=-h:_==="center"&&(l+=-F):w==="center"?_==="left"?l+=-F:_==="right"&&(l+=F):w==="right"&&(_==="center"?l+=F:_==="right"&&(l+=h))),x){case"top":u-=(ie.length-1)*j;break;case"center":case"bottom":u-=(ie.length-1)*j;break}for(var W=0;W0&&r.strokeText(ie[W],l,u),r.fillText(ie[W],l,u),u+=j}else te>0&&r.strokeText(d,l,u),r.fillText(d,l,u);C!==0&&(r.rotate(-C),r.translate(-f,-c))}}};var mt={};mt.drawNode=function(r,e,t){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,i=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,o,l,u=e._private,f=u.rscratch,c=e.position();if(!(!ne(c.x)||!ne(c.y))&&!(i&&!e.visible())){var d=i?e.effectiveOpacity():1,g=s.usePaths(),h,m=!1,p=e.padding();o=e.width()+2*p,l=e.height()+2*p;var y;t&&(y=t,r.translate(-y.x1,-y.y1));for(var b=e.pstyle("background-image"),w=b.value,x=new Array(w.length),C=new Array(w.length),T=0,E=0;E0&&arguments[0]!==void 0?arguments[0]:R;s.eleFillStyle(r,e,le)},"setupShapeColor"),j=v(function(){var le=arguments.length>0&&arguments[0]!==void 0?arguments[0]:z;s.colorStrokeStyle(r,M[0],M[1],M[2],le)},"setupBorderColor"),F=v(function(){var le=arguments.length>0&&arguments[0]!==void 0?arguments[0]:X;s.colorStrokeStyle(r,K[0],K[1],K[2],le)},"setupOutlineColor"),_=v(function(le,Y,k,G){var $=s.nodePathCache=s.nodePathCache||[],U=dv(k==="polygon"?k+","+G.join(","):k,""+Y,""+le,""+te),Q=$[U],ue,re=!1;return Q!=null?(ue=Q,re=!0,f.pathCache=ue):(ue=new Path2D,$[U]=f.pathCache=ue),{path:ue,cacheHit:re}},"getPath"),W=e.pstyle("shape").strValue,Z=e.pstyle("shape-polygon-points").pfValue;if(g){r.translate(c.x,c.y);var ae=_(o,l,W,Z);h=ae.path,m=ae.cacheHit}var de=v(function(){if(!m){var le=c;g&&(le={x:0,y:0}),s.nodeShapes[s.getNodeShape(e)].draw(h||r,le.x,le.y,o,l,te,f)}g?r.fill(h):r.fill()},"drawShape"),Re=v(function(){for(var le=arguments.length>0&&arguments[0]!==void 0?arguments[0]:d,Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,k=u.backgrounding,G=0,$=0;$0&&arguments[0]!==void 0?arguments[0]:!1,Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:d;s.hasPie(e)&&(s.drawPie(r,e,Y),le&&(g||s.nodeShapes[s.getNodeShape(e)].draw(r,c.x,c.y,o,l,te,f)))},"drawPie"),xe=v(function(){var le=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:d;s.hasStripe(e)&&(r.save(),g?r.clip(f.pathCache):(s.nodeShapes[s.getNodeShape(e)].draw(r,c.x,c.y,o,l,te,f),r.clip()),s.drawStripe(r,e,Y),r.restore(),le&&(g||s.nodeShapes[s.getNodeShape(e)].draw(r,c.x,c.y,o,l,te,f)))},"drawStripe"),me=v(function(){var le=arguments.length>0&&arguments[0]!==void 0?arguments[0]:d,Y=(P>0?P:-P)*le,k=P>0?0:255;P!==0&&(s.colorFillStyle(r,k,k,k,Y),g?r.fill(h):r.fill())},"darken"),se=v(function(){if(A>0){if(r.lineWidth=A,r.lineCap=L,r.lineJoin=O,r.setLineDash)switch(I){case"dotted":r.setLineDash([1,1]);break;case"dashed":r.setLineDash(q),r.lineDashOffset=H;break;case"solid":case"double":r.setLineDash([]);break}if(N!=="center"){if(r.save(),r.lineWidth*=2,N==="inside")g?r.clip(h):r.clip();else{var le=new Path2D;le.rect(-o/2-A,-l/2-A,o+2*A,l+2*A),le.addPath(h),r.clip(le,"evenodd")}g?r.stroke(h):r.stroke(),r.restore()}else g?r.stroke(h):r.stroke();if(I==="double"){r.lineWidth=A/3;var Y=r.globalCompositeOperation;r.globalCompositeOperation="destination-out",g?r.stroke(h):r.stroke(),r.globalCompositeOperation=Y}r.setLineDash&&r.setLineDash([])}},"drawBorder"),he=v(function(){if(V>0){if(r.lineWidth=V,r.lineCap="butt",r.setLineDash)switch(J){case"dotted":r.setLineDash([1,1]);break;case"dashed":r.setLineDash([4,2]);break;case"solid":case"double":r.setLineDash([]);break}var le=c;g&&(le={x:0,y:0});var Y=s.getNodeShape(e),k=A;N==="inside"&&(k=0),N==="outside"&&(k*=2);var G=(o+k+(V+ee))/o,$=(l+k+(V+ee))/l,U=o*G,Q=l*$,ue=s.nodeShapes[Y].points,re;if(g){var fe=_(U,Q,Y,ue);re=fe.path}if(Y==="ellipse")s.drawEllipsePath(re||r,le.x,le.y,U,Q);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(Y)){var ve=0,be=0,Be=0;Y==="round-diamond"?ve=(k+ee+V)*1.4:Y==="round-heptagon"?(ve=(k+ee+V)*1.075,Be=-(k/2+ee+V)/35):Y==="round-hexagon"?ve=(k+ee+V)*1.12:Y==="round-pentagon"?(ve=(k+ee+V)*1.13,Be=-(k/2+ee+V)/15):Y==="round-tag"?(ve=(k+ee+V)*1.12,be=(k/2+V+ee)*.07):Y==="round-triangle"&&(ve=(k+ee+V)*(Math.PI/2),Be=-(k+ee/2+V)/Math.PI),ve!==0&&(G=(o+ve)/o,U=o*G,["round-hexagon","round-tag"].includes(Y)||($=(l+ve)/l,Q=l*$)),te=te==="auto"?Cv(U,Q):te;for(var Se=U/2,ce=Q/2,Ae=te+(k+V+ee)/2,Pe=new Array(ue.length/2),er=new Array(ue.length/2),Xe=0;Xe0){if(n=n||a.position(),i==null||s==null){var g=a.padding();i=a.width()+2*g,s=a.height()+2*g}o.colorFillStyle(t,f[0],f[1],f[2],u),o.nodeShapes[c].draw(t,n.x,n.y,i+l*2,s+l*2,d),t.fill()}}}},"drawNodeOverlayUnderlay");mt.drawNodeOverlay=Af("overlay");mt.drawNodeUnderlay=Af("underlay");mt.hasPie=function(r){return r=r[0],r._private.hasPie};mt.hasStripe=function(r){return r=r[0],r._private.hasStripe};mt.drawPie=function(r,e,t,a){e=e[0],a=a||e.position();var n=e.cy().style(),i=e.pstyle("pie-size"),s=e.pstyle("pie-hole"),o=e.pstyle("pie-start-angle").pfValue,l=a.x,u=a.y,f=e.width(),c=e.height(),d=Math.min(f,c)/2,g,h=0,m=this.usePaths();if(m&&(l=0,u=0),i.units==="%"?d=d*i.pfValue:i.pfValue!==void 0&&(d=i.pfValue/2),s.units==="%"?g=d*s.pfValue:s.pfValue!==void 0&&(g=s.pfValue/2),!(g>=d))for(var p=1;p<=n.pieBackgroundN;p++){var y=e.pstyle("pie-"+p+"-background-size").value,b=e.pstyle("pie-"+p+"-background-color").value,w=e.pstyle("pie-"+p+"-background-opacity").value*t,x=y/100;x+h>1&&(x=1-h);var C=1.5*Math.PI+2*Math.PI*h;C+=o;var T=2*Math.PI*x,E=C+T;y===0||h>=1||h+x>1||(g===0?(r.beginPath(),r.moveTo(l,u),r.arc(l,u,d,C,E),r.closePath()):(r.beginPath(),r.arc(l,u,d,C,E),r.arc(l,u,g,E,C,!0),r.closePath()),this.colorFillStyle(r,b[0],b[1],b[2],w),r.fill(),h+=x)}};mt.drawStripe=function(r,e,t,a){e=e[0],a=a||e.position();var n=e.cy().style(),i=a.x,s=a.y,o=e.width(),l=e.height(),u=0,f=this.usePaths();r.save();var c=e.pstyle("stripe-direction").value,d=e.pstyle("stripe-size");switch(c){case"vertical":break;case"righward":r.rotate(-Math.PI/2);break}var g=o,h=l;d.units==="%"?(g=g*d.pfValue,h=h*d.pfValue):d.pfValue!==void 0&&(g=d.pfValue,h=d.pfValue),f&&(i=0,s=0),s-=g/2,i-=h/2;for(var m=1;m<=n.stripeBackgroundN;m++){var p=e.pstyle("stripe-"+m+"-background-size").value,y=e.pstyle("stripe-"+m+"-background-color").value,b=e.pstyle("stripe-"+m+"-background-opacity").value*t,w=p/100;w+u>1&&(w=1-u),!(p===0||u>=1||u+w>1)&&(r.beginPath(),r.rect(i,s+h*u,g,h*w),r.closePath(),this.colorFillStyle(r,y[0],y[1],y[2],b),r.fill(),u+=w)}r.restore()};var Er={},Gy=100;Er.getPixelRatio=function(){var r=this.data.contexts[0];if(this.forcedPixelRatio!=null)return this.forcedPixelRatio;var e=this.cy.window(),t=r.backingStorePixelRatio||r.webkitBackingStorePixelRatio||r.mozBackingStorePixelRatio||r.msBackingStorePixelRatio||r.oBackingStorePixelRatio||r.backingStorePixelRatio||1;return(e.devicePixelRatio||1)/t};Er.paintCache=function(r){for(var e=this.paintCaches=this.paintCaches||[],t=!0,a,n=0;ne.minMbLowQualFrames&&(e.motionBlurPxRatio=e.mbPxRBlurry)),e.clearingMotionBlur&&(e.motionBlurPxRatio=1),e.textureDrawLastFrame&&!c&&(f[e.NODE]=!0,f[e.SELECT_BOX]=!0);var b=t.style(),w=t.zoom(),x=s!==void 0?s:w,C=t.pan(),T={x:C.x,y:C.y},E={zoom:w,pan:{x:C.x,y:C.y}},S=e.prevViewport,D=S===void 0||E.zoom!==S.zoom||E.pan.x!==S.pan.x||E.pan.y!==S.pan.y;!D&&!(m&&!h)&&(e.motionBlurPxRatio=1),o&&(T=o),x*=l,T.x*=l,T.y*=l;var B=e.getCachedZSortedEles();function P(j,F,_,W,Z){var ae=j.globalCompositeOperation;j.globalCompositeOperation="destination-out",e.colorFillStyle(j,255,255,255,e.motionBlurTransparency),j.fillRect(F,_,W,Z),j.globalCompositeOperation=ae}v(P,"mbclear");function A(j,F){var _,W,Z,ae;!e.clearingMotionBlur&&(j===u.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]||j===u.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG])?(_={x:C.x*g,y:C.y*g},W=w*g,Z=e.canvasWidth*g,ae=e.canvasHeight*g):(_=T,W=x,Z=e.canvasWidth,ae=e.canvasHeight),j.setTransform(1,0,0,1,0,0),F==="motionBlur"?P(j,0,0,Z,ae):!a&&(F===void 0||F)&&j.clearRect(0,0,Z,ae),n||(j.translate(_.x,_.y),j.scale(W,W)),o&&j.translate(o.x,o.y),s&&j.scale(s,s)}if(v(A,"setContextTransform"),c||(e.textureDrawLastFrame=!1),c){if(e.textureDrawLastFrame=!0,!e.textureCache){e.textureCache={},e.textureCache.bb=t.mutableElements().boundingBox(),e.textureCache.texture=e.data.bufferCanvases[e.TEXTURE_BUFFER];var R=e.data.bufferContexts[e.TEXTURE_BUFFER];R.setTransform(1,0,0,1,0,0),R.clearRect(0,0,e.canvasWidth*e.textureMult,e.canvasHeight*e.textureMult),e.render({forcedContext:R,drawOnlyNodeLayer:!0,forcedPxRatio:l*e.textureMult});var E=e.textureCache.viewport={zoom:t.zoom(),pan:t.pan(),width:e.canvasWidth,height:e.canvasHeight};E.mpan={x:(0-E.pan.x)/E.zoom,y:(0-E.pan.y)/E.zoom}}f[e.DRAG]=!1,f[e.NODE]=!1;var M=u.contexts[e.NODE],I=e.textureCache.texture,E=e.textureCache.viewport;M.setTransform(1,0,0,1,0,0),d?P(M,0,0,E.width,E.height):M.clearRect(0,0,E.width,E.height);var O=b.core("outside-texture-bg-color").value,L=b.core("outside-texture-bg-opacity").value;e.colorFillStyle(M,O[0],O[1],O[2],L),M.fillRect(0,0,E.width,E.height);var w=t.zoom();A(M,!1),M.clearRect(E.mpan.x,E.mpan.y,E.width/E.zoom/l,E.height/E.zoom/l),M.drawImage(I,E.mpan.x,E.mpan.y,E.width/E.zoom/l,E.height/E.zoom/l)}else e.textureOnViewport&&!a&&(e.textureCache=null);var N=t.extent(),q=e.pinching||e.hoverData.dragging||e.swipePanning||e.data.wheelZooming||e.hoverData.draggingEles||e.cy.animated(),H=e.hideEdgesOnViewport&&q,z=[];if(z[e.NODE]=!f[e.NODE]&&d&&!e.clearedForMotionBlur[e.NODE]||e.clearingMotionBlur,z[e.NODE]&&(e.clearedForMotionBlur[e.NODE]=!0),z[e.DRAG]=!f[e.DRAG]&&d&&!e.clearedForMotionBlur[e.DRAG]||e.clearingMotionBlur,z[e.DRAG]&&(e.clearedForMotionBlur[e.DRAG]=!0),f[e.NODE]||n||i||z[e.NODE]){var V=d&&!z[e.NODE]&&g!==1,M=a||(V?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]:u.contexts[e.NODE]),K=d&&!V?"motionBlur":void 0;A(M,K),H?e.drawCachedNodes(M,B.nondrag,l,N):e.drawLayeredElements(M,B.nondrag,l,N),e.debug&&e.drawDebugPoints(M,B.nondrag),!n&&!d&&(f[e.NODE]=!1)}if(!i&&(f[e.DRAG]||n||z[e.DRAG])){var V=d&&!z[e.DRAG]&&g!==1,M=a||(V?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG]:u.contexts[e.DRAG]);A(M,d&&!V?"motionBlur":void 0),H?e.drawCachedNodes(M,B.drag,l,N):e.drawCachedElements(M,B.drag,l,N),e.debug&&e.drawDebugPoints(M,B.drag),!n&&!d&&(f[e.DRAG]=!1)}if(this.drawSelectionRectangle(r,A),d&&g!==1){var J=u.contexts[e.NODE],X=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_NODE],ee=u.contexts[e.DRAG],te=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_DRAG],ie=v(function(F,_,W){F.setTransform(1,0,0,1,0,0),W||!y?F.clearRect(0,0,e.canvasWidth,e.canvasHeight):P(F,0,0,e.canvasWidth,e.canvasHeight);var Z=g;F.drawImage(_,0,0,e.canvasWidth*Z,e.canvasHeight*Z,0,0,e.canvasWidth,e.canvasHeight)},"drawMotionBlur");(f[e.NODE]||z[e.NODE])&&(ie(J,X,z[e.NODE]),f[e.NODE]=!1),(f[e.DRAG]||z[e.DRAG])&&(ie(ee,te,z[e.DRAG]),f[e.DRAG]=!1)}e.prevViewport=E,e.clearingMotionBlur&&(e.clearingMotionBlur=!1,e.motionBlurCleared=!0,e.motionBlur=!0),d&&(e.motionBlurTimeout=setTimeout(function(){e.motionBlurTimeout=null,e.clearedForMotionBlur[e.NODE]=!1,e.clearedForMotionBlur[e.DRAG]=!1,e.motionBlur=!1,e.clearingMotionBlur=!c,e.mbFrames=0,f[e.NODE]=!0,f[e.DRAG]=!0,e.redraw()},Gy)),a||t.emit("render")};var ga;Er.drawSelectionRectangle=function(r,e){var t=this,a=t.cy,n=t.data,i=a.style(),s=r.drawOnlyNodeLayer,o=r.drawAllLayers,l=n.canvasNeedsRedraw,u=r.forcedContext;if(t.showFps||!s&&l[t.SELECT_BOX]&&!o){var f=u||n.contexts[t.SELECT_BOX];if(e(f),t.selection[4]==1&&(t.hoverData.selecting||t.touchData.selecting)){var c=t.cy.zoom(),d=i.core("selection-box-border-width").value/c;f.lineWidth=d,f.fillStyle="rgba("+i.core("selection-box-color").value[0]+","+i.core("selection-box-color").value[1]+","+i.core("selection-box-color").value[2]+","+i.core("selection-box-opacity").value+")",f.fillRect(t.selection[0],t.selection[1],t.selection[2]-t.selection[0],t.selection[3]-t.selection[1]),d>0&&(f.strokeStyle="rgba("+i.core("selection-box-border-color").value[0]+","+i.core("selection-box-border-color").value[1]+","+i.core("selection-box-border-color").value[2]+","+i.core("selection-box-opacity").value+")",f.strokeRect(t.selection[0],t.selection[1],t.selection[2]-t.selection[0],t.selection[3]-t.selection[1]))}if(n.bgActivePosistion&&!t.hoverData.selecting){var c=t.cy.zoom(),g=n.bgActivePosistion;f.fillStyle="rgba("+i.core("active-bg-color").value[0]+","+i.core("active-bg-color").value[1]+","+i.core("active-bg-color").value[2]+","+i.core("active-bg-opacity").value+")",f.beginPath(),f.arc(g.x,g.y,i.core("active-bg-size").pfValue/c,0,2*Math.PI),f.fill()}var h=t.lastRedrawTime;if(t.showFps&&h){h=Math.round(h);var m=Math.round(1e3/h),p="1 frame = "+h+" ms = "+m+" fps";if(f.setTransform(1,0,0,1,0,0),f.fillStyle="rgba(255, 0, 0, 0.75)",f.strokeStyle="rgba(255, 0, 0, 0.75)",f.font="30px Arial",!ga){var y=f.measureText(p);ga=y.actualBoundingBoxAscent}f.fillText(p,0,ga);var b=60;f.strokeRect(0,ga+10,250,20),f.fillRect(0,ga+10,250*Math.min(m/b,1),20)}o||(l[t.SELECT_BOX]=!1)}};function Wl(r,e,t){var a=r.createShader(e);if(r.shaderSource(a,t),r.compileShader(a),!r.getShaderParameter(a,r.COMPILE_STATUS))throw new Error(r.getShaderInfoLog(a));return a}v(Wl,"compileShader");function Hy(r,e,t){var a=Wl(r,r.VERTEX_SHADER,e),n=Wl(r,r.FRAGMENT_SHADER,t),i=r.createProgram();if(r.attachShader(i,a),r.attachShader(i,n),r.linkProgram(i),!r.getProgramParameter(i,r.LINK_STATUS))throw new Error("Could not initialize shaders");return i}v(Hy,"createProgram");function Wy(r,e,t){t===void 0&&(t=e);var a=r.makeOffscreenCanvas(e,t),n=a.context=a.getContext("2d");return a.clear=function(){return n.clearRect(0,0,a.width,a.height)},a.clear(),a}v(Wy,"createTextureCanvas");function wo(r){var e=r.pixelRatio,t=r.cy.zoom(),a=r.cy.pan();return{zoom:t*e,pan:{x:a.x*e,y:a.y*e}}}v(wo,"getEffectivePanZoom");function $y(r){var e=r.pixelRatio,t=r.cy.zoom();return t*e}v($y,"getEffectiveZoom");function Uy(r,e,t,a,n){var i=a*t+e.x,s=n*t+e.y;return s=Math.round(r.canvasHeight-s),[i,s]}v(Uy,"modelToRenderedPosition");function Ky(r){return r.pstyle("background-fill").value!=="solid"||r.pstyle("background-image").strValue!=="none"?!1:r.pstyle("border-width").value===0||r.pstyle("border-opacity").value===0?!0:r.pstyle("border-style").value==="solid"}v(Ky,"isSimpleShape");function Xy(r,e){if(r.length!==e.length)return!1;for(var t=0;t>0&255)/255,t[1]=(r>>8&255)/255,t[2]=(r>>16&255)/255,t[3]=(r>>24&255)/255,t}v(Gt,"indexToVec4");function Yy(r){return r[0]+(r[1]<<8)+(r[2]<<16)+(r[3]<<24)}v(Yy,"vec4ToIndex");function Zy(r,e){var t=r.createTexture();return t.buffer=function(a){r.bindTexture(r.TEXTURE_2D,t),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR_MIPMAP_NEAREST),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,a),r.generateMipmap(r.TEXTURE_2D),r.bindTexture(r.TEXTURE_2D,null)},t.deleteTexture=function(){r.deleteTexture(t)},t}v(Zy,"createTexture");function Rf(r,e){switch(e){case"float":return[1,r.FLOAT,4];case"vec2":return[2,r.FLOAT,4];case"vec3":return[3,r.FLOAT,4];case"vec4":return[4,r.FLOAT,4];case"int":return[1,r.INT,4];case"ivec2":return[2,r.INT,4]}}v(Rf,"getTypeInfo");function Mf(r,e,t){switch(e){case r.FLOAT:return new Float32Array(t);case r.INT:return new Int32Array(t)}}v(Mf,"createTypedArray");function Qy(r,e,t,a,n,i){switch(e){case r.FLOAT:return new Float32Array(t.buffer,i*a,n);case r.INT:return new Int32Array(t.buffer,i*a,n)}}v(Qy,"createTypedArrayView");function Jy(r,e,t,a){var n=Rf(r,e),i=je(n,2),s=i[0],o=i[1],l=Mf(r,o,a),u=r.createBuffer();return r.bindBuffer(r.ARRAY_BUFFER,u),r.bufferData(r.ARRAY_BUFFER,l,r.STATIC_DRAW),o===r.FLOAT?r.vertexAttribPointer(t,s,o,!1,0,0):o===r.INT&&r.vertexAttribIPointer(t,s,o,0,0),r.enableVertexAttribArray(t),r.bindBuffer(r.ARRAY_BUFFER,null),u}v(Jy,"createBufferStaticDraw");function Vr(r,e,t,a){var n=Rf(r,t),i=je(n,3),s=i[0],o=i[1],l=i[2],u=Mf(r,o,e*s),f=s*l,c=r.createBuffer();r.bindBuffer(r.ARRAY_BUFFER,c),r.bufferData(r.ARRAY_BUFFER,e*f,r.DYNAMIC_DRAW),r.enableVertexAttribArray(a),o===r.FLOAT?r.vertexAttribPointer(a,s,o,!1,f,0):o===r.INT&&r.vertexAttribIPointer(a,s,o,f,0),r.vertexAttribDivisor(a,1),r.bindBuffer(r.ARRAY_BUFFER,null);for(var d=new Array(e),g=0;gs&&(o=s/a,l=a*o,u=n*o),{scale:o,texW:l,texH:u}},"getScale")},{key:"draw",value:v(function(t,a,n){var i=this;if(this.locked)throw new Error("can't draw, atlas is locked");var s=this.texSize,o=this.texRows,l=this.texHeight,u=this.getScale(a),f=u.scale,c=u.texW,d=u.texH,g=v(function(w,x){if(n&&x){var C=x.context,T=w.x,E=w.row,S=T,D=l*E;C.save(),C.translate(S,D),C.scale(f,f),n(C,a),C.restore()}},"drawAt"),h=[null,null],m=v(function(){g(i.freePointer,i.canvas),h[0]={x:i.freePointer.x,y:i.freePointer.row*l,w:c,h:d},h[1]={x:i.freePointer.x+c,y:i.freePointer.row*l,w:0,h:d},i.freePointer.x+=c,i.freePointer.x==s&&(i.freePointer.x=0,i.freePointer.row++)},"drawNormal"),p=v(function(){var w=i.scratch,x=i.canvas;w.clear(),g({x:0,row:0},w);var C=s-i.freePointer.x,T=c-C,E=l;{var S=i.freePointer.x,D=i.freePointer.row*l,B=C;x.context.drawImage(w,0,0,B,E,S,D,B,E),h[0]={x:S,y:D,w:B,h:d}}{var P=C,A=(i.freePointer.row+1)*l,R=T;x&&x.context.drawImage(w,P,0,R,E,0,A,R,E),h[1]={x:0,y:A,w:R,h:d}}i.freePointer.x=T,i.freePointer.row++},"drawWrapped"),y=v(function(){i.freePointer.x=0,i.freePointer.row++},"moveToStartOfNextRow");if(this.freePointer.x+c<=s)m();else{if(this.freePointer.row>=o-1)return!1;this.freePointer.x===s?(y(),m()):this.enableWrapping?p():(y(),m())}return this.keyToLocation.set(t,h),this.needsBuffer=!0,h},"draw")},{key:"getOffsets",value:v(function(t){return this.keyToLocation.get(t)},"getOffsets")},{key:"isEmpty",value:v(function(){return this.freePointer.x===0&&this.freePointer.row===0},"isEmpty")},{key:"canFit",value:v(function(t){if(this.locked)return!1;var a=this.texSize,n=this.texRows,i=this.getScale(t),s=i.texW;return this.freePointer.x+s>a?this.freePointer.row1&&arguments[1]!==void 0?arguments[1]:{},i=n.forceRedraw,s=i===void 0?!1:i,o=n.filterEle,l=o===void 0?function(){return!0}:o,u=n.filterType,f=u===void 0?function(){return!0}:u,c=!1,d=!1,g=Dr(t),h;try{for(g.s();!(h=g.n()).done;){var m=h.value;if(l(m)){var p=Dr(this.renderTypes.values()),y;try{var b=v(function(){var x=y.value,C=x.type;if(f(C)){var T=a.collections.get(x.collection),E=x.getKey(m),S=Array.isArray(E)?E:[E];if(s)S.forEach(function(A){return T.markKeyForGC(A)}),d=!0;else{var D=x.getID?x.getID(m):m.id(),B=a._key(C,D),P=a.typeAndIdToKey.get(B);P!==void 0&&!Xy(S,P)&&(c=!0,a.typeAndIdToKey.delete(B),P.forEach(function(A){return T.markKeyForGC(A)}))}}},"_loop2");for(p.s();!(y=p.n()).done;)b()}catch(w){p.e(w)}finally{p.f()}}}}catch(w){g.e(w)}finally{g.f()}return d&&(this.gc(),c=!1),c},"invalidate")},{key:"gc",value:v(function(){var t=Dr(this.collections.values()),a;try{for(t.s();!(a=t.n()).done;){var n=a.value;n.gc()}}catch(i){t.e(i)}finally{t.f()}},"gc")},{key:"getOrCreateAtlas",value:v(function(t,a,n,i){var s=this.renderTypes.get(a),o=this.collections.get(s.collection),l=!1,u=o.draw(i,n,function(d){s.drawClipped?(d.save(),d.beginPath(),d.rect(0,0,n.w,n.h),d.clip(),s.drawElement(d,t,n,!0,!0),d.restore()):s.drawElement(d,t,n,!0,!0),l=!0});if(l){var f=s.getID?s.getID(t):t.id(),c=this._key(a,f);this.typeAndIdToKey.has(c)?this.typeAndIdToKey.get(c).push(i):this.typeAndIdToKey.set(c,[i])}return u},"getOrCreateAtlas")},{key:"getAtlasInfo",value:v(function(t,a){var n=this,i=this.renderTypes.get(a),s=i.getKey(t),o=Array.isArray(s)?s:[s];return o.map(function(l){var u=i.getBoundingBox(t,l),f=n.getOrCreateAtlas(t,a,u,l),c=f.getOffsets(l),d=je(c,2),g=d[0],h=d[1];return{atlas:f,tex:g,tex1:g,tex2:h,bb:u}})},"getAtlasInfo")},{key:"getDebugInfo",value:v(function(){var t=[],a=Dr(this.collections),n;try{for(a.s();!(n=a.n()).done;){var i=je(n.value,2),s=i[0],o=i[1],l=o.getCounts(),u=l.keyCount,f=l.atlasCount;t.push({type:s,keyCount:u,atlasCount:f})}}catch(c){a.e(c)}finally{a.f()}return t},"getDebugInfo")}])})(),om=(function(){function r(e){gt(this,r),this.globalOptions=e,this.atlasSize=e.webglTexSize,this.maxAtlasesPerBatch=e.webglTexPerBatch,this.batchAtlases=[]}return v(r,"AtlasBatchManager"),pt(r,[{key:"getMaxAtlasesPerBatch",value:v(function(){return this.maxAtlasesPerBatch},"getMaxAtlasesPerBatch")},{key:"getAtlasSize",value:v(function(){return this.atlasSize},"getAtlasSize")},{key:"getIndexArray",value:v(function(){return Array.from({length:this.maxAtlasesPerBatch},function(t,a){return a})},"getIndexArray")},{key:"startBatch",value:v(function(){this.batchAtlases=[]},"startBatch")},{key:"getAtlasCount",value:v(function(){return this.batchAtlases.length},"getAtlasCount")},{key:"getAtlases",value:v(function(){return this.batchAtlases},"getAtlases")},{key:"canAddToCurrentBatch",value:v(function(t){return this.batchAtlases.length===this.maxAtlasesPerBatch?this.batchAtlases.includes(t):!0},"canAddToCurrentBatch")},{key:"getAtlasIndexForBatch",value:v(function(t){var a=this.batchAtlases.indexOf(t);if(a<0){if(this.batchAtlases.length===this.maxAtlasesPerBatch)throw new Error("cannot add more atlases to batch");this.batchAtlases.push(t),a=this.batchAtlases.length-1}return a},"getAtlasIndexForBatch")}])})(),um=` + float circleSD(vec2 p, float r) { + return distance(vec2(0), p) - r; // signed distance + } +`,lm=` + float rectangleSD(vec2 p, vec2 b) { + vec2 d = abs(p)-b; + return distance(vec2(0),max(d,0.0)) + min(max(d.x,d.y),0.0); + } +`,vm=` + float roundRectangleSD(vec2 p, vec2 b, vec4 cr) { + cr.xy = (p.x > 0.0) ? cr.xy : cr.zw; + cr.x = (p.y > 0.0) ? cr.x : cr.y; + vec2 q = abs(p) - b + cr.x; + return min(max(q.x, q.y), 0.0) + distance(vec2(0), max(q, 0.0)) - cr.x; + } +`,fm=` + float ellipseSD(vec2 p, vec2 ab) { + p = abs( p ); // symmetry + + // find root with Newton solver + vec2 q = ab*(p-ab); + float w = (q.x1.0) ? d : -d; + } +`,Ca={SCREEN:{name:"screen",screen:!0},PICKING:{name:"picking",picking:!0}},Rn={IGNORE:1,USE_BB:2},Ts=0,Xl=1,Yl=2,Ss=3,Ht=4,on=5,pa=6,ya=7,cm=(function(){function r(e,t,a){gt(this,r),this.r=e,this.gl=t,this.maxInstances=a.webglBatchSize,this.atlasSize=a.webglTexSize,this.bgColor=a.bgColor,this.debug=a.webglDebug,this.batchDebugInfo=[],a.enableWrapping=!0,a.createTextureCanvas=Wy,this.atlasManager=new sm(e,a),this.batchManager=new om(a),this.simpleShapeOptions=new Map,this.program=this._createShaderProgram(Ca.SCREEN),this.pickingProgram=this._createShaderProgram(Ca.PICKING),this.vao=this._createVAO()}return v(r,"ElementDrawingWebGL"),pt(r,[{key:"addAtlasCollection",value:v(function(t,a){this.atlasManager.addAtlasCollection(t,a)},"addAtlasCollection")},{key:"addTextureAtlasRenderType",value:v(function(t,a){this.atlasManager.addRenderType(t,a)},"addTextureAtlasRenderType")},{key:"addSimpleShapeRenderType",value:v(function(t,a){this.simpleShapeOptions.set(t,a)},"addSimpleShapeRenderType")},{key:"invalidate",value:v(function(t){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=a.type,i=this.atlasManager;return n?i.invalidate(t,{filterType:v(function(o){return o===n},"filterType"),forceRedraw:!0}):i.invalidate(t)},"invalidate")},{key:"gc",value:v(function(){this.atlasManager.gc()},"gc")},{key:"_createShaderProgram",value:v(function(t){var a=this.gl,n=`#version 300 es + precision highp float; + + uniform mat3 uPanZoomMatrix; + uniform int uAtlasSize; + + // instanced + in vec2 aPosition; // a vertex from the unit square + + in mat3 aTransform; // used to transform verticies, eg into a bounding box + in int aVertType; // the type of thing we are rendering + + // the z-index that is output when using picking mode + in vec4 aIndex; + + // For textures + in int aAtlasId; // which shader unit/atlas to use + in vec4 aTex; // x/y/w/h of texture in atlas + + // for edges + in vec4 aPointAPointB; + in vec4 aPointCPointD; + in vec2 aLineWidth; // also used for node border width + + // simple shapes + in vec4 aCornerRadius; // for round-rectangle [top-right, bottom-right, top-left, bottom-left] + in vec4 aColor; // also used for edges + in vec4 aBorderColor; // aLineWidth is used for border width + + // output values passed to the fragment shader + out vec2 vTexCoord; + out vec4 vColor; + out vec2 vPosition; + // flat values are not interpolated + flat out int vAtlasId; + flat out int vVertType; + flat out vec2 vTopRight; + flat out vec2 vBotLeft; + flat out vec4 vCornerRadius; + flat out vec4 vBorderColor; + flat out vec2 vBorderWidth; + flat out vec4 vIndex; + + void main(void) { + int vid = gl_VertexID; + vec2 position = aPosition; // TODO make this a vec3, simplifies some code below + + if(aVertType == `.concat(Ts,`) { + float texX = aTex.x; // texture coordinates + float texY = aTex.y; + float texW = aTex.z; + float texH = aTex.w; + + if(vid == 1 || vid == 2 || vid == 4) { + texX += texW; + } + if(vid == 2 || vid == 4 || vid == 5) { + texY += texH; + } + + float d = float(uAtlasSize); + vTexCoord = vec2(texX / d, texY / d); // tex coords must be between 0 and 1 + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + } + else if(aVertType == `).concat(Ht," || aVertType == ").concat(ya,` + || aVertType == `).concat(on," || aVertType == ").concat(pa,`) { // simple shapes + + // the bounding box is needed by the fragment shader + vBotLeft = (aTransform * vec3(0, 0, 1)).xy; // flat + vTopRight = (aTransform * vec3(1, 1, 1)).xy; // flat + vPosition = (aTransform * vec3(position, 1)).xy; // will be interpolated + + // calculations are done in the fragment shader, just pass these along + vColor = aColor; + vCornerRadius = aCornerRadius; + vBorderColor = aBorderColor; + vBorderWidth = aLineWidth; + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + } + else if(aVertType == `).concat(Xl,`) { + vec2 source = aPointAPointB.xy; + vec2 target = aPointAPointB.zw; + + // adjust the geometry so that the line is centered on the edge + position.y = position.y - 0.5; + + // stretch the unit square into a long skinny rectangle + vec2 xBasis = target - source; + vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x)); + vec2 point = source + xBasis * position.x + yBasis * aLineWidth[0] * position.y; + + gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0); + vColor = aColor; + } + else if(aVertType == `).concat(Yl,`) { + vec2 pointA = aPointAPointB.xy; + vec2 pointB = aPointAPointB.zw; + vec2 pointC = aPointCPointD.xy; + vec2 pointD = aPointCPointD.zw; + + // adjust the geometry so that the line is centered on the edge + position.y = position.y - 0.5; + + vec2 p0, p1, p2, pos; + if(position.x == 0.0) { // The left side of the unit square + p0 = pointA; + p1 = pointB; + p2 = pointC; + pos = position; + } else { // The right side of the unit square, use same approach but flip the geometry upside down + p0 = pointD; + p1 = pointC; + p2 = pointB; + pos = vec2(0.0, -position.y); + } + + vec2 p01 = p1 - p0; + vec2 p12 = p2 - p1; + vec2 p21 = p1 - p2; + + // Find the normal vector. + vec2 tangent = normalize(normalize(p12) + normalize(p01)); + vec2 normal = vec2(-tangent.y, tangent.x); + + // Find the vector perpendicular to p0 -> p1. + vec2 p01Norm = normalize(vec2(-p01.y, p01.x)); + + // Determine the bend direction. + float sigma = sign(dot(p01 + p21, normal)); + float width = aLineWidth[0]; + + if(sign(pos.y) == -sigma) { + // This is an intersecting vertex. Adjust the position so that there's no overlap. + vec2 point = 0.5 * width * normal * -sigma / dot(normal, p01Norm); + gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); + } else { + // This is a non-intersecting vertex. Treat it like a mitre join. + vec2 point = 0.5 * width * normal * sigma * dot(normal, p01Norm); + gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); + } + + vColor = aColor; + } + else if(aVertType == `).concat(Ss,` && vid < 3) { + // massage the first triangle into an edge arrow + if(vid == 0) + position = vec2(-0.15, -0.3); + if(vid == 1) + position = vec2( 0.0, 0.0); + if(vid == 2) + position = vec2( 0.15, -0.3); + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + vColor = aColor; + } + else { + gl_Position = vec4(2.0, 0.0, 0.0, 1.0); // discard vertex by putting it outside webgl clip space + } + + vAtlasId = aAtlasId; + vVertType = aVertType; + vIndex = aIndex; + } + `),i=this.batchManager.getIndexArray(),s=`#version 300 es + precision highp float; + + // declare texture unit for each texture atlas in the batch + `.concat(i.map(function(u){return"uniform sampler2D uTexture".concat(u,";")}).join(` + `),` + + uniform vec4 uBGColor; + uniform float uZoom; + + in vec2 vTexCoord; + in vec4 vColor; + in vec2 vPosition; // model coordinates + + flat in int vAtlasId; + flat in vec4 vIndex; + flat in int vVertType; + flat in vec2 vTopRight; + flat in vec2 vBotLeft; + flat in vec4 vCornerRadius; + flat in vec4 vBorderColor; + flat in vec2 vBorderWidth; + + out vec4 outColor; + + `).concat(um,` + `).concat(lm,` + `).concat(vm,` + `).concat(fm,` + + vec4 blend(vec4 top, vec4 bot) { // blend colors with premultiplied alpha + return vec4( + top.rgb + (bot.rgb * (1.0 - top.a)), + top.a + (bot.a * (1.0 - top.a)) + ); + } + + vec4 distInterp(vec4 cA, vec4 cB, float d) { // interpolate color using Signed Distance + // scale to the zoom level so that borders don't look blurry when zoomed in + // note 1.5 is an aribitrary value chosen because it looks good + return mix(cA, cB, 1.0 - smoothstep(0.0, 1.5 / uZoom, abs(d))); + } + + void main(void) { + if(vVertType == `).concat(Ts,`) { + // look up the texel from the texture unit + `).concat(i.map(function(u){return"if(vAtlasId == ".concat(u,") outColor = texture(uTexture").concat(u,", vTexCoord);")}).join(` + else `),` + } + else if(vVertType == `).concat(Ss,`) { + // mimics how canvas renderer uses context.globalCompositeOperation = 'destination-out'; + outColor = blend(vColor, uBGColor); + outColor.a = 1.0; // make opaque, masks out line under arrow + } + else if(vVertType == `).concat(Ht,` && vBorderWidth == vec2(0.0)) { // simple rectangle with no border + outColor = vColor; // unit square is already transformed to the rectangle, nothing else needs to be done + } + else if(vVertType == `).concat(Ht," || vVertType == ").concat(ya,` + || vVertType == `).concat(on," || vVertType == ").concat(pa,`) { // use SDF + + float outerBorder = vBorderWidth[0]; + float innerBorder = vBorderWidth[1]; + float borderPadding = outerBorder * 2.0; + float w = vTopRight.x - vBotLeft.x - borderPadding; + float h = vTopRight.y - vBotLeft.y - borderPadding; + vec2 b = vec2(w/2.0, h/2.0); // half width, half height + vec2 p = vPosition - vec2(vTopRight.x - b[0] - outerBorder, vTopRight.y - b[1] - outerBorder); // translate to center + + float d; // signed distance + if(vVertType == `).concat(Ht,`) { + d = rectangleSD(p, b); + } else if(vVertType == `).concat(ya,` && w == h) { + d = circleSD(p, b.x); // faster than ellipse + } else if(vVertType == `).concat(ya,`) { + d = ellipseSD(p, b); + } else { + d = roundRectangleSD(p, b, vCornerRadius.wzyx); + } + + // use the distance to interpolate a color to smooth the edges of the shape, doesn't need multisampling + // we must smooth colors inwards, because we can't change pixels outside the shape's bounding box + if(d > 0.0) { + if(d > outerBorder) { + discard; + } else { + outColor = distInterp(vBorderColor, vec4(0), d - outerBorder); + } + } else { + if(d > innerBorder) { + vec4 outerColor = outerBorder == 0.0 ? vec4(0) : vBorderColor; + vec4 innerBorderColor = blend(vBorderColor, vColor); + outColor = distInterp(innerBorderColor, outerColor, d); + } + else { + vec4 outerColor; + if(innerBorder == 0.0 && outerBorder == 0.0) { + outerColor = vec4(0); + } else if(innerBorder == 0.0) { + outerColor = vBorderColor; + } else { + outerColor = blend(vBorderColor, vColor); + } + outColor = distInterp(vColor, outerColor, d - innerBorder); + } + } + } + else { + outColor = vColor; + } + + `).concat(t.picking?`if(outColor.a == 0.0) discard; + else outColor = vIndex;`:"",` + } + `),o=Hy(a,n,s);o.aPosition=a.getAttribLocation(o,"aPosition"),o.aIndex=a.getAttribLocation(o,"aIndex"),o.aVertType=a.getAttribLocation(o,"aVertType"),o.aTransform=a.getAttribLocation(o,"aTransform"),o.aAtlasId=a.getAttribLocation(o,"aAtlasId"),o.aTex=a.getAttribLocation(o,"aTex"),o.aPointAPointB=a.getAttribLocation(o,"aPointAPointB"),o.aPointCPointD=a.getAttribLocation(o,"aPointCPointD"),o.aLineWidth=a.getAttribLocation(o,"aLineWidth"),o.aColor=a.getAttribLocation(o,"aColor"),o.aCornerRadius=a.getAttribLocation(o,"aCornerRadius"),o.aBorderColor=a.getAttribLocation(o,"aBorderColor"),o.uPanZoomMatrix=a.getUniformLocation(o,"uPanZoomMatrix"),o.uAtlasSize=a.getUniformLocation(o,"uAtlasSize"),o.uBGColor=a.getUniformLocation(o,"uBGColor"),o.uZoom=a.getUniformLocation(o,"uZoom"),o.uTextures=[];for(var l=0;l1&&arguments[1]!==void 0?arguments[1]:Ca.SCREEN;this.panZoomMatrix=t,this.renderTarget=a,this.batchDebugInfo=[],this.wrappedCount=0,this.simpleCount=0,this.startBatch()},"startFrame")},{key:"startBatch",value:v(function(){this.instanceCount=0,this.batchManager.startBatch()},"startBatch")},{key:"endFrame",value:v(function(){this.endBatch()},"endFrame")},{key:"_isVisible",value:v(function(t,a){return t.visible()?a&&a.isVisible?a.isVisible(t):!0:!1},"_isVisible")},{key:"drawTexture",value:v(function(t,a,n){var i=this.atlasManager,s=this.batchManager,o=i.getRenderTypeOpts(n);if(this._isVisible(t,o)&&!(t.isEdge()&&!this._isValidEdge(t))){if(this.renderTarget.picking&&o.getTexPickingMode){var l=o.getTexPickingMode(t);if(l===Rn.IGNORE)return;if(l==Rn.USE_BB){this.drawPickingRectangle(t,a,n);return}}var u=i.getAtlasInfo(t,n),f=Dr(u),c;try{for(f.s();!(c=f.n()).done;){var d=c.value,g=d.atlas,h=d.tex1,m=d.tex2;s.canAddToCurrentBatch(g)||this.endBatch();for(var p=s.getAtlasIndexForBatch(g),y=0,b=[[h,!0],[m,!1]];y=this.maxInstances&&this.endBatch()}}}}catch(P){f.e(P)}finally{f.f()}}},"drawTexture")},{key:"setTransformMatrix",value:v(function(t,a,n,i){var s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,o=0;if(n.shapeProps&&n.shapeProps.padding&&(o=t.pstyle(n.shapeProps.padding).pfValue),i){var l=i.bb,u=i.tex1,f=i.tex2,c=u.w/(u.w+f.w);s||(c=1-c);var d=this._getAdjustedBB(l,o,s,c);this._applyTransformMatrix(a,d,n,t)}else{var g=n.getBoundingBox(t),h=this._getAdjustedBB(g,o,!0,1);this._applyTransformMatrix(a,h,n,t)}},"setTransformMatrix")},{key:"_applyTransformMatrix",value:v(function(t,a,n,i){var s,o;Ul(t);var l=n.getRotation?n.getRotation(i):0;if(l!==0){var u=n.getRotationPoint(i),f=u.x,c=u.y;mn(t,t,[f,c]),Kl(t,t,l);var d=n.getRotationOffset(i);s=d.x+(a.xOffset||0),o=d.y+(a.yOffset||0)}else s=a.x1,o=a.y1;mn(t,t,[s,o]),$s(t,t,[a.w,a.h])},"_applyTransformMatrix")},{key:"_getAdjustedBB",value:v(function(t,a,n,i){var s=t.x1,o=t.y1,l=t.w,u=t.h,f=t.yOffset;a&&(s-=a,o-=a,l+=2*a,u+=2*a);var c=0,d=l*i;return n&&i<1?l=d:!n&&i<1&&(c=l-d,s+=c,l=d),{x1:s,y1:o,w:l,h:u,xOffset:c,yOffset:f}},"_getAdjustedBB")},{key:"drawPickingRectangle",value:v(function(t,a,n){var i=this.atlasManager.getRenderTypeOpts(n),s=this.instanceCount;this.vertTypeBuffer.getView(s)[0]=Ht;var o=this.indexBuffer.getView(s);Gt(a,o);var l=this.colorBuffer.getView(s);Et([0,0,0],1,l);var u=this.transformBuffer.getMatrixView(s);this.setTransformMatrix(t,u,i),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()},"drawPickingRectangle")},{key:"drawNode",value:v(function(t,a,n){var i=this.simpleShapeOptions.get(n);if(this._isVisible(t,i)){var s=i.shapeProps,o=this._getVertTypeForShape(t,s.shape);if(o===void 0||i.isSimple&&!i.isSimple(t)){this.drawTexture(t,a,n);return}var l=this.instanceCount;if(this.vertTypeBuffer.getView(l)[0]=o,o===on||o===pa){var u=i.getBoundingBox(t),f=this._getCornerRadius(t,s.radius,u),c=this.cornerRadiusBuffer.getView(l);c[0]=f,c[1]=f,c[2]=f,c[3]=f,o===pa&&(c[0]=0,c[2]=0)}var d=this.indexBuffer.getView(l);Gt(a,d);var g=t.pstyle(s.color).value,h=t.pstyle(s.opacity).value,m=this.colorBuffer.getView(l);Et(g,h,m);var p=this.lineWidthBuffer.getView(l);if(p[0]=0,p[1]=0,s.border){var y=t.pstyle("border-width").value;if(y>0){var b=t.pstyle("border-color").value,w=t.pstyle("border-opacity").value,x=this.borderColorBuffer.getView(l);Et(b,w,x);var C=t.pstyle("border-position").value;if(C==="inside")p[0]=0,p[1]=-y;else if(C==="outside")p[0]=y,p[1]=0;else{var T=y/2;p[0]=T,p[1]=-T}}}var E=this.transformBuffer.getMatrixView(l);this.setTransformMatrix(t,E,i),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}},"drawNode")},{key:"_getVertTypeForShape",value:v(function(t,a){var n=t.pstyle(a).value;switch(n){case"rectangle":return Ht;case"ellipse":return ya;case"roundrectangle":case"round-rectangle":return on;case"bottom-round-rectangle":return pa;default:return}},"_getVertTypeForShape")},{key:"_getCornerRadius",value:v(function(t,a,n){var i=n.w,s=n.h;if(t.pstyle(a).value==="auto")return ft(i,s);var o=t.pstyle(a).pfValue,l=i/2,u=s/2;return Math.min(o,u,l)},"_getCornerRadius")},{key:"drawEdgeArrow",value:v(function(t,a,n){if(t.visible()){var i=t._private.rscratch,s,o,l;if(n==="source"?(s=i.arrowStartX,o=i.arrowStartY,l=i.srcArrowAngle):(s=i.arrowEndX,o=i.arrowEndY,l=i.tgtArrowAngle),!(isNaN(s)||s==null||isNaN(o)||o==null||isNaN(l)||l==null)){var u=t.pstyle(n+"-arrow-shape").value;if(u!=="none"){var f=t.pstyle(n+"-arrow-color").value,c=t.pstyle("opacity").value,d=t.pstyle("line-opacity").value,g=c*d,h=t.pstyle("width").pfValue,m=t.pstyle("arrow-scale").value,p=this.r.getArrowWidth(h,m),y=this.instanceCount,b=this.transformBuffer.getMatrixView(y);Ul(b),mn(b,b,[s,o]),$s(b,b,[p,p]),Kl(b,b,l),this.vertTypeBuffer.getView(y)[0]=Ss;var w=this.indexBuffer.getView(y);Gt(a,w);var x=this.colorBuffer.getView(y);Et(f,g,x),this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}},"drawEdgeArrow")},{key:"drawEdgeLine",value:v(function(t,a){if(t.visible()){var n=this._getEdgePoints(t);if(n){var i=t.pstyle("opacity").value,s=t.pstyle("line-opacity").value,o=t.pstyle("width").pfValue,l=t.pstyle("line-color").value,u=i*s;if(n.length/2+this.instanceCount>this.maxInstances&&this.endBatch(),n.length==4){var f=this.instanceCount;this.vertTypeBuffer.getView(f)[0]=Xl;var c=this.indexBuffer.getView(f);Gt(a,c);var d=this.colorBuffer.getView(f);Et(l,u,d);var g=this.lineWidthBuffer.getView(f);g[0]=o;var h=this.pointAPointBBuffer.getView(f);h[0]=n[0],h[1]=n[1],h[2]=n[2],h[3]=n[3],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}else for(var m=0;m=this.maxInstances&&this.endBatch()}}}},"drawEdgeLine")},{key:"_isValidEdge",value:v(function(t){var a=t._private.rscratch;return!(a.badLine||a.allpts==null||isNaN(a.allpts[0]))},"_isValidEdge")},{key:"_getEdgePoints",value:v(function(t){var a=t._private.rscratch;if(this._isValidEdge(t)){var n=a.allpts;if(n.length==4)return n;var i=this._getNumSegments(t);return this._getCurveSegmentPoints(n,i)}},"_getEdgePoints")},{key:"_getNumSegments",value:v(function(t){var a=15;return Math.min(Math.max(a,5),this.maxInstances)},"_getNumSegments")},{key:"_getCurveSegmentPoints",value:v(function(t,a){if(t.length==4)return t;for(var n=Array((a+1)*2),i=0;i<=a;i++)if(i==0)n[0]=t[0],n[1]=t[1];else if(i==a)n[i*2]=t[t.length-2],n[i*2+1]=t[t.length-1];else{var s=i/a;this._setCurvePoint(t,s,n,i*2)}return n},"_getCurveSegmentPoints")},{key:"_setCurvePoint",value:v(function(t,a,n,i){if(t.length<=2)n[i]=t[0],n[i+1]=t[1];else{for(var s=Array(t.length-2),o=0;o0}},"isLayerVisible"),o=v(function(c){var d=c.pstyle("text-events").strValue==="yes";return d?Rn.USE_BB:Rn.IGNORE},"getTexPickingMode"),l=v(function(c){var d=c.position(),g=d.x,h=d.y,m=c.outerWidth(),p=c.outerHeight();return{w:m,h:p,x1:g-m/2,y1:h-p/2}},"getBBForSimpleShape");t.drawing.addAtlasCollection("node",{texRows:r.webglTexRowsNodes}),t.drawing.addAtlasCollection("label",{texRows:r.webglTexRows}),t.drawing.addTextureAtlasRenderType("node-body",{collection:"node",getKey:e.getStyleKey,getBoundingBox:e.getElementBox,drawElement:e.drawElement}),t.drawing.addSimpleShapeRenderType("node-body",{getBoundingBox:l,isSimple:Ky,shapeProps:{shape:"shape",color:"background-color",opacity:"background-opacity",radius:"corner-radius",border:!0}}),t.drawing.addSimpleShapeRenderType("node-overlay",{getBoundingBox:l,isVisible:s("overlay"),shapeProps:{shape:"overlay-shape",color:"overlay-color",opacity:"overlay-opacity",padding:"overlay-padding",radius:"overlay-corner-radius"}}),t.drawing.addSimpleShapeRenderType("node-underlay",{getBoundingBox:l,isVisible:s("underlay"),shapeProps:{shape:"underlay-shape",color:"underlay-color",opacity:"underlay-opacity",padding:"underlay-padding",radius:"underlay-corner-radius"}}),t.drawing.addTextureAtlasRenderType("label",{collection:"label",getTexPickingMode:o,getKey:ks(e.getLabelKey,null),getBoundingBox:Ds(e.getLabelBox,null),drawClipped:!0,drawElement:e.drawLabel,getRotation:n(null),getRotationPoint:e.getLabelRotationPoint,getRotationOffset:e.getLabelRotationOffset,isVisible:i("label")}),t.drawing.addTextureAtlasRenderType("edge-source-label",{collection:"label",getTexPickingMode:o,getKey:ks(e.getSourceLabelKey,"source"),getBoundingBox:Ds(e.getSourceLabelBox,"source"),drawClipped:!0,drawElement:e.drawSourceLabel,getRotation:n("source"),getRotationPoint:e.getSourceLabelRotationPoint,getRotationOffset:e.getSourceLabelRotationOffset,isVisible:i("source-label")}),t.drawing.addTextureAtlasRenderType("edge-target-label",{collection:"label",getTexPickingMode:o,getKey:ks(e.getTargetLabelKey,"target"),getBoundingBox:Ds(e.getTargetLabelBox,"target"),drawClipped:!0,drawElement:e.drawTargetLabel,getRotation:n("target"),getRotationPoint:e.getTargetLabelRotationPoint,getRotationOffset:e.getTargetLabelRotationOffset,isVisible:i("target-label")});var u=Va(function(){console.log("garbage collect flag set"),t.data.gc=!0},1e4);t.onUpdateEleCalcs(function(f,c){var d=!1;c&&c.length>0&&(d|=t.drawing.invalidate(c)),d&&u()}),hm(t)};function dm(r){var e=r.cy.container(),t=e&&e.style&&e.style.backgroundColor||"white";return sv(t)}v(dm,"getBGColor");function If(r,e){var t=r._private.rscratch;return Sr(t,"labelWrapCachedLines",e)||[]}v(If,"getLabelLines");var ks=v(function(e,t){return function(a){var n=e(a),i=If(a,t);return i.length>1?i.map(function(s,o){return"".concat(n,"_").concat(o)}):n}},"getStyleKeysForLabel"),Ds=v(function(e,t){return function(a,n){var i=e(a);if(typeof n=="string"){var s=n.indexOf("_");if(s>0){var o=Number(n.substring(s+1)),l=If(a,t),u=i.h/l.length,f=u*o,c=i.y1+f;return{x1:i.x1,w:i.w,y1:c,h:u,yOffset:f}}}return i}},"getBoundingBoxForLabel");function hm(r){{var e=r.render;r.render=function(i){i=i||{};var s=r.cy;r.webgl&&(s.zoom()>kf?(gm(r),e.call(r,i)):(pm(r),Nf(r,i,Ca.SCREEN)))}}{var t=r.matchCanvasSize;r.matchCanvasSize=function(i){t.call(r,i),r.pickingFrameBuffer.setFramebufferAttachmentSizes(r.canvasWidth,r.canvasHeight),r.pickingFrameBuffer.needsDraw=!0}}r.findNearestElements=function(i,s,o,l){return Em(r,i,s)};{var a=r.invalidateCachedZSortedEles;r.invalidateCachedZSortedEles=function(){a.call(r),r.pickingFrameBuffer.needsDraw=!0}}{var n=r.notify;r.notify=function(i,s){n.call(r,i,s),i==="viewport"||i==="bounds"?r.pickingFrameBuffer.needsDraw=!0:i==="background"&&r.drawing.invalidate(s,{type:"node-body"})}}}v(hm,"overrideCanvasRendererFunctions");function gm(r){var e=r.data.contexts[r.WEBGL];e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}v(gm,"clearWebgl");function pm(r){var e=v(function(a){a.save(),a.setTransform(1,0,0,1,0,0),a.clearRect(0,0,r.canvasWidth,r.canvasHeight),a.restore()},"clear");e(r.data.contexts[r.NODE]),e(r.data.contexts[r.DRAG])}v(pm,"clearCanvas");function ym(r){var e=r.canvasWidth,t=r.canvasHeight,a=wo(r),n=a.pan,i=a.zoom,s=Cs();mn(s,s,[n.x,n.y]),$s(s,s,[i,i]);var o=Cs();tm(o,e,t);var l=Cs();return rm(l,o,s),l}v(ym,"createPanZoomMatrix");function Of(r,e){var t=r.canvasWidth,a=r.canvasHeight,n=wo(r),i=n.pan,s=n.zoom;e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t,a),e.translate(i.x,i.y),e.scale(s,s)}v(Of,"setContextTransform");function mm(r,e){r.drawSelectionRectangle(e,function(t){return Of(r,t)})}v(mm,"drawSelectionRectangle");function bm(r){var e=r.data.contexts[r.NODE];e.save(),Of(r,e),e.strokeStyle="rgba(0, 0, 0, 0.3)",e.beginPath(),e.moveTo(-1e3,0),e.lineTo(1e3,0),e.stroke(),e.beginPath(),e.moveTo(0,-1e3),e.lineTo(0,1e3),e.stroke(),e.restore()}v(bm,"drawAxes");function wm(r){var e=v(function(n,i,s){for(var o=n.atlasManager.getAtlasCollection(i),l=r.data.contexts[r.NODE],u=o.atlases,f=0;f=0&&x.add(E)}return x}v(xm,"getPickingIndexes");function Em(r,e,t){var a=xm(r,e,t),n=r.getCachedZSortedEles(),i,s,o=Dr(a),l;try{for(o.s();!(l=o.n()).done;){var u=l.value,f=n[u];if(!i&&f.isNode()&&(i=f),!s&&f.isEdge()&&(s=f),i&&s)break}}catch(c){o.e(c)}finally{o.f()}return[i,s].filter(Boolean)}v(Em,"findNearestElementsWebgl");function Bs(r,e,t){var a=r.drawing;e+=1,t.isNode()?(a.drawNode(t,e,"node-underlay"),a.drawNode(t,e,"node-body"),a.drawTexture(t,e,"label"),a.drawNode(t,e,"node-overlay")):(a.drawEdgeLine(t,e),a.drawEdgeArrow(t,e,"source"),a.drawEdgeArrow(t,e,"target"),a.drawTexture(t,e,"label"),a.drawTexture(t,e,"edge-source-label"),a.drawTexture(t,e,"edge-target-label"))}v(Bs,"drawEle");function Nf(r,e,t){var a;r.webglDebug&&(a=performance.now());var n=r.drawing,i=0;if(t.screen&&r.data.canvasNeedsRedraw[r.SELECT_BOX]&&mm(r,e),r.data.canvasNeedsRedraw[r.NODE]||t.picking){var s=r.data.contexts[r.WEBGL];t.screen?(s.clearColor(0,0,0,0),s.enable(s.BLEND),s.blendFunc(s.ONE,s.ONE_MINUS_SRC_ALPHA)):s.disable(s.BLEND),s.clear(s.COLOR_BUFFER_BIT|s.DEPTH_BUFFER_BIT),s.viewport(0,0,s.canvas.width,s.canvas.height);var o=ym(r),l=r.getCachedZSortedEles();if(i=l.length,n.startFrame(o,t),t.screen){for(var u=0;u0&&s>0){g.clearRect(0,0,i,s),g.globalCompositeOperation="source-over";var h=this.getCachedZSortedEles();if(r.full)g.translate(-a.x1*u,-a.y1*u),g.scale(u,u),this.drawElements(g,h),g.scale(1/u,1/u),g.translate(a.x1*u,a.y1*u);else{var m=e.pan(),p={x:m.x*u,y:m.y*u};u*=e.zoom(),g.translate(p.x,p.y),g.scale(u,u),this.drawElements(g,h),g.scale(1/u,1/u),g.translate(-p.x,-p.y)}r.bg&&(g.globalCompositeOperation="destination-over",g.fillStyle=r.bg,g.rect(0,0,i,s),g.fill())}return d};function Cm(r,e){for(var t=atob(r),a=new ArrayBuffer(t.length),n=new Uint8Array(a),i=0;i"u"?"undefined":nr(OffscreenCanvas))!=="undefined")t=new OffscreenCanvas(r,e);else{var a=this.cy.window(),n=a.document;t=n.createElement("canvas"),t.width=r,t.height=e}return t};[Bf,Wr,jr,bo,Ot,mt,Er,Lf,bt,$a,Vf].forEach(function(r){we(De,r)});var km=[{name:"null",impl:hf},{name:"base",impl:Tf},{name:"canvas",impl:Tm}],Dm=[{type:"layout",extensions:Jp},{type:"renderer",extensions:km}],_f={},Gf={};function Hf(r,e,t){var a=t,n=v(function(S){qe("Can not register `"+e+"` for `"+r+"` since `"+S+"` already exists in the prototype and can not be overridden")},"overrideErr");if(r==="core"){if(Ma.prototype[e])return n(e);Ma.prototype[e]=t}else if(r==="collection"){if(cr.prototype[e])return n(e);cr.prototype[e]=t}else if(r==="layout"){for(var i=v(function(S){this.options=S,t.call(this,S),Ie(this._private)||(this._private={}),this._private.cy=S.cy,this._private.listeners=[],this.createEmitter()},"Layout"),s=i.prototype=Object.create(t.prototype),o=[],l=0;l r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return _arrayLikeToArray(r);\n}\nfunction _classCallCheck(a, n) {\n if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nfunction _defineProperties(e, r) {\n for (var t = 0; t < r.length; t++) {\n var o = r[t];\n o.enumerable = o.enumerable || false, o.configurable = true, \"value\" in o && (o.writable = true), Object.defineProperty(e, _toPropertyKey(o.key), o);\n }\n}\nfunction _createClass(e, r, t) {\n return r && _defineProperties(e.prototype, r), Object.defineProperty(e, \"prototype\", {\n writable: false\n }), e;\n}\nfunction _createForOfIteratorHelper(r, e) {\n var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (!t) {\n if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) {\n t && (r = t);\n var n = 0,\n F = function () {};\n return {\n s: F,\n n: function () {\n return n >= r.length ? {\n done: true\n } : {\n done: false,\n value: r[n++]\n };\n },\n e: function (r) {\n throw r;\n },\n f: F\n };\n }\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n var o,\n a = true,\n u = false;\n return {\n s: function () {\n t = t.call(r);\n },\n n: function () {\n var r = t.next();\n return a = r.done, r;\n },\n e: function (r) {\n u = true, o = r;\n },\n f: function () {\n try {\n a || null == t.return || t.return();\n } finally {\n if (u) throw o;\n }\n }\n };\n}\nfunction _defineProperty$1(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: true,\n configurable: true,\n writable: true\n }) : e[r] = t, e;\n}\nfunction _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = true,\n o = false;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = true, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _toConsumableArray(r) {\n return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (undefined !== e) {\n var i = e.call(t, r);\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (String )(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : undefined;\n }\n}\n\nvar _window = typeof window === 'undefined' ? null : window; // eslint-disable-line no-undef\n\nvar navigator = _window ? _window.navigator : null;\n_window ? _window.document : null;\nvar typeofstr = _typeof('');\nvar typeofobj = _typeof({});\nvar typeoffn = _typeof(function () {});\nvar typeofhtmlele = typeof HTMLElement === \"undefined\" ? \"undefined\" : _typeof(HTMLElement);\nvar instanceStr = function instanceStr(obj) {\n return obj && obj.instanceString && fn$6(obj.instanceString) ? obj.instanceString() : null;\n};\n\nvar string = function string(obj) {\n return obj != null && _typeof(obj) == typeofstr;\n};\nvar fn$6 = function fn(obj) {\n return obj != null && _typeof(obj) === typeoffn;\n};\nvar array = function array(obj) {\n return !elementOrCollection(obj) && (Array.isArray ? Array.isArray(obj) : obj != null && obj instanceof Array);\n};\nvar plainObject = function plainObject(obj) {\n return obj != null && _typeof(obj) === typeofobj && !array(obj) && obj.constructor === Object;\n};\nvar object = function object(obj) {\n return obj != null && _typeof(obj) === typeofobj;\n};\nvar number$1 = function number(obj) {\n return obj != null && _typeof(obj) === _typeof(1) && !isNaN(obj);\n};\nvar integer = function integer(obj) {\n return number$1(obj) && Math.floor(obj) === obj;\n};\nvar htmlElement = function htmlElement(obj) {\n if ('undefined' === typeofhtmlele) {\n return undefined;\n } else {\n return null != obj && obj instanceof HTMLElement;\n }\n};\nvar elementOrCollection = function elementOrCollection(obj) {\n return element(obj) || collection(obj);\n};\nvar element = function element(obj) {\n return instanceStr(obj) === 'collection' && obj._private.single;\n};\nvar collection = function collection(obj) {\n return instanceStr(obj) === 'collection' && !obj._private.single;\n};\nvar core = function core(obj) {\n return instanceStr(obj) === 'core';\n};\nvar stylesheet = function stylesheet(obj) {\n return instanceStr(obj) === 'stylesheet';\n};\nvar event = function event(obj) {\n return instanceStr(obj) === 'event';\n};\nvar emptyString = function emptyString(obj) {\n if (obj === undefined || obj === null) {\n // null is empty\n return true;\n } else if (obj === '' || obj.match(/^\\s+$/)) {\n return true; // empty string is empty\n }\n return false; // otherwise, we don't know what we've got\n};\nvar domElement = function domElement(obj) {\n if (typeof HTMLElement === 'undefined') {\n return false; // we're not in a browser so it doesn't matter\n } else {\n return obj instanceof HTMLElement;\n }\n};\nvar boundingBox = function boundingBox(obj) {\n return plainObject(obj) && number$1(obj.x1) && number$1(obj.x2) && number$1(obj.y1) && number$1(obj.y2);\n};\nvar promise = function promise(obj) {\n return object(obj) && fn$6(obj.then);\n};\nvar ms = function ms() {\n return navigator && navigator.userAgent.match(/msie|trident|edge/i);\n}; // probably a better way to detect this...\n\nvar memoize = function memoize(fn, keyFn) {\n if (!keyFn) {\n keyFn = function keyFn() {\n if (arguments.length === 1) {\n return arguments[0];\n } else if (arguments.length === 0) {\n return 'undefined';\n }\n var args = [];\n for (var i = 0; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n return args.join('$');\n };\n }\n var _memoizedFn = function memoizedFn() {\n var self = this;\n var args = arguments;\n var ret;\n var k = keyFn.apply(self, args);\n var cache = _memoizedFn.cache;\n if (!(ret = cache[k])) {\n ret = cache[k] = fn.apply(self, args);\n }\n return ret;\n };\n _memoizedFn.cache = {};\n return _memoizedFn;\n};\n\nvar camel2dash = memoize(function (str) {\n return str.replace(/([A-Z])/g, function (v) {\n return '-' + v.toLowerCase();\n });\n});\nvar dash2camel = memoize(function (str) {\n return str.replace(/(-\\w)/g, function (v) {\n return v[1].toUpperCase();\n });\n});\nvar prependCamel = memoize(function (prefix, str) {\n return prefix + str[0].toUpperCase() + str.substring(1);\n}, function (prefix, str) {\n return prefix + '$' + str;\n});\nvar capitalize = function capitalize(str) {\n if (emptyString(str)) {\n return str;\n }\n return str.charAt(0).toUpperCase() + str.substring(1);\n};\nvar endsWith = function endsWith(string, suffix) {\n return string.slice(-1 * suffix.length) === suffix;\n};\n\nvar number = '(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))';\nvar rgba = 'rgb[a]?\\\\((' + number + '[%]?)\\\\s*,\\\\s*(' + number + '[%]?)\\\\s*,\\\\s*(' + number + '[%]?)(?:\\\\s*,\\\\s*(' + number + '))?\\\\)';\nvar rgbaNoBackRefs = 'rgb[a]?\\\\((?:' + number + '[%]?)\\\\s*,\\\\s*(?:' + number + '[%]?)\\\\s*,\\\\s*(?:' + number + '[%]?)(?:\\\\s*,\\\\s*(?:' + number + '))?\\\\)';\nvar hsla = 'hsl[a]?\\\\((' + number + ')\\\\s*,\\\\s*(' + number + '[%])\\\\s*,\\\\s*(' + number + '[%])(?:\\\\s*,\\\\s*(' + number + '))?\\\\)';\nvar hslaNoBackRefs = 'hsl[a]?\\\\((?:' + number + ')\\\\s*,\\\\s*(?:' + number + '[%])\\\\s*,\\\\s*(?:' + number + '[%])(?:\\\\s*,\\\\s*(?:' + number + '))?\\\\)';\nvar hex3 = '\\\\#[0-9a-fA-F]{3}';\nvar hex6 = '\\\\#[0-9a-fA-F]{6}';\n\nvar ascending = function ascending(a, b) {\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n } else {\n return 0;\n }\n};\nvar descending = function descending(a, b) {\n return -1 * ascending(a, b);\n};\n\nvar extend = Object.assign != null ? Object.assign.bind(Object) : function (tgt) {\n var args = arguments;\n for (var i = 1; i < args.length; i++) {\n var obj = args[i];\n if (obj == null) {\n continue;\n }\n var keys = Object.keys(obj);\n for (var j = 0; j < keys.length; j++) {\n var k = keys[j];\n tgt[k] = obj[k];\n }\n }\n return tgt;\n};\n\n// get [r, g, b] from #abc or #aabbcc\nvar hex2tuple = function hex2tuple(hex) {\n if (!(hex.length === 4 || hex.length === 7) || hex[0] !== '#') {\n return;\n }\n var shortHex = hex.length === 4;\n var r, g, b;\n var base = 16;\n if (shortHex) {\n r = parseInt(hex[1] + hex[1], base);\n g = parseInt(hex[2] + hex[2], base);\n b = parseInt(hex[3] + hex[3], base);\n } else {\n r = parseInt(hex[1] + hex[2], base);\n g = parseInt(hex[3] + hex[4], base);\n b = parseInt(hex[5] + hex[6], base);\n }\n return [r, g, b];\n};\n\n// get [r, g, b, a] from hsl(0, 0, 0) or hsla(0, 0, 0, 0)\nvar hsl2tuple = function hsl2tuple(hsl) {\n var ret;\n var h, s, l, a, r, g, b;\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n var m = new RegExp('^' + hsla + '$').exec(hsl);\n if (m) {\n // get hue\n h = parseInt(m[1]);\n if (h < 0) {\n h = (360 - -1 * h % 360) % 360;\n } else if (h > 360) {\n h = h % 360;\n }\n h /= 360; // normalise on [0, 1]\n\n s = parseFloat(m[2]);\n if (s < 0 || s > 100) {\n return;\n } // saturation is [0, 100]\n s = s / 100; // normalise on [0, 1]\n\n l = parseFloat(m[3]);\n if (l < 0 || l > 100) {\n return;\n } // lightness is [0, 100]\n l = l / 100; // normalise on [0, 1]\n\n a = m[4];\n if (a !== undefined) {\n a = parseFloat(a);\n if (a < 0 || a > 1) {\n return;\n } // alpha is [0, 1]\n }\n\n // now, convert to rgb\n // code from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n if (s === 0) {\n r = g = b = Math.round(l * 255); // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = Math.round(255 * hue2rgb(p, q, h + 1 / 3));\n g = Math.round(255 * hue2rgb(p, q, h));\n b = Math.round(255 * hue2rgb(p, q, h - 1 / 3));\n }\n ret = [r, g, b, a];\n }\n return ret;\n};\n\n// get [r, g, b, a] from rgb(0, 0, 0) or rgba(0, 0, 0, 0)\nvar rgb2tuple = function rgb2tuple(rgb) {\n var ret;\n var m = new RegExp('^' + rgba + '$').exec(rgb);\n if (m) {\n ret = [];\n var isPct = [];\n for (var i = 1; i <= 3; i++) {\n var channel = m[i];\n if (channel[channel.length - 1] === '%') {\n isPct[i] = true;\n }\n channel = parseFloat(channel);\n if (isPct[i]) {\n channel = channel / 100 * 255; // normalise to [0, 255]\n }\n if (channel < 0 || channel > 255) {\n return;\n } // invalid channel value\n\n ret.push(Math.floor(channel));\n }\n var atLeastOneIsPct = isPct[1] || isPct[2] || isPct[3];\n var allArePct = isPct[1] && isPct[2] && isPct[3];\n if (atLeastOneIsPct && !allArePct) {\n return;\n } // must all be percent values if one is\n\n var alpha = m[4];\n if (alpha !== undefined) {\n alpha = parseFloat(alpha);\n if (alpha < 0 || alpha > 1) {\n return;\n } // invalid alpha value\n\n ret.push(alpha);\n }\n }\n return ret;\n};\nvar colorname2tuple = function colorname2tuple(color) {\n return colors[color.toLowerCase()];\n};\nvar color2tuple = function color2tuple(color) {\n return (array(color) ? color : null) || colorname2tuple(color) || hex2tuple(color) || rgb2tuple(color) || hsl2tuple(color);\n};\nvar colors = {\n // special colour names\n transparent: [0, 0, 0, 0],\n // NB alpha === 0\n\n // regular colours\n aliceblue: [240, 248, 255],\n antiquewhite: [250, 235, 215],\n aqua: [0, 255, 255],\n aquamarine: [127, 255, 212],\n azure: [240, 255, 255],\n beige: [245, 245, 220],\n bisque: [255, 228, 196],\n black: [0, 0, 0],\n blanchedalmond: [255, 235, 205],\n blue: [0, 0, 255],\n blueviolet: [138, 43, 226],\n brown: [165, 42, 42],\n burlywood: [222, 184, 135],\n cadetblue: [95, 158, 160],\n chartreuse: [127, 255, 0],\n chocolate: [210, 105, 30],\n coral: [255, 127, 80],\n cornflowerblue: [100, 149, 237],\n cornsilk: [255, 248, 220],\n crimson: [220, 20, 60],\n cyan: [0, 255, 255],\n darkblue: [0, 0, 139],\n darkcyan: [0, 139, 139],\n darkgoldenrod: [184, 134, 11],\n darkgray: [169, 169, 169],\n darkgreen: [0, 100, 0],\n darkgrey: [169, 169, 169],\n darkkhaki: [189, 183, 107],\n darkmagenta: [139, 0, 139],\n darkolivegreen: [85, 107, 47],\n darkorange: [255, 140, 0],\n darkorchid: [153, 50, 204],\n darkred: [139, 0, 0],\n darksalmon: [233, 150, 122],\n darkseagreen: [143, 188, 143],\n darkslateblue: [72, 61, 139],\n darkslategray: [47, 79, 79],\n darkslategrey: [47, 79, 79],\n darkturquoise: [0, 206, 209],\n darkviolet: [148, 0, 211],\n deeppink: [255, 20, 147],\n deepskyblue: [0, 191, 255],\n dimgray: [105, 105, 105],\n dimgrey: [105, 105, 105],\n dodgerblue: [30, 144, 255],\n firebrick: [178, 34, 34],\n floralwhite: [255, 250, 240],\n forestgreen: [34, 139, 34],\n fuchsia: [255, 0, 255],\n gainsboro: [220, 220, 220],\n ghostwhite: [248, 248, 255],\n gold: [255, 215, 0],\n goldenrod: [218, 165, 32],\n gray: [128, 128, 128],\n grey: [128, 128, 128],\n green: [0, 128, 0],\n greenyellow: [173, 255, 47],\n honeydew: [240, 255, 240],\n hotpink: [255, 105, 180],\n indianred: [205, 92, 92],\n indigo: [75, 0, 130],\n ivory: [255, 255, 240],\n khaki: [240, 230, 140],\n lavender: [230, 230, 250],\n lavenderblush: [255, 240, 245],\n lawngreen: [124, 252, 0],\n lemonchiffon: [255, 250, 205],\n lightblue: [173, 216, 230],\n lightcoral: [240, 128, 128],\n lightcyan: [224, 255, 255],\n lightgoldenrodyellow: [250, 250, 210],\n lightgray: [211, 211, 211],\n lightgreen: [144, 238, 144],\n lightgrey: [211, 211, 211],\n lightpink: [255, 182, 193],\n lightsalmon: [255, 160, 122],\n lightseagreen: [32, 178, 170],\n lightskyblue: [135, 206, 250],\n lightslategray: [119, 136, 153],\n lightslategrey: [119, 136, 153],\n lightsteelblue: [176, 196, 222],\n lightyellow: [255, 255, 224],\n lime: [0, 255, 0],\n limegreen: [50, 205, 50],\n linen: [250, 240, 230],\n magenta: [255, 0, 255],\n maroon: [128, 0, 0],\n mediumaquamarine: [102, 205, 170],\n mediumblue: [0, 0, 205],\n mediumorchid: [186, 85, 211],\n mediumpurple: [147, 112, 219],\n mediumseagreen: [60, 179, 113],\n mediumslateblue: [123, 104, 238],\n mediumspringgreen: [0, 250, 154],\n mediumturquoise: [72, 209, 204],\n mediumvioletred: [199, 21, 133],\n midnightblue: [25, 25, 112],\n mintcream: [245, 255, 250],\n mistyrose: [255, 228, 225],\n moccasin: [255, 228, 181],\n navajowhite: [255, 222, 173],\n navy: [0, 0, 128],\n oldlace: [253, 245, 230],\n olive: [128, 128, 0],\n olivedrab: [107, 142, 35],\n orange: [255, 165, 0],\n orangered: [255, 69, 0],\n orchid: [218, 112, 214],\n palegoldenrod: [238, 232, 170],\n palegreen: [152, 251, 152],\n paleturquoise: [175, 238, 238],\n palevioletred: [219, 112, 147],\n papayawhip: [255, 239, 213],\n peachpuff: [255, 218, 185],\n peru: [205, 133, 63],\n pink: [255, 192, 203],\n plum: [221, 160, 221],\n powderblue: [176, 224, 230],\n purple: [128, 0, 128],\n red: [255, 0, 0],\n rosybrown: [188, 143, 143],\n royalblue: [65, 105, 225],\n saddlebrown: [139, 69, 19],\n salmon: [250, 128, 114],\n sandybrown: [244, 164, 96],\n seagreen: [46, 139, 87],\n seashell: [255, 245, 238],\n sienna: [160, 82, 45],\n silver: [192, 192, 192],\n skyblue: [135, 206, 235],\n slateblue: [106, 90, 205],\n slategray: [112, 128, 144],\n slategrey: [112, 128, 144],\n snow: [255, 250, 250],\n springgreen: [0, 255, 127],\n steelblue: [70, 130, 180],\n tan: [210, 180, 140],\n teal: [0, 128, 128],\n thistle: [216, 191, 216],\n tomato: [255, 99, 71],\n turquoise: [64, 224, 208],\n violet: [238, 130, 238],\n wheat: [245, 222, 179],\n white: [255, 255, 255],\n whitesmoke: [245, 245, 245],\n yellow: [255, 255, 0],\n yellowgreen: [154, 205, 50]\n};\n\n// sets the value in a map (map may not be built)\nvar setMap = function setMap(options) {\n var obj = options.map;\n var keys = options.keys;\n var l = keys.length;\n for (var i = 0; i < l; i++) {\n var key = keys[i];\n if (plainObject(key)) {\n throw Error('Tried to set map with object key');\n }\n if (i < keys.length - 1) {\n // extend the map if necessary\n if (obj[key] == null) {\n obj[key] = {};\n }\n obj = obj[key];\n } else {\n // set the value\n obj[key] = options.value;\n }\n }\n};\n\n// gets the value in a map even if it's not built in places\nvar getMap = function getMap(options) {\n var obj = options.map;\n var keys = options.keys;\n var l = keys.length;\n for (var i = 0; i < l; i++) {\n var key = keys[i];\n if (plainObject(key)) {\n throw Error('Tried to get map with object key');\n }\n obj = obj[key];\n if (obj == null) {\n return obj;\n }\n }\n return obj;\n};\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n\nvar isObject_1;\nvar hasRequiredIsObject;\n\nfunction requireIsObject () {\n\tif (hasRequiredIsObject) return isObject_1;\n\thasRequiredIsObject = 1;\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return value != null && (type == 'object' || type == 'function');\n\t}\n\n\tisObject_1 = isObject;\n\treturn isObject_1;\n}\n\n/** Detect free variable `global` from Node.js. */\n\nvar _freeGlobal;\nvar hasRequired_freeGlobal;\n\nfunction require_freeGlobal () {\n\tif (hasRequired_freeGlobal) return _freeGlobal;\n\thasRequired_freeGlobal = 1;\n\tvar freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\n\t_freeGlobal = freeGlobal;\n\treturn _freeGlobal;\n}\n\nvar _root;\nvar hasRequired_root;\n\nfunction require_root () {\n\tif (hasRequired_root) return _root;\n\thasRequired_root = 1;\n\tvar freeGlobal = require_freeGlobal();\n\n\t/** Detect free variable `self`. */\n\tvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n\t/** Used as a reference to the global object. */\n\tvar root = freeGlobal || freeSelf || Function('return this')();\n\n\t_root = root;\n\treturn _root;\n}\n\nvar now_1;\nvar hasRequiredNow;\n\nfunction requireNow () {\n\tif (hasRequiredNow) return now_1;\n\thasRequiredNow = 1;\n\tvar root = require_root();\n\n\t/**\n\t * Gets the timestamp of the number of milliseconds that have elapsed since\n\t * the Unix epoch (1 January 1970 00:00:00 UTC).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 2.4.0\n\t * @category Date\n\t * @returns {number} Returns the timestamp.\n\t * @example\n\t *\n\t * _.defer(function(stamp) {\n\t * console.log(_.now() - stamp);\n\t * }, _.now());\n\t * // => Logs the number of milliseconds it took for the deferred invocation.\n\t */\n\tvar now = function() {\n\t return root.Date.now();\n\t};\n\n\tnow_1 = now;\n\treturn now_1;\n}\n\n/** Used to match a single whitespace character. */\n\nvar _trimmedEndIndex;\nvar hasRequired_trimmedEndIndex;\n\nfunction require_trimmedEndIndex () {\n\tif (hasRequired_trimmedEndIndex) return _trimmedEndIndex;\n\thasRequired_trimmedEndIndex = 1;\n\tvar reWhitespace = /\\s/;\n\n\t/**\n\t * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n\t * character of `string`.\n\t *\n\t * @private\n\t * @param {string} string The string to inspect.\n\t * @returns {number} Returns the index of the last non-whitespace character.\n\t */\n\tfunction trimmedEndIndex(string) {\n\t var index = string.length;\n\n\t while (index-- && reWhitespace.test(string.charAt(index))) {}\n\t return index;\n\t}\n\n\t_trimmedEndIndex = trimmedEndIndex;\n\treturn _trimmedEndIndex;\n}\n\nvar _baseTrim;\nvar hasRequired_baseTrim;\n\nfunction require_baseTrim () {\n\tif (hasRequired_baseTrim) return _baseTrim;\n\thasRequired_baseTrim = 1;\n\tvar trimmedEndIndex = require_trimmedEndIndex();\n\n\t/** Used to match leading whitespace. */\n\tvar reTrimStart = /^\\s+/;\n\n\t/**\n\t * The base implementation of `_.trim`.\n\t *\n\t * @private\n\t * @param {string} string The string to trim.\n\t * @returns {string} Returns the trimmed string.\n\t */\n\tfunction baseTrim(string) {\n\t return string\n\t ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n\t : string;\n\t}\n\n\t_baseTrim = baseTrim;\n\treturn _baseTrim;\n}\n\nvar _Symbol;\nvar hasRequired_Symbol;\n\nfunction require_Symbol () {\n\tif (hasRequired_Symbol) return _Symbol;\n\thasRequired_Symbol = 1;\n\tvar root = require_root();\n\n\t/** Built-in value references. */\n\tvar Symbol = root.Symbol;\n\n\t_Symbol = Symbol;\n\treturn _Symbol;\n}\n\nvar _getRawTag;\nvar hasRequired_getRawTag;\n\nfunction require_getRawTag () {\n\tif (hasRequired_getRawTag) return _getRawTag;\n\thasRequired_getRawTag = 1;\n\tvar Symbol = require_Symbol();\n\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\n\t/**\n\t * Used to resolve the\n\t * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar nativeObjectToString = objectProto.toString;\n\n\t/** Built-in value references. */\n\tvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n\t/**\n\t * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n\t *\n\t * @private\n\t * @param {*} value The value to query.\n\t * @returns {string} Returns the raw `toStringTag`.\n\t */\n\tfunction getRawTag(value) {\n\t var isOwn = hasOwnProperty.call(value, symToStringTag),\n\t tag = value[symToStringTag];\n\n\t try {\n\t value[symToStringTag] = undefined;\n\t var unmasked = true;\n\t } catch (e) {}\n\n\t var result = nativeObjectToString.call(value);\n\t if (unmasked) {\n\t if (isOwn) {\n\t value[symToStringTag] = tag;\n\t } else {\n\t delete value[symToStringTag];\n\t }\n\t }\n\t return result;\n\t}\n\n\t_getRawTag = getRawTag;\n\treturn _getRawTag;\n}\n\n/** Used for built-in method references. */\n\nvar _objectToString;\nvar hasRequired_objectToString;\n\nfunction require_objectToString () {\n\tif (hasRequired_objectToString) return _objectToString;\n\thasRequired_objectToString = 1;\n\tvar objectProto = Object.prototype;\n\n\t/**\n\t * Used to resolve the\n\t * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar nativeObjectToString = objectProto.toString;\n\n\t/**\n\t * Converts `value` to a string using `Object.prototype.toString`.\n\t *\n\t * @private\n\t * @param {*} value The value to convert.\n\t * @returns {string} Returns the converted string.\n\t */\n\tfunction objectToString(value) {\n\t return nativeObjectToString.call(value);\n\t}\n\n\t_objectToString = objectToString;\n\treturn _objectToString;\n}\n\nvar _baseGetTag;\nvar hasRequired_baseGetTag;\n\nfunction require_baseGetTag () {\n\tif (hasRequired_baseGetTag) return _baseGetTag;\n\thasRequired_baseGetTag = 1;\n\tvar Symbol = require_Symbol(),\n\t getRawTag = require_getRawTag(),\n\t objectToString = require_objectToString();\n\n\t/** `Object#toString` result references. */\n\tvar nullTag = '[object Null]',\n\t undefinedTag = '[object Undefined]';\n\n\t/** Built-in value references. */\n\tvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n\t/**\n\t * The base implementation of `getTag` without fallbacks for buggy environments.\n\t *\n\t * @private\n\t * @param {*} value The value to query.\n\t * @returns {string} Returns the `toStringTag`.\n\t */\n\tfunction baseGetTag(value) {\n\t if (value == null) {\n\t return value === undefined ? undefinedTag : nullTag;\n\t }\n\t return (symToStringTag && symToStringTag in Object(value))\n\t ? getRawTag(value)\n\t : objectToString(value);\n\t}\n\n\t_baseGetTag = baseGetTag;\n\treturn _baseGetTag;\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n\nvar isObjectLike_1;\nvar hasRequiredIsObjectLike;\n\nfunction requireIsObjectLike () {\n\tif (hasRequiredIsObjectLike) return isObjectLike_1;\n\thasRequiredIsObjectLike = 1;\n\tfunction isObjectLike(value) {\n\t return value != null && typeof value == 'object';\n\t}\n\n\tisObjectLike_1 = isObjectLike;\n\treturn isObjectLike_1;\n}\n\nvar isSymbol_1;\nvar hasRequiredIsSymbol;\n\nfunction requireIsSymbol () {\n\tif (hasRequiredIsSymbol) return isSymbol_1;\n\thasRequiredIsSymbol = 1;\n\tvar baseGetTag = require_baseGetTag(),\n\t isObjectLike = requireIsObjectLike();\n\n\t/** `Object#toString` result references. */\n\tvar symbolTag = '[object Symbol]';\n\n\t/**\n\t * Checks if `value` is classified as a `Symbol` primitive or object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n\t * @example\n\t *\n\t * _.isSymbol(Symbol.iterator);\n\t * // => true\n\t *\n\t * _.isSymbol('abc');\n\t * // => false\n\t */\n\tfunction isSymbol(value) {\n\t return typeof value == 'symbol' ||\n\t (isObjectLike(value) && baseGetTag(value) == symbolTag);\n\t}\n\n\tisSymbol_1 = isSymbol;\n\treturn isSymbol_1;\n}\n\nvar toNumber_1;\nvar hasRequiredToNumber;\n\nfunction requireToNumber () {\n\tif (hasRequiredToNumber) return toNumber_1;\n\thasRequiredToNumber = 1;\n\tvar baseTrim = require_baseTrim(),\n\t isObject = requireIsObject(),\n\t isSymbol = requireIsSymbol();\n\n\t/** Used as references for various `Number` constants. */\n\tvar NAN = 0 / 0;\n\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3.2);\n\t * // => 3.2\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3.2');\n\t * // => 3.2\n\t */\n\tfunction toNumber(value) {\n\t if (typeof value == 'number') {\n\t return value;\n\t }\n\t if (isSymbol(value)) {\n\t return NAN;\n\t }\n\t if (isObject(value)) {\n\t var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = baseTrim(value);\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\n\ttoNumber_1 = toNumber;\n\treturn toNumber_1;\n}\n\nvar debounce_1;\nvar hasRequiredDebounce;\n\nfunction requireDebounce () {\n\tif (hasRequiredDebounce) return debounce_1;\n\thasRequiredDebounce = 1;\n\tvar isObject = requireIsObject(),\n\t now = requireNow(),\n\t toNumber = requireToNumber();\n\n\t/** Error message constants. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max,\n\t nativeMin = Math.min;\n\n\t/**\n\t * Creates a debounced function that delays invoking `func` until after `wait`\n\t * milliseconds have elapsed since the last time the debounced function was\n\t * invoked. The debounced function comes with a `cancel` method to cancel\n\t * delayed `func` invocations and a `flush` method to immediately invoke them.\n\t * Provide `options` to indicate whether `func` should be invoked on the\n\t * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n\t * with the last arguments provided to the debounced function. Subsequent\n\t * calls to the debounced function return the result of the last `func`\n\t * invocation.\n\t *\n\t * **Note:** If `leading` and `trailing` options are `true`, `func` is\n\t * invoked on the trailing edge of the timeout only if the debounced function\n\t * is invoked more than once during the `wait` timeout.\n\t *\n\t * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n\t * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n\t *\n\t * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n\t * for details over the differences between `_.debounce` and `_.throttle`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Function\n\t * @param {Function} func The function to debounce.\n\t * @param {number} [wait=0] The number of milliseconds to delay.\n\t * @param {Object} [options={}] The options object.\n\t * @param {boolean} [options.leading=false]\n\t * Specify invoking on the leading edge of the timeout.\n\t * @param {number} [options.maxWait]\n\t * The maximum time `func` is allowed to be delayed before it's invoked.\n\t * @param {boolean} [options.trailing=true]\n\t * Specify invoking on the trailing edge of the timeout.\n\t * @returns {Function} Returns the new debounced function.\n\t * @example\n\t *\n\t * // Avoid costly calculations while the window size is in flux.\n\t * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n\t *\n\t * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n\t * jQuery(element).on('click', _.debounce(sendMail, 300, {\n\t * 'leading': true,\n\t * 'trailing': false\n\t * }));\n\t *\n\t * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n\t * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n\t * var source = new EventSource('/stream');\n\t * jQuery(source).on('message', debounced);\n\t *\n\t * // Cancel the trailing debounced invocation.\n\t * jQuery(window).on('popstate', debounced.cancel);\n\t */\n\tfunction debounce(func, wait, options) {\n\t var lastArgs,\n\t lastThis,\n\t maxWait,\n\t result,\n\t timerId,\n\t lastCallTime,\n\t lastInvokeTime = 0,\n\t leading = false,\n\t maxing = false,\n\t trailing = true;\n\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t wait = toNumber(wait) || 0;\n\t if (isObject(options)) {\n\t leading = !!options.leading;\n\t maxing = 'maxWait' in options;\n\t maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n\t trailing = 'trailing' in options ? !!options.trailing : trailing;\n\t }\n\n\t function invokeFunc(time) {\n\t var args = lastArgs,\n\t thisArg = lastThis;\n\n\t lastArgs = lastThis = undefined;\n\t lastInvokeTime = time;\n\t result = func.apply(thisArg, args);\n\t return result;\n\t }\n\n\t function leadingEdge(time) {\n\t // Reset any `maxWait` timer.\n\t lastInvokeTime = time;\n\t // Start the timer for the trailing edge.\n\t timerId = setTimeout(timerExpired, wait);\n\t // Invoke the leading edge.\n\t return leading ? invokeFunc(time) : result;\n\t }\n\n\t function remainingWait(time) {\n\t var timeSinceLastCall = time - lastCallTime,\n\t timeSinceLastInvoke = time - lastInvokeTime,\n\t timeWaiting = wait - timeSinceLastCall;\n\n\t return maxing\n\t ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n\t : timeWaiting;\n\t }\n\n\t function shouldInvoke(time) {\n\t var timeSinceLastCall = time - lastCallTime,\n\t timeSinceLastInvoke = time - lastInvokeTime;\n\n\t // Either this is the first call, activity has stopped and we're at the\n\t // trailing edge, the system time has gone backwards and we're treating\n\t // it as the trailing edge, or we've hit the `maxWait` limit.\n\t return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n\t (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n\t }\n\n\t function timerExpired() {\n\t var time = now();\n\t if (shouldInvoke(time)) {\n\t return trailingEdge(time);\n\t }\n\t // Restart the timer.\n\t timerId = setTimeout(timerExpired, remainingWait(time));\n\t }\n\n\t function trailingEdge(time) {\n\t timerId = undefined;\n\n\t // Only invoke if we have `lastArgs` which means `func` has been\n\t // debounced at least once.\n\t if (trailing && lastArgs) {\n\t return invokeFunc(time);\n\t }\n\t lastArgs = lastThis = undefined;\n\t return result;\n\t }\n\n\t function cancel() {\n\t if (timerId !== undefined) {\n\t clearTimeout(timerId);\n\t }\n\t lastInvokeTime = 0;\n\t lastArgs = lastCallTime = lastThis = timerId = undefined;\n\t }\n\n\t function flush() {\n\t return timerId === undefined ? result : trailingEdge(now());\n\t }\n\n\t function debounced() {\n\t var time = now(),\n\t isInvoking = shouldInvoke(time);\n\n\t lastArgs = arguments;\n\t lastThis = this;\n\t lastCallTime = time;\n\n\t if (isInvoking) {\n\t if (timerId === undefined) {\n\t return leadingEdge(lastCallTime);\n\t }\n\t if (maxing) {\n\t // Handle invocations in a tight loop.\n\t clearTimeout(timerId);\n\t timerId = setTimeout(timerExpired, wait);\n\t return invokeFunc(lastCallTime);\n\t }\n\t }\n\t if (timerId === undefined) {\n\t timerId = setTimeout(timerExpired, wait);\n\t }\n\t return result;\n\t }\n\t debounced.cancel = cancel;\n\t debounced.flush = flush;\n\t return debounced;\n\t}\n\n\tdebounce_1 = debounce;\n\treturn debounce_1;\n}\n\nvar debounceExports = requireDebounce();\nvar debounce = /*@__PURE__*/getDefaultExportFromCjs(debounceExports);\n\nvar performance$1 = _window ? _window.performance : null;\nvar pnow = performance$1 && performance$1.now ? function () {\n return performance$1.now();\n} : function () {\n return Date.now();\n};\nvar raf = function () {\n if (_window) {\n if (_window.requestAnimationFrame) {\n return function (fn) {\n _window.requestAnimationFrame(fn);\n };\n } else if (_window.mozRequestAnimationFrame) {\n return function (fn) {\n _window.mozRequestAnimationFrame(fn);\n };\n } else if (_window.webkitRequestAnimationFrame) {\n return function (fn) {\n _window.webkitRequestAnimationFrame(fn);\n };\n } else if (_window.msRequestAnimationFrame) {\n return function (fn) {\n _window.msRequestAnimationFrame(fn);\n };\n }\n }\n return function (fn) {\n if (fn) {\n setTimeout(function () {\n fn(pnow());\n }, 1000 / 60);\n }\n };\n}();\nvar requestAnimationFrame = function requestAnimationFrame(fn) {\n return raf(fn);\n};\nvar performanceNow = pnow;\n\nvar DEFAULT_HASH_SEED = 9261;\nvar K = 65599; // 37 also works pretty well\nvar DEFAULT_HASH_SEED_ALT = 5381;\nvar hashIterableInts = function hashIterableInts(iterator) {\n var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED;\n // sdbm/string-hash\n var hash = seed;\n var entry;\n for (;;) {\n entry = iterator.next();\n if (entry.done) {\n break;\n }\n hash = hash * K + entry.value | 0;\n }\n return hash;\n};\nvar hashInt = function hashInt(num) {\n var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED;\n // sdbm/string-hash\n return seed * K + num | 0;\n};\nvar hashIntAlt = function hashIntAlt(num) {\n var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED_ALT;\n // djb2/string-hash\n return (seed << 5) + seed + num | 0;\n};\nvar combineHashes = function combineHashes(hash1, hash2) {\n return hash1 * 0x200000 + hash2;\n};\nvar combineHashesArray = function combineHashesArray(hashes) {\n return hashes[0] * 0x200000 + hashes[1];\n};\nvar hashArrays = function hashArrays(hashes1, hashes2) {\n return [hashInt(hashes1[0], hashes2[0]), hashIntAlt(hashes1[1], hashes2[1])];\n};\nvar hashIntsArray = function hashIntsArray(ints, seed) {\n var entry = {\n value: 0,\n done: false\n };\n var i = 0;\n var length = ints.length;\n var iterator = {\n next: function next() {\n if (i < length) {\n entry.value = ints[i++];\n } else {\n entry.done = true;\n }\n return entry;\n }\n };\n return hashIterableInts(iterator, seed);\n};\nvar hashString = function hashString(str, seed) {\n var entry = {\n value: 0,\n done: false\n };\n var i = 0;\n var length = str.length;\n var iterator = {\n next: function next() {\n if (i < length) {\n entry.value = str.charCodeAt(i++);\n } else {\n entry.done = true;\n }\n return entry;\n }\n };\n return hashIterableInts(iterator, seed);\n};\nvar hashStrings = function hashStrings() {\n return hashStringsArray(arguments);\n};\nvar hashStringsArray = function hashStringsArray(strs) {\n var hash;\n for (var i = 0; i < strs.length; i++) {\n var str = strs[i];\n if (i === 0) {\n hash = hashString(str);\n } else {\n hash = hashString(str, hash);\n }\n }\n return hash;\n};\n\nfunction rotatePoint(x, y, centerX, centerY, angleDegrees) {\n var angleRadians = angleDegrees * Math.PI / 180;\n var rotatedX = Math.cos(angleRadians) * (x - centerX) - Math.sin(angleRadians) * (y - centerY) + centerX;\n var rotatedY = Math.sin(angleRadians) * (x - centerX) + Math.cos(angleRadians) * (y - centerY) + centerY;\n return {\n x: rotatedX,\n y: rotatedY\n };\n}\nvar movePointByBoxAspect = function movePointByBoxAspect(x, y, boxX, boxY, skewX, skewY) {\n return {\n x: (x - boxX) * skewX + boxX,\n y: (y - boxY) * skewY + boxY\n };\n};\nfunction rotatePosAndSkewByBox(pos, box, angleDegrees) {\n if (angleDegrees === 0) return pos;\n var centerX = (box.x1 + box.x2) / 2;\n var centerY = (box.y1 + box.y2) / 2;\n var skewX = box.w / box.h;\n var skewY = 1 / skewX;\n var rotated = rotatePoint(pos.x, pos.y, centerX, centerY, angleDegrees);\n var skewed = movePointByBoxAspect(rotated.x, rotated.y, centerX, centerY, skewX, skewY);\n return {\n x: skewed.x,\n y: skewed.y\n };\n}\n\nvar warningsEnabled = true;\nvar warnSupported = console.warn != null;\nvar traceSupported = console.trace != null;\nvar MAX_INT$1 = Number.MAX_SAFE_INTEGER || 9007199254740991;\nvar trueify = function trueify() {\n return true;\n};\nvar falsify = function falsify() {\n return false;\n};\nvar zeroify = function zeroify() {\n return 0;\n};\nvar noop$1 = function noop() {};\nvar error = function error(msg) {\n throw new Error(msg);\n};\nvar warnings = function warnings(enabled) {\n if (enabled !== undefined) {\n warningsEnabled = !!enabled;\n } else {\n return warningsEnabled;\n }\n};\nvar warn = function warn(msg) {\n if (!warnings()) {\n return;\n }\n if (warnSupported) {\n console.warn(msg);\n } else {\n console.log(msg);\n if (traceSupported) {\n console.trace();\n }\n }\n};\nvar clone = function clone(obj) {\n return extend({}, obj);\n};\n\n// gets a shallow copy of the argument\nvar copy = function copy(obj) {\n if (obj == null) {\n return obj;\n }\n if (array(obj)) {\n return obj.slice();\n } else if (plainObject(obj)) {\n return clone(obj);\n } else {\n return obj;\n }\n};\nvar copyArray = function copyArray(arr) {\n return arr.slice();\n};\nvar uuid = function uuid(a, b /* placeholders */) {\n for (\n // loop :)\n b = a = '';\n // b - result , a - numeric letiable\n a++ < 36;\n //\n b += a * 51 & 52 // if \"a\" is not 9 or 14 or 19 or 24\n ?\n // return a random number or 4\n (a ^ 15 // if \"a\" is not 15\n ?\n // generate a random number from 0 to 15\n 8 ^ Math.random() * (a ^ 20 ? 16 : 4) // unless \"a\" is 20, in which case a random number from 8 to 11\n : 4 // otherwise 4\n ).toString(16) : '-' // in other cases (if \"a\" is 9,14,19,24) insert \"-\"\n );\n return b;\n};\nvar _staticEmptyObject = {};\nvar staticEmptyObject = function staticEmptyObject() {\n return _staticEmptyObject;\n};\nvar defaults$g = function defaults(_defaults) {\n var keys = Object.keys(_defaults);\n return function (opts) {\n var filledOpts = {};\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var optVal = opts == null ? undefined : opts[key];\n filledOpts[key] = optVal === undefined ? _defaults[key] : optVal;\n }\n return filledOpts;\n };\n};\nvar removeFromArray = function removeFromArray(arr, ele, oneCopy) {\n for (var i = arr.length - 1; i >= 0; i--) {\n if (arr[i] === ele) {\n arr.splice(i, 1);\n }\n }\n};\nvar clearArray = function clearArray(arr) {\n arr.splice(0, arr.length);\n};\nvar push = function push(arr, otherArr) {\n for (var i = 0; i < otherArr.length; i++) {\n var el = otherArr[i];\n arr.push(el);\n }\n};\nvar getPrefixedProperty = function getPrefixedProperty(obj, propName, prefix) {\n if (prefix) {\n propName = prependCamel(prefix, propName); // e.g. (labelWidth, source) => sourceLabelWidth\n }\n return obj[propName];\n};\nvar setPrefixedProperty = function setPrefixedProperty(obj, propName, prefix, value) {\n if (prefix) {\n propName = prependCamel(prefix, propName); // e.g. (labelWidth, source) => sourceLabelWidth\n }\n obj[propName] = value;\n};\n\n/* global Map */\nvar ObjectMap = /*#__PURE__*/function () {\n function ObjectMap() {\n _classCallCheck(this, ObjectMap);\n this._obj = {};\n }\n return _createClass(ObjectMap, [{\n key: \"set\",\n value: function set(key, val) {\n this._obj[key] = val;\n return this;\n }\n }, {\n key: \"delete\",\n value: function _delete(key) {\n this._obj[key] = undefined;\n return this;\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this._obj = {};\n }\n }, {\n key: \"has\",\n value: function has(key) {\n return this._obj[key] !== undefined;\n }\n }, {\n key: \"get\",\n value: function get(key) {\n return this._obj[key];\n }\n }]);\n}();\nvar Map$1 = typeof Map !== 'undefined' ? Map : ObjectMap;\n\n/* global Set */\n\nvar undef = \"undefined\" ;\nvar ObjectSet = /*#__PURE__*/function () {\n function ObjectSet(arrayOrObjectSet) {\n _classCallCheck(this, ObjectSet);\n this._obj = Object.create(null);\n this.size = 0;\n if (arrayOrObjectSet != null) {\n var arr;\n if (arrayOrObjectSet.instanceString != null && arrayOrObjectSet.instanceString() === this.instanceString()) {\n arr = arrayOrObjectSet.toArray();\n } else {\n arr = arrayOrObjectSet;\n }\n for (var i = 0; i < arr.length; i++) {\n this.add(arr[i]);\n }\n }\n }\n return _createClass(ObjectSet, [{\n key: \"instanceString\",\n value: function instanceString() {\n return 'set';\n }\n }, {\n key: \"add\",\n value: function add(val) {\n var o = this._obj;\n if (o[val] !== 1) {\n o[val] = 1;\n this.size++;\n }\n }\n }, {\n key: \"delete\",\n value: function _delete(val) {\n var o = this._obj;\n if (o[val] === 1) {\n o[val] = 0;\n this.size--;\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this._obj = Object.create(null);\n }\n }, {\n key: \"has\",\n value: function has(val) {\n return this._obj[val] === 1;\n }\n }, {\n key: \"toArray\",\n value: function toArray() {\n var _this = this;\n return Object.keys(this._obj).filter(function (key) {\n return _this.has(key);\n });\n }\n }, {\n key: \"forEach\",\n value: function forEach(callback, thisArg) {\n return this.toArray().forEach(callback, thisArg);\n }\n }]);\n}();\nvar Set$1 = (typeof Set === \"undefined\" ? \"undefined\" : _typeof(Set)) !== undef ? Set : ObjectSet;\n\n// represents a node or an edge\nvar Element = function Element(cy, params) {\n var restore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n if (cy === undefined || params === undefined || !core(cy)) {\n error('An element must have a core reference and parameters set');\n return;\n }\n var group = params.group;\n\n // try to automatically infer the group if unspecified\n if (group == null) {\n if (params.data && params.data.source != null && params.data.target != null) {\n group = 'edges';\n } else {\n group = 'nodes';\n }\n }\n\n // validate group\n if (group !== 'nodes' && group !== 'edges') {\n error('An element must be of type `nodes` or `edges`; you specified `' + group + '`');\n return;\n }\n\n // make the element array-like, just like a collection\n this.length = 1;\n this[0] = this;\n\n // NOTE: when something is added here, add also to ele.json()\n var _p = this._private = {\n cy: cy,\n single: true,\n // indicates this is an element\n data: params.data || {},\n // data object\n position: params.position || {\n x: 0,\n y: 0\n },\n // (x, y) position pair\n autoWidth: undefined,\n // width and height of nodes calculated by the renderer when set to special 'auto' value\n autoHeight: undefined,\n autoPadding: undefined,\n compoundBoundsClean: false,\n // whether the compound dimensions need to be recalculated the next time dimensions are read\n listeners: [],\n // array of bound listeners\n group: group,\n // string; 'nodes' or 'edges'\n style: {},\n // properties as set by the style\n rstyle: {},\n // properties for style sent from the renderer to the core\n styleCxts: [],\n // applied style contexts from the styler\n styleKeys: {},\n // per-group keys of style property values\n removed: true,\n // whether it's inside the vis; true if removed (set true here since we call restore)\n selected: params.selected ? true : false,\n // whether it's selected\n selectable: params.selectable === undefined ? true : params.selectable ? true : false,\n // whether it's selectable\n locked: params.locked ? true : false,\n // whether the element is locked (cannot be moved)\n grabbed: false,\n // whether the element is grabbed by the mouse; renderer sets this privately\n grabbable: params.grabbable === undefined ? true : params.grabbable ? true : false,\n // whether the element can be grabbed\n pannable: params.pannable === undefined ? group === 'edges' ? true : false : params.pannable ? true : false,\n // whether the element has passthrough panning enabled\n active: false,\n // whether the element is active from user interaction\n classes: new Set$1(),\n // map ( className => true )\n animation: {\n // object for currently-running animations\n current: [],\n queue: []\n },\n rscratch: {},\n // object in which the renderer can store information\n scratch: params.scratch || {},\n // scratch objects\n edges: [],\n // array of connected edges\n children: [],\n // array of children\n parent: params.parent && params.parent.isNode() ? params.parent : null,\n // parent ref\n traversalCache: {},\n // cache of output of traversal functions\n backgrounding: false,\n // whether background images are loading\n bbCache: null,\n // cache of the current bounding box\n bbCacheShift: {\n x: 0,\n y: 0\n },\n // shift applied to cached bb to be applied on next get\n bodyBounds: null,\n // bounds cache of element body, w/o overlay\n overlayBounds: null,\n // bounds cache of element body, including overlay\n labelBounds: {\n // bounds cache of labels\n all: null,\n source: null,\n target: null,\n main: null\n },\n arrowBounds: {\n // bounds cache of edge arrows\n source: null,\n target: null,\n 'mid-source': null,\n 'mid-target': null\n }\n };\n if (_p.position.x == null) {\n _p.position.x = 0;\n }\n if (_p.position.y == null) {\n _p.position.y = 0;\n }\n\n // renderedPosition overrides if specified\n if (params.renderedPosition) {\n var rpos = params.renderedPosition;\n var pan = cy.pan();\n var zoom = cy.zoom();\n _p.position = {\n x: (rpos.x - pan.x) / zoom,\n y: (rpos.y - pan.y) / zoom\n };\n }\n var classes = [];\n if (array(params.classes)) {\n classes = params.classes;\n } else if (string(params.classes)) {\n classes = params.classes.split(/\\s+/);\n }\n for (var i = 0, l = classes.length; i < l; i++) {\n var cls = classes[i];\n if (!cls || cls === '') {\n continue;\n }\n _p.classes.add(cls);\n }\n this.createEmitter();\n if (restore === undefined || restore) {\n this.restore();\n }\n var bypass = params.style || params.css;\n if (bypass) {\n warn('Setting a `style` bypass at element creation should be done only when absolutely necessary. Try to use the stylesheet instead.');\n this.style(bypass);\n }\n};\n\nvar defineSearch = function defineSearch(params) {\n params = {\n bfs: params.bfs || !params.dfs,\n dfs: params.dfs || !params.bfs\n };\n\n // from pseudocode on wikipedia\n return function searchFn(roots, fn, directed) {\n var options;\n if (plainObject(roots) && !elementOrCollection(roots)) {\n options = roots;\n roots = options.roots || options.root;\n fn = options.visit;\n directed = options.directed;\n }\n directed = arguments.length === 2 && !fn$6(fn) ? fn : directed;\n fn = fn$6(fn) ? fn : function () {};\n var cy = this._private.cy;\n var v = roots = string(roots) ? this.filter(roots) : roots;\n var Q = [];\n var connectedNodes = [];\n var connectedBy = {};\n var id2depth = {};\n var V = {};\n var j = 0;\n var found;\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges;\n\n // enqueue v\n for (var i = 0; i < v.length; i++) {\n var vi = v[i];\n var viId = vi.id();\n if (vi.isNode()) {\n Q.unshift(vi);\n if (params.bfs) {\n V[viId] = true;\n connectedNodes.push(vi);\n }\n id2depth[viId] = 0;\n }\n }\n var _loop = function _loop() {\n var v = params.bfs ? Q.shift() : Q.pop();\n var vId = v.id();\n if (params.dfs) {\n if (V[vId]) {\n return 0; // continue\n }\n V[vId] = true;\n connectedNodes.push(v);\n }\n var depth = id2depth[vId];\n var prevEdge = connectedBy[vId];\n var src = prevEdge != null ? prevEdge.source() : null;\n var tgt = prevEdge != null ? prevEdge.target() : null;\n var prevNode = prevEdge == null ? undefined : v.same(src) ? tgt[0] : src[0];\n var ret;\n ret = fn(v, prevEdge, prevNode, j++, depth);\n if (ret === true) {\n found = v;\n return 1; // break\n }\n if (ret === false) {\n return 1; // break\n }\n var vwEdges = v.connectedEdges().filter(function (e) {\n return (!directed || e.source().same(v)) && edges.has(e);\n });\n for (var _i2 = 0; _i2 < vwEdges.length; _i2++) {\n var e = vwEdges[_i2];\n var w = e.connectedNodes().filter(function (n) {\n return !n.same(v) && nodes.has(n);\n });\n var wId = w.id();\n if (w.length !== 0 && !V[wId]) {\n w = w[0];\n Q.push(w);\n if (params.bfs) {\n V[wId] = true;\n connectedNodes.push(w);\n }\n connectedBy[wId] = e;\n id2depth[wId] = id2depth[vId] + 1;\n }\n }\n },\n _ret;\n while (Q.length !== 0) {\n _ret = _loop();\n if (_ret === 0) continue;\n if (_ret === 1) break;\n }\n var connectedEles = cy.collection();\n for (var _i = 0; _i < connectedNodes.length; _i++) {\n var node = connectedNodes[_i];\n var edge = connectedBy[node.id()];\n if (edge != null) {\n connectedEles.push(edge);\n }\n connectedEles.push(node);\n }\n return {\n path: cy.collection(connectedEles),\n found: cy.collection(found)\n };\n };\n};\n\n// search, spanning trees, etc\nvar elesfn$v = {\n breadthFirstSearch: defineSearch({\n bfs: true\n }),\n depthFirstSearch: defineSearch({\n dfs: true\n })\n};\n\n// nice, short mathematical alias\nelesfn$v.bfs = elesfn$v.breadthFirstSearch;\nelesfn$v.dfs = elesfn$v.depthFirstSearch;\n\nvar heap$2 = {exports: {}};\n\nvar heap$1 = heap$2.exports;\n\nvar hasRequiredHeap$1;\n\nfunction requireHeap$1 () {\n\tif (hasRequiredHeap$1) return heap$2.exports;\n\thasRequiredHeap$1 = 1;\n\t(function (module, exports) {\n\t\t// Generated by CoffeeScript 1.8.0\n\t\t(function() {\n\t\t var Heap, defaultCmp, floor, heapify, heappop, heappush, heappushpop, heapreplace, insort, min, nlargest, nsmallest, updateItem, _siftdown, _siftup;\n\n\t\t floor = Math.floor, min = Math.min;\n\n\n\t\t /*\n\t\t Default comparison function to be used\n\t\t */\n\n\t\t defaultCmp = function(x, y) {\n\t\t if (x < y) {\n\t\t return -1;\n\t\t }\n\t\t if (x > y) {\n\t\t return 1;\n\t\t }\n\t\t return 0;\n\t\t };\n\n\n\t\t /*\n\t\t Insert item x in list a, and keep it sorted assuming a is sorted.\n\t\t \n\t\t If x is already in a, insert it to the right of the rightmost x.\n\t\t \n\t\t Optional args lo (default 0) and hi (default a.length) bound the slice\n\t\t of a to be searched.\n\t\t */\n\n\t\t insort = function(a, x, lo, hi, cmp) {\n\t\t var mid;\n\t\t if (lo == null) {\n\t\t lo = 0;\n\t\t }\n\t\t if (cmp == null) {\n\t\t cmp = defaultCmp;\n\t\t }\n\t\t if (lo < 0) {\n\t\t throw new Error('lo must be non-negative');\n\t\t }\n\t\t if (hi == null) {\n\t\t hi = a.length;\n\t\t }\n\t\t while (lo < hi) {\n\t\t mid = floor((lo + hi) / 2);\n\t\t if (cmp(x, a[mid]) < 0) {\n\t\t hi = mid;\n\t\t } else {\n\t\t lo = mid + 1;\n\t\t }\n\t\t }\n\t\t return ([].splice.apply(a, [lo, lo - lo].concat(x)), x);\n\t\t };\n\n\n\t\t /*\n\t\t Push item onto heap, maintaining the heap invariant.\n\t\t */\n\n\t\t heappush = function(array, item, cmp) {\n\t\t if (cmp == null) {\n\t\t cmp = defaultCmp;\n\t\t }\n\t\t array.push(item);\n\t\t return _siftdown(array, 0, array.length - 1, cmp);\n\t\t };\n\n\n\t\t /*\n\t\t Pop the smallest item off the heap, maintaining the heap invariant.\n\t\t */\n\n\t\t heappop = function(array, cmp) {\n\t\t var lastelt, returnitem;\n\t\t if (cmp == null) {\n\t\t cmp = defaultCmp;\n\t\t }\n\t\t lastelt = array.pop();\n\t\t if (array.length) {\n\t\t returnitem = array[0];\n\t\t array[0] = lastelt;\n\t\t _siftup(array, 0, cmp);\n\t\t } else {\n\t\t returnitem = lastelt;\n\t\t }\n\t\t return returnitem;\n\t\t };\n\n\n\t\t /*\n\t\t Pop and return the current smallest value, and add the new item.\n\t\t \n\t\t This is more efficient than heappop() followed by heappush(), and can be\n\t\t more appropriate when using a fixed size heap. Note that the value\n\t\t returned may be larger than item! That constrains reasonable use of\n\t\t this routine unless written as part of a conditional replacement:\n\t\t if item > array[0]\n\t\t item = heapreplace(array, item)\n\t\t */\n\n\t\t heapreplace = function(array, item, cmp) {\n\t\t var returnitem;\n\t\t if (cmp == null) {\n\t\t cmp = defaultCmp;\n\t\t }\n\t\t returnitem = array[0];\n\t\t array[0] = item;\n\t\t _siftup(array, 0, cmp);\n\t\t return returnitem;\n\t\t };\n\n\n\t\t /*\n\t\t Fast version of a heappush followed by a heappop.\n\t\t */\n\n\t\t heappushpop = function(array, item, cmp) {\n\t\t var _ref;\n\t\t if (cmp == null) {\n\t\t cmp = defaultCmp;\n\t\t }\n\t\t if (array.length && cmp(array[0], item) < 0) {\n\t\t _ref = [array[0], item], item = _ref[0], array[0] = _ref[1];\n\t\t _siftup(array, 0, cmp);\n\t\t }\n\t\t return item;\n\t\t };\n\n\n\t\t /*\n\t\t Transform list into a heap, in-place, in O(array.length) time.\n\t\t */\n\n\t\t heapify = function(array, cmp) {\n\t\t var i, _i, _len, _ref1, _results, _results1;\n\t\t if (cmp == null) {\n\t\t cmp = defaultCmp;\n\t\t }\n\t\t _ref1 = (function() {\n\t\t _results1 = [];\n\t\t for (var _j = 0, _ref = floor(array.length / 2); 0 <= _ref ? _j < _ref : _j > _ref; 0 <= _ref ? _j++ : _j--){ _results1.push(_j); }\n\t\t return _results1;\n\t\t }).apply(this).reverse();\n\t\t _results = [];\n\t\t for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n\t\t i = _ref1[_i];\n\t\t _results.push(_siftup(array, i, cmp));\n\t\t }\n\t\t return _results;\n\t\t };\n\n\n\t\t /*\n\t\t Update the position of the given item in the heap.\n\t\t This function should be called every time the item is being modified.\n\t\t */\n\n\t\t updateItem = function(array, item, cmp) {\n\t\t var pos;\n\t\t if (cmp == null) {\n\t\t cmp = defaultCmp;\n\t\t }\n\t\t pos = array.indexOf(item);\n\t\t if (pos === -1) {\n\t\t return;\n\t\t }\n\t\t _siftdown(array, 0, pos, cmp);\n\t\t return _siftup(array, pos, cmp);\n\t\t };\n\n\n\t\t /*\n\t\t Find the n largest elements in a dataset.\n\t\t */\n\n\t\t nlargest = function(array, n, cmp) {\n\t\t var elem, result, _i, _len, _ref;\n\t\t if (cmp == null) {\n\t\t cmp = defaultCmp;\n\t\t }\n\t\t result = array.slice(0, n);\n\t\t if (!result.length) {\n\t\t return result;\n\t\t }\n\t\t heapify(result, cmp);\n\t\t _ref = array.slice(n);\n\t\t for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\t\t elem = _ref[_i];\n\t\t heappushpop(result, elem, cmp);\n\t\t }\n\t\t return result.sort(cmp).reverse();\n\t\t };\n\n\n\t\t /*\n\t\t Find the n smallest elements in a dataset.\n\t\t */\n\n\t\t nsmallest = function(array, n, cmp) {\n\t\t var elem, los, result, _i, _j, _len, _ref, _ref1, _results;\n\t\t if (cmp == null) {\n\t\t cmp = defaultCmp;\n\t\t }\n\t\t if (n * 10 <= array.length) {\n\t\t result = array.slice(0, n).sort(cmp);\n\t\t if (!result.length) {\n\t\t return result;\n\t\t }\n\t\t los = result[result.length - 1];\n\t\t _ref = array.slice(n);\n\t\t for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\t\t elem = _ref[_i];\n\t\t if (cmp(elem, los) < 0) {\n\t\t insort(result, elem, 0, null, cmp);\n\t\t result.pop();\n\t\t los = result[result.length - 1];\n\t\t }\n\t\t }\n\t\t return result;\n\t\t }\n\t\t heapify(array, cmp);\n\t\t _results = [];\n\t\t for (_j = 0, _ref1 = min(n, array.length); 0 <= _ref1 ? _j < _ref1 : _j > _ref1; 0 <= _ref1 ? ++_j : --_j) {\n\t\t _results.push(heappop(array, cmp));\n\t\t }\n\t\t return _results;\n\t\t };\n\n\t\t _siftdown = function(array, startpos, pos, cmp) {\n\t\t var newitem, parent, parentpos;\n\t\t if (cmp == null) {\n\t\t cmp = defaultCmp;\n\t\t }\n\t\t newitem = array[pos];\n\t\t while (pos > startpos) {\n\t\t parentpos = (pos - 1) >> 1;\n\t\t parent = array[parentpos];\n\t\t if (cmp(newitem, parent) < 0) {\n\t\t array[pos] = parent;\n\t\t pos = parentpos;\n\t\t continue;\n\t\t }\n\t\t break;\n\t\t }\n\t\t return array[pos] = newitem;\n\t\t };\n\n\t\t _siftup = function(array, pos, cmp) {\n\t\t var childpos, endpos, newitem, rightpos, startpos;\n\t\t if (cmp == null) {\n\t\t cmp = defaultCmp;\n\t\t }\n\t\t endpos = array.length;\n\t\t startpos = pos;\n\t\t newitem = array[pos];\n\t\t childpos = 2 * pos + 1;\n\t\t while (childpos < endpos) {\n\t\t rightpos = childpos + 1;\n\t\t if (rightpos < endpos && !(cmp(array[childpos], array[rightpos]) < 0)) {\n\t\t childpos = rightpos;\n\t\t }\n\t\t array[pos] = array[childpos];\n\t\t pos = childpos;\n\t\t childpos = 2 * pos + 1;\n\t\t }\n\t\t array[pos] = newitem;\n\t\t return _siftdown(array, startpos, pos, cmp);\n\t\t };\n\n\t\t Heap = (function() {\n\t\t Heap.push = heappush;\n\n\t\t Heap.pop = heappop;\n\n\t\t Heap.replace = heapreplace;\n\n\t\t Heap.pushpop = heappushpop;\n\n\t\t Heap.heapify = heapify;\n\n\t\t Heap.updateItem = updateItem;\n\n\t\t Heap.nlargest = nlargest;\n\n\t\t Heap.nsmallest = nsmallest;\n\n\t\t function Heap(cmp) {\n\t\t this.cmp = cmp != null ? cmp : defaultCmp;\n\t\t this.nodes = [];\n\t\t }\n\n\t\t Heap.prototype.push = function(x) {\n\t\t return heappush(this.nodes, x, this.cmp);\n\t\t };\n\n\t\t Heap.prototype.pop = function() {\n\t\t return heappop(this.nodes, this.cmp);\n\t\t };\n\n\t\t Heap.prototype.peek = function() {\n\t\t return this.nodes[0];\n\t\t };\n\n\t\t Heap.prototype.contains = function(x) {\n\t\t return this.nodes.indexOf(x) !== -1;\n\t\t };\n\n\t\t Heap.prototype.replace = function(x) {\n\t\t return heapreplace(this.nodes, x, this.cmp);\n\t\t };\n\n\t\t Heap.prototype.pushpop = function(x) {\n\t\t return heappushpop(this.nodes, x, this.cmp);\n\t\t };\n\n\t\t Heap.prototype.heapify = function() {\n\t\t return heapify(this.nodes, this.cmp);\n\t\t };\n\n\t\t Heap.prototype.updateItem = function(x) {\n\t\t return updateItem(this.nodes, x, this.cmp);\n\t\t };\n\n\t\t Heap.prototype.clear = function() {\n\t\t return this.nodes = [];\n\t\t };\n\n\t\t Heap.prototype.empty = function() {\n\t\t return this.nodes.length === 0;\n\t\t };\n\n\t\t Heap.prototype.size = function() {\n\t\t return this.nodes.length;\n\t\t };\n\n\t\t Heap.prototype.clone = function() {\n\t\t var heap;\n\t\t heap = new Heap();\n\t\t heap.nodes = this.nodes.slice(0);\n\t\t return heap;\n\t\t };\n\n\t\t Heap.prototype.toArray = function() {\n\t\t return this.nodes.slice(0);\n\t\t };\n\n\t\t Heap.prototype.insert = Heap.prototype.push;\n\n\t\t Heap.prototype.top = Heap.prototype.peek;\n\n\t\t Heap.prototype.front = Heap.prototype.peek;\n\n\t\t Heap.prototype.has = Heap.prototype.contains;\n\n\t\t Heap.prototype.copy = Heap.prototype.clone;\n\n\t\t return Heap;\n\n\t\t })();\n\n\t\t (function(root, factory) {\n\t\t {\n\t\t return module.exports = factory();\n\t\t }\n\t\t })(this, function() {\n\t\t return Heap;\n\t\t });\n\n\t\t}).call(heap$1); \n\t} (heap$2));\n\treturn heap$2.exports;\n}\n\nvar heap;\nvar hasRequiredHeap;\n\nfunction requireHeap () {\n\tif (hasRequiredHeap) return heap;\n\thasRequiredHeap = 1;\n\theap = requireHeap$1();\n\treturn heap;\n}\n\nvar heapExports = requireHeap();\nvar Heap = /*@__PURE__*/getDefaultExportFromCjs(heapExports);\n\nvar dijkstraDefaults = defaults$g({\n root: null,\n weight: function weight(edge) {\n return 1;\n },\n directed: false\n});\nvar elesfn$u = {\n dijkstra: function dijkstra(options) {\n if (!plainObject(options)) {\n var args = arguments;\n options = {\n root: args[0],\n weight: args[1],\n directed: args[2]\n };\n }\n var _dijkstraDefaults = dijkstraDefaults(options),\n root = _dijkstraDefaults.root,\n weight = _dijkstraDefaults.weight,\n directed = _dijkstraDefaults.directed;\n var eles = this;\n var weightFn = weight;\n var source = string(root) ? this.filter(root)[0] : root[0];\n var dist = {};\n var prev = {};\n var knownDist = {};\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges;\n edges.unmergeBy(function (ele) {\n return ele.isLoop();\n });\n var getDist = function getDist(node) {\n return dist[node.id()];\n };\n var setDist = function setDist(node, d) {\n dist[node.id()] = d;\n Q.updateItem(node);\n };\n var Q = new Heap(function (a, b) {\n return getDist(a) - getDist(b);\n });\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n dist[node.id()] = node.same(source) ? 0 : Infinity;\n Q.push(node);\n }\n var distBetween = function distBetween(u, v) {\n var uvs = (directed ? u.edgesTo(v) : u.edgesWith(v)).intersect(edges);\n var smallestDistance = Infinity;\n var smallestEdge;\n for (var _i = 0; _i < uvs.length; _i++) {\n var edge = uvs[_i];\n var _weight = weightFn(edge);\n if (_weight < smallestDistance || !smallestEdge) {\n smallestDistance = _weight;\n smallestEdge = edge;\n }\n }\n return {\n edge: smallestEdge,\n dist: smallestDistance\n };\n };\n while (Q.size() > 0) {\n var u = Q.pop();\n var smalletsDist = getDist(u);\n var uid = u.id();\n knownDist[uid] = smalletsDist;\n if (smalletsDist === Infinity) {\n continue;\n }\n var neighbors = u.neighborhood().intersect(nodes);\n for (var _i2 = 0; _i2 < neighbors.length; _i2++) {\n var v = neighbors[_i2];\n var vid = v.id();\n var vDist = distBetween(u, v);\n var alt = smalletsDist + vDist.dist;\n if (alt < getDist(v)) {\n setDist(v, alt);\n prev[vid] = {\n node: u,\n edge: vDist.edge\n };\n }\n } // for\n } // while\n\n return {\n distanceTo: function distanceTo(node) {\n var target = string(node) ? nodes.filter(node)[0] : node[0];\n return knownDist[target.id()];\n },\n pathTo: function pathTo(node) {\n var target = string(node) ? nodes.filter(node)[0] : node[0];\n var S = [];\n var u = target;\n var uid = u.id();\n if (target.length > 0) {\n S.unshift(target);\n while (prev[uid]) {\n var p = prev[uid];\n S.unshift(p.edge);\n S.unshift(p.node);\n u = p.node;\n uid = u.id();\n }\n }\n return eles.spawn(S);\n }\n };\n }\n};\n\nvar elesfn$t = {\n // kruskal's algorithm (finds min spanning tree, assuming undirected graph)\n // implemented from pseudocode from wikipedia\n kruskal: function kruskal(weightFn) {\n weightFn = weightFn || function (edge) {\n return 1;\n };\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges;\n var numNodes = nodes.length;\n var forest = new Array(numNodes);\n var A = nodes; // assumes byGroup() creates new collections that can be safely mutated\n\n var findSetIndex = function findSetIndex(ele) {\n for (var i = 0; i < forest.length; i++) {\n var eles = forest[i];\n if (eles.has(ele)) {\n return i;\n }\n }\n };\n\n // start with one forest per node\n for (var i = 0; i < numNodes; i++) {\n forest[i] = this.spawn(nodes[i]);\n }\n var S = edges.sort(function (a, b) {\n return weightFn(a) - weightFn(b);\n });\n for (var _i = 0; _i < S.length; _i++) {\n var edge = S[_i];\n var u = edge.source()[0];\n var v = edge.target()[0];\n var setUIndex = findSetIndex(u);\n var setVIndex = findSetIndex(v);\n var setU = forest[setUIndex];\n var setV = forest[setVIndex];\n if (setUIndex !== setVIndex) {\n A.merge(edge);\n\n // combine forests for u and v\n setU.merge(setV);\n forest.splice(setVIndex, 1);\n }\n }\n return A;\n }\n};\n\nvar aStarDefaults = defaults$g({\n root: null,\n goal: null,\n weight: function weight(edge) {\n return 1;\n },\n heuristic: function heuristic(edge) {\n return 0;\n },\n directed: false\n});\nvar elesfn$s = {\n // Implemented from pseudocode from wikipedia\n aStar: function aStar(options) {\n var cy = this.cy();\n var _aStarDefaults = aStarDefaults(options),\n root = _aStarDefaults.root,\n goal = _aStarDefaults.goal,\n heuristic = _aStarDefaults.heuristic,\n directed = _aStarDefaults.directed,\n weight = _aStarDefaults.weight;\n root = cy.collection(root)[0];\n goal = cy.collection(goal)[0];\n var sid = root.id();\n var tid = goal.id();\n var gScore = {};\n var fScore = {};\n var closedSetIds = {};\n var openSet = new Heap(function (a, b) {\n return fScore[a.id()] - fScore[b.id()];\n });\n var openSetIds = new Set$1();\n var cameFrom = {};\n var cameFromEdge = {};\n var addToOpenSet = function addToOpenSet(ele, id) {\n openSet.push(ele);\n openSetIds.add(id);\n };\n var cMin, cMinId;\n var popFromOpenSet = function popFromOpenSet() {\n cMin = openSet.pop();\n cMinId = cMin.id();\n openSetIds[\"delete\"](cMinId);\n };\n var isInOpenSet = function isInOpenSet(id) {\n return openSetIds.has(id);\n };\n addToOpenSet(root, sid);\n gScore[sid] = 0;\n fScore[sid] = heuristic(root);\n\n // Counter\n var steps = 0;\n\n // Main loop\n while (openSet.size() > 0) {\n popFromOpenSet();\n steps++;\n\n // If we've found our goal, then we are done\n if (cMinId === tid) {\n var path = [];\n var pathNode = goal;\n var pathNodeId = tid;\n var pathEdge = cameFromEdge[pathNodeId];\n for (;;) {\n path.unshift(pathNode);\n if (pathEdge != null) {\n path.unshift(pathEdge);\n }\n pathNode = cameFrom[pathNodeId];\n if (pathNode == null) {\n break;\n }\n pathNodeId = pathNode.id();\n pathEdge = cameFromEdge[pathNodeId];\n }\n return {\n found: true,\n distance: gScore[cMinId],\n path: this.spawn(path),\n steps: steps\n };\n }\n\n // Add cMin to processed nodes\n closedSetIds[cMinId] = true;\n\n // Update scores for neighbors of cMin\n // Take into account if graph is directed or not\n var vwEdges = cMin._private.edges;\n for (var i = 0; i < vwEdges.length; i++) {\n var e = vwEdges[i];\n\n // edge must be in set of calling eles\n if (!this.hasElementWithId(e.id())) {\n continue;\n }\n\n // cMin must be the source of edge if directed\n if (directed && e.data('source') !== cMinId) {\n continue;\n }\n var wSrc = e.source();\n var wTgt = e.target();\n var w = wSrc.id() !== cMinId ? wSrc : wTgt;\n var wid = w.id();\n\n // node must be in set of calling eles\n if (!this.hasElementWithId(wid)) {\n continue;\n }\n\n // if node is in closedSet, ignore it\n if (closedSetIds[wid]) {\n continue;\n }\n\n // New tentative score for node w\n var tempScore = gScore[cMinId] + weight(e);\n\n // Update gScore for node w if:\n // w not present in openSet\n // OR\n // tentative gScore is less than previous value\n\n // w not in openSet\n if (!isInOpenSet(wid)) {\n gScore[wid] = tempScore;\n fScore[wid] = tempScore + heuristic(w);\n addToOpenSet(w, wid);\n cameFrom[wid] = cMin;\n cameFromEdge[wid] = e;\n continue;\n }\n\n // w already in openSet, but with greater gScore\n if (tempScore < gScore[wid]) {\n gScore[wid] = tempScore;\n fScore[wid] = tempScore + heuristic(w);\n cameFrom[wid] = cMin;\n cameFromEdge[wid] = e;\n }\n } // End of neighbors update\n } // End of main loop\n\n // If we've reached here, then we've not reached our goal\n return {\n found: false,\n distance: undefined,\n path: undefined,\n steps: steps\n };\n }\n}; // elesfn\n\nvar floydWarshallDefaults = defaults$g({\n weight: function weight(edge) {\n return 1;\n },\n directed: false\n});\nvar elesfn$r = {\n // Implemented from pseudocode from wikipedia\n floydWarshall: function floydWarshall(options) {\n var cy = this.cy();\n var _floydWarshallDefault = floydWarshallDefaults(options),\n weight = _floydWarshallDefault.weight,\n directed = _floydWarshallDefault.directed;\n var weightFn = weight;\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges;\n var N = nodes.length;\n var Nsq = N * N;\n var indexOf = function indexOf(node) {\n return nodes.indexOf(node);\n };\n var atIndex = function atIndex(i) {\n return nodes[i];\n };\n\n // Initialize distance matrix\n var dist = new Array(Nsq);\n for (var n = 0; n < Nsq; n++) {\n var j = n % N;\n var i = (n - j) / N;\n if (i === j) {\n dist[n] = 0;\n } else {\n dist[n] = Infinity;\n }\n }\n\n // Initialize matrix used for path reconstruction\n // Initialize distance matrix\n var next = new Array(Nsq);\n var edgeNext = new Array(Nsq);\n\n // Process edges\n for (var _i = 0; _i < edges.length; _i++) {\n var edge = edges[_i];\n var src = edge.source()[0];\n var tgt = edge.target()[0];\n if (src === tgt) {\n continue;\n } // exclude loops\n\n var s = indexOf(src);\n var t = indexOf(tgt);\n var st = s * N + t; // source to target index\n var _weight = weightFn(edge);\n\n // Check if already process another edge between same 2 nodes\n if (dist[st] > _weight) {\n dist[st] = _weight;\n next[st] = t;\n edgeNext[st] = edge;\n }\n\n // If undirected graph, process 'reversed' edge\n if (!directed) {\n var ts = t * N + s; // target to source index\n\n if (!directed && dist[ts] > _weight) {\n dist[ts] = _weight;\n next[ts] = s;\n edgeNext[ts] = edge;\n }\n }\n }\n\n // Main loop\n for (var k = 0; k < N; k++) {\n for (var _i2 = 0; _i2 < N; _i2++) {\n var ik = _i2 * N + k;\n for (var _j = 0; _j < N; _j++) {\n var ij = _i2 * N + _j;\n var kj = k * N + _j;\n if (dist[ik] + dist[kj] < dist[ij]) {\n dist[ij] = dist[ik] + dist[kj];\n next[ij] = next[ik];\n }\n }\n }\n }\n var getArgEle = function getArgEle(ele) {\n return (string(ele) ? cy.filter(ele) : ele)[0];\n };\n var indexOfArgEle = function indexOfArgEle(ele) {\n return indexOf(getArgEle(ele));\n };\n var res = {\n distance: function distance(from, to) {\n var i = indexOfArgEle(from);\n var j = indexOfArgEle(to);\n return dist[i * N + j];\n },\n path: function path(from, to) {\n var i = indexOfArgEle(from);\n var j = indexOfArgEle(to);\n var fromNode = atIndex(i);\n if (i === j) {\n return fromNode.collection();\n }\n if (next[i * N + j] == null) {\n return cy.collection();\n }\n var path = cy.collection();\n var prev = i;\n var edge;\n path.merge(fromNode);\n while (i !== j) {\n prev = i;\n i = next[i * N + j];\n edge = edgeNext[prev * N + i];\n path.merge(edge);\n path.merge(atIndex(i));\n }\n return path;\n }\n };\n return res;\n } // floydWarshall\n}; // elesfn\n\nvar bellmanFordDefaults = defaults$g({\n weight: function weight(edge) {\n return 1;\n },\n directed: false,\n root: null\n});\nvar elesfn$q = {\n // Implemented from pseudocode from wikipedia\n bellmanFord: function bellmanFord(options) {\n var _this = this;\n var _bellmanFordDefaults = bellmanFordDefaults(options),\n weight = _bellmanFordDefaults.weight,\n directed = _bellmanFordDefaults.directed,\n root = _bellmanFordDefaults.root;\n var weightFn = weight;\n var eles = this;\n var cy = this.cy();\n var _this$byGroup = this.byGroup(),\n edges = _this$byGroup.edges,\n nodes = _this$byGroup.nodes;\n var numNodes = nodes.length;\n var infoMap = new Map$1();\n var hasNegativeWeightCycle = false;\n var negativeWeightCycles = [];\n root = cy.collection(root)[0]; // in case selector passed\n\n edges.unmergeBy(function (edge) {\n return edge.isLoop();\n });\n var numEdges = edges.length;\n var getInfo = function getInfo(node) {\n var obj = infoMap.get(node.id());\n if (!obj) {\n obj = {};\n infoMap.set(node.id(), obj);\n }\n return obj;\n };\n var getNodeFromTo = function getNodeFromTo(to) {\n return (string(to) ? cy.$(to) : to)[0];\n };\n var distanceTo = function distanceTo(to) {\n return getInfo(getNodeFromTo(to)).dist;\n };\n var pathTo = function pathTo(to) {\n var thisStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : root;\n var end = getNodeFromTo(to);\n var path = [];\n var node = end;\n for (;;) {\n if (node == null) {\n return _this.spawn();\n }\n var _getInfo = getInfo(node),\n edge = _getInfo.edge,\n pred = _getInfo.pred;\n path.unshift(node[0]);\n if (node.same(thisStart) && path.length > 0) {\n break;\n }\n if (edge != null) {\n path.unshift(edge);\n }\n node = pred;\n }\n return eles.spawn(path);\n };\n\n // Initializations { dist, pred, edge }\n for (var i = 0; i < numNodes; i++) {\n var node = nodes[i];\n var info = getInfo(node);\n if (node.same(root)) {\n info.dist = 0;\n } else {\n info.dist = Infinity;\n }\n info.pred = null;\n info.edge = null;\n }\n\n // Edges relaxation\n var replacedEdge = false;\n var checkForEdgeReplacement = function checkForEdgeReplacement(node1, node2, edge, info1, info2, weight) {\n var dist = info1.dist + weight;\n if (dist < info2.dist && !edge.same(info1.edge)) {\n info2.dist = dist;\n info2.pred = node1;\n info2.edge = edge;\n replacedEdge = true;\n }\n };\n for (var _i = 1; _i < numNodes; _i++) {\n replacedEdge = false;\n for (var e = 0; e < numEdges; e++) {\n var edge = edges[e];\n var src = edge.source();\n var tgt = edge.target();\n var _weight = weightFn(edge);\n var srcInfo = getInfo(src);\n var tgtInfo = getInfo(tgt);\n checkForEdgeReplacement(src, tgt, edge, srcInfo, tgtInfo, _weight);\n\n // If undirected graph, we need to take into account the 'reverse' edge\n if (!directed) {\n checkForEdgeReplacement(tgt, src, edge, tgtInfo, srcInfo, _weight);\n }\n }\n if (!replacedEdge) {\n break;\n }\n }\n if (replacedEdge) {\n // Check for negative weight cycles\n var negativeWeightCycleIds = [];\n for (var _e = 0; _e < numEdges; _e++) {\n var _edge = edges[_e];\n var _src = _edge.source();\n var _tgt = _edge.target();\n var _weight2 = weightFn(_edge);\n var srcDist = getInfo(_src).dist;\n var tgtDist = getInfo(_tgt).dist;\n if (srcDist + _weight2 < tgtDist || !directed && tgtDist + _weight2 < srcDist) {\n if (!hasNegativeWeightCycle) {\n warn('Graph contains a negative weight cycle for Bellman-Ford');\n hasNegativeWeightCycle = true;\n }\n if (options.findNegativeWeightCycles !== false) {\n var negativeNodes = [];\n if (srcDist + _weight2 < tgtDist) {\n negativeNodes.push(_src);\n }\n if (!directed && tgtDist + _weight2 < srcDist) {\n negativeNodes.push(_tgt);\n }\n var numNegativeNodes = negativeNodes.length;\n for (var n = 0; n < numNegativeNodes; n++) {\n var start = negativeNodes[n];\n var cycle = [start];\n cycle.push(getInfo(start).edge);\n var _node = getInfo(start).pred;\n while (cycle.indexOf(_node) === -1) {\n cycle.push(_node);\n cycle.push(getInfo(_node).edge);\n _node = getInfo(_node).pred;\n }\n cycle = cycle.slice(cycle.indexOf(_node));\n var smallestId = cycle[0].id();\n var smallestIndex = 0;\n for (var c = 2; c < cycle.length; c += 2) {\n if (cycle[c].id() < smallestId) {\n smallestId = cycle[c].id();\n smallestIndex = c;\n }\n }\n cycle = cycle.slice(smallestIndex).concat(cycle.slice(0, smallestIndex));\n cycle.push(cycle[0]);\n var cycleId = cycle.map(function (el) {\n return el.id();\n }).join(\",\");\n if (negativeWeightCycleIds.indexOf(cycleId) === -1) {\n negativeWeightCycles.push(eles.spawn(cycle));\n negativeWeightCycleIds.push(cycleId);\n }\n }\n } else {\n break;\n }\n }\n }\n }\n return {\n distanceTo: distanceTo,\n pathTo: pathTo,\n hasNegativeWeightCycle: hasNegativeWeightCycle,\n negativeWeightCycles: negativeWeightCycles\n };\n } // bellmanFord\n}; // elesfn\n\nvar sqrt2 = Math.sqrt(2);\n\n// Function which colapses 2 (meta) nodes into one\n// Updates the remaining edge lists\n// Receives as a paramater the edge which causes the collapse\nvar collapse = function collapse(edgeIndex, nodeMap, remainingEdges) {\n if (remainingEdges.length === 0) {\n error(\"Karger-Stein must be run on a connected (sub)graph\");\n }\n var edgeInfo = remainingEdges[edgeIndex];\n var sourceIn = edgeInfo[1];\n var targetIn = edgeInfo[2];\n var partition1 = nodeMap[sourceIn];\n var partition2 = nodeMap[targetIn];\n var newEdges = remainingEdges; // re-use array\n\n // Delete all edges between partition1 and partition2\n for (var i = newEdges.length - 1; i >= 0; i--) {\n var edge = newEdges[i];\n var src = edge[1];\n var tgt = edge[2];\n if (nodeMap[src] === partition1 && nodeMap[tgt] === partition2 || nodeMap[src] === partition2 && nodeMap[tgt] === partition1) {\n newEdges.splice(i, 1);\n }\n }\n\n // All edges pointing to partition2 should now point to partition1\n for (var _i = 0; _i < newEdges.length; _i++) {\n var _edge = newEdges[_i];\n if (_edge[1] === partition2) {\n // Check source\n newEdges[_i] = _edge.slice(); // copy\n newEdges[_i][1] = partition1;\n } else if (_edge[2] === partition2) {\n // Check target\n newEdges[_i] = _edge.slice(); // copy\n newEdges[_i][2] = partition1;\n }\n }\n\n // Move all nodes from partition2 to partition1\n for (var _i2 = 0; _i2 < nodeMap.length; _i2++) {\n if (nodeMap[_i2] === partition2) {\n nodeMap[_i2] = partition1;\n }\n }\n return newEdges;\n};\n\n// Contracts a graph until we reach a certain number of meta nodes\nvar contractUntil = function contractUntil(metaNodeMap, remainingEdges, size, sizeLimit) {\n while (size > sizeLimit) {\n // Choose an edge randomly\n var edgeIndex = Math.floor(Math.random() * remainingEdges.length);\n\n // Collapse graph based on edge\n remainingEdges = collapse(edgeIndex, metaNodeMap, remainingEdges);\n size--;\n }\n return remainingEdges;\n};\nvar elesfn$p = {\n // Computes the minimum cut of an undirected graph\n // Returns the correct answer with high probability\n kargerStein: function kargerStein() {\n var _this = this;\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges;\n edges.unmergeBy(function (edge) {\n return edge.isLoop();\n });\n var numNodes = nodes.length;\n var numEdges = edges.length;\n var numIter = Math.ceil(Math.pow(Math.log(numNodes) / Math.LN2, 2));\n var stopSize = Math.floor(numNodes / sqrt2);\n if (numNodes < 2) {\n error('At least 2 nodes are required for Karger-Stein algorithm');\n return undefined;\n }\n\n // Now store edge destination as indexes\n // Format for each edge (edge index, source node index, target node index)\n var edgeIndexes = [];\n for (var i = 0; i < numEdges; i++) {\n var e = edges[i];\n edgeIndexes.push([i, nodes.indexOf(e.source()), nodes.indexOf(e.target())]);\n }\n\n // We will store the best cut found here\n var minCutSize = Infinity;\n var minCutEdgeIndexes = [];\n var minCutNodeMap = new Array(numNodes);\n\n // Initial meta node partition\n var metaNodeMap = new Array(numNodes);\n var metaNodeMap2 = new Array(numNodes);\n var copyNodesMap = function copyNodesMap(from, to) {\n for (var _i3 = 0; _i3 < numNodes; _i3++) {\n to[_i3] = from[_i3];\n }\n };\n\n // Main loop\n for (var iter = 0; iter <= numIter; iter++) {\n // Reset meta node partition\n for (var _i4 = 0; _i4 < numNodes; _i4++) {\n metaNodeMap[_i4] = _i4;\n }\n\n // Contract until stop point (stopSize nodes)\n var edgesState = contractUntil(metaNodeMap, edgeIndexes.slice(), numNodes, stopSize);\n var edgesState2 = edgesState.slice(); // copy\n\n // Create a copy of the colapsed nodes state\n copyNodesMap(metaNodeMap, metaNodeMap2);\n\n // Run 2 iterations starting in the stop state\n var res1 = contractUntil(metaNodeMap, edgesState, stopSize, 2);\n var res2 = contractUntil(metaNodeMap2, edgesState2, stopSize, 2);\n\n // Is any of the 2 results the best cut so far?\n if (res1.length <= res2.length && res1.length < minCutSize) {\n minCutSize = res1.length;\n minCutEdgeIndexes = res1;\n copyNodesMap(metaNodeMap, minCutNodeMap);\n } else if (res2.length <= res1.length && res2.length < minCutSize) {\n minCutSize = res2.length;\n minCutEdgeIndexes = res2;\n copyNodesMap(metaNodeMap2, minCutNodeMap);\n }\n } // end of main loop\n\n // Construct result\n var cut = this.spawn(minCutEdgeIndexes.map(function (e) {\n return edges[e[0]];\n }));\n var partition1 = this.spawn();\n var partition2 = this.spawn();\n\n // traverse metaNodeMap for best cut\n var witnessNodePartition = minCutNodeMap[0];\n for (var _i5 = 0; _i5 < minCutNodeMap.length; _i5++) {\n var partitionId = minCutNodeMap[_i5];\n var node = nodes[_i5];\n if (partitionId === witnessNodePartition) {\n partition1.merge(node);\n } else {\n partition2.merge(node);\n }\n }\n\n // construct components corresponding to each disjoint subset of nodes\n var constructComponent = function constructComponent(subset) {\n var component = _this.spawn();\n subset.forEach(function (node) {\n component.merge(node);\n node.connectedEdges().forEach(function (edge) {\n // ensure edge is within calling collection and edge is not in cut\n if (_this.contains(edge) && !cut.contains(edge)) {\n component.merge(edge);\n }\n });\n });\n return component;\n };\n var components = [constructComponent(partition1), constructComponent(partition2)];\n var ret = {\n cut: cut,\n components: components,\n // n.b. partitions are included to be compatible with the old api spec\n // (could be removed in a future major version)\n partition1: partition1,\n partition2: partition2\n };\n return ret;\n }\n}; // elesfn\n\nvar _Math$hypot;\nvar copyPosition = function copyPosition(p) {\n return {\n x: p.x,\n y: p.y\n };\n};\nvar modelToRenderedPosition$1 = function modelToRenderedPosition(p, zoom, pan) {\n return {\n x: p.x * zoom + pan.x,\n y: p.y * zoom + pan.y\n };\n};\nvar renderedToModelPosition = function renderedToModelPosition(p, zoom, pan) {\n return {\n x: (p.x - pan.x) / zoom,\n y: (p.y - pan.y) / zoom\n };\n};\nvar array2point = function array2point(arr) {\n return {\n x: arr[0],\n y: arr[1]\n };\n};\nvar min = function min(arr) {\n var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length;\n var min = Infinity;\n for (var i = begin; i < end; i++) {\n var val = arr[i];\n if (isFinite(val)) {\n min = Math.min(val, min);\n }\n }\n return min;\n};\nvar max = function max(arr) {\n var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length;\n var max = -Infinity;\n for (var i = begin; i < end; i++) {\n var val = arr[i];\n if (isFinite(val)) {\n max = Math.max(val, max);\n }\n }\n return max;\n};\nvar mean = function mean(arr) {\n var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length;\n var total = 0;\n var n = 0;\n for (var i = begin; i < end; i++) {\n var val = arr[i];\n if (isFinite(val)) {\n total += val;\n n++;\n }\n }\n return total / n;\n};\nvar median = function median(arr) {\n var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length;\n var copy = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var sort = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var includeHoles = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n if (copy) {\n arr = arr.slice(begin, end);\n } else {\n if (end < arr.length) {\n arr.splice(end, arr.length - end);\n }\n if (begin > 0) {\n arr.splice(0, begin);\n }\n }\n\n // all non finite (e.g. Infinity, NaN) elements must be -Infinity so they go to the start\n var off = 0; // offset from non-finite values\n for (var i = arr.length - 1; i >= 0; i--) {\n var v = arr[i];\n if (includeHoles) {\n if (!isFinite(v)) {\n arr[i] = -Infinity;\n off++;\n }\n } else {\n // just remove it if we don't want to consider holes\n arr.splice(i, 1);\n }\n }\n if (sort) {\n arr.sort(function (a, b) {\n return a - b;\n }); // requires copy = true if you don't want to change the orig\n }\n var len = arr.length;\n var mid = Math.floor(len / 2);\n if (len % 2 !== 0) {\n return arr[mid + 1 + off];\n } else {\n return (arr[mid - 1 + off] + arr[mid + off]) / 2;\n }\n};\nvar deg2rad = function deg2rad(deg) {\n return Math.PI * deg / 180;\n};\nvar getAngleFromDisp = function getAngleFromDisp(dispX, dispY) {\n return Math.atan2(dispY, dispX) - Math.PI / 2;\n};\nvar log2 = Math.log2 || function (n) {\n return Math.log(n) / Math.log(2);\n};\nvar signum = function signum(x) {\n if (x > 0) {\n return 1;\n } else if (x < 0) {\n return -1;\n } else {\n return 0;\n }\n};\nvar dist = function dist(p1, p2) {\n return Math.sqrt(sqdist(p1, p2));\n};\nvar sqdist = function sqdist(p1, p2) {\n var dx = p2.x - p1.x;\n var dy = p2.y - p1.y;\n return dx * dx + dy * dy;\n};\nvar inPlaceSumNormalize = function inPlaceSumNormalize(v) {\n var length = v.length;\n\n // First, get sum of all elements\n var total = 0;\n for (var i = 0; i < length; i++) {\n total += v[i];\n }\n\n // Now, divide each by the sum of all elements\n for (var _i = 0; _i < length; _i++) {\n v[_i] = v[_i] / total;\n }\n return v;\n};\n\n// from http://en.wikipedia.org/wiki/B\u00E9zier_curve#Quadratic_curves\nvar qbezierAt = function qbezierAt(p0, p1, p2, t) {\n return (1 - t) * (1 - t) * p0 + 2 * (1 - t) * t * p1 + t * t * p2;\n};\nvar qbezierPtAt = function qbezierPtAt(p0, p1, p2, t) {\n return {\n x: qbezierAt(p0.x, p1.x, p2.x, t),\n y: qbezierAt(p0.y, p1.y, p2.y, t)\n };\n};\nvar lineAt = function lineAt(p0, p1, t, d) {\n var vec = {\n x: p1.x - p0.x,\n y: p1.y - p0.y\n };\n var vecDist = dist(p0, p1);\n var normVec = {\n x: vec.x / vecDist,\n y: vec.y / vecDist\n };\n t = t == null ? 0 : t;\n d = d != null ? d : t * vecDist;\n return {\n x: p0.x + normVec.x * d,\n y: p0.y + normVec.y * d\n };\n};\nvar bound = function bound(min, val, max) {\n return Math.max(min, Math.min(max, val));\n};\n\n// makes a full bb (x1, y1, x2, y2, w, h) from implicit params\nvar makeBoundingBox = function makeBoundingBox(bb) {\n if (bb == null) {\n return {\n x1: Infinity,\n y1: Infinity,\n x2: -Infinity,\n y2: -Infinity,\n w: 0,\n h: 0\n };\n } else if (bb.x1 != null && bb.y1 != null) {\n if (bb.x2 != null && bb.y2 != null && bb.x2 >= bb.x1 && bb.y2 >= bb.y1) {\n return {\n x1: bb.x1,\n y1: bb.y1,\n x2: bb.x2,\n y2: bb.y2,\n w: bb.x2 - bb.x1,\n h: bb.y2 - bb.y1\n };\n } else if (bb.w != null && bb.h != null && bb.w >= 0 && bb.h >= 0) {\n return {\n x1: bb.x1,\n y1: bb.y1,\n x2: bb.x1 + bb.w,\n y2: bb.y1 + bb.h,\n w: bb.w,\n h: bb.h\n };\n }\n }\n};\nvar copyBoundingBox = function copyBoundingBox(bb) {\n return {\n x1: bb.x1,\n x2: bb.x2,\n w: bb.w,\n y1: bb.y1,\n y2: bb.y2,\n h: bb.h\n };\n};\nvar clearBoundingBox = function clearBoundingBox(bb) {\n bb.x1 = Infinity;\n bb.y1 = Infinity;\n bb.x2 = -Infinity;\n bb.y2 = -Infinity;\n bb.w = 0;\n bb.h = 0;\n};\nvar updateBoundingBox = function updateBoundingBox(bb1, bb2) {\n // update bb1 with bb2 bounds\n\n bb1.x1 = Math.min(bb1.x1, bb2.x1);\n bb1.x2 = Math.max(bb1.x2, bb2.x2);\n bb1.w = bb1.x2 - bb1.x1;\n bb1.y1 = Math.min(bb1.y1, bb2.y1);\n bb1.y2 = Math.max(bb1.y2, bb2.y2);\n bb1.h = bb1.y2 - bb1.y1;\n};\nvar expandBoundingBoxByPoint = function expandBoundingBoxByPoint(bb, x, y) {\n bb.x1 = Math.min(bb.x1, x);\n bb.x2 = Math.max(bb.x2, x);\n bb.w = bb.x2 - bb.x1;\n bb.y1 = Math.min(bb.y1, y);\n bb.y2 = Math.max(bb.y2, y);\n bb.h = bb.y2 - bb.y1;\n};\nvar expandBoundingBox = function expandBoundingBox(bb) {\n var padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n bb.x1 -= padding;\n bb.x2 += padding;\n bb.y1 -= padding;\n bb.y2 += padding;\n bb.w = bb.x2 - bb.x1;\n bb.h = bb.y2 - bb.y1;\n return bb;\n};\nvar expandBoundingBoxSides = function expandBoundingBoxSides(bb) {\n var padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0];\n var top, right, bottom, left;\n if (padding.length === 1) {\n top = right = bottom = left = padding[0];\n } else if (padding.length === 2) {\n top = bottom = padding[0];\n left = right = padding[1];\n } else if (padding.length === 4) {\n var _padding = _slicedToArray(padding, 4);\n top = _padding[0];\n right = _padding[1];\n bottom = _padding[2];\n left = _padding[3];\n }\n bb.x1 -= left;\n bb.x2 += right;\n bb.y1 -= top;\n bb.y2 += bottom;\n bb.w = bb.x2 - bb.x1;\n bb.h = bb.y2 - bb.y1;\n return bb;\n};\n\n// assign the values of bb2 into bb1\nvar assignBoundingBox = function assignBoundingBox(bb1, bb2) {\n bb1.x1 = bb2.x1;\n bb1.y1 = bb2.y1;\n bb1.x2 = bb2.x2;\n bb1.y2 = bb2.y2;\n bb1.w = bb1.x2 - bb1.x1;\n bb1.h = bb1.y2 - bb1.y1;\n};\nvar boundingBoxesIntersect = function boundingBoxesIntersect(bb1, bb2) {\n // case: one bb to right of other\n if (bb1.x1 > bb2.x2) {\n return false;\n }\n if (bb2.x1 > bb1.x2) {\n return false;\n }\n\n // case: one bb to left of other\n if (bb1.x2 < bb2.x1) {\n return false;\n }\n if (bb2.x2 < bb1.x1) {\n return false;\n }\n\n // case: one bb above other\n if (bb1.y2 < bb2.y1) {\n return false;\n }\n if (bb2.y2 < bb1.y1) {\n return false;\n }\n\n // case: one bb below other\n if (bb1.y1 > bb2.y2) {\n return false;\n }\n if (bb2.y1 > bb1.y2) {\n return false;\n }\n\n // otherwise, must have some overlap\n return true;\n};\nvar inBoundingBox = function inBoundingBox(bb, x, y) {\n return bb.x1 <= x && x <= bb.x2 && bb.y1 <= y && y <= bb.y2;\n};\nvar pointInBoundingBox = function pointInBoundingBox(bb, pt) {\n return inBoundingBox(bb, pt.x, pt.y);\n};\nvar boundingBoxInBoundingBox = function boundingBoxInBoundingBox(bb1, bb2) {\n return inBoundingBox(bb1, bb2.x1, bb2.y1) && inBoundingBox(bb1, bb2.x2, bb2.y2);\n};\nvar hypot = (_Math$hypot = Math.hypot) !== null && _Math$hypot !== undefined ? _Math$hypot : function (x, y) {\n return Math.sqrt(x * x + y * y);\n};\nfunction inflatePolygon(polygon, d) {\n if (polygon.length < 3) {\n throw new Error('Need at least 3 vertices');\n }\n // Helpers\n var add = function add(a, b) {\n return {\n x: a.x + b.x,\n y: a.y + b.y\n };\n };\n var sub = function sub(a, b) {\n return {\n x: a.x - b.x,\n y: a.y - b.y\n };\n };\n var scale = function scale(v, s) {\n return {\n x: v.x * s,\n y: v.y * s\n };\n };\n var cross = function cross(u, v) {\n return u.x * v.y - u.y * v.x;\n };\n var normalize = function normalize(v) {\n var len = hypot(v.x, v.y);\n return len === 0 ? {\n x: 0,\n y: 0\n } : {\n x: v.x / len,\n y: v.y / len\n };\n };\n // Signed area (positive = CCW)\n var signedArea = function signedArea(pts) {\n var A = 0;\n for (var i = 0; i < pts.length; i++) {\n var p = pts[i],\n q = pts[(i + 1) % pts.length];\n A += p.x * q.y - q.x * p.y;\n }\n return A / 2;\n };\n // Line\u2013line intersection (infinite lines)\n var intersectLines = function intersectLines(p1, p2, p3, p4) {\n var r = sub(p2, p1);\n var s = sub(p4, p3);\n var denom = cross(r, s);\n if (Math.abs(denom) < 1e-9) {\n // Parallel or nearly so \u2014 fallback to midpoint\n return add(p1, scale(r, 0.5));\n }\n var t = cross(sub(p3, p1), s) / denom;\n return add(p1, scale(r, t));\n };\n\n // Make a shallow copy and enforce CCW\n var pts = polygon.map(function (p) {\n return {\n x: p.x,\n y: p.y\n };\n });\n if (signedArea(pts) < 0) pts.reverse();\n var n = pts.length;\n // Compute outward normals for each edge\n var normals = [];\n for (var i = 0; i < n; i++) {\n var p = pts[i],\n q = pts[(i + 1) % n];\n var edge = sub(q, p);\n // For CCW polygon, inward normal = (-edge.y, edge.x)\n // so outward normal = (edge.y, -edge.x)\n var out = normalize({\n x: edge.y,\n y: -edge.x\n });\n normals.push(out);\n }\n\n // Build offset edges\n var offsetEdges = normals.map(function (nrm, i) {\n var p1 = add(pts[i], scale(nrm, d));\n var p2 = add(pts[(i + 1) % n], scale(nrm, d));\n return {\n p1: p1,\n p2: p2\n };\n });\n\n // Intersect consecutive offset edges\n var inflated = [];\n for (var _i2 = 0; _i2 < n; _i2++) {\n var prevEdge = offsetEdges[(_i2 - 1 + n) % n];\n var currEdge = offsetEdges[_i2];\n var ip = intersectLines(prevEdge.p1, prevEdge.p2, currEdge.p1, currEdge.p2);\n inflated.push(ip);\n }\n return inflated;\n}\nfunction miterBox(pts, centerX, centerY, width, height, strokeWidth) {\n var tpts = transformPoints(pts, centerX, centerY, width, height);\n var offsetPoints = inflatePolygon(tpts, strokeWidth);\n var bb = makeBoundingBox();\n offsetPoints.forEach(function (pt) {\n return expandBoundingBoxByPoint(bb, pt.x, pt.y);\n });\n return bb;\n}\nvar roundRectangleIntersectLine = function roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding) {\n var radius = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 'auto';\n var cornerRadius = radius === 'auto' ? getRoundRectangleRadius(width, height) : radius;\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n cornerRadius = Math.min(cornerRadius, halfWidth, halfHeight);\n var doWidth = cornerRadius !== halfWidth,\n doHeight = cornerRadius !== halfHeight;\n\n // Check intersections with straight line segments\n var straightLineIntersections;\n\n // Top segment, left to right\n if (doWidth) {\n var topStartX = nodeX - halfWidth + cornerRadius - padding;\n var topStartY = nodeY - halfHeight - padding;\n var topEndX = nodeX + halfWidth - cornerRadius + padding;\n var topEndY = topStartY;\n straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Right segment, top to bottom\n if (doHeight) {\n var rightStartX = nodeX + halfWidth + padding;\n var rightStartY = nodeY - halfHeight + cornerRadius - padding;\n var rightEndX = rightStartX;\n var rightEndY = nodeY + halfHeight - cornerRadius + padding;\n straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, rightStartX, rightStartY, rightEndX, rightEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Bottom segment, left to right\n if (doWidth) {\n var bottomStartX = nodeX - halfWidth + cornerRadius - padding;\n var bottomStartY = nodeY + halfHeight + padding;\n var bottomEndX = nodeX + halfWidth - cornerRadius + padding;\n var bottomEndY = bottomStartY;\n straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, bottomStartX, bottomStartY, bottomEndX, bottomEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Left segment, top to bottom\n if (doHeight) {\n var leftStartX = nodeX - halfWidth - padding;\n var leftStartY = nodeY - halfHeight + cornerRadius - padding;\n var leftEndX = leftStartX;\n var leftEndY = nodeY + halfHeight - cornerRadius + padding;\n straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, leftStartX, leftStartY, leftEndX, leftEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Check intersections with arc segments\n var arcIntersections;\n\n // Top Left\n {\n var topLeftCenterX = nodeX - halfWidth + cornerRadius;\n var topLeftCenterY = nodeY - halfHeight + cornerRadius;\n arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topLeftCenterX, topLeftCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] <= topLeftCenterX && arcIntersections[1] <= topLeftCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n }\n\n // Top Right\n {\n var topRightCenterX = nodeX + halfWidth - cornerRadius;\n var topRightCenterY = nodeY - halfHeight + cornerRadius;\n arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topRightCenterX, topRightCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] >= topRightCenterX && arcIntersections[1] <= topRightCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n }\n\n // Bottom Right\n {\n var bottomRightCenterX = nodeX + halfWidth - cornerRadius;\n var bottomRightCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomRightCenterX, bottomRightCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] >= bottomRightCenterX && arcIntersections[1] >= bottomRightCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n }\n\n // Bottom Left\n {\n var bottomLeftCenterX = nodeX - halfWidth + cornerRadius;\n var bottomLeftCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomLeftCenterX, bottomLeftCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] <= bottomLeftCenterX && arcIntersections[1] >= bottomLeftCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n }\n return []; // if nothing\n};\nvar inLineVicinity = function inLineVicinity(x, y, lx1, ly1, lx2, ly2, tolerance) {\n var t = tolerance;\n var x1 = Math.min(lx1, lx2);\n var x2 = Math.max(lx1, lx2);\n var y1 = Math.min(ly1, ly2);\n var y2 = Math.max(ly1, ly2);\n return x1 - t <= x && x <= x2 + t && y1 - t <= y && y <= y2 + t;\n};\nvar inBezierVicinity = function inBezierVicinity(x, y, x1, y1, x2, y2, x3, y3, tolerance) {\n var bb = {\n x1: Math.min(x1, x3, x2) - tolerance,\n x2: Math.max(x1, x3, x2) + tolerance,\n y1: Math.min(y1, y3, y2) - tolerance,\n y2: Math.max(y1, y3, y2) + tolerance\n };\n\n // if outside the rough bounding box for the bezier, then it can't be a hit\n if (x < bb.x1 || x > bb.x2 || y < bb.y1 || y > bb.y2) {\n // console.log('bezier out of rough bb')\n return false;\n } else {\n // console.log('do more expensive check');\n return true;\n }\n};\nvar solveQuadratic = function solveQuadratic(a, b, c, val) {\n c -= val;\n var r = b * b - 4 * a * c;\n if (r < 0) {\n return [];\n }\n var sqrtR = Math.sqrt(r);\n var denom = 2 * a;\n var root1 = (-b + sqrtR) / denom;\n var root2 = (-b - sqrtR) / denom;\n return [root1, root2];\n};\nvar solveCubic = function solveCubic(a, b, c, d, result) {\n // Solves a cubic function, returns root in form [r1, i1, r2, i2, r3, i3], where\n // r is the real component, i is the imaginary component\n\n // An implementation of the Cardano method from the year 1545\n // http://en.wikipedia.org/wiki/Cubic_function#The_nature_of_the_roots\n\n var epsilon = 0.00001;\n\n // avoid division by zero while keeping the overall expression close in value\n if (a === 0) {\n a = epsilon;\n }\n b /= a;\n c /= a;\n d /= a;\n var discriminant, q, r, dum1, s, t, term1, r13;\n q = (3.0 * c - b * b) / 9.0;\n r = -(27.0 * d) + b * (9.0 * c - 2.0 * (b * b));\n r /= 54.0;\n discriminant = q * q * q + r * r;\n result[1] = 0;\n term1 = b / 3.0;\n if (discriminant > 0) {\n s = r + Math.sqrt(discriminant);\n s = s < 0 ? -Math.pow(-s, 1.0 / 3.0) : Math.pow(s, 1.0 / 3.0);\n t = r - Math.sqrt(discriminant);\n t = t < 0 ? -Math.pow(-t, 1.0 / 3.0) : Math.pow(t, 1.0 / 3.0);\n result[0] = -term1 + s + t;\n term1 += (s + t) / 2.0;\n result[4] = result[2] = -term1;\n term1 = Math.sqrt(3.0) * (-t + s) / 2;\n result[3] = term1;\n result[5] = -term1;\n return;\n }\n result[5] = result[3] = 0;\n if (discriminant === 0) {\n r13 = r < 0 ? -Math.pow(-r, 1.0 / 3.0) : Math.pow(r, 1.0 / 3.0);\n result[0] = -term1 + 2.0 * r13;\n result[4] = result[2] = -(r13 + term1);\n return;\n }\n q = -q;\n dum1 = q * q * q;\n dum1 = Math.acos(r / Math.sqrt(dum1));\n r13 = 2.0 * Math.sqrt(q);\n result[0] = -term1 + r13 * Math.cos(dum1 / 3.0);\n result[2] = -term1 + r13 * Math.cos((dum1 + 2.0 * Math.PI) / 3.0);\n result[4] = -term1 + r13 * Math.cos((dum1 + 4.0 * Math.PI) / 3.0);\n return;\n};\nvar sqdistToQuadraticBezier = function sqdistToQuadraticBezier(x, y, x1, y1, x2, y2, x3, y3) {\n // Find minimum distance by using the minimum of the distance\n // function between the given point and the curve\n\n // This gives the coefficients of the resulting cubic equation\n // whose roots tell us where a possible minimum is\n // (Coefficients are divided by 4)\n\n var a = 1.0 * x1 * x1 - 4 * x1 * x2 + 2 * x1 * x3 + 4 * x2 * x2 - 4 * x2 * x3 + x3 * x3 + y1 * y1 - 4 * y1 * y2 + 2 * y1 * y3 + 4 * y2 * y2 - 4 * y2 * y3 + y3 * y3;\n var b = 1.0 * 9 * x1 * x2 - 3 * x1 * x1 - 3 * x1 * x3 - 6 * x2 * x2 + 3 * x2 * x3 + 9 * y1 * y2 - 3 * y1 * y1 - 3 * y1 * y3 - 6 * y2 * y2 + 3 * y2 * y3;\n var c = 1.0 * 3 * x1 * x1 - 6 * x1 * x2 + x1 * x3 - x1 * x + 2 * x2 * x2 + 2 * x2 * x - x3 * x + 3 * y1 * y1 - 6 * y1 * y2 + y1 * y3 - y1 * y + 2 * y2 * y2 + 2 * y2 * y - y3 * y;\n var d = 1.0 * x1 * x2 - x1 * x1 + x1 * x - x2 * x + y1 * y2 - y1 * y1 + y1 * y - y2 * y;\n\n // debug(\"coefficients: \" + a / a + \", \" + b / a + \", \" + c / a + \", \" + d / a);\n\n var roots = [];\n\n // Use the cubic solving algorithm\n solveCubic(a, b, c, d, roots);\n var zeroThreshold = 0.0000001;\n var params = [];\n for (var index = 0; index < 6; index += 2) {\n if (Math.abs(roots[index + 1]) < zeroThreshold && roots[index] >= 0 && roots[index] <= 1.0) {\n params.push(roots[index]);\n }\n }\n params.push(1.0);\n params.push(0.0);\n var minDistanceSquared = -1;\n var curX, curY, distSquared;\n for (var i = 0; i < params.length; i++) {\n curX = Math.pow(1.0 - params[i], 2.0) * x1 + 2.0 * (1 - params[i]) * params[i] * x2 + params[i] * params[i] * x3;\n curY = Math.pow(1 - params[i], 2.0) * y1 + 2 * (1.0 - params[i]) * params[i] * y2 + params[i] * params[i] * y3;\n distSquared = Math.pow(curX - x, 2) + Math.pow(curY - y, 2);\n // debug('distance for param ' + params[i] + \": \" + Math.sqrt(distSquared));\n if (minDistanceSquared >= 0) {\n if (distSquared < minDistanceSquared) {\n minDistanceSquared = distSquared;\n }\n } else {\n minDistanceSquared = distSquared;\n }\n }\n return minDistanceSquared;\n};\nvar sqdistToFiniteLine = function sqdistToFiniteLine(x, y, x1, y1, x2, y2) {\n var offset = [x - x1, y - y1];\n var line = [x2 - x1, y2 - y1];\n var lineSq = line[0] * line[0] + line[1] * line[1];\n var hypSq = offset[0] * offset[0] + offset[1] * offset[1];\n var dotProduct = offset[0] * line[0] + offset[1] * line[1];\n var adjSq = dotProduct * dotProduct / lineSq;\n if (dotProduct < 0) {\n return hypSq;\n }\n if (adjSq > lineSq) {\n return (x - x2) * (x - x2) + (y - y2) * (y - y2);\n }\n return hypSq - adjSq;\n};\nvar pointInsidePolygonPoints = function pointInsidePolygonPoints(x, y, points) {\n var x1, y1, x2, y2;\n var y3;\n\n // Intersect with vertical line through (x, y)\n var up = 0;\n // let down = 0;\n for (var i = 0; i < points.length / 2; i++) {\n x1 = points[i * 2];\n y1 = points[i * 2 + 1];\n if (i + 1 < points.length / 2) {\n x2 = points[(i + 1) * 2];\n y2 = points[(i + 1) * 2 + 1];\n } else {\n x2 = points[(i + 1 - points.length / 2) * 2];\n y2 = points[(i + 1 - points.length / 2) * 2 + 1];\n }\n if (x1 == x && x2 == x) ; else if (x1 >= x && x >= x2 || x1 <= x && x <= x2) {\n y3 = (x - x1) / (x2 - x1) * (y2 - y1) + y1;\n if (y3 > y) {\n up++;\n }\n\n // if( y3 < y ){\n // down++;\n // }\n } else {\n continue;\n }\n }\n if (up % 2 === 0) {\n return false;\n } else {\n return true;\n }\n};\nvar pointInsidePolygon = function pointInsidePolygon(x, y, basePoints, centerX, centerY, width, height, direction, padding) {\n var transformedPoints = new Array(basePoints.length);\n\n // Gives negative angle\n var angle;\n if (direction[0] != null) {\n angle = Math.atan(direction[1] / direction[0]);\n if (direction[0] < 0) {\n angle = angle + Math.PI / 2;\n } else {\n angle = -angle - Math.PI / 2;\n }\n } else {\n angle = direction;\n }\n var cos = Math.cos(-angle);\n var sin = Math.sin(-angle);\n\n // console.log(\"base: \" + basePoints);\n for (var i = 0; i < transformedPoints.length / 2; i++) {\n transformedPoints[i * 2] = width / 2 * (basePoints[i * 2] * cos - basePoints[i * 2 + 1] * sin);\n transformedPoints[i * 2 + 1] = height / 2 * (basePoints[i * 2 + 1] * cos + basePoints[i * 2] * sin);\n transformedPoints[i * 2] += centerX;\n transformedPoints[i * 2 + 1] += centerY;\n }\n var points;\n if (padding > 0) {\n var expandedLineSet = expandPolygon(transformedPoints, -padding);\n points = joinLines(expandedLineSet);\n } else {\n points = transformedPoints;\n }\n return pointInsidePolygonPoints(x, y, points);\n};\nvar pointInsideRoundPolygon = function pointInsideRoundPolygon(x, y, basePoints, centerX, centerY, width, height, corners) {\n var cutPolygonPoints = new Array(basePoints.length * 2);\n for (var i = 0; i < corners.length; i++) {\n var corner = corners[i];\n cutPolygonPoints[i * 4 + 0] = corner.startX;\n cutPolygonPoints[i * 4 + 1] = corner.startY;\n cutPolygonPoints[i * 4 + 2] = corner.stopX;\n cutPolygonPoints[i * 4 + 3] = corner.stopY;\n var squaredDistance = Math.pow(corner.cx - x, 2) + Math.pow(corner.cy - y, 2);\n if (squaredDistance <= Math.pow(corner.radius, 2)) {\n return true;\n }\n }\n return pointInsidePolygonPoints(x, y, cutPolygonPoints);\n};\nvar joinLines = function joinLines(lineSet) {\n var vertices = new Array(lineSet.length / 2);\n var currentLineStartX, currentLineStartY, currentLineEndX, currentLineEndY;\n var nextLineStartX, nextLineStartY, nextLineEndX, nextLineEndY;\n for (var i = 0; i < lineSet.length / 4; i++) {\n currentLineStartX = lineSet[i * 4];\n currentLineStartY = lineSet[i * 4 + 1];\n currentLineEndX = lineSet[i * 4 + 2];\n currentLineEndY = lineSet[i * 4 + 3];\n if (i < lineSet.length / 4 - 1) {\n nextLineStartX = lineSet[(i + 1) * 4];\n nextLineStartY = lineSet[(i + 1) * 4 + 1];\n nextLineEndX = lineSet[(i + 1) * 4 + 2];\n nextLineEndY = lineSet[(i + 1) * 4 + 3];\n } else {\n nextLineStartX = lineSet[0];\n nextLineStartY = lineSet[1];\n nextLineEndX = lineSet[2];\n nextLineEndY = lineSet[3];\n }\n var intersection = finiteLinesIntersect(currentLineStartX, currentLineStartY, currentLineEndX, currentLineEndY, nextLineStartX, nextLineStartY, nextLineEndX, nextLineEndY, true);\n vertices[i * 2] = intersection[0];\n vertices[i * 2 + 1] = intersection[1];\n }\n return vertices;\n};\nvar expandPolygon = function expandPolygon(points, pad) {\n var expandedLineSet = new Array(points.length * 2);\n var currentPointX, currentPointY, nextPointX, nextPointY;\n for (var i = 0; i < points.length / 2; i++) {\n currentPointX = points[i * 2];\n currentPointY = points[i * 2 + 1];\n if (i < points.length / 2 - 1) {\n nextPointX = points[(i + 1) * 2];\n nextPointY = points[(i + 1) * 2 + 1];\n } else {\n nextPointX = points[0];\n nextPointY = points[1];\n }\n\n // Current line: [currentPointX, currentPointY] to [nextPointX, nextPointY]\n\n // Assume CCW polygon winding\n\n var offsetX = nextPointY - currentPointY;\n var offsetY = -(nextPointX - currentPointX);\n\n // Normalize\n var offsetLength = Math.sqrt(offsetX * offsetX + offsetY * offsetY);\n var normalizedOffsetX = offsetX / offsetLength;\n var normalizedOffsetY = offsetY / offsetLength;\n expandedLineSet[i * 4] = currentPointX + normalizedOffsetX * pad;\n expandedLineSet[i * 4 + 1] = currentPointY + normalizedOffsetY * pad;\n expandedLineSet[i * 4 + 2] = nextPointX + normalizedOffsetX * pad;\n expandedLineSet[i * 4 + 3] = nextPointY + normalizedOffsetY * pad;\n }\n return expandedLineSet;\n};\nvar intersectLineEllipse = function intersectLineEllipse(x, y, centerX, centerY, ellipseWradius, ellipseHradius) {\n var dispX = centerX - x;\n var dispY = centerY - y;\n dispX /= ellipseWradius;\n dispY /= ellipseHradius;\n var len = Math.sqrt(dispX * dispX + dispY * dispY);\n var newLength = len - 1;\n if (newLength < 0) {\n return [];\n }\n var lenProportion = newLength / len;\n return [(centerX - x) * lenProportion + x, (centerY - y) * lenProportion + y];\n};\nvar checkInEllipse = function checkInEllipse(x, y, width, height, centerX, centerY, padding) {\n x -= centerX;\n y -= centerY;\n x /= width / 2 + padding;\n y /= height / 2 + padding;\n return x * x + y * y <= 1;\n};\n\n// Returns intersections of increasing distance from line's start point\nvar intersectLineCircle = function intersectLineCircle(x1, y1, x2, y2, centerX, centerY, radius) {\n // Calculate d, direction vector of line\n var d = [x2 - x1, y2 - y1]; // Direction vector of line\n var f = [x1 - centerX, y1 - centerY];\n var a = d[0] * d[0] + d[1] * d[1];\n var b = 2 * (f[0] * d[0] + f[1] * d[1]);\n var c = f[0] * f[0] + f[1] * f[1] - radius * radius;\n var discriminant = b * b - 4 * a * c;\n if (discriminant < 0) {\n return [];\n }\n var t1 = (-b + Math.sqrt(discriminant)) / (2 * a);\n var t2 = (-b - Math.sqrt(discriminant)) / (2 * a);\n var tMin = Math.min(t1, t2);\n var tMax = Math.max(t1, t2);\n var inRangeParams = [];\n if (tMin >= 0 && tMin <= 1) {\n inRangeParams.push(tMin);\n }\n if (tMax >= 0 && tMax <= 1) {\n inRangeParams.push(tMax);\n }\n if (inRangeParams.length === 0) {\n return [];\n }\n var nearIntersectionX = inRangeParams[0] * d[0] + x1;\n var nearIntersectionY = inRangeParams[0] * d[1] + y1;\n if (inRangeParams.length > 1) {\n if (inRangeParams[0] == inRangeParams[1]) {\n return [nearIntersectionX, nearIntersectionY];\n } else {\n var farIntersectionX = inRangeParams[1] * d[0] + x1;\n var farIntersectionY = inRangeParams[1] * d[1] + y1;\n return [nearIntersectionX, nearIntersectionY, farIntersectionX, farIntersectionY];\n }\n } else {\n return [nearIntersectionX, nearIntersectionY];\n }\n};\nvar midOfThree = function midOfThree(a, b, c) {\n if (b <= a && a <= c || c <= a && a <= b) {\n return a;\n } else if (a <= b && b <= c || c <= b && b <= a) {\n return b;\n } else {\n return c;\n }\n};\n\n// (x1,y1)=>(x2,y2) intersect with (x3,y3)=>(x4,y4)\nvar finiteLinesIntersect = function finiteLinesIntersect(x1, y1, x2, y2, x3, y3, x4, y4, infiniteLines) {\n var dx13 = x1 - x3;\n var dx21 = x2 - x1;\n var dx43 = x4 - x3;\n var dy13 = y1 - y3;\n var dy21 = y2 - y1;\n var dy43 = y4 - y3;\n var ua_t = dx43 * dy13 - dy43 * dx13;\n var ub_t = dx21 * dy13 - dy21 * dx13;\n var u_b = dy43 * dx21 - dx43 * dy21;\n if (u_b !== 0) {\n var ua = ua_t / u_b;\n var ub = ub_t / u_b;\n var flptThreshold = 0.001;\n var _min = 0 - flptThreshold;\n var _max = 1 + flptThreshold;\n if (_min <= ua && ua <= _max && _min <= ub && ub <= _max) {\n return [x1 + ua * dx21, y1 + ua * dy21];\n } else {\n if (!infiniteLines) {\n return [];\n } else {\n return [x1 + ua * dx21, y1 + ua * dy21];\n }\n }\n } else {\n if (ua_t === 0 || ub_t === 0) {\n // Parallel, coincident lines. Check if overlap\n\n // Check endpoint of second line\n if (midOfThree(x1, x2, x4) === x4) {\n return [x4, y4];\n }\n\n // Check start point of second line\n if (midOfThree(x1, x2, x3) === x3) {\n return [x3, y3];\n }\n\n // Endpoint of first line\n if (midOfThree(x3, x4, x2) === x2) {\n return [x2, y2];\n }\n return [];\n } else {\n // Parallel, non-coincident\n return [];\n }\n }\n};\nvar transformPoints = function transformPoints(points, centerX, centerY, width, height) {\n var ret = [];\n var halfW = width / 2;\n var halfH = height / 2;\n var x = centerX;\n var y = centerY;\n ret.push({\n x: x + halfW * points[0],\n y: y + halfH * points[1]\n });\n for (var i = 1; i < points.length / 2; i++) {\n ret.push({\n x: x + halfW * points[i * 2],\n y: y + halfH * points[i * 2 + 1]\n });\n }\n return ret;\n};\n\n// math.polygonIntersectLine( x, y, basePoints, centerX, centerY, width, height, padding )\n// intersect a node polygon (pts transformed)\n//\n// math.polygonIntersectLine( x, y, basePoints, centerX, centerY )\n// intersect the points (no transform)\nvar polygonIntersectLine = function polygonIntersectLine(x, y, basePoints, centerX, centerY, width, height, padding) {\n var intersections = [];\n var intersection;\n var transformedPoints = new Array(basePoints.length);\n var doTransform = true;\n if (width == null) {\n doTransform = false;\n }\n var points;\n if (doTransform) {\n for (var i = 0; i < transformedPoints.length / 2; i++) {\n transformedPoints[i * 2] = basePoints[i * 2] * width + centerX;\n transformedPoints[i * 2 + 1] = basePoints[i * 2 + 1] * height + centerY;\n }\n if (padding > 0) {\n var expandedLineSet = expandPolygon(transformedPoints, -padding);\n points = joinLines(expandedLineSet);\n } else {\n points = transformedPoints;\n }\n } else {\n points = basePoints;\n }\n var currentX, currentY, nextX, nextY;\n for (var _i3 = 0; _i3 < points.length / 2; _i3++) {\n currentX = points[_i3 * 2];\n currentY = points[_i3 * 2 + 1];\n if (_i3 < points.length / 2 - 1) {\n nextX = points[(_i3 + 1) * 2];\n nextY = points[(_i3 + 1) * 2 + 1];\n } else {\n nextX = points[0];\n nextY = points[1];\n }\n intersection = finiteLinesIntersect(x, y, centerX, centerY, currentX, currentY, nextX, nextY);\n if (intersection.length !== 0) {\n intersections.push(intersection[0], intersection[1]);\n }\n }\n return intersections;\n};\nvar roundPolygonIntersectLine = function roundPolygonIntersectLine(x, y, basePoints, centerX, centerY, width, height, padding, corners) {\n var intersections = [];\n var intersection;\n var lines = new Array(basePoints.length * 2);\n corners.forEach(function (corner, i) {\n if (i === 0) {\n lines[lines.length - 2] = corner.startX;\n lines[lines.length - 1] = corner.startY;\n } else {\n lines[i * 4 - 2] = corner.startX;\n lines[i * 4 - 1] = corner.startY;\n }\n lines[i * 4] = corner.stopX;\n lines[i * 4 + 1] = corner.stopY;\n intersection = intersectLineCircle(x, y, centerX, centerY, corner.cx, corner.cy, corner.radius);\n if (intersection.length !== 0) {\n intersections.push(intersection[0], intersection[1]);\n }\n });\n for (var i = 0; i < lines.length / 4; i++) {\n intersection = finiteLinesIntersect(x, y, centerX, centerY, lines[i * 4], lines[i * 4 + 1], lines[i * 4 + 2], lines[i * 4 + 3], false);\n if (intersection.length !== 0) {\n intersections.push(intersection[0], intersection[1]);\n }\n }\n if (intersections.length > 2) {\n var lowestIntersection = [intersections[0], intersections[1]];\n var lowestSquaredDistance = Math.pow(lowestIntersection[0] - x, 2) + Math.pow(lowestIntersection[1] - y, 2);\n for (var _i4 = 1; _i4 < intersections.length / 2; _i4++) {\n var squaredDistance = Math.pow(intersections[_i4 * 2] - x, 2) + Math.pow(intersections[_i4 * 2 + 1] - y, 2);\n if (squaredDistance <= lowestSquaredDistance) {\n lowestIntersection[0] = intersections[_i4 * 2];\n lowestIntersection[1] = intersections[_i4 * 2 + 1];\n lowestSquaredDistance = squaredDistance;\n }\n }\n return lowestIntersection;\n }\n return intersections;\n};\nvar shortenIntersection = function shortenIntersection(intersection, offset, amount) {\n var disp = [intersection[0] - offset[0], intersection[1] - offset[1]];\n var length = Math.sqrt(disp[0] * disp[0] + disp[1] * disp[1]);\n var lenRatio = (length - amount) / length;\n if (lenRatio < 0) {\n lenRatio = 0.00001;\n }\n return [offset[0] + lenRatio * disp[0], offset[1] + lenRatio * disp[1]];\n};\nvar generateUnitNgonPointsFitToSquare = function generateUnitNgonPointsFitToSquare(sides, rotationRadians) {\n var points = generateUnitNgonPoints(sides, rotationRadians);\n points = fitPolygonToSquare(points);\n return points;\n};\nvar fitPolygonToSquare = function fitPolygonToSquare(points) {\n var x, y;\n var sides = points.length / 2;\n var minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n for (var i = 0; i < sides; i++) {\n x = points[2 * i];\n y = points[2 * i + 1];\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n // stretch factors\n var sx = 2 / (maxX - minX);\n var sy = 2 / (maxY - minY);\n for (var _i5 = 0; _i5 < sides; _i5++) {\n x = points[2 * _i5] = points[2 * _i5] * sx;\n y = points[2 * _i5 + 1] = points[2 * _i5 + 1] * sy;\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n if (minY < -1) {\n for (var _i6 = 0; _i6 < sides; _i6++) {\n y = points[2 * _i6 + 1] = points[2 * _i6 + 1] + (-1 - minY);\n }\n }\n return points;\n};\nvar generateUnitNgonPoints = function generateUnitNgonPoints(sides, rotationRadians) {\n var increment = 1.0 / sides * 2 * Math.PI;\n var startAngle = sides % 2 === 0 ? Math.PI / 2.0 + increment / 2.0 : Math.PI / 2.0;\n startAngle += rotationRadians;\n var points = new Array(sides * 2);\n var currentAngle;\n for (var i = 0; i < sides; i++) {\n currentAngle = i * increment + startAngle;\n points[2 * i] = Math.cos(currentAngle); // x\n points[2 * i + 1] = Math.sin(-currentAngle); // y\n }\n return points;\n};\n\n// Set the default radius, unless half of width or height is smaller than default\nvar getRoundRectangleRadius = function getRoundRectangleRadius(width, height) {\n return Math.min(width / 4, height / 4, 8);\n};\n\n// Set the default radius\nvar getRoundPolygonRadius = function getRoundPolygonRadius(width, height) {\n return Math.min(width / 10, height / 10, 8);\n};\nvar getCutRectangleCornerLength = function getCutRectangleCornerLength() {\n return 8;\n};\nvar bezierPtsToQuadCoeff = function bezierPtsToQuadCoeff(p0, p1, p2) {\n return [p0 - 2 * p1 + p2, 2 * (p1 - p0), p0];\n};\n\n// get curve width, height, and control point position offsets as a percentage of node height / width\nvar getBarrelCurveConstants = function getBarrelCurveConstants(width, height) {\n return {\n heightOffset: Math.min(15, 0.05 * height),\n widthOffset: Math.min(100, 0.25 * width),\n ctrlPtOffsetPct: 0.05\n };\n};\n\n// Separating Axis Theorem (SAT) to determine if two polygons intersect. \n// The function takes two polygons as input and returns a boolean value indicating \n// whether the two polygons intersect.\nfunction satPolygonIntersection(poly1, poly2) {\n function getAxes(polygon) {\n var axes = [];\n for (var i = 0; i < polygon.length; i++) {\n var p1 = polygon[i];\n var p2 = polygon[(i + 1) % polygon.length];\n var edge = {\n x: p2.x - p1.x,\n y: p2.y - p1.y\n };\n var normal = {\n x: -edge.y,\n y: edge.x\n };\n var length = Math.sqrt(normal.x * normal.x + normal.y * normal.y);\n axes.push({\n x: normal.x / length,\n y: normal.y / length\n });\n }\n return axes;\n }\n function project(polygon, axis) {\n var min = Infinity;\n var max = -Infinity;\n var _iterator = _createForOfIteratorHelper(polygon),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var point = _step.value;\n var projection = point.x * axis.x + point.y * axis.y;\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n return {\n min: min,\n max: max\n };\n }\n function overlaps(proj1, proj2) {\n return !(proj1.max < proj2.min || proj2.max < proj1.min);\n }\n var axes = [].concat(_toConsumableArray(getAxes(poly1)), _toConsumableArray(getAxes(poly2)));\n var _iterator2 = _createForOfIteratorHelper(axes),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var axis = _step2.value;\n var proj1 = project(poly1, axis);\n var proj2 = project(poly2, axis);\n if (!overlaps(proj1, proj2)) {\n return false; // No overlap, so the polygons do not intersect\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n return true; // polygons intersect\n}\n\nvar pageRankDefaults = defaults$g({\n dampingFactor: 0.8,\n precision: 0.000001,\n iterations: 200,\n weight: function weight(edge) {\n return 1;\n }\n});\nvar elesfn$o = {\n pageRank: function pageRank(options) {\n var _pageRankDefaults = pageRankDefaults(options),\n dampingFactor = _pageRankDefaults.dampingFactor,\n precision = _pageRankDefaults.precision,\n iterations = _pageRankDefaults.iterations,\n weight = _pageRankDefaults.weight;\n var cy = this._private.cy;\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges;\n var numNodes = nodes.length;\n var numNodesSqd = numNodes * numNodes;\n var numEdges = edges.length;\n\n // Construct transposed adjacency matrix\n // First lets have a zeroed matrix of the right size\n // We'll also keep track of the sum of each column\n var matrix = new Array(numNodesSqd);\n var columnSum = new Array(numNodes);\n var additionalProb = (1 - dampingFactor) / numNodes;\n\n // Create null matrix\n for (var i = 0; i < numNodes; i++) {\n for (var j = 0; j < numNodes; j++) {\n var n = i * numNodes + j;\n matrix[n] = 0;\n }\n columnSum[i] = 0;\n }\n\n // Now, process edges\n for (var _i = 0; _i < numEdges; _i++) {\n var edge = edges[_i];\n var srcId = edge.data('source');\n var tgtId = edge.data('target');\n\n // Don't include loops in the matrix\n if (srcId === tgtId) {\n continue;\n }\n var s = nodes.indexOfId(srcId);\n var t = nodes.indexOfId(tgtId);\n var w = weight(edge);\n var _n = t * numNodes + s;\n\n // Update matrix\n matrix[_n] += w;\n\n // Update column sum\n columnSum[s] += w;\n }\n\n // Add additional probability based on damping factor\n // Also, take into account columns that have sum = 0\n var p = 1.0 / numNodes + additionalProb; // Shorthand\n\n // Traverse matrix, column by column\n for (var _j = 0; _j < numNodes; _j++) {\n if (columnSum[_j] === 0) {\n // No 'links' out from node jth, assume equal probability for each possible node\n for (var _i2 = 0; _i2 < numNodes; _i2++) {\n var _n2 = _i2 * numNodes + _j;\n matrix[_n2] = p;\n }\n } else {\n // Node jth has outgoing link, compute normalized probabilities\n for (var _i3 = 0; _i3 < numNodes; _i3++) {\n var _n3 = _i3 * numNodes + _j;\n matrix[_n3] = matrix[_n3] / columnSum[_j] + additionalProb;\n }\n }\n }\n\n // Compute dominant eigenvector using power method\n var eigenvector = new Array(numNodes);\n var temp = new Array(numNodes);\n var previous;\n\n // Start with a vector of all 1's\n // Also, initialize a null vector which will be used as shorthand\n for (var _i4 = 0; _i4 < numNodes; _i4++) {\n eigenvector[_i4] = 1;\n }\n for (var iter = 0; iter < iterations; iter++) {\n // Temp array with all 0's\n for (var _i5 = 0; _i5 < numNodes; _i5++) {\n temp[_i5] = 0;\n }\n\n // Multiply matrix with previous result\n for (var _i6 = 0; _i6 < numNodes; _i6++) {\n for (var _j2 = 0; _j2 < numNodes; _j2++) {\n var _n4 = _i6 * numNodes + _j2;\n temp[_i6] += matrix[_n4] * eigenvector[_j2];\n }\n }\n inPlaceSumNormalize(temp);\n previous = eigenvector;\n eigenvector = temp;\n temp = previous;\n var diff = 0;\n // Compute difference (squared module) of both vectors\n for (var _i7 = 0; _i7 < numNodes; _i7++) {\n var delta = previous[_i7] - eigenvector[_i7];\n diff += delta * delta;\n }\n\n // If difference is less than the desired threshold, stop iterating\n if (diff < precision) {\n break;\n }\n }\n\n // Construct result\n var res = {\n rank: function rank(node) {\n node = cy.collection(node)[0];\n return eigenvector[nodes.indexOf(node)];\n }\n };\n return res;\n } // pageRank\n}; // elesfn\n\nvar defaults$f = defaults$g({\n root: null,\n weight: function weight(edge) {\n return 1;\n },\n directed: false,\n alpha: 0\n});\nvar elesfn$n = {\n degreeCentralityNormalized: function degreeCentralityNormalized(options) {\n options = defaults$f(options);\n var cy = this.cy();\n var nodes = this.nodes();\n var numNodes = nodes.length;\n if (!options.directed) {\n var degrees = {};\n var maxDegree = 0;\n for (var i = 0; i < numNodes; i++) {\n var node = nodes[i];\n\n // add current node to the current options object and call degreeCentrality\n options.root = node;\n var currDegree = this.degreeCentrality(options);\n if (maxDegree < currDegree.degree) {\n maxDegree = currDegree.degree;\n }\n degrees[node.id()] = currDegree.degree;\n }\n return {\n degree: function degree(node) {\n if (maxDegree === 0) {\n return 0;\n }\n if (string(node)) {\n // from is a selector string\n node = cy.filter(node);\n }\n return degrees[node.id()] / maxDegree;\n }\n };\n } else {\n var indegrees = {};\n var outdegrees = {};\n var maxIndegree = 0;\n var maxOutdegree = 0;\n for (var _i = 0; _i < numNodes; _i++) {\n var _node = nodes[_i];\n var id = _node.id();\n\n // add current node to the current options object and call degreeCentrality\n options.root = _node;\n var _currDegree = this.degreeCentrality(options);\n if (maxIndegree < _currDegree.indegree) maxIndegree = _currDegree.indegree;\n if (maxOutdegree < _currDegree.outdegree) maxOutdegree = _currDegree.outdegree;\n indegrees[id] = _currDegree.indegree;\n outdegrees[id] = _currDegree.outdegree;\n }\n return {\n indegree: function indegree(node) {\n if (maxIndegree == 0) {\n return 0;\n }\n if (string(node)) {\n // from is a selector string\n node = cy.filter(node);\n }\n return indegrees[node.id()] / maxIndegree;\n },\n outdegree: function outdegree(node) {\n if (maxOutdegree === 0) {\n return 0;\n }\n if (string(node)) {\n // from is a selector string\n node = cy.filter(node);\n }\n return outdegrees[node.id()] / maxOutdegree;\n }\n };\n }\n },\n // degreeCentralityNormalized\n\n // Implemented from the algorithm in Opsahl's paper\n // \"Node centrality in weighted networks: Generalizing degree and shortest paths\"\n // check the heading 2 \"Degree\"\n degreeCentrality: function degreeCentrality(options) {\n options = defaults$f(options);\n var cy = this.cy();\n var callingEles = this;\n var _options = options,\n root = _options.root,\n weight = _options.weight,\n directed = _options.directed,\n alpha = _options.alpha;\n root = cy.collection(root)[0];\n if (!directed) {\n var connEdges = root.connectedEdges().intersection(callingEles);\n var k = connEdges.length;\n var s = 0;\n\n // Now, sum edge weights\n for (var i = 0; i < connEdges.length; i++) {\n s += weight(connEdges[i]);\n }\n return {\n degree: Math.pow(k, 1 - alpha) * Math.pow(s, alpha)\n };\n } else {\n var edges = root.connectedEdges();\n var incoming = edges.filter(function (edge) {\n return edge.target().same(root) && callingEles.has(edge);\n });\n var outgoing = edges.filter(function (edge) {\n return edge.source().same(root) && callingEles.has(edge);\n });\n var k_in = incoming.length;\n var k_out = outgoing.length;\n var s_in = 0;\n var s_out = 0;\n\n // Now, sum incoming edge weights\n for (var _i2 = 0; _i2 < incoming.length; _i2++) {\n s_in += weight(incoming[_i2]);\n }\n\n // Now, sum outgoing edge weights\n for (var _i3 = 0; _i3 < outgoing.length; _i3++) {\n s_out += weight(outgoing[_i3]);\n }\n return {\n indegree: Math.pow(k_in, 1 - alpha) * Math.pow(s_in, alpha),\n outdegree: Math.pow(k_out, 1 - alpha) * Math.pow(s_out, alpha)\n };\n }\n } // degreeCentrality\n}; // elesfn\n\n// nice, short mathematical alias\nelesfn$n.dc = elesfn$n.degreeCentrality;\nelesfn$n.dcn = elesfn$n.degreeCentralityNormalised = elesfn$n.degreeCentralityNormalized;\n\nvar defaults$e = defaults$g({\n harmonic: true,\n weight: function weight() {\n return 1;\n },\n directed: false,\n root: null\n});\nvar elesfn$m = {\n closenessCentralityNormalized: function closenessCentralityNormalized(options) {\n var _defaults = defaults$e(options),\n harmonic = _defaults.harmonic,\n weight = _defaults.weight,\n directed = _defaults.directed;\n var cy = this.cy();\n var closenesses = {};\n var maxCloseness = 0;\n var nodes = this.nodes();\n var fw = this.floydWarshall({\n weight: weight,\n directed: directed\n });\n\n // Compute closeness for every node and find the maximum closeness\n for (var i = 0; i < nodes.length; i++) {\n var currCloseness = 0;\n var node_i = nodes[i];\n for (var j = 0; j < nodes.length; j++) {\n if (i !== j) {\n var d = fw.distance(node_i, nodes[j]);\n if (harmonic) {\n currCloseness += 1 / d;\n } else {\n currCloseness += d;\n }\n }\n }\n if (!harmonic) {\n currCloseness = 1 / currCloseness;\n }\n if (maxCloseness < currCloseness) {\n maxCloseness = currCloseness;\n }\n closenesses[node_i.id()] = currCloseness;\n }\n return {\n closeness: function closeness(node) {\n if (maxCloseness == 0) {\n return 0;\n }\n if (string(node)) {\n // from is a selector string\n node = cy.filter(node)[0].id();\n } else {\n // from is a node\n node = node.id();\n }\n return closenesses[node] / maxCloseness;\n }\n };\n },\n // Implemented from pseudocode from wikipedia\n closenessCentrality: function closenessCentrality(options) {\n var _defaults2 = defaults$e(options),\n root = _defaults2.root,\n weight = _defaults2.weight,\n directed = _defaults2.directed,\n harmonic = _defaults2.harmonic;\n root = this.filter(root)[0];\n\n // we need distance from this node to every other node\n var dijkstra = this.dijkstra({\n root: root,\n weight: weight,\n directed: directed\n });\n var totalDistance = 0;\n var nodes = this.nodes();\n for (var i = 0; i < nodes.length; i++) {\n var n = nodes[i];\n if (!n.same(root)) {\n var d = dijkstra.distanceTo(n);\n if (harmonic) {\n totalDistance += 1 / d;\n } else {\n totalDistance += d;\n }\n }\n }\n return harmonic ? totalDistance : 1 / totalDistance;\n } // closenessCentrality\n}; // elesfn\n\n// nice, short mathematical alias\nelesfn$m.cc = elesfn$m.closenessCentrality;\nelesfn$m.ccn = elesfn$m.closenessCentralityNormalised = elesfn$m.closenessCentralityNormalized;\n\nvar defaults$d = defaults$g({\n weight: null,\n directed: false\n});\nvar elesfn$l = {\n // Implemented from the algorithm in the paper \"On Variants of Shortest-Path Betweenness Centrality and their Generic Computation\" by Ulrik Brandes\n betweennessCentrality: function betweennessCentrality(options) {\n var _defaults = defaults$d(options),\n directed = _defaults.directed,\n weight = _defaults.weight;\n var weighted = weight != null;\n var cy = this.cy();\n\n // starting\n var V = this.nodes();\n var A = {};\n var _C = {};\n var max = 0;\n var C = {\n set: function set(key, val) {\n _C[key] = val;\n if (val > max) {\n max = val;\n }\n },\n get: function get(key) {\n return _C[key];\n }\n };\n\n // A contains the neighborhoods of every node\n for (var i = 0; i < V.length; i++) {\n var v = V[i];\n var vid = v.id();\n if (directed) {\n A[vid] = v.outgoers().nodes(); // get outgoers of every node\n } else {\n A[vid] = v.openNeighborhood().nodes(); // get neighbors of every node\n }\n C.set(vid, 0);\n }\n var _loop = function _loop() {\n var sid = V[s].id();\n var S = []; // stack\n var P = {};\n var g = {};\n var d = {};\n var Q = new Heap(function (a, b) {\n return d[a] - d[b];\n }); // queue\n\n // init dictionaries\n for (var _i = 0; _i < V.length; _i++) {\n var _vid = V[_i].id();\n P[_vid] = [];\n g[_vid] = 0;\n d[_vid] = Infinity;\n }\n g[sid] = 1; // sigma\n d[sid] = 0; // distance to s\n\n Q.push(sid);\n while (!Q.empty()) {\n var _v = Q.pop();\n S.push(_v);\n if (weighted) {\n for (var j = 0; j < A[_v].length; j++) {\n var w = A[_v][j];\n var vEle = cy.getElementById(_v);\n var edge = undefined;\n if (vEle.edgesTo(w).length > 0) {\n edge = vEle.edgesTo(w)[0];\n } else {\n edge = w.edgesTo(vEle)[0];\n }\n var edgeWeight = weight(edge);\n w = w.id();\n if (d[w] > d[_v] + edgeWeight) {\n d[w] = d[_v] + edgeWeight;\n if (Q.nodes.indexOf(w) < 0) {\n //if w is not in Q\n Q.push(w);\n } else {\n // update position if w is in Q\n Q.updateItem(w);\n }\n g[w] = 0;\n P[w] = [];\n }\n if (d[w] == d[_v] + edgeWeight) {\n g[w] = g[w] + g[_v];\n P[w].push(_v);\n }\n }\n } else {\n for (var _j = 0; _j < A[_v].length; _j++) {\n var _w = A[_v][_j].id();\n if (d[_w] == Infinity) {\n Q.push(_w);\n d[_w] = d[_v] + 1;\n }\n if (d[_w] == d[_v] + 1) {\n g[_w] = g[_w] + g[_v];\n P[_w].push(_v);\n }\n }\n }\n }\n var e = {};\n for (var _i2 = 0; _i2 < V.length; _i2++) {\n e[V[_i2].id()] = 0;\n }\n while (S.length > 0) {\n var _w2 = S.pop();\n for (var _j2 = 0; _j2 < P[_w2].length; _j2++) {\n var _v2 = P[_w2][_j2];\n e[_v2] = e[_v2] + g[_v2] / g[_w2] * (1 + e[_w2]);\n }\n if (_w2 != V[s].id()) {\n C.set(_w2, C.get(_w2) + e[_w2]);\n }\n }\n };\n for (var s = 0; s < V.length; s++) {\n _loop();\n }\n var ret = {\n betweenness: function betweenness(node) {\n var id = cy.collection(node).id();\n return C.get(id);\n },\n betweennessNormalized: function betweennessNormalized(node) {\n if (max == 0) {\n return 0;\n }\n var id = cy.collection(node).id();\n return C.get(id) / max;\n }\n };\n\n // alias\n ret.betweennessNormalised = ret.betweennessNormalized;\n return ret;\n } // betweennessCentrality\n}; // elesfn\n\n// nice, short mathematical alias\nelesfn$l.bc = elesfn$l.betweennessCentrality;\n\n// Implemented by Zoe Xi @zoexi for GSOC 2016\n// https://github.com/cytoscape/cytoscape.js-markov-cluster\n\n\n/* eslint-disable no-unused-vars */\nvar defaults$c = defaults$g({\n expandFactor: 2,\n // affects time of computation and cluster granularity to some extent: M * M\n inflateFactor: 2,\n // affects cluster granularity (the greater the value, the more clusters): M(i,j) / E(j)\n multFactor: 1,\n // optional self loops for each node. Use a neutral value to improve cluster computations.\n maxIterations: 20,\n // maximum number of iterations of the MCL algorithm in a single run\n attributes: [\n // attributes/features used to group nodes, ie. similarity values between nodes\n function (edge) {\n return 1;\n }]\n});\n/* eslint-enable */\n\nvar setOptions$3 = function setOptions(options) {\n return defaults$c(options);\n};\n/* eslint-enable */\n\nvar getSimilarity$1 = function getSimilarity(edge, attributes) {\n var total = 0;\n for (var i = 0; i < attributes.length; i++) {\n total += attributes[i](edge);\n }\n return total;\n};\nvar addLoops = function addLoops(M, n, val) {\n for (var i = 0; i < n; i++) {\n M[i * n + i] = val;\n }\n};\nvar normalize = function normalize(M, n) {\n var sum;\n for (var col = 0; col < n; col++) {\n sum = 0;\n for (var row = 0; row < n; row++) {\n sum += M[row * n + col];\n }\n for (var _row = 0; _row < n; _row++) {\n M[_row * n + col] = M[_row * n + col] / sum;\n }\n }\n};\n\n// TODO: blocked matrix multiplication?\nvar mmult = function mmult(A, B, n) {\n var C = new Array(n * n);\n for (var i = 0; i < n; i++) {\n for (var j = 0; j < n; j++) {\n C[i * n + j] = 0;\n }\n for (var k = 0; k < n; k++) {\n for (var _j = 0; _j < n; _j++) {\n C[i * n + _j] += A[i * n + k] * B[k * n + _j];\n }\n }\n }\n return C;\n};\nvar expand = function expand(M, n, expandFactor /** power **/) {\n var _M = M.slice(0);\n for (var p = 1; p < expandFactor; p++) {\n M = mmult(M, _M, n);\n }\n return M;\n};\nvar inflate = function inflate(M, n, inflateFactor /** r **/) {\n var _M = new Array(n * n);\n\n // M(i,j) ^ inflatePower\n for (var i = 0; i < n * n; i++) {\n _M[i] = Math.pow(M[i], inflateFactor);\n }\n normalize(_M, n);\n return _M;\n};\nvar hasConverged = function hasConverged(M, _M, n2, roundFactor) {\n // Check that both matrices have the same elements (i,j)\n for (var i = 0; i < n2; i++) {\n var v1 = Math.round(M[i] * Math.pow(10, roundFactor)) / Math.pow(10, roundFactor); // truncate to 'roundFactor' decimal places\n var v2 = Math.round(_M[i] * Math.pow(10, roundFactor)) / Math.pow(10, roundFactor);\n if (v1 !== v2) {\n return false;\n }\n }\n return true;\n};\nvar assign$2 = function assign(M, n, nodes, cy) {\n var clusters = [];\n for (var i = 0; i < n; i++) {\n var cluster = [];\n for (var j = 0; j < n; j++) {\n // Row-wise attractors and elements that they attract belong in same cluster\n if (Math.round(M[i * n + j] * 1000) / 1000 > 0) {\n cluster.push(nodes[j]);\n }\n }\n if (cluster.length !== 0) {\n clusters.push(cy.collection(cluster));\n }\n }\n return clusters;\n};\nvar isDuplicate = function isDuplicate(c1, c2) {\n for (var i = 0; i < c1.length; i++) {\n if (!c2[i] || c1[i].id() !== c2[i].id()) {\n return false;\n }\n }\n return true;\n};\nvar removeDuplicates = function removeDuplicates(clusters) {\n for (var i = 0; i < clusters.length; i++) {\n for (var j = 0; j < clusters.length; j++) {\n if (i != j && isDuplicate(clusters[i], clusters[j])) {\n clusters.splice(j, 1);\n }\n }\n }\n return clusters;\n};\nvar markovClustering = function markovClustering(options) {\n var nodes = this.nodes();\n var edges = this.edges();\n var cy = this.cy();\n\n // Set parameters of algorithm:\n var opts = setOptions$3(options);\n\n // Map each node to its position in node array\n var id2position = {};\n for (var i = 0; i < nodes.length; i++) {\n id2position[nodes[i].id()] = i;\n }\n\n // Generate stochastic matrix M from input graph G (should be symmetric/undirected)\n var n = nodes.length,\n n2 = n * n;\n var M = new Array(n2),\n _M;\n for (var _i = 0; _i < n2; _i++) {\n M[_i] = 0;\n }\n for (var e = 0; e < edges.length; e++) {\n var edge = edges[e];\n var _i2 = id2position[edge.source().id()];\n var j = id2position[edge.target().id()];\n var sim = getSimilarity$1(edge, opts.attributes);\n M[_i2 * n + j] += sim; // G should be symmetric and undirected\n M[j * n + _i2] += sim;\n }\n\n // Begin Markov cluster algorithm\n\n // Step 1: Add self loops to each node, ie. add multFactor to matrix diagonal\n addLoops(M, n, opts.multFactor);\n\n // Step 2: M = normalize( M );\n normalize(M, n);\n var isStillMoving = true;\n var iterations = 0;\n while (isStillMoving && iterations < opts.maxIterations) {\n isStillMoving = false;\n\n // Step 3:\n _M = expand(M, n, opts.expandFactor);\n\n // Step 4:\n M = inflate(_M, n, opts.inflateFactor);\n\n // Step 5: check to see if ~steady state has been reached\n if (!hasConverged(M, _M, n2, 4)) {\n isStillMoving = true;\n }\n iterations++;\n }\n\n // Build clusters from matrix\n var clusters = assign$2(M, n, nodes, cy);\n\n // Remove duplicate clusters due to symmetry of graph and M matrix\n clusters = removeDuplicates(clusters);\n return clusters;\n};\nvar markovClustering$1 = {\n markovClustering: markovClustering,\n mcl: markovClustering\n};\n\n// Common distance metrics for clustering algorithms\n// https://en.wikipedia.org/wiki/Hierarchical_clustering#Metric\n\nvar identity$1 = function identity(x) {\n return x;\n};\nvar absDiff = function absDiff(p, q) {\n return Math.abs(q - p);\n};\nvar addAbsDiff = function addAbsDiff(total, p, q) {\n return total + absDiff(p, q);\n};\nvar addSquaredDiff = function addSquaredDiff(total, p, q) {\n return total + Math.pow(q - p, 2);\n};\nvar sqrt = function sqrt(x) {\n return Math.sqrt(x);\n};\nvar maxAbsDiff = function maxAbsDiff(currentMax, p, q) {\n return Math.max(currentMax, absDiff(p, q));\n};\nvar getDistance = function getDistance(length, getP, getQ, init, visit) {\n var post = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : identity$1;\n var ret = init;\n var p, q;\n for (var dim = 0; dim < length; dim++) {\n p = getP(dim);\n q = getQ(dim);\n ret = visit(ret, p, q);\n }\n return post(ret);\n};\nvar distances = {\n euclidean: function euclidean(length, getP, getQ) {\n if (length >= 2) {\n return getDistance(length, getP, getQ, 0, addSquaredDiff, sqrt);\n } else {\n // for single attr case, more efficient to avoid sqrt\n return getDistance(length, getP, getQ, 0, addAbsDiff);\n }\n },\n squaredEuclidean: function squaredEuclidean(length, getP, getQ) {\n return getDistance(length, getP, getQ, 0, addSquaredDiff);\n },\n manhattan: function manhattan(length, getP, getQ) {\n return getDistance(length, getP, getQ, 0, addAbsDiff);\n },\n max: function max(length, getP, getQ) {\n return getDistance(length, getP, getQ, -Infinity, maxAbsDiff);\n }\n};\n\n// in case the user accidentally doesn't use camel case\ndistances['squared-euclidean'] = distances['squaredEuclidean'];\ndistances['squaredeuclidean'] = distances['squaredEuclidean'];\nfunction clusteringDistance (method, length, getP, getQ, nodeP, nodeQ) {\n var impl;\n if (fn$6(method)) {\n impl = method;\n } else {\n impl = distances[method] || distances.euclidean;\n }\n if (length === 0 && fn$6(method)) {\n return impl(nodeP, nodeQ);\n } else {\n return impl(length, getP, getQ, nodeP, nodeQ);\n }\n}\n\nvar defaults$b = defaults$g({\n k: 2,\n m: 2,\n sensitivityThreshold: 0.0001,\n distance: 'euclidean',\n maxIterations: 10,\n attributes: [],\n testMode: false,\n testCentroids: null\n});\nvar setOptions$2 = function setOptions(options) {\n return defaults$b(options);\n};\n\nvar getDist = function getDist(type, node, centroid, attributes, mode) {\n var noNodeP = mode !== 'kMedoids';\n var getP = noNodeP ? function (i) {\n return centroid[i];\n } : function (i) {\n return attributes[i](centroid);\n };\n var getQ = function getQ(i) {\n return attributes[i](node);\n };\n var nodeP = centroid;\n var nodeQ = node;\n return clusteringDistance(type, attributes.length, getP, getQ, nodeP, nodeQ);\n};\nvar randomCentroids = function randomCentroids(nodes, k, attributes) {\n var ndim = attributes.length;\n var min = new Array(ndim);\n var max = new Array(ndim);\n var centroids = new Array(k);\n var centroid = null;\n\n // Find min, max values for each attribute dimension\n for (var i = 0; i < ndim; i++) {\n min[i] = nodes.min(attributes[i]).value;\n max[i] = nodes.max(attributes[i]).value;\n }\n\n // Build k centroids, each represented as an n-dim feature vector\n for (var c = 0; c < k; c++) {\n centroid = [];\n for (var _i = 0; _i < ndim; _i++) {\n centroid[_i] = Math.random() * (max[_i] - min[_i]) + min[_i]; // random initial value\n }\n centroids[c] = centroid;\n }\n return centroids;\n};\nvar classify = function classify(node, centroids, distance, attributes, type) {\n var min = Infinity;\n var index = 0;\n for (var i = 0; i < centroids.length; i++) {\n var dist = getDist(distance, node, centroids[i], attributes, type);\n if (dist < min) {\n min = dist;\n index = i;\n }\n }\n return index;\n};\nvar buildCluster = function buildCluster(centroid, nodes, assignment) {\n var cluster = [];\n var node = null;\n for (var n = 0; n < nodes.length; n++) {\n node = nodes[n];\n if (assignment[node.id()] === centroid) {\n //console.log(\"Node \" + node.id() + \" is associated with medoid #: \" + m);\n cluster.push(node);\n }\n }\n return cluster;\n};\nvar haveValuesConverged = function haveValuesConverged(v1, v2, sensitivityThreshold) {\n return Math.abs(v2 - v1) <= sensitivityThreshold;\n};\nvar haveMatricesConverged = function haveMatricesConverged(v1, v2, sensitivityThreshold) {\n for (var i = 0; i < v1.length; i++) {\n for (var j = 0; j < v1[i].length; j++) {\n var diff = Math.abs(v1[i][j] - v2[i][j]);\n if (diff > sensitivityThreshold) {\n return false;\n }\n }\n }\n return true;\n};\nvar seenBefore = function seenBefore(node, medoids, n) {\n for (var i = 0; i < n; i++) {\n if (node === medoids[i]) return true;\n }\n return false;\n};\nvar randomMedoids = function randomMedoids(nodes, k) {\n var medoids = new Array(k);\n\n // For small data sets, the probability of medoid conflict is greater,\n // so we need to check to see if we've already seen or chose this node before.\n if (nodes.length < 50) {\n // Randomly select k medoids from the n nodes\n for (var i = 0; i < k; i++) {\n var node = nodes[Math.floor(Math.random() * nodes.length)];\n\n // If we've already chosen this node to be a medoid, don't choose it again (for small data sets).\n // Instead choose a different random node.\n while (seenBefore(node, medoids, i)) {\n node = nodes[Math.floor(Math.random() * nodes.length)];\n }\n medoids[i] = node;\n }\n } else {\n // Relatively large data set, so pretty safe to not check and just select random nodes\n for (var _i2 = 0; _i2 < k; _i2++) {\n medoids[_i2] = nodes[Math.floor(Math.random() * nodes.length)];\n }\n }\n return medoids;\n};\nvar findCost = function findCost(potentialNewMedoid, cluster, attributes) {\n var cost = 0;\n for (var n = 0; n < cluster.length; n++) {\n cost += getDist('manhattan', cluster[n], potentialNewMedoid, attributes, 'kMedoids');\n }\n return cost;\n};\nvar kMeans = function kMeans(options) {\n var cy = this.cy();\n var nodes = this.nodes();\n var node = null;\n\n // Set parameters of algorithm: # of clusters, distance metric, etc.\n var opts = setOptions$2(options);\n\n // Begin k-means algorithm\n var clusters = new Array(opts.k);\n var assignment = {};\n var centroids;\n\n // Step 1: Initialize centroid positions\n if (opts.testMode) {\n if (typeof opts.testCentroids === 'number') {\n // TODO: implement a seeded random number generator.\n opts.testCentroids;\n centroids = randomCentroids(nodes, opts.k, opts.attributes);\n } else if (_typeof(opts.testCentroids) === 'object') {\n centroids = opts.testCentroids;\n } else {\n centroids = randomCentroids(nodes, opts.k, opts.attributes);\n }\n } else {\n centroids = randomCentroids(nodes, opts.k, opts.attributes);\n }\n var isStillMoving = true;\n var iterations = 0;\n while (isStillMoving && iterations < opts.maxIterations) {\n // Step 2: Assign nodes to the nearest centroid\n for (var n = 0; n < nodes.length; n++) {\n node = nodes[n];\n // Determine which cluster this node belongs to: node id => cluster #\n assignment[node.id()] = classify(node, centroids, opts.distance, opts.attributes, 'kMeans');\n }\n\n // Step 3: For each of the k clusters, update its centroid\n isStillMoving = false;\n for (var c = 0; c < opts.k; c++) {\n // Get all nodes that belong to this cluster\n var cluster = buildCluster(c, nodes, assignment);\n if (cluster.length === 0) {\n // If cluster is empty, break out early & move to next cluster\n continue;\n }\n\n // Update centroids by calculating avg of all nodes within the cluster.\n var ndim = opts.attributes.length;\n var centroid = centroids[c]; // [ dim_1, dim_2, dim_3, ... , dim_n ]\n var newCentroid = new Array(ndim);\n var sum = new Array(ndim);\n for (var d = 0; d < ndim; d++) {\n sum[d] = 0.0;\n for (var i = 0; i < cluster.length; i++) {\n node = cluster[i];\n sum[d] += opts.attributes[d](node);\n }\n newCentroid[d] = sum[d] / cluster.length;\n\n // Check to see if algorithm has converged, i.e. when centroids no longer change\n if (!haveValuesConverged(newCentroid[d], centroid[d], opts.sensitivityThreshold)) {\n isStillMoving = true;\n }\n }\n centroids[c] = newCentroid;\n clusters[c] = cy.collection(cluster);\n }\n iterations++;\n }\n return clusters;\n};\nvar kMedoids = function kMedoids(options) {\n var cy = this.cy();\n var nodes = this.nodes();\n var node = null;\n var opts = setOptions$2(options);\n\n // Begin k-medoids algorithm\n var clusters = new Array(opts.k);\n var medoids;\n var assignment = {};\n var curCost;\n var minCosts = new Array(opts.k); // minimum cost configuration for each cluster\n\n // Step 1: Initialize k medoids\n if (opts.testMode) {\n if (typeof opts.testCentroids === 'number') ; else if (_typeof(opts.testCentroids) === 'object') {\n medoids = opts.testCentroids;\n } else {\n medoids = randomMedoids(nodes, opts.k);\n }\n } else {\n medoids = randomMedoids(nodes, opts.k);\n }\n var isStillMoving = true;\n var iterations = 0;\n while (isStillMoving && iterations < opts.maxIterations) {\n // Step 2: Assign nodes to the nearest medoid\n for (var n = 0; n < nodes.length; n++) {\n node = nodes[n];\n // Determine which cluster this node belongs to: node id => cluster #\n assignment[node.id()] = classify(node, medoids, opts.distance, opts.attributes, 'kMedoids');\n }\n isStillMoving = false;\n // Step 3: For each medoid m, and for each node associated with mediod m,\n // select the node with the lowest configuration cost as new medoid.\n for (var m = 0; m < medoids.length; m++) {\n // Get all nodes that belong to this medoid\n var cluster = buildCluster(m, nodes, assignment);\n if (cluster.length === 0) {\n // If cluster is empty, break out early & move to next cluster\n continue;\n }\n minCosts[m] = findCost(medoids[m], cluster, opts.attributes); // original cost\n\n // Select different medoid if its configuration has the lowest cost\n for (var _n = 0; _n < cluster.length; _n++) {\n curCost = findCost(cluster[_n], cluster, opts.attributes);\n if (curCost < minCosts[m]) {\n minCosts[m] = curCost;\n medoids[m] = cluster[_n];\n isStillMoving = true;\n }\n }\n clusters[m] = cy.collection(cluster);\n }\n iterations++;\n }\n return clusters;\n};\nvar updateCentroids = function updateCentroids(centroids, nodes, U, weight, opts) {\n var numerator, denominator;\n for (var n = 0; n < nodes.length; n++) {\n for (var c = 0; c < centroids.length; c++) {\n weight[n][c] = Math.pow(U[n][c], opts.m);\n }\n }\n for (var _c = 0; _c < centroids.length; _c++) {\n for (var dim = 0; dim < opts.attributes.length; dim++) {\n numerator = 0;\n denominator = 0;\n for (var _n2 = 0; _n2 < nodes.length; _n2++) {\n numerator += weight[_n2][_c] * opts.attributes[dim](nodes[_n2]);\n denominator += weight[_n2][_c];\n }\n centroids[_c][dim] = numerator / denominator;\n }\n }\n};\nvar updateMembership = function updateMembership(U, _U, centroids, nodes, opts) {\n // Save previous step\n for (var i = 0; i < U.length; i++) {\n _U[i] = U[i].slice();\n }\n var sum, numerator, denominator;\n var pow = 2 / (opts.m - 1);\n for (var c = 0; c < centroids.length; c++) {\n for (var n = 0; n < nodes.length; n++) {\n sum = 0;\n for (var k = 0; k < centroids.length; k++) {\n // against all other centroids\n numerator = getDist(opts.distance, nodes[n], centroids[c], opts.attributes, 'cmeans');\n denominator = getDist(opts.distance, nodes[n], centroids[k], opts.attributes, 'cmeans');\n sum += Math.pow(numerator / denominator, pow);\n }\n U[n][c] = 1 / sum;\n }\n }\n};\nvar assign$1 = function assign(nodes, U, opts, cy) {\n var clusters = new Array(opts.k);\n for (var c = 0; c < clusters.length; c++) {\n clusters[c] = [];\n }\n var max;\n var index;\n for (var n = 0; n < U.length; n++) {\n // for each node (U is N x C matrix)\n max = -Infinity;\n index = -1;\n // Determine which cluster the node is most likely to belong in\n for (var _c2 = 0; _c2 < U[0].length; _c2++) {\n if (U[n][_c2] > max) {\n max = U[n][_c2];\n index = _c2;\n }\n }\n clusters[index].push(nodes[n]);\n }\n\n // Turn every array into a collection of nodes\n for (var _c3 = 0; _c3 < clusters.length; _c3++) {\n clusters[_c3] = cy.collection(clusters[_c3]);\n }\n return clusters;\n};\nvar fuzzyCMeans = function fuzzyCMeans(options) {\n var cy = this.cy();\n var nodes = this.nodes();\n var opts = setOptions$2(options);\n\n // Begin fuzzy c-means algorithm\n var clusters;\n var centroids;\n var U;\n var _U;\n var weight;\n\n // Step 1: Initialize letiables.\n _U = new Array(nodes.length);\n for (var i = 0; i < nodes.length; i++) {\n // N x C matrix\n _U[i] = new Array(opts.k);\n }\n U = new Array(nodes.length);\n for (var _i3 = 0; _i3 < nodes.length; _i3++) {\n // N x C matrix\n U[_i3] = new Array(opts.k);\n }\n for (var _i4 = 0; _i4 < nodes.length; _i4++) {\n var total = 0;\n for (var j = 0; j < opts.k; j++) {\n U[_i4][j] = Math.random();\n total += U[_i4][j];\n }\n for (var _j = 0; _j < opts.k; _j++) {\n U[_i4][_j] = U[_i4][_j] / total;\n }\n }\n centroids = new Array(opts.k);\n for (var _i5 = 0; _i5 < opts.k; _i5++) {\n centroids[_i5] = new Array(opts.attributes.length);\n }\n weight = new Array(nodes.length);\n for (var _i6 = 0; _i6 < nodes.length; _i6++) {\n // N x C matrix\n weight[_i6] = new Array(opts.k);\n }\n // end init FCM\n\n var isStillMoving = true;\n var iterations = 0;\n while (isStillMoving && iterations < opts.maxIterations) {\n isStillMoving = false;\n\n // Step 2: Calculate the centroids for each step.\n updateCentroids(centroids, nodes, U, weight, opts);\n\n // Step 3: Update the partition matrix U.\n updateMembership(U, _U, centroids, nodes, opts);\n\n // Step 4: Check for convergence.\n if (!haveMatricesConverged(U, _U, opts.sensitivityThreshold)) {\n isStillMoving = true;\n }\n iterations++;\n }\n\n // Assign nodes to clusters with highest probability.\n clusters = assign$1(nodes, U, opts, cy);\n return {\n clusters: clusters,\n degreeOfMembership: U\n };\n};\nvar kClustering = {\n kMeans: kMeans,\n kMedoids: kMedoids,\n fuzzyCMeans: fuzzyCMeans,\n fcm: fuzzyCMeans\n};\n\n// Implemented by Zoe Xi @zoexi for GSOC 2016\n// https://github.com/cytoscape/cytoscape.js-hierarchical\n\nvar defaults$a = defaults$g({\n distance: 'euclidean',\n // distance metric to compare nodes\n linkage: 'min',\n // linkage criterion : how to determine the distance between clusters of nodes\n mode: 'threshold',\n // mode:'threshold' => clusters must be threshold distance apart\n threshold: Infinity,\n // the distance threshold\n // mode:'dendrogram' => the nodes are organised as leaves in a tree (siblings are close), merging makes clusters\n addDendrogram: false,\n // whether to add the dendrogram to the graph for viz\n dendrogramDepth: 0,\n // depth at which dendrogram branches are merged into the returned clusters\n attributes: [] // array of attr functions\n});\nvar linkageAliases = {\n 'single': 'min',\n 'complete': 'max'\n};\nvar setOptions$1 = function setOptions(options) {\n var opts = defaults$a(options);\n var preferredAlias = linkageAliases[opts.linkage];\n if (preferredAlias != null) {\n opts.linkage = preferredAlias;\n }\n return opts;\n};\nvar mergeClosest = function mergeClosest(clusters, index, dists, mins, opts) {\n // Find two closest clusters from cached mins\n var minKey = 0;\n var min = Infinity;\n var dist;\n var attrs = opts.attributes;\n var getDist = function getDist(n1, n2) {\n return clusteringDistance(opts.distance, attrs.length, function (i) {\n return attrs[i](n1);\n }, function (i) {\n return attrs[i](n2);\n }, n1, n2);\n };\n for (var i = 0; i < clusters.length; i++) {\n var key = clusters[i].key;\n var _dist = dists[key][mins[key]];\n if (_dist < min) {\n minKey = key;\n min = _dist;\n }\n }\n if (opts.mode === 'threshold' && min >= opts.threshold || opts.mode === 'dendrogram' && clusters.length === 1) {\n return false;\n }\n var c1 = index[minKey];\n var c2 = index[mins[minKey]];\n var merged;\n\n // Merge two closest clusters\n if (opts.mode === 'dendrogram') {\n merged = {\n left: c1,\n right: c2,\n key: c1.key\n };\n } else {\n merged = {\n value: c1.value.concat(c2.value),\n key: c1.key\n };\n }\n clusters[c1.index] = merged;\n clusters.splice(c2.index, 1);\n index[c1.key] = merged;\n\n // Update distances with new merged cluster\n for (var _i = 0; _i < clusters.length; _i++) {\n var cur = clusters[_i];\n if (c1.key === cur.key) {\n dist = Infinity;\n } else if (opts.linkage === 'min') {\n dist = dists[c1.key][cur.key];\n if (dists[c1.key][cur.key] > dists[c2.key][cur.key]) {\n dist = dists[c2.key][cur.key];\n }\n } else if (opts.linkage === 'max') {\n dist = dists[c1.key][cur.key];\n if (dists[c1.key][cur.key] < dists[c2.key][cur.key]) {\n dist = dists[c2.key][cur.key];\n }\n } else if (opts.linkage === 'mean') {\n dist = (dists[c1.key][cur.key] * c1.size + dists[c2.key][cur.key] * c2.size) / (c1.size + c2.size);\n } else {\n if (opts.mode === 'dendrogram') dist = getDist(cur.value, c1.value);else dist = getDist(cur.value[0], c1.value[0]);\n }\n dists[c1.key][cur.key] = dists[cur.key][c1.key] = dist; // distance matrix is symmetric\n }\n\n // Update cached mins\n for (var _i2 = 0; _i2 < clusters.length; _i2++) {\n var key1 = clusters[_i2].key;\n if (mins[key1] === c1.key || mins[key1] === c2.key) {\n var _min = key1;\n for (var j = 0; j < clusters.length; j++) {\n var key2 = clusters[j].key;\n if (dists[key1][key2] < dists[key1][_min]) {\n _min = key2;\n }\n }\n mins[key1] = _min;\n }\n clusters[_i2].index = _i2;\n }\n\n // Clean up meta data used for clustering\n c1.key = c2.key = c1.index = c2.index = null;\n return true;\n};\nvar _getAllChildren = function getAllChildren(root, arr, cy) {\n if (!root) return;\n if (root.value) {\n arr.push(root.value);\n } else {\n if (root.left) _getAllChildren(root.left, arr);\n if (root.right) _getAllChildren(root.right, arr);\n }\n};\nvar _buildDendrogram = function buildDendrogram(root, cy) {\n if (!root) return '';\n if (root.left && root.right) {\n var leftStr = _buildDendrogram(root.left, cy);\n var rightStr = _buildDendrogram(root.right, cy);\n var node = cy.add({\n group: 'nodes',\n data: {\n id: leftStr + ',' + rightStr\n }\n });\n cy.add({\n group: 'edges',\n data: {\n source: leftStr,\n target: node.id()\n }\n });\n cy.add({\n group: 'edges',\n data: {\n source: rightStr,\n target: node.id()\n }\n });\n return node.id();\n } else if (root.value) {\n return root.value.id();\n }\n};\nvar _buildClustersFromTree = function buildClustersFromTree(root, k, cy) {\n if (!root) return [];\n var left = [],\n right = [],\n leaves = [];\n if (k === 0) {\n // don't cut tree, simply return all nodes as 1 single cluster\n if (root.left) _getAllChildren(root.left, left);\n if (root.right) _getAllChildren(root.right, right);\n leaves = left.concat(right);\n return [cy.collection(leaves)];\n } else if (k === 1) {\n // cut at root\n\n if (root.value) {\n // leaf node\n return [cy.collection(root.value)];\n } else {\n if (root.left) _getAllChildren(root.left, left);\n if (root.right) _getAllChildren(root.right, right);\n return [cy.collection(left), cy.collection(right)];\n }\n } else {\n if (root.value) {\n return [cy.collection(root.value)];\n } else {\n if (root.left) left = _buildClustersFromTree(root.left, k - 1, cy);\n if (root.right) right = _buildClustersFromTree(root.right, k - 1, cy);\n return left.concat(right);\n }\n }\n};\n\nvar hierarchicalClustering = function hierarchicalClustering(options) {\n var cy = this.cy();\n var nodes = this.nodes();\n\n // Set parameters of algorithm: linkage type, distance metric, etc.\n var opts = setOptions$1(options);\n var attrs = opts.attributes;\n var getDist = function getDist(n1, n2) {\n return clusteringDistance(opts.distance, attrs.length, function (i) {\n return attrs[i](n1);\n }, function (i) {\n return attrs[i](n2);\n }, n1, n2);\n };\n\n // Begin hierarchical algorithm\n var clusters = [];\n var dists = []; // distances between each pair of clusters\n var mins = []; // closest cluster for each cluster\n var index = []; // hash of all clusters by key\n\n // In agglomerative (bottom-up) clustering, each node starts as its own cluster\n for (var n = 0; n < nodes.length; n++) {\n var cluster = {\n value: opts.mode === 'dendrogram' ? nodes[n] : [nodes[n]],\n key: n,\n index: n\n };\n clusters[n] = cluster;\n index[n] = cluster;\n dists[n] = [];\n mins[n] = 0;\n }\n\n // Calculate the distance between each pair of clusters\n for (var i = 0; i < clusters.length; i++) {\n for (var j = 0; j <= i; j++) {\n var dist = undefined;\n if (opts.mode === 'dendrogram') {\n // modes store cluster values differently\n dist = i === j ? Infinity : getDist(clusters[i].value, clusters[j].value);\n } else {\n dist = i === j ? Infinity : getDist(clusters[i].value[0], clusters[j].value[0]);\n }\n dists[i][j] = dist;\n dists[j][i] = dist;\n if (dist < dists[i][mins[i]]) {\n mins[i] = j; // Cache mins: closest cluster to cluster i is cluster j\n }\n }\n }\n\n // Find the closest pair of clusters and merge them into a single cluster.\n // Update distances between new cluster and each of the old clusters, and loop until threshold reached.\n var merged = mergeClosest(clusters, index, dists, mins, opts);\n while (merged) {\n merged = mergeClosest(clusters, index, dists, mins, opts);\n }\n var retClusters;\n\n // Dendrogram mode builds the hierarchy and adds intermediary nodes + edges\n // in addition to returning the clusters.\n if (opts.mode === 'dendrogram') {\n retClusters = _buildClustersFromTree(clusters[0], opts.dendrogramDepth, cy);\n if (opts.addDendrogram) _buildDendrogram(clusters[0], cy);\n } else {\n // Regular mode simply returns the clusters\n\n retClusters = new Array(clusters.length);\n clusters.forEach(function (cluster, i) {\n // Clean up meta data used for clustering\n cluster.key = cluster.index = null;\n retClusters[i] = cy.collection(cluster.value);\n });\n }\n return retClusters;\n};\nvar hierarchicalClustering$1 = {\n hierarchicalClustering: hierarchicalClustering,\n hca: hierarchicalClustering\n};\n\n// Implemented by Zoe Xi @zoexi for GSOC 2016\n// https://github.com/cytoscape/cytoscape.js-affinity-propagation\n\nvar defaults$9 = defaults$g({\n distance: 'euclidean',\n // distance metric to compare attributes between two nodes\n preference: 'median',\n // suitability of a data point to serve as an exemplar\n damping: 0.8,\n // damping factor between [0.5, 1)\n maxIterations: 1000,\n // max number of iterations to run\n minIterations: 100,\n // min number of iterations to run in order for clustering to stop\n attributes: [// functions to quantify the similarity between any two points\n // e.g. node => node.data('weight')\n ]\n});\nvar setOptions = function setOptions(options) {\n var dmp = options.damping;\n var pref = options.preference;\n if (!(0.5 <= dmp && dmp < 1)) {\n error(\"Damping must range on [0.5, 1). Got: \".concat(dmp));\n }\n var validPrefs = ['median', 'mean', 'min', 'max'];\n if (!(validPrefs.some(function (v) {\n return v === pref;\n }) || number$1(pref))) {\n error(\"Preference must be one of [\".concat(validPrefs.map(function (p) {\n return \"'\".concat(p, \"'\");\n }).join(', '), \"] or a number. Got: \").concat(pref));\n }\n return defaults$9(options);\n};\n\nvar getSimilarity = function getSimilarity(type, n1, n2, attributes) {\n var attr = function attr(n, i) {\n return attributes[i](n);\n };\n\n // nb negative because similarity should have an inverse relationship to distance\n return -clusteringDistance(type, attributes.length, function (i) {\n return attr(n1, i);\n }, function (i) {\n return attr(n2, i);\n }, n1, n2);\n};\nvar getPreference = function getPreference(S, preference) {\n // larger preference = greater # of clusters\n var p = null;\n if (preference === 'median') {\n p = median(S);\n } else if (preference === 'mean') {\n p = mean(S);\n } else if (preference === 'min') {\n p = min(S);\n } else if (preference === 'max') {\n p = max(S);\n } else {\n // Custom preference number, as set by user\n p = preference;\n }\n return p;\n};\nvar findExemplars = function findExemplars(n, R, A) {\n var indices = [];\n for (var i = 0; i < n; i++) {\n if (R[i * n + i] + A[i * n + i] > 0) {\n indices.push(i);\n }\n }\n return indices;\n};\nvar assignClusters = function assignClusters(n, S, exemplars) {\n var clusters = [];\n for (var i = 0; i < n; i++) {\n var index = -1;\n var max = -Infinity;\n for (var ei = 0; ei < exemplars.length; ei++) {\n var e = exemplars[ei];\n if (S[i * n + e] > max) {\n index = e;\n max = S[i * n + e];\n }\n }\n if (index > 0) {\n clusters.push(index);\n }\n }\n for (var _ei = 0; _ei < exemplars.length; _ei++) {\n clusters[exemplars[_ei]] = exemplars[_ei];\n }\n return clusters;\n};\nvar assign = function assign(n, S, exemplars) {\n var clusters = assignClusters(n, S, exemplars);\n for (var ei = 0; ei < exemplars.length; ei++) {\n var ii = [];\n for (var c = 0; c < clusters.length; c++) {\n if (clusters[c] === exemplars[ei]) {\n ii.push(c);\n }\n }\n var maxI = -1;\n var maxSum = -Infinity;\n for (var i = 0; i < ii.length; i++) {\n var sum = 0;\n for (var j = 0; j < ii.length; j++) {\n sum += S[ii[j] * n + ii[i]];\n }\n if (sum > maxSum) {\n maxI = i;\n maxSum = sum;\n }\n }\n exemplars[ei] = ii[maxI];\n }\n clusters = assignClusters(n, S, exemplars);\n return clusters;\n};\nvar affinityPropagation = function affinityPropagation(options) {\n var cy = this.cy();\n var nodes = this.nodes();\n var opts = setOptions(options);\n\n // Map each node to its position in node array\n var id2position = {};\n for (var i = 0; i < nodes.length; i++) {\n id2position[nodes[i].id()] = i;\n }\n\n // Begin affinity propagation algorithm\n\n var n; // number of data points\n var n2; // size of matrices\n var S; // similarity matrix (1D array)\n var p; // preference/suitability of a data point to serve as an exemplar\n var R; // responsibility matrix (1D array)\n var A; // availability matrix (1D array)\n\n n = nodes.length;\n n2 = n * n;\n\n // Initialize and build S similarity matrix\n S = new Array(n2);\n for (var _i = 0; _i < n2; _i++) {\n S[_i] = -Infinity; // for cases where two data points shouldn't be linked together\n }\n for (var _i2 = 0; _i2 < n; _i2++) {\n for (var j = 0; j < n; j++) {\n if (_i2 !== j) {\n S[_i2 * n + j] = getSimilarity(opts.distance, nodes[_i2], nodes[j], opts.attributes);\n }\n }\n }\n\n // Place preferences on the diagonal of S\n p = getPreference(S, opts.preference);\n for (var _i3 = 0; _i3 < n; _i3++) {\n S[_i3 * n + _i3] = p;\n }\n\n // Initialize R responsibility matrix\n R = new Array(n2);\n for (var _i4 = 0; _i4 < n2; _i4++) {\n R[_i4] = 0.0;\n }\n\n // Initialize A availability matrix\n A = new Array(n2);\n for (var _i5 = 0; _i5 < n2; _i5++) {\n A[_i5] = 0.0;\n }\n var old = new Array(n);\n var Rp = new Array(n);\n var se = new Array(n);\n for (var _i6 = 0; _i6 < n; _i6++) {\n old[_i6] = 0.0;\n Rp[_i6] = 0.0;\n se[_i6] = 0;\n }\n var e = new Array(n * opts.minIterations);\n for (var _i7 = 0; _i7 < e.length; _i7++) {\n e[_i7] = 0;\n }\n var iter;\n for (iter = 0; iter < opts.maxIterations; iter++) {\n // main algorithmic loop\n\n // Update R responsibility matrix\n for (var _i8 = 0; _i8 < n; _i8++) {\n var max = -Infinity,\n max2 = -Infinity,\n maxI = -1,\n AS = 0.0;\n for (var _j = 0; _j < n; _j++) {\n old[_j] = R[_i8 * n + _j];\n AS = A[_i8 * n + _j] + S[_i8 * n + _j];\n if (AS >= max) {\n max2 = max;\n max = AS;\n maxI = _j;\n } else if (AS > max2) {\n max2 = AS;\n }\n }\n for (var _j2 = 0; _j2 < n; _j2++) {\n R[_i8 * n + _j2] = (1 - opts.damping) * (S[_i8 * n + _j2] - max) + opts.damping * old[_j2];\n }\n R[_i8 * n + maxI] = (1 - opts.damping) * (S[_i8 * n + maxI] - max2) + opts.damping * old[maxI];\n }\n\n // Update A availability matrix\n for (var _i9 = 0; _i9 < n; _i9++) {\n var sum = 0;\n for (var _j3 = 0; _j3 < n; _j3++) {\n old[_j3] = A[_j3 * n + _i9];\n Rp[_j3] = Math.max(0, R[_j3 * n + _i9]);\n sum += Rp[_j3];\n }\n sum -= Rp[_i9];\n Rp[_i9] = R[_i9 * n + _i9];\n sum += Rp[_i9];\n for (var _j4 = 0; _j4 < n; _j4++) {\n A[_j4 * n + _i9] = (1 - opts.damping) * Math.min(0, sum - Rp[_j4]) + opts.damping * old[_j4];\n }\n A[_i9 * n + _i9] = (1 - opts.damping) * (sum - Rp[_i9]) + opts.damping * old[_i9];\n }\n\n // Check for convergence\n var K = 0;\n for (var _i10 = 0; _i10 < n; _i10++) {\n var E = A[_i10 * n + _i10] + R[_i10 * n + _i10] > 0 ? 1 : 0;\n e[iter % opts.minIterations * n + _i10] = E;\n K += E;\n }\n if (K > 0 && (iter >= opts.minIterations - 1 || iter == opts.maxIterations - 1)) {\n var _sum = 0;\n for (var _i11 = 0; _i11 < n; _i11++) {\n se[_i11] = 0;\n for (var _j5 = 0; _j5 < opts.minIterations; _j5++) {\n se[_i11] += e[_j5 * n + _i11];\n }\n if (se[_i11] === 0 || se[_i11] === opts.minIterations) {\n _sum++;\n }\n }\n if (_sum === n) {\n // then we have convergence\n break;\n }\n }\n }\n\n // Identify exemplars (cluster centers)\n var exemplarsIndices = findExemplars(n, R, A);\n\n // Assign nodes to clusters\n var clusterIndices = assign(n, S, exemplarsIndices);\n var clusters = {};\n for (var c = 0; c < exemplarsIndices.length; c++) {\n clusters[exemplarsIndices[c]] = [];\n }\n for (var _i12 = 0; _i12 < nodes.length; _i12++) {\n var pos = id2position[nodes[_i12].id()];\n var clusterIndex = clusterIndices[pos];\n if (clusterIndex != null) {\n // the node may have not been assigned a cluster if no valid attributes were specified\n clusters[clusterIndex].push(nodes[_i12]);\n }\n }\n var retClusters = new Array(exemplarsIndices.length);\n for (var _c = 0; _c < exemplarsIndices.length; _c++) {\n retClusters[_c] = cy.collection(clusters[exemplarsIndices[_c]]);\n }\n return retClusters;\n};\nvar affinityPropagation$1 = {\n affinityPropagation: affinityPropagation,\n ap: affinityPropagation\n};\n\nvar hierholzerDefaults = defaults$g({\n root: undefined,\n directed: false\n});\nvar elesfn$k = {\n hierholzer: function hierholzer(options) {\n if (!plainObject(options)) {\n var args = arguments;\n options = {\n root: args[0],\n directed: args[1]\n };\n }\n var _hierholzerDefaults = hierholzerDefaults(options),\n root = _hierholzerDefaults.root,\n directed = _hierholzerDefaults.directed;\n var eles = this;\n var dflag = false;\n var oddIn;\n var oddOut;\n var startVertex;\n if (root) startVertex = string(root) ? this.filter(root)[0].id() : root[0].id();\n var nodes = {};\n var edges = {};\n if (directed) {\n eles.forEach(function (ele) {\n var id = ele.id();\n if (ele.isNode()) {\n var ind = ele.indegree(true);\n var outd = ele.outdegree(true);\n var d1 = ind - outd;\n var d2 = outd - ind;\n if (d1 == 1) {\n if (oddIn) dflag = true;else oddIn = id;\n } else if (d2 == 1) {\n if (oddOut) dflag = true;else oddOut = id;\n } else if (d2 > 1 || d1 > 1) {\n dflag = true;\n }\n nodes[id] = [];\n ele.outgoers().forEach(function (e) {\n if (e.isEdge()) nodes[id].push(e.id());\n });\n } else {\n edges[id] = [undefined, ele.target().id()];\n }\n });\n } else {\n eles.forEach(function (ele) {\n var id = ele.id();\n if (ele.isNode()) {\n var d = ele.degree(true);\n if (d % 2) {\n if (!oddIn) oddIn = id;else if (!oddOut) oddOut = id;else dflag = true;\n }\n nodes[id] = [];\n ele.connectedEdges().forEach(function (e) {\n return nodes[id].push(e.id());\n });\n } else {\n edges[id] = [ele.source().id(), ele.target().id()];\n }\n });\n }\n var result = {\n found: false,\n trail: undefined\n };\n if (dflag) return result;else if (oddOut && oddIn) {\n if (directed) {\n if (startVertex && oddOut != startVertex) {\n return result;\n }\n startVertex = oddOut;\n } else {\n if (startVertex && oddOut != startVertex && oddIn != startVertex) {\n return result;\n } else if (!startVertex) {\n startVertex = oddOut;\n }\n }\n } else {\n if (!startVertex) startVertex = eles[0].id();\n }\n var walk = function walk(v) {\n var currentNode = v;\n var subtour = [v];\n var adj, adjTail, adjHead;\n while (nodes[currentNode].length) {\n adj = nodes[currentNode].shift();\n adjTail = edges[adj][0];\n adjHead = edges[adj][1];\n if (currentNode != adjHead) {\n nodes[adjHead] = nodes[adjHead].filter(function (e) {\n return e != adj;\n });\n currentNode = adjHead;\n } else if (!directed && currentNode != adjTail) {\n nodes[adjTail] = nodes[adjTail].filter(function (e) {\n return e != adj;\n });\n currentNode = adjTail;\n }\n subtour.unshift(adj);\n subtour.unshift(currentNode);\n }\n return subtour;\n };\n var trail = [];\n var subtour = [];\n subtour = walk(startVertex);\n while (subtour.length != 1) {\n if (nodes[subtour[0]].length == 0) {\n trail.unshift(eles.getElementById(subtour.shift()));\n trail.unshift(eles.getElementById(subtour.shift()));\n } else {\n subtour = walk(subtour.shift()).concat(subtour);\n }\n }\n trail.unshift(eles.getElementById(subtour.shift())); // final node\n\n for (var d in nodes) {\n if (nodes[d].length) {\n return result;\n }\n }\n result.found = true;\n result.trail = this.spawn(trail, true);\n return result;\n }\n};\n\nvar hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() {\n var eles = this;\n var nodes = {};\n var id = 0;\n var edgeCount = 0;\n var components = [];\n var stack = [];\n var visitedEdges = {};\n var buildComponent = function buildComponent(x, y) {\n var i = stack.length - 1;\n var cutset = [];\n var component = eles.spawn();\n while (stack[i].x != x || stack[i].y != y) {\n cutset.push(stack.pop().edge);\n i--;\n }\n cutset.push(stack.pop().edge);\n cutset.forEach(function (edge) {\n var connectedNodes = edge.connectedNodes().intersection(eles);\n component.merge(edge);\n connectedNodes.forEach(function (node) {\n var nodeId = node.id();\n var connectedEdges = node.connectedEdges().intersection(eles);\n component.merge(node);\n if (!nodes[nodeId].cutVertex) {\n component.merge(connectedEdges);\n } else {\n component.merge(connectedEdges.filter(function (edge) {\n return edge.isLoop();\n }));\n }\n });\n });\n components.push(component);\n };\n var _biconnectedSearch = function biconnectedSearch(root, currentNode, parent) {\n if (root === parent) edgeCount += 1;\n nodes[currentNode] = {\n id: id,\n low: id++,\n cutVertex: false\n };\n var edges = eles.getElementById(currentNode).connectedEdges().intersection(eles);\n if (edges.size() === 0) {\n components.push(eles.spawn(eles.getElementById(currentNode)));\n } else {\n var sourceId, targetId, otherNodeId, edgeId;\n edges.forEach(function (edge) {\n sourceId = edge.source().id();\n targetId = edge.target().id();\n otherNodeId = sourceId === currentNode ? targetId : sourceId;\n if (otherNodeId !== parent) {\n edgeId = edge.id();\n if (!visitedEdges[edgeId]) {\n visitedEdges[edgeId] = true;\n stack.push({\n x: currentNode,\n y: otherNodeId,\n edge: edge\n });\n }\n if (!(otherNodeId in nodes)) {\n _biconnectedSearch(root, otherNodeId, currentNode);\n nodes[currentNode].low = Math.min(nodes[currentNode].low, nodes[otherNodeId].low);\n if (nodes[currentNode].id <= nodes[otherNodeId].low) {\n nodes[currentNode].cutVertex = true;\n buildComponent(currentNode, otherNodeId);\n }\n } else {\n nodes[currentNode].low = Math.min(nodes[currentNode].low, nodes[otherNodeId].id);\n }\n }\n });\n }\n };\n eles.forEach(function (ele) {\n if (ele.isNode()) {\n var nodeId = ele.id();\n if (!(nodeId in nodes)) {\n edgeCount = 0;\n _biconnectedSearch(nodeId, nodeId);\n nodes[nodeId].cutVertex = edgeCount > 1;\n }\n }\n });\n var cutVertices = Object.keys(nodes).filter(function (id) {\n return nodes[id].cutVertex;\n }).map(function (id) {\n return eles.getElementById(id);\n });\n return {\n cut: eles.spawn(cutVertices),\n components: components\n };\n};\nvar hopcroftTarjanBiconnected$1 = {\n hopcroftTarjanBiconnected: hopcroftTarjanBiconnected,\n htbc: hopcroftTarjanBiconnected,\n htb: hopcroftTarjanBiconnected,\n hopcroftTarjanBiconnectedComponents: hopcroftTarjanBiconnected\n};\n\nvar tarjanStronglyConnected = function tarjanStronglyConnected() {\n var eles = this;\n var nodes = {};\n var index = 0;\n var components = [];\n var stack = [];\n var cut = eles.spawn(eles);\n var _stronglyConnectedSearch = function stronglyConnectedSearch(sourceNodeId) {\n stack.push(sourceNodeId);\n nodes[sourceNodeId] = {\n index: index,\n low: index++,\n explored: false\n };\n var connectedEdges = eles.getElementById(sourceNodeId).connectedEdges().intersection(eles);\n connectedEdges.forEach(function (edge) {\n var targetNodeId = edge.target().id();\n if (targetNodeId !== sourceNodeId) {\n if (!(targetNodeId in nodes)) {\n _stronglyConnectedSearch(targetNodeId);\n }\n if (!nodes[targetNodeId].explored) {\n nodes[sourceNodeId].low = Math.min(nodes[sourceNodeId].low, nodes[targetNodeId].low);\n }\n }\n });\n if (nodes[sourceNodeId].index === nodes[sourceNodeId].low) {\n var componentNodes = eles.spawn();\n for (;;) {\n var nodeId = stack.pop();\n componentNodes.merge(eles.getElementById(nodeId));\n nodes[nodeId].low = nodes[sourceNodeId].index;\n nodes[nodeId].explored = true;\n if (nodeId === sourceNodeId) {\n break;\n }\n }\n var componentEdges = componentNodes.edgesWith(componentNodes);\n var component = componentNodes.merge(componentEdges);\n components.push(component);\n cut = cut.difference(component);\n }\n };\n eles.forEach(function (ele) {\n if (ele.isNode()) {\n var nodeId = ele.id();\n if (!(nodeId in nodes)) {\n _stronglyConnectedSearch(nodeId);\n }\n }\n });\n return {\n cut: cut,\n components: components\n };\n};\nvar tarjanStronglyConnected$1 = {\n tarjanStronglyConnected: tarjanStronglyConnected,\n tsc: tarjanStronglyConnected,\n tscc: tarjanStronglyConnected,\n tarjanStronglyConnectedComponents: tarjanStronglyConnected\n};\n\nvar elesfn$j = {};\n[elesfn$v, elesfn$u, elesfn$t, elesfn$s, elesfn$r, elesfn$q, elesfn$p, elesfn$o, elesfn$n, elesfn$m, elesfn$l, markovClustering$1, kClustering, hierarchicalClustering$1, affinityPropagation$1, elesfn$k, hopcroftTarjanBiconnected$1, tarjanStronglyConnected$1].forEach(function (props) {\n extend(elesfn$j, props);\n});\n\n/*!\nEmbeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable\nCopyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com)\nLicensed under The MIT License (http://opensource.org/licenses/MIT)\n*/\n\n/* promise states [Promises/A+ 2.1] */\nvar STATE_PENDING = 0; /* [Promises/A+ 2.1.1] */\nvar STATE_FULFILLED = 1; /* [Promises/A+ 2.1.2] */\nvar STATE_REJECTED = 2; /* [Promises/A+ 2.1.3] */\n\n/* promise object constructor */\nvar _api = function api(executor) {\n /* optionally support non-constructor/plain-function call */\n if (!(this instanceof _api)) return new _api(executor);\n\n /* initialize object */\n this.id = 'Thenable/1.0.7';\n this.state = STATE_PENDING; /* initial state */\n this.fulfillValue = undefined; /* initial value */ /* [Promises/A+ 1.3, 2.1.2.2] */\n this.rejectReason = undefined; /* initial reason */ /* [Promises/A+ 1.5, 2.1.3.2] */\n this.onFulfilled = []; /* initial handlers */\n this.onRejected = []; /* initial handlers */\n\n /* provide optional information-hiding proxy */\n this.proxy = {\n then: this.then.bind(this)\n };\n\n /* support optional executor function */\n if (typeof executor === 'function') executor.call(this, this.fulfill.bind(this), this.reject.bind(this));\n};\n\n/* promise API methods */\n_api.prototype = {\n /* promise resolving methods */\n fulfill: function fulfill(value) {\n return deliver(this, STATE_FULFILLED, 'fulfillValue', value);\n },\n reject: function reject(value) {\n return deliver(this, STATE_REJECTED, 'rejectReason', value);\n },\n /* \"The then Method\" [Promises/A+ 1.1, 1.2, 2.2] */\n then: function then(onFulfilled, onRejected) {\n var curr = this;\n var next = new _api(); /* [Promises/A+ 2.2.7] */\n curr.onFulfilled.push(resolver(onFulfilled, next, 'fulfill')); /* [Promises/A+ 2.2.2/2.2.6] */\n curr.onRejected.push(resolver(onRejected, next, 'reject')); /* [Promises/A+ 2.2.3/2.2.6] */\n execute(curr);\n return next.proxy; /* [Promises/A+ 2.2.7, 3.3] */\n }\n};\n\n/* deliver an action */\nvar deliver = function deliver(curr, state, name, value) {\n if (curr.state === STATE_PENDING) {\n curr.state = state; /* [Promises/A+ 2.1.2.1, 2.1.3.1] */\n curr[name] = value; /* [Promises/A+ 2.1.2.2, 2.1.3.2] */\n execute(curr);\n }\n return curr;\n};\n\n/* execute all handlers */\nvar execute = function execute(curr) {\n if (curr.state === STATE_FULFILLED) execute_handlers(curr, 'onFulfilled', curr.fulfillValue);else if (curr.state === STATE_REJECTED) execute_handlers(curr, 'onRejected', curr.rejectReason);\n};\n\n/* execute particular set of handlers */\nvar execute_handlers = function execute_handlers(curr, name, value) {\n /* global setImmediate: true */\n /* global setTimeout: true */\n\n /* short-circuit processing */\n if (curr[name].length === 0) return;\n\n /* iterate over all handlers, exactly once */\n var handlers = curr[name];\n curr[name] = []; /* [Promises/A+ 2.2.2.3, 2.2.3.3] */\n var func = function func() {\n for (var i = 0; i < handlers.length; i++) handlers[i](value); /* [Promises/A+ 2.2.5] */\n };\n\n /* execute procedure asynchronously */ /* [Promises/A+ 2.2.4, 3.1] */\n if (typeof setImmediate === 'function') setImmediate(func);else setTimeout(func, 0);\n};\n\n/* generate a resolver function */\nvar resolver = function resolver(cb, next, method) {\n return function (value) {\n if (typeof cb !== 'function') /* [Promises/A+ 2.2.1, 2.2.7.3, 2.2.7.4] */\n next[method].call(next, value); /* [Promises/A+ 2.2.7.3, 2.2.7.4] */else {\n var result;\n try {\n result = cb(value);\n } /* [Promises/A+ 2.2.2.1, 2.2.3.1, 2.2.5, 3.2] */ catch (e) {\n next.reject(e); /* [Promises/A+ 2.2.7.2] */\n return;\n }\n _resolve(next, result); /* [Promises/A+ 2.2.7.1] */\n }\n };\n};\n\n/* \"Promise Resolution Procedure\" */ /* [Promises/A+ 2.3] */\nvar _resolve = function resolve(promise, x) {\n /* sanity check arguments */ /* [Promises/A+ 2.3.1] */\n if (promise === x || promise.proxy === x) {\n promise.reject(new TypeError('cannot resolve promise with itself'));\n return;\n }\n\n /* surgically check for a \"then\" method\n (mainly to just call the \"getter\" of \"then\" only once) */\n var then;\n if (_typeof(x) === 'object' && x !== null || typeof x === 'function') {\n try {\n then = x.then;\n } /* [Promises/A+ 2.3.3.1, 3.5] */ catch (e) {\n promise.reject(e); /* [Promises/A+ 2.3.3.2] */\n return;\n }\n }\n\n /* handle own Thenables [Promises/A+ 2.3.2]\n and similar \"thenables\" [Promises/A+ 2.3.3] */\n if (typeof then === 'function') {\n var resolved = false;\n try {\n /* call retrieved \"then\" method */ /* [Promises/A+ 2.3.3.3] */\n then.call(x, /* resolvePromise */ /* [Promises/A+ 2.3.3.3.1] */\n function (y) {\n if (resolved) return;\n resolved = true; /* [Promises/A+ 2.3.3.3.3] */\n if (y === x) /* [Promises/A+ 3.6] */\n promise.reject(new TypeError('circular thenable chain'));else _resolve(promise, y);\n }, /* rejectPromise */ /* [Promises/A+ 2.3.3.3.2] */\n function (r) {\n if (resolved) return;\n resolved = true; /* [Promises/A+ 2.3.3.3.3] */\n promise.reject(r);\n });\n } catch (e) {\n if (!resolved) /* [Promises/A+ 2.3.3.3.3] */\n promise.reject(e); /* [Promises/A+ 2.3.3.3.4] */\n }\n return;\n }\n\n /* handle other values */\n promise.fulfill(x); /* [Promises/A+ 2.3.4, 2.3.3.4] */\n};\n\n// so we always have Promise.all()\n_api.all = function (ps) {\n return new _api(function (resolveAll, rejectAll) {\n var vals = new Array(ps.length);\n var doneCount = 0;\n var fulfill = function fulfill(i, val) {\n vals[i] = val;\n doneCount++;\n if (doneCount === ps.length) {\n resolveAll(vals);\n }\n };\n for (var i = 0; i < ps.length; i++) {\n (function (i) {\n var p = ps[i];\n var isPromise = p != null && p.then != null;\n if (isPromise) {\n p.then(function (val) {\n fulfill(i, val);\n }, function (err) {\n rejectAll(err);\n });\n } else {\n var val = p;\n fulfill(i, val);\n }\n })(i);\n }\n });\n};\n_api.resolve = function (val) {\n return new _api(function (resolve, reject) {\n resolve(val);\n });\n};\n_api.reject = function (val) {\n return new _api(function (resolve, reject) {\n reject(val);\n });\n};\nvar Promise$1 = typeof Promise !== 'undefined' ? Promise : _api; // eslint-disable-line no-undef\n\nvar Animation = function Animation(target, opts, opts2) {\n var isCore = core(target);\n var isEle = !isCore;\n var _p = this._private = extend({\n duration: 1000\n }, opts, opts2);\n _p.target = target;\n _p.style = _p.style || _p.css;\n _p.started = false;\n _p.playing = false;\n _p.hooked = false;\n _p.applying = false;\n _p.progress = 0;\n _p.completes = [];\n _p.frames = [];\n if (_p.complete && fn$6(_p.complete)) {\n _p.completes.push(_p.complete);\n }\n if (isEle) {\n var pos = target.position();\n _p.startPosition = _p.startPosition || {\n x: pos.x,\n y: pos.y\n };\n _p.startStyle = _p.startStyle || target.cy().style().getAnimationStartStyle(target, _p.style);\n }\n if (isCore) {\n var pan = target.pan();\n _p.startPan = {\n x: pan.x,\n y: pan.y\n };\n _p.startZoom = target.zoom();\n }\n\n // for future timeline/animations impl\n this.length = 1;\n this[0] = this;\n};\nvar anifn = Animation.prototype;\nextend(anifn, {\n instanceString: function instanceString() {\n return 'animation';\n },\n hook: function hook() {\n var _p = this._private;\n if (!_p.hooked) {\n // add to target's animation queue\n var q;\n var tAni = _p.target._private.animation;\n if (_p.queue) {\n q = tAni.queue;\n } else {\n q = tAni.current;\n }\n q.push(this);\n\n // add to the animation loop pool\n if (elementOrCollection(_p.target)) {\n _p.target.cy().addToAnimationPool(_p.target);\n }\n _p.hooked = true;\n }\n return this;\n },\n play: function play() {\n var _p = this._private;\n\n // autorewind\n if (_p.progress === 1) {\n _p.progress = 0;\n }\n _p.playing = true;\n _p.started = false; // needs to be started by animation loop\n _p.stopped = false;\n this.hook();\n\n // the animation loop will start the animation...\n\n return this;\n },\n playing: function playing() {\n return this._private.playing;\n },\n apply: function apply() {\n var _p = this._private;\n _p.applying = true;\n _p.started = false; // needs to be started by animation loop\n _p.stopped = false;\n this.hook();\n\n // the animation loop will apply the animation at this progress\n\n return this;\n },\n applying: function applying() {\n return this._private.applying;\n },\n pause: function pause() {\n var _p = this._private;\n _p.playing = false;\n _p.started = false;\n return this;\n },\n stop: function stop() {\n var _p = this._private;\n _p.playing = false;\n _p.started = false;\n _p.stopped = true; // to be removed from animation queues\n\n return this;\n },\n rewind: function rewind() {\n return this.progress(0);\n },\n fastforward: function fastforward() {\n return this.progress(1);\n },\n time: function time(t) {\n var _p = this._private;\n if (t === undefined) {\n return _p.progress * _p.duration;\n } else {\n return this.progress(t / _p.duration);\n }\n },\n progress: function progress(p) {\n var _p = this._private;\n var wasPlaying = _p.playing;\n if (p === undefined) {\n return _p.progress;\n } else {\n if (wasPlaying) {\n this.pause();\n }\n _p.progress = p;\n _p.started = false;\n if (wasPlaying) {\n this.play();\n }\n }\n return this;\n },\n completed: function completed() {\n return this._private.progress === 1;\n },\n reverse: function reverse() {\n var _p = this._private;\n var wasPlaying = _p.playing;\n if (wasPlaying) {\n this.pause();\n }\n _p.progress = 1 - _p.progress;\n _p.started = false;\n var swap = function swap(a, b) {\n var _pa = _p[a];\n if (_pa == null) {\n return;\n }\n _p[a] = _p[b];\n _p[b] = _pa;\n };\n swap('zoom', 'startZoom');\n swap('pan', 'startPan');\n swap('position', 'startPosition');\n\n // swap styles\n if (_p.style) {\n for (var i = 0; i < _p.style.length; i++) {\n var prop = _p.style[i];\n var name = prop.name;\n var startStyleProp = _p.startStyle[name];\n _p.startStyle[name] = prop;\n _p.style[i] = startStyleProp;\n }\n }\n if (wasPlaying) {\n this.play();\n }\n return this;\n },\n promise: function promise(type) {\n var _p = this._private;\n var arr;\n switch (type) {\n case 'frame':\n arr = _p.frames;\n break;\n default:\n case 'complete':\n case 'completed':\n arr = _p.completes;\n }\n return new Promise$1(function (resolve, reject) {\n arr.push(function () {\n resolve();\n });\n });\n }\n});\nanifn.complete = anifn.completed;\nanifn.run = anifn.play;\nanifn.running = anifn.playing;\n\nvar define$3 = {\n animated: function animated() {\n return function animatedImpl() {\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n var cy = this._private.cy || this;\n if (!cy.styleEnabled()) {\n return false;\n }\n var ele = all[0];\n if (ele) {\n return ele._private.animation.current.length > 0;\n }\n };\n },\n // animated\n\n clearQueue: function clearQueue() {\n return function clearQueueImpl() {\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n var cy = this._private.cy || this;\n if (!cy.styleEnabled()) {\n return this;\n }\n for (var i = 0; i < all.length; i++) {\n var ele = all[i];\n ele._private.animation.queue = [];\n }\n return this;\n };\n },\n // clearQueue\n\n delay: function delay() {\n return function delayImpl(time, complete) {\n var cy = this._private.cy || this;\n if (!cy.styleEnabled()) {\n return this;\n }\n return this.animate({\n delay: time,\n duration: time,\n complete: complete\n });\n };\n },\n // delay\n\n delayAnimation: function delayAnimation() {\n return function delayAnimationImpl(time, complete) {\n var cy = this._private.cy || this;\n if (!cy.styleEnabled()) {\n return this;\n }\n return this.animation({\n delay: time,\n duration: time,\n complete: complete\n });\n };\n },\n // delay\n\n animation: function animation() {\n return function animationImpl(properties, params) {\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n var cy = this._private.cy || this;\n var isCore = !selfIsArrayLike;\n var isEles = !isCore;\n if (!cy.styleEnabled()) {\n return this;\n }\n var style = cy.style();\n properties = extend({}, properties, params);\n var propertiesEmpty = Object.keys(properties).length === 0;\n if (propertiesEmpty) {\n return new Animation(all[0], properties); // nothing to animate\n }\n if (properties.duration === undefined) {\n properties.duration = 400;\n }\n switch (properties.duration) {\n case 'slow':\n properties.duration = 600;\n break;\n case 'fast':\n properties.duration = 200;\n break;\n }\n if (isEles) {\n properties.style = style.getPropsList(properties.style || properties.css);\n properties.css = undefined;\n }\n if (isEles && properties.renderedPosition != null) {\n var rpos = properties.renderedPosition;\n var pan = cy.pan();\n var zoom = cy.zoom();\n properties.position = renderedToModelPosition(rpos, zoom, pan);\n }\n\n // override pan w/ panBy if set\n if (isCore && properties.panBy != null) {\n var panBy = properties.panBy;\n var cyPan = cy.pan();\n properties.pan = {\n x: cyPan.x + panBy.x,\n y: cyPan.y + panBy.y\n };\n }\n\n // override pan w/ center if set\n var center = properties.center || properties.centre;\n if (isCore && center != null) {\n var centerPan = cy.getCenterPan(center.eles, properties.zoom);\n if (centerPan != null) {\n properties.pan = centerPan;\n }\n }\n\n // override pan & zoom w/ fit if set\n if (isCore && properties.fit != null) {\n var fit = properties.fit;\n var fitVp = cy.getFitViewport(fit.eles || fit.boundingBox, fit.padding);\n if (fitVp != null) {\n properties.pan = fitVp.pan;\n properties.zoom = fitVp.zoom;\n }\n }\n\n // override zoom (& potentially pan) w/ zoom obj if set\n if (isCore && plainObject(properties.zoom)) {\n var vp = cy.getZoomedViewport(properties.zoom);\n if (vp != null) {\n if (vp.zoomed) {\n properties.zoom = vp.zoom;\n }\n if (vp.panned) {\n properties.pan = vp.pan;\n }\n } else {\n properties.zoom = null; // an inavalid zoom (e.g. no delta) gets automatically destroyed\n }\n }\n return new Animation(all[0], properties);\n };\n },\n // animate\n\n animate: function animate() {\n return function animateImpl(properties, params) {\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n var cy = this._private.cy || this;\n if (!cy.styleEnabled()) {\n return this;\n }\n if (params) {\n properties = extend({}, properties, params);\n }\n\n // manually hook and run the animation\n for (var i = 0; i < all.length; i++) {\n var ele = all[i];\n var queue = ele.animated() && (properties.queue === undefined || properties.queue);\n var ani = ele.animation(properties, queue ? {\n queue: true\n } : undefined);\n ani.play();\n }\n return this; // chaining\n };\n },\n // animate\n\n stop: function stop() {\n return function stopImpl(clearQueue, jumpToEnd) {\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n var cy = this._private.cy || this;\n if (!cy.styleEnabled()) {\n return this;\n }\n for (var i = 0; i < all.length; i++) {\n var ele = all[i];\n var _p = ele._private;\n var anis = _p.animation.current;\n for (var j = 0; j < anis.length; j++) {\n var ani = anis[j];\n var ani_p = ani._private;\n if (jumpToEnd) {\n // next iteration of the animation loop, the animation\n // will go straight to the end and be removed\n ani_p.duration = 0;\n }\n }\n\n // clear the queue of future animations\n if (clearQueue) {\n _p.animation.queue = [];\n }\n if (!jumpToEnd) {\n _p.animation.current = [];\n }\n }\n\n // we have to notify (the animation loop doesn't do it for us on `stop`)\n cy.notify('draw');\n return this;\n };\n } // stop\n}; // define\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n\nvar isArray_1;\nvar hasRequiredIsArray;\n\nfunction requireIsArray () {\n\tif (hasRequiredIsArray) return isArray_1;\n\thasRequiredIsArray = 1;\n\tvar isArray = Array.isArray;\n\n\tisArray_1 = isArray;\n\treturn isArray_1;\n}\n\nvar _isKey;\nvar hasRequired_isKey;\n\nfunction require_isKey () {\n\tif (hasRequired_isKey) return _isKey;\n\thasRequired_isKey = 1;\n\tvar isArray = requireIsArray(),\n\t isSymbol = requireIsSymbol();\n\n\t/** Used to match property names within property paths. */\n\tvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n\t reIsPlainProp = /^\\w*$/;\n\n\t/**\n\t * Checks if `value` is a property name and not a property path.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {Object} [object] The object to query keys on.\n\t * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n\t */\n\tfunction isKey(value, object) {\n\t if (isArray(value)) {\n\t return false;\n\t }\n\t var type = typeof value;\n\t if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n\t value == null || isSymbol(value)) {\n\t return true;\n\t }\n\t return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n\t (object != null && value in Object(object));\n\t}\n\n\t_isKey = isKey;\n\treturn _isKey;\n}\n\nvar isFunction_1;\nvar hasRequiredIsFunction;\n\nfunction requireIsFunction () {\n\tif (hasRequiredIsFunction) return isFunction_1;\n\thasRequiredIsFunction = 1;\n\tvar baseGetTag = require_baseGetTag(),\n\t isObject = requireIsObject();\n\n\t/** `Object#toString` result references. */\n\tvar asyncTag = '[object AsyncFunction]',\n\t funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]',\n\t proxyTag = '[object Proxy]';\n\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t if (!isObject(value)) {\n\t return false;\n\t }\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 9 which returns 'object' for typed arrays and other constructors.\n\t var tag = baseGetTag(value);\n\t return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n\t}\n\n\tisFunction_1 = isFunction;\n\treturn isFunction_1;\n}\n\nvar _coreJsData;\nvar hasRequired_coreJsData;\n\nfunction require_coreJsData () {\n\tif (hasRequired_coreJsData) return _coreJsData;\n\thasRequired_coreJsData = 1;\n\tvar root = require_root();\n\n\t/** Used to detect overreaching core-js shims. */\n\tvar coreJsData = root['__core-js_shared__'];\n\n\t_coreJsData = coreJsData;\n\treturn _coreJsData;\n}\n\nvar _isMasked;\nvar hasRequired_isMasked;\n\nfunction require_isMasked () {\n\tif (hasRequired_isMasked) return _isMasked;\n\thasRequired_isMasked = 1;\n\tvar coreJsData = require_coreJsData();\n\n\t/** Used to detect methods masquerading as native. */\n\tvar maskSrcKey = (function() {\n\t var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n\t return uid ? ('Symbol(src)_1.' + uid) : '';\n\t}());\n\n\t/**\n\t * Checks if `func` has its source masked.\n\t *\n\t * @private\n\t * @param {Function} func The function to check.\n\t * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n\t */\n\tfunction isMasked(func) {\n\t return !!maskSrcKey && (maskSrcKey in func);\n\t}\n\n\t_isMasked = isMasked;\n\treturn _isMasked;\n}\n\n/** Used for built-in method references. */\n\nvar _toSource;\nvar hasRequired_toSource;\n\nfunction require_toSource () {\n\tif (hasRequired_toSource) return _toSource;\n\thasRequired_toSource = 1;\n\tvar funcProto = Function.prototype;\n\n\t/** Used to resolve the decompiled source of functions. */\n\tvar funcToString = funcProto.toString;\n\n\t/**\n\t * Converts `func` to its source code.\n\t *\n\t * @private\n\t * @param {Function} func The function to convert.\n\t * @returns {string} Returns the source code.\n\t */\n\tfunction toSource(func) {\n\t if (func != null) {\n\t try {\n\t return funcToString.call(func);\n\t } catch (e) {}\n\t try {\n\t return (func + '');\n\t } catch (e) {}\n\t }\n\t return '';\n\t}\n\n\t_toSource = toSource;\n\treturn _toSource;\n}\n\nvar _baseIsNative;\nvar hasRequired_baseIsNative;\n\nfunction require_baseIsNative () {\n\tif (hasRequired_baseIsNative) return _baseIsNative;\n\thasRequired_baseIsNative = 1;\n\tvar isFunction = requireIsFunction(),\n\t isMasked = require_isMasked(),\n\t isObject = requireIsObject(),\n\t toSource = require_toSource();\n\n\t/**\n\t * Used to match `RegExp`\n\t * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n\t */\n\tvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n\t/** Used to detect host constructors (Safari). */\n\tvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n\t/** Used for built-in method references. */\n\tvar funcProto = Function.prototype,\n\t objectProto = Object.prototype;\n\n\t/** Used to resolve the decompiled source of functions. */\n\tvar funcToString = funcProto.toString;\n\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\n\t/** Used to detect if a method is native. */\n\tvar reIsNative = RegExp('^' +\n\t funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n\t .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n\t);\n\n\t/**\n\t * The base implementation of `_.isNative` without bad shim checks.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a native function,\n\t * else `false`.\n\t */\n\tfunction baseIsNative(value) {\n\t if (!isObject(value) || isMasked(value)) {\n\t return false;\n\t }\n\t var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n\t return pattern.test(toSource(value));\n\t}\n\n\t_baseIsNative = baseIsNative;\n\treturn _baseIsNative;\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n\nvar _getValue;\nvar hasRequired_getValue;\n\nfunction require_getValue () {\n\tif (hasRequired_getValue) return _getValue;\n\thasRequired_getValue = 1;\n\tfunction getValue(object, key) {\n\t return object == null ? undefined : object[key];\n\t}\n\n\t_getValue = getValue;\n\treturn _getValue;\n}\n\nvar _getNative;\nvar hasRequired_getNative;\n\nfunction require_getNative () {\n\tif (hasRequired_getNative) return _getNative;\n\thasRequired_getNative = 1;\n\tvar baseIsNative = require_baseIsNative(),\n\t getValue = require_getValue();\n\n\t/**\n\t * Gets the native function at `key` of `object`.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @param {string} key The key of the method to get.\n\t * @returns {*} Returns the function if it's native, else `undefined`.\n\t */\n\tfunction getNative(object, key) {\n\t var value = getValue(object, key);\n\t return baseIsNative(value) ? value : undefined;\n\t}\n\n\t_getNative = getNative;\n\treturn _getNative;\n}\n\nvar _nativeCreate;\nvar hasRequired_nativeCreate;\n\nfunction require_nativeCreate () {\n\tif (hasRequired_nativeCreate) return _nativeCreate;\n\thasRequired_nativeCreate = 1;\n\tvar getNative = require_getNative();\n\n\t/* Built-in method references that are verified to be native. */\n\tvar nativeCreate = getNative(Object, 'create');\n\n\t_nativeCreate = nativeCreate;\n\treturn _nativeCreate;\n}\n\nvar _hashClear;\nvar hasRequired_hashClear;\n\nfunction require_hashClear () {\n\tif (hasRequired_hashClear) return _hashClear;\n\thasRequired_hashClear = 1;\n\tvar nativeCreate = require_nativeCreate();\n\n\t/**\n\t * Removes all key-value entries from the hash.\n\t *\n\t * @private\n\t * @name clear\n\t * @memberOf Hash\n\t */\n\tfunction hashClear() {\n\t this.__data__ = nativeCreate ? nativeCreate(null) : {};\n\t this.size = 0;\n\t}\n\n\t_hashClear = hashClear;\n\treturn _hashClear;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n\nvar _hashDelete;\nvar hasRequired_hashDelete;\n\nfunction require_hashDelete () {\n\tif (hasRequired_hashDelete) return _hashDelete;\n\thasRequired_hashDelete = 1;\n\tfunction hashDelete(key) {\n\t var result = this.has(key) && delete this.__data__[key];\n\t this.size -= result ? 1 : 0;\n\t return result;\n\t}\n\n\t_hashDelete = hashDelete;\n\treturn _hashDelete;\n}\n\nvar _hashGet;\nvar hasRequired_hashGet;\n\nfunction require_hashGet () {\n\tif (hasRequired_hashGet) return _hashGet;\n\thasRequired_hashGet = 1;\n\tvar nativeCreate = require_nativeCreate();\n\n\t/** Used to stand-in for `undefined` hash values. */\n\tvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\n\t/**\n\t * Gets the hash value for `key`.\n\t *\n\t * @private\n\t * @name get\n\t * @memberOf Hash\n\t * @param {string} key The key of the value to get.\n\t * @returns {*} Returns the entry value.\n\t */\n\tfunction hashGet(key) {\n\t var data = this.__data__;\n\t if (nativeCreate) {\n\t var result = data[key];\n\t return result === HASH_UNDEFINED ? undefined : result;\n\t }\n\t return hasOwnProperty.call(data, key) ? data[key] : undefined;\n\t}\n\n\t_hashGet = hashGet;\n\treturn _hashGet;\n}\n\nvar _hashHas;\nvar hasRequired_hashHas;\n\nfunction require_hashHas () {\n\tif (hasRequired_hashHas) return _hashHas;\n\thasRequired_hashHas = 1;\n\tvar nativeCreate = require_nativeCreate();\n\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\n\t/**\n\t * Checks if a hash value for `key` exists.\n\t *\n\t * @private\n\t * @name has\n\t * @memberOf Hash\n\t * @param {string} key The key of the entry to check.\n\t * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n\t */\n\tfunction hashHas(key) {\n\t var data = this.__data__;\n\t return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n\t}\n\n\t_hashHas = hashHas;\n\treturn _hashHas;\n}\n\nvar _hashSet;\nvar hasRequired_hashSet;\n\nfunction require_hashSet () {\n\tif (hasRequired_hashSet) return _hashSet;\n\thasRequired_hashSet = 1;\n\tvar nativeCreate = require_nativeCreate();\n\n\t/** Used to stand-in for `undefined` hash values. */\n\tvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n\t/**\n\t * Sets the hash `key` to `value`.\n\t *\n\t * @private\n\t * @name set\n\t * @memberOf Hash\n\t * @param {string} key The key of the value to set.\n\t * @param {*} value The value to set.\n\t * @returns {Object} Returns the hash instance.\n\t */\n\tfunction hashSet(key, value) {\n\t var data = this.__data__;\n\t this.size += this.has(key) ? 0 : 1;\n\t data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n\t return this;\n\t}\n\n\t_hashSet = hashSet;\n\treturn _hashSet;\n}\n\nvar _Hash;\nvar hasRequired_Hash;\n\nfunction require_Hash () {\n\tif (hasRequired_Hash) return _Hash;\n\thasRequired_Hash = 1;\n\tvar hashClear = require_hashClear(),\n\t hashDelete = require_hashDelete(),\n\t hashGet = require_hashGet(),\n\t hashHas = require_hashHas(),\n\t hashSet = require_hashSet();\n\n\t/**\n\t * Creates a hash object.\n\t *\n\t * @private\n\t * @constructor\n\t * @param {Array} [entries] The key-value pairs to cache.\n\t */\n\tfunction Hash(entries) {\n\t var index = -1,\n\t length = entries == null ? 0 : entries.length;\n\n\t this.clear();\n\t while (++index < length) {\n\t var entry = entries[index];\n\t this.set(entry[0], entry[1]);\n\t }\n\t}\n\n\t// Add methods to `Hash`.\n\tHash.prototype.clear = hashClear;\n\tHash.prototype['delete'] = hashDelete;\n\tHash.prototype.get = hashGet;\n\tHash.prototype.has = hashHas;\n\tHash.prototype.set = hashSet;\n\n\t_Hash = Hash;\n\treturn _Hash;\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n\nvar _listCacheClear;\nvar hasRequired_listCacheClear;\n\nfunction require_listCacheClear () {\n\tif (hasRequired_listCacheClear) return _listCacheClear;\n\thasRequired_listCacheClear = 1;\n\tfunction listCacheClear() {\n\t this.__data__ = [];\n\t this.size = 0;\n\t}\n\n\t_listCacheClear = listCacheClear;\n\treturn _listCacheClear;\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n\nvar eq_1;\nvar hasRequiredEq;\n\nfunction requireEq () {\n\tif (hasRequiredEq) return eq_1;\n\thasRequiredEq = 1;\n\tfunction eq(value, other) {\n\t return value === other || (value !== value && other !== other);\n\t}\n\n\teq_1 = eq;\n\treturn eq_1;\n}\n\nvar _assocIndexOf;\nvar hasRequired_assocIndexOf;\n\nfunction require_assocIndexOf () {\n\tif (hasRequired_assocIndexOf) return _assocIndexOf;\n\thasRequired_assocIndexOf = 1;\n\tvar eq = requireEq();\n\n\t/**\n\t * Gets the index at which the `key` is found in `array` of key-value pairs.\n\t *\n\t * @private\n\t * @param {Array} array The array to inspect.\n\t * @param {*} key The key to search for.\n\t * @returns {number} Returns the index of the matched value, else `-1`.\n\t */\n\tfunction assocIndexOf(array, key) {\n\t var length = array.length;\n\t while (length--) {\n\t if (eq(array[length][0], key)) {\n\t return length;\n\t }\n\t }\n\t return -1;\n\t}\n\n\t_assocIndexOf = assocIndexOf;\n\treturn _assocIndexOf;\n}\n\nvar _listCacheDelete;\nvar hasRequired_listCacheDelete;\n\nfunction require_listCacheDelete () {\n\tif (hasRequired_listCacheDelete) return _listCacheDelete;\n\thasRequired_listCacheDelete = 1;\n\tvar assocIndexOf = require_assocIndexOf();\n\n\t/** Used for built-in method references. */\n\tvar arrayProto = Array.prototype;\n\n\t/** Built-in value references. */\n\tvar splice = arrayProto.splice;\n\n\t/**\n\t * Removes `key` and its value from the list cache.\n\t *\n\t * @private\n\t * @name delete\n\t * @memberOf ListCache\n\t * @param {string} key The key of the value to remove.\n\t * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n\t */\n\tfunction listCacheDelete(key) {\n\t var data = this.__data__,\n\t index = assocIndexOf(data, key);\n\n\t if (index < 0) {\n\t return false;\n\t }\n\t var lastIndex = data.length - 1;\n\t if (index == lastIndex) {\n\t data.pop();\n\t } else {\n\t splice.call(data, index, 1);\n\t }\n\t --this.size;\n\t return true;\n\t}\n\n\t_listCacheDelete = listCacheDelete;\n\treturn _listCacheDelete;\n}\n\nvar _listCacheGet;\nvar hasRequired_listCacheGet;\n\nfunction require_listCacheGet () {\n\tif (hasRequired_listCacheGet) return _listCacheGet;\n\thasRequired_listCacheGet = 1;\n\tvar assocIndexOf = require_assocIndexOf();\n\n\t/**\n\t * Gets the list cache value for `key`.\n\t *\n\t * @private\n\t * @name get\n\t * @memberOf ListCache\n\t * @param {string} key The key of the value to get.\n\t * @returns {*} Returns the entry value.\n\t */\n\tfunction listCacheGet(key) {\n\t var data = this.__data__,\n\t index = assocIndexOf(data, key);\n\n\t return index < 0 ? undefined : data[index][1];\n\t}\n\n\t_listCacheGet = listCacheGet;\n\treturn _listCacheGet;\n}\n\nvar _listCacheHas;\nvar hasRequired_listCacheHas;\n\nfunction require_listCacheHas () {\n\tif (hasRequired_listCacheHas) return _listCacheHas;\n\thasRequired_listCacheHas = 1;\n\tvar assocIndexOf = require_assocIndexOf();\n\n\t/**\n\t * Checks if a list cache value for `key` exists.\n\t *\n\t * @private\n\t * @name has\n\t * @memberOf ListCache\n\t * @param {string} key The key of the entry to check.\n\t * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n\t */\n\tfunction listCacheHas(key) {\n\t return assocIndexOf(this.__data__, key) > -1;\n\t}\n\n\t_listCacheHas = listCacheHas;\n\treturn _listCacheHas;\n}\n\nvar _listCacheSet;\nvar hasRequired_listCacheSet;\n\nfunction require_listCacheSet () {\n\tif (hasRequired_listCacheSet) return _listCacheSet;\n\thasRequired_listCacheSet = 1;\n\tvar assocIndexOf = require_assocIndexOf();\n\n\t/**\n\t * Sets the list cache `key` to `value`.\n\t *\n\t * @private\n\t * @name set\n\t * @memberOf ListCache\n\t * @param {string} key The key of the value to set.\n\t * @param {*} value The value to set.\n\t * @returns {Object} Returns the list cache instance.\n\t */\n\tfunction listCacheSet(key, value) {\n\t var data = this.__data__,\n\t index = assocIndexOf(data, key);\n\n\t if (index < 0) {\n\t ++this.size;\n\t data.push([key, value]);\n\t } else {\n\t data[index][1] = value;\n\t }\n\t return this;\n\t}\n\n\t_listCacheSet = listCacheSet;\n\treturn _listCacheSet;\n}\n\nvar _ListCache;\nvar hasRequired_ListCache;\n\nfunction require_ListCache () {\n\tif (hasRequired_ListCache) return _ListCache;\n\thasRequired_ListCache = 1;\n\tvar listCacheClear = require_listCacheClear(),\n\t listCacheDelete = require_listCacheDelete(),\n\t listCacheGet = require_listCacheGet(),\n\t listCacheHas = require_listCacheHas(),\n\t listCacheSet = require_listCacheSet();\n\n\t/**\n\t * Creates an list cache object.\n\t *\n\t * @private\n\t * @constructor\n\t * @param {Array} [entries] The key-value pairs to cache.\n\t */\n\tfunction ListCache(entries) {\n\t var index = -1,\n\t length = entries == null ? 0 : entries.length;\n\n\t this.clear();\n\t while (++index < length) {\n\t var entry = entries[index];\n\t this.set(entry[0], entry[1]);\n\t }\n\t}\n\n\t// Add methods to `ListCache`.\n\tListCache.prototype.clear = listCacheClear;\n\tListCache.prototype['delete'] = listCacheDelete;\n\tListCache.prototype.get = listCacheGet;\n\tListCache.prototype.has = listCacheHas;\n\tListCache.prototype.set = listCacheSet;\n\n\t_ListCache = ListCache;\n\treturn _ListCache;\n}\n\nvar _Map;\nvar hasRequired_Map;\n\nfunction require_Map () {\n\tif (hasRequired_Map) return _Map;\n\thasRequired_Map = 1;\n\tvar getNative = require_getNative(),\n\t root = require_root();\n\n\t/* Built-in method references that are verified to be native. */\n\tvar Map = getNative(root, 'Map');\n\n\t_Map = Map;\n\treturn _Map;\n}\n\nvar _mapCacheClear;\nvar hasRequired_mapCacheClear;\n\nfunction require_mapCacheClear () {\n\tif (hasRequired_mapCacheClear) return _mapCacheClear;\n\thasRequired_mapCacheClear = 1;\n\tvar Hash = require_Hash(),\n\t ListCache = require_ListCache(),\n\t Map = require_Map();\n\n\t/**\n\t * Removes all key-value entries from the map.\n\t *\n\t * @private\n\t * @name clear\n\t * @memberOf MapCache\n\t */\n\tfunction mapCacheClear() {\n\t this.size = 0;\n\t this.__data__ = {\n\t 'hash': new Hash,\n\t 'map': new (Map || ListCache),\n\t 'string': new Hash\n\t };\n\t}\n\n\t_mapCacheClear = mapCacheClear;\n\treturn _mapCacheClear;\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n\nvar _isKeyable;\nvar hasRequired_isKeyable;\n\nfunction require_isKeyable () {\n\tif (hasRequired_isKeyable) return _isKeyable;\n\thasRequired_isKeyable = 1;\n\tfunction isKeyable(value) {\n\t var type = typeof value;\n\t return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n\t ? (value !== '__proto__')\n\t : (value === null);\n\t}\n\n\t_isKeyable = isKeyable;\n\treturn _isKeyable;\n}\n\nvar _getMapData;\nvar hasRequired_getMapData;\n\nfunction require_getMapData () {\n\tif (hasRequired_getMapData) return _getMapData;\n\thasRequired_getMapData = 1;\n\tvar isKeyable = require_isKeyable();\n\n\t/**\n\t * Gets the data for `map`.\n\t *\n\t * @private\n\t * @param {Object} map The map to query.\n\t * @param {string} key The reference key.\n\t * @returns {*} Returns the map data.\n\t */\n\tfunction getMapData(map, key) {\n\t var data = map.__data__;\n\t return isKeyable(key)\n\t ? data[typeof key == 'string' ? 'string' : 'hash']\n\t : data.map;\n\t}\n\n\t_getMapData = getMapData;\n\treturn _getMapData;\n}\n\nvar _mapCacheDelete;\nvar hasRequired_mapCacheDelete;\n\nfunction require_mapCacheDelete () {\n\tif (hasRequired_mapCacheDelete) return _mapCacheDelete;\n\thasRequired_mapCacheDelete = 1;\n\tvar getMapData = require_getMapData();\n\n\t/**\n\t * Removes `key` and its value from the map.\n\t *\n\t * @private\n\t * @name delete\n\t * @memberOf MapCache\n\t * @param {string} key The key of the value to remove.\n\t * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n\t */\n\tfunction mapCacheDelete(key) {\n\t var result = getMapData(this, key)['delete'](key);\n\t this.size -= result ? 1 : 0;\n\t return result;\n\t}\n\n\t_mapCacheDelete = mapCacheDelete;\n\treturn _mapCacheDelete;\n}\n\nvar _mapCacheGet;\nvar hasRequired_mapCacheGet;\n\nfunction require_mapCacheGet () {\n\tif (hasRequired_mapCacheGet) return _mapCacheGet;\n\thasRequired_mapCacheGet = 1;\n\tvar getMapData = require_getMapData();\n\n\t/**\n\t * Gets the map value for `key`.\n\t *\n\t * @private\n\t * @name get\n\t * @memberOf MapCache\n\t * @param {string} key The key of the value to get.\n\t * @returns {*} Returns the entry value.\n\t */\n\tfunction mapCacheGet(key) {\n\t return getMapData(this, key).get(key);\n\t}\n\n\t_mapCacheGet = mapCacheGet;\n\treturn _mapCacheGet;\n}\n\nvar _mapCacheHas;\nvar hasRequired_mapCacheHas;\n\nfunction require_mapCacheHas () {\n\tif (hasRequired_mapCacheHas) return _mapCacheHas;\n\thasRequired_mapCacheHas = 1;\n\tvar getMapData = require_getMapData();\n\n\t/**\n\t * Checks if a map value for `key` exists.\n\t *\n\t * @private\n\t * @name has\n\t * @memberOf MapCache\n\t * @param {string} key The key of the entry to check.\n\t * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n\t */\n\tfunction mapCacheHas(key) {\n\t return getMapData(this, key).has(key);\n\t}\n\n\t_mapCacheHas = mapCacheHas;\n\treturn _mapCacheHas;\n}\n\nvar _mapCacheSet;\nvar hasRequired_mapCacheSet;\n\nfunction require_mapCacheSet () {\n\tif (hasRequired_mapCacheSet) return _mapCacheSet;\n\thasRequired_mapCacheSet = 1;\n\tvar getMapData = require_getMapData();\n\n\t/**\n\t * Sets the map `key` to `value`.\n\t *\n\t * @private\n\t * @name set\n\t * @memberOf MapCache\n\t * @param {string} key The key of the value to set.\n\t * @param {*} value The value to set.\n\t * @returns {Object} Returns the map cache instance.\n\t */\n\tfunction mapCacheSet(key, value) {\n\t var data = getMapData(this, key),\n\t size = data.size;\n\n\t data.set(key, value);\n\t this.size += data.size == size ? 0 : 1;\n\t return this;\n\t}\n\n\t_mapCacheSet = mapCacheSet;\n\treturn _mapCacheSet;\n}\n\nvar _MapCache;\nvar hasRequired_MapCache;\n\nfunction require_MapCache () {\n\tif (hasRequired_MapCache) return _MapCache;\n\thasRequired_MapCache = 1;\n\tvar mapCacheClear = require_mapCacheClear(),\n\t mapCacheDelete = require_mapCacheDelete(),\n\t mapCacheGet = require_mapCacheGet(),\n\t mapCacheHas = require_mapCacheHas(),\n\t mapCacheSet = require_mapCacheSet();\n\n\t/**\n\t * Creates a map cache object to store key-value pairs.\n\t *\n\t * @private\n\t * @constructor\n\t * @param {Array} [entries] The key-value pairs to cache.\n\t */\n\tfunction MapCache(entries) {\n\t var index = -1,\n\t length = entries == null ? 0 : entries.length;\n\n\t this.clear();\n\t while (++index < length) {\n\t var entry = entries[index];\n\t this.set(entry[0], entry[1]);\n\t }\n\t}\n\n\t// Add methods to `MapCache`.\n\tMapCache.prototype.clear = mapCacheClear;\n\tMapCache.prototype['delete'] = mapCacheDelete;\n\tMapCache.prototype.get = mapCacheGet;\n\tMapCache.prototype.has = mapCacheHas;\n\tMapCache.prototype.set = mapCacheSet;\n\n\t_MapCache = MapCache;\n\treturn _MapCache;\n}\n\nvar memoize_1;\nvar hasRequiredMemoize;\n\nfunction requireMemoize () {\n\tif (hasRequiredMemoize) return memoize_1;\n\thasRequiredMemoize = 1;\n\tvar MapCache = require_MapCache();\n\n\t/** Error message constants. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\n\t/**\n\t * Creates a function that memoizes the result of `func`. If `resolver` is\n\t * provided, it determines the cache key for storing the result based on the\n\t * arguments provided to the memoized function. By default, the first argument\n\t * provided to the memoized function is used as the map cache key. The `func`\n\t * is invoked with the `this` binding of the memoized function.\n\t *\n\t * **Note:** The cache is exposed as the `cache` property on the memoized\n\t * function. Its creation may be customized by replacing the `_.memoize.Cache`\n\t * constructor with one whose instances implement the\n\t * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n\t * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Function\n\t * @param {Function} func The function to have its output memoized.\n\t * @param {Function} [resolver] The function to resolve the cache key.\n\t * @returns {Function} Returns the new memoized function.\n\t * @example\n\t *\n\t * var object = { 'a': 1, 'b': 2 };\n\t * var other = { 'c': 3, 'd': 4 };\n\t *\n\t * var values = _.memoize(_.values);\n\t * values(object);\n\t * // => [1, 2]\n\t *\n\t * values(other);\n\t * // => [3, 4]\n\t *\n\t * object.a = 2;\n\t * values(object);\n\t * // => [1, 2]\n\t *\n\t * // Modify the result cache.\n\t * values.cache.set(object, ['a', 'b']);\n\t * values(object);\n\t * // => ['a', 'b']\n\t *\n\t * // Replace `_.memoize.Cache`.\n\t * _.memoize.Cache = WeakMap;\n\t */\n\tfunction memoize(func, resolver) {\n\t if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t var memoized = function() {\n\t var args = arguments,\n\t key = resolver ? resolver.apply(this, args) : args[0],\n\t cache = memoized.cache;\n\n\t if (cache.has(key)) {\n\t return cache.get(key);\n\t }\n\t var result = func.apply(this, args);\n\t memoized.cache = cache.set(key, result) || cache;\n\t return result;\n\t };\n\t memoized.cache = new (memoize.Cache || MapCache);\n\t return memoized;\n\t}\n\n\t// Expose `MapCache`.\n\tmemoize.Cache = MapCache;\n\n\tmemoize_1 = memoize;\n\treturn memoize_1;\n}\n\nvar _memoizeCapped;\nvar hasRequired_memoizeCapped;\n\nfunction require_memoizeCapped () {\n\tif (hasRequired_memoizeCapped) return _memoizeCapped;\n\thasRequired_memoizeCapped = 1;\n\tvar memoize = requireMemoize();\n\n\t/** Used as the maximum memoize cache size. */\n\tvar MAX_MEMOIZE_SIZE = 500;\n\n\t/**\n\t * A specialized version of `_.memoize` which clears the memoized function's\n\t * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n\t *\n\t * @private\n\t * @param {Function} func The function to have its output memoized.\n\t * @returns {Function} Returns the new memoized function.\n\t */\n\tfunction memoizeCapped(func) {\n\t var result = memoize(func, function(key) {\n\t if (cache.size === MAX_MEMOIZE_SIZE) {\n\t cache.clear();\n\t }\n\t return key;\n\t });\n\n\t var cache = result.cache;\n\t return result;\n\t}\n\n\t_memoizeCapped = memoizeCapped;\n\treturn _memoizeCapped;\n}\n\nvar _stringToPath;\nvar hasRequired_stringToPath;\n\nfunction require_stringToPath () {\n\tif (hasRequired_stringToPath) return _stringToPath;\n\thasRequired_stringToPath = 1;\n\tvar memoizeCapped = require_memoizeCapped();\n\n\t/** Used to match property names within property paths. */\n\tvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n\t/** Used to match backslashes in property paths. */\n\tvar reEscapeChar = /\\\\(\\\\)?/g;\n\n\t/**\n\t * Converts `string` to a property path array.\n\t *\n\t * @private\n\t * @param {string} string The string to convert.\n\t * @returns {Array} Returns the property path array.\n\t */\n\tvar stringToPath = memoizeCapped(function(string) {\n\t var result = [];\n\t if (string.charCodeAt(0) === 46 /* . */) {\n\t result.push('');\n\t }\n\t string.replace(rePropName, function(match, number, quote, subString) {\n\t result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n\t });\n\t return result;\n\t});\n\n\t_stringToPath = stringToPath;\n\treturn _stringToPath;\n}\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n\nvar _arrayMap;\nvar hasRequired_arrayMap;\n\nfunction require_arrayMap () {\n\tif (hasRequired_arrayMap) return _arrayMap;\n\thasRequired_arrayMap = 1;\n\tfunction arrayMap(array, iteratee) {\n\t var index = -1,\n\t length = array == null ? 0 : array.length,\n\t result = Array(length);\n\n\t while (++index < length) {\n\t result[index] = iteratee(array[index], index, array);\n\t }\n\t return result;\n\t}\n\n\t_arrayMap = arrayMap;\n\treturn _arrayMap;\n}\n\nvar _baseToString;\nvar hasRequired_baseToString;\n\nfunction require_baseToString () {\n\tif (hasRequired_baseToString) return _baseToString;\n\thasRequired_baseToString = 1;\n\tvar Symbol = require_Symbol(),\n\t arrayMap = require_arrayMap(),\n\t isArray = requireIsArray(),\n\t isSymbol = requireIsSymbol();\n\n\t/** Used to convert symbols to primitives and strings. */\n\tvar symbolProto = Symbol ? Symbol.prototype : undefined,\n\t symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n\t/**\n\t * The base implementation of `_.toString` which doesn't convert nullish\n\t * values to empty strings.\n\t *\n\t * @private\n\t * @param {*} value The value to process.\n\t * @returns {string} Returns the string.\n\t */\n\tfunction baseToString(value) {\n\t // Exit early for strings to avoid a performance hit in some environments.\n\t if (typeof value == 'string') {\n\t return value;\n\t }\n\t if (isArray(value)) {\n\t // Recursively convert values (susceptible to call stack limits).\n\t return arrayMap(value, baseToString) + '';\n\t }\n\t if (isSymbol(value)) {\n\t return symbolToString ? symbolToString.call(value) : '';\n\t }\n\t var result = (value + '');\n\t return (result == '0' && (1 / value) == -Infinity) ? '-0' : result;\n\t}\n\n\t_baseToString = baseToString;\n\treturn _baseToString;\n}\n\nvar toString_1;\nvar hasRequiredToString;\n\nfunction requireToString () {\n\tif (hasRequiredToString) return toString_1;\n\thasRequiredToString = 1;\n\tvar baseToString = require_baseToString();\n\n\t/**\n\t * Converts `value` to a string. An empty string is returned for `null`\n\t * and `undefined` values. The sign of `-0` is preserved.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to convert.\n\t * @returns {string} Returns the converted string.\n\t * @example\n\t *\n\t * _.toString(null);\n\t * // => ''\n\t *\n\t * _.toString(-0);\n\t * // => '-0'\n\t *\n\t * _.toString([1, 2, 3]);\n\t * // => '1,2,3'\n\t */\n\tfunction toString(value) {\n\t return value == null ? '' : baseToString(value);\n\t}\n\n\ttoString_1 = toString;\n\treturn toString_1;\n}\n\nvar _castPath;\nvar hasRequired_castPath;\n\nfunction require_castPath () {\n\tif (hasRequired_castPath) return _castPath;\n\thasRequired_castPath = 1;\n\tvar isArray = requireIsArray(),\n\t isKey = require_isKey(),\n\t stringToPath = require_stringToPath(),\n\t toString = requireToString();\n\n\t/**\n\t * Casts `value` to a path array if it's not one.\n\t *\n\t * @private\n\t * @param {*} value The value to inspect.\n\t * @param {Object} [object] The object to query keys on.\n\t * @returns {Array} Returns the cast property path array.\n\t */\n\tfunction castPath(value, object) {\n\t if (isArray(value)) {\n\t return value;\n\t }\n\t return isKey(value, object) ? [value] : stringToPath(toString(value));\n\t}\n\n\t_castPath = castPath;\n\treturn _castPath;\n}\n\nvar _toKey;\nvar hasRequired_toKey;\n\nfunction require_toKey () {\n\tif (hasRequired_toKey) return _toKey;\n\thasRequired_toKey = 1;\n\tvar isSymbol = requireIsSymbol();\n\n\t/**\n\t * Converts `value` to a string key if it's not a string or symbol.\n\t *\n\t * @private\n\t * @param {*} value The value to inspect.\n\t * @returns {string|symbol} Returns the key.\n\t */\n\tfunction toKey(value) {\n\t if (typeof value == 'string' || isSymbol(value)) {\n\t return value;\n\t }\n\t var result = (value + '');\n\t return (result == '0' && (1 / value) == -Infinity) ? '-0' : result;\n\t}\n\n\t_toKey = toKey;\n\treturn _toKey;\n}\n\nvar _baseGet;\nvar hasRequired_baseGet;\n\nfunction require_baseGet () {\n\tif (hasRequired_baseGet) return _baseGet;\n\thasRequired_baseGet = 1;\n\tvar castPath = require_castPath(),\n\t toKey = require_toKey();\n\n\t/**\n\t * The base implementation of `_.get` without support for default values.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @param {Array|string} path The path of the property to get.\n\t * @returns {*} Returns the resolved value.\n\t */\n\tfunction baseGet(object, path) {\n\t path = castPath(path, object);\n\n\t var index = 0,\n\t length = path.length;\n\n\t while (object != null && index < length) {\n\t object = object[toKey(path[index++])];\n\t }\n\t return (index && index == length) ? object : undefined;\n\t}\n\n\t_baseGet = baseGet;\n\treturn _baseGet;\n}\n\nvar get_1;\nvar hasRequiredGet;\n\nfunction requireGet () {\n\tif (hasRequiredGet) return get_1;\n\thasRequiredGet = 1;\n\tvar baseGet = require_baseGet();\n\n\t/**\n\t * Gets the value at `path` of `object`. If the resolved value is\n\t * `undefined`, the `defaultValue` is returned in its place.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 3.7.0\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @param {Array|string} path The path of the property to get.\n\t * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n\t * @returns {*} Returns the resolved value.\n\t * @example\n\t *\n\t * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n\t *\n\t * _.get(object, 'a[0].b.c');\n\t * // => 3\n\t *\n\t * _.get(object, ['a', '0', 'b', 'c']);\n\t * // => 3\n\t *\n\t * _.get(object, 'a.b.c', 'default');\n\t * // => 'default'\n\t */\n\tfunction get(object, path, defaultValue) {\n\t var result = object == null ? undefined : baseGet(object, path);\n\t return result === undefined ? defaultValue : result;\n\t}\n\n\tget_1 = get;\n\treturn get_1;\n}\n\nvar getExports = requireGet();\nvar get = /*@__PURE__*/getDefaultExportFromCjs(getExports);\n\nvar _defineProperty;\nvar hasRequired_defineProperty;\n\nfunction require_defineProperty () {\n\tif (hasRequired_defineProperty) return _defineProperty;\n\thasRequired_defineProperty = 1;\n\tvar getNative = require_getNative();\n\n\tvar defineProperty = (function() {\n\t try {\n\t var func = getNative(Object, 'defineProperty');\n\t func({}, '', {});\n\t return func;\n\t } catch (e) {}\n\t}());\n\n\t_defineProperty = defineProperty;\n\treturn _defineProperty;\n}\n\nvar _baseAssignValue;\nvar hasRequired_baseAssignValue;\n\nfunction require_baseAssignValue () {\n\tif (hasRequired_baseAssignValue) return _baseAssignValue;\n\thasRequired_baseAssignValue = 1;\n\tvar defineProperty = require_defineProperty();\n\n\t/**\n\t * The base implementation of `assignValue` and `assignMergeValue` without\n\t * value checks.\n\t *\n\t * @private\n\t * @param {Object} object The object to modify.\n\t * @param {string} key The key of the property to assign.\n\t * @param {*} value The value to assign.\n\t */\n\tfunction baseAssignValue(object, key, value) {\n\t if (key == '__proto__' && defineProperty) {\n\t defineProperty(object, key, {\n\t 'configurable': true,\n\t 'enumerable': true,\n\t 'value': value,\n\t 'writable': true\n\t });\n\t } else {\n\t object[key] = value;\n\t }\n\t}\n\n\t_baseAssignValue = baseAssignValue;\n\treturn _baseAssignValue;\n}\n\nvar _assignValue;\nvar hasRequired_assignValue;\n\nfunction require_assignValue () {\n\tif (hasRequired_assignValue) return _assignValue;\n\thasRequired_assignValue = 1;\n\tvar baseAssignValue = require_baseAssignValue(),\n\t eq = requireEq();\n\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\n\t/**\n\t * Assigns `value` to `key` of `object` if the existing value is not equivalent\n\t * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n\t * for equality comparisons.\n\t *\n\t * @private\n\t * @param {Object} object The object to modify.\n\t * @param {string} key The key of the property to assign.\n\t * @param {*} value The value to assign.\n\t */\n\tfunction assignValue(object, key, value) {\n\t var objValue = object[key];\n\t if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n\t (value === undefined && !(key in object))) {\n\t baseAssignValue(object, key, value);\n\t }\n\t}\n\n\t_assignValue = assignValue;\n\treturn _assignValue;\n}\n\n/** Used as references for various `Number` constants. */\n\nvar _isIndex;\nvar hasRequired_isIndex;\n\nfunction require_isIndex () {\n\tif (hasRequired_isIndex) return _isIndex;\n\thasRequired_isIndex = 1;\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t var type = typeof value;\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\n\t return !!length &&\n\t (type == 'number' ||\n\t (type != 'symbol' && reIsUint.test(value))) &&\n\t (value > -1 && value % 1 == 0 && value < length);\n\t}\n\n\t_isIndex = isIndex;\n\treturn _isIndex;\n}\n\nvar _baseSet;\nvar hasRequired_baseSet;\n\nfunction require_baseSet () {\n\tif (hasRequired_baseSet) return _baseSet;\n\thasRequired_baseSet = 1;\n\tvar assignValue = require_assignValue(),\n\t castPath = require_castPath(),\n\t isIndex = require_isIndex(),\n\t isObject = requireIsObject(),\n\t toKey = require_toKey();\n\n\t/**\n\t * The base implementation of `_.set`.\n\t *\n\t * @private\n\t * @param {Object} object The object to modify.\n\t * @param {Array|string} path The path of the property to set.\n\t * @param {*} value The value to set.\n\t * @param {Function} [customizer] The function to customize path creation.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction baseSet(object, path, value, customizer) {\n\t if (!isObject(object)) {\n\t return object;\n\t }\n\t path = castPath(path, object);\n\n\t var index = -1,\n\t length = path.length,\n\t lastIndex = length - 1,\n\t nested = object;\n\n\t while (nested != null && ++index < length) {\n\t var key = toKey(path[index]),\n\t newValue = value;\n\n\t if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n\t return object;\n\t }\n\n\t if (index != lastIndex) {\n\t var objValue = nested[key];\n\t newValue = customizer ? customizer(objValue, key, nested) : undefined;\n\t if (newValue === undefined) {\n\t newValue = isObject(objValue)\n\t ? objValue\n\t : (isIndex(path[index + 1]) ? [] : {});\n\t }\n\t }\n\t assignValue(nested, key, newValue);\n\t nested = nested[key];\n\t }\n\t return object;\n\t}\n\n\t_baseSet = baseSet;\n\treturn _baseSet;\n}\n\nvar set_1;\nvar hasRequiredSet;\n\nfunction requireSet () {\n\tif (hasRequiredSet) return set_1;\n\thasRequiredSet = 1;\n\tvar baseSet = require_baseSet();\n\n\t/**\n\t * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n\t * it's created. Arrays are created for missing index properties while objects\n\t * are created for all other missing properties. Use `_.setWith` to customize\n\t * `path` creation.\n\t *\n\t * **Note:** This method mutates `object`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 3.7.0\n\t * @category Object\n\t * @param {Object} object The object to modify.\n\t * @param {Array|string} path The path of the property to set.\n\t * @param {*} value The value to set.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n\t *\n\t * _.set(object, 'a[0].b.c', 4);\n\t * console.log(object.a[0].b.c);\n\t * // => 4\n\t *\n\t * _.set(object, ['x', '0', 'y', 'z'], 5);\n\t * console.log(object.x[0].y.z);\n\t * // => 5\n\t */\n\tfunction set(object, path, value) {\n\t return object == null ? object : baseSet(object, path, value);\n\t}\n\n\tset_1 = set;\n\treturn set_1;\n}\n\nvar setExports = requireSet();\nvar set = /*@__PURE__*/getDefaultExportFromCjs(setExports);\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n\nvar _copyArray;\nvar hasRequired_copyArray;\n\nfunction require_copyArray () {\n\tif (hasRequired_copyArray) return _copyArray;\n\thasRequired_copyArray = 1;\n\tfunction copyArray(source, array) {\n\t var index = -1,\n\t length = source.length;\n\n\t array || (array = Array(length));\n\t while (++index < length) {\n\t array[index] = source[index];\n\t }\n\t return array;\n\t}\n\n\t_copyArray = copyArray;\n\treturn _copyArray;\n}\n\nvar toPath_1;\nvar hasRequiredToPath;\n\nfunction requireToPath () {\n\tif (hasRequiredToPath) return toPath_1;\n\thasRequiredToPath = 1;\n\tvar arrayMap = require_arrayMap(),\n\t copyArray = require_copyArray(),\n\t isArray = requireIsArray(),\n\t isSymbol = requireIsSymbol(),\n\t stringToPath = require_stringToPath(),\n\t toKey = require_toKey(),\n\t toString = requireToString();\n\n\t/**\n\t * Converts `value` to a property path array.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Util\n\t * @param {*} value The value to convert.\n\t * @returns {Array} Returns the new property path array.\n\t * @example\n\t *\n\t * _.toPath('a.b.c');\n\t * // => ['a', 'b', 'c']\n\t *\n\t * _.toPath('a[0].b.c');\n\t * // => ['a', '0', 'b', 'c']\n\t */\n\tfunction toPath(value) {\n\t if (isArray(value)) {\n\t return arrayMap(value, toKey);\n\t }\n\t return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n\t}\n\n\ttoPath_1 = toPath;\n\treturn toPath_1;\n}\n\nvar toPathExports = requireToPath();\nvar toPath = /*@__PURE__*/getDefaultExportFromCjs(toPathExports);\n\nvar define$2 = {\n // access data field\n data: function data(params) {\n var defaults = {\n field: 'data',\n bindingEvent: 'data',\n allowBinding: false,\n allowSetting: false,\n allowGetting: false,\n settingEvent: 'data',\n settingTriggersEvent: false,\n triggerFnName: 'trigger',\n immutableKeys: {},\n // key => true if immutable\n updateStyle: false,\n beforeGet: function beforeGet(self) {},\n beforeSet: function beforeSet(self, obj) {},\n onSet: function onSet(self) {},\n canSet: function canSet(self) {\n return true;\n }\n };\n params = extend({}, defaults, params);\n return function dataImpl(name, value) {\n var p = params;\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n var single = selfIsArrayLike ? self[0] : self;\n\n // .data('foo', ...)\n if (string(name)) {\n // set or get property\n var isPathLike = name.indexOf('.') !== -1; // there might be a normal field with a dot \n var path = isPathLike && toPath(name);\n\n // .data('foo')\n if (p.allowGetting && value === undefined) {\n // get\n\n var ret;\n if (single) {\n p.beforeGet(single);\n\n // check if it's path and a field with the same name doesn't exist\n if (path && single._private[p.field][name] === undefined) {\n ret = get(single._private[p.field], path);\n } else {\n ret = single._private[p.field][name];\n }\n }\n return ret;\n\n // .data('foo', 'bar')\n } else if (p.allowSetting && value !== undefined) {\n // set\n var valid = !p.immutableKeys[name];\n if (valid) {\n var change = _defineProperty$1({}, name, value);\n p.beforeSet(self, change);\n for (var i = 0, l = all.length; i < l; i++) {\n var ele = all[i];\n if (p.canSet(ele)) {\n if (path && single._private[p.field][name] === undefined) {\n set(ele._private[p.field], path, value);\n } else {\n ele._private[p.field][name] = value;\n }\n }\n }\n\n // update mappers if asked\n if (p.updateStyle) {\n self.updateStyle();\n }\n\n // call onSet callback\n p.onSet(self);\n if (p.settingTriggersEvent) {\n self[p.triggerFnName](p.settingEvent);\n }\n }\n }\n\n // .data({ 'foo': 'bar' })\n } else if (p.allowSetting && plainObject(name)) {\n // extend\n var obj = name;\n var k, v;\n var keys = Object.keys(obj);\n p.beforeSet(self, obj);\n for (var _i = 0; _i < keys.length; _i++) {\n k = keys[_i];\n v = obj[k];\n var _valid = !p.immutableKeys[k];\n if (_valid) {\n for (var j = 0; j < all.length; j++) {\n var _ele = all[j];\n if (p.canSet(_ele)) {\n _ele._private[p.field][k] = v;\n }\n }\n }\n }\n\n // update mappers if asked\n if (p.updateStyle) {\n self.updateStyle();\n }\n\n // call onSet callback\n p.onSet(self);\n if (p.settingTriggersEvent) {\n self[p.triggerFnName](p.settingEvent);\n }\n\n // .data(function(){ ... })\n } else if (p.allowBinding && fn$6(name)) {\n // bind to event\n var fn = name;\n self.on(p.bindingEvent, fn);\n\n // .data()\n } else if (p.allowGetting && name === undefined) {\n // get whole object\n var _ret;\n if (single) {\n p.beforeGet(single);\n _ret = single._private[p.field];\n }\n return _ret;\n }\n return self; // maintain chainability\n }; // function\n },\n // data\n\n // remove data field\n removeData: function removeData(params) {\n var defaults = {\n field: 'data',\n event: 'data',\n triggerFnName: 'trigger',\n triggerEvent: false,\n immutableKeys: {} // key => true if immutable\n };\n params = extend({}, defaults, params);\n return function removeDataImpl(names) {\n var p = params;\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n\n // .removeData('foo bar')\n if (string(names)) {\n // then get the list of keys, and delete them\n var keys = names.split(/\\s+/);\n var l = keys.length;\n for (var i = 0; i < l; i++) {\n // delete each non-empty key\n var key = keys[i];\n if (emptyString(key)) {\n continue;\n }\n var valid = !p.immutableKeys[key]; // not valid if immutable\n if (valid) {\n for (var i_a = 0, l_a = all.length; i_a < l_a; i_a++) {\n all[i_a]._private[p.field][key] = undefined;\n }\n }\n }\n if (p.triggerEvent) {\n self[p.triggerFnName](p.event);\n }\n\n // .removeData()\n } else if (names === undefined) {\n // then delete all keys\n\n for (var _i_a = 0, _l_a = all.length; _i_a < _l_a; _i_a++) {\n var _privateFields = all[_i_a]._private[p.field];\n var _keys = Object.keys(_privateFields);\n for (var _i2 = 0; _i2 < _keys.length; _i2++) {\n var _key = _keys[_i2];\n var validKeyToDelete = !p.immutableKeys[_key];\n if (validKeyToDelete) {\n _privateFields[_key] = undefined;\n }\n }\n }\n if (p.triggerEvent) {\n self[p.triggerFnName](p.event);\n }\n }\n return self; // maintain chaining\n }; // function\n } // removeData\n}; // define\n\nvar define$1 = {\n eventAliasesOn: function eventAliasesOn(proto) {\n var p = proto;\n p.addListener = p.listen = p.bind = p.on;\n p.unlisten = p.unbind = p.off = p.removeListener;\n p.trigger = p.emit;\n\n // this is just a wrapper alias of .on()\n p.pon = p.promiseOn = function (events, selector) {\n var self = this;\n var args = Array.prototype.slice.call(arguments, 0);\n return new Promise$1(function (resolve, reject) {\n var callback = function callback(e) {\n self.off.apply(self, offArgs);\n resolve(e);\n };\n var onArgs = args.concat([callback]);\n var offArgs = onArgs.concat([]);\n self.on.apply(self, onArgs);\n });\n };\n }\n}; // define\n\n// use this module to cherry pick functions into your prototype\n// (useful for functions shared between the core and collections, for example)\n\nvar define = {};\n[define$3, define$2, define$1].forEach(function (m) {\n extend(define, m);\n});\n\nvar elesfn$i = {\n animate: define.animate(),\n animation: define.animation(),\n animated: define.animated(),\n clearQueue: define.clearQueue(),\n delay: define.delay(),\n delayAnimation: define.delayAnimation(),\n stop: define.stop()\n};\n\nvar elesfn$h = {\n classes: function classes(_classes) {\n var self = this;\n if (_classes === undefined) {\n var ret = [];\n self[0]._private.classes.forEach(function (cls) {\n return ret.push(cls);\n });\n return ret;\n } else if (!array(_classes)) {\n // extract classes from string\n _classes = (_classes || '').match(/\\S+/g) || [];\n }\n var changed = [];\n var classesSet = new Set$1(_classes);\n\n // check and update each ele\n for (var j = 0; j < self.length; j++) {\n var ele = self[j];\n var _p = ele._private;\n var eleClasses = _p.classes;\n var changedEle = false;\n\n // check if ele has all of the passed classes\n for (var i = 0; i < _classes.length; i++) {\n var cls = _classes[i];\n var eleHasClass = eleClasses.has(cls);\n if (!eleHasClass) {\n changedEle = true;\n break;\n }\n }\n\n // check if ele has classes outside of those passed\n if (!changedEle) {\n changedEle = eleClasses.size !== _classes.length;\n }\n if (changedEle) {\n _p.classes = classesSet;\n changed.push(ele);\n }\n }\n\n // trigger update style on those eles that had class changes\n if (changed.length > 0) {\n this.spawn(changed).updateStyle().emit('class');\n }\n return self;\n },\n addClass: function addClass(classes) {\n return this.toggleClass(classes, true);\n },\n hasClass: function hasClass(className) {\n var ele = this[0];\n return ele != null && ele._private.classes.has(className);\n },\n toggleClass: function toggleClass(classes, toggle) {\n if (!array(classes)) {\n // extract classes from string\n classes = classes.match(/\\S+/g) || [];\n }\n var self = this;\n var toggleUndefd = toggle === undefined;\n var changed = []; // eles who had classes changed\n\n for (var i = 0, il = self.length; i < il; i++) {\n var ele = self[i];\n var eleClasses = ele._private.classes;\n var changedEle = false;\n for (var j = 0; j < classes.length; j++) {\n var cls = classes[j];\n var hasClass = eleClasses.has(cls);\n var changedNow = false;\n if (toggle || toggleUndefd && !hasClass) {\n eleClasses.add(cls);\n changedNow = true;\n } else if (!toggle || toggleUndefd && hasClass) {\n eleClasses[\"delete\"](cls);\n changedNow = true;\n }\n if (!changedEle && changedNow) {\n changed.push(ele);\n changedEle = true;\n }\n } // for j classes\n } // for i eles\n\n // trigger update style on those eles that had class changes\n if (changed.length > 0) {\n this.spawn(changed).updateStyle().emit('class');\n }\n return self;\n },\n removeClass: function removeClass(classes) {\n return this.toggleClass(classes, false);\n },\n flashClass: function flashClass(classes, duration) {\n var self = this;\n if (duration == null) {\n duration = 250;\n } else if (duration === 0) {\n return self; // nothing to do really\n }\n self.addClass(classes);\n setTimeout(function () {\n self.removeClass(classes);\n }, duration);\n return self;\n }\n};\nelesfn$h.className = elesfn$h.classNames = elesfn$h.classes;\n\n// tokens in the query language\nvar tokens = {\n metaChar: '[\\\\!\\\\\"\\\\#\\\\$\\\\%\\\\&\\\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\.\\\\/\\\\:\\\\;\\\\<\\\\=\\\\>\\\\?\\\\@\\\\[\\\\]\\\\^\\\\`\\\\{\\\\|\\\\}\\\\~]',\n // chars we need to escape in let names, etc\n comparatorOp: '=|\\\\!=|>|>=|<|<=|\\\\$=|\\\\^=|\\\\*=',\n // binary comparison op (used in data selectors)\n boolOp: '\\\\?|\\\\!|\\\\^',\n // boolean (unary) operators (used in data selectors)\n string: '\"(?:\\\\\\\\\"|[^\"])*\"' + '|' + \"'(?:\\\\\\\\'|[^'])*'\",\n // string literals (used in data selectors) -- doublequotes | singlequotes\n number: number,\n // number literal (used in data selectors) --- e.g. 0.1234, 1234, 12e123\n meta: 'degree|indegree|outdegree',\n // allowed metadata fields (i.e. allowed functions to use from Collection)\n separator: '\\\\s*,\\\\s*',\n // queries are separated by commas, e.g. edge[foo = 'bar'], node.someClass\n descendant: '\\\\s+',\n child: '\\\\s+>\\\\s+',\n subject: '\\\\$',\n group: 'node|edge|\\\\*',\n directedEdge: '\\\\s+->\\\\s+',\n undirectedEdge: '\\\\s+<->\\\\s+'\n};\ntokens.variable = '(?:[\\\\w-.]|(?:\\\\\\\\' + tokens.metaChar + '))+'; // a variable name can have letters, numbers, dashes, and periods\ntokens.className = '(?:[\\\\w-]|(?:\\\\\\\\' + tokens.metaChar + '))+'; // a class name has the same rules as a variable except it can't have a '.' in the name\ntokens.value = tokens.string + '|' + tokens.number; // a value literal, either a string or number\ntokens.id = tokens.variable; // an element id (follows variable conventions)\n\n(function () {\n var ops, op, i;\n\n // add @ variants to comparatorOp\n ops = tokens.comparatorOp.split('|');\n for (i = 0; i < ops.length; i++) {\n op = ops[i];\n tokens.comparatorOp += '|@' + op;\n }\n\n // add ! variants to comparatorOp\n ops = tokens.comparatorOp.split('|');\n for (i = 0; i < ops.length; i++) {\n op = ops[i];\n if (op.indexOf('!') >= 0) {\n continue;\n } // skip ops that explicitly contain !\n if (op === '=') {\n continue;\n } // skip = b/c != is explicitly defined\n\n tokens.comparatorOp += '|\\\\!' + op;\n }\n})();\n\n/**\n * Make a new query object\n *\n * @prop type {Type} The type enum (int) of the query\n * @prop checks List of checks to make against an ele to test for a match\n */\nvar newQuery = function newQuery() {\n return {\n checks: []\n };\n};\n\n/**\n * A check type enum-like object. Uses integer values for fast match() lookup.\n * The ordering does not matter as long as the ints are unique.\n */\nvar Type = {\n /** E.g. node */\n GROUP: 0,\n /** A collection of elements */\n COLLECTION: 1,\n /** A filter(ele) function */\n FILTER: 2,\n /** E.g. [foo > 1] */\n DATA_COMPARE: 3,\n /** E.g. [foo] */\n DATA_EXIST: 4,\n /** E.g. [?foo] */\n DATA_BOOL: 5,\n /** E.g. [[degree > 2]] */\n META_COMPARE: 6,\n /** E.g. :selected */\n STATE: 7,\n /** E.g. #foo */\n ID: 8,\n /** E.g. .foo */\n CLASS: 9,\n /** E.g. #foo <-> #bar */\n UNDIRECTED_EDGE: 10,\n /** E.g. #foo -> #bar */\n DIRECTED_EDGE: 11,\n /** E.g. $#foo -> #bar */\n NODE_SOURCE: 12,\n /** E.g. #foo -> $#bar */\n NODE_TARGET: 13,\n /** E.g. $#foo <-> #bar */\n NODE_NEIGHBOR: 14,\n /** E.g. #foo > #bar */\n CHILD: 15,\n /** E.g. #foo #bar */\n DESCENDANT: 16,\n /** E.g. $#foo > #bar */\n PARENT: 17,\n /** E.g. $#foo #bar */\n ANCESTOR: 18,\n /** E.g. #foo > $bar > #baz */\n COMPOUND_SPLIT: 19,\n /** Always matches, useful placeholder for subject in `COMPOUND_SPLIT` */\n TRUE: 20\n};\n\nvar stateSelectors = [{\n selector: ':selected',\n matches: function matches(ele) {\n return ele.selected();\n }\n}, {\n selector: ':unselected',\n matches: function matches(ele) {\n return !ele.selected();\n }\n}, {\n selector: ':selectable',\n matches: function matches(ele) {\n return ele.selectable();\n }\n}, {\n selector: ':unselectable',\n matches: function matches(ele) {\n return !ele.selectable();\n }\n}, {\n selector: ':locked',\n matches: function matches(ele) {\n return ele.locked();\n }\n}, {\n selector: ':unlocked',\n matches: function matches(ele) {\n return !ele.locked();\n }\n}, {\n selector: ':visible',\n matches: function matches(ele) {\n return ele.visible();\n }\n}, {\n selector: ':hidden',\n matches: function matches(ele) {\n return !ele.visible();\n }\n}, {\n selector: ':transparent',\n matches: function matches(ele) {\n return ele.transparent();\n }\n}, {\n selector: ':grabbed',\n matches: function matches(ele) {\n return ele.grabbed();\n }\n}, {\n selector: ':free',\n matches: function matches(ele) {\n return !ele.grabbed();\n }\n}, {\n selector: ':removed',\n matches: function matches(ele) {\n return ele.removed();\n }\n}, {\n selector: ':inside',\n matches: function matches(ele) {\n return !ele.removed();\n }\n}, {\n selector: ':grabbable',\n matches: function matches(ele) {\n return ele.grabbable();\n }\n}, {\n selector: ':ungrabbable',\n matches: function matches(ele) {\n return !ele.grabbable();\n }\n}, {\n selector: ':animated',\n matches: function matches(ele) {\n return ele.animated();\n }\n}, {\n selector: ':unanimated',\n matches: function matches(ele) {\n return !ele.animated();\n }\n}, {\n selector: ':parent',\n matches: function matches(ele) {\n return ele.isParent();\n }\n}, {\n selector: ':childless',\n matches: function matches(ele) {\n return ele.isChildless();\n }\n}, {\n selector: ':child',\n matches: function matches(ele) {\n return ele.isChild();\n }\n}, {\n selector: ':orphan',\n matches: function matches(ele) {\n return ele.isOrphan();\n }\n}, {\n selector: ':nonorphan',\n matches: function matches(ele) {\n return ele.isChild();\n }\n}, {\n selector: ':compound',\n matches: function matches(ele) {\n if (ele.isNode()) {\n return ele.isParent();\n } else {\n return ele.source().isParent() || ele.target().isParent();\n }\n }\n}, {\n selector: ':loop',\n matches: function matches(ele) {\n return ele.isLoop();\n }\n}, {\n selector: ':simple',\n matches: function matches(ele) {\n return ele.isSimple();\n }\n}, {\n selector: ':active',\n matches: function matches(ele) {\n return ele.active();\n }\n}, {\n selector: ':inactive',\n matches: function matches(ele) {\n return !ele.active();\n }\n}, {\n selector: ':backgrounding',\n matches: function matches(ele) {\n return ele.backgrounding();\n }\n}, {\n selector: ':nonbackgrounding',\n matches: function matches(ele) {\n return !ele.backgrounding();\n }\n}].sort(function (a, b) {\n // n.b. selectors that are starting substrings of others must have the longer ones first\n return descending(a.selector, b.selector);\n});\nvar lookup = function () {\n var selToFn = {};\n var s;\n for (var i = 0; i < stateSelectors.length; i++) {\n s = stateSelectors[i];\n selToFn[s.selector] = s.matches;\n }\n return selToFn;\n}();\nvar stateSelectorMatches = function stateSelectorMatches(sel, ele) {\n return lookup[sel](ele);\n};\nvar stateSelectorRegex = '(' + stateSelectors.map(function (s) {\n return s.selector;\n}).join('|') + ')';\n\n// when a token like a variable has escaped meta characters, we need to clean the backslashes out\n// so that values get compared properly in Selector.filter()\nvar cleanMetaChars = function cleanMetaChars(str) {\n return str.replace(new RegExp('\\\\\\\\(' + tokens.metaChar + ')', 'g'), function (match, $1) {\n return $1;\n });\n};\nvar replaceLastQuery = function replaceLastQuery(selector, examiningQuery, replacementQuery) {\n selector[selector.length - 1] = replacementQuery;\n};\n\n// NOTE: add new expression syntax here to have it recognised by the parser;\n// - a query contains all adjacent (i.e. no separator in between) expressions;\n// - the current query is stored in selector[i]\n// - you need to check the query objects in match() for it actually filter properly, but that's pretty straight forward\nvar exprs = [{\n name: 'group',\n // just used for identifying when debugging\n query: true,\n regex: '(' + tokens.group + ')',\n populate: function populate(selector, query, _ref) {\n var _ref2 = _slicedToArray(_ref, 1),\n group = _ref2[0];\n query.checks.push({\n type: Type.GROUP,\n value: group === '*' ? group : group + 's'\n });\n }\n}, {\n name: 'state',\n query: true,\n regex: stateSelectorRegex,\n populate: function populate(selector, query, _ref3) {\n var _ref4 = _slicedToArray(_ref3, 1),\n state = _ref4[0];\n query.checks.push({\n type: Type.STATE,\n value: state\n });\n }\n}, {\n name: 'id',\n query: true,\n regex: '\\\\#(' + tokens.id + ')',\n populate: function populate(selector, query, _ref5) {\n var _ref6 = _slicedToArray(_ref5, 1),\n id = _ref6[0];\n query.checks.push({\n type: Type.ID,\n value: cleanMetaChars(id)\n });\n }\n}, {\n name: 'className',\n query: true,\n regex: '\\\\.(' + tokens.className + ')',\n populate: function populate(selector, query, _ref7) {\n var _ref8 = _slicedToArray(_ref7, 1),\n className = _ref8[0];\n query.checks.push({\n type: Type.CLASS,\n value: cleanMetaChars(className)\n });\n }\n}, {\n name: 'dataExists',\n query: true,\n regex: '\\\\[\\\\s*(' + tokens.variable + ')\\\\s*\\\\]',\n populate: function populate(selector, query, _ref9) {\n var _ref10 = _slicedToArray(_ref9, 1),\n variable = _ref10[0];\n query.checks.push({\n type: Type.DATA_EXIST,\n field: cleanMetaChars(variable)\n });\n }\n}, {\n name: 'dataCompare',\n query: true,\n regex: '\\\\[\\\\s*(' + tokens.variable + ')\\\\s*(' + tokens.comparatorOp + ')\\\\s*(' + tokens.value + ')\\\\s*\\\\]',\n populate: function populate(selector, query, _ref11) {\n var _ref12 = _slicedToArray(_ref11, 3),\n variable = _ref12[0],\n comparatorOp = _ref12[1],\n value = _ref12[2];\n var valueIsString = new RegExp('^' + tokens.string + '$').exec(value) != null;\n if (valueIsString) {\n value = value.substring(1, value.length - 1);\n } else {\n value = parseFloat(value);\n }\n query.checks.push({\n type: Type.DATA_COMPARE,\n field: cleanMetaChars(variable),\n operator: comparatorOp,\n value: value\n });\n }\n}, {\n name: 'dataBool',\n query: true,\n regex: '\\\\[\\\\s*(' + tokens.boolOp + ')\\\\s*(' + tokens.variable + ')\\\\s*\\\\]',\n populate: function populate(selector, query, _ref13) {\n var _ref14 = _slicedToArray(_ref13, 2),\n boolOp = _ref14[0],\n variable = _ref14[1];\n query.checks.push({\n type: Type.DATA_BOOL,\n field: cleanMetaChars(variable),\n operator: boolOp\n });\n }\n}, {\n name: 'metaCompare',\n query: true,\n regex: '\\\\[\\\\[\\\\s*(' + tokens.meta + ')\\\\s*(' + tokens.comparatorOp + ')\\\\s*(' + tokens.number + ')\\\\s*\\\\]\\\\]',\n populate: function populate(selector, query, _ref15) {\n var _ref16 = _slicedToArray(_ref15, 3),\n meta = _ref16[0],\n comparatorOp = _ref16[1],\n number = _ref16[2];\n query.checks.push({\n type: Type.META_COMPARE,\n field: cleanMetaChars(meta),\n operator: comparatorOp,\n value: parseFloat(number)\n });\n }\n}, {\n name: 'nextQuery',\n separator: true,\n regex: tokens.separator,\n populate: function populate(selector, query) {\n var currentSubject = selector.currentSubject;\n var edgeCount = selector.edgeCount;\n var compoundCount = selector.compoundCount;\n var lastQ = selector[selector.length - 1];\n if (currentSubject != null) {\n lastQ.subject = currentSubject;\n selector.currentSubject = null;\n }\n lastQ.edgeCount = edgeCount;\n lastQ.compoundCount = compoundCount;\n selector.edgeCount = 0;\n selector.compoundCount = 0;\n\n // go on to next query\n var nextQuery = selector[selector.length++] = newQuery();\n return nextQuery; // this is the new query to be filled by the following exprs\n }\n}, {\n name: 'directedEdge',\n separator: true,\n regex: tokens.directedEdge,\n populate: function populate(selector, query) {\n if (selector.currentSubject == null) {\n // undirected edge\n var edgeQuery = newQuery();\n var source = query;\n var target = newQuery();\n edgeQuery.checks.push({\n type: Type.DIRECTED_EDGE,\n source: source,\n target: target\n });\n\n // the query in the selector should be the edge rather than the source\n replaceLastQuery(selector, query, edgeQuery);\n selector.edgeCount++;\n\n // we're now populating the target query with expressions that follow\n return target;\n } else {\n // source/target\n var srcTgtQ = newQuery();\n var _source = query;\n var _target = newQuery();\n srcTgtQ.checks.push({\n type: Type.NODE_SOURCE,\n source: _source,\n target: _target\n });\n\n // the query in the selector should be the neighbourhood rather than the node\n replaceLastQuery(selector, query, srcTgtQ);\n selector.edgeCount++;\n return _target; // now populating the target with the following expressions\n }\n }\n}, {\n name: 'undirectedEdge',\n separator: true,\n regex: tokens.undirectedEdge,\n populate: function populate(selector, query) {\n if (selector.currentSubject == null) {\n // undirected edge\n var edgeQuery = newQuery();\n var source = query;\n var target = newQuery();\n edgeQuery.checks.push({\n type: Type.UNDIRECTED_EDGE,\n nodes: [source, target]\n });\n\n // the query in the selector should be the edge rather than the source\n replaceLastQuery(selector, query, edgeQuery);\n selector.edgeCount++;\n\n // we're now populating the target query with expressions that follow\n return target;\n } else {\n // neighbourhood\n var nhoodQ = newQuery();\n var node = query;\n var neighbor = newQuery();\n nhoodQ.checks.push({\n type: Type.NODE_NEIGHBOR,\n node: node,\n neighbor: neighbor\n });\n\n // the query in the selector should be the neighbourhood rather than the node\n replaceLastQuery(selector, query, nhoodQ);\n return neighbor; // now populating the neighbor with following expressions\n }\n }\n}, {\n name: 'child',\n separator: true,\n regex: tokens.child,\n populate: function populate(selector, query) {\n if (selector.currentSubject == null) {\n // default: child query\n var parentChildQuery = newQuery();\n var child = newQuery();\n var parent = selector[selector.length - 1];\n parentChildQuery.checks.push({\n type: Type.CHILD,\n parent: parent,\n child: child\n });\n\n // the query in the selector should be the '>' itself\n replaceLastQuery(selector, query, parentChildQuery);\n selector.compoundCount++;\n\n // we're now populating the child query with expressions that follow\n return child;\n } else if (selector.currentSubject === query) {\n // compound split query\n var compound = newQuery();\n var left = selector[selector.length - 1];\n var right = newQuery();\n var subject = newQuery();\n var _child = newQuery();\n var _parent = newQuery();\n\n // set up the root compound q\n compound.checks.push({\n type: Type.COMPOUND_SPLIT,\n left: left,\n right: right,\n subject: subject\n });\n\n // populate the subject and replace the q at the old spot (within left) with TRUE\n subject.checks = query.checks; // take the checks from the left\n query.checks = [{\n type: Type.TRUE\n }]; // checks under left refs the subject implicitly\n\n // set up the right q\n _parent.checks.push({\n type: Type.TRUE\n }); // parent implicitly refs the subject\n right.checks.push({\n type: Type.PARENT,\n // type is swapped on right side queries\n parent: _parent,\n child: _child // empty for now\n });\n replaceLastQuery(selector, left, compound);\n\n // update the ref since we moved things around for `query`\n selector.currentSubject = subject;\n selector.compoundCount++;\n return _child; // now populating the right side's child\n } else {\n // parent query\n // info for parent query\n var _parent2 = newQuery();\n var _child2 = newQuery();\n var pcQChecks = [{\n type: Type.PARENT,\n parent: _parent2,\n child: _child2\n }];\n\n // the parent-child query takes the place of the query previously being populated\n _parent2.checks = query.checks; // the previous query contains the checks for the parent\n query.checks = pcQChecks; // pc query takes over\n\n selector.compoundCount++;\n return _child2; // we're now populating the child\n }\n }\n}, {\n name: 'descendant',\n separator: true,\n regex: tokens.descendant,\n populate: function populate(selector, query) {\n if (selector.currentSubject == null) {\n // default: descendant query\n var ancChQuery = newQuery();\n var descendant = newQuery();\n var ancestor = selector[selector.length - 1];\n ancChQuery.checks.push({\n type: Type.DESCENDANT,\n ancestor: ancestor,\n descendant: descendant\n });\n\n // the query in the selector should be the '>' itself\n replaceLastQuery(selector, query, ancChQuery);\n selector.compoundCount++;\n\n // we're now populating the descendant query with expressions that follow\n return descendant;\n } else if (selector.currentSubject === query) {\n // compound split query\n var compound = newQuery();\n var left = selector[selector.length - 1];\n var right = newQuery();\n var subject = newQuery();\n var _descendant = newQuery();\n var _ancestor = newQuery();\n\n // set up the root compound q\n compound.checks.push({\n type: Type.COMPOUND_SPLIT,\n left: left,\n right: right,\n subject: subject\n });\n\n // populate the subject and replace the q at the old spot (within left) with TRUE\n subject.checks = query.checks; // take the checks from the left\n query.checks = [{\n type: Type.TRUE\n }]; // checks under left refs the subject implicitly\n\n // set up the right q\n _ancestor.checks.push({\n type: Type.TRUE\n }); // ancestor implicitly refs the subject\n right.checks.push({\n type: Type.ANCESTOR,\n // type is swapped on right side queries\n ancestor: _ancestor,\n descendant: _descendant // empty for now\n });\n replaceLastQuery(selector, left, compound);\n\n // update the ref since we moved things around for `query`\n selector.currentSubject = subject;\n selector.compoundCount++;\n return _descendant; // now populating the right side's descendant\n } else {\n // ancestor query\n // info for parent query\n var _ancestor2 = newQuery();\n var _descendant2 = newQuery();\n var adQChecks = [{\n type: Type.ANCESTOR,\n ancestor: _ancestor2,\n descendant: _descendant2\n }];\n\n // the parent-child query takes the place of the query previously being populated\n _ancestor2.checks = query.checks; // the previous query contains the checks for the parent\n query.checks = adQChecks; // pc query takes over\n\n selector.compoundCount++;\n return _descendant2; // we're now populating the child\n }\n }\n}, {\n name: 'subject',\n modifier: true,\n regex: tokens.subject,\n populate: function populate(selector, query) {\n if (selector.currentSubject != null && selector.currentSubject !== query) {\n warn('Redefinition of subject in selector `' + selector.toString() + '`');\n return false;\n }\n selector.currentSubject = query;\n var topQ = selector[selector.length - 1];\n var topChk = topQ.checks[0];\n var topType = topChk == null ? null : topChk.type;\n if (topType === Type.DIRECTED_EDGE) {\n // directed edge with subject on the target\n\n // change to target node check\n topChk.type = Type.NODE_TARGET;\n } else if (topType === Type.UNDIRECTED_EDGE) {\n // undirected edge with subject on the second node\n\n // change to neighbor check\n topChk.type = Type.NODE_NEIGHBOR;\n topChk.node = topChk.nodes[1]; // second node is subject\n topChk.neighbor = topChk.nodes[0];\n\n // clean up unused fields for new type\n topChk.nodes = null;\n }\n }\n}];\nexprs.forEach(function (e) {\n return e.regexObj = new RegExp('^' + e.regex);\n});\n\n/**\n * Of all the expressions, find the first match in the remaining text.\n * @param {string} remaining The remaining text to parse\n * @returns The matched expression and the newly remaining text `{ expr, match, name, remaining }`\n */\nvar consumeExpr = function consumeExpr(remaining) {\n var expr;\n var match;\n var name;\n for (var j = 0; j < exprs.length; j++) {\n var e = exprs[j];\n var n = e.name;\n var m = remaining.match(e.regexObj);\n if (m != null) {\n match = m;\n expr = e;\n name = n;\n var consumed = m[0];\n remaining = remaining.substring(consumed.length);\n break; // we've consumed one expr, so we can return now\n }\n }\n return {\n expr: expr,\n match: match,\n name: name,\n remaining: remaining\n };\n};\n\n/**\n * Consume all the leading whitespace\n * @param {string} remaining The text to consume\n * @returns The text with the leading whitespace removed\n */\nvar consumeWhitespace = function consumeWhitespace(remaining) {\n var match = remaining.match(/^\\s+/);\n if (match) {\n var consumed = match[0];\n remaining = remaining.substring(consumed.length);\n }\n return remaining;\n};\n\n/**\n * Parse the string and store the parsed representation in the Selector.\n * @param {string} selector The selector string\n * @returns `true` if the selector was successfully parsed, `false` otherwise\n */\nvar parse = function parse(selector) {\n var self = this;\n var remaining = self.inputText = selector;\n var currentQuery = self[0] = newQuery();\n self.length = 1;\n remaining = consumeWhitespace(remaining); // get rid of leading whitespace\n\n for (;;) {\n var exprInfo = consumeExpr(remaining);\n if (exprInfo.expr == null) {\n warn('The selector `' + selector + '`is invalid');\n return false;\n } else {\n var args = exprInfo.match.slice(1);\n\n // let the token populate the selector object in currentQuery\n var ret = exprInfo.expr.populate(self, currentQuery, args);\n if (ret === false) {\n return false; // exit if population failed\n } else if (ret != null) {\n currentQuery = ret; // change the current query to be filled if the expr specifies\n }\n }\n remaining = exprInfo.remaining;\n\n // we're done when there's nothing left to parse\n if (remaining.match(/^\\s*$/)) {\n break;\n }\n }\n var lastQ = self[self.length - 1];\n if (self.currentSubject != null) {\n lastQ.subject = self.currentSubject;\n }\n lastQ.edgeCount = self.edgeCount;\n lastQ.compoundCount = self.compoundCount;\n for (var i = 0; i < self.length; i++) {\n var q = self[i];\n\n // in future, this could potentially be allowed if there were operator precedence and detection of invalid combinations\n if (q.compoundCount > 0 && q.edgeCount > 0) {\n warn('The selector `' + selector + '` is invalid because it uses both a compound selector and an edge selector');\n return false;\n }\n if (q.edgeCount > 1) {\n warn('The selector `' + selector + '` is invalid because it uses multiple edge selectors');\n return false;\n } else if (q.edgeCount === 1) {\n warn('The selector `' + selector + '` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.');\n }\n }\n return true; // success\n};\n\n/**\n * Get the selector represented as a string. This value uses default formatting,\n * so things like spacing may differ from the input text passed to the constructor.\n * @returns {string} The selector string\n */\nvar toString = function toString() {\n if (this.toStringCache != null) {\n return this.toStringCache;\n }\n var clean = function clean(obj) {\n if (obj == null) {\n return '';\n } else {\n return obj;\n }\n };\n var cleanVal = function cleanVal(val) {\n if (string(val)) {\n return '\"' + val + '\"';\n } else {\n return clean(val);\n }\n };\n var space = function space(val) {\n return ' ' + val + ' ';\n };\n var checkToString = function checkToString(check, subject) {\n var type = check.type,\n value = check.value;\n switch (type) {\n case Type.GROUP:\n {\n var group = clean(value);\n return group.substring(0, group.length - 1);\n }\n case Type.DATA_COMPARE:\n {\n var field = check.field,\n operator = check.operator;\n return '[' + field + space(clean(operator)) + cleanVal(value) + ']';\n }\n case Type.DATA_BOOL:\n {\n var _operator = check.operator,\n _field = check.field;\n return '[' + clean(_operator) + _field + ']';\n }\n case Type.DATA_EXIST:\n {\n var _field2 = check.field;\n return '[' + _field2 + ']';\n }\n case Type.META_COMPARE:\n {\n var _operator2 = check.operator,\n _field3 = check.field;\n return '[[' + _field3 + space(clean(_operator2)) + cleanVal(value) + ']]';\n }\n case Type.STATE:\n {\n return value;\n }\n case Type.ID:\n {\n return '#' + value;\n }\n case Type.CLASS:\n {\n return '.' + value;\n }\n case Type.PARENT:\n case Type.CHILD:\n {\n return queryToString(check.parent, subject) + space('>') + queryToString(check.child, subject);\n }\n case Type.ANCESTOR:\n case Type.DESCENDANT:\n {\n return queryToString(check.ancestor, subject) + ' ' + queryToString(check.descendant, subject);\n }\n case Type.COMPOUND_SPLIT:\n {\n var lhs = queryToString(check.left, subject);\n var sub = queryToString(check.subject, subject);\n var rhs = queryToString(check.right, subject);\n return lhs + (lhs.length > 0 ? ' ' : '') + sub + rhs;\n }\n case Type.TRUE:\n {\n return '';\n }\n }\n };\n var queryToString = function queryToString(query, subject) {\n return query.checks.reduce(function (str, chk, i) {\n return str + (subject === query && i === 0 ? '$' : '') + checkToString(chk, subject);\n }, '');\n };\n var str = '';\n for (var i = 0; i < this.length; i++) {\n var query = this[i];\n str += queryToString(query, query.subject);\n if (this.length > 1 && i < this.length - 1) {\n str += ', ';\n }\n }\n this.toStringCache = str;\n return str;\n};\nvar parse$1 = {\n parse: parse,\n toString: toString\n};\n\nvar valCmp = function valCmp(fieldVal, operator, value) {\n var matches;\n var isFieldStr = string(fieldVal);\n var isFieldNum = number$1(fieldVal);\n var isValStr = string(value);\n var fieldStr, valStr;\n var caseInsensitive = false;\n var notExpr = false;\n var isIneqCmp = false;\n if (operator.indexOf('!') >= 0) {\n operator = operator.replace('!', '');\n notExpr = true;\n }\n if (operator.indexOf('@') >= 0) {\n operator = operator.replace('@', '');\n caseInsensitive = true;\n }\n if (isFieldStr || isValStr || caseInsensitive) {\n fieldStr = !isFieldStr && !isFieldNum ? '' : '' + fieldVal;\n valStr = '' + value;\n }\n\n // if we're doing a case insensitive comparison, then we're using a STRING comparison\n // even if we're comparing numbers\n if (caseInsensitive) {\n fieldVal = fieldStr = fieldStr.toLowerCase();\n value = valStr = valStr.toLowerCase();\n }\n switch (operator) {\n case '*=':\n matches = fieldStr.indexOf(valStr) >= 0;\n break;\n case '$=':\n matches = fieldStr.indexOf(valStr, fieldStr.length - valStr.length) >= 0;\n break;\n case '^=':\n matches = fieldStr.indexOf(valStr) === 0;\n break;\n case '=':\n matches = fieldVal === value;\n break;\n case '>':\n isIneqCmp = true;\n matches = fieldVal > value;\n break;\n case '>=':\n isIneqCmp = true;\n matches = fieldVal >= value;\n break;\n case '<':\n isIneqCmp = true;\n matches = fieldVal < value;\n break;\n case '<=':\n isIneqCmp = true;\n matches = fieldVal <= value;\n break;\n default:\n matches = false;\n break;\n }\n\n // apply the not op, but null vals for inequalities should always stay non-matching\n if (notExpr && (fieldVal != null || !isIneqCmp)) {\n matches = !matches;\n }\n return matches;\n};\nvar boolCmp = function boolCmp(fieldVal, operator) {\n switch (operator) {\n case '?':\n return fieldVal ? true : false;\n case '!':\n return fieldVal ? false : true;\n case '^':\n return fieldVal === undefined;\n }\n};\nvar existCmp = function existCmp(fieldVal) {\n return fieldVal !== undefined;\n};\nvar data$1 = function data(ele, field) {\n return ele.data(field);\n};\nvar meta = function meta(ele, field) {\n return ele[field]();\n};\n\n/** A lookup of `match(check, ele)` functions by `Type` int */\nvar match = [];\n\n/**\n * Returns whether the query matches for the element\n * @param query The `{ type, value, ... }` query object\n * @param ele The element to compare against\n*/\nvar matches$1 = function matches(query, ele) {\n return query.checks.every(function (chk) {\n return match[chk.type](chk, ele);\n });\n};\nmatch[Type.GROUP] = function (check, ele) {\n var group = check.value;\n return group === '*' || group === ele.group();\n};\nmatch[Type.STATE] = function (check, ele) {\n var stateSelector = check.value;\n return stateSelectorMatches(stateSelector, ele);\n};\nmatch[Type.ID] = function (check, ele) {\n var id = check.value;\n return ele.id() === id;\n};\nmatch[Type.CLASS] = function (check, ele) {\n var cls = check.value;\n return ele.hasClass(cls);\n};\nmatch[Type.META_COMPARE] = function (check, ele) {\n var field = check.field,\n operator = check.operator,\n value = check.value;\n return valCmp(meta(ele, field), operator, value);\n};\nmatch[Type.DATA_COMPARE] = function (check, ele) {\n var field = check.field,\n operator = check.operator,\n value = check.value;\n return valCmp(data$1(ele, field), operator, value);\n};\nmatch[Type.DATA_BOOL] = function (check, ele) {\n var field = check.field,\n operator = check.operator;\n return boolCmp(data$1(ele, field), operator);\n};\nmatch[Type.DATA_EXIST] = function (check, ele) {\n var field = check.field;\n check.operator;\n return existCmp(data$1(ele, field));\n};\nmatch[Type.UNDIRECTED_EDGE] = function (check, ele) {\n var qA = check.nodes[0];\n var qB = check.nodes[1];\n var src = ele.source();\n var tgt = ele.target();\n return matches$1(qA, src) && matches$1(qB, tgt) || matches$1(qB, src) && matches$1(qA, tgt);\n};\nmatch[Type.NODE_NEIGHBOR] = function (check, ele) {\n return matches$1(check.node, ele) && ele.neighborhood().some(function (n) {\n return n.isNode() && matches$1(check.neighbor, n);\n });\n};\nmatch[Type.DIRECTED_EDGE] = function (check, ele) {\n return matches$1(check.source, ele.source()) && matches$1(check.target, ele.target());\n};\nmatch[Type.NODE_SOURCE] = function (check, ele) {\n return matches$1(check.source, ele) && ele.outgoers().some(function (n) {\n return n.isNode() && matches$1(check.target, n);\n });\n};\nmatch[Type.NODE_TARGET] = function (check, ele) {\n return matches$1(check.target, ele) && ele.incomers().some(function (n) {\n return n.isNode() && matches$1(check.source, n);\n });\n};\nmatch[Type.CHILD] = function (check, ele) {\n return matches$1(check.child, ele) && matches$1(check.parent, ele.parent());\n};\nmatch[Type.PARENT] = function (check, ele) {\n return matches$1(check.parent, ele) && ele.children().some(function (c) {\n return matches$1(check.child, c);\n });\n};\nmatch[Type.DESCENDANT] = function (check, ele) {\n return matches$1(check.descendant, ele) && ele.ancestors().some(function (a) {\n return matches$1(check.ancestor, a);\n });\n};\nmatch[Type.ANCESTOR] = function (check, ele) {\n return matches$1(check.ancestor, ele) && ele.descendants().some(function (d) {\n return matches$1(check.descendant, d);\n });\n};\nmatch[Type.COMPOUND_SPLIT] = function (check, ele) {\n return matches$1(check.subject, ele) && matches$1(check.left, ele) && matches$1(check.right, ele);\n};\nmatch[Type.TRUE] = function () {\n return true;\n};\nmatch[Type.COLLECTION] = function (check, ele) {\n var collection = check.value;\n return collection.has(ele);\n};\nmatch[Type.FILTER] = function (check, ele) {\n var filter = check.value;\n return filter(ele);\n};\n\n// filter an existing collection\nvar filter = function filter(collection) {\n var self = this;\n\n // for 1 id #foo queries, just get the element\n if (self.length === 1 && self[0].checks.length === 1 && self[0].checks[0].type === Type.ID) {\n return collection.getElementById(self[0].checks[0].value).collection();\n }\n var selectorFunction = function selectorFunction(element) {\n for (var j = 0; j < self.length; j++) {\n var query = self[j];\n if (matches$1(query, element)) {\n return true;\n }\n }\n return false;\n };\n if (self.text() == null) {\n selectorFunction = function selectorFunction() {\n return true;\n };\n }\n return collection.filter(selectorFunction);\n}; // filter\n\n// does selector match a single element?\nvar matches = function matches(ele) {\n var self = this;\n for (var j = 0; j < self.length; j++) {\n var query = self[j];\n if (matches$1(query, ele)) {\n return true;\n }\n }\n return false;\n}; // matches\n\nvar matching = {\n matches: matches,\n filter: filter\n};\n\nvar Selector = function Selector(selector) {\n this.inputText = selector;\n this.currentSubject = null;\n this.compoundCount = 0;\n this.edgeCount = 0;\n this.length = 0;\n if (selector == null || string(selector) && selector.match(/^\\s*$/)) ; else if (elementOrCollection(selector)) {\n this.addQuery({\n checks: [{\n type: Type.COLLECTION,\n value: selector.collection()\n }]\n });\n } else if (fn$6(selector)) {\n this.addQuery({\n checks: [{\n type: Type.FILTER,\n value: selector\n }]\n });\n } else if (string(selector)) {\n if (!this.parse(selector)) {\n this.invalid = true;\n }\n } else {\n error('A selector must be created from a string; found ');\n }\n};\nvar selfn = Selector.prototype;\n[parse$1, matching].forEach(function (p) {\n return extend(selfn, p);\n});\nselfn.text = function () {\n return this.inputText;\n};\nselfn.size = function () {\n return this.length;\n};\nselfn.eq = function (i) {\n return this[i];\n};\nselfn.sameText = function (otherSel) {\n return !this.invalid && !otherSel.invalid && this.text() === otherSel.text();\n};\nselfn.addQuery = function (q) {\n this[this.length++] = q;\n};\nselfn.selector = selfn.toString;\n\nvar elesfn$g = {\n allAre: function allAre(selector) {\n var selObj = new Selector(selector);\n return this.every(function (ele) {\n return selObj.matches(ele);\n });\n },\n is: function is(selector) {\n var selObj = new Selector(selector);\n return this.some(function (ele) {\n return selObj.matches(ele);\n });\n },\n some: function some(fn, thisArg) {\n for (var i = 0; i < this.length; i++) {\n var ret = !thisArg ? fn(this[i], i, this) : fn.apply(thisArg, [this[i], i, this]);\n if (ret) {\n return true;\n }\n }\n return false;\n },\n every: function every(fn, thisArg) {\n for (var i = 0; i < this.length; i++) {\n var ret = !thisArg ? fn(this[i], i, this) : fn.apply(thisArg, [this[i], i, this]);\n if (!ret) {\n return false;\n }\n }\n return true;\n },\n same: function same(collection) {\n // cheap collection ref check\n if (this === collection) {\n return true;\n }\n collection = this.cy().collection(collection);\n var thisLength = this.length;\n var collectionLength = collection.length;\n\n // cheap length check\n if (thisLength !== collectionLength) {\n return false;\n }\n\n // cheap element ref check\n if (thisLength === 1) {\n return this[0] === collection[0];\n }\n return this.every(function (ele) {\n return collection.hasElementWithId(ele.id());\n });\n },\n anySame: function anySame(collection) {\n collection = this.cy().collection(collection);\n return this.some(function (ele) {\n return collection.hasElementWithId(ele.id());\n });\n },\n allAreNeighbors: function allAreNeighbors(collection) {\n collection = this.cy().collection(collection);\n var nhood = this.neighborhood();\n return collection.every(function (ele) {\n return nhood.hasElementWithId(ele.id());\n });\n },\n contains: function contains(collection) {\n collection = this.cy().collection(collection);\n var self = this;\n return collection.every(function (ele) {\n return self.hasElementWithId(ele.id());\n });\n }\n};\nelesfn$g.allAreNeighbours = elesfn$g.allAreNeighbors;\nelesfn$g.has = elesfn$g.contains;\nelesfn$g.equal = elesfn$g.equals = elesfn$g.same;\n\nvar cache = function cache(fn, name) {\n return function traversalCache(arg1, arg2, arg3, arg4) {\n var selectorOrEles = arg1;\n var eles = this;\n var key;\n if (selectorOrEles == null) {\n key = '';\n } else if (elementOrCollection(selectorOrEles) && selectorOrEles.length === 1) {\n key = selectorOrEles.id();\n }\n if (eles.length === 1 && key) {\n var _p = eles[0]._private;\n var tch = _p.traversalCache = _p.traversalCache || {};\n var ch = tch[name] = tch[name] || [];\n var hash = hashString(key);\n var cacheHit = ch[hash];\n if (cacheHit) {\n return cacheHit;\n } else {\n return ch[hash] = fn.call(eles, arg1, arg2, arg3, arg4);\n }\n } else {\n return fn.call(eles, arg1, arg2, arg3, arg4);\n }\n };\n};\n\nvar elesfn$f = {\n parent: function parent(selector) {\n var parents = [];\n\n // optimisation for single ele call\n if (this.length === 1) {\n var parent = this[0]._private.parent;\n if (parent) {\n return parent;\n }\n }\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var _parent = ele._private.parent;\n if (_parent) {\n parents.push(_parent);\n }\n }\n return this.spawn(parents, true).filter(selector);\n },\n parents: function parents(selector) {\n var parents = [];\n var eles = this.parent();\n while (eles.nonempty()) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n parents.push(ele);\n }\n eles = eles.parent();\n }\n return this.spawn(parents, true).filter(selector);\n },\n commonAncestors: function commonAncestors(selector) {\n var ancestors;\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var parents = ele.parents();\n ancestors = ancestors || parents;\n ancestors = ancestors.intersect(parents); // current list must be common with current ele parents set\n }\n return ancestors.filter(selector);\n },\n orphans: function orphans(selector) {\n return this.stdFilter(function (ele) {\n return ele.isOrphan();\n }).filter(selector);\n },\n nonorphans: function nonorphans(selector) {\n return this.stdFilter(function (ele) {\n return ele.isChild();\n }).filter(selector);\n },\n children: cache(function (selector) {\n var children = [];\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var eleChildren = ele._private.children;\n for (var j = 0; j < eleChildren.length; j++) {\n children.push(eleChildren[j]);\n }\n }\n return this.spawn(children, true).filter(selector);\n }, 'children'),\n siblings: function siblings(selector) {\n return this.parent().children().not(this).filter(selector);\n },\n isParent: function isParent() {\n var ele = this[0];\n if (ele) {\n return ele.isNode() && ele._private.children.length !== 0;\n }\n },\n isChildless: function isChildless() {\n var ele = this[0];\n if (ele) {\n return ele.isNode() && ele._private.children.length === 0;\n }\n },\n isChild: function isChild() {\n var ele = this[0];\n if (ele) {\n return ele.isNode() && ele._private.parent != null;\n }\n },\n isOrphan: function isOrphan() {\n var ele = this[0];\n if (ele) {\n return ele.isNode() && ele._private.parent == null;\n }\n },\n descendants: function descendants(selector) {\n var elements = [];\n function add(eles) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n elements.push(ele);\n if (ele.children().nonempty()) {\n add(ele.children());\n }\n }\n }\n add(this.children());\n return this.spawn(elements, true).filter(selector);\n }\n};\nfunction forEachCompound(eles, fn, includeSelf, recursiveStep) {\n var q = [];\n var did = new Set$1();\n var cy = eles.cy();\n var hasCompounds = cy.hasCompoundNodes();\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n if (includeSelf) {\n q.push(ele);\n } else if (hasCompounds) {\n recursiveStep(q, did, ele);\n }\n }\n while (q.length > 0) {\n var _ele = q.shift();\n fn(_ele);\n did.add(_ele.id());\n if (hasCompounds) {\n recursiveStep(q, did, _ele);\n }\n }\n return eles;\n}\nfunction addChildren(q, did, ele) {\n if (ele.isParent()) {\n var children = ele._private.children;\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n if (!did.has(child.id())) {\n q.push(child);\n }\n }\n }\n}\n\n// very efficient version of eles.add( eles.descendants() ).forEach()\n// for internal use\nelesfn$f.forEachDown = function (fn) {\n var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return forEachCompound(this, fn, includeSelf, addChildren);\n};\nfunction addParent(q, did, ele) {\n if (ele.isChild()) {\n var parent = ele._private.parent;\n if (!did.has(parent.id())) {\n q.push(parent);\n }\n }\n}\nelesfn$f.forEachUp = function (fn) {\n var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return forEachCompound(this, fn, includeSelf, addParent);\n};\nfunction addParentAndChildren(q, did, ele) {\n addParent(q, did, ele);\n addChildren(q, did, ele);\n}\nelesfn$f.forEachUpAndDown = function (fn) {\n var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return forEachCompound(this, fn, includeSelf, addParentAndChildren);\n};\n\n// aliases\nelesfn$f.ancestors = elesfn$f.parents;\n\nvar fn$5, elesfn$e;\nfn$5 = elesfn$e = {\n data: define.data({\n field: 'data',\n bindingEvent: 'data',\n allowBinding: true,\n allowSetting: true,\n settingEvent: 'data',\n settingTriggersEvent: true,\n triggerFnName: 'trigger',\n allowGetting: true,\n immutableKeys: {\n 'id': true,\n 'source': true,\n 'target': true,\n 'parent': true\n },\n updateStyle: true\n }),\n removeData: define.removeData({\n field: 'data',\n event: 'data',\n triggerFnName: 'trigger',\n triggerEvent: true,\n immutableKeys: {\n 'id': true,\n 'source': true,\n 'target': true,\n 'parent': true\n },\n updateStyle: true\n }),\n scratch: define.data({\n field: 'scratch',\n bindingEvent: 'scratch',\n allowBinding: true,\n allowSetting: true,\n settingEvent: 'scratch',\n settingTriggersEvent: true,\n triggerFnName: 'trigger',\n allowGetting: true,\n updateStyle: true\n }),\n removeScratch: define.removeData({\n field: 'scratch',\n event: 'scratch',\n triggerFnName: 'trigger',\n triggerEvent: true,\n updateStyle: true\n }),\n rscratch: define.data({\n field: 'rscratch',\n allowBinding: false,\n allowSetting: true,\n settingTriggersEvent: false,\n allowGetting: true\n }),\n removeRscratch: define.removeData({\n field: 'rscratch',\n triggerEvent: false\n }),\n id: function id() {\n var ele = this[0];\n if (ele) {\n return ele._private.data.id;\n }\n }\n};\n\n// aliases\nfn$5.attr = fn$5.data;\nfn$5.removeAttr = fn$5.removeData;\nvar data = elesfn$e;\n\nvar elesfn$d = {};\nfunction defineDegreeFunction(callback) {\n return function (includeLoops) {\n var self = this;\n if (includeLoops === undefined) {\n includeLoops = true;\n }\n if (self.length === 0) {\n return;\n }\n if (self.isNode() && !self.removed()) {\n var degree = 0;\n var node = self[0];\n var connectedEdges = node._private.edges;\n for (var i = 0; i < connectedEdges.length; i++) {\n var edge = connectedEdges[i];\n if (!includeLoops && edge.isLoop()) {\n continue;\n }\n degree += callback(node, edge);\n }\n return degree;\n } else {\n return;\n }\n };\n}\nextend(elesfn$d, {\n degree: defineDegreeFunction(function (node, edge) {\n if (edge.source().same(edge.target())) {\n return 2;\n } else {\n return 1;\n }\n }),\n indegree: defineDegreeFunction(function (node, edge) {\n if (edge.target().same(node)) {\n return 1;\n } else {\n return 0;\n }\n }),\n outdegree: defineDegreeFunction(function (node, edge) {\n if (edge.source().same(node)) {\n return 1;\n } else {\n return 0;\n }\n })\n});\nfunction defineDegreeBoundsFunction(degreeFn, callback) {\n return function (includeLoops) {\n var ret;\n var nodes = this.nodes();\n for (var i = 0; i < nodes.length; i++) {\n var ele = nodes[i];\n var degree = ele[degreeFn](includeLoops);\n if (degree !== undefined && (ret === undefined || callback(degree, ret))) {\n ret = degree;\n }\n }\n return ret;\n };\n}\nextend(elesfn$d, {\n minDegree: defineDegreeBoundsFunction('degree', function (degree, min) {\n return degree < min;\n }),\n maxDegree: defineDegreeBoundsFunction('degree', function (degree, max) {\n return degree > max;\n }),\n minIndegree: defineDegreeBoundsFunction('indegree', function (degree, min) {\n return degree < min;\n }),\n maxIndegree: defineDegreeBoundsFunction('indegree', function (degree, max) {\n return degree > max;\n }),\n minOutdegree: defineDegreeBoundsFunction('outdegree', function (degree, min) {\n return degree < min;\n }),\n maxOutdegree: defineDegreeBoundsFunction('outdegree', function (degree, max) {\n return degree > max;\n })\n});\nextend(elesfn$d, {\n totalDegree: function totalDegree(includeLoops) {\n var total = 0;\n var nodes = this.nodes();\n for (var i = 0; i < nodes.length; i++) {\n total += nodes[i].degree(includeLoops);\n }\n return total;\n }\n});\n\nvar fn$4, elesfn$c;\nvar beforePositionSet = function beforePositionSet(eles, newPos, silent) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n if (!ele.locked()) {\n var oldPos = ele._private.position;\n var delta = {\n x: newPos.x != null ? newPos.x - oldPos.x : 0,\n y: newPos.y != null ? newPos.y - oldPos.y : 0\n };\n if (ele.isParent() && !(delta.x === 0 && delta.y === 0)) {\n ele.children().shift(delta, silent);\n }\n ele.dirtyBoundingBoxCache();\n }\n }\n};\nvar positionDef = {\n field: 'position',\n bindingEvent: 'position',\n allowBinding: true,\n allowSetting: true,\n settingEvent: 'position',\n settingTriggersEvent: true,\n triggerFnName: 'emitAndNotify',\n allowGetting: true,\n validKeys: ['x', 'y'],\n beforeGet: function beforeGet(ele) {\n ele.updateCompoundBounds();\n },\n beforeSet: function beforeSet(eles, newPos) {\n beforePositionSet(eles, newPos, false);\n },\n onSet: function onSet(eles) {\n eles.dirtyCompoundBoundsCache();\n },\n canSet: function canSet(ele) {\n return !ele.locked();\n }\n};\nfn$4 = elesfn$c = {\n position: define.data(positionDef),\n // position but no notification to renderer\n silentPosition: define.data(extend({}, positionDef, {\n allowBinding: false,\n allowSetting: true,\n settingTriggersEvent: false,\n allowGetting: false,\n beforeSet: function beforeSet(eles, newPos) {\n beforePositionSet(eles, newPos, true);\n },\n onSet: function onSet(eles) {\n eles.dirtyCompoundBoundsCache();\n }\n })),\n positions: function positions(pos, silent) {\n if (plainObject(pos)) {\n if (silent) {\n this.silentPosition(pos);\n } else {\n this.position(pos);\n }\n } else if (fn$6(pos)) {\n var _fn = pos;\n var cy = this.cy();\n cy.startBatch();\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var _pos = undefined;\n if (_pos = _fn(ele, i)) {\n if (silent) {\n ele.silentPosition(_pos);\n } else {\n ele.position(_pos);\n }\n }\n }\n cy.endBatch();\n }\n return this; // chaining\n },\n silentPositions: function silentPositions(pos) {\n return this.positions(pos, true);\n },\n shift: function shift(dim, val, silent) {\n var delta;\n if (plainObject(dim)) {\n delta = {\n x: number$1(dim.x) ? dim.x : 0,\n y: number$1(dim.y) ? dim.y : 0\n };\n silent = val;\n } else if (string(dim) && number$1(val)) {\n delta = {\n x: 0,\n y: 0\n };\n delta[dim] = val;\n }\n if (delta != null) {\n var cy = this.cy();\n cy.startBatch();\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n\n // exclude any node that is a descendant of the calling collection\n if (cy.hasCompoundNodes() && ele.isChild() && ele.ancestors().anySame(this)) {\n continue;\n }\n var pos = ele.position();\n var newPos = {\n x: pos.x + delta.x,\n y: pos.y + delta.y\n };\n if (silent) {\n ele.silentPosition(newPos);\n } else {\n ele.position(newPos);\n }\n }\n cy.endBatch();\n }\n return this;\n },\n silentShift: function silentShift(dim, val) {\n if (plainObject(dim)) {\n this.shift(dim, true);\n } else if (string(dim) && number$1(val)) {\n this.shift(dim, val, true);\n }\n return this;\n },\n // get/set the rendered (i.e. on screen) positon of the element\n renderedPosition: function renderedPosition(dim, val) {\n var ele = this[0];\n var cy = this.cy();\n var zoom = cy.zoom();\n var pan = cy.pan();\n var rpos = plainObject(dim) ? dim : undefined;\n var setting = rpos !== undefined || val !== undefined && string(dim);\n if (ele && ele.isNode()) {\n // must have an element and must be a node to return position\n if (setting) {\n for (var i = 0; i < this.length; i++) {\n var _ele = this[i];\n if (val !== undefined) {\n // set one dimension\n _ele.position(dim, (val - pan[dim]) / zoom);\n } else if (rpos !== undefined) {\n // set whole position\n _ele.position(renderedToModelPosition(rpos, zoom, pan));\n }\n }\n } else {\n // getting\n var pos = ele.position();\n rpos = modelToRenderedPosition$1(pos, zoom, pan);\n if (dim === undefined) {\n // then return the whole rendered position\n return rpos;\n } else {\n // then return the specified dimension\n return rpos[dim];\n }\n }\n } else if (!setting) {\n return undefined; // for empty collection case\n }\n return this; // chaining\n },\n // get/set the position relative to the parent\n relativePosition: function relativePosition(dim, val) {\n var ele = this[0];\n var cy = this.cy();\n var ppos = plainObject(dim) ? dim : undefined;\n var setting = ppos !== undefined || val !== undefined && string(dim);\n var hasCompoundNodes = cy.hasCompoundNodes();\n if (ele && ele.isNode()) {\n // must have an element and must be a node to return position\n if (setting) {\n for (var i = 0; i < this.length; i++) {\n var _ele2 = this[i];\n var parent = hasCompoundNodes ? _ele2.parent() : null;\n var hasParent = parent && parent.length > 0;\n var relativeToParent = hasParent;\n if (hasParent) {\n parent = parent[0];\n }\n var origin = relativeToParent ? parent.position() : {\n x: 0,\n y: 0\n };\n if (val !== undefined) {\n // set one dimension\n _ele2.position(dim, val + origin[dim]);\n } else if (ppos !== undefined) {\n // set whole position\n _ele2.position({\n x: ppos.x + origin.x,\n y: ppos.y + origin.y\n });\n }\n }\n } else {\n // getting\n var pos = ele.position();\n var _parent = hasCompoundNodes ? ele.parent() : null;\n var _hasParent = _parent && _parent.length > 0;\n var _relativeToParent = _hasParent;\n if (_hasParent) {\n _parent = _parent[0];\n }\n var _origin = _relativeToParent ? _parent.position() : {\n x: 0,\n y: 0\n };\n ppos = {\n x: pos.x - _origin.x,\n y: pos.y - _origin.y\n };\n if (dim === undefined) {\n // then return the whole rendered position\n return ppos;\n } else {\n // then return the specified dimension\n return ppos[dim];\n }\n }\n } else if (!setting) {\n return undefined; // for empty collection case\n }\n return this; // chaining\n }\n};\n\n// aliases\nfn$4.modelPosition = fn$4.point = fn$4.position;\nfn$4.modelPositions = fn$4.points = fn$4.positions;\nfn$4.renderedPoint = fn$4.renderedPosition;\nfn$4.relativePoint = fn$4.relativePosition;\nvar position = elesfn$c;\n\nvar fn$3, elesfn$b;\nfn$3 = elesfn$b = {};\nelesfn$b.renderedBoundingBox = function (options) {\n var bb = this.boundingBox(options);\n var cy = this.cy();\n var zoom = cy.zoom();\n var pan = cy.pan();\n var x1 = bb.x1 * zoom + pan.x;\n var x2 = bb.x2 * zoom + pan.x;\n var y1 = bb.y1 * zoom + pan.y;\n var y2 = bb.y2 * zoom + pan.y;\n return {\n x1: x1,\n x2: x2,\n y1: y1,\n y2: y2,\n w: x2 - x1,\n h: y2 - y1\n };\n};\nelesfn$b.dirtyCompoundBoundsCache = function () {\n var silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var cy = this.cy();\n if (!cy.styleEnabled() || !cy.hasCompoundNodes()) {\n return this;\n }\n this.forEachUp(function (ele) {\n if (ele.isParent()) {\n var _p = ele._private;\n _p.compoundBoundsClean = false;\n _p.bbCache = null;\n if (!silent) {\n ele.emitAndNotify('bounds');\n }\n }\n });\n return this;\n};\nelesfn$b.updateCompoundBounds = function () {\n var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var cy = this.cy();\n\n // not possible to do on non-compound graphs or with the style disabled\n if (!cy.styleEnabled() || !cy.hasCompoundNodes()) {\n return this;\n }\n\n // save cycles when batching -- but bounds will be stale (or not exist yet)\n if (!force && cy.batching()) {\n return this;\n }\n function update(parent) {\n if (!parent.isParent()) {\n return;\n }\n var _p = parent._private;\n var children = parent.children();\n var includeLabels = parent.pstyle('compound-sizing-wrt-labels').value === 'include';\n var min = {\n width: {\n val: parent.pstyle('min-width').pfValue,\n left: parent.pstyle('min-width-bias-left'),\n right: parent.pstyle('min-width-bias-right')\n },\n height: {\n val: parent.pstyle('min-height').pfValue,\n top: parent.pstyle('min-height-bias-top'),\n bottom: parent.pstyle('min-height-bias-bottom')\n }\n };\n var bb = children.boundingBox({\n includeLabels: includeLabels,\n includeOverlays: false,\n // updating the compound bounds happens outside of the regular\n // cache cycle (i.e. before fired events)\n useCache: false\n });\n var pos = _p.position;\n\n // if children take up zero area then keep position and fall back on stylesheet w/h\n if (bb.w === 0 || bb.h === 0) {\n bb = {\n w: parent.pstyle('width').pfValue,\n h: parent.pstyle('height').pfValue\n };\n bb.x1 = pos.x - bb.w / 2;\n bb.x2 = pos.x + bb.w / 2;\n bb.y1 = pos.y - bb.h / 2;\n bb.y2 = pos.y + bb.h / 2;\n }\n function computeBiasValues(propDiff, propBias, propBiasComplement) {\n var biasDiff = 0;\n var biasComplementDiff = 0;\n var biasTotal = propBias + propBiasComplement;\n if (propDiff > 0 && biasTotal > 0) {\n biasDiff = propBias / biasTotal * propDiff;\n biasComplementDiff = propBiasComplement / biasTotal * propDiff;\n }\n return {\n biasDiff: biasDiff,\n biasComplementDiff: biasComplementDiff\n };\n }\n function computePaddingValues(width, height, paddingObject, relativeTo) {\n // Assuming percentage is number from 0 to 1\n if (paddingObject.units === '%') {\n switch (relativeTo) {\n case 'width':\n return width > 0 ? paddingObject.pfValue * width : 0;\n case 'height':\n return height > 0 ? paddingObject.pfValue * height : 0;\n case 'average':\n return width > 0 && height > 0 ? paddingObject.pfValue * (width + height) / 2 : 0;\n case 'min':\n return width > 0 && height > 0 ? width > height ? paddingObject.pfValue * height : paddingObject.pfValue * width : 0;\n case 'max':\n return width > 0 && height > 0 ? width > height ? paddingObject.pfValue * width : paddingObject.pfValue * height : 0;\n default:\n return 0;\n }\n } else if (paddingObject.units === 'px') {\n return paddingObject.pfValue;\n } else {\n return 0;\n }\n }\n var leftVal = min.width.left.value;\n if (min.width.left.units === 'px' && min.width.val > 0) {\n leftVal = leftVal * 100 / min.width.val;\n }\n var rightVal = min.width.right.value;\n if (min.width.right.units === 'px' && min.width.val > 0) {\n rightVal = rightVal * 100 / min.width.val;\n }\n var topVal = min.height.top.value;\n if (min.height.top.units === 'px' && min.height.val > 0) {\n topVal = topVal * 100 / min.height.val;\n }\n var bottomVal = min.height.bottom.value;\n if (min.height.bottom.units === 'px' && min.height.val > 0) {\n bottomVal = bottomVal * 100 / min.height.val;\n }\n var widthBiasDiffs = computeBiasValues(min.width.val - bb.w, leftVal, rightVal);\n var diffLeft = widthBiasDiffs.biasDiff;\n var diffRight = widthBiasDiffs.biasComplementDiff;\n var heightBiasDiffs = computeBiasValues(min.height.val - bb.h, topVal, bottomVal);\n var diffTop = heightBiasDiffs.biasDiff;\n var diffBottom = heightBiasDiffs.biasComplementDiff;\n _p.autoPadding = computePaddingValues(bb.w, bb.h, parent.pstyle('padding'), parent.pstyle('padding-relative-to').value);\n _p.autoWidth = Math.max(bb.w, min.width.val);\n pos.x = (-diffLeft + bb.x1 + bb.x2 + diffRight) / 2;\n _p.autoHeight = Math.max(bb.h, min.height.val);\n pos.y = (-diffTop + bb.y1 + bb.y2 + diffBottom) / 2;\n }\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var _p = ele._private;\n if (!_p.compoundBoundsClean || force) {\n update(ele);\n if (!cy.batching()) {\n _p.compoundBoundsClean = true;\n }\n }\n }\n return this;\n};\nvar noninf = function noninf(x) {\n if (x === Infinity || x === -Infinity) {\n return 0;\n }\n return x;\n};\nvar updateBounds = function updateBounds(b, x1, y1, x2, y2) {\n // don't update with zero area boxes\n if (x2 - x1 === 0 || y2 - y1 === 0) {\n return;\n }\n\n // don't update with null dim\n if (x1 == null || y1 == null || x2 == null || y2 == null) {\n return;\n }\n b.x1 = x1 < b.x1 ? x1 : b.x1;\n b.x2 = x2 > b.x2 ? x2 : b.x2;\n b.y1 = y1 < b.y1 ? y1 : b.y1;\n b.y2 = y2 > b.y2 ? y2 : b.y2;\n b.w = b.x2 - b.x1;\n b.h = b.y2 - b.y1;\n};\nvar updateBoundsFromBox = function updateBoundsFromBox(b, b2) {\n if (b2 == null) {\n return b;\n }\n return updateBounds(b, b2.x1, b2.y1, b2.x2, b2.y2);\n};\nvar prefixedProperty = function prefixedProperty(obj, field, prefix) {\n return getPrefixedProperty(obj, field, prefix);\n};\nvar updateBoundsFromArrow = function updateBoundsFromArrow(bounds, ele, prefix) {\n if (ele.cy().headless()) {\n return;\n }\n var _p = ele._private;\n var rstyle = _p.rstyle;\n var halfArW = rstyle.arrowWidth / 2;\n var arrowType = ele.pstyle(prefix + '-arrow-shape').value;\n var x;\n var y;\n if (arrowType !== 'none') {\n if (prefix === 'source') {\n x = rstyle.srcX;\n y = rstyle.srcY;\n } else if (prefix === 'target') {\n x = rstyle.tgtX;\n y = rstyle.tgtY;\n } else {\n x = rstyle.midX;\n y = rstyle.midY;\n }\n\n // always store the individual arrow bounds\n var bbs = _p.arrowBounds = _p.arrowBounds || {};\n var bb = bbs[prefix] = bbs[prefix] || {};\n bb.x1 = x - halfArW;\n bb.y1 = y - halfArW;\n bb.x2 = x + halfArW;\n bb.y2 = y + halfArW;\n bb.w = bb.x2 - bb.x1;\n bb.h = bb.y2 - bb.y1;\n expandBoundingBox(bb, 1);\n updateBounds(bounds, bb.x1, bb.y1, bb.x2, bb.y2);\n }\n};\nvar updateBoundsFromLabel = function updateBoundsFromLabel(bounds, ele, prefix) {\n if (ele.cy().headless()) {\n return;\n }\n var prefixDash;\n if (prefix) {\n prefixDash = prefix + '-';\n } else {\n prefixDash = '';\n }\n var _p = ele._private;\n var rstyle = _p.rstyle;\n var label = ele.pstyle(prefixDash + 'label').strValue;\n if (label) {\n var halign = ele.pstyle('text-halign');\n var valign = ele.pstyle('text-valign');\n var labelWidth = prefixedProperty(rstyle, 'labelWidth', prefix);\n var labelHeight = prefixedProperty(rstyle, 'labelHeight', prefix);\n var labelX = prefixedProperty(rstyle, 'labelX', prefix);\n var labelY = prefixedProperty(rstyle, 'labelY', prefix);\n var marginX = ele.pstyle(prefixDash + 'text-margin-x').pfValue;\n var marginY = ele.pstyle(prefixDash + 'text-margin-y').pfValue;\n var isEdge = ele.isEdge();\n var rotation = ele.pstyle(prefixDash + 'text-rotation');\n var outlineWidth = ele.pstyle('text-outline-width').pfValue;\n var borderWidth = ele.pstyle('text-border-width').pfValue;\n var halfBorderWidth = borderWidth / 2;\n var padding = ele.pstyle('text-background-padding').pfValue;\n var marginOfError = 2; // expand to work around browser dimension inaccuracies\n\n var lh = labelHeight;\n var lw = labelWidth;\n var lw_2 = lw / 2;\n var lh_2 = lh / 2;\n var lx1, lx2, ly1, ly2;\n if (isEdge) {\n lx1 = labelX - lw_2;\n lx2 = labelX + lw_2;\n ly1 = labelY - lh_2;\n ly2 = labelY + lh_2;\n } else {\n switch (halign.value) {\n case 'left':\n lx1 = labelX - lw;\n lx2 = labelX;\n break;\n case 'center':\n lx1 = labelX - lw_2;\n lx2 = labelX + lw_2;\n break;\n case 'right':\n lx1 = labelX;\n lx2 = labelX + lw;\n break;\n }\n switch (valign.value) {\n case 'top':\n ly1 = labelY - lh;\n ly2 = labelY;\n break;\n case 'center':\n ly1 = labelY - lh_2;\n ly2 = labelY + lh_2;\n break;\n case 'bottom':\n ly1 = labelY;\n ly2 = labelY + lh;\n break;\n }\n }\n\n // shift by margin and expand by outline and border\n var leftPad = marginX - Math.max(outlineWidth, halfBorderWidth) - padding - marginOfError;\n var rightPad = marginX + Math.max(outlineWidth, halfBorderWidth) + padding + marginOfError;\n var topPad = marginY - Math.max(outlineWidth, halfBorderWidth) - padding - marginOfError;\n var botPad = marginY + Math.max(outlineWidth, halfBorderWidth) + padding + marginOfError;\n lx1 += leftPad;\n lx2 += rightPad;\n ly1 += topPad;\n ly2 += botPad;\n\n // always store the unrotated label bounds separately\n var bbPrefix = prefix || 'main';\n var bbs = _p.labelBounds;\n var bb = bbs[bbPrefix] = bbs[bbPrefix] || {};\n bb.x1 = lx1;\n bb.y1 = ly1;\n bb.x2 = lx2;\n bb.y2 = ly2;\n bb.w = lx2 - lx1;\n bb.h = ly2 - ly1;\n bb.leftPad = leftPad;\n bb.rightPad = rightPad;\n bb.topPad = topPad;\n bb.botPad = botPad;\n var isAutorotate = isEdge && rotation.strValue === 'autorotate';\n var isPfValue = rotation.pfValue != null && rotation.pfValue !== 0;\n if (isAutorotate || isPfValue) {\n var theta = isAutorotate ? prefixedProperty(_p.rstyle, 'labelAngle', prefix) : rotation.pfValue;\n var cos = Math.cos(theta);\n var sin = Math.sin(theta);\n\n // rotation point (default value for center-center)\n var xo = (lx1 + lx2) / 2;\n var yo = (ly1 + ly2) / 2;\n if (!isEdge) {\n switch (halign.value) {\n case 'left':\n xo = lx2;\n break;\n case 'right':\n xo = lx1;\n break;\n }\n switch (valign.value) {\n case 'top':\n yo = ly2;\n break;\n case 'bottom':\n yo = ly1;\n break;\n }\n }\n var rotate = function rotate(x, y) {\n x = x - xo;\n y = y - yo;\n return {\n x: x * cos - y * sin + xo,\n y: x * sin + y * cos + yo\n };\n };\n var px1y1 = rotate(lx1, ly1);\n var px1y2 = rotate(lx1, ly2);\n var px2y1 = rotate(lx2, ly1);\n var px2y2 = rotate(lx2, ly2);\n lx1 = Math.min(px1y1.x, px1y2.x, px2y1.x, px2y2.x);\n lx2 = Math.max(px1y1.x, px1y2.x, px2y1.x, px2y2.x);\n ly1 = Math.min(px1y1.y, px1y2.y, px2y1.y, px2y2.y);\n ly2 = Math.max(px1y1.y, px1y2.y, px2y1.y, px2y2.y);\n }\n var bbPrefixRot = bbPrefix + 'Rot';\n var bbRot = bbs[bbPrefixRot] = bbs[bbPrefixRot] || {};\n bbRot.x1 = lx1;\n bbRot.y1 = ly1;\n bbRot.x2 = lx2;\n bbRot.y2 = ly2;\n bbRot.w = lx2 - lx1;\n bbRot.h = ly2 - ly1;\n updateBounds(bounds, lx1, ly1, lx2, ly2);\n updateBounds(_p.labelBounds.all, lx1, ly1, lx2, ly2);\n }\n return bounds;\n};\nvar updateBoundsFromOutline = function updateBoundsFromOutline(bounds, ele) {\n if (ele.cy().headless()) {\n return;\n }\n var outlineOpacity = ele.pstyle('outline-opacity').value;\n var outlineWidth = ele.pstyle('outline-width').value;\n var outlineOffset = ele.pstyle('outline-offset').value;\n var expansion = outlineWidth + outlineOffset;\n updateBoundsFromMiter(bounds, ele, outlineOpacity, expansion, 'outside', expansion / 2);\n};\nvar updateBoundsFromMiter = function updateBoundsFromMiter(bounds, ele, opacity, expansionSize, expansionPosition, useFallbackValue) {\n if (opacity === 0 || expansionSize <= 0 || expansionPosition === 'inside') {\n return;\n }\n var cy = ele.cy();\n var shape = ele.pstyle('shape').value;\n var rshape = cy.renderer().nodeShapes[shape];\n var _ele$position = ele.position(),\n x = _ele$position.x,\n y = _ele$position.y;\n var w = ele.width();\n var h = ele.height();\n if (rshape.hasMiterBounds) {\n if (expansionPosition === 'center') {\n expansionSize /= 2;\n }\n var mbb = rshape.miterBounds(x, y, w, h, expansionSize);\n updateBoundsFromBox(bounds, mbb);\n } else if (useFallbackValue != null && useFallbackValue > 0) {\n expandBoundingBoxSides(bounds, [useFallbackValue, useFallbackValue, useFallbackValue, useFallbackValue]);\n }\n};\nvar updateBoundsFromMiterBorder = function updateBoundsFromMiterBorder(bounds, ele) {\n if (ele.cy().headless()) {\n return;\n }\n var borderOpacity = ele.pstyle('border-opacity').value;\n var borderWidth = ele.pstyle('border-width').pfValue;\n var borderPosition = ele.pstyle('border-position').value;\n updateBoundsFromMiter(bounds, ele, borderOpacity, borderWidth, borderPosition);\n};\n\n// get the bounding box of the elements (in raw model position)\nvar boundingBoxImpl = function boundingBoxImpl(ele, options) {\n var cy = ele._private.cy;\n var styleEnabled = cy.styleEnabled();\n var headless = cy.headless();\n var bounds = makeBoundingBox();\n var _p = ele._private;\n var isNode = ele.isNode();\n var isEdge = ele.isEdge();\n var ex1, ex2, ey1, ey2; // extrema of body / lines\n var x, y; // node pos\n var rstyle = _p.rstyle;\n var manualExpansion = isNode && styleEnabled ? ele.pstyle('bounds-expansion').pfValue : [0];\n\n // must use `display` prop only, as reading `compound.width()` causes recursion\n // (other factors like width values will be considered later in this function anyway)\n var isDisplayed = function isDisplayed(ele) {\n return ele.pstyle('display').value !== 'none';\n };\n var displayed = !styleEnabled || isDisplayed(ele)\n\n // must take into account connected nodes b/c of implicit edge hiding on display:none node\n && (!isEdge || isDisplayed(ele.source()) && isDisplayed(ele.target()));\n if (displayed) {\n // displayed suffices, since we will find zero area eles anyway\n var overlayOpacity = 0;\n var overlayPadding = 0;\n if (styleEnabled && options.includeOverlays) {\n overlayOpacity = ele.pstyle('overlay-opacity').value;\n if (overlayOpacity !== 0) {\n overlayPadding = ele.pstyle('overlay-padding').value;\n }\n }\n var underlayOpacity = 0;\n var underlayPadding = 0;\n if (styleEnabled && options.includeUnderlays) {\n underlayOpacity = ele.pstyle('underlay-opacity').value;\n if (underlayOpacity !== 0) {\n underlayPadding = ele.pstyle('underlay-padding').value;\n }\n }\n var padding = Math.max(overlayPadding, underlayPadding);\n var w = 0;\n var wHalf = 0;\n if (styleEnabled) {\n w = ele.pstyle('width').pfValue;\n wHalf = w / 2;\n }\n if (isNode && options.includeNodes) {\n var pos = ele.position();\n x = pos.x;\n y = pos.y;\n var _w = ele.outerWidth();\n var halfW = _w / 2;\n var h = ele.outerHeight();\n var halfH = h / 2;\n\n // handle node dimensions\n /////////////////////////\n\n ex1 = x - halfW;\n ex2 = x + halfW;\n ey1 = y - halfH;\n ey2 = y + halfH;\n updateBounds(bounds, ex1, ey1, ex2, ey2);\n if (styleEnabled) {\n updateBoundsFromOutline(bounds, ele);\n }\n if (styleEnabled && options.includeOutlines && !headless) {\n updateBoundsFromOutline(bounds, ele);\n }\n if (styleEnabled) {\n updateBoundsFromMiterBorder(bounds, ele);\n }\n } else if (isEdge && options.includeEdges) {\n if (styleEnabled && !headless) {\n var curveStyle = ele.pstyle('curve-style').strValue;\n\n // handle edge dimensions (rough box estimate)\n //////////////////////////////////////////////\n\n ex1 = Math.min(rstyle.srcX, rstyle.midX, rstyle.tgtX);\n ex2 = Math.max(rstyle.srcX, rstyle.midX, rstyle.tgtX);\n ey1 = Math.min(rstyle.srcY, rstyle.midY, rstyle.tgtY);\n ey2 = Math.max(rstyle.srcY, rstyle.midY, rstyle.tgtY);\n\n // take into account edge width\n ex1 -= wHalf;\n ex2 += wHalf;\n ey1 -= wHalf;\n ey2 += wHalf;\n updateBounds(bounds, ex1, ey1, ex2, ey2);\n\n // precise edges\n ////////////////\n\n if (curveStyle === 'haystack') {\n var hpts = rstyle.haystackPts;\n if (hpts && hpts.length === 2) {\n ex1 = hpts[0].x;\n ey1 = hpts[0].y;\n ex2 = hpts[1].x;\n ey2 = hpts[1].y;\n if (ex1 > ex2) {\n var temp = ex1;\n ex1 = ex2;\n ex2 = temp;\n }\n if (ey1 > ey2) {\n var _temp = ey1;\n ey1 = ey2;\n ey2 = _temp;\n }\n updateBounds(bounds, ex1 - wHalf, ey1 - wHalf, ex2 + wHalf, ey2 + wHalf);\n }\n } else if (curveStyle === 'bezier' || curveStyle === 'unbundled-bezier' || endsWith(curveStyle, 'segments') || endsWith(curveStyle, 'taxi')) {\n var pts;\n switch (curveStyle) {\n case 'bezier':\n case 'unbundled-bezier':\n pts = rstyle.bezierPts;\n break;\n case 'segments':\n case 'taxi':\n case 'round-segments':\n case 'round-taxi':\n pts = rstyle.linePts;\n break;\n }\n if (pts != null) {\n for (var j = 0; j < pts.length; j++) {\n var pt = pts[j];\n ex1 = pt.x - wHalf;\n ex2 = pt.x + wHalf;\n ey1 = pt.y - wHalf;\n ey2 = pt.y + wHalf;\n updateBounds(bounds, ex1, ey1, ex2, ey2);\n }\n }\n } // bezier-like or segment-like edge\n } else {\n // headless or style disabled\n\n // fallback on source and target positions\n //////////////////////////////////////////\n\n var n1 = ele.source();\n var n1pos = n1.position();\n var n2 = ele.target();\n var n2pos = n2.position();\n ex1 = n1pos.x;\n ex2 = n2pos.x;\n ey1 = n1pos.y;\n ey2 = n2pos.y;\n if (ex1 > ex2) {\n var _temp2 = ex1;\n ex1 = ex2;\n ex2 = _temp2;\n }\n if (ey1 > ey2) {\n var _temp3 = ey1;\n ey1 = ey2;\n ey2 = _temp3;\n }\n\n // take into account edge width\n ex1 -= wHalf;\n ex2 += wHalf;\n ey1 -= wHalf;\n ey2 += wHalf;\n updateBounds(bounds, ex1, ey1, ex2, ey2);\n } // headless or style disabled\n } // edges\n\n // handle edge arrow size\n /////////////////////////\n\n if (styleEnabled && options.includeEdges && isEdge) {\n updateBoundsFromArrow(bounds, ele, 'mid-source');\n updateBoundsFromArrow(bounds, ele, 'mid-target');\n updateBoundsFromArrow(bounds, ele, 'source');\n updateBoundsFromArrow(bounds, ele, 'target');\n }\n\n // ghost\n ////////\n\n if (styleEnabled) {\n var ghost = ele.pstyle('ghost').value === 'yes';\n if (ghost) {\n var gx = ele.pstyle('ghost-offset-x').pfValue;\n var gy = ele.pstyle('ghost-offset-y').pfValue;\n updateBounds(bounds, bounds.x1 + gx, bounds.y1 + gy, bounds.x2 + gx, bounds.y2 + gy);\n }\n }\n\n // always store the body bounds separately from the labels\n var bbBody = _p.bodyBounds = _p.bodyBounds || {};\n assignBoundingBox(bbBody, bounds);\n expandBoundingBoxSides(bbBody, manualExpansion);\n expandBoundingBox(bbBody, 1); // expand to work around browser dimension inaccuracies\n\n // overlay\n //////////\n\n if (styleEnabled) {\n ex1 = bounds.x1;\n ex2 = bounds.x2;\n ey1 = bounds.y1;\n ey2 = bounds.y2;\n updateBounds(bounds, ex1 - padding, ey1 - padding, ex2 + padding, ey2 + padding);\n }\n\n // always store the body bounds separately from the labels\n var bbOverlay = _p.overlayBounds = _p.overlayBounds || {};\n assignBoundingBox(bbOverlay, bounds);\n expandBoundingBoxSides(bbOverlay, manualExpansion);\n expandBoundingBox(bbOverlay, 1); // expand to work around browser dimension inaccuracies\n\n // handle label dimensions\n //////////////////////////\n\n var bbLabels = _p.labelBounds = _p.labelBounds || {};\n if (bbLabels.all != null) {\n clearBoundingBox(bbLabels.all);\n } else {\n bbLabels.all = makeBoundingBox();\n }\n if (styleEnabled && options.includeLabels) {\n if (options.includeMainLabels) {\n updateBoundsFromLabel(bounds, ele, null);\n }\n if (isEdge) {\n if (options.includeSourceLabels) {\n updateBoundsFromLabel(bounds, ele, 'source');\n }\n if (options.includeTargetLabels) {\n updateBoundsFromLabel(bounds, ele, 'target');\n }\n }\n } // style enabled for labels\n } // if displayed\n\n bounds.x1 = noninf(bounds.x1);\n bounds.y1 = noninf(bounds.y1);\n bounds.x2 = noninf(bounds.x2);\n bounds.y2 = noninf(bounds.y2);\n bounds.w = noninf(bounds.x2 - bounds.x1);\n bounds.h = noninf(bounds.y2 - bounds.y1);\n if (bounds.w > 0 && bounds.h > 0 && displayed) {\n expandBoundingBoxSides(bounds, manualExpansion);\n\n // expand bounds by 1 because antialiasing can increase the visual/effective size by 1 on all sides\n expandBoundingBox(bounds, 1);\n }\n return bounds;\n};\nvar getKey = function getKey(opts) {\n var i = 0;\n var tf = function tf(val) {\n return (val ? 1 : 0) << i++;\n };\n var key = 0;\n key += tf(opts.incudeNodes);\n key += tf(opts.includeEdges);\n key += tf(opts.includeLabels);\n key += tf(opts.includeMainLabels);\n key += tf(opts.includeSourceLabels);\n key += tf(opts.includeTargetLabels);\n key += tf(opts.includeOverlays);\n key += tf(opts.includeOutlines);\n return key;\n};\nvar getBoundingBoxPosKey = function getBoundingBoxPosKey(ele) {\n var r = function r(x) {\n return Math.round(x);\n };\n if (ele.isEdge()) {\n var p1 = ele.source().position();\n var p2 = ele.target().position();\n return hashIntsArray([r(p1.x), r(p1.y), r(p2.x), r(p2.y)]);\n } else {\n var p = ele.position();\n return hashIntsArray([r(p.x), r(p.y)]);\n }\n};\nvar cachedBoundingBoxImpl = function cachedBoundingBoxImpl(ele, opts) {\n var _p = ele._private;\n var bb;\n var isEdge = ele.isEdge();\n var key = opts == null ? defBbOptsKey : getKey(opts);\n var usingDefOpts = key === defBbOptsKey;\n if (_p.bbCache == null) {\n bb = boundingBoxImpl(ele, defBbOpts);\n _p.bbCache = bb;\n _p.bbCachePosKey = getBoundingBoxPosKey(ele);\n } else {\n bb = _p.bbCache;\n }\n\n // not using def opts => need to build up bb from combination of sub bbs\n if (!usingDefOpts) {\n var isNode = ele.isNode();\n bb = makeBoundingBox();\n if (opts.includeNodes && isNode || opts.includeEdges && !isNode) {\n if (opts.includeOverlays) {\n updateBoundsFromBox(bb, _p.overlayBounds);\n } else {\n updateBoundsFromBox(bb, _p.bodyBounds);\n }\n }\n if (opts.includeLabels) {\n if (opts.includeMainLabels && (!isEdge || opts.includeSourceLabels && opts.includeTargetLabels)) {\n updateBoundsFromBox(bb, _p.labelBounds.all);\n } else {\n if (opts.includeMainLabels) {\n updateBoundsFromBox(bb, _p.labelBounds.mainRot);\n }\n if (opts.includeSourceLabels) {\n updateBoundsFromBox(bb, _p.labelBounds.sourceRot);\n }\n if (opts.includeTargetLabels) {\n updateBoundsFromBox(bb, _p.labelBounds.targetRot);\n }\n }\n }\n bb.w = bb.x2 - bb.x1;\n bb.h = bb.y2 - bb.y1;\n }\n return bb;\n};\nvar defBbOpts = {\n includeNodes: true,\n includeEdges: true,\n includeLabels: true,\n includeMainLabels: true,\n includeSourceLabels: true,\n includeTargetLabels: true,\n includeOverlays: true,\n includeUnderlays: true,\n includeOutlines: true,\n useCache: true\n};\nvar defBbOptsKey = getKey(defBbOpts);\nvar filledBbOpts = defaults$g(defBbOpts);\nelesfn$b.boundingBox = function (options) {\n var bounds;\n var useCache = options === undefined || options.useCache === undefined || options.useCache === true;\n var isDirty = memoize(function (ele) {\n var _p = ele._private;\n return _p.bbCache == null || _p.styleDirty || _p.bbCachePosKey !== getBoundingBoxPosKey(ele);\n }, function (ele) {\n return ele.id();\n });\n\n // the main usecase is ele.boundingBox() for a single element with no/def options\n // specified s.t. the cache is used, so check for this case to make it faster by\n // avoiding the overhead of the rest of the function\n if (useCache && this.length === 1 && !isDirty(this[0])) {\n if (options === undefined) {\n options = defBbOpts;\n } else {\n options = filledBbOpts(options);\n }\n bounds = cachedBoundingBoxImpl(this[0], options);\n } else {\n bounds = makeBoundingBox();\n options = options || defBbOpts;\n var opts = filledBbOpts(options);\n var eles = this;\n var cy = eles.cy();\n var styleEnabled = cy.styleEnabled();\n\n // cache the isDirty state for all eles, edges first since they depend on node state\n this.edges().forEach(isDirty);\n this.nodes().forEach(isDirty);\n if (styleEnabled) {\n this.recalculateRenderedStyle(useCache);\n }\n this.updateCompoundBounds(!useCache);\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n if (isDirty(ele)) {\n ele.dirtyBoundingBoxCache();\n }\n updateBoundsFromBox(bounds, cachedBoundingBoxImpl(ele, opts));\n }\n }\n bounds.x1 = noninf(bounds.x1);\n bounds.y1 = noninf(bounds.y1);\n bounds.x2 = noninf(bounds.x2);\n bounds.y2 = noninf(bounds.y2);\n bounds.w = noninf(bounds.x2 - bounds.x1);\n bounds.h = noninf(bounds.y2 - bounds.y1);\n return bounds;\n};\nelesfn$b.dirtyBoundingBoxCache = function () {\n for (var i = 0; i < this.length; i++) {\n var _p = this[i]._private;\n _p.bbCache = null;\n _p.bbCachePosKey = null;\n _p.bodyBounds = null;\n _p.overlayBounds = null;\n _p.labelBounds.all = null;\n _p.labelBounds.source = null;\n _p.labelBounds.target = null;\n _p.labelBounds.main = null;\n _p.labelBounds.sourceRot = null;\n _p.labelBounds.targetRot = null;\n _p.labelBounds.mainRot = null;\n _p.arrowBounds.source = null;\n _p.arrowBounds.target = null;\n _p.arrowBounds['mid-source'] = null;\n _p.arrowBounds['mid-target'] = null;\n }\n this.emitAndNotify('bounds');\n return this;\n};\n\n// private helper to get bounding box for custom node positions\n// - good for perf in certain cases but currently requires dirtying the rendered style\n// - would be better to not modify the nodes but the nodes are read directly everywhere in the renderer...\n// - try to use for only things like discrete layouts where the node position would change anyway\nelesfn$b.boundingBoxAt = function (fn) {\n var nodes = this.nodes();\n var cy = this.cy();\n var hasCompoundNodes = cy.hasCompoundNodes();\n var parents = cy.collection();\n if (hasCompoundNodes) {\n parents = nodes.filter(function (node) {\n return node.isParent();\n });\n nodes = nodes.not(parents);\n }\n if (plainObject(fn)) {\n var obj = fn;\n fn = function fn() {\n return obj;\n };\n }\n var storeOldPos = function storeOldPos(node, i) {\n return node._private.bbAtOldPos = fn(node, i);\n };\n var getOldPos = function getOldPos(node) {\n return node._private.bbAtOldPos;\n };\n cy.startBatch();\n nodes.forEach(storeOldPos).silentPositions(fn);\n if (hasCompoundNodes) {\n parents.dirtyCompoundBoundsCache();\n parents.dirtyBoundingBoxCache();\n parents.updateCompoundBounds(true); // force update b/c we're inside a batch cycle\n }\n var bb = copyBoundingBox(this.boundingBox({\n useCache: false\n }));\n nodes.silentPositions(getOldPos);\n if (hasCompoundNodes) {\n parents.dirtyCompoundBoundsCache();\n parents.dirtyBoundingBoxCache();\n parents.updateCompoundBounds(true); // force update b/c we're inside a batch cycle\n }\n cy.endBatch();\n return bb;\n};\nfn$3.boundingbox = fn$3.bb = fn$3.boundingBox;\nfn$3.renderedBoundingbox = fn$3.renderedBoundingBox;\nvar bounds = elesfn$b;\n\nvar fn$2, elesfn$a;\nfn$2 = elesfn$a = {};\nvar defineDimFns = function defineDimFns(opts) {\n opts.uppercaseName = capitalize(opts.name);\n opts.autoName = 'auto' + opts.uppercaseName;\n opts.labelName = 'label' + opts.uppercaseName;\n opts.outerName = 'outer' + opts.uppercaseName;\n opts.uppercaseOuterName = capitalize(opts.outerName);\n fn$2[opts.name] = function dimImpl() {\n var ele = this[0];\n var _p = ele._private;\n var cy = _p.cy;\n var styleEnabled = cy._private.styleEnabled;\n if (ele) {\n if (styleEnabled) {\n if (ele.isParent()) {\n ele.updateCompoundBounds();\n return _p[opts.autoName] || 0;\n }\n var d = ele.pstyle(opts.name);\n switch (d.strValue) {\n case 'label':\n ele.recalculateRenderedStyle();\n return _p.rstyle[opts.labelName] || 0;\n default:\n return d.pfValue;\n }\n } else {\n return 1;\n }\n }\n };\n fn$2['outer' + opts.uppercaseName] = function outerDimImpl() {\n var ele = this[0];\n var _p = ele._private;\n var cy = _p.cy;\n var styleEnabled = cy._private.styleEnabled;\n if (ele) {\n if (styleEnabled) {\n var dim = ele[opts.name]();\n var borderPos = ele.pstyle('border-position').value;\n var border;\n if (borderPos === 'center') {\n border = ele.pstyle('border-width').pfValue; // n.b. 1/2 each side\n } else if (borderPos === 'outside') {\n border = 2 * ele.pstyle('border-width').pfValue;\n } else {\n // 'inside'\n border = 0;\n }\n var padding = 2 * ele.padding();\n return dim + border + padding;\n } else {\n return 1;\n }\n }\n };\n fn$2['rendered' + opts.uppercaseName] = function renderedDimImpl() {\n var ele = this[0];\n if (ele) {\n var d = ele[opts.name]();\n return d * this.cy().zoom();\n }\n };\n fn$2['rendered' + opts.uppercaseOuterName] = function renderedOuterDimImpl() {\n var ele = this[0];\n if (ele) {\n var od = ele[opts.outerName]();\n return od * this.cy().zoom();\n }\n };\n};\ndefineDimFns({\n name: 'width'\n});\ndefineDimFns({\n name: 'height'\n});\nelesfn$a.padding = function () {\n var ele = this[0];\n var _p = ele._private;\n if (ele.isParent()) {\n ele.updateCompoundBounds();\n if (_p.autoPadding !== undefined) {\n return _p.autoPadding;\n } else {\n return ele.pstyle('padding').pfValue;\n }\n } else {\n return ele.pstyle('padding').pfValue;\n }\n};\nelesfn$a.paddedHeight = function () {\n var ele = this[0];\n return ele.height() + 2 * ele.padding();\n};\nelesfn$a.paddedWidth = function () {\n var ele = this[0];\n return ele.width() + 2 * ele.padding();\n};\nvar widthHeight = elesfn$a;\n\nvar ifEdge = function ifEdge(ele, getValue) {\n if (ele.isEdge() && ele.takesUpSpace()) {\n return getValue(ele);\n }\n};\nvar ifEdgeRenderedPosition = function ifEdgeRenderedPosition(ele, getPoint) {\n if (ele.isEdge() && ele.takesUpSpace()) {\n var cy = ele.cy();\n return modelToRenderedPosition$1(getPoint(ele), cy.zoom(), cy.pan());\n }\n};\nvar ifEdgeRenderedPositions = function ifEdgeRenderedPositions(ele, getPoints) {\n if (ele.isEdge() && ele.takesUpSpace()) {\n var cy = ele.cy();\n var pan = cy.pan();\n var zoom = cy.zoom();\n return getPoints(ele).map(function (p) {\n return modelToRenderedPosition$1(p, zoom, pan);\n });\n }\n};\nvar controlPoints = function controlPoints(ele) {\n return ele.renderer().getControlPoints(ele);\n};\nvar segmentPoints = function segmentPoints(ele) {\n return ele.renderer().getSegmentPoints(ele);\n};\nvar sourceEndpoint = function sourceEndpoint(ele) {\n return ele.renderer().getSourceEndpoint(ele);\n};\nvar targetEndpoint = function targetEndpoint(ele) {\n return ele.renderer().getTargetEndpoint(ele);\n};\nvar midpoint = function midpoint(ele) {\n return ele.renderer().getEdgeMidpoint(ele);\n};\nvar pts = {\n controlPoints: {\n get: controlPoints,\n mult: true\n },\n segmentPoints: {\n get: segmentPoints,\n mult: true\n },\n sourceEndpoint: {\n get: sourceEndpoint\n },\n targetEndpoint: {\n get: targetEndpoint\n },\n midpoint: {\n get: midpoint\n }\n};\nvar renderedName = function renderedName(name) {\n return 'rendered' + name[0].toUpperCase() + name.substr(1);\n};\nvar edgePoints = Object.keys(pts).reduce(function (obj, name) {\n var spec = pts[name];\n var rName = renderedName(name);\n obj[name] = function () {\n return ifEdge(this, spec.get);\n };\n if (spec.mult) {\n obj[rName] = function () {\n return ifEdgeRenderedPositions(this, spec.get);\n };\n } else {\n obj[rName] = function () {\n return ifEdgeRenderedPosition(this, spec.get);\n };\n }\n return obj;\n}, {});\n\nvar dimensions = extend({}, position, bounds, widthHeight, edgePoints);\n\n/*!\nEvent object based on jQuery events, MIT license\n\nhttps://jquery.org/license/\nhttps://tldrlegal.com/license/mit-license\nhttps://github.com/jquery/jquery/blob/master/src/event.js\n*/\n\nvar Event = function Event(src, props) {\n this.recycle(src, props);\n};\nfunction returnFalse() {\n return false;\n}\nfunction returnTrue() {\n return true;\n}\n\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\nEvent.prototype = {\n instanceString: function instanceString() {\n return 'event';\n },\n recycle: function recycle(src, props) {\n this.isImmediatePropagationStopped = this.isPropagationStopped = this.isDefaultPrevented = returnFalse;\n if (src != null && src.preventDefault) {\n // Browser Event object\n this.type = src.type;\n\n // Events bubbling up the document may have been marked as prevented\n // by a handler lower down the tree; reflect the correct value.\n this.isDefaultPrevented = src.defaultPrevented ? returnTrue : returnFalse;\n } else if (src != null && src.type) {\n // Plain object containing all event details\n props = src;\n } else {\n // Event string\n this.type = src;\n }\n\n // Put explicitly provided properties onto the event object\n if (props != null) {\n // more efficient to manually copy fields we use\n this.originalEvent = props.originalEvent;\n this.type = props.type != null ? props.type : this.type;\n this.cy = props.cy;\n this.target = props.target;\n this.position = props.position;\n this.renderedPosition = props.renderedPosition;\n this.namespace = props.namespace;\n this.layout = props.layout;\n }\n if (this.cy != null && this.position != null && this.renderedPosition == null) {\n // create a rendered position based on the passed position\n var pos = this.position;\n var zoom = this.cy.zoom();\n var pan = this.cy.pan();\n this.renderedPosition = {\n x: pos.x * zoom + pan.x,\n y: pos.y * zoom + pan.y\n };\n }\n\n // Create a timestamp if incoming event doesn't have one\n this.timeStamp = src && src.timeStamp || Date.now();\n },\n preventDefault: function preventDefault() {\n this.isDefaultPrevented = returnTrue;\n var e = this.originalEvent;\n if (!e) {\n return;\n }\n\n // if preventDefault exists run it on the original event\n if (e.preventDefault) {\n e.preventDefault();\n }\n },\n stopPropagation: function stopPropagation() {\n this.isPropagationStopped = returnTrue;\n var e = this.originalEvent;\n if (!e) {\n return;\n }\n\n // if stopPropagation exists run it on the original event\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n },\n stopImmediatePropagation: function stopImmediatePropagation() {\n this.isImmediatePropagationStopped = returnTrue;\n this.stopPropagation();\n },\n isDefaultPrevented: returnFalse,\n isPropagationStopped: returnFalse,\n isImmediatePropagationStopped: returnFalse\n};\n\nvar eventRegex = /^([^.]+)(\\.(?:[^.]+))?$/; // regex for matching event strings (e.g. \"click.namespace\")\nvar universalNamespace = '.*'; // matches as if no namespace specified and prevents users from unbinding accidentally\n\nvar defaults$8 = {\n qualifierCompare: function qualifierCompare(q1, q2) {\n return q1 === q2;\n },\n eventMatches: function eventMatches(/*context, listener, eventObj*/\n ) {\n return true;\n },\n addEventFields: function addEventFields(/*context, evt*/\n ) {},\n callbackContext: function callbackContext(context /*, listener, eventObj*/) {\n return context;\n },\n beforeEmit: function beforeEmit(/* context, listener, eventObj */\n ) {},\n afterEmit: function afterEmit(/* context, listener, eventObj */\n ) {},\n bubble: function bubble(/*context*/\n ) {\n return false;\n },\n parent: function parent(/*context*/\n ) {\n return null;\n },\n context: null\n};\nvar defaultsKeys = Object.keys(defaults$8);\nvar emptyOpts = {};\nfunction Emitter() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : emptyOpts;\n var context = arguments.length > 1 ? arguments[1] : undefined;\n // micro-optimisation vs Object.assign() -- reduces Element instantiation time\n for (var i = 0; i < defaultsKeys.length; i++) {\n var key = defaultsKeys[i];\n this[key] = opts[key] || defaults$8[key];\n }\n this.context = context || this.context;\n this.listeners = [];\n this.emitting = 0;\n}\nvar p = Emitter.prototype;\nvar forEachEvent = function forEachEvent(self, handler, events, qualifier, callback, conf, confOverrides) {\n if (fn$6(qualifier)) {\n callback = qualifier;\n qualifier = null;\n }\n if (confOverrides) {\n if (conf == null) {\n conf = confOverrides;\n } else {\n conf = extend({}, conf, confOverrides);\n }\n }\n var eventList = array(events) ? events : events.split(/\\s+/);\n for (var i = 0; i < eventList.length; i++) {\n var evt = eventList[i];\n if (emptyString(evt)) {\n continue;\n }\n var match = evt.match(eventRegex); // type[.namespace]\n\n if (match) {\n var type = match[1];\n var namespace = match[2] ? match[2] : null;\n var ret = handler(self, evt, type, namespace, qualifier, callback, conf);\n if (ret === false) {\n break;\n } // allow exiting early\n }\n }\n};\nvar makeEventObj = function makeEventObj(self, obj) {\n self.addEventFields(self.context, obj);\n return new Event(obj.type, obj);\n};\nvar forEachEventObj = function forEachEventObj(self, handler, events) {\n if (event(events)) {\n handler(self, events);\n return;\n } else if (plainObject(events)) {\n handler(self, makeEventObj(self, events));\n return;\n }\n var eventList = array(events) ? events : events.split(/\\s+/);\n for (var i = 0; i < eventList.length; i++) {\n var evt = eventList[i];\n if (emptyString(evt)) {\n continue;\n }\n var match = evt.match(eventRegex); // type[.namespace]\n\n if (match) {\n var type = match[1];\n var namespace = match[2] ? match[2] : null;\n var eventObj = makeEventObj(self, {\n type: type,\n namespace: namespace,\n target: self.context\n });\n handler(self, eventObj);\n }\n }\n};\np.on = p.addListener = function (events, qualifier, callback, conf, confOverrides) {\n forEachEvent(this, function (self, event, type, namespace, qualifier, callback, conf) {\n if (fn$6(callback)) {\n self.listeners.push({\n event: event,\n // full event string\n callback: callback,\n // callback to run\n type: type,\n // the event type (e.g. 'click')\n namespace: namespace,\n // the event namespace (e.g. \".foo\")\n qualifier: qualifier,\n // a restriction on whether to match this emitter\n conf: conf // additional configuration\n });\n }\n }, events, qualifier, callback, conf, confOverrides);\n return this;\n};\np.one = function (events, qualifier, callback, conf) {\n return this.on(events, qualifier, callback, conf, {\n one: true\n });\n};\np.removeListener = p.off = function (events, qualifier, callback, conf) {\n var _this = this;\n if (this.emitting !== 0) {\n this.listeners = copyArray(this.listeners);\n }\n var listeners = this.listeners;\n var _loop = function _loop(i) {\n var listener = listeners[i];\n forEachEvent(_this, function (self, event, type, namespace, qualifier, callback /*, conf*/) {\n if ((listener.type === type || events === '*') && (!namespace && listener.namespace !== '.*' || listener.namespace === namespace) && (!qualifier || self.qualifierCompare(listener.qualifier, qualifier)) && (!callback || listener.callback === callback)) {\n listeners.splice(i, 1);\n return false;\n }\n }, events, qualifier, callback, conf);\n };\n for (var i = listeners.length - 1; i >= 0; i--) {\n _loop(i);\n }\n return this;\n};\np.removeAllListeners = function () {\n return this.removeListener('*');\n};\np.emit = p.trigger = function (events, extraParams, manualCallback) {\n var listeners = this.listeners;\n var numListenersBeforeEmit = listeners.length;\n this.emitting++;\n if (!array(extraParams)) {\n extraParams = [extraParams];\n }\n forEachEventObj(this, function (self, eventObj) {\n if (manualCallback != null) {\n listeners = [{\n event: eventObj.event,\n type: eventObj.type,\n namespace: eventObj.namespace,\n callback: manualCallback\n }];\n numListenersBeforeEmit = listeners.length;\n }\n var _loop2 = function _loop2() {\n var listener = listeners[i];\n if (listener.type === eventObj.type && (!listener.namespace || listener.namespace === eventObj.namespace || listener.namespace === universalNamespace) && self.eventMatches(self.context, listener, eventObj)) {\n var args = [eventObj];\n if (extraParams != null) {\n push(args, extraParams);\n }\n self.beforeEmit(self.context, listener, eventObj);\n if (listener.conf && listener.conf.one) {\n self.listeners = self.listeners.filter(function (l) {\n return l !== listener;\n });\n }\n var context = self.callbackContext(self.context, listener, eventObj);\n var ret = listener.callback.apply(context, args);\n self.afterEmit(self.context, listener, eventObj);\n if (ret === false) {\n eventObj.stopPropagation();\n eventObj.preventDefault();\n }\n } // if listener matches\n };\n for (var i = 0; i < numListenersBeforeEmit; i++) {\n _loop2();\n } // for listener\n\n if (self.bubble(self.context) && !eventObj.isPropagationStopped()) {\n self.parent(self.context).emit(eventObj, extraParams);\n }\n }, events);\n this.emitting--;\n return this;\n};\n\nvar emitterOptions$1 = {\n qualifierCompare: function qualifierCompare(selector1, selector2) {\n if (selector1 == null || selector2 == null) {\n return selector1 == null && selector2 == null;\n } else {\n return selector1.sameText(selector2);\n }\n },\n eventMatches: function eventMatches(ele, listener, eventObj) {\n var selector = listener.qualifier;\n if (selector != null) {\n return ele !== eventObj.target && element(eventObj.target) && selector.matches(eventObj.target);\n }\n return true;\n },\n addEventFields: function addEventFields(ele, evt) {\n evt.cy = ele.cy();\n evt.target = ele;\n },\n callbackContext: function callbackContext(ele, listener, eventObj) {\n return listener.qualifier != null ? eventObj.target : ele;\n },\n beforeEmit: function beforeEmit(context, listener /*, eventObj*/) {\n if (listener.conf && listener.conf.once) {\n listener.conf.onceCollection.removeListener(listener.event, listener.qualifier, listener.callback);\n }\n },\n bubble: function bubble() {\n return true;\n },\n parent: function parent(ele) {\n return ele.isChild() ? ele.parent() : ele.cy();\n }\n};\nvar argSelector$1 = function argSelector(arg) {\n if (string(arg)) {\n return new Selector(arg);\n } else {\n return arg;\n }\n};\nvar elesfn$9 = {\n createEmitter: function createEmitter() {\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var _p = ele._private;\n if (!_p.emitter) {\n _p.emitter = new Emitter(emitterOptions$1, ele);\n }\n }\n return this;\n },\n emitter: function emitter() {\n return this._private.emitter;\n },\n on: function on(events, selector, callback) {\n var argSel = argSelector$1(selector);\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().on(events, argSel, callback);\n }\n return this;\n },\n removeListener: function removeListener(events, selector, callback) {\n var argSel = argSelector$1(selector);\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().removeListener(events, argSel, callback);\n }\n return this;\n },\n removeAllListeners: function removeAllListeners() {\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().removeAllListeners();\n }\n return this;\n },\n one: function one(events, selector, callback) {\n var argSel = argSelector$1(selector);\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().one(events, argSel, callback);\n }\n return this;\n },\n once: function once(events, selector, callback) {\n var argSel = argSelector$1(selector);\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().on(events, argSel, callback, {\n once: true,\n onceCollection: this\n });\n }\n },\n emit: function emit(events, extraParams) {\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().emit(events, extraParams);\n }\n return this;\n },\n emitAndNotify: function emitAndNotify(event, extraParams) {\n // for internal use only\n if (this.length === 0) {\n return;\n } // empty collections don't need to notify anything\n\n // notify renderer\n this.cy().notify(event, this);\n this.emit(event, extraParams);\n return this;\n }\n};\ndefine.eventAliasesOn(elesfn$9);\n\nvar elesfn$8 = {\n nodes: function nodes(selector) {\n return this.filter(function (ele) {\n return ele.isNode();\n }).filter(selector);\n },\n edges: function edges(selector) {\n return this.filter(function (ele) {\n return ele.isEdge();\n }).filter(selector);\n },\n // internal helper to get nodes and edges as separate collections with single iteration over elements\n byGroup: function byGroup() {\n var nodes = this.spawn();\n var edges = this.spawn();\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n if (ele.isNode()) {\n nodes.push(ele);\n } else {\n edges.push(ele);\n }\n }\n return {\n nodes: nodes,\n edges: edges\n };\n },\n filter: function filter(_filter, thisArg) {\n if (_filter === undefined) {\n // check this first b/c it's the most common/performant case\n return this;\n } else if (string(_filter) || elementOrCollection(_filter)) {\n return new Selector(_filter).filter(this);\n } else if (fn$6(_filter)) {\n var filterEles = this.spawn();\n var eles = this;\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var include = thisArg ? _filter.apply(thisArg, [ele, i, eles]) : _filter(ele, i, eles);\n if (include) {\n filterEles.push(ele);\n }\n }\n return filterEles;\n }\n return this.spawn(); // if not handled by above, give 'em an empty collection\n },\n not: function not(toRemove) {\n if (!toRemove) {\n return this;\n } else {\n if (string(toRemove)) {\n toRemove = this.filter(toRemove);\n }\n var elements = this.spawn();\n for (var i = 0; i < this.length; i++) {\n var element = this[i];\n var remove = toRemove.has(element);\n if (!remove) {\n elements.push(element);\n }\n }\n return elements;\n }\n },\n absoluteComplement: function absoluteComplement() {\n var cy = this.cy();\n return cy.mutableElements().not(this);\n },\n intersect: function intersect(other) {\n // if a selector is specified, then filter by it instead\n if (string(other)) {\n var selector = other;\n return this.filter(selector);\n }\n var elements = this.spawn();\n var col1 = this;\n var col2 = other;\n var col1Smaller = this.length < other.length;\n var colS = col1Smaller ? col1 : col2;\n var colL = col1Smaller ? col2 : col1;\n for (var i = 0; i < colS.length; i++) {\n var ele = colS[i];\n if (colL.has(ele)) {\n elements.push(ele);\n }\n }\n return elements;\n },\n xor: function xor(other) {\n var cy = this._private.cy;\n if (string(other)) {\n other = cy.$(other);\n }\n var elements = this.spawn();\n var col1 = this;\n var col2 = other;\n var add = function add(col, other) {\n for (var i = 0; i < col.length; i++) {\n var ele = col[i];\n var id = ele._private.data.id;\n var inOther = other.hasElementWithId(id);\n if (!inOther) {\n elements.push(ele);\n }\n }\n };\n add(col1, col2);\n add(col2, col1);\n return elements;\n },\n diff: function diff(other) {\n var cy = this._private.cy;\n if (string(other)) {\n other = cy.$(other);\n }\n var left = this.spawn();\n var right = this.spawn();\n var both = this.spawn();\n var col1 = this;\n var col2 = other;\n var add = function add(col, other, retEles) {\n for (var i = 0; i < col.length; i++) {\n var ele = col[i];\n var id = ele._private.data.id;\n var inOther = other.hasElementWithId(id);\n if (inOther) {\n both.merge(ele);\n } else {\n retEles.push(ele);\n }\n }\n };\n add(col1, col2, left);\n add(col2, col1, right);\n return {\n left: left,\n right: right,\n both: both\n };\n },\n add: function add(toAdd) {\n var cy = this._private.cy;\n if (!toAdd) {\n return this;\n }\n if (string(toAdd)) {\n var selector = toAdd;\n toAdd = cy.mutableElements().filter(selector);\n }\n var elements = this.spawnSelf();\n for (var i = 0; i < toAdd.length; i++) {\n var ele = toAdd[i];\n var add = !this.has(ele);\n if (add) {\n elements.push(ele);\n }\n }\n return elements;\n },\n // in place merge on calling collection\n merge: function merge(toAdd) {\n var _p = this._private;\n var cy = _p.cy;\n if (!toAdd) {\n return this;\n }\n if (toAdd && string(toAdd)) {\n var selector = toAdd;\n toAdd = cy.mutableElements().filter(selector);\n }\n var map = _p.map;\n for (var i = 0; i < toAdd.length; i++) {\n var toAddEle = toAdd[i];\n var id = toAddEle._private.data.id;\n var add = !map.has(id);\n if (add) {\n var index = this.length++;\n this[index] = toAddEle;\n map.set(id, {\n ele: toAddEle,\n index: index\n });\n }\n }\n return this; // chaining\n },\n unmergeAt: function unmergeAt(i) {\n var ele = this[i];\n var id = ele.id();\n var _p = this._private;\n var map = _p.map;\n\n // remove ele\n this[i] = undefined;\n map[\"delete\"](id);\n var unmergedLastEle = i === this.length - 1;\n\n // replace empty spot with last ele in collection\n if (this.length > 1 && !unmergedLastEle) {\n var lastEleI = this.length - 1;\n var lastEle = this[lastEleI];\n var lastEleId = lastEle._private.data.id;\n this[lastEleI] = undefined;\n this[i] = lastEle;\n map.set(lastEleId, {\n ele: lastEle,\n index: i\n });\n }\n\n // the collection is now 1 ele smaller\n this.length--;\n return this;\n },\n // remove single ele in place in calling collection\n unmergeOne: function unmergeOne(ele) {\n ele = ele[0];\n var _p = this._private;\n var id = ele._private.data.id;\n var map = _p.map;\n var entry = map.get(id);\n if (!entry) {\n return this; // no need to remove\n }\n var i = entry.index;\n this.unmergeAt(i);\n return this;\n },\n // remove eles in place on calling collection\n unmerge: function unmerge(toRemove) {\n var cy = this._private.cy;\n if (!toRemove) {\n return this;\n }\n if (toRemove && string(toRemove)) {\n var selector = toRemove;\n toRemove = cy.mutableElements().filter(selector);\n }\n for (var i = 0; i < toRemove.length; i++) {\n this.unmergeOne(toRemove[i]);\n }\n return this; // chaining\n },\n unmergeBy: function unmergeBy(toRmFn) {\n for (var i = this.length - 1; i >= 0; i--) {\n var ele = this[i];\n if (toRmFn(ele)) {\n this.unmergeAt(i);\n }\n }\n return this;\n },\n map: function map(mapFn, thisArg) {\n var arr = [];\n var eles = this;\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var ret = thisArg ? mapFn.apply(thisArg, [ele, i, eles]) : mapFn(ele, i, eles);\n arr.push(ret);\n }\n return arr;\n },\n reduce: function reduce(fn, initialValue) {\n var val = initialValue;\n var eles = this;\n for (var i = 0; i < eles.length; i++) {\n val = fn(val, eles[i], i, eles);\n }\n return val;\n },\n max: function max(valFn, thisArg) {\n var max = -Infinity;\n var maxEle;\n var eles = this;\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var val = thisArg ? valFn.apply(thisArg, [ele, i, eles]) : valFn(ele, i, eles);\n if (val > max) {\n max = val;\n maxEle = ele;\n }\n }\n return {\n value: max,\n ele: maxEle\n };\n },\n min: function min(valFn, thisArg) {\n var min = Infinity;\n var minEle;\n var eles = this;\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var val = thisArg ? valFn.apply(thisArg, [ele, i, eles]) : valFn(ele, i, eles);\n if (val < min) {\n min = val;\n minEle = ele;\n }\n }\n return {\n value: min,\n ele: minEle\n };\n }\n};\n\n// aliases\nvar fn$1 = elesfn$8;\nfn$1['u'] = fn$1['|'] = fn$1['+'] = fn$1.union = fn$1.or = fn$1.add;\nfn$1['\\\\'] = fn$1['!'] = fn$1['-'] = fn$1.difference = fn$1.relativeComplement = fn$1.subtract = fn$1.not;\nfn$1['n'] = fn$1['&'] = fn$1['.'] = fn$1.and = fn$1.intersection = fn$1.intersect;\nfn$1['^'] = fn$1['(+)'] = fn$1['(-)'] = fn$1.symmetricDifference = fn$1.symdiff = fn$1.xor;\nfn$1.fnFilter = fn$1.filterFn = fn$1.stdFilter = fn$1.filter;\nfn$1.complement = fn$1.abscomp = fn$1.absoluteComplement;\n\nvar elesfn$7 = {\n isNode: function isNode() {\n return this.group() === 'nodes';\n },\n isEdge: function isEdge() {\n return this.group() === 'edges';\n },\n isLoop: function isLoop() {\n return this.isEdge() && this.source()[0] === this.target()[0];\n },\n isSimple: function isSimple() {\n return this.isEdge() && this.source()[0] !== this.target()[0];\n },\n group: function group() {\n var ele = this[0];\n if (ele) {\n return ele._private.group;\n }\n }\n};\n\n/**\n * Elements are drawn in a specific order based on compound depth (low to high), the element type (nodes above edges),\n * and z-index (low to high). These styles affect how this applies:\n *\n * z-compound-depth: May be `bottom | orphan | auto | top`. The first drawn is `bottom`, then `orphan` which is the\n * same depth as the root of the compound graph, followed by the default value `auto` which draws in order from\n * root to leaves of the compound graph. The last drawn is `top`.\n * z-index-compare: May be `auto | manual`. The default value is `auto` which always draws edges under nodes.\n * `manual` ignores this convention and draws based on the `z-index` value setting.\n * z-index: An integer value that affects the relative draw order of elements. In general, an element with a higher\n * `z-index` will be drawn on top of an element with a lower `z-index`.\n */\nvar zIndexSort = function zIndexSort(a, b) {\n var cy = a.cy();\n var hasCompoundNodes = cy.hasCompoundNodes();\n function getDepth(ele) {\n var style = ele.pstyle('z-compound-depth');\n if (style.value === 'auto') {\n return hasCompoundNodes ? ele.zDepth() : 0;\n } else if (style.value === 'bottom') {\n return -1;\n } else if (style.value === 'top') {\n return MAX_INT$1;\n }\n // 'orphan'\n return 0;\n }\n var depthDiff = getDepth(a) - getDepth(b);\n if (depthDiff !== 0) {\n return depthDiff;\n }\n function getEleDepth(ele) {\n var style = ele.pstyle('z-index-compare');\n if (style.value === 'auto') {\n return ele.isNode() ? 1 : 0;\n }\n // 'manual'\n return 0;\n }\n var eleDiff = getEleDepth(a) - getEleDepth(b);\n if (eleDiff !== 0) {\n return eleDiff;\n }\n var zDiff = a.pstyle('z-index').value - b.pstyle('z-index').value;\n if (zDiff !== 0) {\n return zDiff;\n }\n // compare indices in the core (order added to graph w/ last on top)\n return a.poolIndex() - b.poolIndex();\n};\n\nvar elesfn$6 = {\n forEach: function forEach(fn, thisArg) {\n if (fn$6(fn)) {\n var N = this.length;\n for (var i = 0; i < N; i++) {\n var ele = this[i];\n var ret = thisArg ? fn.apply(thisArg, [ele, i, this]) : fn(ele, i, this);\n if (ret === false) {\n break;\n } // exit each early on return false\n }\n }\n return this;\n },\n toArray: function toArray() {\n var array = [];\n for (var i = 0; i < this.length; i++) {\n array.push(this[i]);\n }\n return array;\n },\n slice: function slice(start, end) {\n var array = [];\n var thisSize = this.length;\n if (end == null) {\n end = thisSize;\n }\n if (start == null) {\n start = 0;\n }\n if (start < 0) {\n start = thisSize + start;\n }\n if (end < 0) {\n end = thisSize + end;\n }\n for (var i = start; i >= 0 && i < end && i < thisSize; i++) {\n array.push(this[i]);\n }\n return this.spawn(array);\n },\n size: function size() {\n return this.length;\n },\n eq: function eq(i) {\n return this[i] || this.spawn();\n },\n first: function first() {\n return this[0] || this.spawn();\n },\n last: function last() {\n return this[this.length - 1] || this.spawn();\n },\n empty: function empty() {\n return this.length === 0;\n },\n nonempty: function nonempty() {\n return !this.empty();\n },\n sort: function sort(sortFn) {\n if (!fn$6(sortFn)) {\n return this;\n }\n var sorted = this.toArray().sort(sortFn);\n return this.spawn(sorted);\n },\n sortByZIndex: function sortByZIndex() {\n return this.sort(zIndexSort);\n },\n zDepth: function zDepth() {\n var ele = this[0];\n if (!ele) {\n return undefined;\n }\n\n // let cy = ele.cy();\n var _p = ele._private;\n var group = _p.group;\n if (group === 'nodes') {\n var depth = _p.data.parent ? ele.parents().size() : 0;\n if (!ele.isParent()) {\n return MAX_INT$1 - 1; // childless nodes always on top\n }\n return depth;\n } else {\n var src = _p.source;\n var tgt = _p.target;\n var srcDepth = src.zDepth();\n var tgtDepth = tgt.zDepth();\n return Math.max(srcDepth, tgtDepth, 0); // depth of deepest parent\n }\n }\n};\nelesfn$6.each = elesfn$6.forEach;\nvar defineSymbolIterator = function defineSymbolIterator() {\n var typeofUndef = \"undefined\" ;\n var isIteratorSupported = (typeof Symbol === \"undefined\" ? \"undefined\" : _typeof(Symbol)) != typeofUndef && _typeof(Symbol.iterator) != typeofUndef;\n if (isIteratorSupported) {\n elesfn$6[Symbol.iterator] = function () {\n var _this = this;\n var entry = {\n value: undefined,\n done: false\n };\n var i = 0;\n var length = this.length;\n return _defineProperty$1({\n next: function next() {\n if (i < length) {\n entry.value = _this[i++];\n } else {\n entry.value = undefined;\n entry.done = true;\n }\n return entry;\n }\n }, Symbol.iterator, function () {\n return this;\n });\n };\n }\n};\ndefineSymbolIterator();\n\nvar getLayoutDimensionOptions = defaults$g({\n nodeDimensionsIncludeLabels: false\n});\nvar elesfn$5 = {\n // Calculates and returns node dimensions { x, y } based on options given\n layoutDimensions: function layoutDimensions(options) {\n options = getLayoutDimensionOptions(options);\n var dims;\n if (!this.takesUpSpace()) {\n dims = {\n w: 0,\n h: 0\n };\n } else if (options.nodeDimensionsIncludeLabels) {\n var bbDim = this.boundingBox();\n dims = {\n w: bbDim.w,\n h: bbDim.h\n };\n } else {\n dims = {\n w: this.outerWidth(),\n h: this.outerHeight()\n };\n }\n\n // sanitise the dimensions for external layouts (avoid division by zero)\n if (dims.w === 0 || dims.h === 0) {\n dims.w = dims.h = 1;\n }\n return dims;\n },\n // using standard layout options, apply position function (w/ or w/o animation)\n layoutPositions: function layoutPositions(layout, options, fn) {\n var nodes = this.nodes().filter(function (n) {\n return !n.isParent();\n });\n var cy = this.cy();\n var layoutEles = options.eles; // nodes & edges\n var getMemoizeKey = function getMemoizeKey(node) {\n return node.id();\n };\n var fnMem = memoize(fn, getMemoizeKey); // memoized version of position function\n\n layout.emit({\n type: 'layoutstart',\n layout: layout\n });\n layout.animations = [];\n var calculateSpacing = function calculateSpacing(spacing, nodesBb, pos) {\n var center = {\n x: nodesBb.x1 + nodesBb.w / 2,\n y: nodesBb.y1 + nodesBb.h / 2\n };\n var spacingVector = {\n // scale from center of bounding box (not necessarily 0,0)\n x: (pos.x - center.x) * spacing,\n y: (pos.y - center.y) * spacing\n };\n return {\n x: center.x + spacingVector.x,\n y: center.y + spacingVector.y\n };\n };\n var useSpacingFactor = options.spacingFactor && options.spacingFactor !== 1;\n var spacingBb = function spacingBb() {\n if (!useSpacingFactor) {\n return null;\n }\n var bb = makeBoundingBox();\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n var pos = fnMem(node, i);\n expandBoundingBoxByPoint(bb, pos.x, pos.y);\n }\n return bb;\n };\n var bb = spacingBb();\n var getFinalPos = memoize(function (node, i) {\n var newPos = fnMem(node, i);\n if (useSpacingFactor) {\n var spacing = Math.abs(options.spacingFactor);\n newPos = calculateSpacing(spacing, bb, newPos);\n }\n if (options.transform != null) {\n newPos = options.transform(node, newPos);\n }\n return newPos;\n }, getMemoizeKey);\n if (options.animate) {\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n var newPos = getFinalPos(node, i);\n var animateNode = options.animateFilter == null || options.animateFilter(node, i);\n if (animateNode) {\n var ani = node.animation({\n position: newPos,\n duration: options.animationDuration,\n easing: options.animationEasing\n });\n layout.animations.push(ani);\n } else {\n node.position(newPos);\n }\n }\n if (options.fit) {\n var fitAni = cy.animation({\n fit: {\n boundingBox: layoutEles.boundingBoxAt(getFinalPos),\n padding: options.padding\n },\n duration: options.animationDuration,\n easing: options.animationEasing\n });\n layout.animations.push(fitAni);\n } else if (options.zoom !== undefined && options.pan !== undefined) {\n var zoomPanAni = cy.animation({\n zoom: options.zoom,\n pan: options.pan,\n duration: options.animationDuration,\n easing: options.animationEasing\n });\n layout.animations.push(zoomPanAni);\n }\n layout.animations.forEach(function (ani) {\n return ani.play();\n });\n layout.one('layoutready', options.ready);\n layout.emit({\n type: 'layoutready',\n layout: layout\n });\n Promise$1.all(layout.animations.map(function (ani) {\n return ani.promise();\n })).then(function () {\n layout.one('layoutstop', options.stop);\n layout.emit({\n type: 'layoutstop',\n layout: layout\n });\n });\n } else {\n nodes.positions(getFinalPos);\n if (options.fit) {\n cy.fit(options.eles, options.padding);\n }\n if (options.zoom != null) {\n cy.zoom(options.zoom);\n }\n if (options.pan) {\n cy.pan(options.pan);\n }\n layout.one('layoutready', options.ready);\n layout.emit({\n type: 'layoutready',\n layout: layout\n });\n layout.one('layoutstop', options.stop);\n layout.emit({\n type: 'layoutstop',\n layout: layout\n });\n }\n return this; // chaining\n },\n layout: function layout(options) {\n var cy = this.cy();\n return cy.makeLayout(extend({}, options, {\n eles: this\n }));\n }\n};\n\n// aliases:\nelesfn$5.createLayout = elesfn$5.makeLayout = elesfn$5.layout;\n\nfunction styleCache(key, fn, ele) {\n var _p = ele._private;\n var cache = _p.styleCache = _p.styleCache || [];\n var val;\n if ((val = cache[key]) != null) {\n return val;\n } else {\n val = cache[key] = fn(ele);\n return val;\n }\n}\nfunction cacheStyleFunction(key, fn) {\n key = hashString(key);\n return function cachedStyleFunction(ele) {\n return styleCache(key, fn, ele);\n };\n}\nfunction cachePrototypeStyleFunction(key, fn) {\n key = hashString(key);\n var selfFn = function selfFn(ele) {\n return fn.call(ele);\n };\n return function cachedPrototypeStyleFunction() {\n var ele = this[0];\n if (ele) {\n return styleCache(key, selfFn, ele);\n }\n };\n}\nvar elesfn$4 = {\n recalculateRenderedStyle: function recalculateRenderedStyle(useCache) {\n var cy = this.cy();\n var renderer = cy.renderer();\n var styleEnabled = cy.styleEnabled();\n if (renderer && styleEnabled) {\n renderer.recalculateRenderedStyle(this, useCache);\n }\n return this;\n },\n dirtyStyleCache: function dirtyStyleCache() {\n var cy = this.cy();\n var dirty = function dirty(ele) {\n return ele._private.styleCache = null;\n };\n if (cy.hasCompoundNodes()) {\n var eles;\n eles = this.spawnSelf().merge(this.descendants()).merge(this.parents());\n eles.merge(eles.connectedEdges());\n eles.forEach(dirty);\n } else {\n this.forEach(function (ele) {\n dirty(ele);\n ele.connectedEdges().forEach(dirty);\n });\n }\n return this;\n },\n // fully updates (recalculates) the style for the elements\n updateStyle: function updateStyle(notifyRenderer) {\n var cy = this._private.cy;\n if (!cy.styleEnabled()) {\n return this;\n }\n if (cy.batching()) {\n var bEles = cy._private.batchStyleEles;\n bEles.merge(this);\n return this; // chaining and exit early when batching\n }\n var hasCompounds = cy.hasCompoundNodes();\n var updatedEles = this;\n notifyRenderer = notifyRenderer || notifyRenderer === undefined ? true : false;\n if (hasCompounds) {\n // then add everything up and down for compound selector checks\n updatedEles = this.spawnSelf().merge(this.descendants()).merge(this.parents());\n }\n\n // let changedEles = style.apply( updatedEles );\n var changedEles = updatedEles;\n if (notifyRenderer) {\n changedEles.emitAndNotify('style'); // let renderer know we changed style\n } else {\n changedEles.emit('style'); // just fire the event\n }\n updatedEles.forEach(function (ele) {\n return ele._private.styleDirty = true;\n });\n return this; // chaining\n },\n // private: clears dirty flag and recalculates style\n cleanStyle: function cleanStyle() {\n var cy = this.cy();\n if (!cy.styleEnabled()) {\n return;\n }\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n if (ele._private.styleDirty) {\n // n.b. this flag should be set before apply() to avoid potential infinite recursion\n ele._private.styleDirty = false;\n cy.style().apply(ele);\n }\n }\n },\n // get the internal parsed style object for the specified property\n parsedStyle: function parsedStyle(property) {\n var includeNonDefault = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var ele = this[0];\n var cy = ele.cy();\n if (!cy.styleEnabled()) {\n return;\n }\n if (ele) {\n // this.cleanStyle();\n\n // Inline the important part of cleanStyle(), for raw performance\n if (ele._private.styleDirty) {\n // n.b. this flag should be set before apply() to avoid potential infinite recursion\n ele._private.styleDirty = false;\n cy.style().apply(ele);\n }\n var overriddenStyle = ele._private.style[property];\n if (overriddenStyle != null) {\n return overriddenStyle;\n } else if (includeNonDefault) {\n return cy.style().getDefaultProperty(property);\n } else {\n return null;\n }\n }\n },\n numericStyle: function numericStyle(property) {\n var ele = this[0];\n if (!ele.cy().styleEnabled()) {\n return;\n }\n if (ele) {\n var pstyle = ele.pstyle(property);\n return pstyle.pfValue !== undefined ? pstyle.pfValue : pstyle.value;\n }\n },\n numericStyleUnits: function numericStyleUnits(property) {\n var ele = this[0];\n if (!ele.cy().styleEnabled()) {\n return;\n }\n if (ele) {\n return ele.pstyle(property).units;\n }\n },\n // get the specified css property as a rendered value (i.e. on-screen value)\n // or get the whole rendered style if no property specified (NB doesn't allow setting)\n renderedStyle: function renderedStyle(property) {\n var cy = this.cy();\n if (!cy.styleEnabled()) {\n return this;\n }\n var ele = this[0];\n if (ele) {\n return cy.style().getRenderedStyle(ele, property);\n }\n },\n // read the calculated css style of the element or override the style (via a bypass)\n style: function style(name, value) {\n var cy = this.cy();\n if (!cy.styleEnabled()) {\n return this;\n }\n var updateTransitions = false;\n var style = cy.style();\n if (plainObject(name)) {\n // then extend the bypass\n var props = name;\n style.applyBypass(this, props, updateTransitions);\n this.emitAndNotify('style'); // let the renderer know we've updated style\n } else if (string(name)) {\n if (value === undefined) {\n // then get the property from the style\n var ele = this[0];\n if (ele) {\n return style.getStylePropertyValue(ele, name);\n } else {\n // empty collection => can't get any value\n return;\n }\n } else {\n // then set the bypass with the property value\n style.applyBypass(this, name, value, updateTransitions);\n this.emitAndNotify('style'); // let the renderer know we've updated style\n }\n } else if (name === undefined) {\n var _ele = this[0];\n if (_ele) {\n return style.getRawStyle(_ele);\n } else {\n // empty collection => can't get any value\n return;\n }\n }\n return this; // chaining\n },\n removeStyle: function removeStyle(names) {\n var cy = this.cy();\n if (!cy.styleEnabled()) {\n return this;\n }\n var updateTransitions = false;\n var style = cy.style();\n var eles = this;\n if (names === undefined) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n style.removeAllBypasses(ele, updateTransitions);\n }\n } else {\n names = names.split(/\\s+/);\n for (var _i = 0; _i < eles.length; _i++) {\n var _ele2 = eles[_i];\n style.removeBypasses(_ele2, names, updateTransitions);\n }\n }\n this.emitAndNotify('style'); // let the renderer know we've updated style\n\n return this; // chaining\n },\n show: function show() {\n this.css('display', 'element');\n return this; // chaining\n },\n hide: function hide() {\n this.css('display', 'none');\n return this; // chaining\n },\n effectiveOpacity: function effectiveOpacity() {\n var cy = this.cy();\n if (!cy.styleEnabled()) {\n return 1;\n }\n var hasCompoundNodes = cy.hasCompoundNodes();\n var ele = this[0];\n if (ele) {\n var _p = ele._private;\n var parentOpacity = ele.pstyle('opacity').value;\n if (!hasCompoundNodes) {\n return parentOpacity;\n }\n var parents = !_p.data.parent ? null : ele.parents();\n if (parents) {\n for (var i = 0; i < parents.length; i++) {\n var parent = parents[i];\n var opacity = parent.pstyle('opacity').value;\n parentOpacity = opacity * parentOpacity;\n }\n }\n return parentOpacity;\n }\n },\n transparent: function transparent() {\n var cy = this.cy();\n if (!cy.styleEnabled()) {\n return false;\n }\n var ele = this[0];\n var hasCompoundNodes = ele.cy().hasCompoundNodes();\n if (ele) {\n if (!hasCompoundNodes) {\n return ele.pstyle('opacity').value === 0;\n } else {\n return ele.effectiveOpacity() === 0;\n }\n }\n },\n backgrounding: function backgrounding() {\n var cy = this.cy();\n if (!cy.styleEnabled()) {\n return false;\n }\n var ele = this[0];\n return ele._private.backgrounding ? true : false;\n }\n};\nfunction checkCompound(ele, parentOk) {\n var _p = ele._private;\n var parents = _p.data.parent ? ele.parents() : null;\n if (parents) {\n for (var i = 0; i < parents.length; i++) {\n var parent = parents[i];\n if (!parentOk(parent)) {\n return false;\n }\n }\n }\n return true;\n}\nfunction defineDerivedStateFunction(specs) {\n var ok = specs.ok;\n var edgeOkViaNode = specs.edgeOkViaNode || specs.ok;\n var parentOk = specs.parentOk || specs.ok;\n return function () {\n var cy = this.cy();\n if (!cy.styleEnabled()) {\n return true;\n }\n var ele = this[0];\n var hasCompoundNodes = cy.hasCompoundNodes();\n if (ele) {\n var _p = ele._private;\n if (!ok(ele)) {\n return false;\n }\n if (ele.isNode()) {\n return !hasCompoundNodes || checkCompound(ele, parentOk);\n } else {\n var src = _p.source;\n var tgt = _p.target;\n return edgeOkViaNode(src) && (!hasCompoundNodes || checkCompound(src, edgeOkViaNode)) && (src === tgt || edgeOkViaNode(tgt) && (!hasCompoundNodes || checkCompound(tgt, edgeOkViaNode)));\n }\n }\n };\n}\nvar eleTakesUpSpace = cacheStyleFunction('eleTakesUpSpace', function (ele) {\n return ele.pstyle('display').value === 'element' && ele.width() !== 0 && (ele.isNode() ? ele.height() !== 0 : true);\n});\nelesfn$4.takesUpSpace = cachePrototypeStyleFunction('takesUpSpace', defineDerivedStateFunction({\n ok: eleTakesUpSpace\n}));\nvar eleInteractive = cacheStyleFunction('eleInteractive', function (ele) {\n return ele.pstyle('events').value === 'yes' && ele.pstyle('visibility').value === 'visible' && eleTakesUpSpace(ele);\n});\nvar parentInteractive = cacheStyleFunction('parentInteractive', function (parent) {\n return parent.pstyle('visibility').value === 'visible' && eleTakesUpSpace(parent);\n});\nelesfn$4.interactive = cachePrototypeStyleFunction('interactive', defineDerivedStateFunction({\n ok: eleInteractive,\n parentOk: parentInteractive,\n edgeOkViaNode: eleTakesUpSpace\n}));\nelesfn$4.noninteractive = function () {\n var ele = this[0];\n if (ele) {\n return !ele.interactive();\n }\n};\nvar eleVisible = cacheStyleFunction('eleVisible', function (ele) {\n return ele.pstyle('visibility').value === 'visible' && ele.pstyle('opacity').pfValue !== 0 && eleTakesUpSpace(ele);\n});\nvar edgeVisibleViaNode = eleTakesUpSpace;\nelesfn$4.visible = cachePrototypeStyleFunction('visible', defineDerivedStateFunction({\n ok: eleVisible,\n edgeOkViaNode: edgeVisibleViaNode\n}));\nelesfn$4.hidden = function () {\n var ele = this[0];\n if (ele) {\n return !ele.visible();\n }\n};\nelesfn$4.isBundledBezier = cachePrototypeStyleFunction('isBundledBezier', function () {\n if (!this.cy().styleEnabled()) {\n return false;\n }\n return !this.removed() && this.pstyle('curve-style').value === 'bezier' && this.takesUpSpace();\n});\nelesfn$4.bypass = elesfn$4.css = elesfn$4.style;\nelesfn$4.renderedCss = elesfn$4.renderedStyle;\nelesfn$4.removeBypass = elesfn$4.removeCss = elesfn$4.removeStyle;\nelesfn$4.pstyle = elesfn$4.parsedStyle;\n\nvar elesfn$3 = {};\nfunction defineSwitchFunction(params) {\n return function () {\n var args = arguments;\n var changedEles = [];\n\n // e.g. cy.nodes().select( data, handler )\n if (args.length === 2) {\n var data = args[0];\n var handler = args[1];\n this.on(params.event, data, handler);\n }\n\n // e.g. cy.nodes().select( handler )\n else if (args.length === 1 && fn$6(args[0])) {\n var _handler = args[0];\n this.on(params.event, _handler);\n }\n\n // e.g. cy.nodes().select()\n // e.g. (private) cy.nodes().select(['tapselect'])\n else if (args.length === 0 || args.length === 1 && array(args[0])) {\n var addlEvents = args.length === 1 ? args[0] : null;\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var able = !params.ableField || ele._private[params.ableField];\n var changed = ele._private[params.field] != params.value;\n if (params.overrideAble) {\n var overrideAble = params.overrideAble(ele);\n if (overrideAble !== undefined) {\n able = overrideAble;\n if (!overrideAble) {\n return this;\n } // to save cycles assume not able for all on override\n }\n }\n if (able) {\n ele._private[params.field] = params.value;\n if (changed) {\n changedEles.push(ele);\n }\n }\n }\n var changedColl = this.spawn(changedEles);\n changedColl.updateStyle(); // change of state => possible change of style\n changedColl.emit(params.event);\n if (addlEvents) {\n changedColl.emit(addlEvents);\n }\n }\n return this;\n };\n}\nfunction defineSwitchSet(params) {\n elesfn$3[params.field] = function () {\n var ele = this[0];\n if (ele) {\n if (params.overrideField) {\n var val = params.overrideField(ele);\n if (val !== undefined) {\n return val;\n }\n }\n return ele._private[params.field];\n }\n };\n elesfn$3[params.on] = defineSwitchFunction({\n event: params.on,\n field: params.field,\n ableField: params.ableField,\n overrideAble: params.overrideAble,\n value: true\n });\n elesfn$3[params.off] = defineSwitchFunction({\n event: params.off,\n field: params.field,\n ableField: params.ableField,\n overrideAble: params.overrideAble,\n value: false\n });\n}\ndefineSwitchSet({\n field: 'locked',\n overrideField: function overrideField(ele) {\n return ele.cy().autolock() ? true : undefined;\n },\n on: 'lock',\n off: 'unlock'\n});\ndefineSwitchSet({\n field: 'grabbable',\n overrideField: function overrideField(ele) {\n return ele.cy().autoungrabify() || ele.pannable() ? false : undefined;\n },\n on: 'grabify',\n off: 'ungrabify'\n});\ndefineSwitchSet({\n field: 'selected',\n ableField: 'selectable',\n overrideAble: function overrideAble(ele) {\n return ele.cy().autounselectify() ? false : undefined;\n },\n on: 'select',\n off: 'unselect'\n});\ndefineSwitchSet({\n field: 'selectable',\n overrideField: function overrideField(ele) {\n return ele.cy().autounselectify() ? false : undefined;\n },\n on: 'selectify',\n off: 'unselectify'\n});\nelesfn$3.deselect = elesfn$3.unselect;\nelesfn$3.grabbed = function () {\n var ele = this[0];\n if (ele) {\n return ele._private.grabbed;\n }\n};\ndefineSwitchSet({\n field: 'active',\n on: 'activate',\n off: 'unactivate'\n});\ndefineSwitchSet({\n field: 'pannable',\n on: 'panify',\n off: 'unpanify'\n});\nelesfn$3.inactive = function () {\n var ele = this[0];\n if (ele) {\n return !ele._private.active;\n }\n};\n\nvar elesfn$2 = {};\n\n// DAG functions\n////////////////\n\nvar defineDagExtremity = function defineDagExtremity(params) {\n return function dagExtremityImpl(selector) {\n var eles = this;\n var ret = [];\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n if (!ele.isNode()) {\n continue;\n }\n var disqualified = false;\n var edges = ele.connectedEdges();\n for (var j = 0; j < edges.length; j++) {\n var edge = edges[j];\n var src = edge.source();\n var tgt = edge.target();\n if (params.noIncomingEdges && tgt === ele && src !== ele || params.noOutgoingEdges && src === ele && tgt !== ele) {\n disqualified = true;\n break;\n }\n }\n if (!disqualified) {\n ret.push(ele);\n }\n }\n return this.spawn(ret, true).filter(selector);\n };\n};\nvar defineDagOneHop = function defineDagOneHop(params) {\n return function (selector) {\n var eles = this;\n var oEles = [];\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n if (!ele.isNode()) {\n continue;\n }\n var edges = ele.connectedEdges();\n for (var j = 0; j < edges.length; j++) {\n var edge = edges[j];\n var src = edge.source();\n var tgt = edge.target();\n if (params.outgoing && src === ele) {\n oEles.push(edge);\n oEles.push(tgt);\n } else if (params.incoming && tgt === ele) {\n oEles.push(edge);\n oEles.push(src);\n }\n }\n }\n return this.spawn(oEles, true).filter(selector);\n };\n};\nvar defineDagAllHops = function defineDagAllHops(params) {\n return function (selector) {\n var eles = this;\n var sEles = [];\n var sElesIds = {};\n for (;;) {\n var next = params.outgoing ? eles.outgoers() : eles.incomers();\n if (next.length === 0) {\n break;\n } // done if none left\n\n var newNext = false;\n for (var i = 0; i < next.length; i++) {\n var n = next[i];\n var nid = n.id();\n if (!sElesIds[nid]) {\n sElesIds[nid] = true;\n sEles.push(n);\n newNext = true;\n }\n }\n if (!newNext) {\n break;\n } // done if touched all outgoers already\n\n eles = next;\n }\n return this.spawn(sEles, true).filter(selector);\n };\n};\nelesfn$2.clearTraversalCache = function () {\n for (var i = 0; i < this.length; i++) {\n this[i]._private.traversalCache = null;\n }\n};\nextend(elesfn$2, {\n // get the root nodes in the DAG\n roots: defineDagExtremity({\n noIncomingEdges: true\n }),\n // get the leaf nodes in the DAG\n leaves: defineDagExtremity({\n noOutgoingEdges: true\n }),\n // normally called children in graph theory\n // these nodes =edges=> outgoing nodes\n outgoers: cache(defineDagOneHop({\n outgoing: true\n }), 'outgoers'),\n // aka DAG descendants\n successors: defineDagAllHops({\n outgoing: true\n }),\n // normally called parents in graph theory\n // these nodes <=edges= incoming nodes\n incomers: cache(defineDagOneHop({\n incoming: true\n }), 'incomers'),\n // aka DAG ancestors\n predecessors: defineDagAllHops({\n })\n});\n\n// Neighbourhood functions\n//////////////////////////\n\nextend(elesfn$2, {\n neighborhood: cache(function (selector) {\n var elements = [];\n var nodes = this.nodes();\n for (var i = 0; i < nodes.length; i++) {\n // for all nodes\n var node = nodes[i];\n var connectedEdges = node.connectedEdges();\n\n // for each connected edge, add the edge and the other node\n for (var j = 0; j < connectedEdges.length; j++) {\n var edge = connectedEdges[j];\n var src = edge.source();\n var tgt = edge.target();\n var otherNode = node === src ? tgt : src;\n\n // need check in case of loop\n if (otherNode.length > 0) {\n elements.push(otherNode[0]); // add node 1 hop away\n }\n\n // add connected edge\n elements.push(edge[0]);\n }\n }\n return this.spawn(elements, true).filter(selector);\n }, 'neighborhood'),\n closedNeighborhood: function closedNeighborhood(selector) {\n return this.neighborhood().add(this).filter(selector);\n },\n openNeighborhood: function openNeighborhood(selector) {\n return this.neighborhood(selector);\n }\n});\n\n// aliases\nelesfn$2.neighbourhood = elesfn$2.neighborhood;\nelesfn$2.closedNeighbourhood = elesfn$2.closedNeighborhood;\nelesfn$2.openNeighbourhood = elesfn$2.openNeighborhood;\n\n// Edge functions\n/////////////////\n\nextend(elesfn$2, {\n source: cache(function sourceImpl(selector) {\n var ele = this[0];\n var src;\n if (ele) {\n src = ele._private.source || ele.cy().collection();\n }\n return src && selector ? src.filter(selector) : src;\n }, 'source'),\n target: cache(function targetImpl(selector) {\n var ele = this[0];\n var tgt;\n if (ele) {\n tgt = ele._private.target || ele.cy().collection();\n }\n return tgt && selector ? tgt.filter(selector) : tgt;\n }, 'target'),\n sources: defineSourceFunction({\n attr: 'source'\n }),\n targets: defineSourceFunction({\n attr: 'target'\n })\n});\nfunction defineSourceFunction(params) {\n return function sourceImpl(selector) {\n var sources = [];\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var src = ele._private[params.attr];\n if (src) {\n sources.push(src);\n }\n }\n return this.spawn(sources, true).filter(selector);\n };\n}\nextend(elesfn$2, {\n edgesWith: cache(defineEdgesWithFunction(), 'edgesWith'),\n edgesTo: cache(defineEdgesWithFunction({\n thisIsSrc: true\n }), 'edgesTo')\n});\nfunction defineEdgesWithFunction(params) {\n return function edgesWithImpl(otherNodes) {\n var elements = [];\n var cy = this._private.cy;\n var p = params || {};\n\n // get elements if a selector is specified\n if (string(otherNodes)) {\n otherNodes = cy.$(otherNodes);\n }\n for (var h = 0; h < otherNodes.length; h++) {\n var edges = otherNodes[h]._private.edges;\n for (var i = 0; i < edges.length; i++) {\n var edge = edges[i];\n var edgeData = edge._private.data;\n var thisToOther = this.hasElementWithId(edgeData.source) && otherNodes.hasElementWithId(edgeData.target);\n var otherToThis = otherNodes.hasElementWithId(edgeData.source) && this.hasElementWithId(edgeData.target);\n var edgeConnectsThisAndOther = thisToOther || otherToThis;\n if (!edgeConnectsThisAndOther) {\n continue;\n }\n if (p.thisIsSrc || p.thisIsTgt) {\n if (p.thisIsSrc && !thisToOther) {\n continue;\n }\n if (p.thisIsTgt && !otherToThis) {\n continue;\n }\n }\n elements.push(edge);\n }\n }\n return this.spawn(elements, true);\n };\n}\nextend(elesfn$2, {\n connectedEdges: cache(function (selector) {\n var retEles = [];\n var eles = this;\n for (var i = 0; i < eles.length; i++) {\n var node = eles[i];\n if (!node.isNode()) {\n continue;\n }\n var edges = node._private.edges;\n for (var j = 0; j < edges.length; j++) {\n var edge = edges[j];\n retEles.push(edge);\n }\n }\n return this.spawn(retEles, true).filter(selector);\n }, 'connectedEdges'),\n connectedNodes: cache(function (selector) {\n var retEles = [];\n var eles = this;\n for (var i = 0; i < eles.length; i++) {\n var edge = eles[i];\n if (!edge.isEdge()) {\n continue;\n }\n retEles.push(edge.source()[0]);\n retEles.push(edge.target()[0]);\n }\n return this.spawn(retEles, true).filter(selector);\n }, 'connectedNodes'),\n parallelEdges: cache(defineParallelEdgesFunction(), 'parallelEdges'),\n codirectedEdges: cache(defineParallelEdgesFunction({\n codirected: true\n }), 'codirectedEdges')\n});\nfunction defineParallelEdgesFunction(params) {\n var defaults = {\n codirected: false\n };\n params = extend({}, defaults, params);\n return function parallelEdgesImpl(selector) {\n // micro-optimised for renderer\n var elements = [];\n var edges = this.edges();\n var p = params;\n\n // look at all the edges in the collection\n for (var i = 0; i < edges.length; i++) {\n var edge1 = edges[i];\n var edge1_p = edge1._private;\n var src1 = edge1_p.source;\n var srcid1 = src1._private.data.id;\n var tgtid1 = edge1_p.data.target;\n var srcEdges1 = src1._private.edges;\n\n // look at edges connected to the src node of this edge\n for (var j = 0; j < srcEdges1.length; j++) {\n var edge2 = srcEdges1[j];\n var edge2data = edge2._private.data;\n var tgtid2 = edge2data.target;\n var srcid2 = edge2data.source;\n var codirected = tgtid2 === tgtid1 && srcid2 === srcid1;\n var oppdirected = srcid1 === tgtid2 && tgtid1 === srcid2;\n if (p.codirected && codirected || !p.codirected && (codirected || oppdirected)) {\n elements.push(edge2);\n }\n }\n }\n return this.spawn(elements, true).filter(selector);\n };\n}\n\n// Misc functions\n/////////////////\n\nextend(elesfn$2, {\n components: function components(root) {\n var self = this;\n var cy = self.cy();\n var visited = cy.collection();\n var unvisited = root == null ? self.nodes() : root.nodes();\n var components = [];\n if (root != null && unvisited.empty()) {\n // root may contain only edges\n unvisited = root.sources(); // doesn't matter which node to use (undirected), so just use the source sides\n }\n var visitInComponent = function visitInComponent(node, component) {\n visited.merge(node);\n unvisited.unmerge(node);\n component.merge(node);\n };\n if (unvisited.empty()) {\n return self.spawn();\n }\n var _loop = function _loop() {\n // each iteration yields a component\n var cmpt = cy.collection();\n components.push(cmpt);\n var root = unvisited[0];\n visitInComponent(root, cmpt);\n self.bfs({\n directed: false,\n roots: root,\n visit: function visit(v) {\n return visitInComponent(v, cmpt);\n }\n });\n cmpt.forEach(function (node) {\n node.connectedEdges().forEach(function (e) {\n // connectedEdges() usually cached\n if (self.has(e) && cmpt.has(e.source()) && cmpt.has(e.target())) {\n // has() is cheap\n cmpt.merge(e); // forEach() only considers nodes -- sets N at call time\n }\n });\n });\n };\n do {\n _loop();\n } while (unvisited.length > 0);\n return components;\n },\n component: function component() {\n var ele = this[0];\n return ele.cy().mutableElements().components(ele)[0];\n }\n});\nelesfn$2.componentsOf = elesfn$2.components;\n\n// represents a set of nodes, edges, or both together\nvar Collection = function Collection(cy, elements) {\n var unique = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var removed = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n if (cy === undefined) {\n error('A collection must have a reference to the core');\n return;\n }\n var map = new Map$1();\n var createdElements = false;\n if (!elements) {\n elements = [];\n } else if (elements.length > 0 && plainObject(elements[0]) && !element(elements[0])) {\n createdElements = true;\n\n // make elements from json and restore all at once later\n var eles = [];\n var elesIds = new Set$1();\n for (var i = 0, l = elements.length; i < l; i++) {\n var json = elements[i];\n if (json.data == null) {\n json.data = {};\n }\n var _data = json.data;\n\n // make sure newly created elements have valid ids\n if (_data.id == null) {\n _data.id = uuid();\n } else if (cy.hasElementWithId(_data.id) || elesIds.has(_data.id)) {\n continue; // can't create element if prior id already exists\n }\n var ele = new Element(cy, json, false);\n eles.push(ele);\n elesIds.add(_data.id);\n }\n elements = eles;\n }\n this.length = 0;\n for (var _i = 0, _l = elements.length; _i < _l; _i++) {\n var element$1 = elements[_i][0]; // [0] in case elements is an array of collections, rather than array of elements\n if (element$1 == null) {\n continue;\n }\n var id = element$1._private.data.id;\n if (!unique || !map.has(id)) {\n if (unique) {\n map.set(id, {\n index: this.length,\n ele: element$1\n });\n }\n this[this.length] = element$1;\n this.length++;\n }\n }\n this._private = {\n eles: this,\n cy: cy,\n get map() {\n if (this.lazyMap == null) {\n this.rebuildMap();\n }\n return this.lazyMap;\n },\n set map(m) {\n this.lazyMap = m;\n },\n rebuildMap: function rebuildMap() {\n var m = this.lazyMap = new Map$1();\n var eles = this.eles;\n for (var _i2 = 0; _i2 < eles.length; _i2++) {\n var _ele = eles[_i2];\n m.set(_ele.id(), {\n index: _i2,\n ele: _ele\n });\n }\n }\n };\n if (unique) {\n this._private.map = map;\n }\n\n // restore the elements if we created them from json\n if (createdElements && !removed) {\n this.restore();\n }\n};\n\n// Functions\n////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// keep the prototypes in sync (an element has the same functions as a collection)\n// and use elefn and elesfn as shorthands to the prototypes\nvar elesfn$1 = Element.prototype = Collection.prototype = Object.create(Array.prototype);\nelesfn$1.instanceString = function () {\n return 'collection';\n};\nelesfn$1.spawn = function (eles, unique) {\n return new Collection(this.cy(), eles, unique);\n};\nelesfn$1.spawnSelf = function () {\n return this.spawn(this);\n};\nelesfn$1.cy = function () {\n return this._private.cy;\n};\nelesfn$1.renderer = function () {\n return this._private.cy.renderer();\n};\nelesfn$1.element = function () {\n return this[0];\n};\nelesfn$1.collection = function () {\n if (collection(this)) {\n return this;\n } else {\n // an element\n return new Collection(this._private.cy, [this]);\n }\n};\nelesfn$1.unique = function () {\n return new Collection(this._private.cy, this, true);\n};\nelesfn$1.hasElementWithId = function (id) {\n id = '' + id; // id must be string\n\n return this._private.map.has(id);\n};\nelesfn$1.getElementById = function (id) {\n id = '' + id; // id must be string\n\n var cy = this._private.cy;\n var entry = this._private.map.get(id);\n return entry ? entry.ele : new Collection(cy); // get ele or empty collection\n};\nelesfn$1.$id = elesfn$1.getElementById;\nelesfn$1.poolIndex = function () {\n var cy = this._private.cy;\n var eles = cy._private.elements;\n var id = this[0]._private.data.id;\n return eles._private.map.get(id).index;\n};\nelesfn$1.indexOf = function (ele) {\n var id = ele[0]._private.data.id;\n return this._private.map.get(id).index;\n};\nelesfn$1.indexOfId = function (id) {\n id = '' + id; // id must be string\n\n return this._private.map.get(id).index;\n};\nelesfn$1.json = function (obj) {\n var ele = this.element();\n var cy = this.cy();\n if (ele == null && obj) {\n return this;\n } // can't set to no eles\n\n if (ele == null) {\n return undefined;\n } // can't get from no eles\n\n var p = ele._private;\n if (plainObject(obj)) {\n // set\n\n cy.startBatch();\n if (obj.data) {\n ele.data(obj.data);\n var _data2 = p.data;\n if (ele.isEdge()) {\n // source and target are immutable via data()\n var move = false;\n var spec = {};\n var src = obj.data.source;\n var tgt = obj.data.target;\n if (src != null && src != _data2.source) {\n spec.source = '' + src; // id must be string\n move = true;\n }\n if (tgt != null && tgt != _data2.target) {\n spec.target = '' + tgt; // id must be string\n move = true;\n }\n if (move) {\n ele = ele.move(spec);\n }\n } else {\n // parent is immutable via data()\n var newParentValSpecd = 'parent' in obj.data;\n var parent = obj.data.parent;\n if (newParentValSpecd && (parent != null || _data2.parent != null) && parent != _data2.parent) {\n if (parent === undefined) {\n // can't set undefined imperatively, so use null\n parent = null;\n }\n if (parent != null) {\n parent = '' + parent; // id must be string\n }\n ele = ele.move({\n parent: parent\n });\n }\n }\n }\n if (obj.position) {\n ele.position(obj.position);\n }\n\n // ignore group -- immutable\n\n var checkSwitch = function checkSwitch(k, trueFnName, falseFnName) {\n var obj_k = obj[k];\n if (obj_k != null && obj_k !== p[k]) {\n if (obj_k) {\n ele[trueFnName]();\n } else {\n ele[falseFnName]();\n }\n }\n };\n checkSwitch('removed', 'remove', 'restore');\n checkSwitch('selected', 'select', 'unselect');\n checkSwitch('selectable', 'selectify', 'unselectify');\n checkSwitch('locked', 'lock', 'unlock');\n checkSwitch('grabbable', 'grabify', 'ungrabify');\n checkSwitch('pannable', 'panify', 'unpanify');\n if (obj.classes != null) {\n ele.classes(obj.classes);\n }\n cy.endBatch();\n return this;\n } else if (obj === undefined) {\n // get\n\n var json = {\n data: copy(p.data),\n position: copy(p.position),\n group: p.group,\n removed: p.removed,\n selected: p.selected,\n selectable: p.selectable,\n locked: p.locked,\n grabbable: p.grabbable,\n pannable: p.pannable,\n classes: null\n };\n json.classes = '';\n var i = 0;\n p.classes.forEach(function (cls) {\n return json.classes += i++ === 0 ? cls : ' ' + cls;\n });\n return json;\n }\n};\nelesfn$1.jsons = function () {\n var jsons = [];\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var json = ele.json();\n jsons.push(json);\n }\n return jsons;\n};\nelesfn$1.clone = function () {\n var cy = this.cy();\n var elesArr = [];\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var json = ele.json();\n var clone = new Element(cy, json, false); // NB no restore\n\n elesArr.push(clone);\n }\n return new Collection(cy, elesArr);\n};\nelesfn$1.copy = elesfn$1.clone;\nelesfn$1.restore = function () {\n var notifyRenderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var addToPool = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var self = this;\n var cy = self.cy();\n var cy_p = cy._private;\n\n // create arrays of nodes and edges, since we need to\n // restore the nodes first\n var nodes = [];\n var edges = [];\n var elements;\n for (var _i3 = 0, l = self.length; _i3 < l; _i3++) {\n var ele = self[_i3];\n if (addToPool && !ele.removed()) {\n // don't need to handle this ele\n continue;\n }\n\n // keep nodes first in the array and edges after\n if (ele.isNode()) {\n // put to front of array if node\n nodes.push(ele);\n } else {\n // put to end of array if edge\n edges.push(ele);\n }\n }\n elements = nodes.concat(edges);\n var i;\n var removeFromElements = function removeFromElements() {\n elements.splice(i, 1);\n i--;\n };\n\n // now, restore each element\n for (i = 0; i < elements.length; i++) {\n var _ele2 = elements[i];\n var _private = _ele2._private;\n var _data3 = _private.data;\n\n // the traversal cache should start fresh when ele is added\n _ele2.clearTraversalCache();\n\n // set id and validate\n if (!addToPool && !_private.removed) ; else if (_data3.id === undefined) {\n _data3.id = uuid();\n } else if (number$1(_data3.id)) {\n _data3.id = '' + _data3.id; // now it's a string\n } else if (emptyString(_data3.id) || !string(_data3.id)) {\n error('Can not create element with invalid string ID `' + _data3.id + '`');\n\n // can't create element if it has empty string as id or non-string id\n removeFromElements();\n continue;\n } else if (cy.hasElementWithId(_data3.id)) {\n error('Can not create second element with ID `' + _data3.id + '`');\n\n // can't create element if one already has that id\n removeFromElements();\n continue;\n }\n var id = _data3.id; // id is finalised, now let's keep a ref\n\n if (_ele2.isNode()) {\n // extra checks for nodes\n var pos = _private.position;\n\n // make sure the nodes have a defined position\n\n if (pos.x == null) {\n pos.x = 0;\n }\n if (pos.y == null) {\n pos.y = 0;\n }\n }\n if (_ele2.isEdge()) {\n // extra checks for edges\n\n var edge = _ele2;\n var fields = ['source', 'target'];\n var fieldsLength = fields.length;\n var badSourceOrTarget = false;\n for (var j = 0; j < fieldsLength; j++) {\n var field = fields[j];\n var val = _data3[field];\n if (number$1(val)) {\n val = _data3[field] = '' + _data3[field]; // now string\n }\n if (val == null || val === '') {\n // can't create if source or target is not defined properly\n error('Can not create edge `' + id + '` with unspecified ' + field);\n badSourceOrTarget = true;\n } else if (!cy.hasElementWithId(val)) {\n // can't create edge if one of its nodes doesn't exist\n error('Can not create edge `' + id + '` with nonexistant ' + field + ' `' + val + '`');\n badSourceOrTarget = true;\n }\n }\n if (badSourceOrTarget) {\n removeFromElements();\n continue;\n } // can't create this\n\n var src = cy.getElementById(_data3.source);\n var tgt = cy.getElementById(_data3.target);\n\n // only one edge in node if loop\n if (src.same(tgt)) {\n src._private.edges.push(edge);\n } else {\n src._private.edges.push(edge);\n tgt._private.edges.push(edge);\n }\n edge._private.source = src;\n edge._private.target = tgt;\n } // if is edge\n\n // create mock ids / indexes maps for element so it can be used like collections\n _private.map = new Map$1();\n _private.map.set(id, {\n ele: _ele2,\n index: 0\n });\n _private.removed = false;\n if (addToPool) {\n cy.addToPool(_ele2);\n }\n } // for each element\n\n // do compound node sanity checks\n for (var _i4 = 0; _i4 < nodes.length; _i4++) {\n // each node\n var node = nodes[_i4];\n var _data4 = node._private.data;\n if (number$1(_data4.parent)) {\n // then automake string\n _data4.parent = '' + _data4.parent;\n }\n var parentId = _data4.parent;\n var specifiedParent = parentId != null;\n if (specifiedParent || node._private.parent) {\n var parent = node._private.parent ? cy.collection().merge(node._private.parent) : cy.getElementById(parentId);\n if (parent.empty()) {\n // non-existant parent; just remove it\n _data4.parent = undefined;\n } else if (parent[0].removed()) {\n warn('Node added with missing parent, reference to parent removed');\n _data4.parent = undefined;\n node._private.parent = null;\n } else {\n var selfAsParent = false;\n var ancestor = parent;\n while (!ancestor.empty()) {\n if (node.same(ancestor)) {\n // mark self as parent and remove from data\n selfAsParent = true;\n _data4.parent = undefined; // remove parent reference\n\n // exit or we loop forever\n break;\n }\n ancestor = ancestor.parent();\n }\n if (!selfAsParent) {\n // connect with children\n parent[0]._private.children.push(node);\n node._private.parent = parent[0];\n\n // let the core know we have a compound graph\n cy_p.hasCompoundNodes = true;\n }\n } // else\n } // if specified parent\n } // for each node\n\n if (elements.length > 0) {\n var restored = elements.length === self.length ? self : new Collection(cy, elements);\n for (var _i5 = 0; _i5 < restored.length; _i5++) {\n var _ele3 = restored[_i5];\n if (_ele3.isNode()) {\n continue;\n }\n\n // adding an edge invalidates the traversal caches for the parallel edges\n _ele3.parallelEdges().clearTraversalCache();\n\n // adding an edge invalidates the traversal cache for the connected nodes\n _ele3.source().clearTraversalCache();\n _ele3.target().clearTraversalCache();\n }\n var toUpdateStyle;\n if (cy_p.hasCompoundNodes) {\n toUpdateStyle = cy.collection().merge(restored).merge(restored.connectedNodes()).merge(restored.parent());\n } else {\n toUpdateStyle = restored;\n }\n toUpdateStyle.dirtyCompoundBoundsCache().dirtyBoundingBoxCache().updateStyle(notifyRenderer);\n if (notifyRenderer) {\n restored.emitAndNotify('add');\n } else if (addToPool) {\n restored.emit('add');\n }\n }\n return self; // chainability\n};\nelesfn$1.removed = function () {\n var ele = this[0];\n return ele && ele._private.removed;\n};\nelesfn$1.inside = function () {\n var ele = this[0];\n return ele && !ele._private.removed;\n};\nelesfn$1.remove = function () {\n var notifyRenderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var removeFromPool = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var self = this;\n var elesToRemove = [];\n var elesToRemoveIds = {};\n var cy = self._private.cy;\n\n // add connected edges\n function addConnectedEdges(node) {\n var edges = node._private.edges;\n for (var i = 0; i < edges.length; i++) {\n add(edges[i]);\n }\n }\n\n // add descendant nodes\n function addChildren(node) {\n var children = node._private.children;\n for (var i = 0; i < children.length; i++) {\n add(children[i]);\n }\n }\n function add(ele) {\n var alreadyAdded = elesToRemoveIds[ele.id()];\n if (removeFromPool && ele.removed() || alreadyAdded) {\n return;\n } else {\n elesToRemoveIds[ele.id()] = true;\n }\n if (ele.isNode()) {\n elesToRemove.push(ele); // nodes are removed last\n\n addConnectedEdges(ele);\n addChildren(ele);\n } else {\n elesToRemove.unshift(ele); // edges are removed first\n }\n }\n\n // make the list of elements to remove\n // (may be removing more than specified due to connected edges etc)\n\n for (var i = 0, l = self.length; i < l; i++) {\n var ele = self[i];\n add(ele);\n }\n function removeEdgeRef(node, edge) {\n var connectedEdges = node._private.edges;\n removeFromArray(connectedEdges, edge);\n\n // removing an edges invalidates the traversal cache for its nodes\n node.clearTraversalCache();\n }\n function removeParallelRef(pllEdge) {\n // removing an edge invalidates the traversal caches for the parallel edges\n pllEdge.clearTraversalCache();\n }\n var alteredParents = [];\n alteredParents.ids = {};\n function removeChildRef(parent, ele) {\n ele = ele[0];\n parent = parent[0];\n var children = parent._private.children;\n var pid = parent.id();\n removeFromArray(children, ele); // remove parent => child ref\n\n ele._private.parent = null; // remove child => parent ref\n\n if (!alteredParents.ids[pid]) {\n alteredParents.ids[pid] = true;\n alteredParents.push(parent);\n }\n }\n self.dirtyCompoundBoundsCache();\n if (removeFromPool) {\n cy.removeFromPool(elesToRemove); // remove from core pool\n }\n for (var _i6 = 0; _i6 < elesToRemove.length; _i6++) {\n var _ele4 = elesToRemove[_i6];\n if (_ele4.isEdge()) {\n // remove references to this edge in its connected nodes\n var src = _ele4.source()[0];\n var tgt = _ele4.target()[0];\n removeEdgeRef(src, _ele4);\n removeEdgeRef(tgt, _ele4);\n var pllEdges = _ele4.parallelEdges();\n for (var j = 0; j < pllEdges.length; j++) {\n var pllEdge = pllEdges[j];\n removeParallelRef(pllEdge);\n if (pllEdge.isBundledBezier()) {\n pllEdge.dirtyBoundingBoxCache();\n }\n }\n } else {\n // remove reference to parent\n var parent = _ele4.parent();\n if (parent.length !== 0) {\n removeChildRef(parent, _ele4);\n }\n }\n if (removeFromPool) {\n // mark as removed\n _ele4._private.removed = true;\n }\n }\n\n // check to see if we have a compound graph or not\n var elesStillInside = cy._private.elements;\n cy._private.hasCompoundNodes = false;\n for (var _i7 = 0; _i7 < elesStillInside.length; _i7++) {\n var _ele5 = elesStillInside[_i7];\n if (_ele5.isParent()) {\n cy._private.hasCompoundNodes = true;\n break;\n }\n }\n var removedElements = new Collection(this.cy(), elesToRemove);\n if (removedElements.size() > 0) {\n // must manually notify since trigger won't do this automatically once removed\n\n if (notifyRenderer) {\n removedElements.emitAndNotify('remove');\n } else if (removeFromPool) {\n removedElements.emit('remove');\n }\n }\n\n // the parents who were modified by the removal need their style updated\n for (var _i8 = 0; _i8 < alteredParents.length; _i8++) {\n var _ele6 = alteredParents[_i8];\n if (!removeFromPool || !_ele6.removed()) {\n _ele6.updateStyle();\n }\n }\n return removedElements;\n};\nelesfn$1.move = function (struct) {\n var cy = this._private.cy;\n var eles = this;\n\n // just clean up refs, caches, etc. in the same way as when removing and then restoring\n // (our calls to remove/restore do not remove from the graph or make events)\n var notifyRenderer = false;\n var modifyPool = false;\n var toString = function toString(id) {\n return id == null ? id : '' + id;\n }; // id must be string\n\n if (struct.source !== undefined || struct.target !== undefined) {\n var srcId = toString(struct.source);\n var tgtId = toString(struct.target);\n var srcExists = srcId != null && cy.hasElementWithId(srcId);\n var tgtExists = tgtId != null && cy.hasElementWithId(tgtId);\n if (srcExists || tgtExists) {\n cy.batch(function () {\n // avoid duplicate style updates\n eles.remove(notifyRenderer, modifyPool); // clean up refs etc.\n eles.emitAndNotify('moveout');\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var _data5 = ele._private.data;\n if (ele.isEdge()) {\n if (srcExists) {\n _data5.source = srcId;\n }\n if (tgtExists) {\n _data5.target = tgtId;\n }\n }\n }\n eles.restore(notifyRenderer, modifyPool); // make new refs, style, etc.\n });\n eles.emitAndNotify('move');\n }\n } else if (struct.parent !== undefined) {\n // move node to new parent\n var parentId = toString(struct.parent);\n var parentExists = parentId === null || cy.hasElementWithId(parentId);\n if (parentExists) {\n var pidToAssign = parentId === null ? undefined : parentId;\n cy.batch(function () {\n // avoid duplicate style updates\n var updated = eles.remove(notifyRenderer, modifyPool); // clean up refs etc.\n updated.emitAndNotify('moveout');\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var _data6 = ele._private.data;\n if (ele.isNode()) {\n _data6.parent = pidToAssign;\n }\n }\n updated.restore(notifyRenderer, modifyPool); // make new refs, style, etc.\n });\n eles.emitAndNotify('move');\n }\n }\n return this;\n};\n[elesfn$j, elesfn$i, elesfn$h, elesfn$g, elesfn$f, data, elesfn$d, dimensions, elesfn$9, elesfn$8, elesfn$7, elesfn$6, elesfn$5, elesfn$4, elesfn$3, elesfn$2].forEach(function (props) {\n extend(elesfn$1, props);\n});\n\nvar corefn$9 = {\n add: function add(opts) {\n var elements;\n var cy = this;\n\n // add the elements\n if (elementOrCollection(opts)) {\n var eles = opts;\n if (eles._private.cy === cy) {\n // same instance => just restore\n elements = eles.restore();\n } else {\n // otherwise, copy from json\n var jsons = [];\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n jsons.push(ele.json());\n }\n elements = new Collection(cy, jsons);\n }\n }\n\n // specify an array of options\n else if (array(opts)) {\n var _jsons = opts;\n elements = new Collection(cy, _jsons);\n }\n\n // specify via opts.nodes and opts.edges\n else if (plainObject(opts) && (array(opts.nodes) || array(opts.edges))) {\n var elesByGroup = opts;\n var _jsons2 = [];\n var grs = ['nodes', 'edges'];\n for (var _i = 0, il = grs.length; _i < il; _i++) {\n var group = grs[_i];\n var elesArray = elesByGroup[group];\n if (array(elesArray)) {\n for (var j = 0, jl = elesArray.length; j < jl; j++) {\n var json = extend({\n group: group\n }, elesArray[j]);\n _jsons2.push(json);\n }\n }\n }\n elements = new Collection(cy, _jsons2);\n }\n\n // specify options for one element\n else {\n var _json = opts;\n elements = new Element(cy, _json).collection();\n }\n return elements;\n },\n remove: function remove(collection) {\n if (elementOrCollection(collection)) ; else if (string(collection)) {\n var selector = collection;\n collection = this.$(selector);\n }\n return collection.remove();\n }\n};\n\n/* global Float32Array */\n\n/*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */\nfunction generateCubicBezier(mX1, mY1, mX2, mY2) {\n var NEWTON_ITERATIONS = 4,\n NEWTON_MIN_SLOPE = 0.001,\n SUBDIVISION_PRECISION = 0.0000001,\n SUBDIVISION_MAX_ITERATIONS = 10,\n kSplineTableSize = 11,\n kSampleStepSize = 1.0 / (kSplineTableSize - 1.0),\n float32ArraySupported = typeof Float32Array !== 'undefined';\n\n /* Must contain four arguments. */\n if (arguments.length !== 4) {\n return false;\n }\n\n /* Arguments must be numbers. */\n for (var i = 0; i < 4; ++i) {\n if (typeof arguments[i] !== \"number\" || isNaN(arguments[i]) || !isFinite(arguments[i])) {\n return false;\n }\n }\n\n /* X values must be in the [0, 1] range. */\n mX1 = Math.min(mX1, 1);\n mX2 = Math.min(mX2, 1);\n mX1 = Math.max(mX1, 0);\n mX2 = Math.max(mX2, 0);\n var mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n function A(aA1, aA2) {\n return 1.0 - 3.0 * aA2 + 3.0 * aA1;\n }\n function B(aA1, aA2) {\n return 3.0 * aA2 - 6.0 * aA1;\n }\n function C(aA1) {\n return 3.0 * aA1;\n }\n function calcBezier(aT, aA1, aA2) {\n return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;\n }\n function getSlope(aT, aA1, aA2) {\n return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1);\n }\n function newtonRaphsonIterate(aX, aGuessT) {\n for (var _i = 0; _i < NEWTON_ITERATIONS; ++_i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n }\n function calcSampleValues() {\n for (var _i2 = 0; _i2 < kSplineTableSize; ++_i2) {\n mSampleValues[_i2] = calcBezier(_i2 * kSampleStepSize, mX1, mX2);\n }\n }\n function binarySubdivide(aX, aA, aB) {\n var currentX,\n currentT,\n i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n }\n function getTForX(aX) {\n var intervalStart = 0.0,\n currentSample = 1,\n lastSample = kSplineTableSize - 1;\n for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]),\n guessForT = intervalStart + dist * kSampleStepSize,\n initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize);\n }\n }\n var _precomputed = false;\n function precompute() {\n _precomputed = true;\n if (mX1 !== mY1 || mX2 !== mY2) {\n calcSampleValues();\n }\n }\n var f = function f(aX) {\n if (!_precomputed) {\n precompute();\n }\n if (mX1 === mY1 && mX2 === mY2) {\n return aX;\n }\n if (aX === 0) {\n return 0;\n }\n if (aX === 1) {\n return 1;\n }\n return calcBezier(getTForX(aX), mY1, mY2);\n };\n f.getControlPoints = function () {\n return [{\n x: mX1,\n y: mY1\n }, {\n x: mX2,\n y: mY2\n }];\n };\n var str = \"generateBezier(\" + [mX1, mY1, mX2, mY2] + \")\";\n f.toString = function () {\n return str;\n };\n return f;\n}\n\n/*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */\n/* Given a tension, friction, and duration, a simulation at 60FPS will first run without a defined duration in order to calculate the full path. A second pass\n then adjusts the time delta -- using the relation between actual time and duration -- to calculate the path for the duration-constrained animation. */\nvar generateSpringRK4 = function () {\n function springAccelerationForState(state) {\n return -state.tension * state.x - state.friction * state.v;\n }\n function springEvaluateStateWithDerivative(initialState, dt, derivative) {\n var state = {\n x: initialState.x + derivative.dx * dt,\n v: initialState.v + derivative.dv * dt,\n tension: initialState.tension,\n friction: initialState.friction\n };\n return {\n dx: state.v,\n dv: springAccelerationForState(state)\n };\n }\n function springIntegrateState(state, dt) {\n var a = {\n dx: state.v,\n dv: springAccelerationForState(state)\n },\n b = springEvaluateStateWithDerivative(state, dt * 0.5, a),\n c = springEvaluateStateWithDerivative(state, dt * 0.5, b),\n d = springEvaluateStateWithDerivative(state, dt, c),\n dxdt = 1.0 / 6.0 * (a.dx + 2.0 * (b.dx + c.dx) + d.dx),\n dvdt = 1.0 / 6.0 * (a.dv + 2.0 * (b.dv + c.dv) + d.dv);\n state.x = state.x + dxdt * dt;\n state.v = state.v + dvdt * dt;\n return state;\n }\n return function springRK4Factory(tension, friction, duration) {\n var initState = {\n x: -1,\n v: 0,\n tension: null,\n friction: null\n },\n path = [0],\n time_lapsed = 0,\n tolerance = 1 / 10000,\n DT = 16 / 1000,\n have_duration,\n dt,\n last_state;\n tension = parseFloat(tension) || 500;\n friction = parseFloat(friction) || 20;\n duration = duration || null;\n initState.tension = tension;\n initState.friction = friction;\n have_duration = duration !== null;\n\n /* Calculate the actual time it takes for this animation to complete with the provided conditions. */\n if (have_duration) {\n /* Run the simulation without a duration. */\n time_lapsed = springRK4Factory(tension, friction);\n /* Compute the adjusted time delta. */\n dt = time_lapsed / duration * DT;\n } else {\n dt = DT;\n }\n for (;;) {\n /* Next/step function .*/\n last_state = springIntegrateState(last_state || initState, dt);\n /* Store the position. */\n path.push(1 + last_state.x);\n time_lapsed += 16;\n /* If the change threshold is reached, break. */\n if (!(Math.abs(last_state.x) > tolerance && Math.abs(last_state.v) > tolerance)) {\n break;\n }\n }\n\n /* If duration is not defined, return the actual time required for completing this animation. Otherwise, return a closure that holds the\n computed path and returns a snapshot of the position according to a given percentComplete. */\n return !have_duration ? time_lapsed : function (percentComplete) {\n return path[percentComplete * (path.length - 1) | 0];\n };\n };\n}();\n\nvar cubicBezier = function cubicBezier(t1, p1, t2, p2) {\n var bezier = generateCubicBezier(t1, p1, t2, p2);\n return function (start, end, percent) {\n return start + (end - start) * bezier(percent);\n };\n};\nvar easings = {\n 'linear': function linear(start, end, percent) {\n return start + (end - start) * percent;\n },\n // default easings\n 'ease': cubicBezier(0.25, 0.1, 0.25, 1),\n 'ease-in': cubicBezier(0.42, 0, 1, 1),\n 'ease-out': cubicBezier(0, 0, 0.58, 1),\n 'ease-in-out': cubicBezier(0.42, 0, 0.58, 1),\n // sine\n 'ease-in-sine': cubicBezier(0.47, 0, 0.745, 0.715),\n 'ease-out-sine': cubicBezier(0.39, 0.575, 0.565, 1),\n 'ease-in-out-sine': cubicBezier(0.445, 0.05, 0.55, 0.95),\n // quad\n 'ease-in-quad': cubicBezier(0.55, 0.085, 0.68, 0.53),\n 'ease-out-quad': cubicBezier(0.25, 0.46, 0.45, 0.94),\n 'ease-in-out-quad': cubicBezier(0.455, 0.03, 0.515, 0.955),\n // cubic\n 'ease-in-cubic': cubicBezier(0.55, 0.055, 0.675, 0.19),\n 'ease-out-cubic': cubicBezier(0.215, 0.61, 0.355, 1),\n 'ease-in-out-cubic': cubicBezier(0.645, 0.045, 0.355, 1),\n // quart\n 'ease-in-quart': cubicBezier(0.895, 0.03, 0.685, 0.22),\n 'ease-out-quart': cubicBezier(0.165, 0.84, 0.44, 1),\n 'ease-in-out-quart': cubicBezier(0.77, 0, 0.175, 1),\n // quint\n 'ease-in-quint': cubicBezier(0.755, 0.05, 0.855, 0.06),\n 'ease-out-quint': cubicBezier(0.23, 1, 0.32, 1),\n 'ease-in-out-quint': cubicBezier(0.86, 0, 0.07, 1),\n // expo\n 'ease-in-expo': cubicBezier(0.95, 0.05, 0.795, 0.035),\n 'ease-out-expo': cubicBezier(0.19, 1, 0.22, 1),\n 'ease-in-out-expo': cubicBezier(1, 0, 0, 1),\n // circ\n 'ease-in-circ': cubicBezier(0.6, 0.04, 0.98, 0.335),\n 'ease-out-circ': cubicBezier(0.075, 0.82, 0.165, 1),\n 'ease-in-out-circ': cubicBezier(0.785, 0.135, 0.15, 0.86),\n // user param easings...\n\n 'spring': function spring(tension, friction, duration) {\n if (duration === 0) {\n // can't get a spring w/ duration 0\n return easings.linear; // duration 0 => jump to end so impl doesn't matter\n }\n var spring = generateSpringRK4(tension, friction, duration);\n return function (start, end, percent) {\n return start + (end - start) * spring(percent);\n };\n },\n 'cubic-bezier': cubicBezier\n};\n\nfunction getEasedValue(type, start, end, percent, easingFn) {\n if (percent === 1) {\n return end;\n }\n if (start === end) {\n return end;\n }\n var val = easingFn(start, end, percent);\n if (type == null) {\n return val;\n }\n if (type.roundValue || type.color) {\n val = Math.round(val);\n }\n if (type.min !== undefined) {\n val = Math.max(val, type.min);\n }\n if (type.max !== undefined) {\n val = Math.min(val, type.max);\n }\n return val;\n}\nfunction getValue(prop, spec) {\n if (prop.pfValue != null || prop.value != null) {\n if (prop.pfValue != null && (spec == null || spec.type.units !== '%')) {\n return prop.pfValue;\n } else {\n return prop.value;\n }\n } else {\n return prop;\n }\n}\nfunction ease(startProp, endProp, percent, easingFn, propSpec) {\n var type = propSpec != null ? propSpec.type : null;\n if (percent < 0) {\n percent = 0;\n } else if (percent > 1) {\n percent = 1;\n }\n var start = getValue(startProp, propSpec);\n var end = getValue(endProp, propSpec);\n if (number$1(start) && number$1(end)) {\n return getEasedValue(type, start, end, percent, easingFn);\n } else if (array(start) && array(end)) {\n var easedArr = [];\n for (var i = 0; i < end.length; i++) {\n var si = start[i];\n var ei = end[i];\n if (si != null && ei != null) {\n var val = getEasedValue(type, si, ei, percent, easingFn);\n easedArr.push(val);\n } else {\n easedArr.push(ei);\n }\n }\n return easedArr;\n }\n return undefined;\n}\n\nfunction step$1(self, ani, now, isCore) {\n var isEles = !isCore;\n var _p = self._private;\n var ani_p = ani._private;\n var pEasing = ani_p.easing;\n var startTime = ani_p.startTime;\n var cy = isCore ? self : self.cy();\n var style = cy.style();\n if (!ani_p.easingImpl) {\n if (pEasing == null) {\n // use default\n ani_p.easingImpl = easings['linear'];\n } else {\n // then define w/ name\n var easingVals;\n if (string(pEasing)) {\n var easingProp = style.parse('transition-timing-function', pEasing);\n easingVals = easingProp.value;\n } else {\n // then assume preparsed array\n easingVals = pEasing;\n }\n var name, args;\n if (string(easingVals)) {\n name = easingVals;\n args = [];\n } else {\n name = easingVals[1];\n args = easingVals.slice(2).map(function (n) {\n return +n;\n });\n }\n if (args.length > 0) {\n // create with args\n if (name === 'spring') {\n args.push(ani_p.duration); // need duration to generate spring\n }\n ani_p.easingImpl = easings[name].apply(null, args);\n } else {\n // static impl by name\n ani_p.easingImpl = easings[name];\n }\n }\n }\n var easing = ani_p.easingImpl;\n var percent;\n if (ani_p.duration === 0) {\n percent = 1;\n } else {\n percent = (now - startTime) / ani_p.duration;\n }\n if (ani_p.applying) {\n percent = ani_p.progress;\n }\n if (percent < 0) {\n percent = 0;\n } else if (percent > 1) {\n percent = 1;\n }\n if (ani_p.delay == null) {\n // then update\n\n var startPos = ani_p.startPosition;\n var endPos = ani_p.position;\n if (endPos && isEles && !self.locked()) {\n var newPos = {};\n if (valid(startPos.x, endPos.x)) {\n newPos.x = ease(startPos.x, endPos.x, percent, easing);\n }\n if (valid(startPos.y, endPos.y)) {\n newPos.y = ease(startPos.y, endPos.y, percent, easing);\n }\n self.position(newPos);\n }\n var startPan = ani_p.startPan;\n var endPan = ani_p.pan;\n var pan = _p.pan;\n var animatingPan = endPan != null && isCore;\n if (animatingPan) {\n if (valid(startPan.x, endPan.x)) {\n pan.x = ease(startPan.x, endPan.x, percent, easing);\n }\n if (valid(startPan.y, endPan.y)) {\n pan.y = ease(startPan.y, endPan.y, percent, easing);\n }\n self.emit('pan');\n }\n var startZoom = ani_p.startZoom;\n var endZoom = ani_p.zoom;\n var animatingZoom = endZoom != null && isCore;\n if (animatingZoom) {\n if (valid(startZoom, endZoom)) {\n _p.zoom = bound(_p.minZoom, ease(startZoom, endZoom, percent, easing), _p.maxZoom);\n }\n self.emit('zoom');\n }\n if (animatingPan || animatingZoom) {\n self.emit('viewport');\n }\n var props = ani_p.style;\n if (props && props.length > 0 && isEles) {\n for (var i = 0; i < props.length; i++) {\n var prop = props[i];\n var _name = prop.name;\n var end = prop;\n var start = ani_p.startStyle[_name];\n var propSpec = style.properties[start.name];\n var easedVal = ease(start, end, percent, easing, propSpec);\n style.overrideBypass(self, _name, easedVal);\n } // for props\n\n self.emit('style');\n } // if\n }\n ani_p.progress = percent;\n return percent;\n}\nfunction valid(start, end) {\n if (start == null || end == null) {\n return false;\n }\n if (number$1(start) && number$1(end)) {\n return true;\n } else if (start && end) {\n return true;\n }\n return false;\n}\n\nfunction startAnimation(self, ani, now, isCore) {\n var ani_p = ani._private;\n ani_p.started = true;\n ani_p.startTime = now - ani_p.progress * ani_p.duration;\n}\n\nfunction stepAll(now, cy) {\n var eles = cy._private.aniEles;\n var doneEles = [];\n function stepOne(ele, isCore) {\n var _p = ele._private;\n var current = _p.animation.current;\n var queue = _p.animation.queue;\n var ranAnis = false;\n\n // if nothing currently animating, get something from the queue\n if (current.length === 0) {\n var next = queue.shift();\n if (next) {\n current.push(next);\n }\n }\n var callbacks = function callbacks(_callbacks) {\n for (var j = _callbacks.length - 1; j >= 0; j--) {\n var cb = _callbacks[j];\n cb();\n }\n _callbacks.splice(0, _callbacks.length);\n };\n\n // step and remove if done\n for (var i = current.length - 1; i >= 0; i--) {\n var ani = current[i];\n var ani_p = ani._private;\n if (ani_p.stopped) {\n current.splice(i, 1);\n ani_p.hooked = false;\n ani_p.playing = false;\n ani_p.started = false;\n callbacks(ani_p.frames);\n continue;\n }\n if (!ani_p.playing && !ani_p.applying) {\n continue;\n }\n\n // an apply() while playing shouldn't do anything\n if (ani_p.playing && ani_p.applying) {\n ani_p.applying = false;\n }\n if (!ani_p.started) {\n startAnimation(ele, ani, now);\n }\n step$1(ele, ani, now, isCore);\n if (ani_p.applying) {\n ani_p.applying = false;\n }\n callbacks(ani_p.frames);\n if (ani_p.step != null) {\n ani_p.step(now);\n }\n if (ani.completed()) {\n current.splice(i, 1);\n ani_p.hooked = false;\n ani_p.playing = false;\n ani_p.started = false;\n callbacks(ani_p.completes);\n }\n ranAnis = true;\n }\n if (!isCore && current.length === 0 && queue.length === 0) {\n doneEles.push(ele);\n }\n return ranAnis;\n } // stepElement\n\n // handle all eles\n var ranEleAni = false;\n for (var e = 0; e < eles.length; e++) {\n var ele = eles[e];\n var handledThisEle = stepOne(ele);\n ranEleAni = ranEleAni || handledThisEle;\n } // each element\n\n var ranCoreAni = stepOne(cy, true);\n\n // notify renderer\n if (ranEleAni || ranCoreAni) {\n if (eles.length > 0) {\n cy.notify('draw', eles);\n } else {\n cy.notify('draw');\n }\n }\n\n // remove elements from list of currently animating if its queues are empty\n eles.unmerge(doneEles);\n cy.emit('step');\n} // stepAll\n\nvar corefn$8 = {\n // pull in animation functions\n animate: define.animate(),\n animation: define.animation(),\n animated: define.animated(),\n clearQueue: define.clearQueue(),\n delay: define.delay(),\n delayAnimation: define.delayAnimation(),\n stop: define.stop(),\n addToAnimationPool: function addToAnimationPool(eles) {\n var cy = this;\n if (!cy.styleEnabled()) {\n return;\n } // save cycles when no style used\n\n cy._private.aniEles.merge(eles);\n },\n stopAnimationLoop: function stopAnimationLoop() {\n this._private.animationsRunning = false;\n },\n startAnimationLoop: function startAnimationLoop() {\n var cy = this;\n cy._private.animationsRunning = true;\n if (!cy.styleEnabled()) {\n return;\n } // save cycles when no style used\n\n // NB the animation loop will exec in headless environments if style enabled\n // and explicit cy.destroy() is necessary to stop the loop\n\n function headlessStep() {\n if (!cy._private.animationsRunning) {\n return;\n }\n requestAnimationFrame(function animationStep(now) {\n stepAll(now, cy);\n headlessStep();\n });\n }\n var renderer = cy.renderer();\n if (renderer && renderer.beforeRender) {\n // let the renderer schedule animations\n renderer.beforeRender(function rendererAnimationStep(willDraw, now) {\n stepAll(now, cy);\n }, renderer.beforeRenderPriorities.animations);\n } else {\n // manage the animation loop ourselves\n headlessStep(); // first call\n }\n }\n};\n\nvar emitterOptions = {\n qualifierCompare: function qualifierCompare(selector1, selector2) {\n if (selector1 == null || selector2 == null) {\n return selector1 == null && selector2 == null;\n } else {\n return selector1.sameText(selector2);\n }\n },\n eventMatches: function eventMatches(cy, listener, eventObj) {\n var selector = listener.qualifier;\n if (selector != null) {\n return cy !== eventObj.target && element(eventObj.target) && selector.matches(eventObj.target);\n }\n return true;\n },\n addEventFields: function addEventFields(cy, evt) {\n evt.cy = cy;\n evt.target = cy;\n },\n callbackContext: function callbackContext(cy, listener, eventObj) {\n return listener.qualifier != null ? eventObj.target : cy;\n }\n};\nvar argSelector = function argSelector(arg) {\n if (string(arg)) {\n return new Selector(arg);\n } else {\n return arg;\n }\n};\nvar elesfn = {\n createEmitter: function createEmitter() {\n var _p = this._private;\n if (!_p.emitter) {\n _p.emitter = new Emitter(emitterOptions, this);\n }\n return this;\n },\n emitter: function emitter() {\n return this._private.emitter;\n },\n on: function on(events, selector, callback) {\n this.emitter().on(events, argSelector(selector), callback);\n return this;\n },\n removeListener: function removeListener(events, selector, callback) {\n this.emitter().removeListener(events, argSelector(selector), callback);\n return this;\n },\n removeAllListeners: function removeAllListeners() {\n this.emitter().removeAllListeners();\n return this;\n },\n one: function one(events, selector, callback) {\n this.emitter().one(events, argSelector(selector), callback);\n return this;\n },\n once: function once(events, selector, callback) {\n this.emitter().one(events, argSelector(selector), callback);\n return this;\n },\n emit: function emit(events, extraParams) {\n this.emitter().emit(events, extraParams);\n return this;\n },\n emitAndNotify: function emitAndNotify(event, eles) {\n this.emit(event);\n this.notify(event, eles);\n return this;\n }\n};\ndefine.eventAliasesOn(elesfn);\n\nvar corefn$7 = {\n png: function png(options) {\n var renderer = this._private.renderer;\n options = options || {};\n return renderer.png(options);\n },\n jpg: function jpg(options) {\n var renderer = this._private.renderer;\n options = options || {};\n options.bg = options.bg || '#fff';\n return renderer.jpg(options);\n }\n};\ncorefn$7.jpeg = corefn$7.jpg;\n\nvar corefn$6 = {\n layout: function layout(options) {\n var cy = this;\n if (options == null) {\n error('Layout options must be specified to make a layout');\n return;\n }\n if (options.name == null) {\n error('A `name` must be specified to make a layout');\n return;\n }\n var name = options.name;\n var Layout = cy.extension('layout', name);\n if (Layout == null) {\n error('No such layout `' + name + '` found. Did you forget to import it and `cytoscape.use()` it?');\n return;\n }\n var eles;\n if (string(options.eles)) {\n eles = cy.$(options.eles);\n } else {\n eles = options.eles != null ? options.eles : cy.$();\n }\n var layout = new Layout(extend({}, options, {\n cy: cy,\n eles: eles\n }));\n return layout;\n }\n};\ncorefn$6.createLayout = corefn$6.makeLayout = corefn$6.layout;\n\nvar corefn$5 = {\n notify: function notify(eventName, eventEles) {\n var _p = this._private;\n if (this.batching()) {\n _p.batchNotifications = _p.batchNotifications || {};\n var eles = _p.batchNotifications[eventName] = _p.batchNotifications[eventName] || this.collection();\n if (eventEles != null) {\n eles.merge(eventEles);\n }\n return; // notifications are disabled during batching\n }\n if (!_p.notificationsEnabled) {\n return;\n } // exit on disabled\n\n var renderer = this.renderer();\n\n // exit if destroy() called on core or renderer in between frames #1499 #1528\n if (this.destroyed() || !renderer) {\n return;\n }\n renderer.notify(eventName, eventEles);\n },\n notifications: function notifications(bool) {\n var p = this._private;\n if (bool === undefined) {\n return p.notificationsEnabled;\n } else {\n p.notificationsEnabled = bool ? true : false;\n }\n return this;\n },\n noNotifications: function noNotifications(callback) {\n this.notifications(false);\n callback();\n this.notifications(true);\n },\n batching: function batching() {\n return this._private.batchCount > 0;\n },\n startBatch: function startBatch() {\n var _p = this._private;\n if (_p.batchCount == null) {\n _p.batchCount = 0;\n }\n if (_p.batchCount === 0) {\n _p.batchStyleEles = this.collection();\n _p.batchNotifications = {};\n }\n _p.batchCount++;\n return this;\n },\n endBatch: function endBatch() {\n var _p = this._private;\n if (_p.batchCount === 0) {\n return this;\n }\n _p.batchCount--;\n if (_p.batchCount === 0) {\n // update style for dirty eles\n _p.batchStyleEles.updateStyle();\n var renderer = this.renderer();\n\n // notify the renderer of queued eles and event types\n Object.keys(_p.batchNotifications).forEach(function (eventName) {\n var eles = _p.batchNotifications[eventName];\n if (eles.empty()) {\n renderer.notify(eventName);\n } else {\n renderer.notify(eventName, eles);\n }\n });\n }\n return this;\n },\n batch: function batch(callback) {\n this.startBatch();\n callback();\n this.endBatch();\n return this;\n },\n // for backwards compatibility\n batchData: function batchData(map) {\n var cy = this;\n return this.batch(function () {\n var ids = Object.keys(map);\n for (var i = 0; i < ids.length; i++) {\n var id = ids[i];\n var data = map[id];\n var ele = cy.getElementById(id);\n ele.data(data);\n }\n });\n }\n};\n\nvar rendererDefaults = defaults$g({\n hideEdgesOnViewport: false,\n textureOnViewport: false,\n motionBlur: false,\n motionBlurOpacity: 0.05,\n pixelRatio: undefined,\n desktopTapThreshold: 4,\n touchTapThreshold: 8,\n wheelSensitivity: 1,\n debug: false,\n showFps: false,\n // webgl options\n webgl: false,\n webglDebug: false,\n webglDebugShowAtlases: false,\n // defaults good for mobile\n webglTexSize: 2048,\n webglTexRows: 36,\n webglTexRowsNodes: 18,\n webglBatchSize: 2048,\n webglTexPerBatch: 14,\n webglBgColor: [255, 255, 255]\n});\nvar corefn$4 = {\n renderTo: function renderTo(context, zoom, pan, pxRatio) {\n var r = this._private.renderer;\n r.renderTo(context, zoom, pan, pxRatio);\n return this;\n },\n renderer: function renderer() {\n return this._private.renderer;\n },\n forceRender: function forceRender() {\n this.notify('draw');\n return this;\n },\n resize: function resize() {\n this.invalidateSize();\n this.emitAndNotify('resize');\n return this;\n },\n initRenderer: function initRenderer(options) {\n var cy = this;\n var RendererProto = cy.extension('renderer', options.name);\n if (RendererProto == null) {\n error(\"Can not initialise: No such renderer `\".concat(options.name, \"` found. Did you forget to import it and `cytoscape.use()` it?\"));\n return;\n }\n if (options.wheelSensitivity !== undefined) {\n warn(\"You have set a custom wheel sensitivity. This will make your app zoom unnaturally when using mainstream mice. You should change this value from the default only if you can guarantee that all your users will use the same hardware and OS configuration as your current machine.\");\n }\n var rOpts = rendererDefaults(options);\n rOpts.cy = cy;\n cy._private.renderer = new RendererProto(rOpts);\n this.notify('init');\n },\n destroyRenderer: function destroyRenderer() {\n var cy = this;\n cy.notify('destroy'); // destroy the renderer\n\n var domEle = cy.container();\n if (domEle) {\n domEle._cyreg = null;\n while (domEle.childNodes.length > 0) {\n domEle.removeChild(domEle.childNodes[0]);\n }\n }\n cy._private.renderer = null; // to be extra safe, remove the ref\n cy.mutableElements().forEach(function (ele) {\n var _p = ele._private;\n _p.rscratch = {};\n _p.rstyle = {};\n _p.animation.current = [];\n _p.animation.queue = [];\n });\n },\n onRender: function onRender(fn) {\n return this.on('render', fn);\n },\n offRender: function offRender(fn) {\n return this.off('render', fn);\n }\n};\ncorefn$4.invalidateDimensions = corefn$4.resize;\n\nvar corefn$3 = {\n // get a collection\n // - empty collection on no args\n // - collection of elements in the graph on selector arg\n // - guarantee a returned collection when elements or collection specified\n collection: function collection(eles, opts) {\n if (string(eles)) {\n return this.$(eles);\n } else if (elementOrCollection(eles)) {\n return eles.collection();\n } else if (array(eles)) {\n if (!opts) {\n opts = {};\n }\n return new Collection(this, eles, opts.unique, opts.removed);\n }\n return new Collection(this);\n },\n nodes: function nodes(selector) {\n var nodes = this.$(function (ele) {\n return ele.isNode();\n });\n if (selector) {\n return nodes.filter(selector);\n }\n return nodes;\n },\n edges: function edges(selector) {\n var edges = this.$(function (ele) {\n return ele.isEdge();\n });\n if (selector) {\n return edges.filter(selector);\n }\n return edges;\n },\n // search the graph like jQuery\n $: function $(selector) {\n var eles = this._private.elements;\n if (selector) {\n return eles.filter(selector);\n } else {\n return eles.spawnSelf();\n }\n },\n mutableElements: function mutableElements() {\n return this._private.elements;\n }\n};\n\n// aliases\ncorefn$3.elements = corefn$3.filter = corefn$3.$;\n\nvar styfn$8 = {};\n\n// keys for style blocks, e.g. ttfftt\nvar TRUE = 't';\nvar FALSE = 'f';\n\n// (potentially expensive calculation)\n// apply the style to the element based on\n// - its bypass\n// - what selectors match it\nstyfn$8.apply = function (eles) {\n var self = this;\n var _p = self._private;\n var cy = _p.cy;\n var updatedEles = cy.collection();\n for (var ie = 0; ie < eles.length; ie++) {\n var ele = eles[ie];\n var cxtMeta = self.getContextMeta(ele);\n if (cxtMeta.empty) {\n continue;\n }\n var cxtStyle = self.getContextStyle(cxtMeta);\n var app = self.applyContextStyle(cxtMeta, cxtStyle, ele);\n if (ele._private.appliedInitStyle) {\n self.updateTransitions(ele, app.diffProps);\n } else {\n ele._private.appliedInitStyle = true;\n }\n var hintsDiff = self.updateStyleHints(ele);\n if (hintsDiff) {\n updatedEles.push(ele);\n }\n } // for elements\n\n return updatedEles;\n};\nstyfn$8.getPropertiesDiff = function (oldCxtKey, newCxtKey) {\n var self = this;\n var cache = self._private.propDiffs = self._private.propDiffs || {};\n var dualCxtKey = oldCxtKey + '-' + newCxtKey;\n var cachedVal = cache[dualCxtKey];\n if (cachedVal) {\n return cachedVal;\n }\n var diffProps = [];\n var addedProp = {};\n for (var i = 0; i < self.length; i++) {\n var cxt = self[i];\n var oldHasCxt = oldCxtKey[i] === TRUE;\n var newHasCxt = newCxtKey[i] === TRUE;\n var cxtHasDiffed = oldHasCxt !== newHasCxt;\n var cxtHasMappedProps = cxt.mappedProperties.length > 0;\n if (cxtHasDiffed || newHasCxt && cxtHasMappedProps) {\n var props = undefined;\n if (cxtHasDiffed && cxtHasMappedProps) {\n props = cxt.properties; // suffices b/c mappedProperties is a subset of properties\n } else if (cxtHasDiffed) {\n props = cxt.properties; // need to check them all\n } else if (cxtHasMappedProps) {\n props = cxt.mappedProperties; // only need to check mapped\n }\n for (var j = 0; j < props.length; j++) {\n var prop = props[j];\n var name = prop.name;\n\n // if a later context overrides this property, then the fact that this context has switched/diffed doesn't matter\n // (semi expensive check since it makes this function O(n^2) on context length, but worth it since overall result\n // is cached)\n var laterCxtOverrides = false;\n for (var k = i + 1; k < self.length; k++) {\n var laterCxt = self[k];\n var hasLaterCxt = newCxtKey[k] === TRUE;\n if (!hasLaterCxt) {\n continue;\n } // can't override unless the context is active\n\n laterCxtOverrides = laterCxt.properties[prop.name] != null;\n if (laterCxtOverrides) {\n break;\n } // exit early as long as one later context overrides\n }\n if (!addedProp[name] && !laterCxtOverrides) {\n addedProp[name] = true;\n diffProps.push(name);\n }\n } // for props\n } // if\n } // for contexts\n\n cache[dualCxtKey] = diffProps;\n return diffProps;\n};\nstyfn$8.getContextMeta = function (ele) {\n var self = this;\n var cxtKey = '';\n var diffProps;\n var prevKey = ele._private.styleCxtKey || '';\n\n // get the cxt key\n for (var i = 0; i < self.length; i++) {\n var context = self[i];\n var contextSelectorMatches = context.selector && context.selector.matches(ele); // NB: context.selector may be null for 'core'\n\n if (contextSelectorMatches) {\n cxtKey += TRUE;\n } else {\n cxtKey += FALSE;\n }\n } // for context\n\n diffProps = self.getPropertiesDiff(prevKey, cxtKey);\n ele._private.styleCxtKey = cxtKey;\n return {\n key: cxtKey,\n diffPropNames: diffProps,\n empty: diffProps.length === 0\n };\n};\n\n// gets a computed ele style object based on matched contexts\nstyfn$8.getContextStyle = function (cxtMeta) {\n var cxtKey = cxtMeta.key;\n var self = this;\n var cxtStyles = this._private.contextStyles = this._private.contextStyles || {};\n\n // if already computed style, returned cached copy\n if (cxtStyles[cxtKey]) {\n return cxtStyles[cxtKey];\n }\n var style = {\n _private: {\n key: cxtKey\n }\n };\n for (var i = 0; i < self.length; i++) {\n var cxt = self[i];\n var hasCxt = cxtKey[i] === TRUE;\n if (!hasCxt) {\n continue;\n }\n for (var j = 0; j < cxt.properties.length; j++) {\n var prop = cxt.properties[j];\n style[prop.name] = prop;\n }\n }\n cxtStyles[cxtKey] = style;\n return style;\n};\nstyfn$8.applyContextStyle = function (cxtMeta, cxtStyle, ele) {\n var self = this;\n var diffProps = cxtMeta.diffPropNames;\n var retDiffProps = {};\n var types = self.types;\n for (var i = 0; i < diffProps.length; i++) {\n var diffPropName = diffProps[i];\n var cxtProp = cxtStyle[diffPropName];\n var eleProp = ele.pstyle(diffPropName);\n if (!cxtProp) {\n // no context prop means delete\n if (!eleProp) {\n continue; // no existing prop means nothing needs to be removed\n // nb affects initial application on mapped values like control-point-distances\n } else if (eleProp.bypass) {\n cxtProp = {\n name: diffPropName,\n deleteBypassed: true\n };\n } else {\n cxtProp = {\n name: diffPropName,\n \"delete\": true\n };\n }\n }\n\n // save cycles when the context prop doesn't need to be applied\n if (eleProp === cxtProp) {\n continue;\n }\n\n // save cycles when a mapped context prop doesn't need to be applied\n if (cxtProp.mapped === types.fn // context prop is function mapper\n && eleProp != null // some props can be null even by default (e.g. a prop that overrides another one)\n && eleProp.mapping != null // ele prop is a concrete value from from a mapper\n && eleProp.mapping.value === cxtProp.value // the current prop on the ele is a flat prop value for the function mapper\n ) {\n // NB don't write to cxtProp, as it's shared among eles (stored in stylesheet)\n var mapping = eleProp.mapping; // can write to mapping, as it's a per-ele copy\n var fnValue = mapping.fnValue = cxtProp.value(ele); // temporarily cache the value in case of a miss\n\n if (fnValue === mapping.prevFnValue) {\n continue;\n }\n }\n var retDiffProp = retDiffProps[diffPropName] = {\n prev: eleProp\n };\n self.applyParsedProperty(ele, cxtProp);\n retDiffProp.next = ele.pstyle(diffPropName);\n if (retDiffProp.next && retDiffProp.next.bypass) {\n retDiffProp.next = retDiffProp.next.bypassed;\n }\n }\n return {\n diffProps: retDiffProps\n };\n};\nstyfn$8.updateStyleHints = function (ele) {\n var _p = ele._private;\n var self = this;\n var propNames = self.propertyGroupNames;\n var propGrKeys = self.propertyGroupKeys;\n var propHash = function propHash(ele, propNames, seedKey) {\n return self.getPropertiesHash(ele, propNames, seedKey);\n };\n var oldStyleKey = _p.styleKey;\n if (ele.removed()) {\n return false;\n }\n var isNode = _p.group === 'nodes';\n\n // get the style key hashes per prop group\n // but lazily -- only use non-default prop values to reduce the number of hashes\n //\n\n var overriddenStyles = ele._private.style;\n propNames = Object.keys(overriddenStyles);\n for (var i = 0; i < propGrKeys.length; i++) {\n var grKey = propGrKeys[i];\n _p.styleKeys[grKey] = [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT];\n }\n var updateGrKey1 = function updateGrKey1(val, grKey) {\n return _p.styleKeys[grKey][0] = hashInt(val, _p.styleKeys[grKey][0]);\n };\n var updateGrKey2 = function updateGrKey2(val, grKey) {\n return _p.styleKeys[grKey][1] = hashIntAlt(val, _p.styleKeys[grKey][1]);\n };\n var updateGrKey = function updateGrKey(val, grKey) {\n updateGrKey1(val, grKey);\n updateGrKey2(val, grKey);\n };\n var updateGrKeyWStr = function updateGrKeyWStr(strVal, grKey) {\n for (var j = 0; j < strVal.length; j++) {\n var ch = strVal.charCodeAt(j);\n updateGrKey1(ch, grKey);\n updateGrKey2(ch, grKey);\n }\n };\n\n // - hashing works on 32 bit ints b/c we use bitwise ops\n // - small numbers get cut off (e.g. 0.123 is seen as 0 by the hashing function)\n // - raise up small numbers so more significant digits are seen by hashing\n // - make small numbers larger than a normal value to avoid collisions\n // - works in practice and it's relatively cheap\n var N = 2000000000;\n var cleanNum = function cleanNum(val) {\n return -128 < val && val < 128 && Math.floor(val) !== val ? N - (val * 1024 | 0) : val;\n };\n for (var _i = 0; _i < propNames.length; _i++) {\n var name = propNames[_i];\n var parsedProp = overriddenStyles[name];\n if (parsedProp == null) {\n continue;\n }\n var propInfo = this.properties[name];\n var type = propInfo.type;\n var _grKey = propInfo.groupKey;\n var normalizedNumberVal = undefined;\n if (propInfo.hashOverride != null) {\n normalizedNumberVal = propInfo.hashOverride(ele, parsedProp);\n } else if (parsedProp.pfValue != null) {\n normalizedNumberVal = parsedProp.pfValue;\n }\n\n // might not be a number if it allows enums\n var numberVal = propInfo.enums == null ? parsedProp.value : null;\n var haveNormNum = normalizedNumberVal != null;\n var haveUnitedNum = numberVal != null;\n var haveNum = haveNormNum || haveUnitedNum;\n var units = parsedProp.units;\n\n // numbers are cheaper to hash than strings\n // 1 hash op vs n hash ops (for length n string)\n if (type.number && haveNum && !type.multiple) {\n var v = haveNormNum ? normalizedNumberVal : numberVal;\n updateGrKey(cleanNum(v), _grKey);\n if (!haveNormNum && units != null) {\n updateGrKeyWStr(units, _grKey);\n }\n } else {\n updateGrKeyWStr(parsedProp.strValue, _grKey);\n }\n }\n\n // overall style key\n //\n\n var hash = [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT];\n for (var _i2 = 0; _i2 < propGrKeys.length; _i2++) {\n var _grKey2 = propGrKeys[_i2];\n var grHash = _p.styleKeys[_grKey2];\n hash[0] = hashInt(grHash[0], hash[0]);\n hash[1] = hashIntAlt(grHash[1], hash[1]);\n }\n _p.styleKey = combineHashes(hash[0], hash[1]);\n\n // label dims\n //\n\n var sk = _p.styleKeys;\n _p.labelDimsKey = combineHashesArray(sk.labelDimensions);\n var labelKeys = propHash(ele, ['label'], sk.labelDimensions);\n _p.labelKey = combineHashesArray(labelKeys);\n _p.labelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, labelKeys));\n if (!isNode) {\n var sourceLabelKeys = propHash(ele, ['source-label'], sk.labelDimensions);\n _p.sourceLabelKey = combineHashesArray(sourceLabelKeys);\n _p.sourceLabelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, sourceLabelKeys));\n var targetLabelKeys = propHash(ele, ['target-label'], sk.labelDimensions);\n _p.targetLabelKey = combineHashesArray(targetLabelKeys);\n _p.targetLabelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, targetLabelKeys));\n }\n\n // node\n //\n\n if (isNode) {\n var _p$styleKeys = _p.styleKeys,\n nodeBody = _p$styleKeys.nodeBody,\n nodeBorder = _p$styleKeys.nodeBorder,\n nodeOutline = _p$styleKeys.nodeOutline,\n backgroundImage = _p$styleKeys.backgroundImage,\n compound = _p$styleKeys.compound,\n pie = _p$styleKeys.pie,\n stripe = _p$styleKeys.stripe;\n var nodeKeys = [nodeBody, nodeBorder, nodeOutline, backgroundImage, compound, pie, stripe].filter(function (k) {\n return k != null;\n }).reduce(hashArrays, [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT]);\n _p.nodeKey = combineHashesArray(nodeKeys);\n _p.hasPie = pie != null && pie[0] !== DEFAULT_HASH_SEED && pie[1] !== DEFAULT_HASH_SEED_ALT;\n _p.hasStripe = stripe != null && stripe[0] !== DEFAULT_HASH_SEED && stripe[1] !== DEFAULT_HASH_SEED_ALT;\n }\n return oldStyleKey !== _p.styleKey;\n};\nstyfn$8.clearStyleHints = function (ele) {\n var _p = ele._private;\n _p.styleCxtKey = '';\n _p.styleKeys = {};\n _p.styleKey = null;\n _p.labelKey = null;\n _p.labelStyleKey = null;\n _p.sourceLabelKey = null;\n _p.sourceLabelStyleKey = null;\n _p.targetLabelKey = null;\n _p.targetLabelStyleKey = null;\n _p.nodeKey = null;\n _p.hasPie = null;\n _p.hasStripe = null;\n};\n\n// apply a property to the style (for internal use)\n// returns whether application was successful\n//\n// now, this function flattens the property, and here's how:\n//\n// for parsedProp:{ bypass: true, deleteBypass: true }\n// no property is generated, instead the bypass property in the\n// element's style is replaced by what's pointed to by the `bypassed`\n// field in the bypass property (i.e. restoring the property the\n// bypass was overriding)\n//\n// for parsedProp:{ mapped: truthy }\n// the generated flattenedProp:{ mapping: prop }\n//\n// for parsedProp:{ bypass: true }\n// the generated flattenedProp:{ bypassed: parsedProp }\nstyfn$8.applyParsedProperty = function (ele, parsedProp) {\n var self = this;\n var prop = parsedProp;\n var style = ele._private.style;\n var flatProp;\n var types = self.types;\n var type = self.properties[prop.name].type;\n var propIsBypass = prop.bypass;\n var origProp = style[prop.name];\n var origPropIsBypass = origProp && origProp.bypass;\n var _p = ele._private;\n var flatPropMapping = 'mapping';\n var getVal = function getVal(p) {\n if (p == null) {\n return null;\n } else if (p.pfValue != null) {\n return p.pfValue;\n } else {\n return p.value;\n }\n };\n var checkTriggers = function checkTriggers() {\n var fromVal = getVal(origProp);\n var toVal = getVal(prop);\n self.checkTriggers(ele, prop.name, fromVal, toVal);\n };\n\n // edge sanity checks to prevent the client from making serious mistakes\n if (parsedProp.name === 'curve-style' && ele.isEdge() && (\n // loops must be bundled beziers\n parsedProp.value !== 'bezier' && ele.isLoop() ||\n // edges connected to compound nodes can not be haystacks\n parsedProp.value === 'haystack' && (ele.source().isParent() || ele.target().isParent()))) {\n prop = parsedProp = this.parse(parsedProp.name, 'bezier', propIsBypass);\n }\n if (prop[\"delete\"]) {\n // delete the property and use the default value on falsey value\n style[prop.name] = undefined;\n checkTriggers();\n return true;\n }\n if (prop.deleteBypassed) {\n // delete the property that the\n if (!origProp) {\n checkTriggers();\n return true; // can't delete if no prop\n } else if (origProp.bypass) {\n // delete bypassed\n origProp.bypassed = undefined;\n checkTriggers();\n return true;\n } else {\n return false; // we're unsuccessful deleting the bypassed\n }\n }\n\n // check if we need to delete the current bypass\n if (prop.deleteBypass) {\n // then this property is just here to indicate we need to delete\n if (!origProp) {\n checkTriggers();\n return true; // property is already not defined\n } else if (origProp.bypass) {\n // then replace the bypass property with the original\n // because the bypassed property was already applied (and therefore parsed), we can just replace it (no reapplying necessary)\n style[prop.name] = origProp.bypassed;\n checkTriggers();\n return true;\n } else {\n return false; // we're unsuccessful deleting the bypass\n }\n }\n var printMappingErr = function printMappingErr() {\n warn('Do not assign mappings to elements without corresponding data (i.e. ele `' + ele.id() + '` has no mapping for property `' + prop.name + '` with data field `' + prop.field + '`); try a `[' + prop.field + ']` selector to limit scope to elements with `' + prop.field + '` defined');\n };\n\n // put the property in the style objects\n switch (prop.mapped) {\n // flatten the property if mapped\n case types.mapData:\n {\n // flatten the field (e.g. data.foo.bar)\n var fields = prop.field.split('.');\n var fieldVal = _p.data;\n for (var i = 0; i < fields.length && fieldVal; i++) {\n var field = fields[i];\n fieldVal = fieldVal[field];\n }\n if (fieldVal == null) {\n printMappingErr();\n return false;\n }\n var percent;\n if (!number$1(fieldVal)) {\n // then don't apply and fall back on the existing style\n warn('Do not use continuous mappers without specifying numeric data (i.e. `' + prop.field + ': ' + fieldVal + '` for `' + ele.id() + '` is non-numeric)');\n return false;\n } else {\n var fieldWidth = prop.fieldMax - prop.fieldMin;\n if (fieldWidth === 0) {\n // safety check -- not strictly necessary as no props of zero range should be passed here\n percent = 0;\n } else {\n percent = (fieldVal - prop.fieldMin) / fieldWidth;\n }\n }\n\n // make sure to bound percent value\n if (percent < 0) {\n percent = 0;\n } else if (percent > 1) {\n percent = 1;\n }\n if (type.color) {\n var r1 = prop.valueMin[0];\n var r2 = prop.valueMax[0];\n var g1 = prop.valueMin[1];\n var g2 = prop.valueMax[1];\n var b1 = prop.valueMin[2];\n var b2 = prop.valueMax[2];\n var a1 = prop.valueMin[3] == null ? 1 : prop.valueMin[3];\n var a2 = prop.valueMax[3] == null ? 1 : prop.valueMax[3];\n var clr = [Math.round(r1 + (r2 - r1) * percent), Math.round(g1 + (g2 - g1) * percent), Math.round(b1 + (b2 - b1) * percent), Math.round(a1 + (a2 - a1) * percent)];\n flatProp = {\n // colours are simple, so just create the flat property instead of expensive string parsing\n bypass: prop.bypass,\n // we're a bypass if the mapping property is a bypass\n name: prop.name,\n value: clr,\n strValue: 'rgb(' + clr[0] + ', ' + clr[1] + ', ' + clr[2] + ')'\n };\n } else if (type.number) {\n var calcValue = prop.valueMin + (prop.valueMax - prop.valueMin) * percent;\n flatProp = this.parse(prop.name, calcValue, prop.bypass, flatPropMapping);\n } else {\n return false; // can only map to colours and numbers\n }\n if (!flatProp) {\n // if we can't flatten the property, then don't apply the property and fall back on the existing style\n printMappingErr();\n return false;\n }\n flatProp.mapping = prop; // keep a reference to the mapping\n prop = flatProp; // the flattened (mapped) property is the one we want\n\n break;\n }\n\n // direct mapping\n case types.data:\n {\n // flatten the field (e.g. data.foo.bar)\n var _fields = prop.field.split('.');\n var _fieldVal = _p.data;\n for (var _i3 = 0; _i3 < _fields.length && _fieldVal; _i3++) {\n var _field = _fields[_i3];\n _fieldVal = _fieldVal[_field];\n }\n if (_fieldVal != null) {\n flatProp = this.parse(prop.name, _fieldVal, prop.bypass, flatPropMapping);\n }\n if (!flatProp) {\n // if we can't flatten the property, then don't apply and fall back on the existing style\n printMappingErr();\n return false;\n }\n flatProp.mapping = prop; // keep a reference to the mapping\n prop = flatProp; // the flattened (mapped) property is the one we want\n\n break;\n }\n case types.fn:\n {\n var fn = prop.value;\n var fnRetVal = prop.fnValue != null ? prop.fnValue : fn(ele); // check for cached value before calling function\n\n prop.prevFnValue = fnRetVal;\n if (fnRetVal == null) {\n warn('Custom function mappers may not return null (i.e. `' + prop.name + '` for ele `' + ele.id() + '` is null)');\n return false;\n }\n flatProp = this.parse(prop.name, fnRetVal, prop.bypass, flatPropMapping);\n if (!flatProp) {\n warn('Custom function mappers may not return invalid values for the property type (i.e. `' + prop.name + '` for ele `' + ele.id() + '` is invalid)');\n return false;\n }\n flatProp.mapping = copy(prop); // keep a reference to the mapping\n prop = flatProp; // the flattened (mapped) property is the one we want\n\n break;\n }\n case undefined:\n break;\n // just set the property\n\n default:\n return false;\n // not a valid mapping\n }\n\n // if the property is a bypass property, then link the resultant property to the original one\n if (propIsBypass) {\n if (origPropIsBypass) {\n // then this bypass overrides the existing one\n prop.bypassed = origProp.bypassed; // steal bypassed prop from old bypass\n } else {\n // then link the orig prop to the new bypass\n prop.bypassed = origProp;\n }\n style[prop.name] = prop; // and set\n } else {\n // prop is not bypass\n if (origPropIsBypass) {\n // then keep the orig prop (since it's a bypass) and link to the new prop\n origProp.bypassed = prop;\n } else {\n // then just replace the old prop with the new one\n style[prop.name] = prop;\n }\n }\n checkTriggers();\n return true;\n};\nstyfn$8.cleanElements = function (eles, keepBypasses) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n this.clearStyleHints(ele);\n ele.dirtyCompoundBoundsCache();\n ele.dirtyBoundingBoxCache();\n if (!keepBypasses) {\n ele._private.style = {};\n } else {\n var style = ele._private.style;\n var propNames = Object.keys(style);\n for (var j = 0; j < propNames.length; j++) {\n var propName = propNames[j];\n var eleProp = style[propName];\n if (eleProp != null) {\n if (eleProp.bypass) {\n eleProp.bypassed = null;\n } else {\n style[propName] = null;\n }\n }\n }\n }\n }\n};\n\n// updates the visual style for all elements (useful for manual style modification after init)\nstyfn$8.update = function () {\n var cy = this._private.cy;\n var eles = cy.mutableElements();\n eles.updateStyle();\n};\n\n// diffProps : { name => { prev, next } }\nstyfn$8.updateTransitions = function (ele, diffProps) {\n var self = this;\n var _p = ele._private;\n var props = ele.pstyle('transition-property').value;\n var duration = ele.pstyle('transition-duration').pfValue;\n var delay = ele.pstyle('transition-delay').pfValue;\n if (props.length > 0 && duration > 0) {\n var style = {};\n\n // build up the style to animate towards\n var anyPrev = false;\n for (var i = 0; i < props.length; i++) {\n var prop = props[i];\n var styProp = ele.pstyle(prop);\n var diffProp = diffProps[prop];\n if (!diffProp) {\n continue;\n }\n var prevProp = diffProp.prev;\n var fromProp = prevProp;\n var toProp = diffProp.next != null ? diffProp.next : styProp;\n var diff = false;\n var initVal = undefined;\n var initDt = 0.000001; // delta time % value for initVal (allows animating out of init zero opacity)\n\n if (!fromProp) {\n continue;\n }\n\n // consider px values\n if (number$1(fromProp.pfValue) && number$1(toProp.pfValue)) {\n diff = toProp.pfValue - fromProp.pfValue; // nonzero is truthy\n initVal = fromProp.pfValue + initDt * diff;\n\n // consider numerical values\n } else if (number$1(fromProp.value) && number$1(toProp.value)) {\n diff = toProp.value - fromProp.value; // nonzero is truthy\n initVal = fromProp.value + initDt * diff;\n\n // consider colour values\n } else if (array(fromProp.value) && array(toProp.value)) {\n diff = fromProp.value[0] !== toProp.value[0] || fromProp.value[1] !== toProp.value[1] || fromProp.value[2] !== toProp.value[2];\n initVal = fromProp.strValue;\n }\n\n // the previous value is good for an animation only if it's different\n if (diff) {\n style[prop] = toProp.strValue; // to val\n this.applyBypass(ele, prop, initVal); // from val\n anyPrev = true;\n }\n } // end if props allow ani\n\n // can't transition if there's nothing previous to transition from\n if (!anyPrev) {\n return;\n }\n _p.transitioning = true;\n new Promise$1(function (resolve) {\n if (delay > 0) {\n ele.delayAnimation(delay).play().promise().then(resolve);\n } else {\n resolve();\n }\n }).then(function () {\n return ele.animation({\n style: style,\n duration: duration,\n easing: ele.pstyle('transition-timing-function').value,\n queue: false\n }).play().promise();\n }).then(function () {\n // if( !isBypass ){\n self.removeBypasses(ele, props);\n ele.emitAndNotify('style');\n // }\n\n _p.transitioning = false;\n });\n } else if (_p.transitioning) {\n this.removeBypasses(ele, props);\n ele.emitAndNotify('style');\n _p.transitioning = false;\n }\n};\nstyfn$8.checkTrigger = function (ele, name, fromValue, toValue, getTrigger, onTrigger) {\n var prop = this.properties[name];\n var triggerCheck = getTrigger(prop);\n if (ele.removed()) {\n return;\n }\n if (triggerCheck != null && triggerCheck(fromValue, toValue, ele)) {\n onTrigger(prop);\n }\n};\nstyfn$8.checkZOrderTrigger = function (ele, name, fromValue, toValue) {\n var _this = this;\n this.checkTrigger(ele, name, fromValue, toValue, function (prop) {\n return prop.triggersZOrder;\n }, function () {\n _this._private.cy.notify('zorder', ele);\n });\n};\nstyfn$8.checkBoundsTrigger = function (ele, name, fromValue, toValue) {\n this.checkTrigger(ele, name, fromValue, toValue, function (prop) {\n return prop.triggersBounds;\n }, function (prop) {\n ele.dirtyCompoundBoundsCache();\n ele.dirtyBoundingBoxCache();\n });\n};\nstyfn$8.checkConnectedEdgesBoundsTrigger = function (ele, name, fromValue, toValue) {\n this.checkTrigger(ele, name, fromValue, toValue, function (prop) {\n return prop.triggersBoundsOfConnectedEdges;\n }, function (prop) {\n ele.connectedEdges().forEach(function (edge) {\n edge.dirtyBoundingBoxCache();\n });\n });\n};\nstyfn$8.checkParallelEdgesBoundsTrigger = function (ele, name, fromValue, toValue) {\n this.checkTrigger(ele, name, fromValue, toValue, function (prop) {\n return prop.triggersBoundsOfParallelEdges;\n }, function (prop) {\n ele.parallelEdges().forEach(function (pllEdge) {\n pllEdge.dirtyBoundingBoxCache();\n });\n });\n};\nstyfn$8.checkTriggers = function (ele, name, fromValue, toValue) {\n ele.dirtyStyleCache();\n this.checkZOrderTrigger(ele, name, fromValue, toValue);\n this.checkBoundsTrigger(ele, name, fromValue, toValue);\n this.checkConnectedEdgesBoundsTrigger(ele, name, fromValue, toValue);\n this.checkParallelEdgesBoundsTrigger(ele, name, fromValue, toValue);\n};\n\nvar styfn$7 = {};\n\n// bypasses are applied to an existing style on an element, and just tacked on temporarily\n// returns true iff application was successful for at least 1 specified property\nstyfn$7.applyBypass = function (eles, name, value, updateTransitions) {\n var self = this;\n var props = [];\n var isBypass = true;\n\n // put all the properties (can specify one or many) in an array after parsing them\n if (name === '*' || name === '**') {\n // apply to all property names\n\n if (value !== undefined) {\n for (var i = 0; i < self.properties.length; i++) {\n var prop = self.properties[i];\n var _name = prop.name;\n var parsedProp = this.parse(_name, value, true);\n if (parsedProp) {\n props.push(parsedProp);\n }\n }\n }\n } else if (string(name)) {\n // then parse the single property\n var _parsedProp = this.parse(name, value, true);\n if (_parsedProp) {\n props.push(_parsedProp);\n }\n } else if (plainObject(name)) {\n // then parse each property\n var specifiedProps = name;\n updateTransitions = value;\n var names = Object.keys(specifiedProps);\n for (var _i = 0; _i < names.length; _i++) {\n var _name2 = names[_i];\n var _value = specifiedProps[_name2];\n if (_value === undefined) {\n // try camel case name too\n _value = specifiedProps[dash2camel(_name2)];\n }\n if (_value !== undefined) {\n var _parsedProp2 = this.parse(_name2, _value, true);\n if (_parsedProp2) {\n props.push(_parsedProp2);\n }\n }\n }\n } else {\n // can't do anything without well defined properties\n return false;\n }\n\n // we've failed if there are no valid properties\n if (props.length === 0) {\n return false;\n }\n\n // now, apply the bypass properties on the elements\n var ret = false; // return true if at least one succesful bypass applied\n for (var _i2 = 0; _i2 < eles.length; _i2++) {\n // for each ele\n var ele = eles[_i2];\n var diffProps = {};\n var diffProp = undefined;\n for (var j = 0; j < props.length; j++) {\n // for each prop\n var _prop = props[j];\n if (updateTransitions) {\n var prevProp = ele.pstyle(_prop.name);\n diffProp = diffProps[_prop.name] = {\n prev: prevProp\n };\n }\n ret = this.applyParsedProperty(ele, copy(_prop)) || ret;\n if (updateTransitions) {\n diffProp.next = ele.pstyle(_prop.name);\n }\n } // for props\n\n if (ret) {\n this.updateStyleHints(ele);\n }\n if (updateTransitions) {\n this.updateTransitions(ele, diffProps, isBypass);\n }\n } // for eles\n\n return ret;\n};\n\n// only useful in specific cases like animation\nstyfn$7.overrideBypass = function (eles, name, value) {\n name = camel2dash(name);\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var prop = ele._private.style[name];\n var type = this.properties[name].type;\n var isColor = type.color;\n var isMulti = type.mutiple;\n var oldValue = !prop ? null : prop.pfValue != null ? prop.pfValue : prop.value;\n if (!prop || !prop.bypass) {\n // need a bypass if one doesn't exist\n this.applyBypass(ele, name, value);\n } else {\n prop.value = value;\n if (prop.pfValue != null) {\n prop.pfValue = value;\n }\n if (isColor) {\n prop.strValue = 'rgb(' + value.join(',') + ')';\n } else if (isMulti) {\n prop.strValue = value.join(' ');\n } else {\n prop.strValue = '' + value;\n }\n this.updateStyleHints(ele);\n }\n this.checkTriggers(ele, name, oldValue, value);\n }\n};\nstyfn$7.removeAllBypasses = function (eles, updateTransitions) {\n return this.removeBypasses(eles, this.propertyNames, updateTransitions);\n};\nstyfn$7.removeBypasses = function (eles, props, updateTransitions) {\n var isBypass = true;\n for (var j = 0; j < eles.length; j++) {\n var ele = eles[j];\n var diffProps = {};\n for (var i = 0; i < props.length; i++) {\n var name = props[i];\n var prop = this.properties[name];\n var prevProp = ele.pstyle(prop.name);\n if (!prevProp || !prevProp.bypass) {\n // if a bypass doesn't exist for the prop, nothing needs to be removed\n continue;\n }\n var value = ''; // empty => remove bypass\n var parsedProp = this.parse(name, value, true);\n var diffProp = diffProps[prop.name] = {\n prev: prevProp\n };\n this.applyParsedProperty(ele, parsedProp);\n diffProp.next = ele.pstyle(prop.name);\n } // for props\n\n this.updateStyleHints(ele);\n if (updateTransitions) {\n this.updateTransitions(ele, diffProps, isBypass);\n }\n } // for eles\n};\n\nvar styfn$6 = {};\n\n// gets what an em size corresponds to in pixels relative to a dom element\nstyfn$6.getEmSizeInPixels = function () {\n var px = this.containerCss('font-size');\n if (px != null) {\n return parseFloat(px);\n } else {\n return 1; // for headless\n }\n};\n\n// gets css property from the core container\nstyfn$6.containerCss = function (propName) {\n var cy = this._private.cy;\n var domElement = cy.container();\n var containerWindow = cy.window();\n if (containerWindow && domElement && containerWindow.getComputedStyle) {\n return containerWindow.getComputedStyle(domElement).getPropertyValue(propName);\n }\n};\n\nvar styfn$5 = {};\n\n// gets the rendered style for an element\nstyfn$5.getRenderedStyle = function (ele, prop) {\n if (prop) {\n return this.getStylePropertyValue(ele, prop, true);\n } else {\n return this.getRawStyle(ele, true);\n }\n};\n\n// gets the raw style for an element\nstyfn$5.getRawStyle = function (ele, isRenderedVal) {\n var self = this;\n ele = ele[0]; // insure it's an element\n\n if (ele) {\n var rstyle = {};\n for (var i = 0; i < self.properties.length; i++) {\n var prop = self.properties[i];\n var val = self.getStylePropertyValue(ele, prop.name, isRenderedVal);\n if (val != null) {\n rstyle[prop.name] = val;\n rstyle[dash2camel(prop.name)] = val;\n }\n }\n return rstyle;\n }\n};\nstyfn$5.getIndexedStyle = function (ele, property, subproperty, index) {\n var pstyle = ele.pstyle(property)[subproperty][index];\n return pstyle != null ? pstyle : ele.cy().style().getDefaultProperty(property)[subproperty][0];\n};\nstyfn$5.getStylePropertyValue = function (ele, propName, isRenderedVal) {\n var self = this;\n ele = ele[0]; // insure it's an element\n\n if (ele) {\n var prop = self.properties[propName];\n if (prop.alias) {\n prop = prop.pointsTo;\n }\n var type = prop.type;\n var styleProp = ele.pstyle(prop.name);\n if (styleProp) {\n var value = styleProp.value,\n units = styleProp.units,\n strValue = styleProp.strValue;\n if (isRenderedVal && type.number && value != null && number$1(value)) {\n var zoom = ele.cy().zoom();\n var getRenderedValue = function getRenderedValue(val) {\n return val * zoom;\n };\n var getValueStringWithUnits = function getValueStringWithUnits(val, units) {\n return getRenderedValue(val) + units;\n };\n var isArrayValue = array(value);\n var haveUnits = isArrayValue ? units.every(function (u) {\n return u != null;\n }) : units != null;\n if (haveUnits) {\n if (isArrayValue) {\n return value.map(function (v, i) {\n return getValueStringWithUnits(v, units[i]);\n }).join(' ');\n } else {\n return getValueStringWithUnits(value, units);\n }\n } else {\n if (isArrayValue) {\n return value.map(function (v) {\n return string(v) ? v : '' + getRenderedValue(v);\n }).join(' ');\n } else {\n return '' + getRenderedValue(value);\n }\n }\n } else if (strValue != null) {\n return strValue;\n }\n }\n return null;\n }\n};\nstyfn$5.getAnimationStartStyle = function (ele, aniProps) {\n var rstyle = {};\n for (var i = 0; i < aniProps.length; i++) {\n var aniProp = aniProps[i];\n var name = aniProp.name;\n var styleProp = ele.pstyle(name);\n if (styleProp !== undefined) {\n // then make a prop of it\n if (plainObject(styleProp)) {\n styleProp = this.parse(name, styleProp.strValue);\n } else {\n styleProp = this.parse(name, styleProp);\n }\n }\n if (styleProp) {\n rstyle[name] = styleProp;\n }\n }\n return rstyle;\n};\nstyfn$5.getPropsList = function (propsObj) {\n var self = this;\n var rstyle = [];\n var style = propsObj;\n var props = self.properties;\n if (style) {\n var names = Object.keys(style);\n for (var i = 0; i < names.length; i++) {\n var name = names[i];\n var val = style[name];\n var prop = props[name] || props[camel2dash(name)];\n var styleProp = this.parse(prop.name, val);\n if (styleProp) {\n rstyle.push(styleProp);\n }\n }\n }\n return rstyle;\n};\nstyfn$5.getNonDefaultPropertiesHash = function (ele, propNames, seed) {\n var hash = seed.slice();\n var name, val, strVal, chVal;\n var i, j;\n for (i = 0; i < propNames.length; i++) {\n name = propNames[i];\n val = ele.pstyle(name, false);\n if (val == null) {\n continue;\n } else if (val.pfValue != null) {\n hash[0] = hashInt(chVal, hash[0]);\n hash[1] = hashIntAlt(chVal, hash[1]);\n } else {\n strVal = val.strValue;\n for (j = 0; j < strVal.length; j++) {\n chVal = strVal.charCodeAt(j);\n hash[0] = hashInt(chVal, hash[0]);\n hash[1] = hashIntAlt(chVal, hash[1]);\n }\n }\n }\n return hash;\n};\nstyfn$5.getPropertiesHash = styfn$5.getNonDefaultPropertiesHash;\n\nvar styfn$4 = {};\nstyfn$4.appendFromJson = function (json) {\n var style = this;\n for (var i = 0; i < json.length; i++) {\n var context = json[i];\n var selector = context.selector;\n var props = context.style || context.css;\n var names = Object.keys(props);\n style.selector(selector); // apply selector\n\n for (var j = 0; j < names.length; j++) {\n var name = names[j];\n var value = props[name];\n style.css(name, value); // apply property\n }\n }\n return style;\n};\n\n// accessible cy.style() function\nstyfn$4.fromJson = function (json) {\n var style = this;\n style.resetToDefault();\n style.appendFromJson(json);\n return style;\n};\n\n// get json from cy.style() api\nstyfn$4.json = function () {\n var json = [];\n for (var i = this.defaultLength; i < this.length; i++) {\n var cxt = this[i];\n var selector = cxt.selector;\n var props = cxt.properties;\n var css = {};\n for (var j = 0; j < props.length; j++) {\n var prop = props[j];\n css[prop.name] = prop.strValue;\n }\n json.push({\n selector: !selector ? 'core' : selector.toString(),\n style: css\n });\n }\n return json;\n};\n\nvar styfn$3 = {};\nstyfn$3.appendFromString = function (string) {\n var self = this;\n var style = this;\n var remaining = '' + string;\n var selAndBlockStr;\n var blockRem;\n var propAndValStr;\n\n // remove comments from the style string\n remaining = remaining.replace(/[/][*](\\s|.)+?[*][/]/g, '');\n function removeSelAndBlockFromRemaining() {\n // remove the parsed selector and block from the remaining text to parse\n if (remaining.length > selAndBlockStr.length) {\n remaining = remaining.substr(selAndBlockStr.length);\n } else {\n remaining = '';\n }\n }\n function removePropAndValFromRem() {\n // remove the parsed property and value from the remaining block text to parse\n if (blockRem.length > propAndValStr.length) {\n blockRem = blockRem.substr(propAndValStr.length);\n } else {\n blockRem = '';\n }\n }\n for (;;) {\n var nothingLeftToParse = remaining.match(/^\\s*$/);\n if (nothingLeftToParse) {\n break;\n }\n var selAndBlock = remaining.match(/^\\s*((?:.|\\s)+?)\\s*\\{((?:.|\\s)+?)\\}/);\n if (!selAndBlock) {\n warn('Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: ' + remaining);\n break;\n }\n selAndBlockStr = selAndBlock[0];\n\n // parse the selector\n var selectorStr = selAndBlock[1];\n if (selectorStr !== 'core') {\n var selector = new Selector(selectorStr);\n if (selector.invalid) {\n warn('Skipping parsing of block: Invalid selector found in string stylesheet: ' + selectorStr);\n\n // skip this selector and block\n removeSelAndBlockFromRemaining();\n continue;\n }\n }\n\n // parse the block of properties and values\n var blockStr = selAndBlock[2];\n var invalidBlock = false;\n blockRem = blockStr;\n var props = [];\n for (;;) {\n var _nothingLeftToParse = blockRem.match(/^\\s*$/);\n if (_nothingLeftToParse) {\n break;\n }\n var propAndVal = blockRem.match(/^\\s*(.+?)\\s*:\\s*(.+?)(?:\\s*;|\\s*$)/);\n if (!propAndVal) {\n warn('Skipping parsing of block: Invalid formatting of style property and value definitions found in:' + blockStr);\n invalidBlock = true;\n break;\n }\n propAndValStr = propAndVal[0];\n var propStr = propAndVal[1];\n var valStr = propAndVal[2];\n var prop = self.properties[propStr];\n if (!prop) {\n warn('Skipping property: Invalid property name in: ' + propAndValStr);\n\n // skip this property in the block\n removePropAndValFromRem();\n continue;\n }\n var parsedProp = style.parse(propStr, valStr);\n if (!parsedProp) {\n warn('Skipping property: Invalid property definition in: ' + propAndValStr);\n\n // skip this property in the block\n removePropAndValFromRem();\n continue;\n }\n props.push({\n name: propStr,\n val: valStr\n });\n removePropAndValFromRem();\n }\n if (invalidBlock) {\n removeSelAndBlockFromRemaining();\n break;\n }\n\n // put the parsed block in the style\n style.selector(selectorStr);\n for (var i = 0; i < props.length; i++) {\n var _prop = props[i];\n style.css(_prop.name, _prop.val);\n }\n removeSelAndBlockFromRemaining();\n }\n return style;\n};\nstyfn$3.fromString = function (string) {\n var style = this;\n style.resetToDefault();\n style.appendFromString(string);\n return style;\n};\n\nvar styfn$2 = {};\n(function () {\n var number$1 = number;\n var rgba = rgbaNoBackRefs;\n var hsla = hslaNoBackRefs;\n var hex3$1 = hex3;\n var hex6$1 = hex6;\n var data = function data(prefix) {\n return '^' + prefix + '\\\\s*\\\\(\\\\s*([\\\\w\\\\.]+)\\\\s*\\\\)$';\n };\n var mapData = function mapData(prefix) {\n var mapArg = number$1 + '|\\\\w+|' + rgba + '|' + hsla + '|' + hex3$1 + '|' + hex6$1;\n return '^' + prefix + '\\\\s*\\\\(([\\\\w\\\\.]+)\\\\s*\\\\,\\\\s*(' + number$1 + ')\\\\s*\\\\,\\\\s*(' + number$1 + ')\\\\s*,\\\\s*(' + mapArg + ')\\\\s*\\\\,\\\\s*(' + mapArg + ')\\\\)$';\n };\n var urlRegexes = ['^url\\\\s*\\\\(\\\\s*[\\'\"]?(.+?)[\\'\"]?\\\\s*\\\\)$', '^(none)$', '^(.+)$'];\n\n // each visual style property has a type and needs to be validated according to it\n styfn$2.types = {\n time: {\n number: true,\n min: 0,\n units: 's|ms',\n implicitUnits: 'ms'\n },\n percent: {\n number: true,\n min: 0,\n max: 100,\n units: '%',\n implicitUnits: '%'\n },\n percentages: {\n number: true,\n min: 0,\n max: 100,\n units: '%',\n implicitUnits: '%',\n multiple: true\n },\n zeroOneNumber: {\n number: true,\n min: 0,\n max: 1,\n unitless: true\n },\n zeroOneNumbers: {\n number: true,\n min: 0,\n max: 1,\n unitless: true,\n multiple: true\n },\n nOneOneNumber: {\n number: true,\n min: -1,\n max: 1,\n unitless: true\n },\n nonNegativeInt: {\n number: true,\n min: 0,\n integer: true,\n unitless: true\n },\n nonNegativeNumber: {\n number: true,\n min: 0,\n unitless: true\n },\n position: {\n enums: ['parent', 'origin']\n },\n nodeSize: {\n number: true,\n min: 0,\n enums: ['label']\n },\n number: {\n number: true,\n unitless: true\n },\n numbers: {\n number: true,\n unitless: true,\n multiple: true\n },\n positiveNumber: {\n number: true,\n unitless: true,\n min: 0,\n strictMin: true\n },\n size: {\n number: true,\n min: 0\n },\n bidirectionalSize: {\n number: true\n },\n // allows negative\n bidirectionalSizeMaybePercent: {\n number: true,\n allowPercent: true\n },\n // allows negative\n bidirectionalSizes: {\n number: true,\n multiple: true\n },\n // allows negative\n sizeMaybePercent: {\n number: true,\n min: 0,\n allowPercent: true\n },\n axisDirection: {\n enums: ['horizontal', 'leftward', 'rightward', 'vertical', 'upward', 'downward', 'auto']\n },\n axisDirectionExplicit: {\n enums: ['leftward', 'rightward', 'upward', 'downward']\n },\n axisDirectionPrimary: {\n enums: ['horizontal', 'vertical']\n },\n paddingRelativeTo: {\n enums: ['width', 'height', 'average', 'min', 'max']\n },\n bgWH: {\n number: true,\n min: 0,\n allowPercent: true,\n enums: ['auto'],\n multiple: true\n },\n bgPos: {\n number: true,\n allowPercent: true,\n multiple: true\n },\n bgRelativeTo: {\n enums: ['inner', 'include-padding'],\n multiple: true\n },\n bgRepeat: {\n enums: ['repeat', 'repeat-x', 'repeat-y', 'no-repeat'],\n multiple: true\n },\n bgFit: {\n enums: ['none', 'contain', 'cover'],\n multiple: true\n },\n bgCrossOrigin: {\n enums: ['anonymous', 'use-credentials', 'null'],\n multiple: true\n },\n bgClip: {\n enums: ['none', 'node'],\n multiple: true\n },\n bgContainment: {\n enums: ['inside', 'over'],\n multiple: true\n },\n boxSelection: {\n enums: ['contain', 'overlap', 'none']\n },\n color: {\n color: true\n },\n colors: {\n color: true,\n multiple: true\n },\n fill: {\n enums: ['solid', 'linear-gradient', 'radial-gradient']\n },\n bool: {\n enums: ['yes', 'no']\n },\n bools: {\n enums: ['yes', 'no'],\n multiple: true\n },\n lineStyle: {\n enums: ['solid', 'dotted', 'dashed']\n },\n lineCap: {\n enums: ['butt', 'round', 'square']\n },\n linePosition: {\n enums: ['center', 'inside', 'outside']\n },\n lineJoin: {\n enums: ['round', 'bevel', 'miter']\n },\n borderStyle: {\n enums: ['solid', 'dotted', 'dashed', 'double']\n },\n curveStyle: {\n enums: ['bezier', 'unbundled-bezier', 'haystack', 'segments', 'straight', 'straight-triangle', 'taxi', 'round-segments', 'round-taxi']\n },\n radiusType: {\n enums: ['arc-radius', 'influence-radius'],\n multiple: true\n },\n fontFamily: {\n regex: '^([\\\\w- \\\\\"]+(?:\\\\s*,\\\\s*[\\\\w- \\\\\"]+)*)$'\n },\n fontStyle: {\n enums: ['italic', 'normal', 'oblique']\n },\n fontWeight: {\n enums: ['normal', 'bold', 'bolder', 'lighter', '100', '200', '300', '400', '500', '600', '800', '900', 100, 200, 300, 400, 500, 600, 700, 800, 900]\n },\n textDecoration: {\n enums: ['none', 'underline', 'overline', 'line-through']\n },\n textTransform: {\n enums: ['none', 'uppercase', 'lowercase']\n },\n textWrap: {\n enums: ['none', 'wrap', 'ellipsis']\n },\n textOverflowWrap: {\n enums: ['whitespace', 'anywhere']\n },\n textBackgroundShape: {\n enums: ['rectangle', 'roundrectangle', 'round-rectangle', 'circle']\n },\n nodeShape: {\n enums: ['rectangle', 'roundrectangle', 'round-rectangle', 'cutrectangle', 'cut-rectangle', 'bottomroundrectangle', 'bottom-round-rectangle', 'barrel', 'ellipse', 'triangle', 'round-triangle', 'square', 'pentagon', 'round-pentagon', 'hexagon', 'round-hexagon', 'concavehexagon', 'concave-hexagon', 'heptagon', 'round-heptagon', 'octagon', 'round-octagon', 'tag', 'round-tag', 'star', 'diamond', 'round-diamond', 'vee', 'rhomboid', 'right-rhomboid', 'polygon']\n },\n overlayShape: {\n enums: ['roundrectangle', 'round-rectangle', 'ellipse']\n },\n cornerRadius: {\n number: true,\n min: 0,\n units: 'px|em',\n implicitUnits: 'px',\n enums: ['auto']\n },\n compoundIncludeLabels: {\n enums: ['include', 'exclude']\n },\n arrowShape: {\n enums: ['tee', 'triangle', 'triangle-tee', 'circle-triangle', 'triangle-cross', 'triangle-backcurve', 'vee', 'square', 'circle', 'diamond', 'chevron', 'none']\n },\n arrowFill: {\n enums: ['filled', 'hollow']\n },\n arrowWidth: {\n number: true,\n units: '%|px|em',\n implicitUnits: 'px',\n enums: ['match-line']\n },\n display: {\n enums: ['element', 'none']\n },\n visibility: {\n enums: ['hidden', 'visible']\n },\n zCompoundDepth: {\n enums: ['bottom', 'orphan', 'auto', 'top']\n },\n zIndexCompare: {\n enums: ['auto', 'manual']\n },\n valign: {\n enums: ['top', 'center', 'bottom']\n },\n halign: {\n enums: ['left', 'center', 'right']\n },\n justification: {\n enums: ['left', 'center', 'right', 'auto']\n },\n text: {\n string: true\n },\n data: {\n mapping: true,\n regex: data('data')\n },\n layoutData: {\n mapping: true,\n regex: data('layoutData')\n },\n scratch: {\n mapping: true,\n regex: data('scratch')\n },\n mapData: {\n mapping: true,\n regex: mapData('mapData')\n },\n mapLayoutData: {\n mapping: true,\n regex: mapData('mapLayoutData')\n },\n mapScratch: {\n mapping: true,\n regex: mapData('mapScratch')\n },\n fn: {\n mapping: true,\n fn: true\n },\n url: {\n regexes: urlRegexes,\n singleRegexMatchValue: true\n },\n urls: {\n regexes: urlRegexes,\n singleRegexMatchValue: true,\n multiple: true\n },\n propList: {\n propList: true\n },\n angle: {\n number: true,\n units: 'deg|rad',\n implicitUnits: 'rad'\n },\n textRotation: {\n number: true,\n units: 'deg|rad',\n implicitUnits: 'rad',\n enums: ['none', 'autorotate']\n },\n polygonPointList: {\n number: true,\n multiple: true,\n evenMultiple: true,\n min: -1,\n max: 1,\n unitless: true\n },\n edgeDistances: {\n enums: ['intersection', 'node-position', 'endpoints']\n },\n edgeEndpoint: {\n number: true,\n multiple: true,\n units: '%|px|em|deg|rad',\n implicitUnits: 'px',\n enums: ['inside-to-node', 'outside-to-node', 'outside-to-node-or-label', 'outside-to-line', 'outside-to-line-or-label'],\n singleEnum: true,\n validate: function validate(valArr, unitsArr) {\n switch (valArr.length) {\n case 2:\n // can be % or px only\n return unitsArr[0] !== 'deg' && unitsArr[0] !== 'rad' && unitsArr[1] !== 'deg' && unitsArr[1] !== 'rad';\n case 1:\n // can be enum, deg, or rad only\n return string(valArr[0]) || unitsArr[0] === 'deg' || unitsArr[0] === 'rad';\n default:\n return false;\n }\n }\n },\n easing: {\n regexes: ['^(spring)\\\\s*\\\\(\\\\s*(' + number$1 + ')\\\\s*,\\\\s*(' + number$1 + ')\\\\s*\\\\)$', '^(cubic-bezier)\\\\s*\\\\(\\\\s*(' + number$1 + ')\\\\s*,\\\\s*(' + number$1 + ')\\\\s*,\\\\s*(' + number$1 + ')\\\\s*,\\\\s*(' + number$1 + ')\\\\s*\\\\)$'],\n enums: ['linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out', 'ease-in-sine', 'ease-out-sine', 'ease-in-out-sine', 'ease-in-quad', 'ease-out-quad', 'ease-in-out-quad', 'ease-in-cubic', 'ease-out-cubic', 'ease-in-out-cubic', 'ease-in-quart', 'ease-out-quart', 'ease-in-out-quart', 'ease-in-quint', 'ease-out-quint', 'ease-in-out-quint', 'ease-in-expo', 'ease-out-expo', 'ease-in-out-expo', 'ease-in-circ', 'ease-out-circ', 'ease-in-out-circ']\n },\n gradientDirection: {\n enums: ['to-bottom', 'to-top', 'to-left', 'to-right', 'to-bottom-right', 'to-bottom-left', 'to-top-right', 'to-top-left', 'to-right-bottom', 'to-left-bottom', 'to-right-top', 'to-left-top' // different order\n ]\n },\n boundsExpansion: {\n number: true,\n multiple: true,\n min: 0,\n validate: function validate(valArr) {\n var length = valArr.length;\n return length === 1 || length === 2 || length === 4;\n }\n }\n };\n var diff = {\n zeroNonZero: function zeroNonZero(val1, val2) {\n if ((val1 == null || val2 == null) && val1 !== val2) {\n return true; // null cases could represent any value\n }\n if (val1 == 0 && val2 != 0) {\n return true;\n } else if (val1 != 0 && val2 == 0) {\n return true;\n } else {\n return false;\n }\n },\n any: function any(val1, val2) {\n return val1 != val2;\n },\n emptyNonEmpty: function emptyNonEmpty(str1, str2) {\n var empty1 = emptyString(str1);\n var empty2 = emptyString(str2);\n return empty1 && !empty2 || !empty1 && empty2;\n }\n };\n\n // define visual style properties\n //\n // - n.b. adding a new group of props may require updates to updateStyleHints()\n // - adding new props to an existing group gets handled automatically\n\n var t = styfn$2.types;\n var mainLabel = [{\n name: 'label',\n type: t.text,\n triggersBounds: diff.any,\n triggersZOrder: diff.emptyNonEmpty\n }, {\n name: 'text-rotation',\n type: t.textRotation,\n triggersBounds: diff.any\n }, {\n name: 'text-margin-x',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'text-margin-y',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }];\n var sourceLabel = [{\n name: 'source-label',\n type: t.text,\n triggersBounds: diff.any\n }, {\n name: 'source-text-rotation',\n type: t.textRotation,\n triggersBounds: diff.any\n }, {\n name: 'source-text-margin-x',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'source-text-margin-y',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'source-text-offset',\n type: t.size,\n triggersBounds: diff.any\n }];\n var targetLabel = [{\n name: 'target-label',\n type: t.text,\n triggersBounds: diff.any\n }, {\n name: 'target-text-rotation',\n type: t.textRotation,\n triggersBounds: diff.any\n }, {\n name: 'target-text-margin-x',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'target-text-margin-y',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'target-text-offset',\n type: t.size,\n triggersBounds: diff.any\n }];\n var labelDimensions = [{\n name: 'font-family',\n type: t.fontFamily,\n triggersBounds: diff.any\n }, {\n name: 'font-style',\n type: t.fontStyle,\n triggersBounds: diff.any\n }, {\n name: 'font-weight',\n type: t.fontWeight,\n triggersBounds: diff.any\n }, {\n name: 'font-size',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'text-transform',\n type: t.textTransform,\n triggersBounds: diff.any\n }, {\n name: 'text-wrap',\n type: t.textWrap,\n triggersBounds: diff.any\n }, {\n name: 'text-overflow-wrap',\n type: t.textOverflowWrap,\n triggersBounds: diff.any\n }, {\n name: 'text-max-width',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'text-outline-width',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'line-height',\n type: t.positiveNumber,\n triggersBounds: diff.any\n }];\n var commonLabel = [{\n name: 'text-valign',\n type: t.valign,\n triggersBounds: diff.any\n }, {\n name: 'text-halign',\n type: t.halign,\n triggersBounds: diff.any\n }, {\n name: 'color',\n type: t.color\n }, {\n name: 'text-outline-color',\n type: t.color\n }, {\n name: 'text-outline-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'text-background-color',\n type: t.color\n }, {\n name: 'text-background-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'text-background-padding',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'text-border-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'text-border-color',\n type: t.color\n }, {\n name: 'text-border-width',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'text-border-style',\n type: t.borderStyle,\n triggersBounds: diff.any\n }, {\n name: 'text-background-shape',\n type: t.textBackgroundShape,\n triggersBounds: diff.any\n }, {\n name: 'text-justification',\n type: t.justification\n }, {\n name: 'box-select-labels',\n type: t.bool,\n triggersBounds: diff.any\n }];\n var behavior = [{\n name: 'events',\n type: t.bool,\n triggersZOrder: diff.any\n }, {\n name: 'text-events',\n type: t.bool,\n triggersZOrder: diff.any\n }, {\n name: 'box-selection',\n type: t.boxSelection,\n triggersZOrder: diff.any\n }];\n var visibility = [{\n name: 'display',\n type: t.display,\n triggersZOrder: diff.any,\n triggersBounds: diff.any,\n triggersBoundsOfConnectedEdges: diff.any,\n triggersBoundsOfParallelEdges: function triggersBoundsOfParallelEdges(fromValue, toValue, ele) {\n if (fromValue === toValue) {\n return false;\n }\n\n // only if edge is bundled bezier (so as not to affect performance of other edges)\n return ele.pstyle('curve-style').value === 'bezier';\n }\n }, {\n name: 'visibility',\n type: t.visibility,\n triggersZOrder: diff.any\n }, {\n name: 'opacity',\n type: t.zeroOneNumber,\n triggersZOrder: diff.zeroNonZero\n }, {\n name: 'text-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'min-zoomed-font-size',\n type: t.size\n }, {\n name: 'z-compound-depth',\n type: t.zCompoundDepth,\n triggersZOrder: diff.any\n }, {\n name: 'z-index-compare',\n type: t.zIndexCompare,\n triggersZOrder: diff.any\n }, {\n name: 'z-index',\n type: t.number,\n triggersZOrder: diff.any\n }];\n var overlay = [{\n name: 'overlay-padding',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'overlay-color',\n type: t.color\n }, {\n name: 'overlay-opacity',\n type: t.zeroOneNumber,\n triggersBounds: diff.zeroNonZero\n }, {\n name: 'overlay-shape',\n type: t.overlayShape,\n triggersBounds: diff.any\n }, {\n name: 'overlay-corner-radius',\n type: t.cornerRadius\n }];\n var underlay = [{\n name: 'underlay-padding',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'underlay-color',\n type: t.color\n }, {\n name: 'underlay-opacity',\n type: t.zeroOneNumber,\n triggersBounds: diff.zeroNonZero\n }, {\n name: 'underlay-shape',\n type: t.overlayShape,\n triggersBounds: diff.any\n }, {\n name: 'underlay-corner-radius',\n type: t.cornerRadius\n }];\n var transition = [{\n name: 'transition-property',\n type: t.propList\n }, {\n name: 'transition-duration',\n type: t.time\n }, {\n name: 'transition-delay',\n type: t.time\n }, {\n name: 'transition-timing-function',\n type: t.easing\n }];\n var nodeSizeHashOverride = function nodeSizeHashOverride(ele, parsedProp) {\n if (parsedProp.value === 'label') {\n return -ele.poolIndex(); // no hash key hits is using label size (hitrate for perf probably low anyway)\n } else {\n return parsedProp.pfValue;\n }\n };\n var nodeBody = [{\n name: 'height',\n type: t.nodeSize,\n triggersBounds: diff.any,\n hashOverride: nodeSizeHashOverride\n }, {\n name: 'width',\n type: t.nodeSize,\n triggersBounds: diff.any,\n hashOverride: nodeSizeHashOverride\n }, {\n name: 'shape',\n type: t.nodeShape,\n triggersBounds: diff.any\n }, {\n name: 'shape-polygon-points',\n type: t.polygonPointList,\n triggersBounds: diff.any\n }, {\n name: 'corner-radius',\n type: t.cornerRadius\n }, {\n name: 'background-color',\n type: t.color\n }, {\n name: 'background-fill',\n type: t.fill\n }, {\n name: 'background-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'background-blacken',\n type: t.nOneOneNumber\n }, {\n name: 'background-gradient-stop-colors',\n type: t.colors\n }, {\n name: 'background-gradient-stop-positions',\n type: t.percentages\n }, {\n name: 'background-gradient-direction',\n type: t.gradientDirection\n }, {\n name: 'padding',\n type: t.sizeMaybePercent,\n triggersBounds: diff.any\n }, {\n name: 'padding-relative-to',\n type: t.paddingRelativeTo,\n triggersBounds: diff.any\n }, {\n name: 'bounds-expansion',\n type: t.boundsExpansion,\n triggersBounds: diff.any\n }];\n var nodeBorder = [{\n name: 'border-color',\n type: t.color\n }, {\n name: 'border-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'border-width',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'border-style',\n type: t.borderStyle\n }, {\n name: 'border-cap',\n type: t.lineCap\n }, {\n name: 'border-join',\n type: t.lineJoin\n }, {\n name: 'border-dash-pattern',\n type: t.numbers\n }, {\n name: 'border-dash-offset',\n type: t.number\n }, {\n name: 'border-position',\n type: t.linePosition\n }];\n var nodeOutline = [{\n name: 'outline-color',\n type: t.color\n }, {\n name: 'outline-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'outline-width',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'outline-style',\n type: t.borderStyle\n }, {\n name: 'outline-offset',\n type: t.size,\n triggersBounds: diff.any\n }];\n var backgroundImage = [{\n name: 'background-image',\n type: t.urls\n }, {\n name: 'background-image-crossorigin',\n type: t.bgCrossOrigin\n }, {\n name: 'background-image-opacity',\n type: t.zeroOneNumbers\n }, {\n name: 'background-image-containment',\n type: t.bgContainment\n }, {\n name: 'background-image-smoothing',\n type: t.bools\n }, {\n name: 'background-position-x',\n type: t.bgPos\n }, {\n name: 'background-position-y',\n type: t.bgPos\n }, {\n name: 'background-width-relative-to',\n type: t.bgRelativeTo\n }, {\n name: 'background-height-relative-to',\n type: t.bgRelativeTo\n }, {\n name: 'background-repeat',\n type: t.bgRepeat\n }, {\n name: 'background-fit',\n type: t.bgFit\n }, {\n name: 'background-clip',\n type: t.bgClip\n }, {\n name: 'background-width',\n type: t.bgWH\n }, {\n name: 'background-height',\n type: t.bgWH\n }, {\n name: 'background-offset-x',\n type: t.bgPos\n }, {\n name: 'background-offset-y',\n type: t.bgPos\n }];\n var compound = [{\n name: 'position',\n type: t.position,\n triggersBounds: diff.any\n }, {\n name: 'compound-sizing-wrt-labels',\n type: t.compoundIncludeLabels,\n triggersBounds: diff.any\n }, {\n name: 'min-width',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'min-width-bias-left',\n type: t.sizeMaybePercent,\n triggersBounds: diff.any\n }, {\n name: 'min-width-bias-right',\n type: t.sizeMaybePercent,\n triggersBounds: diff.any\n }, {\n name: 'min-height',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'min-height-bias-top',\n type: t.sizeMaybePercent,\n triggersBounds: diff.any\n }, {\n name: 'min-height-bias-bottom',\n type: t.sizeMaybePercent,\n triggersBounds: diff.any\n }];\n var edgeLine = [{\n name: 'line-style',\n type: t.lineStyle\n }, {\n name: 'line-color',\n type: t.color\n }, {\n name: 'line-fill',\n type: t.fill\n }, {\n name: 'line-cap',\n type: t.lineCap\n }, {\n name: 'line-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'line-dash-pattern',\n type: t.numbers\n }, {\n name: 'line-dash-offset',\n type: t.number\n }, {\n name: 'line-outline-width',\n type: t.size\n }, {\n name: 'line-outline-color',\n type: t.color\n }, {\n name: 'line-gradient-stop-colors',\n type: t.colors\n }, {\n name: 'line-gradient-stop-positions',\n type: t.percentages\n }, {\n name: 'curve-style',\n type: t.curveStyle,\n triggersBounds: diff.any,\n triggersBoundsOfParallelEdges: function triggersBoundsOfParallelEdges(fromValue, toValue) {\n if (fromValue === toValue) {\n return false;\n } // must have diff\n\n return fromValue === 'bezier' ||\n // remove from bundle\n toValue === 'bezier'; // add to bundle\n }\n }, {\n name: 'haystack-radius',\n type: t.zeroOneNumber,\n triggersBounds: diff.any\n }, {\n name: 'source-endpoint',\n type: t.edgeEndpoint,\n triggersBounds: diff.any\n }, {\n name: 'target-endpoint',\n type: t.edgeEndpoint,\n triggersBounds: diff.any\n }, {\n name: 'control-point-step-size',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'control-point-distances',\n type: t.bidirectionalSizes,\n triggersBounds: diff.any\n }, {\n name: 'control-point-weights',\n type: t.numbers,\n triggersBounds: diff.any\n }, {\n name: 'segment-distances',\n type: t.bidirectionalSizes,\n triggersBounds: diff.any\n }, {\n name: 'segment-weights',\n type: t.numbers,\n triggersBounds: diff.any\n }, {\n name: 'segment-radii',\n type: t.numbers,\n triggersBounds: diff.any\n }, {\n name: 'radius-type',\n type: t.radiusType,\n triggersBounds: diff.any\n }, {\n name: 'taxi-turn',\n type: t.bidirectionalSizeMaybePercent,\n triggersBounds: diff.any\n }, {\n name: 'taxi-turn-min-distance',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'taxi-direction',\n type: t.axisDirection,\n triggersBounds: diff.any\n }, {\n name: 'taxi-radius',\n type: t.number,\n triggersBounds: diff.any\n }, {\n name: 'edge-distances',\n type: t.edgeDistances,\n triggersBounds: diff.any\n }, {\n name: 'arrow-scale',\n type: t.positiveNumber,\n triggersBounds: diff.any\n }, {\n name: 'loop-direction',\n type: t.angle,\n triggersBounds: diff.any\n }, {\n name: 'loop-sweep',\n type: t.angle,\n triggersBounds: diff.any\n }, {\n name: 'source-distance-from-node',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'target-distance-from-node',\n type: t.size,\n triggersBounds: diff.any\n }];\n var ghost = [{\n name: 'ghost',\n type: t.bool,\n triggersBounds: diff.any\n }, {\n name: 'ghost-offset-x',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'ghost-offset-y',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'ghost-opacity',\n type: t.zeroOneNumber\n }];\n var core = [{\n name: 'selection-box-color',\n type: t.color\n }, {\n name: 'selection-box-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'selection-box-border-color',\n type: t.color\n }, {\n name: 'selection-box-border-width',\n type: t.size\n }, {\n name: 'active-bg-color',\n type: t.color\n }, {\n name: 'active-bg-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'active-bg-size',\n type: t.size\n }, {\n name: 'outside-texture-bg-color',\n type: t.color\n }, {\n name: 'outside-texture-bg-opacity',\n type: t.zeroOneNumber\n }];\n\n // pie backgrounds for nodes\n var pie = [];\n styfn$2.pieBackgroundN = 16; // because the pie properties are numbered, give access to a constant N (for renderer use)\n pie.push({\n name: 'pie-size',\n type: t.sizeMaybePercent\n });\n pie.push({\n name: 'pie-hole',\n type: t.sizeMaybePercent\n });\n pie.push({\n name: 'pie-start-angle',\n type: t.angle\n });\n for (var i = 1; i <= styfn$2.pieBackgroundN; i++) {\n pie.push({\n name: 'pie-' + i + '-background-color',\n type: t.color\n });\n pie.push({\n name: 'pie-' + i + '-background-size',\n type: t.percent\n });\n pie.push({\n name: 'pie-' + i + '-background-opacity',\n type: t.zeroOneNumber\n });\n }\n\n // stripe backgrounds for nodes\n var stripe = [];\n styfn$2.stripeBackgroundN = 16; // because the stripe properties are numbered, give access to a constant N (for renderer use)\n stripe.push({\n name: 'stripe-size',\n type: t.sizeMaybePercent\n });\n stripe.push({\n name: 'stripe-direction',\n type: t.axisDirectionPrimary\n });\n for (var _i = 1; _i <= styfn$2.stripeBackgroundN; _i++) {\n stripe.push({\n name: 'stripe-' + _i + '-background-color',\n type: t.color\n });\n stripe.push({\n name: 'stripe-' + _i + '-background-size',\n type: t.percent\n });\n stripe.push({\n name: 'stripe-' + _i + '-background-opacity',\n type: t.zeroOneNumber\n });\n }\n\n // edge arrows\n var edgeArrow = [];\n var arrowPrefixes = styfn$2.arrowPrefixes = ['source', 'mid-source', 'target', 'mid-target'];\n [{\n name: 'arrow-shape',\n type: t.arrowShape,\n triggersBounds: diff.any\n }, {\n name: 'arrow-color',\n type: t.color\n }, {\n name: 'arrow-fill',\n type: t.arrowFill\n }, {\n name: 'arrow-width',\n type: t.arrowWidth\n }].forEach(function (prop) {\n arrowPrefixes.forEach(function (prefix) {\n var name = prefix + '-' + prop.name;\n var type = prop.type,\n triggersBounds = prop.triggersBounds;\n edgeArrow.push({\n name: name,\n type: type,\n triggersBounds: triggersBounds\n });\n });\n }, {});\n var props = styfn$2.properties = [].concat(behavior, transition, visibility, overlay, underlay, ghost, commonLabel, labelDimensions, mainLabel, sourceLabel, targetLabel, nodeBody, nodeBorder, nodeOutline, backgroundImage, pie, stripe, compound, edgeLine, edgeArrow, core);\n var propGroups = styfn$2.propertyGroups = {\n // common to all eles\n behavior: behavior,\n transition: transition,\n visibility: visibility,\n overlay: overlay,\n underlay: underlay,\n ghost: ghost,\n // labels\n commonLabel: commonLabel,\n labelDimensions: labelDimensions,\n mainLabel: mainLabel,\n sourceLabel: sourceLabel,\n targetLabel: targetLabel,\n // node props\n nodeBody: nodeBody,\n nodeBorder: nodeBorder,\n nodeOutline: nodeOutline,\n backgroundImage: backgroundImage,\n pie: pie,\n stripe: stripe,\n compound: compound,\n // edge props\n edgeLine: edgeLine,\n edgeArrow: edgeArrow,\n core: core\n };\n var propGroupNames = styfn$2.propertyGroupNames = {};\n var propGroupKeys = styfn$2.propertyGroupKeys = Object.keys(propGroups);\n propGroupKeys.forEach(function (key) {\n propGroupNames[key] = propGroups[key].map(function (prop) {\n return prop.name;\n });\n propGroups[key].forEach(function (prop) {\n return prop.groupKey = key;\n });\n });\n\n // define aliases\n var aliases = styfn$2.aliases = [{\n name: 'content',\n pointsTo: 'label'\n }, {\n name: 'control-point-distance',\n pointsTo: 'control-point-distances'\n }, {\n name: 'control-point-weight',\n pointsTo: 'control-point-weights'\n }, {\n name: 'segment-distance',\n pointsTo: 'segment-distances'\n }, {\n name: 'segment-weight',\n pointsTo: 'segment-weights'\n }, {\n name: 'segment-radius',\n pointsTo: 'segment-radii'\n }, {\n name: 'edge-text-rotation',\n pointsTo: 'text-rotation'\n }, {\n name: 'padding-left',\n pointsTo: 'padding'\n }, {\n name: 'padding-right',\n pointsTo: 'padding'\n }, {\n name: 'padding-top',\n pointsTo: 'padding'\n }, {\n name: 'padding-bottom',\n pointsTo: 'padding'\n }];\n\n // list of property names\n styfn$2.propertyNames = props.map(function (p) {\n return p.name;\n });\n\n // allow access of properties by name ( e.g. style.properties.height )\n for (var _i2 = 0; _i2 < props.length; _i2++) {\n var prop = props[_i2];\n props[prop.name] = prop; // allow lookup by name\n }\n\n // map aliases\n for (var _i3 = 0; _i3 < aliases.length; _i3++) {\n var alias = aliases[_i3];\n var pointsToProp = props[alias.pointsTo];\n var aliasProp = {\n name: alias.name,\n alias: true,\n pointsTo: pointsToProp\n };\n\n // add alias prop for parsing\n props.push(aliasProp);\n props[alias.name] = aliasProp; // allow lookup by name\n }\n})();\nstyfn$2.getDefaultProperty = function (name) {\n return this.getDefaultProperties()[name];\n};\nstyfn$2.getDefaultProperties = function () {\n var _p = this._private;\n if (_p.defaultProperties != null) {\n return _p.defaultProperties;\n }\n var rawProps = extend({\n // core props\n 'selection-box-color': '#ddd',\n 'selection-box-opacity': 0.65,\n 'selection-box-border-color': '#aaa',\n 'selection-box-border-width': 1,\n 'active-bg-color': 'black',\n 'active-bg-opacity': 0.15,\n 'active-bg-size': 30,\n 'outside-texture-bg-color': '#000',\n 'outside-texture-bg-opacity': 0.125,\n // common node/edge props\n 'events': 'yes',\n 'text-events': 'no',\n 'text-valign': 'top',\n 'text-halign': 'center',\n 'text-justification': 'auto',\n 'line-height': 1,\n 'color': '#000',\n 'box-selection': 'contain',\n 'text-outline-color': '#000',\n 'text-outline-width': 0,\n 'text-outline-opacity': 1,\n 'text-opacity': 1,\n 'text-decoration': 'none',\n 'text-transform': 'none',\n 'text-wrap': 'none',\n 'text-overflow-wrap': 'whitespace',\n 'text-max-width': 9999,\n 'text-background-color': '#000',\n 'text-background-opacity': 0,\n 'text-background-shape': 'rectangle',\n 'text-background-padding': 0,\n 'text-border-opacity': 0,\n 'text-border-width': 0,\n 'text-border-style': 'solid',\n 'text-border-color': '#000',\n 'font-family': 'Helvetica Neue, Helvetica, sans-serif',\n 'font-style': 'normal',\n 'font-weight': 'normal',\n 'font-size': 16,\n 'min-zoomed-font-size': 0,\n 'text-rotation': 'none',\n 'source-text-rotation': 'none',\n 'target-text-rotation': 'none',\n 'visibility': 'visible',\n 'display': 'element',\n 'opacity': 1,\n 'z-compound-depth': 'auto',\n 'z-index-compare': 'auto',\n 'z-index': 0,\n 'label': '',\n 'text-margin-x': 0,\n 'text-margin-y': 0,\n 'source-label': '',\n 'source-text-offset': 0,\n 'source-text-margin-x': 0,\n 'source-text-margin-y': 0,\n 'target-label': '',\n 'target-text-offset': 0,\n 'target-text-margin-x': 0,\n 'target-text-margin-y': 0,\n 'overlay-opacity': 0,\n 'overlay-color': '#000',\n 'overlay-padding': 10,\n 'overlay-shape': 'round-rectangle',\n 'overlay-corner-radius': 'auto',\n 'underlay-opacity': 0,\n 'underlay-color': '#000',\n 'underlay-padding': 10,\n 'underlay-shape': 'round-rectangle',\n 'underlay-corner-radius': 'auto',\n 'transition-property': 'none',\n 'transition-duration': 0,\n 'transition-delay': 0,\n 'transition-timing-function': 'linear',\n 'box-select-labels': 'no',\n // node props\n 'background-blacken': 0,\n 'background-color': '#999',\n 'background-fill': 'solid',\n 'background-opacity': 1,\n 'background-image': 'none',\n 'background-image-crossorigin': 'anonymous',\n 'background-image-opacity': 1,\n 'background-image-containment': 'inside',\n 'background-image-smoothing': 'yes',\n 'background-position-x': '50%',\n 'background-position-y': '50%',\n 'background-offset-x': 0,\n 'background-offset-y': 0,\n 'background-width-relative-to': 'include-padding',\n 'background-height-relative-to': 'include-padding',\n 'background-repeat': 'no-repeat',\n 'background-fit': 'none',\n 'background-clip': 'node',\n 'background-width': 'auto',\n 'background-height': 'auto',\n 'border-color': '#000',\n 'border-opacity': 1,\n 'border-width': 0,\n 'border-style': 'solid',\n 'border-dash-pattern': [4, 2],\n 'border-dash-offset': 0,\n 'border-cap': 'butt',\n 'border-join': 'miter',\n 'border-position': 'center',\n 'outline-color': '#999',\n 'outline-opacity': 1,\n 'outline-width': 0,\n 'outline-offset': 0,\n 'outline-style': 'solid',\n 'height': 30,\n 'width': 30,\n 'shape': 'ellipse',\n 'shape-polygon-points': '-1, -1, 1, -1, 1, 1, -1, 1',\n 'corner-radius': 'auto',\n 'bounds-expansion': 0,\n // node gradient\n 'background-gradient-direction': 'to-bottom',\n 'background-gradient-stop-colors': '#999',\n 'background-gradient-stop-positions': '0%',\n // ghost props\n 'ghost': 'no',\n 'ghost-offset-y': 0,\n 'ghost-offset-x': 0,\n 'ghost-opacity': 0,\n // compound props\n 'padding': 0,\n 'padding-relative-to': 'width',\n 'position': 'origin',\n 'compound-sizing-wrt-labels': 'include',\n 'min-width': 0,\n 'min-width-bias-left': 0,\n 'min-width-bias-right': 0,\n 'min-height': 0,\n 'min-height-bias-top': 0,\n 'min-height-bias-bottom': 0\n }, {\n // node pie bg\n 'pie-size': '100%',\n 'pie-hole': 0,\n 'pie-start-angle': '0deg'\n }, [{\n name: 'pie-{{i}}-background-color',\n value: 'black'\n }, {\n name: 'pie-{{i}}-background-size',\n value: '0%'\n }, {\n name: 'pie-{{i}}-background-opacity',\n value: 1\n }].reduce(function (css, prop) {\n for (var i = 1; i <= styfn$2.pieBackgroundN; i++) {\n var name = prop.name.replace('{{i}}', i);\n var val = prop.value;\n css[name] = val;\n }\n return css;\n }, {}), {\n // node stripes bg\n 'stripe-size': '100%',\n 'stripe-direction': 'horizontal'\n }, [{\n name: 'stripe-{{i}}-background-color',\n value: 'black'\n }, {\n name: 'stripe-{{i}}-background-size',\n value: '0%'\n }, {\n name: 'stripe-{{i}}-background-opacity',\n value: 1\n }].reduce(function (css, prop) {\n for (var i = 1; i <= styfn$2.stripeBackgroundN; i++) {\n var name = prop.name.replace('{{i}}', i);\n var val = prop.value;\n css[name] = val;\n }\n return css;\n }, {}), {\n // edge props\n 'line-style': 'solid',\n 'line-color': '#999',\n 'line-fill': 'solid',\n 'line-cap': 'butt',\n 'line-opacity': 1,\n 'line-outline-width': 0,\n 'line-outline-color': '#000',\n 'line-gradient-stop-colors': '#999',\n 'line-gradient-stop-positions': '0%',\n 'control-point-step-size': 40,\n 'control-point-weights': 0.5,\n 'segment-weights': 0.5,\n 'segment-distances': 20,\n 'segment-radii': 15,\n 'radius-type': 'arc-radius',\n 'taxi-turn': '50%',\n 'taxi-radius': 15,\n 'taxi-turn-min-distance': 10,\n 'taxi-direction': 'auto',\n 'edge-distances': 'intersection',\n 'curve-style': 'haystack',\n 'haystack-radius': 0,\n 'arrow-scale': 1,\n 'loop-direction': '-45deg',\n 'loop-sweep': '-90deg',\n 'source-distance-from-node': 0,\n 'target-distance-from-node': 0,\n 'source-endpoint': 'outside-to-node',\n 'target-endpoint': 'outside-to-node',\n 'line-dash-pattern': [6, 3],\n 'line-dash-offset': 0\n }, [{\n name: 'arrow-shape',\n value: 'none'\n }, {\n name: 'arrow-color',\n value: '#999'\n }, {\n name: 'arrow-fill',\n value: 'filled'\n }, {\n name: 'arrow-width',\n value: 1\n }].reduce(function (css, prop) {\n styfn$2.arrowPrefixes.forEach(function (prefix) {\n var name = prefix + '-' + prop.name;\n var val = prop.value;\n css[name] = val;\n });\n return css;\n }, {}));\n var parsedProps = {};\n for (var i = 0; i < this.properties.length; i++) {\n var prop = this.properties[i];\n if (prop.pointsTo) {\n continue;\n }\n var name = prop.name;\n var val = rawProps[name];\n var parsedProp = this.parse(name, val);\n parsedProps[name] = parsedProp;\n }\n _p.defaultProperties = parsedProps;\n return _p.defaultProperties;\n};\nstyfn$2.addDefaultStylesheet = function () {\n this.selector(':parent').css({\n 'shape': 'rectangle',\n 'padding': 10,\n 'background-color': '#eee',\n 'border-color': '#ccc',\n 'border-width': 1\n }).selector('edge').css({\n 'width': 3\n }).selector(':loop').css({\n 'curve-style': 'bezier'\n }).selector('edge:compound').css({\n 'curve-style': 'bezier',\n 'source-endpoint': 'outside-to-line',\n 'target-endpoint': 'outside-to-line'\n }).selector(':selected').css({\n 'background-color': '#0169D9',\n 'line-color': '#0169D9',\n 'source-arrow-color': '#0169D9',\n 'target-arrow-color': '#0169D9',\n 'mid-source-arrow-color': '#0169D9',\n 'mid-target-arrow-color': '#0169D9'\n }).selector(':parent:selected').css({\n 'background-color': '#CCE1F9',\n 'border-color': '#aec8e5'\n }).selector(':active').css({\n 'overlay-color': 'black',\n 'overlay-padding': 10,\n 'overlay-opacity': 0.25\n });\n this.defaultLength = this.length;\n};\n\nvar styfn$1 = {};\n\n// a caching layer for property parsing\nstyfn$1.parse = function (name, value, propIsBypass, propIsFlat) {\n var self = this;\n\n // function values can't be cached in all cases, and there isn't much benefit of caching them anyway\n if (fn$6(value)) {\n return self.parseImplWarn(name, value, propIsBypass, propIsFlat);\n }\n var flatKey = propIsFlat === 'mapping' || propIsFlat === true || propIsFlat === false || propIsFlat == null ? 'dontcare' : propIsFlat;\n var bypassKey = propIsBypass ? 't' : 'f';\n var valueKey = '' + value;\n var argHash = hashStrings(name, valueKey, bypassKey, flatKey);\n var propCache = self.propCache = self.propCache || [];\n var ret;\n if (!(ret = propCache[argHash])) {\n ret = propCache[argHash] = self.parseImplWarn(name, value, propIsBypass, propIsFlat);\n }\n\n // - bypasses can't be shared b/c the value can be changed by animations or otherwise overridden\n // - mappings can't be shared b/c mappings are per-element\n if (propIsBypass || propIsFlat === 'mapping') {\n // need a copy since props are mutated later in their lifecycles\n ret = copy(ret);\n if (ret) {\n ret.value = copy(ret.value); // because it could be an array, e.g. colour\n }\n }\n return ret;\n};\nstyfn$1.parseImplWarn = function (name, value, propIsBypass, propIsFlat) {\n var prop = this.parseImpl(name, value, propIsBypass, propIsFlat);\n if (!prop && value != null) {\n warn(\"The style property `\".concat(name, \": \").concat(value, \"` is invalid\"));\n }\n if (prop && (prop.name === 'width' || prop.name === 'height') && value === 'label') {\n warn('The style value of `label` is deprecated for `' + prop.name + '`');\n }\n return prop;\n};\n\n// parse a property; return null on invalid; return parsed property otherwise\n// fields :\n// - name : the name of the property\n// - value : the parsed, native-typed value of the property\n// - strValue : a string value that represents the property value in valid css\n// - bypass : true iff the property is a bypass property\nstyfn$1.parseImpl = function (name, value, propIsBypass, propIsFlat) {\n var self = this;\n name = camel2dash(name); // make sure the property name is in dash form (e.g. 'property-name' not 'propertyName')\n\n var property = self.properties[name];\n var passedValue = value;\n var types = self.types;\n if (!property) {\n return null;\n } // return null on property of unknown name\n if (value === undefined) {\n return null;\n } // can't assign undefined\n\n // the property may be an alias\n if (property.alias) {\n property = property.pointsTo;\n name = property.name;\n }\n var valueIsString = string(value);\n if (valueIsString) {\n // trim the value to make parsing easier\n value = value.trim();\n }\n var type = property.type;\n if (!type) {\n return null;\n } // no type, no luck\n\n // check if bypass is null or empty string (i.e. indication to delete bypass property)\n if (propIsBypass && (value === '' || value === null)) {\n return {\n name: name,\n value: value,\n bypass: true,\n deleteBypass: true\n };\n }\n\n // check if value is a function used as a mapper\n if (fn$6(value)) {\n return {\n name: name,\n value: value,\n strValue: 'fn',\n mapped: types.fn,\n bypass: propIsBypass\n };\n }\n\n // check if value is mapped\n var data, mapData;\n if (!valueIsString || propIsFlat || value.length < 7 || value[1] !== 'a') ; else if (value.length >= 7 && value[0] === 'd' && (data = new RegExp(types.data.regex).exec(value))) {\n if (propIsBypass) {\n return false;\n } // mappers not allowed in bypass\n\n var mapped = types.data;\n return {\n name: name,\n value: data,\n strValue: '' + value,\n mapped: mapped,\n field: data[1],\n bypass: propIsBypass\n };\n } else if (value.length >= 10 && value[0] === 'm' && (mapData = new RegExp(types.mapData.regex).exec(value))) {\n if (propIsBypass) {\n return false;\n } // mappers not allowed in bypass\n if (type.multiple) {\n return false;\n } // impossible to map to num\n\n var _mapped = types.mapData;\n\n // we can map only if the type is a colour or a number\n if (!(type.color || type.number)) {\n return false;\n }\n var valueMin = this.parse(name, mapData[4]); // parse to validate\n if (!valueMin || valueMin.mapped) {\n return false;\n } // can't be invalid or mapped\n\n var valueMax = this.parse(name, mapData[5]); // parse to validate\n if (!valueMax || valueMax.mapped) {\n return false;\n } // can't be invalid or mapped\n\n // check if valueMin and valueMax are the same\n if (valueMin.pfValue === valueMax.pfValue || valueMin.strValue === valueMax.strValue) {\n warn('`' + name + ': ' + value + '` is not a valid mapper because the output range is zero; converting to `' + name + ': ' + valueMin.strValue + '`');\n return this.parse(name, valueMin.strValue); // can't make much of a mapper without a range\n } else if (type.color) {\n var c1 = valueMin.value;\n var c2 = valueMax.value;\n var same = c1[0] === c2[0] // red\n && c1[1] === c2[1] // green\n && c1[2] === c2[2] // blue\n && (\n // optional alpha\n c1[3] === c2[3] // same alpha outright\n || (c1[3] == null || c1[3] === 1 // full opacity for colour 1?\n ) && (c2[3] == null || c2[3] === 1) // full opacity for colour 2?\n );\n if (same) {\n return false;\n } // can't make a mapper without a range\n }\n return {\n name: name,\n value: mapData,\n strValue: '' + value,\n mapped: _mapped,\n field: mapData[1],\n fieldMin: parseFloat(mapData[2]),\n // min & max are numeric\n fieldMax: parseFloat(mapData[3]),\n valueMin: valueMin.value,\n valueMax: valueMax.value,\n bypass: propIsBypass\n };\n }\n if (type.multiple && propIsFlat !== 'multiple') {\n var vals;\n if (valueIsString) {\n vals = value.split(/\\s+/);\n } else if (array(value)) {\n vals = value;\n } else {\n vals = [value];\n }\n if (type.evenMultiple && vals.length % 2 !== 0) {\n return null;\n }\n var valArr = [];\n var unitsArr = [];\n var pfValArr = [];\n var strVal = '';\n var hasEnum = false;\n for (var i = 0; i < vals.length; i++) {\n var p = self.parse(name, vals[i], propIsBypass, 'multiple');\n hasEnum = hasEnum || string(p.value);\n valArr.push(p.value);\n pfValArr.push(p.pfValue != null ? p.pfValue : p.value);\n unitsArr.push(p.units);\n strVal += (i > 0 ? ' ' : '') + p.strValue;\n }\n if (type.validate && !type.validate(valArr, unitsArr)) {\n return null;\n }\n if (type.singleEnum && hasEnum) {\n if (valArr.length === 1 && string(valArr[0])) {\n return {\n name: name,\n value: valArr[0],\n strValue: valArr[0],\n bypass: propIsBypass\n };\n } else {\n return null;\n }\n }\n return {\n name: name,\n value: valArr,\n pfValue: pfValArr,\n strValue: strVal,\n bypass: propIsBypass,\n units: unitsArr\n };\n }\n\n // several types also allow enums\n var checkEnums = function checkEnums() {\n for (var _i = 0; _i < type.enums.length; _i++) {\n var en = type.enums[_i];\n if (en === value) {\n return {\n name: name,\n value: value,\n strValue: '' + value,\n bypass: propIsBypass\n };\n }\n }\n return null;\n };\n\n // check the type and return the appropriate object\n if (type.number) {\n var units;\n var implicitUnits = 'px'; // not set => px\n\n if (type.units) {\n // use specified units if set\n units = type.units;\n }\n if (type.implicitUnits) {\n implicitUnits = type.implicitUnits;\n }\n if (!type.unitless) {\n if (valueIsString) {\n var unitsRegex = 'px|em' + (type.allowPercent ? '|\\\\%' : '');\n if (units) {\n unitsRegex = units;\n } // only allow explicit units if so set\n var match = value.match('^(' + number + ')(' + unitsRegex + ')?' + '$');\n if (match) {\n value = match[1];\n units = match[2] || implicitUnits;\n }\n } else if (!units || type.implicitUnits) {\n units = implicitUnits; // implicitly px if unspecified\n }\n }\n value = parseFloat(value);\n\n // if not a number and enums not allowed, then the value is invalid\n if (isNaN(value) && type.enums === undefined) {\n return null;\n }\n\n // check if this number type also accepts special keywords in place of numbers\n // (i.e. `left`, `auto`, etc)\n if (isNaN(value) && type.enums !== undefined) {\n value = passedValue;\n return checkEnums();\n }\n\n // check if value must be an integer\n if (type.integer && !integer(value)) {\n return null;\n }\n\n // check value is within range\n if (type.min !== undefined && (value < type.min || type.strictMin && value === type.min) || type.max !== undefined && (value > type.max || type.strictMax && value === type.max)) {\n return null;\n }\n var ret = {\n name: name,\n value: value,\n strValue: '' + value + (units ? units : ''),\n units: units,\n bypass: propIsBypass\n };\n\n // normalise value in pixels\n if (type.unitless || units !== 'px' && units !== 'em') {\n ret.pfValue = value;\n } else {\n ret.pfValue = units === 'px' || !units ? value : this.getEmSizeInPixels() * value;\n }\n\n // normalise value in ms\n if (units === 'ms' || units === 's') {\n ret.pfValue = units === 'ms' ? value : 1000 * value;\n }\n\n // normalise value in rad\n if (units === 'deg' || units === 'rad') {\n ret.pfValue = units === 'rad' ? value : deg2rad(value);\n }\n\n // normalize value in %\n if (units === '%') {\n ret.pfValue = value / 100;\n }\n return ret;\n } else if (type.propList) {\n var props = [];\n var propsStr = '' + value;\n if (propsStr === 'none') ; else {\n // go over each prop\n\n var propsSplit = propsStr.split(/\\s*,\\s*|\\s+/);\n for (var _i2 = 0; _i2 < propsSplit.length; _i2++) {\n var propName = propsSplit[_i2].trim();\n if (self.properties[propName]) {\n props.push(propName);\n } else {\n warn('`' + propName + '` is not a valid property name');\n }\n }\n if (props.length === 0) {\n return null;\n }\n }\n return {\n name: name,\n value: props,\n strValue: props.length === 0 ? 'none' : props.join(' '),\n bypass: propIsBypass\n };\n } else if (type.color) {\n var tuple = color2tuple(value);\n if (!tuple) {\n return null;\n }\n return {\n name: name,\n value: tuple,\n pfValue: tuple,\n strValue: 'rgb(' + tuple[0] + ',' + tuple[1] + ',' + tuple[2] + ')',\n // n.b. no spaces b/c of multiple support\n bypass: propIsBypass\n };\n } else if (type.regex || type.regexes) {\n // first check enums\n if (type.enums) {\n var enumProp = checkEnums();\n if (enumProp) {\n return enumProp;\n }\n }\n var regexes = type.regexes ? type.regexes : [type.regex];\n for (var _i3 = 0; _i3 < regexes.length; _i3++) {\n var regex = new RegExp(regexes[_i3]); // make a regex from the type string\n var m = regex.exec(value);\n if (m) {\n // regex matches\n return {\n name: name,\n value: type.singleRegexMatchValue ? m[1] : m,\n strValue: '' + value,\n bypass: propIsBypass\n };\n }\n }\n return null; // didn't match any\n } else if (type.string) {\n // just return\n return {\n name: name,\n value: '' + value,\n strValue: '' + value,\n bypass: propIsBypass\n };\n } else if (type.enums) {\n // check enums last because it's a combo type in others\n return checkEnums();\n } else {\n return null; // not a type we can handle\n }\n};\n\nvar _Style = function Style(cy) {\n if (!(this instanceof _Style)) {\n return new _Style(cy);\n }\n if (!core(cy)) {\n error('A style must have a core reference');\n return;\n }\n this._private = {\n cy: cy,\n coreStyle: {}\n };\n this.length = 0;\n this.resetToDefault();\n};\nvar styfn = _Style.prototype;\nstyfn.instanceString = function () {\n return 'style';\n};\n\n// remove all contexts\nstyfn.clear = function () {\n var _p = this._private;\n var cy = _p.cy;\n var eles = cy.elements();\n for (var i = 0; i < this.length; i++) {\n this[i] = undefined;\n }\n this.length = 0;\n _p.contextStyles = {};\n _p.propDiffs = {};\n this.cleanElements(eles, true);\n eles.forEach(function (ele) {\n var ele_p = ele[0]._private;\n ele_p.styleDirty = true;\n ele_p.appliedInitStyle = false;\n });\n return this; // chaining\n};\nstyfn.resetToDefault = function () {\n this.clear();\n this.addDefaultStylesheet();\n return this;\n};\n\n// builds a style object for the 'core' selector\nstyfn.core = function (propName) {\n return this._private.coreStyle[propName] || this.getDefaultProperty(propName);\n};\n\n// create a new context from the specified selector string and switch to that context\nstyfn.selector = function (selectorStr) {\n // 'core' is a special case and does not need a selector\n var selector = selectorStr === 'core' ? null : new Selector(selectorStr);\n var i = this.length++; // new context means new index\n this[i] = {\n selector: selector,\n properties: [],\n mappedProperties: [],\n index: i\n };\n return this; // chaining\n};\n\n// add one or many css rules to the current context\nstyfn.css = function () {\n var self = this;\n var args = arguments;\n if (args.length === 1) {\n var map = args[0];\n for (var i = 0; i < self.properties.length; i++) {\n var prop = self.properties[i];\n var mapVal = map[prop.name];\n if (mapVal === undefined) {\n mapVal = map[dash2camel(prop.name)];\n }\n if (mapVal !== undefined) {\n this.cssRule(prop.name, mapVal);\n }\n }\n } else if (args.length === 2) {\n this.cssRule(args[0], args[1]);\n }\n\n // do nothing if args are invalid\n\n return this; // chaining\n};\nstyfn.style = styfn.css;\n\n// add a single css rule to the current context\nstyfn.cssRule = function (name, value) {\n // name-value pair\n var property = this.parse(name, value);\n\n // add property to current context if valid\n if (property) {\n var i = this.length - 1;\n this[i].properties.push(property);\n this[i].properties[property.name] = property; // allow access by name as well\n\n if (property.name.match(/pie-(\\d+)-background-size/) && property.value) {\n this._private.hasPie = true;\n }\n if (property.name.match(/stripe-(\\d+)-background-size/) && property.value) {\n this._private.hasStripe = true;\n }\n if (property.mapped) {\n this[i].mappedProperties.push(property);\n }\n\n // add to core style if necessary\n var currentSelectorIsCore = !this[i].selector;\n if (currentSelectorIsCore) {\n this._private.coreStyle[property.name] = property;\n }\n }\n return this; // chaining\n};\nstyfn.append = function (style) {\n if (stylesheet(style)) {\n style.appendToStyle(this);\n } else if (array(style)) {\n this.appendFromJson(style);\n } else if (string(style)) {\n this.appendFromString(style);\n } // you probably wouldn't want to append a Style, since you'd duplicate the default parts\n\n return this;\n};\n\n// static function\n_Style.fromJson = function (cy, json) {\n var style = new _Style(cy);\n style.fromJson(json);\n return style;\n};\n_Style.fromString = function (cy, string) {\n return new _Style(cy).fromString(string);\n};\n[styfn$8, styfn$7, styfn$6, styfn$5, styfn$4, styfn$3, styfn$2, styfn$1].forEach(function (props) {\n extend(styfn, props);\n});\n_Style.types = styfn.types;\n_Style.properties = styfn.properties;\n_Style.propertyGroups = styfn.propertyGroups;\n_Style.propertyGroupNames = styfn.propertyGroupNames;\n_Style.propertyGroupKeys = styfn.propertyGroupKeys;\n\nvar corefn$2 = {\n style: function style(newStyle) {\n if (newStyle) {\n var s = this.setStyle(newStyle);\n s.update();\n }\n return this._private.style;\n },\n setStyle: function setStyle(style) {\n var _p = this._private;\n if (stylesheet(style)) {\n _p.style = style.generateStyle(this);\n } else if (array(style)) {\n _p.style = _Style.fromJson(this, style);\n } else if (string(style)) {\n _p.style = _Style.fromString(this, style);\n } else {\n _p.style = _Style(this);\n }\n return _p.style;\n },\n // e.g. cy.data() changed => recalc ele mappers\n updateStyle: function updateStyle() {\n this.mutableElements().updateStyle(); // just send to all eles\n }\n};\n\nvar defaultSelectionType = 'single';\nvar corefn$1 = {\n autolock: function autolock(bool) {\n if (bool !== undefined) {\n this._private.autolock = bool ? true : false;\n } else {\n return this._private.autolock;\n }\n return this; // chaining\n },\n autoungrabify: function autoungrabify(bool) {\n if (bool !== undefined) {\n this._private.autoungrabify = bool ? true : false;\n } else {\n return this._private.autoungrabify;\n }\n return this; // chaining\n },\n autounselectify: function autounselectify(bool) {\n if (bool !== undefined) {\n this._private.autounselectify = bool ? true : false;\n } else {\n return this._private.autounselectify;\n }\n return this; // chaining\n },\n selectionType: function selectionType(selType) {\n var _p = this._private;\n if (_p.selectionType == null) {\n _p.selectionType = defaultSelectionType;\n }\n if (selType !== undefined) {\n if (selType === 'additive' || selType === 'single') {\n _p.selectionType = selType;\n }\n } else {\n return _p.selectionType;\n }\n return this;\n },\n panningEnabled: function panningEnabled(bool) {\n if (bool !== undefined) {\n this._private.panningEnabled = bool ? true : false;\n } else {\n return this._private.panningEnabled;\n }\n return this; // chaining\n },\n userPanningEnabled: function userPanningEnabled(bool) {\n if (bool !== undefined) {\n this._private.userPanningEnabled = bool ? true : false;\n } else {\n return this._private.userPanningEnabled;\n }\n return this; // chaining\n },\n zoomingEnabled: function zoomingEnabled(bool) {\n if (bool !== undefined) {\n this._private.zoomingEnabled = bool ? true : false;\n } else {\n return this._private.zoomingEnabled;\n }\n return this; // chaining\n },\n userZoomingEnabled: function userZoomingEnabled(bool) {\n if (bool !== undefined) {\n this._private.userZoomingEnabled = bool ? true : false;\n } else {\n return this._private.userZoomingEnabled;\n }\n return this; // chaining\n },\n boxSelectionEnabled: function boxSelectionEnabled(bool) {\n if (bool !== undefined) {\n this._private.boxSelectionEnabled = bool ? true : false;\n } else {\n return this._private.boxSelectionEnabled;\n }\n return this; // chaining\n },\n pan: function pan() {\n var args = arguments;\n var pan = this._private.pan;\n var dim, val, dims, x, y;\n switch (args.length) {\n case 0:\n // .pan()\n return pan;\n case 1:\n if (string(args[0])) {\n // .pan('x')\n dim = args[0];\n return pan[dim];\n } else if (plainObject(args[0])) {\n // .pan({ x: 0, y: 100 })\n if (!this._private.panningEnabled) {\n return this;\n }\n dims = args[0];\n x = dims.x;\n y = dims.y;\n if (number$1(x)) {\n pan.x = x;\n }\n if (number$1(y)) {\n pan.y = y;\n }\n this.emit('pan viewport');\n }\n break;\n case 2:\n // .pan('x', 100)\n if (!this._private.panningEnabled) {\n return this;\n }\n dim = args[0];\n val = args[1];\n if ((dim === 'x' || dim === 'y') && number$1(val)) {\n pan[dim] = val;\n }\n this.emit('pan viewport');\n break;\n // invalid\n }\n this.notify('viewport');\n return this; // chaining\n },\n panBy: function panBy(arg0, arg1) {\n var args = arguments;\n var pan = this._private.pan;\n var dim, val, dims, x, y;\n if (!this._private.panningEnabled) {\n return this;\n }\n switch (args.length) {\n case 1:\n if (plainObject(arg0)) {\n // .panBy({ x: 0, y: 100 })\n dims = args[0];\n x = dims.x;\n y = dims.y;\n if (number$1(x)) {\n pan.x += x;\n }\n if (number$1(y)) {\n pan.y += y;\n }\n this.emit('pan viewport');\n }\n break;\n case 2:\n // .panBy('x', 100)\n dim = arg0;\n val = arg1;\n if ((dim === 'x' || dim === 'y') && number$1(val)) {\n pan[dim] += val;\n }\n this.emit('pan viewport');\n break;\n // invalid\n }\n this.notify('viewport');\n return this; // chaining\n },\n gc: function gc() {\n this.notify('gc');\n },\n fit: function fit(elements, padding) {\n var viewportState = this.getFitViewport(elements, padding);\n if (viewportState) {\n var _p = this._private;\n _p.zoom = viewportState.zoom;\n _p.pan = viewportState.pan;\n this.emit('pan zoom viewport');\n this.notify('viewport');\n }\n return this; // chaining\n },\n getFitViewport: function getFitViewport(elements, padding) {\n if (number$1(elements) && padding === undefined) {\n // elements is optional\n padding = elements;\n elements = undefined;\n }\n if (!this._private.panningEnabled || !this._private.zoomingEnabled) {\n return;\n }\n var bb;\n if (string(elements)) {\n var sel = elements;\n elements = this.$(sel);\n } else if (boundingBox(elements)) {\n // assume bb\n var bbe = elements;\n bb = {\n x1: bbe.x1,\n y1: bbe.y1,\n x2: bbe.x2,\n y2: bbe.y2\n };\n bb.w = bb.x2 - bb.x1;\n bb.h = bb.y2 - bb.y1;\n } else if (!elementOrCollection(elements)) {\n elements = this.mutableElements();\n }\n if (elementOrCollection(elements) && elements.empty()) {\n return;\n } // can't fit to nothing\n\n bb = bb || elements.boundingBox();\n var w = this.width();\n var h = this.height();\n var zoom;\n padding = number$1(padding) ? padding : 0;\n if (!isNaN(w) && !isNaN(h) && w > 0 && h > 0 && !isNaN(bb.w) && !isNaN(bb.h) && bb.w > 0 && bb.h > 0) {\n zoom = Math.min((w - 2 * padding) / bb.w, (h - 2 * padding) / bb.h);\n\n // crop zoom\n zoom = zoom > this._private.maxZoom ? this._private.maxZoom : zoom;\n zoom = zoom < this._private.minZoom ? this._private.minZoom : zoom;\n var pan = {\n // now pan to middle\n x: (w - zoom * (bb.x1 + bb.x2)) / 2,\n y: (h - zoom * (bb.y1 + bb.y2)) / 2\n };\n return {\n zoom: zoom,\n pan: pan\n };\n }\n return;\n },\n zoomRange: function zoomRange(min, max) {\n var _p = this._private;\n if (max == null) {\n var opts = min;\n min = opts.min;\n max = opts.max;\n }\n if (number$1(min) && number$1(max) && min <= max) {\n _p.minZoom = min;\n _p.maxZoom = max;\n } else if (number$1(min) && max === undefined && min <= _p.maxZoom) {\n _p.minZoom = min;\n } else if (number$1(max) && min === undefined && max >= _p.minZoom) {\n _p.maxZoom = max;\n }\n return this;\n },\n minZoom: function minZoom(zoom) {\n if (zoom === undefined) {\n return this._private.minZoom;\n } else {\n return this.zoomRange({\n min: zoom\n });\n }\n },\n maxZoom: function maxZoom(zoom) {\n if (zoom === undefined) {\n return this._private.maxZoom;\n } else {\n return this.zoomRange({\n max: zoom\n });\n }\n },\n getZoomedViewport: function getZoomedViewport(params) {\n var _p = this._private;\n var currentPan = _p.pan;\n var currentZoom = _p.zoom;\n var pos; // in rendered px\n var zoom;\n var bail = false;\n if (!_p.zoomingEnabled) {\n // zooming disabled\n bail = true;\n }\n if (number$1(params)) {\n // then set the zoom\n zoom = params;\n } else if (plainObject(params)) {\n // then zoom about a point\n zoom = params.level;\n if (params.position != null) {\n pos = modelToRenderedPosition$1(params.position, currentZoom, currentPan);\n } else if (params.renderedPosition != null) {\n pos = params.renderedPosition;\n }\n if (pos != null && !_p.panningEnabled) {\n // panning disabled\n bail = true;\n }\n }\n\n // crop zoom\n zoom = zoom > _p.maxZoom ? _p.maxZoom : zoom;\n zoom = zoom < _p.minZoom ? _p.minZoom : zoom;\n\n // can't zoom with invalid params\n if (bail || !number$1(zoom) || zoom === currentZoom || pos != null && (!number$1(pos.x) || !number$1(pos.y))) {\n return null;\n }\n if (pos != null) {\n // set zoom about position\n var pan1 = currentPan;\n var zoom1 = currentZoom;\n var zoom2 = zoom;\n var pan2 = {\n x: -zoom2 / zoom1 * (pos.x - pan1.x) + pos.x,\n y: -zoom2 / zoom1 * (pos.y - pan1.y) + pos.y\n };\n return {\n zoomed: true,\n panned: true,\n zoom: zoom2,\n pan: pan2\n };\n } else {\n // just set the zoom\n return {\n zoomed: true,\n panned: false,\n zoom: zoom,\n pan: currentPan\n };\n }\n },\n zoom: function zoom(params) {\n if (params === undefined) {\n // get\n return this._private.zoom;\n } else {\n // set\n var vp = this.getZoomedViewport(params);\n var _p = this._private;\n if (vp == null || !vp.zoomed) {\n return this;\n }\n _p.zoom = vp.zoom;\n if (vp.panned) {\n _p.pan.x = vp.pan.x;\n _p.pan.y = vp.pan.y;\n }\n this.emit('zoom' + (vp.panned ? ' pan' : '') + ' viewport');\n this.notify('viewport');\n return this; // chaining\n }\n },\n viewport: function viewport(opts) {\n var _p = this._private;\n var zoomDefd = true;\n var panDefd = true;\n var events = []; // to trigger\n var zoomFailed = false;\n var panFailed = false;\n if (!opts) {\n return this;\n }\n if (!number$1(opts.zoom)) {\n zoomDefd = false;\n }\n if (!plainObject(opts.pan)) {\n panDefd = false;\n }\n if (!zoomDefd && !panDefd) {\n return this;\n }\n if (zoomDefd) {\n var z = opts.zoom;\n if (z < _p.minZoom || z > _p.maxZoom || !_p.zoomingEnabled) {\n zoomFailed = true;\n } else {\n _p.zoom = z;\n events.push('zoom');\n }\n }\n if (panDefd && (!zoomFailed || !opts.cancelOnFailedZoom) && _p.panningEnabled) {\n var p = opts.pan;\n if (number$1(p.x)) {\n _p.pan.x = p.x;\n panFailed = false;\n }\n if (number$1(p.y)) {\n _p.pan.y = p.y;\n panFailed = false;\n }\n if (!panFailed) {\n events.push('pan');\n }\n }\n if (events.length > 0) {\n events.push('viewport');\n this.emit(events.join(' '));\n this.notify('viewport');\n }\n return this; // chaining\n },\n center: function center(elements) {\n var pan = this.getCenterPan(elements);\n if (pan) {\n this._private.pan = pan;\n this.emit('pan viewport');\n this.notify('viewport');\n }\n return this; // chaining\n },\n getCenterPan: function getCenterPan(elements, zoom) {\n if (!this._private.panningEnabled) {\n return;\n }\n if (string(elements)) {\n var selector = elements;\n elements = this.mutableElements().filter(selector);\n } else if (!elementOrCollection(elements)) {\n elements = this.mutableElements();\n }\n if (elements.length === 0) {\n return;\n } // can't centre pan to nothing\n\n var bb = elements.boundingBox();\n var w = this.width();\n var h = this.height();\n zoom = zoom === undefined ? this._private.zoom : zoom;\n var pan = {\n // middle\n x: (w - zoom * (bb.x1 + bb.x2)) / 2,\n y: (h - zoom * (bb.y1 + bb.y2)) / 2\n };\n return pan;\n },\n reset: function reset() {\n if (!this._private.panningEnabled || !this._private.zoomingEnabled) {\n return this;\n }\n this.viewport({\n pan: {\n x: 0,\n y: 0\n },\n zoom: 1\n });\n return this; // chaining\n },\n invalidateSize: function invalidateSize() {\n this._private.sizeCache = null;\n },\n size: function size() {\n var _p = this._private;\n var container = _p.container;\n var cy = this;\n return _p.sizeCache = _p.sizeCache || (container ? function () {\n var style = cy.window().getComputedStyle(container);\n var val = function val(name) {\n return parseFloat(style.getPropertyValue(name));\n };\n return {\n width: container.clientWidth - val('padding-left') - val('padding-right'),\n height: container.clientHeight - val('padding-top') - val('padding-bottom')\n };\n }() : {\n // fallback if no container (not 0 b/c can be used for dividing etc)\n width: 1,\n height: 1\n });\n },\n width: function width() {\n return this.size().width;\n },\n height: function height() {\n return this.size().height;\n },\n extent: function extent() {\n var pan = this._private.pan;\n var zoom = this._private.zoom;\n var rb = this.renderedExtent();\n var b = {\n x1: (rb.x1 - pan.x) / zoom,\n x2: (rb.x2 - pan.x) / zoom,\n y1: (rb.y1 - pan.y) / zoom,\n y2: (rb.y2 - pan.y) / zoom\n };\n b.w = b.x2 - b.x1;\n b.h = b.y2 - b.y1;\n return b;\n },\n renderedExtent: function renderedExtent() {\n var width = this.width();\n var height = this.height();\n return {\n x1: 0,\n y1: 0,\n x2: width,\n y2: height,\n w: width,\n h: height\n };\n },\n multiClickDebounceTime: function multiClickDebounceTime(_int) {\n if (_int) this._private.multiClickDebounceTime = _int;else return this._private.multiClickDebounceTime;\n return this; // chaining\n }\n};\n\n// aliases\ncorefn$1.centre = corefn$1.center;\n\n// backwards compatibility\ncorefn$1.autolockNodes = corefn$1.autolock;\ncorefn$1.autoungrabifyNodes = corefn$1.autoungrabify;\n\nvar fn = {\n data: define.data({\n field: 'data',\n bindingEvent: 'data',\n allowBinding: true,\n allowSetting: true,\n settingEvent: 'data',\n settingTriggersEvent: true,\n triggerFnName: 'trigger',\n allowGetting: true,\n updateStyle: true\n }),\n removeData: define.removeData({\n field: 'data',\n event: 'data',\n triggerFnName: 'trigger',\n triggerEvent: true,\n updateStyle: true\n }),\n scratch: define.data({\n field: 'scratch',\n bindingEvent: 'scratch',\n allowBinding: true,\n allowSetting: true,\n settingEvent: 'scratch',\n settingTriggersEvent: true,\n triggerFnName: 'trigger',\n allowGetting: true,\n updateStyle: true\n }),\n removeScratch: define.removeData({\n field: 'scratch',\n event: 'scratch',\n triggerFnName: 'trigger',\n triggerEvent: true,\n updateStyle: true\n })\n};\n\n// aliases\nfn.attr = fn.data;\nfn.removeAttr = fn.removeData;\n\nvar Core = function Core(opts) {\n var cy = this;\n opts = extend({}, opts);\n var container = opts.container;\n\n // allow for passing a wrapped jquery object\n // e.g. cytoscape({ container: $('#cy') })\n if (container && !htmlElement(container) && htmlElement(container[0])) {\n container = container[0];\n }\n var reg = container ? container._cyreg : null; // e.g. already registered some info (e.g. readies) via jquery\n reg = reg || {};\n if (reg && reg.cy) {\n reg.cy.destroy();\n reg = {}; // old instance => replace reg completely\n }\n var readies = reg.readies = reg.readies || [];\n if (container) {\n container._cyreg = reg;\n } // make sure container assoc'd reg points to this cy\n reg.cy = cy;\n var head = _window !== undefined && container !== undefined && !opts.headless;\n var options = opts;\n options.layout = extend({\n name: head ? 'grid' : 'null'\n }, options.layout);\n options.renderer = extend({\n name: head ? 'canvas' : 'null'\n }, options.renderer);\n var defVal = function defVal(def, val, altVal) {\n if (val !== undefined) {\n return val;\n } else if (altVal !== undefined) {\n return altVal;\n } else {\n return def;\n }\n };\n var _p = this._private = {\n container: container,\n // html dom ele container\n ready: false,\n // whether ready has been triggered\n options: options,\n // cached options\n elements: new Collection(this),\n // elements in the graph\n listeners: [],\n // list of listeners\n aniEles: new Collection(this),\n // elements being animated\n data: options.data || {},\n // data for the core\n scratch: {},\n // scratch object for core\n layout: null,\n renderer: null,\n destroyed: false,\n // whether destroy was called\n notificationsEnabled: true,\n // whether notifications are sent to the renderer\n minZoom: 1e-50,\n maxZoom: 1e50,\n zoomingEnabled: defVal(true, options.zoomingEnabled),\n userZoomingEnabled: defVal(true, options.userZoomingEnabled),\n panningEnabled: defVal(true, options.panningEnabled),\n userPanningEnabled: defVal(true, options.userPanningEnabled),\n boxSelectionEnabled: defVal(true, options.boxSelectionEnabled),\n autolock: defVal(false, options.autolock, options.autolockNodes),\n autoungrabify: defVal(false, options.autoungrabify, options.autoungrabifyNodes),\n autounselectify: defVal(false, options.autounselectify),\n styleEnabled: options.styleEnabled === undefined ? head : options.styleEnabled,\n zoom: number$1(options.zoom) ? options.zoom : 1,\n pan: {\n x: plainObject(options.pan) && number$1(options.pan.x) ? options.pan.x : 0,\n y: plainObject(options.pan) && number$1(options.pan.y) ? options.pan.y : 0\n },\n animation: {\n // object for currently-running animations\n current: [],\n queue: []\n },\n hasCompoundNodes: false,\n multiClickDebounceTime: defVal(250, options.multiClickDebounceTime)\n };\n this.createEmitter();\n\n // set selection type\n this.selectionType(options.selectionType);\n\n // init zoom bounds\n this.zoomRange({\n min: options.minZoom,\n max: options.maxZoom\n });\n var loadExtData = function loadExtData(extData, next) {\n var anyIsPromise = extData.some(promise);\n if (anyIsPromise) {\n return Promise$1.all(extData).then(next); // load all data asynchronously, then exec rest of init\n } else {\n next(extData); // exec synchronously for convenience\n }\n };\n\n // start with the default stylesheet so we have something before loading an external stylesheet\n if (_p.styleEnabled) {\n cy.setStyle([]);\n }\n\n // create the renderer\n var rendererOptions = extend({}, options, options.renderer); // allow rendering hints in top level options\n cy.initRenderer(rendererOptions);\n var setElesAndLayout = function setElesAndLayout(elements, onload, ondone) {\n cy.notifications(false);\n\n // remove old elements\n var oldEles = cy.mutableElements();\n if (oldEles.length > 0) {\n oldEles.remove();\n }\n if (elements != null) {\n if (plainObject(elements) || array(elements)) {\n cy.add(elements);\n }\n }\n cy.one('layoutready', function (e) {\n cy.notifications(true);\n cy.emit(e); // we missed this event by turning notifications off, so pass it on\n\n cy.one('load', onload);\n cy.emitAndNotify('load');\n }).one('layoutstop', function () {\n cy.one('done', ondone);\n cy.emit('done');\n });\n var layoutOpts = extend({}, cy._private.options.layout);\n layoutOpts.eles = cy.elements();\n cy.layout(layoutOpts).run();\n };\n loadExtData([options.style, options.elements], function (thens) {\n var initStyle = thens[0];\n var initEles = thens[1];\n\n // init style\n if (_p.styleEnabled) {\n cy.style().append(initStyle);\n }\n\n // initial load\n setElesAndLayout(initEles, function () {\n // onready\n cy.startAnimationLoop();\n _p.ready = true;\n\n // if a ready callback is specified as an option, the bind it\n if (fn$6(options.ready)) {\n cy.on('ready', options.ready);\n }\n\n // bind all the ready handlers registered before creating this instance\n for (var i = 0; i < readies.length; i++) {\n var fn = readies[i];\n cy.on('ready', fn);\n }\n if (reg) {\n reg.readies = [];\n } // clear b/c we've bound them all and don't want to keep it around in case a new core uses the same div etc\n\n cy.emit('ready');\n }, options.done);\n });\n};\nvar corefn = Core.prototype; // short alias\n\nextend(corefn, {\n instanceString: function instanceString() {\n return 'core';\n },\n isReady: function isReady() {\n return this._private.ready;\n },\n destroyed: function destroyed() {\n return this._private.destroyed;\n },\n ready: function ready(fn) {\n if (this.isReady()) {\n this.emitter().emit('ready', [], fn); // just calls fn as though triggered via ready event\n } else {\n this.on('ready', fn);\n }\n return this;\n },\n destroy: function destroy() {\n var cy = this;\n if (cy.destroyed()) return;\n cy.stopAnimationLoop();\n cy.destroyRenderer();\n this.emit('destroy');\n cy._private.destroyed = true;\n return cy;\n },\n hasElementWithId: function hasElementWithId(id) {\n return this._private.elements.hasElementWithId(id);\n },\n getElementById: function getElementById(id) {\n return this._private.elements.getElementById(id);\n },\n hasCompoundNodes: function hasCompoundNodes() {\n return this._private.hasCompoundNodes;\n },\n headless: function headless() {\n return this._private.renderer.isHeadless();\n },\n styleEnabled: function styleEnabled() {\n return this._private.styleEnabled;\n },\n addToPool: function addToPool(eles) {\n this._private.elements.merge(eles);\n return this; // chaining\n },\n removeFromPool: function removeFromPool(eles) {\n this._private.elements.unmerge(eles);\n return this;\n },\n container: function container() {\n return this._private.container || null;\n },\n window: function window() {\n var container = this._private.container;\n if (container == null) return _window;\n var ownerDocument = this._private.container.ownerDocument;\n if (ownerDocument === undefined || ownerDocument == null) {\n return _window;\n }\n return ownerDocument.defaultView || _window;\n },\n mount: function mount(container) {\n if (container == null) {\n return;\n }\n var cy = this;\n var _p = cy._private;\n var options = _p.options;\n if (!htmlElement(container) && htmlElement(container[0])) {\n container = container[0];\n }\n cy.stopAnimationLoop();\n cy.destroyRenderer();\n _p.container = container;\n _p.styleEnabled = true;\n cy.invalidateSize();\n cy.initRenderer(extend({}, options, options.renderer, {\n // allow custom renderer name to be re-used, otherwise use canvas\n name: options.renderer.name === 'null' ? 'canvas' : options.renderer.name\n }));\n cy.startAnimationLoop();\n cy.style(options.style);\n cy.emit('mount');\n return cy;\n },\n unmount: function unmount() {\n var cy = this;\n cy.stopAnimationLoop();\n cy.destroyRenderer();\n cy.initRenderer({\n name: 'null'\n });\n cy.emit('unmount');\n return cy;\n },\n options: function options() {\n return copy(this._private.options);\n },\n json: function json(obj) {\n var cy = this;\n var _p = cy._private;\n var eles = cy.mutableElements();\n var getFreshRef = function getFreshRef(ele) {\n return cy.getElementById(ele.id());\n };\n if (plainObject(obj)) {\n // set\n\n cy.startBatch();\n if (obj.elements) {\n var idInJson = {};\n var updateEles = function updateEles(jsons, gr) {\n var toAdd = [];\n var toMod = [];\n for (var i = 0; i < jsons.length; i++) {\n var json = jsons[i];\n if (!json.data.id) {\n warn('cy.json() cannot handle elements without an ID attribute');\n continue;\n }\n var id = '' + json.data.id; // id must be string\n var ele = cy.getElementById(id);\n idInJson[id] = true;\n if (ele.length !== 0) {\n // existing element should be updated\n toMod.push({\n ele: ele,\n json: json\n });\n } else {\n // otherwise should be added\n if (gr) {\n json.group = gr;\n toAdd.push(json);\n } else {\n toAdd.push(json);\n }\n }\n }\n cy.add(toAdd);\n for (var _i = 0; _i < toMod.length; _i++) {\n var _toMod$_i = toMod[_i],\n _ele = _toMod$_i.ele,\n _json = _toMod$_i.json;\n _ele.json(_json);\n }\n };\n if (array(obj.elements)) {\n // elements: []\n updateEles(obj.elements);\n } else {\n // elements: { nodes: [], edges: [] }\n var grs = ['nodes', 'edges'];\n for (var i = 0; i < grs.length; i++) {\n var gr = grs[i];\n var elements = obj.elements[gr];\n if (array(elements)) {\n updateEles(elements, gr);\n }\n }\n }\n var parentsToRemove = cy.collection();\n eles.filter(function (ele) {\n return !idInJson[ele.id()];\n }).forEach(function (ele) {\n if (ele.isParent()) {\n parentsToRemove.merge(ele);\n } else {\n ele.remove();\n }\n });\n\n // so that children are not removed w/parent\n parentsToRemove.forEach(function (ele) {\n return ele.children().move({\n parent: null\n });\n });\n\n // intermediate parents may be moved by prior line, so make sure we remove by fresh refs\n parentsToRemove.forEach(function (ele) {\n return getFreshRef(ele).remove();\n });\n }\n if (obj.style) {\n cy.style(obj.style);\n }\n if (obj.zoom != null && obj.zoom !== _p.zoom) {\n cy.zoom(obj.zoom);\n }\n if (obj.pan) {\n if (obj.pan.x !== _p.pan.x || obj.pan.y !== _p.pan.y) {\n cy.pan(obj.pan);\n }\n }\n if (obj.data) {\n cy.data(obj.data);\n }\n var fields = ['minZoom', 'maxZoom', 'zoomingEnabled', 'userZoomingEnabled', 'panningEnabled', 'userPanningEnabled', 'boxSelectionEnabled', 'autolock', 'autoungrabify', 'autounselectify', 'multiClickDebounceTime'];\n for (var _i2 = 0; _i2 < fields.length; _i2++) {\n var f = fields[_i2];\n if (obj[f] != null) {\n cy[f](obj[f]);\n }\n }\n cy.endBatch();\n return this; // chaining\n } else {\n // get\n var flat = !!obj;\n var json = {};\n if (flat) {\n json.elements = this.elements().map(function (ele) {\n return ele.json();\n });\n } else {\n json.elements = {};\n eles.forEach(function (ele) {\n var group = ele.group();\n if (!json.elements[group]) {\n json.elements[group] = [];\n }\n json.elements[group].push(ele.json());\n });\n }\n if (this._private.styleEnabled) {\n json.style = cy.style().json();\n }\n json.data = copy(cy.data());\n var options = _p.options;\n json.zoomingEnabled = _p.zoomingEnabled;\n json.userZoomingEnabled = _p.userZoomingEnabled;\n json.zoom = _p.zoom;\n json.minZoom = _p.minZoom;\n json.maxZoom = _p.maxZoom;\n json.panningEnabled = _p.panningEnabled;\n json.userPanningEnabled = _p.userPanningEnabled;\n json.pan = copy(_p.pan);\n json.boxSelectionEnabled = _p.boxSelectionEnabled;\n json.renderer = copy(options.renderer);\n json.hideEdgesOnViewport = options.hideEdgesOnViewport;\n json.textureOnViewport = options.textureOnViewport;\n json.wheelSensitivity = options.wheelSensitivity;\n json.motionBlur = options.motionBlur;\n json.multiClickDebounceTime = options.multiClickDebounceTime;\n return json;\n }\n }\n});\ncorefn.$id = corefn.getElementById;\n[corefn$9, corefn$8, elesfn, corefn$7, corefn$6, corefn$5, corefn$4, corefn$3, corefn$2, corefn$1, fn].forEach(function (props) {\n extend(corefn, props);\n});\n\n/* eslint-disable no-unused-vars */\nvar defaults$7 = {\n fit: true,\n // whether to fit the viewport to the graph\n directed: false,\n // whether the tree is directed downwards (or edges can point in any direction if false)\n direction: 'downward',\n // determines the direction in which the tree structure is drawn. The possible values are 'downward', 'upward', 'rightward', or 'leftward'.\n padding: 30,\n // padding on fit\n circle: false,\n // put depths in concentric circles if true, put depths top down if false\n grid: false,\n // whether to create an even grid into which the DAG is placed (circle:false only)\n spacingFactor: 1.75,\n // positive spacing factor, larger => more space between nodes (N.B. n/a if causes overlap)\n boundingBox: undefined,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: true,\n // prevents node overlap, may overflow boundingBox if not enough space\n nodeDimensionsIncludeLabels: false,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n roots: undefined,\n // the roots of the trees\n depthSort: undefined,\n // a sorting function to order nodes at equal depth. e.g. function(a, b){ return a.data('weight') - b.data('weight') }\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled,\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts\n};\nvar deprecatedOptionDefaults = {\n maximal: false,\n // whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only); setting acyclic to true sets maximal to true also\n acyclic: false // whether the tree is acyclic and thus a node could be shifted (due to the maximal option) multiple times without causing an infinite loop; setting to true sets maximal to true also; if you are uncertain whether a tree is acyclic, set to false to avoid potential infinite loops\n};\n\n/* eslint-enable */\n\nvar getInfo = function getInfo(ele) {\n return ele.scratch('breadthfirst');\n};\nvar setInfo = function setInfo(ele, obj) {\n return ele.scratch('breadthfirst', obj);\n};\nfunction BreadthFirstLayout(options) {\n this.options = extend({}, defaults$7, deprecatedOptionDefaults, options);\n}\nBreadthFirstLayout.prototype.run = function () {\n var options = this.options;\n var cy = options.cy;\n var eles = options.eles;\n var nodes = eles.nodes().filter(function (n) {\n return n.isChildless();\n });\n var graph = eles;\n var directed = options.directed;\n var maximal = options.acyclic || options.maximal || options.maximalAdjustments > 0; // maximalAdjustments for compat. w/ old code; also, setting acyclic to true sets maximal to true\n\n var hasBoundingBox = !!options.boundingBox;\n var bb = makeBoundingBox(hasBoundingBox ? options.boundingBox : structuredClone(cy.extent()));\n var roots;\n if (elementOrCollection(options.roots)) {\n roots = options.roots;\n } else if (array(options.roots)) {\n var rootsArray = [];\n for (var i = 0; i < options.roots.length; i++) {\n var id = options.roots[i];\n var ele = cy.getElementById(id);\n rootsArray.push(ele);\n }\n roots = cy.collection(rootsArray);\n } else if (string(options.roots)) {\n roots = cy.$(options.roots);\n } else {\n if (directed) {\n roots = nodes.roots();\n } else {\n var components = eles.components();\n roots = cy.collection();\n var _loop = function _loop() {\n var comp = components[_i];\n var maxDegree = comp.maxDegree(false);\n var compRoots = comp.filter(function (ele) {\n return ele.degree(false) === maxDegree;\n });\n roots = roots.add(compRoots);\n };\n for (var _i = 0; _i < components.length; _i++) {\n _loop();\n }\n }\n }\n var depths = [];\n var foundByBfs = {};\n var addToDepth = function addToDepth(ele, d) {\n if (depths[d] == null) {\n depths[d] = [];\n }\n var i = depths[d].length;\n depths[d].push(ele);\n setInfo(ele, {\n index: i,\n depth: d\n });\n };\n var changeDepth = function changeDepth(ele, newDepth) {\n var _getInfo = getInfo(ele),\n depth = _getInfo.depth,\n index = _getInfo.index;\n depths[depth][index] = null;\n\n // add only childless nodes\n if (ele.isChildless()) addToDepth(ele, newDepth);\n };\n\n // find the depths of the nodes\n graph.bfs({\n roots: roots,\n directed: options.directed,\n visit: function visit(node, edge, pNode, i, depth) {\n var ele = node[0];\n var id = ele.id();\n\n // add only childless nodes\n if (ele.isChildless()) addToDepth(ele, depth);\n foundByBfs[id] = true;\n }\n });\n\n // check for nodes not found by bfs\n var orphanNodes = [];\n for (var _i2 = 0; _i2 < nodes.length; _i2++) {\n var _ele = nodes[_i2];\n if (foundByBfs[_ele.id()]) {\n continue;\n } else {\n orphanNodes.push(_ele);\n }\n }\n\n // assign the nodes a depth and index\n var assignDepthsAt = function assignDepthsAt(i) {\n var eles = depths[i];\n for (var j = 0; j < eles.length; j++) {\n var _ele2 = eles[j];\n if (_ele2 == null) {\n eles.splice(j, 1);\n j--;\n continue;\n }\n setInfo(_ele2, {\n depth: i,\n index: j\n });\n }\n };\n var adjustMaximally = function adjustMaximally(ele, shifted) {\n var eInfo = getInfo(ele);\n var incomers = ele.incomers().filter(function (el) {\n return el.isNode() && eles.has(el);\n });\n var maxDepth = -1;\n var id = ele.id();\n for (var k = 0; k < incomers.length; k++) {\n var incmr = incomers[k];\n var iInfo = getInfo(incmr);\n maxDepth = Math.max(maxDepth, iInfo.depth);\n }\n if (eInfo.depth <= maxDepth) {\n if (!options.acyclic && shifted[id]) {\n return null;\n }\n var newDepth = maxDepth + 1;\n changeDepth(ele, newDepth);\n shifted[id] = newDepth;\n return true;\n }\n return false;\n };\n\n // for the directed case, try to make the edges all go down (i.e. depth i => depth i + 1)\n if (directed && maximal) {\n var Q = [];\n var shifted = {};\n var enqueue = function enqueue(n) {\n return Q.push(n);\n };\n var dequeue = function dequeue() {\n return Q.shift();\n };\n nodes.forEach(function (n) {\n return Q.push(n);\n });\n while (Q.length > 0) {\n var _ele3 = dequeue();\n var didShift = adjustMaximally(_ele3, shifted);\n if (didShift) {\n _ele3.outgoers().filter(function (el) {\n return el.isNode() && eles.has(el);\n }).forEach(enqueue);\n } else if (didShift === null) {\n warn('Detected double maximal shift for node `' + _ele3.id() + '`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.');\n break; // exit on failure\n }\n }\n }\n\n // find min distance we need to leave between nodes\n var minDistance = 0;\n if (options.avoidOverlap) {\n for (var _i3 = 0; _i3 < nodes.length; _i3++) {\n var n = nodes[_i3];\n var nbb = n.layoutDimensions(options);\n var w = nbb.w;\n var h = nbb.h;\n minDistance = Math.max(minDistance, w, h);\n }\n }\n\n // get the weighted percent for an element based on its connectivity to other levels\n var cachedWeightedPercent = {};\n var getWeightedPercent = function getWeightedPercent(ele) {\n if (cachedWeightedPercent[ele.id()]) {\n return cachedWeightedPercent[ele.id()];\n }\n var eleDepth = getInfo(ele).depth;\n var neighbors = ele.neighborhood();\n var percent = 0;\n var samples = 0;\n for (var _i4 = 0; _i4 < neighbors.length; _i4++) {\n var neighbor = neighbors[_i4];\n if (neighbor.isEdge() || neighbor.isParent() || !nodes.has(neighbor)) {\n continue;\n }\n var bf = getInfo(neighbor);\n if (bf == null) {\n continue;\n }\n var index = bf.index;\n var depth = bf.depth;\n\n // unassigned neighbours shouldn't affect the ordering\n if (index == null || depth == null) {\n continue;\n }\n var nDepth = depths[depth].length;\n if (depth < eleDepth) {\n // only get influenced by elements above\n percent += index / nDepth;\n samples++;\n }\n }\n samples = Math.max(1, samples);\n percent = percent / samples;\n if (samples === 0) {\n // put lone nodes at the start\n percent = 0;\n }\n cachedWeightedPercent[ele.id()] = percent;\n return percent;\n };\n\n // rearrange the indices in each depth level based on connectivity\n var sortFn = function sortFn(a, b) {\n var apct = getWeightedPercent(a);\n var bpct = getWeightedPercent(b);\n var diff = apct - bpct;\n if (diff === 0) {\n return ascending(a.id(), b.id()); // make sure sort doesn't have don't-care comparisons\n } else {\n return diff;\n }\n };\n if (options.depthSort !== undefined) {\n sortFn = options.depthSort;\n }\n var depthsLen = depths.length;\n\n // sort each level to make connected nodes closer\n for (var _i5 = 0; _i5 < depthsLen; _i5++) {\n depths[_i5].sort(sortFn);\n assignDepthsAt(_i5);\n }\n\n // assign orphan nodes to a new top-level depth\n var orphanDepth = [];\n for (var _i6 = 0; _i6 < orphanNodes.length; _i6++) {\n orphanDepth.push(orphanNodes[_i6]);\n }\n var assignDepths = function assignDepths() {\n for (var _i7 = 0; _i7 < depthsLen; _i7++) {\n assignDepthsAt(_i7);\n }\n };\n\n // add a new top-level depth only when there are orphan nodes\n if (orphanDepth.length) {\n depths.unshift(orphanDepth);\n depthsLen = depths.length;\n assignDepths();\n }\n var biggestDepthSize = 0;\n for (var _i8 = 0; _i8 < depthsLen; _i8++) {\n biggestDepthSize = Math.max(depths[_i8].length, biggestDepthSize);\n }\n var center = {\n x: bb.x1 + bb.w / 2,\n y: bb.y1 + bb.h / 2\n };\n\n // average node size\n var aveNodeSize = nodes.reduce(function (acc, node) {\n return function (box) {\n return {\n w: acc.w === -1 ? box.w : (acc.w + box.w) / 2,\n h: acc.h === -1 ? box.h : (acc.h + box.h) / 2\n };\n }(node.boundingBox({\n includeLabels: options.nodeDimensionsIncludeLabels\n }));\n }, {\n w: -1,\n h: -1\n });\n var distanceY = Math.max(\n // only one depth\n depthsLen === 1 ? 0 :\n // inside a bounding box, no need for top & bottom padding\n hasBoundingBox ? (bb.h - options.padding * 2 - aveNodeSize.h) / (depthsLen - 1) : (bb.h - options.padding * 2 - aveNodeSize.h) / (depthsLen + 1), minDistance);\n var maxDepthSize = depths.reduce(function (max, eles) {\n return Math.max(max, eles.length);\n }, 0);\n var getPositionTopBottom = function getPositionTopBottom(ele) {\n var _getInfo2 = getInfo(ele),\n depth = _getInfo2.depth,\n index = _getInfo2.index;\n if (options.circle) {\n var radiusStepSize = Math.min(bb.w / 2 / depthsLen, bb.h / 2 / depthsLen);\n radiusStepSize = Math.max(radiusStepSize, minDistance);\n var radius = radiusStepSize * depth + radiusStepSize - (depthsLen > 0 && depths[0].length <= 3 ? radiusStepSize / 2 : 0);\n var theta = 2 * Math.PI / depths[depth].length * index;\n if (depth === 0 && depths[0].length === 1) {\n radius = 1;\n }\n return {\n x: center.x + radius * Math.cos(theta),\n y: center.y + radius * Math.sin(theta)\n };\n } else {\n var depthSize = depths[depth].length;\n var distanceX = Math.max(\n // only one depth\n depthSize === 1 ? 0 :\n // inside a bounding box, no need for left & right padding\n hasBoundingBox ? (bb.w - options.padding * 2 - aveNodeSize.w) / ((options.grid ? maxDepthSize : depthSize) - 1) : (bb.w - options.padding * 2 - aveNodeSize.w) / ((options.grid ? maxDepthSize : depthSize) + 1), minDistance);\n var epos = {\n x: center.x + (index + 1 - (depthSize + 1) / 2) * distanceX,\n y: center.y + (depth + 1 - (depthsLen + 1) / 2) * distanceY\n };\n return epos;\n }\n };\n var rotateDegrees = {\n 'downward': 0,\n 'leftward': 90,\n 'upward': 180,\n 'rightward': -90\n };\n if (Object.keys(rotateDegrees).indexOf(options.direction) === -1) {\n error(\"Invalid direction '\".concat(options.direction, \"' specified for breadthfirst layout. Valid values are: \").concat(Object.keys(rotateDegrees).join(', ')));\n }\n var getPosition = function getPosition(ele) {\n return rotatePosAndSkewByBox(getPositionTopBottom(ele), bb, rotateDegrees[options.direction]);\n };\n eles.nodes().layoutPositions(this, options, getPosition);\n return this; // chaining\n};\n\nvar defaults$6 = {\n fit: true,\n // whether to fit the viewport to the graph\n padding: 30,\n // the padding on fit\n boundingBox: undefined,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: true,\n // prevents node overlap, may overflow boundingBox and radius if not enough space\n nodeDimensionsIncludeLabels: false,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n spacingFactor: undefined,\n // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n radius: undefined,\n // the radius of the circle\n startAngle: 3 / 2 * Math.PI,\n // where nodes start in radians\n sweep: undefined,\n // how many radians should be between the first and last node (defaults to full circle)\n clockwise: true,\n // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)\n sort: undefined,\n // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') }\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts \n};\nfunction CircleLayout(options) {\n this.options = extend({}, defaults$6, options);\n}\nCircleLayout.prototype.run = function () {\n var params = this.options;\n var options = params;\n var cy = params.cy;\n var eles = options.eles;\n var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise;\n var nodes = eles.nodes().not(':parent');\n if (options.sort) {\n nodes = nodes.sort(options.sort);\n }\n var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : {\n x1: 0,\n y1: 0,\n w: cy.width(),\n h: cy.height()\n });\n var center = {\n x: bb.x1 + bb.w / 2,\n y: bb.y1 + bb.h / 2\n };\n var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / nodes.length : options.sweep;\n var dTheta = sweep / Math.max(1, nodes.length - 1);\n var r;\n var minDistance = 0;\n for (var i = 0; i < nodes.length; i++) {\n var n = nodes[i];\n var nbb = n.layoutDimensions(options);\n var w = nbb.w;\n var h = nbb.h;\n minDistance = Math.max(minDistance, w, h);\n }\n if (number$1(options.radius)) {\n r = options.radius;\n } else if (nodes.length <= 1) {\n r = 0;\n } else {\n r = Math.min(bb.h, bb.w) / 2 - minDistance;\n }\n\n // calculate the radius\n if (nodes.length > 1 && options.avoidOverlap) {\n // but only if more than one node (can't overlap)\n minDistance *= 1.75; // just to have some nice spacing\n\n var dcos = Math.cos(dTheta) - Math.cos(0);\n var dsin = Math.sin(dTheta) - Math.sin(0);\n var rMin = Math.sqrt(minDistance * minDistance / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping\n r = Math.max(rMin, r);\n }\n var getPos = function getPos(ele, i) {\n var theta = options.startAngle + i * dTheta * (clockwise ? 1 : -1);\n var rx = r * Math.cos(theta);\n var ry = r * Math.sin(theta);\n var pos = {\n x: center.x + rx,\n y: center.y + ry\n };\n return pos;\n };\n eles.nodes().layoutPositions(this, options, getPos);\n return this; // chaining\n};\n\nvar defaults$5 = {\n fit: true,\n // whether to fit the viewport to the graph\n padding: 30,\n // the padding on fit\n startAngle: 3 / 2 * Math.PI,\n // where nodes start in radians\n sweep: undefined,\n // how many radians should be between the first and last node (defaults to full circle)\n clockwise: true,\n // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)\n equidistant: false,\n // whether levels have an equal radial distance betwen them, may cause bounding box overflow\n minNodeSpacing: 10,\n // min spacing between outside of nodes (used for radius adjustment)\n boundingBox: undefined,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: true,\n // prevents node overlap, may overflow boundingBox if not enough space\n nodeDimensionsIncludeLabels: false,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n height: undefined,\n // height of layout area (overrides container height)\n width: undefined,\n // width of layout area (overrides container width)\n spacingFactor: undefined,\n // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n concentric: function concentric(node) {\n // returns numeric value for each node, placing higher nodes in levels towards the centre\n return node.degree();\n },\n levelWidth: function levelWidth(nodes) {\n // the variation of concentric values in each level\n return nodes.maxDegree() / 4;\n },\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts\n};\nfunction ConcentricLayout(options) {\n this.options = extend({}, defaults$5, options);\n}\nConcentricLayout.prototype.run = function () {\n var params = this.options;\n var options = params;\n var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise;\n var cy = params.cy;\n var eles = options.eles;\n var nodes = eles.nodes().not(':parent');\n var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : {\n x1: 0,\n y1: 0,\n w: cy.width(),\n h: cy.height()\n });\n var center = {\n x: bb.x1 + bb.w / 2,\n y: bb.y1 + bb.h / 2\n };\n var nodeValues = []; // { node, value }\n var maxNodeSize = 0;\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n var value = undefined;\n\n // calculate the node value\n value = options.concentric(node);\n nodeValues.push({\n value: value,\n node: node\n });\n\n // for style mapping\n node._private.scratch.concentric = value;\n }\n\n // in case we used the `concentric` in style\n nodes.updateStyle();\n\n // calculate max size now based on potentially updated mappers\n for (var _i = 0; _i < nodes.length; _i++) {\n var _node = nodes[_i];\n var nbb = _node.layoutDimensions(options);\n maxNodeSize = Math.max(maxNodeSize, nbb.w, nbb.h);\n }\n\n // sort node values in descreasing order\n nodeValues.sort(function (a, b) {\n return b.value - a.value;\n });\n var levelWidth = options.levelWidth(nodes);\n\n // put the values into levels\n var levels = [[]];\n var currentLevel = levels[0];\n for (var _i2 = 0; _i2 < nodeValues.length; _i2++) {\n var val = nodeValues[_i2];\n if (currentLevel.length > 0) {\n var diff = Math.abs(currentLevel[0].value - val.value);\n if (diff >= levelWidth) {\n currentLevel = [];\n levels.push(currentLevel);\n }\n }\n currentLevel.push(val);\n }\n\n // create positions from levels\n\n var minDist = maxNodeSize + options.minNodeSpacing; // min dist between nodes\n\n if (!options.avoidOverlap) {\n // then strictly constrain to bb\n var firstLvlHasMulti = levels.length > 0 && levels[0].length > 1;\n var maxR = Math.min(bb.w, bb.h) / 2 - minDist;\n var rStep = maxR / (levels.length + firstLvlHasMulti ? 1 : 0);\n minDist = Math.min(minDist, rStep);\n }\n\n // find the metrics for each level\n var r = 0;\n for (var _i3 = 0; _i3 < levels.length; _i3++) {\n var level = levels[_i3];\n var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / level.length : options.sweep;\n var dTheta = level.dTheta = sweep / Math.max(1, level.length - 1);\n\n // calculate the radius\n if (level.length > 1 && options.avoidOverlap) {\n // but only if more than one node (can't overlap)\n var dcos = Math.cos(dTheta) - Math.cos(0);\n var dsin = Math.sin(dTheta) - Math.sin(0);\n var rMin = Math.sqrt(minDist * minDist / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping\n\n r = Math.max(rMin, r);\n }\n level.r = r;\n r += minDist;\n }\n if (options.equidistant) {\n var rDeltaMax = 0;\n var _r = 0;\n for (var _i4 = 0; _i4 < levels.length; _i4++) {\n var _level = levels[_i4];\n var rDelta = _level.r - _r;\n rDeltaMax = Math.max(rDeltaMax, rDelta);\n }\n _r = 0;\n for (var _i5 = 0; _i5 < levels.length; _i5++) {\n var _level2 = levels[_i5];\n if (_i5 === 0) {\n _r = _level2.r;\n }\n _level2.r = _r;\n _r += rDeltaMax;\n }\n }\n\n // calculate the node positions\n var pos = {}; // id => position\n for (var _i6 = 0; _i6 < levels.length; _i6++) {\n var _level3 = levels[_i6];\n var _dTheta = _level3.dTheta;\n var _r2 = _level3.r;\n for (var j = 0; j < _level3.length; j++) {\n var _val = _level3[j];\n var theta = options.startAngle + (clockwise ? 1 : -1) * _dTheta * j;\n var p = {\n x: center.x + _r2 * Math.cos(theta),\n y: center.y + _r2 * Math.sin(theta)\n };\n pos[_val.node.id()] = p;\n }\n }\n\n // position the nodes\n eles.nodes().layoutPositions(this, options, function (ele) {\n var id = ele.id();\n return pos[id];\n });\n return this; // chaining\n};\n\n/*\nThe CoSE layout was written by Gerardo Huck.\nhttps://www.linkedin.com/in/gerardohuck/\n\nBased on the following article:\nhttp://dl.acm.org/citation.cfm?id=1498047\n\nModifications tracked on Github.\n*/\n\nvar DEBUG;\n\n/**\n * @brief : default layout options\n */\nvar defaults$4 = {\n // Called on `layoutready`\n ready: function ready() {},\n // Called on `layoutstop`\n stop: function stop() {},\n // Whether to animate while running the layout\n // true : Animate continuously as the layout is running\n // false : Just show the end result\n // 'end' : Animate with the end result, from the initial positions to the end positions\n animate: true,\n // Easing of the animation for animate:'end'\n animationEasing: undefined,\n // The duration of the animation for animate:'end'\n animationDuration: undefined,\n // A function that determines whether the node should be animated\n // All nodes animated by default on animate enabled\n // Non-animated nodes are positioned immediately when the layout starts\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // The layout animates only after this many milliseconds for animate:true\n // (prevents flashing on fast runs)\n animationThreshold: 250,\n // Number of iterations between consecutive screen positions update\n refresh: 20,\n // Whether to fit the network view after when done\n fit: true,\n // Padding on fit\n padding: 30,\n // Constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n boundingBox: undefined,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n nodeDimensionsIncludeLabels: false,\n // Randomize the initial positions of the nodes (true) or use existing positions (false)\n randomize: false,\n // Extra spacing between components in non-compound graphs\n componentSpacing: 40,\n // Node repulsion (non overlapping) multiplier\n nodeRepulsion: function nodeRepulsion(node) {\n return 2048;\n },\n // Node repulsion (overlapping) multiplier\n nodeOverlap: 4,\n // Ideal edge (non nested) length\n idealEdgeLength: function idealEdgeLength(edge) {\n return 32;\n },\n // Divisor to compute edge forces\n edgeElasticity: function edgeElasticity(edge) {\n return 32;\n },\n // Nesting factor (multiplier) to compute ideal edge length for nested edges\n nestingFactor: 1.2,\n // Gravity force (constant)\n gravity: 1,\n // Maximum number of iterations to perform\n numIter: 1000,\n // Initial temperature (maximum node displacement)\n initialTemp: 1000,\n // Cooling factor (how the temperature is reduced between consecutive iterations\n coolingFactor: 0.99,\n // Lower temperature threshold (below this point the layout will end)\n minTemp: 1.0\n};\n\n/**\n * @brief : constructor\n * @arg options : object containing layout options\n */\nfunction CoseLayout(options) {\n this.options = extend({}, defaults$4, options);\n this.options.layout = this;\n\n // Exclude any edge that has a source or target node that is not in the set of passed-in nodes\n var nodes = this.options.eles.nodes();\n var edges = this.options.eles.edges();\n var notEdges = edges.filter(function (e) {\n var sourceId = e.source().data('id');\n var targetId = e.target().data('id');\n var hasSource = nodes.some(function (n) {\n return n.data('id') === sourceId;\n });\n var hasTarget = nodes.some(function (n) {\n return n.data('id') === targetId;\n });\n return !hasSource || !hasTarget;\n });\n this.options.eles = this.options.eles.not(notEdges);\n}\n\n/**\n * @brief : runs the layout\n */\nCoseLayout.prototype.run = function () {\n var options = this.options;\n var cy = options.cy;\n var layout = this;\n layout.stopped = false;\n if (options.animate === true || options.animate === false) {\n layout.emit({\n type: 'layoutstart',\n layout: layout\n });\n }\n\n // Set DEBUG - Global variable\n if (true === options.debug) {\n DEBUG = true;\n } else {\n DEBUG = false;\n }\n\n // Initialize layout info\n var layoutInfo = createLayoutInfo(cy, layout, options);\n\n // Show LayoutInfo contents if debugging\n if (DEBUG) {\n printLayoutInfo(layoutInfo);\n }\n\n // If required, randomize node positions\n if (options.randomize) {\n randomizePositions(layoutInfo);\n }\n var startTime = performanceNow();\n var refresh = function refresh() {\n refreshPositions(layoutInfo, cy, options);\n\n // Fit the graph if necessary\n if (true === options.fit) {\n cy.fit(options.padding);\n }\n };\n var mainLoop = function mainLoop(i) {\n if (layout.stopped || i >= options.numIter) {\n // logDebug(\"Layout manually stopped. Stopping computation in step \" + i);\n return false;\n }\n\n // Do one step in the phisical simulation\n step(layoutInfo, options);\n\n // Update temperature\n layoutInfo.temperature = layoutInfo.temperature * options.coolingFactor;\n // logDebug(\"New temperature: \" + layoutInfo.temperature);\n\n if (layoutInfo.temperature < options.minTemp) {\n // logDebug(\"Temperature drop below minimum threshold. Stopping computation in step \" + i);\n return false;\n }\n return true;\n };\n var done = function done() {\n if (options.animate === true || options.animate === false) {\n refresh();\n\n // Layout has finished\n layout.one('layoutstop', options.stop);\n layout.emit({\n type: 'layoutstop',\n layout: layout\n });\n } else {\n var nodes = options.eles.nodes();\n var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes);\n nodes.layoutPositions(layout, options, getScaledPos);\n }\n };\n var i = 0;\n var loopRet = true;\n if (options.animate === true) {\n var _frame = function frame() {\n var f = 0;\n while (loopRet && f < options.refresh) {\n loopRet = mainLoop(i);\n i++;\n f++;\n }\n if (!loopRet) {\n // it's done\n separateComponents(layoutInfo, options);\n done();\n } else {\n var now = performanceNow();\n if (now - startTime >= options.animationThreshold) {\n refresh();\n }\n requestAnimationFrame(_frame);\n }\n };\n _frame();\n } else {\n while (loopRet) {\n loopRet = mainLoop(i);\n i++;\n }\n separateComponents(layoutInfo, options);\n done();\n }\n return this; // chaining\n};\n\n/**\n * @brief : called on continuous layouts to stop them before they finish\n */\nCoseLayout.prototype.stop = function () {\n this.stopped = true;\n if (this.thread) {\n this.thread.stop();\n }\n this.emit('layoutstop');\n return this; // chaining\n};\nCoseLayout.prototype.destroy = function () {\n if (this.thread) {\n this.thread.stop();\n }\n return this; // chaining\n};\n\n/**\n * @brief : Creates an object which is contains all the data\n * used in the layout process\n * @arg cy : cytoscape.js object\n * @return : layoutInfo object initialized\n */\nvar createLayoutInfo = function createLayoutInfo(cy, layout, options) {\n // Shortcut\n var edges = options.eles.edges();\n var nodes = options.eles.nodes();\n var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : {\n x1: 0,\n y1: 0,\n w: cy.width(),\n h: cy.height()\n });\n var layoutInfo = {\n isCompound: cy.hasCompoundNodes(),\n layoutNodes: [],\n idToIndex: {},\n nodeSize: nodes.size(),\n graphSet: [],\n indexToGraph: [],\n layoutEdges: [],\n edgeSize: edges.size(),\n temperature: options.initialTemp,\n clientWidth: bb.w,\n clientHeight: bb.h,\n boundingBox: bb\n };\n var components = options.eles.components();\n var id2cmptId = {};\n for (var i = 0; i < components.length; i++) {\n var component = components[i];\n for (var j = 0; j < component.length; j++) {\n var node = component[j];\n id2cmptId[node.id()] = i;\n }\n }\n\n // Iterate over all nodes, creating layout nodes\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = nodes[i];\n var nbb = n.layoutDimensions(options);\n var tempNode = {};\n tempNode.isLocked = n.locked();\n tempNode.id = n.data('id');\n tempNode.parentId = n.data('parent');\n tempNode.cmptId = id2cmptId[n.id()];\n tempNode.children = [];\n tempNode.positionX = n.position('x');\n tempNode.positionY = n.position('y');\n tempNode.offsetX = 0;\n tempNode.offsetY = 0;\n tempNode.height = nbb.w;\n tempNode.width = nbb.h;\n tempNode.maxX = tempNode.positionX + tempNode.width / 2;\n tempNode.minX = tempNode.positionX - tempNode.width / 2;\n tempNode.maxY = tempNode.positionY + tempNode.height / 2;\n tempNode.minY = tempNode.positionY - tempNode.height / 2;\n tempNode.padLeft = parseFloat(n.style('padding'));\n tempNode.padRight = parseFloat(n.style('padding'));\n tempNode.padTop = parseFloat(n.style('padding'));\n tempNode.padBottom = parseFloat(n.style('padding'));\n\n // forces\n tempNode.nodeRepulsion = fn$6(options.nodeRepulsion) ? options.nodeRepulsion(n) : options.nodeRepulsion;\n\n // Add new node\n layoutInfo.layoutNodes.push(tempNode);\n // Add entry to id-index map\n layoutInfo.idToIndex[tempNode.id] = i;\n }\n\n // Inline implementation of a queue, used for traversing the graph in BFS order\n var queue = [];\n var start = 0; // Points to the start the queue\n var end = -1; // Points to the end of the queue\n\n var tempGraph = [];\n\n // Second pass to add child information and\n // initialize queue for hierarchical traversal\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = layoutInfo.layoutNodes[i];\n var p_id = n.parentId;\n // Check if node n has a parent node\n if (null != p_id) {\n // Add node Id to parent's list of children\n layoutInfo.layoutNodes[layoutInfo.idToIndex[p_id]].children.push(n.id);\n } else {\n // If a node doesn't have a parent, then it's in the root graph\n queue[++end] = n.id;\n tempGraph.push(n.id);\n }\n }\n\n // Add root graph to graphSet\n layoutInfo.graphSet.push(tempGraph);\n\n // Traverse the graph, level by level,\n while (start <= end) {\n // Get the node to visit and remove it from queue\n var node_id = queue[start++];\n var node_ix = layoutInfo.idToIndex[node_id];\n var node = layoutInfo.layoutNodes[node_ix];\n var children = node.children;\n if (children.length > 0) {\n // Add children nodes as a new graph to graph set\n layoutInfo.graphSet.push(children);\n // Add children to que queue to be visited\n for (var i = 0; i < children.length; i++) {\n queue[++end] = children[i];\n }\n }\n }\n\n // Create indexToGraph map\n for (var i = 0; i < layoutInfo.graphSet.length; i++) {\n var graph = layoutInfo.graphSet[i];\n for (var j = 0; j < graph.length; j++) {\n var index = layoutInfo.idToIndex[graph[j]];\n layoutInfo.indexToGraph[index] = i;\n }\n }\n\n // Iterate over all edges, creating Layout Edges\n for (var i = 0; i < layoutInfo.edgeSize; i++) {\n var e = edges[i];\n var tempEdge = {};\n tempEdge.id = e.data('id');\n tempEdge.sourceId = e.data('source');\n tempEdge.targetId = e.data('target');\n\n // Compute ideal length\n var idealLength = fn$6(options.idealEdgeLength) ? options.idealEdgeLength(e) : options.idealEdgeLength;\n var elasticity = fn$6(options.edgeElasticity) ? options.edgeElasticity(e) : options.edgeElasticity;\n\n // Check if it's an inter graph edge\n var sourceIx = layoutInfo.idToIndex[tempEdge.sourceId];\n var targetIx = layoutInfo.idToIndex[tempEdge.targetId];\n var sourceGraph = layoutInfo.indexToGraph[sourceIx];\n var targetGraph = layoutInfo.indexToGraph[targetIx];\n if (sourceGraph != targetGraph) {\n // Find lowest common graph ancestor\n var lca = findLCA(tempEdge.sourceId, tempEdge.targetId, layoutInfo);\n\n // Compute sum of node depths, relative to lca graph\n var lcaGraph = layoutInfo.graphSet[lca];\n var depth = 0;\n\n // Source depth\n var tempNode = layoutInfo.layoutNodes[sourceIx];\n while (-1 === lcaGraph.indexOf(tempNode.id)) {\n tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]];\n depth++;\n }\n\n // Target depth\n tempNode = layoutInfo.layoutNodes[targetIx];\n while (-1 === lcaGraph.indexOf(tempNode.id)) {\n tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]];\n depth++;\n }\n\n // logDebug('LCA of nodes ' + tempEdge.sourceId + ' and ' + tempEdge.targetId +\n // \". Index: \" + lca + \" Contents: \" + lcaGraph.toString() +\n // \". Depth: \" + depth);\n\n // Update idealLength\n idealLength *= depth * options.nestingFactor;\n }\n tempEdge.idealLength = idealLength;\n tempEdge.elasticity = elasticity;\n layoutInfo.layoutEdges.push(tempEdge);\n }\n\n // Finally, return layoutInfo object\n return layoutInfo;\n};\n\n/**\n * @brief : This function finds the index of the lowest common\n * graph ancestor between 2 nodes in the subtree\n * (from the graph hierarchy induced tree) whose\n * root is graphIx\n *\n * @arg node1: node1's ID\n * @arg node2: node2's ID\n * @arg layoutInfo: layoutInfo object\n *\n */\nvar findLCA = function findLCA(node1, node2, layoutInfo) {\n // Find their common ancester, starting from the root graph\n var res = _findLCA_aux(node1, node2, 0, layoutInfo);\n if (2 > res.count) {\n // If aux function couldn't find the common ancester,\n // then it is the root graph\n return 0;\n } else {\n return res.graph;\n }\n};\n\n/**\n * @brief : Auxiliary function used for LCA computation\n *\n * @arg node1 : node1's ID\n * @arg node2 : node2's ID\n * @arg graphIx : subgraph index\n * @arg layoutInfo : layoutInfo object\n *\n * @return : object of the form {count: X, graph: Y}, where:\n * X is the number of ancestors (max: 2) found in\n * graphIx (and it's subgraphs),\n * Y is the graph index of the lowest graph containing\n * all X nodes\n */\nvar _findLCA_aux = function findLCA_aux(node1, node2, graphIx, layoutInfo) {\n var graph = layoutInfo.graphSet[graphIx];\n // If both nodes belongs to graphIx\n if (-1 < graph.indexOf(node1) && -1 < graph.indexOf(node2)) {\n return {\n count: 2,\n graph: graphIx\n };\n }\n\n // Make recursive calls for all subgraphs\n var c = 0;\n for (var i = 0; i < graph.length; i++) {\n var nodeId = graph[i];\n var nodeIx = layoutInfo.idToIndex[nodeId];\n var children = layoutInfo.layoutNodes[nodeIx].children;\n\n // If the node has no child, skip it\n if (0 === children.length) {\n continue;\n }\n var childGraphIx = layoutInfo.indexToGraph[layoutInfo.idToIndex[children[0]]];\n var result = _findLCA_aux(node1, node2, childGraphIx, layoutInfo);\n if (0 === result.count) {\n // Neither node1 nor node2 are present in this subgraph\n continue;\n } else if (1 === result.count) {\n // One of (node1, node2) is present in this subgraph\n c++;\n if (2 === c) {\n // We've already found both nodes, no need to keep searching\n break;\n }\n } else {\n // Both nodes are present in this subgraph\n return result;\n }\n }\n return {\n count: c,\n graph: graphIx\n };\n};\n\n/**\n * @brief: printsLayoutInfo into js console\n * Only used for debbuging\n */\nvar printLayoutInfo; \n\n/**\n * @brief : Randomizes the position of all nodes\n */\nvar randomizePositions = function randomizePositions(layoutInfo, cy) {\n var width = layoutInfo.clientWidth;\n var height = layoutInfo.clientHeight;\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = layoutInfo.layoutNodes[i];\n\n // No need to randomize compound nodes or locked nodes\n if (0 === n.children.length && !n.isLocked) {\n n.positionX = Math.random() * width;\n n.positionY = Math.random() * height;\n }\n }\n};\nvar getScaleInBoundsFn = function getScaleInBoundsFn(layoutInfo, options, nodes) {\n var bb = layoutInfo.boundingBox;\n var coseBB = {\n x1: Infinity,\n x2: -Infinity,\n y1: Infinity,\n y2: -Infinity\n };\n if (options.boundingBox) {\n nodes.forEach(function (node) {\n var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[node.data('id')]];\n coseBB.x1 = Math.min(coseBB.x1, lnode.positionX);\n coseBB.x2 = Math.max(coseBB.x2, lnode.positionX);\n coseBB.y1 = Math.min(coseBB.y1, lnode.positionY);\n coseBB.y2 = Math.max(coseBB.y2, lnode.positionY);\n });\n coseBB.w = coseBB.x2 - coseBB.x1;\n coseBB.h = coseBB.y2 - coseBB.y1;\n }\n return function (ele, i) {\n var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[ele.data('id')]];\n if (options.boundingBox) {\n // then add extra bounding box constraint\n // Handle single node case where coseBB.w or coseBB.h is 0\n var pctX = coseBB.w === 0 ? 0.5 : (lnode.positionX - coseBB.x1) / coseBB.w;\n var pctY = coseBB.h === 0 ? 0.5 : (lnode.positionY - coseBB.y1) / coseBB.h;\n return {\n x: bb.x1 + pctX * bb.w,\n y: bb.y1 + pctY * bb.h\n };\n } else {\n return {\n x: lnode.positionX,\n y: lnode.positionY\n };\n }\n };\n};\n\n/**\n * @brief : Updates the positions of nodes in the network\n * @arg layoutInfo : LayoutInfo object\n * @arg cy : Cytoscape object\n * @arg options : Layout options\n */\nvar refreshPositions = function refreshPositions(layoutInfo, cy, options) {\n // var s = 'Refreshing positions';\n // logDebug(s);\n\n var layout = options.layout;\n var nodes = options.eles.nodes();\n var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes);\n nodes.positions(getScaledPos);\n\n // Trigger layoutReady only on first call\n if (true !== layoutInfo.ready) {\n // s = 'Triggering layoutready';\n // logDebug(s);\n layoutInfo.ready = true;\n layout.one('layoutready', options.ready);\n layout.emit({\n type: 'layoutready',\n layout: this\n });\n }\n};\n\n/**\n * @brief : Logs a debug message in JS console, if DEBUG is ON\n */\n// var logDebug = function(text) {\n// if (DEBUG) {\n// console.debug(text);\n// }\n// };\n\n/**\n * @brief : Performs one iteration of the physical simulation\n * @arg layoutInfo : LayoutInfo object already initialized\n * @arg cy : Cytoscape object\n * @arg options : Layout options\n */\nvar step = function step(layoutInfo, options, _step) {\n // var s = \"\\n\\n###############################\";\n // s += \"\\nSTEP: \" + step;\n // s += \"\\n###############################\\n\";\n // logDebug(s);\n\n // Calculate node repulsions\n calculateNodeForces(layoutInfo, options);\n // Calculate edge forces\n calculateEdgeForces(layoutInfo);\n // Calculate gravity forces\n calculateGravityForces(layoutInfo, options);\n // Propagate forces from parent to child\n propagateForces(layoutInfo);\n // Update positions based on calculated forces\n updatePositions(layoutInfo);\n};\n\n/**\n * @brief : Computes the node repulsion forces\n */\nvar calculateNodeForces = function calculateNodeForces(layoutInfo, options) {\n // Go through each of the graphs in graphSet\n // Nodes only repel each other if they belong to the same graph\n // var s = 'calculateNodeForces';\n // logDebug(s);\n for (var i = 0; i < layoutInfo.graphSet.length; i++) {\n var graph = layoutInfo.graphSet[i];\n var numNodes = graph.length;\n\n // s = \"Set: \" + graph.toString();\n // logDebug(s);\n\n // Now get all the pairs of nodes\n // Only get each pair once, (A, B) = (B, A)\n for (var j = 0; j < numNodes; j++) {\n var node1 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]];\n for (var k = j + 1; k < numNodes; k++) {\n var node2 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[k]]];\n nodeRepulsion(node1, node2, layoutInfo, options);\n }\n }\n }\n};\nvar randomDistance = function randomDistance(max) {\n return -1 + 2 * max * Math.random();\n};\n\n/**\n * @brief : Compute the node repulsion forces between a pair of nodes\n */\nvar nodeRepulsion = function nodeRepulsion(node1, node2, layoutInfo, options) {\n // var s = \"Node repulsion. Node1: \" + node1.id + \" Node2: \" + node2.id;\n\n var cmptId1 = node1.cmptId;\n var cmptId2 = node2.cmptId;\n if (cmptId1 !== cmptId2 && !layoutInfo.isCompound) {\n return;\n }\n\n // Get direction of line connecting both node centers\n var directionX = node2.positionX - node1.positionX;\n var directionY = node2.positionY - node1.positionY;\n var maxRandDist = 1;\n // s += \"\\ndirectionX: \" + directionX + \", directionY: \" + directionY;\n\n // If both centers are the same, apply a random force\n if (0 === directionX && 0 === directionY) {\n directionX = randomDistance(maxRandDist);\n directionY = randomDistance(maxRandDist);\n }\n var overlap = nodesOverlap(node1, node2, directionX, directionY);\n if (overlap > 0) {\n // s += \"\\nNodes DO overlap.\";\n // s += \"\\nOverlap: \" + overlap;\n // If nodes overlap, repulsion force is proportional\n // to the overlap\n var force = options.nodeOverlap * overlap;\n\n // Compute the module and components of the force vector\n var distance = Math.sqrt(directionX * directionX + directionY * directionY);\n // s += \"\\nDistance: \" + distance;\n var forceX = force * directionX / distance;\n var forceY = force * directionY / distance;\n } else {\n // s += \"\\nNodes do NOT overlap.\";\n // If there's no overlap, force is inversely proportional\n // to squared distance\n\n // Get clipping points for both nodes\n var point1 = findClippingPoint(node1, directionX, directionY);\n var point2 = findClippingPoint(node2, -1 * directionX, -1 * directionY);\n\n // Use clipping points to compute distance\n var distanceX = point2.x - point1.x;\n var distanceY = point2.y - point1.y;\n var distanceSqr = distanceX * distanceX + distanceY * distanceY;\n var distance = Math.sqrt(distanceSqr);\n // s += \"\\nDistance: \" + distance;\n\n // Compute the module and components of the force vector\n var force = (node1.nodeRepulsion + node2.nodeRepulsion) / distanceSqr;\n var forceX = force * distanceX / distance;\n var forceY = force * distanceY / distance;\n }\n\n // Apply force\n if (!node1.isLocked) {\n node1.offsetX -= forceX;\n node1.offsetY -= forceY;\n }\n if (!node2.isLocked) {\n node2.offsetX += forceX;\n node2.offsetY += forceY;\n }\n\n // s += \"\\nForceX: \" + forceX + \" ForceY: \" + forceY;\n // logDebug(s);\n\n return;\n};\n\n/**\n * @brief : Determines whether two nodes overlap or not\n * @return : Amount of overlapping (0 => no overlap)\n */\nvar nodesOverlap = function nodesOverlap(node1, node2, dX, dY) {\n if (dX > 0) {\n var overlapX = node1.maxX - node2.minX;\n } else {\n var overlapX = node2.maxX - node1.minX;\n }\n if (dY > 0) {\n var overlapY = node1.maxY - node2.minY;\n } else {\n var overlapY = node2.maxY - node1.minY;\n }\n if (overlapX >= 0 && overlapY >= 0) {\n return Math.sqrt(overlapX * overlapX + overlapY * overlapY);\n } else {\n return 0;\n }\n};\n\n/**\n * @brief : Finds the point in which an edge (direction dX, dY) intersects\n * the rectangular bounding box of it's source/target node\n */\nvar findClippingPoint = function findClippingPoint(node, dX, dY) {\n // Shorcuts\n var X = node.positionX;\n var Y = node.positionY;\n var H = node.height || 1;\n var W = node.width || 1;\n var dirSlope = dY / dX;\n var nodeSlope = H / W;\n\n // var s = 'Computing clipping point of node ' + node.id +\n // \" . Height: \" + H + \", Width: \" + W +\n // \"\\nDirection \" + dX + \", \" + dY;\n //\n // Compute intersection\n var res = {};\n\n // Case: Vertical direction (up)\n if (0 === dX && 0 < dY) {\n res.x = X;\n // s += \"\\nUp direction\";\n res.y = Y + H / 2;\n return res;\n }\n\n // Case: Vertical direction (down)\n if (0 === dX && 0 > dY) {\n res.x = X;\n res.y = Y + H / 2;\n // s += \"\\nDown direction\";\n\n return res;\n }\n\n // Case: Intersects the right border\n if (0 < dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) {\n res.x = X + W / 2;\n res.y = Y + W * dY / 2 / dX;\n // s += \"\\nRightborder\";\n\n return res;\n }\n\n // Case: Intersects the left border\n if (0 > dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) {\n res.x = X - W / 2;\n res.y = Y - W * dY / 2 / dX;\n // s += \"\\nLeftborder\";\n\n return res;\n }\n\n // Case: Intersects the top border\n if (0 < dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) {\n res.x = X + H * dX / 2 / dY;\n res.y = Y + H / 2;\n // s += \"\\nTop border\";\n\n return res;\n }\n\n // Case: Intersects the bottom border\n if (0 > dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) {\n res.x = X - H * dX / 2 / dY;\n res.y = Y - H / 2;\n // s += \"\\nBottom border\";\n\n return res;\n }\n\n // s += \"\\nClipping point found at \" + res.x + \", \" + res.y;\n // logDebug(s);\n return res;\n};\n\n/**\n * @brief : Calculates all edge forces\n */\nvar calculateEdgeForces = function calculateEdgeForces(layoutInfo, options) {\n // Iterate over all edges\n for (var i = 0; i < layoutInfo.edgeSize; i++) {\n // Get edge, source & target nodes\n var edge = layoutInfo.layoutEdges[i];\n var sourceIx = layoutInfo.idToIndex[edge.sourceId];\n var source = layoutInfo.layoutNodes[sourceIx];\n var targetIx = layoutInfo.idToIndex[edge.targetId];\n var target = layoutInfo.layoutNodes[targetIx];\n\n // Get direction of line connecting both node centers\n var directionX = target.positionX - source.positionX;\n var directionY = target.positionY - source.positionY;\n\n // If both centers are the same, do nothing.\n // A random force has already been applied as node repulsion\n if (0 === directionX && 0 === directionY) {\n continue;\n }\n\n // Get clipping points for both nodes\n var point1 = findClippingPoint(source, directionX, directionY);\n var point2 = findClippingPoint(target, -1 * directionX, -1 * directionY);\n var lx = point2.x - point1.x;\n var ly = point2.y - point1.y;\n var l = Math.sqrt(lx * lx + ly * ly);\n var force = Math.pow(edge.idealLength - l, 2) / edge.elasticity;\n if (0 !== l) {\n var forceX = force * lx / l;\n var forceY = force * ly / l;\n } else {\n var forceX = 0;\n var forceY = 0;\n }\n\n // Add this force to target and source nodes\n if (!source.isLocked) {\n source.offsetX += forceX;\n source.offsetY += forceY;\n }\n if (!target.isLocked) {\n target.offsetX -= forceX;\n target.offsetY -= forceY;\n }\n\n // var s = 'Edge force between nodes ' + source.id + ' and ' + target.id;\n // s += \"\\nDistance: \" + l + \" Force: (\" + forceX + \", \" + forceY + \")\";\n // logDebug(s);\n }\n};\n\n/**\n * @brief : Computes gravity forces for all nodes\n */\nvar calculateGravityForces = function calculateGravityForces(layoutInfo, options) {\n if (options.gravity === 0) {\n return;\n }\n var distThreshold = 1;\n\n // var s = 'calculateGravityForces';\n // logDebug(s);\n for (var i = 0; i < layoutInfo.graphSet.length; i++) {\n var graph = layoutInfo.graphSet[i];\n var numNodes = graph.length;\n\n // s = \"Set: \" + graph.toString();\n // logDebug(s);\n\n // Compute graph center\n if (0 === i) {\n var centerX = layoutInfo.clientHeight / 2;\n var centerY = layoutInfo.clientWidth / 2;\n } else {\n // Get Parent node for this graph, and use its position as center\n var temp = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[0]]];\n var parent = layoutInfo.layoutNodes[layoutInfo.idToIndex[temp.parentId]];\n var centerX = parent.positionX;\n var centerY = parent.positionY;\n }\n // s = \"Center found at: \" + centerX + \", \" + centerY;\n // logDebug(s);\n\n // Apply force to all nodes in graph\n for (var j = 0; j < numNodes; j++) {\n var node = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]];\n // s = \"Node: \" + node.id;\n\n if (node.isLocked) {\n continue;\n }\n var dx = centerX - node.positionX;\n var dy = centerY - node.positionY;\n var d = Math.sqrt(dx * dx + dy * dy);\n if (d > distThreshold) {\n var fx = options.gravity * dx / d;\n var fy = options.gravity * dy / d;\n node.offsetX += fx;\n node.offsetY += fy;\n // s += \": Applied force: \" + fx + \", \" + fy;\n }\n // logDebug(s);\n }\n }\n};\n\n/**\n * @brief : This function propagates the existing offsets from\n * parent nodes to its descendents.\n * @arg layoutInfo : layoutInfo Object\n * @arg cy : cytoscape Object\n * @arg options : Layout options\n */\nvar propagateForces = function propagateForces(layoutInfo, options) {\n // Inline implementation of a queue, used for traversing the graph in BFS order\n var queue = [];\n var start = 0; // Points to the start the queue\n var end = -1; // Points to the end of the queue\n\n // logDebug('propagateForces');\n\n // Start by visiting the nodes in the root graph\n queue.push.apply(queue, layoutInfo.graphSet[0]);\n end += layoutInfo.graphSet[0].length;\n\n // Traverse the graph, level by level,\n while (start <= end) {\n // Get the node to visit and remove it from queue\n var nodeId = queue[start++];\n var nodeIndex = layoutInfo.idToIndex[nodeId];\n var node = layoutInfo.layoutNodes[nodeIndex];\n var children = node.children;\n\n // We only need to process the node if it's compound\n if (0 < children.length && !node.isLocked) {\n var offX = node.offsetX;\n var offY = node.offsetY;\n\n // var s = \"Propagating offset from parent node : \" + node.id +\n // \". OffsetX: \" + offX + \". OffsetY: \" + offY;\n // s += \"\\n Children: \" + children.toString();\n // logDebug(s);\n\n for (var i = 0; i < children.length; i++) {\n var childNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[children[i]]];\n // Propagate offset\n childNode.offsetX += offX;\n childNode.offsetY += offY;\n // Add children to queue to be visited\n queue[++end] = children[i];\n }\n\n // Reset parent offsets\n node.offsetX = 0;\n node.offsetY = 0;\n }\n }\n};\n\n/**\n * @brief : Updates the layout model positions, based on\n * the accumulated forces\n */\nvar updatePositions = function updatePositions(layoutInfo, options) {\n // var s = 'Updating positions';\n // logDebug(s);\n\n // Reset boundaries for compound nodes\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = layoutInfo.layoutNodes[i];\n if (0 < n.children.length) {\n // logDebug(\"Resetting boundaries of compound node: \" + n.id);\n n.maxX = undefined;\n n.minX = undefined;\n n.maxY = undefined;\n n.minY = undefined;\n }\n }\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = layoutInfo.layoutNodes[i];\n if (0 < n.children.length || n.isLocked) {\n // No need to set compound or locked node position\n // logDebug(\"Skipping position update of node: \" + n.id);\n continue;\n }\n // s = \"Node: \" + n.id + \" Previous position: (\" +\n // n.positionX + \", \" + n.positionY + \").\";\n\n // Limit displacement in order to improve stability\n var tempForce = limitForce(n.offsetX, n.offsetY, layoutInfo.temperature);\n n.positionX += tempForce.x;\n n.positionY += tempForce.y;\n n.offsetX = 0;\n n.offsetY = 0;\n n.minX = n.positionX - n.width;\n n.maxX = n.positionX + n.width;\n n.minY = n.positionY - n.height;\n n.maxY = n.positionY + n.height;\n // s += \" New Position: (\" + n.positionX + \", \" + n.positionY + \").\";\n // logDebug(s);\n\n // Update ancestry boudaries\n _updateAncestryBoundaries(n, layoutInfo);\n }\n\n // Update size, position of compund nodes\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = layoutInfo.layoutNodes[i];\n if (0 < n.children.length && !n.isLocked) {\n n.positionX = (n.maxX + n.minX) / 2;\n n.positionY = (n.maxY + n.minY) / 2;\n n.width = n.maxX - n.minX;\n n.height = n.maxY - n.minY;\n // s = \"Updating position, size of compound node \" + n.id;\n // s += \"\\nPositionX: \" + n.positionX + \", PositionY: \" + n.positionY;\n // s += \"\\nWidth: \" + n.width + \", Height: \" + n.height;\n // logDebug(s);\n }\n }\n};\n\n/**\n * @brief : Limits a force (forceX, forceY) to be not\n * greater (in modulo) than max.\n 8 Preserves force direction.\n */\nvar limitForce = function limitForce(forceX, forceY, max) {\n // var s = \"Limiting force: (\" + forceX + \", \" + forceY + \"). Max: \" + max;\n var force = Math.sqrt(forceX * forceX + forceY * forceY);\n if (force > max) {\n var res = {\n x: max * forceX / force,\n y: max * forceY / force\n };\n } else {\n var res = {\n x: forceX,\n y: forceY\n };\n }\n\n // s += \".\\nResult: (\" + res.x + \", \" + res.y + \")\";\n // logDebug(s);\n\n return res;\n};\n\n/**\n * @brief : Function used for keeping track of compound node\n * sizes, since they should bound all their subnodes.\n */\nvar _updateAncestryBoundaries = function updateAncestryBoundaries(node, layoutInfo) {\n // var s = \"Propagating new position/size of node \" + node.id;\n var parentId = node.parentId;\n if (null == parentId) {\n // If there's no parent, we are done\n // s += \". No parent node.\";\n // logDebug(s);\n return;\n }\n\n // Get Parent Node\n var p = layoutInfo.layoutNodes[layoutInfo.idToIndex[parentId]];\n var flag = false;\n\n // MaxX\n if (null == p.maxX || node.maxX + p.padRight > p.maxX) {\n p.maxX = node.maxX + p.padRight;\n flag = true;\n // s += \"\\nNew maxX for parent node \" + p.id + \": \" + p.maxX;\n }\n\n // MinX\n if (null == p.minX || node.minX - p.padLeft < p.minX) {\n p.minX = node.minX - p.padLeft;\n flag = true;\n // s += \"\\nNew minX for parent node \" + p.id + \": \" + p.minX;\n }\n\n // MaxY\n if (null == p.maxY || node.maxY + p.padBottom > p.maxY) {\n p.maxY = node.maxY + p.padBottom;\n flag = true;\n // s += \"\\nNew maxY for parent node \" + p.id + \": \" + p.maxY;\n }\n\n // MinY\n if (null == p.minY || node.minY - p.padTop < p.minY) {\n p.minY = node.minY - p.padTop;\n flag = true;\n // s += \"\\nNew minY for parent node \" + p.id + \": \" + p.minY;\n }\n\n // If updated boundaries, propagate changes upward\n if (flag) {\n // logDebug(s);\n return _updateAncestryBoundaries(p, layoutInfo);\n }\n\n // s += \". No changes in boundaries/position of parent node \" + p.id;\n // logDebug(s);\n return;\n};\nvar separateComponents = function separateComponents(layoutInfo, options) {\n var nodes = layoutInfo.layoutNodes;\n var components = [];\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n var cid = node.cmptId;\n var component = components[cid] = components[cid] || [];\n component.push(node);\n }\n var totalA = 0;\n for (var i = 0; i < components.length; i++) {\n var c = components[i];\n if (!c) {\n continue;\n }\n c.x1 = Infinity;\n c.x2 = -Infinity;\n c.y1 = Infinity;\n c.y2 = -Infinity;\n for (var j = 0; j < c.length; j++) {\n var n = c[j];\n c.x1 = Math.min(c.x1, n.positionX - n.width / 2);\n c.x2 = Math.max(c.x2, n.positionX + n.width / 2);\n c.y1 = Math.min(c.y1, n.positionY - n.height / 2);\n c.y2 = Math.max(c.y2, n.positionY + n.height / 2);\n }\n c.w = c.x2 - c.x1;\n c.h = c.y2 - c.y1;\n totalA += c.w * c.h;\n }\n components.sort(function (c1, c2) {\n return c2.w * c2.h - c1.w * c1.h;\n });\n var x = 0;\n var y = 0;\n var usedW = 0;\n var rowH = 0;\n var maxRowW = Math.sqrt(totalA) * layoutInfo.clientWidth / layoutInfo.clientHeight;\n for (var i = 0; i < components.length; i++) {\n var c = components[i];\n if (!c) {\n continue;\n }\n for (var j = 0; j < c.length; j++) {\n var n = c[j];\n if (!n.isLocked) {\n n.positionX += x - c.x1;\n n.positionY += y - c.y1;\n }\n }\n x += c.w + options.componentSpacing;\n usedW += c.w + options.componentSpacing;\n rowH = Math.max(rowH, c.h);\n if (usedW > maxRowW) {\n y += rowH + options.componentSpacing;\n x = 0;\n usedW = 0;\n rowH = 0;\n }\n }\n};\n\nvar defaults$3 = {\n fit: true,\n // whether to fit the viewport to the graph\n padding: 30,\n // padding used on fit\n boundingBox: undefined,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: true,\n // prevents node overlap, may overflow boundingBox if not enough space\n avoidOverlapPadding: 10,\n // extra spacing around nodes when avoidOverlap: true\n nodeDimensionsIncludeLabels: false,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n spacingFactor: undefined,\n // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n condense: false,\n // uses all available space on false, uses minimal space on true\n rows: undefined,\n // force num of rows in the grid\n cols: undefined,\n // force num of columns in the grid\n position: function position(node) {},\n // returns { row, col } for element\n sort: undefined,\n // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') }\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts \n};\nfunction GridLayout(options) {\n this.options = extend({}, defaults$3, options);\n}\nGridLayout.prototype.run = function () {\n var params = this.options;\n var options = params;\n var cy = params.cy;\n var eles = options.eles;\n var nodes = eles.nodes().not(':parent');\n if (options.sort) {\n nodes = nodes.sort(options.sort);\n }\n var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : {\n x1: 0,\n y1: 0,\n w: cy.width(),\n h: cy.height()\n });\n if (bb.h === 0 || bb.w === 0) {\n eles.nodes().layoutPositions(this, options, function (ele) {\n return {\n x: bb.x1,\n y: bb.y1\n };\n });\n } else {\n // width/height * splits^2 = cells where splits is number of times to split width\n var cells = nodes.size();\n var splits = Math.sqrt(cells * bb.h / bb.w);\n var rows = Math.round(splits);\n var cols = Math.round(bb.w / bb.h * splits);\n var small = function small(val) {\n if (val == null) {\n return Math.min(rows, cols);\n } else {\n var min = Math.min(rows, cols);\n if (min == rows) {\n rows = val;\n } else {\n cols = val;\n }\n }\n };\n var large = function large(val) {\n if (val == null) {\n return Math.max(rows, cols);\n } else {\n var max = Math.max(rows, cols);\n if (max == rows) {\n rows = val;\n } else {\n cols = val;\n }\n }\n };\n var oRows = options.rows;\n var oCols = options.cols != null ? options.cols : options.columns;\n\n // if rows or columns were set in options, use those values\n if (oRows != null && oCols != null) {\n rows = oRows;\n cols = oCols;\n } else if (oRows != null && oCols == null) {\n rows = oRows;\n cols = Math.ceil(cells / rows);\n } else if (oRows == null && oCols != null) {\n cols = oCols;\n rows = Math.ceil(cells / cols);\n }\n\n // otherwise use the automatic values and adjust accordingly\n\n // if rounding was up, see if we can reduce rows or columns\n else if (cols * rows > cells) {\n var sm = small();\n var lg = large();\n\n // reducing the small side takes away the most cells, so try it first\n if ((sm - 1) * lg >= cells) {\n small(sm - 1);\n } else if ((lg - 1) * sm >= cells) {\n large(lg - 1);\n }\n } else {\n // if rounding was too low, add rows or columns\n while (cols * rows < cells) {\n var _sm = small();\n var _lg = large();\n\n // try to add to larger side first (adds less in multiplication)\n if ((_lg + 1) * _sm >= cells) {\n large(_lg + 1);\n } else {\n small(_sm + 1);\n }\n }\n }\n var cellWidth = bb.w / cols;\n var cellHeight = bb.h / rows;\n if (options.condense) {\n cellWidth = 0;\n cellHeight = 0;\n }\n if (options.avoidOverlap) {\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n var pos = node._private.position;\n if (pos.x == null || pos.y == null) {\n // for bb\n pos.x = 0;\n pos.y = 0;\n }\n var nbb = node.layoutDimensions(options);\n var p = options.avoidOverlapPadding;\n var w = nbb.w + p;\n var h = nbb.h + p;\n cellWidth = Math.max(cellWidth, w);\n cellHeight = Math.max(cellHeight, h);\n }\n }\n var cellUsed = {}; // e.g. 'c-0-2' => true\n\n var used = function used(row, col) {\n return cellUsed['c-' + row + '-' + col] ? true : false;\n };\n var use = function use(row, col) {\n cellUsed['c-' + row + '-' + col] = true;\n };\n\n // to keep track of current cell position\n var row = 0;\n var col = 0;\n var moveToNextCell = function moveToNextCell() {\n col++;\n if (col >= cols) {\n col = 0;\n row++;\n }\n };\n\n // get a cache of all the manual positions\n var id2manPos = {};\n for (var _i = 0; _i < nodes.length; _i++) {\n var _node = nodes[_i];\n var rcPos = options.position(_node);\n if (rcPos && (rcPos.row !== undefined || rcPos.col !== undefined)) {\n // must have at least row or col def'd\n var _pos = {\n row: rcPos.row,\n col: rcPos.col\n };\n if (_pos.col === undefined) {\n // find unused col\n _pos.col = 0;\n while (used(_pos.row, _pos.col)) {\n _pos.col++;\n }\n } else if (_pos.row === undefined) {\n // find unused row\n _pos.row = 0;\n while (used(_pos.row, _pos.col)) {\n _pos.row++;\n }\n }\n id2manPos[_node.id()] = _pos;\n use(_pos.row, _pos.col);\n }\n }\n var getPos = function getPos(element, i) {\n var x, y;\n if (element.locked() || element.isParent()) {\n return false;\n }\n\n // see if we have a manual position set\n var rcPos = id2manPos[element.id()];\n if (rcPos) {\n x = rcPos.col * cellWidth + cellWidth / 2 + bb.x1;\n y = rcPos.row * cellHeight + cellHeight / 2 + bb.y1;\n } else {\n // otherwise set automatically\n\n while (used(row, col)) {\n moveToNextCell();\n }\n x = col * cellWidth + cellWidth / 2 + bb.x1;\n y = row * cellHeight + cellHeight / 2 + bb.y1;\n use(row, col);\n moveToNextCell();\n }\n return {\n x: x,\n y: y\n };\n };\n nodes.layoutPositions(this, options, getPos);\n }\n return this; // chaining\n};\n\n// default layout options\nvar defaults$2 = {\n ready: function ready() {},\n // on layoutready\n stop: function stop() {} // on layoutstop\n};\n\n// constructor\n// options : object containing layout options\nfunction NullLayout(options) {\n this.options = extend({}, defaults$2, options);\n}\n\n// runs the layout\nNullLayout.prototype.run = function () {\n var options = this.options;\n var eles = options.eles; // elements to consider in the layout\n var layout = this;\n\n // cy is automatically populated for us in the constructor\n // (disable eslint for next line as this serves as example layout code to external developers)\n // eslint-disable-next-line no-unused-vars\n options.cy;\n layout.emit('layoutstart');\n\n // puts all nodes at (0, 0)\n // n.b. most layouts would use layoutPositions(), instead of positions() and manual events\n eles.nodes().positions(function () {\n return {\n x: 0,\n y: 0\n };\n });\n\n // trigger layoutready when each node has had its position set at least once\n layout.one('layoutready', options.ready);\n layout.emit('layoutready');\n\n // trigger layoutstop when the layout stops (e.g. finishes)\n layout.one('layoutstop', options.stop);\n layout.emit('layoutstop');\n return this; // chaining\n};\n\n// called on continuous layouts to stop them before they finish\nNullLayout.prototype.stop = function () {\n return this; // chaining\n};\n\nvar defaults$1 = {\n positions: undefined,\n // map of (node id) => (position obj); or function(node){ return somPos; }\n zoom: undefined,\n // the zoom level to set (prob want fit = false if set)\n pan: undefined,\n // the pan level to set (prob want fit = false if set)\n fit: true,\n // whether to fit to viewport\n padding: 30,\n // padding on fit\n spacingFactor: undefined,\n // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts\n};\nfunction PresetLayout(options) {\n this.options = extend({}, defaults$1, options);\n}\nPresetLayout.prototype.run = function () {\n var options = this.options;\n var eles = options.eles;\n var nodes = eles.nodes();\n var posIsFn = fn$6(options.positions);\n function getPosition(node) {\n if (options.positions == null) {\n return copyPosition(node.position());\n }\n if (posIsFn) {\n return options.positions(node);\n }\n var pos = options.positions[node._private.data.id];\n if (pos == null) {\n return null;\n }\n return pos;\n }\n nodes.layoutPositions(this, options, function (node, i) {\n var position = getPosition(node);\n if (node.locked() || position == null) {\n return false;\n }\n return position;\n });\n return this; // chaining\n};\n\nvar defaults = {\n fit: true,\n // whether to fit to viewport\n padding: 30,\n // fit padding\n boundingBox: undefined,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts \n};\nfunction RandomLayout(options) {\n this.options = extend({}, defaults, options);\n}\nRandomLayout.prototype.run = function () {\n var options = this.options;\n var cy = options.cy;\n var eles = options.eles;\n var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : {\n x1: 0,\n y1: 0,\n w: cy.width(),\n h: cy.height()\n });\n var getPos = function getPos(node, i) {\n return {\n x: bb.x1 + Math.round(Math.random() * bb.w),\n y: bb.y1 + Math.round(Math.random() * bb.h)\n };\n };\n eles.nodes().layoutPositions(this, options, getPos);\n return this; // chaining\n};\n\nvar layout = [{\n name: 'breadthfirst',\n impl: BreadthFirstLayout\n}, {\n name: 'circle',\n impl: CircleLayout\n}, {\n name: 'concentric',\n impl: ConcentricLayout\n}, {\n name: 'cose',\n impl: CoseLayout\n}, {\n name: 'grid',\n impl: GridLayout\n}, {\n name: 'null',\n impl: NullLayout\n}, {\n name: 'preset',\n impl: PresetLayout\n}, {\n name: 'random',\n impl: RandomLayout\n}];\n\nfunction NullRenderer(options) {\n this.options = options;\n this.notifications = 0; // for testing\n}\nvar noop = function noop() {};\nvar throwImgErr = function throwImgErr() {\n throw new Error('A headless instance can not render images');\n};\nNullRenderer.prototype = {\n recalculateRenderedStyle: noop,\n notify: function notify() {\n this.notifications++;\n },\n init: noop,\n isHeadless: function isHeadless() {\n return true;\n },\n png: throwImgErr,\n jpg: throwImgErr\n};\n\nvar BRp$f = {};\nBRp$f.arrowShapeWidth = 0.3;\nBRp$f.registerArrowShapes = function () {\n var arrowShapes = this.arrowShapes = {};\n var renderer = this;\n\n // Contract for arrow shapes:\n // 0, 0 is arrow tip\n // (0, 1) is direction towards node\n // (1, 0) is right\n //\n // functional api:\n // collide: check x, y in shape\n // roughCollide: called before collide, no false negatives\n // draw: draw\n // spacing: dist(arrowTip, nodeBoundary)\n // gap: dist(edgeTip, nodeBoundary), edgeTip may != arrowTip\n\n var bbCollide = function bbCollide(x, y, size, angle, translation, edgeWidth, padding) {\n var x1 = translation.x - size / 2 - padding;\n var x2 = translation.x + size / 2 + padding;\n var y1 = translation.y - size / 2 - padding;\n var y2 = translation.y + size / 2 + padding;\n var inside = x1 <= x && x <= x2 && y1 <= y && y <= y2;\n return inside;\n };\n var transform = function transform(x, y, size, angle, translation) {\n var xRotated = x * Math.cos(angle) - y * Math.sin(angle);\n var yRotated = x * Math.sin(angle) + y * Math.cos(angle);\n var xScaled = xRotated * size;\n var yScaled = yRotated * size;\n var xTranslated = xScaled + translation.x;\n var yTranslated = yScaled + translation.y;\n return {\n x: xTranslated,\n y: yTranslated\n };\n };\n var transformPoints = function transformPoints(pts, size, angle, translation) {\n var retPts = [];\n for (var i = 0; i < pts.length; i += 2) {\n var x = pts[i];\n var y = pts[i + 1];\n retPts.push(transform(x, y, size, angle, translation));\n }\n return retPts;\n };\n var pointsToArr = function pointsToArr(pts) {\n var ret = [];\n for (var i = 0; i < pts.length; i++) {\n var p = pts[i];\n ret.push(p.x, p.y);\n }\n return ret;\n };\n var standardGap = function standardGap(edge) {\n return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').pfValue * 2;\n };\n var defineArrowShape = function defineArrowShape(name, defn) {\n if (string(defn)) {\n defn = arrowShapes[defn];\n }\n arrowShapes[name] = extend({\n name: name,\n points: [-0.15, -0.3, 0.15, -0.3, 0.15, 0.3, -0.15, 0.3],\n collide: function collide(x, y, size, angle, translation, padding) {\n var points = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation));\n var inside = pointInsidePolygonPoints(x, y, points);\n return inside;\n },\n roughCollide: bbCollide,\n draw: function draw(context, size, angle, translation) {\n var points = transformPoints(this.points, size, angle, translation);\n renderer.arrowShapeImpl('polygon')(context, points);\n },\n spacing: function spacing(edge) {\n return 0;\n },\n gap: standardGap\n }, defn);\n };\n defineArrowShape('none', {\n collide: falsify,\n roughCollide: falsify,\n draw: noop$1,\n spacing: zeroify,\n gap: zeroify\n });\n defineArrowShape('triangle', {\n points: [-0.15, -0.3, 0, 0, 0.15, -0.3]\n });\n defineArrowShape('arrow', 'triangle');\n defineArrowShape('triangle-backcurve', {\n points: arrowShapes['triangle'].points,\n controlPoint: [0, -0.15],\n roughCollide: bbCollide,\n draw: function draw(context, size, angle, translation, edgeWidth) {\n var ptsTrans = transformPoints(this.points, size, angle, translation);\n var ctrlPt = this.controlPoint;\n var ctrlPtTrans = transform(ctrlPt[0], ctrlPt[1], size, angle, translation);\n renderer.arrowShapeImpl(this.name)(context, ptsTrans, ctrlPtTrans);\n },\n gap: function gap(edge) {\n return standardGap(edge) * 0.8;\n }\n });\n defineArrowShape('triangle-tee', {\n points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0],\n pointsTee: [-0.15, -0.4, -0.15, -0.5, 0.15, -0.5, 0.15, -0.4],\n collide: function collide(x, y, size, angle, translation, edgeWidth, padding) {\n var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation));\n var teePts = pointsToArr(transformPoints(this.pointsTee, size + 2 * padding, angle, translation));\n var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts);\n return inside;\n },\n draw: function draw(context, size, angle, translation, edgeWidth) {\n var triPts = transformPoints(this.points, size, angle, translation);\n var teePts = transformPoints(this.pointsTee, size, angle, translation);\n renderer.arrowShapeImpl(this.name)(context, triPts, teePts);\n }\n });\n defineArrowShape('circle-triangle', {\n radius: 0.15,\n pointsTr: [0, -0.15, 0.15, -0.45, -0.15, -0.45, 0, -0.15],\n collide: function collide(x, y, size, angle, translation, edgeWidth, padding) {\n var t = translation;\n var circleInside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2);\n var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation));\n return pointInsidePolygonPoints(x, y, triPts) || circleInside;\n },\n draw: function draw(context, size, angle, translation, edgeWidth) {\n var triPts = transformPoints(this.pointsTr, size, angle, translation);\n renderer.arrowShapeImpl(this.name)(context, triPts, translation.x, translation.y, this.radius * size);\n },\n spacing: function spacing(edge) {\n return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius;\n }\n });\n defineArrowShape('triangle-cross', {\n points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0],\n baseCrossLinePts: [-0.15, -0.4,\n // first half of the rectangle\n -0.15, -0.4, 0.15, -0.4,\n // second half of the rectangle\n 0.15, -0.4],\n crossLinePts: function crossLinePts(size, edgeWidth) {\n // shift points so that the distance between the cross points matches edge width\n var p = this.baseCrossLinePts.slice();\n var shiftFactor = edgeWidth / size;\n var y0 = 3;\n var y1 = 5;\n p[y0] = p[y0] - shiftFactor;\n p[y1] = p[y1] - shiftFactor;\n return p;\n },\n collide: function collide(x, y, size, angle, translation, edgeWidth, padding) {\n var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation));\n var teePts = pointsToArr(transformPoints(this.crossLinePts(size, edgeWidth), size + 2 * padding, angle, translation));\n var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts);\n return inside;\n },\n draw: function draw(context, size, angle, translation, edgeWidth) {\n var triPts = transformPoints(this.points, size, angle, translation);\n var crossLinePts = transformPoints(this.crossLinePts(size, edgeWidth), size, angle, translation);\n renderer.arrowShapeImpl(this.name)(context, triPts, crossLinePts);\n }\n });\n defineArrowShape('vee', {\n points: [-0.15, -0.3, 0, 0, 0.15, -0.3, 0, -0.15],\n gap: function gap(edge) {\n return standardGap(edge) * 0.525;\n }\n });\n defineArrowShape('circle', {\n radius: 0.15,\n collide: function collide(x, y, size, angle, translation, edgeWidth, padding) {\n var t = translation;\n var inside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2);\n return inside;\n },\n draw: function draw(context, size, angle, translation, edgeWidth) {\n renderer.arrowShapeImpl(this.name)(context, translation.x, translation.y, this.radius * size);\n },\n spacing: function spacing(edge) {\n return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius;\n }\n });\n defineArrowShape('tee', {\n points: [-0.15, 0, -0.15, -0.1, 0.15, -0.1, 0.15, 0],\n spacing: function spacing(edge) {\n return 1;\n },\n gap: function gap(edge) {\n return 1;\n }\n });\n defineArrowShape('square', {\n points: [-0.15, 0.00, 0.15, 0.00, 0.15, -0.3, -0.15, -0.3]\n });\n defineArrowShape('diamond', {\n points: [-0.15, -0.15, 0, -0.3, 0.15, -0.15, 0, 0],\n gap: function gap(edge) {\n return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value;\n }\n });\n defineArrowShape('chevron', {\n points: [0, 0, -0.15, -0.15, -0.1, -0.2, 0, -0.1, 0.1, -0.2, 0.15, -0.15],\n gap: function gap(edge) {\n return 0.95 * edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value;\n }\n });\n};\n\nvar BRp$e = {};\n\n// Project mouse\nBRp$e.projectIntoViewport = function (clientX, clientY) {\n var cy = this.cy;\n var offsets = this.findContainerClientCoords();\n var offsetLeft = offsets[0];\n var offsetTop = offsets[1];\n var scale = offsets[4];\n var pan = cy.pan();\n var zoom = cy.zoom();\n var x = ((clientX - offsetLeft) / scale - pan.x) / zoom;\n var y = ((clientY - offsetTop) / scale - pan.y) / zoom;\n return [x, y];\n};\nBRp$e.findContainerClientCoords = function () {\n if (this.containerBB) {\n return this.containerBB;\n }\n var container = this.container;\n var rect = container.getBoundingClientRect();\n var style = this.cy.window().getComputedStyle(container);\n var styleValue = function styleValue(name) {\n return parseFloat(style.getPropertyValue(name));\n };\n var padding = {\n left: styleValue('padding-left'),\n right: styleValue('padding-right'),\n top: styleValue('padding-top'),\n bottom: styleValue('padding-bottom')\n };\n var border = {\n left: styleValue('border-left-width'),\n right: styleValue('border-right-width'),\n top: styleValue('border-top-width'),\n bottom: styleValue('border-bottom-width')\n };\n var clientWidth = container.clientWidth;\n var clientHeight = container.clientHeight;\n var paddingHor = padding.left + padding.right;\n var paddingVer = padding.top + padding.bottom;\n var borderHor = border.left + border.right;\n var scale = rect.width / (clientWidth + borderHor);\n var unscaledW = clientWidth - paddingHor;\n var unscaledH = clientHeight - paddingVer;\n var left = rect.left + padding.left + border.left;\n var top = rect.top + padding.top + border.top;\n return this.containerBB = [left, top, unscaledW, unscaledH, scale];\n};\nBRp$e.invalidateContainerClientCoordsCache = function () {\n this.containerBB = null;\n};\nBRp$e.findNearestElement = function (x, y, interactiveElementsOnly, isTouch) {\n return this.findNearestElements(x, y, interactiveElementsOnly, isTouch)[0];\n};\nBRp$e.findNearestElements = function (x, y, interactiveElementsOnly, isTouch) {\n var self = this;\n var r = this;\n var eles = r.getCachedZSortedEles();\n var near = []; // 1 node max, 1 edge max\n var zoom = r.cy.zoom();\n var hasCompounds = r.cy.hasCompoundNodes();\n var edgeThreshold = (isTouch ? 24 : 8) / zoom;\n var nodeThreshold = (isTouch ? 8 : 2) / zoom;\n var labelThreshold = (isTouch ? 8 : 2) / zoom;\n var minSqDist = Infinity;\n var nearEdge;\n var nearNode;\n if (interactiveElementsOnly) {\n eles = eles.interactive;\n }\n function addEle(ele, sqDist) {\n if (ele.isNode()) {\n if (nearNode) {\n return; // can't replace node\n } else {\n nearNode = ele;\n near.push(ele);\n }\n }\n if (ele.isEdge() && (sqDist == null || sqDist < minSqDist)) {\n if (nearEdge) {\n // then replace existing edge\n // can replace only if same z-index\n if (nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value && nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value) {\n for (var i = 0; i < near.length; i++) {\n if (near[i].isEdge()) {\n near[i] = ele;\n nearEdge = ele;\n minSqDist = sqDist != null ? sqDist : minSqDist;\n break;\n }\n }\n }\n } else {\n near.push(ele);\n nearEdge = ele;\n minSqDist = sqDist != null ? sqDist : minSqDist;\n }\n }\n }\n function checkNode(node) {\n var width = node.outerWidth() + 2 * nodeThreshold;\n var height = node.outerHeight() + 2 * nodeThreshold;\n var hw = width / 2;\n var hh = height / 2;\n var pos = node.position();\n var cornerRadius = node.pstyle('corner-radius').value === 'auto' ? 'auto' : node.pstyle('corner-radius').pfValue;\n var rs = node._private.rscratch;\n if (pos.x - hw <= x && x <= pos.x + hw // bb check x\n && pos.y - hh <= y && y <= pos.y + hh // bb check y\n ) {\n var shape = r.nodeShapes[self.getNodeShape(node)];\n if (shape.checkPoint(x, y, 0, width, height, pos.x, pos.y, cornerRadius, rs)) {\n addEle(node, 0);\n return true;\n }\n }\n }\n function checkEdge(edge) {\n var _p = edge._private;\n var rs = _p.rscratch;\n var styleWidth = edge.pstyle('width').pfValue;\n var scale = edge.pstyle('arrow-scale').value;\n var width = styleWidth / 2 + edgeThreshold; // more like a distance radius from centre\n var widthSq = width * width;\n var width2 = width * 2;\n var src = _p.source;\n var tgt = _p.target;\n var sqDist;\n if (rs.edgeType === 'segments' || rs.edgeType === 'straight' || rs.edgeType === 'haystack') {\n var pts = rs.allpts;\n for (var i = 0; i + 3 < pts.length; i += 2) {\n if (inLineVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], width2) && widthSq > (sqDist = sqdistToFiniteLine(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3]))) {\n addEle(edge, sqDist);\n return true;\n }\n }\n } else if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') {\n var pts = rs.allpts;\n for (var i = 0; i + 5 < rs.allpts.length; i += 4) {\n if (inBezierVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5], width2) && widthSq > (sqDist = sqdistToQuadraticBezier(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5]))) {\n addEle(edge, sqDist);\n return true;\n }\n }\n }\n\n // if we're close to the edge but didn't hit it, maybe we hit its arrows\n\n var src = src || _p.source;\n var tgt = tgt || _p.target;\n var arSize = self.getArrowWidth(styleWidth, scale);\n var arrows = [{\n name: 'source',\n x: rs.arrowStartX,\n y: rs.arrowStartY,\n angle: rs.srcArrowAngle\n }, {\n name: 'target',\n x: rs.arrowEndX,\n y: rs.arrowEndY,\n angle: rs.tgtArrowAngle\n }, {\n name: 'mid-source',\n x: rs.midX,\n y: rs.midY,\n angle: rs.midsrcArrowAngle\n }, {\n name: 'mid-target',\n x: rs.midX,\n y: rs.midY,\n angle: rs.midtgtArrowAngle\n }];\n for (var i = 0; i < arrows.length; i++) {\n var ar = arrows[i];\n var shape = r.arrowShapes[edge.pstyle(ar.name + '-arrow-shape').value];\n var edgeWidth = edge.pstyle('width').pfValue;\n if (shape.roughCollide(x, y, arSize, ar.angle, {\n x: ar.x,\n y: ar.y\n }, edgeWidth, edgeThreshold) && shape.collide(x, y, arSize, ar.angle, {\n x: ar.x,\n y: ar.y\n }, edgeWidth, edgeThreshold)) {\n addEle(edge);\n return true;\n }\n }\n\n // for compound graphs, hitting edge may actually want a connected node instead (b/c edge may have greater z-index precedence)\n if (hasCompounds && near.length > 0) {\n checkNode(src);\n checkNode(tgt);\n }\n }\n function preprop(obj, name, pre) {\n return getPrefixedProperty(obj, name, pre);\n }\n function checkLabel(ele, prefix) {\n var _p = ele._private;\n var th = labelThreshold;\n var prefixDash;\n if (prefix) {\n prefixDash = prefix + '-';\n } else {\n prefixDash = '';\n }\n ele.boundingBox();\n var bb = _p.labelBounds[prefix || 'main'];\n var text = ele.pstyle(prefixDash + 'label').value;\n var eventsEnabled = ele.pstyle('text-events').strValue === 'yes';\n if (!eventsEnabled || !text) {\n return;\n }\n var lx = preprop(_p.rscratch, 'labelX', prefix);\n var ly = preprop(_p.rscratch, 'labelY', prefix);\n var theta = preprop(_p.rscratch, 'labelAngle', prefix);\n var ox = ele.pstyle(prefixDash + 'text-margin-x').pfValue;\n var oy = ele.pstyle(prefixDash + 'text-margin-y').pfValue;\n var lx1 = bb.x1 - th - ox; // (-ox, -oy) as bb already includes margin\n var lx2 = bb.x2 + th - ox; // and rotation is about (lx, ly)\n var ly1 = bb.y1 - th - oy;\n var ly2 = bb.y2 + th - oy;\n if (theta) {\n var cos = Math.cos(theta);\n var sin = Math.sin(theta);\n var rotate = function rotate(x, y) {\n x = x - lx;\n y = y - ly;\n return {\n x: x * cos - y * sin + lx,\n y: x * sin + y * cos + ly\n };\n };\n var px1y1 = rotate(lx1, ly1);\n var px1y2 = rotate(lx1, ly2);\n var px2y1 = rotate(lx2, ly1);\n var px2y2 = rotate(lx2, ly2);\n var points = [\n // with the margin added after the rotation is applied\n px1y1.x + ox, px1y1.y + oy, px2y1.x + ox, px2y1.y + oy, px2y2.x + ox, px2y2.y + oy, px1y2.x + ox, px1y2.y + oy];\n if (pointInsidePolygonPoints(x, y, points)) {\n addEle(ele);\n return true;\n }\n } else {\n // do a cheaper bb check\n if (inBoundingBox(bb, x, y)) {\n addEle(ele);\n return true;\n }\n }\n }\n for (var i = eles.length - 1; i >= 0; i--) {\n // reverse order for precedence\n var ele = eles[i];\n if (ele.isNode()) {\n checkNode(ele) || checkLabel(ele);\n } else {\n // then edge\n checkEdge(ele) || checkLabel(ele) || checkLabel(ele, 'source') || checkLabel(ele, 'target');\n }\n }\n return near;\n};\n\n// 'Give me everything from this box'\nBRp$e.getAllInBox = function (x1, y1, x2, y2) {\n var eles = this.getCachedZSortedEles().interactive;\n var zoom = this.cy.zoom();\n var labelThreshold = 2 / zoom;\n var box = [];\n var x1c = Math.min(x1, x2);\n var x2c = Math.max(x1, x2);\n var y1c = Math.min(y1, y2);\n var y2c = Math.max(y1, y2);\n x1 = x1c;\n x2 = x2c;\n y1 = y1c;\n y2 = y2c;\n var boxBb = makeBoundingBox({\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2\n });\n var selectionBox = [{\n x: boxBb.x1,\n y: boxBb.y1\n }, {\n x: boxBb.x2,\n y: boxBb.y1\n }, {\n x: boxBb.x2,\n y: boxBb.y2\n }, {\n x: boxBb.x1,\n y: boxBb.y2\n }];\n var boxEdges = [[selectionBox[0], selectionBox[1]], [selectionBox[1], selectionBox[2]], [selectionBox[2], selectionBox[3]], [selectionBox[3], selectionBox[0]]];\n function preprop(obj, name, pre) {\n return getPrefixedProperty(obj, name, pre);\n }\n function getRotatedLabelBox(ele, prefix) {\n var _p = ele._private;\n var th = labelThreshold;\n var prefixDash = '';\n ele.boundingBox();\n var bb = _p.labelBounds['main'];\n\n // If the bounding box is not available, return null.\n // This indicates that the label box cannot be calculated, which is consistent\n // with the expected behavior of this function. Returning null allows the caller\n // to handle the absence of a bounding box explicitly.\n if (!bb) {\n return null;\n }\n var lx = preprop(_p.rscratch, 'labelX', prefix);\n var ly = preprop(_p.rscratch, 'labelY', prefix);\n var theta = preprop(_p.rscratch, 'labelAngle', prefix);\n var ox = ele.pstyle(prefixDash + 'text-margin-x').pfValue;\n var oy = ele.pstyle(prefixDash + 'text-margin-y').pfValue;\n var lx1 = bb.x1 - th - ox;\n var lx2 = bb.x2 + th - ox;\n var ly1 = bb.y1 - th - oy;\n var ly2 = bb.y2 + th - oy;\n if (theta) {\n var cos = Math.cos(theta);\n var sin = Math.sin(theta);\n var rotate = function rotate(x, y) {\n x = x - lx;\n y = y - ly;\n return {\n x: x * cos - y * sin + lx,\n y: x * sin + y * cos + ly\n };\n };\n return [rotate(lx1, ly1), rotate(lx2, ly1), rotate(lx2, ly2), rotate(lx1, ly2)];\n } else {\n return [{\n x: lx1,\n y: ly1\n }, {\n x: lx2,\n y: ly1\n }, {\n x: lx2,\n y: ly2\n }, {\n x: lx1,\n y: ly2\n }];\n }\n }\n function doLinesIntersect(p1, p2, q1, q2) {\n function ccw(a, b, c) {\n return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);\n }\n return ccw(p1, q1, q2) !== ccw(p2, q1, q2) && ccw(p1, p2, q1) !== ccw(p1, p2, q2);\n }\n for (var e = 0; e < eles.length; e++) {\n var ele = eles[e];\n if (ele.isNode()) {\n var node = ele;\n var textEvents = node.pstyle('text-events').strValue === 'yes';\n var nodeBoxSelectMode = node.pstyle('box-selection').strValue;\n var labelBoxSelectEnabled = node.pstyle('box-select-labels').strValue === 'yes';\n if (nodeBoxSelectMode === 'none') {\n continue;\n }\n var includeLabels = (nodeBoxSelectMode === 'overlap' || labelBoxSelectEnabled) && textEvents;\n var nodeBb = node.boundingBox({\n includeNodes: true,\n includeEdges: false,\n includeLabels: includeLabels\n });\n if (nodeBoxSelectMode === 'contain') {\n var selected = false;\n if (labelBoxSelectEnabled && textEvents) {\n var rotatedLabelBox = getRotatedLabelBox(node);\n if (rotatedLabelBox && satPolygonIntersection(rotatedLabelBox, selectionBox)) {\n box.push(node);\n selected = true;\n }\n }\n if (!selected && boundingBoxInBoundingBox(boxBb, nodeBb)) {\n box.push(node);\n }\n } else if (nodeBoxSelectMode === 'overlap') {\n if (boundingBoxesIntersect(boxBb, nodeBb)) {\n var nodeBodyBb = node.boundingBox({\n includeNodes: true,\n includeEdges: true,\n includeLabels: false,\n includeMainLabels: false,\n includeSourceLabels: false,\n includeTargetLabels: false\n });\n var nodeBodyCorners = [{\n x: nodeBodyBb.x1,\n y: nodeBodyBb.y1\n }, {\n x: nodeBodyBb.x2,\n y: nodeBodyBb.y1\n }, {\n x: nodeBodyBb.x2,\n y: nodeBodyBb.y2\n }, {\n x: nodeBodyBb.x1,\n y: nodeBodyBb.y2\n }];\n\n // if node body intersects, no need to check label\n if (satPolygonIntersection(nodeBodyCorners, selectionBox)) {\n box.push(node);\n } else {\n // only check label if node body didn't intersect\n var _rotatedLabelBox = getRotatedLabelBox(node);\n if (_rotatedLabelBox && satPolygonIntersection(_rotatedLabelBox, selectionBox)) {\n box.push(node);\n }\n }\n }\n }\n } else {\n var edge = ele;\n var _p = edge._private;\n var rs = _p.rscratch;\n var edgeBoxSelectMode = edge.pstyle('box-selection').strValue;\n if (edgeBoxSelectMode === 'none') {\n continue;\n }\n if (edgeBoxSelectMode === 'contain') {\n if (rs.startX != null && rs.startY != null && !inBoundingBox(boxBb, rs.startX, rs.startY)) {\n continue;\n }\n if (rs.endX != null && rs.endY != null && !inBoundingBox(boxBb, rs.endX, rs.endY)) {\n continue;\n }\n if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound' || rs.edgeType === 'segments' || rs.edgeType === 'haystack') {\n var pts = _p.rstyle.bezierPts || _p.rstyle.linePts || _p.rstyle.haystackPts;\n var allInside = true;\n for (var i = 0; i < pts.length; i++) {\n if (!pointInBoundingBox(boxBb, pts[i])) {\n allInside = false;\n break;\n }\n }\n if (allInside) {\n box.push(edge);\n }\n } else if (rs.edgeType === 'straight') {\n box.push(edge);\n }\n } else if (edgeBoxSelectMode === 'overlap') {\n var _selected = false;\n\n // Check: either endpoint inside box\n if (rs.startX != null && rs.startY != null && rs.endX != null && rs.endY != null && (inBoundingBox(boxBb, rs.startX, rs.startY) || inBoundingBox(boxBb, rs.endX, rs.endY))) {\n box.push(edge);\n _selected = true;\n }\n\n // Haystack fallback (only check if not already selected)\n else if (!_selected && rs.edgeType === 'haystack') {\n var haystackPts = _p.rstyle.haystackPts;\n for (var _i = 0; _i < haystackPts.length; _i++) {\n if (pointInBoundingBox(boxBb, haystackPts[_i])) {\n box.push(edge);\n _selected = true;\n break;\n }\n }\n }\n\n // Segment intersection check (only if not already selected)\n if (!_selected) {\n var _pts = _p.rstyle.bezierPts || _p.rstyle.linePts || _p.rstyle.haystackPts;\n\n // straight edges\n if ((!_pts || _pts.length < 2) && rs.edgeType === 'straight') {\n if (rs.startX != null && rs.startY != null && rs.endX != null && rs.endY != null) {\n _pts = [{\n x: rs.startX,\n y: rs.startY\n }, {\n x: rs.endX,\n y: rs.endY\n }];\n }\n }\n if (!_pts || _pts.length < 2) continue;\n for (var _i2 = 0; _i2 < _pts.length - 1; _i2++) {\n var segStart = _pts[_i2];\n var segEnd = _pts[_i2 + 1];\n for (var b = 0; b < boxEdges.length; b++) {\n var _boxEdges$b = _slicedToArray(boxEdges[b], 2),\n boxStart = _boxEdges$b[0],\n boxEnd = _boxEdges$b[1];\n if (doLinesIntersect(segStart, segEnd, boxStart, boxEnd)) {\n box.push(edge);\n _selected = true;\n break;\n }\n }\n if (_selected) break;\n }\n }\n }\n }\n }\n return box;\n};\n\nvar BRp$d = {};\nBRp$d.calculateArrowAngles = function (edge) {\n var rs = edge._private.rscratch;\n var isHaystack = rs.edgeType === 'haystack';\n var isBezier = rs.edgeType === 'bezier';\n var isMultibezier = rs.edgeType === 'multibezier';\n var isSegments = rs.edgeType === 'segments';\n var isCompound = rs.edgeType === 'compound';\n var isSelf = rs.edgeType === 'self';\n\n // Displacement gives direction for arrowhead orientation\n var dispX, dispY;\n var startX, startY, endX, endY, midX, midY;\n if (isHaystack) {\n startX = rs.haystackPts[0];\n startY = rs.haystackPts[1];\n endX = rs.haystackPts[2];\n endY = rs.haystackPts[3];\n } else {\n startX = rs.arrowStartX;\n startY = rs.arrowStartY;\n endX = rs.arrowEndX;\n endY = rs.arrowEndY;\n }\n midX = rs.midX;\n midY = rs.midY;\n\n // source\n //\n\n if (isSegments) {\n dispX = startX - rs.segpts[0];\n dispY = startY - rs.segpts[1];\n } else if (isMultibezier || isCompound || isSelf || isBezier) {\n var pts = rs.allpts;\n var bX = qbezierAt(pts[0], pts[2], pts[4], 0.1);\n var bY = qbezierAt(pts[1], pts[3], pts[5], 0.1);\n dispX = startX - bX;\n dispY = startY - bY;\n } else {\n dispX = startX - midX;\n dispY = startY - midY;\n }\n rs.srcArrowAngle = getAngleFromDisp(dispX, dispY);\n\n // mid target\n //\n\n var midX = rs.midX;\n var midY = rs.midY;\n if (isHaystack) {\n midX = (startX + endX) / 2;\n midY = (startY + endY) / 2;\n }\n dispX = endX - startX;\n dispY = endY - startY;\n if (isSegments) {\n var pts = rs.allpts;\n if (pts.length / 2 % 2 === 0) {\n var i2 = pts.length / 2;\n var i1 = i2 - 2;\n dispX = pts[i2] - pts[i1];\n dispY = pts[i2 + 1] - pts[i1 + 1];\n } else if (rs.isRound) {\n dispX = rs.midVector[1];\n dispY = -rs.midVector[0];\n } else {\n var i2 = pts.length / 2 - 1;\n var i1 = i2 - 2;\n dispX = pts[i2] - pts[i1];\n dispY = pts[i2 + 1] - pts[i1 + 1];\n }\n } else if (isMultibezier || isCompound || isSelf) {\n var pts = rs.allpts;\n var cpts = rs.ctrlpts;\n var bp0x, bp0y;\n var bp1x, bp1y;\n if (cpts.length / 2 % 2 === 0) {\n var p0 = pts.length / 2 - 1; // startpt\n var ic = p0 + 2;\n var p1 = ic + 2;\n bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0);\n bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0);\n bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0001);\n bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0001);\n } else {\n var ic = pts.length / 2 - 1; // ctrpt\n var p0 = ic - 2; // startpt\n var p1 = ic + 2; // endpt\n\n bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.4999);\n bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.4999);\n bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.5);\n bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.5);\n }\n dispX = bp1x - bp0x;\n dispY = bp1y - bp0y;\n }\n rs.midtgtArrowAngle = getAngleFromDisp(dispX, dispY);\n rs.midDispX = dispX;\n rs.midDispY = dispY;\n\n // mid source\n //\n\n dispX *= -1;\n dispY *= -1;\n if (isSegments) {\n var pts = rs.allpts;\n if (pts.length / 2 % 2 === 0) ; else if (!rs.isRound) {\n var i2 = pts.length / 2 - 1;\n var i3 = i2 + 2;\n dispX = -(pts[i3] - pts[i2]);\n dispY = -(pts[i3 + 1] - pts[i2 + 1]);\n }\n }\n rs.midsrcArrowAngle = getAngleFromDisp(dispX, dispY);\n\n // target\n //\n\n if (isSegments) {\n dispX = endX - rs.segpts[rs.segpts.length - 2];\n dispY = endY - rs.segpts[rs.segpts.length - 1];\n } else if (isMultibezier || isCompound || isSelf || isBezier) {\n var pts = rs.allpts;\n var l = pts.length;\n var bX = qbezierAt(pts[l - 6], pts[l - 4], pts[l - 2], 0.9);\n var bY = qbezierAt(pts[l - 5], pts[l - 3], pts[l - 1], 0.9);\n dispX = endX - bX;\n dispY = endY - bY;\n } else {\n dispX = endX - midX;\n dispY = endY - midY;\n }\n rs.tgtArrowAngle = getAngleFromDisp(dispX, dispY);\n};\nBRp$d.getArrowWidth = BRp$d.getArrowHeight = function (edgeWidth, scale) {\n var cache = this.arrowWidthCache = this.arrowWidthCache || {};\n var cachedVal = cache[edgeWidth + ', ' + scale];\n if (cachedVal) {\n return cachedVal;\n }\n cachedVal = Math.max(Math.pow(edgeWidth * 13.37, 0.9), 29) * scale;\n cache[edgeWidth + ', ' + scale] = cachedVal;\n return cachedVal;\n};\n\n/**\n * Explained by Blindman67 at https://stackoverflow.com/a/44856925/11028828\n */\n\n// Declare reused variable to avoid reallocating variables every time the function is called\nvar x,\n y,\n v1 = {},\n v2 = {},\n sinA,\n sinA90,\n radDirection,\n drawDirection,\n angle,\n halfAngle,\n cRadius,\n lenOut,\n radius,\n limit;\nvar startX, startY, stopX, stopY;\nvar lastPoint;\n\n// convert 2 points into vector form, polar form, and normalised\nvar asVec = function asVec(p, pp, v) {\n v.x = pp.x - p.x;\n v.y = pp.y - p.y;\n v.len = Math.sqrt(v.x * v.x + v.y * v.y);\n v.nx = v.x / v.len;\n v.ny = v.y / v.len;\n v.ang = Math.atan2(v.ny, v.nx);\n};\nvar invertVec = function invertVec(originalV, invertedV) {\n invertedV.x = originalV.x * -1;\n invertedV.y = originalV.y * -1;\n invertedV.nx = originalV.nx * -1;\n invertedV.ny = originalV.ny * -1;\n invertedV.ang = originalV.ang > 0 ? -(Math.PI - originalV.ang) : Math.PI + originalV.ang;\n};\nvar calcCornerArc = function calcCornerArc(previousPoint, currentPoint, nextPoint, radiusMax, isArcRadius) {\n //-----------------------------------------\n // Part 1\n previousPoint !== lastPoint ? asVec(currentPoint, previousPoint, v1) : invertVec(v2, v1); // Avoid recalculating vec if it is the invert of the last one calculated\n asVec(currentPoint, nextPoint, v2);\n sinA = v1.nx * v2.ny - v1.ny * v2.nx;\n sinA90 = v1.nx * v2.nx - v1.ny * -v2.ny;\n angle = Math.asin(Math.max(-1, Math.min(1, sinA)));\n if (Math.abs(angle) < 1e-6) {\n x = currentPoint.x;\n y = currentPoint.y;\n cRadius = radius = 0;\n return;\n }\n //-----------------------------------------\n radDirection = 1;\n drawDirection = false;\n if (sinA90 < 0) {\n if (angle < 0) {\n angle = Math.PI + angle;\n } else {\n angle = Math.PI - angle;\n radDirection = -1;\n drawDirection = true;\n }\n } else {\n if (angle > 0) {\n radDirection = -1;\n drawDirection = true;\n }\n }\n if (currentPoint.radius !== undefined) {\n radius = currentPoint.radius;\n } else {\n radius = radiusMax;\n }\n //-----------------------------------------\n // Part 2\n halfAngle = angle / 2;\n //-----------------------------------------\n\n limit = Math.min(v1.len / 2, v2.len / 2);\n if (isArcRadius) {\n //-----------------------------------------\n // Part 3\n lenOut = Math.abs(Math.cos(halfAngle) * radius / Math.sin(halfAngle));\n\n //-----------------------------------------\n // Special part A\n if (lenOut > limit) {\n lenOut = limit;\n cRadius = Math.abs(lenOut * Math.sin(halfAngle) / Math.cos(halfAngle));\n } else {\n cRadius = radius;\n }\n } else {\n lenOut = Math.min(limit, radius);\n cRadius = Math.abs(lenOut * Math.sin(halfAngle) / Math.cos(halfAngle));\n }\n //-----------------------------------------\n\n //-----------------------------------------\n // Part 4\n stopX = currentPoint.x + v2.nx * lenOut;\n stopY = currentPoint.y + v2.ny * lenOut;\n //-----------------------------------------\n // Part 5\n x = stopX - v2.ny * cRadius * radDirection;\n y = stopY + v2.nx * cRadius * radDirection;\n //-----------------------------------------\n // Additional Part : calculate start point E\n startX = currentPoint.x + v1.nx * lenOut;\n startY = currentPoint.y + v1.ny * lenOut;\n\n // Save last point to avoid recalculating vector when not needed\n lastPoint = currentPoint;\n};\n\n/**\n * Draw corner provided by {@link getRoundCorner}\n *\n * @param ctx :CanvasRenderingContext2D\n * @param roundCorner {{cx:number, cy:number, radius:number, endAngle: number, startAngle: number, counterClockwise: boolean}}\n */\nfunction drawPreparedRoundCorner(ctx, roundCorner) {\n if (roundCorner.radius === 0) ctx.lineTo(roundCorner.cx, roundCorner.cy);else ctx.arc(roundCorner.cx, roundCorner.cy, roundCorner.radius, roundCorner.startAngle, roundCorner.endAngle, roundCorner.counterClockwise);\n}\n\n/**\n * Get round corner from a point and its previous and next neighbours in a path\n *\n * @param previousPoint {{x: number, y:number, radius: number?}}\n * @param currentPoint {{x: number, y:number, radius: number?}}\n * @param nextPoint {{x: number, y:number, radius: number?}}\n * @param radiusMax :number\n * @param isArcRadius :boolean\n * @return {{\n * cx:number, cy:number, radius:number,\n * startX:number, startY:number,\n * stopX:number, stopY: number,\n * endAngle: number, startAngle: number, counterClockwise: boolean\n * }}\n */\nfunction getRoundCorner(previousPoint, currentPoint, nextPoint, radiusMax) {\n var isArcRadius = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n if (radiusMax === 0 || currentPoint.radius === 0) return {\n cx: currentPoint.x,\n cy: currentPoint.y,\n radius: 0,\n startX: currentPoint.x,\n startY: currentPoint.y,\n stopX: currentPoint.x,\n stopY: currentPoint.y,\n startAngle: undefined,\n endAngle: undefined,\n counterClockwise: undefined\n };\n calcCornerArc(previousPoint, currentPoint, nextPoint, radiusMax, isArcRadius);\n return {\n cx: x,\n cy: y,\n radius: cRadius,\n startX: startX,\n startY: startY,\n stopX: stopX,\n stopY: stopY,\n startAngle: v1.ang + Math.PI / 2 * radDirection,\n endAngle: v2.ang - Math.PI / 2 * radDirection,\n counterClockwise: drawDirection\n };\n}\n\nvar AVOID_IMPOSSIBLE_BEZIER_CONSTANT = 0.01;\nvar AVOID_IMPOSSIBLE_BEZIER_CONSTANT_L = Math.sqrt(2 * AVOID_IMPOSSIBLE_BEZIER_CONSTANT);\nvar BRp$c = {};\nBRp$c.findMidptPtsEtc = function (edge, pairInfo) {\n var posPts = pairInfo.posPts,\n intersectionPts = pairInfo.intersectionPts,\n vectorNormInverse = pairInfo.vectorNormInverse;\n var midptPts;\n\n // n.b. assumes all edges in bezier bundle have same endpoints specified\n var srcManEndpt = edge.pstyle('source-endpoint');\n var tgtManEndpt = edge.pstyle('target-endpoint');\n var haveManualEndPts = srcManEndpt.units != null && tgtManEndpt.units != null;\n var recalcVectorNormInverse = function recalcVectorNormInverse(x1, y1, x2, y2) {\n var dy = y2 - y1;\n var dx = x2 - x1;\n var l = Math.sqrt(dx * dx + dy * dy);\n return {\n x: -dy / l,\n y: dx / l\n };\n };\n var edgeDistances = edge.pstyle('edge-distances').value;\n switch (edgeDistances) {\n case 'node-position':\n midptPts = posPts;\n break;\n case 'intersection':\n midptPts = intersectionPts;\n break;\n case 'endpoints':\n {\n if (haveManualEndPts) {\n var _this$manualEndptToPx = this.manualEndptToPx(edge.source()[0], srcManEndpt),\n _this$manualEndptToPx2 = _slicedToArray(_this$manualEndptToPx, 2),\n x1 = _this$manualEndptToPx2[0],\n y1 = _this$manualEndptToPx2[1];\n var _this$manualEndptToPx3 = this.manualEndptToPx(edge.target()[0], tgtManEndpt),\n _this$manualEndptToPx4 = _slicedToArray(_this$manualEndptToPx3, 2),\n x2 = _this$manualEndptToPx4[0],\n y2 = _this$manualEndptToPx4[1];\n var endPts = {\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2\n };\n vectorNormInverse = recalcVectorNormInverse(x1, y1, x2, y2);\n midptPts = endPts;\n } else {\n warn(\"Edge \".concat(edge.id(), \" has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).\"));\n midptPts = intersectionPts; // back to default\n }\n break;\n }\n }\n return {\n midptPts: midptPts,\n vectorNormInverse: vectorNormInverse\n };\n};\nBRp$c.findHaystackPoints = function (edges) {\n for (var i = 0; i < edges.length; i++) {\n var edge = edges[i];\n var _p = edge._private;\n var rs = _p.rscratch;\n if (!rs.haystack) {\n var angle = Math.random() * 2 * Math.PI;\n rs.source = {\n x: Math.cos(angle),\n y: Math.sin(angle)\n };\n angle = Math.random() * 2 * Math.PI;\n rs.target = {\n x: Math.cos(angle),\n y: Math.sin(angle)\n };\n }\n var src = _p.source;\n var tgt = _p.target;\n var srcPos = src.position();\n var tgtPos = tgt.position();\n var srcW = src.width();\n var tgtW = tgt.width();\n var srcH = src.height();\n var tgtH = tgt.height();\n var radius = edge.pstyle('haystack-radius').value;\n var halfRadius = radius / 2; // b/c have to half width/height\n\n rs.haystackPts = rs.allpts = [rs.source.x * srcW * halfRadius + srcPos.x, rs.source.y * srcH * halfRadius + srcPos.y, rs.target.x * tgtW * halfRadius + tgtPos.x, rs.target.y * tgtH * halfRadius + tgtPos.y];\n rs.midX = (rs.allpts[0] + rs.allpts[2]) / 2;\n rs.midY = (rs.allpts[1] + rs.allpts[3]) / 2;\n\n // always override as haystack in case set to different type previously\n rs.edgeType = 'haystack';\n rs.haystack = true;\n this.storeEdgeProjections(edge);\n this.calculateArrowAngles(edge);\n this.recalculateEdgeLabelProjections(edge);\n this.calculateLabelAngles(edge);\n }\n};\nBRp$c.findSegmentsPoints = function (edge, pairInfo) {\n // Segments (multiple straight lines)\n\n var rs = edge._private.rscratch;\n var segmentWs = edge.pstyle('segment-weights');\n var segmentDs = edge.pstyle('segment-distances');\n var segmentRs = edge.pstyle('segment-radii');\n var segmentTs = edge.pstyle('radius-type');\n var segmentsN = Math.min(segmentWs.pfValue.length, segmentDs.pfValue.length);\n var lastRadius = segmentRs.pfValue[segmentRs.pfValue.length - 1];\n var lastRadiusType = segmentTs.pfValue[segmentTs.pfValue.length - 1];\n rs.edgeType = 'segments';\n rs.segpts = [];\n rs.radii = [];\n rs.isArcRadius = [];\n for (var s = 0; s < segmentsN; s++) {\n var w = segmentWs.pfValue[s];\n var d = segmentDs.pfValue[s];\n var w1 = 1 - w;\n var w2 = w;\n var _this$findMidptPtsEtc = this.findMidptPtsEtc(edge, pairInfo),\n midptPts = _this$findMidptPtsEtc.midptPts,\n vectorNormInverse = _this$findMidptPtsEtc.vectorNormInverse;\n var adjustedMidpt = {\n x: midptPts.x1 * w1 + midptPts.x2 * w2,\n y: midptPts.y1 * w1 + midptPts.y2 * w2\n };\n rs.segpts.push(adjustedMidpt.x + vectorNormInverse.x * d, adjustedMidpt.y + vectorNormInverse.y * d);\n rs.radii.push(segmentRs.pfValue[s] !== undefined ? segmentRs.pfValue[s] : lastRadius);\n rs.isArcRadius.push((segmentTs.pfValue[s] !== undefined ? segmentTs.pfValue[s] : lastRadiusType) === 'arc-radius');\n }\n};\nBRp$c.findLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) {\n // Self-edge\n\n var rs = edge._private.rscratch;\n var dirCounts = pairInfo.dirCounts,\n srcPos = pairInfo.srcPos;\n var ctrlptDists = edge.pstyle('control-point-distances');\n var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined;\n var loopDir = edge.pstyle('loop-direction').pfValue;\n var loopSwp = edge.pstyle('loop-sweep').pfValue;\n var stepSize = edge.pstyle('control-point-step-size').pfValue;\n rs.edgeType = 'self';\n var j = i;\n var loopDist = stepSize;\n if (edgeIsUnbundled) {\n j = 0;\n loopDist = ctrlptDist;\n }\n var loopAngle = loopDir - Math.PI / 2;\n var outAngle = loopAngle - loopSwp / 2;\n var inAngle = loopAngle + loopSwp / 2;\n\n // increase by step size for overlapping loops, keyed on direction and sweep values\n var dc = String(loopDir + '_' + loopSwp);\n j = dirCounts[dc] === undefined ? dirCounts[dc] = 0 : ++dirCounts[dc];\n rs.ctrlpts = [srcPos.x + Math.cos(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.x + Math.cos(inAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(inAngle) * 1.4 * loopDist * (j / 3 + 1)];\n};\nBRp$c.findCompoundLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) {\n // Compound edge\n\n var rs = edge._private.rscratch;\n rs.edgeType = 'compound';\n var srcPos = pairInfo.srcPos,\n tgtPos = pairInfo.tgtPos,\n srcW = pairInfo.srcW,\n srcH = pairInfo.srcH,\n tgtW = pairInfo.tgtW,\n tgtH = pairInfo.tgtH;\n var stepSize = edge.pstyle('control-point-step-size').pfValue;\n var ctrlptDists = edge.pstyle('control-point-distances');\n var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined;\n var j = i;\n var loopDist = stepSize;\n if (edgeIsUnbundled) {\n j = 0;\n loopDist = ctrlptDist;\n }\n var loopW = 50;\n var loopaPos = {\n x: srcPos.x - srcW / 2,\n y: srcPos.y - srcH / 2\n };\n var loopbPos = {\n x: tgtPos.x - tgtW / 2,\n y: tgtPos.y - tgtH / 2\n };\n var loopPos = {\n x: Math.min(loopaPos.x, loopbPos.x),\n y: Math.min(loopaPos.y, loopbPos.y)\n };\n\n // avoids cases with impossible beziers\n var minCompoundStretch = 0.5;\n var compoundStretchA = Math.max(minCompoundStretch, Math.log(srcW * AVOID_IMPOSSIBLE_BEZIER_CONSTANT));\n var compoundStretchB = Math.max(minCompoundStretch, Math.log(tgtW * AVOID_IMPOSSIBLE_BEZIER_CONSTANT));\n rs.ctrlpts = [loopPos.x, loopPos.y - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchA, loopPos.x - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchB, loopPos.y];\n};\nBRp$c.findStraightEdgePoints = function (edge) {\n // Straight edge within bundle\n\n edge._private.rscratch.edgeType = 'straight';\n};\nBRp$c.findBezierPoints = function (edge, pairInfo, i, edgeIsUnbundled, edgeIsSwapped) {\n var rs = edge._private.rscratch;\n var stepSize = edge.pstyle('control-point-step-size').pfValue;\n var ctrlptDists = edge.pstyle('control-point-distances');\n var ctrlptWs = edge.pstyle('control-point-weights');\n var bezierN = ctrlptDists && ctrlptWs ? Math.min(ctrlptDists.value.length, ctrlptWs.value.length) : 1;\n var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined;\n var ctrlptWeight = ctrlptWs.value[0];\n\n // (Multi)bezier\n\n var multi = edgeIsUnbundled;\n rs.edgeType = multi ? 'multibezier' : 'bezier';\n rs.ctrlpts = [];\n for (var b = 0; b < bezierN; b++) {\n var normctrlptDist = (0.5 - pairInfo.eles.length / 2 + i) * stepSize * (edgeIsSwapped ? -1 : 1);\n var manctrlptDist = undefined;\n var sign = signum(normctrlptDist);\n if (multi) {\n ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[b] : stepSize; // fall back on step size\n ctrlptWeight = ctrlptWs.value[b];\n }\n if (edgeIsUnbundled) {\n // multi or single unbundled\n manctrlptDist = ctrlptDist;\n } else {\n manctrlptDist = ctrlptDist !== undefined ? sign * ctrlptDist : undefined;\n }\n var distanceFromMidpoint = manctrlptDist !== undefined ? manctrlptDist : normctrlptDist;\n var w1 = 1 - ctrlptWeight;\n var w2 = ctrlptWeight;\n var _this$findMidptPtsEtc2 = this.findMidptPtsEtc(edge, pairInfo),\n midptPts = _this$findMidptPtsEtc2.midptPts,\n vectorNormInverse = _this$findMidptPtsEtc2.vectorNormInverse;\n var adjustedMidpt = {\n x: midptPts.x1 * w1 + midptPts.x2 * w2,\n y: midptPts.y1 * w1 + midptPts.y2 * w2\n };\n rs.ctrlpts.push(adjustedMidpt.x + vectorNormInverse.x * distanceFromMidpoint, adjustedMidpt.y + vectorNormInverse.y * distanceFromMidpoint);\n }\n};\nBRp$c.findTaxiPoints = function (edge, pairInfo) {\n // Taxicab geometry with two turns maximum\n\n var rs = edge._private.rscratch;\n rs.edgeType = 'segments';\n var VERTICAL = 'vertical';\n var HORIZONTAL = 'horizontal';\n var LEFTWARD = 'leftward';\n var RIGHTWARD = 'rightward';\n var DOWNWARD = 'downward';\n var UPWARD = 'upward';\n var AUTO = 'auto';\n var posPts = pairInfo.posPts,\n srcW = pairInfo.srcW,\n srcH = pairInfo.srcH,\n tgtW = pairInfo.tgtW,\n tgtH = pairInfo.tgtH;\n var edgeDistances = edge.pstyle('edge-distances').value;\n var dIncludesNodeBody = edgeDistances !== 'node-position';\n var taxiDir = edge.pstyle('taxi-direction').value;\n var rawTaxiDir = taxiDir; // unprocessed value\n var taxiTurn = edge.pstyle('taxi-turn');\n var turnIsPercent = taxiTurn.units === '%';\n var taxiTurnPfVal = taxiTurn.pfValue;\n var turnIsNegative = taxiTurnPfVal < 0; // i.e. from target side\n var minD = edge.pstyle('taxi-turn-min-distance').pfValue;\n var dw = dIncludesNodeBody ? (srcW + tgtW) / 2 : 0;\n var dh = dIncludesNodeBody ? (srcH + tgtH) / 2 : 0;\n var pdx = posPts.x2 - posPts.x1;\n var pdy = posPts.y2 - posPts.y1;\n\n // take away the effective w/h from the magnitude of the delta value\n var subDWH = function subDWH(dxy, dwh) {\n if (dxy > 0) {\n return Math.max(dxy - dwh, 0);\n } else {\n return Math.min(dxy + dwh, 0);\n }\n };\n var dx = subDWH(pdx, dw);\n var dy = subDWH(pdy, dh);\n var isExplicitDir = false;\n if (rawTaxiDir === AUTO) {\n taxiDir = Math.abs(dx) > Math.abs(dy) ? HORIZONTAL : VERTICAL;\n } else if (rawTaxiDir === UPWARD || rawTaxiDir === DOWNWARD) {\n taxiDir = VERTICAL;\n isExplicitDir = true;\n } else if (rawTaxiDir === LEFTWARD || rawTaxiDir === RIGHTWARD) {\n taxiDir = HORIZONTAL;\n isExplicitDir = true;\n }\n var isVert = taxiDir === VERTICAL;\n var l = isVert ? dy : dx;\n var pl = isVert ? pdy : pdx;\n var sgnL = signum(pl);\n var forcedDir = false;\n if (!(isExplicitDir && (turnIsPercent || turnIsNegative)) // forcing in this case would cause weird growing in the opposite direction\n && (rawTaxiDir === DOWNWARD && pl < 0 || rawTaxiDir === UPWARD && pl > 0 || rawTaxiDir === LEFTWARD && pl > 0 || rawTaxiDir === RIGHTWARD && pl < 0)) {\n sgnL *= -1;\n l = sgnL * Math.abs(l);\n forcedDir = true;\n }\n var d;\n if (turnIsPercent) {\n var p = taxiTurnPfVal < 0 ? 1 + taxiTurnPfVal : taxiTurnPfVal;\n d = p * l;\n } else {\n var k = taxiTurnPfVal < 0 ? l : 0;\n d = k + taxiTurnPfVal * sgnL;\n }\n var getIsTooClose = function getIsTooClose(d) {\n return Math.abs(d) < minD || Math.abs(d) >= Math.abs(l);\n };\n var isTooCloseSrc = getIsTooClose(d);\n var isTooCloseTgt = getIsTooClose(Math.abs(l) - Math.abs(d));\n var isTooClose = isTooCloseSrc || isTooCloseTgt;\n if (isTooClose && !forcedDir) {\n // non-ideal routing\n if (isVert) {\n // vertical fallbacks\n var lShapeInsideSrc = Math.abs(pl) <= srcH / 2;\n var lShapeInsideTgt = Math.abs(pdx) <= tgtW / 2;\n if (lShapeInsideSrc) {\n // horizontal Z-shape (direction not respected)\n var x = (posPts.x1 + posPts.x2) / 2;\n var y1 = posPts.y1,\n y2 = posPts.y2;\n rs.segpts = [x, y1, x, y2];\n } else if (lShapeInsideTgt) {\n // vertical Z-shape (distance not respected)\n var y = (posPts.y1 + posPts.y2) / 2;\n var x1 = posPts.x1,\n x2 = posPts.x2;\n rs.segpts = [x1, y, x2, y];\n } else {\n // L-shape fallback (turn distance not respected, but works well with tree siblings)\n rs.segpts = [posPts.x1, posPts.y2];\n }\n } else {\n // horizontal fallbacks\n var _lShapeInsideSrc = Math.abs(pl) <= srcW / 2;\n var _lShapeInsideTgt = Math.abs(pdy) <= tgtH / 2;\n if (_lShapeInsideSrc) {\n // vertical Z-shape (direction not respected)\n var _y = (posPts.y1 + posPts.y2) / 2;\n var _x = posPts.x1,\n _x2 = posPts.x2;\n rs.segpts = [_x, _y, _x2, _y];\n } else if (_lShapeInsideTgt) {\n // horizontal Z-shape (turn distance not respected)\n var _x3 = (posPts.x1 + posPts.x2) / 2;\n var _y2 = posPts.y1,\n _y3 = posPts.y2;\n rs.segpts = [_x3, _y2, _x3, _y3];\n } else {\n // L-shape (turn distance not respected, but works well for tree siblings)\n rs.segpts = [posPts.x2, posPts.y1];\n }\n }\n } else {\n // ideal routing\n if (isVert) {\n var _y4 = posPts.y1 + d + (dIncludesNodeBody ? srcH / 2 * sgnL : 0);\n var _x4 = posPts.x1,\n _x5 = posPts.x2;\n rs.segpts = [_x4, _y4, _x5, _y4];\n } else {\n // horizontal\n var _x6 = posPts.x1 + d + (dIncludesNodeBody ? srcW / 2 * sgnL : 0);\n var _y5 = posPts.y1,\n _y6 = posPts.y2;\n rs.segpts = [_x6, _y5, _x6, _y6];\n }\n }\n if (rs.isRound) {\n var radius = edge.pstyle('taxi-radius').value;\n var isArcRadius = edge.pstyle('radius-type').value[0] === 'arc-radius';\n rs.radii = new Array(rs.segpts.length / 2).fill(radius);\n rs.isArcRadius = new Array(rs.segpts.length / 2).fill(isArcRadius);\n }\n};\nBRp$c.tryToCorrectInvalidPoints = function (edge, pairInfo) {\n var rs = edge._private.rscratch;\n\n // can only correct beziers for now...\n if (rs.edgeType === 'bezier') {\n var srcPos = pairInfo.srcPos,\n tgtPos = pairInfo.tgtPos,\n srcW = pairInfo.srcW,\n srcH = pairInfo.srcH,\n tgtW = pairInfo.tgtW,\n tgtH = pairInfo.tgtH,\n srcShape = pairInfo.srcShape,\n tgtShape = pairInfo.tgtShape,\n srcCornerRadius = pairInfo.srcCornerRadius,\n tgtCornerRadius = pairInfo.tgtCornerRadius,\n srcRs = pairInfo.srcRs,\n tgtRs = pairInfo.tgtRs;\n var badStart = !number$1(rs.startX) || !number$1(rs.startY);\n var badAStart = !number$1(rs.arrowStartX) || !number$1(rs.arrowStartY);\n var badEnd = !number$1(rs.endX) || !number$1(rs.endY);\n var badAEnd = !number$1(rs.arrowEndX) || !number$1(rs.arrowEndY);\n var minCpADistFactor = 3;\n var arrowW = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth;\n var minCpADist = minCpADistFactor * arrowW;\n var startACpDist = dist({\n x: rs.ctrlpts[0],\n y: rs.ctrlpts[1]\n }, {\n x: rs.startX,\n y: rs.startY\n });\n var closeStartACp = startACpDist < minCpADist;\n var endACpDist = dist({\n x: rs.ctrlpts[0],\n y: rs.ctrlpts[1]\n }, {\n x: rs.endX,\n y: rs.endY\n });\n var closeEndACp = endACpDist < minCpADist;\n var overlapping = false;\n if (badStart || badAStart || closeStartACp) {\n overlapping = true;\n\n // project control point along line from src centre to outside the src shape\n // (otherwise intersection will yield nothing)\n var cpD = {\n // delta\n x: rs.ctrlpts[0] - srcPos.x,\n y: rs.ctrlpts[1] - srcPos.y\n };\n var cpL = Math.sqrt(cpD.x * cpD.x + cpD.y * cpD.y); // length of line\n var cpM = {\n // normalised delta\n x: cpD.x / cpL,\n y: cpD.y / cpL\n };\n var radius = Math.max(srcW, srcH);\n var cpProj = {\n // *2 radius guarantees outside shape\n x: rs.ctrlpts[0] + cpM.x * 2 * radius,\n y: rs.ctrlpts[1] + cpM.y * 2 * radius\n };\n var srcCtrlPtIntn = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, cpProj.x, cpProj.y, 0, srcCornerRadius, srcRs);\n if (closeStartACp) {\n rs.ctrlpts[0] = rs.ctrlpts[0] + cpM.x * (minCpADist - startACpDist);\n rs.ctrlpts[1] = rs.ctrlpts[1] + cpM.y * (minCpADist - startACpDist);\n } else {\n rs.ctrlpts[0] = srcCtrlPtIntn[0] + cpM.x * minCpADist;\n rs.ctrlpts[1] = srcCtrlPtIntn[1] + cpM.y * minCpADist;\n }\n }\n if (badEnd || badAEnd || closeEndACp) {\n overlapping = true;\n\n // project control point along line from tgt centre to outside the tgt shape\n // (otherwise intersection will yield nothing)\n var _cpD = {\n // delta\n x: rs.ctrlpts[0] - tgtPos.x,\n y: rs.ctrlpts[1] - tgtPos.y\n };\n var _cpL = Math.sqrt(_cpD.x * _cpD.x + _cpD.y * _cpD.y); // length of line\n var _cpM = {\n // normalised delta\n x: _cpD.x / _cpL,\n y: _cpD.y / _cpL\n };\n var _radius = Math.max(srcW, srcH);\n var _cpProj = {\n // *2 radius guarantees outside shape\n x: rs.ctrlpts[0] + _cpM.x * 2 * _radius,\n y: rs.ctrlpts[1] + _cpM.y * 2 * _radius\n };\n var tgtCtrlPtIntn = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, _cpProj.x, _cpProj.y, 0, tgtCornerRadius, tgtRs);\n if (closeEndACp) {\n rs.ctrlpts[0] = rs.ctrlpts[0] + _cpM.x * (minCpADist - endACpDist);\n rs.ctrlpts[1] = rs.ctrlpts[1] + _cpM.y * (minCpADist - endACpDist);\n } else {\n rs.ctrlpts[0] = tgtCtrlPtIntn[0] + _cpM.x * minCpADist;\n rs.ctrlpts[1] = tgtCtrlPtIntn[1] + _cpM.y * minCpADist;\n }\n }\n if (overlapping) {\n // recalc endpts\n this.findEndpoints(edge);\n }\n }\n};\nBRp$c.storeAllpts = function (edge) {\n var rs = edge._private.rscratch;\n if (rs.edgeType === 'multibezier' || rs.edgeType === 'bezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') {\n rs.allpts = [];\n rs.allpts.push(rs.startX, rs.startY);\n for (var b = 0; b + 1 < rs.ctrlpts.length; b += 2) {\n // ctrl pt itself\n rs.allpts.push(rs.ctrlpts[b], rs.ctrlpts[b + 1]);\n\n // the midpt between ctrlpts as intermediate destination pts\n if (b + 3 < rs.ctrlpts.length) {\n rs.allpts.push((rs.ctrlpts[b] + rs.ctrlpts[b + 2]) / 2, (rs.ctrlpts[b + 1] + rs.ctrlpts[b + 3]) / 2);\n }\n }\n rs.allpts.push(rs.endX, rs.endY);\n var m, mt;\n if (rs.ctrlpts.length / 2 % 2 === 0) {\n m = rs.allpts.length / 2 - 1;\n rs.midX = rs.allpts[m];\n rs.midY = rs.allpts[m + 1];\n } else {\n m = rs.allpts.length / 2 - 3;\n mt = 0.5;\n rs.midX = qbezierAt(rs.allpts[m], rs.allpts[m + 2], rs.allpts[m + 4], mt);\n rs.midY = qbezierAt(rs.allpts[m + 1], rs.allpts[m + 3], rs.allpts[m + 5], mt);\n }\n } else if (rs.edgeType === 'straight') {\n // need to calc these after endpts\n rs.allpts = [rs.startX, rs.startY, rs.endX, rs.endY];\n\n // default midpt for labels etc\n rs.midX = (rs.startX + rs.endX + rs.arrowStartX + rs.arrowEndX) / 4;\n rs.midY = (rs.startY + rs.endY + rs.arrowStartY + rs.arrowEndY) / 4;\n } else if (rs.edgeType === 'segments') {\n rs.allpts = [];\n rs.allpts.push(rs.startX, rs.startY);\n rs.allpts.push.apply(rs.allpts, rs.segpts);\n rs.allpts.push(rs.endX, rs.endY);\n if (rs.isRound) {\n rs.roundCorners = [];\n for (var i = 2; i + 3 < rs.allpts.length; i += 2) {\n var radius = rs.radii[i / 2 - 1];\n var isArcRadius = rs.isArcRadius[i / 2 - 1];\n rs.roundCorners.push(getRoundCorner({\n x: rs.allpts[i - 2],\n y: rs.allpts[i - 1]\n }, {\n x: rs.allpts[i],\n y: rs.allpts[i + 1],\n radius: radius\n }, {\n x: rs.allpts[i + 2],\n y: rs.allpts[i + 3]\n }, radius, isArcRadius));\n }\n }\n if (rs.segpts.length % 4 === 0) {\n var i2 = rs.segpts.length / 2;\n var i1 = i2 - 2;\n rs.midX = (rs.segpts[i1] + rs.segpts[i2]) / 2;\n rs.midY = (rs.segpts[i1 + 1] + rs.segpts[i2 + 1]) / 2;\n } else {\n var _i = rs.segpts.length / 2 - 1;\n if (!rs.isRound) {\n rs.midX = rs.segpts[_i];\n rs.midY = rs.segpts[_i + 1];\n } else {\n var point = {\n x: rs.segpts[_i],\n y: rs.segpts[_i + 1]\n };\n var corner = rs.roundCorners[_i / 2];\n if (corner.radius === 0) {\n // On collinear points\n var nextPoint = {\n x: rs.segpts[_i + 2],\n y: rs.segpts[_i + 3]\n };\n rs.midX = point.x;\n rs.midY = point.y;\n rs.midVector = [point.y - nextPoint.y, nextPoint.x - point.x];\n } else {\n // On rounded points\n var v = [point.x - corner.cx, point.y - corner.cy];\n var factor = corner.radius / Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2));\n v = v.map(function (c) {\n return c * factor;\n });\n rs.midX = corner.cx + v[0];\n rs.midY = corner.cy + v[1];\n rs.midVector = v;\n }\n }\n }\n }\n};\nBRp$c.checkForInvalidEdgeWarning = function (edge) {\n var rs = edge[0]._private.rscratch;\n if (rs.nodesOverlap || number$1(rs.startX) && number$1(rs.startY) && number$1(rs.endX) && number$1(rs.endY)) {\n rs.loggedErr = false;\n } else {\n if (!rs.loggedErr) {\n rs.loggedErr = true;\n warn('Edge `' + edge.id() + '` has invalid endpoints and so it is impossible to draw. Adjust your edge style (e.g. control points) accordingly or use an alternative edge type. This is expected behaviour when the source node and the target node overlap.');\n }\n }\n};\nBRp$c.findEdgeControlPoints = function (edges) {\n var _this = this;\n if (!edges || edges.length === 0) {\n return;\n }\n var r = this;\n var cy = r.cy;\n var hasCompounds = cy.hasCompoundNodes();\n var hashTable = new Map$1();\n var getKey = function getKey(pairId, edgeIsUnbundled) {\n return [].concat(_toConsumableArray(pairId), [edgeIsUnbundled ? 1 : 0]).join('-');\n };\n var pairIds = [];\n var haystackEdges = [];\n\n // create a table of edge (src, tgt) => list of edges between them\n for (var i = 0; i < edges.length; i++) {\n var edge = edges[i];\n var _p = edge._private;\n var curveStyle = edge.pstyle('curve-style').value;\n\n // ignore edges who are not to be displayed\n // they shouldn't take up space\n if (edge.removed() || !edge.takesUpSpace()) {\n continue;\n }\n if (curveStyle === 'haystack') {\n haystackEdges.push(edge);\n continue;\n }\n var edgeIsUnbundled = curveStyle === 'unbundled-bezier' || endsWith(curveStyle, 'segments') || curveStyle === 'straight' || curveStyle === 'straight-triangle' || endsWith(curveStyle, 'taxi');\n var edgeIsBezier = curveStyle === 'unbundled-bezier' || curveStyle === 'bezier';\n var src = _p.source;\n var tgt = _p.target;\n var srcIndex = src.poolIndex();\n var tgtIndex = tgt.poolIndex();\n var pairId = [srcIndex, tgtIndex].sort();\n var key = getKey(pairId, edgeIsUnbundled);\n var tableEntry = hashTable.get(key);\n if (tableEntry == null) {\n tableEntry = {\n eles: []\n };\n pairIds.push({\n pairId: pairId,\n edgeIsUnbundled: edgeIsUnbundled\n });\n hashTable.set(key, tableEntry);\n }\n tableEntry.eles.push(edge);\n if (edgeIsUnbundled) {\n tableEntry.hasUnbundled = true;\n }\n if (edgeIsBezier) {\n tableEntry.hasBezier = true;\n }\n }\n\n // for each pair (src, tgt), create the ctrl pts\n // Nested for loop is OK; total number of iterations for both loops = edgeCount\n var _loop = function _loop() {\n var _pairIds$p = pairIds[p],\n pairId = _pairIds$p.pairId,\n edgeIsUnbundled = _pairIds$p.edgeIsUnbundled;\n var key = getKey(pairId, edgeIsUnbundled);\n var pairInfo = hashTable.get(key);\n var swappedpairInfo;\n if (!pairInfo.hasUnbundled) {\n var pllEdges = pairInfo.eles[0].parallelEdges().filter(function (e) {\n return e.isBundledBezier();\n });\n clearArray(pairInfo.eles);\n pllEdges.forEach(function (edge) {\n return pairInfo.eles.push(edge);\n });\n\n // for each pair id, the edges should be sorted by index\n pairInfo.eles.sort(function (edge1, edge2) {\n return edge1.poolIndex() - edge2.poolIndex();\n });\n }\n var firstEdge = pairInfo.eles[0];\n var src = firstEdge.source();\n var tgt = firstEdge.target();\n\n // make sure src/tgt distinction is consistent w.r.t. pairId\n if (src.poolIndex() > tgt.poolIndex()) {\n var temp = src;\n src = tgt;\n tgt = temp;\n }\n var srcPos = pairInfo.srcPos = src.position();\n var tgtPos = pairInfo.tgtPos = tgt.position();\n var srcW = pairInfo.srcW = src.outerWidth();\n var srcH = pairInfo.srcH = src.outerHeight();\n var tgtW = pairInfo.tgtW = tgt.outerWidth();\n var tgtH = pairInfo.tgtH = tgt.outerHeight();\n var srcShape = pairInfo.srcShape = r.nodeShapes[_this.getNodeShape(src)];\n var tgtShape = pairInfo.tgtShape = r.nodeShapes[_this.getNodeShape(tgt)];\n var srcCornerRadius = pairInfo.srcCornerRadius = src.pstyle('corner-radius').value === 'auto' ? 'auto' : src.pstyle('corner-radius').pfValue;\n var tgtCornerRadius = pairInfo.tgtCornerRadius = tgt.pstyle('corner-radius').value === 'auto' ? 'auto' : tgt.pstyle('corner-radius').pfValue;\n var tgtRs = pairInfo.tgtRs = tgt._private.rscratch;\n var srcRs = pairInfo.srcRs = src._private.rscratch;\n pairInfo.dirCounts = {\n 'north': 0,\n 'west': 0,\n 'south': 0,\n 'east': 0,\n 'northwest': 0,\n 'southwest': 0,\n 'northeast': 0,\n 'southeast': 0\n };\n for (var _i2 = 0; _i2 < pairInfo.eles.length; _i2++) {\n var _edge = pairInfo.eles[_i2];\n var rs = _edge[0]._private.rscratch;\n var _curveStyle = _edge.pstyle('curve-style').value;\n var _edgeIsUnbundled = _curveStyle === 'unbundled-bezier' || endsWith(_curveStyle, 'segments') || endsWith(_curveStyle, 'taxi');\n\n // whether the normalised pair order is the reverse of the edge's src-tgt order\n var edgeIsSwapped = !src.same(_edge.source());\n if (!pairInfo.calculatedIntersection && src !== tgt && (pairInfo.hasBezier || pairInfo.hasUnbundled)) {\n pairInfo.calculatedIntersection = true;\n\n // pt outside src shape to calc distance/displacement from src to tgt\n var srcOutside = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, tgtPos.x, tgtPos.y, 0, srcCornerRadius, srcRs);\n var srcIntn = pairInfo.srcIntn = srcOutside;\n\n // pt outside tgt shape to calc distance/displacement from src to tgt\n var tgtOutside = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, srcPos.x, srcPos.y, 0, tgtCornerRadius, tgtRs);\n var tgtIntn = pairInfo.tgtIntn = tgtOutside;\n var intersectionPts = pairInfo.intersectionPts = {\n x1: srcOutside[0],\n x2: tgtOutside[0],\n y1: srcOutside[1],\n y2: tgtOutside[1]\n };\n var posPts = pairInfo.posPts = {\n x1: srcPos.x,\n x2: tgtPos.x,\n y1: srcPos.y,\n y2: tgtPos.y\n };\n var dy = tgtOutside[1] - srcOutside[1];\n var dx = tgtOutside[0] - srcOutside[0];\n var l = Math.sqrt(dx * dx + dy * dy);\n if (number$1(l) && l >= AVOID_IMPOSSIBLE_BEZIER_CONSTANT_L) ; else {\n l = Math.sqrt(Math.max(dx * dx, AVOID_IMPOSSIBLE_BEZIER_CONSTANT) + Math.max(dy * dy, AVOID_IMPOSSIBLE_BEZIER_CONSTANT));\n }\n var vector = pairInfo.vector = {\n x: dx,\n y: dy\n };\n var vectorNorm = pairInfo.vectorNorm = {\n x: vector.x / l,\n y: vector.y / l\n };\n var vectorNormInverse = {\n x: -vectorNorm.y,\n y: vectorNorm.x\n };\n\n // if node shapes overlap, then no ctrl pts to draw\n pairInfo.nodesOverlap = !number$1(l) || tgtShape.checkPoint(srcOutside[0], srcOutside[1], 0, tgtW, tgtH, tgtPos.x, tgtPos.y, tgtCornerRadius, tgtRs) || srcShape.checkPoint(tgtOutside[0], tgtOutside[1], 0, srcW, srcH, srcPos.x, srcPos.y, srcCornerRadius, srcRs);\n pairInfo.vectorNormInverse = vectorNormInverse;\n swappedpairInfo = {\n nodesOverlap: pairInfo.nodesOverlap,\n dirCounts: pairInfo.dirCounts,\n calculatedIntersection: true,\n hasBezier: pairInfo.hasBezier,\n hasUnbundled: pairInfo.hasUnbundled,\n eles: pairInfo.eles,\n srcPos: tgtPos,\n srcRs: tgtRs,\n tgtPos: srcPos,\n tgtRs: srcRs,\n srcW: tgtW,\n srcH: tgtH,\n tgtW: srcW,\n tgtH: srcH,\n srcIntn: tgtIntn,\n tgtIntn: srcIntn,\n srcShape: tgtShape,\n tgtShape: srcShape,\n posPts: {\n x1: posPts.x2,\n y1: posPts.y2,\n x2: posPts.x1,\n y2: posPts.y1\n },\n intersectionPts: {\n x1: intersectionPts.x2,\n y1: intersectionPts.y2,\n x2: intersectionPts.x1,\n y2: intersectionPts.y1\n },\n vector: {\n x: -vector.x,\n y: -vector.y\n },\n vectorNorm: {\n x: -vectorNorm.x,\n y: -vectorNorm.y\n },\n vectorNormInverse: {\n x: -vectorNormInverse.x,\n y: -vectorNormInverse.y\n }\n };\n }\n var passedPairInfo = edgeIsSwapped ? swappedpairInfo : pairInfo;\n rs.nodesOverlap = passedPairInfo.nodesOverlap;\n rs.srcIntn = passedPairInfo.srcIntn;\n rs.tgtIntn = passedPairInfo.tgtIntn;\n rs.isRound = _curveStyle.startsWith('round');\n if (hasCompounds && (src.isParent() || src.isChild() || tgt.isParent() || tgt.isChild()) && (src.parents().anySame(tgt) || tgt.parents().anySame(src) || src.same(tgt) && src.isParent())) {\n _this.findCompoundLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled);\n } else if (src === tgt) {\n _this.findLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled);\n } else if (_curveStyle.endsWith('segments')) {\n _this.findSegmentsPoints(_edge, passedPairInfo);\n } else if (_curveStyle.endsWith('taxi')) {\n _this.findTaxiPoints(_edge, passedPairInfo);\n } else if (_curveStyle === 'straight' || !_edgeIsUnbundled && pairInfo.eles.length % 2 === 1 && _i2 === Math.floor(pairInfo.eles.length / 2)) {\n _this.findStraightEdgePoints(_edge);\n } else {\n _this.findBezierPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled, edgeIsSwapped);\n }\n _this.findEndpoints(_edge);\n _this.tryToCorrectInvalidPoints(_edge, passedPairInfo);\n _this.checkForInvalidEdgeWarning(_edge);\n _this.storeAllpts(_edge);\n _this.storeEdgeProjections(_edge);\n _this.calculateArrowAngles(_edge);\n _this.recalculateEdgeLabelProjections(_edge);\n _this.calculateLabelAngles(_edge);\n } // for pair edges\n };\n for (var p = 0; p < pairIds.length; p++) {\n _loop();\n } // for pair ids\n\n // haystacks avoid the expense of pairInfo stuff (intersections etc.)\n this.findHaystackPoints(haystackEdges);\n};\nfunction getPts(pts) {\n var retPts = [];\n if (pts == null) {\n return;\n }\n for (var i = 0; i < pts.length; i += 2) {\n var x = pts[i];\n var y = pts[i + 1];\n retPts.push({\n x: x,\n y: y\n });\n }\n return retPts;\n}\nBRp$c.getSegmentPoints = function (edge) {\n var rs = edge[0]._private.rscratch;\n this.recalculateRenderedStyle(edge);\n var type = rs.edgeType;\n if (type === 'segments') {\n return getPts(rs.segpts);\n }\n};\nBRp$c.getControlPoints = function (edge) {\n var rs = edge[0]._private.rscratch;\n this.recalculateRenderedStyle(edge);\n var type = rs.edgeType;\n if (type === 'bezier' || type === 'multibezier' || type === 'self' || type === 'compound') {\n return getPts(rs.ctrlpts);\n }\n};\nBRp$c.getEdgeMidpoint = function (edge) {\n var rs = edge[0]._private.rscratch;\n this.recalculateRenderedStyle(edge);\n return {\n x: rs.midX,\n y: rs.midY\n };\n};\n\nvar BRp$b = {};\nBRp$b.manualEndptToPx = function (node, prop) {\n var r = this;\n var npos = node.position();\n var w = node.outerWidth();\n var h = node.outerHeight();\n var rs = node._private.rscratch;\n if (prop.value.length === 2) {\n var p = [prop.pfValue[0], prop.pfValue[1]];\n if (prop.units[0] === '%') {\n p[0] = p[0] * w;\n }\n if (prop.units[1] === '%') {\n p[1] = p[1] * h;\n }\n p[0] += npos.x;\n p[1] += npos.y;\n return p;\n } else {\n var angle = prop.pfValue[0];\n angle = -Math.PI / 2 + angle; // start at 12 o'clock\n\n var l = 2 * Math.max(w, h);\n var _p = [npos.x + Math.cos(angle) * l, npos.y + Math.sin(angle) * l];\n return r.nodeShapes[this.getNodeShape(node)].intersectLine(npos.x, npos.y, w, h, _p[0], _p[1], 0, node.pstyle('corner-radius').value === 'auto' ? 'auto' : node.pstyle('corner-radius').pfValue, rs);\n }\n};\nBRp$b.findEndpoints = function (edge) {\n var _ref, _tgtManEndpt$pfValue, _ref2, _srcManEndpt$pfValue;\n var r = this;\n var intersect;\n var source = edge.source()[0];\n var target = edge.target()[0];\n var srcPos = source.position();\n var tgtPos = target.position();\n var tgtArShape = edge.pstyle('target-arrow-shape').value;\n var srcArShape = edge.pstyle('source-arrow-shape').value;\n var tgtDist = edge.pstyle('target-distance-from-node').pfValue;\n var srcDist = edge.pstyle('source-distance-from-node').pfValue;\n var srcRs = source._private.rscratch;\n var tgtRs = target._private.rscratch;\n var curveStyle = edge.pstyle('curve-style').value;\n var rs = edge._private.rscratch;\n var et = rs.edgeType;\n var taxi = endsWith(curveStyle, 'taxi'); // Covers taxi and round-taxi\n var self = et === 'self' || et === 'compound';\n var bezier = et === 'bezier' || et === 'multibezier' || self;\n var multi = et !== 'bezier';\n var lines = et === 'straight' || et === 'segments';\n var segments = et === 'segments';\n var hasEndpts = bezier || multi || lines;\n var overrideEndpts = self || taxi;\n var srcManEndpt = edge.pstyle('source-endpoint');\n var srcManEndptVal = overrideEndpts ? 'outside-to-node' : srcManEndpt.value;\n var srcCornerRadius = source.pstyle('corner-radius').value === 'auto' ? 'auto' : source.pstyle('corner-radius').pfValue;\n var tgtManEndpt = edge.pstyle('target-endpoint');\n var tgtManEndptVal = overrideEndpts ? 'outside-to-node' : tgtManEndpt.value;\n var tgtCornerRadius = target.pstyle('corner-radius').value === 'auto' ? 'auto' : target.pstyle('corner-radius').pfValue;\n rs.srcManEndpt = srcManEndpt;\n rs.tgtManEndpt = tgtManEndpt;\n var p1; // last known point of edge on target side\n var p2; // last known point of edge on source side\n\n var p1_i; // point to intersect with target shape\n var p2_i; // point to intersect with source shape\n\n var tgtManEndptPt = (_ref = (tgtManEndpt === null || tgtManEndpt === undefined || (_tgtManEndpt$pfValue = tgtManEndpt.pfValue) === null || _tgtManEndpt$pfValue === undefined ? undefined : _tgtManEndpt$pfValue.length) === 2 ? tgtManEndpt.pfValue : null) !== null && _ref !== undefined ? _ref : [0, 0];\n var srcManEndptPt = (_ref2 = (srcManEndpt === null || srcManEndpt === undefined || (_srcManEndpt$pfValue = srcManEndpt.pfValue) === null || _srcManEndpt$pfValue === undefined ? undefined : _srcManEndpt$pfValue.length) === 2 ? srcManEndpt.pfValue : null) !== null && _ref2 !== undefined ? _ref2 : [0, 0];\n if (bezier) {\n var cpStart = [rs.ctrlpts[0], rs.ctrlpts[1]];\n var cpEnd = multi ? [rs.ctrlpts[rs.ctrlpts.length - 2], rs.ctrlpts[rs.ctrlpts.length - 1]] : cpStart;\n p1 = cpEnd;\n p2 = cpStart;\n } else if (lines) {\n var srcArrowFromPt = !segments ? [tgtPos.x + tgtManEndptPt[0], tgtPos.y + tgtManEndptPt[1]] : rs.segpts.slice(0, 2);\n var tgtArrowFromPt = !segments ? [srcPos.x + srcManEndptPt[0], srcPos.y + srcManEndptPt[1]] : rs.segpts.slice(rs.segpts.length - 2);\n p1 = tgtArrowFromPt;\n p2 = srcArrowFromPt;\n }\n if (tgtManEndptVal === 'inside-to-node') {\n intersect = [tgtPos.x, tgtPos.y];\n } else if (tgtManEndpt.units) {\n intersect = this.manualEndptToPx(target, tgtManEndpt);\n } else if (tgtManEndptVal === 'outside-to-line') {\n intersect = rs.tgtIntn; // use cached value from ctrlpt calc\n } else {\n if (tgtManEndptVal === 'outside-to-node' || tgtManEndptVal === 'outside-to-node-or-label') {\n p1_i = p1;\n } else if (tgtManEndptVal === 'outside-to-line' || tgtManEndptVal === 'outside-to-line-or-label') {\n p1_i = [srcPos.x, srcPos.y];\n }\n intersect = r.nodeShapes[this.getNodeShape(target)].intersectLine(tgtPos.x, tgtPos.y, target.outerWidth(), target.outerHeight(), p1_i[0], p1_i[1], 0, tgtCornerRadius, tgtRs);\n if (tgtManEndptVal === 'outside-to-node-or-label' || tgtManEndptVal === 'outside-to-line-or-label') {\n var trs = target._private.rscratch;\n var lw = trs.labelWidth;\n var lh = trs.labelHeight;\n var lx = trs.labelX;\n var ly = trs.labelY;\n var lw2 = lw / 2;\n var lh2 = lh / 2;\n var va = target.pstyle('text-valign').value;\n if (va === 'top') {\n ly -= lh2;\n } else if (va === 'bottom') {\n ly += lh2;\n }\n var ha = target.pstyle('text-halign').value;\n if (ha === 'left') {\n lx -= lw2;\n } else if (ha === 'right') {\n lx += lw2;\n }\n var labelIntersect = polygonIntersectLine(p1_i[0], p1_i[1], [lx - lw2, ly - lh2, lx + lw2, ly - lh2, lx + lw2, ly + lh2, lx - lw2, ly + lh2], tgtPos.x, tgtPos.y);\n if (labelIntersect.length > 0) {\n var refPt = srcPos;\n var intSqdist = sqdist(refPt, array2point(intersect));\n var labIntSqdist = sqdist(refPt, array2point(labelIntersect));\n var minSqDist = intSqdist;\n if (labIntSqdist < intSqdist) {\n intersect = labelIntersect;\n minSqDist = labIntSqdist;\n }\n if (labelIntersect.length > 2) {\n var labInt2SqDist = sqdist(refPt, {\n x: labelIntersect[2],\n y: labelIntersect[3]\n });\n if (labInt2SqDist < minSqDist) {\n intersect = [labelIntersect[2], labelIntersect[3]];\n }\n }\n }\n }\n }\n var arrowEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].spacing(edge) + tgtDist);\n var edgeEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].gap(edge) + tgtDist);\n rs.endX = edgeEnd[0];\n rs.endY = edgeEnd[1];\n rs.arrowEndX = arrowEnd[0];\n rs.arrowEndY = arrowEnd[1];\n if (srcManEndptVal === 'inside-to-node') {\n intersect = [srcPos.x, srcPos.y];\n } else if (srcManEndpt.units) {\n intersect = this.manualEndptToPx(source, srcManEndpt);\n } else if (srcManEndptVal === 'outside-to-line') {\n intersect = rs.srcIntn; // use cached value from ctrlpt calc\n } else {\n if (srcManEndptVal === 'outside-to-node' || srcManEndptVal === 'outside-to-node-or-label') {\n p2_i = p2;\n } else if (srcManEndptVal === 'outside-to-line' || srcManEndptVal === 'outside-to-line-or-label') {\n p2_i = [tgtPos.x, tgtPos.y];\n }\n intersect = r.nodeShapes[this.getNodeShape(source)].intersectLine(srcPos.x, srcPos.y, source.outerWidth(), source.outerHeight(), p2_i[0], p2_i[1], 0, srcCornerRadius, srcRs);\n if (srcManEndptVal === 'outside-to-node-or-label' || srcManEndptVal === 'outside-to-line-or-label') {\n var srs = source._private.rscratch;\n var _lw = srs.labelWidth;\n var _lh = srs.labelHeight;\n var _lx = srs.labelX;\n var _ly = srs.labelY;\n var _lw2 = _lw / 2;\n var _lh2 = _lh / 2;\n var _va = source.pstyle('text-valign').value;\n if (_va === 'top') {\n _ly -= _lh2;\n } else if (_va === 'bottom') {\n _ly += _lh2;\n }\n var _ha = source.pstyle('text-halign').value;\n if (_ha === 'left') {\n _lx -= _lw2;\n } else if (_ha === 'right') {\n _lx += _lw2;\n }\n var _labelIntersect = polygonIntersectLine(p2_i[0], p2_i[1], [_lx - _lw2, _ly - _lh2, _lx + _lw2, _ly - _lh2, _lx + _lw2, _ly + _lh2, _lx - _lw2, _ly + _lh2], srcPos.x, srcPos.y);\n if (_labelIntersect.length > 0) {\n var _refPt = tgtPos;\n var _intSqdist = sqdist(_refPt, array2point(intersect));\n var _labIntSqdist = sqdist(_refPt, array2point(_labelIntersect));\n var _minSqDist = _intSqdist;\n if (_labIntSqdist < _intSqdist) {\n intersect = [_labelIntersect[0], _labelIntersect[1]];\n _minSqDist = _labIntSqdist;\n }\n if (_labelIntersect.length > 2) {\n var _labInt2SqDist = sqdist(_refPt, {\n x: _labelIntersect[2],\n y: _labelIntersect[3]\n });\n if (_labInt2SqDist < _minSqDist) {\n intersect = [_labelIntersect[2], _labelIntersect[3]];\n }\n }\n }\n }\n }\n var arrowStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].spacing(edge) + srcDist);\n var edgeStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].gap(edge) + srcDist);\n rs.startX = edgeStart[0];\n rs.startY = edgeStart[1];\n rs.arrowStartX = arrowStart[0];\n rs.arrowStartY = arrowStart[1];\n if (hasEndpts) {\n if (!number$1(rs.startX) || !number$1(rs.startY) || !number$1(rs.endX) || !number$1(rs.endY)) {\n rs.badLine = true;\n } else {\n rs.badLine = false;\n }\n }\n};\nBRp$b.getSourceEndpoint = function (edge) {\n var rs = edge[0]._private.rscratch;\n this.recalculateRenderedStyle(edge);\n switch (rs.edgeType) {\n case 'haystack':\n return {\n x: rs.haystackPts[0],\n y: rs.haystackPts[1]\n };\n default:\n return {\n x: rs.arrowStartX,\n y: rs.arrowStartY\n };\n }\n};\nBRp$b.getTargetEndpoint = function (edge) {\n var rs = edge[0]._private.rscratch;\n this.recalculateRenderedStyle(edge);\n switch (rs.edgeType) {\n case 'haystack':\n return {\n x: rs.haystackPts[2],\n y: rs.haystackPts[3]\n };\n default:\n return {\n x: rs.arrowEndX,\n y: rs.arrowEndY\n };\n }\n};\n\nvar BRp$a = {};\nfunction pushBezierPts(r, edge, pts) {\n var qbezierAt$1 = function qbezierAt$1(p1, p2, p3, t) {\n return qbezierAt(p1, p2, p3, t);\n };\n var _p = edge._private;\n var bpts = _p.rstyle.bezierPts;\n for (var i = 0; i < r.bezierProjPcts.length; i++) {\n var p = r.bezierProjPcts[i];\n bpts.push({\n x: qbezierAt$1(pts[0], pts[2], pts[4], p),\n y: qbezierAt$1(pts[1], pts[3], pts[5], p)\n });\n }\n}\nBRp$a.storeEdgeProjections = function (edge) {\n var _p = edge._private;\n var rs = _p.rscratch;\n var et = rs.edgeType;\n\n // clear the cached points state\n _p.rstyle.bezierPts = null;\n _p.rstyle.linePts = null;\n _p.rstyle.haystackPts = null;\n if (et === 'multibezier' || et === 'bezier' || et === 'self' || et === 'compound') {\n _p.rstyle.bezierPts = [];\n for (var i = 0; i + 5 < rs.allpts.length; i += 4) {\n pushBezierPts(this, edge, rs.allpts.slice(i, i + 6));\n }\n } else if (et === 'segments') {\n var lpts = _p.rstyle.linePts = [];\n for (var i = 0; i + 1 < rs.allpts.length; i += 2) {\n lpts.push({\n x: rs.allpts[i],\n y: rs.allpts[i + 1]\n });\n }\n } else if (et === 'haystack') {\n var hpts = rs.haystackPts;\n _p.rstyle.haystackPts = [{\n x: hpts[0],\n y: hpts[1]\n }, {\n x: hpts[2],\n y: hpts[3]\n }];\n }\n _p.rstyle.arrowWidth = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth;\n};\nBRp$a.recalculateEdgeProjections = function (edges) {\n this.findEdgeControlPoints(edges);\n};\n\nvar BRp$9 = {};\nBRp$9.recalculateNodeLabelProjection = function (node) {\n var content = node.pstyle('label').strValue;\n if (emptyString(content)) {\n return;\n }\n var textX, textY;\n var _p = node._private;\n var nodeWidth = node.width();\n var nodeHeight = node.height();\n var padding = node.padding();\n var nodePos = node.position();\n var textHalign = node.pstyle('text-halign').strValue;\n var textValign = node.pstyle('text-valign').strValue;\n var rs = _p.rscratch;\n var rstyle = _p.rstyle;\n switch (textHalign) {\n case 'left':\n textX = nodePos.x - nodeWidth / 2 - padding;\n break;\n case 'right':\n textX = nodePos.x + nodeWidth / 2 + padding;\n break;\n default:\n // e.g. center\n textX = nodePos.x;\n }\n switch (textValign) {\n case 'top':\n textY = nodePos.y - nodeHeight / 2 - padding;\n break;\n case 'bottom':\n textY = nodePos.y + nodeHeight / 2 + padding;\n break;\n default:\n // e.g. middle\n textY = nodePos.y;\n }\n rs.labelX = textX;\n rs.labelY = textY;\n rstyle.labelX = textX;\n rstyle.labelY = textY;\n this.calculateLabelAngles(node);\n this.applyLabelDimensions(node);\n};\nvar lineAngleFromDelta = function lineAngleFromDelta(dx, dy) {\n var angle = Math.atan(dy / dx);\n if (dx === 0 && angle < 0) {\n angle = angle * -1;\n }\n return angle;\n};\nvar lineAngle = function lineAngle(p0, p1) {\n var dx = p1.x - p0.x;\n var dy = p1.y - p0.y;\n return lineAngleFromDelta(dx, dy);\n};\nvar bezierAngle = function bezierAngle(p0, p1, p2, t) {\n var t0 = bound(0, t - 0.001, 1);\n var t1 = bound(0, t + 0.001, 1);\n var lp0 = qbezierPtAt(p0, p1, p2, t0);\n var lp1 = qbezierPtAt(p0, p1, p2, t1);\n return lineAngle(lp0, lp1);\n};\nBRp$9.recalculateEdgeLabelProjections = function (edge) {\n var p;\n var _p = edge._private;\n var rs = _p.rscratch;\n var r = this;\n var content = {\n mid: edge.pstyle('label').strValue,\n source: edge.pstyle('source-label').strValue,\n target: edge.pstyle('target-label').strValue\n };\n if (content.mid || content.source || content.target) ; else {\n return; // no labels => no calcs\n }\n\n // add center point to style so bounding box calculations can use it\n //\n p = {\n x: rs.midX,\n y: rs.midY\n };\n var setRs = function setRs(propName, prefix, value) {\n setPrefixedProperty(_p.rscratch, propName, prefix, value);\n setPrefixedProperty(_p.rstyle, propName, prefix, value);\n };\n setRs('labelX', null, p.x);\n setRs('labelY', null, p.y);\n var midAngle = lineAngleFromDelta(rs.midDispX, rs.midDispY);\n setRs('labelAutoAngle', null, midAngle);\n var _createControlPointInfo = function createControlPointInfo() {\n if (_createControlPointInfo.cache) {\n return _createControlPointInfo.cache;\n } // use cache so only 1x per edge\n\n var ctrlpts = [];\n\n // store each ctrlpt info init\n for (var i = 0; i + 5 < rs.allpts.length; i += 4) {\n var p0 = {\n x: rs.allpts[i],\n y: rs.allpts[i + 1]\n };\n var p1 = {\n x: rs.allpts[i + 2],\n y: rs.allpts[i + 3]\n }; // ctrlpt\n var p2 = {\n x: rs.allpts[i + 4],\n y: rs.allpts[i + 5]\n };\n ctrlpts.push({\n p0: p0,\n p1: p1,\n p2: p2,\n startDist: 0,\n length: 0,\n segments: []\n });\n }\n var bpts = _p.rstyle.bezierPts;\n var nProjs = r.bezierProjPcts.length;\n function addSegment(cp, p0, p1, t0, t1) {\n var length = dist(p0, p1);\n var prevSegment = cp.segments[cp.segments.length - 1];\n var segment = {\n p0: p0,\n p1: p1,\n t0: t0,\n t1: t1,\n startDist: prevSegment ? prevSegment.startDist + prevSegment.length : 0,\n length: length\n };\n cp.segments.push(segment);\n cp.length += length;\n }\n\n // update each ctrlpt with segment info\n for (var _i = 0; _i < ctrlpts.length; _i++) {\n var cp = ctrlpts[_i];\n var prevCp = ctrlpts[_i - 1];\n if (prevCp) {\n cp.startDist = prevCp.startDist + prevCp.length;\n }\n addSegment(cp, cp.p0, bpts[_i * nProjs], 0, r.bezierProjPcts[0]); // first\n\n for (var j = 0; j < nProjs - 1; j++) {\n addSegment(cp, bpts[_i * nProjs + j], bpts[_i * nProjs + j + 1], r.bezierProjPcts[j], r.bezierProjPcts[j + 1]);\n }\n addSegment(cp, bpts[_i * nProjs + nProjs - 1], cp.p2, r.bezierProjPcts[nProjs - 1], 1); // last\n }\n return _createControlPointInfo.cache = ctrlpts;\n };\n var calculateEndProjection = function calculateEndProjection(prefix) {\n var angle;\n var isSrc = prefix === 'source';\n if (!content[prefix]) {\n return;\n }\n var offset = edge.pstyle(prefix + '-text-offset').pfValue;\n switch (rs.edgeType) {\n case 'self':\n case 'compound':\n case 'bezier':\n case 'multibezier':\n {\n var cps = _createControlPointInfo();\n var selected;\n var startDist = 0;\n var totalDist = 0;\n\n // find the segment we're on\n for (var i = 0; i < cps.length; i++) {\n var _cp = cps[isSrc ? i : cps.length - 1 - i];\n for (var j = 0; j < _cp.segments.length; j++) {\n var _seg = _cp.segments[isSrc ? j : _cp.segments.length - 1 - j];\n var lastSeg = i === cps.length - 1 && j === _cp.segments.length - 1;\n startDist = totalDist;\n totalDist += _seg.length;\n if (totalDist >= offset || lastSeg) {\n selected = {\n cp: _cp,\n segment: _seg\n };\n break;\n }\n }\n if (selected) {\n break;\n }\n }\n var cp = selected.cp;\n var seg = selected.segment;\n var tSegment = (offset - startDist) / seg.length;\n var segDt = seg.t1 - seg.t0;\n var t = isSrc ? seg.t0 + segDt * tSegment : seg.t1 - segDt * tSegment;\n t = bound(0, t, 1);\n p = qbezierPtAt(cp.p0, cp.p1, cp.p2, t);\n angle = bezierAngle(cp.p0, cp.p1, cp.p2, t);\n break;\n }\n case 'straight':\n case 'segments':\n case 'haystack':\n {\n var d = 0,\n di,\n d0;\n var p0, p1;\n var l = rs.allpts.length;\n for (var _i2 = 0; _i2 + 3 < l; _i2 += 2) {\n if (isSrc) {\n p0 = {\n x: rs.allpts[_i2],\n y: rs.allpts[_i2 + 1]\n };\n p1 = {\n x: rs.allpts[_i2 + 2],\n y: rs.allpts[_i2 + 3]\n };\n } else {\n p0 = {\n x: rs.allpts[l - 2 - _i2],\n y: rs.allpts[l - 1 - _i2]\n };\n p1 = {\n x: rs.allpts[l - 4 - _i2],\n y: rs.allpts[l - 3 - _i2]\n };\n }\n di = dist(p0, p1);\n d0 = d;\n d += di;\n if (d >= offset) {\n break;\n }\n }\n var pD = offset - d0;\n var _t = pD / di;\n _t = bound(0, _t, 1);\n p = lineAt(p0, p1, _t);\n angle = lineAngle(p0, p1);\n break;\n }\n }\n setRs('labelX', prefix, p.x);\n setRs('labelY', prefix, p.y);\n setRs('labelAutoAngle', prefix, angle);\n };\n calculateEndProjection('source');\n calculateEndProjection('target');\n this.applyLabelDimensions(edge);\n};\nBRp$9.applyLabelDimensions = function (ele) {\n this.applyPrefixedLabelDimensions(ele);\n if (ele.isEdge()) {\n this.applyPrefixedLabelDimensions(ele, 'source');\n this.applyPrefixedLabelDimensions(ele, 'target');\n }\n};\nBRp$9.applyPrefixedLabelDimensions = function (ele, prefix) {\n var _p = ele._private;\n var text = this.getLabelText(ele, prefix);\n var cacheKey = hashString(text, ele._private.labelDimsKey);\n\n // save recalc if the label is the same as before\n if (getPrefixedProperty(_p.rscratch, 'prefixedLabelDimsKey', prefix) === cacheKey) {\n return; // then the label dimensions + text are the same\n }\n\n // save the key\n setPrefixedProperty(_p.rscratch, 'prefixedLabelDimsKey', prefix, cacheKey);\n var labelDims = this.calculateLabelDimensions(ele, text);\n var lineHeight = ele.pstyle('line-height').pfValue;\n var textWrap = ele.pstyle('text-wrap').strValue;\n var lines = getPrefixedProperty(_p.rscratch, 'labelWrapCachedLines', prefix) || [];\n var numLines = textWrap !== 'wrap' ? 1 : Math.max(lines.length, 1);\n var normPerLineHeight = labelDims.height / numLines;\n var labelLineHeight = normPerLineHeight * lineHeight;\n var width = labelDims.width;\n var height = labelDims.height + (numLines - 1) * (lineHeight - 1) * normPerLineHeight;\n setPrefixedProperty(_p.rstyle, 'labelWidth', prefix, width);\n setPrefixedProperty(_p.rscratch, 'labelWidth', prefix, width);\n setPrefixedProperty(_p.rstyle, 'labelHeight', prefix, height);\n setPrefixedProperty(_p.rscratch, 'labelHeight', prefix, height);\n setPrefixedProperty(_p.rscratch, 'labelLineHeight', prefix, labelLineHeight);\n};\nBRp$9.getLabelText = function (ele, prefix) {\n var _p = ele._private;\n var pfd = prefix ? prefix + '-' : '';\n var text = ele.pstyle(pfd + 'label').strValue;\n var textTransform = ele.pstyle('text-transform').value;\n var rscratch = function rscratch(propName, value) {\n if (value) {\n setPrefixedProperty(_p.rscratch, propName, prefix, value);\n return value;\n } else {\n return getPrefixedProperty(_p.rscratch, propName, prefix);\n }\n };\n\n // for empty text, skip all processing\n if (!text) {\n return '';\n }\n if (textTransform == 'none') ; else if (textTransform == 'uppercase') {\n text = text.toUpperCase();\n } else if (textTransform == 'lowercase') {\n text = text.toLowerCase();\n }\n var wrapStyle = ele.pstyle('text-wrap').value;\n if (wrapStyle === 'wrap') {\n var labelKey = rscratch('labelKey');\n\n // save recalc if the label is the same as before\n if (labelKey != null && rscratch('labelWrapKey') === labelKey) {\n return rscratch('labelWrapCachedText');\n }\n var zwsp = \"\\u200B\";\n var lines = text.split('\\n');\n var maxW = ele.pstyle('text-max-width').pfValue;\n var overflow = ele.pstyle('text-overflow-wrap').value;\n var overflowAny = overflow === 'anywhere';\n var wrappedLines = [];\n var separatorRegex = /[\\s\\u200b]+|$/g; // Include end of string to add last word\n\n for (var l = 0; l < lines.length; l++) {\n var line = lines[l];\n var lineDims = this.calculateLabelDimensions(ele, line);\n var lineW = lineDims.width;\n if (overflowAny) {\n var processedLine = line.split('').join(zwsp);\n line = processedLine;\n }\n if (lineW > maxW) {\n // line is too long\n var separatorMatches = line.matchAll(separatorRegex);\n var subline = '';\n var previousIndex = 0;\n // Add fake match\n var _iterator = _createForOfIteratorHelper(separatorMatches),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var separatorMatch = _step.value;\n var wordSeparator = separatorMatch[0];\n var word = line.substring(previousIndex, separatorMatch.index);\n previousIndex = separatorMatch.index + wordSeparator.length;\n var testLine = subline.length === 0 ? word : subline + word + wordSeparator;\n var testDims = this.calculateLabelDimensions(ele, testLine);\n var testW = testDims.width;\n if (testW <= maxW) {\n // word fits on current line\n subline += word + wordSeparator;\n } else {\n // word starts new line\n if (subline) {\n wrappedLines.push(subline);\n }\n subline = word + wordSeparator;\n }\n }\n\n // if there's remaining text, put it in a wrapped line\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n if (!subline.match(/^[\\s\\u200b]+$/)) {\n wrappedLines.push(subline);\n }\n } else {\n // line is already short enough\n wrappedLines.push(line);\n }\n } // for\n\n rscratch('labelWrapCachedLines', wrappedLines);\n text = rscratch('labelWrapCachedText', wrappedLines.join('\\n'));\n rscratch('labelWrapKey', labelKey);\n } else if (wrapStyle === 'ellipsis') {\n var _maxW = ele.pstyle('text-max-width').pfValue;\n var ellipsized = '';\n var ellipsis = \"\\u2026\";\n var incLastCh = false;\n if (this.calculateLabelDimensions(ele, text).width < _maxW) {\n // the label already fits\n return text;\n }\n for (var i = 0; i < text.length; i++) {\n var widthWithNextCh = this.calculateLabelDimensions(ele, ellipsized + text[i] + ellipsis).width;\n if (widthWithNextCh > _maxW) {\n break;\n }\n ellipsized += text[i];\n if (i === text.length - 1) {\n incLastCh = true;\n }\n }\n if (!incLastCh) {\n ellipsized += ellipsis;\n }\n return ellipsized;\n } // if ellipsize\n\n return text;\n};\nBRp$9.getLabelJustification = function (ele) {\n var justification = ele.pstyle('text-justification').strValue;\n var textHalign = ele.pstyle('text-halign').strValue;\n if (justification === 'auto') {\n if (ele.isNode()) {\n switch (textHalign) {\n case 'left':\n return 'right';\n case 'right':\n return 'left';\n default:\n return 'center';\n }\n } else {\n return 'center';\n }\n } else {\n return justification;\n }\n};\nBRp$9.calculateLabelDimensions = function (ele, text) {\n var r = this;\n var containerWindow = r.cy.window();\n var document = containerWindow.document;\n var padding = 0; // add padding around text dims, as the measurement isn't that accurate\n var fStyle = ele.pstyle('font-style').strValue;\n var size = ele.pstyle('font-size').pfValue;\n var family = ele.pstyle('font-family').strValue;\n var weight = ele.pstyle('font-weight').strValue;\n var canvas = this.labelCalcCanvas;\n var c2d = this.labelCalcCanvasContext;\n if (!canvas) {\n canvas = this.labelCalcCanvas = document.createElement('canvas');\n c2d = this.labelCalcCanvasContext = canvas.getContext('2d');\n var ds = canvas.style;\n ds.position = 'absolute';\n ds.left = '-9999px';\n ds.top = '-9999px';\n ds.zIndex = '-1';\n ds.visibility = 'hidden';\n ds.pointerEvents = 'none';\n }\n c2d.font = \"\".concat(fStyle, \" \").concat(weight, \" \").concat(size, \"px \").concat(family);\n var width = 0;\n var height = 0;\n var lines = text.split('\\n');\n for (var i = 0; i < lines.length; i++) {\n var line = lines[i];\n var metrics = c2d.measureText(line);\n var w = Math.ceil(metrics.width);\n var h = size;\n width = Math.max(w, width);\n height += h;\n }\n width += padding;\n height += padding;\n return {\n width: width,\n height: height\n };\n};\nBRp$9.calculateLabelAngle = function (ele, prefix) {\n var _p = ele._private;\n var rs = _p.rscratch;\n var isEdge = ele.isEdge();\n var prefixDash = prefix ? prefix + '-' : '';\n var rot = ele.pstyle(prefixDash + 'text-rotation');\n var rotStr = rot.strValue;\n if (rotStr === 'none') {\n return 0;\n } else if (isEdge && rotStr === 'autorotate') {\n return rs.labelAutoAngle;\n } else if (rotStr === 'autorotate') {\n return 0;\n } else {\n return rot.pfValue;\n }\n};\nBRp$9.calculateLabelAngles = function (ele) {\n var r = this;\n var isEdge = ele.isEdge();\n var _p = ele._private;\n var rs = _p.rscratch;\n rs.labelAngle = r.calculateLabelAngle(ele);\n if (isEdge) {\n rs.sourceLabelAngle = r.calculateLabelAngle(ele, 'source');\n rs.targetLabelAngle = r.calculateLabelAngle(ele, 'target');\n }\n};\n\nvar BRp$8 = {};\nvar TOO_SMALL_CUT_RECT = 28;\nvar warnedCutRect = false;\nBRp$8.getNodeShape = function (node) {\n var r = this;\n var shape = node.pstyle('shape').value;\n if (shape === 'cutrectangle' && (node.width() < TOO_SMALL_CUT_RECT || node.height() < TOO_SMALL_CUT_RECT)) {\n if (!warnedCutRect) {\n warn('The `cutrectangle` node shape can not be used at small sizes so `rectangle` is used instead');\n warnedCutRect = true;\n }\n return 'rectangle';\n }\n if (node.isParent()) {\n if (shape === 'rectangle' || shape === 'roundrectangle' || shape === 'round-rectangle' || shape === 'cutrectangle' || shape === 'cut-rectangle' || shape === 'barrel') {\n return shape;\n } else {\n return 'rectangle';\n }\n }\n if (shape === 'polygon') {\n var points = node.pstyle('shape-polygon-points').value;\n return r.nodeShapes.makePolygon(points).name;\n }\n return shape;\n};\n\nvar BRp$7 = {};\nBRp$7.registerCalculationListeners = function () {\n var cy = this.cy;\n var elesToUpdate = cy.collection();\n var r = this;\n var enqueue = function enqueue(eles) {\n var dirtyStyleCaches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n elesToUpdate.merge(eles);\n if (dirtyStyleCaches) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var _p = ele._private;\n var rstyle = _p.rstyle;\n rstyle.clean = false;\n rstyle.cleanConnected = false;\n }\n }\n };\n r.binder(cy).on('bounds.* dirty.*', function onDirtyBounds(e) {\n var ele = e.target;\n enqueue(ele);\n }).on('style.* background.*', function onDirtyStyle(e) {\n var ele = e.target;\n enqueue(ele, false);\n });\n var updateEleCalcs = function updateEleCalcs(willDraw) {\n if (willDraw) {\n var fns = r.onUpdateEleCalcsFns;\n\n // because we need to have up-to-date style (e.g. stylesheet mappers)\n // before calculating rendered style (and pstyle might not be called yet)\n elesToUpdate.cleanStyle();\n for (var i = 0; i < elesToUpdate.length; i++) {\n var ele = elesToUpdate[i];\n var rstyle = ele._private.rstyle;\n if (ele.isNode() && !rstyle.cleanConnected) {\n enqueue(ele.connectedEdges());\n rstyle.cleanConnected = true;\n }\n }\n if (fns) {\n for (var _i = 0; _i < fns.length; _i++) {\n var fn = fns[_i];\n fn(willDraw, elesToUpdate);\n }\n }\n r.recalculateRenderedStyle(elesToUpdate);\n elesToUpdate = cy.collection();\n }\n };\n r.flushRenderedStyleQueue = function () {\n updateEleCalcs(true);\n };\n r.beforeRender(updateEleCalcs, r.beforeRenderPriorities.eleCalcs);\n};\nBRp$7.onUpdateEleCalcs = function (fn) {\n var fns = this.onUpdateEleCalcsFns = this.onUpdateEleCalcsFns || [];\n fns.push(fn);\n};\nBRp$7.recalculateRenderedStyle = function (eles, useCache) {\n var isCleanConnected = function isCleanConnected(ele) {\n return ele._private.rstyle.cleanConnected;\n };\n if (eles.length === 0) {\n return;\n }\n var edges = [];\n var nodes = [];\n\n // the renderer can't be used for calcs when destroyed, e.g. ele.boundingBox()\n if (this.destroyed) {\n return;\n }\n\n // use cache by default for perf\n if (useCache === undefined) {\n useCache = true;\n }\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var _p = ele._private;\n var rstyle = _p.rstyle;\n\n // an edge may be implicitly dirty b/c of one of its connected nodes\n // (and a request for recalc may come in between frames)\n if (ele.isEdge() && (!isCleanConnected(ele.source()) || !isCleanConnected(ele.target()))) {\n rstyle.clean = false;\n }\n if (ele.isEdge() && ele.isBundledBezier()) {\n if (ele.parallelEdges().some(function (ele) {\n return !ele._private.rstyle.clean && ele.isBundledBezier();\n })) {\n rstyle.clean = false;\n }\n }\n\n // only update if dirty and in graph\n if (useCache && rstyle.clean || ele.removed()) {\n continue;\n }\n\n // only update if not display: none\n if (ele.pstyle('display').value === 'none') {\n continue;\n }\n if (_p.group === 'nodes') {\n nodes.push(ele);\n } else {\n // edges\n edges.push(ele);\n }\n rstyle.clean = true;\n }\n\n // update node data from projections\n for (var _i2 = 0; _i2 < nodes.length; _i2++) {\n var _ele = nodes[_i2];\n var _p2 = _ele._private;\n var _rstyle = _p2.rstyle;\n var pos = _ele.position();\n this.recalculateNodeLabelProjection(_ele);\n _rstyle.nodeX = pos.x;\n _rstyle.nodeY = pos.y;\n _rstyle.nodeW = _ele.pstyle('width').pfValue;\n _rstyle.nodeH = _ele.pstyle('height').pfValue;\n }\n this.recalculateEdgeProjections(edges);\n\n // update edge data from projections\n for (var _i3 = 0; _i3 < edges.length; _i3++) {\n var _ele2 = edges[_i3];\n var _p3 = _ele2._private;\n var _rstyle2 = _p3.rstyle;\n var rs = _p3.rscratch;\n\n // update rstyle positions\n _rstyle2.srcX = rs.arrowStartX;\n _rstyle2.srcY = rs.arrowStartY;\n _rstyle2.tgtX = rs.arrowEndX;\n _rstyle2.tgtY = rs.arrowEndY;\n _rstyle2.midX = rs.midX;\n _rstyle2.midY = rs.midY;\n _rstyle2.labelAngle = rs.labelAngle;\n _rstyle2.sourceLabelAngle = rs.sourceLabelAngle;\n _rstyle2.targetLabelAngle = rs.targetLabelAngle;\n }\n};\n\nvar BRp$6 = {};\nBRp$6.updateCachedGrabbedEles = function () {\n var eles = this.cachedZSortedEles;\n if (!eles) {\n // just let this be recalculated on the next z sort tick\n return;\n }\n eles.drag = [];\n eles.nondrag = [];\n var grabTargets = [];\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var rs = ele._private.rscratch;\n if (ele.grabbed() && !ele.isParent()) {\n grabTargets.push(ele);\n } else if (rs.inDragLayer) {\n eles.drag.push(ele);\n } else {\n eles.nondrag.push(ele);\n }\n }\n\n // put the grab target nodes last so it's on top of its neighbourhood\n for (var i = 0; i < grabTargets.length; i++) {\n var ele = grabTargets[i];\n eles.drag.push(ele);\n }\n};\nBRp$6.invalidateCachedZSortedEles = function () {\n this.cachedZSortedEles = null;\n};\nBRp$6.getCachedZSortedEles = function (forceRecalc) {\n if (forceRecalc || !this.cachedZSortedEles) {\n var eles = this.cy.mutableElements().toArray();\n eles.sort(zIndexSort);\n eles.interactive = eles.filter(function (ele) {\n return ele.interactive();\n });\n this.cachedZSortedEles = eles;\n this.updateCachedGrabbedEles();\n } else {\n eles = this.cachedZSortedEles;\n }\n return eles;\n};\n\nvar BRp$5 = {};\n[BRp$e, BRp$d, BRp$c, BRp$b, BRp$a, BRp$9, BRp$8, BRp$7, BRp$6].forEach(function (props) {\n extend(BRp$5, props);\n});\n\nvar BRp$4 = {};\nBRp$4.getCachedImage = function (url, crossOrigin, onLoad) {\n var r = this;\n var imageCache = r.imageCache = r.imageCache || {};\n var cache = imageCache[url];\n if (cache) {\n if (!cache.image.complete) {\n cache.image.addEventListener('load', onLoad);\n }\n return cache.image;\n } else {\n cache = imageCache[url] = imageCache[url] || {};\n var image = cache.image = new Image(); // eslint-disable-line no-undef\n\n image.addEventListener('load', onLoad);\n image.addEventListener('error', function () {\n image.error = true;\n });\n\n // #1582 safari doesn't load data uris with crossOrigin properly\n // https://bugs.webkit.org/show_bug.cgi?id=123978\n var dataUriPrefix = 'data:';\n var isDataUri = url.substring(0, dataUriPrefix.length).toLowerCase() === dataUriPrefix;\n if (!isDataUri) {\n // if crossorigin is 'null'(stringified), then manually set it to null \n crossOrigin = crossOrigin === 'null' ? null : crossOrigin;\n image.crossOrigin = crossOrigin; // prevent tainted canvas\n }\n image.src = url;\n return image;\n }\n};\n\nvar BRp$3 = {};\n\n/* global document, ResizeObserver, MutationObserver */\n\nBRp$3.registerBinding = function (target, event, handler, useCapture) {\n // eslint-disable-line no-unused-vars\n var args = Array.prototype.slice.apply(arguments, [1]); // copy\n\n if (Array.isArray(target)) {\n var res = [];\n for (var i = 0; i < target.length; i++) {\n var t = target[i];\n if (t !== undefined) {\n var b = this.binder(t);\n res.push(b.on.apply(b, args));\n }\n }\n return res;\n }\n var b = this.binder(target);\n return b.on.apply(b, args);\n};\nBRp$3.binder = function (tgt) {\n var r = this;\n var containerWindow = r.cy.window();\n var tgtIsDom = tgt === containerWindow || tgt === containerWindow.document || tgt === containerWindow.document.body || domElement(tgt);\n if (r.supportsPassiveEvents == null) {\n // from https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n var supportsPassive = false;\n try {\n var opts = Object.defineProperty({}, 'passive', {\n get: function get() {\n supportsPassive = true;\n return true;\n }\n });\n containerWindow.addEventListener('test', null, opts);\n } catch (err) {\n // not supported\n }\n r.supportsPassiveEvents = supportsPassive;\n }\n var on = function on(event, handler, useCapture) {\n var args = Array.prototype.slice.call(arguments);\n if (tgtIsDom && r.supportsPassiveEvents) {\n // replace useCapture w/ opts obj\n args[2] = {\n capture: useCapture != null ? useCapture : false,\n passive: false,\n once: false\n };\n }\n r.bindings.push({\n target: tgt,\n args: args\n });\n (tgt.addEventListener || tgt.on).apply(tgt, args);\n return this;\n };\n return {\n on: on,\n addEventListener: on,\n addListener: on,\n bind: on\n };\n};\nBRp$3.nodeIsDraggable = function (node) {\n return node && node.isNode() && !node.locked() && node.grabbable();\n};\nBRp$3.nodeIsGrabbable = function (node) {\n return this.nodeIsDraggable(node) && node.interactive();\n};\nBRp$3.load = function () {\n var r = this;\n var containerWindow = r.cy.window();\n var isSelected = function isSelected(ele) {\n return ele.selected();\n };\n var getShadowRoot = function getShadowRoot(element) {\n var rootNode = element.getRootNode();\n // Check if the root node is a shadow root\n if (rootNode && rootNode.nodeType === 11 && rootNode.host !== undefined) {\n return rootNode;\n }\n };\n var triggerEvents = function triggerEvents(target, names, e, position) {\n if (target == null) {\n target = r.cy;\n }\n for (var i = 0; i < names.length; i++) {\n var name = names[i];\n target.emit({\n originalEvent: e,\n type: name,\n position: position\n });\n }\n };\n var isMultSelKeyDown = function isMultSelKeyDown(e) {\n return e.shiftKey || e.metaKey || e.ctrlKey; // maybe e.altKey\n };\n var allowPanningPassthrough = function allowPanningPassthrough(down, downs) {\n var allowPassthrough = true;\n if (r.cy.hasCompoundNodes() && down && down.pannable()) {\n // a grabbable compound node below the ele => no passthrough panning\n for (var i = 0; downs && i < downs.length; i++) {\n var down = downs[i];\n\n //if any parent node in event hierarchy isn't pannable, reject passthrough\n if (down.isNode() && down.isParent() && !down.pannable()) {\n allowPassthrough = false;\n break;\n }\n }\n } else {\n allowPassthrough = true;\n }\n return allowPassthrough;\n };\n var setGrabbed = function setGrabbed(ele) {\n ele[0]._private.grabbed = true;\n };\n var setFreed = function setFreed(ele) {\n ele[0]._private.grabbed = false;\n };\n var setInDragLayer = function setInDragLayer(ele) {\n ele[0]._private.rscratch.inDragLayer = true;\n };\n var setOutDragLayer = function setOutDragLayer(ele) {\n ele[0]._private.rscratch.inDragLayer = false;\n };\n var setGrabTarget = function setGrabTarget(ele) {\n ele[0]._private.rscratch.isGrabTarget = true;\n };\n var removeGrabTarget = function removeGrabTarget(ele) {\n ele[0]._private.rscratch.isGrabTarget = false;\n };\n var addToDragList = function addToDragList(ele, opts) {\n var list = opts.addToList;\n var listHasEle = list.has(ele);\n if (!listHasEle && ele.grabbable() && !ele.locked()) {\n list.merge(ele);\n setGrabbed(ele);\n }\n };\n\n // helper function to determine which child nodes and inner edges\n // of a compound node to be dragged as well as the grabbed and selected nodes\n var addDescendantsToDrag = function addDescendantsToDrag(node, opts) {\n if (!node.cy().hasCompoundNodes()) {\n return;\n }\n if (opts.inDragLayer == null && opts.addToList == null) {\n return;\n } // nothing to do\n\n var innerNodes = node.descendants();\n if (opts.inDragLayer) {\n innerNodes.forEach(setInDragLayer);\n innerNodes.connectedEdges().forEach(setInDragLayer);\n }\n if (opts.addToList) {\n addToDragList(innerNodes, opts);\n }\n };\n\n // adds the given nodes and its neighbourhood to the drag layer\n var addNodesToDrag = function addNodesToDrag(nodes, opts) {\n opts = opts || {};\n var hasCompoundNodes = nodes.cy().hasCompoundNodes();\n if (opts.inDragLayer) {\n nodes.forEach(setInDragLayer);\n nodes.neighborhood().stdFilter(function (ele) {\n return !hasCompoundNodes || ele.isEdge();\n }).forEach(setInDragLayer);\n }\n if (opts.addToList) {\n nodes.forEach(function (ele) {\n addToDragList(ele, opts);\n });\n }\n addDescendantsToDrag(nodes, opts); // always add to drag\n\n // also add nodes and edges related to the topmost ancestor\n updateAncestorsInDragLayer(nodes, {\n inDragLayer: opts.inDragLayer\n });\n r.updateCachedGrabbedEles();\n };\n var addNodeToDrag = addNodesToDrag;\n var freeDraggedElements = function freeDraggedElements(grabbedEles) {\n if (!grabbedEles) {\n return;\n }\n\n // just go over all elements rather than doing a bunch of (possibly expensive) traversals\n r.getCachedZSortedEles().forEach(function (ele) {\n setFreed(ele);\n setOutDragLayer(ele);\n removeGrabTarget(ele);\n });\n r.updateCachedGrabbedEles();\n };\n\n // helper function to determine which ancestor nodes and edges should go\n // to the drag layer (or should be removed from drag layer).\n var updateAncestorsInDragLayer = function updateAncestorsInDragLayer(node, opts) {\n if (opts.inDragLayer == null && opts.addToList == null) {\n return;\n } // nothing to do\n\n if (!node.cy().hasCompoundNodes()) {\n return;\n }\n\n // find top-level parent\n var parent = node.ancestors().orphans();\n\n // no parent node: no nodes to add to the drag layer\n if (parent.same(node)) {\n return;\n }\n var nodes = parent.descendants().spawnSelf().merge(parent).unmerge(node).unmerge(node.descendants());\n var edges = nodes.connectedEdges();\n if (opts.inDragLayer) {\n edges.forEach(setInDragLayer);\n nodes.forEach(setInDragLayer);\n }\n if (opts.addToList) {\n nodes.forEach(function (ele) {\n addToDragList(ele, opts);\n });\n }\n };\n var blurActiveDomElement = function blurActiveDomElement() {\n if (document.activeElement != null && document.activeElement.blur != null) {\n document.activeElement.blur();\n }\n };\n var haveMutationsApi = typeof MutationObserver !== 'undefined';\n var haveResizeObserverApi = typeof ResizeObserver !== 'undefined';\n\n // watch for when the cy container is removed from the dom\n if (haveMutationsApi) {\n r.removeObserver = new MutationObserver(function (mutns) {\n // eslint-disable-line no-undef\n for (var i = 0; i < mutns.length; i++) {\n var mutn = mutns[i];\n var rNodes = mutn.removedNodes;\n if (rNodes) {\n for (var j = 0; j < rNodes.length; j++) {\n var rNode = rNodes[j];\n if (rNode === r.container) {\n r.destroy();\n break;\n }\n }\n }\n }\n });\n if (r.container.parentNode) {\n r.removeObserver.observe(r.container.parentNode, {\n childList: true\n });\n }\n } else {\n r.registerBinding(r.container, 'DOMNodeRemoved', function (e) {\n // eslint-disable-line no-unused-vars\n r.destroy();\n });\n }\n var onResize = debounce(function () {\n r.cy.resize();\n }, 100);\n if (haveMutationsApi) {\n r.styleObserver = new MutationObserver(onResize); // eslint-disable-line no-undef\n\n r.styleObserver.observe(r.container, {\n attributes: true\n });\n }\n\n // auto resize\n r.registerBinding(containerWindow, 'resize', onResize); // eslint-disable-line no-undef\n\n if (haveResizeObserverApi) {\n r.resizeObserver = new ResizeObserver(onResize); // eslint-disable-line no-undef\n\n r.resizeObserver.observe(r.container);\n }\n var forEachUp = function forEachUp(domEle, fn) {\n while (domEle != null) {\n fn(domEle);\n domEle = domEle.parentNode;\n }\n };\n var invalidateCoords = function invalidateCoords() {\n r.invalidateContainerClientCoordsCache();\n };\n forEachUp(r.container, function (domEle) {\n r.registerBinding(domEle, 'transitionend', invalidateCoords);\n r.registerBinding(domEle, 'animationend', invalidateCoords);\n r.registerBinding(domEle, 'scroll', invalidateCoords);\n });\n\n // stop right click menu from appearing on cy\n r.registerBinding(r.container, 'contextmenu', function (e) {\n e.preventDefault();\n });\n var inBoxSelection = function inBoxSelection() {\n return r.selection[4] !== 0;\n };\n var eventInContainer = function eventInContainer(e) {\n // save cycles if mouse events aren't to be captured\n var containerPageCoords = r.findContainerClientCoords();\n var x = containerPageCoords[0];\n var y = containerPageCoords[1];\n var width = containerPageCoords[2];\n var height = containerPageCoords[3];\n var positions = e.touches ? e.touches : [e];\n var atLeastOnePosInside = false;\n for (var i = 0; i < positions.length; i++) {\n var p = positions[i];\n if (x <= p.clientX && p.clientX <= x + width && y <= p.clientY && p.clientY <= y + height) {\n atLeastOnePosInside = true;\n break;\n }\n }\n if (!atLeastOnePosInside) {\n return false;\n }\n var container = r.container;\n var target = e.target;\n var tParent = target.parentNode;\n var containerIsTarget = false;\n while (tParent) {\n if (tParent === container) {\n containerIsTarget = true;\n break;\n }\n tParent = tParent.parentNode;\n }\n if (!containerIsTarget) {\n return false;\n } // if target is outisde cy container, then this event is not for us\n\n return true;\n };\n\n // Primary key\n r.registerBinding(r.container, 'mousedown', function mousedownHandler(e) {\n if (!eventInContainer(e)) {\n return;\n }\n\n // during left mouse button gestures, ignore other buttons\n if (r.hoverData.which === 1 && e.which !== 1) {\n return;\n }\n e.preventDefault();\n blurActiveDomElement();\n r.hoverData.capture = true;\n r.hoverData.which = e.which;\n var cy = r.cy;\n var gpos = [e.clientX, e.clientY];\n var pos = r.projectIntoViewport(gpos[0], gpos[1]);\n var select = r.selection;\n var nears = r.findNearestElements(pos[0], pos[1], true, false);\n var near = nears[0];\n var draggedElements = r.dragData.possibleDragElements;\n r.hoverData.mdownPos = pos;\n r.hoverData.mdownGPos = gpos;\n var makeEvent = function makeEvent(type) {\n return {\n originalEvent: e,\n type: type,\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\n };\n var checkForTaphold = function checkForTaphold() {\n r.hoverData.tapholdCancelled = false;\n clearTimeout(r.hoverData.tapholdTimeout);\n r.hoverData.tapholdTimeout = setTimeout(function () {\n if (r.hoverData.tapholdCancelled) {\n return;\n } else {\n var ele = r.hoverData.down;\n if (ele) {\n ele.emit(makeEvent('taphold'));\n } else {\n cy.emit(makeEvent('taphold'));\n }\n }\n }, r.tapholdDuration);\n };\n\n // Right click button\n if (e.which == 3) {\n r.hoverData.cxtStarted = true;\n var cxtEvt = {\n originalEvent: e,\n type: 'cxttapstart',\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\n if (near) {\n near.activate();\n near.emit(cxtEvt);\n r.hoverData.down = near;\n } else {\n cy.emit(cxtEvt);\n }\n r.hoverData.downTime = new Date().getTime();\n r.hoverData.cxtDragged = false;\n\n // Primary button\n } else if (e.which == 1) {\n if (near) {\n near.activate();\n }\n\n // Element dragging\n {\n // If something is under the cursor and it is draggable, prepare to grab it\n if (near != null) {\n if (r.nodeIsGrabbable(near)) {\n var triggerGrab = function triggerGrab(ele) {\n ele.emit(makeEvent('grab'));\n };\n setGrabTarget(near);\n if (!near.selected()) {\n draggedElements = r.dragData.possibleDragElements = cy.collection();\n addNodeToDrag(near, {\n addToList: draggedElements\n });\n near.emit(makeEvent('grabon')).emit(makeEvent('grab'));\n } else {\n draggedElements = r.dragData.possibleDragElements = cy.collection();\n var selectedNodes = cy.$(function (ele) {\n return ele.isNode() && ele.selected() && r.nodeIsGrabbable(ele);\n });\n addNodesToDrag(selectedNodes, {\n addToList: draggedElements\n });\n near.emit(makeEvent('grabon'));\n selectedNodes.forEach(triggerGrab);\n }\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n }\n }\n r.hoverData.down = near;\n r.hoverData.downs = nears;\n r.hoverData.downTime = new Date().getTime();\n }\n triggerEvents(near, ['mousedown', 'tapstart', 'vmousedown'], e, {\n x: pos[0],\n y: pos[1]\n });\n if (near == null) {\n select[4] = 1;\n r.data.bgActivePosistion = {\n x: pos[0],\n y: pos[1]\n };\n r.redrawHint('select', true);\n r.redraw();\n } else if (near.pannable()) {\n select[4] = 1; // for future pan\n }\n checkForTaphold();\n }\n\n // Initialize selection box coordinates\n select[0] = select[2] = pos[0];\n select[1] = select[3] = pos[1];\n }, false);\n var shadowRoot = getShadowRoot(r.container);\n r.registerBinding([containerWindow, shadowRoot], 'mousemove', function mousemoveHandler(e) {\n // eslint-disable-line no-undef\n var capture = r.hoverData.capture;\n if (!capture && !eventInContainer(e)) {\n return;\n }\n var preventDefault = false;\n var cy = r.cy;\n var zoom = cy.zoom();\n var gpos = [e.clientX, e.clientY];\n var pos = r.projectIntoViewport(gpos[0], gpos[1]);\n var mdownPos = r.hoverData.mdownPos;\n var mdownGPos = r.hoverData.mdownGPos;\n var select = r.selection;\n var near = null;\n if (!r.hoverData.draggingEles && !r.hoverData.dragging && !r.hoverData.selecting) {\n near = r.findNearestElement(pos[0], pos[1], true, false);\n }\n var last = r.hoverData.last;\n var down = r.hoverData.down;\n var disp = [pos[0] - select[2], pos[1] - select[3]];\n var draggedElements = r.dragData.possibleDragElements;\n var isOverThresholdDrag;\n if (mdownGPos) {\n var dx = gpos[0] - mdownGPos[0];\n var dx2 = dx * dx;\n var dy = gpos[1] - mdownGPos[1];\n var dy2 = dy * dy;\n var dist2 = dx2 + dy2;\n r.hoverData.isOverThresholdDrag = isOverThresholdDrag = dist2 >= r.desktopTapThreshold2;\n }\n var multSelKeyDown = isMultSelKeyDown(e);\n if (isOverThresholdDrag) {\n r.hoverData.tapholdCancelled = true;\n }\n var updateDragDelta = function updateDragDelta() {\n var dragDelta = r.hoverData.dragDelta = r.hoverData.dragDelta || [];\n if (dragDelta.length === 0) {\n dragDelta.push(disp[0]);\n dragDelta.push(disp[1]);\n } else {\n dragDelta[0] += disp[0];\n dragDelta[1] += disp[1];\n }\n };\n preventDefault = true;\n triggerEvents(near, ['mousemove', 'vmousemove', 'tapdrag'], e, {\n x: pos[0],\n y: pos[1]\n });\n var makeEvent = function makeEvent(type) {\n return {\n originalEvent: e,\n type: type,\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\n };\n var goIntoBoxMode = function goIntoBoxMode() {\n r.data.bgActivePosistion = undefined;\n if (!r.hoverData.selecting) {\n cy.emit(makeEvent('boxstart'));\n }\n select[4] = 1;\n r.hoverData.selecting = true;\n r.redrawHint('select', true);\n r.redraw();\n };\n\n // trigger context drag if rmouse down\n if (r.hoverData.which === 3) {\n // but only if over threshold\n if (isOverThresholdDrag) {\n var cxtEvt = makeEvent('cxtdrag');\n if (down) {\n down.emit(cxtEvt);\n } else {\n cy.emit(cxtEvt);\n }\n r.hoverData.cxtDragged = true;\n if (!r.hoverData.cxtOver || near !== r.hoverData.cxtOver) {\n if (r.hoverData.cxtOver) {\n r.hoverData.cxtOver.emit(makeEvent('cxtdragout'));\n }\n r.hoverData.cxtOver = near;\n if (near) {\n near.emit(makeEvent('cxtdragover'));\n }\n }\n }\n\n // Check if we are drag panning the entire graph\n } else if (r.hoverData.dragging) {\n preventDefault = true;\n if (cy.panningEnabled() && cy.userPanningEnabled()) {\n var deltaP;\n if (r.hoverData.justStartedPan) {\n var mdPos = r.hoverData.mdownPos;\n deltaP = {\n x: (pos[0] - mdPos[0]) * zoom,\n y: (pos[1] - mdPos[1]) * zoom\n };\n r.hoverData.justStartedPan = false;\n } else {\n deltaP = {\n x: disp[0] * zoom,\n y: disp[1] * zoom\n };\n }\n cy.panBy(deltaP);\n cy.emit(makeEvent('dragpan'));\n r.hoverData.dragged = true;\n }\n\n // Needs reproject due to pan changing viewport\n pos = r.projectIntoViewport(e.clientX, e.clientY);\n\n // Checks primary button down & out of time & mouse not moved much\n } else if (select[4] == 1 && (down == null || down.pannable())) {\n if (isOverThresholdDrag) {\n if (!r.hoverData.dragging && cy.boxSelectionEnabled() && (multSelKeyDown || !cy.panningEnabled() || !cy.userPanningEnabled())) {\n goIntoBoxMode();\n } else if (!r.hoverData.selecting && cy.panningEnabled() && cy.userPanningEnabled()) {\n var allowPassthrough = allowPanningPassthrough(down, r.hoverData.downs);\n if (allowPassthrough) {\n r.hoverData.dragging = true;\n r.hoverData.justStartedPan = true;\n select[4] = 0;\n r.data.bgActivePosistion = array2point(mdownPos);\n r.redrawHint('select', true);\n r.redraw();\n }\n }\n if (down && down.pannable() && down.active()) {\n down.unactivate();\n }\n }\n } else {\n if (down && down.pannable() && down.active()) {\n down.unactivate();\n }\n if ((!down || !down.grabbed()) && near != last) {\n if (last) {\n triggerEvents(last, ['mouseout', 'tapdragout'], e, {\n x: pos[0],\n y: pos[1]\n });\n }\n if (near) {\n triggerEvents(near, ['mouseover', 'tapdragover'], e, {\n x: pos[0],\n y: pos[1]\n });\n }\n r.hoverData.last = near;\n }\n if (down) {\n if (isOverThresholdDrag) {\n // then we can take action\n\n if (cy.boxSelectionEnabled() && multSelKeyDown) {\n // then selection overrides\n if (down && down.grabbed()) {\n freeDraggedElements(draggedElements);\n down.emit(makeEvent('freeon'));\n draggedElements.emit(makeEvent('free'));\n if (r.dragData.didDrag) {\n down.emit(makeEvent('dragfreeon'));\n draggedElements.emit(makeEvent('dragfree'));\n }\n }\n goIntoBoxMode();\n } else if (down && down.grabbed() && r.nodeIsDraggable(down)) {\n // drag node\n var justStartedDrag = !r.dragData.didDrag;\n if (justStartedDrag) {\n r.redrawHint('eles', true);\n }\n r.dragData.didDrag = true; // indicate that we actually did drag the node\n\n // now, add the elements to the drag layer if not done already\n if (!r.hoverData.draggingEles) {\n addNodesToDrag(draggedElements, {\n inDragLayer: true\n });\n }\n var totalShift = {\n x: 0,\n y: 0\n };\n if (number$1(disp[0]) && number$1(disp[1])) {\n totalShift.x += disp[0];\n totalShift.y += disp[1];\n if (justStartedDrag) {\n var dragDelta = r.hoverData.dragDelta;\n if (dragDelta && number$1(dragDelta[0]) && number$1(dragDelta[1])) {\n totalShift.x += dragDelta[0];\n totalShift.y += dragDelta[1];\n }\n }\n }\n r.hoverData.draggingEles = true;\n draggedElements.silentShift(totalShift).emit(makeEvent('position')).emit(makeEvent('drag'));\n r.redrawHint('drag', true);\n r.redraw();\n }\n } else {\n // otherwise save drag delta for when we actually start dragging so the relative grab pos is constant\n updateDragDelta();\n }\n }\n\n // prevent the dragging from triggering text selection on the page\n preventDefault = true;\n }\n select[2] = pos[0];\n select[3] = pos[1];\n if (preventDefault) {\n if (e.stopPropagation) e.stopPropagation();\n if (e.preventDefault) e.preventDefault();\n return false;\n }\n }, false);\n var clickTimeout, didDoubleClick, prevClickTimeStamp;\n r.registerBinding(containerWindow, 'mouseup', function mouseupHandler(e) {\n // eslint-disable-line no-undef\n // during left mouse button gestures, ignore other buttons\n if (r.hoverData.which === 1 && e.which !== 1 && r.hoverData.capture) {\n return;\n }\n var capture = r.hoverData.capture;\n if (!capture) {\n return;\n }\n r.hoverData.capture = false;\n var cy = r.cy;\n var pos = r.projectIntoViewport(e.clientX, e.clientY);\n var select = r.selection;\n var near = r.findNearestElement(pos[0], pos[1], true, false);\n var draggedElements = r.dragData.possibleDragElements;\n var down = r.hoverData.down;\n var multSelKeyDown = isMultSelKeyDown(e);\n if (r.data.bgActivePosistion) {\n r.redrawHint('select', true);\n r.redraw();\n }\n r.hoverData.tapholdCancelled = true;\n r.data.bgActivePosistion = undefined; // not active bg now\n\n if (down) {\n down.unactivate();\n }\n var makeEvent = function makeEvent(type) {\n return {\n originalEvent: e,\n type: type,\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\n };\n if (r.hoverData.which === 3) {\n var cxtEvt = makeEvent('cxttapend');\n if (down) {\n down.emit(cxtEvt);\n } else {\n cy.emit(cxtEvt);\n }\n if (!r.hoverData.cxtDragged) {\n var cxtTap = makeEvent('cxttap');\n if (down) {\n down.emit(cxtTap);\n } else {\n cy.emit(cxtTap);\n }\n }\n r.hoverData.cxtDragged = false;\n r.hoverData.which = null;\n } else if (r.hoverData.which === 1) {\n triggerEvents(near, ['mouseup', 'tapend', 'vmouseup'], e, {\n x: pos[0],\n y: pos[1]\n });\n if (!r.dragData.didDrag &&\n // didn't move a node around\n !r.hoverData.dragged &&\n // didn't pan\n !r.hoverData.selecting &&\n // not box selection\n !r.hoverData.isOverThresholdDrag // didn't move too much\n ) {\n triggerEvents(down, [\"click\", \"tap\", \"vclick\"], e, {\n x: pos[0],\n y: pos[1]\n });\n didDoubleClick = false;\n if (e.timeStamp - prevClickTimeStamp <= cy.multiClickDebounceTime()) {\n clickTimeout && clearTimeout(clickTimeout);\n didDoubleClick = true;\n prevClickTimeStamp = null;\n triggerEvents(down, [\"dblclick\", \"dbltap\", \"vdblclick\"], e, {\n x: pos[0],\n y: pos[1]\n });\n } else {\n clickTimeout = setTimeout(function () {\n if (didDoubleClick) return;\n triggerEvents(down, [\"oneclick\", \"onetap\", \"voneclick\"], e, {\n x: pos[0],\n y: pos[1]\n });\n }, cy.multiClickDebounceTime());\n prevClickTimeStamp = e.timeStamp;\n }\n }\n\n // Deselect all elements if nothing is currently under the mouse cursor and we aren't dragging something\n if (down == null // not mousedown on node\n && !r.dragData.didDrag // didn't move the node around\n && !r.hoverData.selecting // not box selection\n && !r.hoverData.dragged // didn't pan\n && !isMultSelKeyDown(e)) {\n cy.$(isSelected).unselect(['tapunselect']);\n if (draggedElements.length > 0) {\n r.redrawHint('eles', true);\n }\n r.dragData.possibleDragElements = draggedElements = cy.collection();\n }\n\n // Single selection\n if (near == down && !r.dragData.didDrag && !r.hoverData.selecting) {\n if (near != null && near._private.selectable) {\n if (r.hoverData.dragging) ; else if (cy.selectionType() === 'additive' || multSelKeyDown) {\n if (near.selected()) {\n near.unselect(['tapunselect']);\n } else {\n near.select(['tapselect']);\n }\n } else {\n if (!multSelKeyDown) {\n cy.$(isSelected).unmerge(near).unselect(['tapunselect']);\n near.select(['tapselect']);\n }\n }\n r.redrawHint('eles', true);\n }\n }\n if (r.hoverData.selecting) {\n var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3]));\n r.redrawHint('select', true);\n if (box.length > 0) {\n r.redrawHint('eles', true);\n }\n cy.emit(makeEvent('boxend'));\n var eleWouldBeSelected = function eleWouldBeSelected(ele) {\n return ele.selectable() && !ele.selected();\n };\n if (cy.selectionType() === 'additive') {\n box.emit(makeEvent('box')).stdFilter(eleWouldBeSelected).select().emit(makeEvent('boxselect'));\n } else {\n if (!multSelKeyDown) {\n cy.$(isSelected).unmerge(box).unselect();\n }\n box.emit(makeEvent('box')).stdFilter(eleWouldBeSelected).select().emit(makeEvent('boxselect'));\n }\n\n // always need redraw in case eles unselectable\n r.redraw();\n }\n\n // Cancel drag pan\n if (r.hoverData.dragging) {\n r.hoverData.dragging = false;\n r.redrawHint('select', true);\n r.redrawHint('eles', true);\n r.redraw();\n }\n if (!select[4]) {\n r.redrawHint('drag', true);\n r.redrawHint('eles', true);\n var downWasGrabbed = down && down.grabbed();\n freeDraggedElements(draggedElements);\n if (downWasGrabbed) {\n down.emit(makeEvent('freeon'));\n draggedElements.emit(makeEvent('free'));\n if (r.dragData.didDrag) {\n down.emit(makeEvent('dragfreeon'));\n draggedElements.emit(makeEvent('dragfree'));\n }\n }\n }\n } // else not right mouse\n\n select[4] = 0;\n r.hoverData.down = null;\n r.hoverData.cxtStarted = false;\n r.hoverData.draggingEles = false;\n r.hoverData.selecting = false;\n r.hoverData.isOverThresholdDrag = false;\n r.dragData.didDrag = false;\n r.hoverData.dragged = false;\n r.hoverData.dragDelta = [];\n r.hoverData.mdownPos = null;\n r.hoverData.mdownGPos = null;\n r.hoverData.which = null;\n }, false);\n var wheelDeltas = []; // log of first N wheel deltas\n var wheelDeltaN = 4; // how many events to log\n var inaccurateScrollDevice;\n var inaccurateScrollFactor = 100000; // base of inaccurate wheel deltas (e.g. base 5 could yield wheels of 10, 25, 50, etc.)\n\n var allAreDivisibleBy = function allAreDivisibleBy(list, factor) {\n for (var i = 0; i < list.length; i++) {\n if (list[i] % factor !== 0) {\n return false;\n }\n }\n return true;\n };\n var allAreSameMagnitude = function allAreSameMagnitude(list) {\n var firstMag = Math.abs(list[0]);\n for (var i = 1; i < list.length; i++) {\n if (Math.abs(list[i]) !== firstMag) {\n return false;\n }\n }\n return true;\n };\n var wheelHandler = function wheelHandler(e) {\n var clamp = false;\n var delta = e.deltaY;\n if (delta == null) {\n // compatibility with old browsers\n if (e.wheelDeltaY != null) {\n delta = e.wheelDeltaY / 4;\n } else if (e.wheelDelta != null) {\n delta = e.wheelDelta / 4;\n }\n }\n if (delta === 0) {\n return; // no change in zoom (Bug: Zoom becomes erratic on rapid scroll due to deltaY: 0 event #3394)\n }\n if (inaccurateScrollDevice == null) {\n if (wheelDeltas.length >= wheelDeltaN) {\n // use log to determine if inaccurate\n var wds = wheelDeltas;\n inaccurateScrollDevice = allAreDivisibleBy(wds, 5);\n if (!inaccurateScrollDevice) {\n // check for all large values of exact same magnitude\n var firstMag = Math.abs(wds[0]);\n inaccurateScrollDevice = allAreSameMagnitude(wds) && firstMag > 5;\n }\n if (inaccurateScrollDevice) {\n for (var i = 0; i < wds.length; i++) {\n inaccurateScrollFactor = Math.min(Math.abs(wds[i]), inaccurateScrollFactor);\n }\n }\n\n // console.log('Sampled wheel deltas:', wds);\n // console.log('inaccurateScrollDevice:', inaccurateScrollDevice);\n // console.log('inaccurateScrollFactor:', inaccurateScrollFactor);\n } else {\n // clamp and log until we reach N\n wheelDeltas.push(delta);\n clamp = true;\n // console.log('Clamping initial wheel events until we get a good sample');\n }\n } else if (inaccurateScrollDevice) {\n // keep updating\n inaccurateScrollFactor = Math.min(Math.abs(delta), inaccurateScrollFactor);\n // console.log('Keep updating inaccurateScrollFactor beyond sample in case we did not get the smallest possible val:', inaccurateScrollFactor);\n }\n if (r.scrollingPage) {\n return;\n } // while scrolling, ignore wheel-to-zoom\n\n var cy = r.cy;\n var zoom = cy.zoom();\n var pan = cy.pan();\n var pos = r.projectIntoViewport(e.clientX, e.clientY);\n var rpos = [pos[0] * zoom + pan.x, pos[1] * zoom + pan.y];\n if (r.hoverData.draggingEles || r.hoverData.dragging || r.hoverData.cxtStarted || inBoxSelection()) {\n // if pan dragging or cxt dragging, wheel movements make no zoom\n e.preventDefault();\n return;\n }\n if (cy.panningEnabled() && cy.userPanningEnabled() && cy.zoomingEnabled() && cy.userZoomingEnabled()) {\n e.preventDefault();\n r.data.wheelZooming = true;\n clearTimeout(r.data.wheelTimeout);\n r.data.wheelTimeout = setTimeout(function () {\n r.data.wheelZooming = false;\n r.redrawHint('eles', true);\n r.redraw();\n }, 150);\n var diff;\n if (clamp && Math.abs(delta) > 5) {\n delta = signum(delta) * 5;\n }\n diff = delta / -250;\n if (inaccurateScrollDevice) {\n diff /= inaccurateScrollFactor;\n diff *= 3;\n }\n diff = diff * r.wheelSensitivity;\n\n // console.log(`delta = ${delta}, diff = ${diff}, mode = ${e.deltaMode}`)\n\n var needsWheelFix = e.deltaMode === 1;\n if (needsWheelFix) {\n // fixes slow wheel events on ff/linux and ff/windows\n diff *= 33;\n }\n var newZoom = cy.zoom() * Math.pow(10, diff);\n if (e.type === 'gesturechange') {\n newZoom = r.gestureStartZoom * e.scale;\n }\n cy.zoom({\n level: newZoom,\n renderedPosition: {\n x: rpos[0],\n y: rpos[1]\n }\n });\n cy.emit({\n type: e.type === 'gesturechange' ? 'pinchzoom' : 'scrollzoom',\n originalEvent: e,\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n }\n };\n\n // Functions to help with whether mouse wheel should trigger zooming\n // --\n r.registerBinding(r.container, 'wheel', wheelHandler, true);\n\n // disable nonstandard wheel events\n // r.registerBinding(r.container, 'mousewheel', wheelHandler, true);\n // r.registerBinding(r.container, 'DOMMouseScroll', wheelHandler, true);\n // r.registerBinding(r.container, 'MozMousePixelScroll', wheelHandler, true); // older firefox\n\n r.registerBinding(containerWindow, 'scroll', function scrollHandler(e) {\n // eslint-disable-line no-unused-vars\n r.scrollingPage = true;\n clearTimeout(r.scrollingPageTimeout);\n r.scrollingPageTimeout = setTimeout(function () {\n r.scrollingPage = false;\n }, 250);\n }, true);\n\n // desktop safari pinch to zoom start\n r.registerBinding(r.container, 'gesturestart', function gestureStartHandler(e) {\n r.gestureStartZoom = r.cy.zoom();\n if (!r.hasTouchStarted) {\n // don't affect touch devices like iphone\n e.preventDefault();\n }\n }, true);\n r.registerBinding(r.container, 'gesturechange', function (e) {\n if (!r.hasTouchStarted) {\n // don't affect touch devices like iphone\n wheelHandler(e);\n }\n }, true);\n\n // Functions to help with handling mouseout/mouseover on the Cytoscape container\n // Handle mouseout on Cytoscape container\n r.registerBinding(r.container, 'mouseout', function mouseOutHandler(e) {\n var pos = r.projectIntoViewport(e.clientX, e.clientY);\n r.cy.emit({\n originalEvent: e,\n type: 'mouseout',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n }, false);\n r.registerBinding(r.container, 'mouseover', function mouseOverHandler(e) {\n var pos = r.projectIntoViewport(e.clientX, e.clientY);\n r.cy.emit({\n originalEvent: e,\n type: 'mouseover',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n }, false);\n var f1x1, f1y1, f2x1, f2y1; // starting points for pinch-to-zoom\n var distance1, distance1Sq; // initial distance between finger 1 and finger 2 for pinch-to-zoom\n var center1, modelCenter1; // center point on start pinch to zoom\n var offsetLeft, offsetTop;\n var containerWidth, containerHeight;\n var twoFingersStartInside;\n var distance = function distance(x1, y1, x2, y2) {\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n };\n var distanceSq = function distanceSq(x1, y1, x2, y2) {\n return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);\n };\n var touchstartHandler;\n r.registerBinding(r.container, 'touchstart', touchstartHandler = function touchstartHandler(e) {\n r.hasTouchStarted = true;\n if (!eventInContainer(e)) {\n return;\n }\n blurActiveDomElement();\n r.touchData.capture = true;\n r.data.bgActivePosistion = undefined;\n var cy = r.cy;\n var now = r.touchData.now;\n var earlier = r.touchData.earlier;\n if (e.touches[0]) {\n var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY);\n now[0] = pos[0];\n now[1] = pos[1];\n }\n if (e.touches[1]) {\n var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY);\n now[2] = pos[0];\n now[3] = pos[1];\n }\n if (e.touches[2]) {\n var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY);\n now[4] = pos[0];\n now[5] = pos[1];\n }\n var makeEvent = function makeEvent(type) {\n return {\n originalEvent: e,\n type: type,\n position: {\n x: now[0],\n y: now[1]\n }\n };\n };\n\n // record starting points for pinch-to-zoom\n if (e.touches[1]) {\n r.touchData.singleTouchMoved = true;\n freeDraggedElements(r.dragData.touchDragEles);\n var offsets = r.findContainerClientCoords();\n offsetLeft = offsets[0];\n offsetTop = offsets[1];\n containerWidth = offsets[2];\n containerHeight = offsets[3];\n f1x1 = e.touches[0].clientX - offsetLeft;\n f1y1 = e.touches[0].clientY - offsetTop;\n f2x1 = e.touches[1].clientX - offsetLeft;\n f2y1 = e.touches[1].clientY - offsetTop;\n twoFingersStartInside = 0 <= f1x1 && f1x1 <= containerWidth && 0 <= f2x1 && f2x1 <= containerWidth && 0 <= f1y1 && f1y1 <= containerHeight && 0 <= f2y1 && f2y1 <= containerHeight;\n var pan = cy.pan();\n var zoom = cy.zoom();\n distance1 = distance(f1x1, f1y1, f2x1, f2y1);\n distance1Sq = distanceSq(f1x1, f1y1, f2x1, f2y1);\n center1 = [(f1x1 + f2x1) / 2, (f1y1 + f2y1) / 2];\n modelCenter1 = [(center1[0] - pan.x) / zoom, (center1[1] - pan.y) / zoom];\n\n // consider context tap\n var cxtDistThreshold = 200;\n var cxtDistThresholdSq = cxtDistThreshold * cxtDistThreshold;\n if (distance1Sq < cxtDistThresholdSq && !e.touches[2]) {\n var near1 = r.findNearestElement(now[0], now[1], true, true);\n var near2 = r.findNearestElement(now[2], now[3], true, true);\n if (near1 && near1.isNode()) {\n near1.activate().emit(makeEvent('cxttapstart'));\n r.touchData.start = near1;\n } else if (near2 && near2.isNode()) {\n near2.activate().emit(makeEvent('cxttapstart'));\n r.touchData.start = near2;\n } else {\n cy.emit(makeEvent('cxttapstart'));\n }\n if (r.touchData.start) {\n r.touchData.start._private.grabbed = false;\n }\n r.touchData.cxt = true;\n r.touchData.cxtDragged = false;\n r.data.bgActivePosistion = undefined;\n r.redraw();\n return;\n }\n }\n if (e.touches[2]) {\n // ignore\n\n // safari on ios pans the page otherwise (normally you should be able to preventdefault on touchmove...)\n if (cy.boxSelectionEnabled()) {\n e.preventDefault();\n }\n } else if (e.touches[1]) ; else if (e.touches[0]) {\n var nears = r.findNearestElements(now[0], now[1], true, true);\n var near = nears[0];\n if (near != null) {\n near.activate();\n r.touchData.start = near;\n r.touchData.starts = nears;\n if (r.nodeIsGrabbable(near)) {\n var draggedEles = r.dragData.touchDragEles = cy.collection();\n var selectedNodes = null;\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n if (near.selected()) {\n // reset drag elements, since near will be added again\n\n selectedNodes = cy.$(function (ele) {\n return ele.selected() && r.nodeIsGrabbable(ele);\n });\n addNodesToDrag(selectedNodes, {\n addToList: draggedEles\n });\n } else {\n addNodeToDrag(near, {\n addToList: draggedEles\n });\n }\n setGrabTarget(near);\n near.emit(makeEvent('grabon'));\n if (selectedNodes) {\n selectedNodes.forEach(function (n) {\n n.emit(makeEvent('grab'));\n });\n } else {\n near.emit(makeEvent('grab'));\n }\n }\n }\n triggerEvents(near, ['touchstart', 'tapstart', 'vmousedown'], e, {\n x: now[0],\n y: now[1]\n });\n if (near == null) {\n r.data.bgActivePosistion = {\n x: pos[0],\n y: pos[1]\n };\n r.redrawHint('select', true);\n r.redraw();\n }\n\n // Tap, taphold\n // -----\n\n r.touchData.singleTouchMoved = false;\n r.touchData.singleTouchStartTime = +new Date();\n clearTimeout(r.touchData.tapholdTimeout);\n r.touchData.tapholdTimeout = setTimeout(function () {\n if (r.touchData.singleTouchMoved === false && !r.pinching // if pinching, then taphold unselect shouldn't take effect\n && !r.touchData.selecting // box selection shouldn't allow taphold through\n ) {\n triggerEvents(r.touchData.start, ['taphold'], e, {\n x: now[0],\n y: now[1]\n });\n }\n }, r.tapholdDuration);\n }\n if (e.touches.length >= 1) {\n var sPos = r.touchData.startPosition = [null, null, null, null, null, null];\n for (var i = 0; i < now.length; i++) {\n sPos[i] = earlier[i] = now[i];\n }\n var touch0 = e.touches[0];\n r.touchData.startGPosition = [touch0.clientX, touch0.clientY];\n }\n }, false);\n var touchmoveHandler;\n r.registerBinding(containerWindow, 'touchmove', touchmoveHandler = function touchmoveHandler(e) {\n // eslint-disable-line no-undef\n var capture = r.touchData.capture;\n if (!capture && !eventInContainer(e)) {\n return;\n }\n var select = r.selection;\n var cy = r.cy;\n var now = r.touchData.now;\n var earlier = r.touchData.earlier;\n var zoom = cy.zoom();\n if (e.touches[0]) {\n var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY);\n now[0] = pos[0];\n now[1] = pos[1];\n }\n if (e.touches[1]) {\n var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY);\n now[2] = pos[0];\n now[3] = pos[1];\n }\n if (e.touches[2]) {\n var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY);\n now[4] = pos[0];\n now[5] = pos[1];\n }\n var makeEvent = function makeEvent(type) {\n return {\n originalEvent: e,\n type: type,\n position: {\n x: now[0],\n y: now[1]\n }\n };\n };\n var startGPos = r.touchData.startGPosition;\n var isOverThresholdDrag;\n if (capture && e.touches[0] && startGPos) {\n var disp = [];\n for (var j = 0; j < now.length; j++) {\n disp[j] = now[j] - earlier[j];\n }\n var dx = e.touches[0].clientX - startGPos[0];\n var dx2 = dx * dx;\n var dy = e.touches[0].clientY - startGPos[1];\n var dy2 = dy * dy;\n var dist2 = dx2 + dy2;\n isOverThresholdDrag = dist2 >= r.touchTapThreshold2;\n }\n\n // context swipe cancelling\n if (capture && r.touchData.cxt) {\n e.preventDefault();\n var f1x2 = e.touches[0].clientX - offsetLeft,\n f1y2 = e.touches[0].clientY - offsetTop;\n var f2x2 = e.touches[1].clientX - offsetLeft,\n f2y2 = e.touches[1].clientY - offsetTop;\n // var distance2 = distance( f1x2, f1y2, f2x2, f2y2 );\n var distance2Sq = distanceSq(f1x2, f1y2, f2x2, f2y2);\n var factorSq = distance2Sq / distance1Sq;\n var distThreshold = 150;\n var distThresholdSq = distThreshold * distThreshold;\n var factorThreshold = 1.5;\n var factorThresholdSq = factorThreshold * factorThreshold;\n\n // cancel ctx gestures if the distance b/t the fingers increases\n if (factorSq >= factorThresholdSq || distance2Sq >= distThresholdSq) {\n r.touchData.cxt = false;\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n var cxtEvt = makeEvent('cxttapend');\n if (r.touchData.start) {\n r.touchData.start.unactivate().emit(cxtEvt);\n r.touchData.start = null;\n } else {\n cy.emit(cxtEvt);\n }\n }\n }\n\n // context swipe\n if (capture && r.touchData.cxt) {\n var cxtEvt = makeEvent('cxtdrag');\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n if (r.touchData.start) {\n r.touchData.start.emit(cxtEvt);\n } else {\n cy.emit(cxtEvt);\n }\n if (r.touchData.start) {\n r.touchData.start._private.grabbed = false;\n }\n r.touchData.cxtDragged = true;\n var near = r.findNearestElement(now[0], now[1], true, true);\n if (!r.touchData.cxtOver || near !== r.touchData.cxtOver) {\n if (r.touchData.cxtOver) {\n r.touchData.cxtOver.emit(makeEvent('cxtdragout'));\n }\n r.touchData.cxtOver = near;\n if (near) {\n near.emit(makeEvent('cxtdragover'));\n }\n }\n\n // box selection\n } else if (capture && e.touches[2] && cy.boxSelectionEnabled()) {\n e.preventDefault();\n r.data.bgActivePosistion = undefined;\n this.lastThreeTouch = +new Date();\n if (!r.touchData.selecting) {\n cy.emit(makeEvent('boxstart'));\n }\n r.touchData.selecting = true;\n r.touchData.didSelect = true;\n select[4] = 1;\n if (!select || select.length === 0 || select[0] === undefined) {\n select[0] = (now[0] + now[2] + now[4]) / 3;\n select[1] = (now[1] + now[3] + now[5]) / 3;\n select[2] = (now[0] + now[2] + now[4]) / 3 + 1;\n select[3] = (now[1] + now[3] + now[5]) / 3 + 1;\n } else {\n select[2] = (now[0] + now[2] + now[4]) / 3;\n select[3] = (now[1] + now[3] + now[5]) / 3;\n }\n r.redrawHint('select', true);\n r.redraw();\n\n // pinch to zoom\n } else if (capture && e.touches[1] && !r.touchData.didSelect // don't allow box selection to degrade to pinch-to-zoom\n && cy.zoomingEnabled() && cy.panningEnabled() && cy.userZoomingEnabled() && cy.userPanningEnabled()) {\n // two fingers => pinch to zoom\n e.preventDefault();\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n var draggedEles = r.dragData.touchDragEles;\n if (draggedEles) {\n r.redrawHint('drag', true);\n for (var i = 0; i < draggedEles.length; i++) {\n var de_p = draggedEles[i]._private;\n de_p.grabbed = false;\n de_p.rscratch.inDragLayer = false;\n }\n }\n var _start = r.touchData.start;\n\n // (x2, y2) for fingers 1 and 2\n var f1x2 = e.touches[0].clientX - offsetLeft,\n f1y2 = e.touches[0].clientY - offsetTop;\n var f2x2 = e.touches[1].clientX - offsetLeft,\n f2y2 = e.touches[1].clientY - offsetTop;\n var distance2 = distance(f1x2, f1y2, f2x2, f2y2);\n // var distance2Sq = distanceSq( f1x2, f1y2, f2x2, f2y2 );\n // var factor = Math.sqrt( distance2Sq ) / Math.sqrt( distance1Sq );\n var factor = distance2 / distance1;\n if (twoFingersStartInside) {\n // delta finger1\n var df1x = f1x2 - f1x1;\n var df1y = f1y2 - f1y1;\n\n // delta finger 2\n var df2x = f2x2 - f2x1;\n var df2y = f2y2 - f2y1;\n\n // translation is the normalised vector of the two fingers movement\n // i.e. so pinching cancels out and moving together pans\n var tx = (df1x + df2x) / 2;\n var ty = (df1y + df2y) / 2;\n\n // now calculate the zoom\n var zoom1 = cy.zoom();\n var zoom2 = zoom1 * factor;\n var pan1 = cy.pan();\n\n // the model center point converted to the current rendered pos\n var ctrx = modelCenter1[0] * zoom1 + pan1.x;\n var ctry = modelCenter1[1] * zoom1 + pan1.y;\n var pan2 = {\n x: -zoom2 / zoom1 * (ctrx - pan1.x - tx) + ctrx,\n y: -zoom2 / zoom1 * (ctry - pan1.y - ty) + ctry\n };\n\n // remove dragged eles\n if (_start && _start.active()) {\n var draggedEles = r.dragData.touchDragEles;\n freeDraggedElements(draggedEles);\n r.redrawHint('drag', true);\n r.redrawHint('eles', true);\n _start.unactivate().emit(makeEvent('freeon'));\n draggedEles.emit(makeEvent('free'));\n if (r.dragData.didDrag) {\n _start.emit(makeEvent('dragfreeon'));\n draggedEles.emit(makeEvent('dragfree'));\n }\n }\n cy.viewport({\n zoom: zoom2,\n pan: pan2,\n cancelOnFailedZoom: true\n });\n cy.emit(makeEvent('pinchzoom'));\n distance1 = distance2;\n f1x1 = f1x2;\n f1y1 = f1y2;\n f2x1 = f2x2;\n f2y1 = f2y2;\n r.pinching = true;\n }\n\n // Re-project\n if (e.touches[0]) {\n var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY);\n now[0] = pos[0];\n now[1] = pos[1];\n }\n if (e.touches[1]) {\n var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY);\n now[2] = pos[0];\n now[3] = pos[1];\n }\n if (e.touches[2]) {\n var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY);\n now[4] = pos[0];\n now[5] = pos[1];\n }\n } else if (e.touches[0] && !r.touchData.didSelect // don't allow box selection to degrade to single finger events like panning\n ) {\n var start = r.touchData.start;\n var last = r.touchData.last;\n var near;\n if (!r.hoverData.draggingEles && !r.swipePanning) {\n near = r.findNearestElement(now[0], now[1], true, true);\n }\n if (capture && start != null) {\n e.preventDefault();\n }\n\n // dragging nodes\n if (capture && start != null && r.nodeIsDraggable(start)) {\n if (isOverThresholdDrag) {\n // then dragging can happen\n var draggedEles = r.dragData.touchDragEles;\n var justStartedDrag = !r.dragData.didDrag;\n if (justStartedDrag) {\n addNodesToDrag(draggedEles, {\n inDragLayer: true\n });\n }\n r.dragData.didDrag = true;\n var totalShift = {\n x: 0,\n y: 0\n };\n if (number$1(disp[0]) && number$1(disp[1])) {\n totalShift.x += disp[0];\n totalShift.y += disp[1];\n if (justStartedDrag) {\n r.redrawHint('eles', true);\n var dragDelta = r.touchData.dragDelta;\n if (dragDelta && number$1(dragDelta[0]) && number$1(dragDelta[1])) {\n totalShift.x += dragDelta[0];\n totalShift.y += dragDelta[1];\n }\n }\n }\n r.hoverData.draggingEles = true;\n draggedEles.silentShift(totalShift).emit(makeEvent('position')).emit(makeEvent('drag'));\n r.redrawHint('drag', true);\n if (r.touchData.startPosition[0] == earlier[0] && r.touchData.startPosition[1] == earlier[1]) {\n r.redrawHint('eles', true);\n }\n r.redraw();\n } else {\n // otherwise keep track of drag delta for later\n var dragDelta = r.touchData.dragDelta = r.touchData.dragDelta || [];\n if (dragDelta.length === 0) {\n dragDelta.push(disp[0]);\n dragDelta.push(disp[1]);\n } else {\n dragDelta[0] += disp[0];\n dragDelta[1] += disp[1];\n }\n }\n }\n\n // touchmove\n {\n triggerEvents(start || near, ['touchmove', 'tapdrag', 'vmousemove'], e, {\n x: now[0],\n y: now[1]\n });\n if ((!start || !start.grabbed()) && near != last) {\n if (last) {\n last.emit(makeEvent('tapdragout'));\n }\n if (near) {\n near.emit(makeEvent('tapdragover'));\n }\n }\n r.touchData.last = near;\n }\n\n // check to cancel taphold\n if (capture) {\n for (var i = 0; i < now.length; i++) {\n if (now[i] && r.touchData.startPosition[i] && isOverThresholdDrag) {\n r.touchData.singleTouchMoved = true;\n }\n }\n }\n\n // panning\n if (capture && (start == null || start.pannable()) && cy.panningEnabled() && cy.userPanningEnabled()) {\n var allowPassthrough = allowPanningPassthrough(start, r.touchData.starts);\n if (allowPassthrough) {\n e.preventDefault();\n if (!r.data.bgActivePosistion) {\n r.data.bgActivePosistion = array2point(r.touchData.startPosition);\n }\n if (r.swipePanning) {\n cy.panBy({\n x: disp[0] * zoom,\n y: disp[1] * zoom\n });\n cy.emit(makeEvent('dragpan'));\n } else if (isOverThresholdDrag) {\n r.swipePanning = true;\n cy.panBy({\n x: dx * zoom,\n y: dy * zoom\n });\n cy.emit(makeEvent('dragpan'));\n if (start) {\n start.unactivate();\n r.redrawHint('select', true);\n r.touchData.start = null;\n }\n }\n }\n\n // Re-project\n var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY);\n now[0] = pos[0];\n now[1] = pos[1];\n }\n }\n for (var j = 0; j < now.length; j++) {\n earlier[j] = now[j];\n }\n\n // the active bg indicator should be removed when making a swipe that is neither for dragging nodes or panning\n if (capture && e.touches.length > 0 && !r.hoverData.draggingEles && !r.swipePanning && r.data.bgActivePosistion != null) {\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n r.redraw();\n }\n }, false);\n var touchcancelHandler;\n r.registerBinding(containerWindow, 'touchcancel', touchcancelHandler = function touchcancelHandler(e) {\n // eslint-disable-line no-unused-vars\n var start = r.touchData.start;\n r.touchData.capture = false;\n if (start) {\n start.unactivate();\n }\n });\n var touchendHandler, didDoubleTouch, touchTimeout, prevTouchTimeStamp;\n r.registerBinding(containerWindow, 'touchend', touchendHandler = function touchendHandler(e) {\n // eslint-disable-line no-unused-vars\n var start = r.touchData.start;\n var capture = r.touchData.capture;\n if (capture) {\n if (e.touches.length === 0) {\n r.touchData.capture = false;\n }\n e.preventDefault();\n } else {\n return;\n }\n var select = r.selection;\n r.swipePanning = false;\n r.hoverData.draggingEles = false;\n var cy = r.cy;\n var zoom = cy.zoom();\n var now = r.touchData.now;\n var earlier = r.touchData.earlier;\n if (e.touches[0]) {\n var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY);\n now[0] = pos[0];\n now[1] = pos[1];\n }\n if (e.touches[1]) {\n var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY);\n now[2] = pos[0];\n now[3] = pos[1];\n }\n if (e.touches[2]) {\n var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY);\n now[4] = pos[0];\n now[5] = pos[1];\n }\n var makeEvent = function makeEvent(type) {\n return {\n originalEvent: e,\n type: type,\n position: {\n x: now[0],\n y: now[1]\n }\n };\n };\n if (start) {\n start.unactivate();\n }\n var ctxTapend;\n if (r.touchData.cxt) {\n ctxTapend = makeEvent('cxttapend');\n if (start) {\n start.emit(ctxTapend);\n } else {\n cy.emit(ctxTapend);\n }\n if (!r.touchData.cxtDragged) {\n var ctxTap = makeEvent('cxttap');\n if (start) {\n start.emit(ctxTap);\n } else {\n cy.emit(ctxTap);\n }\n }\n if (r.touchData.start) {\n r.touchData.start._private.grabbed = false;\n }\n r.touchData.cxt = false;\n r.touchData.start = null;\n r.redraw();\n return;\n }\n\n // no more box selection if we don't have three fingers\n if (!e.touches[2] && cy.boxSelectionEnabled() && r.touchData.selecting) {\n r.touchData.selecting = false;\n var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3]));\n select[0] = undefined;\n select[1] = undefined;\n select[2] = undefined;\n select[3] = undefined;\n select[4] = 0;\n r.redrawHint('select', true);\n cy.emit(makeEvent('boxend'));\n var eleWouldBeSelected = function eleWouldBeSelected(ele) {\n return ele.selectable() && !ele.selected();\n };\n box.emit(makeEvent('box')).stdFilter(eleWouldBeSelected).select().emit(makeEvent('boxselect'));\n if (box.nonempty()) {\n r.redrawHint('eles', true);\n }\n r.redraw();\n }\n if (start != null) {\n start.unactivate();\n }\n if (e.touches[2]) {\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n } else if (e.touches[1]) ; else if (e.touches[0]) ; else if (!e.touches[0]) {\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n var draggedEles = r.dragData.touchDragEles;\n if (start != null) {\n var startWasGrabbed = start._private.grabbed;\n freeDraggedElements(draggedEles);\n r.redrawHint('drag', true);\n r.redrawHint('eles', true);\n if (startWasGrabbed) {\n start.emit(makeEvent('freeon'));\n draggedEles.emit(makeEvent('free'));\n if (r.dragData.didDrag) {\n start.emit(makeEvent('dragfreeon'));\n draggedEles.emit(makeEvent('dragfree'));\n }\n }\n triggerEvents(start, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, {\n x: now[0],\n y: now[1]\n });\n start.unactivate();\n r.touchData.start = null;\n } else {\n var near = r.findNearestElement(now[0], now[1], true, true);\n triggerEvents(near, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, {\n x: now[0],\n y: now[1]\n });\n }\n var dx = r.touchData.startPosition[0] - now[0];\n var dx2 = dx * dx;\n var dy = r.touchData.startPosition[1] - now[1];\n var dy2 = dy * dy;\n var dist2 = dx2 + dy2;\n var rdist2 = dist2 * zoom * zoom;\n\n // Tap event, roughly same as mouse click event for touch\n if (!r.touchData.singleTouchMoved) {\n if (!start) {\n cy.$(':selected').unselect(['tapunselect']);\n }\n triggerEvents(start, ['tap', 'vclick'], e, {\n x: now[0],\n y: now[1]\n });\n didDoubleTouch = false;\n if (e.timeStamp - prevTouchTimeStamp <= cy.multiClickDebounceTime()) {\n touchTimeout && clearTimeout(touchTimeout);\n didDoubleTouch = true;\n prevTouchTimeStamp = null;\n triggerEvents(start, ['dbltap', 'vdblclick'], e, {\n x: now[0],\n y: now[1]\n });\n } else {\n touchTimeout = setTimeout(function () {\n if (didDoubleTouch) return;\n triggerEvents(start, ['onetap', 'voneclick'], e, {\n x: now[0],\n y: now[1]\n });\n }, cy.multiClickDebounceTime());\n prevTouchTimeStamp = e.timeStamp;\n }\n }\n\n // Prepare to select the currently touched node, only if it hasn't been dragged past a certain distance\n if (start != null && !r.dragData.didDrag // didn't drag nodes around\n && start._private.selectable && rdist2 < r.touchTapThreshold2 && !r.pinching // pinch to zoom should not affect selection\n ) {\n if (cy.selectionType() === 'single') {\n cy.$(isSelected).unmerge(start).unselect(['tapunselect']);\n start.select(['tapselect']);\n } else {\n if (start.selected()) {\n start.unselect(['tapunselect']);\n } else {\n start.select(['tapselect']);\n }\n }\n r.redrawHint('eles', true);\n }\n r.touchData.singleTouchMoved = true;\n }\n for (var j = 0; j < now.length; j++) {\n earlier[j] = now[j];\n }\n r.dragData.didDrag = false; // reset for next touchstart\n\n if (e.touches.length === 0) {\n r.touchData.dragDelta = [];\n r.touchData.startPosition = [null, null, null, null, null, null];\n r.touchData.startGPosition = null;\n r.touchData.didSelect = false;\n }\n if (e.touches.length < 2) {\n if (e.touches.length === 1) {\n // the old start global pos'n may not be the same finger that remains\n r.touchData.startGPosition = [e.touches[0].clientX, e.touches[0].clientY];\n }\n r.pinching = false;\n r.redrawHint('eles', true);\n r.redraw();\n }\n\n //r.redraw();\n }, false);\n\n // fallback compatibility layer for ms pointer events\n if (typeof TouchEvent === 'undefined') {\n var pointers = [];\n var makeTouch = function makeTouch(e) {\n return {\n clientX: e.clientX,\n clientY: e.clientY,\n force: 1,\n identifier: e.pointerId,\n pageX: e.pageX,\n pageY: e.pageY,\n radiusX: e.width / 2,\n radiusY: e.height / 2,\n screenX: e.screenX,\n screenY: e.screenY,\n target: e.target\n };\n };\n var makePointer = function makePointer(e) {\n return {\n event: e,\n touch: makeTouch(e)\n };\n };\n var addPointer = function addPointer(e) {\n pointers.push(makePointer(e));\n };\n var removePointer = function removePointer(e) {\n for (var i = 0; i < pointers.length; i++) {\n var p = pointers[i];\n if (p.event.pointerId === e.pointerId) {\n pointers.splice(i, 1);\n return;\n }\n }\n };\n var updatePointer = function updatePointer(e) {\n var p = pointers.filter(function (p) {\n return p.event.pointerId === e.pointerId;\n })[0];\n p.event = e;\n p.touch = makeTouch(e);\n };\n var addTouchesToEvent = function addTouchesToEvent(e) {\n e.touches = pointers.map(function (p) {\n return p.touch;\n });\n };\n var pointerIsMouse = function pointerIsMouse(e) {\n return e.pointerType === 'mouse' || e.pointerType === 4;\n };\n r.registerBinding(r.container, 'pointerdown', function (e) {\n if (pointerIsMouse(e)) {\n return;\n } // mouse already handled\n\n e.preventDefault();\n addPointer(e);\n addTouchesToEvent(e);\n touchstartHandler(e);\n });\n r.registerBinding(r.container, 'pointerup', function (e) {\n if (pointerIsMouse(e)) {\n return;\n } // mouse already handled\n\n removePointer(e);\n addTouchesToEvent(e);\n touchendHandler(e);\n });\n r.registerBinding(r.container, 'pointercancel', function (e) {\n if (pointerIsMouse(e)) {\n return;\n } // mouse already handled\n\n removePointer(e);\n addTouchesToEvent(e);\n touchcancelHandler(e);\n });\n r.registerBinding(r.container, 'pointermove', function (e) {\n if (pointerIsMouse(e)) {\n return;\n } // mouse already handled\n\n e.preventDefault();\n updatePointer(e);\n addTouchesToEvent(e);\n touchmoveHandler(e);\n });\n }\n};\n\nvar BRp$2 = {};\nBRp$2.generatePolygon = function (name, points) {\n return this.nodeShapes[name] = {\n renderer: this,\n name: name,\n points: points,\n draw: function draw(context, centerX, centerY, width, height, cornerRadius) {\n this.renderer.nodeShapeImpl('polygon', context, centerX, centerY, width, height, this.points);\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius) {\n return polygonIntersectLine(x, y, this.points, nodeX, nodeY, width / 2, height / 2, padding);\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius) {\n return pointInsidePolygon(x, y, this.points, centerX, centerY, width, height, [0, -1], padding);\n },\n hasMiterBounds: name !== 'rectangle',\n miterBounds: function miterBounds(centerX, centerY, width, height, strokeWidth, strokePosition) {\n return miterBox(this.points, centerX, centerY, width, height, strokeWidth);\n }\n };\n};\nBRp$2.generateEllipse = function () {\n return this.nodeShapes['ellipse'] = {\n renderer: this,\n name: 'ellipse',\n draw: function draw(context, centerX, centerY, width, height, cornerRadius) {\n this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height);\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius) {\n return intersectLineEllipse(x, y, nodeX, nodeY, width / 2 + padding, height / 2 + padding);\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius) {\n return checkInEllipse(x, y, width, height, centerX, centerY, padding);\n }\n };\n};\nBRp$2.generateRoundPolygon = function (name, points) {\n return this.nodeShapes[name] = {\n renderer: this,\n name: name,\n points: points,\n getOrCreateCorners: function getOrCreateCorners(centerX, centerY, width, height, cornerRadius, rs, field) {\n if (rs[field] !== undefined && rs[field + '-cx'] === centerX && rs[field + '-cy'] === centerY) {\n return rs[field];\n }\n rs[field] = new Array(points.length / 2);\n rs[field + '-cx'] = centerX;\n rs[field + '-cy'] = centerY;\n var halfW = width / 2;\n var halfH = height / 2;\n cornerRadius = cornerRadius === 'auto' ? getRoundPolygonRadius(width, height) : cornerRadius;\n var p = new Array(points.length / 2);\n for (var _i = 0; _i < points.length / 2; _i++) {\n p[_i] = {\n x: centerX + halfW * points[_i * 2],\n y: centerY + halfH * points[_i * 2 + 1]\n };\n }\n var i,\n p1,\n p2,\n p3,\n len = p.length;\n p1 = p[len - 1];\n // for each point\n for (i = 0; i < len; i++) {\n p2 = p[i % len];\n p3 = p[(i + 1) % len];\n rs[field][i] = getRoundCorner(p1, p2, p3, cornerRadius);\n p1 = p2;\n p2 = p3;\n }\n return rs[field];\n },\n draw: function draw(context, centerX, centerY, width, height, cornerRadius, rs) {\n this.renderer.nodeShapeImpl('round-polygon', context, centerX, centerY, width, height, this.points, this.getOrCreateCorners(centerX, centerY, width, height, cornerRadius, rs, 'drawCorners'));\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius, rs) {\n return roundPolygonIntersectLine(x, y, this.points, nodeX, nodeY, width, height, padding, this.getOrCreateCorners(nodeX, nodeY, width, height, cornerRadius, rs, 'corners'));\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius, rs) {\n return pointInsideRoundPolygon(x, y, this.points, centerX, centerY, width, height, this.getOrCreateCorners(centerX, centerY, width, height, cornerRadius, rs, 'corners'));\n }\n };\n};\nBRp$2.generateRoundRectangle = function () {\n return this.nodeShapes['round-rectangle'] = this.nodeShapes['roundrectangle'] = {\n renderer: this,\n name: 'round-rectangle',\n points: generateUnitNgonPointsFitToSquare(4, 0),\n draw: function draw(context, centerX, centerY, width, height, cornerRadius) {\n this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height, this.points, cornerRadius);\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius) {\n return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding, cornerRadius);\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n cornerRadius = cornerRadius === 'auto' ? getRoundRectangleRadius(width, height) : cornerRadius;\n cornerRadius = Math.min(halfWidth, halfHeight, cornerRadius);\n var diam = cornerRadius * 2;\n\n // Check hBox\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) {\n return true;\n }\n\n // Check vBox\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) {\n return true;\n }\n\n // Check top left quarter circle\n if (checkInEllipse(x, y, diam, diam, centerX - halfWidth + cornerRadius, centerY - halfHeight + cornerRadius, padding)) {\n return true;\n }\n\n // Check top right quarter circle\n if (checkInEllipse(x, y, diam, diam, centerX + halfWidth - cornerRadius, centerY - halfHeight + cornerRadius, padding)) {\n return true;\n }\n\n // Check bottom right quarter circle\n if (checkInEllipse(x, y, diam, diam, centerX + halfWidth - cornerRadius, centerY + halfHeight - cornerRadius, padding)) {\n return true;\n }\n\n // Check bottom left quarter circle\n if (checkInEllipse(x, y, diam, diam, centerX - halfWidth + cornerRadius, centerY + halfHeight - cornerRadius, padding)) {\n return true;\n }\n return false;\n }\n };\n};\nBRp$2.generateCutRectangle = function () {\n return this.nodeShapes['cut-rectangle'] = this.nodeShapes['cutrectangle'] = {\n renderer: this,\n name: 'cut-rectangle',\n cornerLength: getCutRectangleCornerLength(),\n points: generateUnitNgonPointsFitToSquare(4, 0),\n draw: function draw(context, centerX, centerY, width, height, cornerRadius) {\n this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height, null, cornerRadius);\n },\n generateCutTrianglePts: function generateCutTrianglePts(width, height, centerX, centerY, cornerRadius) {\n var cl = cornerRadius === 'auto' ? this.cornerLength : cornerRadius;\n var hh = height / 2;\n var hw = width / 2;\n var xBegin = centerX - hw;\n var xEnd = centerX + hw;\n var yBegin = centerY - hh;\n var yEnd = centerY + hh;\n\n // points are in clockwise order, inner (imaginary) triangle pt on [4, 5]\n return {\n topLeft: [xBegin, yBegin + cl, xBegin + cl, yBegin, xBegin + cl, yBegin + cl],\n topRight: [xEnd - cl, yBegin, xEnd, yBegin + cl, xEnd - cl, yBegin + cl],\n bottomRight: [xEnd, yEnd - cl, xEnd - cl, yEnd, xEnd - cl, yEnd - cl],\n bottomLeft: [xBegin + cl, yEnd, xBegin, yEnd - cl, xBegin + cl, yEnd - cl]\n };\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius) {\n var cPts = this.generateCutTrianglePts(width + 2 * padding, height + 2 * padding, nodeX, nodeY, cornerRadius);\n var pts = [].concat.apply([], [cPts.topLeft.splice(0, 4), cPts.topRight.splice(0, 4), cPts.bottomRight.splice(0, 4), cPts.bottomLeft.splice(0, 4)]);\n return polygonIntersectLine(x, y, pts, nodeX, nodeY);\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius) {\n var cl = cornerRadius === 'auto' ? this.cornerLength : cornerRadius;\n // Check hBox\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * cl, [0, -1], padding)) {\n return true;\n }\n\n // Check vBox\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * cl, height, [0, -1], padding)) {\n return true;\n }\n var cutTrianglePts = this.generateCutTrianglePts(width, height, centerX, centerY);\n return pointInsidePolygonPoints(x, y, cutTrianglePts.topLeft) || pointInsidePolygonPoints(x, y, cutTrianglePts.topRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomLeft);\n }\n };\n};\nBRp$2.generateBarrel = function () {\n return this.nodeShapes['barrel'] = {\n renderer: this,\n name: 'barrel',\n points: generateUnitNgonPointsFitToSquare(4, 0),\n draw: function draw(context, centerX, centerY, width, height, cornerRadius) {\n this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height);\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius) {\n // use two fixed t values for the bezier curve approximation\n\n var t0 = 0.15;\n var t1 = 0.5;\n var t2 = 0.85;\n var bPts = this.generateBarrelBezierPts(width + 2 * padding, height + 2 * padding, nodeX, nodeY);\n var approximateBarrelCurvePts = function approximateBarrelCurvePts(pts) {\n // approximate curve pts based on the two t values\n var m0 = qbezierPtAt({\n x: pts[0],\n y: pts[1]\n }, {\n x: pts[2],\n y: pts[3]\n }, {\n x: pts[4],\n y: pts[5]\n }, t0);\n var m1 = qbezierPtAt({\n x: pts[0],\n y: pts[1]\n }, {\n x: pts[2],\n y: pts[3]\n }, {\n x: pts[4],\n y: pts[5]\n }, t1);\n var m2 = qbezierPtAt({\n x: pts[0],\n y: pts[1]\n }, {\n x: pts[2],\n y: pts[3]\n }, {\n x: pts[4],\n y: pts[5]\n }, t2);\n return [pts[0], pts[1], m0.x, m0.y, m1.x, m1.y, m2.x, m2.y, pts[4], pts[5]];\n };\n var pts = [].concat(approximateBarrelCurvePts(bPts.topLeft), approximateBarrelCurvePts(bPts.topRight), approximateBarrelCurvePts(bPts.bottomRight), approximateBarrelCurvePts(bPts.bottomLeft));\n return polygonIntersectLine(x, y, pts, nodeX, nodeY);\n },\n generateBarrelBezierPts: function generateBarrelBezierPts(width, height, centerX, centerY) {\n var hh = height / 2;\n var hw = width / 2;\n var xBegin = centerX - hw;\n var xEnd = centerX + hw;\n var yBegin = centerY - hh;\n var yEnd = centerY + hh;\n var curveConstants = getBarrelCurveConstants(width, height);\n var hOffset = curveConstants.heightOffset;\n var wOffset = curveConstants.widthOffset;\n var ctrlPtXOffset = curveConstants.ctrlPtOffsetPct * width;\n\n // points are in clockwise order, inner (imaginary) control pt on [4, 5]\n var pts = {\n topLeft: [xBegin, yBegin + hOffset, xBegin + ctrlPtXOffset, yBegin, xBegin + wOffset, yBegin],\n topRight: [xEnd - wOffset, yBegin, xEnd - ctrlPtXOffset, yBegin, xEnd, yBegin + hOffset],\n bottomRight: [xEnd, yEnd - hOffset, xEnd - ctrlPtXOffset, yEnd, xEnd - wOffset, yEnd],\n bottomLeft: [xBegin + wOffset, yEnd, xBegin + ctrlPtXOffset, yEnd, xBegin, yEnd - hOffset]\n };\n pts.topLeft.isTop = true;\n pts.topRight.isTop = true;\n pts.bottomLeft.isBottom = true;\n pts.bottomRight.isBottom = true;\n return pts;\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius) {\n var curveConstants = getBarrelCurveConstants(width, height);\n var hOffset = curveConstants.heightOffset;\n var wOffset = curveConstants.widthOffset;\n\n // Check hBox\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * hOffset, [0, -1], padding)) {\n return true;\n }\n\n // Check vBox\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * wOffset, height, [0, -1], padding)) {\n return true;\n }\n var barrelCurvePts = this.generateBarrelBezierPts(width, height, centerX, centerY);\n var getCurveT = function getCurveT(x, y, curvePts) {\n var x0 = curvePts[4];\n var x1 = curvePts[2];\n var x2 = curvePts[0];\n var y0 = curvePts[5];\n // var y1 = curvePts[ 3 ];\n var y2 = curvePts[1];\n var xMin = Math.min(x0, x2);\n var xMax = Math.max(x0, x2);\n var yMin = Math.min(y0, y2);\n var yMax = Math.max(y0, y2);\n if (xMin <= x && x <= xMax && yMin <= y && y <= yMax) {\n var coeff = bezierPtsToQuadCoeff(x0, x1, x2);\n var roots = solveQuadratic(coeff[0], coeff[1], coeff[2], x);\n var validRoots = roots.filter(function (r) {\n return 0 <= r && r <= 1;\n });\n if (validRoots.length > 0) {\n return validRoots[0];\n }\n }\n return null;\n };\n var curveRegions = Object.keys(barrelCurvePts);\n for (var i = 0; i < curveRegions.length; i++) {\n var corner = curveRegions[i];\n var cornerPts = barrelCurvePts[corner];\n var t = getCurveT(x, y, cornerPts);\n if (t == null) {\n continue;\n }\n var y0 = cornerPts[5];\n var y1 = cornerPts[3];\n var y2 = cornerPts[1];\n var bezY = qbezierAt(y0, y1, y2, t);\n if (cornerPts.isTop && bezY <= y) {\n return true;\n }\n if (cornerPts.isBottom && y <= bezY) {\n return true;\n }\n }\n return false;\n }\n };\n};\nBRp$2.generateBottomRoundrectangle = function () {\n return this.nodeShapes['bottom-round-rectangle'] = this.nodeShapes['bottomroundrectangle'] = {\n renderer: this,\n name: 'bottom-round-rectangle',\n points: generateUnitNgonPointsFitToSquare(4, 0),\n draw: function draw(context, centerX, centerY, width, height, cornerRadius) {\n this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height, this.points, cornerRadius);\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius) {\n var topStartX = nodeX - (width / 2 + padding);\n var topStartY = nodeY - (height / 2 + padding);\n var topEndY = topStartY;\n var topEndX = nodeX + (width / 2 + padding);\n var topIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false);\n if (topIntersections.length > 0) {\n return topIntersections;\n }\n return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding, cornerRadius);\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius) {\n cornerRadius = cornerRadius === 'auto' ? getRoundRectangleRadius(width, height) : cornerRadius;\n var diam = 2 * cornerRadius;\n\n // Check hBox\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) {\n return true;\n }\n\n // Check vBox\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) {\n return true;\n }\n\n // check non-rounded top side\n var outerWidth = width / 2 + 2 * padding;\n var outerHeight = height / 2 + 2 * padding;\n var points = [centerX - outerWidth, centerY - outerHeight, centerX - outerWidth, centerY, centerX + outerWidth, centerY, centerX + outerWidth, centerY - outerHeight];\n if (pointInsidePolygonPoints(x, y, points)) {\n return true;\n }\n\n // Check bottom right quarter circle\n if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) {\n return true;\n }\n\n // Check bottom left quarter circle\n if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) {\n return true;\n }\n return false;\n }\n };\n};\nBRp$2.registerNodeShapes = function () {\n var nodeShapes = this.nodeShapes = {};\n var renderer = this;\n this.generateEllipse();\n this.generatePolygon('triangle', generateUnitNgonPointsFitToSquare(3, 0));\n this.generateRoundPolygon('round-triangle', generateUnitNgonPointsFitToSquare(3, 0));\n this.generatePolygon('rectangle', generateUnitNgonPointsFitToSquare(4, 0));\n nodeShapes['square'] = nodeShapes['rectangle'];\n this.generateRoundRectangle();\n this.generateCutRectangle();\n this.generateBarrel();\n this.generateBottomRoundrectangle();\n {\n var diamondPoints = [0, 1, 1, 0, 0, -1, -1, 0];\n this.generatePolygon('diamond', diamondPoints);\n this.generateRoundPolygon('round-diamond', diamondPoints);\n }\n this.generatePolygon('pentagon', generateUnitNgonPointsFitToSquare(5, 0));\n this.generateRoundPolygon('round-pentagon', generateUnitNgonPointsFitToSquare(5, 0));\n this.generatePolygon('hexagon', generateUnitNgonPointsFitToSquare(6, 0));\n this.generateRoundPolygon('round-hexagon', generateUnitNgonPointsFitToSquare(6, 0));\n this.generatePolygon('heptagon', generateUnitNgonPointsFitToSquare(7, 0));\n this.generateRoundPolygon('round-heptagon', generateUnitNgonPointsFitToSquare(7, 0));\n this.generatePolygon('octagon', generateUnitNgonPointsFitToSquare(8, 0));\n this.generateRoundPolygon('round-octagon', generateUnitNgonPointsFitToSquare(8, 0));\n var star5Points = new Array(20);\n {\n var outerPoints = generateUnitNgonPoints(5, 0);\n var innerPoints = generateUnitNgonPoints(5, Math.PI / 5);\n\n // Outer radius is 1; inner radius of star is smaller\n var innerRadius = 0.5 * (3 - Math.sqrt(5));\n innerRadius *= 1.57;\n for (var i = 0; i < innerPoints.length / 2; i++) {\n innerPoints[i * 2] *= innerRadius;\n innerPoints[i * 2 + 1] *= innerRadius;\n }\n for (var i = 0; i < 20 / 4; i++) {\n star5Points[i * 4] = outerPoints[i * 2];\n star5Points[i * 4 + 1] = outerPoints[i * 2 + 1];\n star5Points[i * 4 + 2] = innerPoints[i * 2];\n star5Points[i * 4 + 3] = innerPoints[i * 2 + 1];\n }\n }\n star5Points = fitPolygonToSquare(star5Points);\n this.generatePolygon('star', star5Points);\n this.generatePolygon('vee', [-1, -1, 0, -0.333, 1, -1, 0, 1]);\n this.generatePolygon('rhomboid', [-1, -1, 0.333, -1, 1, 1, -0.333, 1]);\n this.generatePolygon('right-rhomboid', [-0.333, -1, 1, -1, 0.333, 1, -1, 1]);\n this.nodeShapes['concavehexagon'] = this.generatePolygon('concave-hexagon', [-1, -0.95, -0.75, 0, -1, 0.95, 1, 0.95, 0.75, 0, 1, -0.95]);\n {\n var tagPoints = [-1, -1, 0.25, -1, 1, 0, 0.25, 1, -1, 1];\n this.generatePolygon('tag', tagPoints);\n this.generateRoundPolygon('round-tag', tagPoints);\n }\n nodeShapes.makePolygon = function (points) {\n // use caching on user-specified polygons so they are as fast as native shapes\n\n var key = points.join('$');\n var name = 'polygon-' + key;\n var shape;\n if (shape = this[name]) {\n // got cached shape\n return shape;\n }\n\n // create and cache new shape\n return renderer.generatePolygon(name, points);\n };\n};\n\nvar BRp$1 = {};\nBRp$1.timeToRender = function () {\n return this.redrawTotalTime / this.redrawCount;\n};\nBRp$1.redraw = function (options) {\n options = options || staticEmptyObject();\n var r = this;\n if (r.averageRedrawTime === undefined) {\n r.averageRedrawTime = 0;\n }\n if (r.lastRedrawTime === undefined) {\n r.lastRedrawTime = 0;\n }\n if (r.lastDrawTime === undefined) {\n r.lastDrawTime = 0;\n }\n r.requestedFrame = true;\n r.renderOptions = options;\n};\nBRp$1.beforeRender = function (fn, priority) {\n // the renderer can't add tick callbacks when destroyed\n if (this.destroyed) {\n return;\n }\n if (priority == null) {\n error('Priority is not optional for beforeRender');\n }\n var cbs = this.beforeRenderCallbacks;\n cbs.push({\n fn: fn,\n priority: priority\n });\n\n // higher priority callbacks executed first\n cbs.sort(function (a, b) {\n return b.priority - a.priority;\n });\n};\nvar beforeRenderCallbacks = function beforeRenderCallbacks(r, willDraw, startTime) {\n var cbs = r.beforeRenderCallbacks;\n for (var i = 0; i < cbs.length; i++) {\n cbs[i].fn(willDraw, startTime);\n }\n};\nBRp$1.startRenderLoop = function () {\n var r = this;\n var cy = r.cy;\n if (r.renderLoopStarted) {\n return;\n } else {\n r.renderLoopStarted = true;\n }\n var _renderFn = function renderFn(requestTime) {\n if (r.destroyed) {\n return;\n }\n if (cy.batching()) ; else if (r.requestedFrame && !r.skipFrame) {\n beforeRenderCallbacks(r, true, requestTime);\n var startTime = performanceNow();\n r.render(r.renderOptions);\n var endTime = r.lastDrawTime = performanceNow();\n if (r.averageRedrawTime === undefined) {\n r.averageRedrawTime = endTime - startTime;\n }\n if (r.redrawCount === undefined) {\n r.redrawCount = 0;\n }\n r.redrawCount++;\n if (r.redrawTotalTime === undefined) {\n r.redrawTotalTime = 0;\n }\n var duration = endTime - startTime;\n r.redrawTotalTime += duration;\n r.lastRedrawTime = duration;\n\n // use a weighted average with a bias from the previous average so we don't spike so easily\n r.averageRedrawTime = r.averageRedrawTime / 2 + duration / 2;\n r.requestedFrame = false;\n } else {\n beforeRenderCallbacks(r, false, requestTime);\n }\n r.skipFrame = false;\n requestAnimationFrame(_renderFn);\n };\n requestAnimationFrame(_renderFn);\n};\n\nvar BaseRenderer = function BaseRenderer(options) {\n this.init(options);\n};\nvar BR = BaseRenderer;\nvar BRp = BR.prototype;\nBRp.clientFunctions = ['redrawHint', 'render', 'renderTo', 'matchCanvasSize', 'nodeShapeImpl', 'arrowShapeImpl'];\nBRp.init = function (options) {\n var r = this;\n r.options = options;\n r.cy = options.cy;\n var ctr = r.container = options.cy.container();\n var containerWindow = r.cy.window();\n\n // prepend a stylesheet in the head such that\n if (containerWindow) {\n var document = containerWindow.document;\n var head = document.head;\n var stylesheetId = '__________cytoscape_stylesheet';\n var className = '__________cytoscape_container';\n var stylesheetAlreadyExists = document.getElementById(stylesheetId) != null;\n if (ctr.className.indexOf(className) < 0) {\n ctr.className = (ctr.className || '') + ' ' + className;\n }\n if (!stylesheetAlreadyExists) {\n var stylesheet = document.createElement('style');\n stylesheet.id = stylesheetId;\n stylesheet.textContent = '.' + className + ' { position: relative; }';\n head.insertBefore(stylesheet, head.children[0]); // first so lowest priority\n }\n var computedStyle = containerWindow.getComputedStyle(ctr);\n var position = computedStyle.getPropertyValue('position');\n if (position === 'static') {\n warn('A Cytoscape container has style position:static and so can not use UI extensions properly');\n }\n }\n r.selection = [undefined, undefined, undefined, undefined, 0]; // Coordinates for selection box, plus enabled flag\n\n r.bezierProjPcts = [0.05, 0.225, 0.4, 0.5, 0.6, 0.775, 0.95];\n\n //--Pointer-related data\n r.hoverData = {\n down: null,\n last: null,\n downTime: null,\n triggerMode: null,\n dragging: false,\n initialPan: [null, null],\n capture: false\n };\n r.dragData = {\n possibleDragElements: []\n };\n r.touchData = {\n start: null,\n capture: false,\n // These 3 fields related to tap, taphold events\n startPosition: [null, null, null, null, null, null],\n singleTouchStartTime: null,\n singleTouchMoved: true,\n now: [null, null, null, null, null, null],\n earlier: [null, null, null, null, null, null]\n };\n r.redraws = 0;\n r.showFps = options.showFps;\n r.debug = options.debug;\n r.webgl = options.webgl;\n r.hideEdgesOnViewport = options.hideEdgesOnViewport;\n r.textureOnViewport = options.textureOnViewport;\n r.wheelSensitivity = options.wheelSensitivity;\n r.motionBlurEnabled = options.motionBlur; // on by default\n r.forcedPixelRatio = number$1(options.pixelRatio) ? options.pixelRatio : null;\n r.motionBlur = options.motionBlur; // for initial kick off\n r.motionBlurOpacity = options.motionBlurOpacity;\n r.motionBlurTransparency = 1 - r.motionBlurOpacity;\n r.motionBlurPxRatio = 1;\n r.mbPxRBlurry = 1; //0.8;\n r.minMbLowQualFrames = 4;\n r.fullQualityMb = false;\n r.clearedForMotionBlur = [];\n r.desktopTapThreshold = options.desktopTapThreshold;\n r.desktopTapThreshold2 = options.desktopTapThreshold * options.desktopTapThreshold;\n r.touchTapThreshold = options.touchTapThreshold;\n r.touchTapThreshold2 = options.touchTapThreshold * options.touchTapThreshold;\n r.tapholdDuration = 500;\n r.bindings = [];\n r.beforeRenderCallbacks = [];\n r.beforeRenderPriorities = {\n // higher priority execs before lower one\n animations: 400,\n eleCalcs: 300,\n eleTxrDeq: 200,\n lyrTxrDeq: 150,\n lyrTxrSkip: 100\n };\n r.registerNodeShapes();\n r.registerArrowShapes();\n r.registerCalculationListeners();\n};\nBRp.notify = function (eventName, eles) {\n var r = this;\n var cy = r.cy;\n\n // the renderer can't be notified after it's destroyed\n if (this.destroyed) {\n return;\n }\n if (eventName === 'init') {\n r.load();\n return;\n }\n if (eventName === 'destroy') {\n r.destroy();\n return;\n }\n if (eventName === 'add' || eventName === 'remove' || eventName === 'move' && cy.hasCompoundNodes() || eventName === 'load' || eventName === 'zorder' || eventName === 'mount') {\n r.invalidateCachedZSortedEles();\n }\n if (eventName === 'viewport') {\n r.redrawHint('select', true);\n }\n if (eventName === 'gc') {\n r.redrawHint('gc', true);\n }\n if (eventName === 'load' || eventName === 'resize' || eventName === 'mount') {\n r.invalidateContainerClientCoordsCache();\n r.matchCanvasSize(r.container);\n }\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n this.startRenderLoop();\n this.redraw();\n};\nBRp.destroy = function () {\n var r = this;\n r.destroyed = true;\n r.cy.stopAnimationLoop();\n for (var i = 0; i < r.bindings.length; i++) {\n var binding = r.bindings[i];\n var b = binding;\n var tgt = b.target;\n (tgt.off || tgt.removeEventListener).apply(tgt, b.args);\n }\n r.bindings = [];\n r.beforeRenderCallbacks = [];\n r.onUpdateEleCalcsFns = [];\n if (r.removeObserver) {\n r.removeObserver.disconnect();\n }\n if (r.styleObserver) {\n r.styleObserver.disconnect();\n }\n if (r.resizeObserver) {\n r.resizeObserver.disconnect();\n }\n if (r.labelCalcDiv) {\n try {\n document.body.removeChild(r.labelCalcDiv); // eslint-disable-line no-undef\n } catch (e) {\n // ie10 issue #1014\n }\n }\n};\nBRp.isHeadless = function () {\n return false;\n};\n[BRp$f, BRp$5, BRp$4, BRp$3, BRp$2, BRp$1].forEach(function (props) {\n extend(BRp, props);\n});\n\nvar fullFpsTime = 1000 / 60; // assume 60 frames per second\n\nvar defs = {\n setupDequeueing: function setupDequeueing(opts) {\n return function setupDequeueingImpl() {\n var self = this;\n var r = this.renderer;\n if (self.dequeueingSetup) {\n return;\n } else {\n self.dequeueingSetup = true;\n }\n var queueRedraw = debounce(function () {\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n r.redraw();\n }, opts.deqRedrawThreshold);\n var dequeue = function dequeue(willDraw, frameStartTime) {\n var startTime = performanceNow();\n var avgRenderTime = r.averageRedrawTime;\n var renderTime = r.lastRedrawTime;\n var deqd = [];\n var extent = r.cy.extent();\n var pixelRatio = r.getPixelRatio();\n\n // if we aren't in a tick that causes a draw, then the rendered style\n // queue won't automatically be flushed before dequeueing starts\n if (!willDraw) {\n r.flushRenderedStyleQueue();\n }\n while (true) {\n // eslint-disable-line no-constant-condition\n var now = performanceNow();\n var duration = now - startTime;\n var frameDuration = now - frameStartTime;\n if (renderTime < fullFpsTime) {\n // if we're rendering faster than the ideal fps, then do dequeueing\n // during all of the remaining frame time\n\n var timeAvailable = fullFpsTime - (willDraw ? avgRenderTime : 0);\n if (frameDuration >= opts.deqFastCost * timeAvailable) {\n break;\n }\n } else {\n if (willDraw) {\n if (duration >= opts.deqCost * renderTime || duration >= opts.deqAvgCost * avgRenderTime) {\n break;\n }\n } else if (frameDuration >= opts.deqNoDrawCost * fullFpsTime) {\n break;\n }\n }\n var thisDeqd = opts.deq(self, pixelRatio, extent);\n if (thisDeqd.length > 0) {\n for (var i = 0; i < thisDeqd.length; i++) {\n deqd.push(thisDeqd[i]);\n }\n } else {\n break;\n }\n }\n\n // callbacks on dequeue\n if (deqd.length > 0) {\n opts.onDeqd(self, deqd);\n if (!willDraw && opts.shouldRedraw(self, deqd, pixelRatio, extent)) {\n queueRedraw();\n }\n }\n };\n var priority = opts.priority || noop$1;\n r.beforeRender(dequeue, priority(self));\n };\n }\n};\n\n// Allows lookups for (ele, lvl) => cache.\n// Uses keys so elements may share the same cache.\nvar ElementTextureCacheLookup = /*#__PURE__*/function () {\n function ElementTextureCacheLookup(getKey) {\n var doesEleInvalidateKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : falsify;\n _classCallCheck(this, ElementTextureCacheLookup);\n this.idsByKey = new Map$1();\n this.keyForId = new Map$1();\n this.cachesByLvl = new Map$1();\n this.lvls = [];\n this.getKey = getKey;\n this.doesEleInvalidateKey = doesEleInvalidateKey;\n }\n return _createClass(ElementTextureCacheLookup, [{\n key: \"getIdsFor\",\n value: function getIdsFor(key) {\n if (key == null) {\n error(\"Can not get id list for null key\");\n }\n var idsByKey = this.idsByKey;\n var ids = this.idsByKey.get(key);\n if (!ids) {\n ids = new Set$1();\n idsByKey.set(key, ids);\n }\n return ids;\n }\n }, {\n key: \"addIdForKey\",\n value: function addIdForKey(key, id) {\n if (key != null) {\n this.getIdsFor(key).add(id);\n }\n }\n }, {\n key: \"deleteIdForKey\",\n value: function deleteIdForKey(key, id) {\n if (key != null) {\n this.getIdsFor(key)[\"delete\"](id);\n }\n }\n }, {\n key: \"getNumberOfIdsForKey\",\n value: function getNumberOfIdsForKey(key) {\n if (key == null) {\n return 0;\n } else {\n return this.getIdsFor(key).size;\n }\n }\n }, {\n key: \"updateKeyMappingFor\",\n value: function updateKeyMappingFor(ele) {\n var id = ele.id();\n var prevKey = this.keyForId.get(id);\n var currKey = this.getKey(ele);\n this.deleteIdForKey(prevKey, id);\n this.addIdForKey(currKey, id);\n this.keyForId.set(id, currKey);\n }\n }, {\n key: \"deleteKeyMappingFor\",\n value: function deleteKeyMappingFor(ele) {\n var id = ele.id();\n var prevKey = this.keyForId.get(id);\n this.deleteIdForKey(prevKey, id);\n this.keyForId[\"delete\"](id);\n }\n }, {\n key: \"keyHasChangedFor\",\n value: function keyHasChangedFor(ele) {\n var id = ele.id();\n var prevKey = this.keyForId.get(id);\n var newKey = this.getKey(ele);\n return prevKey !== newKey;\n }\n }, {\n key: \"isInvalid\",\n value: function isInvalid(ele) {\n return this.keyHasChangedFor(ele) || this.doesEleInvalidateKey(ele);\n }\n }, {\n key: \"getCachesAt\",\n value: function getCachesAt(lvl) {\n var cachesByLvl = this.cachesByLvl,\n lvls = this.lvls;\n var caches = cachesByLvl.get(lvl);\n if (!caches) {\n caches = new Map$1();\n cachesByLvl.set(lvl, caches);\n lvls.push(lvl);\n }\n return caches;\n }\n }, {\n key: \"getCache\",\n value: function getCache(key, lvl) {\n return this.getCachesAt(lvl).get(key);\n }\n }, {\n key: \"get\",\n value: function get(ele, lvl) {\n var key = this.getKey(ele);\n var cache = this.getCache(key, lvl);\n\n // getting for an element may need to add to the id list b/c eles can share keys\n if (cache != null) {\n this.updateKeyMappingFor(ele);\n }\n return cache;\n }\n }, {\n key: \"getForCachedKey\",\n value: function getForCachedKey(ele, lvl) {\n var key = this.keyForId.get(ele.id()); // n.b. use cached key, not newly computed key\n var cache = this.getCache(key, lvl);\n return cache;\n }\n }, {\n key: \"hasCache\",\n value: function hasCache(key, lvl) {\n return this.getCachesAt(lvl).has(key);\n }\n }, {\n key: \"has\",\n value: function has(ele, lvl) {\n var key = this.getKey(ele);\n return this.hasCache(key, lvl);\n }\n }, {\n key: \"setCache\",\n value: function setCache(key, lvl, cache) {\n cache.key = key;\n this.getCachesAt(lvl).set(key, cache);\n }\n }, {\n key: \"set\",\n value: function set(ele, lvl, cache) {\n var key = this.getKey(ele);\n this.setCache(key, lvl, cache);\n this.updateKeyMappingFor(ele);\n }\n }, {\n key: \"deleteCache\",\n value: function deleteCache(key, lvl) {\n this.getCachesAt(lvl)[\"delete\"](key);\n }\n }, {\n key: \"delete\",\n value: function _delete(ele, lvl) {\n var key = this.getKey(ele);\n this.deleteCache(key, lvl);\n }\n }, {\n key: \"invalidateKey\",\n value: function invalidateKey(key) {\n var _this = this;\n this.lvls.forEach(function (lvl) {\n return _this.deleteCache(key, lvl);\n });\n }\n\n // returns true if no other eles reference the invalidated cache (n.b. other eles may need the cache with the same key)\n }, {\n key: \"invalidate\",\n value: function invalidate(ele) {\n var id = ele.id();\n var key = this.keyForId.get(id); // n.b. use stored key rather than current (potential key)\n\n this.deleteKeyMappingFor(ele);\n var entireKeyInvalidated = this.doesEleInvalidateKey(ele);\n if (entireKeyInvalidated) {\n // clear mapping for current key\n this.invalidateKey(key);\n }\n return entireKeyInvalidated || this.getNumberOfIdsForKey(key) === 0;\n }\n }]);\n}();\n\nvar minTxrH = 25; // the size of the texture cache for small height eles (special case)\nvar txrStepH = 50; // the min size of the regular cache, and the size it increases with each step up\nvar minLvl$1 = -4; // when scaling smaller than that we don't need to re-render\nvar maxLvl$1 = 3; // when larger than this scale just render directly (caching is not helpful)\nvar maxZoom$1 = 7.99; // beyond this zoom level, layered textures are not used\nvar eleTxrSpacing = 8; // spacing between elements on textures to avoid blitting overlaps\nvar defTxrWidth = 1024; // default/minimum texture width\nvar maxTxrW = 1024; // the maximum width of a texture\nvar maxTxrH = 1024; // the maximum height of a texture\nvar minUtility = 0.2; // if usage of texture is less than this, it is retired\nvar maxFullness = 0.8; // fullness of texture after which queue removal is checked\nvar maxFullnessChecks = 10; // dequeued after this many checks\nvar deqCost$1 = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame\nvar deqAvgCost$1 = 0.1; // % of add'l rendering cost compared to average overall redraw time\nvar deqNoDrawCost$1 = 0.9; // % of avg frame time that can be used for dequeueing when not drawing\nvar deqFastCost$1 = 0.9; // % of frame time to be used when >60fps\nvar deqRedrawThreshold$1 = 100; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile\nvar maxDeqSize$1 = 1; // number of eles to dequeue and render at higher texture in each batch\n\nvar getTxrReasons = {\n dequeue: 'dequeue',\n downscale: 'downscale',\n highQuality: 'highQuality'\n};\nvar initDefaults = defaults$g({\n getKey: null,\n doesEleInvalidateKey: falsify,\n drawElement: null,\n getBoundingBox: null,\n getRotationPoint: null,\n getRotationOffset: null,\n isVisible: trueify,\n allowEdgeTxrCaching: true,\n allowParentTxrCaching: true\n});\nvar ElementTextureCache = function ElementTextureCache(renderer, initOptions) {\n var self = this;\n self.renderer = renderer;\n self.onDequeues = [];\n var opts = initDefaults(initOptions);\n extend(self, opts);\n self.lookup = new ElementTextureCacheLookup(opts.getKey, opts.doesEleInvalidateKey);\n self.setupDequeueing();\n};\nvar ETCp = ElementTextureCache.prototype;\nETCp.reasons = getTxrReasons;\n\n// the list of textures in which new subtextures for elements can be placed\nETCp.getTextureQueue = function (txrH) {\n var self = this;\n self.eleImgCaches = self.eleImgCaches || {};\n return self.eleImgCaches[txrH] = self.eleImgCaches[txrH] || [];\n};\n\n// the list of usused textures which can be recycled (in use in texture queue)\nETCp.getRetiredTextureQueue = function (txrH) {\n var self = this;\n var rtxtrQs = self.eleImgCaches.retired = self.eleImgCaches.retired || {};\n var rtxtrQ = rtxtrQs[txrH] = rtxtrQs[txrH] || [];\n return rtxtrQ;\n};\n\n// queue of element draw requests at different scale levels\nETCp.getElementQueue = function () {\n var self = this;\n var q = self.eleCacheQueue = self.eleCacheQueue || new Heap(function (a, b) {\n return b.reqs - a.reqs;\n });\n return q;\n};\n\n// queue of element draw requests at different scale levels (element id lookup)\nETCp.getElementKeyToQueue = function () {\n var self = this;\n var k2q = self.eleKeyToCacheQueue = self.eleKeyToCacheQueue || {};\n return k2q;\n};\nETCp.getElement = function (ele, bb, pxRatio, lvl, reason) {\n var self = this;\n var r = this.renderer;\n var zoom = r.cy.zoom();\n var lookup = this.lookup;\n if (!bb || bb.w === 0 || bb.h === 0 || isNaN(bb.w) || isNaN(bb.h) || !ele.visible() || ele.removed()) {\n return null;\n }\n if (!self.allowEdgeTxrCaching && ele.isEdge() || !self.allowParentTxrCaching && ele.isParent()) {\n return null;\n }\n if (lvl == null) {\n lvl = Math.ceil(log2(zoom * pxRatio));\n }\n if (lvl < minLvl$1) {\n lvl = minLvl$1;\n } else if (zoom >= maxZoom$1 || lvl > maxLvl$1) {\n return null;\n }\n var scale = Math.pow(2, lvl);\n var eleScaledH = bb.h * scale;\n var eleScaledW = bb.w * scale;\n var scaledLabelShown = r.eleTextBiggerThanMin(ele, scale);\n if (!this.isVisible(ele, scaledLabelShown)) {\n return null;\n }\n var eleCache = lookup.get(ele, lvl);\n\n // if this get was on an unused/invalidated cache, then restore the texture usage metric\n if (eleCache && eleCache.invalidated) {\n eleCache.invalidated = false;\n eleCache.texture.invalidatedWidth -= eleCache.width;\n }\n if (eleCache) {\n return eleCache;\n }\n var txrH; // which texture height this ele belongs to\n\n if (eleScaledH <= minTxrH) {\n txrH = minTxrH;\n } else if (eleScaledH <= txrStepH) {\n txrH = txrStepH;\n } else {\n txrH = Math.ceil(eleScaledH / txrStepH) * txrStepH;\n }\n if (eleScaledH > maxTxrH || eleScaledW > maxTxrW) {\n return null; // caching large elements is not efficient\n }\n var txrQ = self.getTextureQueue(txrH);\n\n // first try the second last one in case it has space at the end\n var txr = txrQ[txrQ.length - 2];\n var addNewTxr = function addNewTxr() {\n return self.recycleTexture(txrH, eleScaledW) || self.addTexture(txrH, eleScaledW);\n };\n\n // try the last one if there is no second last one\n if (!txr) {\n txr = txrQ[txrQ.length - 1];\n }\n\n // if the last one doesn't exist, we need a first one\n if (!txr) {\n txr = addNewTxr();\n }\n\n // if there's no room in the current texture, we need a new one\n if (txr.width - txr.usedWidth < eleScaledW) {\n txr = addNewTxr();\n }\n var scalableFrom = function scalableFrom(otherCache) {\n return otherCache && otherCache.scaledLabelShown === scaledLabelShown;\n };\n var deqing = reason && reason === getTxrReasons.dequeue;\n var highQualityReq = reason && reason === getTxrReasons.highQuality;\n var downscaleReq = reason && reason === getTxrReasons.downscale;\n var higherCache; // the nearest cache with a higher level\n for (var l = lvl + 1; l <= maxLvl$1; l++) {\n var c = lookup.get(ele, l);\n if (c) {\n higherCache = c;\n break;\n }\n }\n var oneUpCache = higherCache && higherCache.level === lvl + 1 ? higherCache : null;\n var downscale = function downscale() {\n txr.context.drawImage(oneUpCache.texture.canvas, oneUpCache.x, 0, oneUpCache.width, oneUpCache.height, txr.usedWidth, 0, eleScaledW, eleScaledH);\n };\n\n // reset ele area in texture\n txr.context.setTransform(1, 0, 0, 1, 0, 0);\n txr.context.clearRect(txr.usedWidth, 0, eleScaledW, txrH);\n if (scalableFrom(oneUpCache)) {\n // then we can relatively cheaply rescale the existing image w/o rerendering\n downscale();\n } else if (scalableFrom(higherCache)) {\n // then use the higher cache for now and queue the next level down\n // to cheaply scale towards the smaller level\n\n if (highQualityReq) {\n for (var _l = higherCache.level; _l > lvl; _l--) {\n oneUpCache = self.getElement(ele, bb, pxRatio, _l, getTxrReasons.downscale);\n }\n downscale();\n } else {\n self.queueElement(ele, higherCache.level - 1);\n return higherCache;\n }\n } else {\n var lowerCache; // the nearest cache with a lower level\n if (!deqing && !highQualityReq && !downscaleReq) {\n for (var _l2 = lvl - 1; _l2 >= minLvl$1; _l2--) {\n var _c = lookup.get(ele, _l2);\n if (_c) {\n lowerCache = _c;\n break;\n }\n }\n }\n if (scalableFrom(lowerCache)) {\n // then use the lower quality cache for now and queue the better one for later\n\n self.queueElement(ele, lvl);\n return lowerCache;\n }\n txr.context.translate(txr.usedWidth, 0);\n txr.context.scale(scale, scale);\n this.drawElement(txr.context, ele, bb, scaledLabelShown, false);\n txr.context.scale(1 / scale, 1 / scale);\n txr.context.translate(-txr.usedWidth, 0);\n }\n eleCache = {\n x: txr.usedWidth,\n texture: txr,\n level: lvl,\n scale: scale,\n width: eleScaledW,\n height: eleScaledH,\n scaledLabelShown: scaledLabelShown\n };\n txr.usedWidth += Math.ceil(eleScaledW + eleTxrSpacing);\n txr.eleCaches.push(eleCache);\n lookup.set(ele, lvl, eleCache);\n self.checkTextureFullness(txr);\n return eleCache;\n};\nETCp.invalidateElements = function (eles) {\n for (var i = 0; i < eles.length; i++) {\n this.invalidateElement(eles[i]);\n }\n};\nETCp.invalidateElement = function (ele) {\n var self = this;\n var lookup = self.lookup;\n var caches = [];\n var invalid = lookup.isInvalid(ele);\n if (!invalid) {\n return; // override the invalidation request if the element key has not changed\n }\n for (var lvl = minLvl$1; lvl <= maxLvl$1; lvl++) {\n var cache = lookup.getForCachedKey(ele, lvl);\n if (cache) {\n caches.push(cache);\n }\n }\n var noOtherElesUseCache = lookup.invalidate(ele);\n if (noOtherElesUseCache) {\n for (var i = 0; i < caches.length; i++) {\n var _cache = caches[i];\n var txr = _cache.texture;\n\n // remove space from the texture it belongs to\n txr.invalidatedWidth += _cache.width;\n\n // mark the cache as invalidated\n _cache.invalidated = true;\n\n // retire the texture if its utility is low\n self.checkTextureUtility(txr);\n }\n }\n\n // remove from queue since the old req was for the old state\n self.removeFromQueue(ele);\n};\nETCp.checkTextureUtility = function (txr) {\n // invalidate all entries in the cache if the cache size is small\n if (txr.invalidatedWidth >= minUtility * txr.width) {\n this.retireTexture(txr);\n }\n};\nETCp.checkTextureFullness = function (txr) {\n // if texture has been mostly filled and passed over several times, remove\n // it from the queue so we don't need to waste time looking at it to put new things\n\n var self = this;\n var txrQ = self.getTextureQueue(txr.height);\n if (txr.usedWidth / txr.width > maxFullness && txr.fullnessChecks >= maxFullnessChecks) {\n removeFromArray(txrQ, txr);\n } else {\n txr.fullnessChecks++;\n }\n};\nETCp.retireTexture = function (txr) {\n var self = this;\n var txrH = txr.height;\n var txrQ = self.getTextureQueue(txrH);\n var lookup = this.lookup;\n\n // retire the texture from the active / searchable queue:\n\n removeFromArray(txrQ, txr);\n txr.retired = true;\n\n // remove the refs from the eles to the caches:\n\n var eleCaches = txr.eleCaches;\n for (var i = 0; i < eleCaches.length; i++) {\n var eleCache = eleCaches[i];\n lookup.deleteCache(eleCache.key, eleCache.level);\n }\n clearArray(eleCaches);\n\n // add the texture to a retired queue so it can be recycled in future:\n\n var rtxtrQ = self.getRetiredTextureQueue(txrH);\n rtxtrQ.push(txr);\n};\nETCp.addTexture = function (txrH, minW) {\n var self = this;\n var txrQ = self.getTextureQueue(txrH);\n var txr = {};\n txrQ.push(txr);\n txr.eleCaches = [];\n txr.height = txrH;\n txr.width = Math.max(defTxrWidth, minW);\n txr.usedWidth = 0;\n txr.invalidatedWidth = 0;\n txr.fullnessChecks = 0;\n txr.canvas = self.renderer.makeOffscreenCanvas(txr.width, txr.height);\n txr.context = txr.canvas.getContext('2d');\n return txr;\n};\nETCp.recycleTexture = function (txrH, minW) {\n var self = this;\n var txrQ = self.getTextureQueue(txrH);\n var rtxtrQ = self.getRetiredTextureQueue(txrH);\n for (var i = 0; i < rtxtrQ.length; i++) {\n var txr = rtxtrQ[i];\n if (txr.width >= minW) {\n txr.retired = false;\n txr.usedWidth = 0;\n txr.invalidatedWidth = 0;\n txr.fullnessChecks = 0;\n clearArray(txr.eleCaches);\n txr.context.setTransform(1, 0, 0, 1, 0, 0);\n txr.context.clearRect(0, 0, txr.width, txr.height);\n removeFromArray(rtxtrQ, txr);\n txrQ.push(txr);\n return txr;\n }\n }\n};\nETCp.queueElement = function (ele, lvl) {\n var self = this;\n var q = self.getElementQueue();\n var k2q = self.getElementKeyToQueue();\n var key = this.getKey(ele);\n var existingReq = k2q[key];\n if (existingReq) {\n // use the max lvl b/c in between lvls are cheap to make\n existingReq.level = Math.max(existingReq.level, lvl);\n existingReq.eles.merge(ele);\n existingReq.reqs++;\n q.updateItem(existingReq);\n } else {\n var req = {\n eles: ele.spawn().merge(ele),\n level: lvl,\n reqs: 1,\n key: key\n };\n q.push(req);\n k2q[key] = req;\n }\n};\nETCp.dequeue = function (pxRatio /*, extent*/) {\n var self = this;\n var q = self.getElementQueue();\n var k2q = self.getElementKeyToQueue();\n var dequeued = [];\n var lookup = self.lookup;\n for (var i = 0; i < maxDeqSize$1; i++) {\n if (q.size() > 0) {\n var req = q.pop();\n var key = req.key;\n var ele = req.eles[0]; // all eles have the same key\n var cacheExists = lookup.hasCache(ele, req.level);\n\n // clear out the key to req lookup\n k2q[key] = null;\n\n // dequeueing isn't necessary with an existing cache\n if (cacheExists) {\n continue;\n }\n dequeued.push(req);\n var bb = self.getBoundingBox(ele);\n self.getElement(ele, bb, pxRatio, req.level, getTxrReasons.dequeue);\n } else {\n break;\n }\n }\n return dequeued;\n};\nETCp.removeFromQueue = function (ele) {\n var self = this;\n var q = self.getElementQueue();\n var k2q = self.getElementKeyToQueue();\n var key = this.getKey(ele);\n var req = k2q[key];\n if (req != null) {\n if (req.eles.length === 1) {\n // remove if last ele in the req\n // bring to front of queue\n req.reqs = MAX_INT$1;\n q.updateItem(req);\n q.pop(); // remove from queue\n\n k2q[key] = null; // remove from lookup map\n } else {\n // otherwise just remove ele from req\n req.eles.unmerge(ele);\n }\n }\n};\nETCp.onDequeue = function (fn) {\n this.onDequeues.push(fn);\n};\nETCp.offDequeue = function (fn) {\n removeFromArray(this.onDequeues, fn);\n};\nETCp.setupDequeueing = defs.setupDequeueing({\n deqRedrawThreshold: deqRedrawThreshold$1,\n deqCost: deqCost$1,\n deqAvgCost: deqAvgCost$1,\n deqNoDrawCost: deqNoDrawCost$1,\n deqFastCost: deqFastCost$1,\n deq: function deq(self, pxRatio, extent) {\n return self.dequeue(pxRatio, extent);\n },\n onDeqd: function onDeqd(self, deqd) {\n for (var i = 0; i < self.onDequeues.length; i++) {\n var fn = self.onDequeues[i];\n fn(deqd);\n }\n },\n shouldRedraw: function shouldRedraw(self, deqd, pxRatio, extent) {\n for (var i = 0; i < deqd.length; i++) {\n var eles = deqd[i].eles;\n for (var j = 0; j < eles.length; j++) {\n var bb = eles[j].boundingBox();\n if (boundingBoxesIntersect(bb, extent)) {\n return true;\n }\n }\n }\n return false;\n },\n priority: function priority(self) {\n return self.renderer.beforeRenderPriorities.eleTxrDeq;\n }\n});\n\nvar defNumLayers = 1; // default number of layers to use\nvar minLvl = -4; // when scaling smaller than that we don't need to re-render\nvar maxLvl = 2; // when larger than this scale just render directly (caching is not helpful)\nvar maxZoom = 3.99; // beyond this zoom level, layered textures are not used\nvar deqRedrawThreshold = 50; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile\nvar refineEleDebounceTime = 50; // time to debounce sharper ele texture updates\nvar deqCost = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame\nvar deqAvgCost = 0.1; // % of add'l rendering cost compared to average overall redraw time\nvar deqNoDrawCost = 0.9; // % of avg frame time that can be used for dequeueing when not drawing\nvar deqFastCost = 0.9; // % of frame time to be used when >60fps\nvar maxDeqSize = 1; // number of eles to dequeue and render at higher texture in each batch\nvar invalidThreshold = 250; // time threshold for disabling b/c of invalidations\nvar maxLayerArea = 4000 * 4000; // layers can't be bigger than this\nvar maxLayerDim = 32767; // maximum size for the width/height of layer canvases\nvar useHighQualityEleTxrReqs = true; // whether to use high quality ele txr requests (generally faster and cheaper in the longterm)\n\n// var log = function(){ console.log.apply( console, arguments ); };\n\nvar LayeredTextureCache = function LayeredTextureCache(renderer) {\n var self = this;\n var r = self.renderer = renderer;\n var cy = r.cy;\n self.layersByLevel = {}; // e.g. 2 => [ layer1, layer2, ..., layerN ]\n\n self.firstGet = true;\n self.lastInvalidationTime = performanceNow() - 2 * invalidThreshold;\n self.skipping = false;\n self.eleTxrDeqs = cy.collection();\n self.scheduleElementRefinement = debounce(function () {\n self.refineElementTextures(self.eleTxrDeqs);\n self.eleTxrDeqs.unmerge(self.eleTxrDeqs);\n }, refineEleDebounceTime);\n r.beforeRender(function (willDraw, now) {\n if (now - self.lastInvalidationTime <= invalidThreshold) {\n self.skipping = true;\n } else {\n self.skipping = false;\n }\n }, r.beforeRenderPriorities.lyrTxrSkip);\n var qSort = function qSort(a, b) {\n return b.reqs - a.reqs;\n };\n self.layersQueue = new Heap(qSort);\n self.setupDequeueing();\n};\nvar LTCp = LayeredTextureCache.prototype;\nvar layerIdPool = 0;\nvar MAX_INT = Math.pow(2, 53) - 1;\nLTCp.makeLayer = function (bb, lvl) {\n var scale = Math.pow(2, lvl);\n var w = Math.ceil(bb.w * scale);\n var h = Math.ceil(bb.h * scale);\n var canvas = this.renderer.makeOffscreenCanvas(w, h);\n var layer = {\n id: layerIdPool = ++layerIdPool % MAX_INT,\n bb: bb,\n level: lvl,\n width: w,\n height: h,\n canvas: canvas,\n context: canvas.getContext('2d'),\n eles: [],\n elesQueue: [],\n reqs: 0\n };\n\n // log('make layer %s with w %s and h %s and lvl %s', layer.id, layer.width, layer.height, layer.level);\n\n var cxt = layer.context;\n var dx = -layer.bb.x1;\n var dy = -layer.bb.y1;\n\n // do the transform on creation to save cycles (it's the same for all eles)\n cxt.scale(scale, scale);\n cxt.translate(dx, dy);\n return layer;\n};\nLTCp.getLayers = function (eles, pxRatio, lvl) {\n var self = this;\n var r = self.renderer;\n var cy = r.cy;\n var zoom = cy.zoom();\n var firstGet = self.firstGet;\n self.firstGet = false;\n\n // log('--\\nget layers with %s eles', eles.length);\n //log eles.map(function(ele){ return ele.id() }) );\n\n if (lvl == null) {\n lvl = Math.ceil(log2(zoom * pxRatio));\n if (lvl < minLvl) {\n lvl = minLvl;\n } else if (zoom >= maxZoom || lvl > maxLvl) {\n return null;\n }\n }\n self.validateLayersElesOrdering(lvl, eles);\n var layersByLvl = self.layersByLevel;\n var scale = Math.pow(2, lvl);\n var layers = layersByLvl[lvl] = layersByLvl[lvl] || [];\n var bb;\n var lvlComplete = self.levelIsComplete(lvl, eles);\n var tmpLayers;\n var checkTempLevels = function checkTempLevels() {\n var canUseAsTmpLvl = function canUseAsTmpLvl(l) {\n self.validateLayersElesOrdering(l, eles);\n if (self.levelIsComplete(l, eles)) {\n tmpLayers = layersByLvl[l];\n return true;\n }\n };\n var checkLvls = function checkLvls(dir) {\n if (tmpLayers) {\n return;\n }\n for (var l = lvl + dir; minLvl <= l && l <= maxLvl; l += dir) {\n if (canUseAsTmpLvl(l)) {\n break;\n }\n }\n };\n checkLvls(1);\n checkLvls(-1);\n\n // remove the invalid layers; they will be replaced as needed later in this function\n for (var i = layers.length - 1; i >= 0; i--) {\n var layer = layers[i];\n if (layer.invalid) {\n removeFromArray(layers, layer);\n }\n }\n };\n if (!lvlComplete) {\n // if the current level is incomplete, then use the closest, best quality layerset temporarily\n // and later queue the current layerset so we can get the proper quality level soon\n\n checkTempLevels();\n } else {\n // log('level complete, using existing layers\\n--');\n return layers;\n }\n var getBb = function getBb() {\n if (!bb) {\n bb = makeBoundingBox();\n for (var i = 0; i < eles.length; i++) {\n updateBoundingBox(bb, eles[i].boundingBox());\n }\n }\n return bb;\n };\n var makeLayer = function makeLayer(opts) {\n opts = opts || {};\n var after = opts.after;\n getBb();\n var w = Math.ceil(bb.w * scale);\n var h = Math.ceil(bb.h * scale);\n if (w > maxLayerDim || h > maxLayerDim) {\n return null;\n }\n var area = w * h;\n if (area > maxLayerArea) {\n return null;\n }\n var layer = self.makeLayer(bb, lvl);\n if (after != null) {\n var index = layers.indexOf(after) + 1;\n layers.splice(index, 0, layer);\n } else if (opts.insert === undefined || opts.insert) {\n // no after specified => first layer made so put at start\n layers.unshift(layer);\n }\n\n // if( tmpLayers ){\n //self.queueLayer( layer );\n // }\n\n return layer;\n };\n if (self.skipping && !firstGet) {\n // log('skip layers');\n return null;\n }\n\n // log('do layers');\n\n var layer = null;\n var maxElesPerLayer = eles.length / defNumLayers;\n var allowLazyQueueing = !firstGet;\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var rs = ele._private.rscratch;\n var caches = rs.imgLayerCaches = rs.imgLayerCaches || {};\n\n // log('look at ele', ele.id());\n\n var existingLayer = caches[lvl];\n if (existingLayer) {\n // reuse layer for later eles\n // log('reuse layer for', ele.id());\n layer = existingLayer;\n continue;\n }\n if (!layer || layer.eles.length >= maxElesPerLayer || !boundingBoxInBoundingBox(layer.bb, ele.boundingBox())) {\n // log('make new layer for ele %s', ele.id());\n\n layer = makeLayer({\n insert: true,\n after: layer\n });\n\n // if now layer can be built then we can't use layers at this level\n if (!layer) {\n return null;\n }\n\n // log('new layer with id %s', layer.id);\n }\n if (tmpLayers || allowLazyQueueing) {\n // log('queue ele %s in layer %s', ele.id(), layer.id);\n self.queueLayer(layer, ele);\n } else {\n // log('draw ele %s in layer %s', ele.id(), layer.id);\n self.drawEleInLayer(layer, ele, lvl, pxRatio);\n }\n layer.eles.push(ele);\n caches[lvl] = layer;\n }\n\n // log('--');\n\n if (tmpLayers) {\n // then we only queued the current layerset and can't draw it yet\n return tmpLayers;\n }\n if (allowLazyQueueing) {\n // log('lazy queue level', lvl);\n return null;\n }\n return layers;\n};\n\n// a layer may want to use an ele cache of a higher level to avoid blurriness\n// so the layer level might not equal the ele level\nLTCp.getEleLevelForLayerLevel = function (lvl, pxRatio) {\n return lvl;\n};\nLTCp.drawEleInLayer = function (layer, ele, lvl, pxRatio) {\n var self = this;\n var r = this.renderer;\n var context = layer.context;\n var bb = ele.boundingBox();\n if (bb.w === 0 || bb.h === 0 || !ele.visible()) {\n return;\n }\n lvl = self.getEleLevelForLayerLevel(lvl, pxRatio);\n {\n r.setImgSmoothing(context, false);\n }\n {\n r.drawCachedElement(context, ele, null, null, lvl, useHighQualityEleTxrReqs);\n }\n {\n r.setImgSmoothing(context, true);\n }\n};\nLTCp.levelIsComplete = function (lvl, eles) {\n var self = this;\n var layers = self.layersByLevel[lvl];\n if (!layers || layers.length === 0) {\n return false;\n }\n var numElesInLayers = 0;\n for (var i = 0; i < layers.length; i++) {\n var layer = layers[i];\n\n // if there are any eles needed to be drawn yet, the level is not complete\n if (layer.reqs > 0) {\n return false;\n }\n\n // if the layer is invalid, the level is not complete\n if (layer.invalid) {\n return false;\n }\n numElesInLayers += layer.eles.length;\n }\n\n // we should have exactly the number of eles passed in to be complete\n if (numElesInLayers !== eles.length) {\n return false;\n }\n return true;\n};\nLTCp.validateLayersElesOrdering = function (lvl, eles) {\n var layers = this.layersByLevel[lvl];\n if (!layers) {\n return;\n }\n\n // if in a layer the eles are not in the same order, then the layer is invalid\n // (i.e. there is an ele in between the eles in the layer)\n\n for (var i = 0; i < layers.length; i++) {\n var layer = layers[i];\n var offset = -1;\n\n // find the offset\n for (var j = 0; j < eles.length; j++) {\n if (layer.eles[0] === eles[j]) {\n offset = j;\n break;\n }\n }\n if (offset < 0) {\n // then the layer has nonexistent elements and is invalid\n this.invalidateLayer(layer);\n continue;\n }\n\n // the eles in the layer must be in the same continuous order, else the layer is invalid\n\n var o = offset;\n for (var j = 0; j < layer.eles.length; j++) {\n if (layer.eles[j] !== eles[o + j]) {\n // log('invalidate based on ordering', layer.id);\n\n this.invalidateLayer(layer);\n break;\n }\n }\n }\n};\nLTCp.updateElementsInLayers = function (eles, update) {\n var self = this;\n var isEles = element(eles[0]);\n\n // collect udpated elements (cascaded from the layers) and update each\n // layer itself along the way\n for (var i = 0; i < eles.length; i++) {\n var req = isEles ? null : eles[i];\n var ele = isEles ? eles[i] : eles[i].ele;\n var rs = ele._private.rscratch;\n var caches = rs.imgLayerCaches = rs.imgLayerCaches || {};\n for (var l = minLvl; l <= maxLvl; l++) {\n var layer = caches[l];\n if (!layer) {\n continue;\n }\n\n // if update is a request from the ele cache, then it affects only\n // the matching level\n if (req && self.getEleLevelForLayerLevel(layer.level) !== req.level) {\n continue;\n }\n update(layer, ele, req);\n }\n }\n};\nLTCp.haveLayers = function () {\n var self = this;\n var haveLayers = false;\n for (var l = minLvl; l <= maxLvl; l++) {\n var layers = self.layersByLevel[l];\n if (layers && layers.length > 0) {\n haveLayers = true;\n break;\n }\n }\n return haveLayers;\n};\nLTCp.invalidateElements = function (eles) {\n var self = this;\n if (eles.length === 0) {\n return;\n }\n self.lastInvalidationTime = performanceNow();\n\n // log('update invalidate layer time from eles');\n\n if (eles.length === 0 || !self.haveLayers()) {\n return;\n }\n self.updateElementsInLayers(eles, function invalAssocLayers(layer, ele, req) {\n self.invalidateLayer(layer);\n });\n};\nLTCp.invalidateLayer = function (layer) {\n // log('update invalidate layer time');\n\n this.lastInvalidationTime = performanceNow();\n if (layer.invalid) {\n return;\n } // save cycles\n\n var lvl = layer.level;\n var eles = layer.eles;\n var layers = this.layersByLevel[lvl];\n\n // log('invalidate layer', layer.id );\n\n removeFromArray(layers, layer);\n // layer.eles = [];\n\n layer.elesQueue = [];\n layer.invalid = true;\n if (layer.replacement) {\n layer.replacement.invalid = true;\n }\n for (var i = 0; i < eles.length; i++) {\n var caches = eles[i]._private.rscratch.imgLayerCaches;\n if (caches) {\n caches[lvl] = null;\n }\n }\n};\nLTCp.refineElementTextures = function (eles) {\n var self = this;\n\n // log('refine', eles.length);\n\n self.updateElementsInLayers(eles, function refineEachEle(layer, ele, req) {\n var rLyr = layer.replacement;\n if (!rLyr) {\n rLyr = layer.replacement = self.makeLayer(layer.bb, layer.level);\n rLyr.replaces = layer;\n rLyr.eles = layer.eles;\n\n // log('make replacement layer %s for %s with level %s', rLyr.id, layer.id, rLyr.level);\n }\n if (!rLyr.reqs) {\n for (var i = 0; i < rLyr.eles.length; i++) {\n self.queueLayer(rLyr, rLyr.eles[i]);\n }\n\n // log('queue replacement layer refinement', rLyr.id);\n }\n });\n};\nLTCp.enqueueElementRefinement = function (ele) {\n this.eleTxrDeqs.merge(ele);\n this.scheduleElementRefinement();\n};\nLTCp.queueLayer = function (layer, ele) {\n var self = this;\n var q = self.layersQueue;\n var elesQ = layer.elesQueue;\n var hasId = elesQ.hasId = elesQ.hasId || {};\n\n // if a layer is going to be replaced, queuing is a waste of time\n if (layer.replacement) {\n return;\n }\n if (ele) {\n if (hasId[ele.id()]) {\n return;\n }\n elesQ.push(ele);\n hasId[ele.id()] = true;\n }\n if (layer.reqs) {\n layer.reqs++;\n q.updateItem(layer);\n } else {\n layer.reqs = 1;\n q.push(layer);\n }\n};\nLTCp.dequeue = function (pxRatio) {\n var self = this;\n var q = self.layersQueue;\n var deqd = [];\n var eleDeqs = 0;\n while (eleDeqs < maxDeqSize) {\n if (q.size() === 0) {\n break;\n }\n var layer = q.peek();\n\n // if a layer has been or will be replaced, then don't waste time with it\n if (layer.replacement) {\n // log('layer %s in queue skipped b/c it already has a replacement', layer.id);\n q.pop();\n continue;\n }\n\n // if this is a replacement layer that has been superceded, then forget it\n if (layer.replaces && layer !== layer.replaces.replacement) {\n // log('layer is no longer the most uptodate replacement; dequeued', layer.id)\n q.pop();\n continue;\n }\n if (layer.invalid) {\n // log('replacement layer %s is invalid; dequeued', layer.id);\n q.pop();\n continue;\n }\n var ele = layer.elesQueue.shift();\n if (ele) {\n // log('dequeue layer %s', layer.id);\n\n self.drawEleInLayer(layer, ele, layer.level, pxRatio);\n eleDeqs++;\n }\n if (deqd.length === 0) {\n // we need only one entry in deqd to queue redrawing etc\n deqd.push(true);\n }\n\n // if the layer has all its eles done, then remove from the queue\n if (layer.elesQueue.length === 0) {\n q.pop();\n layer.reqs = 0;\n\n // log('dequeue of layer %s complete', layer.id);\n\n // when a replacement layer is dequeued, it replaces the old layer in the level\n if (layer.replaces) {\n self.applyLayerReplacement(layer);\n }\n self.requestRedraw();\n }\n }\n return deqd;\n};\nLTCp.applyLayerReplacement = function (layer) {\n var self = this;\n var layersInLevel = self.layersByLevel[layer.level];\n var replaced = layer.replaces;\n var index = layersInLevel.indexOf(replaced);\n\n // if the replaced layer is not in the active list for the level, then replacing\n // refs would be a mistake (i.e. overwriting the true active layer)\n if (index < 0 || replaced.invalid) {\n // log('replacement layer would have no effect', layer.id);\n return;\n }\n layersInLevel[index] = layer; // replace level ref\n\n // replace refs in eles\n for (var i = 0; i < layer.eles.length; i++) {\n var _p = layer.eles[i]._private;\n var cache = _p.imgLayerCaches = _p.imgLayerCaches || {};\n if (cache) {\n cache[layer.level] = layer;\n }\n }\n\n // log('apply replacement layer %s over %s', layer.id, replaced.id);\n\n self.requestRedraw();\n};\nLTCp.requestRedraw = debounce(function () {\n var r = this.renderer;\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n r.redraw();\n}, 100);\nLTCp.setupDequeueing = defs.setupDequeueing({\n deqRedrawThreshold: deqRedrawThreshold,\n deqCost: deqCost,\n deqAvgCost: deqAvgCost,\n deqNoDrawCost: deqNoDrawCost,\n deqFastCost: deqFastCost,\n deq: function deq(self, pxRatio) {\n return self.dequeue(pxRatio);\n },\n onDeqd: noop$1,\n shouldRedraw: trueify,\n priority: function priority(self) {\n return self.renderer.beforeRenderPriorities.lyrTxrDeq;\n }\n});\n\nvar CRp$b = {};\nvar impl;\nfunction polygon(context, points) {\n for (var i = 0; i < points.length; i++) {\n var pt = points[i];\n context.lineTo(pt.x, pt.y);\n }\n}\nfunction triangleBackcurve(context, points, controlPoint) {\n var firstPt;\n for (var i = 0; i < points.length; i++) {\n var pt = points[i];\n if (i === 0) {\n firstPt = pt;\n }\n context.lineTo(pt.x, pt.y);\n }\n context.quadraticCurveTo(controlPoint.x, controlPoint.y, firstPt.x, firstPt.y);\n}\nfunction triangleTee(context, trianglePoints, teePoints) {\n if (context.beginPath) {\n context.beginPath();\n }\n var triPts = trianglePoints;\n for (var i = 0; i < triPts.length; i++) {\n var pt = triPts[i];\n context.lineTo(pt.x, pt.y);\n }\n var teePts = teePoints;\n var firstTeePt = teePoints[0];\n context.moveTo(firstTeePt.x, firstTeePt.y);\n for (var i = 1; i < teePts.length; i++) {\n var pt = teePts[i];\n context.lineTo(pt.x, pt.y);\n }\n if (context.closePath) {\n context.closePath();\n }\n}\nfunction circleTriangle(context, trianglePoints, rx, ry, r) {\n if (context.beginPath) {\n context.beginPath();\n }\n context.arc(rx, ry, r, 0, Math.PI * 2, false);\n var triPts = trianglePoints;\n var firstTrPt = triPts[0];\n context.moveTo(firstTrPt.x, firstTrPt.y);\n for (var i = 0; i < triPts.length; i++) {\n var pt = triPts[i];\n context.lineTo(pt.x, pt.y);\n }\n if (context.closePath) {\n context.closePath();\n }\n}\nfunction circle$1(context, rx, ry, r) {\n context.arc(rx, ry, r, 0, Math.PI * 2, false);\n}\nCRp$b.arrowShapeImpl = function (name) {\n return (impl || (impl = {\n 'polygon': polygon,\n 'triangle-backcurve': triangleBackcurve,\n 'triangle-tee': triangleTee,\n 'circle-triangle': circleTriangle,\n 'triangle-cross': triangleTee,\n 'circle': circle$1\n }))[name];\n};\n\nvar CRp$a = {};\nCRp$a.drawElement = function (context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity) {\n var r = this;\n if (ele.isNode()) {\n r.drawNode(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity);\n } else {\n r.drawEdge(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity);\n }\n};\nCRp$a.drawElementOverlay = function (context, ele) {\n var r = this;\n if (ele.isNode()) {\n r.drawNodeOverlay(context, ele);\n } else {\n r.drawEdgeOverlay(context, ele);\n }\n};\nCRp$a.drawElementUnderlay = function (context, ele) {\n var r = this;\n if (ele.isNode()) {\n r.drawNodeUnderlay(context, ele);\n } else {\n r.drawEdgeUnderlay(context, ele);\n }\n};\nCRp$a.drawCachedElementPortion = function (context, ele, eleTxrCache, pxRatio, lvl, reason, getRotation, getOpacity) {\n var r = this;\n var bb = eleTxrCache.getBoundingBox(ele);\n if (bb.w === 0 || bb.h === 0) {\n return;\n } // ignore zero size case\n\n var eleCache = eleTxrCache.getElement(ele, bb, pxRatio, lvl, reason);\n if (eleCache != null) {\n var opacity = getOpacity(r, ele);\n if (opacity === 0) {\n return;\n }\n var theta = getRotation(r, ele);\n var x1 = bb.x1,\n y1 = bb.y1,\n w = bb.w,\n h = bb.h;\n var x, y, sx, sy, smooth;\n if (theta !== 0) {\n var rotPt = eleTxrCache.getRotationPoint(ele);\n sx = rotPt.x;\n sy = rotPt.y;\n context.translate(sx, sy);\n context.rotate(theta);\n smooth = r.getImgSmoothing(context);\n if (!smooth) {\n r.setImgSmoothing(context, true);\n }\n var off = eleTxrCache.getRotationOffset(ele);\n x = off.x;\n y = off.y;\n } else {\n x = x1;\n y = y1;\n }\n var oldGlobalAlpha;\n if (opacity !== 1) {\n oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = oldGlobalAlpha * opacity;\n }\n context.drawImage(eleCache.texture.canvas, eleCache.x, 0, eleCache.width, eleCache.height, x, y, w, h);\n if (opacity !== 1) {\n context.globalAlpha = oldGlobalAlpha;\n }\n if (theta !== 0) {\n context.rotate(-theta);\n context.translate(-sx, -sy);\n if (!smooth) {\n r.setImgSmoothing(context, false);\n }\n }\n } else {\n eleTxrCache.drawElement(context, ele); // direct draw fallback\n }\n};\nvar getZeroRotation = function getZeroRotation() {\n return 0;\n};\nvar getLabelRotation = function getLabelRotation(r, ele) {\n return r.getTextAngle(ele, null);\n};\nvar getSourceLabelRotation = function getSourceLabelRotation(r, ele) {\n return r.getTextAngle(ele, 'source');\n};\nvar getTargetLabelRotation = function getTargetLabelRotation(r, ele) {\n return r.getTextAngle(ele, 'target');\n};\nvar getOpacity = function getOpacity(r, ele) {\n return ele.effectiveOpacity();\n};\nvar getTextOpacity = function getTextOpacity(e, ele) {\n return ele.pstyle('text-opacity').pfValue * ele.effectiveOpacity();\n};\nCRp$a.drawCachedElement = function (context, ele, pxRatio, extent, lvl, requestHighQuality) {\n var r = this;\n var _r$data = r.data,\n eleTxrCache = _r$data.eleTxrCache,\n lblTxrCache = _r$data.lblTxrCache,\n slbTxrCache = _r$data.slbTxrCache,\n tlbTxrCache = _r$data.tlbTxrCache;\n var bb = ele.boundingBox();\n var reason = requestHighQuality === true ? eleTxrCache.reasons.highQuality : null;\n if (bb.w === 0 || bb.h === 0 || !ele.visible()) {\n return;\n }\n if (!extent || boundingBoxesIntersect(bb, extent)) {\n var isEdge = ele.isEdge();\n var badLine = ele.element()._private.rscratch.badLine;\n r.drawElementUnderlay(context, ele);\n r.drawCachedElementPortion(context, ele, eleTxrCache, pxRatio, lvl, reason, getZeroRotation, getOpacity);\n if (!isEdge || !badLine) {\n r.drawCachedElementPortion(context, ele, lblTxrCache, pxRatio, lvl, reason, getLabelRotation, getTextOpacity);\n }\n if (isEdge && !badLine) {\n r.drawCachedElementPortion(context, ele, slbTxrCache, pxRatio, lvl, reason, getSourceLabelRotation, getTextOpacity);\n r.drawCachedElementPortion(context, ele, tlbTxrCache, pxRatio, lvl, reason, getTargetLabelRotation, getTextOpacity);\n }\n r.drawElementOverlay(context, ele);\n }\n};\nCRp$a.drawElements = function (context, eles) {\n var r = this;\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n r.drawElement(context, ele);\n }\n};\nCRp$a.drawCachedElements = function (context, eles, pxRatio, extent) {\n var r = this;\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n r.drawCachedElement(context, ele, pxRatio, extent);\n }\n};\nCRp$a.drawCachedNodes = function (context, eles, pxRatio, extent) {\n var r = this;\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n if (!ele.isNode()) {\n continue;\n }\n r.drawCachedElement(context, ele, pxRatio, extent);\n }\n};\nCRp$a.drawLayeredElements = function (context, eles, pxRatio, extent) {\n var r = this;\n var layers = r.data.lyrTxrCache.getLayers(eles, pxRatio);\n if (layers) {\n for (var i = 0; i < layers.length; i++) {\n var layer = layers[i];\n var bb = layer.bb;\n if (bb.w === 0 || bb.h === 0) {\n continue;\n }\n context.drawImage(layer.canvas, bb.x1, bb.y1, bb.w, bb.h);\n }\n } else {\n // fall back on plain caching if no layers\n r.drawCachedElements(context, eles, pxRatio, extent);\n }\n};\n\nvar CRp$9 = {};\nCRp$9.drawEdge = function (context, edge, shiftToOriginWithBb) {\n var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n var r = this;\n var rs = edge._private.rscratch;\n if (shouldDrawOpacity && !edge.visible()) {\n return;\n }\n\n // if bezier ctrl pts can not be calculated, then die\n if (rs.badLine || rs.allpts == null || isNaN(rs.allpts[0])) {\n // isNaN in case edge is impossible and browser bugs (e.g. safari)\n return;\n }\n var bb;\n if (shiftToOriginWithBb) {\n bb = shiftToOriginWithBb;\n context.translate(-bb.x1, -bb.y1);\n }\n var opacity = shouldDrawOpacity ? edge.pstyle('opacity').value : 1;\n var lineOpacity = shouldDrawOpacity ? edge.pstyle('line-opacity').value : 1;\n var curveStyle = edge.pstyle('curve-style').value;\n var lineStyle = edge.pstyle('line-style').value;\n var edgeWidth = edge.pstyle('width').pfValue;\n var lineCap = edge.pstyle('line-cap').value;\n var lineOutlineWidth = edge.pstyle('line-outline-width').value;\n var lineOutlineColor = edge.pstyle('line-outline-color').value;\n var effectiveLineOpacity = opacity * lineOpacity;\n // separate arrow opacity would require arrow-opacity property\n var effectiveArrowOpacity = opacity * lineOpacity;\n var drawLine = function drawLine() {\n var strokeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveLineOpacity;\n if (curveStyle === 'straight-triangle') {\n r.eleStrokeStyle(context, edge, strokeOpacity);\n r.drawEdgeTrianglePath(edge, context, rs.allpts);\n } else {\n context.lineWidth = edgeWidth;\n context.lineCap = lineCap;\n r.eleStrokeStyle(context, edge, strokeOpacity);\n r.drawEdgePath(edge, context, rs.allpts, lineStyle);\n context.lineCap = 'butt'; // reset for other drawing functions\n }\n };\n var drawLineOutline = function drawLineOutline() {\n var strokeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveLineOpacity;\n context.lineWidth = edgeWidth + lineOutlineWidth;\n context.lineCap = lineCap;\n if (lineOutlineWidth > 0) {\n r.colorStrokeStyle(context, lineOutlineColor[0], lineOutlineColor[1], lineOutlineColor[2], strokeOpacity);\n } else {\n // do not draw any lineOutline\n context.lineCap = 'butt'; // reset for other drawing functions\n return;\n }\n if (curveStyle === 'straight-triangle') {\n r.drawEdgeTrianglePath(edge, context, rs.allpts);\n } else {\n r.drawEdgePath(edge, context, rs.allpts, lineStyle);\n context.lineCap = 'butt'; // reset for other drawing functions\n }\n };\n var drawOverlay = function drawOverlay() {\n if (!shouldDrawOverlay) {\n return;\n }\n r.drawEdgeOverlay(context, edge);\n };\n var drawUnderlay = function drawUnderlay() {\n if (!shouldDrawOverlay) {\n return;\n }\n r.drawEdgeUnderlay(context, edge);\n };\n var drawArrows = function drawArrows() {\n var arrowOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveArrowOpacity;\n r.drawArrowheads(context, edge, arrowOpacity);\n };\n var drawText = function drawText() {\n r.drawElementText(context, edge, null, drawLabel);\n };\n context.lineJoin = 'round';\n var ghost = edge.pstyle('ghost').value === 'yes';\n if (ghost) {\n var gx = edge.pstyle('ghost-offset-x').pfValue;\n var gy = edge.pstyle('ghost-offset-y').pfValue;\n var ghostOpacity = edge.pstyle('ghost-opacity').value;\n var effectiveGhostOpacity = effectiveLineOpacity * ghostOpacity;\n context.translate(gx, gy);\n drawLine(effectiveGhostOpacity);\n drawArrows(effectiveGhostOpacity);\n context.translate(-gx, -gy);\n } else {\n drawLineOutline();\n }\n drawUnderlay();\n drawLine();\n drawArrows();\n drawOverlay();\n drawText();\n if (shiftToOriginWithBb) {\n context.translate(bb.x1, bb.y1);\n }\n};\nvar drawEdgeOverlayUnderlay = function drawEdgeOverlayUnderlay(overlayOrUnderlay) {\n if (!['overlay', 'underlay'].includes(overlayOrUnderlay)) {\n throw new Error('Invalid state');\n }\n return function (context, edge) {\n if (!edge.visible()) {\n return;\n }\n var opacity = edge.pstyle(\"\".concat(overlayOrUnderlay, \"-opacity\")).value;\n if (opacity === 0) {\n return;\n }\n var r = this;\n var usePaths = r.usePaths();\n var rs = edge._private.rscratch;\n var padding = edge.pstyle(\"\".concat(overlayOrUnderlay, \"-padding\")).pfValue;\n var width = 2 * padding;\n var color = edge.pstyle(\"\".concat(overlayOrUnderlay, \"-color\")).value;\n context.lineWidth = width;\n if (rs.edgeType === 'self' && !usePaths) {\n context.lineCap = 'butt';\n } else {\n context.lineCap = 'round';\n }\n r.colorStrokeStyle(context, color[0], color[1], color[2], opacity);\n r.drawEdgePath(edge, context, rs.allpts, 'solid');\n };\n};\nCRp$9.drawEdgeOverlay = drawEdgeOverlayUnderlay('overlay');\nCRp$9.drawEdgeUnderlay = drawEdgeOverlayUnderlay('underlay');\nCRp$9.drawEdgePath = function (edge, context, pts, type) {\n var rs = edge._private.rscratch;\n var canvasCxt = context;\n var path;\n var pathCacheHit = false;\n var usePaths = this.usePaths();\n var lineDashPattern = edge.pstyle('line-dash-pattern').pfValue;\n var lineDashOffset = edge.pstyle('line-dash-offset').pfValue;\n if (usePaths) {\n var pathCacheKey = pts.join('$');\n var keyMatches = rs.pathCacheKey && rs.pathCacheKey === pathCacheKey;\n if (keyMatches) {\n path = context = rs.pathCache;\n pathCacheHit = true;\n } else {\n path = context = new Path2D();\n rs.pathCacheKey = pathCacheKey;\n rs.pathCache = path;\n }\n }\n if (canvasCxt.setLineDash) {\n // for very outofdate browsers\n switch (type) {\n case 'dotted':\n canvasCxt.setLineDash([1, 1]);\n break;\n case 'dashed':\n canvasCxt.setLineDash(lineDashPattern);\n canvasCxt.lineDashOffset = lineDashOffset;\n break;\n case 'solid':\n canvasCxt.setLineDash([]);\n break;\n }\n }\n if (!pathCacheHit && !rs.badLine) {\n if (context.beginPath) {\n context.beginPath();\n }\n context.moveTo(pts[0], pts[1]);\n switch (rs.edgeType) {\n case 'bezier':\n case 'self':\n case 'compound':\n case 'multibezier':\n for (var i = 2; i + 3 < pts.length; i += 4) {\n context.quadraticCurveTo(pts[i], pts[i + 1], pts[i + 2], pts[i + 3]);\n }\n break;\n case 'straight':\n case 'haystack':\n for (var _i = 2; _i + 1 < pts.length; _i += 2) {\n context.lineTo(pts[_i], pts[_i + 1]);\n }\n break;\n case 'segments':\n if (rs.isRound) {\n var _iterator = _createForOfIteratorHelper(rs.roundCorners),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var corner = _step.value;\n drawPreparedRoundCorner(context, corner);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n context.lineTo(pts[pts.length - 2], pts[pts.length - 1]);\n } else {\n for (var _i2 = 2; _i2 + 1 < pts.length; _i2 += 2) {\n context.lineTo(pts[_i2], pts[_i2 + 1]);\n }\n }\n break;\n }\n }\n context = canvasCxt;\n if (usePaths) {\n context.stroke(path);\n } else {\n context.stroke();\n }\n\n // reset any line dashes\n if (context.setLineDash) {\n // for very outofdate browsers\n context.setLineDash([]);\n }\n};\nCRp$9.drawEdgeTrianglePath = function (edge, context, pts) {\n // use line stroke style for triangle fill style\n context.fillStyle = context.strokeStyle;\n var edgeWidth = edge.pstyle('width').pfValue;\n for (var i = 0; i + 1 < pts.length; i += 2) {\n var vector = [pts[i + 2] - pts[i], pts[i + 3] - pts[i + 1]];\n var length = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]);\n var normal = [vector[1] / length, -vector[0] / length];\n var triangleHead = [normal[0] * edgeWidth / 2, normal[1] * edgeWidth / 2];\n context.beginPath();\n context.moveTo(pts[i] - triangleHead[0], pts[i + 1] - triangleHead[1]);\n context.lineTo(pts[i] + triangleHead[0], pts[i + 1] + triangleHead[1]);\n context.lineTo(pts[i + 2], pts[i + 3]);\n context.closePath();\n context.fill();\n }\n};\nCRp$9.drawArrowheads = function (context, edge, opacity) {\n var rs = edge._private.rscratch;\n var isHaystack = rs.edgeType === 'haystack';\n if (!isHaystack) {\n this.drawArrowhead(context, edge, 'source', rs.arrowStartX, rs.arrowStartY, rs.srcArrowAngle, opacity);\n }\n this.drawArrowhead(context, edge, 'mid-target', rs.midX, rs.midY, rs.midtgtArrowAngle, opacity);\n this.drawArrowhead(context, edge, 'mid-source', rs.midX, rs.midY, rs.midsrcArrowAngle, opacity);\n if (!isHaystack) {\n this.drawArrowhead(context, edge, 'target', rs.arrowEndX, rs.arrowEndY, rs.tgtArrowAngle, opacity);\n }\n};\nCRp$9.drawArrowhead = function (context, edge, prefix, x, y, angle, opacity) {\n if (isNaN(x) || x == null || isNaN(y) || y == null || isNaN(angle) || angle == null) {\n return;\n }\n var self = this;\n var arrowShape = edge.pstyle(prefix + '-arrow-shape').value;\n if (arrowShape === 'none') {\n return;\n }\n var arrowClearFill = edge.pstyle(prefix + '-arrow-fill').value === 'hollow' ? 'both' : 'filled';\n var arrowFill = edge.pstyle(prefix + '-arrow-fill').value;\n var edgeWidth = edge.pstyle('width').pfValue;\n var pArrowWidth = edge.pstyle(prefix + '-arrow-width');\n var arrowWidth = pArrowWidth.value === 'match-line' ? edgeWidth : pArrowWidth.pfValue;\n if (pArrowWidth.units === '%') arrowWidth *= edgeWidth;\n var edgeOpacity = edge.pstyle('opacity').value;\n if (opacity === undefined) {\n opacity = edgeOpacity;\n }\n var gco = context.globalCompositeOperation;\n if (opacity !== 1 || arrowFill === 'hollow') {\n // then extra clear is needed\n context.globalCompositeOperation = 'destination-out';\n self.colorFillStyle(context, 255, 255, 255, 1);\n self.colorStrokeStyle(context, 255, 255, 255, 1);\n self.drawArrowShape(edge, context, arrowClearFill, edgeWidth, arrowShape, arrowWidth, x, y, angle);\n context.globalCompositeOperation = gco;\n } // otherwise, the opaque arrow clears it for free :)\n\n var color = edge.pstyle(prefix + '-arrow-color').value;\n self.colorFillStyle(context, color[0], color[1], color[2], opacity);\n self.colorStrokeStyle(context, color[0], color[1], color[2], opacity);\n self.drawArrowShape(edge, context, arrowFill, edgeWidth, arrowShape, arrowWidth, x, y, angle);\n};\nCRp$9.drawArrowShape = function (edge, context, fill, edgeWidth, shape, shapeWidth, x, y, angle) {\n var r = this;\n var usePaths = this.usePaths() && shape !== 'triangle-cross';\n var pathCacheHit = false;\n var path;\n var canvasContext = context;\n var translation = {\n x: x,\n y: y\n };\n var scale = edge.pstyle('arrow-scale').value;\n var size = this.getArrowWidth(edgeWidth, scale);\n var shapeImpl = r.arrowShapes[shape];\n if (usePaths) {\n var cache = r.arrowPathCache = r.arrowPathCache || [];\n var key = hashString(shape);\n var cachedPath = cache[key];\n if (cachedPath != null) {\n path = context = cachedPath;\n pathCacheHit = true;\n } else {\n path = context = new Path2D();\n cache[key] = path;\n }\n }\n if (!pathCacheHit) {\n if (context.beginPath) {\n context.beginPath();\n }\n if (usePaths) {\n // store in the path cache with values easily manipulated later\n shapeImpl.draw(context, 1, 0, {\n x: 0,\n y: 0\n }, 1);\n } else {\n shapeImpl.draw(context, size, angle, translation, edgeWidth);\n }\n if (context.closePath) {\n context.closePath();\n }\n }\n context = canvasContext;\n if (usePaths) {\n // set transform to arrow position/orientation\n context.translate(x, y);\n context.rotate(angle);\n context.scale(size, size);\n }\n if (fill === 'filled' || fill === 'both') {\n if (usePaths) {\n context.fill(path);\n } else {\n context.fill();\n }\n }\n if (fill === 'hollow' || fill === 'both') {\n context.lineWidth = shapeWidth / (usePaths ? size : 1);\n context.lineJoin = 'miter';\n if (usePaths) {\n context.stroke(path);\n } else {\n context.stroke();\n }\n }\n if (usePaths) {\n // reset transform by applying inverse\n context.scale(1 / size, 1 / size);\n context.rotate(-angle);\n context.translate(-x, -y);\n }\n};\n\nvar CRp$8 = {};\nCRp$8.safeDrawImage = function (context, img, ix, iy, iw, ih, x, y, w, h) {\n // detect problematic cases for old browsers with bad images (cheaper than try-catch)\n if (iw <= 0 || ih <= 0 || w <= 0 || h <= 0) {\n return;\n }\n try {\n context.drawImage(img, ix, iy, iw, ih, x, y, w, h);\n } catch (e) {\n warn(e);\n }\n};\nCRp$8.drawInscribedImage = function (context, img, node, index, nodeOpacity) {\n var r = this;\n var pos = node.position();\n var nodeX = pos.x;\n var nodeY = pos.y;\n var styleObj = node.cy().style();\n var getIndexedStyle = styleObj.getIndexedStyle.bind(styleObj);\n var fit = getIndexedStyle(node, 'background-fit', 'value', index);\n var repeat = getIndexedStyle(node, 'background-repeat', 'value', index);\n var nodeW = node.width();\n var nodeH = node.height();\n var paddingX2 = node.padding() * 2;\n var nodeTW = nodeW + (getIndexedStyle(node, 'background-width-relative-to', 'value', index) === 'inner' ? 0 : paddingX2);\n var nodeTH = nodeH + (getIndexedStyle(node, 'background-height-relative-to', 'value', index) === 'inner' ? 0 : paddingX2);\n var rs = node._private.rscratch;\n var clip = getIndexedStyle(node, 'background-clip', 'value', index);\n var shouldClip = clip === 'node';\n var imgOpacity = getIndexedStyle(node, 'background-image-opacity', 'value', index) * nodeOpacity;\n var smooth = getIndexedStyle(node, 'background-image-smoothing', 'value', index);\n var cornerRadius = node.pstyle('corner-radius').value;\n if (cornerRadius !== 'auto') cornerRadius = node.pstyle('corner-radius').pfValue;\n var imgW = img.width || img.cachedW;\n var imgH = img.height || img.cachedH;\n\n // workaround for broken browsers like ie\n if (null == imgW || null == imgH) {\n document.body.appendChild(img); // eslint-disable-line no-undef\n\n imgW = img.cachedW = img.width || img.offsetWidth;\n imgH = img.cachedH = img.height || img.offsetHeight;\n document.body.removeChild(img); // eslint-disable-line no-undef\n }\n var w = imgW;\n var h = imgH;\n if (getIndexedStyle(node, 'background-width', 'value', index) !== 'auto') {\n if (getIndexedStyle(node, 'background-width', 'units', index) === '%') {\n w = getIndexedStyle(node, 'background-width', 'pfValue', index) * nodeTW;\n } else {\n w = getIndexedStyle(node, 'background-width', 'pfValue', index);\n }\n }\n if (getIndexedStyle(node, 'background-height', 'value', index) !== 'auto') {\n if (getIndexedStyle(node, 'background-height', 'units', index) === '%') {\n h = getIndexedStyle(node, 'background-height', 'pfValue', index) * nodeTH;\n } else {\n h = getIndexedStyle(node, 'background-height', 'pfValue', index);\n }\n }\n if (w === 0 || h === 0) {\n return; // no point in drawing empty image (and chrome is broken in this case)\n }\n if (fit === 'contain') {\n var scale = Math.min(nodeTW / w, nodeTH / h);\n w *= scale;\n h *= scale;\n } else if (fit === 'cover') {\n var scale = Math.max(nodeTW / w, nodeTH / h);\n w *= scale;\n h *= scale;\n }\n var x = nodeX - nodeTW / 2; // left\n var posXUnits = getIndexedStyle(node, 'background-position-x', 'units', index);\n var posXPfVal = getIndexedStyle(node, 'background-position-x', 'pfValue', index);\n if (posXUnits === '%') {\n x += (nodeTW - w) * posXPfVal;\n } else {\n x += posXPfVal;\n }\n var offXUnits = getIndexedStyle(node, 'background-offset-x', 'units', index);\n var offXPfVal = getIndexedStyle(node, 'background-offset-x', 'pfValue', index);\n if (offXUnits === '%') {\n x += (nodeTW - w) * offXPfVal;\n } else {\n x += offXPfVal;\n }\n var y = nodeY - nodeTH / 2; // top\n var posYUnits = getIndexedStyle(node, 'background-position-y', 'units', index);\n var posYPfVal = getIndexedStyle(node, 'background-position-y', 'pfValue', index);\n if (posYUnits === '%') {\n y += (nodeTH - h) * posYPfVal;\n } else {\n y += posYPfVal;\n }\n var offYUnits = getIndexedStyle(node, 'background-offset-y', 'units', index);\n var offYPfVal = getIndexedStyle(node, 'background-offset-y', 'pfValue', index);\n if (offYUnits === '%') {\n y += (nodeTH - h) * offYPfVal;\n } else {\n y += offYPfVal;\n }\n if (rs.pathCache) {\n x -= nodeX;\n y -= nodeY;\n nodeX = 0;\n nodeY = 0;\n }\n var gAlpha = context.globalAlpha;\n context.globalAlpha = imgOpacity;\n var smoothingEnabled = r.getImgSmoothing(context);\n var isSmoothingSwitched = false;\n if (smooth === 'no' && smoothingEnabled) {\n r.setImgSmoothing(context, false);\n isSmoothingSwitched = true;\n } else if (smooth === 'yes' && !smoothingEnabled) {\n r.setImgSmoothing(context, true);\n isSmoothingSwitched = true;\n }\n if (repeat === 'no-repeat') {\n if (shouldClip) {\n context.save();\n if (rs.pathCache) {\n context.clip(rs.pathCache);\n } else {\n r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH, cornerRadius, rs);\n context.clip();\n }\n }\n r.safeDrawImage(context, img, 0, 0, imgW, imgH, x, y, w, h);\n if (shouldClip) {\n context.restore();\n }\n } else {\n var pattern = context.createPattern(img, repeat);\n context.fillStyle = pattern;\n r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH, cornerRadius, rs);\n context.translate(x, y);\n context.fill();\n context.translate(-x, -y);\n }\n context.globalAlpha = gAlpha;\n if (isSmoothingSwitched) {\n r.setImgSmoothing(context, smoothingEnabled);\n }\n};\n\nvar CRp$7 = {};\nCRp$7.eleTextBiggerThanMin = function (ele, scale) {\n if (!scale) {\n var zoom = ele.cy().zoom();\n var pxRatio = this.getPixelRatio();\n var lvl = Math.ceil(log2(zoom * pxRatio)); // the effective texture level\n\n scale = Math.pow(2, lvl);\n }\n var computedSize = ele.pstyle('font-size').pfValue * scale;\n var minSize = ele.pstyle('min-zoomed-font-size').pfValue;\n if (computedSize < minSize) {\n return false;\n }\n return true;\n};\nCRp$7.drawElementText = function (context, ele, shiftToOriginWithBb, force, prefix) {\n var useEleOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n var r = this;\n if (force == null) {\n if (useEleOpacity && !r.eleTextBiggerThanMin(ele)) {\n return;\n }\n } else if (force === false) {\n return;\n }\n if (ele.isNode()) {\n var label = ele.pstyle('label');\n if (!label || !label.value) {\n return;\n }\n var justification = r.getLabelJustification(ele);\n context.textAlign = justification;\n context.textBaseline = 'bottom';\n } else {\n var badLine = ele.element()._private.rscratch.badLine;\n var _label = ele.pstyle('label');\n var srcLabel = ele.pstyle('source-label');\n var tgtLabel = ele.pstyle('target-label');\n if (badLine || (!_label || !_label.value) && (!srcLabel || !srcLabel.value) && (!tgtLabel || !tgtLabel.value)) {\n return;\n }\n context.textAlign = 'center';\n context.textBaseline = 'bottom';\n }\n var applyRotation = !shiftToOriginWithBb;\n var bb;\n if (shiftToOriginWithBb) {\n bb = shiftToOriginWithBb;\n context.translate(-bb.x1, -bb.y1);\n }\n if (prefix == null) {\n r.drawText(context, ele, null, applyRotation, useEleOpacity);\n if (ele.isEdge()) {\n r.drawText(context, ele, 'source', applyRotation, useEleOpacity);\n r.drawText(context, ele, 'target', applyRotation, useEleOpacity);\n }\n } else {\n r.drawText(context, ele, prefix, applyRotation, useEleOpacity);\n }\n if (shiftToOriginWithBb) {\n context.translate(bb.x1, bb.y1);\n }\n};\nCRp$7.getFontCache = function (context) {\n var cache;\n this.fontCaches = this.fontCaches || [];\n for (var i = 0; i < this.fontCaches.length; i++) {\n cache = this.fontCaches[i];\n if (cache.context === context) {\n return cache;\n }\n }\n cache = {\n context: context\n };\n this.fontCaches.push(cache);\n return cache;\n};\n\n// set up canvas context with font\n// returns transformed text string\nCRp$7.setupTextStyle = function (context, ele) {\n var useEleOpacity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n // Font style\n var labelStyle = ele.pstyle('font-style').strValue;\n var labelSize = ele.pstyle('font-size').pfValue + 'px';\n var labelFamily = ele.pstyle('font-family').strValue;\n var labelWeight = ele.pstyle('font-weight').strValue;\n var opacity = useEleOpacity ? ele.effectiveOpacity() * ele.pstyle('text-opacity').value : 1;\n var outlineOpacity = ele.pstyle('text-outline-opacity').value * opacity;\n var color = ele.pstyle('color').value;\n var outlineColor = ele.pstyle('text-outline-color').value;\n context.font = labelStyle + ' ' + labelWeight + ' ' + labelSize + ' ' + labelFamily;\n context.lineJoin = 'round'; // so text outlines aren't jagged\n\n this.colorFillStyle(context, color[0], color[1], color[2], opacity);\n this.colorStrokeStyle(context, outlineColor[0], outlineColor[1], outlineColor[2], outlineOpacity);\n};\nfunction circle(ctx, x, y, width, height) {\n var diameter = Math.min(width, height);\n var radius = diameter / 2;\n var centerX = x + width / 2;\n var centerY = y + height / 2;\n ctx.beginPath();\n ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);\n ctx.closePath();\n}\nfunction roundRect(ctx, x, y, width, height) {\n var radius = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 5;\n var r = Math.min(radius, width / 2, height / 2); // prevent overflow\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + width - r, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + r);\n ctx.lineTo(x + width, y + height - r);\n ctx.quadraticCurveTo(x + width, y + height, x + width - r, y + height);\n ctx.lineTo(x + r, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - r);\n ctx.lineTo(x, y + r);\n ctx.quadraticCurveTo(x, y, x + r, y);\n ctx.closePath();\n}\nCRp$7.getTextAngle = function (ele, prefix) {\n var theta;\n var _p = ele._private;\n var rscratch = _p.rscratch;\n var pdash = prefix ? prefix + '-' : '';\n var rotation = ele.pstyle(pdash + 'text-rotation');\n if (rotation.strValue === 'autorotate') {\n var textAngle = getPrefixedProperty(rscratch, 'labelAngle', prefix);\n theta = ele.isEdge() ? textAngle : 0;\n } else if (rotation.strValue === 'none') {\n theta = 0;\n } else {\n theta = rotation.pfValue;\n }\n return theta;\n};\nCRp$7.drawText = function (context, ele, prefix) {\n var applyRotation = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var useEleOpacity = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var _p = ele._private;\n var rscratch = _p.rscratch;\n var parentOpacity = useEleOpacity ? ele.effectiveOpacity() : 1;\n if (useEleOpacity && (parentOpacity === 0 || ele.pstyle('text-opacity').value === 0)) {\n return;\n }\n\n // use 'main' as an alias for the main label (i.e. null prefix)\n if (prefix === 'main') {\n prefix = null;\n }\n var textX = getPrefixedProperty(rscratch, 'labelX', prefix);\n var textY = getPrefixedProperty(rscratch, 'labelY', prefix);\n var orgTextX, orgTextY; // used for rotation\n var text = this.getLabelText(ele, prefix);\n if (text != null && text !== '' && !isNaN(textX) && !isNaN(textY)) {\n this.setupTextStyle(context, ele, useEleOpacity);\n var pdash = prefix ? prefix + '-' : '';\n var textW = getPrefixedProperty(rscratch, 'labelWidth', prefix);\n var textH = getPrefixedProperty(rscratch, 'labelHeight', prefix);\n var marginX = ele.pstyle(pdash + 'text-margin-x').pfValue;\n var marginY = ele.pstyle(pdash + 'text-margin-y').pfValue;\n var isEdge = ele.isEdge();\n var halign = ele.pstyle('text-halign').value;\n var valign = ele.pstyle('text-valign').value;\n if (isEdge) {\n halign = 'center';\n valign = 'center';\n }\n textX += marginX;\n textY += marginY;\n var theta;\n if (!applyRotation) {\n theta = 0;\n } else {\n theta = this.getTextAngle(ele, prefix);\n }\n if (theta !== 0) {\n orgTextX = textX;\n orgTextY = textY;\n context.translate(orgTextX, orgTextY);\n context.rotate(theta);\n textX = 0;\n textY = 0;\n }\n switch (valign) {\n case 'top':\n break;\n case 'center':\n textY += textH / 2;\n break;\n case 'bottom':\n textY += textH;\n break;\n }\n var backgroundOpacity = ele.pstyle('text-background-opacity').value;\n var borderOpacity = ele.pstyle('text-border-opacity').value;\n var textBorderWidth = ele.pstyle('text-border-width').pfValue;\n var backgroundPadding = ele.pstyle('text-background-padding').pfValue;\n var styleShape = ele.pstyle('text-background-shape').strValue;\n var rounded = styleShape === 'round-rectangle' || styleShape === 'roundrectangle';\n var circled = styleShape === 'circle';\n var roundRadius = 2;\n if (backgroundOpacity > 0 || textBorderWidth > 0 && borderOpacity > 0) {\n var textFill = context.fillStyle;\n var textStroke = context.strokeStyle;\n var textLineWidth = context.lineWidth;\n var textBackgroundColor = ele.pstyle('text-background-color').value;\n var textBorderColor = ele.pstyle('text-border-color').value;\n var textBorderStyle = ele.pstyle('text-border-style').value;\n var doFill = backgroundOpacity > 0;\n var doStroke = textBorderWidth > 0 && borderOpacity > 0;\n var bgX = textX - backgroundPadding;\n switch (halign) {\n case 'left':\n bgX -= textW;\n break;\n case 'center':\n bgX -= textW / 2;\n break;\n }\n var bgY = textY - textH - backgroundPadding;\n var bgW = textW + 2 * backgroundPadding;\n var bgH = textH + 2 * backgroundPadding;\n if (doFill) {\n context.fillStyle = \"rgba(\".concat(textBackgroundColor[0], \",\").concat(textBackgroundColor[1], \",\").concat(textBackgroundColor[2], \",\").concat(backgroundOpacity * parentOpacity, \")\");\n }\n if (doStroke) {\n context.strokeStyle = \"rgba(\".concat(textBorderColor[0], \",\").concat(textBorderColor[1], \",\").concat(textBorderColor[2], \",\").concat(borderOpacity * parentOpacity, \")\");\n context.lineWidth = textBorderWidth;\n if (context.setLineDash) {\n switch (textBorderStyle) {\n case 'dotted':\n context.setLineDash([1, 1]);\n break;\n case 'dashed':\n context.setLineDash([4, 2]);\n break;\n case 'double':\n context.lineWidth = textBorderWidth / 4;\n context.setLineDash([]);\n break;\n case 'solid':\n default:\n context.setLineDash([]);\n break;\n }\n }\n }\n if (rounded) {\n context.beginPath();\n roundRect(context, bgX, bgY, bgW, bgH, roundRadius);\n } else if (circled) {\n context.beginPath();\n circle(context, bgX, bgY, bgW, bgH);\n } else {\n context.beginPath();\n context.rect(bgX, bgY, bgW, bgH);\n }\n if (doFill) context.fill();\n if (doStroke) context.stroke();\n\n // Double border pass for 'double' style\n if (doStroke && textBorderStyle === 'double') {\n var whiteWidth = textBorderWidth / 2;\n context.beginPath();\n if (rounded) {\n roundRect(context, bgX + whiteWidth, bgY + whiteWidth, bgW - 2 * whiteWidth, bgH - 2 * whiteWidth, roundRadius);\n } else {\n context.rect(bgX + whiteWidth, bgY + whiteWidth, bgW - 2 * whiteWidth, bgH - 2 * whiteWidth);\n }\n context.stroke();\n }\n context.fillStyle = textFill;\n context.strokeStyle = textStroke;\n context.lineWidth = textLineWidth;\n if (context.setLineDash) context.setLineDash([]);\n }\n var lineWidth = 2 * ele.pstyle('text-outline-width').pfValue; // *2 b/c the stroke is drawn centred on the middle\n\n if (lineWidth > 0) {\n context.lineWidth = lineWidth;\n }\n if (ele.pstyle('text-wrap').value === 'wrap') {\n var lines = getPrefixedProperty(rscratch, 'labelWrapCachedLines', prefix);\n var lineHeight = getPrefixedProperty(rscratch, 'labelLineHeight', prefix);\n var halfTextW = textW / 2;\n var justification = this.getLabelJustification(ele);\n if (justification === 'auto') ; else if (halign === 'left') {\n // auto justification : right\n if (justification === 'left') {\n textX += -textW;\n } else if (justification === 'center') {\n textX += -halfTextW;\n } // else same as auto\n } else if (halign === 'center') {\n // auto justfication : center\n if (justification === 'left') {\n textX += -halfTextW;\n } else if (justification === 'right') {\n textX += halfTextW;\n } // else same as auto\n } else if (halign === 'right') {\n // auto justification : left\n if (justification === 'center') {\n textX += halfTextW;\n } else if (justification === 'right') {\n textX += textW;\n } // else same as auto\n }\n switch (valign) {\n case 'top':\n textY -= (lines.length - 1) * lineHeight;\n break;\n case 'center':\n case 'bottom':\n textY -= (lines.length - 1) * lineHeight;\n break;\n }\n for (var l = 0; l < lines.length; l++) {\n if (lineWidth > 0) {\n context.strokeText(lines[l], textX, textY);\n }\n context.fillText(lines[l], textX, textY);\n textY += lineHeight;\n }\n } else {\n if (lineWidth > 0) {\n context.strokeText(text, textX, textY);\n }\n context.fillText(text, textX, textY);\n }\n if (theta !== 0) {\n context.rotate(-theta);\n context.translate(-orgTextX, -orgTextY);\n }\n }\n};\n\n/* global Path2D */\n\nvar CRp$6 = {};\nCRp$6.drawNode = function (context, node, shiftToOriginWithBb) {\n var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n var r = this;\n var nodeWidth, nodeHeight;\n var _p = node._private;\n var rs = _p.rscratch;\n var pos = node.position();\n if (!number$1(pos.x) || !number$1(pos.y)) {\n return; // can't draw node with undefined position\n }\n if (shouldDrawOpacity && !node.visible()) {\n return;\n }\n var eleOpacity = shouldDrawOpacity ? node.effectiveOpacity() : 1;\n var usePaths = r.usePaths();\n var path;\n var pathCacheHit = false;\n var padding = node.padding();\n nodeWidth = node.width() + 2 * padding;\n nodeHeight = node.height() + 2 * padding;\n\n //\n // setup shift\n\n var bb;\n if (shiftToOriginWithBb) {\n bb = shiftToOriginWithBb;\n context.translate(-bb.x1, -bb.y1);\n }\n\n //\n // load bg image\n\n var bgImgProp = node.pstyle('background-image');\n var urls = bgImgProp.value;\n var urlDefined = new Array(urls.length);\n var image = new Array(urls.length);\n var numImages = 0;\n for (var i = 0; i < urls.length; i++) {\n var url = urls[i];\n var defd = urlDefined[i] = url != null && url !== 'none';\n if (defd) {\n var bgImgCrossOrigin = node.cy().style().getIndexedStyle(node, 'background-image-crossorigin', 'value', i);\n numImages++;\n\n // get image, and if not loaded then ask to redraw when later loaded\n image[i] = r.getCachedImage(url, bgImgCrossOrigin, function () {\n _p.backgroundTimestamp = Date.now();\n node.emitAndNotify('background');\n });\n }\n }\n\n //\n // setup styles\n\n var darkness = node.pstyle('background-blacken').value;\n var borderWidth = node.pstyle('border-width').pfValue;\n var bgOpacity = node.pstyle('background-opacity').value * eleOpacity;\n var borderColor = node.pstyle('border-color').value;\n var borderStyle = node.pstyle('border-style').value;\n var borderJoin = node.pstyle('border-join').value;\n var borderCap = node.pstyle('border-cap').value;\n var borderPosition = node.pstyle('border-position').value;\n var borderPattern = node.pstyle('border-dash-pattern').pfValue;\n var borderOffset = node.pstyle('border-dash-offset').pfValue;\n var borderOpacity = node.pstyle('border-opacity').value * eleOpacity;\n var outlineWidth = node.pstyle('outline-width').pfValue;\n var outlineColor = node.pstyle('outline-color').value;\n var outlineStyle = node.pstyle('outline-style').value;\n var outlineOpacity = node.pstyle('outline-opacity').value * eleOpacity;\n var outlineOffset = node.pstyle('outline-offset').value;\n var cornerRadius = node.pstyle('corner-radius').value;\n if (cornerRadius !== 'auto') cornerRadius = node.pstyle('corner-radius').pfValue;\n var setupShapeColor = function setupShapeColor() {\n var bgOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : bgOpacity;\n r.eleFillStyle(context, node, bgOpy);\n };\n var setupBorderColor = function setupBorderColor() {\n var bdrOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : borderOpacity;\n r.colorStrokeStyle(context, borderColor[0], borderColor[1], borderColor[2], bdrOpy);\n };\n var setupOutlineColor = function setupOutlineColor() {\n var otlnOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : outlineOpacity;\n r.colorStrokeStyle(context, outlineColor[0], outlineColor[1], outlineColor[2], otlnOpy);\n };\n\n //\n // setup shape\n\n var getPath = function getPath(width, height, shape, points) {\n var pathCache = r.nodePathCache = r.nodePathCache || [];\n var key = hashStrings(shape === 'polygon' ? shape + ',' + points.join(',') : shape, '' + height, '' + width, '' + cornerRadius);\n var cachedPath = pathCache[key];\n var path;\n var cacheHit = false;\n if (cachedPath != null) {\n path = cachedPath;\n cacheHit = true;\n rs.pathCache = path;\n } else {\n path = new Path2D();\n pathCache[key] = rs.pathCache = path;\n }\n return {\n path: path,\n cacheHit: cacheHit\n };\n };\n var styleShape = node.pstyle('shape').strValue;\n var shapePts = node.pstyle('shape-polygon-points').pfValue;\n if (usePaths) {\n context.translate(pos.x, pos.y);\n var shapePath = getPath(nodeWidth, nodeHeight, styleShape, shapePts);\n path = shapePath.path;\n pathCacheHit = shapePath.cacheHit;\n }\n var drawShape = function drawShape() {\n if (!pathCacheHit) {\n var npos = pos;\n if (usePaths) {\n npos = {\n x: 0,\n y: 0\n };\n }\n r.nodeShapes[r.getNodeShape(node)].draw(path || context, npos.x, npos.y, nodeWidth, nodeHeight, cornerRadius, rs);\n }\n if (usePaths) {\n context.fill(path);\n } else {\n context.fill();\n }\n };\n var drawImages = function drawImages() {\n var nodeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity;\n var inside = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var prevBging = _p.backgrounding;\n var totalCompleted = 0;\n for (var _i = 0; _i < image.length; _i++) {\n var bgContainment = node.cy().style().getIndexedStyle(node, 'background-image-containment', 'value', _i);\n if (inside && bgContainment === 'over' || !inside && bgContainment === 'inside') {\n totalCompleted++;\n continue;\n }\n if (urlDefined[_i] && image[_i].complete && !image[_i].error) {\n totalCompleted++;\n r.drawInscribedImage(context, image[_i], node, _i, nodeOpacity);\n }\n }\n _p.backgrounding = !(totalCompleted === numImages);\n if (prevBging !== _p.backgrounding) {\n // update style b/c :backgrounding state changed\n node.updateStyle(false);\n }\n };\n var drawPie = function drawPie() {\n var redrawShape = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var pieOpacity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : eleOpacity;\n if (r.hasPie(node)) {\n r.drawPie(context, node, pieOpacity);\n\n // redraw/restore path if steps after pie need it\n if (redrawShape) {\n if (!usePaths) {\n r.nodeShapes[r.getNodeShape(node)].draw(context, pos.x, pos.y, nodeWidth, nodeHeight, cornerRadius, rs);\n }\n }\n }\n };\n var drawStripe = function drawStripe() {\n var redrawShape = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var stripeOpacity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : eleOpacity;\n if (r.hasStripe(node)) {\n context.save();\n if (usePaths) {\n context.clip(rs.pathCache);\n } else {\n r.nodeShapes[r.getNodeShape(node)].draw(context, pos.x, pos.y, nodeWidth, nodeHeight, cornerRadius, rs);\n context.clip();\n }\n r.drawStripe(context, node, stripeOpacity);\n context.restore();\n\n // redraw/restore path if steps after stripes need it\n if (redrawShape) {\n if (!usePaths) {\n r.nodeShapes[r.getNodeShape(node)].draw(context, pos.x, pos.y, nodeWidth, nodeHeight, cornerRadius, rs);\n }\n }\n }\n };\n var darken = function darken() {\n var darkenOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity;\n var opacity = (darkness > 0 ? darkness : -darkness) * darkenOpacity;\n var c = darkness > 0 ? 0 : 255;\n if (darkness !== 0) {\n r.colorFillStyle(context, c, c, c, opacity);\n if (usePaths) {\n context.fill(path);\n } else {\n context.fill();\n }\n }\n };\n var drawBorder = function drawBorder() {\n if (borderWidth > 0) {\n context.lineWidth = borderWidth;\n context.lineCap = borderCap;\n context.lineJoin = borderJoin;\n if (context.setLineDash) {\n // for very outofdate browsers\n switch (borderStyle) {\n case 'dotted':\n context.setLineDash([1, 1]);\n break;\n case 'dashed':\n context.setLineDash(borderPattern);\n context.lineDashOffset = borderOffset;\n break;\n case 'solid':\n case 'double':\n context.setLineDash([]);\n break;\n }\n }\n if (borderPosition !== 'center') {\n context.save();\n context.lineWidth *= 2;\n if (borderPosition === 'inside') {\n usePaths ? context.clip(path) : context.clip();\n } else {\n var region = new Path2D();\n region.rect(-nodeWidth / 2 - borderWidth, -nodeHeight / 2 - borderWidth, nodeWidth + 2 * borderWidth, nodeHeight + 2 * borderWidth);\n region.addPath(path);\n context.clip(region, 'evenodd');\n }\n usePaths ? context.stroke(path) : context.stroke();\n context.restore();\n } else {\n usePaths ? context.stroke(path) : context.stroke();\n }\n if (borderStyle === 'double') {\n context.lineWidth = borderWidth / 3;\n var gco = context.globalCompositeOperation;\n context.globalCompositeOperation = 'destination-out';\n if (usePaths) {\n context.stroke(path);\n } else {\n context.stroke();\n }\n context.globalCompositeOperation = gco;\n }\n\n // reset in case we changed the border style\n if (context.setLineDash) {\n // for very outofdate browsers\n context.setLineDash([]);\n }\n }\n };\n var drawOutline = function drawOutline() {\n if (outlineWidth > 0) {\n context.lineWidth = outlineWidth;\n context.lineCap = 'butt';\n if (context.setLineDash) {\n // for very outofdate browsers\n switch (outlineStyle) {\n case 'dotted':\n context.setLineDash([1, 1]);\n break;\n case 'dashed':\n context.setLineDash([4, 2]);\n break;\n case 'solid':\n case 'double':\n context.setLineDash([]);\n break;\n }\n }\n var npos = pos;\n if (usePaths) {\n npos = {\n x: 0,\n y: 0\n };\n }\n var shape = r.getNodeShape(node);\n var bWidth = borderWidth;\n if (borderPosition === 'inside') bWidth = 0;\n if (borderPosition === 'outside') bWidth *= 2;\n var scaleX = (nodeWidth + bWidth + (outlineWidth + outlineOffset)) / nodeWidth;\n var scaleY = (nodeHeight + bWidth + (outlineWidth + outlineOffset)) / nodeHeight;\n var sWidth = nodeWidth * scaleX;\n var sHeight = nodeHeight * scaleY;\n var points = r.nodeShapes[shape].points;\n var _path;\n if (usePaths) {\n var outlinePath = getPath(sWidth, sHeight, shape, points);\n _path = outlinePath.path;\n }\n\n // draw the outline path, either by using expanded points or by scaling \n // the dimensions, depending on shape\n if (shape === \"ellipse\") {\n r.drawEllipsePath(_path || context, npos.x, npos.y, sWidth, sHeight);\n } else if (['round-diamond', 'round-heptagon', 'round-hexagon', 'round-octagon', 'round-pentagon', 'round-polygon', 'round-triangle', 'round-tag'].includes(shape)) {\n var sMult = 0;\n var offsetX = 0;\n var offsetY = 0;\n if (shape === 'round-diamond') {\n sMult = (bWidth + outlineOffset + outlineWidth) * 1.4;\n } else if (shape === 'round-heptagon') {\n sMult = (bWidth + outlineOffset + outlineWidth) * 1.075;\n offsetY = -(bWidth / 2 + outlineOffset + outlineWidth) / 35;\n } else if (shape === 'round-hexagon') {\n sMult = (bWidth + outlineOffset + outlineWidth) * 1.12;\n } else if (shape === 'round-pentagon') {\n sMult = (bWidth + outlineOffset + outlineWidth) * 1.13;\n offsetY = -(bWidth / 2 + outlineOffset + outlineWidth) / 15;\n } else if (shape === 'round-tag') {\n sMult = (bWidth + outlineOffset + outlineWidth) * 1.12;\n offsetX = (bWidth / 2 + outlineWidth + outlineOffset) * .07;\n } else if (shape === 'round-triangle') {\n sMult = (bWidth + outlineOffset + outlineWidth) * (Math.PI / 2);\n offsetY = -(bWidth + outlineOffset / 2 + outlineWidth) / Math.PI;\n }\n if (sMult !== 0) {\n scaleX = (nodeWidth + sMult) / nodeWidth;\n sWidth = nodeWidth * scaleX;\n if (!['round-hexagon', 'round-tag'].includes(shape)) {\n scaleY = (nodeHeight + sMult) / nodeHeight;\n sHeight = nodeHeight * scaleY;\n }\n }\n cornerRadius = cornerRadius === 'auto' ? getRoundPolygonRadius(sWidth, sHeight) : cornerRadius;\n var halfW = sWidth / 2;\n var halfH = sHeight / 2;\n var radius = cornerRadius + (bWidth + outlineWidth + outlineOffset) / 2;\n var p = new Array(points.length / 2);\n var corners = new Array(points.length / 2);\n for (var _i2 = 0; _i2 < points.length / 2; _i2++) {\n p[_i2] = {\n x: npos.x + offsetX + halfW * points[_i2 * 2],\n y: npos.y + offsetY + halfH * points[_i2 * 2 + 1]\n };\n }\n var _i3,\n p1,\n p2,\n p3,\n len = p.length;\n p1 = p[len - 1];\n // for each point\n for (_i3 = 0; _i3 < len; _i3++) {\n p2 = p[_i3 % len];\n p3 = p[(_i3 + 1) % len];\n corners[_i3] = getRoundCorner(p1, p2, p3, radius);\n p1 = p2;\n p2 = p3;\n }\n r.drawRoundPolygonPath(_path || context, npos.x + offsetX, npos.y + offsetY, nodeWidth * scaleX, nodeHeight * scaleY, points, corners);\n } else if (['roundrectangle', 'round-rectangle'].includes(shape)) {\n cornerRadius = cornerRadius === 'auto' ? getRoundRectangleRadius(sWidth, sHeight) : cornerRadius;\n r.drawRoundRectanglePath(_path || context, npos.x, npos.y, sWidth, sHeight, cornerRadius + (bWidth + outlineWidth + outlineOffset) / 2);\n } else if (['cutrectangle', 'cut-rectangle'].includes(shape)) {\n cornerRadius = cornerRadius === 'auto' ? getCutRectangleCornerLength() : cornerRadius;\n r.drawCutRectanglePath(_path || context, npos.x, npos.y, sWidth, sHeight, null, cornerRadius + (bWidth + outlineWidth + outlineOffset) / 4);\n } else if (['bottomroundrectangle', 'bottom-round-rectangle'].includes(shape)) {\n cornerRadius = cornerRadius === 'auto' ? getRoundRectangleRadius(sWidth, sHeight) : cornerRadius;\n r.drawBottomRoundRectanglePath(_path || context, npos.x, npos.y, sWidth, sHeight, cornerRadius + (bWidth + outlineWidth + outlineOffset) / 2);\n } else if (shape === \"barrel\") {\n r.drawBarrelPath(_path || context, npos.x, npos.y, sWidth, sHeight);\n } else if (shape.startsWith(\"polygon\") || ['rhomboid', 'right-rhomboid', 'round-tag', 'tag', 'vee'].includes(shape)) {\n var pad = (bWidth + outlineWidth + outlineOffset) / nodeWidth;\n points = joinLines(expandPolygon(points, pad));\n r.drawPolygonPath(_path || context, npos.x, npos.y, nodeWidth, nodeHeight, points);\n } else {\n var _pad = (bWidth + outlineWidth + outlineOffset) / nodeWidth;\n points = joinLines(expandPolygon(points, -_pad));\n r.drawPolygonPath(_path || context, npos.x, npos.y, nodeWidth, nodeHeight, points);\n }\n if (usePaths) {\n context.stroke(_path);\n } else {\n context.stroke();\n }\n if (outlineStyle === 'double') {\n context.lineWidth = bWidth / 3;\n var gco = context.globalCompositeOperation;\n context.globalCompositeOperation = 'destination-out';\n if (usePaths) {\n context.stroke(_path);\n } else {\n context.stroke();\n }\n context.globalCompositeOperation = gco;\n }\n\n // reset in case we changed the border style\n if (context.setLineDash) {\n // for very outofdate browsers\n context.setLineDash([]);\n }\n }\n };\n var drawOverlay = function drawOverlay() {\n if (shouldDrawOverlay) {\n r.drawNodeOverlay(context, node, pos, nodeWidth, nodeHeight);\n }\n };\n var drawUnderlay = function drawUnderlay() {\n if (shouldDrawOverlay) {\n r.drawNodeUnderlay(context, node, pos, nodeWidth, nodeHeight);\n }\n };\n var drawText = function drawText() {\n r.drawElementText(context, node, null, drawLabel);\n };\n var ghost = node.pstyle('ghost').value === 'yes';\n if (ghost) {\n var gx = node.pstyle('ghost-offset-x').pfValue;\n var gy = node.pstyle('ghost-offset-y').pfValue;\n var ghostOpacity = node.pstyle('ghost-opacity').value;\n var effGhostOpacity = ghostOpacity * eleOpacity;\n context.translate(gx, gy);\n setupOutlineColor();\n drawOutline();\n setupShapeColor(ghostOpacity * bgOpacity);\n drawShape();\n drawImages(effGhostOpacity, true);\n setupBorderColor(ghostOpacity * borderOpacity);\n drawBorder();\n drawPie(darkness !== 0 || borderWidth !== 0);\n drawStripe(darkness !== 0 || borderWidth !== 0);\n drawImages(effGhostOpacity, false);\n darken(effGhostOpacity);\n context.translate(-gx, -gy);\n }\n if (usePaths) {\n context.translate(-pos.x, -pos.y);\n }\n drawUnderlay();\n if (usePaths) {\n context.translate(pos.x, pos.y);\n }\n setupOutlineColor();\n drawOutline();\n setupShapeColor();\n drawShape();\n drawImages(eleOpacity, true);\n setupBorderColor();\n drawBorder();\n drawPie(darkness !== 0 || borderWidth !== 0);\n drawStripe(darkness !== 0 || borderWidth !== 0);\n drawImages(eleOpacity, false);\n darken();\n if (usePaths) {\n context.translate(-pos.x, -pos.y);\n }\n drawText();\n drawOverlay();\n\n //\n // clean up shift\n\n if (shiftToOriginWithBb) {\n context.translate(bb.x1, bb.y1);\n }\n};\nvar drawNodeOverlayUnderlay = function drawNodeOverlayUnderlay(overlayOrUnderlay) {\n if (!['overlay', 'underlay'].includes(overlayOrUnderlay)) {\n throw new Error('Invalid state');\n }\n return function (context, node, pos, nodeWidth, nodeHeight) {\n var r = this;\n if (!node.visible()) {\n return;\n }\n var padding = node.pstyle(\"\".concat(overlayOrUnderlay, \"-padding\")).pfValue;\n var opacity = node.pstyle(\"\".concat(overlayOrUnderlay, \"-opacity\")).value;\n var color = node.pstyle(\"\".concat(overlayOrUnderlay, \"-color\")).value;\n var shape = node.pstyle(\"\".concat(overlayOrUnderlay, \"-shape\")).value;\n var radius = node.pstyle(\"\".concat(overlayOrUnderlay, \"-corner-radius\")).value;\n if (opacity > 0) {\n pos = pos || node.position();\n if (nodeWidth == null || nodeHeight == null) {\n var _padding = node.padding();\n nodeWidth = node.width() + 2 * _padding;\n nodeHeight = node.height() + 2 * _padding;\n }\n r.colorFillStyle(context, color[0], color[1], color[2], opacity);\n r.nodeShapes[shape].draw(context, pos.x, pos.y, nodeWidth + padding * 2, nodeHeight + padding * 2, radius);\n context.fill();\n }\n };\n};\nCRp$6.drawNodeOverlay = drawNodeOverlayUnderlay('overlay');\nCRp$6.drawNodeUnderlay = drawNodeOverlayUnderlay('underlay');\n\n// does the node have at least one pie piece?\nCRp$6.hasPie = function (node) {\n node = node[0]; // ensure ele ref\n\n return node._private.hasPie;\n};\nCRp$6.hasStripe = function (node) {\n node = node[0]; // ensure ele ref\n\n return node._private.hasStripe;\n};\nCRp$6.drawPie = function (context, node, nodeOpacity, pos) {\n node = node[0]; // ensure ele ref\n pos = pos || node.position();\n var cyStyle = node.cy().style();\n var pieSize = node.pstyle('pie-size');\n var hole = node.pstyle('pie-hole');\n var overallStartAngle = node.pstyle('pie-start-angle').pfValue;\n var x = pos.x;\n var y = pos.y;\n var nodeW = node.width();\n var nodeH = node.height();\n var radius = Math.min(nodeW, nodeH) / 2; // must fit in node\n var holeRadius;\n var lastPercent = 0; // what % to continue drawing pie slices from on [0, 1]\n var usePaths = this.usePaths();\n if (usePaths) {\n x = 0;\n y = 0;\n }\n if (pieSize.units === '%') {\n radius = radius * pieSize.pfValue;\n } else if (pieSize.pfValue !== undefined) {\n radius = pieSize.pfValue / 2; // diameter in pixels => radius\n }\n if (hole.units === '%') {\n holeRadius = radius * hole.pfValue;\n } else if (hole.pfValue !== undefined) {\n holeRadius = hole.pfValue / 2; // diameter in pixels => radius\n }\n if (holeRadius >= radius) {\n return; // the pie would be invisible anyway\n }\n for (var i = 1; i <= cyStyle.pieBackgroundN; i++) {\n // 1..N\n var size = node.pstyle('pie-' + i + '-background-size').value;\n var color = node.pstyle('pie-' + i + '-background-color').value;\n var opacity = node.pstyle('pie-' + i + '-background-opacity').value * nodeOpacity;\n var percent = size / 100; // map integer range [0, 100] to [0, 1]\n\n // percent can't push beyond 1\n if (percent + lastPercent > 1) {\n percent = 1 - lastPercent;\n }\n var angleStart = 1.5 * Math.PI + 2 * Math.PI * lastPercent; // start at 12 o'clock and go clockwise\n angleStart += overallStartAngle; // shift by the overall pie start angle\n var angleDelta = 2 * Math.PI * percent;\n var angleEnd = angleStart + angleDelta;\n\n // ignore if\n // - zero size\n // - we're already beyond the full circle\n // - adding the current slice would go beyond the full circle\n if (size === 0 || lastPercent >= 1 || lastPercent + percent > 1) {\n continue;\n }\n if (holeRadius === 0) {\n // make a pie slice\n context.beginPath();\n context.moveTo(x, y);\n context.arc(x, y, radius, angleStart, angleEnd);\n context.closePath();\n } else {\n // make a pie slice that's like the above but with a hole in the middle\n context.beginPath();\n context.arc(x, y, radius, angleStart, angleEnd);\n context.arc(x, y, holeRadius, angleEnd, angleStart, true); // true for anticlockwise\n context.closePath();\n }\n this.colorFillStyle(context, color[0], color[1], color[2], opacity);\n context.fill();\n lastPercent += percent;\n }\n};\nCRp$6.drawStripe = function (context, node, nodeOpacity, pos) {\n node = node[0]; // ensure ele ref\n pos = pos || node.position();\n var cyStyle = node.cy().style();\n var x = pos.x;\n var y = pos.y;\n var nodeW = node.width();\n var nodeH = node.height();\n var lastPercent = 0; // what % to continue drawing pie slices from on [0, 1]\n var usePaths = this.usePaths();\n context.save();\n var direction = node.pstyle('stripe-direction').value;\n var stripeSize = node.pstyle('stripe-size');\n switch (direction) {\n case 'vertical':\n break;\n // default\n case 'righward':\n context.rotate(-Math.PI / 2);\n break;\n }\n var stripeW = nodeW;\n var stripeH = nodeH;\n if (stripeSize.units === '%') {\n stripeW = stripeW * stripeSize.pfValue;\n stripeH = stripeH * stripeSize.pfValue;\n } else if (stripeSize.pfValue !== undefined) {\n stripeW = stripeSize.pfValue;\n stripeH = stripeSize.pfValue;\n }\n if (usePaths) {\n x = 0;\n y = 0;\n }\n\n // shift up from the centre of the node to the top-left corner\n y -= stripeW / 2;\n x -= stripeH / 2;\n for (var i = 1; i <= cyStyle.stripeBackgroundN; i++) {\n // 1..N\n var size = node.pstyle('stripe-' + i + '-background-size').value;\n var color = node.pstyle('stripe-' + i + '-background-color').value;\n var opacity = node.pstyle('stripe-' + i + '-background-opacity').value * nodeOpacity;\n var percent = size / 100; // map integer range [0, 100] to [0, 1]\n\n // percent can't push beyond 1\n if (percent + lastPercent > 1) {\n percent = 1 - lastPercent;\n }\n\n // ignore if\n // - zero size\n // - we're already beyond the full chart\n // - adding the current slice would go beyond the full chart\n if (size === 0 || lastPercent >= 1 || lastPercent + percent > 1) {\n continue;\n }\n\n // draw rect for the current stripe\n context.beginPath();\n context.rect(x, y + stripeH * lastPercent, stripeW, stripeH * percent);\n context.closePath();\n this.colorFillStyle(context, color[0], color[1], color[2], opacity);\n context.fill();\n lastPercent += percent;\n }\n context.restore();\n};\n\nvar CRp$5 = {};\nvar motionBlurDelay = 100;\n\n// var isFirefox = typeof InstallTrigger !== 'undefined';\n\nCRp$5.getPixelRatio = function () {\n var context = this.data.contexts[0];\n if (this.forcedPixelRatio != null) {\n return this.forcedPixelRatio;\n }\n var containerWindow = this.cy.window();\n var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1;\n return (containerWindow.devicePixelRatio || 1) / backingStore; // eslint-disable-line no-undef\n};\nCRp$5.paintCache = function (context) {\n var caches = this.paintCaches = this.paintCaches || [];\n var needToCreateCache = true;\n var cache;\n for (var i = 0; i < caches.length; i++) {\n cache = caches[i];\n if (cache.context === context) {\n needToCreateCache = false;\n break;\n }\n }\n if (needToCreateCache) {\n cache = {\n context: context\n };\n caches.push(cache);\n }\n return cache;\n};\nCRp$5.createGradientStyleFor = function (context, shapeStyleName, ele, fill, opacity) {\n var gradientStyle;\n var usePaths = this.usePaths();\n var colors = ele.pstyle(shapeStyleName + '-gradient-stop-colors').value,\n positions = ele.pstyle(shapeStyleName + '-gradient-stop-positions').pfValue;\n if (fill === 'radial-gradient') {\n if (ele.isEdge()) {\n var start = ele.sourceEndpoint(),\n end = ele.targetEndpoint(),\n mid = ele.midpoint();\n var d1 = dist(start, mid);\n var d2 = dist(end, mid);\n gradientStyle = context.createRadialGradient(mid.x, mid.y, 0, mid.x, mid.y, Math.max(d1, d2));\n } else {\n var pos = usePaths ? {\n x: 0,\n y: 0\n } : ele.position(),\n width = ele.paddedWidth(),\n height = ele.paddedHeight();\n gradientStyle = context.createRadialGradient(pos.x, pos.y, 0, pos.x, pos.y, Math.max(width, height));\n }\n } else {\n if (ele.isEdge()) {\n var _start = ele.sourceEndpoint(),\n _end = ele.targetEndpoint();\n gradientStyle = context.createLinearGradient(_start.x, _start.y, _end.x, _end.y);\n } else {\n var _pos = usePaths ? {\n x: 0,\n y: 0\n } : ele.position(),\n _width = ele.paddedWidth(),\n _height = ele.paddedHeight(),\n halfWidth = _width / 2,\n halfHeight = _height / 2;\n var direction = ele.pstyle('background-gradient-direction').value;\n switch (direction) {\n case 'to-bottom':\n gradientStyle = context.createLinearGradient(_pos.x, _pos.y - halfHeight, _pos.x, _pos.y + halfHeight);\n break;\n case 'to-top':\n gradientStyle = context.createLinearGradient(_pos.x, _pos.y + halfHeight, _pos.x, _pos.y - halfHeight);\n break;\n case 'to-left':\n gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y, _pos.x - halfWidth, _pos.y);\n break;\n case 'to-right':\n gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y, _pos.x + halfWidth, _pos.y);\n break;\n case 'to-bottom-right':\n case 'to-right-bottom':\n gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y - halfHeight, _pos.x + halfWidth, _pos.y + halfHeight);\n break;\n case 'to-top-right':\n case 'to-right-top':\n gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y + halfHeight, _pos.x + halfWidth, _pos.y - halfHeight);\n break;\n case 'to-bottom-left':\n case 'to-left-bottom':\n gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y - halfHeight, _pos.x - halfWidth, _pos.y + halfHeight);\n break;\n case 'to-top-left':\n case 'to-left-top':\n gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y + halfHeight, _pos.x - halfWidth, _pos.y - halfHeight);\n break;\n }\n }\n }\n if (!gradientStyle) return null; // invalid gradient style\n\n var hasPositions = positions.length === colors.length;\n var length = colors.length;\n for (var i = 0; i < length; i++) {\n gradientStyle.addColorStop(hasPositions ? positions[i] : i / (length - 1), 'rgba(' + colors[i][0] + ',' + colors[i][1] + ',' + colors[i][2] + ',' + opacity + ')');\n }\n return gradientStyle;\n};\nCRp$5.gradientFillStyle = function (context, ele, fill, opacity) {\n var gradientStyle = this.createGradientStyleFor(context, 'background', ele, fill, opacity);\n if (!gradientStyle) return null; // error\n context.fillStyle = gradientStyle;\n};\nCRp$5.colorFillStyle = function (context, r, g, b, a) {\n context.fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n // turn off for now, seems context does its own caching\n\n // var cache = this.paintCache(context);\n\n // var fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n\n // if( cache.fillStyle !== fillStyle ){\n // context.fillStyle = cache.fillStyle = fillStyle;\n // }\n};\nCRp$5.eleFillStyle = function (context, ele, opacity) {\n var backgroundFill = ele.pstyle('background-fill').value;\n if (backgroundFill === 'linear-gradient' || backgroundFill === 'radial-gradient') {\n this.gradientFillStyle(context, ele, backgroundFill, opacity);\n } else {\n var backgroundColor = ele.pstyle('background-color').value;\n this.colorFillStyle(context, backgroundColor[0], backgroundColor[1], backgroundColor[2], opacity);\n }\n};\nCRp$5.gradientStrokeStyle = function (context, ele, fill, opacity) {\n var gradientStyle = this.createGradientStyleFor(context, 'line', ele, fill, opacity);\n if (!gradientStyle) return null; // error\n context.strokeStyle = gradientStyle;\n};\nCRp$5.colorStrokeStyle = function (context, r, g, b, a) {\n context.strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n // turn off for now, seems context does its own caching\n\n // var cache = this.paintCache(context);\n\n // var strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n\n // if( cache.strokeStyle !== strokeStyle ){\n // context.strokeStyle = cache.strokeStyle = strokeStyle;\n // }\n};\nCRp$5.eleStrokeStyle = function (context, ele, opacity) {\n var lineFill = ele.pstyle('line-fill').value;\n if (lineFill === 'linear-gradient' || lineFill === 'radial-gradient') {\n this.gradientStrokeStyle(context, ele, lineFill, opacity);\n } else {\n var lineColor = ele.pstyle('line-color').value;\n this.colorStrokeStyle(context, lineColor[0], lineColor[1], lineColor[2], opacity);\n }\n};\n\n// Resize canvas\nCRp$5.matchCanvasSize = function (container) {\n var r = this;\n var data = r.data;\n var bb = r.findContainerClientCoords();\n var width = bb[2];\n var height = bb[3];\n var pixelRatio = r.getPixelRatio();\n var mbPxRatio = r.motionBlurPxRatio;\n if (container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE] || container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG]) {\n pixelRatio = mbPxRatio;\n }\n var canvasWidth = width * pixelRatio;\n var canvasHeight = height * pixelRatio;\n var canvas;\n if (canvasWidth === r.canvasWidth && canvasHeight === r.canvasHeight) {\n return; // save cycles if same\n }\n r.fontCaches = null; // resizing resets the style\n\n var canvasContainer = data.canvasContainer;\n canvasContainer.style.width = width + 'px';\n canvasContainer.style.height = height + 'px';\n for (var i = 0; i < r.CANVAS_LAYERS; i++) {\n canvas = data.canvases[i];\n canvas.width = canvasWidth;\n canvas.height = canvasHeight;\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n }\n for (var i = 0; i < r.BUFFER_COUNT; i++) {\n canvas = data.bufferCanvases[i];\n canvas.width = canvasWidth;\n canvas.height = canvasHeight;\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n }\n r.textureMult = 1;\n if (pixelRatio <= 1) {\n canvas = data.bufferCanvases[r.TEXTURE_BUFFER];\n r.textureMult = 2;\n canvas.width = canvasWidth * r.textureMult;\n canvas.height = canvasHeight * r.textureMult;\n }\n r.canvasWidth = canvasWidth;\n r.canvasHeight = canvasHeight;\n r.pixelRatio = pixelRatio;\n};\nCRp$5.renderTo = function (cxt, zoom, pan, pxRatio) {\n this.render({\n forcedContext: cxt,\n forcedZoom: zoom,\n forcedPan: pan,\n drawAllLayers: true,\n forcedPxRatio: pxRatio\n });\n};\nCRp$5.clearCanvas = function () {\n var r = this;\n var data = r.data;\n function clear(context) {\n context.clearRect(0, 0, r.canvasWidth, r.canvasHeight);\n }\n clear(data.contexts[r.NODE]);\n clear(data.contexts[r.DRAG]);\n};\nCRp$5.render = function (options) {\n var r = this;\n options = options || staticEmptyObject();\n var cy = r.cy;\n var forcedContext = options.forcedContext;\n var drawAllLayers = options.drawAllLayers;\n var drawOnlyNodeLayer = options.drawOnlyNodeLayer;\n var forcedZoom = options.forcedZoom;\n var forcedPan = options.forcedPan;\n var pixelRatio = options.forcedPxRatio === undefined ? this.getPixelRatio() : options.forcedPxRatio;\n var data = r.data;\n var needDraw = data.canvasNeedsRedraw;\n var textureDraw = r.textureOnViewport && !forcedContext && (r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming);\n var motionBlur = options.motionBlur !== undefined ? options.motionBlur : r.motionBlur;\n var mbPxRatio = r.motionBlurPxRatio;\n var hasCompoundNodes = cy.hasCompoundNodes();\n var inNodeDragGesture = r.hoverData.draggingEles;\n var inBoxSelection = r.hoverData.selecting || r.touchData.selecting ? true : false;\n motionBlur = motionBlur && !forcedContext && r.motionBlurEnabled && !inBoxSelection;\n var motionBlurFadeEffect = motionBlur;\n if (!forcedContext) {\n if (r.prevPxRatio !== pixelRatio) {\n r.invalidateContainerClientCoordsCache();\n r.matchCanvasSize(r.container);\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n }\n r.prevPxRatio = pixelRatio;\n }\n if (!forcedContext && r.motionBlurTimeout) {\n clearTimeout(r.motionBlurTimeout);\n }\n if (motionBlur) {\n if (r.mbFrames == null) {\n r.mbFrames = 0;\n }\n r.mbFrames++;\n if (r.mbFrames < 3) {\n // need several frames before even high quality motionblur\n motionBlurFadeEffect = false;\n }\n\n // go to lower quality blurry frames when several m/b frames have been rendered (avoids flashing)\n if (r.mbFrames > r.minMbLowQualFrames) {\n //r.fullQualityMb = false;\n r.motionBlurPxRatio = r.mbPxRBlurry;\n }\n }\n if (r.clearingMotionBlur) {\n r.motionBlurPxRatio = 1;\n }\n\n // b/c drawToContext() may be async w.r.t. redraw(), keep track of last texture frame\n // because a rogue async texture frame would clear needDraw\n if (r.textureDrawLastFrame && !textureDraw) {\n needDraw[r.NODE] = true;\n needDraw[r.SELECT_BOX] = true;\n }\n var style = cy.style();\n var zoom = cy.zoom();\n var effectiveZoom = forcedZoom !== undefined ? forcedZoom : zoom;\n var pan = cy.pan();\n var effectivePan = {\n x: pan.x,\n y: pan.y\n };\n var vp = {\n zoom: zoom,\n pan: {\n x: pan.x,\n y: pan.y\n }\n };\n var prevVp = r.prevViewport;\n var viewportIsDiff = prevVp === undefined || vp.zoom !== prevVp.zoom || vp.pan.x !== prevVp.pan.x || vp.pan.y !== prevVp.pan.y;\n\n // we want the low quality motionblur only when the viewport is being manipulated etc (where it's not noticed)\n if (!viewportIsDiff && !(inNodeDragGesture && !hasCompoundNodes)) {\n r.motionBlurPxRatio = 1;\n }\n if (forcedPan) {\n effectivePan = forcedPan;\n }\n\n // apply pixel ratio\n\n effectiveZoom *= pixelRatio;\n effectivePan.x *= pixelRatio;\n effectivePan.y *= pixelRatio;\n var eles = r.getCachedZSortedEles();\n function mbclear(context, x, y, w, h) {\n var gco = context.globalCompositeOperation;\n context.globalCompositeOperation = 'destination-out';\n r.colorFillStyle(context, 255, 255, 255, r.motionBlurTransparency);\n context.fillRect(x, y, w, h);\n context.globalCompositeOperation = gco;\n }\n function setContextTransform(context, clear) {\n var ePan, eZoom, w, h;\n if (!r.clearingMotionBlur && (context === data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] || context === data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG])) {\n ePan = {\n x: pan.x * mbPxRatio,\n y: pan.y * mbPxRatio\n };\n eZoom = zoom * mbPxRatio;\n w = r.canvasWidth * mbPxRatio;\n h = r.canvasHeight * mbPxRatio;\n } else {\n ePan = effectivePan;\n eZoom = effectiveZoom;\n w = r.canvasWidth;\n h = r.canvasHeight;\n }\n context.setTransform(1, 0, 0, 1, 0, 0);\n if (clear === 'motionBlur') {\n mbclear(context, 0, 0, w, h);\n } else if (!forcedContext && (clear === undefined || clear)) {\n context.clearRect(0, 0, w, h);\n }\n if (!drawAllLayers) {\n context.translate(ePan.x, ePan.y);\n context.scale(eZoom, eZoom);\n }\n if (forcedPan) {\n context.translate(forcedPan.x, forcedPan.y);\n }\n if (forcedZoom) {\n context.scale(forcedZoom, forcedZoom);\n }\n }\n if (!textureDraw) {\n r.textureDrawLastFrame = false;\n }\n if (textureDraw) {\n r.textureDrawLastFrame = true;\n if (!r.textureCache) {\n r.textureCache = {};\n r.textureCache.bb = cy.mutableElements().boundingBox();\n r.textureCache.texture = r.data.bufferCanvases[r.TEXTURE_BUFFER];\n var cxt = r.data.bufferContexts[r.TEXTURE_BUFFER];\n cxt.setTransform(1, 0, 0, 1, 0, 0);\n cxt.clearRect(0, 0, r.canvasWidth * r.textureMult, r.canvasHeight * r.textureMult);\n r.render({\n forcedContext: cxt,\n drawOnlyNodeLayer: true,\n forcedPxRatio: pixelRatio * r.textureMult\n });\n var vp = r.textureCache.viewport = {\n zoom: cy.zoom(),\n pan: cy.pan(),\n width: r.canvasWidth,\n height: r.canvasHeight\n };\n vp.mpan = {\n x: (0 - vp.pan.x) / vp.zoom,\n y: (0 - vp.pan.y) / vp.zoom\n };\n }\n needDraw[r.DRAG] = false;\n needDraw[r.NODE] = false;\n var context = data.contexts[r.NODE];\n var texture = r.textureCache.texture;\n var vp = r.textureCache.viewport;\n context.setTransform(1, 0, 0, 1, 0, 0);\n if (motionBlur) {\n mbclear(context, 0, 0, vp.width, vp.height);\n } else {\n context.clearRect(0, 0, vp.width, vp.height);\n }\n var outsideBgColor = style.core('outside-texture-bg-color').value;\n var outsideBgOpacity = style.core('outside-texture-bg-opacity').value;\n r.colorFillStyle(context, outsideBgColor[0], outsideBgColor[1], outsideBgColor[2], outsideBgOpacity);\n context.fillRect(0, 0, vp.width, vp.height);\n var zoom = cy.zoom();\n setContextTransform(context, false);\n context.clearRect(vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio);\n context.drawImage(texture, vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio);\n } else if (r.textureOnViewport && !forcedContext) {\n // clear the cache since we don't need it\n r.textureCache = null;\n }\n var extent = cy.extent();\n var vpManip = r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming || r.hoverData.draggingEles || r.cy.animated();\n var hideEdges = r.hideEdgesOnViewport && vpManip;\n var needMbClear = [];\n needMbClear[r.NODE] = !needDraw[r.NODE] && motionBlur && !r.clearedForMotionBlur[r.NODE] || r.clearingMotionBlur;\n if (needMbClear[r.NODE]) {\n r.clearedForMotionBlur[r.NODE] = true;\n }\n needMbClear[r.DRAG] = !needDraw[r.DRAG] && motionBlur && !r.clearedForMotionBlur[r.DRAG] || r.clearingMotionBlur;\n if (needMbClear[r.DRAG]) {\n r.clearedForMotionBlur[r.DRAG] = true;\n }\n if (needDraw[r.NODE] || drawAllLayers || drawOnlyNodeLayer || needMbClear[r.NODE]) {\n var useBuffer = motionBlur && !needMbClear[r.NODE] && mbPxRatio !== 1;\n var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] : data.contexts[r.NODE]);\n var clear = motionBlur && !useBuffer ? 'motionBlur' : undefined;\n setContextTransform(context, clear);\n if (hideEdges) {\n r.drawCachedNodes(context, eles.nondrag, pixelRatio, extent);\n } else {\n r.drawLayeredElements(context, eles.nondrag, pixelRatio, extent);\n }\n if (r.debug) {\n r.drawDebugPoints(context, eles.nondrag);\n }\n if (!drawAllLayers && !motionBlur) {\n needDraw[r.NODE] = false;\n }\n }\n if (!drawOnlyNodeLayer && (needDraw[r.DRAG] || drawAllLayers || needMbClear[r.DRAG])) {\n var useBuffer = motionBlur && !needMbClear[r.DRAG] && mbPxRatio !== 1;\n var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG] : data.contexts[r.DRAG]);\n setContextTransform(context, motionBlur && !useBuffer ? 'motionBlur' : undefined);\n if (hideEdges) {\n r.drawCachedNodes(context, eles.drag, pixelRatio, extent);\n } else {\n r.drawCachedElements(context, eles.drag, pixelRatio, extent);\n }\n if (r.debug) {\n r.drawDebugPoints(context, eles.drag);\n }\n if (!drawAllLayers && !motionBlur) {\n needDraw[r.DRAG] = false;\n }\n }\n this.drawSelectionRectangle(options, setContextTransform);\n\n // motionblur: blit rendered blurry frames\n if (motionBlur && mbPxRatio !== 1) {\n var cxtNode = data.contexts[r.NODE];\n var txtNode = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE];\n var cxtDrag = data.contexts[r.DRAG];\n var txtDrag = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG];\n var drawMotionBlur = function drawMotionBlur(cxt, txt, needClear) {\n cxt.setTransform(1, 0, 0, 1, 0, 0);\n if (needClear || !motionBlurFadeEffect) {\n cxt.clearRect(0, 0, r.canvasWidth, r.canvasHeight);\n } else {\n mbclear(cxt, 0, 0, r.canvasWidth, r.canvasHeight);\n }\n var pxr = mbPxRatio;\n cxt.drawImage(txt,\n // img\n 0, 0,\n // sx, sy\n r.canvasWidth * pxr, r.canvasHeight * pxr,\n // sw, sh\n 0, 0,\n // x, y\n r.canvasWidth, r.canvasHeight // w, h\n );\n };\n if (needDraw[r.NODE] || needMbClear[r.NODE]) {\n drawMotionBlur(cxtNode, txtNode, needMbClear[r.NODE]);\n needDraw[r.NODE] = false;\n }\n if (needDraw[r.DRAG] || needMbClear[r.DRAG]) {\n drawMotionBlur(cxtDrag, txtDrag, needMbClear[r.DRAG]);\n needDraw[r.DRAG] = false;\n }\n }\n r.prevViewport = vp;\n if (r.clearingMotionBlur) {\n r.clearingMotionBlur = false;\n r.motionBlurCleared = true;\n r.motionBlur = true;\n }\n if (motionBlur) {\n r.motionBlurTimeout = setTimeout(function () {\n r.motionBlurTimeout = null;\n r.clearedForMotionBlur[r.NODE] = false;\n r.clearedForMotionBlur[r.DRAG] = false;\n r.motionBlur = false;\n r.clearingMotionBlur = !textureDraw;\n r.mbFrames = 0;\n needDraw[r.NODE] = true;\n needDraw[r.DRAG] = true;\n r.redraw();\n }, motionBlurDelay);\n }\n if (!forcedContext) {\n cy.emit('render');\n }\n};\nvar fpsHeight;\nCRp$5.drawSelectionRectangle = function (options, setContextTransform) {\n var r = this;\n var cy = r.cy;\n var data = r.data;\n var style = cy.style();\n var drawOnlyNodeLayer = options.drawOnlyNodeLayer;\n var drawAllLayers = options.drawAllLayers;\n var needDraw = data.canvasNeedsRedraw;\n var forcedContext = options.forcedContext;\n if (r.showFps || !drawOnlyNodeLayer && needDraw[r.SELECT_BOX] && !drawAllLayers) {\n var context = forcedContext || data.contexts[r.SELECT_BOX];\n setContextTransform(context);\n if (r.selection[4] == 1 && (r.hoverData.selecting || r.touchData.selecting)) {\n var zoom = r.cy.zoom();\n var borderWidth = style.core('selection-box-border-width').value / zoom;\n context.lineWidth = borderWidth;\n context.fillStyle = 'rgba(' + style.core('selection-box-color').value[0] + ',' + style.core('selection-box-color').value[1] + ',' + style.core('selection-box-color').value[2] + ',' + style.core('selection-box-opacity').value + ')';\n context.fillRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]);\n if (borderWidth > 0) {\n context.strokeStyle = 'rgba(' + style.core('selection-box-border-color').value[0] + ',' + style.core('selection-box-border-color').value[1] + ',' + style.core('selection-box-border-color').value[2] + ',' + style.core('selection-box-opacity').value + ')';\n context.strokeRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]);\n }\n }\n if (data.bgActivePosistion && !r.hoverData.selecting) {\n var zoom = r.cy.zoom();\n var pos = data.bgActivePosistion;\n context.fillStyle = 'rgba(' + style.core('active-bg-color').value[0] + ',' + style.core('active-bg-color').value[1] + ',' + style.core('active-bg-color').value[2] + ',' + style.core('active-bg-opacity').value + ')';\n context.beginPath();\n context.arc(pos.x, pos.y, style.core('active-bg-size').pfValue / zoom, 0, 2 * Math.PI);\n context.fill();\n }\n var timeToRender = r.lastRedrawTime;\n if (r.showFps && timeToRender) {\n timeToRender = Math.round(timeToRender);\n var fps = Math.round(1000 / timeToRender);\n var text = '1 frame = ' + timeToRender + ' ms = ' + fps + ' fps';\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.fillStyle = 'rgba(255, 0, 0, 0.75)';\n context.strokeStyle = 'rgba(255, 0, 0, 0.75)';\n // context.lineWidth = 1;\n context.font = '30px Arial';\n if (!fpsHeight) {\n var dims = context.measureText(text);\n fpsHeight = dims.actualBoundingBoxAscent;\n }\n context.fillText(text, 0, fpsHeight);\n var maxFps = 60;\n context.strokeRect(0, fpsHeight + 10, 250, 20);\n context.fillRect(0, fpsHeight + 10, 250 * Math.min(fps / maxFps, 1), 20);\n }\n if (!drawAllLayers) {\n needDraw[r.SELECT_BOX] = false;\n }\n }\n};\n\n/**\n * Notes:\n * - All colors have premultiplied alpha. Very important for textues and \n * blending to work correctly.\n */\n\nfunction compileShader(gl, type, source) {\n var shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n throw new Error(gl.getShaderInfoLog(shader));\n }\n // console.log(gl.getShaderInfoLog(shader));\n return shader;\n}\nfunction createProgram(gl, vertexSource, fragementSource) {\n var vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexSource);\n var fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragementSource);\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error('Could not initialize shaders');\n }\n return program;\n}\n\n/**\n * Creates an offscren canvas with a 2D context, for the\n * canvas renderer to use for drawing textures.\n */\nfunction createTextureCanvas(r, width, height) {\n if (height === undefined) {\n height = width;\n }\n var canvas = r.makeOffscreenCanvas(width, height);\n var ctx = canvas.context = canvas.getContext('2d');\n canvas.clear = function () {\n return ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n canvas.clear();\n return canvas;\n}\n\n/**\n * Returns the current pan & zoom values, scaled by the pixel ratio.\n */\nfunction getEffectivePanZoom(r) {\n var pixelRatio = r.pixelRatio;\n var zoom = r.cy.zoom();\n var pan = r.cy.pan();\n return {\n zoom: zoom * pixelRatio,\n pan: {\n x: pan.x * pixelRatio,\n y: pan.y * pixelRatio\n }\n };\n}\n\n/**\n * Returns the zoom value, scaled by the pixel ratio.\n */\nfunction getEffectiveZoom(r) {\n var pixelRatio = r.pixelRatio;\n var zoom = r.cy.zoom();\n return zoom * pixelRatio;\n}\nfunction modelToRenderedPosition(r, pan, zoom, x, y) {\n var rx = x * zoom + pan.x;\n var ry = y * zoom + pan.y;\n ry = Math.round(r.canvasHeight - ry); // adjust for webgl\n return [rx, ry];\n}\nfunction isSimpleShape(node) {\n // the actual shape is checked in ElementDrawingWebGL._getVertTypeForShape()\n // no need to check it twice, this just checks other visual properties\n if (node.pstyle('background-fill').value !== 'solid') return false;\n if (node.pstyle('background-image').strValue !== 'none') return false;\n if (node.pstyle('border-width').value === 0) return true;\n if (node.pstyle('border-opacity').value === 0) return true;\n // we have a border but it must be simple\n if (node.pstyle('border-style').value !== 'solid') return false;\n // TODO ignoring 'border-cap', 'border-join' and 'border-position' for now\n return true;\n}\nfunction arrayEqual(a1, a2) {\n if (a1.length !== a2.length) {\n return false;\n }\n for (var i = 0; i < a1.length; i++) {\n if (a1[i] !== a2[i]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Takes color & opacity style values and converts them to WebGL format. \n * Alpha is premultiplied.\n */\nfunction toWebGLColor(color, opacity, outArray) {\n var r = color[0] / 255;\n var g = color[1] / 255;\n var b = color[2] / 255;\n var a = opacity;\n var arr = outArray || new Array(4);\n arr[0] = r * a;\n arr[1] = g * a;\n arr[2] = b * a;\n arr[3] = a;\n return arr;\n}\nfunction indexToVec4(index, outArray) {\n var arr = outArray || new Array(4);\n arr[0] = (index >> 0 & 0xFF) / 0xFF;\n arr[1] = (index >> 8 & 0xFF) / 0xFF;\n arr[2] = (index >> 16 & 0xFF) / 0xFF;\n arr[3] = (index >> 24 & 0xFF) / 0xFF;\n return arr;\n}\nfunction vec4ToIndex(vec4) {\n return vec4[0] + (vec4[1] << 8) + (vec4[2] << 16) + (vec4[3] << 24);\n}\nfunction createTexture(gl, debugID) {\n var texture = gl.createTexture();\n texture.buffer = function (offscreenCanvas) {\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);\n\n // very important, this tells webgl to premultiply colors by the alpha channel\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, offscreenCanvas);\n gl.generateMipmap(gl.TEXTURE_2D);\n gl.bindTexture(gl.TEXTURE_2D, null);\n };\n texture.deleteTexture = function () {\n gl.deleteTexture(texture);\n };\n return texture;\n}\nfunction getTypeInfo(gl, glslType) {\n switch (glslType) {\n case 'float':\n return [1, gl.FLOAT, 4];\n case 'vec2':\n return [2, gl.FLOAT, 4];\n case 'vec3':\n return [3, gl.FLOAT, 4];\n case 'vec4':\n return [4, gl.FLOAT, 4];\n case 'int':\n return [1, gl.INT, 4];\n case 'ivec2':\n return [2, gl.INT, 4];\n }\n}\nfunction createTypedArray(gl, glType, dataOrSize) {\n switch (glType) {\n case gl.FLOAT:\n return new Float32Array(dataOrSize);\n case gl.INT:\n return new Int32Array(dataOrSize);\n }\n}\nfunction createTypedArrayView(gl, glType, array, stride, size, i) {\n switch (glType) {\n case gl.FLOAT:\n return new Float32Array(array.buffer, i * stride, size);\n case gl.INT:\n return new Int32Array(array.buffer, i * stride, size);\n }\n}\n\n/** @param {WebGLRenderingContext} gl */\nfunction createBufferStaticDraw(gl, type, attributeLoc, dataArray) {\n var _getTypeInfo = getTypeInfo(gl, type),\n _getTypeInfo2 = _slicedToArray(_getTypeInfo, 2),\n size = _getTypeInfo2[0],\n glType = _getTypeInfo2[1];\n var data = createTypedArray(gl, glType, dataArray);\n var buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n if (glType === gl.FLOAT) {\n gl.vertexAttribPointer(attributeLoc, size, glType, false, 0, 0);\n } else if (glType === gl.INT) {\n gl.vertexAttribIPointer(attributeLoc, size, glType, 0, 0);\n }\n gl.enableVertexAttribArray(attributeLoc);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n return buffer;\n}\n\n/** \n * Creates a float buffer with gl.DYNAMIC_DRAW.\n * The returned buffer object contains functions to easily set instance data and buffer the data before a draw call.\n * @param {WebGLRenderingContext} gl \n */\nfunction createBufferDynamicDraw(gl, instances, type, attributeLoc) {\n var _getTypeInfo3 = getTypeInfo(gl, type),\n _getTypeInfo4 = _slicedToArray(_getTypeInfo3, 3),\n size = _getTypeInfo4[0],\n glType = _getTypeInfo4[1],\n bytes = _getTypeInfo4[2];\n var dataArray = createTypedArray(gl, glType, instances * size);\n var stride = size * bytes;\n var buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, instances * stride, gl.DYNAMIC_DRAW);\n gl.enableVertexAttribArray(attributeLoc);\n if (glType === gl.FLOAT) {\n gl.vertexAttribPointer(attributeLoc, size, glType, false, stride, 0);\n } else if (glType === gl.INT) {\n gl.vertexAttribIPointer(attributeLoc, size, glType, stride, 0);\n }\n gl.vertexAttribDivisor(attributeLoc, 1);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n\n // use array views to set values directly into the buffer array\n var views = new Array(instances);\n for (var i = 0; i < instances; i++) {\n views[i] = createTypedArrayView(gl, glType, dataArray, stride, size, i);\n }\n buffer.dataArray = dataArray;\n buffer.stride = stride;\n buffer.size = size;\n buffer.getView = function (i) {\n return views[i];\n };\n buffer.setPoint = function (i, x, y) {\n var view = views[i];\n view[0] = x;\n view[1] = y;\n };\n buffer.bufferSubData = function (count) {\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n if (count) {\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, dataArray, 0, count * size);\n } else {\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, dataArray);\n }\n };\n return buffer;\n}\n\n/** \n * Creates a buffer of 3x3 matrix data for use as attribute data.\n * @param {WebGLRenderingContext} gl \n */\nfunction create3x3MatrixBufferDynamicDraw(gl, instances, attributeLoc) {\n var matrixSize = 9; // 3x3 matrix\n var matrixData = new Float32Array(instances * matrixSize);\n\n // use matrix views to set values directly into the matrixData array\n var matrixViews = new Array(instances);\n for (var i = 0; i < instances; i++) {\n var byteOffset = i * matrixSize * 4; // 4 bytes per float\n matrixViews[i] = new Float32Array(matrixData.buffer, byteOffset, matrixSize); // array view\n }\n var buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, matrixData.byteLength, gl.DYNAMIC_DRAW);\n\n // each row of the matrix needs to be a separate attribute\n for (var _i = 0; _i < 3; _i++) {\n var loc = attributeLoc + _i;\n gl.enableVertexAttribArray(loc);\n gl.vertexAttribPointer(loc, 3, gl.FLOAT, false, 3 * 12, _i * 12);\n gl.vertexAttribDivisor(loc, 1);\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n buffer.getMatrixView = function (i) {\n return matrixViews[i];\n };\n\n // TODO this is too slow, use getMatrixView and pass the view directly to the glmatrix library\n buffer.setData = function (matrix, i) {\n matrixViews[i].set(matrix, 0);\n };\n buffer.bufferSubData = function () {\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, matrixData);\n };\n return buffer;\n}\n\n/** \n * Creates a Frame Buffer to use for offscreen rendering.\n * @param {WebGLRenderingContext} gl \n */\nfunction createPickingFrameBuffer(gl) {\n // Create and bind the framebuffer\n var fb = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb);\n\n // Create a texture to render to\n var targetTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, targetTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n // attach the texture as the first color attachment\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, targetTexture, 0);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n fb.setFramebufferAttachmentSizes = function (width, height) {\n gl.bindTexture(gl.TEXTURE_2D, targetTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n };\n return fb;\n}\n\n/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nvar ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};\n\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nfunction create() {\n var out = new ARRAY_TYPE(9);\n\n if (ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\nfunction identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nfunction multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\nfunction translate(out, a, v) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nfunction rotate(out, a, rad) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nfunction scale(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\nfunction projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n\n// A \"texture atlas\" is a big canvas, and sections of it are used as textures for nodes/labels.\n\n/**\n * A single square texture atlas (also known as a \"sprite sheet\").\n */\nvar Atlas = /*#__PURE__*/function () {\n function Atlas(r, texSize, texRows, createTextureCanvas) {\n _classCallCheck(this, Atlas);\n this.debugID = Math.floor(Math.random() * 10000);\n this.r = r;\n this.texSize = texSize;\n this.texRows = texRows;\n this.texHeight = Math.floor(texSize / texRows);\n this.enableWrapping = true; // hardcoded for now, can be made an option\n\n this.locked = false; // once an atlas is locked it can no longer be drawn to\n this.texture = null; // WebGLTexture object\n this.needsBuffer = true;\n\n // a \"location\" is an pointer into the atlas with a 'row' and 'x' fields\n this.freePointer = {\n x: 0,\n row: 0\n };\n\n // map from the style key to the row/x where the texture starts\n // if the texture wraps then there's a second location\n this.keyToLocation = new Map(); // styleKey -> [ location, location ]\n\n this.canvas = createTextureCanvas(r, texSize, texSize);\n this.scratch = createTextureCanvas(r, texSize, this.texHeight, 'scratch');\n }\n return _createClass(Atlas, [{\n key: \"lock\",\n value: function lock() {\n this.locked = true;\n }\n }, {\n key: \"getKeys\",\n value: function getKeys() {\n return new Set(this.keyToLocation.keys());\n }\n }, {\n key: \"getScale\",\n value: function getScale(_ref) {\n var w = _ref.w,\n h = _ref.h;\n var texHeight = this.texHeight,\n maxTexWidth = this.texSize;\n // try to fit to the height of a row\n var scale = texHeight / h; // TODO what about pixelRatio?\n var texW = w * scale;\n var texH = h * scale;\n // if the scaled width is too wide then scale to fit max width instead\n if (texW > maxTexWidth) {\n scale = maxTexWidth / w;\n texW = w * scale;\n texH = h * scale;\n }\n return {\n scale: scale,\n texW: texW,\n texH: texH\n };\n }\n }, {\n key: \"draw\",\n value: function draw(key, bb, doDrawing) {\n var _this = this;\n if (this.locked) throw new Error('can\\'t draw, atlas is locked');\n var texSize = this.texSize,\n texRows = this.texRows,\n texHeight = this.texHeight;\n var _this$getScale = this.getScale(bb),\n scale = _this$getScale.scale,\n texW = _this$getScale.texW,\n texH = _this$getScale.texH;\n var drawAt = function drawAt(location, canvas) {\n if (doDrawing && canvas) {\n var context = canvas.context;\n var x = location.x,\n row = location.row;\n var xOffset = x;\n var yOffset = texHeight * row;\n context.save();\n context.translate(xOffset, yOffset);\n context.scale(scale, scale);\n doDrawing(context, bb);\n context.restore();\n }\n };\n var locations = [null, null];\n var drawNormal = function drawNormal() {\n // don't need to wrap, draw directly on the canvas\n drawAt(_this.freePointer, _this.canvas);\n locations[0] = {\n x: _this.freePointer.x,\n y: _this.freePointer.row * texHeight,\n w: texW,\n h: texH\n };\n locations[1] = {\n // create a second location with a width of 0, for convenience\n x: _this.freePointer.x + texW,\n y: _this.freePointer.row * texHeight,\n w: 0,\n h: texH\n };\n\n // move the pointer to the end of the texture\n _this.freePointer.x += texW;\n if (_this.freePointer.x == texSize) {\n _this.freePointer.x = 0;\n _this.freePointer.row++;\n }\n };\n var drawWrapped = function drawWrapped() {\n var scratch = _this.scratch,\n canvas = _this.canvas;\n\n // Draw to the scratch canvas\n scratch.clear();\n drawAt({\n x: 0,\n row: 0\n }, scratch);\n var firstTexW = texSize - _this.freePointer.x;\n var secondTexW = texW - firstTexW;\n var h = texHeight;\n {\n // copy first part of scratch to the first texture\n var dx = _this.freePointer.x;\n var dy = _this.freePointer.row * texHeight;\n var w = firstTexW;\n canvas.context.drawImage(scratch, 0, 0, w, h, dx, dy, w, h);\n locations[0] = {\n x: dx,\n y: dy,\n w: w,\n h: texH\n };\n }\n {\n // copy second part of scratch to the second texture\n var sx = firstTexW;\n var _dy = (_this.freePointer.row + 1) * texHeight;\n var _w = secondTexW;\n if (canvas) {\n canvas.context.drawImage(scratch, sx, 0, _w, h, 0, _dy, _w, h);\n }\n locations[1] = {\n x: 0,\n y: _dy,\n w: _w,\n h: texH\n };\n }\n _this.freePointer.x = secondTexW;\n _this.freePointer.row++;\n };\n var moveToStartOfNextRow = function moveToStartOfNextRow() {\n _this.freePointer.x = 0;\n _this.freePointer.row++;\n };\n if (this.freePointer.x + texW <= texSize) {\n // There's enough space in the current row\n drawNormal();\n } else if (this.freePointer.row >= texRows - 1) {\n // Need to move to the next row, but there are no more rows, atlas is full.\n return false;\n } else if (this.freePointer.x === texSize) {\n // happen to be right at end of current row\n moveToStartOfNextRow();\n drawNormal();\n } else if (this.enableWrapping) {\n // draw part of the texture to the end of the curent row, then wrap to the next row\n drawWrapped();\n } else {\n // move to the start of the next row, then draw normally\n moveToStartOfNextRow();\n drawNormal();\n }\n this.keyToLocation.set(key, locations);\n this.needsBuffer = true;\n return locations;\n }\n }, {\n key: \"getOffsets\",\n value: function getOffsets(key) {\n return this.keyToLocation.get(key);\n }\n }, {\n key: \"isEmpty\",\n value: function isEmpty() {\n return this.freePointer.x === 0 && this.freePointer.row === 0;\n }\n }, {\n key: \"canFit\",\n value: function canFit(bb) {\n if (this.locked) return false;\n var texSize = this.texSize,\n texRows = this.texRows;\n var _this$getScale2 = this.getScale(bb),\n texW = _this$getScale2.texW;\n if (this.freePointer.x + texW > texSize) {\n // need to wrap\n return this.freePointer.row < texRows - 1; // return true if there's a row to wrap to\n }\n return true;\n }\n\n // called on every frame\n }, {\n key: \"bufferIfNeeded\",\n value: function bufferIfNeeded(gl) {\n if (!this.texture) {\n this.texture = createTexture(gl, this.debugID);\n }\n if (this.needsBuffer) {\n this.texture.buffer(this.canvas);\n this.needsBuffer = false;\n if (this.locked) {\n this.canvas = null;\n this.scratch = null;\n }\n }\n }\n }, {\n key: \"dispose\",\n value: function dispose() {\n if (this.texture) {\n this.texture.deleteTexture();\n this.texture = null;\n }\n this.canvas = null;\n this.scratch = null;\n this.locked = true;\n }\n }]);\n}();\n\n/**\n * A collection of texture atlases, all of the same \"render type\". \n * ('node-body' is an example of a render type.)\n * An AtlasCollection can also be notified when a texture is no longer needed, \n * and it can garbage collect the unused textures.\n */\nvar AtlasCollection = /*#__PURE__*/function () {\n function AtlasCollection(r, texSize, texRows, createTextureCanvas) {\n _classCallCheck(this, AtlasCollection);\n this.r = r;\n this.texSize = texSize;\n this.texRows = texRows;\n this.createTextureCanvas = createTextureCanvas;\n this.atlases = [];\n this.styleKeyToAtlas = new Map();\n this.markedKeys = new Set(); // marked for garbage collection\n }\n return _createClass(AtlasCollection, [{\n key: \"getKeys\",\n value: function getKeys() {\n return new Set(this.styleKeyToAtlas.keys());\n }\n }, {\n key: \"_createAtlas\",\n value: function _createAtlas() {\n var r = this.r,\n texSize = this.texSize,\n texRows = this.texRows,\n createTextureCanvas = this.createTextureCanvas;\n return new Atlas(r, texSize, texRows, createTextureCanvas);\n }\n }, {\n key: \"_getScratchCanvas\",\n value: function _getScratchCanvas() {\n if (!this.scratch) {\n var r = this.r,\n texSize = this.texSize,\n texRows = this.texRows,\n createTextureCanvas = this.createTextureCanvas;\n var texHeight = Math.floor(texSize / texRows);\n this.scratch = createTextureCanvas(r, texSize, texHeight, 'scratch');\n }\n return this.scratch;\n }\n }, {\n key: \"draw\",\n value: function draw(key, bb, doDrawing) {\n var atlas = this.styleKeyToAtlas.get(key);\n if (!atlas) {\n // check for space at the end of the last atlas\n atlas = this.atlases[this.atlases.length - 1];\n if (!atlas || !atlas.canFit(bb)) {\n if (atlas) atlas.lock();\n // create a new atlas\n atlas = this._createAtlas();\n this.atlases.push(atlas);\n }\n atlas.draw(key, bb, doDrawing);\n this.styleKeyToAtlas.set(key, atlas);\n }\n return atlas;\n }\n }, {\n key: \"getAtlas\",\n value: function getAtlas(key) {\n return this.styleKeyToAtlas.get(key);\n }\n }, {\n key: \"hasAtlas\",\n value: function hasAtlas(key) {\n return this.styleKeyToAtlas.has(key);\n }\n }, {\n key: \"markKeyForGC\",\n value: function markKeyForGC(key) {\n this.markedKeys.add(key);\n }\n }, {\n key: \"gc\",\n value: function gc() {\n var _this2 = this;\n var markedKeys = this.markedKeys;\n if (markedKeys.size === 0) {\n console.log('nothing to garbage collect');\n return;\n }\n var newAtlases = [];\n var newStyleKeyToAtlas = new Map();\n var newAtlas = null;\n var _iterator = _createForOfIteratorHelper(this.atlases),\n _step;\n try {\n var _loop = function _loop() {\n var atlas = _step.value;\n var keys = atlas.getKeys();\n var keysToCollect = intersection(markedKeys, keys);\n if (keysToCollect.size === 0) {\n // this atlas can still be used\n newAtlases.push(atlas);\n keys.forEach(function (k) {\n return newStyleKeyToAtlas.set(k, atlas);\n });\n return 1; // continue\n }\n if (!newAtlas) {\n newAtlas = _this2._createAtlas();\n newAtlases.push(newAtlas);\n }\n var _iterator2 = _createForOfIteratorHelper(keys),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var key = _step2.value;\n if (!keysToCollect.has(key)) {\n var _atlas$getOffsets = atlas.getOffsets(key),\n _atlas$getOffsets2 = _slicedToArray(_atlas$getOffsets, 2),\n s1 = _atlas$getOffsets2[0],\n s2 = _atlas$getOffsets2[1];\n if (!newAtlas.canFit({\n w: s1.w + s2.w,\n h: s1.h\n })) {\n newAtlas.lock();\n newAtlas = _this2._createAtlas();\n newAtlases.push(newAtlas);\n }\n if (atlas.canvas) {\n // if the texture can't be copied then it will have to be redrawn on the next frame\n _this2._copyTextureToNewAtlas(key, atlas, newAtlas);\n newStyleKeyToAtlas.set(key, newAtlas);\n }\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n atlas.dispose();\n };\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n if (_loop()) continue;\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n this.atlases = newAtlases;\n this.styleKeyToAtlas = newStyleKeyToAtlas;\n this.markedKeys = new Set();\n }\n }, {\n key: \"_copyTextureToNewAtlas\",\n value: function _copyTextureToNewAtlas(key, oldAtlas, newAtlas) {\n var _oldAtlas$getOffsets = oldAtlas.getOffsets(key),\n _oldAtlas$getOffsets2 = _slicedToArray(_oldAtlas$getOffsets, 2),\n s1 = _oldAtlas$getOffsets2[0],\n s2 = _oldAtlas$getOffsets2[1];\n if (s2.w === 0) {\n // the texture does not wrap, draw directly to new atlas\n newAtlas.draw(key, s1, function (context) {\n context.drawImage(oldAtlas.canvas, s1.x, s1.y, s1.w, s1.h, 0, 0, s1.w, s1.h);\n });\n } else {\n // the texture wraps, first draw both parts to a scratch canvas\n var scratch = this._getScratchCanvas();\n scratch.clear();\n scratch.context.drawImage(oldAtlas.canvas, s1.x, s1.y, s1.w, s1.h, 0, 0, s1.w, s1.h);\n scratch.context.drawImage(oldAtlas.canvas, s2.x, s2.y, s2.w, s2.h, s1.w, 0, s2.w, s2.h);\n\n // now draw the scratch to the new atlas\n var w = s1.w + s2.w;\n var h = s1.h;\n newAtlas.draw(key, {\n w: w,\n h: h\n }, function (context) {\n context.drawImage(scratch, 0, 0, w, h, 0, 0, w, h // the destination context has already been translated to the correct position\n );\n });\n }\n }\n }, {\n key: \"getCounts\",\n value: function getCounts() {\n return {\n keyCount: this.styleKeyToAtlas.size,\n atlasCount: new Set(this.styleKeyToAtlas.values()).size\n };\n }\n }]);\n}();\nfunction intersection(set1, set2) {\n // TODO why no Set.intersection in node 16???\n if (set1.intersection) return set1.intersection(set2);else return new Set(_toConsumableArray(set1).filter(function (x) {\n return set2.has(x);\n }));\n}\n\n/**\n * Used to manage batches of Atlases for drawing nodes and labels.\n * Supports different types of AtlasCollections for different render types,\n * for example 'node-body' and 'node-label' would be different render types.\n * Render types are kept separate because they will likely need to be garbage collected\n * separately and its not entierly guaranteed that their style keys won't collide.\n */\nvar AtlasManager = /*#__PURE__*/function () {\n function AtlasManager(r, globalOptions) {\n _classCallCheck(this, AtlasManager);\n this.r = r;\n this.globalOptions = globalOptions;\n this.atlasSize = globalOptions.webglTexSize;\n this.maxAtlasesPerBatch = globalOptions.webglTexPerBatch;\n this.renderTypes = new Map(); // renderType:string -> renderTypeOptions\n this.collections = new Map(); // collectionName:string -> AtlasCollection\n\n this.typeAndIdToKey = new Map(); // [renderType,id] => Array`); + return svgElement; + }; + return texToSvgImpl; +} + +/** Returns true if the SVG is a MathJax error (invalid LaTeX). Don't match our injected CSS. */ +function isMathJaxErrorSvg(svg: string): boolean { + return /data-mjx-error=/.test(svg); +} + +/** + * Renders LaTeX to an SVG data URI. Returns null on parse/render error so caller can show raw source. + * + * @param latex - Raw LaTeX string (between delimiters) + * @param options - displayMode true for block, false for inline + * @returns data:image/svg+xml;charset=utf-8,... or null on error + */ +export function renderMathToDataUri( + latex: string, + options: MathRenderOptions +): string | null { + const trimmed = latex.trim(); + if (!trimmed) return null; + try { + const height = options.height ?? (options.displayMode ? 40 : 24); + const texToSvg = getTexToSvg(); + const svg = texToSvg(trimmed, options.displayMode, height, options.foregroundColor); + if (!svg || isMathJaxErrorSvg(svg)) return null; + return svgToDataUriBase64(svg); + } catch { + return null; + } +} diff --git a/vs-code-extension/src/inline-editor/math/math-scanner.ts b/vs-code-extension/src/inline-editor/math/math-scanner.ts new file mode 100644 index 0000000..c5a640a --- /dev/null +++ b/vs-code-extension/src/inline-editor/math/math-scanner.ts @@ -0,0 +1,287 @@ +/** + * Scans normalized document text for inline ($...$) and block ($$...$$) math regions. + * Positions are in normalized text (LF line endings). Block has precedence over inline. + * Per contract: math-delimiter-grammar.md + */ + +import type { MathRegion } from '../parser'; + +type FencedCodeBlock = { + startPos: number; + endPos: number; + contentStartPos: number; + contentEndPos: number; + languageToken: string; + isMathFence: boolean; +}; + +const MATH_FENCE_LANGUAGES = new Set(['math', 'latex', 'tex']); + +/** + * Scans text for math regions. Block math ($$...$$) is tried first; then inline ($...$). + * Escaped \$ does not start/end; empty or whitespace-only content is not treated as math. + * Inline: $ may have optional whitespace immediately after it and before the closing $; + * content is trimmed and must be non-empty (so "Price is $10" still has no closing $ → no region). + * + * @param text - Normalized document text (LF only) + * @returns MathRegion[] in document order, non-overlapping + */ +export function scanMathRegions(text: string): MathRegion[] { + const fencedBlocks = scanFencedCodeBlocks(text); + const regions: MathRegion[] = []; + let i = 0; + const n = text.length; + let fenceIndex = 0; + + while (i < n) { + while (fenceIndex < fencedBlocks.length && fencedBlocks[fenceIndex].endPos <= i) { + fenceIndex++; + } + const activeFence = fencedBlocks[fenceIndex]; + if (activeFence && i >= activeFence.startPos && i < activeFence.endPos) { + i = activeFence.endPos; + continue; + } + + // Try block first ($$...$$) + if (text[i] === '$' && i + 1 < n && text[i + 1] === '$') { + if (isEscaped(text, i)) { + i++; + continue; + } + const block = tryMatchBlock(text, i); + if (block) { + regions.push(block); + i = block.endPos; + continue; + } + // Block failed (e.g. whitespace-only content); skip both $ so we don't treat as inline + i += 2; + continue; + } + + // Inline: single $ then find next unescaped $; content between is trimmed and must be non-empty + if (text[i] === '$' && !isEscaped(text, i)) { + const inline = tryMatchInline(text, i); + if (inline) { + regions.push(inline); + i = inline.endPos; + continue; + } + } + + i++; + } + + for (const fence of fencedBlocks) { + if (!fence.isMathFence) { + continue; + } + if (fence.contentEndPos <= fence.contentStartPos) { + continue; + } + const source = text.slice(fence.contentStartPos, fence.contentEndPos); + if (source.trim().length === 0) { + continue; + } + const numLines = countLines(source); + regions.push({ + startPos: fence.startPos, + endPos: fence.endPos, + source, + displayMode: true, + numLines, + }); + } + + regions.sort((a, b) => a.startPos - b.startPos); + return regions; +} + +function isEscaped(text: string, dollarIndex: number): boolean { + let backslashes = 0; + let p = dollarIndex - 1; + while (p >= 0 && text[p] === '\\') { + backslashes++; + p--; + } + return backslashes % 2 === 1; +} + +function tryMatchBlock(text: string, start: number): MathRegion | null { + if (start + 4 > text.length) return null; + if (text[start] !== '$' || text[start + 1] !== '$') return null; + let i = start + 2; + while (i < text.length) { + const idx = text.indexOf('$$', i); + if (idx === -1) return null; + if (isEscapedAt(text, idx)) { + i = idx + 1; + continue; + } + const content = text.slice(start + 2, idx).trim(); + if (content.length === 0) { + i = idx + 2; + continue; + } + return { + startPos: start, + endPos: idx + 2, + source: text.slice(start + 2, idx).trim(), + displayMode: true, + }; + } + return null; +} + +function isEscapedAt(text: string, idx: number): boolean { + if (idx <= 0) return false; + let backslashes = 0; + let p = idx - 1; + while (p >= 0 && text[p] === '\\') { + backslashes++; + p--; + } + return backslashes % 2 === 1; +} + +function tryMatchInline(text: string, start: number): MathRegion | null { + if (text[start] !== '$') return null; + let i = start + 1; + while (i < text.length) { + const idx = text.indexOf('$', i); + if (idx === -1) return null; + if (isEscapedAt(text, idx)) { + i = idx + 1; + continue; + } + const content = text.slice(start + 1, idx).trim(); + if (content.length === 0) { + i = idx + 1; + continue; + } + return { + startPos: start, + endPos: idx + 1, + source: content, + displayMode: false, + }; + } + return null; +} + +function scanFencedCodeBlocks(text: string): FencedCodeBlock[] { + const blocks: FencedCodeBlock[] = []; + let lineStart = 0; + + let openFence: + | { + markerChar: '`' | '~'; + markerLength: number; + startPos: number; + contentStartPos: number; + languageToken: string; + } + | undefined; + + while (lineStart <= text.length) { + const lineBreak = text.indexOf('\n', lineStart); + const lineEnd = lineBreak === -1 ? text.length : lineBreak; + const lineWithNoNewline = text.slice(lineStart, lineEnd); + const lineEndWithNewline = lineBreak === -1 ? lineEnd : lineBreak + 1; + + if (!openFence) { + const openingFence = parseOpeningFence(lineWithNoNewline); + if (openingFence) { + openFence = { + markerChar: openingFence.markerChar, + markerLength: openingFence.markerLength, + startPos: lineStart, + contentStartPos: lineEndWithNewline, + languageToken: openingFence.languageToken, + }; + } + } else { + const closingFence = parseClosingFence(lineWithNoNewline); + if ( + closingFence && + closingFence.markerChar === openFence.markerChar && + closingFence.markerLength >= openFence.markerLength + ) { + blocks.push({ + startPos: openFence.startPos, + endPos: lineEndWithNewline, + contentStartPos: openFence.contentStartPos, + contentEndPos: lineStart, + languageToken: openFence.languageToken, + isMathFence: MATH_FENCE_LANGUAGES.has(openFence.languageToken), + }); + openFence = undefined; + } + } + + if (lineBreak === -1) { + break; + } + lineStart = lineBreak + 1; + } + + return blocks; +} + +function parseOpeningFence( + line: string +): { markerChar: '`' | '~'; markerLength: number; languageToken: string } | null { + const match = line.match(/^[ ]{0,3}(`{3,}|~{3,})(.*)$/); + if (!match) { + return null; + } + const marker = match[1]; + const markerChar = marker[0] as '`' | '~'; + const infoString = match[2] ?? ''; + return { + markerChar, + markerLength: marker.length, + languageToken: normalizeFenceLanguageToken(infoString), + }; +} + +function parseClosingFence( + line: string +): { markerChar: '`' | '~'; markerLength: number } | null { + const match = line.match(/^[ ]{0,3}(`{3,}|~{3,})[ \t]*$/); + if (!match) { + return null; + } + const marker = match[1]; + return { + markerChar: marker[0] as '`' | '~', + markerLength: marker.length, + }; +} + +function normalizeFenceLanguageToken(infoString: string): string { + const trimmed = infoString.trim().toLowerCase(); + if (!trimmed) { + return ''; + } + const [token] = trimmed.split(/\s+/, 1); + return token ?? ''; +} + +/** + * Count body lines from fence source text. + * The body slice can include a trailing newline before the closing fence; + * that trailing newline must not add an extra body line. + */ +function countLines(text: string): number { + if (text.length === 0) return 1; + let n = 1; + for (let i = 0; i < text.length; i++) { + if (text[i] === '\n') n++; + } + if (text.endsWith('\n')) { + n--; + } + return n; +} diff --git a/vs-code-extension/src/inline-editor/mermaid/constants.ts b/vs-code-extension/src/inline-editor/mermaid/constants.ts new file mode 100644 index 0000000..2721969 --- /dev/null +++ b/vs-code-extension/src/inline-editor/mermaid/constants.ts @@ -0,0 +1,11 @@ +/** + * Constants for Mermaid rendering + */ +export const MERMAID_CONSTANTS = { + /** Maximum number of cached decoration entries (LRU cache) */ + DECORATION_CACHE_MAX_ENTRIES: 250, + /** Request timeout in milliseconds (30 seconds) */ + REQUEST_TIMEOUT_MS: 30000, + /** Hover request timeout in milliseconds (5 seconds - matches VS Code hover timeout) */ + HOVER_REQUEST_TIMEOUT_MS: 5000, +} as const; diff --git a/vs-code-extension/src/inline-editor/mermaid/error-handler.ts b/vs-code-extension/src/inline-editor/mermaid/error-handler.ts new file mode 100644 index 0000000..6f80299 --- /dev/null +++ b/vs-code-extension/src/inline-editor/mermaid/error-handler.ts @@ -0,0 +1,96 @@ +/** + * Error handling utilities for Mermaid rendering + */ + +/** + * Escape XML special characters for use in SVG text + */ +function escapeXml(text: string): string { + return text + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +/** + * Create an error SVG to display when Mermaid rendering fails + * @param errorMessage - The error message to display + * @param width - Width of the error SVG + * @param height - Height of the error SVG + * @param isDark - Whether to use dark theme colors + * @returns SVG string with error message + */ +export function createErrorSvg(errorMessage: string, width: number, height: number, isDark: boolean): string { + const bgColor = isDark ? '#2d2d2d' : '#f5f5f5'; + const textColor = isDark ? '#ff6b6b' : '#d32f2f'; + const borderColor = isDark ? '#ff6b6b' : '#d32f2f'; + const secondaryTextColor = isDark ? '#cccccc' : '#666666'; + + // Use the full error message - don't truncate aggressively + // Split into lines that fit within the SVG width + const maxLineLength = Math.floor((width - 80) / 7); // Approximate chars per line based on font size + const words = errorMessage.split(/\s+/); + const lines: string[] = []; + let currentLine = ''; + + for (const word of words) { + const testLine = currentLine ? currentLine + ' ' + word : word; + if (testLine.length > maxLineLength && currentLine.length > 0) { + lines.push(currentLine); + currentLine = word; + } else { + currentLine = testLine; + } + } + if (currentLine) { + lines.push(currentLine); + } + + // Limit to reasonable number of lines to fit in height + const maxLines = Math.floor((height - 100) / 18); // 18px line height + const displayLines = lines.slice(0, maxLines); + if (lines.length > maxLines) { + displayLines.push('... (error message truncated)'); + } + + const lineHeight = 18; + const padding = 20; + const iconSize = 40; + const titleY = padding + iconSize + 15; + const messageStartY = titleY + 25; + + const textLines = displayLines.map((line, i) => + `${escapeXml(line)}` + ).join(''); + + // Calculate actual height needed based on content + const contentHeight = Math.max(height, padding * 2 + iconSize + 25 + (displayLines.length * lineHeight)); + + return ` + + + + Mermaid Rendering Error + + ${textLines} + +`; +} + +/** + * Extract error message from error SVG + */ +export function extractErrorMessage(errorSvg: string): string | null { + const match = errorSvg.match(/]*>([^<]+)<\/tspan>/g); + if (match && match.length > 0) { + // Get the first tspan content (skip the title line) + const messageLines = match.slice(1).map(line => { + const contentMatch = line.match(/>([^<]+)>(MERMAID_CONSTANTS.DECORATION_CACHE_MAX_ENTRIES); + +// Log "waiting for webview" at most once per session to avoid spam when webview is never created +let hasLoggedWaitingForWebview = false; + +async function waitForWebviewOnceLogged(manager: MermaidWebviewManager): Promise { + if (!hasLoggedWaitingForWebview) { + hasLoggedWaitingForWebview = true; + console.warn('Mermaid: waiting for webview'); + } + await manager.waitForWebview(); +} + +/** + * Initialize the Mermaid renderer with extension context + */ +export function initMermaidRenderer(context: vscode.ExtensionContext): void { + if (webviewManager) { + // Already initialized + return; + } + + webviewManager = new MermaidWebviewManager(); + webviewManager.initialize(context); +} + +/** + * Render Mermaid SVG at natural size (without height constraints) + * Used to get actual diagram dimensions for hover sizing + * @param source - Mermaid diagram source code + * @param options - Rendering options including theme and fontFamily + * @param cancellationToken - Optional cancellation token for hover requests (shorter timeout) + */ +export async function renderMermaidSvgNatural( + source: string, + options: { theme: 'default' | 'dark'; fontFamily?: string }, + cancellationToken?: vscode.CancellationToken +): Promise { + if (!webviewManager) { + throw new Error('Mermaid renderer not initialized. Call initMermaidRenderer first.'); + } + + await waitForWebviewOnceLogged(webviewManager); + + const darkMode = options.theme === 'dark'; + + // Check cancellation before starting expensive operation + if (cancellationToken?.isCancellationRequested) { + throw new vscode.CancellationError(); + } + + // Use shorter timeout for hover requests (5 seconds) to match VS Code's hover timeout + // Regular requests use the default 30-second timeout + const timeoutMs = cancellationToken ? MERMAID_CONSTANTS.HOVER_REQUEST_TIMEOUT_MS : MERMAID_CONSTANTS.REQUEST_TIMEOUT_MS; + + // Request SVG without processing (get natural dimensions) + const svgString = await webviewManager.requestSvg( + { source, darkMode, fontFamily: options.fontFamily }, + timeoutMs, + cancellationToken + ); + + // Check cancellation again after await (in case it was cancelled during the request) + if (cancellationToken?.isCancellationRequested) { + throw new vscode.CancellationError(); + } + + // Return raw SVG without height processing + return svgString; +} + +/** + * Memoized function to get Mermaid decoration + * Caches based on source, theme, fontFamily, and height + * Uses the global decorationCache to avoid creating unbounded caches + */ +function memoizeMermaidDecoration( + func: (source: string, darkMode: boolean, height: number, fontFamily?: string) => Promise +): (source: string, darkMode: boolean, height: number, fontFamily?: string) => Promise { + return (source: string, darkMode: boolean, height: number, fontFamily?: string): Promise => { + const key = `${source}|${darkMode}|${height}|${fontFamily ?? ''}`; + const cached = decorationCache.get(key); + if (cached) { + return cached; + } + + const promise = func(source, darkMode, height, fontFamily); + decorationCache.set(key, promise); + // If a render fails (timeout, disposal, transient issues), don't pin the failure in cache. + promise.catch(() => { + decorationCache.delete(key); + }); + return promise; + }; +} + +const getMermaidDecoration = memoizeMermaidDecoration(async ( + source: string, + darkMode: boolean, + height: number, + fontFamily?: string +): Promise => { + if (!webviewManager) { + throw new Error('Mermaid renderer not initialized. Call initMermaidRenderer first.'); + } + + await waitForWebviewOnceLogged(webviewManager); + + const svgString = await webviewManager.requestSvg( + { source, darkMode, fontFamily }, + MERMAID_CONSTANTS.REQUEST_TIMEOUT_MS + ); + + // Check if this is an error SVG (contains "Mermaid Rendering Error") + if (svgString.includes('Mermaid Rendering Error')) { + // Recreate error SVG with proper dimensions + const errorSvg = createErrorSvg( + extractErrorMessage(svgString) || 'Rendering failed', + Math.max(400, height * 2), // Width based on height + height, + darkMode + ); + return errorSvg; + } + + const processedSvg = processSvg(svgString, height); + + return processedSvg; +}); + +/** + * Render Mermaid SVG for decoration display + * @param source - Mermaid diagram source code + * @param options - Rendering options including theme, fontFamily, numLines, and height + */ +export async function renderMermaidSvg( + source: string, + options: MermaidRenderOptions & { numLines?: number } +): Promise { + if (!webviewManager) { + throw new Error('Mermaid renderer not initialized. Call initMermaidRenderer first.'); + } + + await waitForWebviewOnceLogged(webviewManager); + + const darkMode = options.theme === 'dark'; + // Calculate height based on line count (like Markless: (numLines + 2) * lineHeight) + // Default to 200px if numLines not provided + const editorConfig = vscode.workspace.getConfiguration('editor'); + let lineHeight = editorConfig.get('lineHeight', 0); + + // If lineHeight is 0 or invalid, calculate from fontSize (like Markless does) + if (lineHeight === 0 || lineHeight < 8) { + const fontSize = editorConfig.get('fontSize', 14); + // Use platform-appropriate multiplier (Markless uses 1.5 for macOS, 1.35 for others) + const multiplier = process.platform === 'darwin' ? 1.5 : 1.35; + lineHeight = Math.round(multiplier * fontSize); + if (lineHeight < 8) { + lineHeight = 8; // Minimum line height + } + } + + const numLines = options.numLines || 5; + const height = options.height || ((numLines + 2) * lineHeight); + + return getMermaidDecoration(source, darkMode, height, options.fontFamily); +} + +// Re-export utilities for use by other modules +export { svgToDataUri } from './svg-processor'; +export { createErrorSvg } from './error-handler'; +export { ensureSvgDimensions, svgToDataUriBase64 } from './svg-processor'; + +/** + * Dispose and clean up the Mermaid renderer + */ +export function disposeMermaidRenderer(): void { + if (webviewManager) { + webviewManager.dispose(); + webviewManager = undefined; + } + + // Clear decoration cache + decorationCache.clear(); +} diff --git a/vs-code-extension/src/inline-editor/mermaid/svg-processor.ts b/vs-code-extension/src/inline-editor/mermaid/svg-processor.ts new file mode 100644 index 0000000..00e796b --- /dev/null +++ b/vs-code-extension/src/inline-editor/mermaid/svg-processor.ts @@ -0,0 +1,315 @@ +import * as cheerio from 'cheerio'; + +/** + * Process SVG to adjust dimensions based on line count + * Similar to Markless implementation + */ +export function processSvg(svgString: string, height: number): string { + const $ = cheerio.load(svgString, { xmlMode: true }); + const svgNode = $('svg').first(); + + if (svgNode.length === 0) { + return svgString; + } + + // Get original dimensions from height attribute or viewBox + // Note: width might be "100%" which we need to handle + const widthAttr = svgNode.attr('width') || '0'; + let originalHeight = parseFloat(svgNode.attr('height') || '0'); + let originalWidth = widthAttr === '100%' ? 0 : parseFloat(widthAttr) || 0; + + // If height/width not in attributes, try viewBox + if ((originalHeight === 0 || originalWidth === 0) && svgNode.attr('viewBox')) { + const viewBox = svgNode.attr('viewBox')!.split(/\s+/); + if (viewBox.length >= 4) { + const viewBoxWidth = parseFloat(viewBox[2]) || 0; + const viewBoxHeight = parseFloat(viewBox[3]) || 0; + if (originalWidth === 0 && viewBoxWidth > 0) { + originalWidth = viewBoxWidth; + } + if (originalHeight === 0 && viewBoxHeight > 0) { + originalHeight = viewBoxHeight; + } + } + } + + // Fix invalid viewBox with zero width (bug in Mermaid gantt charts) + // IMPORTANT: Preserve the original viewBox origin (min-x, min-y) to avoid mirroring + const currentViewBox = svgNode.attr('viewBox'); + if (currentViewBox) { + const viewBoxParts = currentViewBox.split(/\s+/); + if (viewBoxParts.length >= 4) { + const viewBoxMinX = parseFloat(viewBoxParts[0]) || 0; + const viewBoxMinY = parseFloat(viewBoxParts[1]) || 0; + const viewBoxWidth = parseFloat(viewBoxParts[2]) || 0; + const viewBoxHeight = parseFloat(viewBoxParts[3]) || 0; + + // If viewBox width is 0, fix it by using calculated width or minimum + if (viewBoxWidth === 0 && viewBoxHeight > 0) { + // Try to get width from SVG content bounds, or use a calculated width + let fixedWidth = originalWidth; + + // If we still don't have a width, calculate from aspect ratio or use minimum + if (fixedWidth === 0) { + // For gantt charts, we need a wider viewBox to accommodate the content + // Gantt charts often have content that extends beyond the initial viewBox + // Use a wider aspect ratio (at least 3:1) to ensure content fits + // Also account for potential negative coordinates by using a larger width + fixedWidth = Math.max(600, viewBoxHeight * 3); + } + + // Fix the viewBox attribute - preserve original origin coordinates + // For gantt charts with negative coordinates, we might need to adjust min-x + // But to avoid mirroring, we'll keep the original origin + const fixedViewBox = `${viewBoxMinX} ${viewBoxMinY} ${fixedWidth} ${viewBoxHeight}`; + svgNode.attr('viewBox', fixedViewBox); + + // Always update originalWidth and width attribute when fixing viewBox + // This ensures we have valid dimensions for later calculations + originalWidth = fixedWidth; + // Remove percentage-based width and set explicit pixel value + svgNode.attr('width', `${fixedWidth}`); + + } + } + } + + // Calculate width from aspect ratio using height as the limiting factor + // Formula: newWidth = (originalWidth / originalHeight) * limitingHeight + // This maintains aspect ratio for both wide and tall charts + // Use viewBox dimensions if available, as they're more reliable + let calculatedWidth: number | undefined; + let aspectRatio: number | undefined; + + // Get final dimensions from viewBox if available (after any fixes) + // Re-read viewBox after potential fix to ensure we have the latest value + const finalViewBox = svgNode.attr('viewBox'); + if (finalViewBox) { + const viewBoxParts = finalViewBox.split(/\s+/); + if (viewBoxParts.length >= 4) { + const viewBoxWidth = parseFloat(viewBoxParts[2]) || 0; + const viewBoxHeight = parseFloat(viewBoxParts[3]) || 0; + if (viewBoxWidth > 0 && viewBoxHeight > 0) { + // Use viewBox dimensions for aspect ratio (most reliable) + aspectRatio = viewBoxWidth / viewBoxHeight; + calculatedWidth = aspectRatio * height; + // Update originalWidth to match fixed viewBox for consistency + if (originalWidth === 0 || originalWidth !== viewBoxWidth) { + originalWidth = viewBoxWidth; + } + } + } + } + + // Fallback to attribute dimensions if viewBox calculation didn't work + if (!calculatedWidth && originalWidth > 0 && originalHeight > 0) { + aspectRatio = originalWidth / originalHeight; + calculatedWidth = aspectRatio * height; + } + + // Final fallback: use reasonable default + // Ensure calculatedWidth is always assigned + if (!calculatedWidth || calculatedWidth <= 0) { + // For wide charts (like gantt), assume at least 2:1 ratio + calculatedWidth = Math.max(400, height * 2); + if (!aspectRatio) { + aspectRatio = calculatedWidth / height; + } + } + + // Set explicit width and height attributes to maintain aspect ratio + // Remove any CSS max-width that might constrain wide charts + svgNode.css('max-width', ''); + + // Set dimensions - but preserve the original viewBox to avoid mirroring + // The viewBox defines the coordinate system, so we should keep it as-is + // calculatedWidth is guaranteed to be assigned at this point + svgNode.attr('width', `${calculatedWidth}px`); + svgNode.attr('height', `${height}px`); + + // Keep original preserveAspectRatio to maintain alignment + // Use 'meet' to ensure content fits within bounds while maintaining aspect ratio + if (!svgNode.attr('preserveAspectRatio')) { + svgNode.attr('preserveAspectRatio', 'xMinYMin meet'); + } + + // Extract only the SVG element, not the full HTML document + // Use toString() to get the SVG element with its attributes (like Markless) + const processedSvg = svgNode.toString(); + + return processedSvg; +} + +/** + * Reduce number precision in attribute values + * Rounds numbers to 2 decimal places, removes trailing zeros + * This can significantly reduce SVG size for diagrams with many coordinates + */ +function reduceNumberPrecision(value: string): string { + // Match numbers with 3+ decimal places (including decimals and negative numbers) + // Also match numbers in space-separated lists (like viewBox, transform) + return value.replace(/(-?\d+\.\d{3,})/g, (match) => { + const num = parseFloat(match); + if (isNaN(num)) return match; + // Round to 2 decimal places + const rounded = Math.round(num * 100) / 100; + // Convert to string and remove trailing zeros, but keep decimal point if needed + const str = rounded.toString(); + // If it's a whole number, return without decimal point + if (rounded % 1 === 0) { + return Math.round(rounded).toString(); + } + // Otherwise remove trailing zeros but keep at least one decimal place + return str.replace(/\.?0+$/, ''); + }); +} + +/** + * Simplify SVG path data by reducing precision + * Paths often contain many decimal places that can be rounded + */ +function simplifyPathData(pathData: string): string { + // Path data contains commands (M, L, C, etc.) followed by coordinates + // Reduce precision of all numbers in path data + return pathData.replace(/(-?\d+\.\d{3,})/g, (match) => { + const num = parseFloat(match); + if (isNaN(num)) return match; + // Round to 1 decimal place for paths (paths can tolerate more rounding) + const rounded = Math.round(num * 10) / 10; + return rounded.toString().replace(/\.?0+$/, ''); + }); +} + +/** + * Aggressively optimize SVG by removing unnecessary content and reducing precision + * This helps reduce size for large SVGs that might be truncated in VS Code hover + */ +function optimizeSvg(svgString: string): string { + const $ = cheerio.load(svgString, { xmlMode: true }); + const svgNode = $('svg').first(); + + if (svgNode.length === 0) { + return svgString; + } + + // Remove XML comments + $('*').contents().filter(function() { + return this.nodeType === 8; // Comment node + }).remove(); + + // Remove empty groups and elements (but preserve structure that might be needed) + $('g').each(function() { + const $group = $(this); + if ($group.children().length === 0 && !$group.attr('id') && !$group.attr('class')) { + $group.remove(); + } + }); + + // Optimize all elements: reduce precision and clean attributes + svgNode.find('*').each(function() { + const $elem = $(this); + + // Simplify path data (paths often have many high-precision coordinates) + const d = $elem.attr('d'); + if (d) { + $elem.attr('d', simplifyPathData(d)); + } + + // Reduce precision in numeric attributes (x, y, width, height, cx, cy, r, etc.) + const numericAttrs = ['x', 'y', 'width', 'height', 'cx', 'cy', 'r', 'rx', 'ry', + 'x1', 'y1', 'x2', 'y2', 'transform', 'viewBox']; + for (const attr of numericAttrs) { + const value = $elem.attr(attr); + if (value && typeof value === 'string') { + // Reduce precision in numeric values + const optimized = reduceNumberPrecision(value); + if (optimized !== value) { + $elem.attr(attr, optimized); + } + } + } + + // Clean up other attribute values (remove extra spaces) + for (const attr of this.attribs ? Object.keys(this.attribs) : []) { + if (!numericAttrs.includes(attr) && attr !== 'd') { + const value = this.attribs[attr]; + if (typeof value === 'string') { + // Remove leading/trailing whitespace from attribute values + const cleaned = value.trim().replace(/\s+/g, ' '); + if (cleaned !== value) { + $elem.attr(attr, cleaned); + } + } + } + } + }); + + // Also optimize SVG root attributes + const viewBox = svgNode.attr('viewBox'); + if (viewBox) { + svgNode.attr('viewBox', reduceNumberPrecision(viewBox)); + } + + // Get optimized SVG string + let optimized = svgNode.toString(); + + // Remove unnecessary whitespace between tags + optimized = optimized.replace(/>\s+<'); + + // Remove leading/trailing whitespace + optimized = optimized.trim(); + + return optimized; +} + +/** + * Ensure SVG has explicit width and height attributes for proper display + * Some Mermaid diagrams (especially state diagrams) may have percentage-based + * or missing dimensions that need to be set explicitly + */ +export function ensureSvgDimensions(svgString: string, width: number, height: number): string { + const $ = cheerio.load(svgString, { xmlMode: true }); + const svgNode = $('svg').first(); + + if (svgNode.length === 0) { + return svgString; + } + + // Set explicit pixel-based dimensions + svgNode.attr('width', `${width}px`); + svgNode.attr('height', `${height}px`); + + // Ensure viewBox exists if it doesn't, using the calculated dimensions + if (!svgNode.attr('viewBox')) { + svgNode.attr('viewBox', `0 0 ${width} ${height}`); + } + + // Remove any percentage-based width that might interfere + const currentWidth = svgNode.attr('width'); + if (currentWidth && currentWidth.includes('%')) { + svgNode.attr('width', `${width}px`); + } + + const result = svgNode.toString(); + + // Optimize the SVG to reduce size (helps with VS Code hover truncation) + return optimizeSvg(result); +} + +/** + * Convert SVG string to data URI using URL encoding + * URL encoding is typically shorter for SVG content + */ +export function svgToDataUri(svg: string): string { + const encoded = encodeURIComponent(svg); + return `data:image/svg+xml;charset=utf-8,${encoded}`; +} + +/** + * Convert SVG string to data URI using Base64 encoding + * Base64 might be handled differently by VS Code and could have different size limits + */ +export function svgToDataUriBase64(svg: string): string { + const encoded = Buffer.from(svg, 'utf8').toString('base64'); + return `data:image/svg+xml;base64,${encoded}`; +} diff --git a/vs-code-extension/src/inline-editor/mermaid/types.ts b/vs-code-extension/src/inline-editor/mermaid/types.ts new file mode 100644 index 0000000..4a85674 --- /dev/null +++ b/vs-code-extension/src/inline-editor/mermaid/types.ts @@ -0,0 +1,38 @@ +/** + * Options for rendering Mermaid diagrams + */ +export type MermaidRenderOptions = { + theme: 'default' | 'dark'; + fontFamily?: string; + height?: number; // Height in pixels based on line count + numLines?: number; // Number of lines in the code block +}; + +/** + * Pending render request tracking + */ +export type PendingRender = { + resolve: (svg: string) => void; + reject: (error: Error) => void; + timeoutId: NodeJS.Timeout; +}; + +/** + * Message sent to webview for rendering + */ +export type RenderRequest = { + source: string; + darkMode: boolean; + fontFamily?: string; + requestId: string; +}; + +/** + * Message received from webview + */ +export type RenderResponse = { + svg?: string; + error?: string; + requestId?: string; + ready?: boolean; +}; diff --git a/vs-code-extension/src/inline-editor/mermaid/webview-manager.ts b/vs-code-extension/src/inline-editor/mermaid/webview-manager.ts new file mode 100644 index 0000000..9e4afbc --- /dev/null +++ b/vs-code-extension/src/inline-editor/mermaid/webview-manager.ts @@ -0,0 +1,466 @@ +import * as vscode from 'vscode'; +import { ColorThemeKind } from 'vscode'; +import type { PendingRender, RenderResponse } from './types'; +import { MERMAID_CONSTANTS } from './constants'; +import { createErrorSvg } from './error-handler'; + +/** + * Manages the Mermaid webview lifecycle and communication + */ +export class MermaidWebviewManager { + private webviewView: vscode.WebviewView | undefined; + private webviewLoaded: Promise; + private resolveWebviewLoaded: (() => void) | undefined; + private pendingRenders = new Map(); + private renderRequestCounter = 0; + private messageHandlerDisposable: vscode.Disposable | undefined; + private initTimeoutId: NodeJS.Timeout | undefined; + private _extensionContext: vscode.ExtensionContext | undefined; + + constructor() { + this.webviewLoaded = new Promise((resolve) => { + this.resolveWebviewLoaded = resolve; + }); + } + + /** + * Get the extension context (for use by webview provider) + */ + get extensionContext(): vscode.ExtensionContext | undefined { + return this._extensionContext; + } + + /** + * Initialize the webview manager with extension context + */ + initialize(context: vscode.ExtensionContext): void { + this._extensionContext = context; + + // Register the webview view provider + const provider = new MermaidWebviewViewProvider(this); + context.subscriptions.push( + vscode.window.registerWebviewViewProvider( + MermaidWebviewViewProvider.viewType, + provider, + { webviewOptions: { retainContextWhenHidden: true } } + ) + ); + + // Open the mermaid view briefly to initialize it, then switch back + // Focus the view so VS Code calls resolveWebviewView() (hidden views are not resolved by opening the container only) + void this.ensureWebviewThenSwitchBack(); + } + + /** + * Focus the Mermaid view to trigger webview creation, wait for it (or 5s), then switch back to Explorer. + */ + private ensureWebviewThenSwitchBack(): void { + const WEBVIEW_READY_TIMEOUT_MS = 5000; + const SWITCH_BACK_DELAY_MS = 100; + + vscode.commands + .executeCommand('as-notes.mermaidRenderer.focus') + .then( + () => { + // Wait for webview to be ready or timeout, then switch back + Promise.race([ + this.webviewLoaded, + new Promise((_, reject) => + setTimeout(() => reject(new Error('timeout')), WEBVIEW_READY_TIMEOUT_MS) + ), + ]) + .then(() => { + this.initTimeoutId = setTimeout(() => { + vscode.commands.executeCommand('workbench.view.explorer'); + this.initTimeoutId = undefined; + }, SWITCH_BACK_DELAY_MS); + }) + .catch((err: unknown) => { + if (err instanceof Error && err.message === 'timeout') { + console.warn('Mermaid: Webview not ready after opening view'); + } + this.initTimeoutId = setTimeout(() => { + vscode.commands.executeCommand('workbench.view.explorer'); + this.initTimeoutId = undefined; + }, SWITCH_BACK_DELAY_MS); + }); + }, + (err: unknown) => { + if (err !== undefined) { + console.warn('Mermaid: Failed to focus view', err); + } + } + ); + } + + /** + * Set the webview view instance + */ + setWebviewView(view: vscode.WebviewView): void { + this.webviewView = view; + // Resolve webviewLoaded immediately when webview is created + this.resolveWebviewLoaded?.(); + } + + /** + * Get the webview HTML content + */ + getWebviewContent(webview: vscode.Webview, extensionUri: vscode.Uri): string { + // Use local Mermaid bundle (no internet required) + const mermaidScriptUri = webview.asWebviewUri( + vscode.Uri.joinPath(extensionUri, 'media', 'mermaid', 'mermaid.esm.min.mjs') + ); + + return ` + + + + + + +
+

Mermaid Diagram Renderer

+

This webview is used internally by AS Notes to render Mermaid diagrams inline in your markdown files.

+

You can safely ignore this view. It runs in the background and has no user-facing functionality. The diagrams appear directly in your editor, not here.

+

If you're seeing this view, you can close it and return to your editor. The extension will continue to work normally.

+
+ + + +`; + } + + /** + * Handle messages from the webview + */ + handleWebviewMessage(message: RenderResponse): void { + // Ignore "ready" messages - we don't need them anymore + if (message && message.ready) { + return; + } + + if (message && message.error) { + const requestId = message.requestId; + if (requestId && this.pendingRenders.has(requestId)) { + const { resolve, timeoutId } = this.pendingRenders.get(requestId)!; + // Clear timeout since we're handling the error + clearTimeout(timeoutId); + // Create a proper error SVG - height will be adjusted in getMermaidDecoration + const isDark = vscode.window.activeColorTheme.kind === ColorThemeKind.Dark || + vscode.window.activeColorTheme.kind === ColorThemeKind.HighContrast; + const errorSvg = createErrorSvg( + message.error, + 400, // Default width - will be resized later + 200, // Default height - will be resized later + isDark + ); + resolve(errorSvg); + this.pendingRenders.delete(requestId); + } + return; + } + + // Handle SVG response (with requestId) or legacy string format + if (message && message.requestId && this.pendingRenders.has(message.requestId)) { + const requestId = message.requestId; + const { resolve, timeoutId } = this.pendingRenders.get(requestId)!; + // Clear timeout since we received the response + clearTimeout(timeoutId); + // message.svg should always be present for RenderResponse with requestId + const svg = message.svg || ''; + resolve(svg); + this.pendingRenders.delete(requestId); + return; + } + + // Legacy support: string message without requestId (for backwards compatibility) + if (typeof message === 'string') { + // If there's only one pending render, use it (backwards compatibility) + if (this.pendingRenders.size === 1) { + const [requestId, { resolve, timeoutId }] = Array.from(this.pendingRenders.entries())[0]; + clearTimeout(timeoutId); + resolve(message); + this.pendingRenders.delete(requestId); + } + } + } + + /** + * Set the message handler disposable for cleanup + */ + setMessageHandlerDisposable(disposable: vscode.Disposable): void { + this.messageHandlerDisposable?.dispose(); + this.messageHandlerDisposable = disposable; + } + + /** + * Request SVG rendering with timeout and optional cancellation + */ + async requestSvg( + data: { source: string; darkMode: boolean; fontFamily?: string }, + timeoutMs: number = MERMAID_CONSTANTS.REQUEST_TIMEOUT_MS, + cancellationToken?: vscode.CancellationToken + ): Promise { + if (!this.webviewView) { + throw new Error('Webview not available'); + } + + // Generate unique request ID for this render + const requestId = `req-${Date.now()}-${++this.renderRequestCounter}`; + + // Create promise BEFORE posting message (like Markless pattern) + // Track pending renders in a Map to handle concurrent requests + return new Promise((resolve, reject) => { + if (!this.webviewView) { + reject(new Error('Webview not available')); + return; + } + + // Check cancellation token before starting + if (cancellationToken?.isCancellationRequested) { + reject(new vscode.CancellationError()); + return; + } + + // Set up cancellation listener if token provided + let cancellationListener: vscode.Disposable | undefined; + if (cancellationToken) { + cancellationListener = cancellationToken.onCancellationRequested(() => { + if (this.pendingRenders.has(requestId)) { + const { timeoutId } = this.pendingRenders.get(requestId)!; + clearTimeout(timeoutId); + this.pendingRenders.delete(requestId); + cancellationListener?.dispose(); + reject(new vscode.CancellationError()); + } + }); + } + + // Set up timeout to prevent promise leaks from failed requests + const timeoutId = setTimeout(() => { + if (this.pendingRenders.has(requestId)) { + this.pendingRenders.delete(requestId); + cancellationListener?.dispose(); + reject(new Error('Mermaid render request timed out')); + } + }, timeoutMs); + + // Wrap resolve/reject to clear timeout and cancellation listener + const wrappedResolve = (value: string) => { + clearTimeout(timeoutId); + cancellationListener?.dispose(); + resolve(value); + }; + + const wrappedReject = (error: Error) => { + clearTimeout(timeoutId); + cancellationListener?.dispose(); + reject(error); + }; + + // Store resolve/reject with timeout ID in Map + this.pendingRenders.set(requestId, { + resolve: wrappedResolve, + reject: wrappedReject, + timeoutId + }); + + try { + // Include requestId in message so webview can send it back + this.webviewView.webview.postMessage({ ...data, requestId }); + } catch (error) { + // Clean up on error + clearTimeout(timeoutId); + cancellationListener?.dispose(); + this.pendingRenders.delete(requestId); + reject(error); + } + }); + } + + /** + * Wait for webview to be loaded + */ + async waitForWebview(): Promise { + await this.webviewLoaded; + if (!this.webviewView) { + throw new Error('Failed to create mermaid webview'); + } + } + + /** + * Dispose and clean up resources + */ + dispose(): void { + // Clear timeout if still pending + if (this.initTimeoutId) { + clearTimeout(this.initTimeoutId); + this.initTimeoutId = undefined; + } + + // Clear all pending render timeouts and reject promises + for (const { reject, timeoutId } of this.pendingRenders.values()) { + clearTimeout(timeoutId); + reject(new Error('Mermaid renderer disposed')); + } + this.pendingRenders.clear(); + + // Dispose message handler subscription + this.messageHandlerDisposable?.dispose(); + this.messageHandlerDisposable = undefined; + + // Clear webview reference + this.webviewView = undefined; + this.resolveWebviewLoaded = undefined; + } +} + +/** + * Webview view provider for Mermaid rendering + */ +class MermaidWebviewViewProvider implements vscode.WebviewViewProvider { + public static readonly viewType = 'as-notes.mermaidRenderer'; + + constructor(private manager: MermaidWebviewManager) { } + + resolveWebviewView(webviewView: vscode.WebviewView): void { + if (!this.manager.extensionContext) { + return; + } + + const extensionContext = this.manager.extensionContext; + + // Dispose previous message handler if exists (prevent memory leak on webview recreation) + const previousDisposable = this.manager['messageHandlerDisposable']; + previousDisposable?.dispose(); + + // Configure webview to allow access to local assets + webviewView.webview.options = { + enableScripts: true, + localResourceRoots: [ + vscode.Uri.joinPath(extensionContext.extensionUri, 'media') + ] + }; + + webviewView.webview.html = this.manager.getWebviewContent(webviewView.webview, extensionContext.extensionUri); + + // Store reference BEFORE setting up handlers (like Markless does) + this.manager.setWebviewView(webviewView); + + // Handle messages from the webview - store disposable for cleanup + const messageHandlerDisposable = webviewView.webview.onDidReceiveMessage((message) => { + this.manager.handleWebviewMessage(message); + }, null, []); + + this.manager.setMessageHandlerDisposable(messageHandlerDisposable); + } +} diff --git a/vs-code-extension/src/inline-editor/parser-remark.ts b/vs-code-extension/src/inline-editor/parser-remark.ts new file mode 100644 index 0000000..f6e4e6a --- /dev/null +++ b/vs-code-extension/src/inline-editor/parser-remark.ts @@ -0,0 +1,54 @@ +// Helper module to handle ESM imports for remark +// This allows the parser to work in both CommonJS (VS Code) and ESM (Jest) contexts + +let unified: any; +let remarkParse: any; +let remarkGfm: any; +let visit: any; + +export async function getRemarkProcessor() { + if (!unified) { + try { + // Try CommonJS require first (for VS Code extension runtime) + unified = require('unified').unified; + remarkParse = require('remark-parse'); + remarkGfm = require('remark-gfm'); + visit = require('unist-util-visit').visit; + } catch { + // Fall back to ESM dynamic import (for Jest/testing) + const unifiedModule = await import('unified'); + unified = unifiedModule.unified; + remarkParse = await import('remark-parse'); + remarkGfm = await import('remark-gfm'); + const visitModule = await import('unist-util-visit'); + visit = visitModule.visit; + } + } + + return { + unified, + remarkParse: remarkParse.default || remarkParse, + remarkGfm: remarkGfm.default || remarkGfm, + visit, + }; +} + +// Synchronous version for VS Code extension (uses require) +export function getRemarkProcessorSync() { + if (!unified) { + // Use require - works in VS Code extension CommonJS context + // For Jest, we need to ensure transformIgnorePatterns includes these modules + unified = require('unified').unified; + remarkParse = require('remark-parse'); + remarkGfm = require('remark-gfm'); + visit = require('unist-util-visit').visit; + } + + return { + unified, + remarkParse: remarkParse.default || remarkParse, + remarkGfm: remarkGfm.default || remarkGfm, + visit, + }; +} + diff --git a/vs-code-extension/src/inline-editor/parser.ts b/vs-code-extension/src/inline-editor/parser.ts new file mode 100644 index 0000000..f5be8d1 --- /dev/null +++ b/vs-code-extension/src/inline-editor/parser.ts @@ -0,0 +1,2856 @@ +import type { + Root, + Strong, + Emphasis, + Heading, + InlineCode, + Code, + Link, + Image, + Delete, + Blockquote, + ListItem, + ThematicBreak, + Text, + Table, + TableCell, +} from "mdast"; +import type { Node } from "unist"; +import { getRemarkProcessorSync, getRemarkProcessor } from "./parser-remark"; +import { getEmojiMap } from "./emoji-map-loader"; +import { scanMathRegions } from "./math/math-scanner"; +import { config } from "./config"; + +/** + * Represents a decoration range in the markdown document. + * + * @interface DecorationRange + * @property {number} startPos - Character position (0-based, inclusive) + * @property {number} endPos - Character position (0-based, exclusive) + * @property {DecorationType} type - The type of decoration to apply + */ +export interface DecorationRange { + startPos: number; + endPos: number; + type: DecorationType; + url?: string; // URL for link decorations (for clickable links) + level?: number; // Nesting level for blockquotes + emoji?: string; // Emoji character for emoji shortcode replacements + replacement?: string; // Replacement text for table pipe/cell decorations + cellStyle?: { + fontWeight?: string; + fontStyle?: string; + textDecoration?: string; + }; + slug?: string; // For type 'mention': segment after @ (e.g. username, org/team). Used by link provider to resolve URL. + issueNumber?: number; // For type 'issueReference': issue/PR number. Used by link provider to resolve URL. + ownerRepo?: string; // For type 'issueReference' when repo-scoped (@user/repo#456): the "user/repo" part. +} + +/** + * Represents a markdown construct scope (e.g., **bold**, [link](url)). + * Positions are in normalized text offsets (LF line endings). + */ +export interface ScopeRange { + startPos: number; + endPos: number; + kind?: string; +} + +export interface MermaidBlock { + startPos: number; + endPos: number; + source: string; + /** + * Number of lines in `source` (1 + newline count). + * + * Precomputed during parsing to avoid re-counting on every selection change. + */ + numLines: number; +} + +/** + * One detected math span (inline $...$ or block $$...$$). + * Positions are in normalized document text (LF line endings). + * For fence-derived regions: startPos/endPos span the whole fenced block; source is body only; numLines is body line count for height. + */ +export interface MathRegion { + startPos: number; + endPos: number; + source: string; + displayMode: boolean; + /** Body line count for fence-derived display math; used for height = (numLines + 2) × line height. Omitted for delimiter math. */ + numLines?: number; +} + +/** + * Result of parsing markdown for decorations and scopes. + */ +export interface ParseResult { + decorations: DecorationRange[]; + scopes: ScopeRange[]; + mermaidBlocks: MermaidBlock[]; + mathRegions: MathRegion[]; +} + +/** + * Types of decorations that can be applied to markdown content. + */ +export type DecorationType = + | "hide" + | "transparent" + // Selection overlay used by the Decorator (not emitted by the parser) + | "selectionOverlay" + // Ghost-faint markers used by the Decorator (not emitted by the parser) + | "ghostFaint" + | "emoji" + | "bold" + | "italic" + | "boldItalic" + | "strikethrough" + | "code" + | "codeBlock" + | "codeBlockLanguage" + | "heading" + | "heading1" + | "heading2" + | "heading3" + | "heading4" + | "heading5" + | "heading6" + | "link" + | "image" + | "blockquote" + | "listItem" + | "orderedListItem" + | "checkboxUnchecked" + | "checkboxChecked" + | "horizontalRule" + | "frontmatter" + | "frontmatterDelimiter" + | "tablePipe" + | "tableSeparatorPipe" + | "tableSeparatorDash" + | "tableCell" + | "mention" + | "issueReference"; + +/** + * Type for the unified processor used to parse markdown text to a Root AST node. + * + * The processor is created by the `unified()` function from the unified ecosystem + * and configured with remark-parse and remark-gfm plugins. + */ +type UnifiedProcessor = { + parse: (text: string) => Root; +}; + +/** + * Type for the visit function from unist-util-visit. + * + * Traverses nodes in a tree structure (AST) and calls the visitor function + * for each node. The visitor receives: node, index (optional), parent (optional). + */ +type VisitFunction = ( + tree: Root, + visitor: (node: Node, index?: number, parent?: Node) => void, +) => void; + +/** + * A parser that extracts decoration ranges from markdown text. + * + * This class uses `remark` to parse the input markdown and determines ranges for: + * - Markdown syntax markers (for hiding, e.g., `**`, `#`, `` ` ``) + * - Content (for applying styles such as bold, italic, headings, etc.) + * + * @class MarkdownParser + * @example + * // Synchronous usage (VS Code extension): + * const parser = new MarkdownParser(); + * const decorations = parser.extractDecorations('# Heading\n**bold** text'); + * + * // Asynchronous usage (ESM tests): + * const parser = await MarkdownParser.create(); + * const decorations = parser.extractDecorations('# Heading\n**bold** text'); + */ +export class MarkdownParser { + private processor: UnifiedProcessor; + private visit: VisitFunction; + + constructor() { + const { unified, remarkParse, remarkGfm, visit } = getRemarkProcessorSync(); + this.visit = visit; + this.processor = unified().use(remarkParse).use(remarkGfm); + } + + /** + * Async factory method to create a MarkdownParser instance. + * Uses dynamic imports to support ESM modules in test environments. + * + * @returns {Promise} A promise that resolves to a MarkdownParser instance + */ + static async create(): Promise { + const parser = Object.create(MarkdownParser.prototype); + const { unified, remarkParse, remarkGfm, visit } = + await getRemarkProcessor(); + parser.visit = visit; + parser.processor = unified().use(remarkParse).use(remarkGfm); + return parser; + } + + /** + * Extracts decoration ranges from markdown text. + * + * @param {string} text - The markdown text to parse + * @returns {DecorationRange[]} Array of decoration ranges, sorted by startPos + */ + extractDecorations(text: string): DecorationRange[] { + return this.extractDecorationsWithScopes(text).decorations; + } + + /** + * Extracts decoration ranges and explicit scope ranges from markdown text. + * + * @param {string} text - The markdown text to parse + * @returns {ParseResult} Decorations and scopes, sorted by startPos + */ + extractDecorationsWithScopes(text: string): ParseResult { + if (!text || typeof text !== "string") { + return { + decorations: [], + scopes: [], + mermaidBlocks: [], + mathRegions: [], + }; + } + + // Normalize line endings to \n for consistent position tracking + // Optimization: Only normalize if document contains CRLF + const normalizedText = + text.indexOf("\r") !== -1 ? text.replace(/\r\n|\r/g, "\n") : text; + + const decorations: DecorationRange[] = []; + const scopes: ScopeRange[] = []; + const mermaidBlocks: MermaidBlock[] = []; + + // Process frontmatter before remark parsing to avoid conflicts with thematic break detection + this.processFrontmatter(normalizedText, decorations, scopes); + + try { + // Parse markdown into AST + const ast = this.processor.parse(normalizedText) as Root; + + // Process AST nodes and extract decorations + scopes + this.processAST(ast, normalizedText, decorations, scopes, mermaidBlocks); + + // Handle edge cases: empty image alt text that remark doesn't parse as Image node + this.handleEmptyImageAlt(normalizedText, decorations); + + // GitHub-style mentions and issue references (@username, @org/team, #123, @user/repo#456) + if (config.mentions.enabled()) { + this.scanMentionAndIssueRefs(normalizedText, decorations, scopes); + } + + // Safety net: Remove any markdown formatting decorations that fall within code blocks + // Ancestor checks in processors prevent most cases, but this catches edge cases + this.filterDecorationsInCodeBlocks(decorations, scopes, normalizedText); + + // Sort decorations by start position + decorations.sort((a, b) => a.startPos - b.startPos); + } catch (error) { + // Gracefully handle parse errors + console.error("Error parsing markdown:", error); + } + + return { + decorations, + scopes: this.dedupeScopes(scopes), + mermaidBlocks, + mathRegions: scanMathRegions(normalizedText), + }; + } + + /** + * Processes the remark AST to extract decoration ranges. + * + * Uses a proper visitor pattern with ancestor tracking for efficient traversal. + * + * @private + * @param {Root} ast - The parsed AST root node + * @param {string} text - The original markdown text + * @param {DecorationRange[]} decorations - Array to accumulate decorations + */ + private processAST( + ast: Root, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + mermaidBlocks: MermaidBlock[], + ): void { + // Track processed blockquote positions to avoid duplicates from nested blockquotes + const processedBlockquotePositions = new Set(); + + // Use a map to efficiently track ancestors for each node + const ancestorMap = new Map(); + + this.visit( + ast, + (node: Node, index: number | undefined, parent: Node | undefined) => { + // Optimization: Trust remark's position data in hot path + // Individual process methods still validate for safety + try { + // Build ancestor chain efficiently using parent's cached ancestors + const currentAncestors: Node[] = []; + if (parent) { + currentAncestors.push(parent); + // Get parent's ancestors from cache (O(1) lookup instead of O(n) search) + const parentAncestors = ancestorMap.get(parent); + if (parentAncestors) { + currentAncestors.push(...parentAncestors); + } + } + + // Cache this node's ancestors for its children to use + if (currentAncestors.length > 0) { + ancestorMap.set(node, currentAncestors); + } + + switch (node.type) { + case "heading": + this.processHeading( + node as Heading, + text, + decorations, + scopes, + currentAncestors, + ); + break; + + case "strong": + this.processStrong( + node as Strong, + text, + decorations, + scopes, + currentAncestors, + ); + break; + + case "emphasis": + this.processEmphasis( + node as Emphasis, + text, + decorations, + scopes, + currentAncestors, + ); + break; + + case "delete": + this.processStrikethrough( + node as Delete, + text, + decorations, + scopes, + currentAncestors, + ); + break; + + case "inlineCode": + this.processInlineCode( + node as InlineCode, + text, + decorations, + scopes, + ); + break; + + case "code": + this.processCodeBlock( + node as Code, + text, + decorations, + scopes, + mermaidBlocks, + ); + break; + + case "link": + this.processLink( + node as Link, + text, + decorations, + scopes, + currentAncestors, + ); + break; + + case "image": + this.processImage( + node as Image, + text, + decorations, + scopes, + currentAncestors, + ); + break; + + case "blockquote": + this.processBlockquote( + node as Blockquote, + text, + decorations, + scopes, + processedBlockquotePositions, + currentAncestors, + ); + break; + + case "listItem": + this.processListItem( + node as ListItem, + text, + decorations, + scopes, + currentAncestors, + ); + break; + + case "thematicBreak": + this.processThematicBreak( + node as ThematicBreak, + text, + decorations, + scopes, + currentAncestors, + ); + break; + + case "text": + this.processText( + node as Text, + decorations, + scopes, + currentAncestors, + ); + break; + + case "table": + this.processTable( + node as Table, + text, + decorations, + scopes, + currentAncestors, + ); + break; + } + } catch (error) { + // Gracefully handle invalid positions or processing errors + // Individual methods still validate, so this catches unexpected issues + console.warn("Error processing AST node:", node.type, error); + } + }, + ); + } + + /** + * Validates that a node has valid position information. + * @returns {boolean} True if node position is valid + */ + private hasValidPosition(node: Node): boolean { + return !!( + node.position && + node.position.start.offset !== undefined && + node.position.end.offset !== undefined + ); + } + + /** + * Checks if any ancestor node is a code block (fenced or inline). + * Used to skip processing markdown formatting inside code blocks. + * + * @param ancestors - Array of ancestor nodes to check + * @returns {boolean} True if any ancestor is a code block + */ + private isInCodeBlock(ancestors: Node[]): boolean { + return ancestors.some((a) => a.type === "code" || a.type === "inlineCode"); + } + + /** + * Adds hide decorations for opening and closing markers, and content decoration. + * Common pattern for bold, italic, strikethrough, and inline code. + * + * @param decorations - Array to add decorations to + * @param start - Start position of the node + * @param end - End position of the node + * @param markerLength - Length of the opening/closing marker + * @param contentType - Type of decoration for the content + */ + private addMarkerDecorations( + decorations: DecorationRange[], + start: number, + end: number, + markerLength: number, + contentType: DecorationType, + ): void { + const contentStart = start + markerLength; + const contentEnd = end - markerLength; + + // Hide opening marker + decorations.push({ startPos: start, endPos: contentStart, type: "hide" }); + + // Add content decoration + if (contentStart < contentEnd) { + decorations.push({ + startPos: contentStart, + endPos: contentEnd, + type: contentType, + }); + } + + // Hide closing marker + decorations.push({ startPos: contentEnd, endPos: end, type: "hide" }); + } + + /** + * Adds a scope range for a markdown construct if valid. + */ + private addScope( + scopes: ScopeRange[], + startPos: number, + endPos: number, + kind?: string, + ): void { + if (startPos < endPos) { + scopes.push({ startPos, endPos, kind }); + } + } + + /** + * Deduplicates and sorts scopes by start position. + */ + private dedupeScopes(scopes: ScopeRange[]): ScopeRange[] { + if (scopes.length === 0) { + return []; + } + + const unique = new Map(); + for (const scope of scopes) { + const key = `${scope.startPos}:${scope.endPos}`; + if (!unique.has(key)) { + unique.set(key, scope); + } + } + + return Array.from(unique.values()).sort((a, b) => { + if (a.startPos !== b.startPos) { + return a.startPos - b.startPos; + } + return a.endPos - b.endPos; + }); + } + + /** + * Scans normalized text for GitHub-style @mentions and #issue references. + * Pushes decoration ranges and scopes; excludes code blocks and email patterns. + */ + private scanMentionAndIssueRefs( + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ): void { + const codeRanges = this.getCodeBlockRanges(scopes); + const inCode = (start: number, end: number) => + codeRanges.some((r) => start < r.end && end > r.start); + const occupiedIssueRanges: Array<{ start: number; end: number }> = []; + const overlapsIssueRange = (start: number, end: number) => + occupiedIssueRanges.some((r) => start < r.end && end > r.start); + + // Match @user/repo#456 first (repo-scoped issue), then @org/team, then @username, then #123 + const repoScopedRefRe = + /@([a-zA-Z0-9][a-zA-Z0-9-]*)\/([a-zA-Z0-9][a-zA-Z0-9-]*)#(\d+)/g; + let m: RegExpExecArray | null; + while ((m = repoScopedRefRe.exec(text)) !== null) { + const start = m.index; + const end = m.index + m[0].length; + if (inCode(start, end)) continue; + if (this.looksLikeEmailAt(text, start)) continue; + const ownerRepo = `${m[1]}/${m[2]}`; + decorations.push({ + startPos: start, + endPos: end, + type: "issueReference", + issueNumber: parseInt(m[3], 10), + ownerRepo, + }); + occupiedIssueRanges.push({ start, end }); + this.addScope(scopes, start, end, "issueReference"); + } + + // @org/team (exactly one slash, token boundary after team segment) + const orgTeamRe = + /@([a-zA-Z0-9][a-zA-Z0-9-]*)\/([a-zA-Z0-9][a-zA-Z0-9-]*)(?=$|[^a-zA-Z0-9-])/g; + while ((m = orgTeamRe.exec(text)) !== null) { + const start = m.index; + const end = m.index + m[0].length; + if (inCode(start, end)) continue; + if (this.looksLikeEmailAt(text, start)) continue; + // Repo-scoped refs (@owner/repo#123) are handled above as issueReference. + if (text[end] === "#") continue; + decorations.push({ + startPos: start, + endPos: end, + type: "mention", + slug: `${m[1]}/${m[2]}`, + }); + this.addScope(scopes, start, end, "mention"); + } + + // @username (alphanumeric and hyphen, no leading hyphen) + const userRe = /@([a-zA-Z0-9][a-zA-Z0-9-]*)(?![a-zA-Z0-9_/-])/g; + while ((m = userRe.exec(text)) !== null) { + const start = m.index; + const end = m.index + m[0].length; + if (inCode(start, end)) continue; + if (this.looksLikeEmailAt(text, start)) continue; + decorations.push({ + startPos: start, + endPos: end, + type: "mention", + slug: m[1], + }); + this.addScope(scopes, start, end, "mention"); + } + + // #123 (digits only) + const issueRe = /#(\d+)/g; + while ((m = issueRe.exec(text)) !== null) { + const start = m.index; + const end = m.index + m[0].length; + if (inCode(start, end)) continue; + if (overlapsIssueRange(start, end)) continue; + decorations.push({ + startPos: start, + endPos: end, + type: "issueReference", + issueNumber: parseInt(m[1], 10), + }); + this.addScope(scopes, start, end, "issueReference"); + } + } + + /** Returns whether the @ at position atIdx appears to be part of an email (local@domain). */ + private looksLikeEmailAt(text: string, atIdx: number): boolean { + let lo = atIdx - 1; + while (lo >= 0 && /[a-zA-Z0-9._%+-]/.test(text[lo])) lo--; + const localPart = text.slice(lo + 1, atIdx); + let hi = atIdx + 1; + while (hi < text.length && /[a-zA-Z0-9.-]/.test(text[hi])) hi++; + const domainPart = text.slice(atIdx + 1, hi); + if (!localPart.length || !domainPart.length) return false; + if (!/\./.test(domainPart)) return false; + return true; + } + + /** Builds code block ranges from scopes for mention/ref exclusion. */ + private getCodeBlockRanges( + scopes: ScopeRange[], + ): Array<{ start: number; end: number }> { + const out: Array<{ start: number; end: number }> = []; + for (const scope of scopes) { + if (scope.kind === "codeBlock" || scope.kind === "code") { + out.push({ start: scope.startPos, end: scope.endPos }); + } + } + out.sort((a, b) => a.start - b.start); + return out; + } + + /** + * Filters out markdown formatting decorations that fall within code blocks. + * + * This is a safety net: ancestor checks in processors prevent most cases, but this + * catches any edge cases where decorations might still be created inside code blocks. + * + * Only code block specific decorations are preserved: + * - codeBlock, codeBlockLanguage, code, transparent + * - hide decorations that are part of fence structure (fence markers, newlines on fence lines) + * + * @param decorations - Array of decorations to filter (modified in place) + * @param scopes - Array of scope ranges (used to identify code blocks) + * @param text - The normalized markdown text (used to identify fence lines) + */ + private filterDecorationsInCodeBlocks( + decorations: DecorationRange[], + scopes: ScopeRange[], + text: string, + ): void { + // Collect code block ranges and pre-compute opening line ends for fenced blocks + const codeBlockRanges: Array<{ + start: number; + end: number; + isFenced: boolean; + openingLineEnd?: number; // Pre-computed for fenced blocks + }> = []; + + for (const scope of scopes) { + if (scope.kind === "codeBlock") { + // Pre-compute opening line end once per fenced code block + const openingLineEnd = text.indexOf("\n", scope.startPos); + codeBlockRanges.push({ + start: scope.startPos, + end: scope.endPos, + isFenced: true, + openingLineEnd: + openingLineEnd !== -1 ? openingLineEnd + 1 : undefined, + }); + } else if (scope.kind === "code") { + codeBlockRanges.push({ + start: scope.startPos, + end: scope.endPos, + isFenced: false, + }); + } + } + if (codeBlockRanges.length === 0) { + return; + } + + // Sort ranges by start position for efficient lookup + codeBlockRanges.sort((a, b) => a.start - b.start); + + // Find min/max bounds for early exit optimization + const minCodeBlockStart = codeBlockRanges[0].start; + const maxCodeBlockEnd = Math.max(...codeBlockRanges.map((r) => r.end)); + + // Decorations that are always allowed inside code blocks + const alwaysAllowed = new Set([ + "codeBlock", + "codeBlockLanguage", + "code", + "transparent", + ]); + + // Remove all other decorations that fall within code blocks + for (let i = decorations.length - 1; i >= 0; i--) { + const decoration = decorations[i]; + + // Always allowed decorations - fast path + if (alwaysAllowed.has(decoration.type)) { + continue; + } + + // Early exit: decoration is before first code block or after last code block + if ( + decoration.endPos <= minCodeBlockStart || + decoration.startPos >= maxCodeBlockEnd + ) { + continue; + } + + // Find matching code block range (ranges are sorted, so we can stop early) + let matchingRange: (typeof codeBlockRanges)[0] | undefined; + for (const range of codeBlockRanges) { + // Early exit if we've passed all possible matches + if (decoration.startPos < range.start) { + break; + } + // Check if decoration is inside this range + if ( + decoration.startPos >= range.start && + decoration.endPos <= range.end + ) { + matchingRange = range; + break; + } + } + + if (!matchingRange) { + continue; // Not in a code block + } + + // Special handling for hide decorations: only keep fence structure + if (decoration.type === "hide" && matchingRange.isFenced) { + // Fence markers are at boundaries: opening fence starts at range.start, closing fence ends at range.end + const isOpeningFence = decoration.startPos === matchingRange.start; + const isClosingFence = decoration.endPos === matchingRange.end; + + // Check if it's on the opening line (using pre-computed value) + const isOnOpeningLine = + matchingRange.openingLineEnd !== undefined && + decoration.startPos >= matchingRange.start && + decoration.endPos <= matchingRange.openingLineEnd; + + // Keep hide decorations that are clearly fence structure + if (isOpeningFence || isClosingFence || isOnOpeningLine) { + continue; + } + // Remove all other hide decorations inside fenced code blocks + decorations.splice(i, 1); + continue; + } + + // For inline code blocks, remove all hide decorations (they use transparent, not hide) + if (decoration.type === "hide" && !matchingRange.isFenced) { + decorations.splice(i, 1); + continue; + } + + // Remove all other decorations inside code blocks + decorations.splice(i, 1); + } + } + + /** + * Processes a heading node. + */ + private processHeading( + node: Heading, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ancestors: Node[], + ): void { + if (!this.hasValidPosition(node)) return; + + // Don't parse headings inside code blocks + if (this.isInCodeBlock(ancestors)) { + return; + } + + const start = node.position!.start.offset!; + const end = node.position!.end.offset!; + + // Find the heading marker (#) by checking the source text + let markerLength = 0; + let pos = start; + while (pos < end && text[pos] === "#") { + markerLength++; + pos++; + } + + if (markerLength === 0) return; + + const level = markerLength; + const headingType = `heading${level}` as DecorationType; + + // Find whitespace after marker + const contentStart = start + markerLength; + let whitespaceLength = 0; + let posAfterMarker = contentStart; + while (posAfterMarker < end && /\s/.test(text[posAfterMarker])) { + whitespaceLength++; + posAfterMarker++; + } + + const hideEnd = contentStart + whitespaceLength; + + // Hide the marker AND the whitespace after it + decorations.push({ + startPos: start, + endPos: hideEnd, + type: "hide", + }); + + // Find content end (exclude trailing whitespace) + let contentEnd = end; + while (contentEnd > hideEnd && /\s/.test(text[contentEnd - 1])) { + contentEnd--; + } + + // Style the heading content (from after marker+whitespace to end of line) + if (hideEnd < contentEnd) { + // Add specific heading decoration + decorations.push({ + startPos: hideEnd, + endPos: contentEnd, + type: headingType, + }); + + // Also add generic heading decoration + decorations.push({ + startPos: hideEnd, + endPos: contentEnd, + type: "heading", + }); + } + + this.addScope(scopes, start, contentEnd, "heading"); + } + + /** + * Processes a strong (bold) node. + * + * Skips processing if the bold text is inside a code block or inline code, + * as markdown formatting should not be parsed inside code contexts. + */ + private processStrong( + node: Strong, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ancestors: Node[], + ): void { + if (!this.hasValidPosition(node)) return; + + // Don't parse bold inside code blocks + if (this.isInCodeBlock(ancestors)) { + return; + } + + const start = node.position!.start.offset!; + const end = node.position!.end.offset!; + + // Determine marker type by checking source text (** or __) + const marker = this.getBoldMarker(text, start); + if (!marker) return; + + const markerLength = marker.length; + + // Check if this is bold+italic (nested with emphasis) + const isBoldItalic = ancestors.some((a) => a.type === "emphasis"); + const contentType: DecorationType = isBoldItalic ? "boldItalic" : "bold"; + + this.addMarkerDecorations( + decorations, + start, + end, + markerLength, + contentType, + ); + this.addScope(scopes, start, end, contentType); + + // Process children for nested decorations (handled by visit) + } + + /** + * Processes an emphasis (italic) node. + * + * Skips processing if the italic text is inside a code block or inline code, + * as markdown formatting should not be parsed inside code contexts. + */ + private processEmphasis( + node: Emphasis, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ancestors: Node[], + ): void { + if (!this.hasValidPosition(node)) return; + + // Don't parse italic inside code blocks + if (this.isInCodeBlock(ancestors)) { + return; + } + + const start = node.position!.start.offset!; + const end = node.position!.end.offset!; + + // Determine marker type by checking source text + const marker = this.getItalicMarker(text, start); + if (!marker) return; + + const markerLength = marker.length; + + // Skip if this emphasis is part of ***text*** pattern + // In that case, strong node already handles the decoration + const parentStrong = ancestors.find((a) => a.type === "strong"); + if (parentStrong && parentStrong.position) { + const strongStart = parentStrong.position.start.offset ?? -1; + const strongEnd = parentStrong.position.end.offset ?? -1; + + // Check if emphasis markers overlap with strong markers (***text*** case) + if (start === strongStart + 2 && end === strongEnd - 2) { + return; // Strong node already applied boldItalic decoration + } + } + + // Check if this is bold+italic (nested with strong) + const isBoldItalic = ancestors.some((a) => a.type === "strong"); + const contentType: DecorationType = isBoldItalic ? "boldItalic" : "italic"; + + this.addMarkerDecorations( + decorations, + start, + end, + markerLength, + contentType, + ); + this.addScope(scopes, start, end, contentType); + } + + /** + * Processes a strikethrough (delete) node. + * + * Validates that the node actually uses ~~ (double tilde) markers, + * not single ~, to prevent incorrect parsing of single tildes as strikethrough. + * + * Skips processing if the strikethrough text is inside a code block or inline code, + * as markdown formatting should not be parsed inside code contexts. + */ + private processStrikethrough( + node: Delete, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ancestors: Node[], + ): void { + if (!this.hasValidPosition(node)) return; + + // Don't parse strikethrough inside code blocks + if (this.isInCodeBlock(ancestors)) { + return; + } + + const start = node.position!.start.offset!; + const end = node.position!.end.offset!; + + // Validate that this is actually strikethrough (~~text~~) and not single tilde (~text~) + // Check for double tilde at the start + if ( + start + 1 >= text.length || + text[start] !== "~" || + text[start + 1] !== "~" + ) { + return; // Not a valid strikethrough marker + } + + // Check for double tilde at the end + if (end < 2 || text[end - 2] !== "~" || text[end - 1] !== "~") { + return; // Not a valid strikethrough marker + } + + // Strikethrough uses ~~ markers (length 2) + this.addMarkerDecorations(decorations, start, end, 2, "strikethrough"); + this.addScope(scopes, start, end, "strikethrough"); + } + + /** + * Processes an inline code node. + * + * Matches Markless approach: applies code decoration (with border) to the entire range + * including backticks, then hides the backticks separately. This ensures the border + * spans the full code block and works correctly even on single lines. + */ + private processInlineCode( + node: InlineCode, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ): void { + if (!this.hasValidPosition(node)) return; + + const start = node.position!.start.offset!; + const end = node.position!.end.offset!; + + // Count backticks at start to determine marker length + let markerLength = 0; + let pos = start; + while (pos < end && text[pos] === "`") { + markerLength++; + pos++; + } + + if (markerLength === 0) return; + + // Apply code decoration to ENTIRE range (including backticks) + // This ensures the border spans the full code block + decorations.push({ startPos: start, endPos: end, type: "code" }); + + // Make backticks transparent (not hidden) - matches Markless approach + // Using 'transparent' instead of 'hide' keeps backticks in layout, + // which is required for borders to render correctly on single lines + decorations.push({ + startPos: start, + endPos: start + markerLength, + type: "transparent", + }); + decorations.push({ + startPos: end - markerLength, + endPos: end, + type: "transparent", + }); + + this.addScope(scopes, start, end, "code"); + } + + /** + * Processes a code block node. + * + * Supports both backtick (```) and tilde (~~~) fences, with variable length (3+ characters). + * Detects the fence type and length from the text to properly handle all GFM code block variants. + */ + private processCodeBlock( + node: Code, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + mermaidBlocks: MermaidBlock[], + ): void { + if (!this.hasValidPosition(node)) return; + + const codeStart = node.position!.start.offset!; + const codeEnd = node.position!.end.offset!; + + // Detect opening fence: scan from codeStart backwards to find fence start + // The fence should be at the start of a line (or after only whitespace) + let fenceStart = codeStart; + let fenceChar: string | null = null; + let fenceLength = 0; + + // Find the line start before the code block + const lineStart = text.lastIndexOf("\n", codeStart - 1) + 1; + + // Scan from line start to find the fence + for (let pos = lineStart; pos < codeStart && pos < text.length; pos++) { + const char = text[pos]; + if (char === "`" || char === "~") { + // Count consecutive fence characters + let count = 1; + let checkPos = pos + 1; + while ( + checkPos < text.length && + text[checkPos] === char && + count < 20 + ) { + count++; + checkPos++; + } + + // Valid fence must be 3+ characters + if (count >= 3) { + fenceStart = pos; + fenceChar = char; + fenceLength = count; + break; + } + } + } + + // Fallback: if no fence found, try searching forward from codeStart + if (!fenceChar) { + for ( + let pos = codeStart; + pos < Math.min(codeStart + 20, text.length); + pos++ + ) { + const char = text[pos]; + if (char === "`" || char === "~") { + let count = 1; + let checkPos = pos + 1; + while ( + checkPos < text.length && + text[checkPos] === char && + count < 20 + ) { + count++; + checkPos++; + } + if (count >= 3) { + fenceStart = pos; + fenceChar = char; + fenceLength = count; + break; + } + } + } + } + + if (!fenceChar || fenceLength < 3) { + // Final fallback: assume standard ``` backticks + const fallbackFence = text.indexOf("```", codeStart - 10); + if (fallbackFence === -1 || fallbackFence > codeStart) return; + fenceStart = fallbackFence; + fenceChar = "`"; + fenceLength = 3; + } + + // Find closing fence: scan backwards from codeEnd + let closingFence = -1; + const closingLineStart = text.lastIndexOf("\n", codeEnd - 1) + 1; + + // Search backwards from codeEnd to find closing fence + for ( + let pos = codeEnd - 1; + pos >= closingLineStart && pos >= fenceStart + fenceLength; + pos-- + ) { + if (text[pos] === fenceChar) { + // Count consecutive fence characters backwards + let count = 1; + let checkPos = pos - 1; + while (checkPos >= 0 && text[checkPos] === fenceChar && count < 20) { + count++; + checkPos--; + } + + // Closing fence must be at least as long as opening fence + if (count >= fenceLength) { + closingFence = pos - count + 1; + break; + } + } + } + + if (closingFence === -1) { + // Fallback: search forward from codeEnd + for ( + let pos = codeEnd; + pos < Math.min(codeEnd + 20, text.length); + pos++ + ) { + if (text[pos] === fenceChar) { + let count = 1; + let checkPos = pos + 1; + while ( + checkPos < text.length && + text[checkPos] === fenceChar && + count < 20 + ) { + count++; + checkPos++; + } + if (count >= fenceLength) { + closingFence = pos; + break; + } + } + } + } + + if (closingFence === -1 || closingFence <= fenceStart) return; + + // Find the end of the opening fence line (including language identifier and newline) + const openingLineEnd = text.indexOf("\n", fenceStart); + const openingFenceEnd = fenceStart + fenceLength; + + // Find the end of the closing fence + const closingFenceEnd = closingFence + fenceLength; + + // Find if there's a newline after the closing fence + const closingLineEnd = text.indexOf("\n", closingFence); + const closingEnd = closingLineEnd !== -1 ? closingLineEnd + 1 : codeEnd; + + const isMermaid = node.lang?.trim() === "mermaid"; + + if (!isMermaid) { + // Apply code block background to the entire block including fence lines + // but NOT including the newline after the closing fence + decorations.push({ + startPos: fenceStart, + endPos: closingFenceEnd, + type: "codeBlock", + }); + + // Hide the opening fence markers + decorations.push({ + startPos: fenceStart, + endPos: openingFenceEnd, + type: "hide", + }); + + // Find language identifier (between fence and newline) + const languageStart = openingFenceEnd; + const languageEnd = + openingLineEnd !== -1 && openingLineEnd < closingFence + ? openingLineEnd + : openingFenceEnd; + + // Apply language identifier decoration if there's a language (not just whitespace) + if (languageEnd > languageStart) { + const languageText = text.substring(languageStart, languageEnd).trim(); + if (languageText.length > 0) { + decorations.push({ + startPos: languageStart, + endPos: languageEnd, + type: "codeBlockLanguage", + }); + } + } + + // Hide the newline after the language identifier (if present) + if (openingLineEnd !== -1 && openingLineEnd < closingFence) { + decorations.push({ + startPos: openingLineEnd, + endPos: openingLineEnd + 1, + type: "hide", + }); + } + + // Hide the closing fence line (fence and newline if present) + decorations.push({ + startPos: closingFence, + endPos: closingEnd, + type: "hide", + }); + } else { + // For Mermaid blocks, hide the fence markers so only the SVG shows + // Hide the opening fence markers (```mermaid) + decorations.push({ + startPos: fenceStart, + endPos: openingFenceEnd, + type: "hide", + }); + + // Find language identifier (between fence and newline) and hide it + const languageStart = openingFenceEnd; + const languageEnd = + openingLineEnd !== -1 && openingLineEnd < closingFence + ? openingLineEnd + : openingFenceEnd; + + if (languageEnd > languageStart) { + decorations.push({ + startPos: languageStart, + endPos: languageEnd, + type: "hide", + }); + } + + // Hide the newline after the language identifier (if present) + if (openingLineEnd !== -1 && openingLineEnd < closingFence) { + decorations.push({ + startPos: openingLineEnd, + endPos: openingLineEnd + 1, + type: "hide", + }); + } + + // Hide the closing fence line (```) + decorations.push({ + startPos: closingFence, + endPos: closingEnd, + type: "hide", + }); + } + + this.addScope(scopes, fenceStart, closingEnd, "codeBlock"); + + if (isMermaid) { + const source = node.value ?? ""; + // Fast newline count (avoid regex allocations in hot paths). + let numLines = 1; + for (let i = 0; i < source.length; i++) { + if (source.charCodeAt(i) === 10 /* '\n' */) { + numLines++; + } + } + mermaidBlocks.push({ + startPos: fenceStart, + endPos: closingEnd, + source, + numLines, + }); + } + } + + /** + * Processes a link node. + * + * Skips processing if the link is inside a code block or inline code, + * as links should not be parsed inside code contexts. + */ + private processLink( + node: Link, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ancestors: Node[], + ): void { + if (!this.hasValidPosition(node)) return; + + // Don't parse links inside code blocks + if (this.isInCodeBlock(ancestors)) { + return; + } + + const start = node.position!.start.offset!; + const end = node.position!.end.offset!; + + // Explicit bracket-style link [text](url): always use regular link rendering so that + // [bob@email.com](mailto:bob@email.com) and [url](url) hide delimiters and URL. + if (text[start] === "[") { + // Fall through to "Regular bracket-style link" path below. + } else { + // Detect autolinks and bare links using AST structure: link text equals the URL + // (or URL without mailto: prefix for email autolinks) + const firstChild = node.children?.[0]; + const linkText = + firstChild && firstChild.type === "text" ? firstChild.value : ""; + const url = node.url || ""; + const urlWithoutMailto = url.replace(/^mailto:/, ""); + const isAutolinkOrBareLink = + linkText === url || linkText === urlWithoutMailto; + + if (isAutolinkOrBareLink) { + // Check if it's an autolink (has angle brackets) or bare link (no brackets) + const hasAngleBrackets = text[start] === "<" && text[end - 1] === ">"; + + if (hasAngleBrackets) { + // Process autolink - use text child position for accurate content range + const textChild = + firstChild && firstChild.type === "text" ? firstChild : null; + const contentStart = textChild?.position?.start.offset ?? start + 1; + const contentEnd = textChild?.position?.end.offset ?? end - 1; + + // Hide opening angle bracket + decorations.push({ + startPos: start, + endPos: start + 1, + type: "hide", + }); + + // Add link decoration for content (between angle brackets) + if (contentStart < contentEnd) { + decorations.push({ + startPos: contentStart, + endPos: contentEnd, + type: "link", + url: url, // Use URL from AST (remark-gfm already handles mailto: for emails) + }); + } + + // Hide closing angle bracket + decorations.push({ + startPos: end - 1, + endPos: end, + type: "hide", + }); + + // Add scope for reveal-on-select behavior + this.addScope(scopes, start, end, "link"); + } else { + // Process bare link (no angle brackets) - just apply link decoration + const textChild = + firstChild && firstChild.type === "text" ? firstChild : null; + const contentStart = textChild?.position?.start.offset ?? start; + const contentEnd = textChild?.position?.end.offset ?? end; + + // Add link decoration for the URL/email text + if (contentStart < contentEnd) { + decorations.push({ + startPos: contentStart, + endPos: contentEnd, + type: "link", + url: url, // Use URL from AST (remark-gfm already handles mailto: for emails) + }); + } + + // Add scope for reveal-on-select behavior + this.addScope(scopes, start, end, "link"); + } + return; + } + } + + // Regular bracket-style link: [text](url) + // Find opening bracket [ + const bracketStart = text.indexOf("[", start); + if (bracketStart === -1) return; + + // Find closing bracket ] + const bracketEnd = text.indexOf("]", bracketStart); + if (bracketEnd === -1) return; + + // Hide opening bracket + decorations.push({ + startPos: bracketStart, + endPos: bracketStart + 1, + type: "hide", + }); + + // Add link decoration for text (between brackets) + const contentStart = bracketStart + 1; + if (contentStart < bracketEnd) { + // Extract URL from the link node + const url = node.url || ""; + + decorations.push({ + startPos: contentStart, + endPos: bracketEnd, + type: "link", + url: url, + }); + } + + // Hide closing bracket + decorations.push({ + startPos: bracketEnd, + endPos: bracketEnd + 1, + type: "hide", + }); + + // Find and hide URL part (url) + const parenStart = text.indexOf("(", bracketEnd); + if (parenStart !== -1 && parenStart === bracketEnd + 1) { + // Hide opening parenthesis + decorations.push({ + startPos: parenStart, + endPos: parenStart + 1, + type: "hide", + }); + + const parenEnd = text.indexOf(")", parenStart + 1); + if (parenEnd !== -1 && parenEnd <= end) { + // Hide URL content between parentheses + const urlStart = parenStart + 1; + if (urlStart < parenEnd) { + decorations.push({ + startPos: urlStart, + endPos: parenEnd, + type: "hide", + }); + } + + // Hide closing parenthesis + decorations.push({ + startPos: parenEnd, + endPos: parenEnd + 1, + type: "hide", + }); + } + } + + this.addScope(scopes, start, end, "link"); + } + + /** + * Processes an image node. + */ + private processImage( + node: Image, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ancestors: Node[], + ): void { + if (!this.hasValidPosition(node)) return; + + // Don't parse images inside code blocks + if (this.isInCodeBlock(ancestors)) { + return; + } + + const start = node.position!.start.offset!; + const end = node.position!.end.offset!; + + // Find opening ![ + const exclamationStart = text.indexOf("![", start); + if (exclamationStart === -1 || exclamationStart > start) return; + + // Hide ![ + decorations.push({ + startPos: exclamationStart, + endPos: exclamationStart + 2, + type: "hide", + }); + + // Find alt text (between [ and ]) + const altStart = exclamationStart + 2; + const bracketEnd = text.indexOf("]", altStart); + if (bracketEnd === -1) { + // Even if no closing bracket found, try to hide what we can + // This handles edge cases like ![] without proper syntax + return; + } + + // Add image decoration for alt text (even if empty) + if (altStart <= bracketEnd) { + const url = node.url || ""; + decorations.push({ + startPos: altStart, + endPos: bracketEnd, + type: "image", + url, + }); + + // Image nodes from remark store alt text as a string (no child nodes), + // so inline formatting like **bold** and *italic* inside the alt text + // is not parsed by the main AST walk. We parse the alt slice separately + // and add inline formatting decorations within the alt range. + if (altStart < bracketEnd) { + this.processInlineFormattingInImageAlt( + text, + decorations, + scopes, + altStart, + bracketEnd, + ); + this.processEmojiShortcodesInSlice( + text.substring(altStart, bracketEnd), + altStart, + decorations, + scopes, + ); + } + } + + // Hide closing bracket + decorations.push({ + startPos: bracketEnd, + endPos: bracketEnd + 1, + type: "hide", + }); + + // Find and hide URL part + const parenStart = text.indexOf("(", bracketEnd); + if (parenStart !== -1) { + // Allow for optional space between ] and ( + const between = text.substring(bracketEnd + 1, parenStart); + const hasOnlyWhitespaceBetween = + between.length > 0 && between.trim().length === 0; + if (parenStart === bracketEnd + 1 || hasOnlyWhitespaceBetween) { + // Hide whitespace between ] and ( if present + if (hasOnlyWhitespaceBetween) { + decorations.push({ + startPos: bracketEnd + 1, + endPos: parenStart, + type: "hide", + }); + } + + decorations.push({ + startPos: parenStart, + endPos: parenStart + 1, + type: "hide", + }); + + const parenEnd = text.indexOf(")", parenStart + 1); + if (parenEnd !== -1 && parenEnd <= end) { + const urlStart = parenStart + 1; + if (urlStart < parenEnd) { + decorations.push({ + startPos: urlStart, + endPos: parenEnd, + type: "hide", + }); + } + + decorations.push({ + startPos: parenEnd, + endPos: parenEnd + 1, + type: "hide", + }); + } + } + } + + this.addScope(scopes, start, end, "image"); + } + + /** + * Parses inline markdown inside an image's alt text and emits decorations. + * + * Remark's mdast `image` node stores `alt` as a plain string (no inline children), + * so formatting inside the alt text is not present in the main AST traversal. + * + * This method parses only the alt slice (fast path + early exits) and maps the + * resulting node positions back into the original (normalized) document offsets. + * + * Note: This is only called for images that are NOT inside code blocks (checked in processImage). + */ + private processInlineFormattingInImageAlt( + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + altStart: number, + altEnd: number, + ): void { + if (altStart >= altEnd) return; + + const altText = text.substring(altStart, altEnd); + + // Fast path: avoid parsing when there are no inline marker characters + const hasInlineMarkers = + altText.indexOf("*") !== -1 || + altText.indexOf("_") !== -1 || + altText.indexOf("~") !== -1 || + altText.indexOf("`") !== -1; + if (!hasInlineMarkers) return; + + let altAst: Root; + try { + altAst = this.processor.parse(altText) as Root; + } catch { + return; + } + + const ancestorMap = new Map(); + const absCache = new WeakMap(); + + const toAbsoluteNode = (node: T): T => { + const cached = absCache.get(node); + if (cached) return cached as T; + + if ( + !node.position || + node.position.start.offset === undefined || + node.position.end.offset === undefined + ) { + absCache.set(node, node); + return node; + } + + const absNode = { + ...node, + position: { + ...node.position, + start: { + ...node.position.start, + offset: altStart + (node.position.start.offset ?? 0), + }, + end: { + ...node.position.end, + offset: altStart + (node.position.end.offset ?? 0), + }, + }, + } as T; + + absCache.set(node, absNode as unknown as Node); + return absNode; + }; + + const toAbsoluteAncestors = (ancestors: Node[]): Node[] => + ancestors.map(toAbsoluteNode); + + this.visit( + altAst, + (node: Node, _index: number | undefined, parent: Node | undefined) => { + const currentAncestors: Node[] = []; + if (parent) { + currentAncestors.push(parent); + const parentAncestors = ancestorMap.get(parent); + if (parentAncestors) { + currentAncestors.push(...parentAncestors); + } + } + + if (currentAncestors.length > 0) { + ancestorMap.set(node, currentAncestors); + } + + try { + switch (node.type) { + case "strong": + this.processStrong( + toAbsoluteNode(node as Strong), + text, + decorations, + scopes, + toAbsoluteAncestors(currentAncestors), + ); + break; + case "emphasis": + this.processEmphasis( + toAbsoluteNode(node as Emphasis), + text, + decorations, + scopes, + toAbsoluteAncestors(currentAncestors), + ); + break; + case "delete": + this.processStrikethrough( + toAbsoluteNode(node as Delete), + text, + decorations, + scopes, + toAbsoluteAncestors(currentAncestors), + ); + break; + case "inlineCode": + this.processInlineCode( + toAbsoluteNode(node as InlineCode), + text, + decorations, + scopes, + ); + break; + } + } catch { + // Be conservative: never fail the main image parsing because the alt slice is malformed. + } + }, + ); + } + + /** + * Processes a blockquote node. + * + * Replaces '>' characters with vertical bars for visual indication. + * Nested blockquotes automatically show multiple bars (one per '>'). + * + * @param processedPositions - Set to track which positions have already been processed + */ + private processBlockquote( + node: Blockquote, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + processedPositions: Set, + ancestors: Node[], + ): void { + if (!this.hasValidPosition(node)) return; + + // Don't parse blockquotes inside code blocks + if (this.isInCodeBlock(ancestors)) { + return; + } + + const start = node.position!.start.offset!; + const end = node.position!.end.offset!; + + // Find all '>' markers at the start of lines within this blockquote + // Blockquotes can span multiple lines, each starting with '>' + let pos = start; + while (pos < end) { + // Find line start (either document start or after newline) + const lineStart = pos === 0 ? 0 : text.lastIndexOf("\n", pos - 1) + 1; + + // Find all '>' markers on this line (for nested blockquotes like "> > >") + // We process all '>' markers that are at the start of the line or after whitespace/other '>' + let searchStart = lineStart; + const lineEnd = text.indexOf("\n", lineStart); + const actualLineEnd = lineEnd === -1 ? end : Math.min(lineEnd, end); + + while (searchStart < actualLineEnd) { + const gtIndex = text.indexOf(">", searchStart); + if (gtIndex === -1 || gtIndex >= actualLineEnd) break; + + // Check if we've already processed this position (from a parent blockquote node) + if (processedPositions.has(gtIndex)) { + searchStart = gtIndex + 1; + continue; + } + + // Check if there's only whitespace and/or '>' before this '>' + // This allows nested blockquotes like "> > >" where each '>' is valid + const beforeGt = text.substring(lineStart, gtIndex); + const isBlockquoteMarker = + beforeGt.trim().length === 0 || /^[\s>]*$/.test(beforeGt); + + if (isBlockquoteMarker) { + // Mark this position as processed + processedPositions.add(gtIndex); + + // Replace only the '>' character with blockquote decoration (vertical bar) + // Keep the space after it visible to maintain proper spacing + decorations.push({ + startPos: gtIndex, + endPos: gtIndex + 1, + type: "blockquote", + }); + searchStart = gtIndex + 1; + } else { + // Not a blockquote marker, move past it + searchStart = gtIndex + 1; + } + } + + // Move to next line + const nextLine = text.indexOf("\n", pos); + if (nextLine === -1 || nextLine >= end) break; + pos = nextLine + 1; + } + + this.addScope(scopes, start, end, "blockquote"); + } + + /** + * Processes a list item node. + * + * Replaces unordered list markers (-, *, +) with a bullet point (•). + * Keeps ordered list markers (1., 2., etc.) as-is (no decoration). + * Detects and decorates checkboxes ([ ] or [x]) after the marker. + * Supports both unordered lists (-, *, +) and ordered lists (1., 2., etc.). + */ + private processListItem( + node: ListItem, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ancestors: Node[], + ): void { + if (!this.hasValidPosition(node)) return; + + // Don't parse list items inside code blocks + if (this.isInCodeBlock(ancestors)) { + return; + } + + const start = node.position!.start.offset!; + const end = node.position!.end.offset!; + + // Find the list marker at the start of the list item + let markerEnd = start; + + // Skip leading whitespace + while (markerEnd < end && /\s/.test(text[markerEnd])) { + markerEnd++; + } + + if (markerEnd >= end) return; + + this.addScope(scopes, start, end, "listItem"); + + const markerStart = markerEnd; + + // Check for unordered list markers: -, *, + + if ( + text[markerEnd] === "-" || + text[markerEnd] === "*" || + text[markerEnd] === "+" + ) { + markerEnd++; + // Skip optional space after marker + if (markerEnd < end && text[markerEnd] === " ") { + markerEnd++; + } + + // Try to detect and add checkbox, otherwise add regular list item decoration + if ( + this.tryAddCheckboxDecorations( + text, + markerStart, + markerEnd, + end, + decorations, + false, + ) + ) { + return; + } + + decorations.push({ + startPos: markerStart, + endPos: markerEnd, + type: "listItem", + }); + return; + } + + // Check for ordered list markers: 1., 2., etc. or 1), 2), etc. + if (/\d/.test(text[markerEnd])) { + // Find the end of the number + let numEnd = markerEnd; + while (numEnd < end && /\d/.test(text[numEnd])) { + numEnd++; + } + + // Check if followed by '.' or ')' + if (numEnd < end && (text[numEnd] === "." || text[numEnd] === ")")) { + markerEnd = numEnd + 1; + // Skip optional space after marker + if (markerEnd < end && text[markerEnd] === " ") { + markerEnd++; + } + + // For ordered lists: only add checkbox decoration if present, otherwise apply color styling + // Ordered lists should NOT be decorated with listItem (bullet point) + if ( + this.tryAddCheckboxDecorations( + text, + markerStart, + markerEnd, + end, + decorations, + true, + ) + ) { + return; + } + + // Apply color decoration to ordered list markers to ensure they match regular text color + decorations.push({ + startPos: markerStart, + endPos: markerEnd, + type: "orderedListItem", + }); + return; + } + } + } + + /** + * Attempts to detect and add checkbox decorations after a list marker. + * + * @param text - The full document text + * @param markerStart - Start position of the list marker + * @param markerEnd - End position after the marker (and optional space) + * @param end - End position of the list item + * @param decorations - Array to add decorations to + * @param isOrderedList - Whether this is an ordered list (true) or unordered list (false) + * @returns true if checkbox was found and decorations were added, false otherwise + */ + private tryAddCheckboxDecorations( + text: string, + markerStart: number, + markerEnd: number, + end: number, + decorations: DecorationRange[], + isOrderedList: boolean, + ): boolean { + // Check for checkbox pattern: [ ] or [x] or [X] + // GFM requires a space after the closing bracket for task lists + if (markerEnd + 3 >= end || text[markerEnd] !== "[") { + return false; + } + + const checkChar = text[markerEnd + 1]; + if ( + (checkChar !== " " && checkChar !== "x" && checkChar !== "X") || + text[markerEnd + 2] !== "]" + ) { + return false; + } + + // GFM spec requires a space after the closing bracket for task lists + // Without a space, it's not a valid task list (e.g., "- [x]task" is not a task list) + if (text[markerEnd + 3] !== " ") { + return false; + } + + // Found a valid checkbox - add decorations + const checkboxStart = markerEnd; + const checkboxEnd = checkboxStart + 3; // [ ], [x], or [X] (space after is not part of checkbox) + const isChecked = checkChar === "x" || checkChar === "X"; + + // For ordered lists with checkboxes, apply color decoration to the numbers + if (isOrderedList) { + decorations.push({ + startPos: markerStart, + endPos: markerEnd, + type: "orderedListItem", + }); + } + // For unordered lists: no listItem (bullet); single checkbox decoration covers marker + checkbox + decorations.push({ + startPos: isOrderedList ? checkboxStart : markerStart, + endPos: checkboxEnd, + type: isChecked ? "checkboxChecked" : "checkboxUnchecked", + }); + + return true; + } + + /** + * Processes a thematic break (horizontal rule) node. + * + * Replaces the text (---, ***, ___) with a visual horizontal line. + * Skips thematic breaks that are part of a frontmatter block. + */ + private processThematicBreak( + node: ThematicBreak, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ancestors: Node[], + ): void { + if (!this.hasValidPosition(node)) return; + + // Don't parse horizontal rules inside code blocks + if (this.isInCodeBlock(ancestors)) { + return; + } + + const start = node.position!.start.offset!; + const end = node.position!.end.offset!; + + // Skip if this thematic break is within a frontmatter block + // Frontmatter delimiters should not be processed as horizontal rules + const isInFrontmatter = decorations.some( + (d) => d.type === "frontmatter" && d.startPos <= start && d.endPos >= end, + ); + + if (isInFrontmatter) { + return; // Skip processing this thematic break - it's part of frontmatter + } + + // Replace the entire horizontal rule text with a decoration + decorations.push({ + startPos: start, + endPos: end, + type: "horizontalRule", + }); + + this.addScope(scopes, start, end, "horizontalRule"); + } + + /** + * Processes a text node to extract emoji shortcodes. + */ + private processText( + node: Text, + decorations: DecorationRange[], + scopes: ScopeRange[], + ancestors: Node[], + ): void { + if (!this.hasValidPosition(node)) return; + + // Don't parse emoji shortcodes inside code blocks + if (this.isInCodeBlock(ancestors)) { + return; + } + + const start = node.position!.start.offset!; + this.processEmojiShortcodesInSlice(node.value, start, decorations, scopes); + } + + /** + * Detects and decorates emoji shortcodes in a text slice. + * + * Matches GitHub-style emoji shortcodes (e.g., `:smile:`, `:+1:`, `:t-rex:`). + * Shortcodes must: + * - Start and end with `:` + * - Contain only alphanumeric characters, underscores, hyphens, and plus signs + * - Be case-insensitive (matched against lowercase keys in emoji map) + * + * The regex pattern `/:([a-z0-9_+-]+):/gi` matches valid shortcode patterns. + * Since this processes text nodes from the parsed AST (not raw markdown), + * URLs and other markdown syntax are already handled by their respective nodes, + * reducing false positives. However, the pattern is still defensive and only + * matches when a valid emoji exists in the emoji map. + * + * The emoji map is lazily loaded only when colons are found in the text, + * improving initial load time for documents without emojis. + * + * @param slice - The text slice to search for emoji shortcodes + * @param offset - Character offset of the slice within the original document + * @param decorations - Array to accumulate decoration ranges + * @param scopes - Array to accumulate scope ranges + */ + private processEmojiShortcodesInSlice( + slice: string, + offset: number, + decorations: DecorationRange[], + scopes: ScopeRange[], + ): void { + if (!slice || slice.indexOf(":") === -1) { + return; + } + + // Lazy load emoji map only when we encounter a colon (potential emoji) + const emojiByShortcode = getEmojiMap(); + + // Match GitHub-style emoji shortcodes: :shortcode: + // Pattern allows: letters, numbers, underscores, hyphens, plus signs + // Examples: :smile:, :+1:, :-1:, :t-rex:, :non-potable_water: + // The 'g' flag ensures we find all matches, 'i' makes it case-insensitive + const regex = /:([a-z0-9_+-]+):/gi; + let match: RegExpExecArray | null; + while ((match = regex.exec(slice)) !== null) { + const rawName = match[1]; + // Normalize to lowercase for case-insensitive lookup + const name = rawName.toLowerCase(); + const emoji = emojiByShortcode[name]; + if (!emoji) { + // Invalid shortcode (not in emoji map) - silently ignore + continue; + } + + const start = offset + match.index; + const end = start + match[0].length; + decorations.push({ + startPos: start, + endPos: end, + type: "emoji", + emoji, + }); + this.addScope(scopes, start, end, "emoji"); + } + } + + /** + * Handles empty image alt text that remark doesn't parse as an Image node. + * Optimized with early exit to avoid regex when no image syntax exists. + */ + private handleEmptyImageAlt( + text: string, + decorations: DecorationRange[], + ): void { + // Early exit: check if '![' exists in text before running regex + if (text.indexOf("![") === -1) { + return; + } + + // Find ![] patterns that weren't handled by processImage + const regex = /!\[\]/g; + let match; + while ((match = regex.exec(text)) !== null) { + const pos = match.index; + // Check if this position is already covered by a decoration + const isCovered = decorations.some( + (d) => d.startPos <= pos && d.endPos > pos, + ); + if (!isCovered) { + // Add hide decorations for ![ + decorations.push({ + startPos: pos, + endPos: pos + 2, + type: "hide", + }); + // Add hide decoration for ] + decorations.push({ + startPos: pos + 2, + endPos: pos + 3, + type: "hide", + }); + } + } + } + + /** + * Gets the bold marker type (** or __) from source text. + * Optimized to use character code comparisons instead of substring allocation. + */ + private getBoldMarker(text: string, pos: number): string | null { + if (pos + 2 <= text.length) { + const char1 = text.charCodeAt(pos); + const char2 = text.charCodeAt(pos + 1); + + // Check for '**' (asterisk = 0x2A) + if (char1 === 0x2a && char2 === 0x2a) { + return "**"; + } + + // Check for '__' (underscore = 0x5F) + if (char1 === 0x5f && char2 === 0x5f) { + return "__"; + } + } + return null; + } + + /** + * Gets the italic marker type (* or _) from source text. + * Optimized to use character code comparisons instead of string allocation. + */ + private getItalicMarker(text: string, pos: number): string | null { + if (pos + 1 <= text.length) { + const charCode = text.charCodeAt(pos); + + // Check for '*' (asterisk = 0x2A) + if (charCode === 0x2a) { + return "*"; + } + + // Check for '_' (underscore = 0x5F) + if (charCode === 0x5f) { + return "_"; + } + } + return null; + } + + /** Minimum length required for frontmatter delimiter */ + private static readonly MIN_FRONTMATTER_LENGTH = 3; // '---' + + /** + * Maximum number of lines to search for closing frontmatter delimiter. + * + * Frontmatter is typically very short (< 50 lines). This limit prevents + * performance issues when searching for closing delimiter in large files + * where frontmatter might be incomplete or missing. + */ + private static readonly MAX_FRONTMATTER_SEARCH_LINES = 100; + + /** + * Processes YAML frontmatter at the start of the document. + * + * Detects `---` delimiters at document start (after optional spaces/tabs only), + * finds the closing delimiter, and applies a decoration to the entire block. + * Frontmatter must be at the document start to distinguish it from horizontal rules. + * + * @private + * @param {string} text - The normalized markdown text (CRLF normalized to LF) + * @param {DecorationRange[]} decorations - Array to accumulate decorations + */ + private processFrontmatter( + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ): void { + if (!text || text.length < MarkdownParser.MIN_FRONTMATTER_LENGTH) { + return; + } + + // Find the start of the document (skip leading spaces/tabs only, not newlines) + // This ensures frontmatter is truly at document start, not after content + let startPos = 0; + while ( + startPos < text.length && + (text[startPos] === " " || text[startPos] === "\t") + ) { + startPos++; + } + + // Check if document starts with --- + if ( + startPos + MarkdownParser.MIN_FRONTMATTER_LENGTH > text.length || + text.substring( + startPos, + startPos + MarkdownParser.MIN_FRONTMATTER_LENGTH, + ) !== "---" + ) { + return; + } + + // Find the end of the opening delimiter line + const openingDelimiterStart = startPos; + const openingLineEnd = text.indexOf("\n", openingDelimiterStart); + if (openingLineEnd === -1) { + // No newline found - document ends after opening delimiter + // This is not valid frontmatter (needs closing delimiter) + return; + } + const openingLineEndPos = openingLineEnd + 1; // Include the newline + + // Search for closing delimiter starting after the opening line + // Look for a line that contains only --- (with optional whitespace) + // Limit search to prevent performance issues with large files + let searchPos = openingLineEndPos; + let linesSearched = 0; + while ( + searchPos < text.length && + linesSearched < MarkdownParser.MAX_FRONTMATTER_SEARCH_LINES + ) { + // Find next line start + const lineStart = searchPos; + let lineStartPos = lineStart; + + // Skip whitespace at line start + while (lineStartPos < text.length && /\s/.test(text[lineStartPos])) { + lineStartPos++; + } + + // Check if this line starts with --- + if ( + lineStartPos + MarkdownParser.MIN_FRONTMATTER_LENGTH <= text.length && + text.substring( + lineStartPos, + lineStartPos + MarkdownParser.MIN_FRONTMATTER_LENGTH, + ) === "---" + ) { + // Found potential closing delimiter - validate the entire line + const closingDelimiterStart = lineStartPos; + const closingLineEnd = text.indexOf("\n", closingDelimiterStart); + const lineEnd = closingLineEnd === -1 ? text.length : closingLineEnd; + const lineContent = text.substring(lineStartPos, lineEnd); + + // Validate: closing delimiter line must contain only --- with optional whitespace + // This prevents false matches like "--- some text" or "---comment" + if (!/^---\s*$/.test(lineContent)) { + // Not a valid closing delimiter, continue searching + const nextLine = + closingLineEnd === -1 ? text.length : closingLineEnd + 1; + searchPos = nextLine; + linesSearched++; + continue; + } + + // Validate: closing delimiter must be on its own line (only whitespace before it) + const lineBeforeDelimiter = text.substring(lineStart, lineStartPos); + const isOnlyWhitespaceBefore = /^\s*$/.test(lineBeforeDelimiter); + + if (isOnlyWhitespaceBefore) { + // Found valid frontmatter block + // End decoration at the end of the closing delimiter line, NOT including the newline after it + // This ensures the decoration stops exactly at the closing --- line + const closingLineEndPos = + closingLineEnd === -1 + ? closingDelimiterStart + MarkdownParser.MIN_FRONTMATTER_LENGTH // End at end of --- (no newline, end of document) + : closingLineEnd; // End at newline position (exclusive, so newline is not included) + + // Apply background decoration to entire block from opening delimiter start to end of closing delimiter line + decorations.push({ + startPos: openingDelimiterStart, + endPos: closingLineEndPos, + type: "frontmatter", + }); + + this.addScope( + scopes, + openingDelimiterStart, + closingLineEndPos, + "frontmatter", + ); + + // Apply opacity decoration to opening delimiter (---) + // The delimiter is exactly 3 characters: --- + const openingDelimiterEnd = + openingDelimiterStart + MarkdownParser.MIN_FRONTMATTER_LENGTH; + decorations.push({ + startPos: openingDelimiterStart, + endPos: openingDelimiterEnd, + type: "frontmatterDelimiter", + }); + + // Apply opacity decoration to closing delimiter (---) + // The delimiter is exactly 3 characters: --- + const closingDelimiterEnd = + closingDelimiterStart + MarkdownParser.MIN_FRONTMATTER_LENGTH; + decorations.push({ + startPos: closingDelimiterStart, + endPos: closingDelimiterEnd, + type: "frontmatterDelimiter", + }); + } + return; + } + + // Move to next line + const nextLine = text.indexOf("\n", searchPos); + if (nextLine === -1) { + break; + } + searchPos = nextLine + 1; + linesSearched++; + } + + // No closing delimiter found - not valid frontmatter, don't apply decoration + } + + /** + * Extracts plain display text from a TableCell AST node by walking its + * child tree. Avoids regex-based stripping which incorrectly removes + * literal underscores and asterisks (e.g. snake_case, 100*200). + */ + private extractCellPlainText(cell: TableCell): string { + const walk = (node: Node): string => { + switch (node.type) { + case "text": + return (node as Text).value; + case "inlineCode": + return (node as InlineCode).value; + case "strong": + case "emphasis": + case "delete": { + const parent = node as Strong | Emphasis | Delete; + return parent.children.map(walk).join(""); + } + default: { + const asParent = node as { children?: Node[] }; + if (asParent.children) { + return asParent.children.map(walk).join(""); + } + return ""; + } + } + }; + return cell.children.map(walk).join(""); + } + + /** + * Returns true if a cell has inline formatting children (strong, emphasis, + * delete, inlineCode) that cannot be rendered as whole-cell CSS. + * Used to decide whether to show raw syntax vs AST-extracted plain text. + */ + private cellHasMixedFormatting(cell: TableCell): boolean { + return cell.children.some(child => + child.type === "strong" || child.type === "emphasis" || + child.type === "delete" || child.type === "inlineCode" + ); + } + + /** + * Detects whole-cell formatting and returns CSS properties for the before + * pseudo-element. Returns undefined for unformatted or mixed-format cells. + * + * When undefined is returned and the cell contains formatting markers, + * the caller falls back to showing the raw cell text (VS Code cannot + * partially style a single contentText string). + */ + private detectCellStyle( + trimmed: string, + ): { fontWeight?: string; fontStyle?: string; textDecoration?: string } | undefined { + // Order matters: check longer markers first to avoid partial matches + // Bold-italic: ***text*** or ___text___ + if ( + (trimmed.startsWith("***") && trimmed.endsWith("***")) || + (trimmed.startsWith("___") && trimmed.endsWith("___")) + ) { + return { fontWeight: "bold", fontStyle: "italic" }; + } + // Bold: **text** or __text__ + if ( + (trimmed.startsWith("**") && trimmed.endsWith("**")) || + (trimmed.startsWith("__") && trimmed.endsWith("__")) + ) { + return { fontWeight: "bold" }; + } + // Strikethrough: ~~text~~ + if (trimmed.startsWith("~~") && trimmed.endsWith("~~")) { + return { textDecoration: "line-through" }; + } + // Italic: *text* or _text_ + if ( + (trimmed.startsWith("*") && trimmed.endsWith("*") && trimmed.length > 2) || + (trimmed.startsWith("_") && trimmed.endsWith("_") && trimmed.length > 2) + ) { + return { fontStyle: "italic" }; + } + // Inline code: `text` + if (trimmed.startsWith("`") && trimmed.endsWith("`") && trimmed.length > 2) { + return { fontWeight: "normal" }; + } + return undefined; + } + + /** + * Measures display width for monospace column alignment of **plain** cell text + * (no markdown markers — callers use `extractCellPlainText` / `detectCellStyle` paths). + * + * CJK wide characters (Unicode ranges U+2E80–U+9FFF, U+F900–U+FAFF, + * U+FE30–U+FE4F, U+20000–U+2FA1F) count as 2 columns; all others as 1. + * + * Adds a small per-CJK-character correction because VS Code's `before` + * pseudo-element renders CJK glyphs slightly wider than exactly 2x + * ASCII width in most monospace fonts. + * + * @param plain - Already-unmarked cell display text + * @returns Estimated width in monospace columns + */ + private measureTextWidth(plain: string): number { + let width = 0; + let cjkCount = 0; + for (const char of plain) { + const code = char.codePointAt(0)!; + if ( + (code >= 0x2e80 && code <= 0x9fff) || + (code >= 0xf900 && code <= 0xfaff) || + (code >= 0xfe30 && code <= 0xfe4f) || + (code >= 0x20000 && code <= 0x2fa1f) + ) { + width += 2; + cjkCount++; + } else { + width += 1; + } + } + // Correction: VS Code's before pseudo-element renders CJK glyphs + // slightly wider than exactly 2x ASCII in most default fonts. + // ceil(n*0.25) ensures every CJK cell gets at least +1 correction. + return width + Math.ceil(cjkCount * 0.25); + } + + /** + * Finds unescaped pipe positions within a line range. + * Counts consecutive preceding backslashes: pipe is escaped only when + * the count is odd (e.g. \| is escaped, \\| is not). + */ + private findPipePositions( + text: string, + lineStart: number, + lineEnd: number, + ): number[] { + const pipes: number[] = []; + for (let i = lineStart; i < lineEnd; i++) { + if (text[i] === "|") { + let backslashCount = 0; + let j = i - 1; + while (j >= lineStart && text[j] === "\\") { + backslashCount++; + j--; + } + if (backslashCount % 2 === 0) { + pipes.push(i); + } + } + } + return pipes; + } + + /** + * Augments pipe positions with virtual boundary markers for rows that lack + * leading and/or trailing pipe characters. Virtual positions enable cell + * boundary detection but should NOT generate tablePipe decorations. + */ + private normalizePipePositions( + text: string, + lineStart: number, + trimmedLineEnd: number, + pipes: number[], + ): { positions: number[]; isVirtual: boolean[] } { + if (pipes.length === 0) { + return { positions: pipes, isVirtual: [] }; + } + + const positions = [...pipes]; + const isVirtual: boolean[] = new Array(pipes.length).fill(false); + + // Find first non-whitespace position on this line + let firstContentPos = lineStart; + while (firstContentPos < trimmedLineEnd && (text[firstContentPos] === " " || text[firstContentPos] === "\t")) { + firstContentPos++; + } + + // Inject virtual leading boundary if first pipe is not the first content char. + // When the line starts with content at `lineStart`, `firstContentPos - 1` would be + // invalid (-1); use -1 as a sentinel so cell ranges use substring(pipes[i] + 1, …) → start at 0. + if (pipes[0] !== firstContentPos) { + const virtualLead = + firstContentPos > lineStart ? firstContentPos - 1 : -1; + positions.unshift(virtualLead); + isVirtual.unshift(true); + } + + // Inject virtual trailing boundary if last pipe is not at the line end + if (pipes[pipes.length - 1] < trimmedLineEnd - 1) { + positions.push(trimmedLineEnd); + isVirtual.push(true); + } + + return { positions, isVirtual }; + } + + /** + * Gets the line boundaries (start offset, end offset excluding newline) for a + * given character offset within the source text. + */ + private getLineRange(text: string, offset: number): [number, number] { + const lineStart = + offset === 0 ? 0 : text.lastIndexOf("\n", offset - 1) + 1; + let lineEnd = text.indexOf("\n", offset); + if (lineEnd === -1) lineEnd = text.length; + return [lineStart, lineEnd]; + } + + /** + * Trims trailing whitespace from a line range, returning the new end offset. + */ + private trimLineEnd( + text: string, + lineStart: number, + lineEnd: number, + ): number { + let end = lineEnd; + while ( + end > lineStart && + (text[end - 1] === " " || text[end - 1] === "\t") + ) { + end--; + } + return end; + } + + /** + * Computes the maximum display width for each column in a table. + * + * Uses pipe positions on each row line to extract cell content, avoiding + * remark-gfm cell positions which include pipe characters. + * + * @param tableNode - The remark Table AST node + * @param source - The full normalized document text + * @returns Array of column widths (one per column, minimum 3) + */ + private computeColumnWidths(tableNode: Table, source: string): number[] { + let numCols = 0; + + for (const row of tableNode.children) { + if (!row.position || row.position.start.offset === undefined) continue; + const [lineStart, lineEnd] = this.getLineRange( + source, + row.position.start.offset, + ); + const trimmed = this.trimLineEnd(source, lineStart, lineEnd); + const rawPipes = this.findPipePositions(source, lineStart, trimmed); + const { positions: pipes } = this.normalizePipePositions(source, lineStart, trimmed, rawPipes); + const cellCount = Math.max(0, pipes.length - 1); + if (cellCount > numCols) numCols = cellCount; + } + + const widths: number[] = new Array(numCols).fill(3); + + for (const row of tableNode.children) { + if (!row.position || row.position.start.offset === undefined) continue; + const [lineStart, lineEnd] = this.getLineRange( + source, + row.position.start.offset, + ); + const trimmed = this.trimLineEnd(source, lineStart, lineEnd); + const rawPipes = this.findPipePositions(source, lineStart, trimmed); + const { positions: pipes } = this.normalizePipePositions(source, lineStart, trimmed, rawPipes); + + for (let i = 0; i < pipes.length - 1 && i < numCols; i++) { + const cellText = source.substring(pipes[i] + 1, pipes[i + 1]).trim(); + const astCell = i < row.children.length ? row.children[i] as TableCell : undefined; + const cellStyle = this.detectCellStyle(cellText); + // Mixed formatting → raw syntax; otherwise → AST plain text (handles escapes) + const showRaw = !cellStyle && astCell && this.cellHasMixedFormatting(astCell); + const displayText = (astCell && !showRaw) + ? this.extractCellPlainText(astCell) + : cellText; + const w = this.measureTextWidth(displayText); + if (w > widths[i]) widths[i] = w; + } + } + + return widths; + } + + /** + * Processes a GFM table node and emits decorations for pipes, cells, and the separator row. + * + * Produces: + * - `tablePipe` decorations for `|` in header and data rows (replaced with `│`) + * - `tableSeparatorPipe` decorations for `|` in the separator row (replaced with `├`, `┼`, or `┤`) + * - `tableSeparatorDash` decorations for dash segments in the separator row (replaced with `─` repeats) + * - `tableCell` decorations for cell content (padded to uniform column width) + * + * Also adds a scope for the entire table so the visibility model can reveal the + * whole block when the cursor is inside it. + */ + private processTable( + node: Table, + text: string, + decorations: DecorationRange[], + scopes: ScopeRange[], + ancestors: Node[], + ): void { + if (!this.hasValidPosition(node)) return; + + // Don't process tables inside code blocks + if (this.isInCodeBlock(ancestors)) { + return; + } + + const tableStart = node.position!.start.offset!; + const tableEnd = node.position!.end.offset!; + const colWidths = this.computeColumnWidths(node, text); + const colAligns = node.align ?? []; + + this.addScope(scopes, tableStart, tableEnd, "table"); + + for (let rowIdx = 0; rowIdx < node.children.length; rowIdx++) { + const row = node.children[rowIdx]; + if ( + !row.position || + row.position.start.offset === undefined || + row.position.end.offset === undefined + ) { + continue; + } + + const rowStartOffset = row.position.start.offset; + const [lineStart, lineEnd] = this.getLineRange(text, rowStartOffset); + const trimmedLineEnd = this.trimLineEnd(text, lineStart, lineEnd); + const rawPipes = this.findPipePositions(text, lineStart, trimmedLineEnd); + const { positions: pipes, isVirtual } = this.normalizePipePositions( + text, lineStart, trimmedLineEnd, rawPipes, + ); + + // Only decorate real (non-virtual) pipes + for (let pIdx = 0; pIdx < pipes.length; pIdx++) { + if (!isVirtual[pIdx]) { + decorations.push({ + startPos: pipes[pIdx], + endPos: pipes[pIdx] + 1, + type: "tablePipe", + replacement: "\u2502", // │ + }); + } + } + + // Derive cells from pipe positions (avoids remark cell positions which include pipes) + for (let i = 0; i < pipes.length - 1; i++) { + const cellRangeStart = pipes[i] + 1; + const cellRangeEnd = pipes[i + 1]; + if (cellRangeStart >= cellRangeEnd) continue; + + const rawContent = text.substring(cellRangeStart, cellRangeEnd); + const trimmedContent = rawContent.trim(); + const cellStyle = this.detectCellStyle(trimmedContent); + const colWidth = i < colWidths.length ? colWidths[i] : 3; + + // Whole-cell styled: extract clean text via AST + apply CSS + // Mixed formatting: show raw syntax (VS Code can't partially style) + // Plain / escaped: use AST extraction (handles \| → |, \\ → \) + const astCell = i < row.children.length ? row.children[i] as TableCell : undefined; + const showRaw = !cellStyle && astCell && this.cellHasMixedFormatting(astCell); + const displayContent = (astCell && !showRaw) + ? this.extractCellPlainText(astCell) + : trimmedContent; + const displayWidth = this.measureTextWidth(displayContent); + const totalPad = Math.max(0, colWidth - displayWidth); + const align = i < colAligns.length ? colAligns[i] : null; + + let replacement: string; + if (align === "right") { + replacement = "\u00A0".repeat(totalPad + 1) + displayContent + "\u00A0"; + } else if (align === "center") { + const padLeft = Math.floor(totalPad / 2); + const padRight = totalPad - padLeft; + replacement = "\u00A0".repeat(padLeft + 1) + displayContent + "\u00A0".repeat(padRight + 1); + } else { + // left or null (default) + replacement = "\u00A0" + displayContent + "\u00A0".repeat(totalPad + 1); + } + + decorations.push({ + startPos: cellRangeStart, + endPos: cellRangeEnd, + type: "tableCell", + replacement, + cellStyle, + }); + } + + // After the header row (index 0), process the separator row. + // remark-gfm does NOT include the separator row as a child node. + if (rowIdx === 0) { + const headerEndOffset = row.position.end.offset; + + let sepLineStart = text.indexOf("\n", headerEndOffset); + if (sepLineStart === -1) continue; + sepLineStart += 1; + + let sepLineEnd: number; + if (node.children.length > 1 && node.children[1].position) { + const nextRowStart = node.children[1].position.start.offset!; + sepLineEnd = text.lastIndexOf("\n", nextRowStart - 1); + if (sepLineEnd === -1 || sepLineEnd < sepLineStart) { + sepLineEnd = nextRowStart; + } + } else { + sepLineEnd = text.indexOf("\n", sepLineStart); + if (sepLineEnd === -1) sepLineEnd = tableEnd; + } + + const trimmedSepEnd = this.trimLineEnd(text, sepLineStart, sepLineEnd); + const rawSepPipes = this.findPipePositions(text, sepLineStart, trimmedSepEnd); + const { positions: sepPipes, isVirtual: sepIsVirtual } = this.normalizePipePositions( + text, sepLineStart, trimmedSepEnd, rawSepPipes, + ); + + // Use │ for separator pipes (same as data rows) and ASCII - for + // dashes. Box-drawing ─ (U+2500) renders wider than monospace chars + // in many editor fonts, causing cumulative misalignment. + for (let pIdx = 0; pIdx < sepPipes.length; pIdx++) { + if (!sepIsVirtual[pIdx]) { + decorations.push({ + startPos: sepPipes[pIdx], + endPos: sepPipes[pIdx] + 1, + type: "tableSeparatorPipe", + replacement: "\u2502", // │ (same as regular pipe) + }); + } + } + + for (let pIdx = 0; pIdx < sepPipes.length - 1; pIdx++) { + const segStart = sepPipes[pIdx] + 1; + const segEnd = sepPipes[pIdx + 1]; + if (segStart >= segEnd) continue; + + const colWidth = pIdx < colWidths.length ? colWidths[pIdx] : 3; + decorations.push({ + startPos: segStart, + endPos: segEnd, + type: "tableSeparatorDash", + replacement: "-".repeat(colWidth + 2), + }); + } + } + } + } +} diff --git a/vs-code-extension/src/inline-editor/position-mapping.ts b/vs-code-extension/src/inline-editor/position-mapping.ts new file mode 100644 index 0000000..fdd1094 --- /dev/null +++ b/vs-code-extension/src/inline-editor/position-mapping.ts @@ -0,0 +1,99 @@ +/** + * Utility functions for mapping positions between normalized and original text. + * + * The markdown parser normalizes line endings (CRLF -> LF) before parsing. + * Remark's positions are based on normalized text. VS Code's positionAt() + * uses the actual document text. These utilities help map between the two. + */ + +/** + * Maps a position from normalized text (LF only) to original document text. + * This accounts for CRLF -> LF normalization done by the parser. + * + * @param normalizedPos - Position in normalized text + * @param originalText - Original document text (may contain CRLF) + * @returns Position in original document text + * + * @example + * ```typescript + * const normalized = 'Line 1\nLine 2'; // LF only + * const original = 'Line 1\r\nLine 2'; // CRLF + * const pos = mapNormalizedToOriginal(6, original); // Returns 6 (at '\r') + * ``` + */ +export function mapNormalizedToOriginal(normalizedPos: number, originalText?: string): number { + if (!originalText) { + return normalizedPos; + } + + // If no CRLF, positions match exactly + if (!originalText.includes('\r\n')) { + return normalizedPos; + } + + // Build a direct character-by-character mapping + // Walk through original text character by character, tracking normalized index + // When normalized index reaches target, return the corresponding original position + // + // Key insight: For exclusive end positions, when normalized position points to '\n', + // we want to map to the '\r' position (not '\n') so that the content range excludes '\r' + // This ensures [start:end) in normalized maps to [start:end) in original with same content + let normalizedIndex = 0; + + for (let i = 0; i < originalText.length; i++) { + // Check for CRLF first + if (originalText[i] === '\r' && i + 1 < originalText.length && originalText[i + 1] === '\n') { + // CRLF: '\r' is skipped in normalized, '\n' maps to normalized position + // If target is at the normalized '\n' position, return '\r' position (i) + // This ensures exclusive end positions work correctly + if (normalizedIndex === normalizedPos) { + // Target points to '\n' in normalized, map to '\r' in original + return i; + } + // Advance normalized index by 1 (for the single '\n' in normalized) + normalizedIndex++; + i++; // Skip the '\n' in original + // Continue to next iteration - don't check here, let the loop handle it + } else { + // Regular character: check if this is our target before incrementing + if (normalizedIndex === normalizedPos) { + return i; + } + normalizedIndex++; + } + } + + // If we didn't find it (shouldn't happen), return the last position + return originalText.length; +} + +/** + * Normalizes heading text to anchor format. + * + * Converts heading text to the format used in markdown anchor links: + * - Converts to lowercase + * - Removes non-word characters (except spaces and hyphens) + * - Replaces spaces with hyphens + * - Collapses multiple hyphens into single hyphen + * - Trims leading/trailing whitespace + * + * This matches the GitHub Flavored Markdown (GFM) anchor link generation algorithm. + * + * @param text - The heading text to normalize + * @returns Normalized anchor text + * + * @example + * ```typescript + * normalizeAnchorText('Hello World!') // Returns 'hello-world' + * normalizeAnchorText(' Test 123 ') // Returns 'test-123' + * normalizeAnchorText('Multiple---Hyphens') // Returns 'multiple-hyphens' + * ``` + */ +export function normalizeAnchorText(text: string): string { + return text + .toLowerCase() + .replace(/[^\w\s-]/g, '') + .replace(/\s+/g, '-') + .replace(/-+/g, '-') + .trim(); +} diff --git a/vs-code-extension/src/inline-editor/utils/lru-cache.ts b/vs-code-extension/src/inline-editor/utils/lru-cache.ts new file mode 100644 index 0000000..aa36eb7 --- /dev/null +++ b/vs-code-extension/src/inline-editor/utils/lru-cache.ts @@ -0,0 +1,60 @@ +/** + * A small LRU cache with O(1) get/set/evict using Map insertion order. + * + * - On `get`, the entry is promoted to most-recently-used. + * - When exceeding `maxSize`, the least-recently-used entry is evicted. + */ +export class LRUCache { + private cache = new Map(); + + constructor(private readonly maxSize: number) { + if (!Number.isFinite(maxSize) || maxSize <= 0) { + throw new Error(`LRUCache maxSize must be > 0 (got ${maxSize})`); + } + } + + has(key: K): boolean { + return this.cache.has(key); + } + + get(key: K): V | undefined { + const value = this.cache.get(key); + if (value === undefined) { + return undefined; + } + // Promote to MRU by reinserting. + this.cache.delete(key); + this.cache.set(key, value); + return value; + } + + set(key: K, value: V): void { + if (this.cache.has(key)) { + this.cache.delete(key); + } + this.cache.set(key, value); + this.evictIfNeeded(); + } + + delete(key: K): boolean { + return this.cache.delete(key); + } + + clear(): void { + this.cache.clear(); + } + + get size(): number { + return this.cache.size; + } + + private evictIfNeeded(): void { + while (this.cache.size > this.maxSize) { + const lruKey = this.cache.keys().next().value as K | undefined; + if (lruKey === undefined) { + return; + } + this.cache.delete(lruKey); + } + } +} From 39db880a873c819c93ae7fd8427e7f3fabf8d673 Mon Sep 17 00:00:00 2001 From: Gareth Brown Date: Thu, 26 Mar 2026 08:38:18 +0000 Subject: [PATCH 2/5] Text decorations applying --- .../src/inline-editor/decorations.ts | 15 ++++++--------- vs-code-extension/src/inline-editor/decorator.ts | 14 -------------- 2 files changed, 6 insertions(+), 23 deletions(-) diff --git a/vs-code-extension/src/inline-editor/decorations.ts b/vs-code-extension/src/inline-editor/decorations.ts index 9069dff..6bf93a8 100644 --- a/vs-code-extension/src/inline-editor/decorations.ts +++ b/vs-code-extension/src/inline-editor/decorations.ts @@ -292,15 +292,12 @@ function createHeadingDecoration(level: number, color?: string | ThemeColor) { const config = HEADING_CONFIG[level - 1]; if (!config) throw new Error(`Invalid heading level: ${level}`); const options: Record = { - // CSS injection via two vectors for font-size (VS Code has no fontSize API). - // textDecoration: works in older VS Code builds where the value is inserted - // as raw CSS: text-decoration: none; font-size: 180%; - // letterSpacing: works in newer VS Code builds that sanitise textDecoration. - // letter-spacing: -0.5px; font-size: 180%; - // Whichever vector the current VS Code processes as raw CSS will apply. - textDecoration: `none; font-size: ${config.size}`, - letterSpacing: `-0.5px; font-size: ${config.size}`, - ...(config.bold ? { fontWeight: 'bold' } : {}), + // CSS injection for font-size (VS Code has no fontSize API). + // The semicolon in the value terminates text-decoration and starts font-size. + // font-weight is also injected here because using the `fontWeight` property + // alongside `textDecoration` causes VS Code to sanitise the CSS, breaking + // the font-size injection. + textDecoration: `none; font-size: ${config.size};${config.bold ? ' font-weight: bold;' : ''}`, }; if (color !== undefined) { options.color = color; diff --git a/vs-code-extension/src/inline-editor/decorator.ts b/vs-code-extension/src/inline-editor/decorator.ts index 71c4177..4d38760 100644 --- a/vs-code-extension/src/inline-editor/decorator.ts +++ b/vs-code-extension/src/inline-editor/decorator.ts @@ -726,20 +726,6 @@ export class Decorator { const ghostFaintRanges = (filteredDecorations.get('ghostFaint') as Range[] | undefined) || []; this.activeEditor.setDecorations(this.decorationTypes.getGhostFaintDecorationType(), ghostFaintRanges); - // DEBUG: Temporary diagnostic logging for ghost faint and heading decorations - if (process.env.AS_NOTES_DEBUG) { - const headingTypes = ['heading', 'heading1', 'heading2', 'heading3', 'heading4', 'heading5', 'heading6']; - for (const ht of headingTypes) { - const ranges = filteredDecorations.get(ht as DecorationType); - if (ranges && ranges.length > 0) { - console.log(`[inline-editor] ${ht}: ${ranges.length} ranges applied`); - } - } - if (ghostFaintRanges.length > 0) { - console.log(`[inline-editor] ghostFaint: ${ghostFaintRanges.length} ranges, lines: ${ghostFaintRanges.map(r => (r as Range).start.line).join(',')}`); - } - } - // Fire optional test hook (E2E only — undefined in production). if (this.onApply) { const nonEmptyTypeCount = [...filteredDecorations.values()].filter(r => r.length > 0).length; From 16bfa1f53059013d2c67f24013c6ca25436b7282 Mon Sep 17 00:00:00 2001 From: Gareth Brown Date: Thu, 26 Mar 2026 08:50:33 +0000 Subject: [PATCH 3/5] TECHNICAL.md update --- TECHNICAL.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/TECHNICAL.md b/TECHNICAL.md index bd054cf..f9606ee 100644 --- a/TECHNICAL.md +++ b/TECHNICAL.md @@ -54,6 +54,7 @@ This document explains the internal architecture, algorithms, and design decisio - [Outliner mode awareness](#outliner-mode-awareness) - [Conflict detection](#conflict-detection) - [Settings](#settings) + - [CSS injection for heading font sizes](#css-injection-for-heading-font-sizes) - [Click navigation](#click-navigation) - [DocumentLinkProvider and command URIs](#documentlinkprovider-and-command-uris) - [File resolution](#file-resolution) @@ -1363,6 +1364,33 @@ On activation, `InlineEditorManager` checks whether the standalone Markdown Inli All settings are under the `as-notes.inlineEditor.*` namespace. The toggle is also available as the `AS Notes: Toggle Inline Editor` command and as an eye icon in the editor title bar (visible for Markdown files). +### CSS injection for heading font sizes + +VS Code's `DecorationRenderOptions` API has no `fontSize` property. The inline editor works around this by injecting CSS via the `textDecoration` property: + +```ts +textDecoration: 'none; font-size: 180%;' +``` + +The semicolon after `none` terminates the `text-decoration` CSS declaration, and `font-size: 180%` starts a new declaration within the same generated `